diff --git a/.gitignore b/.gitignore
index 9dfa377bcf8..25f45fa7f7d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,13 +8,14 @@
._.DS_Store
dump.rdb
+bin/*
+
.sass-cache/*
public/csv/*
public/plugins/*
public/tombstone/*
# Ignore bundler config
-/bin
/.bundle
/.vagrant
/.vagrantfile
@@ -29,9 +30,9 @@ config/discourse.pill
config/discourse.conf
# Ignore the default SQLite database and db dumps
+*.sql
+*.sql.gz
/db/*.sqlite3
-/dbs/*.sql
-/dbs/*.sql.gz
/db/structure.sql
# Ignore all logfiles and tempfiles.
@@ -108,3 +109,6 @@ bundler_stubs/*
vendor/bundle/*
*.db
+
+#ignore jetbrains ide file
+*.iml
diff --git a/.ruby-version.sample b/.ruby-version.sample
index 95a5ad2d548..276cbf9e285 100644
--- a/.ruby-version.sample
+++ b/.ruby-version.sample
@@ -1 +1 @@
-ruby-2.0.0-p195
+2.3.0
diff --git a/.travis.yml b/.travis.yml
index 129da18869a..ed1f7d20b12 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -9,7 +9,7 @@ env:
- "RAILS_MASTER=1"
addons:
- postgresql: 9.3
+ postgresql: 9.5
apt:
packages:
- gifsicle
@@ -38,6 +38,10 @@ cache:
before_install:
- gem install bundler
+ - git clone --depth=1 https://github.com/discourse/discourse-backup-uploads-to-s3.git plugins/discourse-backup-uploads-to-s3
+ - git clone --depth=1 https://github.com/discourse/discourse-spoiler-alert.git plugins/discourse-spoiler-alert
+ - git clone --depth=1 https://github.com/discourse/discourse-cakeday.git plugins/discourse-cakeday
+ - git clone --depth=1 https://github.com/discourse/discourse-canned-replies.git plugins/discourse-canned-replies
- npm i -g eslint babel-eslint
- eslint app/assets/javascripts
- eslint --ext .es6 app/assets/javascripts
@@ -49,7 +53,7 @@ before_script:
- bundle exec rake db:create db:migrate
install:
- - 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' == '1' ]; then bundle update --retry=3 --jobs=3 arel rails seed-fu; fi"
- bash -c "if [ '$RAILS_MASTER' == '0' ]; then bundle install --without development --deployment --retry=3 --jobs=3; fi"
-script: 'bundle exec rspec && bundle exec rake plugin:spec && bundle exec rake qunit:test'
+script: "bundle exec rspec && bundle exec rake plugin:spec && bundle exec rake qunit:test['200000']"
diff --git a/Gemfile b/Gemfile
index e23b919a510..a0a84196212 100644
--- a/Gemfile
+++ b/Gemfile
@@ -9,7 +9,6 @@ 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'
else
# Rails 5 is going to ship with Action Cable, we have no use for it as
@@ -29,8 +28,6 @@ else
# gem 'railties'
# gem 'sprockets-rails'
gem 'rails', '~> 4.2'
-
- gem 'rails-observers'
gem 'seed-fu', '~> 2.3.5'
end
@@ -48,7 +45,8 @@ gem 'onebox'
gem 'http_accept_language', '~>2.0.5', require: false
gem 'ember-rails', '0.18.5'
-gem 'ember-source', '1.12.2'
+gem 'ember-source', '2.10.0'
+gem 'ember-handlebars-template', '0.7.5'
gem 'barber'
gem 'babel-transpiler'
@@ -66,7 +64,7 @@ gem 'aws-sdk', require: false
gem 'excon', require: false
gem 'unf', require: false
-gem 'email_reply_trimmer', '0.1.3'
+gem 'email_reply_trimmer', '0.1.6'
# note: for image_optim to correctly work you need to follow
# https://github.com/toy/image_optim
@@ -122,6 +120,7 @@ end
group :test do
gem 'fakeweb', '~> 1.3.0', require: false
gem 'minitest', require: false
+ gem 'timecop'
end
group :test, :development do
@@ -137,9 +136,6 @@ group :test, :development do
gem 'rb-inotify', '~> 0.9', require: RUBY_PLATFORM =~ /linux/i ? 'rb-inotify' : false
gem 'rspec-rails', require: false
gem 'shoulda', require: false
- gem 'simplecov', require: false
- gem 'timecop'
- gem 'rspec-given'
gem 'rspec-html-matchers'
gem 'spork-rails'
gem 'pry-nav'
@@ -150,7 +146,6 @@ group :development do
gem 'bullet', require: !!ENV['BULLET']
gem 'better_errors'
gem 'binding_of_caller'
- gem 'librarian', '>= 0.0.25', require: false
gem 'annotate'
gem 'foreman', require: false
end
@@ -169,35 +164,21 @@ gem 'htmlentities', require: false
# If you want to amend mini profiler to do the monkey patches in the railties
# we are open to it. by deferring require to the initializer we can configure discourse installs without it
-gem 'fast_stack', require: false, platform: [:mri_20]
gem 'flamegraph', require: false
gem 'rack-mini-profiler', require: false
gem 'unicorn', require: false
gem 'puma', require: false
gem 'rbtrace', require: false, platform: :mri
+gem 'gc_tracer', require: false, platform: :mri
# required for feed importing and embedding
#
gem 'ruby-readability', require: false
-
gem 'simple-rss', require: false
-gem 'gctools', require: false, platform: :mri_21
-
-begin
- gem 'stackprof', require: false, platform: [:mri_21, :mri_22, :mri_23]
- gem 'memory_profiler', require: false, platform: [:mri_21, :mri_22, :mri_23]
-rescue Bundler::GemfileError
- begin
- STDERR.puts "You are running an old version of bundler, please upgrade bundler ASAP, if you are using Discourse docker, rebuild your container."
- gem 'stackprof', require: false, platform: [:mri_21, :mri_22]
- gem 'memory_profiler', require: false, platform: [:mri_21, :mri_22]
- rescue Bundler::GemfileError
- gem 'stackprof', require: false, platform: [:mri_21]
- gem 'memory_profiler', require: false, platform: [:mri_21]
- end
-end
+gem 'stackprof', require: false, platform: :mri
+gem 'memory_profiler', require: false, platform: :mri
gem 'rmmseg-cpp', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index 597ba655393..0371a8438b6 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,38 +1,38 @@
GEM
remote: https://rubygems.org/
specs:
- actionmailer (4.2.7)
- actionpack (= 4.2.7)
- actionview (= 4.2.7)
- activejob (= 4.2.7)
+ actionmailer (4.2.7.1)
+ actionpack (= 4.2.7.1)
+ actionview (= 4.2.7.1)
+ activejob (= 4.2.7.1)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 1.0, >= 1.0.5)
- actionpack (4.2.7)
- actionview (= 4.2.7)
- activesupport (= 4.2.7)
+ actionpack (4.2.7.1)
+ actionview (= 4.2.7.1)
+ activesupport (= 4.2.7.1)
rack (~> 1.6)
rack-test (~> 0.6.2)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
- actionview (4.2.7)
- activesupport (= 4.2.7)
+ actionview (4.2.7.1)
+ activesupport (= 4.2.7.1)
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)
- activejob (4.2.7)
- activesupport (= 4.2.7)
+ activejob (4.2.7.1)
+ activesupport (= 4.2.7.1)
globalid (>= 0.3.0)
- activemodel (4.2.7)
- activesupport (= 4.2.7)
+ activemodel (4.2.7.1)
+ activesupport (= 4.2.7.1)
builder (~> 3.1)
- activerecord (4.2.7)
- activemodel (= 4.2.7)
- activesupport (= 4.2.7)
+ activerecord (4.2.7.1)
+ activemodel (= 4.2.7.1)
+ activesupport (= 4.2.7.1)
arel (~> 6.0)
- activesupport (4.2.7)
+ activesupport (4.2.7.1)
i18n (~> 0.7)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
@@ -42,17 +42,17 @@ GEM
activerecord (>= 3.2, < 6.0)
rake (>= 10.4, < 12.0)
arel (6.0.3)
- aws-sdk (2.3.22)
- aws-sdk-resources (= 2.3.22)
- aws-sdk-core (2.3.22)
+ aws-sdk (2.5.3)
+ aws-sdk-resources (= 2.5.3)
+ aws-sdk-core (2.5.3)
jmespath (~> 1.0)
- aws-sdk-resources (2.3.22)
- aws-sdk-core (= 2.3.22)
+ aws-sdk-resources (2.5.3)
+ aws-sdk-core (= 2.5.3)
babel-source (5.8.34)
babel-transpiler (0.7.0)
babel-source (>= 4.0, < 6)
execjs (~> 2.0)
- barber (0.11.1)
+ barber (0.11.2)
ember-source (>= 1.0, < 3)
execjs (>= 1.2, < 3)
better_errors (2.1.1)
@@ -62,28 +62,27 @@ GEM
binding_of_caller (0.7.2)
debug_inspector (>= 0.0.1)
builder (3.2.2)
- bullet (5.0.0)
+ bullet (5.4.2)
activesupport (>= 3.0.0)
- uniform_notifier (~> 1.9.0)
- byebug (8.2.1)
+ uniform_notifier (~> 1.10.0)
+ byebug (9.0.6)
certified (1.0.0)
- coderay (1.1.0)
+ coderay (1.1.1)
concurrent-ruby (1.0.2)
connection_pool (2.2.0)
crass (1.0.2)
- daemons (1.2.3)
+ daemons (1.2.4)
debug_inspector (0.0.2)
diff-lcs (1.2.5)
discourse-qunit-rails (0.0.9)
railties
discourse_fastimage (2.0.3)
- docile (1.1.5)
domain_name (0.5.25)
unf (>= 0.0.5, < 1.0.0)
- email_reply_trimmer (0.1.3)
- ember-data-source (1.0.0.beta.16.1)
- ember-source (~> 1.8)
- ember-handlebars-template (0.7.3)
+ email_reply_trimmer (0.1.6)
+ ember-data-source (2.2.1)
+ ember-source (>= 1.8, < 3.0)
+ ember-handlebars-template (0.7.5)
barber (>= 0.11.0)
sprockets (>= 3.3, < 4)
ember-rails (0.18.5)
@@ -93,10 +92,10 @@ GEM
ember-source (>= 1.1.0)
jquery-rails (>= 1.0.17)
railties (>= 3.1)
- ember-source (1.12.2)
+ ember-source (2.10.0)
erubis (2.7.0)
eventmachine (1.2.0.1)
- excon (0.45.4)
+ excon (0.53.0)
execjs (2.7.0)
exifr (1.2.4)
fabrication (2.9.8)
@@ -104,7 +103,6 @@ GEM
faraday (0.9.2)
multipart-post (>= 1.2, < 3)
fast_blank (1.0.0)
- fast_stack (0.2.0)
fast_xor (1.1.3)
rake
rake-compiler
@@ -114,10 +112,8 @@ GEM
foreman (0.82.0)
thor (~> 0.19.1)
fspath (2.1.1)
- gctools (0.2.3)
- given_core (3.7.1)
- sorcerer (>= 0.3.7)
- globalid (0.3.6)
+ gc_tracer (1.5.1)
+ globalid (0.3.7)
activesupport (>= 4.1.0)
guess_html_encoding (0.0.11)
hashie (3.4.4)
@@ -136,18 +132,15 @@ GEM
progress (~> 3.0, >= 3.0.1)
image_size (1.4.1)
in_threads (1.3.1)
- jmespath (1.3.0)
- jquery-rails (4.0.5)
- rails-dom-testing (~> 1.0)
+ jmespath (1.3.1)
+ jquery-rails (4.2.1)
+ rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
json (1.8.3)
jwt (1.5.2)
kgio (2.10.0)
- librarian (0.1.2)
- highline
- thor (~> 0.15)
- libv8 (5.3.332.38.1)
+ libv8 (5.3.332.38.3)
listen (0.7.3)
logster (1.2.5)
loofah (2.0.3)
@@ -155,8 +148,8 @@ GEM
lru_redux (1.1.0)
mail (2.6.4)
mime-types (>= 1.16, < 4)
- memory_profiler (0.9.6)
- message_bus (2.0.1)
+ memory_profiler (0.9.7)
+ message_bus (2.0.2)
rack (>= 1.1.3)
metaclass (0.0.4)
method_source (0.8.2)
@@ -164,7 +157,7 @@ GEM
mini_portile2 (2.1.0)
mini_racer (0.1.7)
libv8 (~> 5.3)
- minitest (5.9.0)
+ minitest (5.9.1)
mocha (1.1.0)
metaclass (~> 0.0.1)
mock_redis (0.15.4)
@@ -175,9 +168,8 @@ GEM
multipart-post (2.0.0)
mustache (1.0.3)
netrc (0.11.0)
- nokogiri (1.6.8)
+ nokogiri (1.6.8.1)
mini_portile2 (~> 2.1.0)
- pkg-config (~> 1.1.7)
nokogumbo (1.4.7)
nokogiri
oauth (0.4.7)
@@ -187,7 +179,7 @@ GEM
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (~> 1.2)
- oj (2.14.3)
+ oj (2.17.5)
omniauth (1.3.1)
hashie (>= 1.2, < 4)
rack (>= 1.0, < 3)
@@ -216,7 +208,7 @@ GEM
omniauth-twitter (1.2.1)
json (~> 1.3)
omniauth-oauth (~> 1.1)
- onebox (1.6.7)
+ onebox (1.7.2)
fast_blank (>= 1.0.0)
htmlentities (~> 4.3.4)
moneta (~> 0.8)
@@ -226,10 +218,9 @@ GEM
openid-redis-store (0.0.2)
redis
ruby-openid
- pg (0.18.4)
- pkg-config (1.1.7)
+ pg (0.19.0)
progress (3.1.1)
- pry (0.10.3)
+ pry (0.10.4)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
@@ -237,9 +228,9 @@ GEM
pry (>= 0.9.10, < 0.11.0)
pry-rails (0.3.4)
pry (>= 0.9.10)
- puma (3.2.0)
+ puma (3.6.0)
r2 (0.2.6)
- rack (1.6.4)
+ rack (1.6.5)
rack-mini-profiler (0.10.1)
rack (>= 1.2.0)
rack-openid (1.3.1)
@@ -249,16 +240,16 @@ GEM
rack
rack-test (0.6.3)
rack (>= 1.0)
- rails (4.2.7)
- actionmailer (= 4.2.7)
- actionpack (= 4.2.7)
- actionview (= 4.2.7)
- activejob (= 4.2.7)
- activemodel (= 4.2.7)
- activerecord (= 4.2.7)
- activesupport (= 4.2.7)
+ rails (4.2.7.1)
+ actionmailer (= 4.2.7.1)
+ actionpack (= 4.2.7.1)
+ actionview (= 4.2.7.1)
+ activejob (= 4.2.7.1)
+ activemodel (= 4.2.7.1)
+ activerecord (= 4.2.7.1)
+ activesupport (= 4.2.7.1)
bundler (>= 1.3.0, < 2.0)
- railties (= 4.2.7)
+ railties (= 4.2.7.1)
sprockets-rails
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
@@ -268,15 +259,14 @@ GEM
rails-deprecated_sanitizer (>= 1.0.1)
rails-html-sanitizer (1.0.3)
loofah (~> 2.0)
- rails-observers (0.1.2)
- activemodel (~> 4.0)
- rails_multisite (1.0.4)
- railties (4.2.7)
- actionpack (= 4.2.7)
- activesupport (= 4.2.7)
+ rails_multisite (1.0.6)
+ rails (> 4.2, < 5)
+ railties (4.2.7.1)
+ actionpack (= 4.2.7.1)
+ activesupport (= 4.2.7.1)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
- raindrops (0.16.0)
+ raindrops (0.17.0)
rake (11.2.2)
rake-compiler (0.9.9)
rake
@@ -287,7 +277,7 @@ GEM
ffi (>= 1.0.6)
msgpack (>= 0.4.3)
trollop (>= 1.16.2)
- redis (3.3.0)
+ redis (3.3.1)
redis-namespace (1.5.2)
redis (~> 3.0, >= 3.0.4)
rest-client (1.8.0)
@@ -305,9 +295,6 @@ GEM
rspec-expectations (3.4.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.4.0)
- rspec-given (3.7.1)
- given_core (= 3.7.1)
- rspec (>= 2.14.0)
rspec-html-matchers (0.7.0)
nokogiri (~> 1)
rspec (~> 3)
@@ -345,27 +332,22 @@ GEM
shoulda (3.5.0)
shoulda-context (~> 1.0, >= 1.0.1)
shoulda-matchers (>= 1.4.1, < 3.0)
- shoulda-context (1.2.1)
+ shoulda-context (1.2.2)
shoulda-matchers (2.8.0)
activesupport (>= 3.0.0)
- sidekiq (4.1.2)
+ sidekiq (4.2.4)
concurrent-ruby (~> 1.0)
connection_pool (~> 2.2, >= 2.2.0)
+ rack-protection (>= 1.5.0)
redis (~> 3.2, >= 3.2.1)
sidekiq-statistic (1.2.0)
sidekiq (>= 3.3.4, < 5)
simple-rss (1.3.1)
- simplecov (0.11.1)
- docile (~> 1.1.0)
- 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, < 3)
slop (3.6.0)
- sorcerer (1.0.2)
spork (1.0.0rc4)
spork-rails (4.0.0)
rails (>= 3.0.0, < 5)
@@ -377,27 +359,27 @@ GEM
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
- stackprof (0.2.9)
- thin (1.6.4)
+ stackprof (0.2.10)
+ thin (1.7.0)
daemons (~> 1.0, >= 1.0.9)
eventmachine (~> 1.0, >= 1.0.4)
- rack (~> 1.0)
+ rack (>= 1, < 3)
thor (0.19.1)
thread_safe (0.3.5)
- tilt (2.0.2)
- timecop (0.8.0)
+ tilt (2.0.5)
+ timecop (0.8.1)
trollop (2.1.2)
tzinfo (1.2.2)
thread_safe (~> 0.1)
- uglifier (3.0.0)
+ uglifier (3.0.2)
execjs (>= 0.3.0, < 3)
unf (0.1.4)
unf_ext
unf_ext (0.0.7.1)
- unicorn (5.1.0)
+ unicorn (5.2.0)
kgio (~> 2.6)
raindrops (~> 0.7)
- uniform_notifier (1.9.0)
+ uniform_notifier (1.10.0)
PLATFORMS
ruby
@@ -415,26 +397,25 @@ DEPENDENCIES
certified
discourse-qunit-rails
discourse_fastimage (= 2.0.3)
- email_reply_trimmer (= 0.1.3)
+ email_reply_trimmer (= 0.1.6)
+ ember-handlebars-template (= 0.7.5)
ember-rails (= 0.18.5)
- ember-source (= 1.12.2)
+ ember-source (= 2.10.0)
excon
execjs
fabrication (= 2.9.8)
fakeweb (~> 1.3.0)
fast_blank
- fast_stack
fast_xor
fast_xs
flamegraph
foreman
- gctools
+ gc_tracer
highline
hiredis
htmlentities
http_accept_language (~> 2.0.5)
image_optim (= 0.20.2)
- librarian (>= 0.0.25)
listen (= 0.7.3)
logster
lru_redux
@@ -468,7 +449,6 @@ DEPENDENCIES
rack-mini-profiler
rack-protection
rails (~> 4.2)
- rails-observers
rails_multisite
rake
rb-fsevent
@@ -480,7 +460,6 @@ DEPENDENCIES
rinku
rmmseg-cpp
rspec
- rspec-given
rspec-html-matchers
rspec-rails
rtlit
@@ -493,7 +472,6 @@ DEPENDENCIES
sidekiq
sidekiq-statistic
simple-rss
- simplecov
sinatra
spork-rails
stackprof
@@ -504,4 +482,4 @@ DEPENDENCIES
unicorn
BUNDLED WITH
- 1.13.6
+ 1.13.7
diff --git a/README.md b/README.md
index 6cdf4c101b8..717ad14f23e 100644
--- a/README.md
+++ b/README.md
@@ -11,9 +11,9 @@ To learn more about the philosophy and goals of the project, [visit **discourse.
## Screenshots
-
-
-
+
+
+
diff --git a/app/assets/images/favicons/google_branding/logo_docs_128px.png b/app/assets/images/favicons/google_branding/logo_docs_128px.png
deleted file mode 100644
index a1c4e5f7bd5..00000000000
Binary files a/app/assets/images/favicons/google_branding/logo_docs_128px.png and /dev/null differ
diff --git a/app/assets/images/favicons/google_branding/logo_docs_48px.png b/app/assets/images/favicons/google_branding/logo_docs_48px.png
new file mode 100644
index 00000000000..f1fe798f0ef
Binary files /dev/null and b/app/assets/images/favicons/google_branding/logo_docs_48px.png differ
diff --git a/app/assets/images/favicons/google_branding/logo_drive_128px.png b/app/assets/images/favicons/google_branding/logo_drive_128px.png
deleted file mode 100644
index 0eb48a7469f..00000000000
Binary files a/app/assets/images/favicons/google_branding/logo_drive_128px.png and /dev/null differ
diff --git a/app/assets/images/favicons/google_branding/logo_drive_48px.png b/app/assets/images/favicons/google_branding/logo_drive_48px.png
new file mode 100644
index 00000000000..ff595ca1e70
Binary files /dev/null and b/app/assets/images/favicons/google_branding/logo_drive_48px.png differ
diff --git a/app/assets/images/favicons/google_branding/logo_forms_128px.png b/app/assets/images/favicons/google_branding/logo_forms_128px.png
deleted file mode 100644
index 621321b0cf7..00000000000
Binary files a/app/assets/images/favicons/google_branding/logo_forms_128px.png and /dev/null differ
diff --git a/app/assets/images/favicons/google_branding/logo_forms_48px.png b/app/assets/images/favicons/google_branding/logo_forms_48px.png
new file mode 100644
index 00000000000..4ba7be23df4
Binary files /dev/null and b/app/assets/images/favicons/google_branding/logo_forms_48px.png differ
diff --git a/app/assets/images/favicons/google_branding/logo_sheets_128px.png b/app/assets/images/favicons/google_branding/logo_sheets_128px.png
deleted file mode 100644
index a99181d743d..00000000000
Binary files a/app/assets/images/favicons/google_branding/logo_sheets_128px.png and /dev/null differ
diff --git a/app/assets/images/favicons/google_branding/logo_sheets_48px.png b/app/assets/images/favicons/google_branding/logo_sheets_48px.png
new file mode 100644
index 00000000000..0a3cdc3c502
Binary files /dev/null and b/app/assets/images/favicons/google_branding/logo_sheets_48px.png differ
diff --git a/app/assets/images/favicons/google_branding/logo_slides_128px.png b/app/assets/images/favicons/google_branding/logo_slides_128px.png
deleted file mode 100644
index 538226c80f4..00000000000
Binary files a/app/assets/images/favicons/google_branding/logo_slides_128px.png and /dev/null differ
diff --git a/app/assets/images/favicons/google_branding/logo_slides_48px.png b/app/assets/images/favicons/google_branding/logo_slides_48px.png
new file mode 100644
index 00000000000..66b5155d690
Binary files /dev/null and b/app/assets/images/favicons/google_branding/logo_slides_48px.png differ
diff --git a/app/assets/javascripts/admin/adapters/web-hook-event.js.es6 b/app/assets/javascripts/admin/adapters/web-hook-event.js.es6
new file mode 100644
index 00000000000..122070ce3e4
--- /dev/null
+++ b/app/assets/javascripts/admin/adapters/web-hook-event.js.es6
@@ -0,0 +1,7 @@
+import RESTAdapter from 'discourse/adapters/rest';
+
+export default RESTAdapter.extend({
+ basePath() {
+ return '/admin/api/';
+ }
+});
diff --git a/app/assets/javascripts/admin/adapters/web-hook.js.es6 b/app/assets/javascripts/admin/adapters/web-hook.js.es6
new file mode 100644
index 00000000000..122070ce3e4
--- /dev/null
+++ b/app/assets/javascripts/admin/adapters/web-hook.js.es6
@@ -0,0 +1,7 @@
+import RESTAdapter from 'discourse/adapters/rest';
+
+export default RESTAdapter.extend({
+ basePath() {
+ return '/admin/api/';
+ }
+});
diff --git a/app/assets/javascripts/admin/components/ace-editor.js.es6 b/app/assets/javascripts/admin/components/ace-editor.js.es6
index f9be6416406..a03865c40ce 100644
--- a/app/assets/javascripts/admin/components/ace-editor.js.es6
+++ b/app/assets/javascripts/admin/components/ace-editor.js.es6
@@ -1,6 +1,5 @@
-/* global ace:true */
import loadScript from 'discourse/lib/load-script';
-import { escapeExpression } from 'discourse/lib/utilities';
+import { observes } from 'ember-addons/ember-computed-decorators';
export default Ember.Component.extend({
mode: 'css',
@@ -8,18 +7,11 @@ export default Ember.Component.extend({
_editor: null,
_skipContentChangeEvent: null,
- contentChanged: function() {
+ @observes('content')
+ contentChanged() {
if (this._editor && !this._skipContentChangeEvent) {
this._editor.getSession().setValue(this.get('content'));
}
- }.observes('content'),
-
- render(buffer) {
- buffer.push("
"); @@ -40,14 +50,8 @@ export default Ember.View.extend({ buffer.push("" + override_default: "Mos përfshi faqen e stilit CSS standarte." enabled: "Aktivizuar?" + preview: "parashiko" + undo_preview: "hiqe parashikimin" + rescue_preview: "stili normal" + explain_preview: "Shife faqen me këtë faqe stili" + explain_undo_preview: "Rithehu tek faqja e stilit që është e aktivizuar tani" + explain_rescue_preview: "Shikoje faqen me stilin normal." save: "Ruaj" new: "E Re" new_style: "Veshje e Re" + import: "Importo" delete: "Fshij" + delete_confirm: "Fshije këtë personalizim?" + about: "Modifiko faqet e stilit CSS dhe HTML në këtë faqe. Shto një personalizim për të filluar. " color: "Ngjyra" opacity: "Opaciteti" copy: "Kopjo" email_templates: + title: "Shabllonët email" + subject: "Subjekti" + multiple_subjects: "Ky shabllon ka disa tituj për mesazhin." + body: "Përmbajtja" none_selected: "Zgjidhni një shabllon emaili për të filluar redaktimin. " + revert: "Rikthe ndryshimet" + revert_confirm: "A jeni i sigurtë që doni të riktheni ndryshimet?" css_html: title: "CSS/HTML" + long_title: "Personalizime CSS dhe HTML" colors: title: "Ngjyrat" + long_title: "Skemat e ngjyrave" + new_name: "Një skemë e re ngjyrash" copy_name_prefix: "Kopje e" + delete_confirm: "Fshije këtë skemë ngjyrash?" undo: "rikthe" + undo_title: "Anullo ndryshimet e bëra në këtë skemë, rikthe versionin e ruajtur herën e fundit. " revert: "rikthe" + revert_title: "Zëvendëso këtë ngjyrë me ngjyrën standarte Discourse. " primary: name: 'parësor' + description: 'Shumica e tekstit, ikonave dhe bordurave. ' secondary: name: 'dytësor' + description: 'Ngjyra kryesore e sfondit, dhe teksti i ca butonave. ' + tertiary: + name: 'tretësore' + description: 'Linket, ca butona, njoftimet dhe ngjyrat për theks.' + quaternary: + name: "katërsore" + description: "Lidhjet e menusë." + header_background: + name: "sfondi i ballinës" + description: "Ngjyra në sfond të ballinës." + header_primary: + name: "primarja e ballinës" + description: "Teksti dhe ikonat në ballinë të faqes. " + highlight: + name: 'theksi' + description: 'Sfondi i elementëve të zgjedhur në faqe, si postimet dhe temat.' danger: name: 'rrezik' + description: 'Ngjyra e theksit për veprimet si fshirjen e postimeve apo temave.' success: name: 'sukses' + description: 'Përdoret për të treguar një veprim të kryer me sukses.' love: + name: 'zemra' description: "Ngjyra e butonit të pëlqimeve." email: + title: "Emailat" settings: "Rregullimet" + templates: "Shabllonet" + preview_digest: "Parashiko emailin përmbledhës" + sending_test: "Duke dërguar emailin test..." error: "ERROR - %{server_error}" + test_error: "Pati një problem gjatë dërgimit të emailit test. Verifiko parametrat e dërgimit dhe provo përsëri. " sent: "Dërguar" time: "Koha" + send_test: "Dërgo email test" sent_test: "u dërgua!" + delivery_method: "Metoda e dorëzimit" refresh: "Rifresko" format: "Formati" html: "html" text: "tekst" incoming_emails: + from_address: "Nga" + to_addresses: "Për" + cc_addresses: "Cc" + subject: "Subjekti" + error: "Gabim" none: "Nuk u gjetën emaila hyrës." + modal: + title: "Detajet e email të ardhur" + error: "Gabim" + headers: "Headers" + subject: "Subjekti" + body: "Përmbajtja" filters: from_placeholder: "from@example.com" to_placeholder: "to@example.com" @@ -1729,10 +2298,14 @@ sq: subject_placeholder: "Subjekti..." error_placeholder: "Gabim" logs: + none: "Nuk u gjet asnjë log." filters: + title: "Filtro" + user_placeholder: "username" address_placeholder: "emri@shembull.com" skipped_reason_placeholder: "arsye" logs: + title: "Ditari" created_at: "Krijuar" ip_address: "IP" delete: 'Fshij' @@ -1741,21 +2314,27 @@ sq: screened_actions: block: "blloko" staff_actions: + title: "Veprime Stafi" when: "Kur" details: "Detaje" new_value: "I Ri" modal_title: "Detaje" actions: change_trust_level: "ndrysho nivelin e besimit" + grant_badge: "dhuro stemë" + revoke_badge: "tërhiq stemë" deleted_tag: "etiketë e fshirë" renamed_tag: "etiketë e riemëruar" screened_emails: + title: "Kontroll Email-ash" actions: allow: "Lejo" screened_urls: + title: "Kontroll URL-sh" url: "URL" domain: "Domain" screened_ips: + title: "Kontroll IP-sh" actions: block: "Blloko" do_nothing: "Lejo" @@ -1765,10 +2344,16 @@ sq: add: "Shto" filter: "Kërko" logster: - title: "Error Logs" + title: "Ditar Gabimesh" impersonate: title: "Personifiko" + not_found: "Ai përdorues nuk u gjet. " users: + title: 'Përdoruesit' + create: 'Shto një përdorues admin' + last_emailed: "Emaili i fundit" + not_found: "Na vjen keq, por ky emër nuk u gjet në sistem." + id_not_found: "Na vjen keq, por ky emër nuk ekziston në sistem." active: "Aktivë" show_emails: "Trego adresat email" nav: @@ -1776,66 +2361,113 @@ sq: active: "Aktiv" pending: "Pezulluar" staff: 'Stafi' + suspended: 'Të pezulluar' + blocked: 'Të bllokuar' + suspect: 'Të dyshimtë' approved: "Aprovuar?" + approved_selected: + one: "aprovo përdoruesin" + other: "aprovo përdoruesit ({{count}})" + reject_selected: + one: "refuzo përdoruesin" + other: "refuzo përdoruesit ({{count}})" titles: - active: 'Anëtarët aktivë' - new: 'Anëtarët e rinj' - newuser: 'Anëtarët me nivel besimi 0 (anëtar i ri)' - basic: 'Anëtarët me nivel besimi 1 (anëtar bazë)' - member: 'Anëtarët me nivel besimi 2 (member)' - regular: 'Anëtarët me nivel besimi 3 (të rregullt)' - leader: 'Anëtarët me nivel besimi 4 (lidera)' + active: 'Përdorues Aktivë' + new: 'Përdorues të Rinj' + pending: 'Përdorues në pritje' + newuser: 'Përdorues me Nivel Besimi 0 (Përdorues i Ri)' + basic: 'Përdorues me Nivel Besimi 1 (Përdorues i Thjeshtë)' + member: 'Përdorues me Nivel Besimi 2 (Anëtar)' + regular: 'Përdorues me Nivel Besimi 3 (Të Zakonshëm)' + leader: 'Përdorues me Nivel Besimi 4 (Udhëheqës)' staff: "Stafi" admins: 'Administratorë' moderators: 'Moderatorë' - blocked: 'Anëtarët e bllokuar' - suspended: 'Anëtarët e pezulluar' - suspect: 'Anëtarët e dyshimtë' + blocked: 'Përdorues të Bllokuar' + suspended: 'Përdorues të Pezulluar' + suspect: 'Përdorues të Dyshimtë' + reject_successful: + one: "Ju refuzuat %{count} përdorues me sukses. " + other: "Ju refuzuat %{count} përdoruesë me sukses. " + reject_failures: + one: "Nuk arritëm të refuzojmë 1 përdorues." + other: "Nuk arritëm të refuzojmë %{count} përdoruesë. " not_verified: "I pa verifikuar" check_email: + title: "Shfaq adresën email të këtij përdoruesi." text: "Shfaq" user: suspend_duration_units: "(ditë)" suspend_reason: "Arsye" suspended_by: "Përjashtuar nga:" delete_all_posts: "Fshi gjithë postimet" + suspend: "Pezullo" + unsuspend: "Çpezullo" + suspended: "Pezulluar?" + moderator: "Moderator?" admin: "Admin?" blocked: "Bllokuar?" + staged: "Staged?" show_admin_profile: "Admin" edit_title: "Redakto Titullin" save_title: "Ruaj Titullin" refresh_browsers: "Forco rifreskimin e shfletuesit" refresh_browsers_message: "Mesazhi u dërgua tek të gjithë klientët!" show_public_profile: "Shfaq Profilin Publik" + impersonate: 'Personifiko' ip_lookup: "Shiko IP" - log_out: "Dilni" + log_out: "Shkëputu" + logged_out: "Përdoruesi i shkëput nga të gjitha paisjet" revoke_admin: 'Revoko Admin' + grant_admin: 'Jepi rolin admin' + revoke_moderation: 'Hiqi rolin moderator' + grant_moderation: 'Jepi rolin moderator' + unblock: 'Çblloko' block: 'Blloko' + reputation: Reputacioni + permissions: Të drejtat activity: Aktiviteti like_count: Pëlqime të dhëna / të marra last_100_days: 'në 100 ditët e fundit' private_topics_count: Diskutime Private + posts_read_count: Postime të lexuara + post_count: Postime të krijuara + topics_entered: Tema të shikuara + flags_given_count: Sinjalizime të dhëna + flags_received_count: Sinjalizime të marra + warnings_received_count: Paralajmërime të marra + flags_given_received_count: 'Sinjalizime të dhëna / marra' approve: 'Aprovo' approved_by: "aprovuar nga" + approve_success: "Anëtari u aprovua dhe emaili u dërgua me udhëzimet e aktivizimit." + approve_bulk_success: "Sukses! Të gjithë anëtarët e zgjedhur janë aprovuar dhe notifikuar." time_read: "Koha e Leximit" - delete: "Fshij Anëtarë" - delete_dont_block: "Fshij vetëm" + anonymize: "Anonimizo përdoruesin" + anonymize_yes: "Po, anonimizo këtë llogari" + delete: "Fshi Përdoruesin" + delete_forbidden_because_staff: "Administratorët dhe moderatorët nuk fshihen dot. " + delete_confirm: "E SIGURT që doni ta fshini këtë përdorues? Kjo është e përhershme!" + delete_and_block: "Fshijeni dhe bllokoni këtë email dhe adresë IP" + delete_dont_block: "Vetëm fshijeni" deleted: "Anëtari u fshi." send_activation_email: "Dërgo Emailin e Aktivizimit" + activation_email_sent: "Një email aktivizimi u dërgua. " activate: "Aktivizoni llogarinë" block_confirm: 'A jeni të sigurtë që doni të bllokoni këtë anëtar? Anëtari nuk do të ketë më të drejtën të krijojë postime ose tema të reja.' block_accept: 'Po, blloko anëtarin' + reset_bounce_score: + label: "Rivendos" trust_level_change_failed: "Nuk e ndryshuam dot nivelin e këtij anëtari. " tl3_requirements: - table_title: "Në %{time_period} ditët e fundit:" value_heading: "Vlera" visits: "Vizita" days: "ditë" flagged_posts: "Postimet e sinjalizuara" + flagged_by_users: "Përdoruesit që sinjalizuan" likes_given: "Pëlqime të dhëna" likes_received: "Pëlqime të marra" likes_received_days: "Pëlqime të marra: ditë unike" - likes_received_users: "Pëlqime të marra: anëtarë unikë" + likes_received_users: "Pëlqime të Marra: përdorues unikë" sso: title: "Single Sign On" external_username: "Emri i përdoruesit" @@ -1851,25 +2483,45 @@ sq: required: enabled: "i nevojshëm" disabled: "fakultativ" + editable: + enabled: "e modifikueshme" + disabled: "jo e modifikueshme" + show_on_profile: + title: "Trego në profilin publik" + enabled: "e treguar në profilin publik" + disabled: "nuk tregohet në profilin publik" show_on_user_card: title: "Trego në kartën e anëtarit?" enabled: "e treguar në kartën e anëtarit" disabled: "nuk tregohet në kartën e anëtarit" + field_types: + text: 'Fushë tekst' + confirm: 'Konfirmimi' + dropdown: "Listë Dropdown" site_text: description: "Mund të adaptoni çdo tekst në këtë faqe. Filloni duke bërë një kërkim më poshtë: " search: "Kërkoni për tekstin që dëshironi të redaktoni" + title: 'Tekstet' edit: 'redakto' revert: "Rikthe ndryshimet" revert_confirm: "A jeni të sigurtë se doni të riktheni mbrapsht ndryshimet e bëra?" go_back: "Kthehu tek kërkimi" recommended: "Ju rekomandojmë të ndryshoni tekstin më poshtë sipas nevojave tuaja: " + show_overriden: 'Shfaq vetëm të ndryshuarat' site_settings: + show_overriden: 'Shfaq vetëm të ndryshuarat' title: 'Rregullimet' - reset: 'reseto' + reset: 'rivendos' none: 'asnjë' no_results: "Nuk u gjet asnjë rezultat." clear_filter: "Pastro" + add_url: "shto URL" categories: + all_results: 'Të gjitha' + required: 'E nevojshme' + basic: 'Parametrat Kryesore' + users: 'Përdoruesit' + posting: 'Postimet' email: 'Email' files: 'Skedarë' trust: 'Nivelet e besimit' @@ -1877,29 +2529,68 @@ sq: onebox: "Onebox" seo: 'SEO' spam: 'Spam' + rate_limits: 'Kufizimet' developer: 'Developer' embedding: "Embedding" legal: "Legale" + user_api: 'API e përdoruesit' uncategorized: 'Të tjerë' - backups: "Backups" - login: "Idetifikohu" + backups: "Rezervat" + login: "Identifikohu" + plugins: "Pluginet" user_preferences: "Rregullimet e përdoruesit" tags: "Etiketat" + search: "Kërko" badges: + title: Stemat + new_badge: Stemë e Re new: I Ri name: Emri + badge: Stemë display_name: Emri Shfaqur + description: Përshkrimi long_description: Përshkrim i gjatë + badge_type: Lloj Steme badge_grouping: Grupi + badge_groupings: + modal_title: Grupime Steme + granted_by: Atribuar nga + granted_at: Atribuar më + reason_help: '{një lidhje për një postim ose temë)' save: Ruaj delete: Fshij + delete_confirm: Jeni i sigurtë që doni ta fshini këtë stemë? + revoke: Revoko reason: Arsye + expand: Zgjero … + revoke_confirm: Jeni i sigurtë që doni ta tërhiqni këtë stemë? + edit_badges: Ndryshoni stemat + grant_badge: Dhuroni Stemë + granted_badges: Stema të atribuara + grant: Atribuo + no_user_badges: "%{name} nuk ka marrë ende ndonjë stemë." + no_badges: Nuk ka stema që mund të atribuohen. + none_selected: "Si fillim zgjidhni një stemë" + allow_title: Lejoni stemën të përdoret si titull + multiple_grant: Mund të akordohet disa herë + listable: Shfaqni stemën në faqen publike të stemave + enabled: Aktivizoni stemën + icon: Ikonë image: Imazh + icon_help: "Përdor një klas FontAwesome ose URL-në e një imazhi" + query: Query Steme (SQL) + show_posts: Trego postimin që akordoi stemën në faqen e stemave trigger_type: trust_level_change: "Kur një përdorues ndryshon nivelin e besimit" preview: + link_text: "Shikim paraprak i stemave të atribuara" + modal_title: "Shikim paraprak i pyetësorit të stemave" bad_count_warning: header: "KUJDES!" + no_grant_count: "Asnjë stemë për t'u dhënë." + grant_count: + one: "1 stemë për t'u dhënë." + other: "%{count} stema për t'u dhënë." sample: "Shëmbull:" grant: with: %{username} @@ -1920,3 +2611,12 @@ sq: external_url: "URL e jashtme" form: label: "E Re:" + wizard_js: + wizard: + invites: + add_user: "shto" + none_added: "Nuk keni ftuar asnjë staf. Doni të vazhdoni?" + roles: + admin: "Admin" + moderator: "Moderator" + regular: "Përdorues i thjeshtë" diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml index 1da752ca07c..5e1d4097b75 100644 --- a/config/locales/client.sv.yml +++ b/config/locales/client.sv.yml @@ -48,9 +48,6 @@ sv: x_seconds: one: "1s" other: "%{count}s" - less_than_x_minutes: - one: "< 1m" - other: "< %{count}m" x_minutes: one: "1m" other: "%{count}m" @@ -139,6 +136,7 @@ sv: enabled: 'listades %{when}' disabled: 'avlistades %{when}' topic_admin_menu: "administratörsåtgärder för ämne" + wizard_required: "Det är dags att konfigurera ditt forum! Starta installationsguiden!" emails_are_disabled: "All utgående e-post har blivit globalt inaktiverad av en administratör. Inga e-postnotifikationer av något slag kommer att skickas ut." bootstrap_mode_enabled: "Du är i bootstrap-läge för att göra lanseringen av din nya webbplats enklare. Alla nya användare kommer att beviljas förtroendenivå 1 och få dagliga sammanfattningar skickade via e-post. Det här stängs automatiskt av när det totala antalet användare överstiger %{min_users}." bootstrap_mode_disabled: "Bootstrap-läge otillgängliggörs i 24 timmar." @@ -152,9 +150,11 @@ sv: eu_central_1: "EU (Frankfurt)" ap_southeast_1: "Asien Stillahavsområdet (Singapore)" ap_southeast_2: "Asien Stillahavsområdet (Sydney)" + ap_south_1: "Asien Stillahavsområdet (Mumbai)" ap_northeast_1: "Asien Stillahavsområdet (Tokyo)" ap_northeast_2: "Asien Stillahavsområdet (Seoul)" sa_east_1: "Sydamerika (Sao Paulo)" + cn_north_1: "Kina (Peking)" edit: 'redigera rubrik och kategori för det här ämnet' not_implemented: "Denna funktion har inte implementerats än, vi beklagar!" no_value: "Nej" @@ -322,12 +322,6 @@ sv: one: "1 användare" other: "%{count} användare" groups: - empty: - posts: "Det finns inga inlägg från medlemmar in denna grupp." - members: "Det finns ingen medlem i den här gruppen." - mentions: "Det finns ingen omnämnande i den här gruppen." - messages: "Det finns inget meddelande för den här gruppen." - topics: "Det finns inget ämne från medlemmar i den här gruppen." add: "Lägg till" selector_placeholder: "Lägg till medlemmar" owner: "ägare" @@ -399,14 +393,12 @@ sv: latest_by: "senast av" toggle_ordering: "slå av/på sorteringskontroll" subcategories: "Underkategorier" - topic_stats: "Antalet nya ämnen." + topic_sentence: + one: "1 ämne" + other: "%{count} ämnen" topic_stat_sentence: one: "%{count} nytt ämne under den senaste %{unit}." other: "%{count} nya ämnen under den senaste %{unit}." - post_stats: "Antalet nya inlägg." - post_stat_sentence: - one: "%{count} nytt inlägg under den senaste %{unit}." - other: "%{count} nya inlägg under den senaste %{unit}." ip_lookup: title: Kolla upp IP-adress hostname: Värdnamn @@ -429,7 +421,11 @@ sv: profile: "Profil" mute: "Tysta" edit: "Redigera inställningar" - download_archive: "Ladda ned mina inlägg" + download_archive: + button_text: "Ladda ner mina inlägg" + confirm: "Är du säker att du vill ladda ner dina inlägg?" + success: "Nedladdning påbörjad, du kommer bli notifierad via meddelande när processen är klar." + rate_limit_error: "Inlägg kan laddas ner en gång per dag, försök igen imorgon." new_private_message: "Nytt meddelande" private_message: "Meddelande" private_messages: "Meddelanden" @@ -453,6 +449,7 @@ sv: each_browser_note: "Notera: Du behöver ändra denna inställning i varje webbläsare du använder." dismiss_notifications: "Avfärda alla" dismiss_notifications_tooltip: "Markera alla olästa aviseringar som lästa" + first_notification: "Du har fått din första notifikation! Markera den för att börja." disable_jump_reply: "Hoppa inte till mitt inlägg efter att jag har svarat" dynamic_favicon: "Visa antal nya / uppdaterade ämnen på webbläsarikon" external_links_in_new_tab: "Öppna alla externa länkar i en ny flik" @@ -475,19 +472,24 @@ sv: Tystade ämnen och kategorier är inte inkluderade i de här e-postmeddelandena. daily: "Skicka dagliga uppdateringar" individual: "Skicka ett e-postmeddelande för varje nytt inlägg." + individual_no_echo: "Jag vill ha ett mail när nya poster publiceras" many_per_day: "Skicka ett e-postmeddelande för varje nytt inlägg (ungefär {{dailyEmailEstimate}} per dag)" few_per_day: "Skicka ett e-postmeddelande för varje nytt inlägg (ungefär 2 per dag)" tag_settings: "Taggar" watched_tags: "Bevakade" watched_tags_instructions: "Du kommer automatiskt att bevaka alla ämnen med de här taggarna. Du blir notifierad om alla nya inlägg och ämnen, och en räknare över antalet nya inlägg visas bredvid ämnet. " tracked_tags: "Följda" + tracked_tags_instructions: "Du kommer automatiskt följa alla ämnen med de här taggarna. Antalet nya inlägg visas bredvid ämnet." muted_tags: "Tystad" muted_tags_instructions: "Du kommer inte att få notifieringar om nya ämnen som har de här taggarna, och de kommer inte att visas bland dina olästa ämnen." watched_categories: "Tittade på" watched_categories_instructions: "Du kommer automatiskt att bevaka alla ämnen i de här kategorierna. Du blir notifierad om alla nya inlägg och ämnen, och en räknare över antalet nya inlägg visas bredvid ämnet. " tracked_categories: "Bevakade" + tracked_categories_instructions: "Du kommer automatiskt följa alla ämnen i de här kategorierna. En räknare över nya inlägg kommer att visas bredvid ämnen." watched_first_post_categories: "Bevakar första inlägget" watched_first_post_categories_instructions: "Du kommer att bli notifierad om första inlägget i varje nytt ämne i den här kategorin." + watched_first_post_tags: "Bevakar första inlägget" + watched_first_post_tags_instructions: "Du kommer att bli notifierad om första inlägget i varje nytt ämne med dessa taggar." muted_categories: "Tystad" muted_categories_instructions: "Du kommer inte att få notifieringar om nya ämnen inom dessa kategorier, och de kommer inte att visas under bland dina olästa ämnen. " delete_account: "Radera mitt konto" @@ -502,6 +504,10 @@ sv: muted_topics_link: "Visa tystade ämnen" watched_topics_link: "Visa bevakade ämnen" automatically_unpin_topics: "Avklistra automatiskt ämnen när jag når botten." + apps: "Appar" + revoke_access: "Återkalla åtkomst" + undo_revoke_access: "Ångra återkallelse av åtkomst" + api_approved: "Godkända:" staff_counters: flags_given: "hjälpsamma flaggor" flagged_posts: "flaggade inlägg" @@ -590,6 +596,7 @@ sv: title: "Gränssnittsspråk" instructions: "Språket som används av forumsgränssnittet. Det kommer att ändras när du laddar om sidan." default: "(förvalt värde)" + any: "något" password_confirmation: title: "Lösenord igen" last_posted: "Senaste inlägg" @@ -647,6 +654,7 @@ sv: after_4_minutes: "efter 4 minuter" after_5_minutes: "efter 5 minuter" after_10_minutes: "efter 10 minuter" + notification_level_when_replying: "När jag publicerar i ett ämne, sätt ämnet till" invited: search: "sök efter inbjudningar..." title: "Inbjudningar" @@ -677,13 +685,11 @@ sv: account_age_days: "Kontoålder i dagar" create: "Skicka en inbjudan" generate_link: "Kopiera inbjudningslänken" - generated_link_message: '" + I18n.t("admin.backups.logs.none") + "
"); } // add a loading indicator - if (this.get("controller.status.model.isOperationRunning")) { + if (this.get("status.isOperationRunning")) { buffer.push(renderSpinner('small')); } - }, - - _forceScrollToBottom: function() { - const $div = this.$()[0]; - $div.scrollTop = $div.scrollHeight; - }.on("didInsertElement") - -}); + } +})); diff --git a/app/assets/javascripts/admin/components/admin-web-hook-event-chooser.js.es6 b/app/assets/javascripts/admin/components/admin-web-hook-event-chooser.js.es6 new file mode 100644 index 00000000000..976b483995e --- /dev/null +++ b/app/assets/javascripts/admin/components/admin-web-hook-event-chooser.js.es6 @@ -0,0 +1,42 @@ +import computed from 'ember-addons/ember-computed-decorators'; + +export default Ember.Component.extend({ + classNames: ['hook-event'], + typeName: Ember.computed.alias('type.name'), + + @computed('typeName') + name(typeName) { + return I18n.t(`admin.web_hooks.${typeName}_event.name`); + }, + + @computed('typeName') + details(typeName) { + return I18n.t(`admin.web_hooks.${typeName}_event.details`); + }, + + @computed('model.[]', 'typeName') + eventTypeExists(eventTypes, typeName) { + return eventTypes.any(event => event.name === typeName); + }, + + @computed('eventTypeExists') + enabled: { + get(eventTypeExists) { + return eventTypeExists; + }, + set(value, eventTypeExists) { + const type = this.get('type'); + const model = this.get('model'); + // add an association when not exists + if (value !== eventTypeExists) { + if (value) { + model.addObject(type); + } else { + model.removeObjects(model.filter(eventType => eventType.name === type.name)); + } + } + + return value; + } + } +}); diff --git a/app/assets/javascripts/admin/components/admin-web-hook-event.js.es6 b/app/assets/javascripts/admin/components/admin-web-hook-event.js.es6 new file mode 100644 index 00000000000..264e827da61 --- /dev/null +++ b/app/assets/javascripts/admin/components/admin-web-hook-event.js.es6 @@ -0,0 +1,78 @@ +import computed from 'ember-addons/ember-computed-decorators'; +import { ajax } from 'discourse/lib/ajax'; +import { popupAjaxError } from 'discourse/lib/ajax-error'; +import { ensureJSON, plainJSON, prettyJSON } from 'discourse/lib/formatter'; + +export default Ember.Component.extend({ + tagName: 'li', + expandDetails: null, + + @computed('model.status') + statusColorClasses(status) { + if (!status) return ''; + + if (status >= 200 && status <= 299) { + return 'text-successful'; + } else { + return 'text-danger'; + } + }, + + @computed('model.created_at') + createdAt(createdAt) { + return moment(createdAt).format('YYYY-MM-DD HH:mm:ss'); + }, + + @computed('model.duration') + completion(duration) { + const seconds = Math.floor(duration / 10.0) / 100.0; + return I18n.t('admin.web_hooks.events.completed_in', { count: seconds }); + }, + + actions: { + redeliver() { + return bootbox.confirm(I18n.t('admin.web_hooks.events.redeliver_confirm'), I18n.t('no_value'), I18n.t('yes_value'), result => { + if (result) { + ajax(`/admin/api/web_hooks/${this.get('model.web_hook_id')}/events/${this.get('model.id')}/redeliver`, { type: 'POST' }).then(json => { + this.set('model', json.web_hook_event); + }).catch(popupAjaxError); + } + }); + }, + + toggleRequest() { + const expandDetailsKey = 'request'; + + if (this.get('expandDetails') !== expandDetailsKey) { + let headers = _.extend({ + 'Request URL': this.get('model.request_url'), + 'Request method': 'POST' + }, ensureJSON(this.get('model.headers'))); + this.setProperties({ + headers: plainJSON(headers), + body: prettyJSON(this.get('model.payload')), + expandDetails: expandDetailsKey, + bodyLabel: I18n.t('admin.web_hooks.events.payload') + }); + } else { + this.set('expandDetails', null); + } + }, + + toggleResponse() { + const expandDetailsKey = 'response'; + + if (this.get('expandDetails') !== expandDetailsKey) { + this.setProperties({ + headers: plainJSON(this.get('model.response_headers')), + body: this.get('model.response_body'), + expandDetails: expandDetailsKey, + bodyLabel: I18n.t('admin.web_hooks.events.body') + }); + } else { + this.set('expandDetails', null); + } + } + } + +}); diff --git a/app/assets/javascripts/admin/components/admin-web-hook-status.js.es6 b/app/assets/javascripts/admin/components/admin-web-hook-status.js.es6 new file mode 100644 index 00000000000..d176b5a40ab --- /dev/null +++ b/app/assets/javascripts/admin/components/admin-web-hook-status.js.es6 @@ -0,0 +1,28 @@ +import computed from 'ember-addons/ember-computed-decorators'; +import { iconHTML } from 'discourse-common/helpers/fa-icon'; +import { bufferedRender } from 'discourse-common/lib/buffered-render'; + +export default Ember.Component.extend(bufferedRender({ + classes: ["text-muted", "text-danger", "text-successful"], + icons: ["circle-o", "times-circle", "circle"], + + @computed('deliveryStatuses', 'model.last_delivery_status') + status(deliveryStatuses, lastDeliveryStatus) { + return deliveryStatuses.find(s => s.id === lastDeliveryStatus); + }, + + @computed('status.id', 'icons') + icon(statusId, icons) { + return icons[statusId - 1]; + }, + + @computed('status.id', 'classes') + class(statusId, classes) { + return classes[statusId - 1]; + }, + + buildBuffer(buffer) { + buffer.push(iconHTML(this.get('icon'), { class: this.get('class') })); + buffer.push(I18n.t(`admin.web_hooks.delivery_status.${this.get('status.name')}`)); + } +})); diff --git a/app/assets/javascripts/admin/components/customize-link.js.es6 b/app/assets/javascripts/admin/components/customize-link.js.es6 index 79d8cc26f4a..0600f6b5cdb 100644 --- a/app/assets/javascripts/admin/components/customize-link.js.es6 +++ b/app/assets/javascripts/admin/components/customize-link.js.es6 @@ -1,6 +1,8 @@ +import { getOwner } from 'discourse-common/lib/get-owner'; + export default Ember.Component.extend({ router: function() { - return this.container.lookup('router:main'); + return getOwner(this).lookup('router:main'); }.property(), active: function() { diff --git a/app/assets/javascripts/admin/views/admin.js.es6 b/app/assets/javascripts/admin/components/disable-custom-stylesheets.js.es6 similarity index 53% rename from app/assets/javascripts/admin/views/admin.js.es6 rename to app/assets/javascripts/admin/components/disable-custom-stylesheets.js.es6 index fc4a611fe47..f4d86899d08 100644 --- a/app/assets/javascripts/admin/views/admin.js.es6 +++ b/app/assets/javascripts/admin/components/disable-custom-stylesheets.js.es6 @@ -1,12 +1,14 @@ -export default Ember.View.extend({ - _disableCustomStylesheets: function() { +export default Ember.Component.extend({ + willInsertElement() { + this._super(); if (this.session.get("disableCustomCSS")) { $("link.custom-css").attr("rel", ""); this.session.set("disableCustomCSS", false); } - }.on("willInsertElement"), + }, - _enableCustomStylesheets: function() { + willDestroyElement() { + this._super(); $("link.custom-css").attr("rel", "stylesheet"); - }.on("willDestroyElement") + } }); diff --git a/app/assets/javascripts/admin/components/embeddable-host.js.es6 b/app/assets/javascripts/admin/components/embeddable-host.js.es6 index f33c7509657..2a5d7c030b4 100644 --- a/app/assets/javascripts/admin/components/embeddable-host.js.es6 +++ b/app/assets/javascripts/admin/components/embeddable-host.js.es6 @@ -30,10 +30,11 @@ export default Ember.Component.extend(bufferedProperty('host'), { save() { if (this.get('cantSave')) { return; } - const props = this.get('buffered').getProperties('host'); + const props = this.get('buffered').getProperties('host', 'path_whitelist'); props.category_id = this.get('categoryId'); const host = this.get('host'); + host.save(props).then(() => { host.set('category', Discourse.Category.findById(this.get('categoryId'))); this.set('editToggled', false); diff --git a/app/assets/javascripts/admin/components/permalinks-list.js.es6 b/app/assets/javascripts/admin/components/permalinks-list.js.es6 deleted file mode 100644 index c4254376862..00000000000 --- a/app/assets/javascripts/admin/components/permalinks-list.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -import ListView from 'ember-addons/list-view'; -import ListItemView from 'ember-addons/list-item-view'; - -export default ListView.extend({ - height: 700, - rowHeight: 32, - itemViewClass: ListItemView.extend({templateName: "admin/templates/permalinks_list_item"}) -}); diff --git a/app/assets/javascripts/admin/components/resumable-upload.js.es6 b/app/assets/javascripts/admin/components/resumable-upload.js.es6 index ea2f02cfa05..73a46eded3c 100644 --- a/app/assets/javascripts/admin/components/resumable-upload.js.es6 +++ b/app/assets/javascripts/admin/components/resumable-upload.js.es6 @@ -1,3 +1,5 @@ +import { bufferedRender } from 'discourse-common/lib/buffered-render'; + /*global Resumable:true */ /** @@ -10,7 +12,7 @@ uploadText="UPLOAD" }} **/ -const ResumableUploadComponent = Ember.Component.extend(Discourse.StringBuffer, { +export default Ember.Component.extend(bufferedRender({ tagName: "button", classNames: ["btn", "ru"], classNameBindings: ["isUploading"], @@ -36,9 +38,9 @@ const ResumableUploadComponent = Ember.Component.extend(Discourse.StringBuffer, } }.property("isUploading", "progress"), - renderString: function(buffer) { - var icon = this.get("isUploading") ? "times" : "upload"; - buffer.push(""); + buildBuffer(buffer) { + const icon = this.get("isUploading") ? "times" : "upload"; + buffer.push(``); buffer.push("" + this.get("text") + ""); buffer.push(""); }, @@ -117,6 +119,4 @@ const ResumableUploadComponent = Ember.Component.extend(Discourse.StringBuffer, } }.on("willDestroyElement") -}); - -export default ResumableUploadComponent; +})); diff --git a/app/assets/javascripts/admin/components/screened-emails-list.js.es6 b/app/assets/javascripts/admin/components/screened-emails-list.js.es6 deleted file mode 100644 index 1b32fb36fe9..00000000000 --- a/app/assets/javascripts/admin/components/screened-emails-list.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -import ListView from 'ember-addons/list-view'; -import ListItemView from 'ember-addons/list-item-view'; - -export default ListView.extend({ - height: 700, - rowHeight: 32, - itemViewClass: ListItemView.extend({templateName: "admin/templates/logs/screened_emails_list_item"}) -}); diff --git a/app/assets/javascripts/admin/components/screened-ip-addresses-list.js.es6 b/app/assets/javascripts/admin/components/screened-ip-addresses-list.js.es6 deleted file mode 100644 index 0d30fc6d48d..00000000000 --- a/app/assets/javascripts/admin/components/screened-ip-addresses-list.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -import ListView from 'ember-addons/list-view'; -import ListItemView from 'ember-addons/list-item-view'; - -export default ListView.extend({ - height: 700, - rowHeight: 32, - itemViewClass: ListItemView.extend({templateName: "admin/templates/logs/screened_ip_addresses_list_item"}) -}); diff --git a/app/assets/javascripts/admin/components/screened-urls-list.js.es6 b/app/assets/javascripts/admin/components/screened-urls-list.js.es6 deleted file mode 100644 index b9d8b76667e..00000000000 --- a/app/assets/javascripts/admin/components/screened-urls-list.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -import ListView from 'ember-addons/list-view'; -import ListItemView from 'ember-addons/list-item-view'; - -export default ListView.extend({ - height: 700, - rowHeight: 32, - itemViewClass: ListItemView.extend({templateName: "admin/templates/logs/screened_urls_list_item"}) -}); diff --git a/app/assets/javascripts/admin/components/site-setting.js.es6 b/app/assets/javascripts/admin/components/site-setting.js.es6 index 8b6601b4d37..662e4ef684c 100644 --- a/app/assets/javascripts/admin/components/site-setting.js.es6 +++ b/app/assets/javascripts/admin/components/site-setting.js.es6 @@ -1,12 +1,11 @@ import BufferedContent from 'discourse/mixins/buffered-content'; -import ScrollTop from 'discourse/mixins/scroll-top'; import SiteSetting from 'admin/models/site-setting'; import { propertyNotEqual } from 'discourse/lib/computed'; import computed from 'ember-addons/ember-computed-decorators'; const CustomTypes = ['bool', 'enum', 'list', 'url_list', 'host_list', 'category_list', 'value_list']; -export default Ember.Component.extend(BufferedContent, ScrollTop, { +export default Ember.Component.extend(BufferedContent, { classNameBindings: [':row', ':setting', 'setting.overridden', 'typeClass'], content: Ember.computed.alias('setting'), dirty: propertyNotEqual('buffered.value', 'setting.value'), diff --git a/app/assets/javascripts/admin/components/staff-action-logs-list.js.es6 b/app/assets/javascripts/admin/components/staff-action-logs-list.js.es6 deleted file mode 100644 index cec82dba432..00000000000 --- a/app/assets/javascripts/admin/components/staff-action-logs-list.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -import ListView from 'ember-addons/list-view'; -import ListItemView from 'ember-addons/list-item-view'; - -export default ListView.extend({ - height: 700, - rowHeight: 75, - itemViewClass: ListItemView.extend({templateName: "admin/templates/logs/staff_action_logs_list_item"}) -}); diff --git a/app/assets/javascripts/admin/controllers/admin-api-keys.js.es6 b/app/assets/javascripts/admin/controllers/admin-api-keys.js.es6 new file mode 100644 index 00000000000..529538263c8 --- /dev/null +++ b/app/assets/javascripts/admin/controllers/admin-api-keys.js.es6 @@ -0,0 +1,32 @@ +import ApiKey from 'admin/models/api-key'; + +export default Ember.Controller.extend({ + + actions: { + generateMasterKey() { + ApiKey.generateMasterKey().then(key => this.get('model').pushObject(key)); + }, + + regenerateKey(key) { + bootbox.confirm(I18n.t("admin.api.confirm_regen"), I18n.t("no_value"), I18n.t("yes_value"), result => { + if (result) { + key.regenerate(); + } + }); + }, + + revokeKey(key) { + bootbox.confirm(I18n.t("admin.api.confirm_revoke"), I18n.t("no_value"), I18n.t("yes_value"), result => { + if (result) { + key.revoke().then(() => this.get('model').removeObject(key)); + } + }); + } + }, + + // Has a master key already been generated? + hasMasterKey: function() { + return !!this.get('model').findBy('user', null); + }.property('model.[]') + +}); diff --git a/app/assets/javascripts/admin/controllers/admin-api.js.es6 b/app/assets/javascripts/admin/controllers/admin-api.js.es6 deleted file mode 100644 index 82366d3bd78..00000000000 --- a/app/assets/javascripts/admin/controllers/admin-api.js.es6 +++ /dev/null @@ -1,68 +0,0 @@ -import ApiKey from 'admin/models/api-key'; - -/** - This controller supports the interface for dealing with API keys - - @class AdminApiController - @extends Ember.ArrayController - @namespace Discourse - @module Discourse -**/ -export default Ember.ArrayController.extend({ - - actions: { - /** - Generates a master api key - - @method generateMasterKey - **/ - generateMasterKey: function() { - var self = this; - ApiKey.generateMasterKey().then(function (key) { - self.get('model').pushObject(key); - }); - }, - - /** - Creates an API key instance with internal user object - - @method regenerateKey - @param {ApiKey} key the key to regenerate - **/ - regenerateKey: function(key) { - bootbox.confirm(I18n.t("admin.api.confirm_regen"), I18n.t("no_value"), I18n.t("yes_value"), function(result) { - if (result) { - key.regenerate(); - } - }); - }, - - /** - Revokes an API key - - @method revokeKey - @param {ApiKey} key the key to revoke - **/ - revokeKey: function(key) { - var self = this; - bootbox.confirm(I18n.t("admin.api.confirm_revoke"), I18n.t("no_value"), I18n.t("yes_value"), function(result) { - if (result) { - key.revoke().then(function() { - self.get('model').removeObject(key); - }); - } - }); - } - }, - - /** - Has a master key already been generated? - - @property hasMasterKey - @type {Boolean} - **/ - hasMasterKey: function() { - return !!this.get('model').findBy('user', null); - }.property('model.[]') - -}); diff --git a/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 b/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 index 98f76405a2f..558b9b4973e 100644 --- a/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 @@ -1,19 +1,21 @@ +import DiscourseURL from 'discourse/lib/url'; import { ajax } from 'discourse/lib/ajax'; -export default Ember.ArrayController.extend({ - needs: ["adminBackups"], - status: Ember.computed.alias("controllers.adminBackups"), + +export default Ember.Controller.extend({ + adminBackups: Ember.inject.controller(), + status: Ember.computed.alias('adminBackups.model'), uploadLabel: function() { return I18n.t("admin.backups.upload.label"); }.property(), restoreTitle: function() { - if (!this.get('status.model.allowRestore')) { + if (!this.get('status.allowRestore')) { return "admin.backups.operations.restore.is_disabled"; - } else if (this.get("status.model.isOperationRunning")) { + } else if (this.get("status.isOperationRunning")) { return "admin.backups.operations.is_running"; } else { return "admin.backups.operations.restore.title"; } - }.property("status.model.{allowRestore,isOperationRunning}"), + }.property("status.{allowRestore,isOperationRunning}"), actions: { @@ -34,8 +36,11 @@ export default Ember.ArrayController.extend({ } else { this._toggleReadOnlyMode(false); } - } + }, + download(backup) { + DiscourseURL.redirectTo(backup.get('link')); + } }, _toggleReadOnlyMode(enable) { diff --git a/app/assets/javascripts/admin/controllers/admin-backups-logs.js.es6 b/app/assets/javascripts/admin/controllers/admin-backups-logs.js.es6 index 1b3d90346a1..38bdd6f5713 100644 --- a/app/assets/javascripts/admin/controllers/admin-backups-logs.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-backups-logs.js.es6 @@ -1,4 +1,5 @@ -export default Ember.ArrayController.extend({ - needs: ["adminBackups"], - status: Em.computed.alias("controllers.adminBackups") +export default Ember.Controller.extend({ + logs: [], + adminBackups: Ember.inject.controller(), + status: Em.computed.alias("adminBackups.model") }); diff --git a/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 index 5ec2cb45410..7ddc6f3ac4e 100644 --- a/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 @@ -3,14 +3,14 @@ import BufferedContent from 'discourse/mixins/buffered-content'; import { propertyNotEqual } from 'discourse/lib/computed'; export default Ember.Controller.extend(BufferedContent, { - needs: ['admin-badges'], + adminBadges: Ember.inject.controller(), saving: false, savingStatus: '', - badgeTypes: Em.computed.alias('controllers.admin-badges.badgeTypes'), - badgeGroupings: Em.computed.alias('controllers.admin-badges.badgeGroupings'), - badgeTriggers: Em.computed.alias('controllers.admin-badges.badgeTriggers'), - protectedSystemFields: Em.computed.alias('controllers.admin-badges.protectedSystemFields'), + badgeTypes: Ember.computed.alias('adminBadges.badgeTypes'), + badgeGroupings: Ember.computed.alias('adminBadges.badgeGroupings'), + badgeTriggers: Ember.computed.alias('adminBadges.badgeTriggers'), + protectedSystemFields: Ember.computed.alias('adminBadges.protectedSystemFields'), readOnly: Ember.computed.alias('buffered.system'), showDisplayName: propertyNotEqual('name', 'displayName'), @@ -30,16 +30,15 @@ export default Ember.Controller.extend(BufferedContent, { }.observes('model.id'), actions: { - save: function() { + save() { if (!this.get('saving')) { - var fields = ['allow_title', 'multiple_grant', - 'listable', 'auto_revoke', - 'enabled', 'show_posts', - 'target_posts', 'name', 'description', - 'long_description', - 'icon', 'image', 'query', 'badge_grouping_id', - 'trigger', 'badge_type_id'], - self = this; + let fields = ['allow_title', 'multiple_grant', + 'listable', 'auto_revoke', + 'enabled', 'show_posts', + 'target_posts', 'name', 'description', + 'long_description', + 'icon', 'image', 'query', 'badge_grouping_id', + 'trigger', 'badge_type_id']; if (this.get('buffered.system')){ var protectedFields = this.get('protectedSystemFields'); @@ -51,54 +50,55 @@ export default Ember.Controller.extend(BufferedContent, { this.set('saving', true); this.set('savingStatus', I18n.t('saving')); - var boolFields = ['allow_title', 'multiple_grant', - 'listable', 'auto_revoke', - 'enabled', 'show_posts', - 'target_posts' ]; + const boolFields = ['allow_title', 'multiple_grant', + 'listable', 'auto_revoke', + 'enabled', 'show_posts', + 'target_posts' ]; - var data = {}, - buffered = this.get('buffered'); + const data = {}; + const buffered = this.get('buffered'); fields.forEach(function(field){ var d = buffered.get(field); if (_.include(boolFields, field)) { d = !!d; } data[field] = d; }); - var newBadge = !this.get('id'), - model = this.get('model'); - this.get('model').save(data).then(function() { + const newBadge = !this.get('id'); + const model = this.get('model'); + this.get('model').save(data).then(() => { if (newBadge) { - var adminBadgesController = self.get('controllers.admin-badges'); - if (!adminBadgesController.contains(model)) adminBadgesController.pushObject(model); - self.transitionToRoute('adminBadges.show', model.get('id')); + const adminBadges = this.get('adminBadges.model'); + if (!adminBadges.includes(model)) { + adminBadges.pushObject(model); + } + this.transitionToRoute('adminBadges.show', model.get('id')); } else { - self.commitBuffer(); - self.set('savingStatus', I18n.t('saved')); + this.commitBuffer(); + this.set('savingStatus', I18n.t('saved')); } - }).catch(popupAjaxError).finally(function() { - self.set('saving', false); - self.set('savingStatus', ''); + }).catch(popupAjaxError).finally(() => { + this.set('saving', false); + this.set('savingStatus', ''); }); } }, - destroy: function() { - var self = this, - adminBadgesController = this.get('controllers.admin-badges'), - model = this.get('model'); + destroy() { + const adminBadges = this.get('adminBadges.model'); + const model = this.get('model'); if (!model.get('id')) { - self.transitionToRoute('adminBadges.index'); + this.transitionToRoute('adminBadges.index'); return; } - return bootbox.confirm(I18n.t("admin.badges.delete_confirm"), I18n.t("no_value"), I18n.t("yes_value"), function(result) { + return bootbox.confirm(I18n.t("admin.badges.delete_confirm"), I18n.t("no_value"), I18n.t("yes_value"), result => { if (result) { - model.destroy().then(function() { - adminBadgesController.removeObject(model); - self.transitionToRoute('adminBadges.index'); - }).catch(function() { + model.destroy().then(() => { + adminBadges.removeObject(model); + this.transitionToRoute('adminBadges.index'); + }).catch(() => { bootbox.alert(I18n.t('generic_error')); }); } diff --git a/app/assets/javascripts/admin/controllers/admin-badges.js.es6 b/app/assets/javascripts/admin/controllers/admin-badges.js.es6 index 24c4c051390..77c79b724a7 100644 --- a/app/assets/javascripts/admin/controllers/admin-badges.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-badges.js.es6 @@ -1 +1 @@ -export default Ember.ArrayController.extend(); +export default Ember.Controller.extend(); diff --git a/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 index 4a6a58021bb..ae253aec843 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 @@ -1,4 +1,4 @@ -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ onlyOverridden: false, baseColorScheme: function() { @@ -13,8 +13,8 @@ export default Ember.ArrayController.extend({ return baseColorsHash; }.property('baseColorScheme'), - removeSelected: function() { - this.removeObject(this.get('selectedItem')); + removeSelected() { + this.get('model').removeObject(this.get('selectedItem')); this.set('selectedItem', null); }, @@ -26,8 +26,7 @@ export default Ember.ArrayController.extend({ return; } - var matches = Em.A(); - + const matches = []; _.each(this.get('selectedItem.colors'), function(color){ if (color.get('overridden')) matches.pushObject(color); }); @@ -58,10 +57,10 @@ export default Ember.ArrayController.extend({ this.filterContent(); }, - newColorScheme: function() { - var newColorScheme = Em.copy(this.get('baseColorScheme'), true); + newColorScheme() { + const newColorScheme = Em.copy(this.get('baseColorScheme'), true); newColorScheme.set('name', I18n.t('admin.customize.colors.new_name')); - this.pushObject(newColorScheme); + this.get('model').pushObject(newColorScheme); this.send('selectColorScheme', newColorScheme); this.set('onlyOverridden', false); }, @@ -86,10 +85,10 @@ export default Ember.ArrayController.extend({ this.updateEnabled(); }, - copy: function(colorScheme) { + copy(colorScheme) { var newColorScheme = Em.copy(colorScheme, true); newColorScheme.set('name', I18n.t('admin.customize.colors.copy_name_prefix') + ' ' + colorScheme.get('name')); - this.pushObject(newColorScheme); + this.get('model').pushObject(newColorScheme); this.send('selectColorScheme', newColorScheme); }, diff --git a/app/assets/javascripts/admin/controllers/admin-customize-css-html-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-css-html-show.js.es6 index 03c855a969c..47cf280ae6c 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-css-html-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-css-html-show.js.es6 @@ -33,7 +33,7 @@ export default Ember.Controller.extend(activeSections, { return !this.get('model.changed') || this.get('model.isSaving'); }.property('model.changed', 'model.isSaving'), - needs: ['adminCustomizeCssHtml'], + adminCustomizeCssHtml: Ember.inject.controller(), undoPreviewUrl: url('/?preview-style='), defaultStyleUrl: url('/?preview-style=default'), @@ -44,13 +44,12 @@ export default Ember.Controller.extend(activeSections, { }, destroy() { - const self = this; - return bootbox.confirm(I18n.t("admin.customize.delete_confirm"), I18n.t("no_value"), I18n.t("yes_value"), function(result) { + return bootbox.confirm(I18n.t("admin.customize.delete_confirm"), I18n.t("no_value"), I18n.t("yes_value"), result => { if (result) { - const model = self.get('model'); - model.destroyRecord().then(function() { - self.get('controllers.adminCustomizeCssHtml').get('model').removeObject(model); - self.transitionToRoute('adminCustomizeCssHtml'); + const model = this.get('model'); + model.destroyRecord().then(() => { + this.get('adminCustomizeCssHtml').get('model').removeObject(model); + this.transitionToRoute('adminCustomizeCssHtml'); }); } }); diff --git a/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 b/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 index 82cedfee59b..2e39c158802 100644 --- a/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 @@ -22,7 +22,7 @@ export default Ember.Controller.extend({ @computed('problems.length') foundProblems(problemsLength) { - return this.currentUser.get('admin') && (problemsLength || 0) > 1; + return this.currentUser.get('admin') && (problemsLength || 0) > 0; }, @computed('foundProblems') diff --git a/app/assets/javascripts/admin/controllers/admin-email-preview-digest.js.es6 b/app/assets/javascripts/admin/controllers/admin-email-preview-digest.js.es6 index 160f998365b..5da4b0afb58 100644 --- a/app/assets/javascripts/admin/controllers/admin-email-preview-digest.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-email-preview-digest.js.es6 @@ -1,12 +1,23 @@ import EmailPreview from 'admin/models/email-preview'; +import { popupAjaxError } from 'discourse/lib/ajax-error'; export default Ember.Controller.extend({ + emailEmpty: Em.computed.empty('email'), + sendEmailDisabled: Em.computed.or('emailEmpty', 'sendingEmail'), + showSendEmailForm: Em.computed.notEmpty('model.html_content'), + htmlEmpty: Em.computed.empty('model.html_content'), + + iframeSrc: function() { + return ('data:text/html;charset=utf-8,' + encodeURI(this.get('model.html_content'))); + }.property('model.html_content'), + actions: { refresh() { const model = this.get('model'); this.set('loading', true); + this.set('sentEmail', false); EmailPreview.findDigest(this.get('lastSeen'), this.get('username')).then(email => { model.setProperties(email.getProperties('html_content', 'text_content')); this.set('loading', false); @@ -15,6 +26,23 @@ export default Ember.Controller.extend({ toggleShowHtml() { this.toggleProperty('showHtml'); + }, + + sendEmail() { + this.set('sendingEmail', true); + this.set('sentEmail', false); + + const self = this; + + EmailPreview.sendDigest(this.get('lastSeen'), this.get('username'), this.get('email')).then(result => { + if (result.errors) { + bootbox.alert(result.errors); + } else { + self.set('sentEmail', true); + } + }).catch(popupAjaxError).finally(function() { + self.set('sendingEmail', false); + }); } } diff --git a/app/assets/javascripts/admin/controllers/admin-embedding.js.es6 b/app/assets/javascripts/admin/controllers/admin-embedding.js.es6 index 780c61f3f91..266aa6975e6 100644 --- a/app/assets/javascripts/admin/controllers/admin-embedding.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-embedding.js.es6 @@ -9,7 +9,7 @@ export default Ember.Controller.extend({ @computed('embedding.embeddable_hosts.@each.isCreated') showSecondary() { const hosts = this.get('embedding.embeddable_hosts'); - return hosts.length && hosts.findProperty('isCreated'); + return hosts.length && hosts.findBy('isCreated'); }, @computed('embedding.base_url') @@ -38,9 +38,7 @@ export default Ember.Controller.extend({ const updates = embedding.getProperties(embedding.get('fields')); this.set('saved', false); - this.get('embedding').update(updates).then(() => { - this.set('saved', true); - }).catch(popupAjaxError); + this.get('embedding').update(updates).then(() => this.set('saved', true)).catch(popupAjaxError); }, addHost() { diff --git a/app/assets/javascripts/admin/controllers/admin-emojis.js.es6 b/app/assets/javascripts/admin/controllers/admin-emojis.js.es6 index b111a5952ba..29aecc47734 100644 --- a/app/assets/javascripts/admin/controllers/admin-emojis.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-emojis.js.es6 @@ -1,23 +1,23 @@ import { ajax } from 'discourse/lib/ajax'; -export default Ember.ArrayController.extend({ - sortProperties: ["name"], +export default Ember.Controller.extend({ + sortedEmojis: Ember.computed.sort('model', 'emojiSorting'), + emojiSorting: ['name'], actions: { emojiUploaded(emoji) { emoji.url += "?t=" + new Date().getTime(); - this.pushObject(Ember.Object.create(emoji)); + this.get('model').pushObject(Ember.Object.create(emoji)); }, destroy(emoji) { - const self = this; return bootbox.confirm( I18n.t("admin.emoji.delete_confirm", { name: emoji.get("name") }), I18n.t("no_value"), I18n.t("yes_value"), - function(destroy) { + destroy => { if (destroy) { - return ajax("/admin/customize/emojis/" + emoji.get("name"), { type: "DELETE" }).then(function() { - self.removeObject(emoji); + return ajax("/admin/customize/emojis/" + emoji.get("name"), { type: "DELETE" }).then(() => { + this.get('model').removeObject(emoji); }); } } diff --git a/app/assets/javascripts/admin/controllers/admin-flags-list.js.es6 b/app/assets/javascripts/admin/controllers/admin-flags-list.js.es6 index 0c85749775a..e3101e2fa32 100644 --- a/app/assets/javascripts/admin/controllers/admin-flags-list.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-flags-list.js.es6 @@ -1,6 +1,6 @@ import FlaggedPost from 'admin/models/flagged-post'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ query: null, adminOldFlagsView: Em.computed.equal("query", "old"), @@ -8,18 +8,16 @@ export default Ember.ArrayController.extend({ actions: { disagreeFlags(flaggedPost) { - var self = this; - flaggedPost.disagreeFlags().then(function () { - self.removeObject(flaggedPost); + flaggedPost.disagreeFlags().then(() => { + this.get('model').removeObject(flaggedPost); }, function () { bootbox.alert(I18n.t("admin.flags.error")); }); }, deferFlags(flaggedPost) { - var self = this; - flaggedPost.deferFlags().then(function () { - self.removeObject(flaggedPost); + flaggedPost.deferFlags().then(() => { + this.get('model').removeObject(flaggedPost); }, function () { bootbox.alert(I18n.t("admin.flags.error")); }); @@ -29,7 +27,7 @@ export default Ember.ArrayController.extend({ this.send("disagreeFlags", item); }, - loadMore(){ + loadMore() { const flags = this.get('model'); return FlaggedPost.findAll(this.get('query'), flags.length+1).then(data => { if (data.length===0) { diff --git a/app/assets/javascripts/admin/controllers/admin-group.js.es6 b/app/assets/javascripts/admin/controllers/admin-group.js.es6 index e477ba4b0a1..6c3da11d7f7 100644 --- a/app/assets/javascripts/admin/controllers/admin-group.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-group.js.es6 @@ -1,24 +1,11 @@ import { popupAjaxError } from 'discourse/lib/ajax-error'; -import { propertyEqual } from 'discourse/lib/computed'; +import computed from 'ember-addons/ember-computed-decorators'; export default Ember.Controller.extend({ - needs: ['adminGroupsType'], + adminGroupsType: Ember.inject.controller(), disableSave: false, savingStatus: '', - currentPage: function() { - if (this.get("model.user_count") === 0) { return 0; } - return Math.floor(this.get("model.offset") / this.get("model.limit")) + 1; - }.property("model.limit", "model.offset", "model.user_count"), - - totalPages: function() { - if (this.get("model.user_count") === 0) { return 0; } - return Math.floor(this.get("model.user_count") / this.get("model.limit")) + 1; - }.property("model.limit", "model.user_count"), - - showingFirst: Em.computed.lte("currentPage", 1), - showingLast: propertyEqual("currentPage", "totalPages"), - aliasLevelOptions: function() { return [ { name: I18n.t("groups.alias_levels.nobody"), value: 0 }, @@ -35,39 +22,17 @@ export default Ember.Controller.extend({ ]; }.property(), + @computed('model.visible', 'model.public', 'model.alias_level') + disableMembershipRequestSetting(visible, publicGroup) { + return !visible || publicGroup || !this.get('model.canEveryoneMention'); + }, + + @computed('model.visible', 'model.allow_membership_requests') + disablePublicSetting(visible, allowMembershipRequests) { + return !visible || allowMembershipRequests; + }, + actions: { - next() { - if (this.get("showingLast")) { return; } - - const group = this.get("model"), - offset = Math.min(group.get("offset") + group.get("limit"), group.get("user_count")); - - group.set("offset", offset); - - return group.findMembers(); - }, - - previous() { - if (this.get("showingFirst")) { return; } - - const group = this.get("model"), - offset = Math.max(group.get("offset") - group.get("limit"), 0); - - group.set("offset", offset); - - return group.findMembers(); - }, - - removeMember(member) { - const self = this, - message = I18n.t("admin.groups.delete_member_confirm", { username: member.get("username"), group: this.get("model.name") }); - return bootbox.confirm(message, I18n.t("no_value"), I18n.t("yes_value"), function(confirm) { - if (confirm) { - self.get("model").removeMember(member); - } - }); - }, - removeOwner(member) { const self = this, message = I18n.t("admin.groups.delete_owner_confirm", { username: member.get("username"), group: this.get("model.name") }); @@ -84,21 +49,15 @@ export default Ember.Controller.extend({ this.set("model.ownerUsernames", null); }, - addMembers() { - if (Em.isEmpty(this.get("model.usernames"))) { return; } - this.get("model").addMembers(this.get("model.usernames")).catch(popupAjaxError); - this.set("model.usernames", null); - }, - save() { const group = this.get('model'), - groupsController = this.get("controllers.adminGroupsType"), + groupsController = this.get("adminGroupsType"), groupType = groupsController.get("type"); this.set('disableSave', true); this.set('savingStatus', I18n.t('saving')); - let promise = group.get("id") ? group.save() : group.create().then(() => groupsController.addObject(group)); + let promise = group.get("id") ? group.save() : group.create().then(() => groupsController.get('model').addObject(group)); promise.then(() => { this.transitionToRoute("adminGroup", groupType, group.get('name')); @@ -109,7 +68,7 @@ export default Ember.Controller.extend({ destroy() { const group = this.get('model'), - groupsController = this.get('controllers.adminGroupsType'), + groupsController = this.get('adminGroupsType'), self = this; if (!group.get('id')) { diff --git a/app/assets/javascripts/admin/controllers/admin-groups-type.js.es6 b/app/assets/javascripts/admin/controllers/admin-groups-type.js.es6 index 9a5962cccfa..10d7ad01cfe 100644 --- a/app/assets/javascripts/admin/controllers/admin-groups-type.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-groups-type.js.es6 @@ -1,18 +1,18 @@ import { ajax } from 'discourse/lib/ajax'; -export default Ember.ArrayController.extend({ - sortProperties: ['name'], +export default Ember.Controller.extend({ + sortedGroups: Ember.computed.sort('model', 'groupSorting'), + groupSorting: ['name'], + refreshingAutoGroups: false, - isAuto: function(){ - return this.get('type') === 'automatic'; - }.property('type'), + + isAuto: Ember.computed.equal('type', 'automatic'), actions: { - refreshAutoGroups: function(){ - var self = this; + refreshAutoGroups() { this.set('refreshingAutoGroups', true); - ajax('/admin/groups/refresh_automatic_groups', {type: 'POST'}).then(function() { - self.transitionToRoute("adminGroupsType", "automatic").then(function() { - self.set('refreshingAutoGroups', false); + ajax('/admin/groups/refresh_automatic_groups', {type: 'POST'}).then(() => { + this.transitionToRoute("adminGroupsType", "automatic").then(() => { + this.set('refreshingAutoGroups', false); }); }); } diff --git a/app/assets/javascripts/admin/controllers/admin-logs-screened-emails.js.es6 b/app/assets/javascripts/admin/controllers/admin-logs-screened-emails.js.es6 index fe158a33aba..13685f16b95 100644 --- a/app/assets/javascripts/admin/controllers/admin-logs-screened-emails.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-logs-screened-emails.js.es6 @@ -2,12 +2,12 @@ import { exportEntity } from 'discourse/lib/export-csv'; import { outputExportResult } from 'discourse/lib/export-result'; import ScreenedEmail from 'admin/models/screened-email'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ loading: false, actions: { clearBlock(row){ - row.clearBlock().then(function(){ + row.clearBlock().then(function() { // feeling lazy window.location.reload(); }); @@ -19,11 +19,10 @@ export default Ember.ArrayController.extend({ }, show() { - var self = this; - self.set('loading', true); - ScreenedEmail.findAll().then(function(result) { - self.set('model', result); - self.set('loading', false); + this.set('loading', true); + ScreenedEmail.findAll().then(result => { + this.set('model', result); + this.set('loading', false); }); } }); diff --git a/app/assets/javascripts/admin/controllers/admin-logs-screened-ip-addresses.js.es6 b/app/assets/javascripts/admin/controllers/admin-logs-screened-ip-addresses.js.es6 index 88f46d6ccbc..b654e6d65f7 100644 --- a/app/assets/javascripts/admin/controllers/admin-logs-screened-ip-addresses.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-logs-screened-ip-addresses.js.es6 @@ -3,7 +3,7 @@ import { outputExportResult } from 'discourse/lib/export-result'; import { exportEntity } from 'discourse/lib/export-csv'; import ScreenedIpAddress from 'admin/models/screened-ip-address'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ loading: false, filter: null, savedIpAddress: null, @@ -63,16 +63,15 @@ export default Ember.ArrayController.extend({ }, destroy(record) { - const self = this; return bootbox.confirm( I18n.t("admin.logs.screened_ips.delete_confirm", { ip_address: record.get('ip_address') }), I18n.t("no_value"), I18n.t("yes_value"), - function (result) { + result => { if (result) { record.destroy().then(deleted => { if (deleted) { - self.get("content").removeObject(record); + this.get("model").removeObject(record); } else { bootbox.alert(I18n.t("generic_error")); } diff --git a/app/assets/javascripts/admin/controllers/admin-logs-screened-urls.js.es6 b/app/assets/javascripts/admin/controllers/admin-logs-screened-urls.js.es6 index 5f5e3339608..d57a151d219 100644 --- a/app/assets/javascripts/admin/controllers/admin-logs-screened-urls.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-logs-screened-urls.js.es6 @@ -2,15 +2,14 @@ import { exportEntity } from 'discourse/lib/export-csv'; import { outputExportResult } from 'discourse/lib/export-result'; import ScreenedUrl from 'admin/models/screened-url'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ loading: false, show() { - const self = this; - self.set('loading', true); - ScreenedUrl.findAll().then(function(result) { - self.set('model', result); - self.set('loading', false); + this.set('loading', true); + ScreenedUrl.findAll().then(result => { + this.set('model', result); + this.set('loading', false); }); }, diff --git a/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js.es6 b/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js.es6 index 956a737e578..98f135dc57c 100644 --- a/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js.es6 @@ -2,7 +2,7 @@ import { exportEntity } from 'discourse/lib/export-csv'; import { outputExportResult } from 'discourse/lib/export-result'; import StaffActionLog from 'admin/models/staff-action-log'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ loading: false, filters: null, diff --git a/app/assets/javascripts/admin/controllers/admin-permalinks.js.es6 b/app/assets/javascripts/admin/controllers/admin-permalinks.js.es6 index 9c5ab4bb3e8..6bfcc669227 100644 --- a/app/assets/javascripts/admin/controllers/admin-permalinks.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-permalinks.js.es6 @@ -1,16 +1,14 @@ import debounce from 'discourse/lib/debounce'; import Permalink from 'admin/models/permalink'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ loading: false, filter: null, show: debounce(function() { - var self = this; - self.set('loading', true); - Permalink.findAll(self.get("filter")).then(function(result) { - self.set('model', result); - self.set('loading', false); + Permalink.findAll(this.get("filter")).then(result => { + this.set('model', result); + this.set('loading', false); }); }, 250).observes("filter"), @@ -20,12 +18,11 @@ export default Ember.ArrayController.extend({ }, destroy: function(record) { - const self = this; - return bootbox.confirm(I18n.t("admin.permalink.delete_confirm"), I18n.t("no_value"), I18n.t("yes_value"), function(result) { + return bootbox.confirm(I18n.t("admin.permalink.delete_confirm"), I18n.t("no_value"), I18n.t("yes_value"), result => { if (result) { - record.destroy().then(function(deleted) { + record.destroy().then(deleted => { if (deleted) { - self.removeObject(record); + this.get('model').removeObject(record); } else { bootbox.alert(I18n.t("generic_error")); } diff --git a/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 b/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 index b2eb1335ed8..5393a27c8f6 100644 --- a/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 @@ -1,10 +1,9 @@ -export default Ember.ArrayController.extend({ - +export default Ember.Controller.extend({ adminRoutes: function() { - return this.get('model').map(function(p) { - if (p.get('enabled')) { - return p.admin_route; - } + return this.get('model').map(p => { + if (p.get('enabled')) { + return p.admin_route; + } }).compact(); }.property() }); diff --git a/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 b/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 index b16db34e3e6..df0738bed18 100644 --- a/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 @@ -1,16 +1,16 @@ export default Ember.Controller.extend({ categoryNameKey: null, - needs: ['adminSiteSettings'], + adminSiteSettings: Ember.inject.controller(), filteredContent: function() { if (!this.get('categoryNameKey')) { return []; } - const category = this.get('controllers.adminSiteSettings.content').findProperty('nameKey', this.get('categoryNameKey')); + const category = (this.get('adminSiteSettings.model') || []).findBy('nameKey', this.get('categoryNameKey')); if (category) { return category.siteSettings; } else { return []; } - }.property('controllers.adminSiteSettings.content', 'categoryNameKey') + }.property('adminSiteSettings.model', 'categoryNameKey') }); 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 b7c4302e87c..9cd65adf101 100644 --- a/app/assets/javascripts/admin/controllers/admin-site-settings.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-site-settings.js.es6 @@ -1,6 +1,7 @@ import debounce from 'discourse/lib/debounce'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ + queryParams: ["filter"], filter: null, onlyOverridden: false, filtered: Ember.computed.notEmpty('filter'), diff --git a/app/assets/javascripts/admin/controllers/admin-site-text-index.js.es6 b/app/assets/javascripts/admin/controllers/admin-site-text-index.js.es6 index 0c770bd06bd..bc2147e9232 100644 --- a/app/assets/javascripts/admin/controllers/admin-site-text-index.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-site-text-index.js.es6 @@ -1,38 +1,14 @@ -import { default as computed } from 'ember-addons/ember-computed-decorators'; - let lastSearch; +let lastOverridden; export default Ember.Controller.extend({ - _q: null, searching: false, siteTexts: null, preferred: false, - _overridden: null, queryParams: ['q', 'overridden'], - @computed - overridden: { - set(value) { - if (!value || value === "false") { value = false; } - this._overridden = value; - return value; - }, - get() { - return this._overridden; - } - }, - - @computed - q: { - set(value) { - if (Ember.isEmpty(value)) { value = null; } - this._q = value; - return value; - }, - get() { - return this._q; - } - }, + q: null, + overridden: null, _performSearch() { this.store.find('site-text', this.getProperties('q', 'overridden')).then(results => { @@ -46,11 +22,14 @@ export default Ember.Controller.extend({ }, search(overridden) { + this.set('overridden', overridden); + const q = this.get('q'); - if (q !== lastSearch || overridden) { + if (q !== lastSearch || overridden !== lastOverridden) { this.set('searching', true); Ember.run.debounce(this, this._performSearch, 400); lastSearch = q; + lastOverridden = overridden; } } } 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 c8c0ba6219e..a2b7c94f175 100644 --- a/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 @@ -1,10 +1,11 @@ import UserBadge from 'discourse/models/user-badge'; -export default Ember.ArrayController.extend({ - needs: ["adminUser"], - user: Em.computed.alias('controllers.adminUser.model'), - sortProperties: ['granted_at'], - sortAscending: false, +export default Ember.Controller.extend({ + adminUser: Ember.inject.controller(), + user: Ember.computed.alias('adminUser.model'), + + sortedBadges: Ember.computed.sort('model', 'badgeSortOrder'), + badgeSortOrder: ['granted_at:desc'], groupedBadges: function(){ const allBadges = this.get('model'); @@ -38,8 +39,6 @@ export default Ember.ArrayController.extend({ }); return _(expanded).sortBy(group => group.granted_at).reverse().value(); - - }.property('model', 'model.[]', 'model.expandedBadges.[]'), /** @@ -80,22 +79,15 @@ export default Ember.ArrayController.extend({ model.get('expandedBadges').pushObject(userBadge.badge.id); }, - /** - Grant the selected badge to the user. - - @method grantBadge - @param {Integer} badgeId id of the badge we want to grant. - **/ - grantBadge: function(badgeId) { - var self = this; - UserBadge.grant(badgeId, this.get('user.username'), this.get('badgeReason')).then(function(userBadge) { - self.set('badgeReason', ''); - self.pushObject(userBadge); - Ember.run.next(function() { + grantBadge(badgeId) { + UserBadge.grant(badgeId, this.get('user.username'), this.get('badgeReason')).then(userBadge => { + this.set('badgeReason', ''); + this.get('model').pushObject(userBadge); + Ember.run.next(() => { // Update the selected badge ID after the combobox has re-rendered. - var newSelectedBadge = self.get('grantableBadges')[0]; + const newSelectedBadge = this.get('grantableBadges')[0]; if (newSelectedBadge) { - self.set('selectedBadgeId', newSelectedBadge.get('id')); + this.set('selectedBadgeId', newSelectedBadge.get('id')); } }); }, function() { @@ -104,12 +96,11 @@ export default Ember.ArrayController.extend({ }); }, - revokeBadge: function(userBadge) { - var self = this; - return bootbox.confirm(I18n.t("admin.badges.revoke_confirm"), I18n.t("no_value"), I18n.t("yes_value"), function(result) { + revokeBadge(userBadge) { + return bootbox.confirm(I18n.t("admin.badges.revoke_confirm"), I18n.t("no_value"), I18n.t("yes_value"), result => { if (result) { - userBadge.revoke().then(function() { - self.get('model').removeObject(userBadge); + userBadge.revoke().then(() => { + this.get('model').removeObject(userBadge); }); } }); diff --git a/app/assets/javascripts/admin/controllers/admin-user-fields.js.es6 b/app/assets/javascripts/admin/controllers/admin-user-fields.js.es6 index 70963a147e5..6b106b075d8 100644 --- a/app/assets/javascripts/admin/controllers/admin-user-fields.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-user-fields.js.es6 @@ -6,12 +6,8 @@ export default Ember.Controller.extend({ fieldTypes: null, createDisabled: Em.computed.gte('model.length', MAX_FIELDS), - arrangedContent: function() { - return Ember.ArrayProxy.extend(Ember.SortableMixin).create({ - sortProperties: ['position'], - content: this.get('model') - }); - }.property('model'), + fieldSortOrder: ['position'], + sortedFields: Ember.computed.sort('model', 'fieldSortOrder'), actions: { createField() { @@ -20,9 +16,9 @@ export default Ember.Controller.extend({ }, moveUp(f) { - const idx = this.get('arrangedContent').indexOf(f); + const idx = this.get('sortedFields').indexOf(f); if (idx) { - const prev = this.get('arrangedContent').objectAt(idx-1); + const prev = this.get('sortedFields').objectAt(idx-1); const prevPos = prev.get('position'); prev.update({ position: f.get('position') }); @@ -31,9 +27,9 @@ export default Ember.Controller.extend({ }, moveDown(f) { - const idx = this.get('arrangedContent').indexOf(f); + const idx = this.get('sortedFields').indexOf(f); if (idx > -1) { - const next = this.get('arrangedContent').objectAt(idx+1); + const next = this.get('sortedFields').objectAt(idx+1); const nextPos = next.get('position'); next.update({ position: f.get('position') }); diff --git a/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 b/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 index 0c1cb7abb37..14bc031c0a3 100644 --- a/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 @@ -31,6 +31,29 @@ export default Ember.Controller.extend(CanCheckEmails, { }.property('model.user_fields.[]'), actions: { + + impersonate() { return this.get("model").impersonate(); }, + logOut() { return this.get("model").logOut(); }, + resetBounceScore() { return this.get("model").resetBounceScore(); }, + refreshBrowsers() { return this.get("model").refreshBrowsers(); }, + approve() { return this.get("model").approve(); }, + deactivate() { return this.get("model").deactivate(); }, + sendActivationEmail() { return this.get("model").sendActivationEmail(); }, + activate() { return this.get("model").activate(); }, + revokeAdmin() { return this.get("model").revokeAdmin(); }, + grantAdmin() { return this.get("model").grantAdmin(); }, + revokeModeration() { return this.get("model").revokeModeration(); }, + grantModeration() { return this.get("model").grantModeration(); }, + saveTrustLevel() { return this.get("model").saveTrustLevel(); }, + restoreTrustLevel() { return this.get("model").restoreTrustLevel(); }, + lockTrustLevel(locked) { return this.get("model").lockTrustLevel(locked); }, + unsuspend() { return this.get("model").unsuspend(); }, + unblock() { return this.get("model").unblock(); }, + block() { return this.get("model").block(); }, + deleteAllPosts() { return this.get("model").deleteAllPosts(); }, + anonymize() { return this.get('model').anonymize(); }, + destroy() { return this.get('model').destroy(); }, + toggleTitleEdit() { this.set('userTitleValue', this.get('model.title')); this.toggleProperty('editingTitle'); @@ -39,7 +62,7 @@ export default Ember.Controller.extend(CanCheckEmails, { saveTitle() { const self = this; - return ajax("/users/" + this.get('model.username').toLowerCase(), { + return ajax(`/users/${this.get('model.username').toLowerCase()}.json`, { data: {title: this.get('userTitleValue')}, type: 'PUT' }).catch(function(e) { @@ -107,14 +130,6 @@ export default Ember.Controller.extend(CanCheckEmails, { if (result) { self.get('model').revokeApiKey(); } } ); - }, - - anonymize() { - this.get('model').anonymize(); - }, - - destroy() { - this.get('model').destroy(); } } diff --git a/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 index af4a0297ef6..1d877dadaf5 100644 --- a/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 @@ -2,7 +2,7 @@ import debounce from 'discourse/lib/debounce'; import { i18n } from 'discourse/lib/computed'; import AdminUser from 'admin/models/admin-user'; -export default Ember.ArrayController.extend({ +export default Ember.Controller.extend({ query: null, showEmails: false, refreshing: false, @@ -19,7 +19,7 @@ export default Ember.ArrayController.extend({ selectedCount: function() { var model = this.get('model'); if (!model || !model.length) return 0; - return model.filterProperty('selected').length; + return model.filterBy('selected').length; }.property('model.@each.selected'), selectAllChanged: function() { @@ -52,14 +52,14 @@ export default Ember.ArrayController.extend({ actions: { approveUsers: function() { - AdminUser.bulkApprove(this.get('model').filterProperty('selected')); + AdminUser.bulkApprove(this.get('model').filterBy('selected')); this._refreshUsers(); }, rejectUsers: function() { var maxPostAge = this.siteSettings.delete_user_max_post_age; var controller = this; - AdminUser.bulkReject(this.get('model').filterProperty('selected')).then(function(result){ + AdminUser.bulkReject(this.get('model').filterBy('selected')).then(function(result){ var message = I18n.t("admin.users.reject_successful", {count: result.success}); if (result.failed > 0) { message += ' ' + I18n.t("admin.users.reject_failures", {count: result.failed}); diff --git a/app/assets/javascripts/admin/controllers/admin-web-hooks-show-events.js.es6 b/app/assets/javascripts/admin/controllers/admin-web-hooks-show-events.js.es6 new file mode 100644 index 00000000000..6ef4411702e --- /dev/null +++ b/app/assets/javascripts/admin/controllers/admin-web-hooks-show-events.js.es6 @@ -0,0 +1,65 @@ +import { ajax } from 'discourse/lib/ajax'; +import { popupAjaxError } from 'discourse/lib/ajax-error'; +import computed from 'ember-addons/ember-computed-decorators'; + +export default Ember.Controller.extend({ + pingDisabled: false, + incomingEventIds: [], + incomingCount: Ember.computed.alias("incomingEventIds.length"), + + @computed('incomingCount') + hasIncoming(incomingCount) { + return incomingCount > 0; + }, + + subscribe() { + this.messageBus.subscribe(`/web_hook_events/${this.get('model.extras.web_hook_id')}`, data => { + if (data.event_type === 'ping') { + this.set('pingDisabled', false); + } + this._addIncoming(data.web_hook_event_id); + }); + }, + + unsubscribe() { + this.messageBus.unsubscribe('/web_hook_events/*'); + }, + + _addIncoming(eventId) { + const incomingEventIds = this.get("incomingEventIds"); + + if (incomingEventIds.indexOf(eventId) === -1) { + incomingEventIds.pushObject(eventId); + } + }, + + actions: { + loadMore() { + this.get('model').loadMore(); + }, + + ping() { + this.set('pingDisabled', true); + + ajax(`/admin/api/web_hooks/${this.get('model.extras.web_hook_id')}/ping`, { + type: 'POST' + }).catch(error => { + this.set('pingDisabled', false); + popupAjaxError(error); + }); + }, + + showInserted() { + const webHookId = this.get('model.extras.web_hook_id'); + + ajax(`/admin/api/web_hooks/${webHookId}/events/bulk`, { + type: 'GET', + data: { ids: this.get('incomingEventIds') } + }).then(data => { + const objects = data.map(event => this.store.createRecord('web-hook-event', event)); + this.get("model").unshiftObjects(objects); + this.set("incomingEventIds", []); + }); + } + } +}); diff --git a/app/assets/javascripts/admin/controllers/admin-web-hooks-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-web-hooks-show.js.es6 new file mode 100644 index 00000000000..53d8370403b --- /dev/null +++ b/app/assets/javascripts/admin/controllers/admin-web-hooks-show.js.es6 @@ -0,0 +1,98 @@ +import { popupAjaxError } from 'discourse/lib/ajax-error'; +import { extractDomainFromUrl } from 'discourse/lib/utilities'; +import computed from 'ember-addons/ember-computed-decorators'; +import InputValidation from 'discourse/models/input-validation'; + +export default Ember.Controller.extend({ + adminWebHooks: Ember.inject.controller(), + eventTypes: Ember.computed.alias('adminWebHooks.eventTypes'), + defaultEventTypes: Ember.computed.alias('adminWebHooks.defaultEventTypes'), + contentTypes: Ember.computed.alias('adminWebHooks.contentTypes'), + + @computed('model.isSaving', 'saved', 'saveButtonDisabled') + savingStatus(isSaving, saved, saveButtonDisabled) { + if (isSaving) { + return I18n.t('saving'); + } else if (!saveButtonDisabled && saved) { + return I18n.t('saved'); + } + // Use side effect of validation to clear saved text + this.set('saved', false); + return ''; + }, + + @computed('model.isNew') + saveButtonText(isNew) { + return isNew ? I18n.t('admin.web_hooks.create') : I18n.t('admin.web_hooks.save'); + }, + + @computed('model.secret') + secretValidation(secret) { + if (!Ember.isEmpty(secret)) { + if (secret.indexOf(' ') !== -1) { + return InputValidation.create({ + failed: true, + reason: I18n.t('admin.web_hooks.secret_invalid') + }); + } + + if (secret.length < 12) { + return InputValidation.create({ + failed: true, + reason: I18n.t('admin.web_hooks.secret_too_short') + }); + } + } + }, + + @computed('model.wildcard_web_hook', 'model.web_hook_event_types.[]') + eventTypeValidation(isWildcard, eventTypes) { + if (!isWildcard && Ember.isEmpty(eventTypes)) { + return InputValidation.create({ + failed: true, + reason: I18n.t('admin.web_hooks.event_type_missing') + }); + } + }, + + @computed('model.isSaving', 'secretValidation', 'eventTypeValidation') + saveButtonDisabled(isSaving, secretValidation, eventTypeValidation) { + return isSaving ? false : secretValidation || eventTypeValidation; + }, + + actions: { + save() { + this.set('saved', false); + const url = extractDomainFromUrl(this.get('model.payload_url')); + const model = this.get('model'); + const saveWebHook = () => { + return model.save().then(() => { + this.set('saved', true); + this.get('adminWebHooks').get('model').addObject(model); + }).catch(popupAjaxError); + }; + + if (url === 'localhost' || url.match(/192\.168\.\d+\.\d+/) || url.match(/127\.\d+\.\d+\.\d+/) || url === Discourse.BaseUrl) { + return bootbox.confirm(I18n.t('admin.web_hooks.warn_local_payload_url'), I18n.t('no_value'), I18n.t('yes_value'), result => { + if (result) { + return saveWebHook(); + } + }); + } + + return saveWebHook(); + }, + + destroy() { + return bootbox.confirm(I18n.t('admin.web_hooks.delete_confirm'), I18n.t('no_value'), I18n.t('yes_value'), result => { + if (result) { + const model = this.get('model'); + model.destroyRecord().then(() => { + this.get('adminWebHooks').get('model').removeObject(model); + this.transitionToRoute('adminWebHooks'); + }).catch(popupAjaxError); + } + }); + } + } +}); diff --git a/app/assets/javascripts/admin/controllers/admin-web-hooks.js.es6 b/app/assets/javascripts/admin/controllers/admin-web-hooks.js.es6 new file mode 100644 index 00000000000..50b8b370f3a --- /dev/null +++ b/app/assets/javascripts/admin/controllers/admin-web-hooks.js.es6 @@ -0,0 +1,19 @@ +import { popupAjaxError } from 'discourse/lib/ajax-error'; + +export default Ember.Controller.extend({ + actions: { + destroy(webhook) { + return bootbox.confirm(I18n.t('admin.web_hooks.delete_confirm'), I18n.t('no_value'), I18n.t('yes_value'), result => { + if (result) { + webhook.destroyRecord().then(() => { + this.get('model').removeObject(webhook); + }).catch(popupAjaxError); + } + }); + }, + + loadMore() { + this.get('model').loadMore(); + } + } +}); diff --git a/app/assets/javascripts/admin/controllers/modals/admin-agree-flag.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-agree-flag.js.es6 index 2924eb66998..7f1f4f2e49a 100644 --- a/app/assets/javascripts/admin/controllers/modals/admin-agree-flag.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/admin-agree-flag.js.es6 @@ -1,16 +1,15 @@ import ModalFunctionality from 'discourse/mixins/modal-functionality'; export default Ember.Controller.extend(ModalFunctionality, { - needs: ["admin-flags-list"], + adminFlagsList: Ember.inject.controller(), _agreeFlag: function (actionOnPost) { - var adminFlagController = this.get("controllers.admin-flags-list"); - var post = this.get("content"); - var self = this; + const adminFlagController = this.get("adminFlagsList"); + const post = this.get("content"); - return post.agreeFlags(actionOnPost).then(function () { - adminFlagController.removeObject(post); - self.send("closeModal"); + return post.agreeFlags(actionOnPost).then(() => { + adminFlagController.get('model').removeObject(post); + this.send("closeModal"); }, function () { bootbox.alert(I18n.t("admin.flags.error")); }); diff --git a/app/assets/javascripts/admin/controllers/modals/admin-badge-preview.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-badge-preview.js.es6 index 8f93884c604..8aaf637552e 100644 --- a/app/assets/javascripts/admin/controllers/modals/admin-badge-preview.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/admin-badge-preview.js.es6 @@ -1,11 +1,9 @@ import { escapeExpression } from 'discourse/lib/utilities'; export default Ember.Controller.extend({ - needs: ['modal'], - - sample: Em.computed.alias('model.sample'), - errors: Em.computed.alias('model.errors'), - count: Em.computed.alias('model.grant_count'), + sample: Ember.computed.alias('model.sample'), + errors: Ember.computed.alias('model.errors'), + count: Ember.computed.alias('model.grant_count'), count_warning: function() { if (this.get('count') <= 10) { diff --git a/app/assets/javascripts/admin/controllers/modals/admin-delete-flag.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-delete-flag.js.es6 index 284b8bfd09d..fc2e0627946 100644 --- a/app/assets/javascripts/admin/controllers/modals/admin-delete-flag.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/admin-delete-flag.js.es6 @@ -1,36 +1,31 @@ import ModalFunctionality from 'discourse/mixins/modal-functionality'; export default Ember.Controller.extend(ModalFunctionality, { - needs: ["admin-flags-list"], + adminFlagsList: Ember.inject.controller(), actions: { + deletePostDeferFlag() { + const adminFlagController = this.get("adminFlagsList"); + const post = this.get("content"); - deletePostDeferFlag: function () { - var adminFlagController = this.get("controllers.admin-flags-list"); - var post = this.get("content"); - var self = this; - - return post.deferFlags(true).then(function () { - adminFlagController.removeObject(post); - self.send("closeModal"); + return post.deferFlags(true).then(() => { + adminFlagController.get('model').removeObject(post); + this.send("closeModal"); }, function () { bootbox.alert(I18n.t("admin.flags.error")); }); }, - deletePostAgreeFlag: function () { - var adminFlagController = this.get("controllers.admin-flags-list"); - var post = this.get("content"); - var self = this; + deletePostAgreeFlag() { + const adminFlagController = this.get("adminFlagsList"); + const post = this.get("content"); - return post.agreeFlags("delete").then(function () { - adminFlagController.removeObject(post); - self.send("closeModal"); + return post.agreeFlags("delete").then(() => { + adminFlagController.get('model').removeObject(post); + this.send("closeModal"); }, function () { bootbox.alert(I18n.t("admin.flags.error")); }); } - } - }); diff --git a/app/assets/javascripts/admin/controllers/modals/admin-edit-badge-groupings.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-edit-badge-groupings.js.es6 index 086080c1738..fe0416bc307 100644 --- a/app/assets/javascripts/admin/controllers/modals/admin-edit-badge-groupings.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/admin-edit-badge-groupings.js.es6 @@ -1,6 +1,5 @@ import { ajax } from 'discourse/lib/ajax'; export default Ember.Controller.extend({ - needs: ['modal'], modelChanged: function(){ const model = this.get('model'); diff --git a/app/assets/javascripts/admin/controllers/modals/admin-start-backup.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-start-backup.js.es6 index 15cd838245b..c041b24f744 100644 --- a/app/assets/javascripts/admin/controllers/modals/admin-start-backup.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/admin-start-backup.js.es6 @@ -2,31 +2,27 @@ import ModalFunctionality from 'discourse/mixins/modal-functionality'; import Backup from 'admin/models/backup'; export default Ember.Controller.extend(ModalFunctionality, { - needs: ["adminBackupsLogs"], + adminBackupsLogs: Ember.inject.controller(), - _startBackup: function (withUploads) { - var self = this; - Discourse.User.currentProp("hideReadOnlyAlert", true); - Backup.start(withUploads).then(function() { - self.get("controllers.adminBackupsLogs").clear(); - self.send("backupStarted"); + _startBackup(withUploads) { + this.currentUser.set('hideReadOnlyAlert', true); + Backup.start(withUploads).then(() => { + this.get("adminBackupsLogs.logs").clear(); + this.send("backupStarted"); }); }, actions: { - - startBackup: function () { + startBackup() { this._startBackup(); }, - startBackupWithoutUpload: function () { + startBackupWithoutUpload() { this._startBackup(false); }, - cancel: function () { + cancel() { this.send("closeModal"); } - } - }); diff --git a/app/assets/javascripts/admin/controllers/modals/delete-site-customization-details.js.es6 b/app/assets/javascripts/admin/controllers/modals/delete-site-customization-details.js.es6 index d38c396ceb7..95537e305a3 100644 --- a/app/assets/javascripts/admin/controllers/modals/delete-site-customization-details.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/delete-site-customization-details.js.es6 @@ -1,7 +1,7 @@ import ChangeSiteCustomizationDetailsController from "admin/controllers/modals/change-site-customization-details"; export default ChangeSiteCustomizationDetailsController.extend({ - onShow: function() { + onShow() { this.send("selectPrevious"); } }); diff --git a/app/assets/javascripts/admin/helpers/human-size.js.es6 b/app/assets/javascripts/admin/helpers/human-size.js.es6 index a43897c627e..a50cfe58190 100644 --- a/app/assets/javascripts/admin/helpers/human-size.js.es6 +++ b/app/assets/javascripts/admin/helpers/human-size.js.es6 @@ -1,3 +1,3 @@ -import { htmlHelper } from 'discourse/lib/helpers'; +import { htmlHelper } from 'discourse-common/lib/helpers'; export default htmlHelper(size => I18n.toHumanSize(size)); diff --git a/app/assets/javascripts/admin/helpers/preserve-newlines.js.es6 b/app/assets/javascripts/admin/helpers/preserve-newlines.js.es6 index 73bac433799..b58e9a552ce 100644 --- a/app/assets/javascripts/admin/helpers/preserve-newlines.js.es6 +++ b/app/assets/javascripts/admin/helpers/preserve-newlines.js.es6 @@ -1,4 +1,4 @@ -import { htmlHelper } from 'discourse/lib/helpers'; +import { htmlHelper } from 'discourse-common/lib/helpers'; import { escapeExpression } from 'discourse/lib/utilities'; export default htmlHelper(str => escapeExpression(str).replace(/\n/g, "
")); diff --git a/app/assets/javascripts/admin/helpers/value-at-tl.js.es6 b/app/assets/javascripts/admin/helpers/value-at-tl.js.es6 index aeac49e83d6..48d2271caba 100644 --- a/app/assets/javascripts/admin/helpers/value-at-tl.js.es6 +++ b/app/assets/javascripts/admin/helpers/value-at-tl.js.es6 @@ -1,4 +1,4 @@ -import { registerUnbound } from 'discourse/lib/helpers'; +import { registerUnbound } from 'discourse-common/lib/helpers'; registerUnbound('value-at-tl', function(data, params) { var tl = parseInt(params.level, 10); diff --git a/app/assets/javascripts/admin/models/admin-user.js.es6 b/app/assets/javascripts/admin/models/admin-user.js.es6 index d804894770a..48764b671d6 100644 --- a/app/assets/javascripts/admin/models/admin-user.js.es6 +++ b/app/assets/javascripts/admin/models/admin-user.js.es6 @@ -96,7 +96,7 @@ const AdminUser = Discourse.User.extend({ deleteAllPosts() { const user = this, - message = I18n.t('admin.user.delete_all_posts_confirm', { posts: user.get('post_count'), topics: user.get('topic_count') }), + message = I18n.messageFormat('admin.user.delete_all_posts_confirm_MF', { "POSTS": user.get('post_count'), "TOPICS": user.get('topic_count') }), buttons = [{ "label": I18n.t("composer.cancel"), "class": "cancel-inline", @@ -257,7 +257,7 @@ const AdminUser = Discourse.User.extend({ }); }, - log_out() { + logOut() { return ajax("/admin/users/" + this.id + "/log_out", { type: 'POST', data: { username_or_email: this.get('username') } @@ -467,13 +467,13 @@ const AdminUser = Discourse.User.extend({ user.checkEmail().then(function() { const data = { - posts: user.get('post_count'), - topics: user.get('topic_count'), + "POSTS": user.get('post_count'), + "TOPICS": user.get('topic_count'), email: user.get('email') || I18n.t("flagging.hidden_email_address"), ip_address: user.get('ip_address') || I18n.t("flagging.ip_address_missing") }; - const message = I18n.t('flagging.delete_confirm', data), + const message = I18n.messageFormat('flagging.delete_confirm_MF', data), buttons = [{ "label": I18n.t("composer.cancel"), "class": "cancel-inline", diff --git a/app/assets/javascripts/admin/models/api-key.js.es6 b/app/assets/javascripts/admin/models/api-key.js.es6 index aa05ce8341c..2a7cf867783 100644 --- a/app/assets/javascripts/admin/models/api-key.js.es6 +++ b/app/assets/javascripts/admin/models/api-key.js.es6 @@ -52,7 +52,7 @@ ApiKey.reopenClass({ @returns {Promise} a promise that resolves to the array of `ApiKey` instances **/ find: function() { - return ajax("/admin/api").then(function(keys) { + return ajax("/admin/api/keys").then(function(keys) { return keys.map(function (key) { return ApiKey.create(key); }); diff --git a/app/assets/javascripts/admin/models/backup.js.es6 b/app/assets/javascripts/admin/models/backup.js.es6 index d7baceebacf..7fe81441c37 100644 --- a/app/assets/javascripts/admin/models/backup.js.es6 +++ b/app/assets/javascripts/admin/models/backup.js.es6 @@ -2,7 +2,6 @@ import { ajax } from 'discourse/lib/ajax'; import PreloadStore from 'preload-store'; const Backup = Discourse.Model.extend({ - destroy() { return ajax("/admin/backups/" + this.get("filename"), { type: "DELETE" }); }, @@ -13,11 +12,9 @@ const Backup = Discourse.Model.extend({ data: { client_id: window.MessageBus.clientId } }); } - }); Backup.reopenClass({ - find() { return PreloadStore.getAndRemove("backups", () => ajax("/admin/backups.json")) .then(backups => backups.map(backup => Backup.create(backup))); diff --git a/app/assets/javascripts/admin/models/email-preview.js.es6 b/app/assets/javascripts/admin/models/email-preview.js.es6 index f992bf250d8..acc7462b925 100644 --- a/app/assets/javascripts/admin/models/email-preview.js.es6 +++ b/app/assets/javascripts/admin/models/email-preview.js.es6 @@ -5,7 +5,7 @@ EmailPreview.reopenClass({ findDigest: function(lastSeenAt, username) { if (Em.isEmpty(lastSeenAt)) { - lastSeenAt = moment().subtract(7, 'days').format('YYYY-MM-DD'); + lastSeenAt = this.oneWeekAgo(); } if (Em.isEmpty(username)) { @@ -17,6 +17,25 @@ EmailPreview.reopenClass({ }).then(function (result) { return EmailPreview.create(result); }); + }, + + sendDigest: function(lastSeenAt, username, email) { + if (Em.isEmpty(lastSeenAt)) { + lastSeenAt = this.oneWeekAgo(); + } + + if (Em.isEmpty(username)) { + username = Discourse.User.current().username; + } + + return ajax("/admin/email/send-digest.json", { + data: { last_seen_at: lastSeenAt, username: username, email: email } + }); + }, + + oneWeekAgo() { + const en = moment().locale('en'); + return en.subtract(7, 'days').format('YYYY-MM-DD'); } }); diff --git a/app/assets/javascripts/admin/models/report.js.es6 b/app/assets/javascripts/admin/models/report.js.es6 index 3342323b467..03e3888f97b 100644 --- a/app/assets/javascripts/admin/models/report.js.es6 +++ b/app/assets/javascripts/admin/models/report.js.es6 @@ -81,7 +81,8 @@ const Report = Discourse.Model.extend({ switch (this.get("type")) { case "flags": return "flag"; case "likes": return "heart"; - default: return null; + case "bookmarks": return "bookmark"; + default: return null; } }.property("type"), diff --git a/app/assets/javascripts/admin/models/web-hook.js.es6 b/app/assets/javascripts/admin/models/web-hook.js.es6 new file mode 100644 index 00000000000..e688a4dd0a1 --- /dev/null +++ b/app/assets/javascripts/admin/models/web-hook.js.es6 @@ -0,0 +1,85 @@ +import RestModel from 'discourse/models/rest'; +import Category from 'discourse/models/category'; +import Group from 'discourse/models/group'; +import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; + +export default RestModel.extend({ + content_type: 1, // json + last_delivery_status: 1, // inactive + wildcard_web_hook: false, + verify_certificate: true, + active: false, + web_hook_event_types: null, + categoriesFilter: null, + groupsFilterInName: null, + + @computed('wildcard_web_hook') + webHookType: { + get(wildcard) { + return wildcard ? 'wildcard' : 'individual'; + }, + set(value) { + this.set('wildcard_web_hook', value === 'wildcard'); + } + }, + + @observes('category_ids') + updateCategoriesFilter() { + this.set('categoriesFilter', Category.findByIds(this.get('category_ids'))); + }, + + @observes('group_ids') + updateGroupsFilter() { + const groupIds = this.get('group_ids'); + this.set('groupsFilterInName', Discourse.Site.currentProp('groups').reduce((groupNames, g) => { + if (groupIds.includes(g.id)) { groupNames.push(g.name); } + return groupNames; + }, [])); + }, + + groupFinder(term) { + return Group.findAll({search: term, ignore_automatic: false}); + }, + + @computed('wildcard_web_hook', 'web_hook_event_types.[]') + description(isWildcardWebHook, types) { + let desc = ''; + + types.forEach(type => { + const name = `${type.name.toLowerCase()}_event`; + desc += (desc !== '' ? `, ${name}` : name); + }); + + return (isWildcardWebHook ? '*' : desc); + }, + + createProperties() { + const types = this.get('web_hook_event_types'); + const categories = this.get('categoriesFilter'); + // Hack as {{group-selector}} accepts a comma-separated string as data source, but + // we use an array to populate the datasource above. + const groupsFilter = this.get('groupsFilterInName'); + const groupNames = typeof groupsFilter === 'string' ? groupsFilter.split(',') : groupsFilter; + + return { + payload_url: this.get('payload_url'), + content_type: this.get('content_type'), + secret: this.get('secret'), + wildcard_web_hook: this.get('wildcard_web_hook'), + verify_certificate: this.get('verify_certificate'), + active: this.get('active'), + web_hook_event_type_ids: Ember.isEmpty(types) ? [null] : types.map(type => type.id), + category_ids: Ember.isEmpty(categories) ? [null] : categories.map(c => c.id), + group_ids: Ember.isEmpty(groupNames) || Ember.isEmpty(groupNames[0]) ? [null] : Discourse.Site.currentProp('groups') + .reduce((groupIds, g) => { + if (groupNames.includes(g.name)) { groupIds.push(g.id); } + return groupIds; + }, []) + }; + }, + + updateProperties() { + return this.createProperties(); + } +}); + diff --git a/app/assets/javascripts/admin/routes/admin-api-index.js.es6 b/app/assets/javascripts/admin/routes/admin-api-index.js.es6 new file mode 100644 index 00000000000..f41f6bb7948 --- /dev/null +++ b/app/assets/javascripts/admin/routes/admin-api-index.js.es6 @@ -0,0 +1,5 @@ +export default Ember.Route.extend({ + beforeModel() { + this.transitionTo('adminApiKeys'); + } +}); diff --git a/app/assets/javascripts/admin/routes/admin-api.js.es6 b/app/assets/javascripts/admin/routes/admin-api-keys.js.es6 similarity index 100% rename from app/assets/javascripts/admin/routes/admin-api.js.es6 rename to app/assets/javascripts/admin/routes/admin-api-keys.js.es6 diff --git a/app/assets/javascripts/admin/routes/admin-backups-logs.js.es6 b/app/assets/javascripts/admin/routes/admin-backups-logs.js.es6 index cd01295f5de..c036a107429 100644 --- a/app/assets/javascripts/admin/routes/admin-backups-logs.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-backups-logs.js.es6 @@ -5,17 +5,17 @@ export default Ember.Route.extend({ // since the logs are pushed via the message bus // we only want to preload them (hence the beforeModel hook) beforeModel() { - const logsController = this.controllerFor("adminBackupsLogs"); + const logs = this.controllerFor("adminBackupsLogs").get('logs'); // preload the logs if any PreloadStore.getAndRemove("logs").then(function (preloadedLogs) { if (preloadedLogs && preloadedLogs.length) { // we need to filter out message like: "[SUCCESS]" // and convert POJOs to Ember Objects - const logs = _.chain(preloadedLogs) - .reject(function (log) { return log.message.length === 0 || log.message[0] === "["; }) - .map(function (log) { return Em.Object.create(log); }) - .value(); - logsController.pushObjects(logs); + const newLogs = _.chain(preloadedLogs) + .reject(function (log) { return log.message.length === 0 || log.message[0] === "["; }) + .map(function (log) { return Em.Object.create(log); }) + .value(); + logs.pushObjects(newLogs); } }); }, diff --git a/app/assets/javascripts/admin/routes/admin-backups.js.es6 b/app/assets/javascripts/admin/routes/admin-backups.js.es6 index d590019431e..95407e9ff30 100644 --- a/app/assets/javascripts/admin/routes/admin-backups.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-backups.js.es6 @@ -15,7 +15,7 @@ export default Discourse.Route.extend({ _processLogMessage(log) { if (log.message === "[STARTED]") { this.controllerFor("adminBackups").set("model.isOperationRunning", true); - this.controllerFor("adminBackupsLogs").clear(); + this.controllerFor("adminBackupsLogs").get('logs').clear(); } else if (log.message === "[FAILED]") { this.controllerFor("adminBackups").set("model.isOperationRunning", false); bootbox.alert(I18n.t("admin.backups.operations.failed", { operation: log.operation })); @@ -27,7 +27,7 @@ export default Discourse.Route.extend({ window.location.pathname = Discourse.getURL("/"); } } else { - this.controllerFor("adminBackupsLogs").pushObject(Em.Object.create(log)); + this.controllerFor("adminBackupsLogs").get('logs').pushObject(Em.Object.create(log)); } }, @@ -49,7 +49,7 @@ export default Discourse.Route.extend({ actions: { startBackup() { - showModal('modals/admin-start-backup'); + showModal('admin-start-backup', { admin: true }); this.controllerFor('modal').set('modalClass', 'start-backup-modal'); }, diff --git a/app/assets/javascripts/admin/routes/admin-badges-show.js.es6 b/app/assets/javascripts/admin/routes/admin-badges-show.js.es6 index 03d091d228d..cc0155181f7 100644 --- a/app/assets/javascripts/admin/routes/admin-badges-show.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-badges-show.js.es6 @@ -13,7 +13,7 @@ export default Ember.Route.extend({ name: I18n.t('admin.badges.new_badge') }); } - return this.modelFor('adminBadges').findProperty('id', parseInt(params.badge_id)); + return this.modelFor('adminBadges').findBy('id', parseInt(params.badge_id)); }, actions: { @@ -27,7 +27,7 @@ export default Ember.Route.extend({ editGroupings() { const model = this.controllerFor('admin-badges').get('badgeGroupings'); - showModal('modals/admin-edit-badge-groupings', { model }); + showModal('admin-edit-badge-groupings', { model, admin: true }); }, preview(badge, explain) { @@ -42,7 +42,7 @@ export default Ember.Route.extend({ } }).then(function(model) { badge.set('preview_loading', false); - showModal('modals/admin-badge-preview', { model }); + showModal('admin-badge-preview', { model, admin: true }); }).catch(function(error) { badge.set('preview_loading', false); Em.Logger.error(error); diff --git a/app/assets/javascripts/admin/routes/admin-badges.js.es6 b/app/assets/javascripts/admin/routes/admin-badges.js.es6 index 68da5edb6b1..96ecddab234 100644 --- a/app/assets/javascripts/admin/routes/admin-badges.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-badges.js.es6 @@ -5,21 +5,20 @@ import BadgeGrouping from 'discourse/models/badge-grouping'; export default Discourse.Route.extend({ _json: null, - model: function() { - var self = this; - return ajax('/admin/badges.json').then(function(json) { - self._json = json; + model() { + return ajax('/admin/badges.json').then(json => { + this._json = json; return Badge.createFromJson(json); }); }, - setupController: function(controller, model) { - var json = this._json, - triggers = [], - badgeGroupings = []; + setupController(controller, model) { + const json = this._json; + const badgeTriggers = []; + const badgeGroupings = []; _.each(json.admin_badges.triggers,function(v,k){ - triggers.push({id: v, name: I18n.t('admin.badges.trigger_type.'+k)}); + badgeTriggers.push({id: v, name: I18n.t('admin.badges.trigger_type.'+k)}); }); json.badge_groupings.forEach(function(badgeGroupingJson) { @@ -30,8 +29,8 @@ export default Discourse.Route.extend({ badgeGroupings: badgeGroupings, badgeTypes: json.badge_types, protectedSystemFields: json.admin_badges.protected_system_fields, - badgeTriggers: triggers, - model: model + badgeTriggers, + model }); } }); diff --git a/app/assets/javascripts/admin/routes/admin-customize-css-html-show.js.es6 b/app/assets/javascripts/admin/routes/admin-customize-css-html-show.js.es6 index dc38f3c51fb..7df829706fd 100644 --- a/app/assets/javascripts/admin/routes/admin-customize-css-html-show.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-customize-css-html-show.js.es6 @@ -1,7 +1,7 @@ export default Ember.Route.extend({ model(params) { const all = this.modelFor('adminCustomizeCssHtml'); - const model = all.findProperty('id', parseInt(params.site_customization_id)); + const model = all.findBy('id', parseInt(params.site_customization_id)); return model ? { model, section: params.section } : this.replaceWith('adminCustomizeCssHtml.index'); }, diff --git a/app/assets/javascripts/admin/routes/admin-customize-email-templates-edit.js.es6 b/app/assets/javascripts/admin/routes/admin-customize-email-templates-edit.js.es6 index b6e4e36bf9f..7c759995fb4 100644 --- a/app/assets/javascripts/admin/routes/admin-customize-email-templates-edit.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-customize-email-templates-edit.js.es6 @@ -3,7 +3,7 @@ import { scrollTop } from 'discourse/mixins/scroll-top'; export default Ember.Route.extend({ model(params) { const all = this.modelFor('adminCustomizeEmailTemplates'); - return all.findProperty('id', params.id); + return all.findBy('id', params.id); }, setupController(controller, emailTemplate) { diff --git a/app/assets/javascripts/admin/routes/admin-email-index.js.es6 b/app/assets/javascripts/admin/routes/admin-email-index.js.es6 index 1b75e39f6f8..ae1272c0b9f 100644 --- a/app/assets/javascripts/admin/routes/admin-email-index.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-email-index.js.es6 @@ -3,9 +3,5 @@ import EmailSettings from 'admin/models/email-settings'; export default Discourse.Route.extend({ model() { return EmailSettings.find(); - }, - - renderTemplate() { - this.render('admin/templates/email_index', { into: 'adminEmail' }); } }); diff --git a/app/assets/javascripts/admin/routes/admin-email-rejected.js.es6 b/app/assets/javascripts/admin/routes/admin-email-rejected.js.es6 index a7819b31a60..22c4141275e 100644 --- a/app/assets/javascripts/admin/routes/admin-email-rejected.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-email-rejected.js.es6 @@ -6,7 +6,7 @@ export default AdminEmailIncomings.extend({ actions: { showIncomingEmail(id) { - showModal('modals/admin-incoming-email'); + showModal('admin-incoming-email', { admin: true }); this.controllerFor("modals/admin-incoming-email").load(id); } } diff --git a/app/assets/javascripts/admin/routes/admin-flags-list.js.es6 b/app/assets/javascripts/admin/routes/admin-flags-list.js.es6 index ebbc3e6d2bc..ba00186d90e 100644 --- a/app/assets/javascripts/admin/routes/admin-flags-list.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-flags-list.js.es6 @@ -14,12 +14,12 @@ export default Discourse.Route.extend({ actions: { showAgreeFlagModal(model) { - showModal('modals/admin-agree-flag', { model }); + showModal('admin-agree-flag', { model, admin: true }); this.controllerFor('modal').set('modalClass', 'agree-flag-modal'); }, showDeleteFlagModal(model) { - showModal('modals/admin-delete-flag', { model }); + showModal('admin-delete-flag', { model, admin: true }); this.controllerFor('modal').set('modalClass', 'delete-flag-modal'); } diff --git a/app/assets/javascripts/admin/routes/admin-group.js.es6 b/app/assets/javascripts/admin/routes/admin-group.js.es6 index 298bffaa434..3575496edd4 100644 --- a/app/assets/javascripts/admin/routes/admin-group.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-group.js.es6 @@ -7,8 +7,7 @@ export default Discourse.Route.extend({ return Group.create({ automatic: false, visible: true }); } - const group = this.modelFor('adminGroupsType') - .findProperty('name', params.name); + const group = this.modelFor('adminGroupsType').findBy('name', params.name); if (!group) { return this.transitionTo('adminGroups.index'); } diff --git a/app/assets/javascripts/admin/routes/admin-logs-screened-emails.js.es6 b/app/assets/javascripts/admin/routes/admin-logs-screened-emails.js.es6 index 1008dc1c1db..d31e5219242 100644 --- a/app/assets/javascripts/admin/routes/admin-logs-screened-emails.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-logs-screened-emails.js.es6 @@ -1,6 +1,6 @@ export default Discourse.Route.extend({ renderTemplate: function() { - this.render('admin/templates/logs/screened_emails', {into: 'adminLogs'}); + this.render('admin/templates/logs/screened-emails', {into: 'adminLogs'}); }, setupController: function() { diff --git a/app/assets/javascripts/admin/routes/admin-logs-screened-ip-addresses.js.es6 b/app/assets/javascripts/admin/routes/admin-logs-screened-ip-addresses.js.es6 index ca914fe1d26..c6518c244c8 100644 --- a/app/assets/javascripts/admin/routes/admin-logs-screened-ip-addresses.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-logs-screened-ip-addresses.js.es6 @@ -1,6 +1,6 @@ export default Discourse.Route.extend({ renderTemplate() { - this.render('admin/templates/logs/screened_ip_addresses', {into: 'adminLogs'}); + this.render('admin/templates/logs/screened-ip-addresses', {into: 'adminLogs'}); }, setupController() { diff --git a/app/assets/javascripts/admin/routes/admin-logs-screened-urls.js.es6 b/app/assets/javascripts/admin/routes/admin-logs-screened-urls.js.es6 index 093dd263319..ee65fda0900 100644 --- a/app/assets/javascripts/admin/routes/admin-logs-screened-urls.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-logs-screened-urls.js.es6 @@ -1,6 +1,6 @@ export default Discourse.Route.extend({ renderTemplate: function() { - this.render('admin/templates/logs/screened_urls', {into: 'adminLogs'}); + this.render('admin/templates/logs/screened-urls', {into: 'adminLogs'}); }, setupController: function() { diff --git a/app/assets/javascripts/admin/routes/admin-logs-staff-action-logs.js.es6 b/app/assets/javascripts/admin/routes/admin-logs-staff-action-logs.js.es6 index 6ef900e8436..48d04abc5f7 100644 --- a/app/assets/javascripts/admin/routes/admin-logs-staff-action-logs.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-logs-staff-action-logs.js.es6 @@ -3,7 +3,7 @@ import showModal from 'discourse/lib/show-modal'; export default Discourse.Route.extend({ // TODO: make this automatic using an `{{outlet}}` renderTemplate: function() { - this.render('admin/templates/logs/staff_action_logs', {into: 'adminLogs'}); + this.render('admin/templates/logs/staff-action-logs', {into: 'adminLogs'}); }, setupController: function(controller) { @@ -13,13 +13,18 @@ export default Discourse.Route.extend({ actions: { showDetailsModal(model) { - showModal('modals/admin-staff-action-log-details', { model }); + showModal('admin-staff-action-log-details', { model, admin: true }); this.controllerFor('modal').set('modalClass', 'log-details-modal'); }, showCustomDetailsModal(model) { - const modalName = "modals/" + (model.action_name + '_details').replace("_", "-"); - showModal(modalName, { model }); + const modalName = (model.action_name + '_details').replace(/\_/g, "-"); + + showModal(modalName, { + model, + admin: true, + templateName: 'site-customization-change' + }); this.controllerFor('modal').set('modalClass', 'tabbed-modal log-details-modal'); } } diff --git a/app/assets/javascripts/admin/routes/admin-route-map.js.es6 b/app/assets/javascripts/admin/routes/admin-route-map.js.es6 index 8c1f988af37..bd38784bb7f 100644 --- a/app/assets/javascripts/admin/routes/admin-route-map.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-route-map.js.es6 @@ -1,13 +1,11 @@ -export default { - resource: 'admin', - - map() { +export default function() { + this.route('admin', { resetNamespace: true }, function() { this.route('dashboard', { path: '/' }); - this.resource('adminSiteSettings', { path: '/site_settings' }, function() { - this.resource('adminSiteSettingsCategory', { path: 'category/:category_id'} ); + this.route('adminSiteSettings', { path: '/site_settings', resetNamespace: true }, function() { + this.route('adminSiteSettingsCategory', { path: 'category/:category_id', resetNamespace: true} ); }); - this.resource('adminEmail', { path: '/email'}, function() { + this.route('adminEmail', { path: '/email', resetNamespace: true}, function() { this.route('sent'); this.route('skipped'); this.route('bounced'); @@ -16,65 +14,77 @@ export default { this.route('previewDigest', { path: '/preview-digest' }); }); - this.resource('adminCustomize', { path: '/customize' } ,function() { + this.route('adminCustomize', { path: '/customize', resetNamespace: true } ,function() { this.route('colors'); - this.resource('adminCustomizeCssHtml', { path: 'css_html' }, function() { + this.route('adminCustomizeCssHtml', { path: 'css_html', resetNamespace: true }, function() { this.route('show', {path: '/:site_customization_id/:section'}); }); - this.resource('adminSiteText', { path: '/site_texts' }, function() { + this.route('adminSiteText', { path: '/site_texts', resetNamespace: true }, function() { this.route('edit', { path: '/:id' }); }); - this.resource('adminUserFields', { path: '/user_fields' }); - this.resource('adminEmojis', { path: '/emojis' }); - this.resource('adminPermalinks', { path: '/permalinks' }); - this.resource('adminEmbedding', { path: '/embedding' }); - this.resource('adminCustomizeEmailTemplates', { path: '/email_templates' }, function() { + this.route('adminUserFields', { path: '/user_fields', resetNamespace: true }); + this.route('adminEmojis', { path: '/emojis', resetNamespace: true }); + this.route('adminPermalinks', { path: '/permalinks', resetNamespace: true }); + this.route('adminEmbedding', { path: '/embedding', resetNamespace: true }); + this.route('adminCustomizeEmailTemplates', { path: '/email_templates', resetNamespace: true }, function() { this.route('edit', { path: '/:id' }); }); }); - this.route('api'); - this.resource('admin.backups', { path: '/backups' }, function() { + this.route('adminApi', { path: '/api', resetNamespace: true }, function() { + this.route('adminApiKeys', { path: '/keys', resetNamespace: true }); + + this.route('adminWebHooks', { path: '/web_hooks', resetNamespace: true }, function() { + this.route('show', { path: '/:web_hook_id' }); + this.route('showEvents', { path: '/:web_hook_id/events' }); + }); + }); + + this.route('admin.backups', { path: '/backups', resetNamespace: true }, function() { this.route('logs'); }); - this.resource('adminReports', { path: '/reports/:type' }); + this.route('adminReports', { path: '/reports/:type', resetNamespace: true }); - this.resource('adminFlags', { path: '/flags' }, function() { + this.route('adminFlags', { path: '/flags', resetNamespace: true }, function() { this.route('list', { path: '/:filter' }); }); - this.resource('adminLogs', { path: '/logs' }, function() { + this.route('adminLogs', { path: '/logs', resetNamespace: true }, function() { this.route('staffActionLogs', { path: '/staff_action_logs' }); this.route('screenedEmails', { path: '/screened_emails' }); this.route('screenedIpAddresses', { path: '/screened_ip_addresses' }); this.route('screenedUrls', { path: '/screened_urls' }); }); - this.resource('adminGroups', { path: '/groups' }, function() { + this.route('adminGroups', { path: '/groups', resetNamespace: true }, function() { this.route('bulk'); this.route('bulkComplete', { path: 'bulk-complete' }); - this.resource('adminGroupsType', { path: '/:type' }, function() { - this.resource('adminGroup', { path: '/:name' }); + this.route('adminGroupsType', { path: '/:type', resetNamespace: true }, function() { + this.route('adminGroup', { path: '/:name', resetNamespace: true }); }); }); - this.resource('adminUsers', { path: '/users' }, function() { - this.resource('adminUser', { path: '/:user_id/:username' }, function() { + this.route('adminUsers', { path: '/users', resetNamespace: true }, function() { + this.route('adminUser', { path: '/:user_id/:username', resetNamespace: true }, function() { this.route('badges'); this.route('tl3Requirements', { path: '/tl3_requirements' }); }); - this.resource('adminUsersList', { path: '/list' }, function() { + this.route('adminUsersList', { path: '/list', resetNamespace: true }, function() { this.route('show', { path: '/:filter' }); }); }); - this.resource('adminBadges', { path: '/badges' }, function() { + this.route('adminBadges', { path: '/badges', resetNamespace: true }, function() { this.route('show', { path: '/:badge_id' }); }); - } + + this.route('adminPlugins', { path: '/plugins', resetNamespace: true }, function() { + this.route('index', { path: '/' }); + }); + }); }; diff --git a/app/assets/javascripts/admin/routes/admin-user-index.js.es6 b/app/assets/javascripts/admin/routes/admin-user-index.js.es6 index 5a3afa10caa..c10e5957d5a 100644 --- a/app/assets/javascripts/admin/routes/admin-user-index.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-user-index.js.es6 @@ -26,7 +26,7 @@ export default Discourse.Route.extend({ actions: { showSuspendModal(model) { - showModal('modals/admin-suspend-user', { model }); + showModal('admin-suspend-user', { model, admin: true }); this.controllerFor('modal').set('modalClass', 'suspend-user-modal'); } } diff --git a/app/assets/javascripts/admin/routes/admin-web-hooks-show-events.js.es6 b/app/assets/javascripts/admin/routes/admin-web-hooks-show-events.js.es6 new file mode 100644 index 00000000000..c9700db463c --- /dev/null +++ b/app/assets/javascripts/admin/routes/admin-web-hooks-show-events.js.es6 @@ -0,0 +1,18 @@ +export default Discourse.Route.extend({ + model(params) { + return this.store.findAll('web-hook-event', Ember.get(params, 'web_hook_id')); + }, + + setupController(controller, model) { + controller.set('model', model); + controller.subscribe(); + }, + + deactivate() { + this.controllerFor('adminWebHooks.showEvents').unsubscribe(); + }, + + renderTemplate() { + this.render('admin/templates/web-hooks-show-events', { into: 'adminApi' }); + } +}); diff --git a/app/assets/javascripts/admin/routes/admin-web-hooks-show.js.es6 b/app/assets/javascripts/admin/routes/admin-web-hooks-show.js.es6 new file mode 100644 index 00000000000..51b7d55d47c --- /dev/null +++ b/app/assets/javascripts/admin/routes/admin-web-hooks-show.js.es6 @@ -0,0 +1,26 @@ +export default Discourse.Route.extend({ + serialize(model) { + return { web_hook_id: model.get('id') || 'new' }; + }, + + model(params) { + if (params.web_hook_id === 'new') { + return this.store.createRecord('web-hook'); + } + return this.store.find('web-hook', Ember.get(params, 'web_hook_id')); + }, + + setupController(controller, model) { + if (model.get('isNew') || Ember.isEmpty(model.get('web_hook_event_types'))) { + model.set('web_hook_event_types', controller.get('defaultEventTypes')); + } + + model.set('category_ids', model.get('category_ids')); + model.set('group_ids', model.get('group_ids')); + controller.setProperties({ model, saved: false }); + }, + + renderTemplate() { + this.render('admin/templates/web-hooks-show', { into: 'adminApi' }); + } +}); diff --git a/app/assets/javascripts/admin/routes/admin-web-hooks.js.es6 b/app/assets/javascripts/admin/routes/admin-web-hooks.js.es6 new file mode 100644 index 00000000000..69d7b4bd202 --- /dev/null +++ b/app/assets/javascripts/admin/routes/admin-web-hooks.js.es6 @@ -0,0 +1,15 @@ +export default Ember.Route.extend({ + model() { + return this.store.findAll('web-hook'); + }, + + setupController(controller, model) { + controller.setProperties({ + model, + eventTypes: model.extras.event_types, + defaultEventTypes: model.extras.default_event_types, + contentTypes: model.extras.content_types, + deliveryStatuses: model.extras.delivery_statuses + }); + } +}); diff --git a/app/assets/javascripts/admin/templates/admin.hbs b/app/assets/javascripts/admin/templates/admin.hbs index 13afd577f77..7f34c00b772 100644 --- a/app/assets/javascripts/admin/templates/admin.hbs +++ b/app/assets/javascripts/admin/templates/admin.hbs @@ -1,4 +1,4 @@ -+{{#disable-custom-stylesheets class="container"}}+{{/disable-custom-stylesheets}} diff --git a/app/assets/javascripts/admin/templates/api-keys.hbs b/app/assets/javascripts/admin/templates/api-keys.hbs new file mode 100644 index 00000000000..60449052bb9 --- /dev/null +++ b/app/assets/javascripts/admin/templates/api-keys.hbs @@ -0,0 +1,33 @@ +{{#if model}} +@@ -19,11 +19,11 @@ {{nav-item route='adminLogs' label='admin.logs.title'}} {{#if currentUser.admin}} {{nav-item route='adminCustomize' label='admin.customize.title'}} - {{nav-item route='admin.api' label='admin.api.title'}} + {{nav-item route='adminApi' label='admin.api.title'}} {{nav-item route='admin.backups' label='admin.backups.title'}} {{/if}} {{nav-item route='adminPlugins' label='admin.plugins.title'}} - {{plugin-outlet "admin-menu" tagName="li"}} + {{plugin-outlet name="admin-menu" connectorTagName="li"}}-@@ -34,4 +34,4 @@+
+{{else}} ++ + {{#each model as |k|}} +{{i18n 'admin.api.key'}} +{{i18n 'admin.api.user'}} ++ + + {{/each}} +{{k.key}} ++ {{#if k.user}} + {{#link-to 'adminUser' k.user}} + {{avatar k.user imageSize="small"}} + {{/link-to}} + {{else}} + {{i18n 'admin.api.all_users'}} + {{/if}} + ++ {{d-button action="regenerateKey" actionParam=k icon="undo" label='admin.api.regenerate'}} + {{d-button action="revokeKey" actionParam=k icon="times" label='admin.api.revoke'}} + +{{i18n 'admin.api.none'}}
+{{/if}} + +{{#unless hasMasterKey}} + +{{/unless}} diff --git a/app/assets/javascripts/admin/templates/api.hbs b/app/assets/javascripts/admin/templates/api.hbs index 0f2e65b89c3..f3407fe0ccf 100644 --- a/app/assets/javascripts/admin/templates/api.hbs +++ b/app/assets/javascripts/admin/templates/api.hbs @@ -1,33 +1,10 @@ -{{#if model}} --
-{{else}} -- - {{#each model as |k|}} -{{i18n 'admin.api.key'}} -{{i18n 'admin.api.user'}} -- - - {{/each}} -{{k.key}} -- {{#if k.user}} - {{#link-to 'adminUser' k.user}} - {{avatar k.user imageSize="small"}} - {{/link-to}} - {{else}} - {{i18n 'admin.api.all_users'}} - {{/if}} - -- - - -{{i18n 'admin.api.none'}}
-{{/if}} ++ {{#admin-nav}} + {{nav-item route='adminApiKeys' label='admin.api.title'}} + {{nav-item route='adminWebHooks' label='admin.web_hooks.title'}} + {{/admin-nav}} -{{#unless hasMasterKey}} - -{{/unless }} +diff --git a/app/assets/javascripts/admin/templates/backups_index.hbs b/app/assets/javascripts/admin/templates/backups-index.hbs similarity index 62% rename from app/assets/javascripts/admin/templates/backups_index.hbs rename to app/assets/javascripts/admin/templates/backups-index.hbs index c7323ebea02..a8220a4e1ac 100644 --- a/app/assets/javascripts/admin/templates/backups_index.hbs +++ b/app/assets/javascripts/admin/templates/backups-index.hbs @@ -6,9 +6,9 @@+ {{outlet}} ++{{resumable-upload target="/admin/backups/upload" success="uploadSuccess" error="uploadError" uploadText=uploadLabel title="admin.backups.upload.title"}} {{#if site.isReadOnly}} - {{d-button icon="eye" action="toggleReadOnlyMode" disabled=status.model.isOperationRunning title="admin.backups.read_only.disable.title" label="admin.backups.read_only.disable.label"}} + {{d-button icon="eye" action="toggleReadOnlyMode" disabled=status.isOperationRunning title="admin.backups.read_only.disable.title" label="admin.backups.read_only.disable.label"}} {{else}} - {{d-button icon="eye" action="toggleReadOnlyMode" disabled=status.model.isOperationRunning title="admin.backups.read_only.enable.title" label="admin.backups.read_only.enable.label"}} + {{d-button icon="eye" action="toggleReadOnlyMode" disabled=status.isOperationRunning title="admin.backups.read_only.enable.title" label="admin.backups.read_only.enable.label"}} {{/if}}@@ -19,13 +19,18 @@{{human-size backup.size}} diff --git a/app/assets/javascripts/admin/templates/backups-logs.hbs b/app/assets/javascripts/admin/templates/backups-logs.hbs new file mode 100644 index 00000000000..34ec15f84a7 --- /dev/null +++ b/app/assets/javascripts/admin/templates/backups-logs.hbs @@ -0,0 +1 @@ +{{admin-backups-logs logs=logs status=status}} diff --git a/app/assets/javascripts/admin/templates/backups.hbs b/app/assets/javascripts/admin/templates/backups.hbs index 7562754c08c..ea8bc189873 100644 --- a/app/assets/javascripts/admin/templates/backups.hbs +++ b/app/assets/javascripts/admin/templates/backups.hbs @@ -1,35 +1,37 @@ - - {{fa-icon "download"}}{{i18n 'admin.backups.operations.download.label'}} - {{#if status.model.isOperationRunning}} + {{d-button class="download" + action="download" + actionParam=backup + icon="download" + title="admin.backups.operations.download.title" + label="admin.backups.operations.download.label"}} + {{#if status.isOperationRunning}} {{d-button icon="trash-o" action="destroyBackup" actionParam=backup class="btn-danger" disabled="true" title="admin.backups.operations.is_running"}} - {{d-button icon="play" action="startRestore" actionParam=backup disabled=status.model.restoreDisabled title=restoreTitle label="admin.backups.operations.restore.label"}} + {{d-button icon="play" action="startRestore" actionParam=backup disabled=status.restoreDisabled title=restoreTitle label="admin.backups.operations.restore.label"}} {{else}} {{d-button icon="trash-o" action="destroyBackup" actionParam=backup class="btn-danger" title="admin.backups.operations.destroy.title"}} - {{d-button icon="play" action="startRestore" actionParam=backup disabled=status.model.restoreDisabled title=restoreTitle label="admin.backups.operations.restore.label"}} + {{d-button icon="play" action="startRestore" actionParam=backup disabled=status.restoreDisabled title=restoreTitle label="admin.backups.operations.restore.label"}} {{/if}}--++-+-++ ++ {{#if model.canRollback}} + {{d-button action="rollback" + class="btn-rollback" + label="admin.backups.operations.rollback.label" + title="admin.backups.operations.rollback.title" + icon="ambulance" + disabled=rollbackDisabled}} + {{/if}} + {{#if model.isOperationRunning}} + {{d-button action="cancelOperation" + class="btn-danger" + title="admin.backups.operations.cancel.title" + label="admin.backups.operations.cancel.label" + icon="times"}} + {{else}} + {{d-button action="startBackup" + class="btn-primary" + title="admin.backups.operations.backup.title" + label="admin.backups.operations.backup.label" + icon="rocket"}} + {{/if}} +- {{#if model.canRollback}} - {{d-button action="rollback" - class="btn-rollback" - label="admin.backups.operations.rollback.label" - title="admin.backups.operations.rollback.title" - icon="ambulance" - disabled=rollbackDisabled}} - {{/if}} - {{#if model.isOperationRunning}} - {{d-button action="cancelOperation" - class="btn-danger" - title="admin.backups.operations.cancel.title" - label="admin.backups.operations.cancel.label" - icon="times"}} - {{else}} - {{d-button action="startBackup" - class="btn-primary" - title="admin.backups.operations.backup.title" - label="admin.backups.operations.backup.label" - icon="rocket"}} - {{/if}} --- {{outlet}} +diff --git a/app/assets/javascripts/admin/templates/badges-index.hbs b/app/assets/javascripts/admin/templates/badges-index.hbs index 6ee80748f81..c94f59fe105 100644 --- a/app/assets/javascripts/admin/templates/badges-index.hbs +++ b/app/assets/javascripts/admin/templates/badges-index.hbs @@ -1,4 +1,4 @@ -+ {{outlet}} ++{{#d-section class="current-badge span13"}}+{{/d-section}} diff --git a/app/assets/javascripts/admin/templates/badges-show.hbs b/app/assets/javascripts/admin/templates/badges-show.hbs index f29829eba55..e0ae7001df0 100644 --- a/app/assets/javascripts/admin/templates/badges-show.hbs +++ b/app/assets/javascripts/admin/templates/badges-show.hbs @@ -1,4 +1,4 @@ -{{i18n 'admin.badges.none_selected'}}
@@ -6,4 +6,4 @@ {{fa-icon "plus"}} {{i18n 'admin.badges.new'}} {{/link-to}}-+{{#d-section class="current-badge span13"}} -+{{/d-section}} {{#if grant_count}}diff --git a/app/assets/javascripts/admin/templates/components/ace-editor.hbs b/app/assets/javascripts/admin/templates/components/ace-editor.hbs new file mode 100644 index 00000000000..c837b2b34ee --- /dev/null +++ b/app/assets/javascripts/admin/templates/components/ace-editor.hbs @@ -0,0 +1 @@ +{{content}}diff --git a/app/assets/javascripts/admin/templates/components/admin-web-hook-event-chooser.hbs b/app/assets/javascripts/admin/templates/components/admin-web-hook-event-chooser.hbs new file mode 100644 index 00000000000..0ecb553d38e --- /dev/null +++ b/app/assets/javascripts/admin/templates/components/admin-web-hook-event-chooser.hbs @@ -0,0 +1,3 @@ +{{input id=typeName type="checkbox" name="event-choice" checked=enabled}} + +{{details}}
diff --git a/app/assets/javascripts/admin/templates/components/admin-web-hook-event.hbs b/app/assets/javascripts/admin/templates/components/admin-web-hook-event.hbs new file mode 100644 index 00000000000..026b6daae27 --- /dev/null +++ b/app/assets/javascripts/admin/templates/components/admin-web-hook-event.hbs @@ -0,0 +1,19 @@ ++ {{model.status}} ++{{model.id}}+ +{{completion}}++ {{d-button icon='ellipsis-v' action='toggleRequest' label='admin.web_hooks.events.request'}} + {{d-button icon='ellipsis-v' action='toggleResponse' label='admin.web_hooks.events.response'}} + {{d-button icon='refresh' action='redeliver' label='admin.web_hooks.events.redeliver'}} ++{{#if expandDetails}} +++{{/if}} diff --git a/app/assets/javascripts/admin/templates/components/embeddable-host.hbs b/app/assets/javascripts/admin/templates/components/embeddable-host.hbs index c35d40e1d6e..5f2581138f5 100644 --- a/app/assets/javascripts/admin/templates/components/embeddable-host.hbs +++ b/app/assets/javascripts/admin/templates/components/embeddable-host.hbs @@ -2,6 +2,9 @@{{i18n 'admin.web_hooks.events.headers'}}
++{{headers}}
{{bodyLabel}}
++{{body}}
{{input value=buffered.host placeholder="example.com" enter="save" class="host-name"}} ++ {{input value=buffered.path_whitelist placeholder="/blog/.*" enter="save" class="path-whitelist"}} + {{category-chooser value=categoryId}} @@ -11,6 +14,7 @@ {{else}}{{host.host}} +{{host.path_whitelist}} {{category-badge host.category}} {{d-button icon="pencil" action="edit"}} diff --git a/app/assets/javascripts/admin/templates/components/permalink-form.hbs b/app/assets/javascripts/admin/templates/components/permalink-form.hbs index 987a1bc9185..c7942543316 100644 --- a/app/assets/javascripts/admin/templates/components/permalink-form.hbs +++ b/app/assets/javascripts/admin/templates/components/permalink-form.hbs @@ -2,4 +2,4 @@ {{text-field value=url disabled=formSubmitted class="permalink-url" placeholderKey="admin.permalink.url" autocorrect="off" autocapitalize="off"}} {{combo-box content=permalinkTypes value=permalinkType}} {{text-field value=permalink_type_value disabled=formSubmitted class="external-url" placeholderKey=permalinkTypePlaceholder autocorrect="off" autocapitalize="off"}} - +{{d-button action="submit" disabled=formSubmitted label="admin.permalink.form.add"}} diff --git a/app/assets/javascripts/admin/templates/components/permalinks-list.hbs b/app/assets/javascripts/admin/templates/components/permalinks-list.hbs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/assets/javascripts/admin/templates/components/site-customization-change-details.hbs b/app/assets/javascripts/admin/templates/components/site-customization-change-details.hbs new file mode 100644 index 00000000000..a9ea9cea094 --- /dev/null +++ b/app/assets/javascripts/admin/templates/components/site-customization-change-details.hbs @@ -0,0 +1,18 @@ + + {{i18n 'admin.customize.enabled'}}: {{change.enabled}} + + +{{site-customization-change-field field=change.stylesheet name="admin.customize.css"}} +{{site-customization-change-field icon="mobile" field=change.mobile_stylesheet name="admin.customize.css"}} + +{{site-customization-change-field field=change.header name="admin.customize.header"}} +{{site-customization-change-field icon="mobile" field=change.mobile_header name="admin.customize.header"}} + +{{site-customization-change-field field=change.top name="admin.customize.top"}} +{{site-customization-change-field icon="mobile" field=change.mobile_top name="admin.customize.top"}} + +{{site-customization-change-field field=change.footer name="admin.customize.footer"}} +{{site-customization-change-field icon="mobile" field=change.mobile_footer name="admin.customize.footer"}} + +{{site-customization-change-field icon="file-text-o" field=change.head_tag name="admin.customize.head_tag.text"}} +{{site-customization-change-field icon="file-text-o" field=change.body_tag name="admin.customize.body_tag.text"}} diff --git a/app/assets/javascripts/admin/templates/components/site-customization-change-field.hbs b/app/assets/javascripts/admin/templates/components/site-customization-change-field.hbs new file mode 100644 index 00000000000..43aea18163f --- /dev/null +++ b/app/assets/javascripts/admin/templates/components/site-customization-change-field.hbs @@ -0,0 +1,7 @@ +{{#if field}} ++ {{i18n name}}: ({{i18n 'character_count' count=field.length}}) + +{{/if}} diff --git a/app/assets/javascripts/admin/templates/components/site-settings/category-list.hbs b/app/assets/javascripts/admin/templates/components/site-settings/category-list.hbs index 621f3fa70e7..8c0b4eda1e9 100644 --- a/app/assets/javascripts/admin/templates/components/site-settings/category-list.hbs +++ b/app/assets/javascripts/admin/templates/components/site-settings/category-list.hbs @@ -1,3 +1,3 @@ -{{category-group categories=selectedCategories blacklist=selectedCategories}} +{{category-selector categories=selectedCategories blacklist=selectedCategories}}
+ {{textarea value=field class="plain"}} +{{{unbound setting.description}}}{{setting-validation-message message=validationMessage}} diff --git a/app/assets/javascripts/admin/templates/customize_colors.hbs b/app/assets/javascripts/admin/templates/customize-colors.hbs similarity index 100% rename from app/assets/javascripts/admin/templates/customize_colors.hbs rename to app/assets/javascripts/admin/templates/customize-colors.hbs diff --git a/app/assets/javascripts/admin/templates/dashboard.hbs b/app/assets/javascripts/admin/templates/dashboard.hbs index e02a5a925ca..ec7753ac6c9 100644 --- a/app/assets/javascripts/admin/templates/dashboard.hbs +++ b/app/assets/javascripts/admin/templates/dashboard.hbs @@ -1,4 +1,4 @@ -{{plugin-outlet "admin-dashboard-top"}} +{{plugin-outlet name="admin-dashboard-top"}} {{#conditional-loading-spinner condition=loading}}diff --git a/app/assets/javascripts/admin/templates/email_index.hbs b/app/assets/javascripts/admin/templates/email-index.hbs similarity index 100% rename from app/assets/javascripts/admin/templates/email_index.hbs rename to app/assets/javascripts/admin/templates/email-index.hbs diff --git a/app/assets/javascripts/admin/templates/email_preview_digest.hbs b/app/assets/javascripts/admin/templates/email-preview-digest.hbs similarity index 50% rename from app/assets/javascripts/admin/templates/email_preview_digest.hbs rename to app/assets/javascripts/admin/templates/email-preview-digest.hbs index 7bd2a4455f1..80f48717b02 100644 --- a/app/assets/javascripts/admin/templates/email_preview_digest.hbs +++ b/app/assets/javascripts/admin/templates/email-preview-digest.hbs @@ -19,9 +19,36 @@{{#conditional-loading-spinner condition=loading}} - {{#if showHtml}} - {{{model.html_content}}} - {{else}} -{{{model.text_content}}}+ ++ {{#if showSendEmailForm}} ++ {{/conditional-loading-spinner}} diff --git a/app/assets/javascripts/admin/templates/embedding.hbs b/app/assets/javascripts/admin/templates/embedding.hbs index 6fbe31c124c..5db5cb6bfa8 100644 --- a/app/assets/javascripts/admin/templates/embedding.hbs +++ b/app/assets/javascripts/admin/templates/embedding.hbs @@ -2,9 +2,10 @@ {{#if embedding.embeddable_hosts}}
++ {{#if sendingEmail}} + {{i18n 'admin.email.sending_test'}} + {{else}} + + {{text-field value=email placeholderKey="admin.email.test_email_address"}} + + {{#if sentEmail}} ++ + {{/if}} + {{/if}} +
{{/if}} + ++ {{#if showHtml}} + {{#if htmlEmpty}} ++{{i18n 'admin.email.no_result'}}
+ {{else}} + + {{/if}} + {{else}} +{{{model.text_content}}}+ {{/if}} +
- {{#each embedding.embeddable_hosts as |host|}} {{embeddable-host host=host deleteHost="deleteHost"}} @@ -30,6 +31,9 @@ {{embedding-setting field="embed_by_username" value=embedding.embed_by_username}} {{embedding-setting field="embed_post_limit" value=embedding.embed_post_limit}} + {{embedding-setting field="embed_title_scrubber" + value=embedding.embed_title_scrubber + placeholder="- site.com$"}} {{embedding-setting field="embed_truncate" value=embedding.embed_truncate type="checkbox"}} diff --git a/app/assets/javascripts/admin/templates/emojis.hbs b/app/assets/javascripts/admin/templates/emojis.hbs index ca6fd742d4c..6f35c097a96 100644 --- a/app/assets/javascripts/admin/templates/emojis.hbs +++ b/app/assets/javascripts/admin/templates/emojis.hbs @@ -5,7 +5,7 @@{{i18n "admin.embedding.host"}} +{{i18n "admin.embedding.host"}} +{{i18n "admin.embedding.path_whitelist"}} {{i18n "admin.embedding.category"}} -+ {{emoji-uploader done="emojiUploaded"}}
- {{#if model}} + {{#if sortedEmojis}}@@ -16,9 +16,9 @@ - {{#each model as |e|}} + {{#each sortedEmojis as |e|}}
- diff --git a/app/assets/javascripts/admin/templates/group.hbs b/app/assets/javascripts/admin/templates/group.hbs index 2c2a1929a34..095b3f5f4b8 100644 --- a/app/assets/javascripts/admin/templates/group.hbs +++ b/app/assets/javascripts/admin/templates/group.hbs @@ -4,13 +4,23 @@ {{#if model.automatic}}+ :{{e.name}}: {{model.name}}
{{else}} - - {{text-field name="name" value=model.name placeholderKey="admin.groups.name_placeholder"}} + + {{text-field name="name" value=model.name placeholderKey="groups.name_placeholder"}} {{/if}} {{#if model.id}} {{#unless model.automatic}} ++ + {{input type='text' name='full_name' value=model.full_name class='group-edit-full-name'}} ++ ++ + {{d-editor value=model.bio_raw}} ++ {{#if model.hasOwners}}@@ -28,26 +38,8 @@{{/unless}}- -- - {{#unless model.automatic}} -- {{fa-icon "fast-backward"}} - {{currentPage}}/{{totalPages}} - {{fa-icon "fast-forward"}} --- {{#each model.members as |member|}} - {{group-member member=member automatic=model.automatic removeAction="removeMember"}} - {{/each}} -+ {{group-members-input model=model}}- - {{user-selector usernames=model.usernames placeholderKey="admin.groups.selector_placeholder" id="user-selector"}} - {{d-button action="addMembers" class="add" icon="plus" label="admin.groups.add"}} -- {{/unless}} {{/if}}@@ -58,12 +50,32 @@{{#unless model.automatic}} -- -++ ++ ++ ++ ++ +{{/unless}}@@ -94,13 +106,16 @@{{#if siteSettings.email_in}} - {{#plugin-outlet "group-email-in"}} {{text-field name="incoming_email" value=model.incoming_email placeholderKey="admin.groups.incoming_email_placeholder"}} - {{/plugin-outlet}} + {{plugin-outlet name="group-email-in" args=(hash model=model)}} {{/if}} {{/unless}} + {{#unless model.automatic}} + {{group-flair-inputs model=model}} + {{/unless}} + {{else}} diff --git a/app/assets/javascripts/admin/templates/logs/screened-ip-addresses.hbs b/app/assets/javascripts/admin/templates/logs/screened-ip-addresses.hbs new file mode 100644 index 00000000000..ca6c216f502 --- /dev/null +++ b/app/assets/javascripts/admin/templates/logs/screened-ip-addresses.hbs @@ -0,0 +1,79 @@ +{{i18n 'admin.logs.screened_ips.description'}}
+ ++ {{text-field value=filter class="ip-address-input" placeholderKey="admin.logs.screened_ips.form.filter" autocorrect="off" autocapitalize="off"}} + {{d-button action="rollUp" title="admin.logs.screened_ips.roll_up.title" label="admin.logs.screened_ips.roll_up.text"}} + {{d-button action="exportScreenedIpList" icon="download" title="admin.export_csv.button_title.screened_ip" label="admin.export_csv.button_text"}} ++ ++ {{screened-ip-address-form action="recordAdded"}} ++ +{{#conditional-loading-spinner condition=loading}} + {{#if model.length}} + +++ + {{else}} + {{i18n 'search.no_results'}} + {{/if}} +{{/conditional-loading-spinner}} diff --git a/app/assets/javascripts/admin/templates/logs/screened_urls.hbs b/app/assets/javascripts/admin/templates/logs/screened-urls.hbs similarity index 63% rename from app/assets/javascripts/admin/templates/logs/screened_urls.hbs rename to app/assets/javascripts/admin/templates/logs/screened-urls.hbs index 68071cb32d6..40aaceba70d 100644 --- a/app/assets/javascripts/admin/templates/logs/screened_urls.hbs +++ b/app/assets/javascripts/admin/templates/logs/screened-urls.hbs @@ -16,7 +16,18 @@ - {{screened-urls-list content=model}} + {{#each model as |url|}} +++ + {{#each model as |item|}} +{{i18n 'admin.logs.ip_address'}}+{{i18n 'admin.logs.action'}}+{{i18n 'admin.logs.match_count'}}+{{i18n 'admin.logs.last_match_at'}}+{{i18n 'admin.logs.created_at'}}+ + +++ {{/each}} ++ {{#if item.editing}} + {{text-field value=item.ip_address autofocus="autofocus"}} + {{else}} + + {{#if item.isRange}} + {{item.ip_address}} + {{else}} + {{item.ip_address}} + {{/if}} + + {{/if}} +++ {{#if item.isBlocked}} + {{fa-icon "ban"}} + {{else}} + {{fa-icon "check"}} + {{/if}} + {{item.actionName}} ++{{item.match_count}}++ {{#if item.last_match_at}} + {{age-with-tooltip item.last_match_at}} + {{/if}} ++{{age-with-tooltip item.created_at}}++ {{#unless item.editing}} + {{d-button action="destroy" actionParam=item icon="trash-o" class="btn-danger"}} + {{d-button action="edit" actionParam=item icon="pencil"}} + {{#if isBlocked}} + {{d-button action="allow" actionParam=item icon="check" label="admin.logs.screened_ips.actions.do_nothing"}} + {{else}} + {{d-button action="block" actionParam=item icon="ban" label="admin.logs.screened_ips.actions.block"}} + {{/if}} + {{else}} + {{d-button action="save" actionParam=item label="admin.logs.save"}} + {{i18n 'cancel'}} + {{/unless}} ++ +++ {{/each}} {{else}} {{i18n 'search.no_results'}} diff --git a/app/assets/javascripts/admin/templates/logs/screened_emails_list_item.hbs b/app/assets/javascripts/admin/templates/logs/screened_emails_list_item.hbs deleted file mode 100644 index 27cbf419854..00000000000 --- a/app/assets/javascripts/admin/templates/logs/screened_emails_list_item.hbs +++ /dev/null @@ -1,10 +0,0 @@ -++{{url.domain}}+{{url.actionName}}+{{url.match_count}}+{{age-with-tooltip url.last_match_at}}+{{age-with-tooltip url.created_at}}+ +--{{email}}-{{actionName}}-{{match_count}}-{{age-with-tooltip last_match_at}}-{{age-with-tooltip created_at}}-{{ip_address}}- - diff --git a/app/assets/javascripts/admin/templates/logs/screened_ip_addresses.hbs b/app/assets/javascripts/admin/templates/logs/screened_ip_addresses.hbs deleted file mode 100644 index 82e4f888889..00000000000 --- a/app/assets/javascripts/admin/templates/logs/screened_ip_addresses.hbs +++ /dev/null @@ -1,33 +0,0 @@ -{{i18n 'admin.logs.screened_ips.description'}}
- -- {{text-field value=filter class="ip-address-input" placeholderKey="admin.logs.screened_ips.form.filter" autocorrect="off" autocapitalize="off"}} - {{d-button action="rollUp" title="admin.logs.screened_ips.roll_up.title" label="admin.logs.screened_ips.roll_up.text"}} - {{d-button action="exportScreenedIpList" icon="download" title="admin.export_csv.button_title.screened_ip" label="admin.export_csv.button_text"}} -- -- {{screened-ip-address-form action="recordAdded"}} -- -{{#conditional-loading-spinner condition=loading}} - {{#if model.length}} - --- - {{else}} - {{i18n 'search.no_results'}} - {{/if}} -{{/conditional-loading-spinner}} diff --git a/app/assets/javascripts/admin/templates/logs/screened_ip_addresses_list_item.hbs b/app/assets/javascripts/admin/templates/logs/screened_ip_addresses_list_item.hbs deleted file mode 100644 index 056b86f9e59..00000000000 --- a/app/assets/javascripts/admin/templates/logs/screened_ip_addresses_list_item.hbs +++ /dev/null @@ -1,43 +0,0 @@ --- - {{screened-ip-addresses-list content=model}} -{{i18n 'admin.logs.ip_address'}}-{{i18n 'admin.logs.action'}}-{{i18n 'admin.logs.match_count'}}-{{i18n 'admin.logs.last_match_at'}}-{{i18n 'admin.logs.created_at'}}- - -- {{#if editing}} - {{text-field value=ip_address autofocus="autofocus"}} - {{else}} - - {{#if isRange}} - {{ip_address}} - {{else}} - {{ip_address}} - {{/if}} - - {{/if}} --- {{#if isBlocked}} - {{fa-icon "ban"}} - {{else}} - {{fa-icon "check"}} - {{/if}} - {{actionName}} --{{match_count}}-- {{#if last_match_at}} - {{age-with-tooltip last_match_at}} - {{/if}} --{{age-with-tooltip created_at}}-- {{#unless editing}} - {{d-button action="destroy" actionParam=this icon="trash-o" class="btn-danger"}} - {{d-button action="edit" actionParam=this icon="pencil"}} - {{#if isBlocked}} - {{d-button action="allow" actionParam=this icon="check" label="admin.logs.screened_ips.actions.do_nothing"}} - {{else}} - {{d-button action="block" actionParam=this icon="ban" label="admin.logs.screened_ips.actions.block"}} - {{/if}} - {{else}} - {{d-button action="save" actionParam=this label="admin.logs.save"}} - {{i18n 'cancel'}} - {{/unless}} -- diff --git a/app/assets/javascripts/admin/templates/logs/screened_urls_list_item.hbs b/app/assets/javascripts/admin/templates/logs/screened_urls_list_item.hbs deleted file mode 100644 index 234f2481296..00000000000 --- a/app/assets/javascripts/admin/templates/logs/screened_urls_list_item.hbs +++ /dev/null @@ -1,8 +0,0 @@ ---{{domain}}-{{actionName}}-{{match_count}}-{{age-with-tooltip last_match_at}}-{{age-with-tooltip created_at}}- diff --git a/app/assets/javascripts/admin/templates/logs/staff_action_logs.hbs b/app/assets/javascripts/admin/templates/logs/staff-action-logs.hbs similarity index 57% rename from app/assets/javascripts/admin/templates/logs/staff_action_logs.hbs rename to app/assets/javascripts/admin/templates/logs/staff-action-logs.hbs index 4b2654eadd9..18a622f958a 100644 --- a/app/assets/javascripts/admin/templates/logs/staff_action_logs.hbs +++ b/app/assets/javascripts/admin/templates/logs/staff-action-logs.hbs @@ -49,10 +49,39 @@ {{#conditional-loading-spinner condition=loading}} - {{#if model.length}} - {{staff-action-logs-list content=model}} + {{#each model as |item|}} ++{{else}} {{i18n 'search.no_results'}} - {{/if}} + {{/each}} {{/conditional-loading-spinner}} diff --git a/app/assets/javascripts/admin/templates/logs/staff_action_logs_list_item.hbs b/app/assets/javascripts/admin/templates/logs/staff_action_logs_list_item.hbs deleted file mode 100644 index 266c1be7eb8..00000000000 --- a/app/assets/javascripts/admin/templates/logs/staff_action_logs_list_item.hbs +++ /dev/null @@ -1,28 +0,0 @@ -+ {{#link-to 'adminUser' item.acting_user}}{{avatar item.acting_user imageSize="tiny"}}{{/link-to}} + {{item.acting_user.username}} ++ ++ {{#if item.target_user}} + {{#link-to 'adminUser' item.target_user}}{{avatar item.target_user imageSize="tiny"}}{{/link-to}} + {{item.target_user.username}} + {{/if}} + {{#if item.subject}} + {{item.subject}} + {{/if}} ++{{age-with-tooltip item.created_at}}++ {{{item.formattedDetails}}} + {{#if item.useCustomModalForDetails}} + {{i18n 'admin.logs.staff_actions.show'}} + {{/if}} + {{#if item.useModalForDetails}} + {{i18n 'admin.logs.staff_actions.show'}} + {{/if}} ++{{item.context}}+ +- {{#link-to 'adminUser' acting_user}}{{avatar acting_user imageSize="tiny"}}{{/link-to}} - {{acting_user.username}} --- {{actionName}} --- {{#if target_user}} - {{#link-to 'adminUser' target_user}}{{avatar target_user imageSize="tiny"}}{{/link-to}} - {{target_user.username}} - {{/if}} - {{#if subject}} - {{subject}} - {{/if}} --{{age-with-tooltip created_at}}-- {{{formattedDetails}}} - {{#if useCustomModalForDetails}} - {{i18n 'admin.logs.staff_actions.show'}} - {{/if}} - {{#if useModalForDetails}} - {{i18n 'admin.logs.staff_actions.show'}} - {{/if}} --{{context}}- diff --git a/app/assets/javascripts/admin/templates/modal/admin-agree-flag.hbs b/app/assets/javascripts/admin/templates/modal/admin-agree-flag.hbs new file mode 100644 index 00000000000..6f845b22c80 --- /dev/null +++ b/app/assets/javascripts/admin/templates/modal/admin-agree-flag.hbs @@ -0,0 +1,13 @@ +{{#d-modal-body title="admin.flags.agree_flag_modal_title"}} + {{#if model.user_deleted}} + + {{else}} + {{#unless model.postHidden}} + + {{/unless}} + {{/if}} + + {{#if model.canDeleteAsSpammer}} + + {{/if}} +{{/d-modal-body}} diff --git a/app/assets/javascripts/admin/templates/modal/admin_badge_preview.hbs b/app/assets/javascripts/admin/templates/modal/admin-badge-preview.hbs similarity index 92% rename from app/assets/javascripts/admin/templates/modal/admin_badge_preview.hbs rename to app/assets/javascripts/admin/templates/modal/admin-badge-preview.hbs index 14a475f5c57..c22bd9d99d2 100644 --- a/app/assets/javascripts/admin/templates/modal/admin_badge_preview.hbs +++ b/app/assets/javascripts/admin/templates/modal/admin-badge-preview.hbs @@ -1,4 +1,4 @@ -+{{#d-modal-body title="admin.badges.preview.modal_title" class="badge-query-preview"}} {{#if errors}}{{/if}} {{/if}} - +{{/d-modal-body}} diff --git a/app/assets/javascripts/admin/templates/modal/admin-delete-flag.hbs b/app/assets/javascripts/admin/templates/modal/admin-delete-flag.hbs new file mode 100644 index 00000000000..c2abeae36d7 --- /dev/null +++ b/app/assets/javascripts/admin/templates/modal/admin-delete-flag.hbs @@ -0,0 +1,7 @@ +{{#d-modal-body title="admin.flags.delete_flag_modal_title"}} + + + {{#if model.canDeleteAsSpammer}} + + {{/if}} +{{/d-modal-body}} diff --git a/app/assets/javascripts/admin/templates/modal/admin_edit_badge_groupings.hbs b/app/assets/javascripts/admin/templates/modal/admin-edit-badge-groupings.hbs similarity index 92% rename from app/assets/javascripts/admin/templates/modal/admin_edit_badge_groupings.hbs rename to app/assets/javascripts/admin/templates/modal/admin-edit-badge-groupings.hbs index 9d8daad53d6..80eb0844b30 100644 --- a/app/assets/javascripts/admin/templates/modal/admin_edit_badge_groupings.hbs +++ b/app/assets/javascripts/admin/templates/modal/admin-edit-badge-groupings.hbs @@ -1,4 +1,4 @@ -{{i18n 'admin.badges.preview.sql_error_header'}}
@@ -46,4 +46,4 @@+{{#d-modal-body title="admin.badges.badge_groupings.modal_title"}}+{{/d-modal-body}} + {{else}} {{i18n 'search.no_results'}} diff --git a/app/assets/javascripts/admin/templates/permalinks_list_item.hbs b/app/assets/javascripts/admin/templates/permalinks_list_item.hbs deleted file mode 100644 index 2a143e07ed7..00000000000 --- a/app/assets/javascripts/admin/templates/permalinks_list_item.hbs +++ /dev/null @@ -1,23 +0,0 @@ --{{#each workingCopy as |wc|}} @@ -20,7 +20,8 @@
{{url}}-- {{#if topic_id}} - {{topic_title}} - {{/if}} --- {{#if post_id}} - #{{post_number}} {{post_topic_title}} - {{/if}} --- {{#if category_id}} - {{category_name}} - {{/if}} --- {{#if external_url}} - {{external_url}} - {{/if}} -- - diff --git a/app/assets/javascripts/admin/templates/plugins-index.hbs b/app/assets/javascripts/admin/templates/plugins-index.hbs index 34bf63c756e..b7d64f2a346 100644 --- a/app/assets/javascripts/admin/templates/plugins-index.hbs +++ b/app/assets/javascripts/admin/templates/plugins-index.hbs @@ -1,4 +1,4 @@ -{{#if length}} +{{#if model.length}} {{#if currentUser.admin}} {{d-button label="admin.plugins.change_settings" diff --git a/app/assets/javascripts/admin/templates/site-settings-category.hbs b/app/assets/javascripts/admin/templates/site-settings-category.hbs index 3e8b088f692..2e44f80c38c 100644 --- a/app/assets/javascripts/admin/templates/site-settings-category.hbs +++ b/app/assets/javascripts/admin/templates/site-settings-category.hbs @@ -1,9 +1,9 @@ {{#if filteredContent}} -+ {{#d-section class="form-horizontal settings"}} {{#each filteredContent as |setting|}} {{site-setting setting=setting saveAction="saveSetting"}} {{/each}} -+ {{/d-section}} {{else}}
{{i18n 'admin.site_settings.no_results'}} diff --git a/app/assets/javascripts/admin/templates/user_badges.hbs b/app/assets/javascripts/admin/templates/user-badges.hbs similarity index 100% rename from app/assets/javascripts/admin/templates/user_badges.hbs rename to app/assets/javascripts/admin/templates/user-badges.hbs diff --git a/app/assets/javascripts/admin/templates/user-fields.hbs b/app/assets/javascripts/admin/templates/user-fields.hbs index 3a89a0e06e9..72e4933052c 100644 --- a/app/assets/javascripts/admin/templates/user-fields.hbs +++ b/app/assets/javascripts/admin/templates/user-fields.hbs @@ -4,11 +4,11 @@{{i18n 'admin.user_fields.help'}}
{{#if model}} - {{#each arrangedContent as |uf|}} + {{#each sortedFields as |uf|}} {{admin-user-field-item userField=uf fieldTypes=fieldTypes - firstField=arrangedContent.firstObject - lastField=arrangedContent.lastObject + firstField=sortedFields.firstObject + lastField=sortedFields.lastObject destroyAction="destroy" moveUpAction="moveUp" moveDownAction="moveDown"}} diff --git a/app/assets/javascripts/admin/templates/user-index.hbs b/app/assets/javascripts/admin/templates/user-index.hbs index 6c4c87afffc..9cc35a3dce3 100644 --- a/app/assets/javascripts/admin/templates/user-index.hbs +++ b/app/assets/javascripts/admin/templates/user-index.hbs @@ -9,16 +9,10 @@ {{/if}} {{#if model.active}} {{#if model.can_impersonate}} - + {{d-button class="btn-danger" action="impersonate" icon="crosshairs" label="admin.impersonate.title" title="admin.impersonate.help"}} {{/if}} {{#if currentUser.admin}} - + {{d-button action="logOut" icon="power-off" label="admin.user.log_out"}} {{/if}} {{/if}} @@ -49,7 +43,7 @@ {{#if model.email}} {{model.email}} {{else}} - + {{d-button action="checkEmail" actionParam=model icon="envelope-o" label="admin.users.check_email.text" title="admin.users.check_email.title"}} {{/if}} @@ -59,9 +53,7 @@{{model.bounceScore}}{{#if model.canResetBounceScore}} - + {{d-button action="resetBounceScore" label="admin.user.reset_bounce_score.label" title="admin.user.reset_bounce_score.title"}} {{/if}} {{model.bounceScoreExplanation}}@@ -73,7 +65,7 @@ {{#if model.associated_accounts}} {{model.associated_accounts}} {{else}} - + {{d-button action="checkEmail" actionParam=model icon="envelope-o" label="admin.users.check_email.text" title="admin.users.check_email.title"}} {{/if}} @@ -108,9 +100,7 @@{{model.ip_address}}{{#if currentUser.staff}} - + {{d-button action="refreshBrowsers" label="admin.user.refresh_browsers"}} {{ip-lookup ip=model.ip_address userId=model.id}} {{/if}}@@ -176,10 +166,7 @@ {{i18n 'admin.user.approve_success'}} {{else}} {{#if model.can_approve}} - + {{d-button action="approve" icon="check" label="admin.user.approve"}} {{/if}} {{/if}} @@ -188,31 +175,19 @@{{i18n 'admin.users.active'}}-- {{#if model.active}} - {{i18n 'yes_value'}} - {{else}} - {{i18n 'no_value'}} - {{/if}} -+{{i18n-yes-no model.active}}{{#if model.active}} {{#if model.can_deactivate}} - + {{d-button action="deactivate" label="admin.user.deactivate_account"}} {{i18n 'admin.user.deactivate_explanation'}} {{/if}} {{else}} {{#if model.can_send_activation_email}} - + {{d-button action="sendActivationEmail" icon="envelope" label="admin.user.send_activation_email"}} {{/if}} {{#if model.can_activate}} - + {{d-button action="activate" icon="check" label="admin.user.activate"}} {{/if}} {{/if}}@@ -240,38 +215,26 @@{{i18n 'admin.user.admin'}}-{{model.admin}}+{{i18n-yes-no model.admin}}{{#if model.can_revoke_admin}} - + {{d-button action="revokeAdmin" icon="shield" label="admin.user.revoke_admin"}} {{/if}} {{#if model.can_grant_admin}} - + {{d-button action="grantAdmin" icon="shield" label="admin.user.grant_admin"}} {{/if}}@@ -282,17 +245,17 @@ {{combo-box content=site.trustLevels value=model.trust_level nameProperty="detailedName"}} {{#if model.dirty}}{{i18n 'admin.user.moderator'}}-{{model.moderator}}+{{i18n-yes-no model.moderator}}{{#if model.can_revoke_moderation}} - + {{d-button action="revokeModeration" icon="shield" label="admin.user.revoke_moderation"}} {{/if}} {{#if model.can_grant_moderation}} - + {{d-button action="grantModeration" icon="shield" label="admin.user.grant_moderation"}} {{/if}}- - + {{d-button class="ok no-text" action="saveTrustLevel" icon="check"}} + {{d-button class="cancel no-text" action="restoreTrustLevel" icon="times"}}{{/if}}{{#if model.canLockTrustLevel}} {{#if model.trust_level_locked}} - + {{d-button action="lockTrustLevel" actionParam=false label="admin.user.unlock_trust_level"}} {{else}} - + {{d-button action="lockTrustLevel" actionParam=true label="admin.user.lock_trust_level"}} {{/if}} {{/if}} {{#if model.tl3Requirements}} @@ -303,21 +266,15 @@{{i18n 'admin.user.suspended'}}-{{model.isSuspended}}+{{i18n-yes-no model.isSuspended}}{{#if model.isSuspended}} - + {{d-button class="btn-danger" action="unsuspend" icon="ban" label="admin.user.unsuspend"}} {{suspendDuration}} {{i18n 'admin.user.suspended_explanation'}} {{else}} {{#if model.canSuspend}} - + {{d-button class="btn-danger" action="showSuspendModal" actionParam=model icon="ban" label="admin.user.suspend"}} {{i18n 'admin.user.suspended_explanation'}} {{/if}} {{/if}} @@ -340,20 +297,14 @@{{i18n 'admin.user.blocked'}}-{{model.blocked}}+{{i18n-yes-no model.blocked}}{{#conditional-loading-spinner size="small" condition=model.blockingUser}} {{#if model.blocked}} - + {{d-button action="unblock" icon="thumbs-o-up" label="admin.user.unblock"}} {{i18n 'admin.user.block_explanation'}} {{else}} - + {{d-button action="block" icon="ban" label="admin.user.block"}} {{i18n 'admin.user.block_explanation'}} {{/if}} {{/conditional-loading-spinner}} @@ -362,7 +313,7 @@@@ -423,10 +374,7 @@{{i18n 'admin.user.staged'}}-{{model.staged}}+{{i18n-yes-no model.staged}}{{i18n 'admin.user.staged_explanation'}}{{#if model.can_delete_all_posts}} {{#if model.post_count}} - + {{d-button class="btn-danger" action="deleteAllPosts" icon="trash-o" label="admin.user.delete_all_posts"}} {{/if}} {{else}} {{model.deleteAllPostsExplanation}} diff --git a/app/assets/javascripts/admin/templates/user-tl3-requirements.hbs b/app/assets/javascripts/admin/templates/user-tl3-requirements.hbs index a9b1cfdc8c7..e0536ddd087 100644 --- a/app/assets/javascripts/admin/templates/user-tl3-requirements.hbs +++ b/app/assets/javascripts/admin/templates/user-tl3-requirements.hbs @@ -10,7 +10,7 @@{{model.username}} - {{i18n 'admin.user.tl3_requirements.title'}}
-{{i18n 'admin.user.tl3_requirements.table_title' time_period=model.tl3Requirements.time_period}}
+{{i18n 'admin.user.tl3_requirements.table_title' count=model.tl3Requirements.time_period}}
diff --git a/app/assets/javascripts/admin/templates/user.hbs b/app/assets/javascripts/admin/templates/user.hbs index c24cd68950a..3b1c7742714 100644 --- a/app/assets/javascripts/admin/templates/user.hbs +++ b/app/assets/javascripts/admin/templates/user.hbs @@ -1 +1,3 @@ -{{outlet}} +{{#d-section}} + {{outlet}} +{{/d-section}} diff --git a/app/assets/javascripts/admin/templates/users_list.hbs b/app/assets/javascripts/admin/templates/users-list.hbs similarity index 100% rename from app/assets/javascripts/admin/templates/users_list.hbs rename to app/assets/javascripts/admin/templates/users-list.hbs diff --git a/app/assets/javascripts/admin/templates/version-checks.hbs b/app/assets/javascripts/admin/templates/version-checks.hbs index 542020d8ebd..25c560ad6ae 100644 --- a/app/assets/javascripts/admin/templates/version-checks.hbs +++ b/app/assets/javascripts/admin/templates/version-checks.hbs @@ -1,7 +1,10 @@
++ {{custom-html name="upgrade-header" versionCheck=versionCheck tagName="thead"}} +
+- {{custom-html 'upgrade-header'}}
{{i18n 'admin.dashboard.installed_version'}} diff --git a/app/assets/javascripts/admin/templates/web-hooks-show-events.hbs b/app/assets/javascripts/admin/templates/web-hooks-show-events.hbs new file mode 100644 index 00000000000..f3b8825e5bf --- /dev/null +++ b/app/assets/javascripts/admin/templates/web-hooks-show-events.hbs @@ -0,0 +1,40 @@ ++ {{#link-to 'adminWebHooks' tagName='button' classNames='btn'}} + {{fa-icon 'list'}} {{i18n 'admin.web_hooks.events.go_list'}} + {{/link-to}} + {{d-button icon="send" label="admin.web_hooks.events.ping" action="ping" disabled=pingDisabled}} + {{#link-to 'adminWebHooks.show' model.extras.web_hook_id tagName='button' classNames='btn'}} + {{fa-icon 'edit'}} {{i18n 'admin.web_hooks.events.go_details'}} + {{/link-to}} ++ ++{{#if model}} + {{#load-more selector=".web-hook-events li" action="loadMore"}} +diff --git a/app/assets/javascripts/admin/templates/web-hooks-show.hbs b/app/assets/javascripts/admin/templates/web-hooks-show.hbs new file mode 100644 index 00000000000..b0e0c0c0bfb --- /dev/null +++ b/app/assets/javascripts/admin/templates/web-hooks-show.hbs @@ -0,0 +1,86 @@ +{{#link-to 'adminWebHooks' class="go-back"}} + {{fa-icon 'arrow-left'}} + {{i18n 'admin.web_hooks.go_back'}} +{{/link-to}} + +++ {{conditional-loading-spinner condition=model.loadingMore}} + {{/load-more}} +{{else}} +++ {{#if hasIncoming}} +{{i18n 'admin.web_hooks.events.status'}}+{{i18n 'admin.web_hooks.events.event_id'}}+ +{{i18n 'admin.web_hooks.events.completion'}}+{{i18n 'admin.web_hooks.events.actions'}}+ ++ {{count-i18n key="admin.web_hooks.events.incoming" count=incomingCount}} + {{i18n 'click_to_show'}} ++ {{/if}} ++ {{#each model as |webHookEvent|}} + {{admin-web-hook-event model=webHookEvent}} + {{/each}} +
+{{i18n 'admin.web_hooks.events.none'}}
+{{/if}} ++diff --git a/app/assets/javascripts/admin/templates/web-hooks.hbs b/app/assets/javascripts/admin/templates/web-hooks.hbs new file mode 100644 index 00000000000..082cf170b41 --- /dev/null +++ b/app/assets/javascripts/admin/templates/web-hooks.hbs @@ -0,0 +1,39 @@ +{{i18n 'admin.web_hooks.detailed_instruction'}}
+ + ++ + {{#unless model.isNew}} + {{d-button class="btn-danger" label="admin.web_hooks.destroy" action="destroy"}} + {{#link-to 'adminWebHooks.showEvents' model.id class="btn"}} + {{i18n 'admin.web_hooks.events.go_events'}} + {{/link-to}} + {{/unless}} + {{savingStatus}} +++ {{#link-to 'adminWebHooks.show' 'new' tagName='button' classNames='btn'}} + {{fa-icon 'plus'}} {{i18n 'admin.web_hooks.new'}} + {{/link-to}} ++ ++{{#if model}} +diff --git a/app/assets/javascripts/admin/views/admin-backups.js.es6 b/app/assets/javascripts/admin/views/admin-backups.js.es6 deleted file mode 100644 index a779f4971d2..00000000000 --- a/app/assets/javascripts/admin/views/admin-backups.js.es6 +++ /dev/null @@ -1,25 +0,0 @@ -import DiscourseURL from 'discourse/lib/url'; - -export default Ember.View.extend({ - classNames: ["admin-backups"], - - _hijackDownloads: function() { - this.$().on("mouseup.admin-backups", "a.download", function (e) { - var $link = $(e.currentTarget); - - if (!$link.data("href")) { - $link.addClass("no-href"); - $link.data("href", $link.attr("href")); - $link.attr("href", null); - $link.data("auto-route", true); - } - - DiscourseURL.redirectTo($link.data("href")); - }); - }.on("didInsertElement"), - - _removeBindings: function() { - this.$().off("mouseup.admin-backups"); - }.on("willDestroyElement") - -}); diff --git a/app/assets/javascripts/admin/views/admin-badges-index.js.es6 b/app/assets/javascripts/admin/views/admin-badges-index.js.es6 deleted file mode 100644 index f0b0ceb85d1..00000000000 --- a/app/assets/javascripts/admin/views/admin-badges-index.js.es6 +++ /dev/null @@ -1,3 +0,0 @@ -import ScrollTop from 'discourse/mixins/scroll-top'; - -export default Ember.View.extend(ScrollTop); diff --git a/app/assets/javascripts/admin/views/admin-badges-show.js.es6 b/app/assets/javascripts/admin/views/admin-badges-show.js.es6 deleted file mode 100644 index 55f7e0b64d8..00000000000 --- a/app/assets/javascripts/admin/views/admin-badges-show.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -import ScrollTop from 'discourse/mixins/scroll-top'; - -export default Ember.View.extend(ScrollTop, { - _scrollOnModelChange: function() { - this._scrollTop(); - }.observes('controller.model.id') -}); diff --git a/app/assets/javascripts/admin/views/admin-customize-colors.js.es6 b/app/assets/javascripts/admin/views/admin-customize-colors.js.es6 deleted file mode 100644 index ac5df78af58..00000000000 --- a/app/assets/javascripts/admin/views/admin-customize-colors.js.es6 +++ /dev/null @@ -1,3 +0,0 @@ -export default Ember.View.extend({ - templateName: 'admin/templates/customize_colors' -}); diff --git a/app/assets/javascripts/admin/views/admin-user.js.es6 b/app/assets/javascripts/admin/views/admin-user.js.es6 deleted file mode 100644 index 2bd2497f157..00000000000 --- a/app/assets/javascripts/admin/views/admin-user.js.es6 +++ /dev/null @@ -1 +0,0 @@ -export default Ember.View.extend(Discourse.ScrollTop); diff --git a/app/assets/javascripts/admin/views/modals/admin-agree-flag.js.es6 b/app/assets/javascripts/admin/views/modals/admin-agree-flag.js.es6 deleted file mode 100644 index 0a4aba513f9..00000000000 --- a/app/assets/javascripts/admin/views/modals/admin-agree-flag.js.es6 +++ /dev/null @@ -1,6 +0,0 @@ -import ModalBodyView from "discourse/views/modal-body"; - -export default ModalBodyView.extend({ - templateName: 'admin/templates/modal/admin_agree_flag', - title: I18n.t('admin.flags.agree_flag_modal_title') -}); diff --git a/app/assets/javascripts/admin/views/modals/admin-badge-preview.js.es6 b/app/assets/javascripts/admin/views/modals/admin-badge-preview.js.es6 deleted file mode 100644 index 6431ba9362b..00000000000 --- a/app/assets/javascripts/admin/views/modals/admin-badge-preview.js.es6 +++ /dev/null @@ -1,6 +0,0 @@ -import ModalBodyView from "discourse/views/modal-body"; - -export default ModalBodyView.extend({ - templateName: 'admin/templates/modal/admin_badge_preview', - title: I18n.t('admin.badges.preview.modal_title') -}); diff --git a/app/assets/javascripts/admin/views/modals/admin-delete-flag.js.es6 b/app/assets/javascripts/admin/views/modals/admin-delete-flag.js.es6 deleted file mode 100644 index 379b2ef773f..00000000000 --- a/app/assets/javascripts/admin/views/modals/admin-delete-flag.js.es6 +++ /dev/null @@ -1,6 +0,0 @@ -import ModalBodyView from "discourse/views/modal-body"; - -export default ModalBodyView.extend({ - templateName: 'admin/templates/modal/admin_delete_flag', - title: I18n.t('admin.flags.delete_flag_modal_title') -}); diff --git a/app/assets/javascripts/admin/views/modals/admin-edit-badge-groupings.js.es6 b/app/assets/javascripts/admin/views/modals/admin-edit-badge-groupings.js.es6 deleted file mode 100644 index ccc5f49a3b9..00000000000 --- a/app/assets/javascripts/admin/views/modals/admin-edit-badge-groupings.js.es6 +++ /dev/null @@ -1,6 +0,0 @@ -import ModalBodyView from "discourse/views/modal-body"; - -export default ModalBodyView.extend({ - templateName: 'admin/templates/modal/admin_edit_badge_groupings', - title: I18n.t('admin.badges.badge_groupings.modal_title') -}); diff --git a/app/assets/javascripts/admin/views/modals/admin-incoming-email.js.es6 b/app/assets/javascripts/admin/views/modals/admin-incoming-email.js.es6 deleted file mode 100644 index 576feff433c..00000000000 --- a/app/assets/javascripts/admin/views/modals/admin-incoming-email.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -import ModalBodyView from "discourse/views/modal-body"; - -export default ModalBodyView.extend({ - templateName: 'admin/templates/modal/admin_incoming_email', - classNames: ['incoming-emails'], - title: I18n.t('admin.email.incoming_emails.modal.title') -}); diff --git a/app/assets/javascripts/admin/views/modals/admin-staff-action-log-details.js.es6 b/app/assets/javascripts/admin/views/modals/admin-staff-action-log-details.js.es6 deleted file mode 100644 index a31a61e0c9f..00000000000 --- a/app/assets/javascripts/admin/views/modals/admin-staff-action-log-details.js.es6 +++ /dev/null @@ -1,6 +0,0 @@ -import ModalBodyView from "discourse/views/modal-body"; - -export default ModalBodyView.extend({ - templateName: 'admin/templates/logs/details_modal', - title: I18n.t('admin.logs.staff_actions.modal_title') -}); diff --git a/app/assets/javascripts/admin/views/modals/admin-start-backup.js.es6 b/app/assets/javascripts/admin/views/modals/admin-start-backup.js.es6 deleted file mode 100644 index e363ee1a157..00000000000 --- a/app/assets/javascripts/admin/views/modals/admin-start-backup.js.es6 +++ /dev/null @@ -1,6 +0,0 @@ -import ModalBodyView from "discourse/views/modal-body"; - -export default ModalBodyView.extend({ - templateName: 'admin/templates/modal/admin_start_backup', - title: I18n.t('admin.backups.operations.backup.confirm') -}); diff --git a/app/assets/javascripts/admin/views/modals/admin-suspend-user.js.es6 b/app/assets/javascripts/admin/views/modals/admin-suspend-user.js.es6 deleted file mode 100644 index 9f3dcb1635e..00000000000 --- a/app/assets/javascripts/admin/views/modals/admin-suspend-user.js.es6 +++ /dev/null @@ -1,6 +0,0 @@ -import ModalBodyView from "discourse/views/modal-body"; - -export default ModalBodyView.extend({ - templateName: 'admin/templates/modal/admin_suspend_user', - title: I18n.t('admin.user.suspend_modal_title') -}); diff --git a/app/assets/javascripts/admin/views/modals/change-site-customization-details.js.es6 b/app/assets/javascripts/admin/views/modals/change-site-customization-details.js.es6 deleted file mode 100644 index 28cc323e48e..00000000000 --- a/app/assets/javascripts/admin/views/modals/change-site-customization-details.js.es6 +++ /dev/null @@ -1,6 +0,0 @@ -import ModalBodyView from "discourse/views/modal-body"; - -export default ModalBodyView.extend({ - templateName: 'admin/templates/logs/site_customization_change_modal', - title: I18n.t('admin.logs.staff_actions.modal_title') -}); diff --git a/app/assets/javascripts/admin/views/modals/delete-site-customization-details.js.es6 b/app/assets/javascripts/admin/views/modals/delete-site-customization-details.js.es6 deleted file mode 100644 index 28cc323e48e..00000000000 --- a/app/assets/javascripts/admin/views/modals/delete-site-customization-details.js.es6 +++ /dev/null @@ -1,6 +0,0 @@ -import ModalBodyView from "discourse/views/modal-body"; - -export default ModalBodyView.extend({ - templateName: 'admin/templates/logs/site_customization_change_modal', - title: I18n.t('admin.logs.staff_actions.modal_title') -}); diff --git a/app/assets/javascripts/main_include.js b/app/assets/javascripts/application.js similarity index 87% rename from app/assets/javascripts/main_include.js rename to app/assets/javascripts/application.js index dcd876d9ce7..96a2066c414 100644 --- a/app/assets/javascripts/main_include.js +++ b/app/assets/javascripts/application.js @@ -2,6 +2,8 @@ //= require ./ember-addons/decorator-alias //= require ./ember-addons/macro-alias //= require ./ember-addons/ember-computed-decorators +//= require ./ember-addons/fmt +//= require_tree ./discourse-common //= require ./discourse //= require ./deprecated @@ -19,15 +21,11 @@ //= require ./discourse/lib/debounce //= require ./discourse/lib/quote //= require ./discourse/lib/key-value-store -//= require ./discourse/lib/helpers -//= require ./discourse/helpers/i18n -//= require ./discourse/helpers/fa-icon -//= require ./discourse/lib/raw-handlebars -//= require ./discourse/lib/helpers //= require ./discourse/lib/computed //= require ./discourse/lib/formatter //= require ./discourse/lib/eyeline //= require ./discourse/mixins/scrolling +//= require ./discourse/mixins/scrolling //= require ./discourse/models/model //= require ./discourse/models/rest //= require ./discourse/models/badge-grouping @@ -61,12 +59,7 @@ //= require ./discourse/models/user-badge //= require ./discourse/controllers/discovery-sortable //= require ./discourse/controllers/navigation/default -//= require ./discourse/views/container -//= require ./discourse/views/modal-body -//= require ./discourse/views/flag -//= require ./discourse/components/combo-box //= require ./discourse/components/edit-category-panel -//= require ./discourse/views/button //= require ./discourse/components/dropdown-button //= require ./discourse/components/notifications-button //= require ./discourse/lib/link-mentions @@ -74,7 +67,6 @@ //= require ./discourse/lib/emoji/groups //= require ./discourse/lib/emoji/toolbar //= require ./discourse/components/d-editor -//= require ./discourse/views/composer //= require ./discourse/lib/show-modal //= require ./discourse/lib/screen-track //= require ./discourse/routes/discourse @@ -84,7 +76,6 @@ //= require ./discourse/routes/user-activity-stream //= require ./discourse/routes/topic-from-params //= require ./discourse/components/text-field -//= require ./discourse/components/visible //= require ./discourse/components/conditional-loading-spinner //= require ./discourse/helpers/user-avatar //= require ./discourse/helpers/cold-age-class @@ -92,12 +83,12 @@ //= require ./discourse/helpers/category-link //= require ./discourse/lib/export-result //= require_tree ./discourse/lib -//= require ./discourse/router +//= require ./discourse/mapping-router //= require_tree ./discourse/controllers //= require_tree ./discourse/models //= require_tree ./discourse/components -//= require_tree ./discourse/views +//= require_tree ./discourse/raw-views //= require_tree ./discourse/helpers //= require_tree ./discourse/templates //= require_tree ./discourse/routes diff --git a/app/assets/javascripts/application.js.erb b/app/assets/javascripts/application.js.erb deleted file mode 100644 index 4b040e3bd65..00000000000 --- a/app/assets/javascripts/application.js.erb +++ /dev/null @@ -1,17 +0,0 @@ -<% - -require_asset ("./main_include.js") - -# Include plugin javascripts/handlebars templates -DiscoursePluginRegistry.javascripts.each { |js| require_asset(js) } -DiscoursePluginRegistry.handlebars.each { |hb| require_asset(hb) } - -DiscoursePluginRegistry.each_globbed_asset do |f, ext| - if File.directory?(f) - depend_on(f) - elsif f.to_s.end_with?(".#{ext}") - require_asset(f) - end -end - -%> diff --git a/app/assets/javascripts/deprecated.js b/app/assets/javascripts/deprecated.js index 5f8a06d597c..151ed975d0c 100644 --- a/app/assets/javascripts/deprecated.js +++ b/app/assets/javascripts/deprecated.js @@ -1,31 +1,7 @@ (function() { var Discourse = require('discourse').default; - function deprecate(module, methods) { - const result = {}; - - methods.forEach(function(m) { - result[m] = function() { - Ember.warn("Discourse." + module + "." + m + " is deprecated. Export a setup() function instead"); - }; - }); - - Discourse[module] = result; - } - - deprecate('Markdown', ['whiteListTag', 'whiteListIframe']); - deprecate('Dialect', ['inlineRegexp', 'inlineBetween', 'addPreProcessor', 'replaceBlock', - 'inlineReplace', 'registerInline', 'registerEmoji']); - - deprecate('BBCode', ['replaceBBCode', 'register', 'rawBBCode', 'replaceBBCodeParamsRaw']); - Discourse.dialect_deprecated = true; - Discourse.ajax = function() { - var ajax = require('discourse/lib/ajax').ajax; - Ember.warn("Discourse.ajax is deprecated. Import the module and use it instead"); - return ajax.apply(this, arguments); - }; - window.Discourse = Discourse; })(); diff --git a/app/assets/javascripts/discourse/components/combo-box.js.es6 b/app/assets/javascripts/discourse-common/components/combo-box.js.es6 similarity index 81% rename from app/assets/javascripts/discourse/components/combo-box.js.es6 rename to app/assets/javascripts/discourse-common/components/combo-box.js.es6 index 5caf1adea9a..2a2c4e2ba77 100644 --- a/app/assets/javascripts/discourse/components/combo-box.js.es6 +++ b/app/assets/javascripts/discourse-common/components/combo-box.js.es6 @@ -1,13 +1,14 @@ +import { bufferedRender } from 'discourse-common/lib/buffered-render'; import { on, observes } from 'ember-addons/ember-computed-decorators'; -export default Ember.Component.extend({ +export default Ember.Component.extend(bufferedRender({ tagName: 'select', attributeBindings: ['tabindex', 'disabled'], classNames: ['combobox'], valueAttribute: 'id', nameProperty: 'name', - render(buffer) { + buildBuffer(buffer) { const nameProperty = this.get('nameProperty'); const none = this.get('none'); @@ -48,11 +49,11 @@ export default Ember.Component.extend({ @observes('content.[]') _rerenderOnChange() { - this.rerender(); + this.rerenderBuffer(); }, - @on('didInsertElement') - _initializeCombo() { + didInsertElement() { + this._super(); // Workaround for https://github.com/emberjs/ember.js/issues/9813 // Can be removed when fixed. Without it, the wrong option is selected @@ -60,14 +61,15 @@ export default Ember.Component.extend({ // observer for item names changing (optional) if (this.get('nameChanges')) { - this.addObserver('content.@each.' + this.get('nameProperty'), this.rerender); + this.addObserver('content.@each.' + this.get('nameProperty'), this.rerenderBuffer); } const $elem = this.$(); - const minimumResultsForSearch = this.capabilities.isIOS ? -1 : 5; + const caps = this.capabilities; + const minimumResultsForSearch = (caps && caps.isIOS) ? -1 : 5; $elem.select2({ formatResult: this.comboTemplate, minimumResultsForSearch, - width: 'resolve', + width: this.get('width') || 'resolve', allowClear: true }); @@ -79,7 +81,11 @@ export default Ember.Component.extend({ } this.set('value', val); }); - $elem.trigger('change'); + Ember.run.scheduleOnce('afterRender', this, this._triggerChange); + }, + + _triggerChange() { + this.$().trigger('change'); }, @on('willDestroyElement') @@ -87,4 +93,4 @@ export default Ember.Component.extend({ this.$().select2('destroy'); } -}); +})); diff --git a/app/assets/javascripts/discourse-common/helpers/bound-i18n.js.es6 b/app/assets/javascripts/discourse-common/helpers/bound-i18n.js.es6 new file mode 100644 index 00000000000..d507efd5ec8 --- /dev/null +++ b/app/assets/javascripts/discourse-common/helpers/bound-i18n.js.es6 @@ -0,0 +1,3 @@ +import { htmlHelper } from 'discourse-common/lib/helpers'; + +export default htmlHelper((key, params) => I18n.t(key, params.hash)); diff --git a/app/assets/javascripts/discourse/helpers/fa-icon.js.es6 b/app/assets/javascripts/discourse-common/helpers/fa-icon.js.es6 similarity index 54% rename from app/assets/javascripts/discourse/helpers/fa-icon.js.es6 rename to app/assets/javascripts/discourse-common/helpers/fa-icon.js.es6 index 043c6a50e66..3c1f8b9b5ab 100644 --- a/app/assets/javascripts/discourse/helpers/fa-icon.js.es6 +++ b/app/assets/javascripts/discourse-common/helpers/fa-icon.js.es6 @@ -1,8 +1,7 @@ -import { h } from 'virtual-dom'; -import { registerUnbound } from 'discourse/lib/helpers'; +import { registerUnbound } from 'discourse-common/lib/helpers'; -function iconClasses(icon, params) { - var classes = "fa fa-" + icon; +export function iconClasses(icon, params) { + let classes = "fa fa-" + icon; if (params.modifier) { classes += " fa-" + params.modifier; } if (params['class']) { classes += ' ' + params['class']; } return classes; @@ -21,23 +20,6 @@ export function iconHTML(icon, params) { return html; } -export function iconNode(icon, params) { - params = params || {}; - - const properties = { - className: iconClasses(icon, params), - attributes: { "aria-hidden": true } - }; - - if (params.title) { properties.attributes.title = params.title; } - - if (params.label) { - return h('i', properties, h('span.sr-only', I18n.t(params.label))); - } else { - return h('i', properties); - } -} - registerUnbound('fa-icon', function(icon, params) { return new Handlebars.SafeString(iconHTML(icon, params)); }); diff --git a/app/assets/javascripts/discourse-common/helpers/i18n.js.es6 b/app/assets/javascripts/discourse-common/helpers/i18n.js.es6 new file mode 100644 index 00000000000..40fd2893d52 --- /dev/null +++ b/app/assets/javascripts/discourse-common/helpers/i18n.js.es6 @@ -0,0 +1,4 @@ +import { registerUnbound } from 'discourse-common/lib/helpers'; + +registerUnbound('i18n', (key, params) => I18n.t(key, params)); +registerUnbound('i18n-yes-no', (value, params) => I18n.t(value ? 'yes_value' : 'no_value', params)); diff --git a/app/assets/javascripts/discourse-common/lib/buffered-render.js.es6 b/app/assets/javascripts/discourse-common/lib/buffered-render.js.es6 new file mode 100644 index 00000000000..6f19de49124 --- /dev/null +++ b/app/assets/javascripts/discourse-common/lib/buffered-render.js.es6 @@ -0,0 +1,42 @@ +// Ember 2.0 removes buffered rendering, but we can still implement it ourselves. +// In the long term we'll want to remove this. + +const Mixin = { + _customRender() { + if (!this.element || this.isDestroying || this.isDestroyed) { return; } + + const buffer = []; + this.buildBuffer(buffer); + this.element.innerHTML = buffer.join(''); + }, + + rerenderBuffer() { + Ember.run.scheduleOnce('render', this, this._customRender); + } +}; + +export function bufferedRender(obj) { + + if (!obj.buildBuffer) { + Ember.warn('Missing `buildBuffer` method'); + return obj; + } + + const caller = { }; + + caller.didRender = function() { + this._super(); + this._customRender(); + }; + + const triggers = obj.rerenderTriggers; + if (triggers) { + caller.init = function() { + this._super(); + triggers.forEach(k => this.addObserver(k, this.rerenderBuffer)); + }; + } + delete obj.rerenderTriggers; + + return Ember.Mixin.create(Mixin, caller, obj); +} diff --git a/app/assets/javascripts/discourse-common/lib/get-url.js.es6 b/app/assets/javascripts/discourse-common/lib/get-url.js.es6 new file mode 100644 index 00000000000..0bbc6f00fd4 --- /dev/null +++ b/app/assets/javascripts/discourse-common/lib/get-url.js.es6 @@ -0,0 +1,20 @@ +let baseUri; + +export default function getURL(url) { + if (!url) return url; + + if (!baseUri) { + baseUri = $('meta[name="discourse-base-uri"]').attr('content') || ''; + } + + // if it's a non relative URL, return it. + if (url !== '/' && !/^\/[^\/]/.test(url)) return url; + + const found = url.indexOf(baseUri); + + if (found >= 0 && found < 3) return url; + if (url[0] !== "/") url = "/" + url; + + return baseUri + url; +} + diff --git a/app/assets/javascripts/discourse/lib/helpers.js.es6 b/app/assets/javascripts/discourse-common/lib/helpers.js.es6 similarity index 57% rename from app/assets/javascripts/discourse/lib/helpers.js.es6 rename to app/assets/javascripts/discourse-common/lib/helpers.js.es6 index 9eccf5651ca..33d64fc2e7c 100644 --- a/app/assets/javascripts/discourse/lib/helpers.js.es6 +++ b/app/assets/javascripts/discourse-common/lib/helpers.js.es6 @@ -1,20 +1,26 @@ -import { get } from 'discourse/lib/raw-handlebars'; +import { get } from 'discourse-common/lib/raw-handlebars'; -// `Ember.Helper` is only available in versions after 1.12 export function htmlHelper(fn) { - if (Ember.Helper) { - return Ember.Helper.helper(function() { - return new Handlebars.SafeString(fn.apply(this, Array.prototype.slice.call(arguments)) || ''); - }); - } else { - return Ember.Handlebars.makeBoundHelper(function() { - return new Handlebars.SafeString(fn.apply(this, Array.prototype.slice.call(arguments)) || ''); - }); - } + return Ember.Helper.helper(function(...args) { + args = (args.length > 1) ? args[0].concat({ hash: args[args.length-1] }) : args; + return new Handlebars.SafeString(fn.apply(this, args) || ''); + }); } +const _helpers = {}; + export function registerHelper(name, fn) { - Ember.HTMLBars._registerHelper(name, fn); + _helpers[name] = Ember.Helper.helper(fn); +} + +export function findHelper(name) { + return _helpers[name] || _helpers[name.dasherize()]; +} + +export function registerHelpers(registry) { + Object.keys(_helpers).forEach(name => { + registry.register(`helper:${name}`, _helpers[name], { singleton: false }); + }); } function resolveParams(ctx, options) { @@ -39,6 +45,7 @@ function resolveParams(ctx, options) { } export function registerUnbound(name, fn) { + const func = function(property, options) { if (options.types && (options.types[0] === "ID" || options.types[0] === "PathExpression")) { property = get(this, property, options); @@ -47,6 +54,8 @@ export function registerUnbound(name, fn) { return fn.call(this, property, resolveParams(this, options)); }; + _helpers[name] = Ember.Helper.extend({ + compute: (params, args) => fn(params[0], args) + }); Handlebars.registerHelper(name, func); - Ember.Handlebars.registerHelper(name, func); } diff --git a/app/assets/javascripts/discourse/lib/raw-handlebars.js.es6 b/app/assets/javascripts/discourse-common/lib/raw-handlebars.js.es6 similarity index 98% rename from app/assets/javascripts/discourse/lib/raw-handlebars.js.es6 rename to app/assets/javascripts/discourse-common/lib/raw-handlebars.js.es6 index 423d8e88352..4b547a68828 100644 --- a/app/assets/javascripts/discourse/lib/raw-handlebars.js.es6 +++ b/app/assets/javascripts/discourse-common/lib/raw-handlebars.js.es6 @@ -18,6 +18,10 @@ RawHandlebars.helpers['get'] = function(context, options) { var firstContext = options.contexts[0]; var val = firstContext[context]; + if (context.indexOf('controller') === 0) { + context = context.replace(/^controller\./, ''); + } + if (val && val.isDescriptor) { return Em.get(firstContext, context); } val = val === undefined ? Em.get(firstContext, context): val; return val; diff --git a/app/assets/javascripts/discourse-common/resolver.js.es6 b/app/assets/javascripts/discourse-common/resolver.js.es6 new file mode 100644 index 00000000000..19247192086 --- /dev/null +++ b/app/assets/javascripts/discourse-common/resolver.js.es6 @@ -0,0 +1,221 @@ +import { findHelper } from 'discourse-common/lib/helpers'; + +/* global requirejs, require */ +var classify = Ember.String.classify; +var get = Ember.get; + +const _options = {}; + +export function setResolverOption(name, value) { + _options[name] = value; +} + +export function getResolverOption(name) { + return _options[name]; +} + +function parseName(fullName) { + const nameParts = fullName.split(":"); + const type = nameParts[0]; + let fullNameWithoutType = nameParts[1]; + const namespace = get(this, 'namespace'); + const root = namespace; + + return { + fullName, + type, + fullNameWithoutType, + name: fullNameWithoutType, + root, + resolveMethodName: "resolve" + classify(type) + }; +} + +export function buildResolver(baseName) { + return Ember.DefaultResolver.extend({ + parseName, + + resolveRouter(parsedName) { + const routerPath = `${baseName}/router`; + if (requirejs.entries[routerPath]) { + const module = require(routerPath, null, null, true); + return module.default; + } + return this._super(parsedName); + }, + + normalize(fullName) { + const split = fullName.split(':'); + if (split.length > 1) { + const appBase = `${baseName}/${split[0]}s/`; + const adminBase = 'admin/' + split[0] + 's/'; + + // Allow render 'admin/templates/xyz' too + split[1] = split[1].replace('.templates', '').replace('/templates', ''); + + // Try slashes + let dashed = Ember.String.dasherize(split[1].replace(/\./g, '/')); + if (requirejs.entries[appBase + dashed] || requirejs.entries[adminBase + dashed]) { + return split[0] + ":" + dashed; + } + + // Try with dashes instead of slashes + dashed = Ember.String.dasherize(split[1].replace(/\./g, '-')); + if (requirejs.entries[appBase + dashed] || requirejs.entries[adminBase + dashed]) { + return split[0] + ":" + dashed; + } + } + return this._super(fullName); + }, + + customResolve(parsedName) { + // If we end with the name we want, use it. This allows us to define components within plugins. + const suffix = parsedName.type + 's/' + parsedName.fullNameWithoutType, + dashed = Ember.String.dasherize(suffix), + moduleName = Object.keys(requirejs.entries).find(function(e) { + return (e.indexOf(suffix, e.length - suffix.length) !== -1) || + (e.indexOf(dashed, e.length - dashed.length) !== -1); + }); + + var module; + if (moduleName) { + module = require(moduleName, null, null, true /* force sync */); + if (module && module['default']) { module = module['default']; } + } + return module; + }, + + resolveWidget(parsedName) { + return this.customResolve(parsedName) || this._super(parsedName); + }, + + resolveAdapter(parsedName) { + return this.customResolve(parsedName) || this._super(parsedName); + }, + + resolveModel(parsedName) { + return this.customResolve(parsedName) || this._super(parsedName); + }, + + resolveView(parsedName) { + return this.customResolve(parsedName) || this._super(parsedName); + }, + + resolveHelper(parsedName) { + return findHelper(parsedName.fullNameWithoutType) || + this.customResolve(parsedName) || + this._super(parsedName); + }, + + resolveController(parsedName) { + return this.customResolve(parsedName) || this._super(parsedName); + }, + + resolveComponent(parsedName) { + return this.customResolve(parsedName) || this._super(parsedName); + }, + + resolveService(parsedName) { + return this.customResolve(parsedName) || this._super(parsedName); + }, + + resolveRoute(parsedName) { + return this.customResolve(parsedName) || this._super(parsedName); + }, + + findLoadingTemplate(parsedName) { + if (parsedName.fullNameWithoutType.match(/loading$/)) { + return Ember.TEMPLATES.loading; + } + }, + + findConnectorTemplate(parsedName) { + const full = parsedName.fullNameWithoutType.replace('components/', ''); + if (full.indexOf('connectors') === 0) { + return Ember.TEMPLATES[`javascripts/${full}`]; + } + + }, + + resolveTemplate(parsedName) { + return this.findPluginMobileTemplate(parsedName) || + this.findPluginTemplate(parsedName) || + this.findMobileTemplate(parsedName) || + this.findTemplate(parsedName) || + this.findLoadingTemplate(parsedName) || + this.findConnectorTemplate(parsedName) || + Ember.TEMPLATES.not_found; + }, + + findPluginTemplate(parsedName) { + const pluginParsedName = this.parseName(parsedName.fullName.replace("template:", "template:javascripts/")); + return this.findTemplate(pluginParsedName); + }, + + findPluginMobileTemplate(parsedName) { + if (_options.mobileView) { + var pluginParsedName = this.parseName(parsedName.fullName.replace("template:", "template:javascripts/mobile/")); + return this.findTemplate(pluginParsedName); + } + }, + + findMobileTemplate(parsedName) { + if (_options.mobileView) { + var mobileParsedName = this.parseName(parsedName.fullName.replace("template:", "template:mobile/")); + return this.findTemplate(mobileParsedName); + } + }, + + findTemplate(parsedName) { + const withoutType = parsedName.fullNameWithoutType, + slashedType = withoutType.replace(/\./g, '/'), + decamelized = withoutType.decamelize(), + dashed = decamelized.replace(/\./g, '-').replace(/\_/g, '-'), + templates = Ember.TEMPLATES; + + return this._super(parsedName) || + templates[slashedType] || + templates[withoutType] || + templates[withoutType.replace(/\.raw$/, '')] || + templates[dashed] || + templates[decamelized.replace(/\./, '/')] || + templates[decamelized.replace(/\_/, '/')] || + templates[`${baseName}/templates/${withoutType}`] || + this.findAdminTemplate(parsedName) || + this.findUnderscoredTemplate(parsedName); + }, + + findUnderscoredTemplate(parsedName) { + var decamelized = parsedName.fullNameWithoutType.decamelize(); + var underscored = decamelized.replace(/\-/g, "_"); + return Ember.TEMPLATES[underscored]; + }, + + // Try to find a template within a special admin namespace, e.g. adminEmail => admin/templates/email + // (similar to how discourse lays out templates) + findAdminTemplate(parsedName) { + var decamelized = parsedName.fullNameWithoutType.decamelize(); + + if (decamelized.indexOf('components') === 0) { + const compTemplate = Ember.TEMPLATES['admin/templates/' + decamelized]; + if (compTemplate) { return compTemplate; } + } + + if (decamelized === "javascripts/admin") { + return Ember.TEMPLATES['admin/templates/admin']; + } + + if (decamelized.indexOf('admin') === 0 || decamelized.indexOf('javascripts/admin') === 0) { + decamelized = decamelized.replace(/^admin\_/, 'admin/templates/'); + decamelized = decamelized.replace(/^admin\./, 'admin/templates/'); + decamelized = decamelized.replace(/\./g, '_'); + + const dashed = decamelized.replace(/_/g, '-'); + return Ember.TEMPLATES[decamelized] || + Ember.TEMPLATES[dashed] || + Ember.TEMPLATES[dashed.replace('admin-', 'admin/')]; + } + } + + }); +} diff --git a/vendor/assets/javascripts/loader.js b/app/assets/javascripts/discourse-loader.js similarity index 81% rename from vendor/assets/javascripts/loader.js rename to app/assets/javascripts/discourse-loader.js index 61f4a1c767f..2d9f1d9f35f 100644 --- a/vendor/assets/javascripts/loader.js +++ b/app/assets/javascripts/discourse-loader.js @@ -1,7 +1,15 @@ -var define, requireModule, require, requirejs; +var define, require, requirejs; (function() { + var MOVED_MODULES = { + "discourse/views/list/post-count-or-badges": "discourse/raw-views/list/post-count-or-badges", + "discourse/views/list/posts-count-column" : "discourse/raw-views/list/posts-count-column", + "discourse/views/list/visited-line" : "discourse/raw-views/list/visited-line", + "discourse/views/topic-list-header-column" : "discourse/raw-views/topic-list-header-column", + "discourse/views/topic-status" : "discourse/raw-views/topic-status" + }; + var _isArray; if (!Array.isArray) { _isArray = function (x) { @@ -48,7 +56,7 @@ var define, requireModule, require, requirejs; return this._require || (this._require = function(dep) { return require(resolve(dep, name)); }); - } + }; define = function(name, deps, callback) { if (arguments.length < 2) { @@ -76,7 +84,7 @@ var define, requireModule, require, requirejs; return new Alias(path); }; - function reify(mod, name, seen) { + function reify(mod, name, rseen) { var deps = mod.deps; var length = deps.length; var reified = new Array(length); @@ -88,11 +96,11 @@ var define, requireModule, require, requirejs; for (var i = 0, l = length; i < l; i++) { dep = deps[i]; if (dep === 'exports') { - module.exports = reified[i] = seen; + module.exports = reified[i] = rseen; } else if (dep === 'require') { reified[i] = mod.makeRequire(); } else if (dep === 'module') { - mod.exports = seen; + mod.exports = rseen; module = reified[i] = mod; } else { reified[i] = requireFrom(resolve(dep, name), name); @@ -106,7 +114,16 @@ var define, requireModule, require, requirejs; } function requireFrom(name, origin) { + var mod = registry[name]; + if (!mod) { + var moved = MOVED_MODULES[name]; + if (moved) { + console.warn("DEPRECATION: `" + name + "` was moved to `" + moved + "`"); + } + mod = registry[moved]; + } + if (!mod) { throw new Error('Could not find module `' + name + '` imported from `' + origin + '`'); } @@ -116,9 +133,14 @@ var define, requireModule, require, requirejs; function missingModule(name) { throw new Error('Could not find module ' + name); } - requirejs = require = requireModule = function(name) { - var mod = registry[name]; + requirejs = require = function(name) { + + if (MOVED_MODULES[name]) { + name = MOVED_MODULES[name]; + } + + var mod = registry[name]; if (mod && mod.callback instanceof Alias) { mod = registry[mod.callback.name]; @@ -162,6 +184,7 @@ var define, requireModule, require, requirejs; return (seen[name] = obj); }; + window.requireModule = requirejs; function resolve(child, name) { if (child.charAt(0) !== '.') { return child; } @@ -189,6 +212,6 @@ var define, requireModule, require, requirejs; requirejs.entries = requirejs._eak_seen = registry; requirejs.clear = function() { requirejs.entries = requirejs._eak_seen = registry = {}; - seen = state = {}; + seen = {}; }; })(); diff --git a/app/assets/javascripts/discourse-objects.js b/app/assets/javascripts/discourse-objects.js new file mode 100644 index 00000000000..d55626ef029 --- /dev/null +++ b/app/assets/javascripts/discourse-objects.js @@ -0,0 +1,2 @@ +window.Discourse = {}; +Discourse.SiteSettings = {}; diff --git a/app/assets/javascripts/discourse.js.es6 b/app/assets/javascripts/discourse.js.es6 index 23c233c7c4f..5ca85473c5b 100644 --- a/app/assets/javascripts/discourse.js.es6 +++ b/app/assets/javascripts/discourse.js.es6 @@ -1,4 +1,4 @@ -import DiscourseResolver from 'discourse/ember/resolver'; +import { buildResolver } from 'discourse-common/resolver'; import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; const _pluginCallbacks = []; @@ -6,7 +6,7 @@ const _pluginCallbacks = []; const Discourse = Ember.Application.extend({ rootElement: '#main', _docTitle: document.title, - __TAGS_INCLUDED__: true, + RAW_TEMPLATES: {}, getURL(url) { if (!url) return url; @@ -31,7 +31,7 @@ const Discourse = Ember.Application.extend({ return url; }, - Resolver: DiscourseResolver, + Resolver: buildResolver('discourse'), @observes('_docTitle', 'hasFocus', 'notifyCount') _titleChanged() { @@ -104,7 +104,14 @@ const Discourse = Ember.Application.extend({ if (/\/pre\-initializers\//.test(key)) { const module = require(key, null, null, true); if (!module) { throw new Error(key + ' must export an initializer.'); } - Discourse.initializer(module.default); + + const init = module.default; + const oldInitialize = init.initialize; + init.initialize = function() { + oldInitialize.call(this, Discourse.__container__, Discourse); + }; + + Discourse.initializer(init); } }); @@ -115,8 +122,8 @@ const Discourse = Ember.Application.extend({ const init = module.default; const oldInitialize = init.initialize; - init.initialize = function(app) { - oldInitialize.call(this, app.container, Discourse); + init.initialize = function() { + oldInitialize.call(this, Discourse.__container__, Discourse); }; Discourse.instanceInitializer(init); @@ -130,20 +137,11 @@ const Discourse = Ember.Application.extend({ Discourse.instanceInitializer({ name: "_discourse_plugin_" + (++initCount), after: 'inject-objects', - initialize: function() { + initialize() { withPluginApi(cb.version, cb.code); } }); }); - - const utils = require('discourse/lib/utilities'); - Discourse.Utilities = {}; - Object.keys(utils).forEach(function(k) { - Discourse.Utilities[k] = function() { - Ember.warn('Discourse.Utilities is deprecated. Import it as a module'); - return utils[k].apply(utils, arguments); - }; - }); }, @computed('currentAssetVersion', 'desiredAssetVersion') diff --git a/app/assets/javascripts/discourse/adapters/rest.js.es6 b/app/assets/javascripts/discourse/adapters/rest.js.es6 index 75366ca80e5..72d05fb7dde 100644 --- a/app/assets/javascripts/discourse/adapters/rest.js.es6 +++ b/app/assets/javascripts/discourse/adapters/rest.js.es6 @@ -1,8 +1,7 @@ import { ajax } from 'discourse/lib/ajax'; import { hashString } from 'discourse/lib/hash'; -const ADMIN_MODELS = ['plugin', 'site-customization', 'embeddable-host']; - +const ADMIN_MODELS = ['plugin', 'site-customization', 'embeddable-host', 'web-hook', 'web-hook-event']; export function Result(payload, responseJson) { this.payload = payload; @@ -57,8 +56,8 @@ export default Ember.Object.extend({ return this.appendQueryParams(path, findArgs); }, - findAll(store, type) { - return ajax(this.pathFor(store, type)).catch(rethrow); + findAll(store, type, findArgs) { + return ajax(this.pathFor(store, type, findArgs)).catch(rethrow); }, diff --git a/app/assets/javascripts/discourse/components/activity-filter.js.es6 b/app/assets/javascripts/discourse/components/activity-filter.js.es6 deleted file mode 100644 index c0cf5b4e4eb..00000000000 --- a/app/assets/javascripts/discourse/components/activity-filter.js.es6 +++ /dev/null @@ -1,66 +0,0 @@ -import StringBuffer from 'discourse/mixins/string-buffer'; -import UserAction from "discourse/models/user-action"; - -export default Ember.Component.extend(StringBuffer, { - tagName: 'li', - classNameBindings: ['active', 'noGlyph'], - - rerenderTriggers: ['content.count', 'count'], - noGlyph: Em.computed.empty('icon'), - - isIndexStream: function() { - return !this.get('content'); - }.property('content.count'), - - active: function() { - if (this.get('isIndexStream')) { - return !this.get('userActionType'); - } - const content = this.get('content'); - if (content) { - return parseInt(this.get('userActionType'), 10) === parseInt(Em.get(content, 'action_type'), 10); - } - }.property('userActionType', 'isIndexStream'), - - activityCount: function() { - return this.get('content.count') || this.get('count') || 0; - }.property('content.count', 'count'), - - typeKey: function() { - const actionType = this.get('content.action_type'); - if (actionType === UserAction.TYPES.messages_received) { return ""; } - - const result = UserAction.TYPES_INVERTED[actionType]; - if (!result) { return ""; } - - // We like our URLS to have hyphens, not underscores - return "/" + result.replace("_", "-"); - }.property('content.action_type'), - - url: function() { - return "/users/" + this.get('user.username_lower') + "/activity" + this.get('typeKey'); - }.property('typeKey', 'user.username_lower'), - - description: function() { - return this.get('content.description') || I18n.t("user.filters.all"); - }.property('content.description'), - - renderString(buffer) { - buffer.push(""); - const icon = this.get('icon'); - if (icon) { - buffer.push(" "); - } - buffer.push(this.get('description') + " (" + this.get('activityCount') + ")"); - }, - - icon: function() { - switch(parseInt(this.get('content.action_type'), 10)) { - case UserAction.TYPES.likes_received: return "heart"; - case UserAction.TYPES.bookmarks: return "bookmark"; - case UserAction.TYPES.edits: return "pencil"; - case UserAction.TYPES.replies: return "reply"; - case UserAction.TYPES.mentions: return "at"; - } - }.property("content.action_type") -}); diff --git a/app/assets/javascripts/discourse/components/add-category-class.js.es6 b/app/assets/javascripts/discourse/components/add-category-class.js.es6 new file mode 100644 index 00000000000..7d8ad2dc376 --- /dev/null +++ b/app/assets/javascripts/discourse/components/add-category-class.js.es6 @@ -0,0 +1,34 @@ +import { observes } from 'ember-addons/ember-computed-decorators'; + +export default Ember.Component.extend({ + _slug: null, + + didInsertElement() { + this._super(); + this.refreshClass(); + }, + + _updateClass() { + if (this.isDestroying || this.isDestroyed) { return; } + const slug = this.get('category.fullSlug'); + this._removeClass(); + if (slug) { + $("body").addClass(`category-${slug}`); + } + }, + + @observes('category.fullSlug') + refreshClass() { + Ember.run.scheduleOnce('afterRender', this, this._updateClass); + }, + + _removeClass() { + $("body").removeClass((_, css) => (css.match(/\bcategory-\S+/g) || []).join(" ")); + }, + + willDestroyElement() { + this._super(); + this._removeClass(); + } + +}); diff --git a/app/assets/javascripts/discourse/components/avatar-flair.js.es6 b/app/assets/javascripts/discourse/components/avatar-flair.js.es6 new file mode 100644 index 00000000000..4beaa9cdf5f --- /dev/null +++ b/app/assets/javascripts/discourse/components/avatar-flair.js.es6 @@ -0,0 +1,20 @@ +import { observes } from 'ember-addons/ember-computed-decorators'; +import MountWidget from 'discourse/components/mount-widget'; + +export default MountWidget.extend({ + widget: 'avatar-flair', + + @observes('flairURL', 'flairBgColor', 'flairColor') + _rerender() { + this.queueRerender(); + }, + + buildArgs() { + return { + primary_group_flair_url: this.get('flairURL'), + primary_group_flair_bg_color: this.get('flairBgColor'), + primary_group_flair_color: this.get('flairColor'), + primary_group_name: this.get('groupName') + }; + } +}); diff --git a/app/assets/javascripts/discourse/components/avatar-uploader.js.es6 b/app/assets/javascripts/discourse/components/avatar-uploader.js.es6 index 539171bc9a1..fd5bac3c0e0 100644 --- a/app/assets/javascripts/discourse/components/avatar-uploader.js.es6 +++ b/app/assets/javascripts/discourse/components/avatar-uploader.js.es6 @@ -11,6 +11,10 @@ export default Em.Component.extend(UploadMixin, { return uploading ? I18n.t("uploading") : I18n.t("user.change_avatar.upload_picture"); }, + validateUploadedFilesOptions() { + return { imagesOnly: true }; + }, + uploadDone(upload) { this.setProperties({ imageIsNotASquare: upload.width !== upload.height, diff --git a/app/assets/javascripts/discourse/components/badge-selector.js.es6 b/app/assets/javascripts/discourse/components/badge-selector.js.es6 new file mode 100644 index 00000000000..8f0bd5ecfeb --- /dev/null +++ b/app/assets/javascripts/discourse/components/badge-selector.js.es6 @@ -0,0 +1,48 @@ +import { on, observes, default as computed } from 'ember-addons/ember-computed-decorators'; +import { findRawTemplate } from 'discourse/lib/raw-templates'; + +export default Ember.Component.extend({ + @computed('placeholderKey') + placeholder(placeholderKey) { + return placeholderKey ? I18n.t(placeholderKey) : ''; + }, + + @observes('badgeNames') + _update() { + if (this.get('canReceiveUpdates') === 'true') + this._initializeAutocomplete({updateData: true}); + }, + + @on('didInsertElement') + _initializeAutocomplete(opts) { + var self = this; + var selectedBadges; + + self.$('input').autocomplete({ + allowAny: false, + items: _.isArray(this.get('badgeNames')) ? this.get('badgeNames') : [this.get('badgeNames')], + single: this.get('single'), + updateData: (opts && opts.updateData) ? opts.updateData : false, + onChangeItems: function(items){ + selectedBadges = items; + self.set("badgeNames", items.join(",")); + }, + transformComplete: function(g) { + return g.name; + }, + dataSource: function(term) { + return self.get("badgeFinder")(term).then(function(badges){ + + if(!selectedBadges){ + return badges; + } + + return badges.filter(function(badge){ + return !selectedBadges.any(function(s){return s === badge.name;}); + }); + }); + }, + template: findRawTemplate('badge-selector-autocomplete') + }); + } +}); diff --git a/app/assets/javascripts/discourse/components/basic-topic-list.js.es6 b/app/assets/javascripts/discourse/components/basic-topic-list.js.es6 index 75c4d370c0b..ac358350a91 100644 --- a/app/assets/javascripts/discourse/components/basic-topic-list.js.es6 +++ b/app/assets/javascripts/discourse/components/basic-topic-list.js.es6 @@ -47,12 +47,10 @@ export default Ember.Component.extend({ target = target.find('a'); } - const topic = this.get('topics').findProperty('id', parseInt(topicId)); - this.sendAction('postsAction', {topic, position: target.offset()}); + const topic = this.get('topics').findBy('id', parseInt(topicId)); + this.appEvents.trigger('topic-entrance:show', { topic, position: target.offset() }); } return false; } - } - }); diff --git a/app/assets/javascripts/discourse/components/bread-crumbs.js.es6 b/app/assets/javascripts/discourse/components/bread-crumbs.js.es6 index 6841e8e4569..28a06d70004 100644 --- a/app/assets/javascripts/discourse/components/bread-crumbs.js.es6 +++ b/app/assets/javascripts/discourse/components/bread-crumbs.js.es6 @@ -35,9 +35,4 @@ export default Ember.Component.extend({ }); }.property('firstCategory', 'hideSubcategories'), - render(buffer) { - if (this.get('hidden')) { return; } - this._super(buffer); - } - }); diff --git a/app/assets/javascripts/discourse/components/categories-admin-dropdown.js.es6 b/app/assets/javascripts/discourse/components/categories-admin-dropdown.js.es6 index b2fea03ffdf..8dbb4d34231 100644 --- a/app/assets/javascripts/discourse/components/categories-admin-dropdown.js.es6 +++ b/app/assets/javascripts/discourse/components/categories-admin-dropdown.js.es6 @@ -1,4 +1,4 @@ -import { iconHTML } from 'discourse/helpers/fa-icon'; +import { iconHTML } from 'discourse-common/helpers/fa-icon'; import DropdownButton from 'discourse/components/dropdown-button'; import computed from "ember-addons/ember-computed-decorators"; diff --git a/app/assets/javascripts/discourse/components/categories-and-latest-topics.js.es6 b/app/assets/javascripts/discourse/components/categories-and-latest-topics.js.es6 new file mode 100644 index 00000000000..8da2cf8495d --- /dev/null +++ b/app/assets/javascripts/discourse/components/categories-and-latest-topics.js.es6 @@ -0,0 +1,3 @@ +export default Ember.Component.extend({ + classNames: ["categories-and-latest"] +}); diff --git a/app/assets/javascripts/discourse/components/category-chooser.js.es6 b/app/assets/javascripts/discourse/components/category-chooser.js.es6 index ddc8aad2b0b..ab0c704b59b 100644 --- a/app/assets/javascripts/discourse/components/category-chooser.js.es6 +++ b/app/assets/javascripts/discourse/components/category-chooser.js.es6 @@ -1,4 +1,4 @@ -import ComboboxView from 'discourse/components/combo-box'; +import ComboboxView from 'discourse-common/components/combo-box'; import { categoryBadgeHTML } from 'discourse/helpers/category-link'; import computed from 'ember-addons/ember-computed-decorators'; import { observes, on } from 'ember-addons/ember-computed-decorators'; @@ -38,7 +38,7 @@ export default ComboboxView.extend({ @computed("rootNone") none(rootNone) { - if (Discourse.SiteSettings.allow_uncategorized_topics) { + if (Discourse.SiteSettings.allow_uncategorized_topics || this.get('allowUncategorized')) { if (rootNone) { return "category.none"; } else { diff --git a/app/assets/javascripts/discourse/components/category-group.js.es6 b/app/assets/javascripts/discourse/components/category-group.js.es6 deleted file mode 100644 index 4daca78a652..00000000000 --- a/app/assets/javascripts/discourse/components/category-group.js.es6 +++ /dev/null @@ -1,37 +0,0 @@ -import { categoryBadgeHTML } from 'discourse/helpers/category-link'; -import Category from 'discourse/models/category'; - -export default Ember.Component.extend({ - - _initializeAutocomplete: function() { - const self = this, - template = this.container.lookup('template:category-group-autocomplete.raw'), - regexp = new RegExp(`href=['\"]${Discourse.getURL('/c/')}([^'\"]+)`); - - this.$('input').autocomplete({ - items: this.get('categories'), - single: false, - allowAny: false, - dataSource(term){ - return Category.list().filter(function(category){ - const regex = new RegExp(term, "i"); - return category.get("name").match(regex) && - !_.contains(self.get('blacklist') || [], category) && - !_.contains(self.get('categories'), category) ; - }); - }, - onChangeItems(items) { - const categories = _.map(items, function(link) { - const slug = link.match(regexp)[1]; - return Category.findSingleBySlug(slug); - }); - Em.run.next(() => self.set("categories", categories)); - }, - template, - transformComplete(category) { - return categoryBadgeHTML(category, {allowUncategorized: true}); - } - }); - }.on('didInsertElement') - -}); diff --git a/app/assets/javascripts/discourse/components/category-logo-link.js.es6 b/app/assets/javascripts/discourse/components/category-logo-link.js.es6 deleted file mode 100644 index d9f9ca235ae..00000000000 --- a/app/assets/javascripts/discourse/components/category-logo-link.js.es6 +++ /dev/null @@ -1,12 +0,0 @@ -export default Em.Component.extend({ - tagName: 'a', - attributeBindings: ['href'], - href: function() { - return Discourse.getURL('/c/') + Discourse.Category.slugFor(this.get('category')); - }.property(), - - render(buffer) { - const categoryLogo = this.get('category.logo_url'); - buffer.push(`{{i18n 'admin.web_hooks.instruction'}}
+ {{#load-more selector=".web-hooks tr" action="loadMore"}} ++ +
+ {{conditional-loading-spinner condition=model.loadingMore}} + {{/load-more}} +{{else}} ++ + + + {{#each model as |webHook|}} +{{i18n 'admin.web_hooks.delivery_status.title'}} +{{i18n 'admin.web_hooks.payload_url'}} +{{i18n 'admin.web_hooks.description'}} +{{i18n 'admin.web_hooks.controls'}} ++ + {{/each}} + +{{#link-to 'adminWebHooks.showEvents' webHook.id}}{{admin-web-hook-status deliveryStatuses=deliveryStatuses model=webHook}}{{/link-to}} +{{#link-to 'adminWebHooks.show' webHook}}{{webHook.payload_url}}{{/link-to}} +{{webHook.description}} ++ {{#link-to 'adminWebHooks.show' webHook tagName='button' classNames='btn btn-default no-text'}}{{fa-icon 'edit'}}{{/link-to}} + {{d-button class="destroy btn-danger" action='destroy' actionParam=webHook icon="remove"}} + +{{i18n 'admin.web_hooks.none'}}
+{{/if}} +`); - } -}); \ No newline at end of file diff --git a/app/assets/javascripts/discourse/components/category-selector.js.es6 b/app/assets/javascripts/discourse/components/category-selector.js.es6 new file mode 100644 index 00000000000..9cb3eec14ae --- /dev/null +++ b/app/assets/javascripts/discourse/components/category-selector.js.es6 @@ -0,0 +1,49 @@ +import { categoryBadgeHTML } from 'discourse/helpers/category-link'; +import Category from 'discourse/models/category'; +import { on, observes } from 'ember-addons/ember-computed-decorators'; +import { findRawTemplate } from 'discourse/lib/raw-templates'; + +export default Ember.Component.extend({ + @observes('categories') + _update() { + if (this.get('canReceiveUpdates') === 'true') + this._initializeAutocomplete({updateData: true}); + }, + + @on('didInsertElement') + _initializeAutocomplete(opts) { + const self = this, + regexp = new RegExp(`href=['\"]${Discourse.getURL('/c/')}([^'\"]+)`); + + this.$('input').autocomplete({ + items: this.get('categories'), + single: this.get('single'), + allowAny: false, + updateData: (opts && opts.updateData) ? opts.updateData : false, + dataSource(term) { + return Category.list().filter(category => { + const regex = new RegExp(term, 'i'); + return category.get('name').match(regex) && + !_.contains(self.get('blacklist') || [], category) && + !_.contains(self.get('categories'), category) ; + }); + }, + onChangeItems(items) { + const categories = _.map(items, link => { + const slug = link.match(regexp)[1]; + return Category.findSingleBySlug(slug); + }); + Em.run.next(() => { + let existingCategory = _.isArray(self.get('categories')) ? self.get('categories') : [self.get('categories')]; + const result = _.intersection(existingCategory.map(itm => itm.id), categories.map(itm => itm.id)); + if (result.length !== categories.length || existingCategory.length !== categories.length) + self.set('categories', categories); + }); + }, + template: findRawTemplate('category-selector-autocomplete'), + transformComplete(category) { + return categoryBadgeHTML(category, {allowUncategorized: true}); + } + }); + } +}); diff --git a/app/assets/javascripts/discourse/components/category-title-link.js.es6 b/app/assets/javascripts/discourse/components/category-title-link.js.es6 index bc30157ca6e..7c1c013375b 100644 --- a/app/assets/javascripts/discourse/components/category-title-link.js.es6 +++ b/app/assets/javascripts/discourse/components/category-title-link.js.es6 @@ -1,17 +1,3 @@ -import { iconHTML } from 'discourse/helpers/fa-icon'; - -export default Em.Component.extend({ - tagName: 'h3', - - render(buffer) { - const category = this.get('category'); - const categoryUrl = Discourse.getURL('/c/') + Discourse.Category.slugFor(category); - const categoryName = Handlebars.Utils.escapeExpression(category.get('name')); - - if (category.get('read_restricted')) { buffer.push(iconHTML('lock')); } - - buffer.push(``); - buffer.push(`${categoryName}`); - buffer.push(``); - } +export default Ember.Component.extend({ + tagName: 'h3' }); diff --git a/app/assets/javascripts/discourse/components/check-mark.js.es6 b/app/assets/javascripts/discourse/components/check-mark.js.es6 index a934a490a45..34585e1a0fa 100644 --- a/app/assets/javascripts/discourse/components/check-mark.js.es6 +++ b/app/assets/javascripts/discourse/components/check-mark.js.es6 @@ -7,10 +7,5 @@ export default Ember.Component.extend({ @computed('checked') status(checked) { return checked ? 'status-checked' : 'status-unchecked'; - }, - - render(buffer) { - const icon = this.get('checked') ? 'check' : 'times'; - buffer.push(``); } }); diff --git a/app/assets/javascripts/discourse/components/color-picker-choice.js.es6 b/app/assets/javascripts/discourse/components/color-picker-choice.js.es6 new file mode 100644 index 00000000000..78f444a1c12 --- /dev/null +++ b/app/assets/javascripts/discourse/components/color-picker-choice.js.es6 @@ -0,0 +1,27 @@ +import computed from 'ember-addons/ember-computed-decorators'; + +export default Ember.Component.extend({ + tagName: 'button', + attributeBindings: ['style', 'title'], + classNameBindings: [':colorpicker', 'isUsed:used-color:unused-color'], + + @computed('color', 'usedColors') + isUsed(color, usedColors) { + return (usedColors || []).indexOf(color.toUpperCase()) >= 0; + }, + + @computed('isUsed') + title(isUsed) { + return isUsed ? I18n.t("category.already_used") : null; + }, + + @computed('color') + style(color) { + return `background-color: #${color};`.htmlSafe(); + }, + + click(e) { + e.preventDefault(); + this.sendAction('selectColor', this.get('color')); + } +}); diff --git a/app/assets/javascripts/discourse/components/color-picker.js.es6 b/app/assets/javascripts/discourse/components/color-picker.js.es6 index d1acf7d8114..30c95f9ca21 100644 --- a/app/assets/javascripts/discourse/components/color-picker.js.es6 +++ b/app/assets/javascripts/discourse/components/color-picker.js.es6 @@ -1,30 +1,9 @@ -import DiscourseContainerView from 'discourse/views/container'; - -export default DiscourseContainerView.extend({ +export default Ember.Component.extend({ classNames: 'colors-container', - _createButtons: function() { - var colors = this.get('colors'), - isUsed, usedColors = this.get('usedColors') || []; - - if (!colors) return; - - var self = this; - colors.forEach(function(color) { - isUsed = usedColors.indexOf(color.toUpperCase()) >= 0; - - self.attachViewWithArgs({ - tagName: 'button', - attributeBindings: ['style', 'title'], - classNames: ['colorpicker'].concat( isUsed ? ['used-color'] : ['unused-color'] ), - style: ('background-color: #' + color + ';').htmlSafe(), - title: isUsed ? I18n.t("category.already_used") : null, - click: function() { - self.set("value", color); - return false; - } - }); - - }); - }.on('init') + actions: { + selectColor(color) { + this.set('value', color); + } + } }); diff --git a/app/assets/javascripts/discourse/views/composer.js.es6 b/app/assets/javascripts/discourse/components/composer-body.js.es6 similarity index 78% rename from app/assets/javascripts/discourse/views/composer.js.es6 rename to app/assets/javascripts/discourse/components/composer-body.js.es6 index c3ad0afe7b9..e9e4552a2b4 100644 --- a/app/assets/javascripts/discourse/views/composer.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-body.js.es6 @@ -1,20 +1,19 @@ +import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; +import Composer from 'discourse/models/composer'; import afterTransition from 'discourse/lib/after-transition'; import positioningWorkaround from 'discourse/lib/safari-hacks'; import { headerHeight } from 'discourse/components/site-header'; -import { default as computed, on, observes } from 'ember-addons/ember-computed-decorators'; -import Composer from 'discourse/models/composer'; -const ComposerView = Ember.View.extend({ - _lastKeyTimeout: null, +export default Ember.Component.extend({ elementId: 'reply-control', + classNameBindings: ['composer.creatingPrivateMessage:private-message', 'composeState', 'composer.loading', 'composer.canEditTitle:edit-title', 'composer.createdPost:created-post', - 'composer.creatingTopic:topic'], - - composer: Em.computed.alias('controller.model'), + 'composer.creatingTopic:topic', + 'composer.whisper:composing-whisper'], @computed('composer.composeState') composeState(composeState) { @@ -28,9 +27,11 @@ const ComposerView = Ember.View.extend({ this.appEvents.trigger("composer:resized"); }, - @observes('composeState', 'composer.action') + @observes('composeState', 'composer.action', 'composer.canEditTopicFeaturedLink') resize() { Ember.run.scheduleOnce('afterRender', () => { + if (!this.element || this.isDestroying || this.isDestroyed) { return; } + const h = $('#reply-control').height() || 0; this.movePanels(h + "px"); @@ -50,10 +51,7 @@ const ComposerView = Ember.View.extend({ }, keyUp() { - const controller = this.get('controller'); - controller.checkReplyLength(); - - this.get('composer').typing(); + this.sendAction('typed'); const lastKeyUp = new Date(); this._lastKeyUp = lastKeyUp; @@ -69,18 +67,24 @@ const ComposerView = Ember.View.extend({ keyDown(e) { if (e.which === 27) { - this.get('controller').send('hitEsc'); - this.get('controller').send('hideOptions'); + this.sendAction('cancelled'); return false; } else if (e.which === 13 && (e.ctrlKey || e.metaKey)) { // CTRL+ENTER or CMD+ENTER - this.get('controller').send('save'); + this.sendAction('save'); return false; } }, - @on('didInsertElement') - _enableResizing() { + @observes('composeState') + disableFullscreen() { + if (this.get('composeState') !== Composer.OPEN && positioningWorkaround.blur) { + positioningWorkaround.blur(); + } + }, + + didInsertElement() { + this._super(); const $replyControl = $('#reply-control'); const resize = () => Ember.run(() => this.resize()); @@ -112,9 +116,7 @@ const ComposerView = Ember.View.extend({ }, click() { - this.get('controller').send('openIfDraft'); - } -}); + this.sendAction('openIfDraft'); + }, -RSVP.EventTarget.mixin(ComposerView); -export default ComposerView; +}); diff --git a/app/assets/javascripts/discourse/components/composer-editor.js.es6 b/app/assets/javascripts/discourse/components/composer-editor.js.es6 index c5113a20cf4..a851ae88609 100644 --- a/app/assets/javascripts/discourse/components/composer-editor.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-editor.js.es6 @@ -2,11 +2,11 @@ import userSearch from 'discourse/lib/user-search'; import { default as computed, on } from 'ember-addons/ember-computed-decorators'; import { linkSeenMentions, fetchUnseenMentions } from 'discourse/lib/link-mentions'; import { linkSeenCategoryHashtags, fetchUnseenCategoryHashtags } from 'discourse/lib/link-category-hashtags'; -import { fetchUnseenTagHashtags, linkSeenTagHashtags } from 'discourse/lib/link-tag-hashtag'; +import { linkSeenTagHashtags, fetchUnseenTagHashtags } from 'discourse/lib/link-tag-hashtag'; import { load } from 'pretty-text/oneboxer'; import { ajax } from 'discourse/lib/ajax'; import InputValidation from 'discourse/models/input-validation'; - +import { findRawTemplate } from 'discourse/lib/raw-templates'; import { tinyAvatar, displayErrorForUpload, getUploadMarkdown, @@ -41,22 +41,6 @@ export default Ember.Component.extend({ return showPreview ? I18n.t('composer.hide_preview') : I18n.t('composer.show_preview'); }, - _renderUnseenTagHashtags($preview, unseen) { - fetchUnseenTagHashtags(unseen).then(() => { - linkSeenTagHashtags($preview); - }); - }, - - @on('previewRefreshed') - paintTagHashtags($preview) { - if (!this.siteSettings.tagging_enabled) { return; } - - const unseenTagHashtags = linkSeenTagHashtags($preview); - if (unseenTagHashtags.length) { - Ember.run.debounce(this, this._renderUnseenTagHashtags, $preview, unseenTagHashtags, 500); - } - }, - @computed markdownOptions() { return { @@ -66,7 +50,7 @@ export default Ember.Component.extend({ const posts = topic.get('postStream.posts'); if (posts && topicId === topic.get('id')) { - const quotedPost = posts.findProperty("post_number", postNumber); + const quotedPost = posts.findBy("post_number", postNumber); if (quotedPost) { return tinyAvatar(quotedPost.get('avatar_template')); } @@ -78,10 +62,9 @@ export default Ember.Component.extend({ @on('didInsertElement') _composerEditorInit() { const topicId = this.get('topic.id'); - const template = this.container.lookup('template:user-selector-autocomplete.raw'); const $input = this.$('.d-editor-input'); $input.autocomplete({ - template, + template: findRawTemplate('user-selector-autocomplete'), dataSource: term => userSearch({ term, topicId, includeGroups: true }), key: "@", transformComplete: v => v.username || v.name @@ -152,34 +135,70 @@ export default Ember.Component.extend({ $preview.scrollTop(desired + 50); }, - _renderUnseenMentions: function($preview, unseen) { - fetchUnseenMentions($preview, unseen).then(() => { + _renderUnseenMentions($preview, unseen) { + // 'Create a New Topic' scenario is not supported (per conversation with codinghorror) + // https://meta.discourse.org/t/taking-another-1-7-release-task/51986/7 + fetchUnseenMentions(unseen, this.get('topic.id')).then(() => { linkSeenMentions($preview, this.siteSettings); this._warnMentionedGroups($preview); + this._warnCannotSeeMention($preview); }); }, - _renderUnseenCategoryHashtags: function($preview, unseen) { + _renderUnseenCategoryHashtags($preview, unseen) { fetchUnseenCategoryHashtags(unseen).then(() => { linkSeenCategoryHashtags($preview); }); }, + _renderUnseenTagHashtags($preview, unseen) { + fetchUnseenTagHashtags(unseen).then(() => { + linkSeenTagHashtags($preview); + }); + }, + + _loadOneboxes($oneboxes) { + const post = this.get('composer.post'); + let refresh = false; + + // If we are editing a post, we'll refresh its contents once. + if (post && !post.get('refreshedPost')) { + refresh = true; + post.set('refreshedPost', true); + } + + $oneboxes.each((_, o) => load(o, refresh, ajax, this.currentUser.id)); + }, + _warnMentionedGroups($preview) { Ember.run.scheduleOnce('afterRender', () => { - this._warnedMentions = this._warnedMentions || []; - var found = []; + var found = this.get('warnedGroupMentions') || []; $preview.find('.mention-group.notify').each((idx,e) => { const $e = $(e); var name = $e.data('name'); - found.push(name); - if (this._warnedMentions.indexOf(name) === -1){ - this._warnedMentions.push(name); + if (found.indexOf(name) === -1){ this.sendAction('groupsMentioned', [{name: name, user_count: $e.data('mentionable-user-count')}]); + found.push(name); } }); - this._warnedMentions = found; + this.set('warnedGroupMentions', found); + }); + }, + + _warnCannotSeeMention($preview) { + Ember.run.scheduleOnce('afterRender', () => { + var found = this.get('warnedCannotSeeMentions') || []; + $preview.find('.mention.cannot-see').each((idx,e) => { + const $e = $(e); + var name = $e.data('name'); + if (found.indexOf(name) === -1) { + this.sendAction('cannotSeeMention', [{name: name}]); + found.push(name); + } + }); + + this.set('warnedCannotSeeMentions', found); }); }, @@ -296,7 +315,13 @@ export default Ember.Component.extend({ // Believe it or not pasting an image in Firefox doesn't work without this code _firefoxPastingHack() { const uaMatch = navigator.userAgent.match(/Firefox\/(\d+)\.\d/); - if (uaMatch && parseInt(uaMatch[1]) >= 24) { + if (uaMatch) { + let uaVersion = parseInt(uaMatch[1]); + if (uaVersion < 24 || 50 <= uaVersion) { + // The hack is no longer required in FF 50 and later. + // See: https://bugzilla.mozilla.org/show_bug.cgi?id=906420 + return; + } this.$().append( Ember.$("") ); this.$("textarea").off('keydown.contenteditable'); this.$("textarea").on('keydown.contenteditable', event => { @@ -475,31 +500,34 @@ export default Ember.Component.extend({ previewUpdated($preview) { // Paint mentions - const unseen = linkSeenMentions($preview, this.siteSettings); - if (unseen.length) { - Ember.run.debounce(this, this._renderUnseenMentions, $preview, unseen, 500); + const unseenMentions = linkSeenMentions($preview, this.siteSettings); + if (unseenMentions.length) { + Ember.run.debounce(this, this._renderUnseenMentions, $preview, unseenMentions, 450); } this._warnMentionedGroups($preview); + this._warnCannotSeeMention($preview); // Paint category hashtags - const unseenHashtags = linkSeenCategoryHashtags($preview); - if (unseenHashtags.length) { - Ember.run.debounce(this, this._renderUnseenCategoryHashtags, $preview, unseenHashtags, 500); + const unseenCategoryHashtags = linkSeenCategoryHashtags($preview); + if (unseenCategoryHashtags.length) { + Ember.run.debounce(this, this._renderUnseenCategoryHashtags, $preview, unseenCategoryHashtags, 450); } - const post = this.get('composer.post'); - let refresh = false; - - // If we are editing a post, we'll refresh its contents once. This is a feature that - // allows a user to refresh its contents once. - if (post && !post.get('refreshedPost')) { - refresh = true; - post.set('refreshedPost', true); + // Paint tag hashtags + if (this.siteSettings.tagging_enabled) { + const unseenTagHashtags = linkSeenTagHashtags($preview); + if (unseenTagHashtags.length) { + Ember.run.debounce(this, this._renderUnseenTagHashtags, $preview, unseenTagHashtags, 450); + } } // Paint oneboxes - $('a.onebox', $preview).each((i, e) => load(e, refresh, ajax)); + const $oneboxes = $('a.onebox', $preview); + if ($oneboxes.length > 0 && $oneboxes.length <= this.siteSettings.max_oneboxes_per_post) { + Ember.run.debounce(this, this._loadOneboxes, $oneboxes, 450); + } + this.trigger('previewRefreshed', $preview); this.sendAction('afterRefresh', $preview); }, diff --git a/app/assets/javascripts/discourse/components/composer-message.js.es6 b/app/assets/javascripts/discourse/components/composer-message.js.es6 index 39307dfcccd..7cbdc36b11f 100644 --- a/app/assets/javascripts/discourse/components/composer-message.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-message.js.es6 @@ -1,11 +1,12 @@ import computed from 'ember-addons/ember-computed-decorators'; +import { getOwner } from 'discourse-common/lib/get-owner'; export default Ember.Component.extend({ classNameBindings: [':composer-popup', ':hidden', 'message.extraClass'], @computed('message.templateName') - defaultLayout(templateName) { - return this.container.lookup(`template:composer/${templateName}`); + layout(templateName) { + return getOwner(this).lookup(`template:composer/${templateName}`); }, didInsertElement() { diff --git a/app/assets/javascripts/discourse/components/composer-messages.js.es6 b/app/assets/javascripts/discourse/components/composer-messages.js.es6 index d17a9aa0dde..59b3586dd32 100644 --- a/app/assets/javascripts/discourse/components/composer-messages.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-messages.js.es6 @@ -15,12 +15,12 @@ export default Ember.Component.extend({ didInsertElement() { this._super(); - this.reset(); this.appEvents.on('composer:typed-reply', this, this._typedReply); this.appEvents.on('composer:opened', this, this._findMessages); this.appEvents.on('composer:find-similar', this, this._findSimilar); this.appEvents.on('composer-messages:close', this, this._closeTop); this.appEvents.on('composer-messages:create', this, this._create); + Ember.run.scheduleOnce('afterRender', this, this.reset); }, willDestroyElement() { @@ -87,8 +87,13 @@ export default Ember.Component.extend({ const composer = this.get('composer'); if (composer.get('privateMessage')) { - const usernames = composer.get('targetUsernames').split(','); - if (usernames.length === 1 && usernames[0] === this.currentUser.get('username')) { + let usernames = composer.get('targetUsernames'); + + if (usernames) { + usernames = usernames.split(','); + } + + if (usernames && usernames.length === 1 && usernames[0] === this.currentUser.get('username')) { const message = this._yourselfConfirm || composer.store.createRecord('composer-message', { id: 'yourself_confirm', diff --git a/app/assets/javascripts/discourse/components/composer-title.js.es6 b/app/assets/javascripts/discourse/components/composer-title.js.es6 index 3d806ca0f7d..1a2eb1bea7c 100644 --- a/app/assets/javascripts/discourse/components/composer-title.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-title.js.es6 @@ -1,8 +1,11 @@ -import computed from 'ember-addons/ember-computed-decorators'; +import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; import InputValidation from 'discourse/models/input-validation'; +import { load, lookupCache } from 'pretty-text/oneboxer'; +import { ajax } from 'discourse/lib/ajax'; export default Ember.Component.extend({ classNames: ['title-input'], + watchForLink: Ember.computed.alias('composer.canEditTopicFeaturedLink'), didInsertElement() { this._super(); @@ -26,5 +29,83 @@ export default Ember.Component.extend({ if (reason) { return InputValidation.create({ failed: true, reason, lastShownAt: lastValidatedAt }); } + }, + + @observes('composer.titleLength', 'watchForLink') + _titleChanged() { + if (this.get('composer.titleLength') === 0) { this.set('autoPosted', false); } + if (this.get('autoPosted') || !this.get('watchForLink')) { return; } + + if (Ember.testing) { + this._checkForUrl(); + } else { + Ember.run.debounce(this, this._checkForUrl, 500); + } + }, + + @observes('composer.replyLength') + _clearFeaturedLink() { + if (this.get('watchForLink') && this.get('composer.replyLength') === 0) { + this.set('composer.featuredLink', null); + } + }, + + _checkForUrl() { + if (!this.element || this.isDestroying || this.isDestroyed) { return; } + + if (this.get('isAbsoluteUrl') && (this.get('composer.reply')||"").length === 0) { + // Try to onebox. If success, update post body and title. + this.set('composer.loading', true); + + const link = document.createElement('a'); + link.href = this.get('composer.title'); + + let loadOnebox = load(link, false, ajax, this.currentUser.id, true); + + if (loadOnebox && loadOnebox.then) { + loadOnebox.then( () => { + this._updatePost(lookupCache(this.get('composer.title'))); + }).finally(() => { + this.set('composer.loading', false); + Ember.run.schedule('afterRender', () => { this.$('input').putCursorAtEnd(); }); + }); + } else { + this._updatePost(loadOnebox); + this.set('composer.loading', false); + Ember.run.schedule('afterRender', () => { this.$('input').putCursorAtEnd(); }); + } + } + }, + + _updatePost(html) { + if (html) { + this.set('autoPosted', true); + this.set('composer.featuredLink', this.get('composer.title')); + + const $h = $(html), + heading = $h.find('h3').length > 0 ? $h.find('h3') : $h.find('h4'); + + this.set('composer.reply', this.get('composer.title')); + + if (heading.length > 0 && heading.text().length > 0) { + this.changeTitle(heading.text()); + } else { + const firstTitle = $h.attr('title') || $h.find("[title]").attr("title"); + if (firstTitle && firstTitle.length > 0) { + this.changeTitle(firstTitle); + } + } + } + }, + + changeTitle(val) { + if (val && val.length > 0) { + this.set('composer.title', val.trim()); + } + }, + + @computed('composer.title') + isAbsoluteUrl() { + return this.get('composer.titleLength') > 0 && /^(https?:)?\/\/[\w\.\-]+/i.test(this.get('composer.title')); } }); diff --git a/app/assets/javascripts/discourse/components/conditional-loading-spinner.js.es6 b/app/assets/javascripts/discourse/components/conditional-loading-spinner.js.es6 index 49e2eefca14..c248ea5b959 100644 --- a/app/assets/javascripts/discourse/components/conditional-loading-spinner.js.es6 +++ b/app/assets/javascripts/discourse/components/conditional-loading-spinner.js.es6 @@ -1,19 +1,10 @@ +import computed from 'ember-addons/ember-computed-decorators'; + export default Ember.Component.extend({ classNameBindings: ['containerClass', 'condition:visible'], - containerClass: function() { - return this.get('size') === 'small' ? 'inline-spinner' : undefined; - }.property('size'), - - render: function(buffer) { - if (this.get('condition')) { - buffer.push(''); - } else { - return this._super(buffer); - } - }, - - _conditionChanged: function() { - this.rerender(); - }.observes('condition') + @computed('size') + containerClass(size) { + return size === 'small' ? 'inline-spinner' : undefined; + } }); diff --git a/app/assets/javascripts/discourse/components/connector-container.js.es6 b/app/assets/javascripts/discourse/components/connector-container.js.es6 new file mode 100644 index 00000000000..905ec1058ee --- /dev/null +++ b/app/assets/javascripts/discourse/components/connector-container.js.es6 @@ -0,0 +1 @@ +export default Ember.Component.extend(); diff --git a/app/assets/javascripts/discourse/components/count-i18n.js.es6 b/app/assets/javascripts/discourse/components/count-i18n.js.es6 index 28c908be236..0197b6bb760 100644 --- a/app/assets/javascripts/discourse/components/count-i18n.js.es6 +++ b/app/assets/javascripts/discourse/components/count-i18n.js.es6 @@ -1,8 +1,10 @@ -export default Ember.Component.extend(Discourse.StringBuffer, { +import { bufferedRender } from 'discourse-common/lib/buffered-render'; + +export default Ember.Component.extend(bufferedRender({ tagName: 'span', rerenderTriggers: ['count', 'suffix'], - renderString: function(buffer) { + buildBuffer(buffer) { buffer.push(I18n.t(this.get('key') + (this.get('suffix') || ''), { count: this.get('count') })); } -}); +})); diff --git a/app/assets/javascripts/discourse/components/create-account.js.es6 b/app/assets/javascripts/discourse/components/create-account.js.es6 new file mode 100644 index 00000000000..10328b0c15e --- /dev/null +++ b/app/assets/javascripts/discourse/components/create-account.js.es6 @@ -0,0 +1,25 @@ +export default Ember.Component.extend({ + classNames: ['create-account'], + + didInsertElement() { + this._super(); + + if ($.cookie('email')) { + this.set('email', $.cookie('email')); + } + + this.$().on('keydown.discourse-create-account', e => { + if (!this.get('disabled') && e.keyCode === 13) { + e.preventDefault(); + e.stopPropagation(); + this.sendAction(); + return false; + } + }); + }, + + willDestroyElement() { + this._super(); + this.$().off('keydown.discourse-create-account'); + } +}); diff --git a/app/assets/javascripts/discourse/components/create-topics-notice.js.es6 b/app/assets/javascripts/discourse/components/create-topics-notice.js.es6 index fd4e09bf49a..5a7aaf1a747 100644 --- a/app/assets/javascripts/discourse/components/create-topics-notice.js.es6 +++ b/app/assets/javascripts/discourse/components/create-topics-notice.js.es6 @@ -36,7 +36,10 @@ export default Ember.Component.extend({ @computed() shouldSee() { - return Discourse.User.currentProp('admin') && this.siteSettings.show_create_topics_notice; + const user = this.currentUser; + return user && user.get('admin') && + this.siteSettings.show_create_topics_notice && + !this.site.get('wizard_required'); }, @computed('enabled', 'shouldSee', 'publicTopicCount', 'publicPostCount') diff --git a/app/assets/javascripts/discourse/components/csv-uploader.js.es6 b/app/assets/javascripts/discourse/components/csv-uploader.js.es6 new file mode 100644 index 00000000000..d89aaae30b7 --- /dev/null +++ b/app/assets/javascripts/discourse/components/csv-uploader.js.es6 @@ -0,0 +1,23 @@ +import computed from "ember-addons/ember-computed-decorators"; +import UploadMixin from "discourse/mixins/upload"; + +export default Em.Component.extend(UploadMixin, { + type: "csv", + tagName: "span", + uploadUrl: "/invites/upload_csv", + + @computed("uploading") + uploadButtonText(uploading) { + return uploading ? I18n.t("uploading") : I18n.t("user.invited.bulk_invite.text"); + }, + + @computed("uploading") + uploadButtonDisabled(uploading) { + // https://github.com/emberjs/ember.js/issues/10976#issuecomment-132417731 + return uploading ? true : null; + }, + + uploadDone() { + bootbox.alert(I18n.t("user.invited.bulk_invite.success")); + } +}); diff --git a/app/assets/javascripts/discourse/components/custom-html.js.es6 b/app/assets/javascripts/discourse/components/custom-html.js.es6 new file mode 100644 index 00000000000..c5df7fb51ed --- /dev/null +++ b/app/assets/javascripts/discourse/components/custom-html.js.es6 @@ -0,0 +1,20 @@ +import { getCustomHTML } from 'discourse/helpers/custom-html'; +import { getOwner } from 'discourse-common/lib/get-owner'; + +export default Ember.Component.extend({ + init() { + this._super(); + const name = this.get('name'); + const html = getCustomHTML(name); + + if (html) { + this.set('html', html); + this.set('layoutName', 'components/custom-html-container'); + } else { + const template = getOwner(this).lookup(`template:${name}`); + if (template) { + this.set('layoutName', name); + } + } + } +}); diff --git a/app/assets/javascripts/discourse/components/d-button.js.es6 b/app/assets/javascripts/discourse/components/d-button.js.es6 index 7737a995b27..bd606facafd 100644 --- a/app/assets/javascripts/discourse/components/d-button.js.es6 +++ b/app/assets/javascripts/discourse/components/d-button.js.es6 @@ -1,7 +1,9 @@ -import { iconHTML } from 'discourse/helpers/fa-icon'; -import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; +import { default as computed } from 'ember-addons/ember-computed-decorators'; export default Ember.Component.extend({ + // subclasses need this + layoutName: 'components/d-button', + tagName: 'button', classNameBindings: [':btn', 'noText'], attributeBindings: ['disabled', 'translatedTitle:title'], @@ -18,24 +20,6 @@ export default Ember.Component.extend({ if (label) return I18n.t(label); }, - @observes('icon') - iconChanged() { - this.rerender(); - }, - - render(buffer) { - const label = this.get('translatedLabel'), - icon = this.get('icon'); - - if (label || icon) { - if (icon) { buffer.push(iconHTML(icon) + ' '); } - if (label) { buffer.push(label); } - } else { - // If no label or icon is present, yield - return this._super(buffer); - } - }, - click() { this.sendAction("action", this.get("actionParam")); return false; diff --git a/app/assets/javascripts/discourse/components/d-checkbox.js.es6 b/app/assets/javascripts/discourse/components/d-checkbox.js.es6 index bb15966c4d3..5e50bf98eda 100644 --- a/app/assets/javascripts/discourse/components/d-checkbox.js.es6 +++ b/app/assets/javascripts/discourse/components/d-checkbox.js.es6 @@ -3,16 +3,23 @@ import { on } from "ember-addons/ember-computed-decorators"; export default Ember.Component.extend({ tagName: 'label', - @on('didInsertElement') - _watchChanges() { + didInsertElement() { + this._super(); + + const checked = this.get('checked'); + if (checked && checked !== "false") { + this.$('input').prop('checked', true); + } + // In Ember 13.3 we can use action on the checkbox `{{input}}` but not in 1.11 this.$('input').on('click.d-checkbox', () => { - Ember.run.scheduleOnce('afterRender', () => this.sendAction('change', true)); + Ember.run.scheduleOnce('afterRender', () => this.sendAction('change', this.$('input').prop('checked'))); }); }, @on('willDestroyElement') - _stopWatching() { + willDestroyElement() { + this._super(); this.$('input').off('click.d-checkbox'); } }); diff --git a/app/assets/javascripts/discourse/components/d-editor.js.es6 b/app/assets/javascripts/discourse/components/d-editor.js.es6 index 9fd9e43efa4..d5228324966 100644 --- a/app/assets/javascripts/discourse/components/d-editor.js.es6 +++ b/app/assets/javascripts/discourse/components/d-editor.js.es6 @@ -10,6 +10,10 @@ import { cook } from 'discourse/lib/text'; import { translations } from 'pretty-text/emoji/data'; import { emojiSearch } from 'pretty-text/emoji'; import { emojiUrlFor } from 'discourse/lib/text'; +import { getRegister } from 'discourse-common/lib/get-owner'; +import { findRawTemplate } from 'discourse/lib/raw-templates'; +import { determinePostReplaceSelection } from 'discourse/lib/utilities'; +import deprecated from 'discourse-common/lib/deprecated'; // Our head can be a static string or a function that returns a string // based on input (like for numbered lists). @@ -21,12 +25,19 @@ function getHead(head, prev) { } } +function getButtonLabel(labelKey, defaultLabel) { + // use the Font Awesome icon if the label matches the default + return I18n.t(labelKey) === defaultLabel ? null : labelKey; +} + const OP = { NONE: 0, REMOVED: 1, ADDED: 2 }; +const FOUR_SPACES_INDENT = '4-spaces-indent'; + const _createCallbacks = []; class Toolbar { @@ -44,6 +55,8 @@ class Toolbar { trimLeading: true, id: 'bold', group: 'fontStyles', + icon: 'bold', + label: getButtonLabel('composer.bold_label', 'B'), shortcut: 'B', perform: e => e.applySurround('**', '**', 'bold_text') }); @@ -52,6 +65,8 @@ class Toolbar { trimLeading: true, id: 'italic', group: 'fontStyles', + icon: 'italic', + label: getButtonLabel('composer.italic_label', 'I'), shortcut: 'I', perform: e => e.applySurround('_', '_', 'italic_text') }); @@ -89,7 +104,8 @@ class Toolbar { this.addButton({ id: 'heading', group: 'extras', - icon: 'font', + icon: 'header', + label: getButtonLabel('composer.heading_label', 'H'), shortcut: 'Alt+1', perform: e => e.applyList('## ', 'heading_text') }); @@ -111,7 +127,7 @@ class Toolbar { } addButton(button) { - const g = this.groups.findProperty('group', button.group); + const g = this.groups.findBy('group', button.group); if (!g) { throw `Couldn't find toolbar group ${button.group}`; } @@ -119,7 +135,8 @@ class Toolbar { const createdButton = { id: button.id, className: button.className || button.id, - icon: button.icon || button.id, + label: button.label, + icon: button.label ? null : button.icon || button.id, action: button.action || 'toolbarButton', perform: button.perform || Ember.K, trimLeading: button.trimLeading @@ -169,7 +186,7 @@ export function addToolbarCallback(func) { } export function onToolbarCreate(func) { - console.warn('`onToolbarCreate` is deprecated, use the plugin api instead.'); + deprecated('`onToolbarCreate` is deprecated, use the plugin api instead.'); addToolbarCallback(func); }; @@ -188,18 +205,30 @@ export default Ember.Component.extend({ return null; }, - @on('didInsertElement') - _startUp() { - const container = this.get('container'), - $editorInput = this.$('.d-editor-input'); - - this._applyEmojiAutocomplete(container, $editorInput); - this._applyCategoryHashtagAutocomplete(container, $editorInput); - + _readyNow() { this.set('ready', true); - const mouseTrap = Mousetrap(this.$('.d-editor-input')[0]); + if (this.get('autofocus')) { + this.$('textarea').focus(); + } + }, + init() { + this._super(); + this.register = getRegister(this); + }, + + didInsertElement() { + this._super(); + + const $editorInput = this.$('.d-editor-input'); + + this._applyEmojiAutocomplete($editorInput); + this._applyCategoryHashtagAutocomplete($editorInput); + + Ember.run.scheduleOnce('afterRender', this, this._readyNow); + + const mouseTrap = Mousetrap(this.$('.d-editor-input')[0]); const shortcuts = this.get('toolbar.shortcuts'); Object.keys(shortcuts).forEach(sc => { const button = shortcuts[sc]; @@ -219,7 +248,6 @@ export default Ember.Component.extend({ this.appEvents.on('composer:insert-text', text => this._addText(this._getSelected(), text)); this.appEvents.on('composer:replace-text', (oldVal, newVal) => this._replaceText(oldVal, newVal)); - this._mouseTrap = mouseTrap; }, @@ -254,7 +282,6 @@ export default Ember.Component.extend({ if (this._state !== "inDOM") { return; } const $preview = this.$('.d-editor-preview'); if ($preview.length === 0) return; - this.sendAction('previewUpdated', $preview); }); }, @@ -262,15 +289,20 @@ export default Ember.Component.extend({ @observes('ready', 'value') _watchForChanges() { if (!this.get('ready')) { return; } - Ember.run.debounce(this, this._updatePreview, 30); + + // Debouncing in test mode is complicated + if (Ember.testing) { + this._updatePreview(); + } else { + Ember.run.debounce(this, this._updatePreview, 30); + } }, - _applyCategoryHashtagAutocomplete(container) { - const template = container.lookup('template:category-tag-autocomplete.raw'); + _applyCategoryHashtagAutocomplete() { const siteSettings = this.siteSettings; this.$('.d-editor-input').autocomplete({ - template: template, + template: findRawTemplate('category-tag-autocomplete'), key: '#', transformComplete(obj) { if (obj.model) { @@ -288,14 +320,14 @@ export default Ember.Component.extend({ }); }, - _applyEmojiAutocomplete(container, $editorInput) { + _applyEmojiAutocomplete($editorInput) { if (!this.siteSettings.enable_emoji) { return; } - const template = container.lookup('template:emoji-selector-autocomplete.raw'); + const register = this.register; const self = this; $editorInput.autocomplete({ - template: template, + template: findRawTemplate('emoji-selector-autocomplete'), key: ":", afterComplete(text) { self.set('value', text); @@ -307,7 +339,7 @@ export default Ember.Component.extend({ } else { showSelector({ appendTo: self.$(), - container, + register, onSelect: title => { // Remove the previously type characters when a new emoji is selected from the selector. let selected = self._getSelected(); @@ -351,12 +383,12 @@ export default Ember.Component.extend({ }); }, - _getSelected(trimLeading) { + _getSelected(trimLeading, opts) { if (!this.get('ready')) { return; } const textarea = this.$('textarea.d-editor-input')[0]; const value = textarea.value; - var start = textarea.selectionStart; + let start = textarea.selectionStart; let end = textarea.selectionEnd; // trim trailing spaces cause **test ** would be invalid @@ -375,7 +407,12 @@ export default Ember.Component.extend({ const pre = value.slice(0, start); const post = value.slice(end); - return { start, end, value: selVal, pre, post }; + if (opts && opts.lineVal) { + const lineVal = value.split("\n")[value.substr(0, textarea.selectionStart).split("\n").length - 1]; + return { start, end, value: selVal, pre, post, lineVal }; + } else { + return { start, end, value: selVal, pre, post }; + } }, _selectText(from, length) { @@ -423,7 +460,7 @@ export default Ember.Component.extend({ }).join("\n"); }, - _applySurround(sel, head, tail, exampleKey) { + _applySurround(sel, head, tail, exampleKey, opts) { const pre = sel.pre; const post = sel.post; @@ -435,6 +472,16 @@ export default Ember.Component.extend({ const example = I18n.t(`composer.${exampleKey}`); this.set('value', `${pre}${hval}${example}${tail}${post}`); this._selectText(pre.length + hlen, example.length); + } else if (opts && !opts.multiline) { + const [hval, hlen] = getHead(head); + + if (pre.slice(-hlen) === hval && post.slice(0, tail.length) === tail) { + this.set('value', `${pre.slice(0, -hlen)}${sel.value}${post.slice(tail.length)}`); + this._selectText(sel.start - hlen, sel.value.length); + } else { + this.set('value', `${pre}${hval}${sel.value}${tail}${post}`); + this._selectText(sel.start + hlen, sel.value.length); + } } else { const lines = sel.value.split("\n"); @@ -479,11 +526,27 @@ export default Ember.Component.extend({ _replaceText(oldVal, newVal) { const val = this.get('value'); - const loc = val.indexOf(oldVal); - if (loc !== -1) { - this.set('value', val.replace(oldVal, newVal)); - this._selectText(loc + newVal.length, 0); + const needleStart = val.indexOf(oldVal); + + if (needleStart === -1) { + // Nothing to replace. + return; } + + const textarea = this.$('textarea.d-editor-input')[0]; + + // Determine post-replace selection. + const newSelection = determinePostReplaceSelection({ + selection: { start: textarea.selectionStart, end: textarea.selectionEnd }, + needle: { start: needleStart, end: needleStart + oldVal.length }, + replacement: { start: needleStart, end: needleStart + newVal.length } + }); + + // Replace value (side effect: cursor at the end). + this.set('value', val.replace(oldVal, newVal)); + + // Restore cursor. + this._selectText(newSelection.start, newSelection.end - newSelection.start); }, _addText(sel, text) { @@ -503,9 +566,10 @@ export default Ember.Component.extend({ const toolbarEvent = { selected, selectText: (from, length) => this._selectText(from, length), - applySurround: (head, tail, exampleKey) => this._applySurround(selected, head, tail, exampleKey), + applySurround: (head, tail, exampleKey, opts) => this._applySurround(selected, head, tail, exampleKey, opts), applyList: (head, exampleKey) => this._applyList(selected, head, exampleKey), addText: text => this._addText(selected, text), + replaceText: text => this._addText({pre: '', post: ''}, text), getText: () => this.get('value'), }; @@ -522,15 +586,32 @@ export default Ember.Component.extend({ }, formatCode() { - const sel = this._getSelected(); - if (sel.value.indexOf("\n") !== -1) { - return (this.siteSettings.code_formatting_style === "4-spaces-indent") ? - this._applySurround(sel, ' ', '', 'code_text') : - this._addText(sel, '```\n' + sel.value + '\n```'); + const sel = this._getSelected('', { lineVal: true }); + const selValue = sel.value; + const hasNewLine = selValue.indexOf("\n") !== -1; + const isBlankLine = sel.lineVal.trim().length === 0; + const isFourSpacesIndent = this.siteSettings.code_formatting_style === FOUR_SPACES_INDENT; + + if (!hasNewLine) { + if (selValue.length === 0 && isBlankLine) { + if (isFourSpacesIndent) { + const example = I18n.t(`composer.code_text`); + this.set('value', `${sel.pre} ${example}${sel.post}`); + return this._selectText(sel.pre.length + 4, example.length); + } else { + return this._applySurround(sel, "```\n", "\n```", 'paste_code_text'); + } + } else { + return this._applySurround(sel, '`', '`', 'code_title'); + } } else { - return (this.siteSettings.code_formatting_style === "4-spaces-indent") ? - this._applySurround(sel, '`', '`', 'code_text') : - this._applySurround(sel, '```\n', '\n```', 'paste_code_text'); + if (isFourSpacesIndent) { + return this._applySurround(sel, ' ', '', 'code_text'); + } else { + const preNewline = (sel.pre[-1] !== "\n" && sel.pre !== "") ? "\n" : ""; + const postNewline = sel.post[0] !== "\n" ? "\n" : ""; + return this._addText(sel, `${preNewline}\`\`\`\n${sel.value}\n\`\`\`${postNewline}`); + } } }, @@ -560,7 +641,7 @@ export default Ember.Component.extend({ emoji() { showSelector({ appendTo: this.$(), - container: this.container, + register: this.register, onSelect: title => this._addText(this._getSelected(), `:${title}:`) }); } diff --git a/app/assets/javascripts/discourse/components/d-link.js.es6 b/app/assets/javascripts/discourse/components/d-link.js.es6 deleted file mode 100644 index 54b1486a081..00000000000 --- a/app/assets/javascripts/discourse/components/d-link.js.es6 +++ /dev/null @@ -1,69 +0,0 @@ -import computed from 'ember-addons/ember-computed-decorators'; -import { iconHTML } from 'discourse/helpers/fa-icon'; -import interceptClick from 'discourse/lib/intercept-click'; - -export default Ember.Component.extend({ - tagName: 'a', - classNames: ['d-link'], - attributeBindings: ['translatedTitle:title', 'translatedTitle:aria-title', 'href'], - - @computed('path') - href(path) { - if (path) { return path; } - - const route = this.get('route'); - if (route) { - const router = this.container.lookup('router:main'); - if (router && router.router) { - const params = [route]; - const model = this.get('model'); - if (model) { - params.push(model); - } - - return Discourse.getURL(router.router.generate.apply(router.router, params)); - } - } - - return ''; - }, - - @computed("title") - translatedTitle(title) { - if (title) return I18n.t(title); - }, - - click(e) { - const action = this.get('action'); - if (action) { - this.sendAction('action'); - return false; - } - - return interceptClick(e); - }, - - render(buffer) { - if (!!this.get('template')) { - return this._super(buffer); - } - - const icon = this.get('icon'); - if (icon) { - buffer.push(iconHTML(icon)); - } - - const label = this.get('label'); - if (label) { - if (icon) { buffer.push(" "); } - - if (this.get('translateLabel') === "false") { - buffer.push(label); - } else { - const count = this.get('count'); - buffer.push(I18n.t(label, { count })); - } - } - } - -}); diff --git a/app/assets/javascripts/discourse/components/d-modal-body.js.es6 b/app/assets/javascripts/discourse/components/d-modal-body.js.es6 new file mode 100644 index 00000000000..42c797ddf96 --- /dev/null +++ b/app/assets/javascripts/discourse/components/d-modal-body.js.es6 @@ -0,0 +1,40 @@ +export default Ember.Component.extend({ + classNames: ['modal-body'], + + didInsertElement() { + this._super(); + $('#modal-alert').hide(); + $('#discourse-modal').modal('show'); + Ember.run.scheduleOnce('afterRender', this, this._afterFirstRender); + this.appEvents.on('modal-body:flash', msg => this._flash(msg)); + }, + + willDestroyElement() { + this._super(); + this.appEvents.off('modal-body:flash'); + }, + + _afterFirstRender() { + if (!this.site.mobileView && this.get('autoFocus') !== 'false') { + this.$('input:first').focus(); + } + + const maxHeight = this.get('maxHeight'); + if (maxHeight) { + const maxHeightFloat = parseFloat(maxHeight) / 100.0; + if (maxHeightFloat > 0) { + const viewPortHeight = $(window).height(); + this.$().css("max-height", Math.floor(maxHeightFloat * viewPortHeight) + "px"); + } + } + + this.appEvents.trigger('modal:body-shown', this.getProperties('title', 'rawTitle')); + }, + + _flash(msg) { + $('#modal-alert').hide() + .removeClass('alert-error', 'alert-success') + .addClass(`alert alert-${msg.messageClass || 'success'}`).html(msg.text || '') + .fadeIn(); + }, +}); diff --git a/app/assets/javascripts/discourse/views/modal.js.es6 b/app/assets/javascripts/discourse/components/d-modal.js.es6 similarity index 73% rename from app/assets/javascripts/discourse/views/modal.js.es6 rename to app/assets/javascripts/discourse/components/d-modal.js.es6 index 07f2bbeb148..475c79d0495 100644 --- a/app/assets/javascripts/discourse/views/modal.js.es6 +++ b/app/assets/javascripts/discourse/components/d-modal.js.es6 @@ -1,9 +1,8 @@ import { on } from "ember-addons/ember-computed-decorators"; -export default Ember.View.extend({ +export default Ember.Component.extend({ elementId: 'discourse-modal', - templateName: 'modal/modal', - classNameBindings: [':modal', ':hidden', 'controller.modalClass'], + classNameBindings: [':modal', ':hidden', 'modalClass'], attributeBindings: ['data-keyboard'], // We handle ESC ourselves @@ -16,6 +15,14 @@ export default Ember.View.extend({ Em.run.next(() => $('.modal-header a.close').click()); } }); + + this.appEvents.on('modal:body-shown', data => { + if (data.title) { + this.set('title', I18n.t(data.title)); + } else if (data.rawTitle) { + this.set('title', data.rawTitle); + } + }); }, @on("willDestroyElement") diff --git a/app/assets/javascripts/discourse/components/d-section.js.es6 b/app/assets/javascripts/discourse/components/d-section.js.es6 new file mode 100644 index 00000000000..41e044f95eb --- /dev/null +++ b/app/assets/javascripts/discourse/components/d-section.js.es6 @@ -0,0 +1,39 @@ +import { scrollTop } from 'discourse/mixins/scroll-top'; + +// Can add a body class from within a component, also will scroll to the top automatically. +export default Ember.Component.extend({ + tagName: 'section', + + didInsertElement() { + this._super(); + + const pageClass = this.get('pageClass'); + if (pageClass) { + $('body').addClass(`${pageClass}-page`); + } + + const bodyClass = this.get('bodyClass'); + if (bodyClass) { + $('body').addClass(bodyClass); + } + + if (this.get('scrollTop') === "false") { + return; + } + + scrollTop(); + }, + + willDestroyElement() { + this._super(); + const pageClass = this.get('pageClass'); + if (pageClass) { + $('body').removeClass(`${pageClass}-page`); + } + + const bodyClass = this.get('bodyClass'); + if (bodyClass) { + $('body').removeClass(bodyClass); + } + } +}); diff --git a/app/assets/javascripts/discourse/components/directory-toggle.js.es6 b/app/assets/javascripts/discourse/components/directory-toggle.js.es6 index f0e0192e178..3f55ec0543a 100644 --- a/app/assets/javascripts/discourse/components/directory-toggle.js.es6 +++ b/app/assets/javascripts/discourse/components/directory-toggle.js.es6 @@ -1,7 +1,7 @@ -import StringBuffer from 'discourse/mixins/string-buffer'; -import { iconHTML } from 'discourse/helpers/fa-icon'; +import { iconHTML } from 'discourse-common/helpers/fa-icon'; +import { bufferedRender } from 'discourse-common/lib/buffered-render'; -export default Ember.Component.extend(StringBuffer, { +export default Ember.Component.extend(bufferedRender({ tagName: 'th', classNames: ['sortable'], attributeBindings: ['title'], @@ -12,8 +12,7 @@ export default Ember.Component.extend(StringBuffer, { return I18n.t(labelKey + '_long', { defaultValue: I18n.t(labelKey) }); }.property('field'), - renderString(buffer) { - + buildBuffer(buffer) { const icon = this.get('icon'); if (icon) { buffer.push(iconHTML(icon)); @@ -37,4 +36,4 @@ export default Ember.Component.extend(StringBuffer, { this.setProperties({ order: field, asc: null }); } } -}); +})); diff --git a/app/assets/javascripts/discourse/components/discourse-banner.js.es6 b/app/assets/javascripts/discourse/components/discourse-banner.js.es6 index 56374168e6c..40db3dce8ae 100644 --- a/app/assets/javascripts/discourse/components/discourse-banner.js.es6 +++ b/app/assets/javascripts/discourse/components/discourse-banner.js.es6 @@ -1,6 +1,4 @@ -import VisibleComponent from "discourse/components/visible"; - -export default VisibleComponent.extend({ +export default Ember.Component.extend({ visible: function () { var bannerKey = this.get("banner.key"), @@ -14,7 +12,7 @@ export default VisibleComponent.extend({ }.property("user.dismissed_banner_key", "banner.key", "hide"), actions: { - dismiss: function () { + dismiss() { if (this.get("user")) { this.get("user").dismissBanner(this.get("banner.key")); } else { diff --git a/app/assets/javascripts/discourse/views/topic.js.es6 b/app/assets/javascripts/discourse/components/discourse-topic.js.es6 similarity index 68% rename from app/assets/javascripts/discourse/views/topic.js.es6 rename to app/assets/javascripts/discourse/components/discourse-topic.js.es6 index d90420db520..17f40f3928b 100644 --- a/app/assets/javascripts/discourse/views/topic.js.es6 +++ b/app/assets/javascripts/discourse/components/discourse-topic.js.es6 @@ -1,15 +1,19 @@ -import AddCategoryClass from 'discourse/mixins/add-category-class'; import AddArchetypeClass from 'discourse/mixins/add-archetype-class'; import ClickTrack from 'discourse/lib/click-track'; import Scrolling from 'discourse/mixins/scrolling'; import { selectedText } from 'discourse/lib/utilities'; +import { observes } from 'ember-addons/ember-computed-decorators'; -const TopicView = Ember.View.extend(AddCategoryClass, AddArchetypeClass, Scrolling, { - templateName: 'topic', - topic: Ember.computed.alias('controller.model'), +function highlight(postNumber) { + const $contents = $(`#post_${postNumber} .topic-body`); + $contents.addClass('highlighted'); + $contents.on('animationend', () => $contents.removeClass('highlighted')); +} + +export default Ember.Component.extend(AddArchetypeClass, Scrolling, { userFilters: Ember.computed.alias('topic.userFilters'), - classNameBindings: ['controller.multiSelect:multi-select', + classNameBindings: ['multiSelect', 'topic.archetype', 'topic.is_warning', 'topic.category.read_restricted:read_restricted', @@ -18,31 +22,26 @@ const TopicView = Ember.View.extend(AddCategoryClass, AddArchetypeClass, Scrolli menuVisible: true, SHORT_POST: 1200, - categoryFullSlug: Em.computed.alias('topic.category.fullSlug'), - postStream: Em.computed.alias('topic.postStream'), - archetype: Em.computed.alias('topic.archetype'), + postStream: Ember.computed.alias('topic.postStream'), + archetype: Ember.computed.alias('topic.archetype'), _lastShowTopic: null, - _composeChanged: function() { - const composerController = Discourse.get('router.composerController'); - composerController.clearState(); - composerController.set('topic', this.get('topic')); - }.observes('composer'), - - _enteredTopic: function() { + @observes('enteredAt') + _enteredTopic() { // Ember is supposed to only call observers when values change but something // in our view set up is firing this observer with the same value. This check // prevents scrolled from being called twice. - const enteredAt = this.get('controller.enteredAt'); + const enteredAt = this.get('enteredAt'); if (enteredAt && (this.get('lastEnteredAt') !== enteredAt)) { this._lastShowTopic = null; this.scrolled(); this.set('lastEnteredAt', enteredAt); } - }.observes('controller.enteredAt'), + }, - _inserted: function() { + didInsertElement() { + this._super(); this.bindScrolling({name: 'topic-view'}); $(window).on('resize.discourse-on-scroll', () => this.scrolled()); @@ -65,10 +64,10 @@ const TopicView = Ember.View.extend(AddCategoryClass, AddArchetypeClass, Scrolli this.appEvents.on('post:highlight', postNumber => { Ember.run.scheduleOnce('afterRender', null, highlight, postNumber); }); - }.on('didInsertElement'), + }, - // This view is being removed. Shut down operations - _destroyed: function() { + willDestroyElement() { + this._super(); this.unbindScrolling('topic-view'); $(window).unbind('resize.discourse-on-scroll'); @@ -81,20 +80,18 @@ const TopicView = Ember.View.extend(AddCategoryClass, AddArchetypeClass, Scrolli this.appEvents.trigger('header:hide-topic'); this.appEvents.off('post:highlight'); - }.on('willDestroyElement'), + }, - gotFocus: function() { + @observes('Discourse.hasFocus') + gotFocus() { if (Discourse.get('hasFocus')){ this.scrolled(); } - }.observes("Discourse.hasFocus"), - - resetExamineDockCache: function() { - this.set('docAt', false); }, - offset: 0, - hasScrolled: Em.computed.gt("offset", 0), + resetExamineDockCache() { + this.set('docAt', false); + }, showTopicInHeader(topic, offset) { if (this.get('docAt')) { @@ -118,7 +115,7 @@ const TopicView = Ember.View.extend(AddCategoryClass, AddArchetypeClass, Scrolli } } - this.set("offset", offset); + this.set('hasScrolled', offset > 0); const topic = this.get('topic'); const showTopic = this.showTopicInHeader(topic, offset); @@ -136,18 +133,3 @@ const TopicView = Ember.View.extend(AddCategoryClass, AddArchetypeClass, Scrolli this.appEvents.trigger('topic:scrolled', offset); } }); - -function highlight(postNumber) { - const $contents = $(`#post_${postNumber} .topic-body`), - origColor = $contents.data('orig-color') || $contents.css('backgroundColor'); - - $contents.data("orig-color", origColor) - .addClass('highlighted') - .stop() - .animate({ backgroundColor: origColor }, 2500, 'swing', function() { - $contents.removeClass('highlighted'); - $contents.css({'background-color': ''}); - }); -} - -export default TopicView; diff --git a/app/assets/javascripts/discourse/components/dropdown-button.js.es6 b/app/assets/javascripts/discourse/components/dropdown-button.js.es6 index 0037ec17f2a..032c80e2aff 100644 --- a/app/assets/javascripts/discourse/components/dropdown-button.js.es6 +++ b/app/assets/javascripts/discourse/components/dropdown-button.js.es6 @@ -1,6 +1,6 @@ -import StringBuffer from 'discourse/mixins/string-buffer'; +import { bufferedRender } from 'discourse-common/lib/buffered-render'; -export default Ember.Component.extend(StringBuffer, { +export default Ember.Component.extend(bufferedRender({ classNameBindings: [':btn-group', 'hidden'], rerenderTriggers: ['text', 'longDescription'], @@ -23,7 +23,7 @@ export default Ember.Component.extend(StringBuffer, { this.$().off('click.dropdown-button', 'ul li'); }.on('willDestroyElement'), - renderString(buffer) { + buildBuffer(buffer) { const title = this.get('title'); if (title) { buffer.push("
" + title + "
"); @@ -56,4 +56,4 @@ export default Ember.Component.extend(StringBuffer, { buffer.push(""); } } -}); +})); diff --git a/app/assets/javascripts/discourse/components/edit-category-images.js.es6 b/app/assets/javascripts/discourse/components/edit-category-images.js.es6 index 885ee5835b2..2aae9d52fff 100644 --- a/app/assets/javascripts/discourse/components/edit-category-images.js.es6 +++ b/app/assets/javascripts/discourse/components/edit-category-images.js.es6 @@ -1,2 +1,40 @@ import { buildCategoryPanel } from 'discourse/components/edit-category-panel'; -export default buildCategoryPanel('images'); +import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; + +export default buildCategoryPanel('images').extend({ + @computed('category.uploaded_background.url') + backgroundImageUrl(uploadedBackgroundUrl) { + return uploadedBackgroundUrl || ''; + }, + + @computed('category.uploaded_background.id') + backgroundImageId(uploadedBackgroundId) { + return uploadedBackgroundId || null; + }, + + @computed('category.uploaded_logo.url') + logoImageUrl(uploadedLogoUrl) { + return uploadedLogoUrl || ''; + }, + + @computed('category.uploaded_logo.id') + logoImageId(uploadedLogoId) { + return uploadedLogoId || null; + }, + + @observes("backgroundImageUrl", "backgroundImageId") + _setBackgroundUpload() { + this.set("category.uploaded_background", Ember.Object.create({ + id: this.get('backgroundImageId'), + url: this.get('backgroundImageUrl') + })); + }, + + @observes("logoImageUrl", "logoImageId") + _setLogoUpload() { + this.set("category.uploaded_logo", Ember.Object.create({ + id: this.get('logoImageId'), + url: this.get('logoImageUrl') + })); + } +}); diff --git a/app/assets/javascripts/discourse/components/edit-category-settings.js.es6 b/app/assets/javascripts/discourse/components/edit-category-settings.js.es6 index 049157609e3..41a4d2b20f5 100644 --- a/app/assets/javascripts/discourse/components/edit-category-settings.js.es6 +++ b/app/assets/javascripts/discourse/components/edit-category-settings.js.es6 @@ -1,7 +1,25 @@ import { setting } from 'discourse/lib/computed'; import { buildCategoryPanel } from 'discourse/components/edit-category-panel'; +import computed from "ember-addons/ember-computed-decorators"; export default buildCategoryPanel('settings', { emailInEnabled: setting('email_in'), showPositionInput: setting('fixed_category_positions'), + + isDefaultSortOrder: Em.computed.empty('category.sort_order'), + + @computed + availableSorts() { + return ['likes', 'op_likes', 'views', 'posts', 'activity', 'posters', 'category', 'created'] + .map(s => ({ name: I18n.t('category.sort_options.' + s), value: s })) + .sort((a,b) => { return a.name > b.name; }); + }, + + @computed + sortAscendingOptions() { + return [ + {name: I18n.t('category.sort_ascending'), value: 'true'}, + {name: I18n.t('category.sort_descending'), value: 'false'} + ]; + } }); diff --git a/app/assets/javascripts/discourse/components/edit-category-tab.js.es6 b/app/assets/javascripts/discourse/components/edit-category-tab.js.es6 index 9e470660675..556e072ea15 100644 --- a/app/assets/javascripts/discourse/components/edit-category-tab.js.es6 +++ b/app/assets/javascripts/discourse/components/edit-category-tab.js.es6 @@ -14,9 +14,14 @@ export default Em.Component.extend({ return I18n.t('category.' + this.get('tab').replace('-', '_')); }.property('tab'), + didInsertElement() { + this._super(); + Ember.run.scheduleOnce('afterRender', this, this._addToCollection); + }, + _addToCollection: function() { this.get('panels').addObject(this.get('tabClassName')); - }.on('didInsertElement'), + }, actions: { select: function() { diff --git a/app/assets/javascripts/discourse/components/emoji-uploader.js.es6 b/app/assets/javascripts/discourse/components/emoji-uploader.js.es6 index b43bea04103..0afeb1a239c 100644 --- a/app/assets/javascripts/discourse/components/emoji-uploader.js.es6 +++ b/app/assets/javascripts/discourse/components/emoji-uploader.js.es6 @@ -11,6 +11,10 @@ export default Em.Component.extend(UploadMixin, { return Ember.isBlank(this.get("name")) ? {} : { name: this.get("name") }; }.property("name"), + validateUploadedFilesOptions() { + return { imagesOnly: true }; + }, + uploadDone(upload) { this.set("name", null); this.sendAction("done", upload); diff --git a/app/assets/javascripts/discourse/components/featured-topic.js.es6 b/app/assets/javascripts/discourse/components/featured-topic.js.es6 index def196f7a1d..f000172e6a5 100644 --- a/app/assets/javascripts/discourse/components/featured-topic.js.es6 +++ b/app/assets/javascripts/discourse/components/featured-topic.js.es6 @@ -4,7 +4,7 @@ export default Ember.Component.extend({ click(e) { const $target = $(e.target); if ($target.closest('.last-posted-at').length) { - this.sendAction('action', {topic: this.get('topic'), position: $target.offset()}); + this.appEvents.trigger('topic-entrance:show', {topic: this.get('topic'), position: $target.offset()}); return false; } } diff --git a/app/assets/javascripts/discourse/components/flag-action-type.js.es6 b/app/assets/javascripts/discourse/components/flag-action-type.js.es6 index 031831219c3..377f2129c97 100644 --- a/app/assets/javascripts/discourse/components/flag-action-type.js.es6 +++ b/app/assets/javascripts/discourse/components/flag-action-type.js.es6 @@ -36,12 +36,12 @@ export default Ember.Component.extend({ const len = messageLength || 0; const minLen = Discourse.SiteSettings.min_private_message_post_length; if (len === 0) { - return I18n.t("flagging.custom_message.at_least", { n: minLen }); + return I18n.t("flagging.custom_message.at_least", { count: minLen }); } else if (len < minLen) { - return I18n.t("flagging.custom_message.more", { n: minLen - len }); + return I18n.t("flagging.custom_message.more", { count: minLen - len }); } else { return I18n.t("flagging.custom_message.left", { - n: MAX_MESSAGE_LENGTH - len + count: MAX_MESSAGE_LENGTH - len }); } }, diff --git a/app/assets/javascripts/discourse/components/flag-selection.js.es6 b/app/assets/javascripts/discourse/components/flag-selection.js.es6 new file mode 100644 index 00000000000..b738e2c169d --- /dev/null +++ b/app/assets/javascripts/discourse/components/flag-selection.js.es6 @@ -0,0 +1,18 @@ +import { observes } from 'ember-addons/ember-computed-decorators'; + +// Mostly hacks because `flag.hbs` didn't use `radio-button` +export default Ember.Component.extend({ + _selectRadio() { + this.$("input[type='radio']").prop('checked', false); + + const nameKey = this.get('nameKey'); + if (!nameKey) { return; } + + this.$('#radio_' + nameKey).prop('checked', 'true'); + }, + + @observes('nameKey') + selectedChanged() { + Ember.run.next(this, this._selectRadio); + } +}); diff --git a/app/assets/javascripts/discourse/components/generated-invite-link.js.es6 b/app/assets/javascripts/discourse/components/generated-invite-link.js.es6 new file mode 100644 index 00000000000..be1c34fb3d2 --- /dev/null +++ b/app/assets/javascripts/discourse/components/generated-invite-link.js.es6 @@ -0,0 +1,6 @@ +export default Ember.Component.extend({ + didInsertElement() { + this._super(); + this.$('input').select().focus(); + } +}); diff --git a/app/assets/javascripts/discourse/components/global-notice.js.es6 b/app/assets/javascripts/discourse/components/global-notice.js.es6 index 13994f28fbf..d3ae4235484 100644 --- a/app/assets/javascripts/discourse/components/global-notice.js.es6 +++ b/app/assets/javascripts/discourse/components/global-notice.js.es6 @@ -1,14 +1,18 @@ import { on } from 'ember-addons/ember-computed-decorators'; -import StringBuffer from 'discourse/mixins/string-buffer'; -import { iconHTML } from 'discourse/helpers/fa-icon'; +import { iconHTML } from 'discourse-common/helpers/fa-icon'; import LogsNotice from 'discourse/services/logs-notice'; +import { bufferedRender } from 'discourse-common/lib/buffered-render'; -export default Ember.Component.extend(StringBuffer, { +export default Ember.Component.extend(bufferedRender({ rerenderTriggers: ['site.isReadOnly'], - renderString: function(buffer) { + buildBuffer(buffer) { let notices = []; + if (this.session.get('safe_mode')) { + notices.push([I18n.t("safe_mode.enabled"), 'safe-mode']); + } + if (this.site.get("isReadOnly")) { notices.push([I18n.t("read_only_mode.enabled"), 'alert-read-only']); } @@ -17,6 +21,11 @@ export default Ember.Component.extend(StringBuffer, { notices.push([I18n.t("emails_are_disabled"), 'alert-emails-disabled']); } + if (this.site.get('wizard_required')) { + const requiredText = I18n.t('wizard_required', {url: Discourse.getURL('/wizard')}); + notices.push([requiredText, 'alert-wizard']); + } + if (this.currentUser && this.currentUser.get('staff') && this.siteSettings.bootstrap_mode_enabled) { if (this.siteSettings.bootstrap_mode_min_users > 0) { notices.push([I18n.t("bootstrap_mode_enabled", {min_users: this.siteSettings.bootstrap_mode_min_users}), 'alert-bootstrap-mode']); @@ -46,7 +55,7 @@ export default Ember.Component.extend(StringBuffer, { @on('didInsertElement') _setupLogsNotice() { LogsNotice.current().addObserver('hidden', () => { - this.rerenderString(); + this.rerenderBuffer(); }); this.$().on('click.global-notice', '.alert-logs-notice .close', () => { @@ -58,4 +67,4 @@ export default Ember.Component.extend(StringBuffer, { _teardownLogsNotice() { this.$().off('click.global-notice'); } -}); +})); diff --git a/app/assets/javascripts/discourse/components/group-flair-inputs.js.es6 b/app/assets/javascripts/discourse/components/group-flair-inputs.js.es6 new file mode 100644 index 00000000000..ce4113450b3 --- /dev/null +++ b/app/assets/javascripts/discourse/components/group-flair-inputs.js.es6 @@ -0,0 +1,50 @@ +import computed from 'ember-addons/ember-computed-decorators'; +import { escapeExpression } from 'discourse/lib/utilities'; + +export default Ember.Component.extend({ + + classNames: ['group-flair-inputs'], + + @computed + demoAvatarUrl() { + return Discourse.getURL('/images/avatar.png'); + }, + + @computed('model.flair_url') + flairPreviewIcon(flairURL) { + return flairURL && flairURL.substr(0,3) === 'fa-'; + }, + + @computed('model.flair_url', 'flairPreviewIcon') + flairPreviewImage(flairURL, flairPreviewIcon) { + return flairURL && !flairPreviewIcon; + }, + + @computed('model.flair_url', 'flairPreviewImage', 'model.flairBackgroundHexColor', 'model.flairHexColor') + flairPreviewStyle(flairURL, flairPreviewImage, flairBackgroundHexColor, flairHexColor) { + let style = ''; + + if (flairPreviewImage) { + style += `background-image: url(${escapeExpression(flairURL)});`; + } + + if (flairBackgroundHexColor) { + style += `background-color: #${flairBackgroundHexColor};`; + } + + if (flairHexColor) style += `color: #${flairHexColor};`; + + return style; + }, + + @computed('model.flairBackgroundHexColor') + flairPreviewClasses(flairBackgroundHexColor) { + if (flairBackgroundHexColor) return 'rounded'; + }, + + @computed('flairPreviewImage') + flairPreviewLabel(flairPreviewImage) { + const key = flairPreviewImage ? 'image' : 'icon'; + return I18n.t(`groups.flair_preview_${key}`); + } +}); diff --git a/app/assets/javascripts/discourse/components/group-index-toggle.js.es6 b/app/assets/javascripts/discourse/components/group-index-toggle.js.es6 new file mode 100644 index 00000000000..fb7c9d24c50 --- /dev/null +++ b/app/assets/javascripts/discourse/components/group-index-toggle.js.es6 @@ -0,0 +1,24 @@ +import { iconHTML } from 'discourse-common/helpers/fa-icon'; +import { bufferedRender } from 'discourse-common/lib/buffered-render'; + +export default Ember.Component.extend(bufferedRender({ + tagName: 'th', + classNames: ['sortable'], + rerenderTriggers: ['order', 'desc'], + + buildBuffer(buffer) { + buffer.push(I18n.t(this.get('i18nKey'))); + + if (this.get('field') === this.get('order')) { + buffer.push(iconHTML(this.get('desc') ? 'chevron-down' : 'chevron-up')); + } + }, + + click() { + if (this.get('order') === this.field) { + this.set('desc', this.get('desc') ? null : true); + } else { + this.setProperties({ order: this.field, desc: null }); + } + } +})); diff --git a/app/assets/javascripts/discourse/components/group-logs-filter.js.es6 b/app/assets/javascripts/discourse/components/group-logs-filter.js.es6 new file mode 100644 index 00000000000..ba4ccc3f742 --- /dev/null +++ b/app/assets/javascripts/discourse/components/group-logs-filter.js.es6 @@ -0,0 +1,21 @@ +import computed from 'ember-addons/ember-computed-decorators'; + +export default Ember.Component.extend({ + tagName: '', + + @computed('type') + label(type) { + return I18n.t(`groups.logs.${type}`); + }, + + @computed('value', 'type') + filterText(value, type) { + return type === 'action' ? I18n.t(`group_histories.actions.${value}`) : value; + }, + + actions: { + clearFilter(param) { + this.sendAction("clearFilter", param); + } + } +}); diff --git a/app/assets/javascripts/discourse/components/group-logs-row.js.es6 b/app/assets/javascripts/discourse/components/group-logs-row.js.es6 new file mode 100644 index 00000000000..5b46af4d61d --- /dev/null +++ b/app/assets/javascripts/discourse/components/group-logs-row.js.es6 @@ -0,0 +1,14 @@ +export default Ember.Component.extend({ + tagName: '', + expandDetails: false, + + actions: { + toggleDetails() { + this.toggleProperty('expandDetails'); + }, + + filter(params) { + this.set(`filters.${params.key}`, params.value); + } + } +}); diff --git a/app/assets/javascripts/admin/components/group-member.js.es6 b/app/assets/javascripts/discourse/components/group-member.js.es6 similarity index 100% rename from app/assets/javascripts/admin/components/group-member.js.es6 rename to app/assets/javascripts/discourse/components/group-member.js.es6 diff --git a/app/assets/javascripts/discourse/components/group-members-input.js.es6 b/app/assets/javascripts/discourse/components/group-members-input.js.es6 new file mode 100644 index 00000000000..1fb45f27bf6 --- /dev/null +++ b/app/assets/javascripts/discourse/components/group-members-input.js.es6 @@ -0,0 +1,69 @@ +import computed from 'ember-addons/ember-computed-decorators'; +import { popupAjaxError } from 'discourse/lib/ajax-error'; +import { propertyEqual } from 'discourse/lib/computed'; + +export default Ember.Component.extend({ + classNames: ["group-members-input"], + + @computed('model.limit', 'model.offset', 'model.user_count') + currentPage(limit, offset, userCount) { + if (userCount === 0) { return 0; } + + return Math.floor(offset / limit) + 1; + }, + + @computed('model.limit', 'model.user_count') + totalPages(limit, userCount) { + if (userCount === 0) { return 0; } + return Math.floor(userCount / limit) + 1; + }, + + @computed('model.usernames') + disableAddButton(usernames) { + return !usernames || !(usernames.length > 0); + }, + + showingFirst: Em.computed.lte("currentPage", 1), + showingLast: propertyEqual("currentPage", "totalPages"), + + actions: { + next() { + if (this.get("showingLast")) { return; } + + const group = this.get("model"); + const offset = Math.min(group.get("offset") + group.get("limit"), group.get("user_count")); + group.set("offset", offset); + + return group.findMembers(); + }, + + previous() { + if (this.get("showingFirst")) { return; } + + const group = this.get("model"); + const offset = Math.max(group.get("offset") - group.get("limit"), 0); + group.set("offset", offset); + + return group.findMembers(); + }, + + addMembers() { + if (Em.isEmpty(this.get("model.usernames"))) { return; } + this.get("model").addMembers(this.get("model.usernames")).catch(popupAjaxError); + this.set("model.usernames", null); + }, + + removeMember(member) { + const message = I18n.t("groups.edit.delete_member_confirm",{ + username: member.get("username"), + group: this.get("model.name") + }); + + return bootbox.confirm(message, I18n.t("no_value"), I18n.t("yes_value"), confirm => { + if (confirm) { + this.get("model").removeMember(member); + } + }); + } + } +}); diff --git a/app/assets/javascripts/discourse/components/group-membership-button.js.es6 b/app/assets/javascripts/discourse/components/group-membership-button.js.es6 new file mode 100644 index 00000000000..dba83c69dc2 --- /dev/null +++ b/app/assets/javascripts/discourse/components/group-membership-button.js.es6 @@ -0,0 +1,73 @@ +import { default as computed } from 'ember-addons/ember-computed-decorators'; +import { popupAjaxError } from 'discourse/lib/ajax-error'; +import Group from 'discourse/models/group'; + +export default Ember.Component.extend({ + @computed("model.public") + canJoinGroup(publicGroup) { + return publicGroup; + }, + + @computed('model.allow_membership_requests', 'model.alias_level') + canRequestMembership(allowMembershipRequests, aliasLevel) { + return allowMembershipRequests && aliasLevel === 99; + }, + + @computed("model.is_group_user", "model.id", "groupUserIds") + userIsGroupUser(isGroupUser, groupId, groupUserIds) { + if (isGroupUser) { + return isGroupUser; + } else { + return !!groupUserIds && groupUserIds.includes(groupId); + } + }, + + @computed + joinGroupAction() { + return this.currentUser ? 'joinGroup' : 'showLogin'; + }, + + @computed + requestMembershipAction() { + return this.currentUser ? 'requestMembership' : 'showLogin'; + }, + + actions: { + showLogin() { + this.sendAction('showLogin'); + }, + + joinGroup() { + this.set('updatingMembership', true); + const model = this.get('model'); + + model.addMembers(this.currentUser.get('username')).then(() => { + model.set('is_group_user', true); + }).catch(popupAjaxError).finally(() => { + this.set('updatingMembership', false); + }); + }, + + leaveGroup() { + this.set('updatingMembership', true); + const model = this.get('model'); + + model.removeMember(this.currentUser).then(() => { + model.set('is_group_user', false); + }).catch(popupAjaxError).finally(() => { + this.set('updatingMembership', false); + }); + }, + + requestMembership() { + const groupName = this.get('model.name'); + + Group.loadOwners(groupName).then(result => { + const names = result.map(owner => owner.username).join(","); + const title = I18n.t('groups.request_membership_pm.title'); + const body = I18n.t('groups.request_membership_pm.body', { groupName }); + this.sendAction("createNewMessageViaParams", names, title, body); + }); + } + } +}); diff --git a/app/assets/javascripts/discourse/components/group-notifications-button.js.es6 b/app/assets/javascripts/discourse/components/group-notifications-button.js.es6 index 6010cf02a25..8f70ca102a3 100644 --- a/app/assets/javascripts/discourse/components/group-notifications-button.js.es6 +++ b/app/assets/javascripts/discourse/components/group-notifications-button.js.es6 @@ -2,7 +2,7 @@ import NotificationsButton from 'discourse/components/notifications-button'; export default NotificationsButton.extend({ classNames: ['notification-options', 'group-notification-menu'], - notificationLevel: Em.computed.alias('group.notification_level'), + notificationLevel: Em.computed.alias('group.group_user.notification_level'), i18nPrefix: 'groups.notifications', clicked(id) { diff --git a/app/assets/javascripts/discourse/components/group-selector.js.es6 b/app/assets/javascripts/discourse/components/group-selector.js.es6 index dc23f0f1e41..4beb5a3a932 100644 --- a/app/assets/javascripts/discourse/components/group-selector.js.es6 +++ b/app/assets/javascripts/discourse/components/group-selector.js.es6 @@ -1,15 +1,29 @@ -export default Ember.Component.extend({ - placeholder: function(){ - return I18n.t(this.get("placeholderKey")); - }.property("placeholderKey"), +import { on, observes, default as computed } from 'ember-addons/ember-computed-decorators'; +import { findRawTemplate } from 'discourse/lib/raw-templates'; - _initializeAutocomplete: function() { +export default Ember.Component.extend({ + @computed('placeholderKey') + placeholder(placeholderKey) { + return placeholderKey ? I18n.t(placeholderKey) : ''; + }, + + @observes('groupNames') + _update() { + if (this.get('canReceiveUpdates') === 'true') + this._initializeAutocomplete({updateData: true}); + }, + + @on('didInsertElement') + _initializeAutocomplete(opts) { var self = this; var selectedGroups; + var groupNames = this.get('groupNames'); - var template = this.container.lookup('template:group-selector-autocomplete.raw'); self.$('input').autocomplete({ allowAny: false, + items: _.isArray(groupNames) ? groupNames : (Ember.isEmpty(groupNames)) ? [] : [groupNames], + single: this.get('single'), + updateData: (opts && opts.updateData) ? opts.updateData : false, onChangeItems: function(items){ selectedGroups = items; self.set("groupNames", items.join(",")); @@ -29,7 +43,7 @@ export default Ember.Component.extend({ }); }); }, - template: template + template: findRawTemplate('group-selector-autocomplete') }); - }.on('didInsertElement') + } }); diff --git a/app/assets/javascripts/discourse/components/header-extra-info.js.es6 b/app/assets/javascripts/discourse/components/header-extra-info.js.es6 index 66aaf82cb91..1d769faa090 100644 --- a/app/assets/javascripts/discourse/components/header-extra-info.js.es6 +++ b/app/assets/javascripts/discourse/components/header-extra-info.js.es6 @@ -1,3 +1,5 @@ +import deprecated from 'discourse-common/lib/deprecated'; + export function needsSecondRowIf() { - Ember.warn("DEPRECATION: `needsSecondRowIf` is deprecated. Use widget hooks on `header-second-row`"); + deprecated("`needsSecondRowIf` is deprecated. Use widget hooks on `header-second-row`"); } diff --git a/app/assets/javascripts/discourse/components/hide-modal-trigger.js.es6 b/app/assets/javascripts/discourse/components/hide-modal-trigger.js.es6 new file mode 100644 index 00000000000..0db92cc4617 --- /dev/null +++ b/app/assets/javascripts/discourse/components/hide-modal-trigger.js.es6 @@ -0,0 +1,6 @@ +export default Ember.Component.extend({ + didInsertElement() { + this._super(); + $('#discourse-modal').modal('hide'); + } +}); diff --git a/app/assets/javascripts/discourse/components/image-uploader.js.es6 b/app/assets/javascripts/discourse/components/image-uploader.js.es6 index 08359fa8695..642ba03b3e8 100644 --- a/app/assets/javascripts/discourse/components/image-uploader.js.es6 +++ b/app/assets/javascripts/discourse/components/image-uploader.js.es6 @@ -6,17 +6,23 @@ export default Em.Component.extend(UploadMixin, { @computed('imageUrl') backgroundStyle(imageUrl) { - if (Em.isNone(imageUrl)) { return; } + if (Em.isNone(imageUrl)) { return "".htmlSafe(); } return `background-image: url(${imageUrl})`.htmlSafe(); }, + validateUploadedFilesOptions() { + return { imagesOnly: true }; + }, + uploadDone(upload) { this.set("imageUrl", upload.url); + this.set("imageId", upload.id); }, actions: { trash() { this.set("imageUrl", null); + this.set("imageId", null); } } }); diff --git a/app/assets/javascripts/discourse/components/input-tip.js.es6 b/app/assets/javascripts/discourse/components/input-tip.js.es6 index 2ba1c074c4e..0178ad7cac5 100644 --- a/app/assets/javascripts/discourse/components/input-tip.js.es6 +++ b/app/assets/javascripts/discourse/components/input-tip.js.es6 @@ -1,17 +1,17 @@ -import StringBuffer from 'discourse/mixins/string-buffer'; -import { iconHTML } from 'discourse/helpers/fa-icon'; +import { bufferedRender } from 'discourse-common/lib/buffered-render'; +import { iconHTML } from 'discourse-common/helpers/fa-icon'; -export default Ember.Component.extend(StringBuffer, { +export default Ember.Component.extend(bufferedRender({ classNameBindings: [':tip', 'good', 'bad'], rerenderTriggers: ['validation'], bad: Em.computed.alias('validation.failed'), good: Em.computed.not('bad'), - renderString(buffer) { + buildBuffer(buffer) { const reason = this.get('validation.reason'); if (reason) { buffer.push(iconHTML(this.get('good') ? 'check' : 'times') + ' ' + reason); } } -}); +})); diff --git a/app/assets/javascripts/discourse/components/latest-topic-list-item.js.es6 b/app/assets/javascripts/discourse/components/latest-topic-list-item.js.es6 new file mode 100644 index 00000000000..07a4c53b2f5 --- /dev/null +++ b/app/assets/javascripts/discourse/components/latest-topic-list-item.js.es6 @@ -0,0 +1,6 @@ +import { showEntrance } from "discourse/components/topic-list-item"; + +export default Ember.Component.extend({ + tagName: "tr", + click: showEntrance, +}); diff --git a/app/assets/javascripts/discourse/views/history.js.es6 b/app/assets/javascripts/discourse/components/links-redirect.js.es6 similarity index 57% rename from app/assets/javascripts/discourse/views/history.js.es6 rename to app/assets/javascripts/discourse/components/links-redirect.js.es6 index 0f97a977277..4862b953ad7 100644 --- a/app/assets/javascripts/discourse/views/history.js.es6 +++ b/app/assets/javascripts/discourse/components/links-redirect.js.es6 @@ -1,17 +1,10 @@ -import ModalBodyView from "discourse/views/modal-body"; import ClickTrack from 'discourse/lib/click-track'; import { selectedText } from 'discourse/lib/utilities'; -export default ModalBodyView.extend({ - templateName: 'modal/history', - title: I18n.t('history'), +export default Ember.Component.extend({ + didInsertElement() { + this._super(); - resizeModal: function(){ - const viewPortHeight = $(window).height(); - this.$(".modal-body").css("max-height", Math.floor(0.8 * viewPortHeight) + "px"); - }.on("didInsertElement"), - - _inserted: function() { this.$().on('mouseup.discourse-redirect', '#revisions a', function(e) { // bypass if we are selecting stuff const selection = window.getSelection && window.getSelection(); @@ -26,11 +19,10 @@ export default ModalBodyView.extend({ return ClickTrack.trackClick(e); }); + }, - }.on('didInsertElement'), - - // This view is being removed. Shut down operations - _destroyed: function() { + willDestroyElement() { + this._super(); this.$().off('mouseup.discourse-redirect', '#revisions a'); - }.on('willDestroyElement') + } }); diff --git a/app/assets/javascripts/discourse/components/login-buttons.js.es6 b/app/assets/javascripts/discourse/components/login-buttons.js.es6 index ccaabff239f..4c68d1740f2 100644 --- a/app/assets/javascripts/discourse/components/login-buttons.js.es6 +++ b/app/assets/javascripts/discourse/components/login-buttons.js.es6 @@ -1,4 +1,5 @@ import { findAll } from 'discourse/models/login-method'; +import computed from 'ember-addons/ember-computed-decorators'; export default Ember.Component.extend({ elementId: 'login-buttons', @@ -6,9 +7,10 @@ export default Ember.Component.extend({ hidden: Ember.computed.equal('buttons.length', 0), - buttons: function() { - return findAll(this.siteSettings); - }.property(), + @computed + buttons() { + return findAll(this.siteSettings, this.capabilities, this.site.isMobileDevice); + }, actions: { externalLogin: function(provider) { diff --git a/app/assets/javascripts/discourse/components/login-modal.js.es6 b/app/assets/javascripts/discourse/components/login-modal.js.es6 new file mode 100644 index 00000000000..e366392b342 --- /dev/null +++ b/app/assets/javascripts/discourse/components/login-modal.js.es6 @@ -0,0 +1,26 @@ +export default Ember.Component.extend({ + didInsertElement() { + this._super(); + + const prefillUsername = $('#hidden-login-form input[name=username]').val(); + if (prefillUsername) { + this.set('loginName', prefillUsername); + this.set('loginPassword', $('#hidden-login-form input[name=password]').val()); + } else if ($.cookie('email')) { + this.set('loginName', $.cookie('email')); + } + + Ember.run.schedule('afterRender', () => { + $('#login-account-password, #login-account-name').keydown(e => { + if (e.keyCode === 13) { + this.sendAction(); + } + }); + }); + }, + + mouseMove(e) { + this.set('screenX', e.screenX); + this.set('screenY', e.screenY); + } +}); diff --git a/app/assets/javascripts/discourse/components/login-reply-button.js.es6 b/app/assets/javascripts/discourse/components/login-reply-button.js.es6 new file mode 100644 index 00000000000..e162faf2673 --- /dev/null +++ b/app/assets/javascripts/discourse/components/login-reply-button.js.es6 @@ -0,0 +1,7 @@ +import Button from 'discourse/components/d-button'; + +export default Button.extend({ + label: 'topic.reply.title', + icon: 'reply', + action: 'showLogin' +}); diff --git a/app/assets/javascripts/discourse/components/mobile-nav.js.es6 b/app/assets/javascripts/discourse/components/mobile-nav.js.es6 index cee8a2111aa..deccf48ef2d 100644 --- a/app/assets/javascripts/discourse/components/mobile-nav.js.es6 +++ b/app/assets/javascripts/discourse/components/mobile-nav.js.es6 @@ -14,6 +14,7 @@ export default Ember.Component.extend({ }, tagName: 'ul', + selectedHtml: null, classNames: ['mobile-nav'], diff --git a/app/assets/javascripts/discourse/components/mount-widget.js.es6 b/app/assets/javascripts/discourse/components/mount-widget.js.es6 index e62390e6940..3c41721fe63 100644 --- a/app/assets/javascripts/discourse/components/mount-widget.js.es6 +++ b/app/assets/javascripts/discourse/components/mount-widget.js.es6 @@ -2,6 +2,7 @@ import { keyDirty } from 'discourse/widgets/widget'; import { diff, patch } from 'virtual-dom'; import { WidgetClickHook } from 'discourse/widgets/hooks'; import { renderedKey, queryRegistry } from 'discourse/widgets/widget'; +import { getRegister } from 'discourse-common/lib/get-owner'; const _cleanCallbacks = {}; export function addWidgetCleanCallback(widgetName, fn) { @@ -22,9 +23,9 @@ export default Ember.Component.extend({ this._super(); const name = this.get('widget'); - (this.get('delegated') || []).forEach(m => this.set(m, m)); + this.register = getRegister(this); - this._widgetClass = queryRegistry(name) || this.container.lookupFactory(`widget:${name}`); + this._widgetClass = queryRegistry(name) || this.register.lookupFactory(`widget:${name}`); if (!this._widgetClass) { console.error(`Error: Could not find widget: ${name}`); @@ -97,14 +98,16 @@ export default Ember.Component.extend({ rerenderWidget() { Ember.run.cancel(this._timeout); + if (this._rootNode) { if (!this._widgetClass) { return; } const t0 = new Date().getTime(); const args = this.get('args') || this.buildArgs(); const opts = { model: this.get('model') }; - const newTree = new this._widgetClass(args, this.container, opts); + const newTree = new this._widgetClass(args, this.register, opts); + newTree._rerenderable = this; newTree._emberView = this; const patches = diff(this._tree || this._rootNode, newTree); diff --git a/app/assets/javascripts/discourse/components/nav-item.js.es6 b/app/assets/javascripts/discourse/components/nav-item.js.es6 index 69c797bd309..3a4b40dddf1 100644 --- a/app/assets/javascripts/discourse/components/nav-item.js.es6 +++ b/app/assets/javascripts/discourse/components/nav-item.js.es6 @@ -1,6 +1,7 @@ /* You might be looking for navigation-item. */ import computed from "ember-addons/ember-computed-decorators"; +import { getOwner } from 'discourse-common/lib/get-owner'; export default Ember.Component.extend({ tagName: 'li', @@ -8,7 +9,7 @@ export default Ember.Component.extend({ @computed() router() { - return this.container.lookup('router:main'); + return getOwner(this).lookup('router:main'); }, @computed("path") diff --git a/app/assets/javascripts/discourse/components/navigation-item.js.es6 b/app/assets/javascripts/discourse/components/navigation-item.js.es6 index 758e4a385cd..62f6a37fdef 100644 --- a/app/assets/javascripts/discourse/components/navigation-item.js.es6 +++ b/app/assets/javascripts/discourse/components/navigation-item.js.es6 @@ -1,7 +1,7 @@ import computed from "ember-addons/ember-computed-decorators"; -import StringBuffer from 'discourse/mixins/string-buffer'; +import { bufferedRender } from 'discourse-common/lib/buffered-render'; -export default Ember.Component.extend(StringBuffer, { +export default Ember.Component.extend(bufferedRender({ tagName: 'li', classNameBindings: ['active', 'content.hasIcon:has-icon'], attributeBindings: ['title'], @@ -26,7 +26,7 @@ export default Ember.Component.extend(StringBuffer, { filterMode.indexOf(contentFilterMode) === 0; }, - renderString(buffer) { + buildBuffer(buffer) { const content = this.get('content'); buffer.push(""); if (content.get('hasIcon')) { @@ -35,4 +35,4 @@ export default Ember.Component.extend(StringBuffer, { buffer.push(this.get('content.displayName')); buffer.push(""); } -}); +})); diff --git a/app/assets/javascripts/discourse/components/notifications-button.js.es6 b/app/assets/javascripts/discourse/components/notifications-button.js.es6 index 8a3ffda21e2..2695cfc9186 100644 --- a/app/assets/javascripts/discourse/components/notifications-button.js.es6 +++ b/app/assets/javascripts/discourse/components/notifications-button.js.es6 @@ -1,6 +1,6 @@ import DropdownButton from 'discourse/components/dropdown-button'; import { allLevels, buttonDetails } from 'discourse/lib/notification-levels'; -import { iconHTML } from 'discourse/helpers/fa-icon'; +import { iconHTML } from 'discourse-common/helpers/fa-icon'; import computed from 'ember-addons/ember-computed-decorators'; export default DropdownButton.extend({ diff --git a/app/assets/javascripts/discourse/components/period-chooser.js.es6 b/app/assets/javascripts/discourse/components/period-chooser.js.es6 index 1bbf20c03ca..efd7e157202 100644 --- a/app/assets/javascripts/discourse/components/period-chooser.js.es6 +++ b/app/assets/javascripts/discourse/components/period-chooser.js.es6 @@ -24,8 +24,12 @@ export default Ember.Component.extend(CleansUp, { if ($(e.target).closest('.period-popup').length) { return; } if (!this.get('showPeriods')) { - const $chevron = this.$('i.fa-caret-down'); - this.$('#period-popup').css($chevron.position()); + if (!this.site.mobileView) { + const $chevron = this.$('i.fa-caret-down'); + this.$('#period-popup').css($chevron.position()); + } else { + this.$('#period-popup').css({top: this.$().height()}); + } this.set('showPeriods', true); this._clickToClose(); } diff --git a/app/assets/javascripts/discourse/components/plugin-connector.js.es6 b/app/assets/javascripts/discourse/components/plugin-connector.js.es6 new file mode 100644 index 00000000000..564ab139e72 --- /dev/null +++ b/app/assets/javascripts/discourse/components/plugin-connector.js.es6 @@ -0,0 +1,30 @@ +import { observes } from 'ember-addons/ember-computed-decorators'; + +export default Ember.Component.extend({ + + init() { + this._super(); + + const connector = this.get('connector'); + this.set('layoutName', connector.templateName); + + const args = this.get('args') || {}; + Object.keys(args).forEach(key => this.set(key, args[key])); + + const connectorClass = this.get('connector.connectorClass'); + connectorClass.setupComponent.call(this, args, this); + }, + + @observes('args') + _argsChanged() { + const args = this.get('args') || {}; + Object.keys(args).forEach(key => this.set(key, args[key])); + }, + + send(name, ...args) { + const connectorClass = this.get('connector.connectorClass'); + const action = connectorClass.actions[name]; + return action ? action.call(this, ...args) : this._super(name, ...args); + } + +}); diff --git a/app/assets/javascripts/discourse/components/plugin-outlet.js.es6 b/app/assets/javascripts/discourse/components/plugin-outlet.js.es6 new file mode 100644 index 00000000000..91bf45560e9 --- /dev/null +++ b/app/assets/javascripts/discourse/components/plugin-outlet.js.es6 @@ -0,0 +1,51 @@ +/** + A plugin outlet is an extension point for templates where other templates can + be inserted by plugins. + + ## Usage + + If your handlebars template has: + + ```handlebars + {{plugin-outlet name="evil-trout"}} + ``` + + Then any handlebars files you create in the `connectors/evil-trout` directory + will automatically be appended. For example: + + plugins/hello/assets/javascripts/discourse/templates/connectors/evil-trout/hello.hbs + + With the contents: + + ```handlebars + Hello World + ``` + + Will insert Hello World at that point in the template. + + ## Disabling + + If a plugin returns a disabled status, the outlets will not be wired up for it. + The list of disabled plugins is returned via the `Site` singleton. + +**/ +import { connectorsFor } from 'discourse/lib/plugin-connectors'; + +export default Ember.Component.extend({ + tagName: 'span', + connectors: null, + + init() { + this._super(); + const name = this.get('name'); + + if (name) { + const args = this.get('args'); + const connectors = connectorsFor(name).filter(con => { + return con.connectorClass.shouldRender(args, this); + }); + + this.set('connectors', connectors); + } + } +}); diff --git a/app/assets/javascripts/discourse/components/popup-input-tip.js.es6 b/app/assets/javascripts/discourse/components/popup-input-tip.js.es6 index c63997674c9..59e5856db09 100644 --- a/app/assets/javascripts/discourse/components/popup-input-tip.js.es6 +++ b/app/assets/javascripts/discourse/components/popup-input-tip.js.es6 @@ -1,8 +1,8 @@ -import StringBuffer from 'discourse/mixins/string-buffer'; -import { iconHTML } from 'discourse/helpers/fa-icon'; +import { iconHTML } from 'discourse-common/helpers/fa-icon'; import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; +import { bufferedRender } from 'discourse-common/lib/buffered-render'; -export default Ember.Component.extend(StringBuffer, { +export default Ember.Component.extend(bufferedRender({ classNameBindings: [':popup-tip', 'good', 'bad', 'lastShownAt::hide'], animateAttribute: null, bouncePixels: 6, @@ -37,7 +37,7 @@ export default Ember.Component.extend(StringBuffer, { } }, - renderString(buffer) { + buildBuffer(buffer) { const reason = this.get('validation.reason'); if (!reason) { return; } @@ -55,4 +55,4 @@ export default Ember.Component.extend(StringBuffer, { $elem.animate({ right: '-=' + this.bouncePixels }, this.bounceDelay).animate({ right: '+=' + this.bouncePixels }, this.bounceDelay); } } -}); +})); diff --git a/app/assets/javascripts/discourse/components/queued-post.js.es6 b/app/assets/javascripts/discourse/components/queued-post.js.es6 index 28f5a90fdd0..9629724b438 100644 --- a/app/assets/javascripts/discourse/components/queued-post.js.es6 +++ b/app/assets/javascripts/discourse/components/queued-post.js.es6 @@ -13,7 +13,6 @@ function updateState(state, opts) { post.update(args).then(() => { this.sendAction('removePost', post); - // this.get('controllers.queued-posts.model').removeObject(post); }).catch(popupAjaxError); }; } diff --git a/app/assets/javascripts/discourse/components/quote-button.js.es6 b/app/assets/javascripts/discourse/components/quote-button.js.es6 new file mode 100644 index 00000000000..a8c8f5cfa57 --- /dev/null +++ b/app/assets/javascripts/discourse/components/quote-button.js.es6 @@ -0,0 +1,135 @@ +import { selectedText } from 'discourse/lib/utilities'; + +// we don't want to deselect when we click on buttons that use it +function willQuote(e) { + const $target = $(e.target); + return $target.hasClass('quote-button') || $target.closest('.create, .share, .reply-new').length; +} + +export default Ember.Component.extend({ + classNames: ['quote-button'], + classNameBindings: ['visible'], + visible: false, + + _isMouseDown: false, + _reselected: false, + + _hideButton() { + this.get('quoteState').clear(); + this.set('visible', false); + }, + + _selectionChanged() { + const quoteState = this.get('quoteState'); + + const selection = window.getSelection(); + if (selection.isCollapsed) { + if (this.get("visible")) { this._hideButton(); } + return; + } + + // ensure we selected content inside 1 post *only* + let firstRange, postId; + for (let r = 0; r < selection.rangeCount; r++) { + const range = selection.getRangeAt(r); + + if ($(range.endContainer).closest('.cooked').length === 0) return; + + const $ancestor = $(range.commonAncestorContainer); + + firstRange = firstRange || range; + postId = postId || $ancestor.closest('.boxed, .reply').data('post-id'); + + if ($ancestor.closest(".contents").length === 0 || !postId) { + if (this.get("visible")) { this._hideButton(); } + return; + } + } + + quoteState.selected(postId, selectedText()); + this.set('visible', quoteState.buffer.length > 0); + + // on Desktop, shows the button at the beginning of the selection + // on Mobile, shows the button at the end of the selection + const isMobileDevice = this.site.isMobileDevice; + const { isIOS, isAndroid, isSafari } = this.capabilities; + const showAtEnd = isMobileDevice || isIOS || isAndroid; + + // used to work around Safari losing selection + const clone = firstRange.cloneRange(); + + // create a marker element containing a single invisible character + const markerElement = document.createElement("span"); + markerElement.appendChild(document.createTextNode("\ufeff")); + + // on mobile, collapse the range at the end of the selection + if (showAtEnd) { firstRange.collapse(); } + // insert the marker + firstRange.insertNode(markerElement); + + // retrieve the position of the marker + const $markerElement = $(markerElement); + const markerOffset = $markerElement.offset(); + const parentScrollLeft = $markerElement.parent().scrollLeft(); + const $quoteButton = this.$(); + + // remove the marker + markerElement.parentNode.removeChild(markerElement); + + // work around Safari that would sometimes lose the selection + if (isSafari) { + this._reselected = true; + selection.removeAllRanges(); + selection.addRange(clone); + } + + // change the position of the button + Ember.run.scheduleOnce("afterRender", () => { + let top = markerOffset.top; + let left = markerOffset.left + Math.max(0, parentScrollLeft); + + if (showAtEnd) { + top = top + 20; + left = Math.min(left + 10, $(window).width() - $quoteButton.outerWidth()); + } else { + top = top - $quoteButton.outerHeight() - 5; + } + + $quoteButton.offset({ top, left }); + }); + + }, + + didInsertElement() { + const { isWinphone, isAndroid } = this.capabilities; + const wait = (isWinphone || isAndroid) ? 250 : 25; + const onSelectionChanged = _.debounce(() => this._selectionChanged(), wait); + + $(document).on("mousedown.quote-button", e => { + this._isMouseDown = true; + this._reselected = false; + if (!willQuote(e)) { + this._hideButton(); + } + }).on("mouseup.quote-button", () => { + this._isMouseDown = false; + onSelectionChanged(); + }).on("selectionchange.quote-button", () => { + if (!this._isMouseDown && !this._reselected) { + onSelectionChanged(); + } + }); + }, + + willDestroyElement() { + $(document).off("mousedown.quote-button") + .off("mouseup.quote-button") + .off("selectionchange.quote-button"); + }, + + click() { + const { postId, buffer } = this.get('quoteState'); + this.attrs.selectText(postId, buffer).then(() => this._hideButton()); + return false; + } +}); diff --git a/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 new file mode 100644 index 00000000000..23bdac794b4 --- /dev/null +++ b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 @@ -0,0 +1,526 @@ +import { observes } from 'ember-addons/ember-computed-decorators'; +import { escapeExpression } from 'discourse/lib/utilities'; + +const REGEXP_BLOCKS = /(([^" \t\n\x0B\f\r]+)?(("[^"]+")?))/g; + +const REGEXP_USERNAME_PREFIX = /(user:|@)/ig; +const REGEXP_CATEGORY_PREFIX = /(category:|#)/ig; +const REGEXP_GROUP_PREFIX = /group:/ig; +const REGEXP_BADGE_PREFIX = /badge:/ig; +const REGEXP_TAGS_PREFIX = /tags?:/ig; +const REGEXP_IN_PREFIX = /in:/ig; +const REGEXP_STATUS_PREFIX = /status:/ig; +const REGEXP_MIN_POST_COUNT_PREFIX = /min_post_count:/ig; +const REGEXP_POST_TIME_PREFIX = /(before|after):/ig; + +const REGEXP_IN_MATCH = /in:(posted|watching|tracking|bookmarks|first|pinned|unpinned)/ig; +const REGEXP_SPECIAL_IN_LIKES_MATCH = /in:likes/ig; +const REGEXP_SPECIAL_IN_PRIVATE_MATCH = /in:private/ig; +const REGEXP_SPECIAL_IN_WIKI_MATCH = /in:wiki/ig; + +const REGEXP_CATEGORY_SLUG = /(\#[a-zA-Z0-9\-:]+)/ig; +const REGEXP_CATEGORY_ID = /(category:[0-9]+)/ig; +const REGEXP_POST_TIME_WHEN = /(before|after)/ig; + +export default Em.Component.extend({ + classNames: ['search-advanced-options'], + + inOptions: [ + {name: I18n.t('search.advanced.filters.posted'), value: "posted"}, + {name: I18n.t('search.advanced.filters.watching'), value: "watching"}, + {name: I18n.t('search.advanced.filters.tracking'), value: "tracking"}, + {name: I18n.t('search.advanced.filters.bookmarks'), value: "bookmarks"}, + {name: I18n.t('search.advanced.filters.first'), value: "first"}, + {name: I18n.t('search.advanced.filters.pinned'), value: "pinned"}, + {name: I18n.t('search.advanced.filters.unpinned'), value: "unpinned"}, + ], + statusOptions: [ + {name: I18n.t('search.advanced.statuses.open'), value: "open"}, + {name: I18n.t('search.advanced.statuses.closed'), value: "closed"}, + {name: I18n.t('search.advanced.statuses.archived'), value: "archived"}, + {name: I18n.t('search.advanced.statuses.noreplies'), value: "noreplies"}, + {name: I18n.t('search.advanced.statuses.single_user'), value: "single_user"}, + ], + postTimeOptions: [ + {name: I18n.t('search.advanced.post.time.before'), value: "before"}, + {name: I18n.t('search.advanced.post.time.after'), value: "after"} + ], + + init() { + this._super(); + Ember.run.scheduleOnce('afterRender', () => { + this._init(); + this._update(); + }); + }, + + @observes('searchTerm') + _updateOptions() { + this._update(); + Ember.run.debounce(this, this._update, 250); + }, + + _init() { + this.setProperties({ + searchedTerms: { + username: '', + category: '', + group: [], + badge: [], + tags: [], + in: '', + special: { + in: { + likes: false, + private: false, + wiki: false + } + }, + status: '', + min_post_count: '', + time: { + when: 'before', + days: '' + } + } + }); + }, + + _update() { + if (!this.get('searchTerm')) { + this._init(); + return; + } + + this.setSearchedTermValue('searchedTerms.username', REGEXP_USERNAME_PREFIX); + this.setSearchedTermValueForCategory(); + this.setSearchedTermValueForGroup(); + this.setSearchedTermValueForBadge(); + this.setSearchedTermValueForTags(); + this.setSearchedTermValue('searchedTerms.in', REGEXP_IN_PREFIX, REGEXP_IN_MATCH); + this.setSearchedTermSpecialInValue('searchedTerms.special.in.likes', REGEXP_SPECIAL_IN_LIKES_MATCH); + this.setSearchedTermSpecialInValue('searchedTerms.special.in.private', REGEXP_SPECIAL_IN_PRIVATE_MATCH); + this.setSearchedTermSpecialInValue('searchedTerms.special.in.wiki', REGEXP_SPECIAL_IN_WIKI_MATCH); + this.setSearchedTermValue('searchedTerms.status', REGEXP_STATUS_PREFIX); + this.setSearchedTermValueForPostTime(); + this.setSearchedTermValue('searchedTerms.min_post_count', REGEXP_MIN_POST_COUNT_PREFIX); + }, + + findSearchTerms() { + const searchTerm = escapeExpression(this.get('searchTerm')); + if (!searchTerm) + return []; + + const blocks = searchTerm.match(REGEXP_BLOCKS); + if (!blocks) return []; + + let result = []; + blocks.forEach(block => { + if (block.length !== 0) + result.push(block); + }); + + return result; + }, + + filterBlocks(regexPrefix) { + const blocks = this.findSearchTerms(); + if (!blocks) return []; + + let result = []; + blocks.forEach(block => { + if (block.search(regexPrefix) !== -1) + result.push(block); + }); + + return result; + }, + + setSearchedTermValue(key, replaceRegEx, matchRegEx = null) { + matchRegEx = matchRegEx || replaceRegEx; + const match = this.filterBlocks(matchRegEx); + + if (match.length !== 0) { + const userInput = match[0].replace(replaceRegEx, ''); + if (this.get(key) !== userInput) { + this.set(key, userInput); + } + } else if(this.get(key).length !== 0) { + this.set(key, ''); + } + }, + + setSearchedTermSpecialInValue(key, replaceRegEx) { + const match = this.filterBlocks(replaceRegEx); + + if (match.length !== 0) { + if (this.get(key) !== true) { + this.set(key, true); + } + } else if(this.get(key) !== false) { + this.set(key, false); + } + }, + + setSearchedTermValueForCategory() { + const match = this.filterBlocks(REGEXP_CATEGORY_PREFIX); + if (match.length !== 0) { + const existingInput = this.get('searchedTerms.category'); + const subcategories = match[0].replace(REGEXP_CATEGORY_PREFIX, '').split(':'); + if (subcategories.length > 1) { + const userInput = Discourse.Category.findBySlug(subcategories[1], subcategories[0]); + if ((!existingInput && userInput) + || (existingInput && userInput && existingInput.id !== userInput.id)) + this.set('searchedTerms.category', [userInput]); + } else + if (isNaN(subcategories)) { + const userInput = Discourse.Category.findSingleBySlug(subcategories[0]); + if ((!existingInput && userInput) + || (existingInput && userInput && existingInput.id !== userInput.id)) + this.set('searchedTerms.category', [userInput]); + } else { + const userInput = Discourse.Category.findById(subcategories[0]); + if ((!existingInput && userInput) + || (existingInput && userInput && existingInput.id !== userInput.id)) + this.set('searchedTerms.category', [userInput]); + } + } else + this.set('searchedTerms.category', ''); + }, + + setSearchedTermValueForGroup() { + const match = this.filterBlocks(REGEXP_GROUP_PREFIX); + const group = this.get('searchedTerms.group'); + + if (match.length !== 0) { + const existingInput = _.isArray(group) ? group[0] : group; + const userInput = match[0].replace(REGEXP_GROUP_PREFIX, ''); + + if (existingInput !== userInput) { + this.set('searchedTerms.group', (userInput.length !== 0) ? [userInput] : []); + } + } else if (group.length !== 0) { + this.set('searchedTerms.group', []); + } + }, + + setSearchedTermValueForBadge() { + const match = this.filterBlocks(REGEXP_BADGE_PREFIX); + const badge = this.get('searchedTerms.badge'); + + if (match.length !== 0) { + const existingInput = _.isArray(badge) ? badge[0] : badge; + const userInput = match[0].replace(REGEXP_BADGE_PREFIX, ''); + + if (existingInput !== userInput) { + this.set('searchedTerms.badge', (userInput.length !== 0) ? [userInput] : []); + } + } else if (badge.length !== 0) { + this.set('searchedTerms.badge', []); + } + }, + + setSearchedTermValueForTags() { + if (!this.siteSettings.tagging_enabled) return; + + const match = this.filterBlocks(REGEXP_TAGS_PREFIX); + const tags = this.get('searchedTerms.tags'); + + if (match.length !== 0) { + const existingInput = _.isArray(tags) ? tags.join(',') : tags; + const userInput = match[0].replace(REGEXP_TAGS_PREFIX, ''); + + if (existingInput !== userInput) { + this.set('searchedTerms.tags', (userInput.length !== 0) ? userInput.split(',') : []); + } + } else if (tags.length !== 0) { + this.set('searchedTerms.tags', []); + } + }, + + setSearchedTermValueForPostTime() { + const match = this.filterBlocks(REGEXP_POST_TIME_PREFIX); + + if (match.length !== 0) { + const existingInputWhen = this.get('searchedTerms.time.when'); + const userInputWhen = match[0].match(REGEXP_POST_TIME_WHEN)[0]; + const existingInputDays = this.get('searchedTerms.time.days'); + const userInputDays = match[0].replace(REGEXP_POST_TIME_PREFIX, ''); + + if (existingInputWhen !== userInputWhen) { + this.set('searchedTerms.time.when', userInputWhen); + } + + if (existingInputDays !== userInputDays) { + this.set('searchedTerms.time.days', userInputDays); + } + } else { + this.set('searchedTerms.time.days', ''); + } + }, + + @observes('searchedTerms.username') + updateSearchTermForUsername() { + const match = this.filterBlocks(REGEXP_USERNAME_PREFIX); + const userFilter = this.get('searchedTerms.username'); + let searchTerm = this.get('searchTerm') || ''; + + if (userFilter && userFilter.length !== 0) { + if (match.length !== 0) { + searchTerm = searchTerm.replace(match[0], `@${userFilter}`); + } else { + searchTerm += ` @${userFilter}`; + } + + this.set('searchTerm', searchTerm.trim()); + } else if (match.length !== 0) { + searchTerm = searchTerm.replace(match[0], ''); + this.set('searchTerm', searchTerm.trim()); + } + }, + + @observes('searchedTerms.category') + updateSearchTermForCategory() { + const match = this.filterBlocks(REGEXP_CATEGORY_PREFIX); + const categoryFilter = this.get('searchedTerms.category'); + let searchTerm = this.get('searchTerm') || ''; + + const slugCategoryMatches = (match.length !== 0) ? match[0].match(REGEXP_CATEGORY_SLUG) : null; + const idCategoryMatches = (match.length !== 0) ? match[0].match(REGEXP_CATEGORY_ID) : null; + if (categoryFilter && categoryFilter[0]) { + const id = categoryFilter[0].id; + const slug = categoryFilter[0].slug; + if (categoryFilter[0].parentCategory) { + const parentSlug = categoryFilter[0].parentCategory.slug; + if (slugCategoryMatches) + searchTerm = searchTerm.replace(slugCategoryMatches[0], `#${parentSlug}:${slug}`); + else if (idCategoryMatches) + searchTerm = searchTerm.replace(idCategoryMatches[0], `category:${id}`); + else + searchTerm += ` #${parentSlug}:${slug}`; + + this.set('searchTerm', searchTerm.trim()); + } else { + if (slugCategoryMatches) + searchTerm = searchTerm.replace(slugCategoryMatches[0], `#${slug}`); + else if (idCategoryMatches) + searchTerm = searchTerm.replace(idCategoryMatches[0], `category:${id}`); + else + searchTerm += ` #${slug}`; + + this.set('searchTerm', searchTerm.trim()); + } + } else { + if (slugCategoryMatches) + searchTerm = searchTerm.replace(slugCategoryMatches[0], ''); + if (idCategoryMatches) + searchTerm = searchTerm.replace(idCategoryMatches[0], ''); + + this.set('searchTerm', searchTerm.trim()); + } + }, + + @observes('searchedTerms.group') + updateSearchTermForGroup() { + const match = this.filterBlocks(REGEXP_GROUP_PREFIX); + const groupFilter = this.get('searchedTerms.group'); + let searchTerm = this.get('searchTerm') || ''; + + if (groupFilter && groupFilter.length !== 0) { + if (match.length !== 0) { + searchTerm = searchTerm.replace(match[0], ` group:${groupFilter}`); + } else { + searchTerm += ` group:${groupFilter}`; + } + + this.set('searchTerm', searchTerm); + } else if (match.length !== 0) { + searchTerm = searchTerm.replace(match[0], ''); + this.set('searchTerm', searchTerm.trim()); + } + }, + + @observes('searchedTerms.badge') + updateSearchTermForBadge() { + const match = this.filterBlocks(REGEXP_BADGE_PREFIX); + const badgeFilter = this.get('searchedTerms.badge'); + let searchTerm = this.get('searchTerm') || ''; + + if (badgeFilter && badgeFilter.length !== 0) { + if (match.length !== 0) { + searchTerm = searchTerm.replace(match[0], ` badge:${badgeFilter}`); + } else { + searchTerm += ` badge:${badgeFilter}`; + } + + this.set('searchTerm', searchTerm); + } else if (match.length !== 0) { + searchTerm = searchTerm.replace(match[0], ''); + this.set('searchTerm', searchTerm.trim()); + } + }, + + @observes('searchedTerms.tags') + updateSearchTermForTags() { + const match = this.filterBlocks(REGEXP_TAGS_PREFIX); + const tagFilter = this.get('searchedTerms.tags'); + let searchTerm = this.get('searchTerm') || ''; + + if (tagFilter && tagFilter.length !== 0) { + const tags = tagFilter.join(','); + + if (match.length !== 0) { + searchTerm = searchTerm.replace(match[0], `tags:${tags}`); + } else { + searchTerm += ` tags:${tags}`; + } + + this.set('searchTerm', searchTerm.trim()); + } else if (match.length !== 0) { + searchTerm = searchTerm.replace(match[0], ''); + this.set('searchTerm', searchTerm.trim()); + } + }, + + @observes('searchedTerms.in') + updateSearchTermForIn() { + const match = this.filterBlocks(REGEXP_IN_MATCH); + const inFilter = this.get('searchedTerms.in'); + let searchTerm = this.get('searchTerm') || ''; + + if (inFilter) { + if (match.length !== 0) { + searchTerm = searchTerm.replace(match[0], `in:${inFilter}`); + } else { + searchTerm += ` in:${inFilter}`; + } + + this.set('searchTerm', searchTerm.trim()); + } else if (match.length !== 0) { + searchTerm = searchTerm.replace(match, ''); + this.set('searchTerm', searchTerm.trim()); + } + }, + + @observes('searchedTerms.special.in.likes') + updateSearchTermForSpecialInLikes() { + const match = this.filterBlocks(REGEXP_SPECIAL_IN_LIKES_MATCH); + const inFilter = this.get('searchedTerms.special.in.likes'); + let searchTerm = this.get('searchTerm') || ''; + + if (inFilter) { + if (match.length === 0) { + searchTerm += ` in:likes`; + this.set('searchTerm', searchTerm.trim()); + } + } else if (match.length !== 0) { + searchTerm = searchTerm.replace(match, ''); + this.set('searchTerm', searchTerm.trim()); + } + }, + + @observes('searchedTerms.special.in.private') + updateSearchTermForSpecialInPrivate() { + const match = this.filterBlocks(REGEXP_SPECIAL_IN_PRIVATE_MATCH); + const inFilter = this.get('searchedTerms.special.in.private'); + let searchTerm = this.get('searchTerm') || ''; + + if (inFilter) { + if (match.length === 0) { + searchTerm += ` in:private`; + this.set('searchTerm', searchTerm.trim()); + } + } else if (match.length !== 0) { + searchTerm = searchTerm.replace(match, ''); + this.set('searchTerm', searchTerm.trim()); + } + }, + + @observes('searchedTerms.special.in.wiki') + updateSearchTermForSpecialInWiki() { + const match = this.filterBlocks(REGEXP_SPECIAL_IN_WIKI_MATCH); + const inFilter = this.get('searchedTerms.special.in.wiki'); + let searchTerm = this.get('searchTerm') || ''; + + if (inFilter) { + if (match.length === 0) { + searchTerm += ` in:wiki`; + this.set('searchTerm', searchTerm.trim()); + } + } else if (match.length !== 0) { + searchTerm = searchTerm.replace(match, ''); + this.set('searchTerm', searchTerm.trim()); + } + }, + + @observes('searchedTerms.status') + updateSearchTermForStatus() { + const match = this.filterBlocks(REGEXP_STATUS_PREFIX); + const statusFilter = this.get('searchedTerms.status'); + let searchTerm = this.get('searchTerm') || ''; + + if (statusFilter) { + if (match.length !== 0) { + searchTerm = searchTerm.replace(match[0], `status:${statusFilter}`); + } else { + searchTerm += ` status:${statusFilter}`; + } + + this.set('searchTerm', searchTerm.trim()); + } else if (match.length !== 0) { + searchTerm = searchTerm.replace(match[0], ''); + this.set('searchTerm', searchTerm.trim()); + } + }, + + @observes('searchedTerms.time.when', 'searchedTerms.time.days') + updateSearchTermForPostTime() { + const match = this.filterBlocks(REGEXP_POST_TIME_PREFIX); + const timeDaysFilter = this.get('searchedTerms.time.days'); + let searchTerm = this.get('searchTerm') || ''; + + if (timeDaysFilter) { + const when = this.get('searchedTerms.time.when'); + if (match.length !== 0) { + searchTerm = searchTerm.replace(match[0], `${when}:${timeDaysFilter}`); + } else { + searchTerm += ` ${when}:${timeDaysFilter}`; + } + + this.set('searchTerm', searchTerm.trim()); + } else if (match.length !== 0) { + searchTerm = searchTerm.replace(match[0], ''); + this.set('searchTerm', searchTerm.trim()); + } + }, + + @observes('searchedTerms.min_post_count') + updateSearchTermForMinPostCount() { + const match = this.filterBlocks(REGEXP_MIN_POST_COUNT_PREFIX); + const postsCountFilter = this.get('searchedTerms.min_post_count'); + let searchTerm = this.get('searchTerm') || ''; + + if (postsCountFilter) { + if (match.length !== 0) { + searchTerm = searchTerm.replace(match[0], `min_post_count:${postsCountFilter}`); + } else { + searchTerm += ` min_post_count:${postsCountFilter}`; + } + + this.set('searchTerm', searchTerm.trim()); + } else if (match.length !== 0) { + searchTerm = searchTerm.replace(match[0], ''); + this.set('searchTerm', searchTerm.trim()); + } + }, + + groupFinder(term) { + const Group = require('discourse/models/group').default; + return Group.findAll({search: term, ignore_automatic: false}); + }, + + badgeFinder(term) { + const Badge = require('discourse/models/badge').default; + return Badge.findAll({search: term}); + } +}); diff --git a/app/assets/javascripts/discourse/components/share-popup.js.es6 b/app/assets/javascripts/discourse/components/share-popup.js.es6 new file mode 100644 index 00000000000..4a502736319 --- /dev/null +++ b/app/assets/javascripts/discourse/components/share-popup.js.es6 @@ -0,0 +1,157 @@ +import { wantsNewWindow } from 'discourse/lib/intercept-click'; +import { longDateNoYear } from 'discourse/lib/formatter'; +import computed from 'ember-addons/ember-computed-decorators'; +import Sharing from 'discourse/lib/sharing'; + +export default Ember.Component.extend({ + elementId: 'share-link', + classNameBindings: ['visible'], + link: null, + visible: null, + + @computed + sources() { + return Sharing.activeSources(this.siteSettings.share_links); + }, + + @computed('type', 'postNumber') + shareTitle(type, postNumber) { + if (type === 'topic') { return I18n.t('share.topic'); } + if (postNumber) { + return I18n.t('share.post', { postNumber }); + } + return I18n.t('share.topic'); + }, + + @computed('date') + displayDate(date) { + return longDateNoYear(new Date(date)); + }, + + _focusUrl() { + const link = this.get('link'); + if (!this.capabilities.touch) { + const $linkInput = $('#share-link input'); + $linkInput.val(link); + + // Wait for the fade-in transition to finish before selecting the link: + window.setTimeout(() => $linkInput.select().focus(), 160); + } else { + const $linkForTouch = $('#share-link .share-for-touch a'); + $linkForTouch.attr('href', link); + $linkForTouch.html(link); + const range = window.document.createRange(); + range.selectNode($linkForTouch[0]); + window.getSelection().addRange(range); + } + }, + + _showUrl($target, url) { + const $currentTargetOffset = $target.offset(); + const $this = this.$(); + + if (Ember.isEmpty(url)) { return; } + + // Relative urls + if (url.indexOf("/") === 0) { + url = window.location.protocol + "//" + window.location.host + url; + } + + const shareLinkWidth = $this.width(); + let x = $currentTargetOffset.left - (shareLinkWidth / 2); + if (x < 25) { x = 25; } + if (x + shareLinkWidth > $(window).width()) { + x -= shareLinkWidth / 2; + } + + const header = $('.d-header'); + let y = $currentTargetOffset.top - ($this.height() + 20); + if (y < header.offset().top + header.height()) { + y = $currentTargetOffset.top + 10; + } + + $this.css({top: "" + y + "px"}); + + if (!this.site.mobileView) { + $this.css({left: "" + x + "px"}); + } + this.set('link', url); + this.set('visible', true); + + Ember.run.scheduleOnce('afterRender', this, this._focusUrl); + }, + + didInsertElement() { + this._super(); + + const $html = $('html'); + $html.on('mousedown.outside-share-link', e => { + // Use mousedown instead of click so this event is handled before routing occurs when a + // link is clicked (which is a click event) while the share dialog is showing. + if (this.$().has(e.target).length !== 0) { return; } + this.send('close'); + return true; + }); + + $html.on('click.discoure-share-link', '[data-share-url]', e => { + // if they want to open in a new tab, let it so + if (wantsNewWindow(e)) { return true; } + + e.preventDefault(); + + const $currentTarget = $(e.currentTarget); + const url = $currentTarget.data('share-url'); + const postNumber = $currentTarget.data('post-number'); + const postId = $currentTarget.closest('article').data('post-id'); + const date = $currentTarget.children().data('time'); + + this.setProperties({ postNumber, date, postId }); + this._showUrl($currentTarget, url); + return false; + }); + + $html.on('keydown.share-view', e => { + if (e.keyCode === 27) { + this.send('close'); + } + }); + + this.appEvents.on('share:url', (url, $target) => this._showUrl($target, url)); + }, + + willDestroyElement() { + this._super(); + $('html').off('click.discoure-share-link') + .off('mousedown.outside-share-link') + .off('keydown.share-view'); + }, + + actions: { + replyAsNewTopic() { + const postStream = this.get("topic.postStream"); + const postId = this.get("postId") || postStream.findPostIdForPostNumber(1); + const post = postStream.findLoadedPost(postId); + this.sendAction('replyAsNewTopic', post); + this.send("close"); + }, + + close() { + this.setProperties({ + link: null, + postNumber: null, + postId: null, + visible: false + }); + }, + + share(source) { + const url = source.generateUrl(this.get('link'), this.get('topic.title')); + if (source.shouldOpenInPopup) { + window.open(url, '', 'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=600,height=' + (source.popupHeight || 315)); + } else { + window.open(url, '_blank'); + } + } + } + +}); diff --git a/app/assets/javascripts/discourse/components/site-header.js.es6 b/app/assets/javascripts/discourse/components/site-header.js.es6 index bf66453c67f..9285f5355b8 100644 --- a/app/assets/javascripts/discourse/components/site-header.js.es6 +++ b/app/assets/javascripts/discourse/components/site-header.js.es6 @@ -47,6 +47,12 @@ const SiteHeaderComponent = MountWidget.extend(Docking, { this.queueRerender(); }, + willRender() { + if (this.get('currentUser.staff')) { + $('body').addClass('staff'); + } + }, + didInsertElement() { this._super(); $(window).on('resize.discourse-menu-panel', () => this.afterRender()); diff --git a/app/assets/javascripts/discourse/components/tag-chooser.js.es6 b/app/assets/javascripts/discourse/components/tag-chooser.js.es6 index 64d5fc8e69c..00fc2444879 100644 --- a/app/assets/javascripts/discourse/components/tag-chooser.js.es6 +++ b/app/assets/javascripts/discourse/components/tag-chooser.js.es6 @@ -1,17 +1,24 @@ import renderTag from 'discourse/lib/render-tag'; function formatTag(t) { - return renderTag(t.id, {count: t.count}); + return renderTag(t.id, {count: t.count, noHref: true}); } export default Ember.TextField.extend({ classNameBindings: [':tag-chooser'], attributeBindings: ['tabIndex', 'placeholderKey', 'categoryId'], - _initValue: function() { + init() { + this._super(); const tags = this.get('tags') || []; this.set('value', tags.join(", ")); - }.on('init'), + + if (this.get('allowCreate') !== false) { + this.set('allowCreate', this.site.get('can_create_tag')); + } + + this.set('termMatchesForbidden', false); + }, _valueChanged: function() { const tags = this.get('value').split(',').map(v => v.trim()).reject(v => v.length === 0).uniq(); @@ -32,18 +39,13 @@ export default Ember.TextField.extend({ } }.observes('tags'), - _initializeTags: function() { - const site = this.site, - self = this, - filterRegexp = new RegExp(this.site.tags_filter_regexp, "g"); + didInsertElement() { + this._super(); - var limit = this.siteSettings.max_tags_per_topic; + const self = this; + const filterRegexp = new RegExp(this.site.tags_filter_regexp, "g"); - if (this.get('allowCreate') !== false) { - this.set('allowCreate', site.get('can_create_tag')); - } - - this.set('termMatchesForbidden', false); + let limit = this.siteSettings.max_tags_per_topic; if (this.get('unlimitedTagCount')) { limit = null; @@ -56,6 +58,7 @@ export default Ember.TextField.extend({ placeholder: this.get('placeholder') === "" ? "" : I18n.t(this.get('placeholderKey') || 'tagging.choose_for_topic'), maximumInputLength: this.siteSettings.max_tag_length, maximumSelectionSize: limit, + width: this.get('width') || 'resolve', initSelection(element, callback) { const data = []; @@ -76,8 +79,8 @@ export default Ember.TextField.extend({ callback(data); }, - createSearchChoice: function(term, data) { - term = term.replace(filterRegexp, '').trim(); + createSearchChoice(term, data) { + term = term.replace(filterRegexp, '').trim().toLowerCase(); // No empty terms, make sure the user has permission to create the tag if (!term.length || !self.get('allowCreate') || self.get('termMatchesForbidden')) return; @@ -88,14 +91,14 @@ export default Ember.TextField.extend({ return { id: term, text: term }; } }, - createSearchChoicePosition: function(list, item) { + createSearchChoicePosition(list, item) { // Search term goes on the bottom list.push(item); }, - formatSelection: function (data) { - return data ? renderTag(this.text(data)) : undefined; + formatSelection(data) { + return data ? renderTag(this.text(data), {noHref: true}) : undefined; }, - formatSelectionCssClass: function(){ + formatSelectionCssClass() { return "discourse-tag-select2"; }, formatResult: formatTag, @@ -126,10 +129,11 @@ export default Ember.TextField.extend({ } }, }); - }.on('didInsertElement'), + }, - _destroyTags: function() { + willDestroyElement() { + this._super(); this.$().select2('destroy'); - }.on('willDestroyElement') + } }); diff --git a/app/assets/javascripts/discourse/components/tag-drop-link.js.es6 b/app/assets/javascripts/discourse/components/tag-drop-link.js.es6 index 8cfad3cd2af..f2f671e4031 100644 --- a/app/assets/javascripts/discourse/components/tag-drop-link.js.es6 +++ b/app/assets/javascripts/discourse/components/tag-drop-link.js.es6 @@ -17,10 +17,6 @@ export default Ember.Component.extend({ return "tag-" + this.get('tagId'); }.property('tagId'), - render(buffer) { - buffer.push(Handlebars.Utils.escapeExpression(this.get('tagId'))); - }, - click(e) { e.preventDefault(); DiscourseURL.routeTo(this.get('href')); diff --git a/app/assets/javascripts/discourse/components/tags-admin-dropdown.js.es6 b/app/assets/javascripts/discourse/components/tags-admin-dropdown.js.es6 index c90efb35f9a..6d1c7ae7b31 100644 --- a/app/assets/javascripts/discourse/components/tags-admin-dropdown.js.es6 +++ b/app/assets/javascripts/discourse/components/tags-admin-dropdown.js.es6 @@ -1,4 +1,4 @@ -import { iconHTML } from 'discourse/helpers/fa-icon'; +import { iconHTML } from 'discourse-common/helpers/fa-icon'; import DropdownButton from 'discourse/components/dropdown-button'; import computed from "ember-addons/ember-computed-decorators"; diff --git a/app/assets/javascripts/discourse/components/text-overflow.js.es6 b/app/assets/javascripts/discourse/components/text-overflow.js.es6 index 73a4637bfdc..4906ad1a500 100644 --- a/app/assets/javascripts/discourse/components/text-overflow.js.es6 +++ b/app/assets/javascripts/discourse/components/text-overflow.js.es6 @@ -1,12 +1,9 @@ export default Ember.Component.extend({ - _parse: function() { + didInsertElement() { + this._super(); Ember.run.next(null, () => { this.$().find('hr').remove(); this.$().ellipsis(); }); - }.on('didInsertElement'), - - render(buffer) { - buffer.push(this.get('text')); } }); diff --git a/app/assets/javascripts/discourse/components/toggle-deleted.js.es6 b/app/assets/javascripts/discourse/components/toggle-deleted.js.es6 deleted file mode 100644 index 72ad47d0045..00000000000 --- a/app/assets/javascripts/discourse/components/toggle-deleted.js.es6 +++ /dev/null @@ -1,12 +0,0 @@ -export default Ember.Component.extend({ - layoutName: 'components/toggle-deleted', - tagName: 'section', - classNames: ['information'], - postStream: Em.computed.alias('topic.postStream'), - - actions: { - toggleDeleted: function() { - this.get('postStream').toggleDeleted(); - } - } -}); diff --git a/app/assets/javascripts/discourse/components/topic-category.js.es6 b/app/assets/javascripts/discourse/components/topic-category.js.es6 new file mode 100644 index 00000000000..97fcde13cda --- /dev/null +++ b/app/assets/javascripts/discourse/components/topic-category.js.es6 @@ -0,0 +1,2 @@ +// Injections don't occur without a class +export default Ember.Component.extend(); diff --git a/app/assets/javascripts/discourse/components/topic-closing.js.es6 b/app/assets/javascripts/discourse/components/topic-closing.js.es6 index b92f7740358..f4ab5748ce4 100644 --- a/app/assets/javascripts/discourse/components/topic-closing.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-closing.js.es6 @@ -1,6 +1,6 @@ -import StringBuffer from 'discourse/mixins/string-buffer'; +import { bufferedRender } from 'discourse-common/lib/buffered-render'; -export default Ember.Component.extend(StringBuffer, { +export default Ember.Component.extend(bufferedRender({ elementId: 'topic-closing-info', delayedRerender: null, @@ -9,7 +9,7 @@ export default Ember.Component.extend(StringBuffer, { 'topic.details.auto_close_based_on_last_post', 'topic.details.auto_close_hours'], - renderString(buffer) { + buildBuffer(buffer) { if (!!Ember.isEmpty(this.get('topic.details.auto_close_at'))) return; if (this.get("topic.closed")) return; @@ -48,4 +48,4 @@ export default Ember.Component.extend(StringBuffer, { Em.run.cancel(this.get('delayedRerender')); } } -}); +})); diff --git a/app/assets/javascripts/discourse/components/topic-entrance.js.es6 b/app/assets/javascripts/discourse/components/topic-entrance.js.es6 new file mode 100644 index 00000000000..d3b5983ce43 --- /dev/null +++ b/app/assets/javascripts/discourse/components/topic-entrance.js.es6 @@ -0,0 +1,104 @@ +import DiscourseURL from 'discourse/lib/url'; +import CleansUp from 'discourse/mixins/cleans-up'; +import computed from 'ember-addons/ember-computed-decorators'; + +function entranceDate(dt, showTime) { + const today = new Date(); + + if (dt.toDateString() === today.toDateString()) { + return moment(dt).format(I18n.t("dates.time")); + } + + if (dt.getYear() === today.getYear()) { + // No year + return moment(dt).format( + showTime ? I18n.t("dates.long_date_without_year_with_linebreak") : I18n.t("dates.long_no_year_no_time") + ); + } + + return moment(dt).format( + showTime ? I18n.t('dates.long_date_with_year_with_linebreak') : I18n.t('dates.long_date_with_year_without_time') + ); +} + +export default Ember.Component.extend(CleansUp, { + elementId: 'topic-entrance', + classNameBindings: ['visible::hidden'], + _position: null, + topic: null, + visible: null, + + @computed('topic.created_at') + createdDate: createdAt => new Date(createdAt), + + @computed('topic.bumped_at') + bumpedDate: bumpedAt => new Date(bumpedAt), + + @computed('createdDate', 'bumpedDate') + showTime(createdDate, bumpedDate) { + return bumpedDate.getTime() - createdDate.getTime() < (1000 * 60 * 60 * 24 * 2); + }, + + @computed('createdDate', 'showTime') + topDate: (createdDate, showTime) => entranceDate(createdDate, showTime), + + @computed('bumpedDate', 'showTime') + bottomDate: (bumpedDate, showTime) => entranceDate(bumpedDate, showTime), + + didInsertElement() { + this._super(); + this.appEvents.on('topic-entrance:show', data => this._show(data)); + }, + + _setCSS() { + const pos = this._position; + const $self = this.$(); + const width = $self.width(); + const height = $self.height(); + pos.left = (parseInt(pos.left) - (width / 2)); + pos.top = (parseInt(pos.top) - (height / 2)); + + const windowWidth = $(window).width(); + if (pos.left + width > windowWidth) { + pos.left = (windowWidth - width) - 15; + } + $self.css(pos); + }, + + _show(data) { + this._position = data.position; + + this.set('topic', data.topic); + this.set('visible', true); + + Ember.run.scheduleOnce('afterRender', this, this._setCSS); + + $('html').off('mousedown.topic-entrance').on('mousedown.topic-entrance', e => { + const $target = $(e.target); + if (($target.prop('id') === 'topic-entrance') || (this.$().has($target).length !== 0)) { + return; + } + this.cleanUp(); + }); + }, + + cleanUp() { + this.set('topic', null); + this.set('visible', false); + $('html').off('mousedown.topic-entrance'); + }, + + willDestroyElement() { + this.appEvents.off('topic-entrance:show'); + }, + + actions: { + enterTop() { + DiscourseURL.routeTo(this.get('topic.url')); + }, + + enterBottom() { + DiscourseURL.routeTo(this.get('topic.lastPostUrl')); + } + } +}); diff --git a/app/assets/javascripts/discourse/components/topic-footer-buttons.js.es6 b/app/assets/javascripts/discourse/components/topic-footer-buttons.js.es6 index 1b41ae04dc2..13473c0e0f0 100644 --- a/app/assets/javascripts/discourse/components/topic-footer-buttons.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-footer-buttons.js.es6 @@ -1,23 +1,39 @@ -import ContainerView from 'discourse/views/container'; +import computed from 'ember-addons/ember-computed-decorators'; -export default ContainerView.extend({ +export default Ember.Component.extend({ elementId: 'topic-footer-buttons', - init() { - this._super(); + // Allow us to extend it + layoutName: 'components/topic-footer-buttons', - if (this.currentUser) { - const viewArgs = this.getProperties('topic', 'topicDelegated'); - viewArgs.currentUser = this.currentUser; + @computed('topic.details.can_invite_to') + canInviteTo(result) { + return !this.site.mobileView && result; + }, - this.attachViewWithArgs(viewArgs, 'topic-footer-main-buttons'); - this.attachViewWithArgs(viewArgs, 'pinned-button'); - this.attachViewWithArgs(viewArgs, 'topic-notifications-button'); + inviteDisabled: Ember.computed.or('topic.archived', 'topic.closed', 'topic.deleted'), + + @computed + showAdminButton() { + return !this.site.mobileView && this.currentUser.get('canManageTopic'); + }, + + @computed('topic.message_archived') + archiveIcon: archived => archived ? '' : 'folder', + + @computed('topic.message_archived') + archiveTitle: archived => archived ? 'topic.move_to_inbox.help' : 'topic.archive_message.help', + + @computed('topic.message_archived') + archiveLabel: archived => archived ? "topic.move_to_inbox.title" : "topic.archive_message.title", + + @computed('topic.bookmarked') + bookmarkClass: bookmarked => bookmarked ? 'bookmark bookmarked' : 'bookmark', + + @computed('topic.bookmarked') + bookmarkLabel: bookmarked => bookmarked ? 'bookmarked.clear_bookmarks' : 'bookmarked.title', + + @computed('topic.bookmarked') + bookmarkTitle: bookmarked => bookmarked ? "bookmarked.help.unbookmark" : "bookmarked.help.bookmark", - this.trigger('additionalButtons', this); - } else { - // If not logged in give them a login control - this.attachViewClass('login-reply-button'); - } - } }); diff --git a/app/assets/javascripts/discourse/components/topic-footer-mobile-dropdown.js.es6 b/app/assets/javascripts/discourse/components/topic-footer-mobile-dropdown.js.es6 index bd7ce01b141..07ab1269982 100644 --- a/app/assets/javascripts/discourse/components/topic-footer-mobile-dropdown.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-footer-mobile-dropdown.js.es6 @@ -1,5 +1,5 @@ -import { iconHTML } from 'discourse/helpers/fa-icon'; -import Combobox from 'discourse/components/combo-box'; +import { iconHTML } from 'discourse-common/helpers/fa-icon'; +import Combobox from 'discourse-common/components/combo-box'; import { on, observes } from 'ember-addons/ember-computed-decorators'; export default Combobox.extend({ @@ -27,7 +27,7 @@ export default Combobox.extend({ } this.comboTemplate = (item) => { - const contentItem = content.findProperty('id', item.id); + const contentItem = content.findBy('id', item.id); if (!contentItem) { return item.text; } return `${iconHTML(contentItem.icon)} ${item.text}`; }; @@ -38,7 +38,6 @@ export default Combobox.extend({ @observes('value') _valueChanged() { const value = this.get('value'); - const controller = this.get('parentView.controller'); const topic = this.get('topic'); const refresh = () => { @@ -48,7 +47,7 @@ export default Combobox.extend({ switch(value) { case 'invite': - controller.send('showInvite'); + this.attrs.showInvite(); refresh(); break; case 'bookmark': @@ -59,7 +58,7 @@ export default Combobox.extend({ refresh(); break; case 'flag': - controller.send('showFlagTopic', topic); + this.attrs.showFlagTopic(); refresh(); break; } diff --git a/app/assets/javascripts/discourse/components/topic-list-item.js.es6 b/app/assets/javascripts/discourse/components/topic-list-item.js.es6 index 28c00c4345b..9fdd978cd6c 100644 --- a/app/assets/javascripts/discourse/components/topic-list-item.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-list-item.js.es6 @@ -1,4 +1,6 @@ -import StringBuffer from 'discourse/mixins/string-buffer'; +import computed from 'ember-addons/ember-computed-decorators'; +import { bufferedRender } from 'discourse-common/lib/buffered-render'; +import { findRawTemplate } from 'discourse/lib/raw-templates'; export function showEntrance(e) { let target = $(e.target); @@ -10,28 +12,35 @@ export function showEntrance(e) { target = target.end(); } } - this.container.lookup('controller:application').send("showTopicEntrance", {topic: this.get('topic'), position: target.offset()}); + + this.appEvents.trigger('topic-entrance:show', { topic: this.get('topic'), position: target.offset() }); return false; } } -export default Ember.Component.extend(StringBuffer, { +export default Ember.Component.extend(bufferedRender({ rerenderTriggers: ['bulkSelectEnabled', 'topic.pinned'], tagName: 'tr', - rawTemplate: 'list/topic-list-item.raw', classNameBindings: [':topic-list-item', 'unboundClassNames'], attributeBindings: ['data-topic-id'], 'data-topic-id': Em.computed.alias('topic.id'), actions: { toggleBookmark() { - this.get('topic').toggleBookmark().finally(() => this.rerender()); + this.get('topic').toggleBookmark().finally(() => this.rerenderBuffer()); } }, - unboundClassNames: function() { + buildBuffer(buffer) { + const template = findRawTemplate('list/topic-list-item'); + if (template) { + buffer.push(template(this)); + } + }, + + @computed('topic', 'lastVisitedTopic') + unboundClassNames(topic, lastVisitedTopic) { let classes = []; - const topic = this.get('topic'); if (topic.get('category')) { classes.push("category-" + topic.get('category.fullSlug')); @@ -47,8 +56,12 @@ export default Ember.Component.extend(StringBuffer, { } }); + if (topic === lastVisitedTopic) { + classes.push('last-visit'); + } + return classes.join(' '); - }.property(), + }, titleColSpan: function() { return (!this.get('hideCategory') && @@ -113,22 +126,20 @@ export default Ember.Component.extend(StringBuffer, { } }, - highlight() { + highlight(opts = { isLastViewedTopic: false }) { const $topic = this.$(); - const originalCol = $topic.css('backgroundColor'); $topic .addClass('highlighted') - .stop() - .animate({ backgroundColor: originalCol }, 2500, 'swing', function() { - $topic.removeClass('highlighted'); - }); + .attr('data-islastviewedtopic', opts.isLastViewedTopic); + + $topic.on('animationend', () => $topic.removeClass('highlighted')); }, _highlightIfNeeded: function() { // highlight the last topic viewed if (this.session.get('lastTopicIdViewed') === this.get('topic.id')) { this.session.set('lastTopicIdViewed', null); - this.highlight(); + this.highlight({ isLastViewedTopic: true }); } else if (this.get('topic.highlight')) { // highlight new topics that have been loaded from the server or the one we just created this.set('topic.highlight', false); @@ -136,4 +147,4 @@ export default Ember.Component.extend(StringBuffer, { } }.on('didInsertElement') -}); +})); diff --git a/app/assets/javascripts/discourse/components/topic-list.js.es6 b/app/assets/javascripts/discourse/components/topic-list.js.es6 index cf0f7eb34f3..5b214be7aa7 100644 --- a/app/assets/javascripts/discourse/components/topic-list.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-list.js.es6 @@ -1,13 +1,15 @@ +import { observes } from 'ember-addons/ember-computed-decorators'; export default Ember.Component.extend({ tagName: 'table', classNames: ['topic-list'], showTopicPostBadges: true, - _observeHideCategory: function(){ + _init: function(){ this.addObserver('hideCategory', this.rerender); this.addObserver('order', this.rerender); this.addObserver('ascending', this.rerender); + this.refreshLastVisited(); }.on('init'), toggleInTitle: function(){ @@ -30,9 +32,87 @@ export default Ember.Component.extend({ return this.get('order') === "op_likes"; }.property('order'), + @observes('topics.[]') + topicsAdded() { + // special case so we don't keep scanning huge lists + if (!this.get('lastVisitedTopic')) { + this.refreshLastVisited(); + } + }, + + @observes('topics', 'order', 'ascending', 'category', 'top') + lastVisitedTopicChanged() { + this.refreshLastVisited(); + }, + + _updateLastVisitedTopic(topics, order, ascending, top) { + + this.set('lastVisitedTopic', null); + + if (!this.get('highlightLastVisited')) { + return; + } + + if (order !== "default" && order !== "activity") { + return; + } + + if (top) { + return; + } + + if (!topics || topics.length === 1) { + return; + } + + if (ascending) { + return; + } + + let user = Discourse.User.current(); + if (!user || !user.previous_visit_at) { + return; + } + + let lastVisitedTopic, topic; + + let prevVisit = user.get('previousVisitAt'); + + // this is more efficient cause we keep appending to list + // work backwards + let start = 0; + while(topics[start] && topics[start].get('pinned')) { + start++; + } + + let i; + for(i=topics.length-1;i>=start;i--){ + if (topics[i].get('bumpedAt') > prevVisit) { + lastVisitedTopic = topics[i]; + break; + } + topic = topics[i]; + } + + if (!lastVisitedTopic || !topic) { + return; + } + + // end of list that was scanned + if (topic.get('bumpedAt') > prevVisit) { + return; + } + + this.set('lastVisitedTopic', lastVisitedTopic); + }, + + refreshLastVisited() { + this._updateLastVisitedTopic(this.get('topics'), this.get('order'), this.get('ascending'), this.get('top')); + }, + click(e) { var self = this; - var on = function(sel, callback){ + var onClick = function(sel, callback){ var target = $(e.target).closest(sel); if(target.length === 1){ @@ -40,12 +120,20 @@ export default Ember.Component.extend({ } }; - on('button.bulk-select', function(){ + onClick('button.bulk-select', function(){ this.sendAction('toggleBulkSelect'); this.rerender(); }); - on('th.sortable', function(e2){ + onClick('button.bulk-select-all', function(){ + $('input.bulk-select:not(:checked)').click(); + }); + + onClick('button.bulk-clear-all', function(){ + $('input.bulk-select:checked').click(); + }); + + onClick('th.sortable', function(e2){ this.sendAction('changeSort', e2.data('sort-order')); this.rerender(); }); diff --git a/app/assets/javascripts/discourse/components/topic-navigation.js.es6 b/app/assets/javascripts/discourse/components/topic-navigation.js.es6 index 945d14420e0..ecae615fc56 100644 --- a/app/assets/javascripts/discourse/components/topic-navigation.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-navigation.js.es6 @@ -1,17 +1,81 @@ +import { observes } from 'ember-addons/ember-computed-decorators'; +import showModal from 'discourse/lib/show-modal'; + export default Ember.Component.extend({ composerOpen: null, - classNameBindings: ['composerOpen'], - showTimeline: null, - info: null, + info: Em.Object.create(), + + _performCheckSize() { + if (!this.element || this.isDestroying || this.isDestroyed) { return; } + + let info = this.get('info'); + + if (info.get('topicProgressExpanded')) { + + info.setProperties({ + renderTimeline: true, + renderAdminMenuButton: true + }); + + } else { + + let renderTimeline = !this.site.mobileView; + + if (renderTimeline) { + + const width = $(window).width(); + let height = $(window).height(); + + if (this.get('composerOpen')) { + height -= $('#reply-control').height(); + } + + renderTimeline = width > 960 && height > 520; + } + + info.setProperties({ + renderTimeline, + renderAdminMenuButton: !renderTimeline + }); + } + }, _checkSize() { - const renderTimeline = $(window).width() > 960; - this.set('info', { renderTimeline, showTimeline: renderTimeline && !this.get('composerOpen') }); + Ember.run.scheduleOnce('afterRender', this, this._performCheckSize); + }, + + // we need to store this so topic progress has something to init with + _topicScrolled(event) { + this.set('info.prevEvent', event); + }, + + @observes('info.topicProgressExpanded') + _expanded() { + if (this.get('info.topicProgressExpanded')) { + $(window).on('click.hide-fullscreen', (e) => { + let $target = $(e.target); + let $parents = $target.parents(); + if ( !$target.is('.widget-button') && + !$parents.is('.widget-button') && + !$parents.is('.dropdown-menu') && + ( + $target.is('.topic-timeline') || + !$parents.is('#topic-progress-wrapper') + ) + ) { + this._collapseFullscreen(); + } + }); + } else { + $(window).off('click.hide-fullscreen'); + } + this._checkSize(); }, composerOpened() { this.set('composerOpen', true); - this._checkSize(); + // we need to do the check after animation is done + Ember.run.later(() => this._checkSize(), 500); }, composerClosed() { @@ -19,25 +83,60 @@ export default Ember.Component.extend({ this._checkSize(); }, + _collapseFullscreen() { + if (this.get('info.topicProgressExpanded')) { + $('.timeline-fullscreen').removeClass('show'); + setTimeout(() => { + this.set('info.topicProgressExpanded', false); + this._checkSize(); + },500); + } + }, + + keyboardTrigger(e) { + if (e.type === "jump") { + const controller = showModal('jump-to-post'); + controller.setProperties({ + topic: this.get('topic'), + postNumber: 1, + jumpToIndex: this.attrs.jumpToIndex + }); + } + }, + didInsertElement() { this._super(); + this.appEvents + .on('topic:current-post-scrolled', this, this._topicScrolled) + .on('topic:jump-to-post', this, this._collapseFullscreen) + .on('topic:keyboard-trigger', this, this.keyboardTrigger); + if (!this.site.mobileView) { $(window).on('resize.discourse-topic-navigation', () => this._checkSize()); this.appEvents.on('composer:will-open', this, this.composerOpened); this.appEvents.on('composer:will-close', this, this.composerClosed); - this._checkSize(); - } else { - this.set('info', null); + $('#reply-control').on('div-resized.discourse-topic-navigation', () => this._checkSize()); } + + this._checkSize(); }, willDestroyElement() { this._super(); + + this.appEvents + .off('topic:current-post-scrolled', this, this._topicScrolled) + .off('topic:jump-to-post', this, this._collapseFullscreen) + .off('topic:keyboard-trigger', this, this.keyboardTrigger); + + $(window).off('click.hide-fullscreen'); + if (!this.site.mobileView) { $(window).off('resize.discourse-topic-navigation'); this.appEvents.off('composer:will-open', this, this.composerOpened); this.appEvents.off('composer:will-close', this, this.composerClosed); + $('#reply-control').off('div-resized.discourse-topic-navigation'); } } }); diff --git a/app/assets/javascripts/discourse/components/topic-post-badges.js.es6 b/app/assets/javascripts/discourse/components/topic-post-badges.js.es6 index ff9b0131e4d..9eb07ade4fb 100644 --- a/app/assets/javascripts/discourse/components/topic-post-badges.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-post-badges.js.es6 @@ -1,23 +1,21 @@ -import StringBuffer from 'discourse/mixins/string-buffer'; +import { bufferedRender } from 'discourse-common/lib/buffered-render'; // Creates a link function link(buffer, prop, url, cssClass, i18nKey, text) { if (!prop) { return; } - - var title = I18n.t("topic." + i18nKey, {count: prop}); - buffer.push("" + (text || prop) + "\n"); + const title = I18n.t("topic." + i18nKey, { count: prop }); + buffer.push(`${text || prop}\n`); } -export default Ember.Component.extend(StringBuffer, { +export default Ember.Component.extend(bufferedRender({ tagName: 'span', classNameBindings: [':topic-post-badges'], rerenderTriggers: ['url', 'unread', 'newPosts', 'unseen'], - renderString: function(buffer) { - var url = this.get('url'); - + buildBuffer(buffer) { + const url = this.get('url'); link(buffer, this.get('unread'), url, 'unread', 'unread_posts'); link(buffer, this.get('newPosts'), url, 'new-posts', 'new_posts'); link(buffer, this.get('unseen'), url, 'new-topic', 'new', I18n.t('filters.new.lower_title')); } -}); +})); diff --git a/app/assets/javascripts/discourse/components/topic-progress.js.es6 b/app/assets/javascripts/discourse/components/topic-progress.js.es6 index 86533ed6a65..f20f47426d7 100644 --- a/app/assets/javascripts/discourse/components/topic-progress.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-progress.js.es6 @@ -2,40 +2,12 @@ import { default as computed, observes } from 'ember-addons/ember-computed-decor export default Ember.Component.extend({ elementId: 'topic-progress-wrapper', - classNameBindings: ['docked', 'hidden'], - expanded: false, - toPostIndex: null, + classNameBindings: ['docked'], docked: false, progressPosition: null, postStream: Ember.computed.alias('topic.postStream'), - userWantsToJump: null, _streamPercentage: null, - init() { - this._super(); - (this.get('delegated') || []).forEach(m => this.set(m, m)); - }, - - @computed('userWantsToJump', 'showTimeline') - hidden(userWantsToJump, showTimeline) { - return !userWantsToJump && showTimeline; - }, - - @observes('hidden') - visibilityChanged() { - if (!this.get('hidden')) { - this._updateBar(); - } - }, - - keyboardTrigger(kbdEvent) { - if (kbdEvent.type === 'jump') { - this.set('expanded', true); - this.set('userWantsToJump', true); - Ember.run.scheduleOnce('afterRender', () => this.$('.jump-form input').focus()); - } - }, - @computed('progressPosition') jumpTopDisabled(progressPosition) { return progressPosition <= 3; @@ -65,6 +37,15 @@ export default Ember.Component.extend({ } }, + @computed('progressPosition', 'topic.last_read_post_id') + showBackButton(position, lastReadId) { + if (!lastReadId) { return; } + + const stream = this.get('postStream.stream'); + const readPos = stream.indexOf(lastReadId) || 0; + return (readPos < (stream.length - 1)) && (readPos > position); + }, + @observes('postStream.stream.[]') _updateBar() { Ember.run.scheduleOnce('afterRender', this, this._updateProgressBar); @@ -83,10 +64,15 @@ export default Ember.Component.extend({ .on("composer:resized", this, this._dock) .on('composer:closed', this, this._dock) .on("topic:scrolled", this, this._dock) - .on('topic:current-post-scrolled', this, this._topicScrolled) - .on('topic-progress:keyboard-trigger', this, this.keyboardTrigger); + .on('topic:current-post-scrolled', this, this._topicScrolled); - Ember.run.scheduleOnce('afterRender', this, this._updateProgressBar); + const prevEvent = this.get('prevEvent'); + if (prevEvent) { + Ember.run.scheduleOnce('afterRender', this, this._topicScrolled, prevEvent); + } else { + Ember.run.scheduleOnce('afterRender', this, this._updateProgressBar); + } + Ember.run.scheduleOnce('afterRender', this, this._dock); }, willDestroyElement() { @@ -95,12 +81,11 @@ export default Ember.Component.extend({ .off("composer:resized", this, this._dock) .off('composer:closed', this, this._dock) .off('topic:scrolled', this, this._dock) - .off('topic:current-post-scrolled', this, this._topicScrolled) - .off('topic-progress:keyboard-trigger'); + .off('topic:current-post-scrolled', this, this._topicScrolled); }, _updateProgressBar() { - if (this.isDestroyed || this.isDestroying || this.get('hidden')) { return; } + if (this.isDestroyed || this.isDestroying) { return; } const $topicProgress = this.$('#topic-progress'); // speeds up stuff, bypass jquery slowness and extra checks @@ -127,6 +112,10 @@ export default Ember.Component.extend({ offset = window.pageYOffset || $('html').scrollTop(), topicProgressHeight = $('#topic-progress').height(); + if (!$topicProgressWrapper || $topicProgressWrapper.length === 0) { + return; + } + let isDocked = false; if (maximumOffset) { const threshold = maximumOffset.top; @@ -156,71 +145,15 @@ export default Ember.Component.extend({ } }, - keyDown(e) { - if (this.get('expanded')) { - if (e.keyCode === 13) { - this.$('input').blur(); - this.send('jumpPost'); - } else if (e.keyCode === 27) { - this.send('toggleExpansion'); - this.set('userWantsToJump', false); - } - } - }, - - _jumpTo(postIndex) { - postIndex = parseInt(postIndex, 10); - - // Validate the post index first - if (isNaN(postIndex) || postIndex < 1) { - postIndex = 1; - } - if (postIndex > this.get('postStream.filteredPostsCount')) { - postIndex = this.get('postStream.filteredPostsCount'); - } - this.set('toPostIndex', postIndex); - this._beforeJump(); - this.sendAction('jumpToIndex', postIndex); - }, actions: { - toggleExpansion(opts) { + toggleExpansion() { this.toggleProperty('expanded'); - if (this.get('expanded')) { - this.set('userWantsToJump', false); - this.set('toPostIndex', this.get('progressPosition')); - if (opts && opts.highlight) { - Ember.run.next(() => $('.jump-form input').select().focus()); - } - if (!this.site.mobileView && !this.capabilities.isIOS) { - Ember.run.schedule('afterRender', () => this.$('input').focus()); - } - } }, - jumpPrompt() { - const postIndex = prompt(I18n.t('topic.progress.jump_prompt_long')); - if (postIndex === null) { return; } - this._jumpTo(postIndex); - }, - - jumpPost() { - this._jumpTo(this.get('toPostIndex')); - }, - - jumpTop() { - this._beforeJump(); - this.sendAction('jumpTop'); - }, - - jumpBottom() { - this._beforeJump(); - this.sendAction('jumpBottom'); + goBack() { + this.attrs.jumpToPost(this.get('topic.last_read_post_number')); } }, - _beforeJump() { - this.set('expanded', false); - this.set('userWantsToJump', false); - } }); diff --git a/app/assets/javascripts/discourse/components/topic-status.js.es6 b/app/assets/javascripts/discourse/components/topic-status.js.es6 index e8fc527cceb..bede7d57a6a 100644 --- a/app/assets/javascripts/discourse/components/topic-status.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-status.js.es6 @@ -1,8 +1,8 @@ -import { iconHTML } from 'discourse/helpers/fa-icon'; -import StringBuffer from 'discourse/mixins/string-buffer'; +import { iconHTML } from 'discourse-common/helpers/fa-icon'; +import { bufferedRender } from 'discourse-common/lib/buffered-render'; import { escapeExpression } from 'discourse/lib/utilities'; -export default Ember.Component.extend(StringBuffer, { +export default Ember.Component.extend(bufferedRender({ classNames: ['topic-statuses'], rerenderTriggers: ['topic.archived', 'topic.closed', 'topic.pinned', 'topic.visible', 'topic.unpinned', 'topic.is_warning'], @@ -26,9 +26,7 @@ export default Ember.Component.extend(StringBuffer, { return Discourse.User.current() && !this.get('disableActions'); }.property('disableActions'), - renderString(buffer) { - const self = this; - + buildBuffer(buffer) { const renderIcon = function(name, key, actionable) { const title = escapeExpression(I18n.t(`topic_statuses.${key}.help`)), startTag = actionable ? "a href" : "span", @@ -39,8 +37,8 @@ export default Ember.Component.extend(StringBuffer, { buffer.push(`<${startTag} title='${title}' class='topic-status'>${icon}${endTag}>`); }; - const renderIconIf = function(conditionProp, name, key, actionable) { - if (!self.get(conditionProp)) { return; } + const renderIconIf = (conditionProp, name, key, actionable) => { + if (!this.get(conditionProp)) { return; } renderIcon(name, key, actionable); }; @@ -57,4 +55,4 @@ export default Ember.Component.extend(StringBuffer, { renderIconIf('topic.unpinned', 'thumb-tack', 'unpinned', this.get("canAct")); renderIconIf('topic.invisible', 'eye-slash', 'invisible'); } -}); +})); diff --git a/app/assets/javascripts/discourse/components/topic-timeline.js.es6 b/app/assets/javascripts/discourse/components/topic-timeline.js.es6 index d3b2f648a47..eaa065857cb 100644 --- a/app/assets/javascripts/discourse/components/topic-timeline.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-timeline.js.es6 @@ -10,12 +10,28 @@ export default MountWidget.extend(Docking, { dockAt: null, buildArgs() { - return { topic: this.get('topic'), - topicTrackingState: this.topicTrackingState, - enteredIndex: this.get('enteredIndex'), - dockAt: this.dockAt, - top: this.dockAt || FIXED_POS, - dockBottom: this.dockBottom }; + let attrs = { + topic: this.get('topic'), + topicTrackingState: this.topicTrackingState, + enteredIndex: this.get('enteredIndex'), + dockBottom: this.dockBottom, + mobileView: this.get('site.mobileView') + }; + + let event = this.get('prevEvent'); + if (event) { + attrs.enteredIndex = event.postIndex-1; + } + + if (this.get('fullscreen')) { + attrs.fullScreen = true; + attrs.addShowClass = this.get('addShowClass'); + } else { + attrs.dockAt = this.dockAt; + attrs.top = this.dockAt || FIXED_POS; + } + + return attrs; }, @observes('topic.highest_post_number', 'loading') @@ -54,6 +70,15 @@ export default MountWidget.extend(Docking, { didInsertElement() { this._super(); + + if (this.get('fullscreen') && !this.get('addShowClass')) { + Em.run.next(()=>{ + this.set('addShowClass', true); + this.queueRerender(); + }); + } + this.dispatch('topic:current-post-scrolled', 'timeline-scrollarea'); + this.dispatch('topic-notifications-button:keyboard-trigger', 'topic-notifications-button'); } }); diff --git a/app/assets/javascripts/discourse/components/user-card-contents.js.es6 b/app/assets/javascripts/discourse/components/user-card-contents.js.es6 new file mode 100644 index 00000000000..81d7e5c93e8 --- /dev/null +++ b/app/assets/javascripts/discourse/components/user-card-contents.js.es6 @@ -0,0 +1,271 @@ +import { wantsNewWindow } from 'discourse/lib/intercept-click'; +import { propertyNotEqual, setting } from 'discourse/lib/computed'; +import CleansUp from 'discourse/mixins/cleans-up'; +import afterTransition from 'discourse/lib/after-transition'; +import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; +import DiscourseURL from 'discourse/lib/url'; +import User from 'discourse/models/user'; + +const clickOutsideEventName = "mousedown.outside-user-card"; +const clickDataExpand = "click.discourse-user-card"; +const clickMention = "click.discourse-user-mention"; + +export default Ember.Component.extend(CleansUp, { + elementId: 'user-card', + classNameBindings: ['visible:show', 'showBadges', 'hasCardBadgeImage', 'user.card_background::no-bg'], + allowBackgrounds: setting('allow_profile_backgrounds'), + + postStream: Ember.computed.alias('topic.postStream'), + enoughPostsForFiltering: Ember.computed.gte('topicPostCount', 2), + viewingTopic: Ember.computed.match('currentPath', /^topic\./), + viewingAdmin: Ember.computed.match('currentPath', /^admin\./), + showFilter: Ember.computed.and('viewingTopic', 'postStream.hasNoFilters', 'enoughPostsForFiltering'), + showName: propertyNotEqual('user.name', 'user.username'), + hasUserFilters: Ember.computed.gt('postStream.userFilters.length', 0), + isSuspended: Ember.computed.notEmpty('user.suspend_reason'), + showBadges: setting('enable_badges'), + showMoreBadges: Ember.computed.gt('moreBadgesCount', 0), + showDelete: Ember.computed.and("viewingAdmin", "showName", "user.canBeDeleted"), + linkWebsite: Ember.computed.not('user.isBasic'), + hasLocationOrWebsite: Ember.computed.or('user.location', 'user.website_name'), + + visible: false, + user: null, + username: null, + avatar: null, + userLoading: null, + cardTarget: null, + post: null, + + // If inside a topic + topicPostCount: null, + + @computed('user.name') + nameFirst(name) { + return !this.siteSettings.prioritize_username_in_ux && name && name.trim().length > 0; + }, + + @computed('user.user_fields.@each.value') + publicUserFields() { + const siteUserFields = this.site.get('user_fields'); + if (!Ember.isEmpty(siteUserFields)) { + const userFields = this.get('user.user_fields'); + return siteUserFields.filterBy('show_on_user_card', true).sortBy('position').map(field => { + Ember.set(field, 'dasherized_name', field.get('name').dasherize()); + const value = userFields ? userFields[field.get('id')] : null; + return Ember.isEmpty(value) ? null : Ember.Object.create({ value, field }); + }).compact(); + } + }, + + @computed("user.trust_level") + removeNoFollow(trustLevel) { + return trustLevel > 2 && !this.siteSettings.tl3_links_no_follow; + }, + + @computed('user.badge_count', 'user.featured_user_badges.length') + moreBadgesCount: (badgeCount, badgeLength) => badgeCount - badgeLength, + + @computed('user.card_badge.image') + hasCardBadgeImage: image => image && image.indexOf('fa-') !== 0, + + @observes('user.card_background') + addBackground() { + if (!this.get('allowBackgrounds')) { return; } + + const $this = this.$(); + if (!$this) { return; } + + const url = this.get('user.card_background'); + const bg = Ember.isEmpty(url) ? '' : `url(${Discourse.getURLWithCDN(url)})`; + $this.css('background-image', bg); + }, + + _show(username, $target) { + // No user card for anon + if (this.siteSettings.hide_user_profiles_from_public && !this.currentUser) { + return true; + } + + // XSS protection (should be encapsulated) + username = username.toString().replace(/[^A-Za-z0-9_\.\-]/g, ""); + + // Don't show on mobile + if (this.site.mobileView) { + DiscourseURL.routeTo(`/users/${username}`); + return false; + } + + const currentUsername = this.get('username'); + if (username === currentUsername && this.get('userLoading') === username) { + return; + } + + const postId = $target.parents('article').data('post-id'); + + const wasVisible = this.get('visible'); + const previousTarget = this.get('cardTarget'); + const target = $target[0]; + if (wasVisible) { + this._close(); + if (target === previousTarget) { return; } + } + + const post = this.get('viewingTopic') && postId ? this.get('postStream').findLoadedPost(postId) : null; + this.setProperties({ username, userLoading: username, cardTarget: target, post }); + + const args = { stats: false }; + args.include_post_count_for = this.get('topic.id'); + args.skip_track_visit = true; + + User.findByUsername(username, args).then(user => { + if (user.topic_post_count) { + this.set('topicPostCount', user.topic_post_count[args.include_post_count_for]); + } + this.setProperties({ user, avatar: user, visible: true }); + + this._positionCard($target); + }).catch(() => this._close()).finally(() => this.set('userLoading', null)); + + return false; + }, + + didInsertElement() { + this._super(); + afterTransition(this.$(), this._hide.bind(this)); + + $('html').off(clickOutsideEventName) + .on(clickOutsideEventName, (e) => { + if (this.get('visible')) { + const $target = $(e.target); + if ($target.closest('[data-user-card]').data('userCard') || + $target.closest('a.mention').length > 0 || + $target.closest('#user-card').length > 0) { + return; + } + + this._close(); + } + + return true; + }); + + $('#main-outlet').on(clickDataExpand, '[data-user-card]', (e) => { + if (wantsNewWindow(e)) { return; } + const $target = $(e.currentTarget); + return this._show($target.data('user-card'), $target); + }); + + $('#main-outlet').on(clickMention, 'a.mention', (e) => { + if (wantsNewWindow(e)) { return; } + const $target = $(e.target); + return this._show($target.text().replace(/^@/, ''), $target); + }); + }, + + _positionCard(target) { + const rtl = ($('html').css('direction')) === 'rtl'; + if (!target) { return; } + const width = this.$().width(); + + Ember.run.schedule('afterRender', () => { + if (target) { + let position = target.offset(); + if (position) { + + if (rtl) { // The site direction is rtl + position.right = $(window).width() - position.left + 10; + position.left = 'auto'; + let overage = ($(window).width() - 50) - (position.right + width); + if (overage < 0) { + position.right += overage; + position.top += target.height() + 48; + } + } else { // The site direction is ltr + position.left += target.width() + 10; + + let overage = ($(window).width() - 50) - (position.left + width); + if (overage < 0) { + position.left += overage; + position.top += target.height() + 48; + } + } + + position.top -= $('#main-outlet').offset().top; + this.$().css(position); + } + + // After the card is shown, focus on the first link + // + // note: we DO NOT use afterRender here cause _positionCard may + // run afterwards, if we allowed this to happen the usercard + // may be offscreen and we may scroll all the way to it on focus + Ember.run.next(null, () => this.$('a:first').focus() ); + } + }); + }, + + _hide() { + if (!this.get('visible')) { + this.$().css({left: -9999, top: -9999}); + } + }, + + _close() { + this.setProperties({ + visible: false, + user: null, + username: null, + avatar: null, + userLoading: null, + cardTarget: null, + post: null, + topicPostCount: null + }); + }, + + cleanUp() { + this._close(); + }, + + keyUp(e) { + if (e.keyCode === 27) { // ESC + const target = this.get('cardTarget'); + this._close(); + target.focus(); + } + }, + + willDestroyElement() { + this._super(); + $('html').off(clickOutsideEventName); + $('#main').off(clickDataExpand).off(clickMention); + }, + + actions: { + cancelFilter() { + const postStream = this.get('postStream'); + postStream.cancelFilter(); + postStream.refresh(); + this._close(); + }, + + composePrivateMessage(...args) { + this.sendAction('composePrivateMessage', ...args); + }, + + togglePosts() { + this.sendAction('togglePosts', this.get('user')); + this._close(); + }, + + deleteUser() { + this.sendAction('deleteUser', this.get('user')); + }, + + showUser() { + this.sendAction('showUser', this.get('user')); + this._close(); + } + } +}); diff --git a/app/assets/javascripts/discourse/components/user-selector.js.es6 b/app/assets/javascripts/discourse/components/user-selector.js.es6 index 862f0fae491..5fda51dec6f 100644 --- a/app/assets/javascripts/discourse/components/user-selector.js.es6 +++ b/app/assets/javascripts/discourse/components/user-selector.js.es6 @@ -1,10 +1,16 @@ import { observes } from 'ember-addons/ember-computed-decorators'; import TextField from 'discourse/components/text-field'; import userSearch from 'discourse/lib/user-search'; +import { findRawTemplate } from 'discourse/lib/raw-templates'; export default TextField.extend({ + @observes('usernames') + _update() { + if (this.get('canReceiveUpdates') === 'true') + this.didInsertElement({updateData: true}); + }, - didInsertElement() { + didInsertElement(opts) { this._super(); var self = this, selected = [], @@ -25,10 +31,11 @@ export default TextField.extend({ } this.$().val(this.get('usernames')).autocomplete({ - template: this.container.lookup('template:user-selector-autocomplete.raw'), + template: findRawTemplate('user-selector-autocomplete'), disabled: this.get('disabled'), single: this.get('single'), allowAny: this.get('allowAny'), + updateData: (opts && opts.updateData) ? opts.updateData : false, dataSource: function(term) { var results = userSearch({ diff --git a/app/assets/javascripts/discourse/components/visible.js.es6 b/app/assets/javascripts/discourse/components/visible.js.es6 deleted file mode 100644 index f9570e412ea..00000000000 --- a/app/assets/javascripts/discourse/components/visible.js.es6 +++ /dev/null @@ -1,12 +0,0 @@ -export default Ember.Component.extend({ - visibleChanged: function(){ - this.rerender(); - }.observes("visible"), - - render: function(buffer){ - if (this._state !== 'inDOM' && this._state !== 'preRender' && this._state !== 'inBuffer') { return; } - if (!this.get("visible")) { return; } - - return this._super(buffer); - } -}); diff --git a/app/assets/javascripts/discourse/components/watch-read.js.es6 b/app/assets/javascripts/discourse/components/watch-read.js.es6 new file mode 100644 index 00000000000..2a92380cbec --- /dev/null +++ b/app/assets/javascripts/discourse/components/watch-read.js.es6 @@ -0,0 +1,24 @@ +import isElementInViewport from "discourse/lib/is-element-in-viewport"; + +export default Ember.Component.extend({ + didInsertElement() { + this._super(); + const currentUser = this.currentUser; + if (!currentUser) { return; } + + const path = this.get('path'); + if (path === "faq" || path === "guidelines") { + $(window).on('load.faq resize.faq scroll.faq', () => { + const faqUnread = !currentUser.get('read_faq'); + if (faqUnread && isElementInViewport($(".contents p").last())) { + this.sendAction(); + } + }); + } + }, + + willDestroyElement() { + this._super(); + $(window).off('load.faq resize.faq scroll.faq'); + } +}); diff --git a/app/assets/javascripts/discourse/controllers/application.js.es6 b/app/assets/javascripts/discourse/controllers/application.js.es6 index dc9f45d3220..78402acd259 100644 --- a/app/assets/javascripts/discourse/controllers/application.js.es6 +++ b/app/assets/javascripts/discourse/controllers/application.js.es6 @@ -15,4 +15,10 @@ export default Ember.Controller.extend({ loginRequired() { return Discourse.SiteSettings.login_required && !Discourse.User.current(); }, + + actions: { + appRouteAction(name) { + return this.send(name); + } + } }); diff --git a/app/assets/javascripts/discourse/controllers/avatar-selector.js.es6 b/app/assets/javascripts/discourse/controllers/avatar-selector.js.es6 index a39c7deacdc..ab30fef1572 100644 --- a/app/assets/javascripts/discourse/controllers/avatar-selector.js.es6 +++ b/app/assets/javascripts/discourse/controllers/avatar-selector.js.es6 @@ -1,5 +1,6 @@ import computed from "ember-addons/ember-computed-decorators"; import ModalFunctionality from "discourse/mixins/modal-functionality"; +import { ajax } from 'discourse/lib/ajax'; import { allowsImages } from 'discourse/lib/utilities'; @@ -28,14 +29,13 @@ export default Ember.Controller.extend(ModalFunctionality, { }, actions: { - useUploadedAvatar() { this.set("selected", "uploaded"); }, - useGravatar() { this.set("selected", "gravatar"); }, - useSystem() { this.set("selected", "system"); }, + uploadComplete() { + this.set("selected", "uploaded"); + }, refreshGravatar() { this.set("gravatarRefreshDisabled", true); - return Discourse - .ajax(`/user_avatar/${this.get("username")}/refresh_gravatar.json`, { method: "POST" }) + return ajax(`/user_avatar/${this.get("username")}/refresh_gravatar.json`, { method: "POST" }) .then(result => this.setProperties({ gravatar_avatar_template: result.gravatar_avatar_template, gravatar_avatar_upload_id: result.gravatar_upload_id, diff --git a/app/assets/javascripts/discourse/controllers/badges/show.js.es6 b/app/assets/javascripts/discourse/controllers/badges/show.js.es6 index 086e353c07b..f7f79f14c48 100644 --- a/app/assets/javascripts/discourse/controllers/badges/show.js.es6 +++ b/app/assets/javascripts/discourse/controllers/badges/show.js.es6 @@ -5,7 +5,7 @@ export default Ember.Controller.extend({ queryParams: ['username'], noMoreBadges: false, userBadges: null, - needs: ["application"], + application: Ember.inject.controller(), @computed('username') user(username) { @@ -55,7 +55,7 @@ export default Ember.Controller.extend({ @observes('canLoadMore') _showFooter() { - this.set("controllers.application.showFooter", !this.get("canLoadMore")); + this.set("application.showFooter", !this.get("canLoadMore")); } }); diff --git a/app/assets/javascripts/discourse/controllers/bulk-notification-level.js.es6 b/app/assets/javascripts/discourse/controllers/bulk-notification-level.js.es6 index d4a3ebbd2ad..cd0cf9c11b5 100644 --- a/app/assets/javascripts/discourse/controllers/bulk-notification-level.js.es6 +++ b/app/assets/javascripts/discourse/controllers/bulk-notification-level.js.es6 @@ -3,7 +3,7 @@ import { topicLevels } from 'discourse/lib/notification-levels'; // Support for changing the notification level of various topics export default Ember.Controller.extend({ - needs: ['topic-bulk-actions'], + topicBulkActions: Ember.inject.controller(), notificationLevelId: null, @computed @@ -21,7 +21,7 @@ export default Ember.Controller.extend({ actions: { changeNotificationLevel() { - this.get('controllers.topic-bulk-actions').performAndRefresh({ + this.get('topicBulkActions').performAndRefresh({ type: 'change_notification_level', notification_level_id: this.get('notificationLevelId') }); diff --git a/app/assets/javascripts/discourse/controllers/change-owner.js.es6 b/app/assets/javascripts/discourse/controllers/change-owner.js.es6 index 532b21a0bbb..84c323b88a6 100644 --- a/app/assets/javascripts/discourse/controllers/change-owner.js.es6 +++ b/app/assets/javascripts/discourse/controllers/change-owner.js.es6 @@ -4,9 +4,7 @@ import DiscourseURL from 'discourse/lib/url'; // Modal related to changing the ownership of posts export default Ember.Controller.extend(SelectedPostsCount, ModalFunctionality, { - needs: ['topic'], - - topicController: Em.computed.alias('controllers.topic'), + topicController: Ember.inject.controller('topic'), selectedPosts: Em.computed.alias('topicController.selectedPosts'), saving: false, new_user: null, diff --git a/app/assets/javascripts/discourse/controllers/change-timestamp.js.es6 b/app/assets/javascripts/discourse/controllers/change-timestamp.js.es6 index 1cd859cfa68..c24cf785c90 100644 --- a/app/assets/javascripts/discourse/controllers/change-timestamp.js.es6 +++ b/app/assets/javascripts/discourse/controllers/change-timestamp.js.es6 @@ -4,9 +4,8 @@ import DiscourseURL from 'discourse/lib/url'; // Modal related to changing the timestamp of posts export default Ember.Controller.extend(ModalFunctionality, { - needs: ['topic'], - topicController: Em.computed.alias('controllers.topic'), + topicController: Ember.inject.controller('topic'), saving: false, date: '', time: '', diff --git a/app/assets/javascripts/discourse/controllers/composer.js.es6 b/app/assets/javascripts/discourse/controllers/composer.js.es6 index b89d61a98b1..c5e69a45a17 100644 --- a/app/assets/javascripts/discourse/controllers/composer.js.es6 +++ b/app/assets/javascripts/discourse/controllers/composer.js.es6 @@ -4,8 +4,10 @@ import Draft from 'discourse/models/draft'; import Composer from 'discourse/models/composer'; import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; import { relativeAge } from 'discourse/lib/formatter'; -import { escapeExpression } from 'discourse/lib/utilities'; import InputValidation from 'discourse/models/input-validation'; +import { getOwner } from 'discourse-common/lib/get-owner'; +import { escapeExpression } from 'discourse/lib/utilities'; +import { emojiUnescape } from 'discourse/lib/text'; function loadDraft(store, opts) { opts = opts || {}; @@ -51,7 +53,9 @@ export function addPopupMenuOptionsCallback(callback) { } export default Ember.Controller.extend({ - needs: ['modal', 'topic', 'application'], + topicController: Ember.inject.controller('topic'), + application: Ember.inject.controller(), + replyAsNewTopicDraft: Em.computed.equal('model.draftKey', Composer.REPLY_AS_NEW_TOPIC_KEY), checkedMessages: false, messageCount: null, @@ -69,7 +73,9 @@ export default Ember.Controller.extend({ focusTarget(replyingToTopic, creatingPM, usernames) { if (this.capabilities.isIOS) { return "none"; } - if (creatingPM && usernames === this.currentUser.get('username')) { + // Focus on usernames if it's blank or if it's just you + usernames = usernames || ""; + if (creatingPM && usernames.length === 0 || usernames === this.currentUser.get('username')) { return 'usernames'; } @@ -81,8 +87,8 @@ export default Ember.Controller.extend({ }, showToolbar: Em.computed({ - get(){ - const keyValueStore = this.container.lookup('key-value-store:main'); + get() { + const keyValueStore = getOwner(this).lookup('key-value-store:main'); const storedVal = keyValueStore.get("toolbar-enabled"); if (this._toolbarEnabled === undefined && storedVal === undefined) { // iPhone 6 is 375, anything narrower and toolbar should @@ -93,14 +99,14 @@ export default Ember.Controller.extend({ return this._toolbarEnabled || storedVal === "true"; }, set(key, val){ - const keyValueStore = this.container.lookup('key-value-store:main'); + const keyValueStore = getOwner(this).lookup('key-value-store:main'); this._toolbarEnabled = val; keyValueStore.set({key: "toolbar-enabled", value: val ? "true" : "false"}); return val; } }), - topicModel: Ember.computed.alias('controllers.topic.model'), + topicModel: Ember.computed.alias('topicController.model'), @computed('model.canEditTitle', 'model.creatingPrivateMessage') canEditTags(canEditTitle, creatingPrivateMessage) { @@ -191,7 +197,23 @@ export default Ember.Controller.extend({ return this.get('model.creatingPrivateMessage'); }.property('model.creatingPrivateMessage', 'model.targetUsernames'), + @computed('model.topic') + draftTitle(topic) { + return emojiUnescape(escapeExpression(topic.get('title'))); + }, + actions: { + + typed() { + this.checkReplyLength(); + this.get('model').typing(); + }, + + cancelled() { + this.send('hitEsc'); + this.send('hideOptions'); + }, + addLinkLookup(linkLookup) { this.set('linkLookup', linkLookup); }, @@ -340,6 +362,22 @@ export default Ember.Controller.extend({ }); }); } + }, + + cannotSeeMention(mentions) { + mentions.forEach(mention => { + const translation = (this.get('topic.isPrivateMessage')) ? + 'composer.cannot_see_mention.private' : + 'composer.cannot_see_mention.category'; + const body = I18n.t(translation, { + username: "@" + mention.name + }); + this.appEvents.trigger('composer-messages:create', { + extraClass: 'custom-body', + templateName: 'custom-body', + body + }); + }); } }, @@ -350,19 +388,14 @@ export default Ember.Controller.extend({ toggle() { this.closeAutocomplete(); - switch (this.get('model.composeState')) { - case Composer.OPEN: - if (Ember.isEmpty(this.get('model.reply')) && Ember.isEmpty(this.get('model.title'))) { - this.close(); - } else { - this.shrink(); - } - break; - case Composer.DRAFT: - this.set('model.composeState', Composer.OPEN); - break; - case Composer.SAVING: + if (this.get('model.composeState') === Composer.OPEN) { + if (Ember.isEmpty(this.get('model.reply')) && Ember.isEmpty(this.get('model.title'))) { this.close(); + } else { + this.shrink(); + } + } else { + this.close(); } return false; }, @@ -371,7 +404,6 @@ export default Ember.Controller.extend({ save(force) { const composer = this.get('model'); - const self = this; // Clear the warning state if we're not showing the checkbox anymore if (!this.get('showWarning')) { @@ -402,22 +434,20 @@ export default Ember.Controller.extend({ if (currentTopic) { buttons.push({ - "label": I18n.t("composer.reply_here") + "" + escapeExpression(currentTopic.get('title')) + "", + "label": I18n.t("composer.reply_here") + "" + currentTopic.get('fancyTitle') + "", "class": "btn btn-reply-here", - "callback": function() { + callback: () => { composer.set('topic', currentTopic); composer.set('post', null); - self.save(true); + this.save(true); } }); } buttons.push({ - "label": I18n.t("composer.reply_original") + "" + escapeExpression(this.get('model.topic.title')) + "", + "label": I18n.t("composer.reply_original") + "" + this.get('model.topic.fancyTitle') + "", "class": "btn-primary btn-reply-on-original", - "callback": function() { - self.save(true); - } + callback: () => this.save(true) }); bootbox.dialog(message, buttons, { "classes": "reply-where-modal" }); @@ -438,29 +468,32 @@ export default Ember.Controller.extend({ } }); - const promise = composer.save({ imageSizes, editReason: this.get("editReason")}).then(function(result) { + const promise = composer.save({ imageSizes, editReason: this.get("editReason")}).then(result=> { if (result.responseJson.action === "enqueued") { - self.send('postWasEnqueued', result.responseJson); - self.destroyDraft(); - self.close(); - self.appEvents.trigger('post-stream:refresh'); + this.send('postWasEnqueued', result.responseJson); + this.destroyDraft(); + this.close(); + this.appEvents.trigger('post-stream:refresh'); return result; } // If user "created a new topic/post" or "replied as a new topic" successfully, remove the draft. - if (result.responseJson.action === "create_post" || self.get('replyAsNewTopicDraft')) { - self.destroyDraft(); + if (result.responseJson.action === "create_post" || this.get('replyAsNewTopicDraft')) { + this.destroyDraft(); } - if (self.get('model.action') === 'edit') { - self.appEvents.trigger('post-stream:refresh', { id: parseInt(result.responseJson.id) }); + if (this.get('model.action') === 'edit') { + this.appEvents.trigger('post-stream:refresh', { id: parseInt(result.responseJson.id) }); + if (result.responseJson.post.post_number === 1) { + this.appEvents.trigger('header:show-topic', composer.get('topic')); + } } else { - self.appEvents.trigger('post-stream:refresh'); + this.appEvents.trigger('post-stream:refresh'); } if (result.responseJson.action === "create_post") { - self.appEvents.trigger('post:highlight', result.payload.post_number); + this.appEvents.trigger('post:highlight', result.payload.post_number); } - self.close(); + this.close(); const currentUser = Discourse.User.current(); if (composer.get('creatingTopic')) { @@ -477,12 +510,12 @@ export default Ember.Controller.extend({ } } - }).catch(function(error) { + }).catch(error => { composer.set('disableDrafts', false); - self.appEvents.one('composer:will-open', () => bootbox.alert(error)); + this.appEvents.one('composer:will-open', () => bootbox.alert(error)); }); - if (this.get('controllers.application.currentRouteName').split('.')[0] === 'topic' && + if (this.get('application.currentRouteName').split('.')[0] === 'topic' && composer.get('topic.id') === this.get('topicModel.id')) { staged = composer.get('stagedPost'); } @@ -614,10 +647,10 @@ export default Ember.Controller.extend({ let category; if (!splitCategory[1]) { - category = this.site.get('categories').findProperty('nameLower', splitCategory[0].toLowerCase()); + category = this.site.get('categories').findBy('nameLower', splitCategory[0].toLowerCase()); } else { const categories = Discourse.Category.list(); - const mainCategory = categories.findProperty('nameLower', splitCategory[0].toLowerCase()); + const mainCategory = categories.findBy('nameLower', splitCategory[0].toLowerCase()); category = categories.find(function(item) { return item && item.get('nameLower') === splitCategory[1].toLowerCase() && item.get('parent_category_id') === mainCategory.id; }); diff --git a/app/assets/javascripts/discourse/controllers/create-account.js.es6 b/app/assets/javascripts/discourse/controllers/create-account.js.es6 index 9bed6142a42..50bd0188021 100644 --- a/app/assets/javascripts/discourse/controllers/create-account.js.es6 +++ b/app/assets/javascripts/discourse/controllers/create-account.js.es6 @@ -7,7 +7,7 @@ import { emailValid } from 'discourse/lib/utilities'; import InputValidation from 'discourse/models/input-validation'; export default Ember.Controller.extend(ModalFunctionality, { - needs: ['login'], + login: Ember.inject.controller(), uniqueUsernameValidation: null, globalNicknameExists: false, @@ -56,7 +56,7 @@ export default Ember.Controller.extend(ModalFunctionality, { // Validate required fields let userFields = this.get('userFields'); - if (userFields) { userFields = userFields.filterProperty('field.required'); } + if (userFields) { userFields = userFields.filterBy('field.required'); } if (!Ember.isEmpty(userFields)) { const anyEmpty = userFields.any(function(uf) { const val = uf.get('value'); @@ -78,6 +78,13 @@ export default Ember.Controller.extend(ModalFunctionality, { return Ember.isEmpty(this.get('authOptions.auth_provider')); }.property('authOptions.auth_provider'), + disclaimerHtml: function() { + return I18n.t('create_account.disclaimer', { + tos_link: this.get('siteSettings.tos_url') || Discourse.getURL('/tos'), + privacy_link: this.get('siteSettings.privacy_policy_url') || Discourse.getURL('/privacy') + }); + }.property(), + passwordInstructions: function() { return this.get('isDeveloper') ? I18n.t('user.password.instructions', {count: Discourse.SiteSettings.min_admin_password_length}) : I18n.t('user.password.instructions', {count: Discourse.SiteSettings.min_password_length}); }.property('isDeveloper'), @@ -107,7 +114,7 @@ export default Ember.Controller.extend(ModalFunctionality, { email = this.get("accountEmail"); - if (this.get('rejectedEmails').contains(email)) { + if (this.get('rejectedEmails').includes(email)) { return InputValidation.create({ failed: true, reason: I18n.t('user.email.invalid') @@ -307,7 +314,7 @@ export default Ember.Controller.extend(ModalFunctionality, { }); } - if (this.get('rejectedPasswords').contains(password)) { + if (this.get('rejectedPasswords').includes(password)) { return InputValidation.create({ failed: true, reason: I18n.t('user.password.common') @@ -345,7 +352,7 @@ export default Ember.Controller.extend(ModalFunctionality, { actions: { externalLogin(provider) { - this.get('controllers.login').send('externalLogin', provider); + this.get('login').send('externalLogin', provider); }, createAccount() { diff --git a/app/assets/javascripts/discourse/controllers/discovery-sortable.js.es6 b/app/assets/javascripts/discourse/controllers/discovery-sortable.js.es6 index 5ac8d4b7339..276231067c3 100644 --- a/app/assets/javascripts/discourse/controllers/discovery-sortable.js.es6 +++ b/app/assets/javascripts/discourse/controllers/discovery-sortable.js.es6 @@ -1,21 +1,22 @@ // Just add query params here to have them automatically passed to topic list filters. -export var queryParams = { +export const queryParams = { order: { replace: true, refreshModel: true }, ascending: { replace: true, refreshModel: true }, status: { replace: true, refreshModel: true }, state: { replace: true, refreshModel: true }, search: { replace: true, refreshModel: true }, max_posts: { replace: true, refreshModel: true }, - q: { replace: true, refreshModel: true } + q: { replace: true, refreshModel: true }, + tags: { replace: true } }; // Basic controller options -var controllerOpts = { - needs: ['discovery/topics'], +const controllerOpts = { + discoveryTopics: Ember.inject.controller('discovery/topics'), queryParams: Object.keys(queryParams), }; // Aliases for the values -controllerOpts.queryParams.forEach(p => controllerOpts[p] = Em.computed.alias(`controllers.discovery/topics.${p}`)); +controllerOpts.queryParams.forEach(p => controllerOpts[p] = Ember.computed.alias(`discoveryTopics.${p}`)); export default Ember.Controller.extend(controllerOpts); diff --git a/app/assets/javascripts/discourse/controllers/discovery.js.es6 b/app/assets/javascripts/discourse/controllers/discovery.js.es6 index 2be7bfd2066..79128e82ad7 100644 --- a/app/assets/javascripts/discourse/controllers/discovery.js.es6 +++ b/app/assets/javascripts/discourse/controllers/discovery.js.es6 @@ -1,16 +1,19 @@ import DiscourseURL from 'discourse/lib/url'; export default Ember.Controller.extend({ - needs: ['navigation/category', 'discovery/topics', 'application'], + discoveryTopics: Ember.inject.controller('discovery/topics'), + navigationCategory: Ember.inject.controller('navigation/category'), + application: Ember.inject.controller(), + loading: false, - category: Em.computed.alias('controllers.navigation/category.category'), - noSubcategories: Em.computed.alias('controllers.navigation/category.noSubcategories'), + category: Em.computed.alias('navigationCategory.category'), + noSubcategories: Em.computed.alias('navigationCategory.noSubcategories'), - loadedAllItems: Em.computed.not("controllers.discovery/topics.model.canLoadMore"), + loadedAllItems: Em.computed.not("discoveryTopics.model.canLoadMore"), _showFooter: function() { - this.set("controllers.application.showFooter", this.get("loadedAllItems")); + this.set("application.showFooter", this.get("loadedAllItems")); }.observes("loadedAllItems"), showMoreUrl(period) { diff --git a/app/assets/javascripts/discourse/controllers/discovery/categories.js.es6 b/app/assets/javascripts/discourse/controllers/discovery/categories.js.es6 index 83b493076ff..19d6ae6b800 100644 --- a/app/assets/javascripts/discourse/controllers/discovery/categories.js.es6 +++ b/app/assets/javascripts/discourse/controllers/discovery/categories.js.es6 @@ -1,44 +1,29 @@ +import computed from 'ember-addons/ember-computed-decorators'; import DiscoveryController from 'discourse/controllers/discovery'; export default DiscoveryController.extend({ - needs: ['modal', 'discovery'], - - withLogo: Em.computed.filterBy('model.categories', 'logo_url'), - showPostsColumn: Em.computed.empty('withLogo'), + discovery: Ember.inject.controller(), // this makes sure the composer isn't scoping to a specific category category: null, - actions: { - - refresh() { - // Don't refresh if we're still loading - if (this.get('controllers.discovery.loading')) { return; } - - // If we `send('loading')` here, due to returning true it bubbles up to the - // router and ember throws an error due to missing `handlerInfos`. - // Lesson learned: Don't call `loading` yourself. - this.set('controllers.discovery.loading', true); - - const CategoryList = require('discourse/models/category-list').default; - const parentCategory = this.get('model.parentCategory'); - const promise = parentCategory ? CategoryList.listForParent(this.store, parentCategory) : - CategoryList.list(this.store); - - const self = this; - promise.then(function(list) { - self.set('model', list); - self.send('loadingComplete'); - }); - } + @computed + canEdit() { + return Discourse.User.currentProp('staff'); }, - canEdit: function() { - return Discourse.User.currentProp('staff'); - }.property(), + @computed("model.categories.[].featuredTopics.length") + latestTopicOnly() { + return this.get("model.categories").find(c => c.get("featuredTopics.length") > 1) === undefined; + }, - latestTopicOnly: function() { - return this.get('model.categories').find(c => c.get('featuredTopics.length') > 1) === undefined; - }.property('model.categories.@each.featuredTopics.length') + @computed("model.parentCategory") + categoryPageStyle(parentCategory) { + const style = this.siteSettings.desktop_category_page_style; + const componentName = (parentCategory && style === "categories_and_latest_topics") ? + "categories_only" : + style; + return Ember.String.dasherize(componentName); + } }); diff --git a/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 b/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 index 008ab29a3b0..4c92f6da87f 100644 --- a/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 +++ b/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 @@ -5,13 +5,14 @@ import { endWith } from 'discourse/lib/computed'; import showModal from 'discourse/lib/show-modal'; const controllerOpts = { - needs: ['discovery'], + discovery: Ember.inject.controller(), + discoveryTopics: Ember.inject.controller('discovery/topics'), + period: null, - canStar: Em.computed.alias('controllers.discovery/topics.currentUser.id'), - showTopicPostBadges: Em.computed.not('controllers.discovery/topics.new'), - - redirectedReason: Em.computed.alias('currentUser.redirected_to_top.reason'), + canStar: Ember.computed.alias('currentUser.id'), + showTopicPostBadges: Ember.computed.not('discoveryTopics.new'), + redirectedReason: Ember.computed.alias('currentUser.redirected_to_top.reason'), order: 'default', ascending: false, @@ -46,12 +47,12 @@ const controllerOpts = { this.setProperties({ order: "default", ascending: false }); // Don't refresh if we're still loading - if (this.get('controllers.discovery.loading')) { return; } + if (this.get('discovery.loading')) { return; } // If we `send('loading')` here, due to returning true it bubbles up to the // router and ember throws an error due to missing `handlerInfos`. // Lesson learned: Don't call `loading` yourself. - this.set('controllers.discovery.loading', true); + this.set('discovery.loading', true); this.store.findFiltered('topicList', {filter}).then(list => { const TopicList = require('discourse/models/topic-list').default; diff --git a/app/assets/javascripts/discourse/controllers/edit-category.js.es6 b/app/assets/javascripts/discourse/controllers/edit-category.js.es6 index d77783bc0a3..cdc773d592b 100644 --- a/app/assets/javascripts/discourse/controllers/edit-category.js.es6 +++ b/app/assets/javascripts/discourse/controllers/edit-category.js.es6 @@ -20,9 +20,9 @@ export default Ember.Controller.extend(ModalFunctionality, { changeSize: function() { if (!Ember.isEmpty(this.get('model.description'))) { - this.set('controllers.modal.modalClass', 'edit-category-modal full'); + this.set('modal.modalClass', 'edit-category-modal full'); } else { - this.set('controllers.modal.modalClass', 'edit-category-modal small'); + this.set('modal.modalClass', 'edit-category-modal small'); } }.observes('model.description'), @@ -34,7 +34,7 @@ export default Ember.Controller.extend(ModalFunctionality, { }.property('model.id', 'model.name'), titleChanged: function() { - this.set('controllers.modal.title', this.get('title')); + this.set('modal.title', this.get('title')); }.observes('title'), disabled: function() { diff --git a/app/assets/javascripts/discourse/controllers/edit-topic-auto-close.js.es6 b/app/assets/javascripts/discourse/controllers/edit-topic-auto-close.js.es6 index f0f4301f345..81aa4f5b06a 100644 --- a/app/assets/javascripts/discourse/controllers/edit-topic-auto-close.js.es6 +++ b/app/assets/javascripts/discourse/controllers/edit-topic-auto-close.js.es6 @@ -69,8 +69,10 @@ export default Ember.Controller.extend(ModalFunctionality, { willCloseI18n: function() { if (this.get('model.details.auto_close_based_on_last_post')) { - return I18n.t('topic.auto_close_immediate', {hours: this.get('model.auto_close_time')}); + let closeDate = new Date(this.get('model.last_posted_at')); + let diff = Math.round((new Date() - closeDate)/(1000*60*60)); + return I18n.t('topic.auto_close_immediate', {count: diff}); } - }.property('model.details.auto_close_based_on_last_post', 'model.auto_close_time') + }.property('model.details.auto_close_based_on_last_post', 'model.last_posted_at') }); diff --git a/app/assets/javascripts/discourse/controllers/feature-topic.js.es6 b/app/assets/javascripts/discourse/controllers/feature-topic.js.es6 index bb195b636b4..997f2a08889 100644 --- a/app/assets/javascripts/discourse/controllers/feature-topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/feature-topic.js.es6 @@ -5,7 +5,7 @@ import computed from 'ember-addons/ember-computed-decorators'; import InputValidation from 'discourse/models/input-validation'; export default Ember.Controller.extend(ModalFunctionality, { - needs: ["topic"], + topicController: Ember.inject.controller('topic'), loading: true, pinnedInCategoryCount: 0, @@ -106,7 +106,7 @@ export default Ember.Controller.extend(ModalFunctionality, { }, _forwardAction(name) { - this.get("controllers.topic").send(name); + this.get("topicController").send(name); this.send("closeModal"); }, diff --git a/app/assets/javascripts/discourse/controllers/flag.js.es6 b/app/assets/javascripts/discourse/controllers/flag.js.es6 index a5119b383e0..b316091285c 100644 --- a/app/assets/javascripts/discourse/controllers/flag.js.es6 +++ b/app/assets/javascripts/discourse/controllers/flag.js.es6 @@ -1,6 +1,7 @@ import ModalFunctionality from 'discourse/mixins/modal-functionality'; import ActionSummary from 'discourse/models/action-summary'; import { MAX_MESSAGE_LENGTH } from 'discourse/models/post-action-type'; +import computed from 'ember-addons/ember-computed-decorators'; export default Ember.Controller.extend(ModalFunctionality, { userDetails: null, @@ -14,13 +15,18 @@ export default Ember.Controller.extend(ModalFunctionality, { this.set('selected', null); }, + @computed('flagTopic') + title(flagTopic) { + return flagTopic ? 'flagging_topic.title' : 'flagging.title'; + }, + flagsAvailable: function() { if (!this.get('flagTopic')) { // flagging post let flagsAvailable = this.get('model.flagsAvailable'); // "message user" option should be at the top - const notifyUserIndex = flagsAvailable.indexOf(flagsAvailable.filterProperty('name_key', 'notify_user')[0]); + const notifyUserIndex = flagsAvailable.indexOf(flagsAvailable.filterBy('name_key', 'notify_user')[0]); if (notifyUserIndex !== -1) { const notifyUser = flagsAvailable[notifyUserIndex]; flagsAvailable.splice(notifyUserIndex, 1); @@ -93,7 +99,7 @@ export default Ember.Controller.extend(ModalFunctionality, { let postAction; // an instance of ActionSummary if (!this.get('flagTopic')) { - postAction = this.get('model.actions_summary').findProperty('id', this.get('selected.id')); + postAction = this.get('model.actions_summary').findBy('id', this.get('selected.id')); } else { postAction = this.get('topicActionByName.' + this.get('selected.name_key')); } diff --git a/app/assets/javascripts/discourse/controllers/forgot-password.js.es6 b/app/assets/javascripts/discourse/controllers/forgot-password.js.es6 index fd98f7910f1..fb159186400 100644 --- a/app/assets/javascripts/discourse/controllers/forgot-password.js.es6 +++ b/app/assets/javascripts/discourse/controllers/forgot-password.js.es6 @@ -1,62 +1,54 @@ import { ajax } from 'discourse/lib/ajax'; import ModalFunctionality from 'discourse/mixins/modal-functionality'; import { escapeExpression } from 'discourse/lib/utilities'; +import { extractError } from 'discourse/lib/ajax-error'; +import computed from 'ember-addons/ember-computed-decorators'; export default Ember.Controller.extend(ModalFunctionality, { - // You need a value in the field to submit it. - submitDisabled: function() { - return Ember.isEmpty((this.get('accountEmailOrUsername') || '').trim()) || this.get('disabled'); - }.property('accountEmailOrUsername', 'disabled'), + @computed('accountEmailOrUsername', 'disabled') + submitDisabled(accountEmailOrUsername, disabled) { + return Ember.isEmpty((accountEmailOrUsername || '').trim()) || disabled; + }, - onShow: function() { + onShow() { if ($.cookie('email')) { this.set('accountEmailOrUsername', $.cookie('email')); } }, actions: { - submit: function() { - var self = this; - + submit() { if (this.get('submitDisabled')) return false; this.set('disabled', true); - var success = function(data) { - // don't tell people what happened, this keeps it more secure (ensure same on server) - var escaped = escapeExpression(self.get('accountEmailOrUsername')); - var isEmail = self.get('accountEmailOrUsername').match(/@/); - - var key = 'forgot_password.complete_' + (isEmail ? 'email' : 'username'); - var extraClass; + ajax('/session/forgot_password', { + data: { login: this.get('accountEmailOrUsername').trim() }, + type: 'POST' + }).then(data => { + const escaped = escapeExpression(this.get('accountEmailOrUsername')); + const isEmail = this.get('accountEmailOrUsername').match(/@/); + let key = 'forgot_password.complete_' + (isEmail ? 'email' : 'username'); + let extraClass; if (data.user_found === true) { key += '_found'; - self.set('accountEmailOrUsername', ''); + this.set('accountEmailOrUsername', ''); bootbox.alert(I18n.t(key, {email: escaped, username: escaped})); - self.send("closeModal"); + this.send("closeModal"); } else { if (data.user_found === false) { key += '_not_found'; extraClass = 'error'; } - self.flash(I18n.t(key, {email: escaped, username: escaped}), extraClass); + this.flash(I18n.t(key, {email: escaped, username: escaped}), extraClass); } - }; - - var fail = function(e) { - self.flash(e.responseJSON.errors[0], 'error'); - }; - - ajax('/session/forgot_password', { - data: { login: this.get('accountEmailOrUsername').trim() }, - type: 'POST' - }).then(success, fail).finally(function(){ - setTimeout(function(){ - self.set('disabled',false); - }, 1000); + }).catch(e => { + this.flash(extractError(e), 'error'); + }).finally(() => { + setTimeout(() => this.set('disabled', false), 1000); }); return false; diff --git a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 index 27ee3f0309b..91e5b907d2c 100644 --- a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 +++ b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 @@ -1,9 +1,10 @@ import { ajax } from 'discourse/lib/ajax'; import { translateResults, searchContextDescription, getSearchKey, isValidSearchTerm } from "discourse/lib/search"; -import showModal from 'discourse/lib/show-modal'; import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; import Category from 'discourse/models/category'; import { escapeExpression } from 'discourse/lib/utilities'; +import { setTransient } from 'discourse/lib/page-tracker'; +import { iconHTML } from 'discourse-common/helpers/fa-icon'; const SortOrders = [ {name: I18n.t('search.relevance'), id: 0}, @@ -13,23 +14,31 @@ const SortOrders = [ ]; export default Ember.Controller.extend({ - needs: ["application"], + application: Ember.inject.controller(), + bulkSelectEnabled: null, loading: Em.computed.not("model"), - queryParams: ["q", "context_id", "context", "skip_context"], + queryParams: ["q", "expanded", "context_id", "context", "skip_context"], q: null, selected: [], + expanded: false, context_id: null, context: null, searching: false, sortOrder: 0, sortOrders: SortOrders, + invalidSearch: false, @computed('model.posts') - resultCount(posts){ + resultCount(posts) { return posts && posts.length; }, + @computed('resultCount') + hasResults(resultCount) { + return (resultCount || 0) > 0; + }, + @computed('q') hasAutofocus(q) { return Em.isEmpty(q); @@ -62,11 +71,6 @@ export default Ember.Controller.extend({ return isValidSearchTerm(q); }, - @computed('searchTerm', 'searching') - searchButtonDisabled(searchTerm, searching) { - return !!(searching || !isValidSearchTerm(searchTerm)); - }, - @computed('q') noSortQ(q) { if (q) { @@ -85,7 +89,7 @@ export default Ember.Controller.extend({ setSearchTerm(term) { this._searchOnSortChange = false; if (term) { - SortOrders.forEach((order) => { + SortOrders.forEach(order => { if (term.indexOf(order.term) > -1){ this.set('sortOrder', order.id); term = term.replace(order.term, ""); @@ -98,9 +102,9 @@ export default Ember.Controller.extend({ }, @observes('sortOrder') - triggerSearch(){ + triggerSearch() { if (this._searchOnSortChange) { - this.search(); + this._search(); } }, @@ -127,18 +131,39 @@ export default Ember.Controller.extend({ @observes('loading') _showFooter() { - this.set("controllers.application.showFooter", !this.get("loading")); + this.set("application.showFooter", !this.get("loading")); }, - canBulkSelect: Em.computed.alias('currentUser.staff'), + @computed('hasResults') + canBulkSelect(hasResults) { + return this.currentUser && this.currentUser.staff && hasResults; + }, + + @computed('expanded') + canCreateTopic(expanded) { + return this.currentUser && !this.site.mobileView && !expanded; + }, + + @computed('expanded') + searchAdvancedIcon(expanded) { + return iconHTML(expanded ? "caret-down" : "caret-right"); + }, + + _search() { + if (this.get("searching")) { return; } + + this.set('invalidSearch', false); + const searchTerm = this.get('searchTerm'); + if (!isValidSearchTerm(searchTerm)) { + this.set('invalidSearch', true); + return; + } - search(){ - if (this.get("searching")) return; this.set("searching", true); + this.set('bulkSelectEnabled', false); + this.get('selected').clear(); - const router = Discourse.__container__.lookup('router:main'); - - var args = { q: this.get("searchTerm") }; + var args = { q: searchTerm }; const sortOrder = this.get("sortOrder"); if (sortOrder && SortOrders[sortOrder].term) { @@ -160,9 +185,9 @@ export default Ember.Controller.extend({ ajax("/search", { data: args }).then(results => { const model = translateResults(results) || {}; - router.transientCache('lastSearch', { searchKey, model }, 5); + setTransient('lastSearch', { searchKey, model }, 5); this.set("model", model); - }).finally(() => { this.set("searching",false); }); + }).finally(() => this.set("searching", false)); }, actions: { @@ -187,22 +212,12 @@ export default Ember.Controller.extend({ this.get('selected').clear(); }, - refresh() { - this.set('bulkSelectEnabled', false); - this.get('selected').clear(); - this.search(); - }, - - showSearchHelp() { - // TODO: dupe code should be centralized - ajax("/static/search_help.html", { dataType: 'html' }).then((model) => { - showModal('searchHelp', { model }); - }); - }, - search() { - if (this.get("searchButtonDisabled")) return; - this.search(); + this._search(); + }, + + toggleAdvancedSearch() { + this.toggleProperty('expanded'); } } }); diff --git a/app/assets/javascripts/discourse/controllers/group-posts.js.es6 b/app/assets/javascripts/discourse/controllers/group-activity-posts.js.es6 similarity index 82% rename from app/assets/javascripts/discourse/controllers/group-posts.js.es6 rename to app/assets/javascripts/discourse/controllers/group-activity-posts.js.es6 index c9e791c1f1b..c2434c83c61 100644 --- a/app/assets/javascripts/discourse/controllers/group-posts.js.es6 +++ b/app/assets/javascripts/discourse/controllers/group-activity-posts.js.es6 @@ -1,19 +1,18 @@ import { fmt } from 'discourse/lib/computed'; -export default Ember.ArrayController.extend({ - needs: ['group'], +export default Ember.Controller.extend({ + group: Ember.inject.controller(), loading: false, emptyText: fmt('type', 'groups.empty.%@'), actions: { loadMore() { - if (this.get('loading')) { return; } this.set('loading', true); const posts = this.get('model'); if (posts && posts.length) { const beforePostId = posts[posts.length-1].get('id'); - const group = this.get('controllers.group.model'); + const group = this.get('group.model'); const opts = { beforePostId, type: this.get('type') }; group.findPosts(opts).then(newPosts => { diff --git a/app/assets/javascripts/discourse/controllers/group-activity.js.es6 b/app/assets/javascripts/discourse/controllers/group-activity.js.es6 new file mode 100644 index 00000000000..955822ffcf5 --- /dev/null +++ b/app/assets/javascripts/discourse/controllers/group-activity.js.es6 @@ -0,0 +1,10 @@ +import computed from 'ember-addons/ember-computed-decorators'; + +export default Ember.Controller.extend({ + application: Ember.inject.controller(), + + @computed('model.is_group_user') + showGroupMessages(isGroupUser) { + return isGroupUser || (this.currentUser && this.currentUser.admin); + } +}); diff --git a/app/assets/javascripts/discourse/controllers/group-edit.js.es6 b/app/assets/javascripts/discourse/controllers/group-edit.js.es6 new file mode 100644 index 00000000000..32277430af5 --- /dev/null +++ b/app/assets/javascripts/discourse/controllers/group-edit.js.es6 @@ -0,0 +1,23 @@ +import { popupAjaxError } from 'discourse/lib/ajax-error'; +import computed from 'ember-addons/ember-computed-decorators'; + +export default Ember.Controller.extend({ + @computed('saving') + savingText(saving) { + if (saving !== undefined) { + return saving ? I18n.t('saving') : I18n.t('saved'); + } + }, + + actions: { + save() { + this.set('saving', true); + + this.get('model').save().catch(error => { + popupAjaxError(error); + }).finally(() => { + this.set('saving', false); + }); + } + } +}); diff --git a/app/assets/javascripts/discourse/controllers/group-index.js.es6 b/app/assets/javascripts/discourse/controllers/group-index.js.es6 index 306ff8aa80b..269ecab7cdb 100644 --- a/app/assets/javascripts/discourse/controllers/group-index.js.es6 +++ b/app/assets/javascripts/discourse/controllers/group-index.js.es6 @@ -1,24 +1,37 @@ import { popupAjaxError } from 'discourse/lib/ajax-error'; -import computed from 'ember-addons/ember-computed-decorators'; import Group from 'discourse/models/group'; +import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; export default Ember.Controller.extend({ + queryParams: ['order', 'desc'], + order: '', + desc: null, loading: false, limit: null, offset: null, + isOwner: Ember.computed.alias('model.is_group_owner'), + showActions: false, - @computed('model.owners.[]') - isOwner(owners) { - if (this.get('currentUser.admin')) { - return true; - } - const currentUserId = this.get('currentUser.id'); - if (currentUserId) { - return !!owners.findBy('id', currentUserId); - } + @observes('order', 'desc') + refreshMembers() { + this.set('loading', true); + + this.get('model') && + this.get('model') + .findMembers({ order: this.get('order'), desc: this.get('desc') }) + .finally(() => this.set('loading', false)); + }, + + @computed('model.members') + hasMembers(members) { + return members && members.length > 0; }, actions: { + toggleActions() { + this.toggleProperty("showActions"); + }, + removeMember(user) { this.get('model').removeMember(user); }, @@ -36,7 +49,12 @@ export default Ember.Controller.extend({ this.set("loading", true); - Group.loadMembers(this.get("model.name"), this.get("model.members.length"), this.get("limit")).then(result => { + Group.loadMembers( + this.get("model.name"), + this.get("model.members.length"), + this.get("limit"), + { order: this.get('order'), desc: this.get('desc') } + ).then(result => { this.get("model.members").addObjects(result.members.map(member => Discourse.User.create(member))); this.setProperties({ loading: false, diff --git a/app/assets/javascripts/discourse/controllers/group-logs.js.es6 b/app/assets/javascripts/discourse/controllers/group-logs.js.es6 new file mode 100644 index 00000000000..0019127c3a6 --- /dev/null +++ b/app/assets/javascripts/discourse/controllers/group-logs.js.es6 @@ -0,0 +1,57 @@ +import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; + +export default Ember.Controller.extend({ + group: Ember.inject.controller(), + loading: false, + offset: 0, + + init() { + this._super(); + this.set('filters', Ember.Object.create()); + }, + + @computed('filters.action', 'filters.acting_user', 'filters.target_user', 'filters.subject') + filterParams(action, acting_user, target_user, subject) { + return { action, acting_user, target_user, subject }; + }, + + @observes('filters.action', 'filters.acting_user', 'filters.target_user', 'filters.subject') + _refreshModel() { + this.get('group.model').findLogs(0, this.get('filterParams')).then(results => { + this.set('offset', 0); + + this.get('model').setProperties({ + logs: results.logs, + all_loaded: results.all_loaded + }); + }); + }, + + reset() { + this.setProperties({ + offset: 0, + filters: Ember.Object.create() + }); + }, + + actions: { + loadMore() { + if (this.get('model.all_loaded')) return; + + this.set('loading', true); + + this.get('group.model').findLogs(this.get('offset') + 1, this.get('filterParams')) + .then(results => { + results.logs.forEach(result => this.get('model.logs').addObject(result)); + this.incrementProperty('offset'); + this.set('model.all_loaded', results.all_loaded); + }).finally(() => { + this.set('loading', false); + }); + }, + + clearFilter(key) { + this.set(`filters.${key}`, ''); + } + } +}); diff --git a/app/assets/javascripts/discourse/controllers/group.js.es6 b/app/assets/javascripts/discourse/controllers/group.js.es6 index ac16e4342e0..126f8911dc8 100644 --- a/app/assets/javascripts/discourse/controllers/group.js.es6 +++ b/app/assets/javascripts/discourse/controllers/group.js.es6 @@ -6,43 +6,65 @@ var Tab = Em.Object.extend({ return 'group.' + name; }, - @computed('name') - message(name) { - return I18n.t('groups.' + name); + @computed('name', 'i18nKey') + message(name, i18nKey) { + return I18n.t(`groups.${i18nKey || name}`); } }); - export default Ember.Controller.extend({ + application: Ember.inject.controller(), counts: null, showing: 'members', + tabs: [ - Tab.create({ name: 'members', active: true, 'location': 'group.index' }), - Tab.create({ name: 'posts' }), - Tab.create({ name: 'topics' }), - Tab.create({ name: 'mentions' }), - Tab.create({ name: 'messages', requiresMembership: true }) + Tab.create({ name: 'members', 'location': 'group.index', icon: 'users' }), + Tab.create({ name: 'activity' }), + Tab.create({ + name: 'edit', i18nKey: 'edit.title', icon: 'pencil', requiresGroupAdmin: true + }), + Tab.create({ + name: 'logs', i18nKey: 'logs.title', icon: 'list-alt', requiresGroupAdmin: true + }) ], - @observes('counts') - countsChanged() { - const counts = this.get('counts'); - this.get('tabs').forEach(tab => { - tab.set('count', counts.get(tab.get('name'))); - }); + @computed('model.is_group_owner', 'model.automatic') + canEditGroup(isGroupOwner, automatic) { + return !automatic && isGroupOwner; }, - @observes('showing') - showingChanged() { - const showing = this.get('showing'); - - this.get('tabs').forEach(tab => { - tab.set('active', showing === tab.get('name')); - }); + @computed('model.name', 'model.full_name') + groupName(name, fullName) { + return (fullName || name).capitalize(); }, - @computed('model.is_member') - getTabs(isMember) { - return this.get('tabs').filter(t => isMember || !t.get('requiresMembership')); + @computed('model.name', 'model.flair_url', 'model.flair_bg_color', 'model.flair_color') + avatarFlairAttributes(groupName, flairURL, flairBgColor, flairColor) { + return { + primary_group_flair_url: flairURL, + primary_group_flair_bg_color: flairBgColor, + primary_group_flair_color: flairColor, + primary_group_name: groupName + }; + }, + + @observes('model.user_count') + _setMembersTabCount() { + this.get('tabs')[0].set('count', this.get('model.user_count')); + }, + + @computed('model.is_group_user', 'model.is_group_owner', 'model.automatic') + getTabs(isGroupUser, isGroupOwner, automatic) { + return this.get('tabs').filter(t => { + let display = true; + + if (this.currentUser && t.get('requiresGroupAdmin')) { + display = automatic ? false : (this.currentUser.admin || isGroupOwner); + } else if (t.get('requiresGroupAdmin')) { + display = false; + } + + return display; + }); } }); diff --git a/app/assets/javascripts/discourse/controllers/groups.js.es6 b/app/assets/javascripts/discourse/controllers/groups.js.es6 new file mode 100644 index 00000000000..d8ce08f3227 --- /dev/null +++ b/app/assets/javascripts/discourse/controllers/groups.js.es6 @@ -0,0 +1,16 @@ +import { observes } from 'ember-addons/ember-computed-decorators'; + +export default Ember.Controller.extend({ + application: Ember.inject.controller(), + + @observes("groups.canLoadMore") + _showFooter() { + this.set("application.showFooter", !this.get("groups.canLoadMore")); + }, + + actions: { + loadMore() { + this.get('groups').loadMore(); + } + } +}); diff --git a/app/assets/javascripts/discourse/controllers/header.js.es6 b/app/assets/javascripts/discourse/controllers/header.js.es6 index 2665f2afbd1..f5979bb36a7 100644 --- a/app/assets/javascripts/discourse/controllers/header.js.es6 +++ b/app/assets/javascripts/discourse/controllers/header.js.es6 @@ -1,6 +1,7 @@ import { addFlagProperty as realAddFlagProperty } from 'discourse/components/site-header'; +import deprecated from 'discourse-common/lib/deprecated'; export function addFlagProperty(prop) { - Ember.warn("importing `addFlagProperty` is deprecated. Use the PluginAPI instead"); + deprecated("importing `addFlagProperty` is deprecated. Use the PluginAPI instead"); realAddFlagProperty(prop); } diff --git a/app/assets/javascripts/discourse/controllers/history.js.es6 b/app/assets/javascripts/discourse/controllers/history.js.es6 index 42550be8803..e94852cf3ec 100644 --- a/app/assets/javascripts/discourse/controllers/history.js.es6 +++ b/app/assets/javascripts/discourse/controllers/history.js.es6 @@ -21,6 +21,9 @@ export default Ember.Controller.extend(ModalFunctionality, { if (this.site.mobileView) { this.set("viewMode", "inline"); } }.on("init"), + previousFeaturedLink: Em.computed.alias('model.featured_link_changes.previous'), + currentFeaturedLink: Em.computed.alias('model.featured_link_changes.current'), + previousTagChanges: customTagArray('model.tags_changes.previous'), currentTagChanges: customTagArray('model.tags_changes.current'), diff --git a/app/assets/javascripts/discourse/controllers/invite.js.es6 b/app/assets/javascripts/discourse/controllers/invite.js.es6 index cd4c6afec3d..e9293ea8059 100644 --- a/app/assets/javascripts/discourse/controllers/invite.js.es6 +++ b/app/assets/javascripts/discourse/controllers/invite.js.es6 @@ -1,8 +1,9 @@ import ModalFunctionality from 'discourse/mixins/modal-functionality'; import { emailValid } from 'discourse/lib/utilities'; +import computed from 'ember-addons/ember-computed-decorators'; export default Ember.Controller.extend(ModalFunctionality, { - needs: ['user-invited-show'], + userInvitedShow: Ember.inject.controller('user-invited-show'), // If this isn't defined, it will proxy to the user model on the preferences // page which is wrong. @@ -11,6 +12,17 @@ export default Ember.Controller.extend(ModalFunctionality, { customMessage: null, inviteIcon: "envelope", + @computed('isMessage', 'invitingToTopic') + title(isMessage, invitingToTopic) { + if (isMessage) { + return 'topic.invite_private.title'; + } else if (invitingToTopic) { + return 'topic.invite_reply.title'; + } else { + return 'user.invited.create'; + } + }, + isAdmin: function(){ return Discourse.User.currentProp("admin"); }.property(), @@ -120,9 +132,7 @@ export default Ember.Controller.extend(ModalFunctionality, { }, successMessage: function() { - if (this.get('model.inviteLink')) { - return I18n.t('user.invited.generated_link_message', {inviteLink: this.get('model.inviteLink'), invitedEmail: this.get('emailOrUsername')}); - } else if (this.get('hasGroups')) { + if (this.get('hasGroups')) { return I18n.t('topic.invite_private.success_group'); } else if (this.get('isMessage')) { return I18n.t('topic.invite_private.success'); @@ -169,7 +179,7 @@ export default Ember.Controller.extend(ModalFunctionality, { if (this.get('disabled')) { return; } const groupNames = this.get('model.groupNames'), - userInvitedController = this.get('controllers.user-invited-show'), + userInvitedController = this.get('userInvitedShow'), model = this.get('model'); model.setProperties({ saving: true, error: false }); @@ -215,7 +225,7 @@ export default Ember.Controller.extend(ModalFunctionality, { if (this.get('disabled')) { return; } const groupNames = this.get('model.groupNames'), - userInvitedController = this.get('controllers.user-invited-show'), + userInvitedController = this.get('userInvitedShow'), model = this.get('model'); var topicId = null; diff --git a/app/assets/javascripts/discourse/controllers/jump-to-post.js.es6 b/app/assets/javascripts/discourse/controllers/jump-to-post.js.es6 new file mode 100644 index 00000000000..94ccc5595a4 --- /dev/null +++ b/app/assets/javascripts/discourse/controllers/jump-to-post.js.es6 @@ -0,0 +1,18 @@ +import ModalFunctionality from 'discourse/mixins/modal-functionality'; + +export default Ember.Controller.extend(ModalFunctionality, { + model: null, + postNumber: null, + + actions: { + jump() { + let where = parseInt(this.get('postNumber')); + if (where < 1) { where = 1; } + const max = this.get('topic.postStream.filteredPostsCount'); + if (where > max) { where = max; } + + this.jumpToIndex(where); + this.send('closeModal'); + } + } +}); diff --git a/app/assets/javascripts/discourse/controllers/keyboard-shortcuts-help.js.es6 b/app/assets/javascripts/discourse/controllers/keyboard-shortcuts-help.js.es6 index 5e0414bcd08..7a50811e572 100644 --- a/app/assets/javascripts/discourse/controllers/keyboard-shortcuts-help.js.es6 +++ b/app/assets/javascripts/discourse/controllers/keyboard-shortcuts-help.js.es6 @@ -1,9 +1,7 @@ import ModalFunctionality from 'discourse/mixins/modal-functionality'; export default Ember.Controller.extend(ModalFunctionality, { - needs: ['modal'], - - onShow: function() { - this.set('controllers.modal.modalClass', 'keyboard-shortcuts-modal'); + onShow() { + this.set('modal.modalClass', 'keyboard-shortcuts-modal'); } }); diff --git a/app/assets/javascripts/discourse/controllers/login.js.es6 b/app/assets/javascripts/discourse/controllers/login.js.es6 index 4abefa97b75..5c97bbbf82d 100644 --- a/app/assets/javascripts/discourse/controllers/login.js.es6 +++ b/app/assets/javascripts/discourse/controllers/login.js.es6 @@ -11,13 +11,17 @@ const AuthErrors = 'not_allowed_from_ip_address']; export default Ember.Controller.extend(ModalFunctionality, { - needs: ['modal', 'createAccount', 'forgotPassword', 'application'], + + createAccount: Ember.inject.controller(), + forgotPassword: Ember.inject.controller(), + application: Ember.inject.controller(), + authenticate: null, loggingIn: false, loggedIn: false, canLoginLocal: setting('enable_local_logins'), - loginRequired: Em.computed.alias('controllers.application.loginRequired'), + loginRequired: Em.computed.alias('application.loginRequired'), resetForm: function() { this.set('authenticate', null); @@ -37,7 +41,7 @@ export default Ember.Controller.extend(ModalFunctionality, { loginDisabled: Em.computed.or('loggingIn', 'loggedIn'), showSignupLink: function() { - return this.get('controllers.application.canSignUp') && + return this.get('application.canSignUp') && !this.get('loggingIn') && Ember.isEmpty(this.get('authenticate')); }.property('loggingIn', 'authenticate'), @@ -47,8 +51,9 @@ export default Ember.Controller.extend(ModalFunctionality, { }.property('loggingIn', 'authenticate'), actions: { - login: function() { + login() { const self = this; + if (this.get('loginDisabled')) { return; } if(Ember.isEmpty(this.get('loginName')) || Ember.isEmpty(this.get('loginPassword'))){ self.flash(I18n.t('login.blank_username_or_password'), 'error'); @@ -130,8 +135,9 @@ export default Ember.Controller.extend(ModalFunctionality, { if(customLogin){ customLogin(); } else { - const authUrl = loginMethod.get('customUrl') || Discourse.getURL("/auth/" + name); + let authUrl = loginMethod.get('customUrl') || Discourse.getURL("/auth/" + name); if (loginMethod.get("fullScreenLogin")) { + document.cookie = "fsl=true"; window.location = authUrl; } else { this.set('authenticate', name); @@ -140,6 +146,11 @@ export default Ember.Controller.extend(ModalFunctionality, { const height = loginMethod.get("frameHeight") || 400; const width = loginMethod.get("frameWidth") || 800; + + if (loginMethod.get("displayPopup")) { + authUrl = authUrl + "?display=popup"; + } + const w = window.open(authUrl, "_blank", "menubar=no,status=no,height=" + height + ",width=" + width + ",left=" + left + ",top=" + top); const self = this; @@ -154,7 +165,7 @@ export default Ember.Controller.extend(ModalFunctionality, { }, createAccount: function() { - const createAccountController = this.get('controllers.createAccount'); + const createAccountController = this.get('createAccount'); if (createAccountController) { createAccountController.resetForm(); const loginName = this.get('loginName'); @@ -168,7 +179,7 @@ export default Ember.Controller.extend(ModalFunctionality, { }, forgotPassword: function() { - const forgotPasswordController = this.get('controllers.forgotPassword'); + const forgotPasswordController = this.get('forgotPassword'); if (forgotPasswordController) { forgotPasswordController.set("accountEmailOrUsername", this.get("loginName")); } this.send("showForgotPassword"); } @@ -176,7 +187,7 @@ export default Ember.Controller.extend(ModalFunctionality, { authMessage: (function() { if (Ember.isEmpty(this.get('authenticate'))) return ""; - const method = findAll(this.siteSettings).findProperty("name", this.get("authenticate")); + const method = findAll(this.siteSettings, this.capabilities, this.isMobileDevice).findBy("name", this.get("authenticate")); if(method){ return method.get('message'); } @@ -223,7 +234,7 @@ export default Ember.Controller.extend(ModalFunctionality, { return; } - const createAccountController = this.get('controllers.createAccount'); + const createAccountController = this.get('createAccount'); createAccountController.setProperties({ accountEmail: options.email, accountUsername: options.username, diff --git a/app/assets/javascripts/discourse/controllers/merge-topic.js.es6 b/app/assets/javascripts/discourse/controllers/merge-topic.js.es6 index 197c9fcb377..34bfa8ba34e 100644 --- a/app/assets/javascripts/discourse/controllers/merge-topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/merge-topic.js.es6 @@ -5,12 +5,11 @@ import DiscourseURL from 'discourse/lib/url'; // Modal related to merging of topics export default Ember.Controller.extend(SelectedPostsCount, ModalFunctionality, { - needs: ['topic'], + topicController: Ember.inject.controller('topic'), saving: false, selectedTopicId: null, - topicController: Em.computed.alias('controllers.topic'), selectedPosts: Em.computed.alias('topicController.selectedPosts'), selectedReplies: Em.computed.alias('topicController.selectedReplies'), allPostsSelected: Em.computed.alias('topicController.allPostsSelected'), @@ -26,7 +25,7 @@ export default Ember.Controller.extend(SelectedPostsCount, ModalFunctionality, { }.property('saving'), onShow() { - this.set('controllers.modal.modalClass', 'split-modal'); + this.set('modal.modalClass', 'split-modal'); }, actions: { diff --git a/app/assets/javascripts/discourse/controllers/navigation/default.js.es6 b/app/assets/javascripts/discourse/controllers/navigation/default.js.es6 index 1d23c1fb2b1..93ae014e474 100644 --- a/app/assets/javascripts/discourse/controllers/navigation/default.js.es6 +++ b/app/assets/javascripts/discourse/controllers/navigation/default.js.es6 @@ -1,7 +1,8 @@ import computed from "ember-addons/ember-computed-decorators"; export default Ember.Controller.extend({ - needs: ['discovery', 'discovery/topics'], + discovery: Ember.inject.controller(), + discoveryTopics: Ember.inject.controller('discovery/topics'), @computed() categories() { diff --git a/app/assets/javascripts/discourse/controllers/preferences.js.es6 b/app/assets/javascripts/discourse/controllers/preferences.js.es6 index 98e0b05f7ce..5ee945d4da2 100644 --- a/app/assets/javascripts/discourse/controllers/preferences.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences.js.es6 @@ -3,6 +3,7 @@ import CanCheckEmails from 'discourse/mixins/can-check-emails'; import { popupAjaxError } from 'discourse/lib/ajax-error'; import computed from "ember-addons/ember-computed-decorators"; import { cook } from 'discourse/lib/text'; +import { NotificationLevels } from 'discourse/lib/notification-levels'; export default Ember.Controller.extend(CanCheckEmails, { @@ -24,7 +25,7 @@ export default Ember.Controller.extend(CanCheckEmails, { // Staff can edit fields that are not `editable` if (!this.get('currentUser.staff')) { - siteUserFields = siteUserFields.filterProperty('editable', true); + siteUserFields = siteUserFields.filterBy('editable', true); } return siteUserFields.sortBy('position').map(function(field) { const value = userFields ? userFields[field.get('id').toString()] : null; @@ -59,11 +60,6 @@ export default Ember.Controller.extend(CanCheckEmails, { return !this.siteSettings.enable_sso && this.siteSettings.enable_local_logins; }, - @computed() - canReceiveDigest() { - return !this.siteSettings.disable_digest_emails; - }, - @computed() availableLocales() { return this.siteSettings.available_locales.split('|').map(s => ({ name: s, value: s })); @@ -83,7 +79,8 @@ export default Ember.Controller.extend(CanCheckEmails, { mailingListModeOptions() { return [ {name: I18n.t('user.mailing_list_mode.daily'), value: 0}, - {name: this.get('frequencyEstimate'), value: 1} + {name: this.get('frequencyEstimate'), value: 1}, + {name: I18n.t('user.mailing_list_mode.individual_no_echo'), value: 2} ]; }, @@ -115,6 +112,10 @@ export default Ember.Controller.extend(CanCheckEmails, { { name: I18n.t('user.auto_track_options.after_5_minutes'), value: 300000 }, { name: I18n.t('user.auto_track_options.after_10_minutes'), value: 600000 }], + notificationLevelsForReplying: [{ name: I18n.t('topic.notifications.watching.title'), value: NotificationLevels.WATCHING }, + { name: I18n.t('topic.notifications.tracking.title'), value: NotificationLevels.TRACKING }], + + considerNewTopicOptions: [{ name: I18n.t('user.new_topic_duration.not_viewed'), value: -1 }, { name: I18n.t('user.new_topic_duration.after_1_day'), value: 60 * 24 }, { name: I18n.t('user.new_topic_duration.after_2_days'), value: 60 * 48 }, @@ -156,9 +157,7 @@ export default Ember.Controller.extend(CanCheckEmails, { // Cook the bio for preview model.set('name', this.get('newNameInput')); - var options = {}; - - return model.save(options).then(() => { + return model.save().then(() => { if (Discourse.User.currentProp('id') === model.get('id')) { Discourse.User.currentProp('name', model.get('name')); } diff --git a/app/assets/javascripts/discourse/controllers/preferences/badge-title.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/badge-title.js.es6 index b71660d17fa..f2c543e6be6 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/badge-title.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/badge-title.js.es6 @@ -1,27 +1,26 @@ import { ajax } from 'discourse/lib/ajax'; import BadgeSelectController from "discourse/mixins/badge-select-controller"; -export default Ember.ArrayController.extend(BadgeSelectController, { +export default Ember.Controller.extend(BadgeSelectController, { filteredList: function() { return this.get('model').filterBy('badge.allow_title', true); }.property('model'), actions: { - save: function() { + save() { this.setProperties({ saved: false, saving: true }); - var self = this; ajax(this.get('user.path') + "/preferences/badge_title", { type: "PUT", - data: { user_badge_id: self.get('selectedUserBadgeId') } - }).then(function() { - self.setProperties({ + data: { user_badge_id: this.get('selectedUserBadgeId') } + }).then(() => { + this.setProperties({ saved: true, saving: false, - "user.title": self.get('selectedUserBadge.badge.name') + "user.title": this.get('selectedUserBadge.badge.name') }); - }, function() { + }, () => { bootbox.alert(I18n.t('generic_error')); }); } diff --git a/app/assets/javascripts/discourse/controllers/preferences/card-badge.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/card-badge.js.es6 index d0c42fb5587..9f820f9647f 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/card-badge.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/card-badge.js.es6 @@ -1,7 +1,7 @@ import { ajax } from 'discourse/lib/ajax'; import BadgeSelectController from "discourse/mixins/badge-select-controller"; -export default Ember.ArrayController.extend(BadgeSelectController, { +export default Ember.Controller.extend(BadgeSelectController, { filteredList: function() { return this.get('model').filter(function(b) { return !Ember.isEmpty(b.get('badge.image')); @@ -12,18 +12,17 @@ export default Ember.ArrayController.extend(BadgeSelectController, { save: function() { this.setProperties({ saved: false, saving: true }); - var self = this; ajax(this.get('user.path') + "/preferences/card-badge", { type: "PUT", - data: { user_badge_id: self.get('selectedUserBadgeId') } - }).then(function() { - self.setProperties({ + data: { user_badge_id: this.get('selectedUserBadgeId') } + }).then(() => { + this.setProperties({ saved: true, saving: false, - "user.card_image_badge": self.get('selectedUserBadge.badge.image') + "user.card_image_badge": this.get('selectedUserBadge.badge.image') }); - }).catch(function() { - self.set('saving', false); + }).catch(() => { + this.set('saving', false); bootbox.alert(I18n.t('generic_error')); }); } diff --git a/app/assets/javascripts/discourse/controllers/preferences/email.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/email.js.es6 index 099e4a1e689..e125dd73f31 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/email.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/email.js.es6 @@ -1,4 +1,7 @@ import { propertyEqual } from 'discourse/lib/computed'; +import InputValidation from 'discourse/models/input-validation'; +import { emailValid } from 'discourse/lib/utilities'; +import computed from 'ember-addons/ember-computed-decorators'; export default Ember.Controller.extend({ taken: false, @@ -8,7 +11,7 @@ export default Ember.Controller.extend({ newEmail: null, newEmailEmpty: Em.computed.empty('newEmail'), - saveDisabled: Em.computed.or('saving', 'newEmailEmpty', 'taken', 'unchanged'), + saveDisabled: Em.computed.or('saving', 'newEmailEmpty', 'taken', 'unchanged', 'invalidEmail'), unchanged: propertyEqual('newEmailLower', 'currentUser.email'), newEmailLower: function() { @@ -20,6 +23,21 @@ export default Ember.Controller.extend({ return I18n.t("user.change"); }.property('saving'), + @computed('newEmail') + invalidEmail(newEmail) { + return !emailValid(newEmail); + }, + + @computed('invalidEmail') + emailValidation(invalidEmail) { + if (invalidEmail) { + return InputValidation.create({ + failed: true, + reason: I18n.t('user.email.invalid') + }); + } + }, + actions: { changeEmail: function() { var self = this; diff --git a/app/assets/javascripts/discourse/controllers/preferences/username.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/username.js.es6 index c1976a91fbc..a597df810a4 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/username.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/username.js.es6 @@ -39,18 +39,19 @@ export default Ember.Controller.extend({ }.property('saving'), actions: { - changeUsername: function() { - var self = this; - return bootbox.confirm(I18n.t("user.change_username.confirm"), I18n.t("no_value"), I18n.t("yes_value"), function(result) { + changeUsername() { + if (this.get('saveDisabled')) { return; } + + return bootbox.confirm(I18n.t("user.change_username.confirm"), + I18n.t("no_value"), + I18n.t("yes_value"), result => { if (result) { - self.set('saving', true); - self.get('content').changeUsername(self.get('newUsername')).then(function() { - DiscourseURL.redirectTo("/users/" + self.get('newUsername').toLowerCase() + "/preferences"); - }, function() { - // error - self.set('error', true); - self.set('saving', false); - }); + this.set('saving', true); + this.get('content').changeUsername(this.get('newUsername')).then(() => { + DiscourseURL.redirectTo("/users/" + this.get('newUsername').toLowerCase() + "/preferences"); + }) + .catch(() => this.set('error', true)) + .finally(() => this.set('saving', false)); } }); } diff --git a/app/assets/javascripts/discourse/controllers/quote-button.js.es6 b/app/assets/javascripts/discourse/controllers/quote-button.js.es6 deleted file mode 100644 index f3e0447a7f3..00000000000 --- a/app/assets/javascripts/discourse/controllers/quote-button.js.es6 +++ /dev/null @@ -1,159 +0,0 @@ -import Quote from 'discourse/lib/quote'; -import computed from 'ember-addons/ember-computed-decorators'; -import { selectedText } from 'discourse/lib/utilities'; - -export default Ember.Controller.extend({ - needs: ['topic', 'composer'], - - @computed('buffer', 'postId') - post(buffer, postId) { - if (!postId || Ember.isEmpty(buffer)) { return null; } - - const postStream = this.get('controllers.topic.model.postStream'); - const post = postStream.findLoadedPost(postId); - - return post; - }, - - // Save the currently selected text and displays the - // "quote reply" button - selectText(postId) { - // anonymous users cannot "quote-reply" - if (!this.currentUser) return; - - // don't display the "quote-reply" button if we can't reply - const topicDetails = this.get('controllers.topic.model.details'); - if (!(topicDetails.get('can_reply_as_new_topic') || topicDetails.get('can_create_post'))) { - return; - } - - const selection = window.getSelection(); - - // no selections - if (selection.isCollapsed) { - this.set('buffer', ''); - return; - } - - // retrieve the selected range - const range = selection.getRangeAt(0), - cloned = range.cloneRange(), - $ancestor = $(range.commonAncestorContainer); - - if ($ancestor.closest('.cooked').length === 0) { - this.set('buffer', ''); - return; - } - - const selVal = selectedText(); - if (this.get('buffer') === selVal) return; - - // we need to retrieve the post data from the posts collection in the topic controller - this.set('postId', postId); - this.set('buffer', selVal); - - // create a marker element - const markerElement = document.createElement("span"); - // containing a single invisible character - markerElement.appendChild(document.createTextNode("\ufeff")); - - const isMobileDevice = this.site.isMobileDevice; - const capabilities = this.capabilities, - isIOS = capabilities.isIOS, - isAndroid = capabilities.isAndroid; - - // collapse the range at the beginning/end of the selection - range.collapse(!isMobileDevice); - // and insert it at the start of our selection range - range.insertNode(markerElement); - - // retrieve the position of the marker - const $markerElement = $(markerElement), - markerOffset = $markerElement.offset(), - parentScrollLeft = $markerElement.parent().scrollLeft(), - $quoteButton = $('.quote-button'); - - // remove the marker - markerElement.parentNode.removeChild(markerElement); - - // work around Chrome that would sometimes lose the selection - const sel = window.getSelection(); - sel.removeAllRanges(); - sel.addRange(cloned); - - // move the quote button above the marker - Em.run.schedule('afterRender', function() { - let topOff = markerOffset.top; - let leftOff = markerOffset.left; - - if (parentScrollLeft > 0) leftOff += parentScrollLeft; - - if (isMobileDevice || isIOS || isAndroid) { - topOff = topOff + 20; - leftOff = Math.min(leftOff + 10, $(window).width() - $quoteButton.outerWidth()); - } else { - topOff = topOff - $quoteButton.outerHeight() - 5; - } - - $quoteButton.offset({ top: topOff, left: leftOff }); - }); - }, - - quoteText() { - const Composer = require('discourse/models/composer').default; - const postId = this.get('postId'); - const post = this.get('post'); - - // defer load if needed, if in an expanded replies section - if (!post) { - const postStream = this.get('controllers.topic.model.postStream'); - return postStream.loadPost(postId).then(p => { - this.set('post', p); - return this.quoteText(); - }); - } - - // If we can't create a post, delegate to reply as new topic - if (!this.get('controllers.topic.model.details.can_create_post')) { - this.get('controllers.topic').send('replyAsNewTopic', post); - return; - } - - const composerController = this.get('controllers.composer'); - const composerOpts = { - action: Composer.REPLY, - draftKey: post.get('topic.draft_key') - }; - - if (post.get('post_number') === 1) { - composerOpts.topic = post.get("topic"); - } else { - composerOpts.post = post; - } - - // If the composer is associated with a different post, we don't change it. - const composerPost = composerController.get('content.post'); - if (composerPost && (composerPost.get('id') !== this.get('post.id'))) { - composerOpts.post = composerPost; - } - - const buffer = this.get('buffer'); - const quotedText = Quote.build(post, buffer); - composerOpts.quote = quotedText; - if (composerController.get('content.viewOpen') || composerController.get('content.viewDraft')) { - this.appEvents.trigger('composer:insert-text', quotedText); - } else { - composerController.open(composerOpts); - } - this.set('buffer', ''); - return false; - }, - - deselectText() { - // clear selected text - window.getSelection().removeAllRanges(); - // clean up the buffer - this.set('buffer', ''); - } - -}); diff --git a/app/assets/javascripts/discourse/controllers/reorder-categories.js.es6 b/app/assets/javascripts/discourse/controllers/reorder-categories.js.es6 index 18a000a3884..c975eb5bfb3 100644 --- a/app/assets/javascripts/discourse/controllers/reorder-categories.js.es6 +++ b/app/assets/javascripts/discourse/controllers/reorder-categories.js.es6 @@ -5,8 +5,6 @@ import { popupAjaxError } from 'discourse/lib/ajax-error'; import { on, default as computed } from "ember-addons/ember-computed-decorators"; import Ember from 'ember'; -const SortableArrayProxy = Ember.ArrayProxy.extend(Ember.SortableMixin); - export default Ember.Controller.extend(ModalFunctionality, Ember.Evented, { @on('init') @@ -20,12 +18,8 @@ export default Ember.Controller.extend(ModalFunctionality, Ember.Evented, { return categories.map(c => bufProxy.create({ content: c })); }, - categoriesOrdered: function() { - return SortableArrayProxy.create({ - sortProperties: ['content.position'], - content: this.get('categoriesBuffered') - }); - }.property('categoriesBuffered'), + categoriesSorting: ['position'], + categoriesOrdered: Ember.computed.sort('categoriesBuffered', 'categoriesSorting'), showFixIndices: function() { const cats = this.get('categoriesOrdered'); diff --git a/app/assets/javascripts/discourse/controllers/search-help.js.es6 b/app/assets/javascripts/discourse/controllers/search-help.js.es6 index 7f5958ae4de..0d5bb501047 100644 --- a/app/assets/javascripts/discourse/controllers/search-help.js.es6 +++ b/app/assets/javascripts/discourse/controllers/search-help.js.es6 @@ -1,8 +1,6 @@ import ModalFunctionality from 'discourse/mixins/modal-functionality'; export default Ember.Controller.extend(ModalFunctionality, { - needs: ['modal'], - showGoogleSearch: function() { return !Discourse.SiteSettings.login_required; }.property() diff --git a/app/assets/javascripts/discourse/controllers/share.js.es6 b/app/assets/javascripts/discourse/controllers/share.js.es6 deleted file mode 100644 index 97f1fb4d267..00000000000 --- a/app/assets/javascripts/discourse/controllers/share.js.es6 +++ /dev/null @@ -1,56 +0,0 @@ -import Sharing from 'discourse/lib/sharing'; -import { longDateNoYear } from 'discourse/lib/formatter'; -import computed from 'ember-addons/ember-computed-decorators'; - -export default Ember.Controller.extend({ - needs: ['topic'], - - title: Ember.computed.alias('controllers.topic.model.title'), - canReplyAsNewTopic: Ember.computed.alias('controllers.topic.model.details.can_reply_as_new_topic'), - - @computed('type', 'postNumber') - shareTitle(type, postNumber) { - if (type === 'topic') { return I18n.t('share.topic'); } - if (postNumber) { - return I18n.t('share.post', { postNumber }); - } else { - return I18n.t('share.topic'); - } - }, - - @computed('date') - displayDate(date) { - return longDateNoYear(new Date(date)); - }, - - // Close the share controller - actions: { - close() { - this.setProperties({ link: null, postNumber: null, postId: null }); - return false; - }, - - replyAsNewTopic() { - const topicController = this.get("controllers.topic"); - const postStream = topicController.get("model.postStream"); - const postId = this.get("postId") || postStream.findPostIdForPostNumber(1); - const post = postStream.findLoadedPost(postId); - topicController.send("replyAsNewTopic", post); - this.send("close"); - }, - - share(source) { - var url = source.generateUrl(this.get('link'), this.get('title')); - if (source.shouldOpenInPopup) { - window.open(url, '', 'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=600,height=' + (source.popupHeight || 315)); - } else { - window.open(url, '_blank'); - } - } - }, - - @computed - sources() { - return Sharing.activeSources(this.siteSettings.share_links); - } -}); diff --git a/app/assets/javascripts/discourse/controllers/split-topic.js.es6 b/app/assets/javascripts/discourse/controllers/split-topic.js.es6 index b8a1a72509e..c8ea321570e 100644 --- a/app/assets/javascripts/discourse/controllers/split-topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/split-topic.js.es6 @@ -6,12 +6,11 @@ import DiscourseURL from 'discourse/lib/url'; // Modal related to auto closing of topics export default Ember.Controller.extend(SelectedPostsCount, ModalFunctionality, { - needs: ['topic'], topicName: null, saving: false, categoryId: null, - topicController: Em.computed.alias('controllers.topic'), + topicController: Ember.inject.controller('topic'), selectedPosts: Em.computed.alias('topicController.selectedPosts'), selectedReplies: Em.computed.alias('topicController.selectedReplies'), allPostsSelected: Em.computed.alias('topicController.allPostsSelected'), @@ -28,7 +27,7 @@ export default Ember.Controller.extend(SelectedPostsCount, ModalFunctionality, { onShow() { this.setProperties({ - 'controllers.modal.modalClass': 'split-modal', + 'modal.modalClass': 'split-modal', saving: false, categoryId: null, topicName: '' diff --git a/app/assets/javascripts/discourse/controllers/static.js.es6 b/app/assets/javascripts/discourse/controllers/static.js.es6 index c656b99dfd7..166a0676a7f 100644 --- a/app/assets/javascripts/discourse/controllers/static.js.es6 +++ b/app/assets/javascripts/discourse/controllers/static.js.es6 @@ -2,14 +2,16 @@ import { ajax } from 'discourse/lib/ajax'; import computed from 'ember-addons/ember-computed-decorators'; export default Ember.Controller.extend({ - - needs: ['application'], + application: Ember.inject.controller(), showLoginButton: Em.computed.equal("model.path", "login"), + @computed('model.path') + bodyClass: path => `static-${path}`, + @computed("model.path") showSignupButton() { - return this.get("model.path") === "login" && this.get('controllers.application.canSignUp'); + return this.get("model.path") === "login" && this.get('application.canSignUp'); }, actions: { diff --git a/app/assets/javascripts/discourse/controllers/tag-groups-show.js.es6 b/app/assets/javascripts/discourse/controllers/tag-groups-show.js.es6 index 1eca5728abb..d575844cad9 100644 --- a/app/assets/javascripts/discourse/controllers/tag-groups-show.js.es6 +++ b/app/assets/javascripts/discourse/controllers/tag-groups-show.js.es6 @@ -1,5 +1,5 @@ export default Ember.Controller.extend({ - needs: ['tagGroups'], + tagGroups: Ember.inject.controller(), actions: { save() { @@ -7,17 +7,16 @@ export default Ember.Controller.extend({ }, destroy() { - const self = this; return bootbox.confirm( I18n.t("tagging.groups.confirm_delete"), I18n.t("no_value"), I18n.t("yes_value"), - function(destroy) { + destroy => { if (destroy) { - const c = self.controllerFor('tagGroups'); - return self.get('model').destroy().then(function() { - c.removeObject(self.get('model')); - self.transitionToRoute('tagGroups'); + const c = this.get('tagGroups.model'); + return this.get('model').destroy().then(() => { + c.removeObject(this.get('model')); + this.transitionToRoute('tagGroups'); }); } } diff --git a/app/assets/javascripts/discourse/controllers/tag-groups.js.es6 b/app/assets/javascripts/discourse/controllers/tag-groups.js.es6 index 4e52a8ce476..7ea16868797 100644 --- a/app/assets/javascripts/discourse/controllers/tag-groups.js.es6 +++ b/app/assets/javascripts/discourse/controllers/tag-groups.js.es6 @@ -1,6 +1,8 @@ -export default Ember.ArrayController.extend({ +import TagGroup from 'discourse/models/tag-group'; + +export default Ember.Controller.extend({ actions: { - selectTagGroup: function(tagGroup) { + selectTagGroup(tagGroup) { if (this.get('selectedItem')) { this.get('selectedItem').set('selected', false); } this.set('selectedItem', tagGroup); tagGroup.set('selected', true); @@ -8,10 +10,9 @@ export default Ember.ArrayController.extend({ this.transitionToRoute('tagGroups.show', tagGroup); }, - newTagGroup: function() { - const newTagGroup = this.store.createRecord('tag-group'); - newTagGroup.set('name', I18n.t('tagging.groups.new_name')); - this.pushObject(newTagGroup); + newTagGroup() { + const newTagGroup = TagGroup.create({ id: 'new', name: I18n.t('tagging.groups.new_name') }); + this.get('model').pushObject(newTagGroup); this.send('selectTagGroup', newTagGroup); } } diff --git a/app/assets/javascripts/discourse/controllers/tags-show.js.es6 b/app/assets/javascripts/discourse/controllers/tags-show.js.es6 index 34c4729228f..1e8e0c2fa0b 100644 --- a/app/assets/javascripts/discourse/controllers/tags-show.js.es6 +++ b/app/assets/javascripts/discourse/controllers/tags-show.js.es6 @@ -16,7 +16,7 @@ if (customNavItemHref) { if (navItem.get('tagId')) { var name = navItem.get('name'); - if ( !Discourse.Site.currentProp('filters').contains(name) ) { + if ( !Discourse.Site.currentProp('filters').includes(name) ) { return null; } @@ -40,9 +40,10 @@ if (customNavItemHref) { export default Ember.Controller.extend(BulkTopicSelection, { - needs: ["application"], + application: Ember.inject.controller(), tag: null, + additionalTags: null, list: null, canAdminTag: Ember.computed.alias("currentUser.staff"), filterMode: null, @@ -72,15 +73,15 @@ export default Ember.Controller.extend(BulkTopicSelection, { }.property(), showAdminControls: function() { - return this.get('canAdminTag') && !this.get('category'); - }.property('canAdminTag', 'category'), + return !this.get('additionalTags') && this.get('canAdminTag') && !this.get('category'); + }.property('additionalTags', 'canAdminTag', 'category'), loadMoreTopics() { return this.get("list").loadMore(); }, _showFooter: function() { - this.set("controllers.application.showFooter", !this.get("list.canLoadMore")); + this.set("application.showFooter", !this.get("list.canLoadMore")); }.observes("list.canLoadMore"), footerMessage: function() { diff --git a/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 b/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 index e1c710115c3..e3a7a34f217 100644 --- a/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic-bulk-actions.js.es6 @@ -17,14 +17,14 @@ addBulkButton('unlistTopics', 'unlist_topics'); addBulkButton('showTagTopics', 'change_tags'); // Modal for performing bulk actions on topics -export default Ember.ArrayController.extend(ModalFunctionality, { +export default Ember.Controller.extend(ModalFunctionality, { tags: null, buttonRows: null, emptyTags: Ember.computed.empty('tags'), onShow() { - this.set('controllers.modal.modalClass', 'topic-bulk-actions-modal small'); + this.set('modal.modalClass', 'topic-bulk-actions-modal small'); const buttonRows = []; let row = []; @@ -38,7 +38,7 @@ export default Ember.ArrayController.extend(ModalFunctionality, { if (row.length) { buttonRows.push(row); } this.set('buttonRows', buttonRows); - this.send('changeBulkTemplate', 'modal/bulk_actions_buttons'); + this.send('changeBulkTemplate', 'modal/bulk-actions-buttons'); }, perform(operation) { @@ -85,12 +85,12 @@ export default Ember.ArrayController.extend(ModalFunctionality, { }, showChangeCategory() { - this.send('changeBulkTemplate', 'modal/bulk_change_category'); - this.set('controllers.modal.modalClass', 'topic-bulk-actions-modal full'); + this.send('changeBulkTemplate', 'modal/bulk-change-category'); + this.set('modal.modalClass', 'topic-bulk-actions-modal full'); }, showNotificationLevel() { - this.send('changeBulkTemplate', 'modal/bulk_notification_level'); + this.send('changeBulkTemplate', 'modal/bulk-notification-level'); }, deleteTopics() { diff --git a/app/assets/javascripts/discourse/controllers/topic-entrance.js.es6 b/app/assets/javascripts/discourse/controllers/topic-entrance.js.es6 deleted file mode 100644 index 4a7fdf61c61..00000000000 --- a/app/assets/javascripts/discourse/controllers/topic-entrance.js.es6 +++ /dev/null @@ -1,63 +0,0 @@ -import DiscourseURL from 'discourse/lib/url'; - -function entranceDate(dt, showTime) { - const today = new Date(); - - if (dt.toDateString() === today.toDateString()) { - return moment(dt).format(I18n.t("dates.time")); - } - - if (dt.getYear() === today.getYear()) { - // No year - return moment(dt).format( - showTime ? I18n.t("dates.long_date_without_year_with_linebreak") : I18n.t("dates.long_no_year_no_time") - ); - } - - return moment(dt).format( - showTime ? I18n.t('dates.long_date_with_year_with_linebreak') : I18n.t('dates.long_date_with_year_without_time') - ); -} - -export default Ember.Controller.extend({ - position: null, - - createdDate: function() { - return new Date(this.get('model.created_at')); - }.property('model.created_at'), - - bumpedDate: function() { - return new Date(this.get('model.bumped_at')); - }.property('model.bumped_at'), - - showTime: function() { - var diffMs = this.get('bumpedDate').getTime() - this.get('createdDate').getTime(); - return diffMs < (1000 * 60 * 60 * 24 * 2); - }.property('createdDate', 'bumpedDate'), - - topDate: function() { - return entranceDate(this.get('createdDate'), this.get('showTime')); - }.property('createdDate'), - - bottomDate: function() { - return entranceDate(this.get('bumpedDate'), this.get('showTime')); - }.property('bumpedDate'), - - actions: { - show(data) { - // Show the chooser but only if the model changes - if (this.get('model') !== data.topic) { - this.set('model', data.topic); - this.set('position', data.position); - } - }, - - enterTop() { - DiscourseURL.routeTo(this.get('model.url')); - }, - - enterBottom() { - DiscourseURL.routeTo(this.get('model.lastPostUrl')); - } - } -}); diff --git a/app/assets/javascripts/discourse/controllers/topic.js.es6 b/app/assets/javascripts/discourse/controllers/topic.js.es6 index a21d55ca328..6bedd2b5f33 100644 --- a/app/assets/javascripts/discourse/controllers/topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic.js.es6 @@ -9,40 +9,34 @@ import Composer from 'discourse/models/composer'; import DiscourseURL from 'discourse/lib/url'; import { categoryBadgeHTML } from 'discourse/helpers/category-link'; import Post from 'discourse/models/post'; +import debounce from 'discourse/lib/debounce'; +import isElementInViewport from "discourse/lib/is-element-in-viewport"; +import QuoteState from 'discourse/lib/quote-state'; export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { - needs: ['modal', 'composer', 'quote-button', 'application'], + composer: Ember.inject.controller(), + application: Ember.inject.controller(), multiSelect: false, allPostsSelected: false, editingTopic: false, selectedPosts: null, selectedReplies: null, - queryParams: ['filter', 'username_filters', 'show_deleted'], + queryParams: ['filter', 'username_filters'], loadedAllPosts: Ember.computed.or('model.postStream.loadedAllPosts', 'model.postStream.loadingLastPost'), enteredAt: null, enteredIndex: null, retrying: false, userTriggeredProgress: null, _progressIndex: null, + hasScrolled: null, + username_filters: null, + filter: null, + quoteState: null, - topicDelegated: [ - 'toggleMultiSelect', - 'deleteTopic', - 'recoverTopic', - 'toggleClosed', - 'showAutoClose', - 'showFeatureTopic', - 'showChangeTimestamp', - 'toggleArchived', - 'toggleVisibility', - 'convertToPublicTopic', - 'convertToPrivateMessage', - 'jumpTop', - 'jumpToPost', - 'jumpToIndex', - 'jumpBottom', - 'replyToPost' - ], + updateQueryParams() { + const postStream = this.get('model.postStream'); + this.setProperties(postStream.get('streamFilters')); + }, _titleChanged: function() { const title = this.get('model.title'); @@ -70,32 +64,6 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { return this.capabilities.isAndroid && loading; }, - @computed('model.postStream.summary') - show_deleted: { - set(value) { - const postStream = this.get('model.postStream'); - if (!postStream) { return; } - postStream.set('show_deleted', value); - return postStream.get('show_deleted') ? true : undefined; - }, - get() { - return this.get('postStream.show_deleted') ? true : undefined; - } - }, - - @computed('model.postStream.summary') - filter: { - set(value) { - const postStream = this.get('model.postStream'); - if (!postStream) { return; } - postStream.set('summary', value === "summary"); - return postStream.get('summary') ? "summary" : undefined; - }, - get() { - return this.get('postStream.summary') ? "summary" : undefined; - } - }, - @computed('model', 'topicTrackingState.messageCount') browseMoreMessage(model) { @@ -144,27 +112,16 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { @computed('model') suggestedTitle(model) { return model.get('isPrivateMessage') ? - ` ${I18n.t("suggested_topics.pm_title")}` : + ` ${I18n.t("suggested_topics.pm_title")}` : I18n.t("suggested_topics.title"); }, - @computed('model.postStream.streamFilters.username_filters') - username_filters: { - set(value) { - const postStream = this.get('model.postStream'); - if (!postStream) { return; } - postStream.set('streamFilters.username_filters', value); - return postStream.get('streamFilters.username_filters'); - }, - get() { - return this.get('postStream.streamFilters.username_filters'); - } - }, - - _clearSelected: function() { + init() { + this._super(); this.set('selectedPosts', []); this.set('selectedReplies', []); - }.on('init'), + this.set('quoteState', new QuoteState()); + }, showCategoryChooser: Ember.computed.not("model.isPrivateMessage"), @@ -180,6 +137,14 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { return post => this.postSelected(post); }.property(), + @computed('model.isPrivateMessage', 'model.category.id') + canEditTopicFeaturedLink(isPrivateMessage, categoryId) { + if (!this.siteSettings.topic_featured_link_enabled || isPrivateMessage) { return false; } + + const categoryIds = this.site.get('topic_featured_link_allowed_category_ids'); + return categoryIds === undefined || !categoryIds.length || categoryIds.indexOf(categoryId) !== -1; + }, + @computed('model.isPrivateMessage') canEditTags(isPrivateMessage) { return !isPrivateMessage && this.site.get('can_tag_topics'); @@ -187,6 +152,64 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { actions: { + showPostFlags(post) { + return this.send('showFlags', post); + }, + + topicRouteAction(name, model) { + return this.send(name, model); + }, + + openAutoClose() { + this.send('showAutoClose'); + }, + + openFeatureTopic() { + this.send('showFeatureTopic'); + }, + + selectText(postId, buffer) { + return this.get('model.postStream').loadPost(postId).then(post => { + const composer = this.get('composer'); + const viewOpen = composer.get('model.viewOpen'); + + // If we can't create a post, delegate to reply as new topic + if ((!viewOpen) && (!this.get('model.details.can_create_post'))) { + this.send('replyAsNewTopic', post); + return; + } + + const composerOpts = { + action: Composer.REPLY, + draftKey: post.get('topic.draft_key') + }; + + if (post.get('post_number') === 1) { + composerOpts.topic = post.get("topic"); + } else { + composerOpts.post = post; + } + + // If the composer is associated with a different post, we don't change it. + const composerPost = composer.get('model.post'); + if (composerPost && (composerPost.get('id') !== this.get('post.id'))) { + composerOpts.post = composerPost; + } + + const quotedText = Quote.build(post, buffer); + composerOpts.quote = quotedText; + if (composer.get('model.viewOpen')) { + this.appEvents.trigger('composer:insert-text', quotedText); + } else if (composer.get('model.viewDraft')) { + const model = composer.get('model'); + model.set('reply', model.get('reply') + quotedText); + composer.send('openIfDraft'); + } else { + composer.open(composerOpts); + } + }); + }, + fillGapBefore(args) { return this.get('model.postStream').fillGapBefore(args.post, args.gap); }, @@ -250,7 +273,9 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { }, toggleSummary() { - return this.get('model.postStream').toggleSummary(); + return this.get('model.postStream').toggleSummary().then(() => { + this.updateQueryParams(); + }); }, removeAllowedUser(user) { @@ -265,28 +290,33 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { this.deleteTopic(); }, - archiveMessage() { + // Archive a PM (as opposed to archiving a topic) + toggleArchiveMessage() { const topic = this.get('model'); - topic.archiveMessage().then(()=>{ - this.gotoInbox(topic.get("inboxGroupName")); - }); - }, + if (topic.get('archiving')) { return; } - moveToInbox() { - const topic = this.get('model'); - topic.moveToInbox().then(()=>{ - this.gotoInbox(topic.get("inboxGroupName")); - }); + if (topic.get('message_archived')) { + topic.moveToInbox().then(()=>{ + this.gotoInbox(topic.get("inboxGroupName")); + }); + } else { + topic.archiveMessage().then(()=>{ + this.gotoInbox(topic.get("inboxGroupName")); + }); + } }, // Post related methods replyToPost(post) { - const composerController = this.get('controllers.composer'), - quoteController = this.get('controllers.quote-button'), - quotedText = Quote.build(quoteController.get('post'), quoteController.get('buffer')), - topic = post ? post.get('topic') : this.get('model'); + const composerController = this.get('composer'); + const topic = post ? post.get('topic') : this.get('model'); - quoteController.set('buffer', ''); + const quoteState = this.get('quoteState'); + const postStream = this.get('model.postStream'); + const quotedPost = postStream.findLoadedPost(quoteState.postId); + const quotedText = Quote.build(quotedPost, quoteState.buffer); + + quoteState.clear(); if (composerController.get('content.topic.id') === topic.get('id') && composerController.get('content.action') === Composer.REPLY) { @@ -379,7 +409,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { return false; } - const composer = this.get('controllers.composer'), + const composer = this.get('composer'), composerModel = composer.get('model'), opts = { post: post, @@ -415,10 +445,26 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { this._jumpToPostId(this.get('model.postStream.stream')[index-1]); }, - jumpToPost(postNumber) { + jumpToPostPrompt() { + const postText = prompt(I18n.t('topic.progress.jump_prompt_long')); + if (postText === null) { return; } + const postNumber = parseInt(postText, 10); + if (postNumber === 0) { return; } this._jumpToPostId(this.get('model.postStream').findPostIdForPostNumber(postNumber)); }, + jumpToPost(postNumber) { + const postStream = this.get('model.postStream'); + let postId = postStream.findPostIdForPostNumber(postNumber); + + // If we couldn't find the post, find the closest post to it + if (!postId) { + const closest = postStream.closestPostNumberFor(postNumber); + postId = postStream.findPostIdForPostNumber(closest); + } + this._jumpToPostId(postId); + }, + jumpTop() { DiscourseURL.routeTo(this.get('model.firstPostUrl'), { skipIfOnScreen: false }); }, @@ -445,7 +491,10 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { }, toggleParticipant(user) { - this.get('model.postStream').toggleParticipant(Em.get(user, 'username')); + const postStream = this.get('model.postStream'); + postStream.toggleParticipant(Ember.get(user, 'username')).then(() => { + this.updateQueryParams(); + }); }, editTopic() { @@ -601,12 +650,11 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { }, replyAsNewTopic(post) { - const composerController = this.get('controllers.composer'); - const quoteController = this.get('controllers.quote-button'); - post = post || quoteController.get('post'); - const quotedText = Quote.build(post, quoteController.get('buffer')); + const composerController = this.get('composer'); - quoteController.deselectText(); + const { quoteState } = this; + const quotedText = Quote.build(post, quoteState.buffer); + quoteState.clear(); composerController.open({ action: Composer.CREATE_TOPIC, @@ -638,7 +686,6 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { togglePostType(post) { const regular = this.site.get('post_types.regular'); const moderator = this.site.get('post_types.moderator_action'); - return post.updatePostField('post_type', post.get('post_type') === moderator ? regular : moderator); }, @@ -670,9 +717,12 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { return; } + this.appEvents.trigger('topic:jump-to-post', postId); + const topic = this.get('model'); const postStream = topic.get('postStream'); const post = postStream.findLoadedPost(postId); + if (post) { DiscourseURL.routeTo(topic.urlForPostNumber(post.get('post_number'))); } else { @@ -687,6 +737,12 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { this.send('togglePinnedForUser'); }, + print() { + if (this.siteSettings.max_prints_per_hour_per_user > 0) { + window.open(this.get('model.printUrl'), '', 'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=600,height=315'); + } + }, + canMergeTopic: function() { if (!this.get('model.details.can_move_posts')) return false; return this.get('selectedPostsCount') > 0; @@ -753,7 +809,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { const selectedReplies = this.get('selectedReplies'); selectedReplies.removeObject(post); - const selectedReply = selectedReplies.findProperty('post_number', post.get('reply_to_post_number')); + const selectedReply = selectedReplies.findBy('post_number', post.get('reply_to_post_number')); if (selectedReply) { selectedReplies.removeObject(selectedReply); } this.set('allPostsSelected', false); @@ -761,8 +817,8 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { postSelected(post) { if (this.get('allPostsSelected')) { return true; } - if (this.get('selectedPosts').contains(post)) { return true; } - if (this.get('selectedReplies').findProperty('post_number', post.get('reply_to_post_number'))) { return true; } + if (this.get('selectedPosts').includes(post)) { return true; } + if (this.get('selectedReplies').findBy('post_number', post.get('reply_to_post_number'))) { return true; } return false; }, @@ -837,10 +893,35 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { topic.reload().then(() => { this.send('postChangedRoute', topic.get('post_number') || 1); }); + } else { + if (topic.get('isPrivateMessage') && + this.currentUser && + this.currentUser.get('id') !== data.user_id && + data.type === 'created') { + + const postNumber = data.post_number; + const notInPostStream = topic.get('highest_post_number') <= postNumber; + const postNumberDifference = postNumber - topic.get('currentPost'); + + if (notInPostStream && + postNumberDifference > 0 && + postNumberDifference < 7) { + + this._scrollToPost(data.post_number); + } + } } }); }, + _scrollToPost: debounce(function(postNumber) { + const $post = $(`.topic-post article#post_${postNumber}`); + + if ($post.length === 0 || isElementInViewport($post)) return; + + $('body').animate({ scrollTop: $post.offset().top }, 1000); + }, 500), + unsubscribe() { const topicId = this.get('content.id'); if (!topicId) return; @@ -893,10 +974,9 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { } }, - _showFooter: function() { const showFooter = this.get("model.postStream.loaded") && this.get("model.postStream.loadedAllPosts"); - this.set("controllers.application.showFooter", showFooter); + this.set("application.showFooter", showFooter); }.observes("model.postStream.{loaded,loadedAllPosts}") }); diff --git a/app/assets/javascripts/discourse/controllers/upload-customization.js.es6 b/app/assets/javascripts/discourse/controllers/upload-customization.js.es6 index d7a980a0b42..ae7575887a9 100644 --- a/app/assets/javascripts/discourse/controllers/upload-customization.js.es6 +++ b/app/assets/javascripts/discourse/controllers/upload-customization.js.es6 @@ -2,7 +2,7 @@ import ModalFunctionality from 'discourse/mixins/modal-functionality'; export default Ember.Controller.extend(ModalFunctionality, { notReady: Em.computed.not('ready'), - needs: ['adminCustomizeCssHtml'], + adminCustomizeCssHtml: Ember.inject.controller(), ready: function() { try { @@ -22,7 +22,7 @@ export default Ember.Controller.extend(ModalFunctionality, { delete object.id; delete object.key; - const controller = this.get('controllers.adminCustomizeCssHtml'); + const controller = this.get('adminCustomizeCssHtml'); controller.send('newCustomization', object); } } diff --git a/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 b/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 index bc083efcc4f..0fee68472b5 100644 --- a/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 +++ b/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 @@ -1,30 +1,37 @@ import ModalFunctionality from 'discourse/mixins/modal-functionality'; -import { default as computed } from 'ember-addons/ember-computed-decorators'; +import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; import { allowsAttachments, authorizesAllExtensions, authorizedExtensions } from 'discourse/lib/utilities'; -export function uploadTranslate(key, options) { - options = options || {}; +function uploadTranslate(key) { if (allowsAttachments()) { key += "_with_attachments"; } - return I18n.t(`upload_selector.${key}`, options); + return `upload_selector.${key}`; } export default Ember.Controller.extend(ModalFunctionality, { showMore: false, - local: true, imageUrl: null, imageLink: null, - remote: Ember.computed.not("local"), + local: Ember.computed.equal('selection', 'local'), + remote: Ember.computed.equal('selection', 'remote'), + selection: 'local', - @computed - uploadIcon() { - return allowsAttachments() ? "upload" : "picture-o"; + @computed() + uploadIcon: () => allowsAttachments() ? "upload" : "picture-o", + + @computed() + title: () => uploadTranslate("title"), + + @computed('selection') + tip(selection) { + const authorized_extensions = authorizesAllExtensions() ? "" : `(${authorizedExtensions()})`; + return I18n.t(uploadTranslate(`${selection}_tip`), { authorized_extensions }); }, - @computed('local') - tip(local) { - const source = local ? "local" : "remote"; - const authorized_extensions = authorizesAllExtensions() ? "" : `(${authorizedExtensions()})`; - return uploadTranslate(`${source}_tip`, { authorized_extensions }); + @observes('selection') + _selectionChanged() { + if (this.get('local')) { + this.set('showMore', false); + } }, actions: { @@ -45,12 +52,6 @@ export default Ember.Controller.extend(ModalFunctionality, { this.send('closeModal'); }, - useLocal() { - this.setProperties({ local: true, showMore: false}); - }, - useRemote() { - this.set("local", false); - }, toggleShowMore() { this.toggleProperty("showMore"); } diff --git a/app/assets/javascripts/discourse/controllers/user-activity.js.es6 b/app/assets/javascripts/discourse/controllers/user-activity.js.es6 index 55ab7846cae..624a8b0ae79 100644 --- a/app/assets/javascripts/discourse/controllers/user-activity.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-activity.js.es6 @@ -1,11 +1,13 @@ import { exportUserArchive } from 'discourse/lib/export-csv'; export default Ember.Controller.extend({ + application: Ember.inject.controller(), + user: Ember.inject.controller(), + userActionType: null, - needs: ["application", "user"], - currentPath: Em.computed.alias('controllers.application.currentPath'), - viewingSelf: Em.computed.alias("controllers.user.viewingSelf"), - showBookmarks: Em.computed.alias("controllers.user.showBookmarks"), + currentPath: Ember.computed.alias('application.currentPath'), + viewingSelf: Ember.computed.alias("user.viewingSelf"), + showBookmarks: Ember.computed.alias("user.showBookmarks"), _showFooter: function() { var showFooter; @@ -15,13 +17,13 @@ export default Ember.Controller.extend({ } else { showFooter = this.get("model.statsCountNonPM") <= this.get("model.stream.itemsLoaded"); } - this.set("controllers.application.showFooter", showFooter); + this.set("application.showFooter", showFooter); }.observes("userActionType", "model.stream.itemsLoaded"), actions: { exportUserArchive() { bootbox.confirm( - I18n.t("admin.export_csv.user_archive_confirm"), + I18n.t("user.download_archive.confirm"), I18n.t("no_value"), I18n.t("yes_value"), function(confirmed) { diff --git a/app/assets/javascripts/discourse/controllers/user-badges.js.es6 b/app/assets/javascripts/discourse/controllers/user-badges.js.es6 index 76b2a05cd92..3089a073778 100644 --- a/app/assets/javascripts/discourse/controllers/user-badges.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-badges.js.es6 @@ -1,20 +1,6 @@ -export default Ember.ArrayController.extend({ - needs: ["user"], - user: Em.computed.alias("controllers.user.model"), - sortProperties: ['badge.badge_type.sort_order', 'badge.name'], - orderBy: function(ub1, ub2){ - var sr1 = ub1.get('badge.badge_type.sort_order'); - var sr2 = ub2.get('badge.badge_type.sort_order'); - - - if(sr1 > sr2) { - return -1; - } - - if(sr2 > sr1) { - return 1; - } - - return ub1.get('badge.name') < ub2.get('badge.name') ? -1 : 1; - } +export default Ember.Controller.extend({ + user: Ember.inject.controller(), + username: Ember.computed.alias('user.model.username_lower'), + sortedBadges: Ember.computed.sort('model', 'badgeSortOrder'), + badgeSortOrder: ['badge.badge_type.sort_order', 'badge.name'], }); diff --git a/app/assets/javascripts/discourse/controllers/user-card.js.es6 b/app/assets/javascripts/discourse/controllers/user-card.js.es6 index 377ffb97a85..bef0267803d 100644 --- a/app/assets/javascripts/discourse/controllers/user-card.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-card.js.es6 @@ -1,149 +1,15 @@ -import DiscourseURL from 'discourse/lib/url'; -import { propertyNotEqual, setting } from 'discourse/lib/computed'; -import computed from 'ember-addons/ember-computed-decorators'; - export default Ember.Controller.extend({ - needs: ['topic', 'application'], - visible: false, - user: null, - username: null, - avatar: null, - userLoading: null, - cardTarget: null, - post: null, - - // If inside a topic - topicPostCount: null, - - postStream: Em.computed.alias('controllers.topic.model.postStream'), - enoughPostsForFiltering: Em.computed.gte('topicPostCount', 2), - viewingTopic: Em.computed.match('controllers.application.currentPath', /^topic\./), - viewingAdmin: Em.computed.match('controllers.application.currentPath', /^admin\./), - showFilter: Em.computed.and('viewingTopic', 'postStream.hasNoFilters', 'enoughPostsForFiltering'), - showName: propertyNotEqual('user.name', 'user.username'), - hasUserFilters: Em.computed.gt('postStream.userFilters.length', 0), - isSuspended: Em.computed.notEmpty('user.suspend_reason'), - showBadges: setting('enable_badges'), - showMoreBadges: Em.computed.gt('moreBadgesCount', 0), - showDelete: Em.computed.and("viewingAdmin", "showName", "user.canBeDeleted"), - linkWebsite: Em.computed.not('user.isBasic'), - hasLocationOrWebsite: Em.computed.or('user.location', 'user.website_name'), - - @computed('user.name') - nameFirst(name) { - return !this.get('siteSettings.prioritize_username_in_ux') && name && name.trim().length > 0; - }, - - @computed('user.user_fields.@each.value') - publicUserFields() { - const siteUserFields = this.site.get('user_fields'); - if (!Ember.isEmpty(siteUserFields)) { - const userFields = this.get('user.user_fields'); - return siteUserFields.filterProperty('show_on_user_card', true).sortBy('position').map(field => { - Ember.set(field, 'dasherized_name', field.get('name').dasherize()); - const value = userFields ? userFields[field.get('id')] : null; - return Ember.isEmpty(value) ? null : Ember.Object.create({ value, field }); - }).compact(); - } - }, - - @computed("user.trust_level") - removeNoFollow(trustLevel) { - return trustLevel > 2 && !this.siteSettings.tl3_links_no_follow; - }, - - moreBadgesCount: function() { - return this.get('user.badge_count') - this.get('user.featured_user_badges.length'); - }.property('user.badge_count', 'user.featured_user_badges.[]'), - - hasCardBadgeImage: function() { - const img = this.get('user.card_badge.image'); - return img && img.indexOf('fa-') !== 0; - }.property('user.card_badge.image'), - - show(username, postId, target) { - // XSS protection (should be encapsulated) - username = username.toString().replace(/[^A-Za-z0-9_\.\-]/g, ""); - - // No user card for anon - if (this.siteSettings.hide_user_profiles_from_public && !this.currentUser) { - return; - } - - // Don't show on mobile - if (this.site.mobileView) { - const url = "/users/" + username; - DiscourseURL.routeTo(url); - return; - } - - const currentUsername = this.get('username'), - wasVisible = this.get('visible'), - previousTarget = this.get('cardTarget'), - post = this.get('viewingTopic') && postId ? this.get('postStream').findLoadedPost(postId) : null; - - if (username === currentUsername && this.get('userLoading') === username) { - // debounce - return; - } - - if (wasVisible) { - this.close(); - if (target === previousTarget) { - return; // Same target, close it without loading the new user card - } - } - - this.setProperties({ username, userLoading: username, cardTarget: target, post }); - - const args = { stats: false }; - args.include_post_count_for = this.get('controllers.topic.model.id'); - args.skip_track_visit = true; - - return Discourse.User.findByUsername(username, args).then((user) => { - if (user.topic_post_count) { - this.set('topicPostCount', user.topic_post_count[args.include_post_count_for]); - } - this.setProperties({ user, avatar: user, visible: true }); - }).catch((error) => { - this.close(); - throw error; - }).finally(() => { - this.set('userLoading', null); - }); - }, - - close() { - this.setProperties({ - visible: false, - user: null, - username: null, - avatar: null, - userLoading: null, - cardTarget: null, - post: null, - topicPostCount: null - }); - }, + topic: Ember.inject.controller(), + application: Ember.inject.controller(), actions: { togglePosts(user) { - const postStream = this.get('postStream'); - postStream.toggleParticipant(user.get('username')); - this.close(); + const topicController = this.get('topic'); + topicController.send('toggleParticipant', user); }, - cancelFilter() { - const postStream = this.get('postStream'); - postStream.cancelFilter(); - postStream.refresh(); - this.close(); - }, - - showUser() { - this.transitionToRoute('user', this.get('user')); - this.close(); + showUser(user) { + this.transitionToRoute('user', user); } } - }); diff --git a/app/assets/javascripts/discourse/controllers/user-invited-show.js.es6 b/app/assets/javascripts/discourse/controllers/user-invited-show.js.es6 index 15d71343589..78c786847ec 100644 --- a/app/assets/javascripts/discourse/controllers/user-invited-show.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-invited-show.js.es6 @@ -18,8 +18,6 @@ export default Ember.Controller.extend({ this.set('searchTerm', ''); }, - uploadText: function() { return I18n.t("user.invited.bulk_invite.text"); }.property(), - /** Observe the search term box with a debouncer and change the results. diff --git a/app/assets/javascripts/discourse/controllers/user-notifications.js.es6 b/app/assets/javascripts/discourse/controllers/user-notifications.js.es6 index c185d2c29a5..44b25f1043c 100644 --- a/app/assets/javascripts/discourse/controllers/user-notifications.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-notifications.js.es6 @@ -1,12 +1,12 @@ import { ajax } from 'discourse/lib/ajax'; import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; -export default Ember.ArrayController.extend({ - needs: ['application'], +export default Ember.Controller.extend({ + application: Ember.inject.controller(), @observes('model.canLoadMore') _showFooter() { - this.set("controllers.application.showFooter", !this.get("model.canLoadMore")); + this.set("application.showFooter", !this.get("model.canLoadMore")); }, @computed('model.content.length') @@ -16,11 +16,9 @@ export default Ember.ArrayController.extend({ @computed('model.content.@each.read') allNotificationsRead() { - return !this.get('model.content').some((notification) => !notification.get('read')); + return !this.get('model.content').some(notification => !notification.get('read')); }, - currentPath: Em.computed.alias('controllers.application.currentPath'), - actions: { resetNew() { ajax('/notifications/mark-read', { method: 'PUT' }).then(() => { diff --git a/app/assets/javascripts/discourse/controllers/user-posts.js.es6 b/app/assets/javascripts/discourse/controllers/user-posts.js.es6 index e06143db481..25c730d97ad 100644 --- a/app/assets/javascripts/discourse/controllers/user-posts.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-posts.js.es6 @@ -1,7 +1,7 @@ export default Ember.Controller.extend({ - needs: ["application"], + application: Ember.inject.controller(), _showFooter: function() { - this.set("controllers.application.showFooter", !this.get("model.canLoadMore")); + this.set("application.showFooter", !this.get("model.canLoadMore")); }.observes("model.canLoadMore") }); diff --git a/app/assets/javascripts/discourse/controllers/user-private-messages.js.es6 b/app/assets/javascripts/discourse/controllers/user-private-messages.js.es6 index 18f010adccd..bb79db55d37 100644 --- a/app/assets/javascripts/discourse/controllers/user-private-messages.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-private-messages.js.es6 @@ -2,18 +2,21 @@ import computed from 'ember-addons/ember-computed-decorators'; import Topic from 'discourse/models/topic'; export default Ember.Controller.extend({ - needs: ["application", "user-topics-list", "user"], + application: Ember.inject.controller(), + userTopicsList: Ember.inject.controller('user-topics-list'), + user: Ember.inject.controller(), + pmView: false, - viewingSelf: Em.computed.alias('controllers.user.viewingSelf'), + viewingSelf: Em.computed.alias('user.viewingSelf'), isGroup: Em.computed.equal('pmView', 'groups'), - currentPath: Em.computed.alias('controllers.application.currentPath'), - selected: Em.computed.alias('controllers.user-topics-list.selected'), - bulkSelectEnabled: Em.computed.alias('controllers.user-topics-list.bulkSelectEnabled'), + currentPath: Em.computed.alias('application.currentPath'), + selected: Em.computed.alias('userTopicsList.selected'), + bulkSelectEnabled: Em.computed.alias('userTopicsList.bulkSelectEnabled'), showNewPM: function(){ - return this.get('controllers.user.viewingSelf') && + return this.get('user.viewingSelf') && Discourse.User.currentProp('can_send_private_messages'); - }.property('controllers.user.viewingSelf'), + }.property('user.viewingSelf'), @computed('selected.[]', 'bulkSelectEnabled') hasSelection(selected, bulkSelectEnabled){ @@ -39,7 +42,7 @@ export default Ember.Controller.extend({ } Topic.bulkOperation(selected,params).then(() => { - const model = this.get('controllers.user-topics-list.model'); + const model = this.get('userTopicsList.model'); const topics = model.get('topics'); topics.removeObjects(selected); selected.clear(); diff --git a/app/assets/javascripts/discourse/controllers/user-summary.js.es6 b/app/assets/javascripts/discourse/controllers/user-summary.js.es6 index d41962d96ca..c40014854cb 100644 --- a/app/assets/javascripts/discourse/controllers/user-summary.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-summary.js.es6 @@ -6,8 +6,8 @@ const MAX_SUMMARY_RESULTS = 6; const MAX_BADGES = 6; export default Ember.Controller.extend({ - needs: ['user'], - user: Ember.computed.alias('controllers.user.model'), + userController: Ember.inject.controller('user'), + user: Ember.computed.alias('userController.model'), @computed("model.topics.length") moreTopics(topicsLength) { return topicsLength >= MAX_SUMMARY_RESULTS; }, diff --git a/app/assets/javascripts/discourse/controllers/user-topics-list.js.es6 b/app/assets/javascripts/discourse/controllers/user-topics-list.js.es6 index e4d428a4f90..8e150fd2890 100644 --- a/app/assets/javascripts/discourse/controllers/user-topics-list.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-topics-list.js.es6 @@ -1,11 +1,12 @@ // Lists of topics on a user's page. export default Ember.Controller.extend({ - needs: ["application", "user"], + application: Ember.inject.controller(), + hideCategory: false, showPosters: false, _showFooter: function() { - this.set("controllers.application.showFooter", !this.get("model.canLoadMore")); + this.set("application.showFooter", !this.get("model.canLoadMore")); }.observes("model.canLoadMore"), actions: { diff --git a/app/assets/javascripts/discourse/controllers/user.js.es6 b/app/assets/javascripts/discourse/controllers/user.js.es6 index b5151f1b33c..f12612b45c8 100644 --- a/app/assets/javascripts/discourse/controllers/user.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user.js.es6 @@ -6,19 +6,30 @@ import User from 'discourse/models/user'; export default Ember.Controller.extend(CanCheckEmails, { indexStream: false, userActionType: null, - needs: ['application','user-notifications', 'user-topics-list'], - currentPath: Em.computed.alias('controllers.application.currentPath'), + application: Ember.inject.controller(), + userNotifications: Ember.inject.controller('user-notifications'), + currentPath: Ember.computed.alias('application.currentPath'), @computed("content.username") viewingSelf(username) { return username === User.currentProp('username'); }, + @computed('model.profileBackground') + hasProfileBackground(background) { + return !Ember.isEmpty(background.toString()); + }, + @computed('indexStream', 'viewingSelf', 'forceExpand') collapsedInfo(indexStream, viewingSelf, forceExpand){ return (!indexStream || viewingSelf) && !forceExpand; }, + @computed('model.isSuspended', 'currentUser.staff') + isNotSuspendedOrIsStaff(isSuspended, isStaff) { + return !isSuspended || isStaff; + }, + linkWebsite: Em.computed.not('model.isBasic'), @computed("model.trust_level") @@ -75,8 +86,8 @@ export default Ember.Controller.extend(CanCheckEmails, { const siteUserFields = this.site.get('user_fields'); if (!Ember.isEmpty(siteUserFields)) { const userFields = this.get('model.user_fields'); - return siteUserFields.filterProperty('show_on_profile', true).sortBy('position').map(field => { - field.dasherized_name = field.get('name').dasherize(); + return siteUserFields.filterBy('show_on_profile', true).sortBy('position').map(field => { + Ember.set(field, 'dasherized_name', field.get('name').dasherize()); const value = userFields ? userFields[field.get('id').toString()] : null; return Ember.isEmpty(value) ? null : Ember.Object.create({ value, field }); }).compact(); diff --git a/app/assets/javascripts/discourse/controllers/users.js.es6 b/app/assets/javascripts/discourse/controllers/users.js.es6 index 8ad3eabcba5..f5bb1963025 100644 --- a/app/assets/javascripts/discourse/controllers/users.js.es6 +++ b/app/assets/javascripts/discourse/controllers/users.js.es6 @@ -1,7 +1,7 @@ import debounce from 'discourse/lib/debounce'; export default Ember.Controller.extend({ - needs: ["application"], + application: Ember.inject.controller(), queryParams: ["period", "order", "asc", "name"], period: "weekly", order: "likes_received", @@ -15,7 +15,7 @@ export default Ember.Controller.extend({ }, 500).observes("nameInput"), _showFooter: function() { - this.set("controllers.application.showFooter", !this.get("model.canLoadMore")); + this.set("application.showFooter", !this.get("model.canLoadMore")); }.observes("model.canLoadMore"), actions: { diff --git a/app/assets/javascripts/discourse/ember/resolver.js.es6 b/app/assets/javascripts/discourse/ember/resolver.js.es6 deleted file mode 100644 index 99ecb42d2a9..00000000000 --- a/app/assets/javascripts/discourse/ember/resolver.js.es6 +++ /dev/null @@ -1,198 +0,0 @@ -/* global requirejs, require */ - -var classify = Ember.String.classify; -var get = Ember.get; - -var LOADING_WHITELIST = ['badges', 'userActivity', 'userPrivateMessages', 'admin', 'adminFlags', - 'user', 'preferences', 'adminEmail', 'adminUsersList']; -var _dummyRoute; -var _loadingView; - -function loadingResolver(cb) { - return function(parsedName) { - var fullNameWithoutType = parsedName.fullNameWithoutType; - - if (fullNameWithoutType.indexOf('Loading') >= 0) { - fullNameWithoutType = fullNameWithoutType.replace('Loading', ''); - if (LOADING_WHITELIST.indexOf(fullNameWithoutType) !== -1) { - return cb(fullNameWithoutType); - } - } - }; -} - -function parseName(fullName) { - const nameParts = fullName.split(":"), - type = nameParts[0], fullNameWithoutType = nameParts[1], - name = fullNameWithoutType, - namespace = get(this, 'namespace'), - root = namespace; - - return { - fullName: fullName, - type: type, - fullNameWithoutType: fullNameWithoutType, - name: name, - root: root, - resolveMethodName: "resolve" + classify(type) - }; -} - -export default Ember.DefaultResolver.extend({ - parseName: parseName, - - normalize(fullName) { - var split = fullName.split(':'); - if (split.length > 1) { - var discourseBase = 'discourse/' + split[0] + 's/'; - var adminBase = 'admin/' + split[0] + 's/'; - - // Allow render 'admin/templates/xyz' too - split[1] = split[1].replace('.templates', '').replace('/templates', ''); - - // Try slashes - var dashed = Ember.String.dasherize(split[1].replace(/\./g, '/')); - if (requirejs.entries[discourseBase + dashed] || requirejs.entries[adminBase + dashed]) { - return split[0] + ":" + dashed; - } - - // Try with dashes instead of slashes - dashed = Ember.String.dasherize(split[1].replace(/\./g, '-')); - if (requirejs.entries[discourseBase + dashed] || requirejs.entries[adminBase + dashed]) { - return split[0] + ":" + dashed; - } - } - return this._super(fullName); - }, - - customResolve(parsedName) { - // If we end with the name we want, use it. This allows us to define components within plugins. - const suffix = parsedName.type + 's/' + parsedName.fullNameWithoutType, - dashed = Ember.String.dasherize(suffix), - moduleName = Object.keys(requirejs.entries).find(function(e) { - return (e.indexOf(suffix, e.length - suffix.length) !== -1) || - (e.indexOf(dashed, e.length - dashed.length) !== -1); - }); - - var module; - if (moduleName) { - module = require(moduleName, null, null, true /* force sync */); - if (module && module['default']) { module = module['default']; } - } - return module; - }, - - resolveWidget(parsedName) { - return this.customResolve(parsedName) || this._super(parsedName); - }, - - resolveAdapter(parsedName) { - return this.customResolve(parsedName) || this._super(parsedName); - }, - - resolveModel(parsedName) { - return this.customResolve(parsedName) || this._super(parsedName); - }, - - resolveView(parsedName) { - return this.findLoadingView(parsedName) || this.customResolve(parsedName) || this._super(parsedName); - }, - - resolveHelper(parsedName) { - return this.customResolve(parsedName) || this._super(parsedName); - }, - - resolveController(parsedName) { - return this.customResolve(parsedName) || this._super(parsedName); - }, - - resolveComponent(parsedName) { - return this.customResolve(parsedName) || this._super(parsedName); - }, - - resolveRoute(parsedName) { - return this.findLoadingRoute(parsedName) || this.customResolve(parsedName) || this._super(parsedName); - }, - - resolveTemplate(parsedName) { - return this.findPluginTemplate(parsedName) || - this.findMobileTemplate(parsedName) || - this.findTemplate(parsedName) || - Ember.TEMPLATES.not_found; - }, - - findLoadingRoute: loadingResolver(function() { - _dummyRoute = _dummyRoute || Ember.Route.extend(); - return _dummyRoute; - }), - - findLoadingView: loadingResolver(function() { - if (!_loadingView) { - _loadingView = require('discourse/views/loading', null, null, true /* force sync */); - if (_loadingView && _loadingView['default']) { _loadingView = _loadingView['default']; } - } - return _loadingView; - }), - - findPluginTemplate(parsedName) { - var pluginParsedName = this.parseName(parsedName.fullName.replace("template:", "template:javascripts/")); - return this.findTemplate(pluginParsedName); - }, - - findMobileTemplate(parsedName) { - if (this.mobileView) { - var mobileParsedName = this.parseName(parsedName.fullName.replace("template:", "template:mobile/")); - return this.findTemplate(mobileParsedName); - } - }, - - findTemplate(parsedName) { - const withoutType = parsedName.fullNameWithoutType, - slashedType = withoutType.replace(/\./g, '/'), - decamelized = withoutType.decamelize(), - dashed = decamelized.replace(/\./g, '-').replace(/\_/g, '-'), - templates = Ember.TEMPLATES; - - return this._super(parsedName) || - templates[slashedType] || - templates[withoutType] || - templates[dashed] || - templates[decamelized.replace(/\./, '/')] || - templates[decamelized.replace(/\_/, '/')] || - this.findAdminTemplate(parsedName) || - this.findUnderscoredTemplate(parsedName); - }, - - findUnderscoredTemplate(parsedName) { - var decamelized = parsedName.fullNameWithoutType.decamelize(); - var underscored = decamelized.replace(/\-/g, "_"); - return Ember.TEMPLATES[underscored]; - }, - - // Try to find a template within a special admin namespace, e.g. adminEmail => admin/templates/email - // (similar to how discourse lays out templates) - findAdminTemplate(parsedName) { - var decamelized = parsedName.fullNameWithoutType.decamelize(); - - if (decamelized.indexOf('components') === 0) { - const compTemplate = Ember.TEMPLATES['admin/templates/' + decamelized]; - if (compTemplate) { return compTemplate; } - } - - if (decamelized === "javascripts/admin") { - return Ember.TEMPLATES['admin/templates/admin']; - } - - if (decamelized.indexOf('admin') === 0 || decamelized.indexOf('javascripts/admin') === 0) { - decamelized = decamelized.replace(/^admin\_/, 'admin/templates/'); - decamelized = decamelized.replace(/^admin\./, 'admin/templates/'); - decamelized = decamelized.replace(/\./g, '_'); - - const dashed = decamelized.replace(/_/g, '-'); - return Ember.TEMPLATES[decamelized] || - Ember.TEMPLATES[dashed] || - Ember.TEMPLATES[dashed.replace('admin-', 'admin/')]; - } - } - -}); diff --git a/app/assets/javascripts/discourse/helpers/application.js.es6 b/app/assets/javascripts/discourse/helpers/application.js.es6 index dda9e4e7b99..05306c0e62f 100644 --- a/app/assets/javascripts/discourse/helpers/application.js.es6 +++ b/app/assets/javascripts/discourse/helpers/application.js.es6 @@ -1,4 +1,4 @@ -import { registerUnbound } from 'discourse/lib/helpers'; +import { registerUnbound } from 'discourse-common/lib/helpers'; import { longDate, autoUpdatingRelativeAge, number } from 'discourse/lib/formatter'; const safe = Handlebars.SafeString; @@ -20,11 +20,13 @@ registerUnbound('number', (orig, params) => { if (params['class']) { classNames += ' ' + params['class']; } + let result = "" + n + ""; diff --git a/app/assets/javascripts/discourse/helpers/as-hash.js.es6 b/app/assets/javascripts/discourse/helpers/as-hash.js.es6 deleted file mode 100644 index c5c67a64e02..00000000000 --- a/app/assets/javascripts/discourse/helpers/as-hash.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -// Note: Later versions of ember include `hash` -export default function hashHelper(params) { - const hash = {}; - Object.keys(params.hash).forEach(k => { - hash[k] = params.data.view.getStream(params.hash[k]).value(); - }); - return hash; -} diff --git a/app/assets/javascripts/discourse/helpers/border-color.js.es6 b/app/assets/javascripts/discourse/helpers/border-color.js.es6 index 7d6d2286760..4c327a8190e 100644 --- a/app/assets/javascripts/discourse/helpers/border-color.js.es6 +++ b/app/assets/javascripts/discourse/helpers/border-color.js.es6 @@ -1,3 +1,3 @@ -import { htmlHelper } from 'discourse/lib/helpers'; +import { htmlHelper } from 'discourse-common/lib/helpers'; export default htmlHelper(color => `border-color: #${color}`); diff --git a/app/assets/javascripts/discourse/helpers/bound-avatar-template.js.es6 b/app/assets/javascripts/discourse/helpers/bound-avatar-template.js.es6 index 31f5611c755..5682cd2fbdc 100644 --- a/app/assets/javascripts/discourse/helpers/bound-avatar-template.js.es6 +++ b/app/assets/javascripts/discourse/helpers/bound-avatar-template.js.es6 @@ -1,4 +1,4 @@ -import { htmlHelper } from 'discourse/lib/helpers'; +import { htmlHelper } from 'discourse-common/lib/helpers'; import { avatarImg } from 'discourse/lib/utilities'; export default htmlHelper((avatarTemplate, size) => avatarImg({ size, avatarTemplate })); diff --git a/app/assets/javascripts/discourse/helpers/bound-avatar.js.es6 b/app/assets/javascripts/discourse/helpers/bound-avatar.js.es6 index 79639c8a16a..2833f8cefb1 100644 --- a/app/assets/javascripts/discourse/helpers/bound-avatar.js.es6 +++ b/app/assets/javascripts/discourse/helpers/bound-avatar.js.es6 @@ -1,4 +1,4 @@ -import { htmlHelper } from 'discourse/lib/helpers'; +import { htmlHelper } from 'discourse-common/lib/helpers'; import { avatarImg } from 'discourse/lib/utilities'; export default htmlHelper((user, size) => { diff --git a/app/assets/javascripts/discourse/helpers/bound-category-link.js.es6 b/app/assets/javascripts/discourse/helpers/bound-category-link.js.es6 index 5d215405b26..a08d97d8876 100644 --- a/app/assets/javascripts/discourse/helpers/bound-category-link.js.es6 +++ b/app/assets/javascripts/discourse/helpers/bound-category-link.js.es6 @@ -1,4 +1,4 @@ -import { htmlHelper } from 'discourse/lib/helpers'; +import { htmlHelper } from 'discourse-common/lib/helpers'; import { categoryLinkHTML } from 'discourse/helpers/category-link'; export default htmlHelper(categoryLinkHTML); diff --git a/app/assets/javascripts/discourse/helpers/bound-date.js.es6 b/app/assets/javascripts/discourse/helpers/bound-date.js.es6 index b4f75cffc4c..beab3e1730a 100644 --- a/app/assets/javascripts/discourse/helpers/bound-date.js.es6 +++ b/app/assets/javascripts/discourse/helpers/bound-date.js.es6 @@ -1,4 +1,4 @@ import { autoUpdatingRelativeAge } from 'discourse/lib/formatter'; -import { htmlHelper } from 'discourse/lib/helpers'; +import { htmlHelper } from 'discourse-common/lib/helpers'; export default htmlHelper(dt => autoUpdatingRelativeAge(new Date(dt), {format: 'medium', title: true })); diff --git a/app/assets/javascripts/discourse/helpers/capitalize-string.js.es6 b/app/assets/javascripts/discourse/helpers/capitalize-string.js.es6 index 3914e405bd8..976a9ecd342 100644 --- a/app/assets/javascripts/discourse/helpers/capitalize-string.js.es6 +++ b/app/assets/javascripts/discourse/helpers/capitalize-string.js.es6 @@ -1,3 +1,3 @@ -import { htmlHelper } from 'discourse/lib/helpers'; +import { htmlHelper } from 'discourse-common/lib/helpers'; export default htmlHelper(str => str[0].toUpperCase() + str.slice(1)); diff --git a/app/assets/javascripts/discourse/helpers/category-badge.js.es6 b/app/assets/javascripts/discourse/helpers/category-badge.js.es6 index c716537a6d3..41aad35a597 100644 --- a/app/assets/javascripts/discourse/helpers/category-badge.js.es6 +++ b/app/assets/javascripts/discourse/helpers/category-badge.js.es6 @@ -1,7 +1,10 @@ import { categoryLinkHTML } from 'discourse/helpers/category-link'; -import { registerUnbound } from 'discourse/lib/helpers'; +import { registerUnbound } from 'discourse-common/lib/helpers'; registerUnbound('category-badge', function(cat, options) { - options.link = false; - return categoryLinkHTML(cat, options); + return categoryLinkHTML(cat, { + hideParent: options.hideParent, + allowUncategorized: options.allowUncategorized, + link: false + }); }); diff --git a/app/assets/javascripts/discourse/helpers/category-link.js.es6 b/app/assets/javascripts/discourse/helpers/category-link.js.es6 index bc184157485..618eca3211a 100644 --- a/app/assets/javascripts/discourse/helpers/category-link.js.es6 +++ b/app/assets/javascripts/discourse/helpers/category-link.js.es6 @@ -1,5 +1,5 @@ -import { registerUnbound } from 'discourse/lib/helpers'; -import { iconHTML } from 'discourse/helpers/fa-icon'; +import { registerUnbound } from 'discourse-common/lib/helpers'; +import { iconHTML } from 'discourse-common/helpers/fa-icon'; var get = Em.get, escapeExpression = Handlebars.Utils.escapeExpression; diff --git a/app/assets/javascripts/discourse/helpers/cold-age-class.js.es6 b/app/assets/javascripts/discourse/helpers/cold-age-class.js.es6 index 54c23bfb63b..5042a11120f 100644 --- a/app/assets/javascripts/discourse/helpers/cold-age-class.js.es6 +++ b/app/assets/javascripts/discourse/helpers/cold-age-class.js.es6 @@ -1,4 +1,4 @@ -import { registerUnbound } from 'discourse/lib/helpers'; +import { registerUnbound } from 'discourse-common/lib/helpers'; function daysSinceEpoch(dt) { // 1000 * 60 * 60 * 24 = days since epoch diff --git a/app/assets/javascripts/discourse/helpers/cook-text.js.es6 b/app/assets/javascripts/discourse/helpers/cook-text.js.es6 index ba214983a22..7864f01af80 100644 --- a/app/assets/javascripts/discourse/helpers/cook-text.js.es6 +++ b/app/assets/javascripts/discourse/helpers/cook-text.js.es6 @@ -1,4 +1,4 @@ import { cook } from 'discourse/lib/text'; -import { registerUnbound } from 'discourse/lib/helpers'; +import { registerUnbound } from 'discourse-common/lib/helpers'; registerUnbound('cook-text', cook); diff --git a/app/assets/javascripts/discourse/helpers/custom-html.js.es6 b/app/assets/javascripts/discourse/helpers/custom-html.js.es6 index 8dc3be9c380..1fbc94eb832 100644 --- a/app/assets/javascripts/discourse/helpers/custom-html.js.es6 +++ b/app/assets/javascripts/discourse/helpers/custom-html.js.es6 @@ -1,7 +1,6 @@ -import { registerHelper } from 'discourse/lib/helpers'; import PreloadStore from 'preload-store'; -const _customizations = {}; +let _customizations = {}; export function getCustomHTML(key) { const c = _customizations[key]; @@ -15,20 +14,11 @@ export function getCustomHTML(key) { } } +export function clearHTMLCache() { + _customizations = {}; +} + // Set a fragment of HTML by key. It can then be looked up with `getCustomHTML(key)`. export function setCustomHTML(key, html) { _customizations[key] = html; } - -registerHelper('custom-html', function(params, hash, options, env) { - const name = params[0]; - const html = getCustomHTML(name); - if (html) { return html; } - - const contextString = params[1]; - const target = (env || contextString); - const container = target.container || target.data.view.container; - if (container.lookup('template:' + name)) { - return env.helpers.partial.helperFunction.apply(this, arguments); - } -}); diff --git a/app/assets/javascripts/discourse/helpers/dash-if-empty.js.es6 b/app/assets/javascripts/discourse/helpers/dash-if-empty.js.es6 index fd694261d37..4b1553735c8 100644 --- a/app/assets/javascripts/discourse/helpers/dash-if-empty.js.es6 +++ b/app/assets/javascripts/discourse/helpers/dash-if-empty.js.es6 @@ -1,3 +1,3 @@ -import { htmlHelper } from 'discourse/lib/helpers'; +import { htmlHelper } from 'discourse-common/lib/helpers'; export default htmlHelper(str => Ember.isEmpty(str) ? '—' : str); diff --git a/app/assets/javascripts/discourse/helpers/discouse-tag.js.es6 b/app/assets/javascripts/discourse/helpers/discourse-tag.js.es6 similarity index 74% rename from app/assets/javascripts/discourse/helpers/discouse-tag.js.es6 rename to app/assets/javascripts/discourse/helpers/discourse-tag.js.es6 index 1221da2417e..8c6cbf156e5 100644 --- a/app/assets/javascripts/discourse/helpers/discouse-tag.js.es6 +++ b/app/assets/javascripts/discourse/helpers/discourse-tag.js.es6 @@ -1,4 +1,4 @@ -import { registerUnbound } from 'discourse/lib/helpers'; +import { registerUnbound } from 'discourse-common/lib/helpers'; import renderTag from 'discourse/lib/render-tag'; export default registerUnbound('discourse-tag', function(name, params) { diff --git a/app/assets/javascripts/discourse/helpers/fa-icon-node.js.es6 b/app/assets/javascripts/discourse/helpers/fa-icon-node.js.es6 new file mode 100644 index 00000000000..84f15420258 --- /dev/null +++ b/app/assets/javascripts/discourse/helpers/fa-icon-node.js.es6 @@ -0,0 +1,20 @@ +import { h } from 'virtual-dom'; +import { iconClasses } from 'discourse-common/helpers/fa-icon'; + +export function iconNode(icon, params) { + params = params || {}; + + const properties = { + className: iconClasses(icon, params), + attributes: { "aria-hidden": true } + }; + + if (params.title) { properties.attributes.title = params.title; } + + if (params.label) { + return h('i', properties, h('span.sr-only', I18n.t(params.label))); + } else { + return h('i', properties); + } +} + diff --git a/app/assets/javascripts/discourse/helpers/format-age.js.es6 b/app/assets/javascripts/discourse/helpers/format-age.js.es6 index 69247fb5f53..75119d0c5f2 100644 --- a/app/assets/javascripts/discourse/helpers/format-age.js.es6 +++ b/app/assets/javascripts/discourse/helpers/format-age.js.es6 @@ -1,5 +1,5 @@ import { autoUpdatingRelativeAge } from 'discourse/lib/formatter'; -import { registerUnbound } from 'discourse/lib/helpers'; +import { registerUnbound } from 'discourse-common/lib/helpers'; registerUnbound('format-age', function(dt) { dt = new Date(dt); diff --git a/app/assets/javascripts/discourse/helpers/format-date.js.es6 b/app/assets/javascripts/discourse/helpers/format-date.js.es6 index feb207c2a5f..84602bebc82 100644 --- a/app/assets/javascripts/discourse/helpers/format-date.js.es6 +++ b/app/assets/javascripts/discourse/helpers/format-date.js.es6 @@ -1,4 +1,4 @@ -import { registerUnbound } from 'discourse/lib/helpers'; +import { registerUnbound } from 'discourse-common/lib/helpers'; import { autoUpdatingRelativeAge } from 'discourse/lib/formatter'; /** diff --git a/app/assets/javascripts/discourse/helpers/icon-or-image.js.es6 b/app/assets/javascripts/discourse/helpers/icon-or-image.js.es6 index 5f4c6cbce8b..f673bb8cda3 100644 --- a/app/assets/javascripts/discourse/helpers/icon-or-image.js.es6 +++ b/app/assets/javascripts/discourse/helpers/icon-or-image.js.es6 @@ -1,4 +1,4 @@ -import { htmlHelper } from 'discourse/lib/helpers'; +import { htmlHelper } from 'discourse-common/lib/helpers'; export default htmlHelper(function(str) { if (Ember.isEmpty(str)) { return ""; } diff --git a/app/assets/javascripts/discourse/helpers/inline-date.js.es6 b/app/assets/javascripts/discourse/helpers/inline-date.js.es6 index 874434fd3c9..f483802ee09 100644 --- a/app/assets/javascripts/discourse/helpers/inline-date.js.es6 +++ b/app/assets/javascripts/discourse/helpers/inline-date.js.es6 @@ -1,6 +1,8 @@ import { relativeAge } from 'discourse/lib/formatter'; +import { registerHelper } from 'discourse-common/lib/helpers'; -export default function(dt, params) { - dt = params.data.view.getStream(dt).value(); +registerHelper('inline-date', function([dt]) { + // TODO: Remove this in 1.13 or greater + if (dt.value) { dt = dt.value(); } return relativeAge(new Date(dt)); -} +}); diff --git a/app/assets/javascripts/discourse/helpers/loading-spinner.es6 b/app/assets/javascripts/discourse/helpers/loading-spinner.es6 index 05dfd735bd8..fda8fe6beb1 100644 --- a/app/assets/javascripts/discourse/helpers/loading-spinner.es6 +++ b/app/assets/javascripts/discourse/helpers/loading-spinner.es6 @@ -1,4 +1,4 @@ -import { htmlHelper } from 'discourse/lib/helpers'; +import { htmlHelper } from 'discourse-common/lib/helpers'; function renderSpinner(cssClass) { var html = "maxLength){ - return usernames.slice(0, maxLength).join(", ") + ", +" + (usernames.length - maxLength); - } else { - return usernames.join(", "); - } -}); diff --git a/app/assets/javascripts/discourse/helpers/period-title.js.es6 b/app/assets/javascripts/discourse/helpers/period-title.js.es6 index ee18503b062..37af602c29d 100644 --- a/app/assets/javascripts/discourse/helpers/period-title.js.es6 +++ b/app/assets/javascripts/discourse/helpers/period-title.js.es6 @@ -1,4 +1,4 @@ -import { htmlHelper } from 'discourse/lib/helpers'; +import { htmlHelper } from 'discourse-common/lib/helpers'; const TITLE_SUBS = { all: 'all_time', diff --git a/app/assets/javascripts/discourse/helpers/plugin-outlet.js.es6 b/app/assets/javascripts/discourse/helpers/plugin-outlet.js.es6 deleted file mode 100644 index 3b47ac8cf4c..00000000000 --- a/app/assets/javascripts/discourse/helpers/plugin-outlet.js.es6 +++ /dev/null @@ -1,188 +0,0 @@ -/** - A plugin outlet is an extension point for templates where other templates can - be inserted by plugins. - - ## Usage - - If your handlebars template has: - - ```handlebars - {{plugin-outlet "evil-trout"}} - ``` - - Then any handlebars files you create in the `connectors/evil-trout` directory - will automatically be appended. For example: - - plugins/hello/assets/javascripts/discourse/templates/connectors/evil-trout/hello.hbs - - With the contents: - - ```handlebars - Hello World - ``` - - Will insert Hello World at that point in the template. - - Optionally you can also define a view class for the outlet as: - - plugins/hello/assets/javascripts/discourse/views/connectors/evil-trout/hello.js.es6 - - And it will be wired up automatically. - - ## The block form - - If you use the block form of the outlet, its contents will be displayed - if no connectors are found. Example: - - ```handlebars - {{#plugin-outlet "hello-world"}} - Nobody says hello :'( - {{/plugin-outlet}} - ``` - - ## Disabling - - If a plugin returns a disabled status, the outlets will not be wired up for it. - The list of disabled plugins is returned via the `Site` singleton. - -**/ -import { registerHelper } from 'discourse/lib/helpers'; - -let _connectorCache, _rawCache; - -function findOutlets(collection, callback) { - - const disabledPlugins = Discourse.Site.currentProp('disabled_plugins') || []; - - Object.keys(collection).forEach(function(res) { - if (res.indexOf("/connectors/") !== -1) { - // Skip any disabled plugins - for (let i=0; i1) ? Ember.ContainerView : childViews[0]; - - const newHash = $.extend({}, viewInjections(env.data.view.container)); - if (hash.tagName) { newHash.tagName = hash.tagName; } - - // we don't need the default template since we have a connector - delete options.fn; - delete options.template; - env.helpers.view.helperFunction.call(this, [viewClass], newHash, options, env); - - const cvs = env.data.view._childViews; - if (childViews.length > 1 && cvs && cvs.length) { - const inserted = cvs[cvs.length-1]; - if (inserted) { - childViews.forEach(function(cv) { - inserted.pushObject(cv.create()); - }); - } - } - } else if (options.isBlock) { - const virtualView = Ember.View.extend({ - isVirtual: true, - tagName: hash.tagName || '', - template: options.template - }); - env.helpers.view.helperFunction.call(this, [virtualView], hash, options, env); - } -}); - -// No longer used -export function rewire() { } diff --git a/app/assets/javascripts/discourse/helpers/raw-plugin-outlet.js.es6 b/app/assets/javascripts/discourse/helpers/raw-plugin-outlet.js.es6 new file mode 100644 index 00000000000..aa8657464a9 --- /dev/null +++ b/app/assets/javascripts/discourse/helpers/raw-plugin-outlet.js.es6 @@ -0,0 +1,9 @@ +import { rawConnectorsFor } from 'discourse/lib/plugin-connectors'; + +Handlebars.registerHelper('raw-plugin-outlet', function(args) { + const connectors = rawConnectorsFor(args.hash.name); + if (connectors.length) { + const output = connectors.map(c => c.template({context: this})); + return new Handlebars.SafeString(output.join("")); + } +}); diff --git a/app/assets/javascripts/discourse/helpers/raw.js.es6 b/app/assets/javascripts/discourse/helpers/raw.js.es6 index b7c89470f7b..7f3d8b247b0 100644 --- a/app/assets/javascripts/discourse/helpers/raw.js.es6 +++ b/app/assets/javascripts/discourse/helpers/raw.js.es6 @@ -1,17 +1,29 @@ -import { registerUnbound } from 'discourse/lib/helpers'; +import { registerUnbound } from 'discourse-common/lib/helpers'; +import { findRawTemplate } from 'discourse/lib/raw-templates'; -// see: https://github.com/emberjs/ember.js/issues/12634 -var missingViews = {}; +let _injections; -function renderRaw(ctx, template, templateName, params) { +function renderRaw(ctx, container, template, templateName, params) { + params = jQuery.extend({}, params); params.parent = params.parent || ctx; - if (!params.view && !missingViews[templateName]) { - var viewClass = Discourse.__container__.lookupFactory('view:' + templateName); - if (viewClass) { - params.view = viewClass.create(params); - } else { - missingViews[templateName] = true; + if (!params.view) { + if (!_injections) { + _injections = { + siteSettings: container.lookup('site-settings:main'), + currentUser: container.lookup('currentUser:main'), + site: container.lookup('site:main'), + session: container.lookup('session:main'), + topicTrackingState: container.lookup('topic-tracking-state:main') + }; + } + + const module = `discourse/raw-views/${templateName}`; + if (requirejs.entries[module]) { + const viewClass = require(module, null, null, true); + if (viewClass && viewClass.default) { + params.view = viewClass.default.create(params, _injections); + } } } @@ -19,10 +31,13 @@ function renderRaw(ctx, template, templateName, params) { } registerUnbound('raw', function(templateName, params) { - var template = Discourse.__container__.lookup('template:' + templateName + '.raw'); + templateName = templateName.replace('.', '/'); + + const container = Discourse.__container__; + const template = findRawTemplate(templateName); if (!template) { - Ember.warn('Could not find raw template: ' + templateName); + console.warn('Could not find raw template: ' + templateName); return; } - return renderRaw(this, template, templateName, params); + return renderRaw(this, container, template, templateName, params); }); diff --git a/app/assets/javascripts/discourse/helpers/i18n.js.es6 b/app/assets/javascripts/discourse/helpers/replace-emoji.js.es6 similarity index 54% rename from app/assets/javascripts/discourse/helpers/i18n.js.es6 rename to app/assets/javascripts/discourse/helpers/replace-emoji.js.es6 index 2643d28dd9a..456c733a07a 100644 --- a/app/assets/javascripts/discourse/helpers/i18n.js.es6 +++ b/app/assets/javascripts/discourse/helpers/replace-emoji.js.es6 @@ -1,5 +1,4 @@ -import { registerUnbound } from 'discourse/lib/helpers'; +import { registerUnbound } from 'discourse-common/lib/helpers'; import { emojiUnescape } from 'discourse/lib/text'; -registerUnbound('i18n', (key, params) => I18n.t(key, params)); registerUnbound('replace-emoji', text => new Handlebars.SafeString(emojiUnescape(text))); diff --git a/app/assets/javascripts/discourse/helpers/shorten-url.js.es6 b/app/assets/javascripts/discourse/helpers/shorten-url.js.es6 index 4862b04d78d..61afd3f5f43 100644 --- a/app/assets/javascripts/discourse/helpers/shorten-url.js.es6 +++ b/app/assets/javascripts/discourse/helpers/shorten-url.js.es6 @@ -1,4 +1,4 @@ -import { registerUnbound } from 'discourse/lib/helpers'; +import { registerUnbound } from 'discourse-common/lib/helpers'; registerUnbound('shorten-url', function(url) { var matches = url.match(/\//g); diff --git a/app/assets/javascripts/discourse/helpers/topic-featured-link.js.es6 b/app/assets/javascripts/discourse/helpers/topic-featured-link.js.es6 new file mode 100644 index 00000000000..686599e2b1f --- /dev/null +++ b/app/assets/javascripts/discourse/helpers/topic-featured-link.js.es6 @@ -0,0 +1,6 @@ +import { registerUnbound } from 'discourse-common/lib/helpers'; +import renderTopicFeaturedLink from 'discourse/lib/render-topic-featured-link'; + +export default registerUnbound('topic-featured-link', function(topic, params) { + return new Handlebars.SafeString(renderTopicFeaturedLink(topic, params)); +}); diff --git a/app/assets/javascripts/discourse/helpers/topic-link.js.es6 b/app/assets/javascripts/discourse/helpers/topic-link.js.es6 index ca03e990d0c..2c1d61606f6 100644 --- a/app/assets/javascripts/discourse/helpers/topic-link.js.es6 +++ b/app/assets/javascripts/discourse/helpers/topic-link.js.es6 @@ -1,4 +1,4 @@ -import { registerUnbound } from 'discourse/lib/helpers'; +import { registerUnbound } from 'discourse-common/lib/helpers'; registerUnbound('topic-link', function(topic) { var title = topic.get('fancyTitle'); diff --git a/app/assets/javascripts/discourse/helpers/user-avatar.js.es6 b/app/assets/javascripts/discourse/helpers/user-avatar.js.es6 index 228b90e58cc..75e60da098e 100644 --- a/app/assets/javascripts/discourse/helpers/user-avatar.js.es6 +++ b/app/assets/javascripts/discourse/helpers/user-avatar.js.es6 @@ -1,4 +1,4 @@ -import { registerUnbound } from 'discourse/lib/helpers'; +import { registerUnbound } from 'discourse-common/lib/helpers'; import { avatarImg } from 'discourse/lib/utilities'; function renderAvatar(user, options) { @@ -11,8 +11,8 @@ function renderAvatar(user, options) { if (!username || !avatarTemplate) { return ''; } - let title; - if (!options.ignoreTitle) { + let title = options.title; + if (!title && !options.ignoreTitle) { // first try to get a title title = Em.get(user, 'title'); // if there was no title provided diff --git a/app/assets/javascripts/discourse/helpers/user-status.js.es6 b/app/assets/javascripts/discourse/helpers/user-status.js.es6 index bc8af5f1581..fb1a05efeed 100644 --- a/app/assets/javascripts/discourse/helpers/user-status.js.es6 +++ b/app/assets/javascripts/discourse/helpers/user-status.js.es6 @@ -1,12 +1,15 @@ -import { iconHTML } from 'discourse/helpers/fa-icon'; -import { htmlHelper } from 'discourse/lib/helpers'; +import { iconHTML } from 'discourse-common/helpers/fa-icon'; +import { htmlHelper } from 'discourse-common/lib/helpers'; import { escapeExpression } from 'discourse/lib/utilities'; export default htmlHelper((user, args) => { if (!user) { return; } const name = escapeExpression(user.get('name')); - const currentUser = args.hash.currentUser; + let currentUser; + if (args && args.hash) { + currentUser = args.hash.currentUser; + } if (currentUser && user.get('admin') && currentUser.get('staff')) { return iconHTML('shield', { label: I18n.t('user.admin', { user: name }) }); diff --git a/app/assets/javascripts/discourse/initializers/asset-version.js.es6 b/app/assets/javascripts/discourse/initializers/asset-version.js.es6 index 6f3b3686dfa..602755937c4 100644 --- a/app/assets/javascripts/discourse/initializers/asset-version.js.es6 +++ b/app/assets/javascripts/discourse/initializers/asset-version.js.es6 @@ -12,13 +12,13 @@ export default { Discourse.set("assetVersion", version); if (!timeoutIsSet && Discourse.get("requiresRefresh")) { - // since we can do this transparently for people browsing the forum - // hold back the message a couple of hours + // Since we can do this transparently for people browsing the forum + // hold back the message 24 hours. setTimeout(function () { bootbox.confirm(I18n.lookup("assets_changed_confirm"), function (result) { if (result) { document.location.reload(); } }); - }, 1000 * 60 * 120); + }, 1000 * 60 * 24 * 60); timeoutIsSet = true; } diff --git a/app/assets/javascripts/discourse/initializers/auto-load-modules.js.es6 b/app/assets/javascripts/discourse/initializers/auto-load-modules.js.es6 index b5bf7cc0415..4920eca574c 100644 --- a/app/assets/javascripts/discourse/initializers/auto-load-modules.js.es6 +++ b/app/assets/javascripts/discourse/initializers/auto-load-modules.js.es6 @@ -1,4 +1,6 @@ -export function autoLoadModules() { +import { registerHelpers } from 'discourse-common/lib/helpers'; + +export function autoLoadModules(container, registry) { Object.keys(requirejs.entries).forEach(entry => { if ((/\/helpers\//).test(entry)) { require(entry, null, null, true); @@ -7,6 +9,7 @@ export function autoLoadModules() { require(entry, null, null, true); } }); + registerHelpers(registry); } export default { diff --git a/app/assets/javascripts/discourse/initializers/live-development.js.es6 b/app/assets/javascripts/discourse/initializers/live-development.js.es6 index a3c8afa51a3..f73172e154e 100644 --- a/app/assets/javascripts/discourse/initializers/live-development.js.es6 +++ b/app/assets/javascripts/discourse/initializers/live-development.js.es6 @@ -1,4 +1,3 @@ -import loadScript from 'discourse/lib/load-script'; import DiscourseURL from 'discourse/lib/url'; // Use the message bus for live reloading of components for faster development. @@ -47,24 +46,6 @@ export default { if (me === "refresh") { // Refresh if necessary document.location.reload(true); - } else if (me.name.substr(-10) === "hbs") { - - // Reload handlebars - const js = me.name.replace(".hbs", "").replace("app/assets/javascripts", "/assets"); - loadScript(js + "?hash=" + me.hash).then(function() { - const templateName = js.replace(".js", "").replace("/assets/", ""); - return _.each(Ember.View.views, function(view) { - if (view.get('templateName') === templateName) { - view.set('templateName', 'empty'); - view.rerender(); - Em.run.schedule('afterRender', function() { - view.set('templateName', templateName); - view.rerender(); - }); - } - }); - }); - } else { $('link').each(function() { // TODO: stop bundling css in DEV please diff --git a/app/assets/javascripts/discourse/initializers/mobile.js.es6 b/app/assets/javascripts/discourse/initializers/mobile.js.es6 index 2ac54497b2c..8c057a425fc 100644 --- a/app/assets/javascripts/discourse/initializers/mobile.js.es6 +++ b/app/assets/javascripts/discourse/initializers/mobile.js.es6 @@ -1,18 +1,18 @@ import Mobile from 'discourse/lib/mobile'; +import { setResolverOption } from 'discourse-common/resolver'; // Initializes the `Mobile` helper object. export default { name: 'mobile', after: 'inject-objects', - initialize(container, app) { + initialize(container) { Mobile.init(); const site = container.lookup('site:main'); site.set('mobileView', Mobile.mobileView); site.set('isMobileDevice', Mobile.isMobileDevice); - // This is a bit weird but you can't seem to inject into the resolver? - app.registry.resolver.__resolver__.mobileView = Mobile.mobileView; + setResolverOption('mobileView', Mobile.mobileView); } }; diff --git a/app/assets/javascripts/discourse/initializers/page-tracking.js.es6 b/app/assets/javascripts/discourse/initializers/page-tracking.js.es6 index 860ddaf0f80..cf978f43006 100644 --- a/app/assets/javascripts/discourse/initializers/page-tracking.js.es6 +++ b/app/assets/javascripts/discourse/initializers/page-tracking.js.es6 @@ -1,4 +1,4 @@ -import { cleanDOM } from 'discourse/routes/discourse'; +import { cleanDOM } from 'discourse/lib/clean-dom'; import { startPageTracking, onPageChange } from 'discourse/lib/page-tracker'; import { viewTrackingRequired } from 'discourse/lib/ajax'; @@ -7,30 +7,10 @@ export default { initialize(container) { - const cache = {}; - var transitionCount = 0; - // Tell our AJAX system to track a page transition const router = container.lookup('router:main'); router.on('willTransition', viewTrackingRequired); - - router.on('didTransition', function() { - Em.run.scheduleOnce('afterRender', Ember.Route, cleanDOM); - transitionCount++; - _.each(cache, (v,k) => { - if (v && v.target && v.target < transitionCount) { - delete cache[k]; - } - }); - }); - - router.transientCache = function(key, data, count) { - if (data === undefined) { - return cache[key]; - } else { - return cache[key] = {data, target: transitionCount + count}; - } - }; + router.on('didTransition', cleanDOM); startPageTracking(router); diff --git a/app/assets/javascripts/discourse/initializers/post-decorations.js.es6 b/app/assets/javascripts/discourse/initializers/post-decorations.js.es6 index df6e8d8bc27..d17b2087acd 100644 --- a/app/assets/javascripts/discourse/initializers/post-decorations.js.es6 +++ b/app/assets/javascripts/discourse/initializers/post-decorations.js.es6 @@ -8,6 +8,18 @@ export default { withPluginApi('0.1', api => { api.decorateCooked(highlightSyntax); api.decorateCooked(lightbox); + + api.decorateCooked($elem => { + const players = $('audio', $elem); + if (players.length) { + players.on('play', () => { + const postId = parseInt($elem.closest('article').data('post-id')); + if (postId) { + api.preventCloak(postId); + } + }); + } + }); }); } }; diff --git a/app/assets/javascripts/discourse/initializers/subscribe-user-notifications.js.es6 b/app/assets/javascripts/discourse/initializers/subscribe-user-notifications.js.es6 index 1d8260f4015..8061b579b91 100644 --- a/app/assets/javascripts/discourse/initializers/subscribe-user-notifications.js.es6 +++ b/app/assets/javascripts/discourse/initializers/subscribe-user-notifications.js.es6 @@ -8,6 +8,7 @@ import { export default { name: 'subscribe-user-notifications', after: 'message-bus', + initialize(container) { const user = container.lookup('current-user:main'), site = container.lookup('site:main'), @@ -22,12 +23,11 @@ export default { keyValueStore.remove('recent-notifications'); if (user) { - if (user.get('staff')) { - bus.subscribe('/flagged_counts', (data) => { + bus.subscribe('/flagged_counts', data => { user.set('site_flagged_posts_count', data.total); }); - bus.subscribe('/queue_counts', (data) => { + bus.subscribe('/queue_counts', data => { user.set('post_queue_new_count', data.post_queue_new_count); if (data.post_queue_new_count > 0) { user.set('show_queued_posts', 1); @@ -35,12 +35,13 @@ export default { }); } - bus.subscribe(`/notification/${user.get('id')}`, function(data) { + bus.subscribe(`/notification/${user.get('id')}`, data => { const oldUnread = user.get('unread_notifications'); const oldPM = user.get('unread_private_messages'); user.set('unread_notifications', data.unread_notifications); user.set('unread_private_messages', data.unread_private_messages); + user.set('read_first_notification', data.read_first_notification); if (oldUnread !== data.unread_notifications || oldPM !== data.unread_private_messages) { appEvents.trigger('notifications:changed'); @@ -50,27 +51,23 @@ export default { const lastNotification = data.last_notification && data.last_notification.notification; if (stale && stale.hasResults && lastNotification) { - const oldNotifications = stale.results.get('content'); const staleIndex = _.findIndex(oldNotifications, {id: lastNotification.id}); if (staleIndex === -1) { // this gets a bit tricky, uread pms are bumped to front - var insertPosition = 0; + let insertPosition = 0; if (lastNotification.notification_type !== 6) { - insertPosition = _.findIndex(oldNotifications, function(n){ - return n.notification_type !== 6 || n.read; - }); + insertPosition = _.findIndex(oldNotifications, n => n.notification_type !== 6 || n.read); insertPosition = insertPosition === -1 ? oldNotifications.length - 1 : insertPosition; } - oldNotifications.insertAt(insertPosition, Em.Object.create(lastNotification)); } - for (var idx=0; idx < data.recent.length; idx++) { - var old; + for (let idx=0; idx < data.recent.length; idx++) { + let old; while(old = oldNotifications[idx]) { - var info = data.recent[idx]; + const info = data.recent[idx]; if (old.get('id') !== info[0]) { oldNotifications.removeAt(idx); @@ -81,24 +78,18 @@ export default { break; } } - if ( !old ) { break; } + if (!old) { break; } } } }, user.notification_channel_position); - bus.subscribe("/categories", function(data) { - _.each(data.categories, function(c) { - site.updateCategory(c); - }); - _.each(data.deleted_categories,function(id) { - site.removeCategory(id); - }); + bus.subscribe("/categories", data => { + _.each(data.categories, c => site.updateCategory(c)); + _.each(data.deleted_categories, id => site.removeCategory(id)); }); - bus.subscribe("/client_settings", function(data) { - siteSettings[data.name] = data.value; - }); + bus.subscribe("/client_settings", data => Ember.set(siteSettings, data.name, data.value)); if (!Ember.testing) { if (!site.mobileView) { diff --git a/app/assets/javascripts/discourse/lib/autocomplete.js.es6 b/app/assets/javascripts/discourse/lib/autocomplete.js.es6 index 10bc508b129..5e1d404bc9d 100644 --- a/app/assets/javascripts/discourse/lib/autocomplete.js.es6 +++ b/app/assets/javascripts/discourse/lib/autocomplete.js.es6 @@ -42,7 +42,7 @@ export default function(options) { if (this.length === 0) return; - if (options === 'destroy') { + if (options === 'destroy' || options.updateData) { Ember.run.cancel(inputTimeout); $(this).off('keyup.autocomplete') @@ -50,7 +50,10 @@ export default function(options) { .off('paste.autocomplete') .off('click.autocomplete'); - return; + $(window).off('click.autocomplete'); + + if (options === 'destroy') + return; } if (options && options.cancel && this.data("closeAutocomplete")) { @@ -162,28 +165,46 @@ export default function(options) { if (isInput) { const width = this.width(); - wrap = this.wrap("").parent(); - wrap.width(width); + + if (options.updateData) { + wrap = this.parent(); + wrap.find('.item').remove(); + me.show(); + } else { + wrap = this.wrap("").parent(); + wrap.width(width); + } + if(options.single) { this.css("width","100%"); } else { this.width(150); } - this.attr('name', this.attr('name') + "-renamed"); + + this.attr('name', (options.updateData) ? this.attr('name') : this.attr('name') + "-renamed"); + var vals = this.val().split(","); _.each(vals,function(x) { if (x !== "") { if (options.reverseTransform) { x = options.reverseTransform(x); } + if(options.single){ + me.hide(); + } addInputSelectedItem(x); } }); + if(options.items) { _.each(options.items, function(item){ + if(options.single){ + me.hide(); + } addInputSelectedItem(item); }); } + this.val(""); completeStart = 0; wrap.click(function() { @@ -237,15 +258,19 @@ export default function(options) { me.parent().append(div); - if(!isInput){ + if (!isInput) { vOffset = div.height(); - } - if (Discourse.Site.currentProp('mobileView') && !isInput) { - div.css('width', 'auto'); + if ((window.innerHeight - me.outerHeight() - $("header.d-header").innerHeight()) < vOffset) { + vOffset = -23; + } - if ((me.height() / 2) >= pos.top) { vOffset = -23; } - if ((me.width() / 2) <= pos.left) { hOffset = -div.width(); } + if (Discourse.Site.currentProp('mobileView')) { + div.css('width', 'auto'); + + if ((me.height() / 2) >= pos.top) { vOffset = -23; } + if ((me.width() / 2) <= pos.left) { hOffset = -div.width(); } + } } var mePos = me.position(); @@ -308,6 +333,7 @@ export default function(options) { closeAutocomplete(); }); + $(window).on('click.autocomplete', () => closeAutocomplete()); $(this).on('click.autocomplete', () => closeAutocomplete()); $(this).on('paste.autocomplete', function() { diff --git a/app/assets/javascripts/discourse/lib/clean-dom.js.es6 b/app/assets/javascripts/discourse/lib/clean-dom.js.es6 new file mode 100644 index 00000000000..8f86e6a6fd7 --- /dev/null +++ b/app/assets/javascripts/discourse/lib/clean-dom.js.es6 @@ -0,0 +1,32 @@ +function _clean() { + if (window.MiniProfiler) { + window.MiniProfiler.pageTransition(); + } + + // Close some elements that may be open + $('header ul.icons li').removeClass('active'); + $('[data-toggle="dropdown"]').parent().removeClass('open'); + // close the lightbox + if ($.magnificPopup && $.magnificPopup.instance) { + $.magnificPopup.instance.close(); + $('body').removeClass('mfp-zoom-out-cur'); + } + + // Remove any link focus + // NOTE: the '.not("body")' is here to prevent a bug in IE10 on Win7 + // cf. https://stackoverflow.com/questions/5657371 + $(document.activeElement).not("body").not(".no-blur").blur(); + + Discourse.set('notifyCount',0); + Discourse.__container__.lookup('route:application').send('closeModal'); + const hideDropDownFunction = $('html').data('hide-dropdown'); + if (hideDropDownFunction) { hideDropDownFunction(); } + + // TODO: Avoid container lookup here + const appEvents = Discourse.__container__.lookup('app-events:main'); + appEvents.trigger('dom:clean'); +} + +export function cleanDOM() { + Ember.run.scheduleOnce('afterRender', _clean); +} diff --git a/app/assets/javascripts/discourse/lib/computed.js.es6 b/app/assets/javascripts/discourse/lib/computed.js.es6 index 1fb7e745cb5..02d38869fe2 100644 --- a/app/assets/javascripts/discourse/lib/computed.js.es6 +++ b/app/assets/javascripts/discourse/lib/computed.js.es6 @@ -1,3 +1,4 @@ +import addonFmt from 'ember-addons/fmt'; /** Returns whether two properties are equal to each other. @@ -46,14 +47,10 @@ export function propertyLessThan(p1, p2) { @params {String} format the i18n format string @return {Function} computedProperty function **/ -export function i18n() { - const args = Array.prototype.slice.call(arguments, 0); +export function i18n(...args) { const format = args.pop(); - const computed = Em.computed(function() { - const self = this; - return I18n.t(format.fmt.apply(format, args.map(function (a) { - return self.get(a); - }))); + const computed = Ember.computed(function() { + return I18n.t(addonFmt(format, ...args.map(a => this.get(a)))); }); return computed.property.apply(computed, args); } @@ -67,14 +64,10 @@ export function i18n() { @params {String} format the format string @return {Function} computedProperty function **/ -export function fmt() { - const args = Array.prototype.slice.call(arguments, 0); +export function fmt(...args) { const format = args.pop(); - const computed = Em.computed(function() { - const self = this; - return format.fmt.apply(format, args.map(function (a) { - return self.get(a); - })); + const computed = Ember.computed(function() { + return addonFmt(format, ...args.map(a => this.get(a))); }); return computed.property.apply(computed, args); } @@ -88,14 +81,10 @@ export function fmt() { @params {String} format the format string for the URL @return {Function} computedProperty function returning a URL **/ -export function url() { - const args = Array.prototype.slice.call(arguments, 0); +export function url(...args) { const format = args.pop(); - const computed = Em.computed(function() { - const self = this; - return Discourse.getURL(format.fmt.apply(format, args.map(function (a) { - return self.get(a); - }))); + const computed = Ember.computed(function() { + return Discourse.getURL(addonFmt(format, ...args.map(a => this.get(a)))); }); return computed.property.apply(computed, args); } diff --git a/app/assets/javascripts/discourse/lib/emoji/groups.js.es6 b/app/assets/javascripts/discourse/lib/emoji/groups.js.es6 index 0ebc6c500a7..7b8d9bbedf6 100644 --- a/app/assets/javascripts/discourse/lib/emoji/groups.js.es6 +++ b/app/assets/javascripts/discourse/lib/emoji/groups.js.es6 @@ -171,7 +171,25 @@ const groups = [ "vulcan", "wind_blowing_face", "writing_hand", - "zipper_mouth" + "zipper_mouth", + "female_couple_with_heart", + "male_couple_with_heart", + "female_couplekiss", + "male_couplekiss", + "family_man_woman_girl", + "family_man_woman_girl_boy", + "family_man_woman_boys", + "family_man_woman_girls", + "family_women_boy", + "family_women_girl", + "family_women_girl_boy", + "family_women_boys", + "family_women_girls", + "family_men_boy", + "family_men_girl", + "family_men_girl_boy", + "family_men_boys", + "family_men_girls" ] }, { @@ -913,6 +931,7 @@ const groups = [ "eight", "nine", "keycap_ten", + "keycap_star", "1234", "hash", "abc", @@ -1102,6 +1121,7 @@ const groups = [ "wastebasket", "wheel_of_dharma", "yin_yang", + "left_speech_bubble" ] } ]; diff --git a/app/assets/javascripts/discourse/lib/emoji/toolbar.js.es6 b/app/assets/javascripts/discourse/lib/emoji/toolbar.js.es6 index fff8079cf36..3666df1b580 100644 --- a/app/assets/javascripts/discourse/lib/emoji/toolbar.js.es6 +++ b/app/assets/javascripts/discourse/lib/emoji/toolbar.js.es6 @@ -2,6 +2,7 @@ import groups from 'discourse/lib/emoji/groups'; import KeyValueStore from "discourse/lib/key-value-store"; import { emojiList } from 'pretty-text/emoji'; import { emojiUrlFor } from 'discourse/lib/text'; +import { findRawTemplate } from 'discourse/lib/raw-templates'; const keyValueStore = new KeyValueStore("discourse_emojis_"); const EMOJI_USAGE = "emojiUsage"; @@ -68,7 +69,7 @@ function initializeRecentlyUsedIcons() { recent.forEach(emoji => recentlyUsedIcons.push(emoji.title)); - const recentGroup = groups.findProperty('name', 'recent'); + const recentGroup = groups.findBy('name', 'recent'); if (recentGroup) { recentGroup.icons = recentlyUsedIcons; } else { @@ -151,7 +152,7 @@ function render(page, offset, options) { }; $('.emoji-modal', options.appendTo).remove(); - const template = options.container.lookup('template:emoji-toolbar.raw'); + const template = findRawTemplate('emoji-toolbar'); options.appendTo.append(template(model)); bindEvents(page, offset, options); diff --git a/app/assets/javascripts/discourse/lib/export-csv.js.es6 b/app/assets/javascripts/discourse/lib/export-csv.js.es6 index 691f059efee..dc6e66b3a9a 100644 --- a/app/assets/javascripts/discourse/lib/export-csv.js.es6 +++ b/app/assets/javascripts/discourse/lib/export-csv.js.es6 @@ -8,9 +8,9 @@ function exportEntityByType(type, entity, args) { export function exportUserArchive() { return exportEntityByType('user', 'user_archive').then(function() { - bootbox.alert(I18n.t("admin.export_csv.success")); + bootbox.alert(I18n.t("user.download_archive.success")); }).catch(function() { - bootbox.alert(I18n.t("admin.export_csv.rate_limit_error")); + bootbox.alert(I18n.t("user.download_archive.rate_limit_error")); }); } diff --git a/app/assets/javascripts/discourse/lib/formatter.js.es6 b/app/assets/javascripts/discourse/lib/formatter.js.es6 index 4ef0e9fe352..b478ddfa438 100644 --- a/app/assets/javascripts/discourse/lib/formatter.js.es6 +++ b/app/assets/javascripts/discourse/lib/formatter.js.es6 @@ -74,7 +74,7 @@ export function toTitleCase(str) { export function longDate(dt) { if (!dt) return; - return moment(dt).longDate(); + return moment(dt).format(I18n.t("dates.long_with_year")); } // suppress year, if current year @@ -132,7 +132,8 @@ function wrapAgo(dateStr) { function relativeAgeTiny(date, ageOpts) { const format = "tiny"; const distance = Math.round((new Date() - date) / 1000); - const distanceInMinutes = Math.round(distance / 60.0); + const dividedDistance = Math.round(distance / 60.0); + const distanceInMinutes = (dividedDistance < 1) ? 1 : dividedDistance; let formatted; const t = function(key, opts) { @@ -140,11 +141,9 @@ function relativeAgeTiny(date, ageOpts) { return (ageOpts && ageOpts.addAgo) ? wrapAgo(result) : result; }; + switch(true) { - case(distanceInMinutes < 1): - formatted = t("less_than_x_minutes", {count: 1}); - break; - case(distanceInMinutes >= 1 && distanceInMinutes <= 44): + case(distanceInMinutes >= 0 && distanceInMinutes <= 44): formatted = t("x_minutes", {count: distanceInMinutes}); break; case(distanceInMinutes >= 45 && distanceInMinutes <= 89): @@ -266,3 +265,20 @@ export function number(val) { } return val.toString(); } + +export function ensureJSON(json) { + return typeof json === 'string' ? JSON.parse(json) : json; +} + +export function plainJSON(val) { + let json = ensureJSON(val); + let headers = ''; + Object.keys(json).forEach(k => { + headers += `${k}: ${json[k]}\n`; + }); + return headers; +} + +export function prettyJSON(json) { + return JSON.stringify(ensureJSON(json), null, 2); +} diff --git a/app/assets/javascripts/discourse/lib/intercept-click.js.es6 b/app/assets/javascripts/discourse/lib/intercept-click.js.es6 index 09367beca23..758164e784d 100644 --- a/app/assets/javascripts/discourse/lib/intercept-click.js.es6 +++ b/app/assets/javascripts/discourse/lib/intercept-click.js.es6 @@ -21,13 +21,14 @@ export default function interceptClick(e) { $currentTarget.data('ember-action') || $currentTarget.data('auto-route') || $currentTarget.data('share-url') || - $currentTarget.data('user-card') || $currentTarget.hasClass('widget-link') || $currentTarget.hasClass('mention') || - (!$currentTarget.hasClass('d-link') && $currentTarget.hasClass('ember-view')) || + (!$currentTarget.hasClass('d-link') && + !$currentTarget.data('user-card') && + $currentTarget.hasClass('ember-view')) || $currentTarget.hasClass('lightbox') || href.indexOf("mailto:") === 0 || - (href.match(/^http[s]?:\/\//i) && !href.match(new RegExp("^http:\\/\\/" + window.location.hostname, "i")))) { + (href.match(/^http[s]?:\/\//i) && !href.match(new RegExp("^https?:\\/\\/" + window.location.hostname, "i")))) { return; } diff --git a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 index 70af9c9526c..d393127a732 100644 --- a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 +++ b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 @@ -4,7 +4,7 @@ import { scrollTopFor } from 'discourse/lib/offset-calculator'; const bindings = { '!': {postAction: 'showFlags'}, - '#': {handler: 'toggleProgress', anonymous: true}, + '#': {handler: 'goToPost', anonymous: true}, '/': {handler: 'toggleSearch', anonymous: true}, '=': {handler: 'toggleHamburgerMenu', anonymous: true}, '?': {handler: 'showHelpModal', anonymous: true}, @@ -13,6 +13,8 @@ const bindings = { 'c': {handler: 'createTopic'}, 'ctrl+f': {handler: 'showPageSearch', anonymous: true}, 'command+f': {handler: 'showPageSearch', anonymous: true}, + 'ctrl+p': {handler: 'printTopic', anonymous: true}, + 'command+p': {handler: 'printTopic', anonymous: true}, 'd': {postAction: 'deletePost'}, 'e': {postAction: 'editPost'}, 'end': {handler: 'goToLastPost', anonymous: true}, @@ -151,6 +153,15 @@ export default { }); }, + printTopic(event) { + Ember.run(() => { + if ($('.container.posts').length) { + event.preventDefault(); // We need to stop printing the current page in Firefox + this.container.lookup('controller:topic').print(); + } + }); + }, + createTopic() { this.container.lookup('controller:composer').open({action: Composer.CREATE_TOPIC, draftKey: Composer.CREATE_TOPIC}); }, @@ -159,8 +170,8 @@ export default { this.container.lookup('controller:topic').togglePinnedState(); }, - toggleProgress() { - this.appEvents.trigger('topic-progress:keyboard-trigger', { type: 'jump' }); + goToPost() { + this.appEvents.trigger('topic:keyboard-trigger', { type: 'jump' }); }, toggleSearch(event) { @@ -198,8 +209,11 @@ export default { sendToTopicListItemView(action) { const elem = $('tr.selected.topic-list-item.ember-view')[0]; if (elem) { - const view = Ember.View.views[elem.id]; - view.send(action); + const registry = this.container.lookup('-view-registry:main'); + if (registry) { + const view = registry[elem.id]; + view.send(action); + } } }, @@ -277,7 +291,9 @@ export default { return; } - const $selected = $articles.filter('.selected'); + const $selected = ($articles.filter('.selected').length !== 0) + ? $articles.filter('.selected') + : $articles.filter('[data-islastviewedtopic=true]'); let index = $articles.index($selected); if ($selected.length !== 0) { //boundries check diff --git a/app/assets/javascripts/discourse/lib/link-mentions.js.es6 b/app/assets/javascripts/discourse/lib/link-mentions.js.es6 index 149b151617b..20876bd72e6 100644 --- a/app/assets/javascripts/discourse/lib/link-mentions.js.es6 +++ b/app/assets/javascripts/discourse/lib/link-mentions.js.es6 @@ -1,37 +1,40 @@ import { ajax } from 'discourse/lib/ajax'; + function replaceSpan($e, username, opts) { + let extra = ""; + let extraClass = ""; + if (opts && opts.group) { - var extra = "", extraClass = ""; if (opts.mentionable) { - extra = " data-name='" + username + "' data-mentionable-user-count='" + opts.mentionable.user_count + "' "; - extraClass = " notify"; + extra = `data-name='${username}' data-mentionable-user-count='${opts.mentionable.user_count}'`; + extraClass = "notify"; } - $e.replaceWith("@" + username + ""); + $e.replaceWith(`@${username}`); } else { - $e.replaceWith("@" + username + ""); + if (opts && opts.cannot_see) { + extra = `data-name='${username}'`; + extraClass = "cannot-see"; + } + $e.replaceWith(`@${username}`); } } -const found = []; -const foundGroups = []; -const mentionableGroups = []; -const checked = []; +const found = {}; +const foundGroups = {}; +const mentionableGroups = {}; +const checked = {}; +const cannotSee = []; function updateFound($mentions, usernames) { Ember.run.scheduleOnce('afterRender', function() { $mentions.each((i, e) => { const $e = $(e); const username = usernames[i]; - if (found.indexOf(username.toLowerCase()) !== -1) { - replaceSpan($e, username); - } else if (foundGroups.indexOf(username) !== -1) { - const mentionable = _(mentionableGroups).where({name: username}).first(); - replaceSpan($e, username, {group: true, mentionable: mentionable}); - } else if (checked.indexOf(username) !== -1) { + if (found[username.toLowerCase()]) { + replaceSpan($e, username, { cannot_see: cannotSee[username] }); + } else if (foundGroups[username]) { + replaceSpan($e, username, { group: true, mentionable: mentionableGroups[username] }); + } else if (checked[username]) { $e.addClass('mention-tested'); } }); @@ -42,22 +45,21 @@ export function linkSeenMentions($elem, siteSettings) { const $mentions = $('span.mention:not(.mention-tested)', $elem); if ($mentions.length) { const usernames = $mentions.map((_, e) => $(e).text().substr(1)); - const unseen = _.uniq(usernames).filter((u) => { - return u.length >= siteSettings.min_username_length && checked.indexOf(u) === -1; - }); updateFound($mentions, usernames); - return unseen; + return _.uniq(usernames).filter(u => !checked[u] && u.length >= siteSettings.min_username_length); } - return []; } -export function fetchUnseenMentions($elem, usernames) { - return ajax("/users/is_local_username", { data: { usernames } }).then(function(r) { - found.push.apply(found, r.valid); - foundGroups.push.apply(foundGroups, r.valid_groups); - mentionableGroups.push.apply(mentionableGroups, r.mentionable_groups); - checked.push.apply(checked, usernames); +// 'Create a New Topic' scenario is not supported (per conversation with codinghorror) +// https://meta.discourse.org/t/taking-another-1-7-release-task/51986/7 +export function fetchUnseenMentions(usernames, topic_id) { + return ajax("/users/is_local_username", { data: { usernames, topic_id } }).then(r => { + r.valid.forEach(v => found[v] = true); + r.valid_groups.forEach(vg => foundGroups[vg] = true); + r.mentionable_groups.forEach(mg => mentionableGroups[mg.name] = mg); + r.cannot_see.forEach(cs => cannotSee[cs] = true); + usernames.forEach(u => checked[u] = true); return r; }); } diff --git a/app/assets/javascripts/discourse/lib/load-script.js.es6 b/app/assets/javascripts/discourse/lib/load-script.js.es6 index 4edc9a452ac..cc24df86de8 100644 --- a/app/assets/javascripts/discourse/lib/load-script.js.es6 +++ b/app/assets/javascripts/discourse/lib/load-script.js.es6 @@ -5,13 +5,16 @@ const _loading = {}; function loadWithTag(path, cb) { const head = document.getElementsByTagName('head')[0]; + let finished = false; let s = document.createElement('script'); s.src = path; - if (Ember.Test) { Ember.Test.pendingAjaxRequests++; } + if (Ember.Test) { + Ember.Test.registerWaiter(() => finished); + } head.appendChild(s); s.onload = s.onreadystatechange = function(_, abort) { - if (Ember.Test) { Ember.Test.pendingAjaxRequests--; } + finished = true; if (abort || !s.readyState || s.readyState === "loaded" || s.readyState === "complete") { s = s.onload = s.onreadystatechange = null; if (!abort) { diff --git a/app/assets/javascripts/discourse/lib/mobile.js.es6 b/app/assets/javascripts/discourse/lib/mobile.js.es6 index ef2d07bbfd8..2ceb13ba51b 100644 --- a/app/assets/javascripts/discourse/lib/mobile.js.es6 +++ b/app/assets/javascripts/discourse/lib/mobile.js.es6 @@ -1,3 +1,5 @@ +import deprecated from 'discourse-common/lib/deprecated'; + let mobileForced = false; // An object that is responsible for logic related to mobile devices. @@ -29,6 +31,18 @@ const Mobile = { // localStorage may be disabled, just skip this // you get security errors if it is disabled } + + // Sam: I tried this to disable zooming on iOS 10 but it is not consistent + // you can still sometimes trigger zoom and be stuck in a horrible state + // + // let iOS = !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform); + // if (iOS) { + // document.documentElement.addEventListener('touchstart', function (event) { + // if (event.touches.length > 1) { + // event.preventDefault(); + // } + // }, false); + // } }, toggleMobileView() { @@ -55,10 +69,9 @@ export function resetMobile() { mobileForced = false; } -// Backwards compatibiltity, deprecated Object.defineProperty(Discourse, 'Mobile', { - get: function() { - Ember.warn("DEPRECATION: `Discourse.Mobile` is deprecated, use `this.site.mobileView` instead"); + get() { + deprecated("`Discourse.Mobile` is deprecated, use `this.site.mobileView` instead"); return Mobile; } }); diff --git a/app/assets/javascripts/discourse/lib/page-tracker.js.es6 b/app/assets/javascripts/discourse/lib/page-tracker.js.es6 index 7e63b5c7311..ddef4792680 100644 --- a/app/assets/javascripts/discourse/lib/page-tracker.js.es6 +++ b/app/assets/javascripts/discourse/lib/page-tracker.js.es6 @@ -1,7 +1,21 @@ +import deprecated from 'discourse-common/lib/deprecated'; + const PageTracker = Ember.Object.extend(Ember.Evented); let _pageTracker = PageTracker.create(); let _started = false; + +const cache = {}; +let transitionCount = 0; + +export function setTransient(key, data, count) { + cache[key] = {data, target: transitionCount + count}; +} + +export function getTransient(key) { + return cache[key]; +} + export function startPageTracking(router) { if (_started) { return; } @@ -11,8 +25,13 @@ export function startPageTracking(router) { // Refreshing the title is debounced, so we need to trigger this in the // next runloop to have the correct title. - Em.run.next(() => { - _pageTracker.trigger('change', url, Discourse.get('_docTitle')); + Em.run.next(() => _pageTracker.trigger('change', url, Discourse.get('_docTitle'))); + + transitionCount++; + _.each(cache, (v,k) => { + if (v && v.target && v.target < transitionCount) { + delete cache[k]; + } }); }); _started = true; @@ -25,7 +44,7 @@ export function onPageChange(fn) { // backwards compatibility const BackwardsCompat = { current() { - console.warn(`Using PageTracker.current() is deprecated. Your plugin should use the PluginAPI`); + deprecated(`Using PageTracker.current() is deprecated. Your plugin should use the PluginAPI`); return _pageTracker; } }; diff --git a/app/assets/javascripts/discourse/lib/plugin-api.js.es6 b/app/assets/javascripts/discourse/lib/plugin-api.js.es6 index 9aedcec64cb..b8beb0020d9 100644 --- a/app/assets/javascripts/discourse/lib/plugin-api.js.es6 +++ b/app/assets/javascripts/discourse/lib/plugin-api.js.es6 @@ -1,4 +1,4 @@ -import { iconNode } from 'discourse/helpers/fa-icon'; +import { iconNode } from 'discourse/helpers/fa-icon-node'; import { addDecorator } from 'discourse/widgets/post-cooked'; import ComposerEditor from 'discourse/components/composer-editor'; import { addButton } from 'discourse/widgets/post-menu'; @@ -11,7 +11,7 @@ import { preventCloak } from 'discourse/widgets/post-stream'; import { h } from 'virtual-dom'; import { addFlagProperty } from 'discourse/components/site-header'; import { addPopupMenuOptionsCallback } from 'discourse/controllers/composer'; -import { emojiUrlFor } from 'discourse/lib/text'; +import { extraConnectorClass } from 'discourse/lib/plugin-connectors'; class PluginApi { constructor(version, container) { @@ -93,12 +93,11 @@ class PluginApi { if (result.icon) { iconBody = iconNode(result.icon); } else if (result.emoji) { - iconBody = result.emoji.split('|').map(emoji => { - const src = emojiUrlFor(emoji); - return dec.h('img', { className: 'emoji', attributes: { src } }); + iconBody = result.emoji.split('|').map(name => { + let widgetAttrs = { name }; + if (result.emojiTitle) widgetAttrs.title = true; + return dec.attach('emoji', widgetAttrs); }); - - iconBody = result.emoji.split('|').map(name => dec.attach('emoji', { name })); } if (result.text) { @@ -332,15 +331,41 @@ class PluginApi { addStorePluralization(thing, plural) { this.container.lookup("store:main").addPluralization(thing, plural); } + + /** + * Register a Connector class for a particular outlet and connector. + * + * For example, if the outlet is `user-profile-primary` and your connector + * template is called `my-connector.hbs`: + * + * ```javascript + * api.registerConnectorClass('user-profile-primary', 'my-connector', { + * shouldRender(args, component) { + * return component.siteSettings.my_plugin_enabled; + * } + * }); + * ``` + * + * For more information on connector classes, see: + * https://meta.discourse.org/t/important-changes-to-plugin-outlets-for-ember-2-10/54136 + **/ + registerConnectorClass(outletName, connectorName, klass) { + extraConnectorClass(`${outletName}/${connectorName}`, klass); + } } let _pluginv01; function getPluginApi(version) { version = parseFloat(version); - if (version <= 0.5) { + if (version <= 0.6) { if (!_pluginv01) { _pluginv01 = new PluginApi(version, Discourse.__container__); } + + // We are recycling the compatible object, but let's update to the higher version + if (_pluginv01.version < version) { + _pluginv01.version = version; + } return _pluginv01; } else { console.warn(`Plugin API v${version} is not supported`); @@ -370,6 +395,10 @@ function decorate(klass, evt, cb) { klass.reopen(mixin); } +export function resetPluginApi() { + _pluginv01 = null; +} + export function decorateCooked() { console.warn('`decorateCooked` has been removed. Use `getPluginApi(version).decorateCooked` instead'); } diff --git a/app/assets/javascripts/discourse/lib/plugin-connectors.js.es6 b/app/assets/javascripts/discourse/lib/plugin-connectors.js.es6 new file mode 100644 index 00000000000..61cdbab2554 --- /dev/null +++ b/app/assets/javascripts/discourse/lib/plugin-connectors.js.es6 @@ -0,0 +1,98 @@ +let _connectorCache; +let _rawConnectorCache; +let _extraConnectorClasses = {}; +let _classPaths; + +export function resetExtraClasses() { + _extraConnectorClasses = {}; + _classPaths = undefined; +} + +// Note: In plugins, define a class by path and it will be wired up automatically +// eg: discourse/connectors/ / .js.es6 +export function extraConnectorClass(name, obj) { + _extraConnectorClasses[name] = obj; +} + +const DefaultConnectorClass = { + actions: {}, + shouldRender: () => true, + setupComponent() { } +}; + +function findOutlets(collection, callback) { + const disabledPlugins = Discourse.Site.currentProp('disabled_plugins') || []; + + Object.keys(collection).forEach(function(res) { + if (res.indexOf("/connectors/") !== -1) { + // Skip any disabled plugins + for (let i=0; i { + _classPaths[`${outlet}/${un}`] = require(res).default; + }); + } + + const id = `${outletName}/${uniqueName}`; + let foundClass = _extraConnectorClasses[id] || _classPaths[id]; + + return foundClass ? + jQuery.extend({}, DefaultConnectorClass, foundClass) : + DefaultConnectorClass; +} + +function buildConnectorCache() { + _connectorCache = {}; + + findOutlets(Ember.TEMPLATES, (outletName, resource, uniqueName) => { + _connectorCache[outletName] = _connectorCache[outletName] || []; + + _connectorCache[outletName].push({ + templateName: resource.replace('javascripts/', ''), + template: Ember.TEMPLATES[resource], + classNames: `${outletName}-outlet ${uniqueName}`, + connectorClass: findClass(outletName, uniqueName) + }); + }); +} + +function buildRawConnectorCache() { + _rawConnectorCache = {}; + findOutlets(Discourse.RAW_TEMPLATES, (outletName, resource) => { + _rawConnectorCache[outletName] = _rawConnectorCache[outletName] || []; + _rawConnectorCache[outletName].push({ + template: Discourse.RAW_TEMPLATES[resource] + }); + }); +} + +export function connectorsFor(outletName) { + if (!_connectorCache) { buildConnectorCache(); } + return _connectorCache[outletName] || []; +} + +export function rawConnectorsFor(outletName) { + if (!_rawConnectorCache) { buildRawConnectorCache(); } + return _rawConnectorCache[outletName] || []; +} diff --git a/app/assets/javascripts/discourse/lib/quote-state.js.es6 b/app/assets/javascripts/discourse/lib/quote-state.js.es6 new file mode 100644 index 00000000000..db1e1826fb1 --- /dev/null +++ b/app/assets/javascripts/discourse/lib/quote-state.js.es6 @@ -0,0 +1,15 @@ +export default class QuoteState { + constructor() { + this.clear(); + } + + selected(postId, buffer) { + this.postId = postId; + this.buffer = buffer; + } + + clear() { + this.buffer = ''; + this.postId = null; + } +} diff --git a/app/assets/javascripts/discourse/lib/raw-templates.js.es6 b/app/assets/javascripts/discourse/lib/raw-templates.js.es6 new file mode 100644 index 00000000000..89734b18aed --- /dev/null +++ b/app/assets/javascripts/discourse/lib/raw-templates.js.es6 @@ -0,0 +1,13 @@ +import { getResolverOption } from 'discourse-common/resolver'; + +export function findRawTemplate(name) { + if (getResolverOption('mobileView')) { + return Discourse.RAW_TEMPLATES[`javascripts/mobile/${name}`] || + Discourse.RAW_TEMPLATES[`javascripts/${name}`] || + Discourse.RAW_TEMPLATES[`mobile/${name}`] || + Discourse.RAW_TEMPLATES[name]; + } + + return Discourse.RAW_TEMPLATES[`javascripts/${name}`] || + Discourse.RAW_TEMPLATES[name]; +} diff --git a/app/assets/javascripts/discourse/lib/render-tag.js.es6 b/app/assets/javascripts/discourse/lib/render-tag.js.es6 index 5b627985413..356ee4b2c22 100644 --- a/app/assets/javascripts/discourse/lib/render-tag.js.es6 +++ b/app/assets/javascripts/discourse/lib/render-tag.js.es6 @@ -5,7 +5,7 @@ export default function renderTag(tag, params) { tag = Handlebars.Utils.escapeExpression(tag); const classes = ['tag-' + tag, 'discourse-tag']; const tagName = params.tagName || "a"; - const href = tagName === "a" ? " href='" + Discourse.getURL("/tags/" + tag) + "' " : ""; + const href = (tagName === "a" && !params.noHref) ? " href='" + Discourse.getURL("/tags/" + tag) + "' " : ""; if (Discourse.SiteSettings.tag_style || params.style) { classes.push(params.style || Discourse.SiteSettings.tag_style); diff --git a/app/assets/javascripts/discourse/lib/render-topic-featured-link.js.es6 b/app/assets/javascripts/discourse/lib/render-topic-featured-link.js.es6 new file mode 100644 index 00000000000..3b747284fdf --- /dev/null +++ b/app/assets/javascripts/discourse/lib/render-topic-featured-link.js.es6 @@ -0,0 +1,48 @@ +import { extractDomainFromUrl } from 'discourse/lib/utilities'; +import { h } from 'virtual-dom'; + +const _decorators = []; + +export function addFeaturedLinkMetaDecorator(decorator) { + _decorators.push(decorator); +} + +function extractLinkMeta(topic) { + const href = topic.featured_link, + target = Discourse.User.currentProp('external_links_in_new_tab') ? '_blank' : ''; + + if (!href) { return; } + + let domain = extractDomainFromUrl(href); + if (!domain) { return; } + + // www appears frequently, so we truncate it + if (domain && domain.substr(0, 4) === 'www.') { + domain = domain.substring(4); + } + + const meta = { target, href, domain, rel: 'nofollow' }; + if (_decorators.length) { + _decorators.forEach(cb => cb(meta)); + } + return meta; +} + +export default function renderTopicFeaturedLink(topic) { + const meta = extractLinkMeta(topic); + if (meta) { + return `${meta.domain}`; + } else { + return ''; + } +}; + +export function topicFeaturedLinkNode(topic) { + const meta = extractLinkMeta(topic); + if (meta) { + return h('a.topic-featured-link', { + attributes: { href: meta.href, rel: meta.rel, target: meta.target } + }, meta.domain); + } +} + diff --git a/app/assets/javascripts/discourse/lib/safari-hacks.js.es6 b/app/assets/javascripts/discourse/lib/safari-hacks.js.es6 index 1aa215f534f..6df7abd0d4b 100644 --- a/app/assets/javascripts/discourse/lib/safari-hacks.js.es6 +++ b/app/assets/javascripts/discourse/lib/safari-hacks.js.es6 @@ -6,7 +6,26 @@ function applicable() { !navigator.userAgent.match(/Trident/g); } + +function calcHeight(composingTopic) { + const winHeight = window.innerHeight; + + // Hard code some known iOS resolutions + switch(winHeight) { + case 460: return composingTopic ? 250 : 260; + case 559: return composingTopic ? 325 : 308; + case 627: + case 628: return 360; + } + + const ratio = composingTopic ? 0.54 : 0.6; + const min = composingTopic ? 300 : 350; + return Math.max(parseInt(winHeight*ratio), min); +} + let workaroundActive = false; +let composingTopic = false; + export function isWorkaroundActive() { return workaroundActive; } @@ -22,27 +41,38 @@ function positioningWorkaround($fixedElement) { var done = false; var originalScrollTop = 0; + positioningWorkaround.blur = function(evt) { + if (workaroundActive) { + done = true; + + $('#main-outlet').show(); + $('header').show(); + + fixedElement.style.position = ''; + fixedElement.style.top = ''; + fixedElement.style.height = ''; + + $(window).scrollTop(originalScrollTop); + + if (evt) { + evt.target.removeEventListener('blur', blurred); + } + workaroundActive = false; + } + }; + var blurredNow = function(evt) { if (!done && _.include($(document.activeElement).parents(), fixedElement)) { // something in focus so skip return; } - done = true; - - $('#main-outlet').show(); - $('header').show(); - - fixedElement.style.position = ''; - fixedElement.style.top = ''; - fixedElement.style.height = ''; - - $(window).scrollTop(originalScrollTop); - - if (evt) { - evt.target.removeEventListener('blur', blurred); + if (composingTopic) { + return false; } - workaroundActive = false; + + positioningWorkaround.blur(evt); + }; var blurred = _.debounce(blurredNow, 250); @@ -73,7 +103,10 @@ function positioningWorkaround($fixedElement) { fixedElement.style.top = '0px'; - const height = Math.max(parseInt(window.innerHeight*0.6), 350); + composingTopic = $('#reply-control select.category-combobox').length > 0; + + const height = calcHeight(composingTopic); + fixedElement.style.height = height + "px"; // I used to do this, but it seems like we don't need to with position diff --git a/app/assets/javascripts/discourse/lib/search.js.es6 b/app/assets/javascripts/discourse/lib/search.js.es6 index b0929ca60a1..9dc3b38e2f1 100644 --- a/app/assets/javascripts/discourse/lib/search.js.es6 +++ b/app/assets/javascripts/discourse/lib/search.js.es6 @@ -22,7 +22,10 @@ export function translateResults(results, opts) { return topic; }); - results.posts = results.posts.map(function(post){ + results.posts = results.posts.map(post => { + if (post.username) { + post.userPath = Discourse.getURL(`/users/${post.username.toLowerCase()}`); + } post = Post.create(post); post.set('topic', topicMap[post.topic_id]); return post; @@ -34,31 +37,33 @@ export function translateResults(results, opts) { }); results.categories = results.categories.map(function(category){ - return Category.list().findProperty('id', category.id); + return Category.list().findBy('id', category.id); }).compact(); const r = results.grouped_search_result; results.resultTypes = []; // TODO: consider refactoring front end to take a better structure - [['topic','posts'],['user','users'],['category','categories']].forEach(function(pair){ - const type = pair[0], name = pair[1]; - if (results[name].length > 0) { - var result = { - results: results[name], - componentName: "search-result-" + ((opts.searchContext && opts.searchContext.type === 'topic' && type === 'topic') ? 'post' : type), - type, - more: r['more_' + name] - }; + if (r) { + [['topic','posts'],['user','users'],['category','categories']].forEach(function(pair){ + const type = pair[0], name = pair[1]; + if (results[name].length > 0) { + var result = { + results: results[name], + componentName: "search-result-" + ((opts.searchContext && opts.searchContext.type === 'topic' && type === 'topic') ? 'post' : type), + type, + more: r['more_' + name] + }; - if (result.more && name === "posts" && opts.fullSearchUrl) { - result.more = false; - result.moreUrl = opts.fullSearchUrl; + if (result.more && name === "posts" && opts.fullSearchUrl) { + result.more = false; + result.moreUrl = opts.fullSearchUrl; + } + + results.resultTypes.push(result); } - - results.resultTypes.push(result); - } - }); + }); + } const noResults = !!(results.topics.length === 0 && results.posts.length === 0 && @@ -68,7 +73,7 @@ export function translateResults(results, opts) { return noResults ? null : Em.Object.create(results); } -function searchForTerm(term, opts) { +export function searchForTerm(term, opts) { if (!opts) opts = {}; // Only include the data we have @@ -92,7 +97,7 @@ function searchForTerm(term, opts) { return promise; } -const searchContextDescription = function(type, name){ +export function searchContextDescription(type, name) { if (type) { switch(type) { case 'topic': @@ -107,17 +112,15 @@ const searchContextDescription = function(type, name){ } }; -const getSearchKey = function(args){ +export function getSearchKey(args) { return args.q + "|" + ((args.searchContext && args.searchContext.type) || "") + "|" + ((args.searchContext && args.searchContext.id) || ""); }; -const isValidSearchTerm = function(searchTerm) { +export function isValidSearchTerm(searchTerm) { if (searchTerm) { return searchTerm.trim().length >= Discourse.SiteSettings.min_search_term_length; } else { return false; } }; - -export { searchForTerm, searchContextDescription, getSearchKey, isValidSearchTerm }; diff --git a/app/assets/javascripts/discourse/lib/show-modal.js.es6 b/app/assets/javascripts/discourse/lib/show-modal.js.es6 index 6237163d061..ed2457e065f 100644 --- a/app/assets/javascripts/discourse/lib/show-modal.js.es6 +++ b/app/assets/javascripts/discourse/lib/show-modal.js.es6 @@ -9,23 +9,28 @@ export default function(name, opts) { modalController.set('modalClass', null); - const viewClass = container.lookupFactory('view:' + name); - const controller = container.lookup('controller:' + name); - if (viewClass) { - route.render(name, { into: 'modal', outlet: 'modalBody' }); - } else { - const templateName = Ember.String.dasherize(name); + const controllerName = opts.admin ? `modals/${name}` : name; - const renderArgs = { into: 'modal', outlet: 'modalBody', view: 'modal-body'}; - if (controller) { renderArgs.controller = name; } + const controller = container.lookup('controller:' + controllerName); + const templateName = opts.templateName || Ember.String.dasherize(name); - route.render('modal/' + templateName, renderArgs); - if (opts.title) { - modalController.set('title', I18n.t(opts.title)); - } + const renderArgs = { into: 'modal', outlet: 'modalBody'}; + if (controller) { renderArgs.controller = controllerName; } + + if (opts.addModalBodyView) { + renderArgs.view = 'modal-body'; + } + + + const modalName = `modal/${templateName}`; + const fullName = opts.admin ? `admin/templates/${modalName}` : modalName; + route.render(fullName, renderArgs); + if (opts.title) { + modalController.set('title', I18n.t(opts.title)); } if (controller) { + controller.set('modal', modalController); const model = opts.model; if (model) { controller.set('model', model); } if (controller.onShow) { controller.onShow(); } diff --git a/app/assets/javascripts/discourse/lib/text.js.es6 b/app/assets/javascripts/discourse/lib/text.js.es6 index 5a140b48c14..dc3c1cdf971 100644 --- a/app/assets/javascripts/discourse/lib/text.js.es6 +++ b/app/assets/javascripts/discourse/lib/text.js.es6 @@ -19,7 +19,7 @@ export function cook(text) { } export function sanitize(text) { - return textSanitize(text, new WhiteLister(getOpts().features)); + return textSanitize(text, new WhiteLister(getOpts())); } function emojiOptions() { @@ -29,8 +29,8 @@ function emojiOptions() { return { getURL: Discourse.getURLWithCDN, emojiSet: siteSettings.emoji_set }; } -export function emojiUnescape(string) { - const opts = emojiOptions(); +export function emojiUnescape(string, options) { + const opts = _.extend(emojiOptions(), options || {}); return opts ? performEmojiUnescape(string, opts) : string; } diff --git a/app/assets/javascripts/discourse/lib/transform-post.js.es6 b/app/assets/javascripts/discourse/lib/transform-post.js.es6 index 18da1e5993a..d9742501d6c 100644 --- a/app/assets/javascripts/discourse/lib/transform-post.js.es6 +++ b/app/assets/javascripts/discourse/lib/transform-post.js.es6 @@ -29,6 +29,9 @@ export function transformBasicPost(post) { deletedByAvatarTemplate: null, deletedByUsername: null, primary_group_name: post.primary_group_name, + primary_group_flair_url: post.primary_group_flair_url, + primary_group_flair_bg_color: post.primary_group_flair_bg_color, + primary_group_flair_color: post.primary_group_flair_color, wiki: post.wiki, firstPost: post.post_number === 1, post_number: post.post_number, diff --git a/app/assets/javascripts/discourse/lib/url.js.es6 b/app/assets/javascripts/discourse/lib/url.js.es6 index 4b72cc26ebb..6aca579c130 100644 --- a/app/assets/javascripts/discourse/lib/url.js.es6 +++ b/app/assets/javascripts/discourse/lib/url.js.es6 @@ -5,6 +5,13 @@ import { defaultHomepage } from 'discourse/lib/utilities'; const rewrites = []; const TOPIC_REGEXP = /\/t\/([^\/]+)\/(\d+)\/?(\d+)?/; +// We can add links here that have server side responses but not client side. +const SERVER_SIDE_ONLY = [ + /^\/posts\/\d+\/raw/, + /\.rss$/, + /\.json/, +]; + let _jumpScheduled = false; export function jumpToElement(elementId) { if (_jumpScheduled || Ember.isEmpty(elementId)) { return; } @@ -79,7 +86,7 @@ const DiscourseURL = Ember.Object.extend({ // Always use replaceState in the next runloop to prevent weird routes changing // while URLs are loading. For example, while a topic loads it sets `currentPost` // which triggers a replaceState even though the topic hasn't fully loaded yet! - Em.run.next(function() { + Ember.run.next(() => { const location = DiscourseURL.get('router.location'); if (location && location.replaceURL) { location.replaceURL(path); @@ -114,6 +121,15 @@ const DiscourseURL = Ember.Object.extend({ return; } + const serverSide = SERVER_SIDE_ONLY.some(r => { + if (path.match(r)) { + document.location = path; + return true; + } + }); + + if (serverSide) { return; } + // Protocol relative URLs if (path.indexOf('//') === 0) { document.location = path; @@ -121,7 +137,7 @@ const DiscourseURL = Ember.Object.extend({ } // Scroll to the same page, different anchor - const m = /#(.+)$/.exec(path); + const m = /^#(.+)$/.exec(path); if (m) { jumpToElement(m[1]); return this.replaceState(path); @@ -151,11 +167,6 @@ const DiscourseURL = Ember.Object.extend({ rewrites.forEach(rw => path = path.replace(rw.regexp, rw.replacement)); if (this.navigatedToPost(oldPath, path, opts)) { return; } - // Schedule a DOM cleanup event - Em.run.scheduleOnce('afterRender', Discourse.Route, 'cleanDOM'); - - // TODO: Extract into rules we can inject into the URL handler - if (this.navigatedToHome(oldPath, path, opts)) { return; } if (oldPath === path) { // If navigating to the same path send an app event. Views can watch it @@ -163,6 +174,9 @@ const DiscourseURL = Ember.Object.extend({ this.appEvents.trigger('url:refresh'); } + // TODO: Extract into rules we can inject into the URL handler + if (this.navigatedToHome(oldPath, path, opts)) { return; } + return this.handleURL(path, opts); }, @@ -256,7 +270,7 @@ const DiscourseURL = Ember.Object.extend({ @param {String} oldPath the previous path we were on @param {String} path the path we're navigating to **/ - navigatedToHome: function(oldPath, path) { + navigatedToHome(oldPath, path) { const homepage = defaultHomepage(); if (window.history && @@ -271,7 +285,7 @@ const DiscourseURL = Ember.Object.extend({ }, // This has been extracted so it can be tested. - origin: function() { + origin() { return window.location.origin + (Discourse.BaseUri === "/" ? '' : Discourse.BaseUri); }, @@ -318,7 +332,8 @@ const DiscourseURL = Ember.Object.extend({ const transition = router.handleURL(path); transition._discourse_intercepted = true; - transition.promise.then(() => jumpToElement(elementId)); + const promise = transition.promise || transition; + promise.then(() => jumpToElement(elementId)); } }).create(); diff --git a/app/assets/javascripts/discourse/lib/user-search.js.es6 b/app/assets/javascripts/discourse/lib/user-search.js.es6 index eb5bc209b35..def5e2e883a 100644 --- a/app/assets/javascripts/discourse/lib/user-search.js.es6 +++ b/app/assets/javascripts/discourse/lib/user-search.js.es6 @@ -59,7 +59,7 @@ function organizeResults(r, options) { if (r.groups) { r.groups.every(function(g) { - if (results.length > limit) return false; + if (results.length > limit && options.term !== g.name) return false; if (exclude.indexOf(g.name) === -1) { groups.push(g); results.push(g); diff --git a/app/assets/javascripts/discourse/lib/utilities.js.es6 b/app/assets/javascripts/discourse/lib/utilities.js.es6 index 6dc7b93ecb1..154f92553b5 100644 --- a/app/assets/javascripts/discourse/lib/utilities.js.es6 +++ b/app/assets/javascripts/discourse/lib/utilities.js.es6 @@ -71,38 +71,41 @@ export function userUrl(username) { export function emailValid(email) { // see: http://stackoverflow.com/questions/46155/validate-email-address-in-javascript - var re = /^[a-zA-Z0-9!#$%&'*+\/=?\^_`{|}~\-]+(?:\.[a-zA-Z0-9!#$%&'\*+\/=?\^_`{|}~\-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-]*[a-zA-Z0-9])?$/; + const re = /^[a-zA-Z0-9!#$%&'*+\/=?\^_`{|}~\-]+(?:\.[a-zA-Z0-9!#$%&'\*+\/=?\^_`{|}~\-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-]*[a-zA-Z0-9])?$/; return re.test(email); } -export function selectedText() { - var html = ''; +export function extractDomainFromUrl(url) { + if (url.indexOf("://") > -1) { + url = url.split('/')[2]; + } else { + url = url.split('/')[0]; + } + return url.split(':')[0]; +} - if (typeof window.getSelection !== "undefined") { - var sel = window.getSelection(); - if (sel.rangeCount) { - var container = document.createElement("div"); - for (var i = 0, len = sel.rangeCount; i < len; ++i) { - container.appendChild(sel.getRangeAt(i).cloneContents()); - } - html = container.innerHTML; - } - } else if (typeof document.selection !== "undefined") { - if (document.selection.type === "Text") { - html = document.selection.createRange().htmlText; - } +export function selectedText() { + const selection = window.getSelection(); + if (selection.isCollapsed) { return ""; } + + const $div = $(" "); + for (let r = 0; r < selection.rangeCount; r++) { + const range = selection.getRangeAt(r); + const $ancestor = $(range.commonAncestorContainer); + + // ensure we never quote text in the post menu area + const $postMenuArea = $ancestor.find(".post-menu-area")[0]; + if ($postMenuArea) { range.setEndBefore($postMenuArea); } + + $div.append(range.cloneContents()); } - // Strip out any .click elements from the HTML before converting it to text - var div = document.createElement('div'); - div.innerHTML = html; - var $div = $(div); - // Find all emojis and replace with its title attribute. - $div.find('img.emoji').replaceWith(function() { return this.title; }); - $('.clicks', $div).remove(); - var text = div.textContent || div.innerText || ""; + // strip click counters + $div.find(".clicks").remove(); + // replace emojis + $div.find("img.emoji").replaceWith(function() { return this.title; }); - return String(text).trim(); + return String($div.text()).trim(); } // Determine the row and col of the caret in an element @@ -155,7 +158,7 @@ export function setCaretPosition(ctrl, pos) { } } -export function validateUploadedFiles(files, bypassNewUserRestriction) { +export function validateUploadedFiles(files, opts) { if (!files || files.length === 0) { return false; } if (files.length > 1) { @@ -163,31 +166,43 @@ export function validateUploadedFiles(files, bypassNewUserRestriction) { return false; } - var upload = files[0]; + const upload = files[0]; // CHROME ONLY: if the image was pasted, sets its name to a default one if (typeof Blob !== "undefined" && typeof File !== "undefined") { if (upload instanceof Blob && !(upload instanceof File) && upload.type === "image/png") { upload.name = "blob.png"; } } - var type = uploadTypeFromFileName(upload.name); + opts = opts || {}; + opts["type"] = uploadTypeFromFileName(upload.name); - return validateUploadedFile(upload, type, bypassNewUserRestriction); + return validateUploadedFile(upload, opts); } -export function validateUploadedFile(file, type, bypassNewUserRestriction) { +export function validateUploadedFile(file, opts) { + opts = opts || {}; + + const name = file && file.name; + + if (!name) { return false; } + // check that the uploaded file is authorized - if (!authorizesAllExtensions() && - !isAuthorizedUpload(file)) { - var extensions = authorizedExtensions(); - bootbox.alert(I18n.t('post.errors.upload_not_authorized', { authorized_extensions: extensions })); - return false; + if (opts["imagesOnly"]) { + if (!isAnImage(name) && !isAuthorizedImage(name)) { + bootbox.alert(I18n.t('post.errors.upload_not_authorized', { authorized_extensions: authorizedImagesExtensions() })); + return false; + } + } else { + if (!authorizesAllExtensions() && !isAuthorizedFile(name)) { + bootbox.alert(I18n.t('post.errors.upload_not_authorized', { authorized_extensions: authorizedExtensions() })); + return false; + } } - if (!bypassNewUserRestriction) { + if (!opts["bypassNewUserRestriction"]) { // ensures that new users can upload a file - if (!Discourse.User.current().isAllowedToUploadAFile(type)) { - bootbox.alert(I18n.t('post.errors.' + type + '_upload_not_allowed_for_new_user')); + if (!Discourse.User.current().isAllowedToUploadAFile(opts["type"])) { + bootbox.alert(I18n.t(`post.errors.${opts["type"]}_upload_not_allowed_for_new_user`)); return false; } } @@ -196,31 +211,62 @@ export function validateUploadedFile(file, type, bypassNewUserRestriction) { return true; } -export function uploadTypeFromFileName(fileName) { - return isAnImage(fileName) ? 'image' : 'attachment'; +const IMAGES_EXTENSIONS_REGEX = /(png|jpe?g|gif|bmp|tiff?|svg|webp|ico)/i; + +function extensions() { + return Discourse.SiteSettings.authorized_extensions + .toLowerCase() + .replace(/[\s\.]+/g, "") + .split("|") + .filter(ext => ext.indexOf("*") === -1); +} + +function imagesExtensions() { + return extensions().filter(ext => IMAGES_EXTENSIONS_REGEX.test(ext)); +} + +function extensionsRegex() { + return new RegExp("\\.(" + extensions().join("|") + ")$", "i"); +} + +function imagesExtensionsRegex() { + return new RegExp("\\.(" + imagesExtensions().join("|") + ")$", "i"); +} + +function isAuthorizedFile(fileName) { + return extensionsRegex().test(fileName); +} + +function isAuthorizedImage(fileName){ + return imagesExtensionsRegex().test(fileName); +} + +export function authorizedExtensions() { + return authorizesAllExtensions() ? "*" : extensions().join(", "); +} + +export function authorizedImagesExtensions() { + return authorizesAllExtensions() ? "png, jpg, jpeg, gif, bmp, tiff, svg, webp, ico" : imagesExtensions().join(", "); } export function authorizesAllExtensions() { return Discourse.SiteSettings.authorized_extensions.indexOf("*") >= 0; } -export function isAuthorizedUpload(file) { - if (file && file.name) { - var extensions = _.chain(Discourse.SiteSettings.authorized_extensions.split("|")) - .reject(function(extension) { return extension.indexOf("*") >= 0; }) - .map(function(extension) { return (extension.indexOf(".") === 0 ? extension.substring(1) : extension).replace(".", "\\."); }) - .value(); - return new RegExp("\\.(" + extensions.join("|") + ")$", "i").test(file.name); - } - return false; +export function isAnImage(path) { + return (/\.(png|jpe?g|gif|bmp|tiff?|svg|webp|ico)$/i).test(path); } -export function authorizedExtensions() { - return _.chain(Discourse.SiteSettings.authorized_extensions.split("|")) - .reject(function(extension) { return extension.indexOf("*") >= 0; }) - .map(function(extension) { return extension.toLowerCase(); }) - .value() - .join(", "); +function uploadTypeFromFileName(fileName) { + return isAnImage(fileName) ? 'image' : 'attachment'; +} + +export function allowsImages() { + return authorizesAllExtensions() || IMAGES_EXTENSIONS_REGEX.test(authorizedExtensions()); +} + +export function allowsAttachments() { + return authorizesAllExtensions() || extensions().length > imagesExtensions().length; } export function uploadLocation(url) { @@ -232,7 +278,7 @@ export function uploadLocation(url) { } else { var protocol = window.location.protocol + '//', hostname = window.location.hostname, - port = ':' + window.location.port; + port = window.location.port ? ':' + window.location.port : ''; return protocol + hostname + port + url; } } @@ -241,27 +287,12 @@ export function getUploadMarkdown(upload) { if (isAnImage(upload.original_filename)) { return ''; } else if (!Discourse.SiteSettings.prevent_anons_from_downloading_files && (/\.(mov|mp4|webm|ogv|mp3|ogg|wav|m4a)$/i).test(upload.original_filename)) { - // is Audio/Video return uploadLocation(upload.url); } else { return '' + upload.original_filename + ' (' + I18n.toHumanSize(upload.filesize) + ')\n'; } } -export function isAnImage(path) { - return (/\.(png|jpe?g|gif|bmp|tiff?|svg|webp|ico)$/i).test(path); -} - -export function allowsImages() { - return authorizesAllExtensions() || - (/(png|jpe?g|gif|bmp|tiff?|svg|webp|ico)/i).test(authorizedExtensions()); -} - -export function allowsAttachments() { - return authorizesAllExtensions() || - !(/((png|jpe?g|gif|bmp|tiff?|svg|web|ico)(,\s)?)+$/i).test(authorizedExtensions()); -} - export function displayErrorForUpload(data) { // deal with meaningful errors first if (data.jqXHR) { @@ -298,5 +329,35 @@ export function defaultHomepage() { return Discourse.SiteSettings.top_menu.split("|")[0].split(",")[0]; } +export function determinePostReplaceSelection({ selection, needle, replacement }) { + const diff = (replacement.end - replacement.start) - (needle.end - needle.start); + + if (selection.end <= needle.start) { + // Selection ends (and starts) before needle. + return { start: selection.start, end: selection.end }; + } else if (selection.start <= needle.start) { + // Selection starts before needle... + if (selection.end < needle.end) { + // ... and ends inside needle. + return { start: selection.start, end: needle.start }; + } else { + // ... and spans needle completely. + return { start: selection.start, end: selection.end + diff }; + } + } else if (selection.start < needle.end) { + // Selection starts inside needle... + if (selection.end <= needle.end) { + // ... and ends inside needle. + return { start: replacement.end, end: replacement.end }; + } else { + // ... and spans end of needle. + return { start: replacement.end, end: selection.end + diff }; + } + } else { + // Selection starts (and ends) behind needle. + return { start: selection.start + diff, end: selection.end + diff }; + } +} + // This prevents a mini racer crash export default {}; diff --git a/app/assets/javascripts/discourse/mapping-router.js.es6 b/app/assets/javascripts/discourse/mapping-router.js.es6 new file mode 100644 index 00000000000..e88b7f746d3 --- /dev/null +++ b/app/assets/javascripts/discourse/mapping-router.js.es6 @@ -0,0 +1,142 @@ +import { defaultHomepage } from 'discourse/lib/utilities'; +const rootURL = Discourse.BaseUri; + +const BareRouter = Ember.Router.extend({ + rootURL, + location: Ember.testing ? 'none': 'discourse-location', + + handleURL(url) { + const params = url.split('?'); + + if (params[0] === "/") { + url = defaultHomepage(); + if (params[1] && params[1].length) { + url = `${url}?${params[1]}`; + } + } + return this._super(url); + } +}); + +// Ember's router can't be extended. We need to allow plugins to add routes to routes that were defined +// in the core app. This class has the same API as Ember's `Router.map` but saves the results in a tree. +// The tree is applied after all plugins are defined. +class RouteNode { + constructor(name, opts={}, depth=0) { + this.name = name; + this.opts = opts; + this.depth = depth; + this.children = []; + this.childrenByName = {}; + this.paths = {}; + + if (!opts.path) { + opts.path = name; + } + + this.paths[opts.path] = true; + } + + route(name, opts, fn) { + if (typeof opts === 'function') { + fn = opts; + opts = {}; + } else { + opts = opts || {}; + } + + const existing = this.childrenByName[name]; + if (existing) { + if (opts.path) { + existing.paths[opts.path] = true; + } + existing.extract(fn); + } else { + const node = new RouteNode(name, opts, this.depth+1); + node.extract(fn); + this.childrenByName[name] = node; + this.children.push(node); + } + } + + extract(fn) { + if (!fn) { return; } + fn.call(this); + } + + mapRoutes(router) { + const children = this.children; + if (this.name === 'root') { + children.forEach(c => c.mapRoutes(router)); + } else { + + const builder = (children.length === 0) ? undefined : function() { + children.forEach(c => c.mapRoutes(this)); + }; + router.route(this.name, this.opts, builder); + + // We can have multiple paths to the same route + const paths = Object.keys(this.paths); + if (paths.length > 1) { + paths.filter(p => p !== this.opts.path).forEach(path => { + const newOpts = jQuery.extend({}, this.opts, { path }); + console.log(`warning: we can't have duplicate route names anymore`, newOpts); + // router.route(this.name, newOpts, builder); + }); + } + } + } + + findSegment(segments) { + if (segments && segments.length) { + const first = segments.shift(); + const node = this.childrenByName[first]; + if (node) { + return (segments.length === 0) ? node : node.findSegment(segments); + } + } + } + + findPath(path) { + if (path) { + return this.findSegment(path.split('.')); + } + } +} + +export function mapRoutes() { + const tree = new RouteNode('root'); + const extras = []; + + // If a module is defined as `route-map` in discourse or a plugin, its routes + // will be built automatically. You can supply a `resource` property to + // automatically put it in that resource, such as `admin`. That way plugins + // can define admin routes. + Object.keys(requirejs._eak_seen).forEach(function(key) { + if (/route-map$/.test(key)) { + var module = require(key, null, null, true); + if (!module || !module.default) { throw new Error(key + ' must export a route map.'); } + + const mapObj = module.default; + if (typeof mapObj === 'function') { + tree.extract(mapObj); + } else { + extras.push(mapObj); + } + } + }); + + extras.forEach(extra => { + const node = tree.findPath(extra.resource); + if (node) { + node.extract(extra.map); + } + }); + + return BareRouter.extend().map(function() { + tree.mapRoutes(this); + this.route('unknown', {path: '*path'}); + }); +} + +export default BareRouter; diff --git a/app/assets/javascripts/discourse/mixins/add-category-class.js.es6 b/app/assets/javascripts/discourse/mixins/add-category-class.js.es6 deleted file mode 100644 index b3496ee8cbf..00000000000 --- a/app/assets/javascripts/discourse/mixins/add-category-class.js.es6 +++ /dev/null @@ -1,27 +0,0 @@ -// Mix this in to a view that has a `categoryFullSlug` property to automatically -// add it to the body as the view is entered / left / model is changed. -// This is used for keeping the `body` style in sync for the background image. - -import Ember from "ember"; -const { on, observer } = Ember; - -export default { - _categoryChanged: on("didInsertElement", observer("categoryFullSlug", function() { - const categoryFullSlug = this.get("categoryFullSlug"); - - this._removeClass(); - - if (categoryFullSlug) { - $("body").addClass("category-" + categoryFullSlug); - } - })), - - _leave: on("willDestroyElement", function() { - this.removeObserver("categoryFullSlug"); - this._removeClass(); - }), - - _removeClass() { - $("body").removeClass((_, css) => (css.match(/\bcategory-\S+/g) || []).join(" ")); - }, -}; diff --git a/app/assets/javascripts/discourse/mixins/delegate-actions.js.es6 b/app/assets/javascripts/discourse/mixins/delegate-actions.js.es6 deleted file mode 100644 index ce3e46a56f5..00000000000 --- a/app/assets/javascripts/discourse/mixins/delegate-actions.js.es6 +++ /dev/null @@ -1,6 +0,0 @@ -export default Ember.Mixin.create({ - init() { - this._super(); - (this.get('delegated') || []).forEach(m => this.set(m, m)); - }, -}); diff --git a/app/assets/javascripts/discourse/mixins/load-more.js.es6 b/app/assets/javascripts/discourse/mixins/load-more.js.es6 index c422e1cd633..d83725f790b 100644 --- a/app/assets/javascripts/discourse/mixins/load-more.js.es6 +++ b/app/assets/javascripts/discourse/mixins/load-more.js.es6 @@ -3,7 +3,7 @@ import Scrolling from 'discourse/mixins/scrolling'; import { on } from 'ember-addons/ember-computed-decorators'; // Provides the ability to load more items for a view which is scrolled to the bottom. -export default Ember.Mixin.create(Ember.ViewTargetActionSupport, Scrolling, { +export default Ember.Mixin.create(Scrolling, { scrolled() { const eyeline = this.get('eyeline'); diff --git a/app/assets/javascripts/discourse/mixins/modal-functionality.js.es6 b/app/assets/javascripts/discourse/mixins/modal-functionality.js.es6 index 42a279b8036..23bc790e153 100644 --- a/app/assets/javascripts/discourse/mixins/modal-functionality.js.es6 +++ b/app/assets/javascripts/discourse/mixins/modal-functionality.js.es6 @@ -1,9 +1,5 @@ -export default Em.Mixin.create({ - flashMessage: null, - - needs: ['modal'], - - flash(message, messageClass) { - this.set('flashMessage', Em.Object.create({ message, messageClass })); +export default Ember.Mixin.create({ + flash(text, messageClass) { + this.appEvents.trigger('modal-body:flash', { text, messageClass }); } }); diff --git a/app/assets/javascripts/discourse/mixins/scroll-top.js.es6 b/app/assets/javascripts/discourse/mixins/scroll-top.js.es6 index 35af1d0eee9..5945c73a600 100644 --- a/app/assets/javascripts/discourse/mixins/scroll-top.js.es6 +++ b/app/assets/javascripts/discourse/mixins/scroll-top.js.es6 @@ -1,14 +1,24 @@ import DiscourseURL from 'discourse/lib/url'; +import { deprecated } from 'discourse/mixins/scroll-top'; + +const context = { + _scrollTop() { + if (Ember.testing) { return; } + $(document).scrollTop(0); + } +}; function scrollTop() { if (DiscourseURL.isJumpScheduled()) { return; } - Ember.run.schedule('afterRender', function() { - $(document).scrollTop(0); - }); + Ember.run.scheduleOnce('afterRender', context, context._scrollTop); } export default Ember.Mixin.create({ - _scrollTop: scrollTop.on('didInsertElement') + didInsertElement() { + deprecated('The `ScrollTop` mixin is deprecated. Replace it with a `{{d-section}}` component'); + this._super(); + scrollTop(); + } }); export { scrollTop }; diff --git a/app/assets/javascripts/discourse/mixins/string-buffer.js.es6 b/app/assets/javascripts/discourse/mixins/string-buffer.js.es6 deleted file mode 100644 index 943a972c6e4..00000000000 --- a/app/assets/javascripts/discourse/mixins/string-buffer.js.es6 +++ /dev/null @@ -1,45 +0,0 @@ -export default Ember.Mixin.create({ - - _watchProps: function() { - const args = this.get('rerenderTriggers'); - if (!Ember.isNone(args)) { - args.forEach(k => this.addObserver(k, this.rerenderString)); - } - }.on('init'), - - render(buffer) { - this.renderString(buffer); - }, - - renderString(buffer){ - const template = Discourse.__container__.lookup('template:' + this.rawTemplate); - if (template) { - buffer.push(template(this)); - } - }, - - _rerenderString() { - const $sel = this.$(); - if (!$sel) { return; } - - const buffer = []; - this.renderString(buffer); - - // Chrome likes scrolling after HTML is set - // This happens if you navigate back and forth a few times - // Before removing this code confirm that this does not cause scrolling - // 1. Sort by views - // 2. Go to last post on one of the topics - // 3. Hit back - // 4. Go to last post on same topic - // 5. Expand likes - const scrollTop = $(window).scrollTop(); - $sel.html(buffer.join('')); - $(window).scrollTop(scrollTop); - }, - - rerenderString() { - Ember.run.once(this, '_rerenderString'); - } - -}); diff --git a/app/assets/javascripts/discourse/mixins/upload.js.es6 b/app/assets/javascripts/discourse/mixins/upload.js.es6 index 648d18dfd98..ec76aa1e660 100644 --- a/app/assets/javascripts/discourse/mixins/upload.js.es6 +++ b/app/assets/javascripts/discourse/mixins/upload.js.es6 @@ -8,6 +8,10 @@ export default Em.Mixin.create({ Em.warn("You should implement `uploadDone`"); }, + validateUploadedFilesOptions() { + return {}; + }, + _initialize: function() { const $upload = this.$(), csrf = Discourse.Session.currentProp("csrfToken"), @@ -40,7 +44,8 @@ export default Em.Mixin.create({ }); $upload.on("fileuploadsubmit", (e, data) => { - const isValid = validateUploadedFiles(data.files, true); + const opts = _.merge({ bypassNewUserRestriction: true }, this.validateUploadedFilesOptions()); + const isValid = validateUploadedFiles(data.files, opts); let form = { type: this.get("type") }; if (this.get("data")) { form = $.extend(form, this.get("data")); } data.formData = form; diff --git a/app/assets/javascripts/discourse/models/admin-post.js.es6 b/app/assets/javascripts/discourse/models/admin-post.js.es6 index 4504fcbe24e..8de331ac955 100644 --- a/app/assets/javascripts/discourse/models/admin-post.js.es6 +++ b/app/assets/javascripts/discourse/models/admin-post.js.es6 @@ -9,7 +9,7 @@ export default Post.extend({ } }.on("init"), - presentName: Em.computed.any('name', 'username'), + presentName: Ember.computed.or('name', 'username'), sameUser: function() { return this.get("username") === Discourse.User.currentProp("username"); diff --git a/app/assets/javascripts/discourse/models/badge.js.es6 b/app/assets/javascripts/discourse/models/badge.js.es6 index 333b40c57ff..f94b6576696 100644 --- a/app/assets/javascripts/discourse/models/badge.js.es6 +++ b/app/assets/javascripts/discourse/models/badge.js.es6 @@ -135,7 +135,7 @@ Badge.reopenClass({ if(opts && opts.onlyListable){ listable = "?only_listable=true"; } - return ajax('/badges.json' + listable).then(function(badgesJson) { + return ajax('/badges.json' + listable, { data: opts }).then(function(badgesJson) { return Badge.createFromJson(badgesJson); }); }, diff --git a/app/assets/javascripts/discourse/models/category-list.js.es6 b/app/assets/javascripts/discourse/models/category-list.js.es6 index c1469c314d7..987e5020530 100644 --- a/app/assets/javascripts/discourse/models/category-list.js.es6 +++ b/app/assets/javascripts/discourse/models/category-list.js.es6 @@ -11,9 +11,19 @@ const CategoryList = Ember.ArrayProxy.extend({ CategoryList.reopenClass({ categoriesFrom(store, result) { const categories = CategoryList.create(); - const users = Discourse.Model.extractByKey(result.featured_users, Discourse.User); const list = Discourse.Category.list(); + let statPeriod = "all"; + const minCategories = result.category_list.categories.length * 0.66; + + ["week", "month"].some(period => { + const filteredCategories = result.category_list.categories.filter(c => c[`topics_${period}`] > 0); + if (filteredCategories.length >= minCategories) { + statPeriod = period; + return true; + } + }); + result.category_list.categories.forEach(c => { if (c.parent_category_id) { c.parentCategory = list.findBy('id', c.parent_category_id); @@ -23,14 +33,29 @@ CategoryList.reopenClass({ c.subcategories = c.subcategory_ids.map(scid => list.findBy('id', parseInt(scid, 10))); } - if (c.featured_user_ids) { - c.featured_users = c.featured_user_ids.map(u => users[u]); - } - if (c.topics) { c.topics = c.topics.map(t => Discourse.Topic.create(t)); } + + switch(statPeriod) { + case "week": + case "month": + const stat = c[`topics_${statPeriod}`]; + const unit = I18n.t(statPeriod); + if (stat > 0) { + c.stat = `${stat} / ${unit}`; + c.statTitle = I18n.t("categories.topic_stat_sentence", { count: stat, unit: unit }); + c["pick" + statPeriod[0].toUpperCase() + statPeriod.slice(1)] = true; + break; + } + default: + c.stat = `${c.topics_all_time}`; + c.statTitle = I18n.t("categories.topic_sentence", { count: c.topics_all_time }); + c.pickAll = true; + break; + } + categories.pushObject(store.createRecord('category', c)); }); return categories; diff --git a/app/assets/javascripts/discourse/models/category.js.es6 b/app/assets/javascripts/discourse/models/category.js.es6 index 000aeaeccb4..b31f715b810 100644 --- a/app/assets/javascripts/discourse/models/category.js.es6 +++ b/app/assets/javascripts/discourse/models/category.js.es6 @@ -1,5 +1,6 @@ import { ajax } from 'discourse/lib/ajax'; import RestModel from 'discourse/models/rest'; +import computed from 'ember-addons/ember-computed-decorators'; import { on } from 'ember-addons/ember-computed-decorators'; import PermissionType from 'discourse/models/permission-type'; @@ -17,56 +18,64 @@ const Category = RestModel.extend({ availableGroups.removeObject(elem.group_name); return { group_name: elem.group_name, - permission: PermissionType.create({id: elem.permission_type}) + permission: PermissionType.create({ id: elem.permission_type }) }; })); } }, - availablePermissions: function(){ - return [ PermissionType.create({id: PermissionType.FULL}), - PermissionType.create({id: PermissionType.CREATE_POST}), - PermissionType.create({id: PermissionType.READONLY}) - ]; - }.property(), + @computed + availablePermissions() { + return [ + PermissionType.create({ id: PermissionType.FULL }), + PermissionType.create({ id: PermissionType.CREATE_POST }), + PermissionType.create({ id: PermissionType.READONLY }) + ]; + }, - searchContext: function() { - return ({ type: 'category', id: this.get('id'), category: this }); - }.property('id'), + @computed("id") + searchContext(id) { + return { type: 'category', id, category: this }; + }, - url: function() { + @computed("name") + url() { return Discourse.getURL("/c/") + Category.slugFor(this); - }.property('name'), + }, - fullSlug: function() { - return this.get("url").slice(3).replace("/", "-"); - }.property("url"), + @computed("url") + fullSlug(url) { + return url.slice(3).replace("/", "-"); + }, - nameLower: function() { - return this.get('name').toLowerCase(); - }.property('name'), + @computed("name") + nameLower(name) { + return name.toLowerCase(); + }, - unreadUrl: function() { - return this.get('url') + '/l/unread'; - }.property('url'), + @computed("url") + unreadUrl(url) { + return `${url}/l/unread`; + }, - newUrl: function() { - return this.get('url') + '/l/new'; - }.property('url'), + @computed("url") + newUrl(url) { + return `${url}/l/new`; + }, - style: function() { - return "background-color: #" + this.get('category.color') + "; color: #" + this.get('category.text_color') + ";"; - }.property('color', 'text_color'), + @computed("color", "text_color") + style(color, textColor) { + return `background-color: #${color}; color: #${textColor}`; + }, - moreTopics: function() { - return this.get('topic_count') > Discourse.SiteSettings.category_featured_topics; - }.property('topic_count'), + @computed("topic_count") + moreTopics(topicCount) { + return topicCount > Discourse.SiteSettings.category_featured_topics; + }, - save: function() { - var url = "/categories"; - if (this.get('id')) { - url = "/categories/" + this.get('id'); - } + save() { + const id = this.get("id"); + const url = id ? `/categories/${id}` : "/categories"; return ajax(url, { data: { @@ -82,120 +91,87 @@ const Category = RestModel.extend({ email_in: this.get('email_in'), email_in_allow_strangers: this.get('email_in_allow_strangers'), parent_category_id: this.get('parent_category_id'), - logo_url: this.get('logo_url'), - background_url: this.get('background_url'), + uploaded_logo_id: this.get('uploaded_logo.id'), + uploaded_background_id: this.get('uploaded_background.id'), allow_badges: this.get('allow_badges'), custom_fields: this.get('custom_fields'), topic_template: this.get('topic_template'), suppress_from_homepage: this.get('suppress_from_homepage'), + all_topics_wiki: this.get('all_topics_wiki'), allowed_tags: this.get('allowed_tags'), - allowed_tag_groups: this.get('allowed_tag_groups') + allowed_tag_groups: this.get('allowed_tag_groups'), + sort_order: this.get('sort_order'), + sort_ascending: this.get('sort_ascending'), + topic_featured_link_allowed: this.get('topic_featured_link_allowed') }, - type: this.get('id') ? 'PUT' : 'POST' + type: id ? 'PUT' : 'POST' }); }, - permissionsForUpdate: function(){ - var rval = {}; - _.each(this.get("permissions"),function(p){ - rval[p.group_name] = p.permission.id; - }); + @computed("permissions") + permissionsForUpdate(permissions) { + let rval = {}; + permissions.forEach(p => rval[p.group_name] = p.permission.id); return rval; - }.property("permissions"), - - destroy: function() { - return ajax("/categories/" + (this.get('id') || this.get('slug')), { type: 'DELETE' }); }, - addPermission: function(permission){ + destroy() { + return ajax(`/categories/${this.get('id') || this.get('slug')}`, { type: 'DELETE' }); + }, + + addPermission(permission) { this.get("permissions").addObject(permission); this.get("availableGroups").removeObject(permission.group_name); }, - - removePermission: function(permission){ + removePermission(permission) { this.get("permissions").removeObject(permission); this.get("availableGroups").addObject(permission.group_name); }, - permissions: function(){ + @computed + permissions() { return Em.A([ - {group_name: "everyone", permission: PermissionType.create({id: 1})}, - {group_name: "admins", permission: PermissionType.create({id: 2}) }, - {group_name: "crap", permission: PermissionType.create({id: 3}) } + { group_name: "everyone", permission: PermissionType.create({id: 1}) }, + { group_name: "admins", permission: PermissionType.create({id: 2}) }, + { group_name: "crap", permission: PermissionType.create({id: 3}) } ]); - }.property(), + }, - latestTopic: function(){ - var topics = this.get('topics'); + @computed("topics") + latestTopic(topics) { if (topics && topics.length) { return topics[0]; } - }.property("topics"), + }, - featuredTopics: function() { - var topics = this.get('topics'); + @computed("topics") + featuredTopics(topics) { if (topics && topics.length) { return topics.slice(0, Discourse.SiteSettings.category_featured_topics || 2); } - }.property('topics'), + }, - unreadTopics: function() { - return this.topicTrackingState.countUnread(this.get('id')); - }.property('topicTrackingState.messageCount'), + @computed("id", "topicTrackingState.messageCount") + unreadTopics(id) { + return this.topicTrackingState.countUnread(id); + }, - newTopics: function() { - return this.topicTrackingState.countNew(this.get('id')); - }.property('topicTrackingState.messageCount'), + @computed("id", "topicTrackingState.messageCount") + newTopics(id) { + return this.topicTrackingState.countNew(id); + }, - topicStatsTitle: function() { - var string = I18n.t('categories.topic_stats'); - _.each(this.get('topicCountStats'), function(stat) { - string += ' ' + I18n.t('categories.topic_stat_sentence', {count: stat.value, unit: stat.unit}); - }, this); - return string; - }.property('post_count'), - - postStatsTitle: function() { - var string = I18n.t('categories.post_stats'); - _.each(this.get('postCountStats'), function(stat) { - string += ' ' + I18n.t('categories.post_stat_sentence', {count: stat.value, unit: stat.unit}); - }, this); - return string; - }.property('post_count'), - - topicCountStats: function() { - return this.countStats('topics'); - }.property('topics_year', 'topics_month', 'topics_week', 'topics_day'), - - setNotification: function(notification_level) { - var url = "/category/" + this.get('id')+"/notifications"; + setNotification(notification_level) { this.set('notification_level', notification_level); - return ajax(url, { - data: { - notification_level: notification_level - }, - type: 'POST' - }); + const url = `/category/${this.get('id')}/notifications`; + return ajax(url, { data: { notification_level }, type: 'POST' }); }, - postCountStats: function() { - return this.countStats('posts'); - }.property('posts_year', 'posts_month', 'posts_week', 'posts_day'), - - countStats: function(prefix) { - var stats = [], val; - _.each(['day', 'week', 'month', 'year'], function(unit) { - val = this.get(prefix + '_' + unit); - if (val > 0) stats.pushObject({value: val, unit: I18n.t(unit)}); - if (stats.length === 2) return false; - }, this); - return stats; - }, - - isUncategorizedCategory: function() { - return this.get('id') === Discourse.Site.currentProp("uncategorized_category_id"); - }.property('id') + @computed("id") + isUncategorizedCategory(id) { + return id === Discourse.Site.currentProp("uncategorized_category_id"); + } }); var _uncategorized; diff --git a/app/assets/javascripts/discourse/models/composer.js.es6 b/app/assets/javascripts/discourse/models/composer.js.es6 index 738ec9d9585..bb833c7c1c7 100644 --- a/app/assets/javascripts/discourse/models/composer.js.es6 +++ b/app/assets/javascripts/discourse/models/composer.js.es6 @@ -5,6 +5,7 @@ import Quote from 'discourse/lib/quote'; import Draft from 'discourse/models/draft'; import computed from 'ember-addons/ember-computed-decorators'; import { escapeExpression, tinyAvatar } from 'discourse/lib/utilities'; +import { emojiUnescape } from 'discourse/lib/text'; const CLOSED = 'closed', SAVING = 'saving', @@ -31,13 +32,15 @@ const CLOSED = 'closed', target_usernames: 'targetUsernames', typing_duration_msecs: 'typingTime', composer_open_duration_msecs: 'composerTime', - tags: 'tags' + tags: 'tags', + featured_link: 'featuredLink' }, _edit_topic_serializer = { title: 'topic.title', categoryId: 'topic.category.id', - tags: 'topic.tags' + tags: 'topic.tags', + featuredLink: 'topic.featured_link' }; const Composer = RestModel.extend({ @@ -118,7 +121,7 @@ const Composer = RestModel.extend({ }.property().volatile(), archetype: function() { - return this.get('archetypes').findProperty('id', this.get('archetypeId')); + return this.get('archetypes').findBy('id', this.get('archetypeId')); }.property('archetypeId'), archetypeChanged: function() { @@ -135,6 +138,21 @@ const Composer = RestModel.extend({ canEditTitle: Em.computed.or('creatingTopic', 'creatingPrivateMessage', 'editingFirstPost'), canCategorize: Em.computed.and('canEditTitle', 'notCreatingPrivateMessage'), + @computed('canEditTitle', 'creatingPrivateMessage', 'categoryId') + canEditTopicFeaturedLink(canEditTitle, creatingPrivateMessage, categoryId) { + if (!this.siteSettings.topic_featured_link_enabled || !canEditTitle || creatingPrivateMessage) { return false; } + + const categoryIds = this.site.get('topic_featured_link_allowed_category_ids'); + if (!categoryId && categoryIds && + (categoryIds.indexOf(this.site.get('uncategorized_category_id')) !== -1 || !this.siteSettings.allow_uncategorized_topics)) { return true; } + return categoryIds === undefined || !categoryIds.length || categoryIds.indexOf(categoryId) !== -1; + }, + + @computed('canEditTopicFeaturedLink') + titlePlaceholder() { + return this.get('canEditTopicFeaturedLink') ? 'composer.title_or_link_placeholder' : 'composer.title_placeholder'; + }, + // Determine the appropriate title for this action actionTitle: function() { const topic = this.get('topic'); @@ -174,12 +192,11 @@ const Composer = RestModel.extend({ case REPLY: case EDIT: if (postDescription) return postDescription; - if (topic) return I18n.t('post.reply_topic', { link: topicLink }); + if (topic) return emojiUnescape(I18n.t('post.reply_topic', { link: topicLink })); } }.property('action', 'post', 'topic', 'topic.title'), - // whether to disable the post button cantSubmitPost: function() { @@ -268,11 +285,12 @@ const Composer = RestModel.extend({ } }.property('privateMessage'), - missingReplyCharacters: function() { - const postType = this.get('post.post_type'); - if (postType === this.site.get('post_types.small_action')) { return 0; } - return this.get('minimumPostLength') - this.get('replyLength'); - }.property('minimumPostLength', 'replyLength'), + @computed('minimumPostLength', 'replyLength', 'canEditTopicFeaturedLink') + missingReplyCharacters(minimumPostLength, replyLength, canEditTopicFeaturedLink) { + if (this.get('post.post_type') === this.site.get('post_types.small_action') || + canEditTopicFeaturedLink && this.get('featuredLink')) { return 0; } + return minimumPostLength - replyLength; + }, /** Minimum number of characters for a post body to be valid. @@ -378,14 +396,14 @@ const Composer = RestModel.extend({ // If the user didn't change the template, clear it if (oldCategoryId) { - const oldCat = this.site.categories.findProperty('id', oldCategoryId); + const oldCat = this.site.categories.findBy('id', oldCategoryId); if (oldCat && (oldCat.get('topic_template') === reply)) { reply = ""; } } if (!Ember.isEmpty(reply)) { return; } - const category = this.site.categories.findProperty('id', categoryId); + const category = this.site.categories.findBy('id', categoryId); if (category) { this.set('reply', category.get('topic_template') || ""); } @@ -491,6 +509,12 @@ const Composer = RestModel.extend({ save(opts) { if (!this.get('cantSubmitPost')) { + + // change category may result in some effect for topic featured link + if (!this.get('canEditTopicFeaturedLink')) { + this.set('featuredLink', null); + } + return this.get('editingPost') ? this.editPost(opts) : this.createPost(opts); } }, @@ -511,7 +535,8 @@ const Composer = RestModel.extend({ stagedPost: false, typingTime: 0, composerOpened: null, - composerTotalOpened: 0 + composerTotalOpened: 0, + featuredLink: null }); }, @@ -529,8 +554,7 @@ const Composer = RestModel.extend({ post.get('post_number') === 1 && this.get('topic.details.can_edit')) { const topicProps = this.getProperties(Object.keys(_edit_topic_serializer)); - - promise = Topic.update(this.get('topic'), topicProps); + promise = Topic.update(this.get('topic'), topicProps); } else { promise = Ember.RSVP.resolve(); } @@ -651,6 +675,11 @@ const Composer = RestModel.extend({ return result; } + // We sometimes want to hide the `reply_to_user` if the post contains a quote + if (result.responseJson && result.responseJson.post && !result.responseJson.post.reply_to_user) { + createdPost.set('reply_to_user', null); + } + if (topic) { // It's no longer a new post topic.set('draft_sequence', result.target.draft_sequence); @@ -680,6 +709,10 @@ const Composer = RestModel.extend({ }).catch(throwAjaxError(function() { if (postStream) { postStream.undoPost(createdPost); + + if (post) { + post.set('reply_count', post.get('reply_count') - 1); + } } Ember.run.next(() => composer.set('composeState', OPEN)); })); diff --git a/app/assets/javascripts/discourse/models/group-history.js.es6 b/app/assets/javascripts/discourse/models/group-history.js.es6 new file mode 100644 index 00000000000..18b644d163c --- /dev/null +++ b/app/assets/javascripts/discourse/models/group-history.js.es6 @@ -0,0 +1,9 @@ +import computed from 'ember-addons/ember-computed-decorators'; +import RestModel from 'discourse/models/rest'; + +export default RestModel.extend({ + @computed('action') + actionTitle(action) { + return I18n.t(`group_histories.actions.${action}`); + } +}); diff --git a/app/assets/javascripts/discourse/models/group.js.es6 b/app/assets/javascripts/discourse/models/group.js.es6 index b6890e82631..99c95caf61a 100644 --- a/app/assets/javascripts/discourse/models/group.js.es6 +++ b/app/assets/javascripts/discourse/models/group.js.es6 @@ -1,7 +1,10 @@ import { ajax } from 'discourse/lib/ajax'; -import computed from "ember-addons/ember-computed-decorators"; +import { default as computed, observes } from "ember-addons/ember-computed-decorators"; +import GroupHistory from 'discourse/models/group-history'; +import RestModel from 'discourse/models/rest'; +import { popupAjaxError } from 'discourse/lib/ajax-error'; -const Group = Discourse.Model.extend({ +const Group = RestModel.extend({ limit: 50, offset: 0, user_count: 0, @@ -24,12 +27,12 @@ const Group = Discourse.Model.extend({ if (userCount > 0) { return userCount; } }, - findMembers() { + findMembers(params) { if (Em.isEmpty(this.get('name'))) { return ; } const self = this, offset = Math.min(this.get("user_count"), Math.max(this.get("offset"), 0)); - return Group.loadMembers(this.get("name"), offset, this.get("limit")).then(function (result) { + return Group.loadMembers(this.get("name"), offset, this.get("limit"), params).then(function (result) { var ownerIds = {}; result.owners.forEach(owner => ownerIds[owner.id] = true); @@ -90,6 +93,33 @@ const Group = Discourse.Model.extend({ }); }, + @computed('flair_bg_color') + flairBackgroundHexColor() { + return this.get('flair_bg_color') ? this.get('flair_bg_color').replace(new RegExp("[^0-9a-fA-F]", "g"), "") : null; + }, + + @computed('flair_color') + flairHexColor() { + return this.get('flair_color') ? this.get('flair_color').replace(new RegExp("[^0-9a-fA-F]", "g"), "") : null; + }, + + @computed('alias_level') + canEveryoneMention(aliasLevel) { + return aliasLevel === '99'; + }, + + @observes("visible", "canEveryoneMention") + _updateAllowMembershipRequests() { + if (!this.get('visible') || !this.get('canEveryoneMention')) { + this.set ('allow_membership_requests', false); + } + }, + + @observes("visible") + _updatePublic() { + if (!this.get('visible')) this.set('public', false); + }, + asJSON() { return { name: this.get('name'), @@ -101,18 +131,31 @@ const Group = Discourse.Model.extend({ primary_group: !!this.get('primary_group'), grant_trust_level: this.get('grant_trust_level'), incoming_email: this.get("incoming_email"), + flair_url: this.get('flair_url'), + flair_bg_color: this.get('flairBackgroundHexColor'), + flair_color: this.get('flairHexColor'), + bio_raw: this.get('bio_raw'), + public: this.get('public'), + allow_membership_requests: this.get('allow_membership_requests'), + full_name: this.get('full_name') }; }, create() { var self = this; - return ajax("/admin/groups", { type: "POST", data: this.asJSON() }).then(function(resp) { + return ajax("/admin/groups", { type: "POST", data: { group: this.asJSON() } }).then(function(resp) { self.set('id', resp.basic_group.id); }); }, save() { - return ajax("/admin/groups/" + this.get('id'), { type: "PUT", data: this.asJSON() }); + const id = this.get('id'); + const url = this.get('is_group_owner') ? `/groups/${id}` : `/admin/groups/${id}`; + + return ajax(url, { + type: "PUT", + data: { group: this.asJSON() } + }); }, destroy() { @@ -120,6 +163,15 @@ const Group = Discourse.Model.extend({ return ajax("/admin/groups/" + this.get('id'), { type: "DELETE" }); }, + findLogs(offset, filters) { + return ajax(`/groups/${this.get('name')}/logs.json`, { data: { offset, filters } }).then(results => { + return Ember.Object.create({ + logs: results["logs"].map(log => GroupHistory.create(log)), + all_loaded: results["all_loaded"] + }); + }); + }, + findPosts(opts) { opts = opts || {}; @@ -138,12 +190,12 @@ const Group = Discourse.Model.extend({ }, setNotification(notification_level) { - this.set("notification_level", notification_level); + this.set("group_user.notification_level", notification_level); return ajax(`/groups/${this.get("name")}/notifications`, { data: { notification_level }, type: "POST" }); - }, + } }); Group.reopenClass({ @@ -153,22 +205,26 @@ Group.reopenClass({ }); }, - findGroupCounts(name) { - return ajax("/groups/" + name + "/counts.json").then(result => Em.Object.create(result.counts)); - }, - find(name) { return ajax("/groups/" + name + ".json").then(result => Group.create(result.basic_group)); }, - loadMembers(name, offset, limit) { + loadOwners(name) { + return ajax('/groups/' + name + '/owners.json').catch(popupAjaxError); + }, + + loadMembers(name, offset, limit, params) { return ajax('/groups/' + name + '/members.json', { - data: { + data: _.extend({ limit: limit || 50, offset: offset || 0 - } + }, params || {}) }); - } + }, + + mentionable(name) { + return ajax(`/groups/${name}/mentionable`, { data: { name } }); + }, }); export default Group; diff --git a/app/assets/javascripts/discourse/models/login-method.js.es6 b/app/assets/javascripts/discourse/models/login-method.js.es6 index 254c401cf94..c125e7bd831 100644 --- a/app/assets/javascripts/discourse/models/login-method.js.es6 +++ b/app/assets/javascripts/discourse/models/login-method.js.es6 @@ -22,7 +22,7 @@ const LoginMethod = Ember.Object.extend({ let methods; let preRegister; -export function findAll(siteSettings) { +export function findAll(siteSettings, capabilities, isMobileDevice) { if (methods) { return methods; } methods = []; @@ -34,7 +34,9 @@ export function findAll(siteSettings) { params.frameWidth = 850; params.frameHeight = 500; } else if (name === "facebook") { - params.frameHeight = 450; + params.frameWidth= 580; + params.frameHeight = 400; + params.displayPopup = true; } params.siteSettings = siteSettings; @@ -55,6 +57,12 @@ export function findAll(siteSettings) { }); preRegister = undefined; } + + // On Mobile, Android or iOS always go with full screen + if (isMobileDevice || capabilities.isIOS || capabilities.isAndroid) { + methods.forEach(m=>m.set("fullScreenLogin", true)); + } + return methods; } diff --git a/app/assets/javascripts/discourse/models/nav-item.js.es6 b/app/assets/javascripts/discourse/models/nav-item.js.es6 index 7eb1616485b..d28b6728345 100644 --- a/app/assets/javascripts/discourse/models/nav-item.js.es6 +++ b/app/assets/javascripts/discourse/models/nav-item.js.es6 @@ -29,7 +29,7 @@ const NavItem = Discourse.Model.extend({ categorySlug: function() { var split = this.get('name').split('/'); if (split[0] === 'category' && split[1]) { - var cat = Discourse.Site.current().categories.findProperty('nameLower', split[1].toLowerCase()); + var cat = Discourse.Site.current().categories.findBy('nameLower', split[1].toLowerCase()); return cat ? Discourse.Category.slugFor(cat) : null; } return null; @@ -86,9 +86,9 @@ NavItem.reopenClass({ testName = name.split("/")[0], anonymous = !Discourse.User.current(); - if (anonymous && !Discourse.Site.currentProp('anonymous_top_menu_items').contains(testName)) return null; + if (anonymous && !Discourse.Site.currentProp('anonymous_top_menu_items').includes(testName)) return null; if (!Discourse.Category.list() && testName === "categories") return null; - if (!Discourse.Site.currentProp('top_menu_items').contains(testName)) return null; + if (!Discourse.Site.currentProp('top_menu_items').includes(testName)) return null; var args = { name: name, hasIcon: name === "unread" }, extra = null, self = this; if (opts.category) { args.category = opts.category; } diff --git a/app/assets/javascripts/discourse/models/post-stream.js.es6 b/app/assets/javascripts/discourse/models/post-stream.js.es6 index a96f0e0248a..32cfa6427f7 100644 --- a/app/assets/javascripts/discourse/models/post-stream.js.es6 +++ b/app/assets/javascripts/discourse/models/post-stream.js.es6 @@ -59,7 +59,7 @@ export default RestModel.extend({ @computed('hasLoadedData', 'firstPostId', 'posts.[]') firstPostPresent(hasLoadedData, firstPostId) { if (!hasLoadedData) { return false; } - return !!this.get('posts').findProperty('id', firstPostId); + return !!this.get('posts').findBy('id', firstPostId); }, firstPostNotLoaded: Ember.computed.not('firstPostPresent'), @@ -71,7 +71,7 @@ export default RestModel.extend({ if (!hasLoadedData) { return false; } if (lastPostId === -1) { return true; } - return !!this.get('posts').findProperty('id', lastPostId); + return !!this.get('posts').findBy('id', lastPostId); }, lastPostNotLoaded: Ember.computed.not('loadedAllPosts'), @@ -80,11 +80,10 @@ export default RestModel.extend({ Returns a JS Object of current stream filter options. It should match the query params for the stream. **/ - @computed('summary', 'show_deleted', 'userFilters.[]') - streamFilters(summary, showDeleted) { + @computed('summary', 'userFilters.[]') + streamFilters(summary) { const result = {}; if (summary) { result.filter = "summary"; } - if (showDeleted) { result.show_deleted = true; } const userFilters = this.get('userFilters'); if (!Ember.isEmpty(userFilters)) { @@ -141,7 +140,6 @@ export default RestModel.extend({ cancelFilter() { this.set('summary', false); - this.set('show_deleted', false); this.get('userFilters').clear(); }, @@ -156,11 +154,6 @@ export default RestModel.extend({ }); }, - toggleDeleted() { - this.toggleProperty('show_deleted'); - return this.refresh(); - }, - jumpToSecondVisible() { const posts = this.get('posts'); if (posts.length > 1) { @@ -173,10 +166,9 @@ export default RestModel.extend({ toggleParticipant(username) { const userFilters = this.get('userFilters'); this.set('summary', false); - this.set('show_deleted', true); let jump = false; - if (userFilters.contains(username)) { + if (userFilters.includes(username)) { userFilters.removeObject(username); } else { userFilters.addObject(username); @@ -208,7 +200,7 @@ export default RestModel.extend({ if (opts.forceLoad) { this.set('loaded', false); } else { - const postWeWant = this.get('posts').findProperty('post_number', opts.nearPost); + const postWeWant = this.get('posts').findBy('post_number', opts.nearPost); if (postWeWant) { return Ember.RSVP.resolve(); } } @@ -264,7 +256,7 @@ export default RestModel.extend({ return this.findPostsByIds(gap).then(posts => { posts.forEach(p => { const stored = this.storePost(p); - if (!currentPosts.contains(stored)) { + if (!currentPosts.includes(stored)) { currentPosts.insertAt(postIdx++, stored); } }); @@ -418,7 +410,7 @@ export default RestModel.extend({ if (stored) { const posts = this.get('posts'); - if (!posts.contains(stored)) { + if (!posts.includes(stored)) { if (!this.get('loadingBelow')) { this.get('postsWithPlaceholders').appendPost(() => posts.pushObject(stored)); } else { @@ -736,6 +728,68 @@ export default RestModel.extend({ }); }, + backfillExcerpts(streamPosition){ + this._excerpts = this._excerpts || []; + const stream = this.get('stream'); + + this._excerpts.loadNext = streamPosition; + + if (this._excerpts.loading) { + return this._excerpts.loading.then(()=>{ + if(!this._excerpts[stream[streamPosition]]) { + + if (this._excerpts.loadNext === streamPosition) { + return this.backfillExcerpts(streamPosition); + } + } + }); + } + + + let postIds = stream.slice(Math.max(streamPosition-20,0), streamPosition+20); + + for(let i=postIds.length-1;i>=0;i--) { + if (this._excerpts[postIds[i]]) { + postIds.splice(i,1); + } + } + + let data = { + post_ids: postIds + }; + + this._excerpts.loading = ajax("/t/" + this.get('topic.id') + "/excerpts.json", {data}) + .then(excerpts => { + excerpts.forEach(obj => { + this._excerpts[obj.post_id] = obj; + }); + }) + .finally(()=>{ this._excerpts.loading = null; }); + + return this._excerpts.loading; + }, + + excerpt(streamPosition){ + + const stream = this.get('stream'); + + return new Ember.RSVP.Promise((resolve,reject) => { + + let excerpt = this._excerpts && this._excerpts[stream[streamPosition]]; + + if(excerpt) { + resolve(excerpt); + return; + } + + this.backfillExcerpts(streamPosition) + .then(()=>{ + resolve(this._excerpts[stream[streamPosition]]); + }) + .catch(e => reject(e)); + }); + }, + indexOf(post) { return this.get('stream').indexOf(post.get('id')); }, diff --git a/app/assets/javascripts/discourse/models/post.js.es6 b/app/assets/javascripts/discourse/models/post.js.es6 index 7e96dc3ba11..b15683ca4a4 100644 --- a/app/assets/javascripts/discourse/models/post.js.es6 +++ b/app/assets/javascripts/discourse/models/post.js.es6 @@ -76,7 +76,7 @@ const Post = RestModel.extend({ internalLinks: function() { if (Ember.isEmpty(this.get('link_counts'))) return null; - return this.get('link_counts').filterProperty('internal').filterProperty('title'); + return this.get('link_counts').filterBy('internal').filterBy('title'); }.property('link_counts.@each.internal'), flagsAvailable: function() { diff --git a/app/assets/javascripts/discourse/models/site.js.es6 b/app/assets/javascripts/discourse/models/site.js.es6 index eb417c74290..5b421c46bee 100644 --- a/app/assets/javascripts/discourse/models/site.js.es6 +++ b/app/assets/javascripts/discourse/models/site.js.es6 @@ -20,7 +20,7 @@ const Site = RestModel.extend({ flagTypes() { const postActionTypes = this.get('post_action_types'); if (!postActionTypes) return []; - return postActionTypes.filterProperty('is_flag', true); + return postActionTypes.filterBy('is_flag', true); }, topicCountDesc: ['topic_count:desc'], @@ -64,7 +64,7 @@ const Site = RestModel.extend({ removeCategory(id) { const categories = this.get('categories'); - const existingCategory = categories.findProperty('id', id); + const existingCategory = categories.findBy('id', id); if (existingCategory) { categories.removeObject(existingCategory); delete this.get('categoriesById').categoryId; @@ -74,7 +74,7 @@ const Site = RestModel.extend({ updateCategory(newCategory) { const categories = this.get('categories'); const categoryId = Em.get(newCategory, 'id'); - const existingCategory = categories.findProperty('id', categoryId); + const existingCategory = categories.findBy('id', categoryId); // Don't update null permissions if (newCategory.permission === null) { delete newCategory.permission; } diff --git a/app/assets/javascripts/discourse/models/store.js.es6 b/app/assets/javascripts/discourse/models/store.js.es6 index 1dd6ee2a1f0..753f2dd5abf 100644 --- a/app/assets/javascripts/discourse/models/store.js.es6 +++ b/app/assets/javascripts/discourse/models/store.js.es6 @@ -1,6 +1,7 @@ import { ajax } from 'discourse/lib/ajax'; import RestModel from 'discourse/models/rest'; import ResultSet from 'discourse/models/result-set'; +import { getRegister } from 'discourse-common/lib/get-owner'; let _identityMap; @@ -41,6 +42,11 @@ export default Ember.Object.extend({ _plurals: {'post-reply': 'post-replies', 'post-reply-history': 'post_reply_histories'}, + init() { + this._super(); + this.register = this.register || getRegister(this); + }, + pluralize(thing) { return this._plurals[thing] || thing + "s"; }, @@ -49,9 +55,9 @@ export default Ember.Object.extend({ this._plurals[thing] = plural; }, - findAll(type) { + findAll(type, findArgs) { const self = this; - return this.adapterFor(type).findAll(this, type).then(function(result) { + return this.adapterFor(type).findAll(this, type, findArgs).then(function(result) { return self._resultSet(type, result); }); }, @@ -196,11 +202,11 @@ export default Ember.Object.extend({ obj.__state = obj.id ? "created" : "new"; // TODO: Have injections be automatic - obj.topicTrackingState = this.container.lookup('topic-tracking-state:main'); - obj.keyValueStore = this.container.lookup('key-value-store:main'); - obj.siteSettings = this.container.lookup('site-settings:main'); + obj.topicTrackingState = this.register.lookup('topic-tracking-state:main'); + obj.keyValueStore = this.register.lookup('key-value-store:main'); + obj.siteSettings = this.register.lookup('site-settings:main'); - const klass = this.container.lookupFactory('model:' + type) || RestModel; + const klass = this.register.lookupFactory('model:' + type) || RestModel; const model = klass.create(obj); storeMap(type, obj.id, model); @@ -208,7 +214,7 @@ export default Ember.Object.extend({ }, adapterFor(type) { - return this.container.lookup('adapter:' + type) || this.container.lookup('adapter:rest'); + return this.register.lookup('adapter:' + type) || this.register.lookup('adapter:rest'); }, _lookupSubType(subType, type, id, root) { @@ -287,7 +293,7 @@ export default Ember.Object.extend({ if (existing) { delete obj.id; - const klass = this.container.lookupFactory('model:' + type) || RestModel; + const klass = this.register.lookupFactory('model:' + type) || RestModel; existing.setProperties(klass.munge(obj)); obj.id = id; return existing; diff --git a/app/assets/javascripts/discourse/models/tag-group.js.es6 b/app/assets/javascripts/discourse/models/tag-group.js.es6 index f27adad26b4..cfbd83e1640 100644 --- a/app/assets/javascripts/discourse/models/tag-group.js.es6 +++ b/app/assets/javascripts/discourse/models/tag-group.js.es6 @@ -9,9 +9,10 @@ const TagGroup = RestModel.extend({ }, save() { - var url = "/tag_groups", - self = this; - if (this.get('id')) { + let url = "/tag_groups"; + const self = this, + isNew = this.get('id') === 'new'; + if (!isNew) { url = "/tag_groups/" + this.get('id'); } @@ -25,9 +26,11 @@ const TagGroup = RestModel.extend({ parent_tag_name: this.get('parent_tag_name') ? this.get('parent_tag_name') : undefined, one_per_topic: this.get('one_per_topic') }, - type: this.get('id') ? 'PUT' : 'POST' + type: isNew ? 'POST' : 'PUT' }).then(function(result) { - if(result.id) { self.set('id', result.id); } + if(result.tag_group && result.tag_group.id) { + self.set('id', result.tag_group.id); + } self.set('savingStatus', I18n.t('saved')); self.set('saving', false); }); diff --git a/app/assets/javascripts/discourse/models/topic-details.js.es6 b/app/assets/javascripts/discourse/models/topic-details.js.es6 index 25714b0c4b4..72ef0d0fe9d 100644 --- a/app/assets/javascripts/discourse/models/topic-details.js.es6 +++ b/app/assets/javascripts/discourse/models/topic-details.js.es6 @@ -72,7 +72,7 @@ const TopicDetails = RestModel.extend({ type: 'PUT', data: { name: name } }).then(() => { - groups.removeObject(groups.findProperty('name', name)); + groups.removeObject(groups.findBy('name', name)); }); }, @@ -84,7 +84,7 @@ const TopicDetails = RestModel.extend({ type: 'PUT', data: { username: username } }).then(() => { - users.removeObject(users.findProperty('username', username)); + users.removeObject(users.findBy('username', username)); }); } }); diff --git a/app/assets/javascripts/discourse/models/topic-list.js.es6 b/app/assets/javascripts/discourse/models/topic-list.js.es6 index 4e547619d13..6c90b31ab3c 100644 --- a/app/assets/javascripts/discourse/models/topic-list.js.es6 +++ b/app/assets/javascripts/discourse/models/topic-list.js.es6 @@ -2,27 +2,6 @@ import { ajax } from 'discourse/lib/ajax'; import RestModel from 'discourse/models/rest'; import Model from 'discourse/models/model'; -function topicsFrom(result, store) { - if (!result) { return; } - - // Stitch together our side loaded data - const categories = Discourse.Category.list(), - users = Model.extractByKey(result.users, Discourse.User); - - return result.topic_list.topics.map(function (t) { - t.category = categories.findBy('id', t.category_id); - t.posters.forEach(function(p) { - p.user = users[p.user_id]; - }); - if (t.participants) { - t.participants.forEach(function(p) { - p.user = users[p.user_id]; - }); - } - return store.createRecord('topic', t); - }); -} - const TopicList = RestModel.extend({ canLoadMore: Em.computed.notEmpty("more_topics_url"), @@ -66,8 +45,8 @@ const TopicList = RestModel.extend({ if (result) { // the new topics loaded from the server - const newTopics = topicsFrom(result, store), - topics = self.get("topics"); + const newTopics = TopicList.topicsFrom(store, result); + const topics = self.get("topics"); self.forEachNew(newTopics, function(t) { t.set('highlight', topicsAdded++ === 0); @@ -103,7 +82,7 @@ const TopicList = RestModel.extend({ return ajax({ url }).then(result => { let i = 0; - topicList.forEachNew(topicsFrom(result, store), function(t) { + topicList.forEachNew(TopicList.topicsFrom(store, result), function(t) { // highlight the first of the new topics so we can get a visual feedback t.set('highlight', true); topics.insertAt(i,t); @@ -115,6 +94,26 @@ const TopicList = RestModel.extend({ }); TopicList.reopenClass({ + topicsFrom(store, result) { + if (!result) { return; } + + // Stitch together our side loaded data + const categories = Discourse.Category.list(), + users = Model.extractByKey(result.users, Discourse.User); + + return result.topic_list.topics.map(function (t) { + t.category = categories.findBy('id', t.category_id); + t.posters.forEach(function(p) { + p.user = users[p.user_id]; + }); + if (t.participants) { + t.participants.forEach(function(p) { + p.user = users[p.user_id]; + }); + } + return store.createRecord('topic', t); + }); + }, munge(json, store) { json.inserted = json.inserted || []; @@ -126,7 +125,7 @@ TopicList.reopenClass({ json.for_period = json.topic_list.for_period; json.loaded = true; json.per_page = json.topic_list.per_page; - json.topics = topicsFrom(json, store); + json.topics = this.topicsFrom(store, json); return json; }, diff --git a/app/assets/javascripts/discourse/models/topic.js.es6 b/app/assets/javascripts/discourse/models/topic.js.es6 index 712a1b3690a..139b2ddcf7a 100644 --- a/app/assets/javascripts/discourse/models/topic.js.es6 +++ b/app/assets/javascripts/discourse/models/topic.js.es6 @@ -39,7 +39,7 @@ const Topic = RestModel.extend({ @computed('posters.[]') lastPoster(posters) { - var user; + let user; if (posters && posters.length > 0) { const latest = posters.filter(p => p.extras && p.extras.indexOf("latest") >= 0)[0]; user = latest && latest.user; @@ -50,8 +50,8 @@ const Topic = RestModel.extend({ @computed('fancy_title') fancyTitle(title) { // TODO: `siteSettings` should always be present, but there are places in the code - // that call Discourse.Topic.create instead of using the store. When the store is - // used, remove this. + // that call Discourse.Topic.create instead of using the store. + // When the store is used, remove this. const siteSettings = this.siteSettings || Discourse.SiteSettings; return censor(emojiUnescape(title || ""), siteSettings.censored_words); }, @@ -120,7 +120,7 @@ const Topic = RestModel.extend({ const categoryName = this.get('categoryName'); let category; if (categoryName) { - category = Discourse.Category.list().findProperty('name', categoryName); + category = Discourse.Category.list().findBy('name', categoryName); } this.set('category', category); }.observes('categoryName'), @@ -134,6 +134,11 @@ const Topic = RestModel.extend({ return this.get('url') + (user ? '?u=' + user.get('username_lower') : ''); }.property('url'), + @computed('url') + printUrl(url) { + return url + '/print'; + }, + url: function() { let slug = this.get('slug') || ''; if (slug.trim().length === 0) { @@ -208,7 +213,7 @@ const Topic = RestModel.extend({ }.property('views'), archetypeObject: function() { - return Discourse.Site.currentProp('archetypes').findProperty('id', this.get('archetype')); + return Discourse.Site.currentProp('archetypes').findBy('id', this.get('archetype')); }.property('archetype'), isPrivateMessage: Em.computed.equal('archetype', 'private_message'), @@ -551,7 +556,6 @@ Topic.reopenClass({ opts.userFilters.forEach(function(username) { data.username_filters.push(username); }); - data.show_deleted = true; } // Add the summary of filter if we have it diff --git a/app/assets/javascripts/discourse/models/user-action.js.es6 b/app/assets/javascripts/discourse/models/user-action.js.es6 index 024089799ae..ebc4be7381b 100644 --- a/app/assets/javascripts/discourse/models/user-action.js.es6 +++ b/app/assets/javascripts/discourse/models/user-action.js.es6 @@ -76,9 +76,9 @@ const UserAction = RestModel.extend({ return targetUsername === Discourse.User.currentProp('username'); }, - presentName: Em.computed.any('name', 'username'), - targetDisplayName: Em.computed.any('target_name', 'target_username'), - actingDisplayName: Em.computed.any('acting_name', 'acting_username'), + presentName: Ember.computed.or('name', 'username'), + targetDisplayName: Ember.computed.or('target_name', 'target_username'), + actingDisplayName: Ember.computed.or('acting_name', 'acting_username'), targetUserUrl: url('target_username', '/users/%@'), @computed("username") diff --git a/app/assets/javascripts/discourse/models/user-stream.js.es6 b/app/assets/javascripts/discourse/models/user-stream.js.es6 index 49c02b4e61e..fc80dc94ef7 100644 --- a/app/assets/javascripts/discourse/models/user-stream.js.es6 +++ b/app/assets/javascripts/discourse/models/user-stream.js.es6 @@ -28,11 +28,21 @@ export default RestModel.extend({ baseUrl: url('itemsLoaded', 'user.username_lower', '/user_actions.json?offset=%@&username=%@'), - filterBy(filter) { - this.setProperties({ filter, itemsLoaded: 0, content: [], lastLoadedUrl: null }); + filterBy(filter, noContentHelpKey) { + this.setProperties({ + filter, + itemsLoaded: 0, + content: [], + noContentHelpKey: noContentHelpKey, + lastLoadedUrl: null + }); return this.findItems(); }, + noContent: function() { + return this.get('loaded') && this.get('content').length === 0; + }.property('loaded', 'content.@each'), + remove(userAction) { // 1) remove the user action from the child groups this.get("content").forEach(function (ua) { @@ -61,6 +71,9 @@ export default RestModel.extend({ if (this.get('filterParam')) { findUrl += "&filter=" + this.get('filterParam'); } + if (this.get('noContentHelpKey')) { + findUrl += "&no_results_help_key=" + this.get('noContentHelpKey'); + } // Don't load the same stream twice. We're probably at the end. const lastLoadedUrl = this.get('lastLoadedUrl'); @@ -69,6 +82,9 @@ export default RestModel.extend({ if (this.get('loading')) { return Ember.RSVP.resolve(); } this.set('loading', true); return ajax(findUrl, {cache: 'false'}).then( function(result) { + if (result && result.no_results_help) { + self.set('noContentHelp', result.no_results_help); + } if (result && result.user_actions) { const copy = Em.A(); result.user_actions.forEach(function(action) { @@ -78,11 +94,11 @@ export default RestModel.extend({ self.get('content').pushObjects(UserAction.collapseStream(copy)); self.setProperties({ - loaded: true, itemsLoaded: self.get('itemsLoaded') + result.user_actions.length }); } }).finally(function() { + self.set('loaded', true); self.set('loading', false); self.set('lastLoadedUrl', findUrl); }); diff --git a/app/assets/javascripts/discourse/models/user.js.es6 b/app/assets/javascripts/discourse/models/user.js.es6 index 932454aa07c..d4e24f5af83 100644 --- a/app/assets/javascripts/discourse/models/user.js.es6 +++ b/app/assets/javascripts/discourse/models/user.js.es6 @@ -14,6 +14,7 @@ import Group from 'discourse/models/group'; import Topic from 'discourse/models/topic'; import { emojiUnescape } from 'discourse/lib/text'; import PreloadStore from 'preload-store'; +import { defaultHomepage } from 'discourse/lib/utilities'; const User = RestModel.extend({ @@ -63,7 +64,7 @@ const User = RestModel.extend({ @computed('profile_background') profileBackground(bgUrl) { - if (Em.isEmpty(bgUrl) || !Discourse.SiteSettings.allow_profile_backgrounds) { return; } + if (Em.isEmpty(bgUrl) || !Discourse.SiteSettings.allow_profile_backgrounds) { return "".htmlSafe(); } return ('background-image: url(' + Discourse.getURLWithCDN(bgUrl) + ')').htmlSafe(); }, @@ -73,6 +74,46 @@ const User = RestModel.extend({ return Discourse.getURL(`/users/${this.get('username_lower')}`); }, + @computed() + userApiKeys() { + const keys = this.get('user_api_keys'); + if (keys) { + return keys.map((raw)=>{ + let obj = Em.Object.create( + raw + ); + + obj.revoke = () => { + this.revokeApiKey(obj); + }; + + obj.undoRevoke = () => { + this.undoRevokeApiKey(obj); + }; + + return obj; + }); + } + }, + + revokeApiKey(key) { + return ajax("/user-api-key/revoke", { + type: 'POST', + data: { id: key.get('id') } + }).then(()=>{ + key.set('revoked', true); + }); + }, + + undoRevokeApiKey(key){ + return ajax("/user-api-key/undo-revoke", { + type: 'POST', + data: { id: key.get('id') } + }).then(()=>{ + key.set('revoked', false); + }); + }, + pmPath(topic) { const userId = this.get('id'); const username = this.get('username_lower'); @@ -95,9 +136,15 @@ const User = RestModel.extend({ adminPath: url('id', 'username_lower', "/admin/users/%@1/%@2"), - mutedTopicsPath: url('/latest?state=muted'), + @computed() + mutedTopicsPath() { + return defaultHomepage() === "latest" ? Discourse.getURL('/?state=muted') : Discourse.getURL('/latest?state=muted'); + }, - watchingTopicsPath: url('/latest?state=watching'), + @computed() + watchingTopicsPath() { + return defaultHomepage() === "latest" ? Discourse.getURL('/?state=watching') : Discourse.getURL('/latest?state=watching'); + }, @computed("username") username_lower(username) { @@ -106,7 +153,7 @@ const User = RestModel.extend({ @computed("trust_level") trustLevel(trustLevel) { - return Discourse.Site.currentProp('trustLevels').findProperty('id', parseInt(trustLevel, 10)); + return Discourse.Site.currentProp('trustLevels').findBy('id', parseInt(trustLevel, 10)); }, isBasic: Em.computed.equal('trust_level', 0), @@ -116,6 +163,11 @@ const User = RestModel.extend({ isSuspended: Em.computed.equal('suspended', true), + @computed("previous_visit_at") + previousVisitAt(previous_visit_at) { + return new Date(previous_visit_at); + }, + @computed("suspended_till") suspended(suspendedTill) { return suspendedTill && moment(suspendedTill).isAfter(); @@ -159,7 +211,8 @@ const User = RestModel.extend({ 'muted_tags', 'tracked_tags', 'watched_tags', - 'watching_first_post_tags'); + 'watching_first_post_tags', + 'date_of_birth'); ['email_always', 'mailing_list_mode', @@ -177,6 +230,7 @@ const User = RestModel.extend({ 'digest_after_minutes', 'new_topic_duration_minutes', 'auto_track_topics_after_msecs', + 'notification_level_when_replying', 'like_notification_frequency', 'include_tl0_in_digests' ].forEach(s => { @@ -200,7 +254,7 @@ const User = RestModel.extend({ // TODO: We can remove this when migrated fully to rest model. this.set('isSaving', true); - return ajax(`/users/${this.get('username_lower')}`, { + return ajax(`/users/${this.get('username_lower')}.json`, { data: data, type: 'PUT' }).then(result => { @@ -269,7 +323,7 @@ const User = RestModel.extend({ @computed("stats.@each.isPM") statsExcludingPms() { if (Ember.isEmpty(this.get('stats'))) return []; - return this.get('stats').rejectProperty('isPM'); + return this.get('stats').rejectBy('isPM'); }, findDetails(options) { @@ -287,7 +341,15 @@ const User = RestModel.extend({ } if (!Em.isEmpty(json.user.groups)) { - json.user.groups = json.user.groups.map(g => Group.create(g)); + const groups = []; + + for(let i = 0; i < json.user.groups.length; i++) { + const group = Group.create(json.user.groups[i]); + group.group_user = json.user.group_users[i]; + groups.push(group); + } + + json.user.groups = groups; } if (json.user.invited_by) { @@ -472,12 +534,12 @@ User.reopenClass(Singleton, { action_type: UserAction.TYPES.replies }); - stats.filterProperty('isResponse').forEach(stat => { + stats.filterBy('isResponse').forEach(stat => { responses.set('count', responses.get('count') + stat.get('count')); }); const result = Em.A(); - result.pushObjects(stats.rejectProperty('isResponse')); + result.pushObjects(stats.rejectBy('isResponse')); let insertAt = 0; result.forEach((item, index) => { diff --git a/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 b/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 index 04729de959f..51849ef4025 100644 --- a/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 +++ b/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 @@ -7,7 +7,6 @@ import DiscourseLocation from 'discourse/lib/discourse-location'; import SearchService from 'discourse/services/search'; import { startTracking, default as TopicTrackingState } from 'discourse/models/topic-tracking-state'; import ScreenTrack from 'discourse/lib/screen-track'; -import TopicFooterButtons from 'discourse/components/topic-footer-buttons'; function inject() { const app = arguments[0], @@ -18,7 +17,7 @@ function inject() { } function injectAll(app, name) { - inject(app, name, 'controller', 'component', 'route', 'view', 'model', 'adapter'); + inject(app, name, 'controller', 'component', 'route', 'model', 'adapter'); } export default { @@ -63,7 +62,9 @@ export default { app.register('screen-track:main', screenTrack, { instantiate: false }); inject(app, 'screenTrack', 'component', 'route'); - inject(app, 'currentUser', 'component', 'route', 'controller'); + if (currentUser) { + inject(app, 'currentUser', 'component', 'route', 'controller'); + } app.register('location:discourse-location', DiscourseLocation); @@ -71,13 +72,6 @@ export default { app.register('key-value-store:main', keyValueStore, { instantiate: false }); injectAll(app, 'keyValueStore'); - Discourse.TopicFooterButtonsView = { - reopen(obj) { - Ember.warn('`Discourse.TopicFooterButtonsView` is deprecated. Use the `topic-footer-buttons` component instead'); - TopicFooterButtons.reopen(obj); - } - }; - startTracking(topicTrackingState); } }; diff --git a/app/assets/javascripts/discourse/pre-initializers/map-routes.js.es6 b/app/assets/javascripts/discourse/pre-initializers/map-routes.js.es6 index e3492014424..e0736bca581 100644 --- a/app/assets/javascripts/discourse/pre-initializers/map-routes.js.es6 +++ b/app/assets/javascripts/discourse/pre-initializers/map-routes.js.es6 @@ -1,4 +1,4 @@ -import { mapRoutes } from 'discourse/router'; +import { mapRoutes } from 'discourse/mapping-router'; export default { name: "map-routes", @@ -10,7 +10,7 @@ export default { // HACK to fix: https://github.com/emberjs/ember.js/issues/10310 const originalBuildInstance = originalBuildInstance || Ember.Application.prototype.buildInstance; Ember.Application.prototype.buildInstance = function() { - this.registry = this.buildRegistry(); + this.buildRegistry(); return originalBuildInstance.apply(this); }; } diff --git a/app/assets/javascripts/discourse/pre-initializers/sniff-capabilities.js.es6 b/app/assets/javascripts/discourse/pre-initializers/sniff-capabilities.js.es6 index 9a409fcc827..50bd993956b 100644 --- a/app/assets/javascripts/discourse/pre-initializers/sniff-capabilities.js.es6 +++ b/app/assets/javascripts/discourse/pre-initializers/sniff-capabilities.js.es6 @@ -1,4 +1,4 @@ -/*global Modernizr:true*/ +/*global Modernizr:true safari:true*/ // Initializes an object that lets us know about our capabilities. export default { @@ -20,7 +20,7 @@ export default { caps.isOpera = !!window.opera || ua.indexOf(' OPR/') >= 0; caps.isFirefox = typeof InstallTrigger !== 'undefined'; - caps.isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0; + caps.isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0 || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || safari.pushNotification); caps.isChrome = !!window.chrome && !caps.isOpera; caps.canPasteImages = caps.isChrome || caps.isFirefox; } diff --git a/app/assets/javascripts/discourse/views/list/post-count-or-badges.js.es6 b/app/assets/javascripts/discourse/raw-views/list/post-count-or-badges.js.es6 similarity index 100% rename from app/assets/javascripts/discourse/views/list/post-count-or-badges.js.es6 rename to app/assets/javascripts/discourse/raw-views/list/post-count-or-badges.js.es6 diff --git a/app/assets/javascripts/discourse/raw-views/list/posts-count-column.js.es6 b/app/assets/javascripts/discourse/raw-views/list/posts-count-column.js.es6 new file mode 100644 index 00000000000..e61e1b9c081 --- /dev/null +++ b/app/assets/javascripts/discourse/raw-views/list/posts-count-column.js.es6 @@ -0,0 +1,33 @@ +import computed from 'ember-addons/ember-computed-decorators'; +import { fmt } from 'discourse/lib/computed'; + +export default Ember.Object.extend({ + tagName: "td", + + @computed("topic.like_count", "topic.posts_count") + ratio(likeCount, postCount) { + const likes = parseFloat(likeCount); + const posts = parseFloat(postCount); + + if (posts < 10) { return 0; } + + return (likes || 0) / posts; + }, + + @computed("topic.replyCount", "ratioText") + title(count, ratio) { + return I18n.messageFormat('posts_likes_MF', { count, ratio }).trim(); + }, + + @computed("ratio") + ratioText(ratio) { + const settings = this.siteSettings; + if (ratio > settings.topic_post_like_heat_high) { return 'high'; } + if (ratio > settings.topic_post_like_heat_medium) { return 'med'; } + if (ratio > settings.topic_post_like_heat_low) { return 'low'; } + return ''; + }, + + likesHeat: fmt('ratioText', 'heatmap-%@'), +}); + diff --git a/app/assets/javascripts/discourse/raw-views/list/visited-line.js.es6 b/app/assets/javascripts/discourse/raw-views/list/visited-line.js.es6 new file mode 100644 index 00000000000..0f07c3bb59a --- /dev/null +++ b/app/assets/javascripts/discourse/raw-views/list/visited-line.js.es6 @@ -0,0 +1,5 @@ +export default Ember.Object.extend({ + isLastVisited: function(){ + return (this.get('lastVisitedTopic') === this.get('topic')); + }.property() +}); diff --git a/app/assets/javascripts/discourse/views/topic-list-header-column.js.es6 b/app/assets/javascripts/discourse/raw-views/topic-list-header-column.js.es6 similarity index 99% rename from app/assets/javascripts/discourse/views/topic-list-header-column.js.es6 rename to app/assets/javascripts/discourse/raw-views/topic-list-header-column.js.es6 index 72316011582..781fdc131b3 100644 --- a/app/assets/javascripts/discourse/views/topic-list-header-column.js.es6 +++ b/app/assets/javascripts/discourse/raw-views/topic-list-header-column.js.es6 @@ -1,5 +1,4 @@ export default Ember.Object.extend({ - localizedName: function(){ if(this.forceName){ return this.forceName; diff --git a/app/assets/javascripts/discourse/views/topic-status.js.es6 b/app/assets/javascripts/discourse/raw-views/topic-status.js.es6 similarity index 100% rename from app/assets/javascripts/discourse/views/topic-status.js.es6 rename to app/assets/javascripts/discourse/raw-views/topic-status.js.es6 diff --git a/app/assets/javascripts/discourse/router.js.es6 b/app/assets/javascripts/discourse/router.js.es6 deleted file mode 100644 index 0223dfe41be..00000000000 --- a/app/assets/javascripts/discourse/router.js.es6 +++ /dev/null @@ -1,83 +0,0 @@ -const rootURL = Discourse.BaseUri; - -const BareRouter = Ember.Router.extend({ - rootURL, - location: Ember.testing ? 'none': 'discourse-location' -}); - -export function mapRoutes() { - - var Router = BareRouter.extend(); - const resources = {}; - const paths = {}; - - // If a module is defined as `route-map` in discourse or a plugin, its routes - // will be built automatically. You can supply a `resource` property to - // automatically put it in that resource, such as `admin`. That way plugins - // can define admin routes. - Object.keys(requirejs._eak_seen).forEach(function(key) { - if (/route-map$/.test(key)) { - var module = require(key, null, null, true); - if (!module || !module.default) { throw new Error(key + ' must export a route map.'); } - - var mapObj = module.default; - if (typeof mapObj === 'function') { - mapObj = { resource: 'root', map: mapObj }; - } - - if (!resources[mapObj.resource]) { resources[mapObj.resource] = []; } - resources[mapObj.resource].push(mapObj.map); - if (mapObj.path) { paths[mapObj.resource] = mapObj.path; } - } - }); - - return Router.map(function() { - var router = this; - - // Do the root resources first - if (resources.root) { - resources.root.forEach(function(m) { - m.call(router); - }); - delete resources.root; - } - - // Even if no plugins set it up, we need an `adminPlugins` route - var adminPlugins = 'admin.adminPlugins'; - resources[adminPlugins] = resources[adminPlugins] || [Ember.K]; - paths[adminPlugins] = paths[adminPlugins] || "/plugins"; - - var segments = {}, - standalone = []; - - Object.keys(resources).forEach(function(r) { - var m = /^([^\.]+)\.(.*)$/.exec(r); - if (m) { - segments[m[1]] = m[2]; - } else { - standalone.push(r); - } - }); - - // Apply other resources next. A little hacky but works! - standalone.forEach(function(r) { - router.resource(r, {path: paths[r]}, function() { - var res = this; - resources[r].forEach(function(m) { m.call(res); }); - - var s = segments[r]; - if (s) { - var full = r + '.' + s; - res.resource(s, {path: paths[full]}, function() { - var nestedRes = this; - resources[full].forEach(function(m) { m.call(nestedRes); }); - }); - } - }); - }); - - this.route('unknown', {path: '*path'}); - }); -} - -export default BareRouter; diff --git a/app/assets/javascripts/discourse/routes/app-route-map.js.es6 b/app/assets/javascripts/discourse/routes/app-route-map.js.es6 index 2f26a0248e3..7dc4502cf75 100644 --- a/app/assets/javascripts/discourse/routes/app-route-map.js.es6 +++ b/app/assets/javascripts/discourse/routes/app-route-map.js.es6 @@ -1,20 +1,18 @@ -import { defaultHomepage } from 'discourse/lib/utilities'; - export default function() { // Error page this.route('exception', { path: '/exception' }); - this.resource('about', { path: '/about' }); + this.route('about', { path: '/about', resetNamespace: true }); // Topic routes - this.resource('topic', { path: '/t/:slug/:id' }, function() { + this.route('topic', { path: '/t/:slug/:id', resetNamespace: true }, function() { this.route('fromParams', { path: '/' }); this.route('fromParamsNear', { path: '/:nearPost' }); }); - this.resource('topicBySlug', { path: '/t/:slug' }); + this.route('topicBySlug', { path: '/t/:slug', resetNamespace: true }); this.route('topicUnsubscribe', { path: '/t/:slug/:id/unsubscribe' }); - this.resource('discovery', { path: '/' }, function() { + this.route('discovery', { path: '/', resetNamespace: true }, function() { // top this.route('top'); this.route('topParentCategory', { path: '/c/:slug/l/top' }); @@ -45,24 +43,29 @@ export default function() { this.route('categoryNone', { path: '/c/:slug/none' }); this.route('category', { path: '/c/:parentSlug/:slug' }); this.route('categoryWithID', { path: '/c/:parentSlug/:slug/:id' }); - - // homepage - this.route(defaultHomepage(), { path: '/' }); }); - this.resource('group', { path: '/groups/:name' }, function() { + this.route('groups', { resetNamespace: true }); + + this.route('group', { path: '/groups/:name', resetNamespace: true }, function() { this.route('members'); - this.route('posts'); - this.route('topics'); - this.route('mentions'); - this.route('messages'); + + this.route('activity', function() { + this.route('posts'); + this.route('topics'); + this.route('mentions'); + this.route('messages'); + }); + + this.route('logs'); + this.route('edit'); }); // User routes - this.resource('users'); - this.resource('user', { path: '/users/:username' }, function() { + this.route('users', { resetNamespace: true }); + this.route('user', { path: '/users/:username', resetNamespace: true }, function() { this.route('summary'); - this.resource('userActivity', { path: '/activity' }, function() { + this.route('userActivity', { path: '/activity', resetNamespace: true }, function() { this.route('topics'); this.route('replies'); this.route('likesGiven', {path: 'likes-given'}); @@ -70,7 +73,7 @@ export default function() { this.route('pending'); }); - this.resource('userNotifications', {path: '/notifications'}, function(){ + this.route('userNotifications', {path: '/notifications', resetNamespace: true}, function(){ this.route('responses'); this.route('likesReceived', { path: 'likes-received'}); this.route('mentions'); @@ -81,14 +84,14 @@ export default function() { this.route('flaggedPosts', { path: '/flagged-posts' }); this.route('deletedPosts', { path: '/deleted-posts' }); - this.resource('userPrivateMessages', { path: '/messages' }, function() { + this.route('userPrivateMessages', { path: '/messages', resetNamespace: true }, function() { this.route('sent'); this.route('archive'); this.route('group', { path: 'group/:name'}); this.route('groupArchive', { path: 'group/:name/archive'}); }); - this.resource('preferences', function() { + this.route('preferences', { resetNamespace: true }, function() { this.route('username'); this.route('email'); this.route('about', { path: '/about-me' }); @@ -96,7 +99,7 @@ export default function() { this.route('card-badge', { path: '/card-badge' }); }); - this.resource('userInvited', { path: '/invited' }, function() { + this.route('userInvited', { path: '/invited', resetNamespace: true }, function() { this.route('show', { path: '/:filter' }); }); @@ -114,15 +117,15 @@ export default function() { this.route('new-topic', {path: '/new-topic'}); this.route('new-message', {path: '/new-message'}); - this.resource('badges', function() { + this.route('badges', { resetNamespace: true }, function() { this.route('show', {path: '/:id/:slug'}); }); - this.resource('queued-posts', { path: '/queued-posts' }); + this.route('queued-posts', { path: '/queued-posts', resetNamespace: true }); this.route('full-page-search', {path: '/search'}); - this.resource('tags', function() { + this.route('tags', { resetNamespace: true }, function() { this.route('show', {path: '/:tag_id'}); this.route('showCategory', {path: '/c/:category/:tag_id'}); this.route('showParentCategory', {path: '/c/:parent_category/:category/:tag_id'}); @@ -132,9 +135,10 @@ export default function() { this.route('showCategory' + filter.capitalize(), {path: '/c/:category/:tag_id/l/' + filter}); this.route('showParentCategory' + filter.capitalize(), {path: '/c/:parent_category/:category/:tag_id/l/' + filter}); }); + this.route('intersection', {path: 'intersection/:tag_id/*additional_tags'}); }); - this.resource('tagGroups', {path: '/tag_groups'}, function() { + this.route('tagGroups', {path: '/tag_groups', resetNamespace: true}, function() { this.route('show', {path: '/:id'}); }); } diff --git a/app/assets/javascripts/discourse/routes/application.js.es6 b/app/assets/javascripts/discourse/routes/application.js.es6 index 2b216ce15b7..1c3fed9a6bf 100644 --- a/app/assets/javascripts/discourse/routes/application.js.es6 +++ b/app/assets/javascripts/discourse/routes/application.js.es6 @@ -6,6 +6,7 @@ import OpenComposer from "discourse/mixins/open-composer"; import Category from 'discourse/models/category'; import mobile from 'discourse/lib/mobile'; import { findAll } from 'discourse/models/login-method'; +import { getOwner } from 'discourse-common/lib/get-owner'; function unlessReadOnly(method, message) { return function() { @@ -20,20 +21,7 @@ function unlessReadOnly(method, message) { const ApplicationRoute = Discourse.Route.extend(OpenComposer, { siteTitle: setting('title'), - _handleLogout() { - if (this.currentUser) { - this.currentUser.destroySession().then(() => logout(this.siteSettings, this.keyValueStore)); - } - }, - actions: { - - showSearchHelp() { - ajax("/static/search_help.html", { dataType: 'html' }).then(model => { - showModal('searchHelp', { model }); - }); - }, - toggleAnonymous() { ajax("/users/toggle-anon", {method: 'POST'}).then(() => { window.location.reload(); @@ -53,15 +41,11 @@ const ApplicationRoute = Discourse.Route.extend(OpenComposer, { // Ember doesn't provider a router `willTransition` event so let's make one willTransition() { - var router = this.container.lookup('router:main'); + var router = getOwner(this).lookup('router:main'); Ember.run.once(router, router.trigger, 'willTransition'); return this._super(); }, - showTopicEntrance(data) { - this.controllerFor('topic-entrance').send('show', data); - }, - postWasEnqueued(details) { const title = details.reason ? 'queue_reason.' + details.reason + '.title' : 'queue.approval.title'; showModal('post-enqueued', {model: details, title }); @@ -143,12 +127,12 @@ const ApplicationRoute = Discourse.Route.extend(OpenComposer, { }, editCategory(category) { - Category.reloadById(category.get('id')).then((atts) => { + Category.reloadById(category.get('id')).then(atts => { const model = this.store.createRecord('category', atts.category); model.setupGroupsAndPermissions(); this.site.updateCategory(model); - showModal('editCategory', { model }); - this.controllerFor('editCategory').set('selectedTab', 'general'); + showModal('edit-category', { model }); + this.controllerFor('edit-category').set('selectedTab', 'general'); }); }, @@ -162,10 +146,9 @@ const ApplicationRoute = Discourse.Route.extend(OpenComposer, { }, changeBulkTemplate(w) { - const controllerName = w.replace('modal/', ''), - factory = this.container.lookupFactory('controller:' + controllerName); - - this.render(w, {into: 'modal/topic-bulk-actions', outlet: 'bulkOutlet', controller: factory ? controllerName : 'topic-bulk-actions'}); + const controllerName = w.replace('modal/', ''); + const controller = getOwner(this).lookup('controller:' + controllerName); + this.render(w, {into: 'modal/topic-bulk-actions', outlet: 'bulkOutlet', controller: controller ? controllerName : 'topic-bulk-actions'}); }, createNewTopicViaParams(title, body, category_id, category, tags) { @@ -185,6 +168,13 @@ const ApplicationRoute = Discourse.Route.extend(OpenComposer, { }); }, + renderTemplate() { + this.render('application'); + this.render('user-card', { into: 'application', outlet: 'user-card' }); + this.render('modal', { into: 'application', outlet: 'modal' }); + this.render('composer', { into: 'application', outlet: 'composer' }); + }, + handleShowLogin() { if (this.siteSettings.enable_sso) { const returnPath = encodeURIComponent(window.location.pathname); @@ -204,7 +194,10 @@ const ApplicationRoute = Discourse.Route.extend(OpenComposer, { }, _autoLogin(modal, modalClass, notAuto) { - const methods = findAll(this.siteSettings); + const methods = findAll(this.siteSettings, + getOwner(this).lookup('capabilities:main'), + this.site.isMobileDevice); + if (!this.siteSettings.enable_local_logins && methods.length === 1) { this.controllerFor('login').send('externalLogin', methods[0]); } else { @@ -214,6 +207,11 @@ const ApplicationRoute = Discourse.Route.extend(OpenComposer, { } }, + _handleLogout() { + if (this.currentUser) { + this.currentUser.destroySession().then(() => logout(this.siteSettings, this.keyValueStore)); + } + }, }); RSVP.EventTarget.mixin(ApplicationRoute); diff --git a/app/assets/javascripts/discourse/routes/build-category-route.js.es6 b/app/assets/javascripts/discourse/routes/build-category-route.js.es6 index f9792401565..14bc77f8a5f 100644 --- a/app/assets/javascripts/discourse/routes/build-category-route.js.es6 +++ b/app/assets/javascripts/discourse/routes/build-category-route.js.es6 @@ -67,9 +67,6 @@ export default (filter, params) => { return findTopicList(this.store, this.topicTrackingState, listFilter, findOpts, extras).then(list => { TopicList.hideUniformCategory(list, category); this.set('topics', list); - if (list.topic_list.tags) { - Discourse.Site.currentProp('top_tags', list.topic_list.tags); - } return list; }); }, diff --git a/app/assets/javascripts/discourse/routes/build-topic-route.js.es6 b/app/assets/javascripts/discourse/routes/build-topic-route.js.es6 index 43c920535ee..d7a2116bee6 100644 --- a/app/assets/javascripts/discourse/routes/build-topic-route.js.es6 +++ b/app/assets/javascripts/discourse/routes/build-topic-route.js.es6 @@ -54,6 +54,9 @@ function findTopicList(store, tracking, filter, filterParams, extras) { tracking.trackIncoming(list.filter); } Discourse.Session.currentProp('topicList', list); + if (list.topic_list && list.topic_list.tags) { + Discourse.Site.currentProp('top_tags', list.topic_list.tags); + } return list; }); } diff --git a/app/assets/javascripts/discourse/routes/discourse.js.es6 b/app/assets/javascripts/discourse/routes/discourse.js.es6 index 8b4c7b8465d..8b3d3bbc310 100644 --- a/app/assets/javascripts/discourse/routes/discourse.js.es6 +++ b/app/assets/javascripts/discourse/routes/discourse.js.es6 @@ -74,33 +74,4 @@ const DiscourseRoute = Ember.Route.extend({ } }); -export function cleanDOM() { - if (window.MiniProfiler) { - window.MiniProfiler.pageTransition(); - } - - // Close some elements that may be open - $('header ul.icons li').removeClass('active'); - $('[data-toggle="dropdown"]').parent().removeClass('open'); - // close the lightbox - if ($.magnificPopup && $.magnificPopup.instance) { - $.magnificPopup.instance.close(); - $('body').removeClass('mfp-zoom-out-cur'); - } - - // Remove any link focus - // NOTE: the '.not("body")' is here to prevent a bug in IE10 on Win7 - // cf. https://stackoverflow.com/questions/5657371 - $(document.activeElement).not("body").not(".no-blur").blur(); - - Discourse.set('notifyCount',0); - Discourse.__container__.lookup('route:application').send('closeModal'); - const hideDropDownFunction = $('html').data('hide-dropdown'); - if (hideDropDownFunction) { hideDropDownFunction(); } - - // TODO: Avoid container lookup here - const appEvents = Discourse.__container__.lookup('app-events:main'); - appEvents.trigger('dom:clean'); -} - export default DiscourseRoute; diff --git a/app/assets/javascripts/discourse/routes/discovery-categories.js.es6 b/app/assets/javascripts/discourse/routes/discovery-categories.js.es6 index 4aa3e17a5f6..9f4c76ee7d5 100644 --- a/app/assets/javascripts/discourse/routes/discovery-categories.js.es6 +++ b/app/assets/javascripts/discourse/routes/discovery-categories.js.es6 @@ -2,7 +2,9 @@ import showModal from "discourse/lib/show-modal"; import OpenComposer from "discourse/mixins/open-composer"; import CategoryList from "discourse/models/category-list"; import { defaultHomepage } from 'discourse/lib/utilities'; -import PreloadStore from 'preload-store'; +import TopicList from "discourse/models/topic-list"; +import { ajax } from "discourse/lib/ajax"; +import PreloadStore from "preload-store"; const DiscoveryCategoriesRoute = Discourse.Route.extend(OpenComposer, { renderTemplate() { @@ -15,20 +17,61 @@ const DiscoveryCategoriesRoute = Discourse.Route.extend(OpenComposer, { }, model() { - // TODO: Remove this and ensure server side does not supply `topic_list` - // if default page is categories - PreloadStore.remove("topic_list"); + const style = !this.site.mobileView && this.siteSettings.desktop_category_page_style; + const parentCategory = this.get("model.parentCategory"); - return CategoryList.list(this.store, 'categories').then(list => { + let promise; + if (parentCategory) { + promise = CategoryList.listForParent(this.store, parentCategory); + } else if (style === "categories_and_latest_topics") { + promise = this._loadCategoriesAndLatestTopics(); + } else { + promise = CategoryList.list(this.store); + } + + return promise.then(model => { const tracking = this.topicTrackingState; if (tracking) { - tracking.sync(list, "categories"); + tracking.sync(model, "categories"); tracking.trackIncoming("categories"); } - return list; + return model; }); }, + _loadCategoriesAndLatestTopics() { + const wrappedCategoriesList = PreloadStore.getAndRemove("categories_list"); + const topicListLatest = PreloadStore.getAndRemove("topic_list_latest"); + const categoriesList = wrappedCategoriesList && wrappedCategoriesList.category_list; + if (categoriesList && topicListLatest) { + return new Ember.RSVP.Promise(resolve => { + const result = Ember.Object.create({ + categories: CategoryList.categoriesFrom(this.store, wrappedCategoriesList), + topics: TopicList.topicsFrom(this.store, topicListLatest), + can_create_category: categoriesList.can_create_category, + can_create_topic: categoriesList.can_create_topic, + draft_key: categoriesList.draft_key, + draft: categoriesList.draft, + draft_sequence: categoriesList.draft_sequence + }); + + resolve(result); + }); + } else { + return ajax("/categories_and_latest").then(result => { + return Ember.Object.create({ + categories: CategoryList.categoriesFrom(this.store, result), + topics: TopicList.topicsFrom(this.store, result), + can_create_category: result.category_list.can_create_category, + can_create_topic: result.category_list.can_create_topic, + draft_key: result.category_list.draft_key, + draft: result.category_list.draft, + draft_sequence: result.category_list.draft_sequence + }); + }); + } + }, + titleToken() { if (defaultHomepage() === "categories") { return; } return I18n.t("filters.categories.title"); @@ -46,6 +89,24 @@ const DiscoveryCategoriesRoute = Discourse.Route.extend(OpenComposer, { }, actions: { + + refresh() { + const controller = this.controllerFor("discovery/categories"); + + // Don't refresh if we're still loading + if (!controller || controller.get("loading")) { return; } + + // If we `send('loading')` here, due to returning true it bubbles up to the + // router and ember throws an error due to missing `handlerInfos`. + // Lesson learned: Don't call `loading` yourself. + controller.set("loading", true); + + this.model().then(model => { + this.setupController(controller, model); + controller.send("loadingComplete"); + }); + }, + createCategory() { const groups = this.site.groups, everyoneName = groups.findBy("id", 0).name; @@ -53,11 +114,12 @@ const DiscoveryCategoriesRoute = Discourse.Route.extend(OpenComposer, { const model = this.store.createRecord('category', { color: "AB9364", text_color: "FFFFFF", group_permissions: [{group_name: everyoneName, permission_type: 1}], available_groups: groups.map(g => g.name), - allow_badges: true + allow_badges: true, + topic_featured_link_allowed: true }); - showModal("editCategory", { model }); - this.controllerFor("editCategory").set("selectedTab", "general"); + showModal("edit-category", { model }); + this.controllerFor("edit-category").set("selectedTab", "general"); }, reorderCategories() { diff --git a/app/assets/javascripts/discourse/routes/discovery.js.es6 b/app/assets/javascripts/discourse/routes/discovery.js.es6 index 400d1df1eea..a77806d1a4d 100644 --- a/app/assets/javascripts/discourse/routes/discovery.js.es6 +++ b/app/assets/javascripts/discourse/routes/discovery.js.es6 @@ -11,7 +11,7 @@ export default Discourse.Route.extend(OpenComposer, { }, beforeModel(transition) { - if (transition.intent.url === "/" && + if ((transition.intent.url === "/" || transition.intent.url === "/categories") && transition.targetName.indexOf("discovery.top") === -1 && Discourse.User.currentProp("should_be_redirected_to_top")) { Discourse.User.currentProp("should_be_redirected_to_top", false); diff --git a/app/assets/javascripts/discourse/routes/forgot-password.js.es6 b/app/assets/javascripts/discourse/routes/forgot-password.js.es6 index df8ab36145b..648bf44ca30 100644 --- a/app/assets/javascripts/discourse/routes/forgot-password.js.es6 +++ b/app/assets/javascripts/discourse/routes/forgot-password.js.es6 @@ -1,10 +1,12 @@ +import { defaultHomepage } from 'discourse/lib/utilities'; import buildStaticRoute from 'discourse/routes/build-static-route'; const ForgotPasswordRoute = buildStaticRoute('password-reset'); ForgotPasswordRoute.reopen({ beforeModel() { - this.replaceWith(this.controllerFor('application').get('loginRequired') ? 'login' : 'discovery').then(e => { + const loginRequired = this.controllerFor('application').get('loginRequired'); + this.replaceWith(loginRequired ? 'login' : `discovery.${defaultHomepage()}`).then(e => { Ember.run.next(() => e.send('showForgotPassword')); }); }, diff --git a/app/assets/javascripts/discourse/routes/full-page-search.js.es6 b/app/assets/javascripts/discourse/routes/full-page-search.js.es6 index 8507c0dce4e..eb0cc01092c 100644 --- a/app/assets/javascripts/discourse/routes/full-page-search.js.es6 +++ b/app/assets/javascripts/discourse/routes/full-page-search.js.es6 @@ -2,13 +2,14 @@ import { ajax } from 'discourse/lib/ajax'; import { translateResults, getSearchKey, isValidSearchTerm } from "discourse/lib/search"; import Composer from 'discourse/models/composer'; import PreloadStore from 'preload-store'; +import { getTransient, setTransient } from 'discourse/lib/page-tracker'; +import { getOwner } from 'discourse-common/lib/get-owner'; export default Discourse.Route.extend({ - queryParams: { q: {}, context_id: {}, context: {}, skip_context: {} }, + queryParams: { q: {}, expanded: false, context_id: {}, context: {}, skip_context: {} }, model(params) { - const router = Discourse.__container__.lookup('router:main'); - var cached = router.transientCache('lastSearch'); + const cached = getTransient('lastSearch'); var args = { q: params.q }; if (params.context_id && !args.skip_context) { args.search_context = { @@ -21,7 +22,7 @@ export default Discourse.Route.extend({ if (cached && cached.data.searchKey === searchKey) { // extend expiry - router.transientCache('lastSearch', { searchKey, model: cached.data.model }, 5); + setTransient('lastSearch', { searchKey, model: cached.data.model }, 5); return cached.data.model; } @@ -33,7 +34,7 @@ export default Discourse.Route.extend({ } }).then(results => { const model = (results && translateResults(results)) || {}; - router.transientCache('lastSearch', { searchKey, model }, 5); + setTransient('lastSearch', { searchKey, model }, 5); return model; }); }, @@ -52,7 +53,7 @@ export default Discourse.Route.extend({ category = match[1]; } } - this.container.lookup('controller:composer').open({action: Composer.CREATE_TOPIC, draftKey: Composer.CREATE_TOPIC, topicCategory: category}); + getOwner(this).lookup('controller:composer').open({action: Composer.CREATE_TOPIC, draftKey: Composer.CREATE_TOPIC, topicCategory: category}); } } diff --git a/app/assets/javascripts/discourse/routes/group-activity-mentions.js.es6 b/app/assets/javascripts/discourse/routes/group-activity-mentions.js.es6 new file mode 100644 index 00000000000..48f4fc7d9d5 --- /dev/null +++ b/app/assets/javascripts/discourse/routes/group-activity-mentions.js.es6 @@ -0,0 +1,3 @@ +import { buildGroupPage } from 'discourse/routes/group-activity-posts'; + +export default buildGroupPage('mentions'); diff --git a/app/assets/javascripts/discourse/routes/group-activity-messages.js.es6 b/app/assets/javascripts/discourse/routes/group-activity-messages.js.es6 new file mode 100644 index 00000000000..660a5c7cd5f --- /dev/null +++ b/app/assets/javascripts/discourse/routes/group-activity-messages.js.es6 @@ -0,0 +1,3 @@ +import { buildGroupPage } from 'discourse/routes/group-activity-posts'; + +export default buildGroupPage('messages'); diff --git a/app/assets/javascripts/discourse/routes/group-posts.js.es6 b/app/assets/javascripts/discourse/routes/group-activity-posts.js.es6 similarity index 79% rename from app/assets/javascripts/discourse/routes/group-posts.js.es6 rename to app/assets/javascripts/discourse/routes/group-activity-posts.js.es6 index 25ee29e4dd0..03cd7ec1147 100644 --- a/app/assets/javascripts/discourse/routes/group-posts.js.es6 +++ b/app/assets/javascripts/discourse/routes/group-activity-posts.js.es6 @@ -11,12 +11,12 @@ export function buildGroupPage(type) { }, setupController(controller, model) { - this.controllerFor('group-posts').setProperties({ model, type }); + this.controllerFor('group-activity-posts').setProperties({ model, type }); this.controllerFor("group").set("showing", type); }, renderTemplate() { - this.render('group-posts'); + this.render('group-activity-posts'); }, actions: { diff --git a/app/assets/javascripts/discourse/routes/group-activity-topics.js.es6 b/app/assets/javascripts/discourse/routes/group-activity-topics.js.es6 new file mode 100644 index 00000000000..16164a51bb3 --- /dev/null +++ b/app/assets/javascripts/discourse/routes/group-activity-topics.js.es6 @@ -0,0 +1,3 @@ +import { buildGroupPage } from 'discourse/routes/group-activity-posts'; + +export default buildGroupPage('topics'); diff --git a/app/assets/javascripts/discourse/routes/group-activity.js.es6 b/app/assets/javascripts/discourse/routes/group-activity.js.es6 new file mode 100644 index 00000000000..84011db59f4 --- /dev/null +++ b/app/assets/javascripts/discourse/routes/group-activity.js.es6 @@ -0,0 +1,5 @@ +export default Ember.Route.extend({ + beforeModel: function() { + this.transitionTo("group.activity.posts"); + } +}); diff --git a/app/assets/javascripts/discourse/routes/group-edit.js.es6 b/app/assets/javascripts/discourse/routes/group-edit.js.es6 new file mode 100644 index 00000000000..8608e6ecf3b --- /dev/null +++ b/app/assets/javascripts/discourse/routes/group-edit.js.es6 @@ -0,0 +1,15 @@ +export default Ember.Route.extend({ + titleToken() { + return I18n.t('groups.edit.title'); + }, + + model() { + return this.modelFor('group'); + }, + + setupController(controller, model) { + this.controllerFor('group-edit').setProperties({ model }); + this.controllerFor("group").set("showing", 'edit'); + model.findMembers(); + } +}); diff --git a/app/assets/javascripts/discourse/routes/group-index.js.es6 b/app/assets/javascripts/discourse/routes/group-index.js.es6 index 5182e0978cf..003a4a8d9e1 100644 --- a/app/assets/javascripts/discourse/routes/group-index.js.es6 +++ b/app/assets/javascripts/discourse/routes/group-index.js.es6 @@ -1,5 +1,4 @@ export default Discourse.Route.extend({ - titleToken() { return I18n.t('groups.members'); }, @@ -11,6 +10,6 @@ export default Discourse.Route.extend({ setupController(controller, model) { this.controllerFor("group").set("showing", "members"); controller.set("model", model); - model.findMembers(); + controller.refreshMembers(); } }); diff --git a/app/assets/javascripts/discourse/routes/group-logs.js.es6 b/app/assets/javascripts/discourse/routes/group-logs.js.es6 new file mode 100644 index 00000000000..0d365fab188 --- /dev/null +++ b/app/assets/javascripts/discourse/routes/group-logs.js.es6 @@ -0,0 +1,20 @@ +export default Ember.Route.extend({ + titleToken() { + return I18n.t('groups.logs'); + }, + + model() { + return this.modelFor('group').findLogs(); + }, + + setupController(controller, model) { + this.controllerFor('group-logs').setProperties({ model }); + this.controllerFor("group").set("showing", 'logs'); + }, + + actions: { + willTransition() { + this.controllerFor('group-logs').reset(); + } + } +}); diff --git a/app/assets/javascripts/discourse/routes/group-mentions.js.es6 b/app/assets/javascripts/discourse/routes/group-mentions.js.es6 deleted file mode 100644 index 2a12734dc18..00000000000 --- a/app/assets/javascripts/discourse/routes/group-mentions.js.es6 +++ /dev/null @@ -1,3 +0,0 @@ -import { buildGroupPage } from 'discourse/routes/group-posts'; - -export default buildGroupPage('mentions'); diff --git a/app/assets/javascripts/discourse/routes/group-messages.js.es6 b/app/assets/javascripts/discourse/routes/group-messages.js.es6 deleted file mode 100644 index c800d6f7774..00000000000 --- a/app/assets/javascripts/discourse/routes/group-messages.js.es6 +++ /dev/null @@ -1,3 +0,0 @@ -import { buildGroupPage } from 'discourse/routes/group-posts'; - -export default buildGroupPage('messages'); diff --git a/app/assets/javascripts/discourse/routes/group-topics.js.es6 b/app/assets/javascripts/discourse/routes/group-topics.js.es6 deleted file mode 100644 index be4e87077e9..00000000000 --- a/app/assets/javascripts/discourse/routes/group-topics.js.es6 +++ /dev/null @@ -1,3 +0,0 @@ -import { buildGroupPage } from 'discourse/routes/group-posts'; - -export default buildGroupPage('topics'); diff --git a/app/assets/javascripts/discourse/routes/group.js.es6 b/app/assets/javascripts/discourse/routes/group.js.es6 index 51724c18b45..3df20f794bf 100644 --- a/app/assets/javascripts/discourse/routes/group.js.es6 +++ b/app/assets/javascripts/discourse/routes/group.js.es6 @@ -14,12 +14,6 @@ export default Discourse.Route.extend({ return { name: model.get('name').toLowerCase() }; }, - afterModel(model) { - return Group.findGroupCounts(model.get('name')).then(counts => { - this.set('counts', counts); - }); - }, - setupController(controller, model) { controller.setProperties({ model, counts: this.get('counts') }); } diff --git a/app/assets/javascripts/discourse/routes/groups.js.es6 b/app/assets/javascripts/discourse/routes/groups.js.es6 new file mode 100644 index 00000000000..582ebe0f5c6 --- /dev/null +++ b/app/assets/javascripts/discourse/routes/groups.js.es6 @@ -0,0 +1,13 @@ +export default Discourse.Route.extend({ + titleToken() { + return I18n.t('groups.index.title'); + }, + + model(params) { + return this.store.findAll('group', params); + }, + + setupController(controller, model) { + controller.set('groups', model); + } +}); diff --git a/app/assets/javascripts/discourse/routes/loading.js.es6 b/app/assets/javascripts/discourse/routes/loading.js.es6 deleted file mode 100644 index 9d032c9e3ba..00000000000 --- a/app/assets/javascripts/discourse/routes/loading.js.es6 +++ /dev/null @@ -1 +0,0 @@ -export default Ember.Route.extend(); diff --git a/app/assets/javascripts/discourse/routes/new-message.js.es6 b/app/assets/javascripts/discourse/routes/new-message.js.es6 index d8e8c577511..85731a8e827 100644 --- a/app/assets/javascripts/discourse/routes/new-message.js.es6 +++ b/app/assets/javascripts/discourse/routes/new-message.js.es6 @@ -21,11 +21,11 @@ export default Discourse.Route.extend({ }); } else if (params.groupname) { // send a message to a group - Group.find(params.groupname).then(group => { - if (group.mentionable) { - Ember.run.next(() => e.send("createNewMessageViaParams", group.name, params.title, params.body)); + Group.mentionable(params.groupname).then(result => { + if (result.mentionable) { + Ember.run.next(() => e.send("createNewMessageViaParams", params.groupname, params.title, params.body)); } else { - bootbox.alert(I18n.t("composer.cant_send_pm", { username: group.name })); + bootbox.alert(I18n.t("composer.cant_send_pm", { username: params.groupname })); } }).catch(function() { bootbox.alert(I18n.t("generic_error")); diff --git a/app/assets/javascripts/discourse/routes/tags-intersection.js.es6 b/app/assets/javascripts/discourse/routes/tags-intersection.js.es6 new file mode 100644 index 00000000000..5b0e7d8e9ff --- /dev/null +++ b/app/assets/javascripts/discourse/routes/tags-intersection.js.es6 @@ -0,0 +1,9 @@ +import TagsShowRoute from 'discourse/routes/tags-show'; + +export default TagsShowRoute.extend({}); + +// The tags-intersection route is exactly the same as the tags-show route, but the wildcard at the +// end of the route (*additional_tags) will cause a match when query parameters are present, +// breaking all other tags-show routes. Ember thinks the query params are addition tags and should +// be handled by the intersection logic. Defining tags-intersection as something separate avoids +// that confusion. diff --git a/app/assets/javascripts/discourse/routes/tags-show.js.es6 b/app/assets/javascripts/discourse/routes/tags-show.js.es6 index a828e39c68e..db344ef8840 100644 --- a/app/assets/javascripts/discourse/routes/tags-show.js.es6 +++ b/app/assets/javascripts/discourse/routes/tags-show.js.es6 @@ -14,6 +14,14 @@ export default Discourse.Route.extend({ var tag = this.store.createRecord("tag", { id: Handlebars.Utils.escapeExpression(params.tag_id) }), f = ''; + if (params.additional_tags) { + this.set("additionalTags", params.additional_tags.split('/').map((t) => { + return this.store.createRecord("tag", { id: Handlebars.Utils.escapeExpression(t) }).id; + })); + } else { + this.set('additionalTags', null); + } + if (params.category) { f = 'c/'; if (params.parent_category) { f += params.parent_category + '/'; } @@ -56,6 +64,9 @@ export default Discourse.Route.extend({ } this.set('category', category); + } else if (this.get("additionalTags")) { + params.filter = `tags/intersection/${tag_id}/${this.get('additionalTags').join('/')}`; + this.set('category', null); } else { params.filter = `tags/${tag_id}/l/${filter}`; this.set('category', null); @@ -64,9 +75,6 @@ export default Discourse.Route.extend({ return findTopicList(this.store, this.topicTrackingState, params.filter, params, {}).then(function(list) { controller.set('list', list); controller.set('canCreateTopic', list.get('can_create_topic')); - if (list.topic_list.tags) { - Discourse.Site.currentProp('top_tags', list.topic_list.tags); - } controller.set('loading', false); }); }, @@ -94,6 +102,7 @@ export default Discourse.Route.extend({ this.controllerFor('tags.show').setProperties({ model, tag: model, + additionalTags: this.get('additionalTags'), category: this.get('category'), filterMode: this.get('filterMode'), navMode: this.get('navMode'), @@ -123,7 +132,7 @@ export default Discourse.Route.extend({ // Pre-fill the tags input field if (controller.get('model.id')) { var c = self.controllerFor('composer').get('model'); - c.set('tags', [controller.get('model.id')]); + c.set('tags', _.flatten([controller.get('model.id')], controller.get('additionalTags'))); } }); }, @@ -131,16 +140,6 @@ export default Discourse.Route.extend({ didTransition() { this.controllerFor("tags.show")._showFooter(); return true; - }, - - willTransition(transition) { - if (!Discourse.SiteSettings.show_filter_by_tag) { return true; } - - if ((transition.targetName.indexOf("discovery.parentCategory") !== -1 || - transition.targetName.indexOf("discovery.category") !== -1) && !transition.queryParams.allTags ) { - this.transitionTo("/tags" + transition.intent.url + "/" + this.currentModel.get("id")); - } - return true; } } }); diff --git a/app/assets/javascripts/discourse/routes/topic-from-params.js.es6 b/app/assets/javascripts/discourse/routes/topic-from-params.js.es6 index 7c96c1a2643..2212da06b94 100644 --- a/app/assets/javascripts/discourse/routes/topic-from-params.js.es6 +++ b/app/assets/javascripts/discourse/routes/topic-from-params.js.es6 @@ -56,8 +56,10 @@ export default Discourse.Route.extend({ ignoreIfChanged: true }); } - }).catch(function(e) { - Ember.warn('Could not view topic', e); + }).catch(e => { + if (!Ember.testing) { + console.log('Could not view topic', e); + } }); } diff --git a/app/assets/javascripts/discourse/routes/topic.js.es6 b/app/assets/javascripts/discourse/routes/topic.js.es6 index a31736bc158..9cda61f8d7c 100644 --- a/app/assets/javascripts/discourse/routes/topic.js.es6 +++ b/app/assets/javascripts/discourse/routes/topic.js.es6 @@ -14,7 +14,6 @@ const TopicRoute = Discourse.Route.extend({ queryParams: { filter: { replace: true }, username_filters: { replace: true }, - show_deleted: { replace: true } }, titleToken() { @@ -45,7 +44,8 @@ const TopicRoute = Discourse.Route.extend({ this.controllerFor('flag').setProperties({ selected: null, flagTopic: false }); }, - showFlagTopic(model) { + showFlagTopic() { + const model = this.modelFor('topic'); showModal('flag', { model }); this.controllerFor('flag').setProperties({ selected: null, flagTopic: true }); }, @@ -117,7 +117,6 @@ const TopicRoute = Discourse.Route.extend({ willTransition() { this._super(); - this.controllerFor("quote-button").deselectText(); Em.run.cancel(scheduledReplace); isTransitioning = true; return true; @@ -139,7 +138,6 @@ const TopicRoute = Discourse.Route.extend({ setupParams(topic, params) { const postStream = topic.get('postStream'); postStream.set('summary', Em.get(params, 'filter') === 'summary'); - postStream.set('show_deleted', !!Em.get(params, 'show_deleted')); const usernames = Em.get(params, 'username_filters'), userFilters = postStream.get('userFilters'); @@ -208,6 +206,7 @@ const TopicRoute = Discourse.Route.extend({ // close the multi select when switching topics controller.set('multiSelect', false); + controller.get('quoteState').clear(); this.controllerFor('composer').set('topic', model); this.topicTrackingState.trackIncoming('all'); diff --git a/app/assets/javascripts/discourse/routes/unknown.js.es6 b/app/assets/javascripts/discourse/routes/unknown.js.es6 index 7e01606f3be..40c8a301395 100644 --- a/app/assets/javascripts/discourse/routes/unknown.js.es6 +++ b/app/assets/javascripts/discourse/routes/unknown.js.es6 @@ -1,6 +1,7 @@ import { ajax } from 'discourse/lib/ajax'; + export default Discourse.Route.extend({ - model: function() { + model() { return ajax("/404-body", { dataType: 'html' }); } }); diff --git a/app/assets/javascripts/discourse/routes/user-activity-bookmarks.js.es6 b/app/assets/javascripts/discourse/routes/user-activity-bookmarks.js.es6 index cb14c181538..49ad23d1bc4 100644 --- a/app/assets/javascripts/discourse/routes/user-activity-bookmarks.js.es6 +++ b/app/assets/javascripts/discourse/routes/user-activity-bookmarks.js.es6 @@ -2,5 +2,6 @@ import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; import UserAction from "discourse/models/user-action"; export default UserActivityStreamRoute.extend({ - userActionType: UserAction.TYPES["bookmarks"] + userActionType: UserAction.TYPES["bookmarks"], + noContentHelpKey: "user_activity.no_bookmarks" }); diff --git a/app/assets/javascripts/discourse/routes/user-activity-likes-given.js.es6 b/app/assets/javascripts/discourse/routes/user-activity-likes-given.js.es6 index 13a0e5b9863..89bbbc46b21 100644 --- a/app/assets/javascripts/discourse/routes/user-activity-likes-given.js.es6 +++ b/app/assets/javascripts/discourse/routes/user-activity-likes-given.js.es6 @@ -2,5 +2,6 @@ import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; import UserAction from "discourse/models/user-action"; export default UserActivityStreamRoute.extend({ - userActionType: UserAction.TYPES["likes_given"] + userActionType: UserAction.TYPES["likes_given"], + noContentHelpKey: 'user_activity.no_likes_given' }); diff --git a/app/assets/javascripts/discourse/routes/user-activity-stream.js.es6 b/app/assets/javascripts/discourse/routes/user-activity-stream.js.es6 index 7447d712179..4fbf8e4300c 100644 --- a/app/assets/javascripts/discourse/routes/user-activity-stream.js.es6 +++ b/app/assets/javascripts/discourse/routes/user-activity-stream.js.es6 @@ -6,7 +6,7 @@ export default Discourse.Route.extend(ViewingActionType, { }, afterModel() { - return this.modelFor("user").get("stream").filterBy(this.get("userActionType")); + return this.modelFor("user").get("stream").filterBy(this.get("userActionType"), this.get("noContentHelpKey")); }, renderTemplate() { diff --git a/app/assets/javascripts/discourse/routes/user-invited-show.js.es6 b/app/assets/javascripts/discourse/routes/user-invited-show.js.es6 index c9465fa7d14..9be0fc48234 100644 --- a/app/assets/javascripts/discourse/routes/user-invited-show.js.es6 +++ b/app/assets/javascripts/discourse/routes/user-invited-show.js.es6 @@ -33,14 +33,6 @@ export default Discourse.Route.extend({ showInvite() { showModal("invite", { model: this.currentUser }); this.controllerFor("invite").reset(); - }, - - uploadSuccess(filename) { - bootbox.alert(I18n.t("user.invited.bulk_invite.success", { filename: filename })); - }, - - uploadError(filename, message) { - bootbox.alert(I18n.t("user.invited.bulk_invite.error", { filename: filename, message: message })); } } }); diff --git a/app/assets/javascripts/discourse/routes/user.js.es6 b/app/assets/javascripts/discourse/routes/user.js.es6 index fdfb99854da..03bfbb401b0 100644 --- a/app/assets/javascripts/discourse/routes/user.js.es6 +++ b/app/assets/javascripts/discourse/routes/user.js.es6 @@ -19,7 +19,15 @@ export default Discourse.Route.extend({ const isIndexStream = INDEX_STREAM_ROUTES.indexOf(transition.targetName) !== -1; this.controllerFor('user').set('indexStream', isIndexStream); return true; - } + }, + + undoRevokeApiKey(key) { + key.undoRevoke(); + }, + + revokeApiKey(key) { + key.revoke(); + }, }, beforeModel() { diff --git a/app/assets/javascripts/discourse/templates/about.hbs b/app/assets/javascripts/discourse/templates/about.hbs index 3d8f993ba08..480b10c0fde 100644 --- a/app/assets/javascripts/discourse/templates/about.hbs +++ b/app/assets/javascripts/discourse/templates/about.hbs @@ -1,97 +1,99 @@ -
-+{{#d-section pageClass="about"}} ++{{/d-section}} diff --git a/app/assets/javascripts/discourse/templates/additional-composer-buttons.hbs b/app/assets/javascripts/discourse/templates/additional-composer-buttons.hbs deleted file mode 100644 index 43ccd1b392d..00000000000 --- a/app/assets/javascripts/discourse/templates/additional-composer-buttons.hbs +++ /dev/null @@ -1 +0,0 @@ -{{!-- THIS IS AN EMPTY TEMPLATE THAT NEEDS TO BE OVERWRITTEN --}} diff --git a/app/assets/javascripts/discourse/templates/application.hbs b/app/assets/javascripts/discourse/templates/application.hbs index 43f9add17ba..bf2de38396f 100644 --- a/app/assets/javascripts/discourse/templates/application.hbs +++ b/app/assets/javascripts/discourse/templates/application.hbs @@ -1,31 +1,31 @@ - +{{plugin-outlet name="above-site-header"}} {{site-header canSignUp=canSignUp - showCreateAccount="showCreateAccount" - showLogin="showLogin" - showKeyboard="showKeyboardShortcutsHelp" - toggleMobileView="toggleMobileView" - toggleAnonymous="toggleAnonymous" - logout="logout" - showSearchHelp="showSearchHelp"}} + showCreateAccount=(action "appRouteAction" "showCreateAccount") + showLogin=(action "appRouteAction" "showLogin") + showKeyboard=(action "appRouteAction" "showKeyboardShortcutsHelp") + toggleMobileView=(action "appRouteAction" "toggleMobileView") + toggleAnonymous=(action "appRouteAction" "toggleAnonymous") + logout=(action "appRouteAction" "logout")}} +{{plugin-outlet name="below-site-header"}}+--- -- - - {{#if model.admins}} -{{i18n 'about.title' title=model.title}}
-{{model.description}}
-- {{i18n 'about.our_admins'}}
- - {{#each model.admins as |a|}} - {{user-info user=a}} - {{/each}} - + ++ - {{/if}} - {{#if model.moderators}} -{{i18n 'about.title' title=model.title}}
+{{model.description}}
- {{i18n 'about.our_moderators'}}
+ {{#if model.admins}} ++ + {{/if}} + + {{#if model.moderators}} +{{i18n 'about.our_admins'}}
-- {{#each model.moderators as |m|}} - {{user-info user=m}} + {{#each model.admins as |a|}} + {{user-info user=a}} {{/each}} -- + + ++ + {{/if}} + +{{i18n 'about.our_moderators'}}
+ ++ {{#each model.moderators as |m|}} + {{user-info user=m}} + {{/each}} ++ ++ - {{/if}} -{{i18n 'about.stats'}}
+ ++
+ ++ {{i18n 'about.stat.all_time'}} +{{i18n 'about.stat.last_7_days'}} +{{i18n 'about.stat.last_30_days'}} ++ +{{i18n 'about.topic_count'}} +{{number model.stats.topic_count}} +{{number model.stats.topics_7_days}} +{{number model.stats.topics_30_days}} ++ +{{i18n 'about.post_count'}} +{{number model.stats.post_count}} +{{number model.stats.posts_7_days}} +{{number model.stats.posts_30_days}} ++ +{{i18n 'about.user_count'}} +{{number model.stats.user_count}} +{{number model.stats.users_7_days}} +{{number model.stats.users_30_days}} ++ +{{i18n 'about.active_user_count'}} +— +{{number model.stats.active_users_7_days}} +{{number model.stats.active_users_30_days}} ++ +{{i18n 'about.like_count'}} +{{number model.stats.like_count}} +{{number model.stats.likes_7_days}} +{{number model.stats.likes_30_days}} +- - - {{#if contactInfo}} -{{i18n 'about.stats'}}
- --
-- -- {{i18n 'about.stat.all_time'}} -{{i18n 'about.stat.last_7_days'}} -{{i18n 'about.stat.last_30_days'}} -- -{{i18n 'about.topic_count'}} -{{number model.stats.topic_count}} -{{number model.stats.topics_7_days}} -{{number model.stats.topics_30_days}} -- -{{i18n 'about.post_count'}} -{{number model.stats.post_count}} -{{number model.stats.posts_7_days}} -{{number model.stats.posts_30_days}} -- -{{i18n 'about.user_count'}} -{{number model.stats.user_count}} -{{number model.stats.users_7_days}} -{{number model.stats.users_30_days}} -- -{{i18n 'about.active_user_count'}} -— -{{number model.stats.active_users_7_days}} -{{number model.stats.active_users_30_days}} -- -{{i18n 'about.like_count'}} -{{number model.stats.like_count}} -{{number model.stats.likes_7_days}} -{{number model.stats.likes_30_days}} -- - {{/if}} + {{#if contactInfo}} +{{i18n 'about.contact'}}
-{{{contactInfo}}}
-+ + {{/if}} +{{i18n 'about.contact'}}
+{{{contactInfo}}}
+-{{plugin-outlet "above-footer"}} +{{plugin-outlet name="above-footer"}} {{#if showFooter}} - {{custom-html "footer"}} + {{custom-html name="footer"}} {{/if}} -{{plugin-outlet "below-footer"}} +{{plugin-outlet name="below-footer"}} -{{render "modal"}} -{{render "topic-entrance"}} -{{render "composer"}} +{{outlet "modal"}} +{{topic-entrance}} +{{outlet "composer"}} diff --git a/app/assets/javascripts/discourse/templates/badge-selector-autocomplete.raw.hbs b/app/assets/javascripts/discourse/templates/badge-selector-autocomplete.raw.hbs new file mode 100644 index 00000000000..4537c451601 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/badge-selector-autocomplete.raw.hbs @@ -0,0 +1,7 @@ +{{#if showTop}} - {{custom-html "top"}} + {{custom-html name="top"}} {{/if}} {{global-notice}} {{create-topics-notice}}{{outlet}} - {{render "user-card"}} + {{outlet "user-card"}}+diff --git a/app/assets/javascripts/discourse/templates/badges/index.hbs b/app/assets/javascripts/discourse/templates/badges/index.hbs index a5aac17b23a..b30725693b3 100644 --- a/app/assets/javascripts/discourse/templates/badges/index.hbs +++ b/app/assets/javascripts/discourse/templates/badges/index.hbs @@ -1,17 +1,19 @@ -+ {{#each options as |option|}} +
+- {{option.name}}
+ {{/each}} +-{{i18n 'badges.title'}}
+{{#d-section pageClass="badges"}} ++{{#if actionDescription}} diff --git a/app/assets/javascripts/discourse/templates/components/tag-drop-link.hbs b/app/assets/javascripts/discourse/templates/components/tag-drop-link.hbs new file mode 100644 index 00000000000..e8adb89fe43 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/tag-drop-link.hbs @@ -0,0 +1 @@ +{{tagId}} diff --git a/app/assets/javascripts/discourse/templates/components/text-overflow.hbs b/app/assets/javascripts/discourse/templates/components/text-overflow.hbs new file mode 100644 index 00000000000..05a44390298 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/text-overflow.hbs @@ -0,0 +1 @@ +{{{text}}} diff --git a/app/assets/javascripts/discourse/templates/components/toggle-deleted.hbs b/app/assets/javascripts/discourse/templates/components/toggle-deleted.hbs deleted file mode 100644 index 5475461580c..00000000000 --- a/app/assets/javascripts/discourse/templates/components/toggle-deleted.hbs +++ /dev/null @@ -1,7 +0,0 @@ -{{#if postStream.show_deleted}} -{{i18n 'badges.title'}}
-- {{#each badgeGroups as |bg|}} -+{{/d-section}} diff --git a/app/assets/javascripts/discourse/templates/category-group-autocomplete.raw.hbs b/app/assets/javascripts/discourse/templates/category-selector-autocomplete.raw.hbs similarity index 100% rename from app/assets/javascripts/discourse/templates/category-group-autocomplete.raw.hbs rename to app/assets/javascripts/discourse/templates/category-selector-autocomplete.raw.hbs diff --git a/app/assets/javascripts/discourse/templates/components/badge-selector.hbs b/app/assets/javascripts/discourse/templates/components/badge-selector.hbs new file mode 100644 index 00000000000..c1c29859e26 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/badge-selector.hbs @@ -0,0 +1 @@ + diff --git a/app/assets/javascripts/discourse/templates/components/basic-topic-list.hbs b/app/assets/javascripts/discourse/templates/components/basic-topic-list.hbs index 895708915d1..c174d4a9b42 100644 --- a/app/assets/javascripts/discourse/templates/components/basic-topic-list.hbs +++ b/app/assets/javascripts/discourse/templates/components/basic-topic-list.hbs @@ -7,7 +7,8 @@ expandExcerpts=expandExcerpts bulkSelectEnabled=bulkSelectEnabled canBulkSelect=canBulkSelect - selected=selected}} + selected=selected + skipHeader=skipHeader}} {{else}} {{#unless loadingMore}}---{{bg.badgeGrouping.displayName}}
++ {{#each badgeGroups as |bg|}} +- {{/each}} + {{/each}} ++- - {{#each bg.badges as |b|}} - {{badge-card badge=b navigateOnClick="true"}} - {{/each}} -++ + {{#each bg.badges as |b|}} + {{badge-card badge=b navigateOnClick="true"}} + {{/each}}{{bg.badgeGrouping.displayName}}
+diff --git a/app/assets/javascripts/discourse/templates/components/bread-crumbs.hbs b/app/assets/javascripts/discourse/templates/components/bread-crumbs.hbs index f737c969760..bbf8ef4caba 100644 --- a/app/assets/javascripts/discourse/templates/components/bread-crumbs.hbs +++ b/app/assets/javascripts/discourse/templates/components/bread-crumbs.hbs @@ -8,6 +8,6 @@ {{tag-drop firstCategory=firstCategory secondCategory=secondCategory tagId=tagId}} {{/if}} -{{plugin-outlet "bread-crumbs-right" tagName="li"}} +{{plugin-outlet name="bread-crumbs-right" connectorTagName="li"}} diff --git a/app/assets/javascripts/discourse/templates/components/categories-and-latest-topics.hbs b/app/assets/javascripts/discourse/templates/components/categories-and-latest-topics.hbs new file mode 100644 index 00000000000..c837733c189 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/categories-and-latest-topics.hbs @@ -0,0 +1,29 @@ +{{categories-only categories=categories}} + +diff --git a/app/assets/javascripts/discourse/templates/components/group-selector.hbs b/app/assets/javascripts/discourse/templates/components/group-selector.hbs index 2ae1e71d111..af73c13cbca 100644 --- a/app/assets/javascripts/discourse/templates/components/group-selector.hbs +++ b/app/assets/javascripts/discourse/templates/components/group-selector.hbs @@ -1 +1 @@ - + diff --git a/app/assets/javascripts/discourse/templates/components/latest-topic-list-item.hbs b/app/assets/javascripts/discourse/templates/components/latest-topic-list-item.hbs new file mode 100644 index 00000000000..e42241f0bb3 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/latest-topic-list-item.hbs @@ -0,0 +1,39 @@ ++ +
+ + diff --git a/app/assets/javascripts/discourse/templates/components/categories-only.hbs b/app/assets/javascripts/discourse/templates/components/categories-only.hbs new file mode 100644 index 00000000000..f2db6778627 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/categories-only.hbs @@ -0,0 +1,49 @@ +{{#if categories}} ++ + + + {{#if topics}} + {{#each topics as |t|}} + {{latest-topic-list-item topic=t}} + {{/each}} +{{i18n "filters.latest.title"}} ++ + {{else}} ++ {{i18n "more"}} + ++ + {{/if}} + ++ +{{i18n "topics.none.latest"}}
++ +
+{{/if}} diff --git a/app/assets/javascripts/discourse/templates/components/categories-with-featured-topics.hbs b/app/assets/javascripts/discourse/templates/components/categories-with-featured-topics.hbs new file mode 100644 index 00000000000..9243d150285 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/categories-with-featured-topics.hbs @@ -0,0 +1,3 @@ +{{categories-only categories=categories + latestTopicOnly=latestTopicOnly + showTopics="true"}} diff --git a/app/assets/javascripts/discourse/templates/components/category-drop.hbs b/app/assets/javascripts/discourse/templates/components/category-drop.hbs index ee2c7c72aa4..9e9cc410e57 100644 --- a/app/assets/javascripts/discourse/templates/components/category-drop.hbs +++ b/app/assets/javascripts/discourse/templates/components/category-drop.hbs @@ -16,7 +16,7 @@ {{#if categories}} -+ + + + {{#each categories as |c|}} +{{i18n 'categories.category'}} +{{i18n 'categories.topics'}} + {{#if showTopics}} +{{i18n 'categories.latest'}} + {{/if}} ++ + {{/each}} + ++ ++ {{category-title-link category=c}} ++ {{#if c.subcategories}} ++ {{{c.description_excerpt}}} ++ ++ {{#each c.subcategories as |s|}} + + {{category-link s hideParent="true"}} + {{category-unread category=s}} + + {{/each}} ++ {{/if}} ++ + {{#if showTopics}} +{{{c.stat}}}+ {{category-unread category=c tagName="div" class="unread-new"}} ++ {{#each c.featuredTopics as |t|}} + {{featured-topic topic=t latestTopicOnly=latestTopicOnly}} + {{/each}} + + {{/if}} ++ +
diff --git a/app/assets/javascripts/discourse/templates/components/navigation-bar.hbs b/app/assets/javascripts/discourse/templates/components/navigation-bar.hbs index e24d25bfb2d..3a2496cc969 100644 --- a/app/assets/javascripts/discourse/templates/components/navigation-bar.hbs +++ b/app/assets/javascripts/discourse/templates/components/navigation-bar.hbs @@ -1,4 +1,5 @@ {{#each navItems as |navItem|}} {{navigation-item content=navItem filterMode=filterMode}} {{/each}} -{{custom-html "extraNavItem"}} +{{custom-html name="extraNavItem"}} +{{plugin-outlet name="extra-nav-item" connectorTagName="li"}} diff --git a/app/assets/javascripts/discourse/templates/components/plugin-outlet.hbs b/app/assets/javascripts/discourse/templates/components/plugin-outlet.hbs new file mode 100644 index 00000000000..73126a2572f --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/plugin-outlet.hbs @@ -0,0 +1,3 @@ +{{#each connectors as |c|}} + {{plugin-connector connector=c args=args class=c.classNames tagName=connectorTagName}} +{{/each}} diff --git a/app/assets/javascripts/discourse/templates/components/quote-button.hbs b/app/assets/javascripts/discourse/templates/components/quote-button.hbs new file mode 100644 index 00000000000..1dce9fb2885 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/quote-button.hbs @@ -0,0 +1 @@ +{{i18n "post.quote_reply"}} diff --git a/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs b/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs new file mode 100644 index 00000000000..6df6fcb44da --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs @@ -0,0 +1,83 @@ ++ + {{#with topic.lastPoster as |lastPoster|}} + {{#user-link user=lastPoster}} + {{avatar lastPoster imageSize="large"}} + {{/user-link}} + {{/with}} + ++ + {{topic-status topic=topic}} + {{topic-link topic}} + {{#if topic.featured_link}} + {{topic-featured-link topic}} + {{/if}} + {{topic-post-badges newPosts=topic.totalUnread unseen=topic.unseen url=topic.lastUnreadUrl}} + ++ {{category-link topic.category}} + {{#if topic.tags}} + + + + {{/if}} ++ {{raw "list/posts-count-column" topic=topic tagName="div"}} + + + + +++ + + +{{#if siteSettings.tagging_enabled}} ++ +++ {{user-selector + excludeCurrentUser=false + usernames=searchedTerms.username + class="user-selector" + single="true" + canReceiveUpdates="true"}} +++ +++ {{category-selector categories=searchedTerms.category single="true"}} ++++{{/if}} + ++ +++ {{tag-chooser tags=searchedTerms.tags blacklist=searchedTerms.tags allowCreate=false placeholder="" everyTag="true" unlimitedTagCount="true" width="70%"}} ++++ ++ +++++ + + + + {{combo-box id="in" valueAttribute="value" content=inOptions value=searchedTerms.in none="user.locale.any"}} ++ +++ {{combo-box id="status" valueAttribute="value" content=statusOptions value=searchedTerms.status none="user.locale.any"}} +++diff --git a/app/assets/javascripts/discourse/templates/components/share-popup.hbs b/app/assets/javascripts/discourse/templates/components/share-popup.hbs new file mode 100644 index 00000000000..65e1c5d3c6e --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/share-popup.hbs @@ -0,0 +1,24 @@ ++ +++ {{combo-box id="postTime" valueAttribute="value" content=postTimeOptions value=searchedTerms.time.when}} + {{input type="date" value=searchedTerms.time.days class="input-small" id='search-post-date'}} +++ +++ {{input type="number" value=searchedTerms.min_post_count class="input-small" id='search-min-post-count'}} ++{{shareTitle}}
+ +{{#if date}} + {{displayDate}} +{{/if}} + ++ ++ +{{#each sources as |s|}} + {{share-source source=s title=model.title action="share"}} +{{/each}} + +{{#if topic.details.can_reply_as_new_topic}} + + +{{/if}} + + diff --git a/app/assets/javascripts/discourse/templates/components/stream-item.hbs b/app/assets/javascripts/discourse/templates/components/stream-item.hbs index 0018f8a2d84..fed530753ef 100644 --- a/app/assets/javascripts/discourse/templates/components/stream-item.hbs +++ b/app/assets/javascripts/discourse/templates/components/stream-item.hbs @@ -6,7 +6,7 @@ {{{item.title}}}{{category-link item.category}}- {{plugin-outlet "user-stream-item-header"}} + {{plugin-outlet name="user-stream-item-header" args=(hash item=item)}}{{i18n 'deleted_filter.disabled_description'}}
- -{{else}} -{{i18n 'deleted_filter.enabled_description'}}
- -{{/if}} diff --git a/app/assets/javascripts/discourse/templates/components/topic-category.hbs b/app/assets/javascripts/discourse/templates/components/topic-category.hbs index c3114225607..edf11686ba9 100644 --- a/app/assets/javascripts/discourse/templates/components/topic-category.hbs +++ b/app/assets/javascripts/discourse/templates/components/topic-category.hbs @@ -2,12 +2,16 @@ {{bound-category-link topic.category.parentCategory}} {{/if}} {{bound-category-link topic.category hideParent=true}} -{{#if siteSettings.tagging_enabled}} - -{{/if}} - -{{plugin-outlet "topic-category"}} ++ {{#if siteSettings.tagging_enabled}} ++{{plugin-outlet name="topic-category" args=(hash topic=topic category=topic.category)}} diff --git a/app/assets/javascripts/discourse/templates/topic-entrance.hbs b/app/assets/javascripts/discourse/templates/components/topic-entrance.hbs similarity index 100% rename from app/assets/javascripts/discourse/templates/topic-entrance.hbs rename to app/assets/javascripts/discourse/templates/components/topic-entrance.hbs diff --git a/app/assets/javascripts/discourse/templates/components/topic-footer-buttons.hbs b/app/assets/javascripts/discourse/templates/components/topic-footer-buttons.hbs new file mode 100644 index 00000000000..ec1e9eac88f --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/topic-footer-buttons.hbs @@ -0,0 +1,83 @@ +{{#if showAdminButton}} + {{topic-admin-menu-button + topic=topic + openUpwards="true" + toggleMultiSelect=toggleMultiSelect + deleteTopic=deleteTopic + recoverTopic=recoverTopic + toggleClosed=toggleClosed + toggleArchived=toggleArchived + toggleVisibility=toggleVisibility + showAutoClose=showAutoClose + showFeatureTopic=showFeatureTopic + showChangeTimestamp=showChangeTimestamp + convertToPublicTopic=convertToPublicTopic + convertToPrivateMessage=convertToPrivateMessage}} +{{/if}} + +{{#unless topic.isPrivateMessage}} + {{#if site.mobileView}} + {{topic-footer-mobile-dropdown topic=topic + showInvite=showInvite + showFlagTopic=showFlagTopic}} + {{else}} + {{d-button class=bookmarkClass + title=bookmarkTitle + label=bookmarkLabel + icon="bookmark" + action=toggleBookmark}} + + + + {{#if topic.details.can_flag_topic}} + {{d-button class="flag-topic" + title="topic.flag_topic.help" + label="topic.flag_topic.title" + icon="flag" + action=showFlagTopic}} + {{/if}} + + {{/if}} +{{/unless}} + +{{#if canInviteTo}} + {{d-button class="invite-topic" + title="topic.invite_reply.help" + label="topic.invite_reply.title" + icon="users" + action=showInvite + disabled=inviteDisabled}} +{{/if}} + +{{#if topic.isPrivateMessage}} + {{d-button class="standard" + title=archiveTitle + label=archiveLabel + icon=archiveIcon + action=toggleArchiveMessage}} +{{/if}} + +{{plugin-outlet name="topic-footer-main-buttons-before-create" + args=(hash topic=topic) + connectorTagName="span"}} + +{{#if topic.details.can_create_post}} + {{d-button class="btn-primary create" + icon="reply" + action=replyToPost + label="topic.reply.title" + title="topic.reply.help"}} +{{/if}} + +{{plugin-outlet name="after-topic-footer-main-buttons" + args=(hash topic=topic) + connectorTagName="span"}} + +{{pinned-button topic=topic}} +{{topic-notifications-button topic=topic}} +{{plugin-outlet name="after-topic-footer-buttons" + args=(hash topic=topic) + connectorTagName="span"}} diff --git a/app/assets/javascripts/discourse/templates/components/topic-list.hbs b/app/assets/javascripts/discourse/templates/components/topic-list.hbs index ebc2e1bf5a6..e6c37234476 100644 --- a/app/assets/javascripts/discourse/templates/components/topic-list.hbs +++ b/app/assets/javascripts/discourse/templates/components/topic-list.hbs @@ -26,6 +26,8 @@ showOpLikes=showOpLikes expandGloballyPinned=expandGloballyPinned expandAllPinned=expandAllPinned + lastVisitedTopic=lastVisitedTopic selected=selected}} + {{raw "list/visited-line" lastVisitedTopic=lastVisitedTopic topic=topic}} {{/each}} diff --git a/app/assets/javascripts/discourse/templates/components/topic-progress.hbs b/app/assets/javascripts/discourse/templates/components/topic-progress.hbs index a840c135645..1e2dfce6ccb 100644 --- a/app/assets/javascripts/discourse/templates/components/topic-progress.hbs +++ b/app/assets/javascripts/discourse/templates/components/topic-progress.hbs @@ -1,33 +1,13 @@ -{{#unless hidden}} - {{#if expanded}} - - {{/if}} - -{{/unless}} + diff --git a/app/assets/javascripts/discourse/templates/components/user-card-contents.hbs b/app/assets/javascripts/discourse/templates/components/user-card-contents.hbs new file mode 100644 index 00000000000..a38acddd1d8 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/user-card-contents.hbs @@ -0,0 +1,128 @@ +{{#if visible}} + + {{/if}} + {{#if siteSettings.topic_featured_link_enabled}} + {{topic-featured-link topic}} + {{/if}} ++ ++{{/if}} diff --git a/app/assets/javascripts/discourse/templates/composer.hbs b/app/assets/javascripts/discourse/templates/composer.hbs index 2551444d598..9e20fd73309 100644 --- a/app/assets/javascripts/discourse/templates/composer.hbs +++ b/app/assets/javascripts/discourse/templates/composer.hbs @@ -1,135 +1,145 @@ -{{#if visible}} -+ {{bound-avatar avatar "huge"}} + {{#if user.primary_group_name}} + {{avatar-flair + flairURL=user.primary_group_flair_url + flairBgColor=user.primary_group_flair_bg_color + flairColor=user.primary_group_flair_color + groupName=user.primary_group_name}} + {{/if}} ++ ++ ++ ++ {{if nameFirst user.name username}} {{user-status user currentUser=currentUser}} +
+ + {{#unless nameFirst}} + {{#if user.name}} +{{user.name}}
+ {{/if}} + {{else}} +{{username}}
+ {{/unless}} + + {{#if user.title}} +{{user.title}}
+ {{/if}} + + {{plugin-outlet name="user-card-post-names" args=(hash user=user) tagName='div'}} + ++ {{#if user.can_send_private_message_to_user}} +
+ + {{#if isSuspended}} +- {{fa-icon "envelope"}}{{i18n 'user.private_message'}}
+ {{/if}} + + {{#if showFilter}} +- {{fa-icon "filter"}}{{i18n 'topic.filter_to' username=username count=topicPostCount}}
+ {{/if}} + + {{#if hasUserFilters}} +- {{fa-icon "times"}}{{i18n 'topic.filters.cancel'}}
+ {{/if}} + + {{#if showDelete}} +- {{fa-icon "exclamation-triangle"}}{{i18n 'admin.user.delete'}}
+ {{/if}} ++ {{fa-icon "ban"}} + {{i18n 'user.suspended_notice' date=user.suspendedTillDate}}+ {{else}} + {{#if user.bio_cooked}}
+ {{i18n 'user.suspended_reason'}} {{user.suspend_reason}} +{{text-overflow class="overflow" text=user.bio_excerpt}}{{/if}} + {{/if}} + + {{#if user.card_badge}} + {{#link-to 'badges.show' user.card_badge class="card-badge" title=user.card_badge.name}} + {{icon-or-image user.card_badge.image title=user.card_badge.name}} + {{/link-to}} + {{/if}} + + {{#if hasLocationOrWebsite}} ++ {{#if user.location}} + {{fa-icon "map-marker"}} {{user.location}} + {{/if}} + + {{#if user.website_name}} + + {{fa-icon "globe"}} + {{#if linkWebsite}} + {{user.website_name}} + {{else}} + {{user.website_name}} + {{/if}} + + {{/if}} + + {{plugin-outlet name="user-card-location-and-website" args=(hash user=user)}} ++ {{/if}} + + {{#if user}} + + {{/if}} + + {{#if publicUserFields}} ++ {{#each publicUserFields as |uf|}} + {{#if uf.value}} ++ {{/if}} + + {{#if showBadges}} ++ {{uf.field.name}}: + {{uf.value}} ++ {{/if}} + {{/each}} ++ {{#each user.featured_user_badges as |ub|}} + {{user-badge badge=ub.badge user=user}} + {{/each}} + {{#if showMoreBadges}} + {{#link-to 'user.badges' user class="btn more-user-badges"}} + {{i18n 'badges.more_badges' count=moreBadgesCount}} + {{/link-to}} + {{/if}} ++ {{/if}} ++{{#composer-body + composer=model + openIfDraft="openIfDraft" + typed="typed" + cancelled="cancelled" + save="save"}} + {{#if visible}} +- {{#if showPopupMenu}} - {{#popup-menu visible=optionsVisible hide="hideOptions" title="composer.options"}} - {{#each popupMenuOptions as |option|}} - {{#if option.condition}} --{{plugin-outlet "discovery-below"}} +{{plugin-outlet name="discovery-below"}} diff --git a/app/assets/javascripts/discourse/templates/discovery/categories.hbs b/app/assets/javascripts/discourse/templates/discovery/categories.hbs index c4fb4fa6777..ae53e4cc788 100644 --- a/app/assets/javascripts/discourse/templates/discovery/categories.hbs +++ b/app/assets/javascripts/discourse/templates/discovery/categories.hbs @@ -1,59 +1,6 @@ -{{#if model.categories}} - {{#discovery-categories refresh="refresh"}} -- {{d-button action=option.action icon=option.icon label=option.label}} - + {{#if showPopupMenu}} + {{#popup-menu visible=optionsVisible hide="hideOptions" title="composer.options"}} + {{#each popupMenuOptions as |option|}} + {{#if option.condition}} ++ {{d-button action=option.action icon=option.icon label=option.label}} + + {{/if}} + {{/each}} + {{/popup-menu}} + {{/if}} + + {{composer-messages composer=model messageCount=messageCount addLinkLookup="addLinkLookup"}} + ++ {{#if site.mobileView}} + {{/if}} - {{/each}} - {{/popup-menu}} - {{/if}} + - {{composer-messages composer=model messageCount=messageCount addLinkLookup="addLinkLookup"}} + {{#if model.viewOpen}} ++ {{/if}} +{{/composer-body}} diff --git a/app/assets/javascripts/discourse/templates/composer/similar-topics.hbs b/app/assets/javascripts/discourse/templates/composer/similar-topics.hbs index 0f9d3797e77..304352f5496 100644 --- a/app/assets/javascripts/discourse/templates/composer/similar-topics.hbs +++ b/app/assets/javascripts/discourse/templates/composer/similar-topics.hbs @@ -2,5 +2,5 @@+++ {{plugin-outlet name="composer-open" args=(hash model=model)}} --{{/if}} +- {{#if site.mobileView}} - - {{/if}} - - - {{#if model.viewOpen}} ---- {{else}} -- {{plugin-outlet "composer-open"}} - -+ {{composer-editor topic=topic + composer=model + lastValidatedAt=lastValidatedAt + canWhisper=canWhisper + showPopupMenu=showPopupMenu + draftStatus=model.draftStatus + isUploading=isUploading + groupsMentioned="groupsMentioned" + cannotSeeMention="cannotSeeMention" + importQuote="importQuote" + showOptions="showOptions" + hideOptions="hideOptions" + optionsVisible=optionsVisible + showToolbar=showToolbar + showUploadSelector="showUploadSelector" + afterRefresh="afterRefresh"}} - {{composer-editor topic=topic - composer=model - lastValidatedAt=lastValidatedAt - canWhisper=canWhisper - showPopupMenu=showPopupMenu - draftStatus=model.draftStatus - isUploading=isUploading - groupsMentioned="groupsMentioned" - importQuote="importQuote" - showOptions="showOptions" - hideOptions="hideOptions" - optionsVisible=optionsVisible - showToolbar=showToolbar - showUploadSelector="showUploadSelector" - afterRefresh="afterRefresh"}} + {{#if currentUser}} + - - {{#if model.canEditTitle}} -- {{#if model.creatingPrivateMessage}} - {{composer-user-selector topicId=topicModel.id - usernames=model.targetUsernames - hasGroups=model.hasTargetGroups - focusTarget=focusTarget}} - {{#if showWarning}} -- {{/if}} - {{plugin-outlet "composer-fields"}} -- -+ + + {{#if model.canEditTitle}} ++ {{#if model.creatingPrivateMessage}} + {{composer-user-selector topicId=topicModel.id + usernames=model.targetUsernames + hasGroups=model.hasTargetGroups + focusTarget=focusTarget}} + {{#if showWarning}} +{{/if}} + {{plugin-outlet name="composer-fields" args=(hash model=model)}}+ ++ {{/if}} + {{/if}} + + {{composer-title composer=model lastValidatedAt=lastValidatedAt focusTarget=focusTarget}} + + {{#if model.showCategoryChooser}} ++ {{category-chooser valueAttribute="id" value=model.categoryId scopedCategoryId=scopedCategoryId tabindex="3"}} + {{popup-input-tip validation=categoryValidation}} ++ {{#if model.archetype.hasOptions}} + + {{/if}} + {{/if}} ++ {{plugin-outlet name="composer-fields-below" args=(hash model=model)}} + {{#if canEditTags}} + {{tag-chooser tags=model.tags tabIndex="4" categoryId=model.categoryId}} + {{/if}} + + {{i18n 'cancel'}} - {{#if currentUser}} -+ {{else}} +- {{plugin-outlet "composer-fields-below"}} - {{#if canEditTags}} - {{tag-chooser tags=model.tags tabIndex="4" categoryId=model.categoryId}} - {{/if}} - - {{i18n 'cancel'}} - - {{#if site.mobileView}} - {{#if whisperOrUnlistTopic}} - - {{/if}} + {{#if site.mobileView}} + {{#if whisperOrUnlistTopic}} + + {{/if}} + {{/if}} +{{/if}}+{{/if}} -+++ {{#if model.createdPost}} + {{i18n 'composer.saved'}} {{i18n 'composer.view_new_post'}} + {{else}} + {{i18n 'composer.saving'}} {{loading-spinner size="small"}} + {{/if}} +++ {{#if model.topic}} + {{fa-icon "mail-forward"}} {{{draftTitle}}} + {{else}} + {{i18n "composer.saved_draft"}} + {{/if}} ++-- {{/if}} ---- {{#if model.createdPost}} - {{i18n 'composer.saved'}} {{i18n 'composer.view_new_post'}} - {{else}} - {{i18n 'composer.saving'}} {{loading-spinner size="small"}} - {{/if}} --- {{i18n 'composer.saved_draft'}} --{{i18n 'composer.similar_topics'}}
- {{mount-widget widget="search-result-topic" args=(as-hash results=message.similarTopics)}} + {{mount-widget widget="search-result-topic" args=(hash results=message.similarTopics)}}
diff --git a/app/assets/javascripts/discourse/templates/discovery.hbs b/app/assets/javascripts/discourse/templates/discovery.hbs index 069be994bad..8c7a0d6d3f6 100644 --- a/app/assets/javascripts/discourse/templates/discovery.hbs +++ b/app/assets/javascripts/discourse/templates/discovery.hbs @@ -21,11 +21,12 @@- {{plugin-outlet "discovery-list-container-top"}} + {{plugin-outlet name="discovery-list-container-top" + args=(hash category=category)}} {{outlet "list-container"}}- -
- {{/discovery-categories}} - -{{/if}} +{{#discovery-categories refresh="refresh"}} + {{component categoryPageStyle + categories=model.categories + latestTopicOnly=latestTopicOnly + topics=model.topics}} +{{/discovery-categories}} diff --git a/app/assets/javascripts/discourse/templates/discovery/topics.hbs b/app/assets/javascripts/discourse/templates/discovery/topics.hbs index 4415e404c87..8d0ab34d9e2 100644 --- a/app/assets/javascripts/discourse/templates/discovery/topics.hbs +++ b/app/assets/javascripts/discourse/templates/discovery/topics.hbs @@ -33,6 +33,8 @@ {{#if hasTopics}} {{topic-list + highlightLastVisited=true + top=top showTopicPostBadges=showTopicPostBadges showPosters=true currentUser=currentUser @@ -46,6 +48,7 @@ selected=selected expandGloballyPinned=expandGloballyPinned expandAllPinned=expandAllPinned + category=category topics=model.topics}} {{/if}} {{/discovery-topics-list}} diff --git a/app/assets/javascripts/discourse/templates/full-page-search.hbs b/app/assets/javascripts/discourse/templates/full-page-search.hbs index b869f0a7241..bfeab09cfe2 100644 --- a/app/assets/javascripts/discourse/templates/full-page-search.hbs +++ b/app/assets/javascripts/discourse/templates/full-page-search.hbs @@ -1,119 +1,134 @@ -- - - - {{#each model.categories as |c|}} -{{i18n 'categories.category'}} -{{i18n 'categories.latest'}} -{{i18n 'categories.topics'}} -- - {{/each}} - -- -- {{category-title-link category=c}} - {{category-unread category=c}} - {{#if c.logo_url}} - {{category-logo-link category=c}} - {{/if}} - -- {{#if c.subcategories}} -- {{{c.description_excerpt}}} -- -- {{#each c.subcategories as |s|}} - {{category-link s hideParent="true"}} - {{category-unread category=s}} - {{/each}} -- {{/if}} -- {{#each c.featuredTopics as |f|}} - {{featured-topic topic=f latestTopicOnly=latestTopicOnly action="showTopicEntrance"}} - {{/each}} - -- -- - {{#each c.topicCountStats as |s|}} -
-- - {{/each}} - -{{s.value}} -/ {{s.unit}} -- {{search-text-field value=searchTerm class="full-page-search input-xxlarge search no-blur" action="search" hasAutofocus=hasAutofocus}} - {{d-button action="search" icon="search" class="btn-primary" disabled=searchButtonDisabled}} - {{#if currentUser}} - {{#unless site.mobileView}} - {{d-button id="create-topic" class="btn-default" action="createTopic" actionParam=searchTerm icon="plus" label="topic.create"}} - {{/unless}} - {{/if}} - {{#if canBulkSelect}} - {{#if model.posts}} - {{d-button icon="list" class="bulk-select" title="topics.bulk.toggle" action="toggleBulkSelect"}} - {{bulk-select-button selected=selected action="refresh"}} - {{/if}} - {{/if}} -+{{#d-section pageClass="search" class="search-container"}} ++ {{search-text-field value=searchTerm class="full-page-search input-xxlarge search no-blur" action="search" hasAutofocus=hasAutofocus}} + {{d-button action="search" icon="search" class="btn-primary" disabled=searching}} -{{#if model.posts}} - {{#if bulkSelectEnabled}} - - {{/if}} -{{/if}} ++ -{{#if context}} -- {{#if model.posts}} -- --{{/if}} - -{{#conditional-loading-spinner condition=loading}} - - {{#unless model.posts}} -- {{#if searchActive}} - {{i18n "search.no_results"}} + {{#if expanded}} + {{search-advanced-options searchTerm=searchTerm isExpanded=expanded}} {{/if}} - {{i18n "search.search_help"}} -
- {{/unless}} +-- {{/if}} - {{#each model.posts as |result|}} -- - {{{i18n "search.result_count" count=resultCount term=noSortQ}}} - --- - {{i18n "search.sort_by"}} - - {{combo-box value=sortOrder content=sortOrders castInteger="true"}} -+ {{#if canCreateTopic}} + {{d-button id="create-topic" class="btn-default" action="createTopic" actionParam=searchTerm icon="plus" label="topic.create"}} + {{/if}} + + {{#if canBulkSelect}} + {{d-button icon="list" class="bulk-select" title="topics.bulk.toggle" action="toggleBulkSelect"}} + {{bulk-select-button selected=selected action="search"}} + {{/if}}-- --+ {{#if bulkSelectEnabled}} + - {{/each}} - - {{#if model.posts}} -- {{#if bulkSelectEnabled}} - {{track-selected selectedList=selected selectedId=result.topic}} - {{/if}} - - - {{topic-status topic=result.topic disableActions=true}}{{#highlight-text highlight=q}}{{{unbound result.topic.fancyTitle}}}{{/highlight-text}} - - -- -- {{category-link result.topic.category}} - {{#each result.topic.tags as |tag|}} - {{discourse-tag tag}} - {{/each}} - {{plugin-outlet "full-page-search-category"}} --- - {{format-age result.created_at}} - {{#if result.blurb}} - - - {{/if}} - - - {{#if result.blurb}} - {{#highlight-text highlight=q}} - {{{unbound result.blurb}}} - {{/highlight-text}} - {{/if}} -- - {{#if showLikeCount}} - {{#if result.like_count}} - - {{result.like_count}} - - {{/if}} - {{/if}} -- {{i18n "search.no_more_results"}} - {{i18n "search.search_help"}} -
{{/if}} -{{/conditional-loading-spinner}} + {{#if invalidSearch}} ++ {{i18n "search.too_short"}} ++ {{/if}} + + {{#if context}} ++ ++ {{/if}} + + {{#conditional-loading-spinner condition=loading}} + + {{#unless hasResults}} ++ {{#if searchActive}} + {{i18n "search.no_results"}} + {{/if}} +
+ {{/unless}} + + {{#if hasResults}} +++ {{/if}} + + {{#each model.posts as |result|}} ++ + {{{i18n "search.result_count" count=resultCount term=noSortQ}}} + +++ + {{i18n "search.sort_by"}} + + {{combo-box value=sortOrder content=sortOrders castInteger="true"}} ++++ {{/each}} + + {{#if hasResults}} + + ++++ {{#if bulkSelectEnabled}} + {{track-selected selectedList=selected selectedId=result.topic}} + {{/if}} + + + {{topic-status topic=result.topic disableActions=true}}{{#highlight-text highlight=q}}{{{unbound result.topic.fancyTitle}}}{{/highlight-text}} + + ++ ++ {{category-link result.topic.category}} + {{#each result.topic.tags as |tag|}} + {{discourse-tag tag}} + {{/each}} + {{plugin-outlet name="full-page-search-category" args=(hash result=result)}} +++ + {{format-age result.created_at}} + {{#if result.blurb}} + - + {{/if}} + + + {{#if result.blurb}} + {{#highlight-text highlight=q}} + {{{unbound result.blurb}}} + {{/highlight-text}} + {{/if}} ++ + {{#if showLikeCount}} + {{#if result.like_count}} + + {{result.like_count}} {{fa-icon "heart"}} + + {{/if}} + {{/if}} ++ {{i18n "search.no_more_results"}} +
+ {{/if}} + + {{/conditional-loading-spinner}} +{{/d-section}} diff --git a/app/assets/javascripts/discourse/templates/group-posts.hbs b/app/assets/javascripts/discourse/templates/group-activity-posts.hbs similarity index 71% rename from app/assets/javascripts/discourse/templates/group-posts.hbs rename to app/assets/javascripts/discourse/templates/group-activity-posts.hbs index f38104880f4..7dbeebb3007 100644 --- a/app/assets/javascripts/discourse/templates/group-posts.hbs +++ b/app/assets/javascripts/discourse/templates/group-activity-posts.hbs @@ -1 +1 @@ -{{group-post-stream posts=model emptyText=emptyText loadMore="loadMore"}} +{{group-post-stream posts=model emptyText=emptyText loadMore="loadMore" loading=loading}} diff --git a/app/assets/javascripts/discourse/templates/group-edit.hbs b/app/assets/javascripts/discourse/templates/group-edit.hbs new file mode 100644 index 00000000000..03122d2abaa --- /dev/null +++ b/app/assets/javascripts/discourse/templates/group-edit.hbs @@ -0,0 +1,46 @@ ++ +diff --git a/app/assets/javascripts/discourse/templates/group-index.hbs b/app/assets/javascripts/discourse/templates/group-index.hbs index 41ad1fd9226..86a35b11122 100644 --- a/app/assets/javascripts/discourse/templates/group-index.hbs +++ b/app/assets/javascripts/discourse/templates/group-index.hbs @@ -1,45 +1,39 @@ -{{#if model}} - {{#if isOwner}} -- -- {{/if}} +{{group-membership-button model=model + createNewMessageViaParams='createNewMessageViaParams' + showLogin='showLogin'}} +{{#if hasMembers}} {{#load-more selector=".group-members tr" action="loadMore"}}{{i18n "groups.empty.users"}}+
+ +{{i18n "groups.empty.members"}}{{/if}} diff --git a/app/assets/javascripts/discourse/templates/group-logs.hbs b/app/assets/javascripts/discourse/templates/group-logs.hbs new file mode 100644 index 00000000000..154b78d678e --- /dev/null +++ b/app/assets/javascripts/discourse/templates/group-logs.hbs @@ -0,0 +1,33 @@ +{{#if model.logs}} ++ {{group-logs-filter clearFilter="clearFilter" value=filters.action type="action"}} + {{group-logs-filter clearFilter="clearFilter" value=filters.acting_user type="acting_user"}} + {{group-logs-filter clearFilter="clearFilter" value=filters.target_user type="target_user"}} + {{group-logs-filter clearFilter="clearFilter" value=filters.subject type="subject"}} ++ + {{#load-more selector=".group-logs .group-logs-row" action="loadMore"}} ++ +
+ {{/load-more}} + + {{conditional-loading-spinner condition=loading}} +{{else}} +{{i18n 'groups.logs.action'}} +{{i18n 'groups.logs.acting_user'}} +{{i18n 'groups.logs.target_user'}} +{{i18n 'groups.logs.subject'}} +{{i18n 'groups.logs.when'}} ++ + + + {{#each model.logs as |log|}} + {{group-logs-row + log=log + filters=filters}} + {{/each}} + + {{i18n "groups.empty.logs"}}+{{/if}} diff --git a/app/assets/javascripts/discourse/templates/group.hbs b/app/assets/javascripts/discourse/templates/group.hbs index 416b356f405..571c1813d6e 100644 --- a/app/assets/javascripts/discourse/templates/group.hbs +++ b/app/assets/javascripts/discourse/templates/group.hbs @@ -1,27 +1,47 @@ ---+++diff --git a/app/assets/javascripts/discourse/templates/group/activity.hbs b/app/assets/javascripts/discourse/templates/group/activity.hbs new file mode 100644 index 00000000000..d03a14e84f1 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/group/activity.hbs @@ -0,0 +1,27 @@ ++ {{#if model.flair_url}} + + {{avatar-flair + flairURL=model.flair_url + flairBgColor=model.flair_bg_color + flairColor=model.flair_color + groupName=model.name}} + + {{/if}} -+ + {{#mobile-nav class='group-nav' desktopClass="nav nav-pills" currentPath=application.currentPath}} + {{#each getTabs as |tab|}} +- - - -+ + {{#if model.bio_cooked}} +{{model.name}}
+ + {{groupName}} + ++ {{#if model.full_name}}{{model.name}}{{/if}}- - {{outlet}} - - + +
+ +++ {{/if}} +{{{model.bio_cooked}}}
++ {{#link-to tab.location model title=tab.message}} + {{#if tab.icon}}{{fa-icon tab.icon}}{{/if}} + {{tab.message}} + {{#if tab.count}}({{tab.count}}){{/if}} + {{/link-to}} + + {{/each}} + {{/mobile-nav}} + ++ {{outlet}}+ {{#mobile-nav class='group-activity-nav' desktopClass="pull-left nav nav-stacked" currentPath=application.currentPath}} +diff --git a/app/assets/javascripts/discourse/templates/groups.hbs b/app/assets/javascripts/discourse/templates/groups.hbs new file mode 100644 index 00000000000..2699777f5a6 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/groups.hbs @@ -0,0 +1,69 @@ +{{#d-section pageClass="groups"}} ++ {{#link-to 'group.activity.posts'}}{{i18n 'groups.posts'}}{{/link-to}} + + ++ {{#link-to 'group.activity.topics'}}{{i18n 'groups.topics'}}{{/link-to}} + + ++ {{#link-to 'group.activity.mentions'}}{{i18n 'groups.mentions'}}{{/link-to}} + + + {{#if showGroupMessages}} ++ {{#link-to 'group.activity.messages'}}{{i18n 'groups.messages'}}{{/link-to}} + + {{/if}} + {{/mobile-nav}} + ++++ {{outlet}} ++{{i18n "groups.index.title"}}
+ {{#if groups}} + {{#load-more selector=".groups-table .groups-table-row" action="loadMore"}} +++ {{/load-more}} + + {{conditional-loading-spinner condition=groups.loadingMore}} + {{else}} ++ +
++ {{i18n "groups.user_count"}} +{{i18n "groups.membership"}} + + + + {{#each groups as |group|}} ++ + {{/each}} + ++ {{#link-to "group.members" group.name}} + {{#if group.flair_url}} + + {{avatar-flair + flairURL=group.flair_url + flairBgColor=group.flair_bg_color + flairColor=group.flair_color + groupName=group.name}} + + {{/if}} + + + {{group.name}} + + {{#if group.full_name}} + {{group.full_name}} + {{/if}} + + {{#if group.title}} + + ++ {{group.title}} ++ {{/if}} + + {{/link-to}} +{{group.user_count}} + ++ {{#group-membership-button model=group + createNewMessageViaParams='createNewMessageViaParams' + showMembershipStatus=true + groupUserIds=groups.extras.group_user_ids + showLogin='showLogin'}} + + {{d-button icon="ban" + label=(if group.automatic 'groups.automatic_group' 'groups.closed_group') + disabled=true}} + {{/group-membership-button}} + +{{i18n "groups.index.empty"}}
+ {{/if}} +{{/d-section}} diff --git a/app/assets/javascripts/discourse/templates/hide-modal.hbs b/app/assets/javascripts/discourse/templates/hide-modal.hbs new file mode 100644 index 00000000000..69c2e656d9f --- /dev/null +++ b/app/assets/javascripts/discourse/templates/hide-modal.hbs @@ -0,0 +1 @@ +{{hide-modal-trigger}} diff --git a/app/assets/javascripts/discourse/templates/list/activity-column.raw.hbs b/app/assets/javascripts/discourse/templates/list/activity-column.raw.hbs index f6d485f55ef..56a994a5510 100644 --- a/app/assets/javascripts/discourse/templates/list/activity-column.raw.hbs +++ b/app/assets/javascripts/discourse/templates/list/activity-column.raw.hbs @@ -1 +1 @@ -<{{this.tagName}} class="{{class}} {{cold-age-class topic.createdAt startDate=topic.bumpedAt class=""}} activity" title="{{{topic.bumpedAtTitle}}}">{{format-date topic.bumpedAt format="tiny" noTitle="true"}}{{this.tagName}}> +<{{tagName}} class="{{class}} {{cold-age-class topic.createdAt startDate=topic.bumpedAt class=""}} activity" title="{{{topic.bumpedAtTitle}}}">{{format-date topic.bumpedAt format="tiny" noTitle="true"}}{{tagName}}> diff --git a/app/assets/javascripts/discourse/templates/list/posts-count-column.raw.hbs b/app/assets/javascripts/discourse/templates/list/posts-count-column.raw.hbs index 052bb477737..599d695abf5 100644 --- a/app/assets/javascripts/discourse/templates/list/posts-count-column.raw.hbs +++ b/app/assets/javascripts/discourse/templates/list/posts-count-column.raw.hbs @@ -1,3 +1,3 @@ <{{view.tagName}} class='num posts-map posts {{view.likesHeat}}' title='{{view.title}}'> - {{number topic.replyCount}} + {{number topic.replyCount noTitle="true"}} {{view.tagName}}> diff --git a/app/assets/javascripts/discourse/templates/list/topic-list-item.raw.hbs b/app/assets/javascripts/discourse/templates/list/topic-list-item.raw.hbs index bc21dfd6a7d..bd444a8e55c 100644 --- a/app/assets/javascripts/discourse/templates/list/topic-list-item.raw.hbs +++ b/app/assets/javascripts/discourse/templates/list/topic-list-item.raw.hbs @@ -7,7 +7,10 @@{{raw "topic-status" topic=topic}} {{topic-link topic}} - {{plugin-outlet "topic-list-after-title"}} + {{#if topic.featured_link}} + {{topic-featured-link topic}} + {{/if}} + {{raw-plugin-outlet name="topic-list-after-title"}} {{#if showTopicPostBadges}} {{raw "topic-post-badges" unread=topic.unread newPosts=topic.displayNewPosts unseen=topic.unseen url=topic.lastUnreadUrl}} {{/if}} @@ -18,7 +21,7 @@ {{/each}} {{/if}} - {{plugin-outlet "topic-list-tags"}} + {{raw-plugin-outlet name="topic-list-tags"}} {{#if expandPinned}} {{raw "list/topic-excerpt" topic=topic}} {{/if}} diff --git a/app/assets/javascripts/discourse/templates/list/visited-line.raw.hbs b/app/assets/javascripts/discourse/templates/list/visited-line.raw.hbs new file mode 100644 index 00000000000..16558146c5b --- /dev/null +++ b/app/assets/javascripts/discourse/templates/list/visited-line.raw.hbs @@ -0,0 +1,9 @@ +{{#if view.isLastVisited}} + + +{{/if}} diff --git a/app/assets/javascripts/discourse/templates/loading.hbs b/app/assets/javascripts/discourse/templates/loading.hbs new file mode 100644 index 00000000000..7b998117e8e --- /dev/null +++ b/app/assets/javascripts/discourse/templates/loading.hbs @@ -0,0 +1 @@ +{{loading-spinner}} diff --git a/app/assets/javascripts/discourse/templates/mobile/components/mobile-nav.hbs b/app/assets/javascripts/discourse/templates/mobile/components/mobile-nav.hbs index 6b46d500ee7..cdab47c07bb 100644 --- a/app/assets/javascripts/discourse/templates/mobile/components/mobile-nav.hbs +++ b/app/assets/javascripts/discourse/templates/mobile/components/mobile-nav.hbs @@ -1,4 +1,6 @@ -+ + {{i18n 'topics.new_messages_marker'}} + + +{{{selectedHtml}}} +{{#if selectedHtml}} +{{{selectedHtml}}} +{{/if}} diff --git a/app/assets/javascripts/discourse/templates/mobile/discovery/categories.hbs b/app/assets/javascripts/discourse/templates/mobile/discovery/categories.hbs index 34a6e99a27e..2c93702e92f 100644 --- a/app/assets/javascripts/discourse/templates/mobile/discovery/categories.hbs +++ b/app/assets/javascripts/discourse/templates/mobile/discovery/categories.hbs @@ -1,5 +1,5 @@ {{#each model.categories as |c|}} -+
@@ -33,9 +33,16 @@
Inbjudningslänken genererades utan problem!
Inbjudningslänken är endast giltig för den här e-postadressen: %{invitedEmail}
' + link_generated: "Länk för inbjudan framgångsrikt skapad!" + valid_for: "Länk för inbjudan är endast giltig för denna email adress: %{email}" bulk_invite: - none: "Du har inte skickat några inbjudningar. Du kan skicka individuella inbjudningar, eller så kan du bjuda in flera på en gång genom att ladda upp en bulkfil." text: "Massinbjudan från fil" - uploading: "Laddar upp..." success: "Filen laddades upp, du blir underrättad via meddelande när processen är klar" - error: "Det blev ett fel vid uppladdning av '{{filename}}': {{message}}" password: title: "Lösenord" too_short: "Ditt lösenord är för kort." @@ -781,12 +787,14 @@ sv: too_few_topics_notice: "Låt oss få igång den här diskussionen! Det finns för närvarande %{currentTopics} / %{requiredTopics} ämnen. Nya användare behöver några konversationer att läsa och svara på." too_few_posts_notice: "Låt oss få igång den här diskussionen! Det finns för närvarande %{currentPosts} / %{requiredPosts} inlägg. Nya användare behöver några konversationer att läsa och svara på." logs_error_rate_notice: - reached: "[%{relativeAge}] Aktuell takt av %{rate} har nått webbplatsinställningarnas gräns på %{siteSettingRate}." - exceeded: "[%{relativeAge}] Aktuell takt av %{rate} har överträffat webbplatsinställningarnas gräns på %{siteSettingRate}." + reached: "%{relativeAge} – %{rate} har uppnått webbplatsinställningarnas gräns på %{siteSettingRate}." + exceeded: "%{relativeAge} – %{rate} har överträffat webbplatsinställningarnas gräns på %{siteSettingRate}." rate: one: "1 fel/%{duration}" other: "%{count} fel/%{duration}" learn_more: "lär dig mer..." + all_time: 'totalt' + all_time_desc: 'totalt antal ämnen skapade' year: 'år' year_desc: 'ämnen skapade de senaste 365 dagarna' month: 'månad' @@ -833,6 +841,7 @@ sv: trust_level: 'Förtroendenivå' search_hint: 'användarnamn, e-post eller IP-adress' create_account: + disclaimer: "Genom att registrera dig godkänner du integritetspolicyn och användarvillkoren." title: "Registrera nytt konto" failed: "Något gick fel, kanske är denna e-post redan registrerad, försök glömt lösenordslänken" forgot_password: @@ -891,6 +900,16 @@ sv: github: title: "med GitHub" message: "Autentiserar med GitHub (kolla så att pop up-blockare inte är aktiverade)" + emoji_set: + apple_international: "Apple/International" + google: "Google" + twitter: "Twitter" + emoji_one: "Emoji One" + win10: "Win10" + category_page_style: + categories_only: "Endast kategorier" + categories_with_featured_topics: "Kategorier med framhävda ämnen" + categories_and_latest_topics: "Kategorier med senaste ämnen" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' @@ -900,15 +919,21 @@ sv: more_emoji: "mer..." options: "Alternativ" whisper: "viska" + unlist: "avlistad" add_warning: "Det här är en officiell varning." toggle_whisper: "Växla viskning" + toggle_unlisted: "Växla olistad" posting_not_on_topic: "Vilket ämne vill du svara på?" saving_draft_tip: "sparar…" saved_draft_tip: "sparat" saved_local_draft_tip: "sparat lokalt" similar_topics: "Ditt ämne liknar..." drafts_offline: "utkast offline" - group_mentioned: "Genom att nämna {{group}}, så kommer du att notifiera {{count}} medlemmar – är du säker?" + group_mentioned: + one: "Genom att nämna {{group}}, så kommer du att notifiera 1 person – är du säker?" + other: "Genom att nämna {{group}}, så kommer du att notifiera {{count}} medlemmar – är du säker?" + cannot_see_mention: + category: "Du nämnde {{username}} men hen kommer inte få någon notifikation för hen har inte tillgång till denna kategori. Du behöver lägga till hen till en grupp som har tillgång till den här kategorin." duplicate_link: "Det ser ut som att din länk till {{domain}} redan har delats i ämnet av @{{username}} i ett svar {{ago}} sedan – är du säker på att du vill dela den igen?" error: title_missing: "Du måste ange en rubrik" @@ -939,8 +964,10 @@ sv: show_preview: 'visa förhandsgranskning »' hide_preview: '« dölj förhandsgranskning' quote_post_title: "Citera hela inlägget" + bold_label: "B" bold_title: "Fet" bold_text: "fet text" + italic_label: "I" italic_title: "Kursiv" italic_text: "kursiv text" link_title: "Hyperlänk" @@ -958,6 +985,7 @@ sv: olist_title: "Numrerad lista" ulist_title: "Punktlista" list_item: "Listobjekt" + heading_label: "H" heading_title: "Rubrik" heading_text: "Rubrik" hr_title: "Horisontell linje" @@ -966,6 +994,9 @@ sv: modal_ok: "OK" modal_cancel: "Avbryt" cant_send_pm: "Tyvärr, du kan inte skicka ett meddelande till %{username}." + yourself_confirm: + title: "Glömde du lägga till mottagare?" + body: "Just nu skickas det här meddelandet bara till dig själv!" admin_options_title: "Valfria personalinställningar för detta ämne" auto_close: label: "Stäng automatiskt ämnet efter:" @@ -1049,13 +1080,13 @@ sv: most_liked: "Mest omtyckt" select_all: "Markera alla" clear_all: "Rensa allt" + too_short: "Din sökterm är för kort." result_count: one: "1 resultat för \"{{term}}\"" other: "{{count}} resultat för \"{{term}}\"" title: "sök efter ämnen, inlägg, användare, eller kategorier" no_results: "Inga resultat hittades." no_more_results: "Inga fler resultat hittades." - search_help: Sökhjälp searching: "Söker ..." post_format: "#{{post_number}} av {{username}}" context: @@ -1063,13 +1094,49 @@ sv: category: "Sök #{{category}} kategorin" topic: "Sök i det här ämnet" private_messages: "Sök meddelanden" + advanced: + title: Avancerad sökning + posted_by: + label: Postat av + in_category: + label: I kategorin + in_group: + label: I gruppen + with_tags: + label: Med taggar + filters: + likes: Jag gillade + posted: Jag postade i + watching: Jag tittar + tracking: Jag bevakar + private: finns i mitt meddelande + bookmarks: Jag har bokmärkt + first: är den första posten + pinned: är pinnade + unpinned: är inte pinnade + wiki: är wiki + statuses: + label: Där ämnen + open: är öppen + closed: är stängd + archived: är arkiverad + noreplies: har noll svar + single_user: innehåller en ensam användare + post: + time: + label: Publicerad + before: innan + after: efter hamburger_menu: "gå till en annan ämneslista eller kategori" new_item: "ny" go_back: 'gå tillbaka' not_logged_in_user: 'användarsida med sammanställning av aktuell aktivitet och inställningar' current_user: 'gå till din användarsida' topics: + new_messages_marker: "senaste besök" bulk: + select_all: "Välj alla" + clear_all: "Rensa alla" unlist_topics: "Avlista ämnen" reset_read: "Återställ lästa" delete: "Ta bort ämnen" @@ -1121,7 +1188,9 @@ sv: unsubscribe: stop_notifications: "Du kommer du att motta färre notifieringar från {{title}}" change_notification_state: "Ditt aktuella notifieringstillstånd är " - filter_to: "{{post_count}} inlägg i ämne" + filter_to: + one: "1 inlägg i ämnet" + other: "{{count}} inlägg i ämnet" create: 'Nytt ämne' create_long: 'Skapa ett nytt ämne' private_message: 'Skriv meddelande' @@ -1181,11 +1250,12 @@ sv: auto_close_title: 'Inställningar för automatisk stängning' auto_close_save: "Spara" auto_close_remove: "Stäng inte det här ämnet automatiskt" - auto_close_immediate: "Senaste inlägget i det här ämnet är redan %{hours} timmar gammal, så ämnet kommer att stängas omedelbart. " + auto_close_immediate: + one: "Senaste inlägget i det här ämnet är redan 1 timme gammalt, så ämnet kommer att stängas omedelbart. " + other: "Senaste inlägget i det här ämnet är redan %{count} timmar gammal, så ämnet kommer att stängas omedelbart. " timeline: back: "Tillbaka" back_description: "Gå tillbaka till det senaste olästa meddelandet" - replies: "%{current} / %{total} svar" replies_short: "%{current} / %{total}" progress: title: ämnesframsteg @@ -1193,10 +1263,11 @@ sv: go_bottom: "botten" go: "gå" jump_bottom: "hoppa till sista inlägget" + jump_prompt: "hoppa till inlägg" + jump_prompt_long: "Vilket inlägg vill du hoppa till?" jump_bottom_with_number: "hoppa till inlägg %{post_number}" total: antal inlägg current: nuvarande inlägg - position: "inlägg %{current} av %{total}" notifications: title: ändra hur ofta du får notifieringar om det här ämnet reasons: @@ -1271,6 +1342,9 @@ sv: share: title: 'Dela' help: 'dela en länk till detta ämne' + print: + title: 'Skriv ut' + help: 'Öppna en utskriftsvänlig version av det här ämnet' flag_topic: title: 'Flagga' help: 'flagga privat detta ämne för uppmärksamhet eller skicka en privat notifiering om den' @@ -1349,6 +1423,10 @@ sv: instructions: one: "Välj vilket ämne du vill flytta det inlägget till." other: "Välj vilket ämne du vill flytta deDavet bağlantısı başarılı bir şekilde oluşturuldu!
Davet bağlantısı sadece bu e-posta adresi için geçerlidir: %{invitedEmail}
' bulk_invite: - none: "Henüz kimseyi buraya davet etmediniz. Tek tek davetiye gönderebilirsiniz, ya da toplu bir davetiye dosyası yükleyerek birçok kişiyi aynı anda davet edebilirsiniz. " text: "Dosyadan Toplu Davet Gönder" - uploading: "Yükleniyor..." - success: "Dosya başarıyla yüklendi, işlem tamamlandığında mesajla bilgilendirileceksiniz." - error: "'{{filename}}' yüklenirken bir hata oluştu: {{message}}" + success: "Dosya başarıyla yüklendi, işlem tamamlandığında iletiyle bilgilendirileceksiniz." password: title: "Parola" too_short: "Parolanız çok kısa." common: "Bu parola çok yaygın." - same_as_username: "Şifreniz kullanıcı adınızla aynı." - same_as_email: "Şifreniz e-posta adresinizle aynı." + same_as_username: "Parolanız kullanıcı adınızla aynı." + same_as_email: "Parolanız e-posta adresinizle aynı." ok: "Parolanız uygun gözüküyor." instructions: "En az %{count} karakter." summary: title: "Özet" - stats: "İstatistikler" - time_read: "okunma süresi" + stats: "Sayıtımlar" + time_read: "okuma süresi" topic_count: other: "oluşturulan konular" post_count: - other: "oluşturmuş gönderiler" + other: "oluşturulan gönderiler" likes_given: other: " verilen" likes_received: other: " alınan " days_visited: - other: "ziyaret edilen günler" + other: "ziyaret edilen gün" posts_read: - other: "okunmuş yazılar" + other: "okunmuş gönderi" bookmark_count: - other: "yer imleri" - top_replies: "Başlıca Yanıtları" - no_replies: "Henüz yanıt bulunmuyor." - more_replies: "Diğer Yanıtları" + other: "imler" + top_replies: "Başlıca Cevapları" + no_replies: "Henüz cevap bulunmuyor." + more_replies: "Diğer Cevapları" top_topics: "Başlıca Konuları" no_topics: "Henüz konu bulunmuyor." - more_topics: "Diğer Konuları" + more_topics: "Diğer Konular" top_badges: "Başlıca Rozetleri" no_badges: "Henüz rozet bulunmuyor." more_badges: "Diğer Rozetleri" top_links: "Önemli Bağlantılar" no_links: "Henüz bir bağlantı bulunmuyor." - most_liked_by: "Tarafından en çok beğenilen" - most_liked_users: "Popüler Beğenmeler" - most_replied_to_users: "En çok cevaplanan" + most_liked_by: "En Çok Beğenen" + most_liked_users: "En Çok Beğenme" + most_replied_to_users: "En Çok Cevaplanan" no_likes: "Henüz bir beğeni bulunmuyor." associated_accounts: "Girişler" ip_address: @@ -698,7 +702,7 @@ tr_TR: title: "Kayıt Anındaki IP Adresi" avatar: title: "Profil Görseli" - header_title: "profil, mesajlar, işaretliler ve seçenekler" + header_title: "profil, iletiler, imler ve tercihler" title: title: "Başlık" filters: @@ -706,13 +710,13 @@ tr_TR: stream: posted_by: "Gönderen" sent_by: "Yollayan" - private_message: "mesaj" + private_message: "ileti" the_topic: "konu" loading: "Yükleniyor..." errors: - prev_page: "yüklemeye çalışırken" + prev_page: "şu sayfayı yüklemeye çalışırken:" reasons: - network: "Network Hatası" + network: "Ağ Hatası" server: "Sunucu Hatası" forbidden: "Erişim Reddedildi" unknown: "Hata" @@ -722,27 +726,31 @@ tr_TR: network_fixed: "Geri döndü gibi gözüküyor." server: "Hata kodu : {{status}}" forbidden: "Bunu görüntülemeye izniniz yok." - not_found: "Hoppala, uygulama var olmayan bir URL'i yüklemeye çalıştı." + not_found: "Hay aksi, uygulama var olmayan bir URL'i yüklemeye çalıştı." unknown: "Bir şeyler ters gitti." buttons: back: "Geri Dönün" again: "Tekrar Deneyin" fixed: "Sayfayı Yükle" close: "Kapat" - assets_changed_confirm: "Bu site yeni versiyona güncellendi. Son hali için sayfayı yenilemek ister misiniz?" + assets_changed_confirm: "Bu site yeni sürüme güncellendi. Son hali için sayfayı yenilemek ister misiniz?" logout: "Çıkış yapıldı." refresh: "Yenile" read_only_mode: - enabled: "Bu site salt okunur modda. Lütfen gezinmeye devam edin, ancak yanıt yazma, beğenme ve diğer aksiyonlar şu an için devre dışı durumda." - login_disabled: "Site salt-okunur modda iken oturum açma devre dışı bırakılır ." - logout_disabled: "Site salt okunur modda iken oturum kapatma işlemi yapılamaz." + enabled: "Bu site yalnızca okunur modunda. Lütfen gezinmeye devam edin, ancak cevap yazma, beğenme ve diğer eylemler şu an için devre dışı." + login_disabled: "Site yalnızca okunur modda iken oturum açma devre dışı bırakılır ." + logout_disabled: "Site yalnızca okunur modunda iken oturum kapatma işlemi yapılamaz." too_few_topics_and_posts_notice: "Hadi bu tartışmayı başlatalım! Şu anda %{currentTopics} / %{requiredTopics} konu ve %{currentPosts} / %{requiredPosts} gönderi var. Yeni ziyaretçiler okumak ve yanıtlamak için birkaç tartışmaya ihtiyaç duyarlar." too_few_topics_notice: "Hadi bu tartışmayı başlatalım! Şu anda %{currentTopics} / %{requiredTopics} konu var. Yeni ziyaretçiler okumak ve yanıtlamak için birkaç tartışmaya ihtiyaç duyarlar." too_few_posts_notice: "Hadi bu tartışmayı başlatalım! Şu anda %{currentPosts} / %{requiredPosts} gönderi var. Yeni ziyaretçiler okumak ve yanıtlamak için birkaç tartışmaya ihtiyaç duyarlar." logs_error_rate_notice: + reached: "%{relativeAge} – %{rate} , %{siteSettingRate} 'in site ayarları limitine ulaştı." + exceeded: "%{relativeAge} – %{rate} , %{siteSettingRate} 'in site ayarları limitini aştı." rate: other: "%{count} hata/%{duration}" learn_more: "daha fazlasını öğren..." + all_time: 'toplam' + all_time_desc: 'toplam oluşturulan konu' year: 'yıl' year_desc: 'son 365 günde oluşturulan konular' month: 'ay' @@ -758,17 +766,17 @@ tr_TR: replies_lowercase: other: cevap signup_cta: - sign_up: "Üye Ol" + sign_up: "Kayıt Ol" hide_session: "Yarın bana hatırlat" hide_forever: "hayır teşekkürler" - hidden_for_session: "Tamamdır, yarın tekrar soracağım. İstediğiniz zaman 'Giriş' yaparak da hesap oluşturabilirsiniz." - intro: "Nabersin! :heart_eyes: Görüneşe göre tartışmaların keyfini çıkaryorsun, fakat henüz bir hesap almak için kayıt olmamışsın." - value_prop: "Bir hesap oluşturduğunuzda, tam olarak neyi okuyor olduğunuzu hatırlarız, böylece her zaman okumayı bırakmış olduğunuz yere geri gelirsiniz. Ayrıca burada, yeni gönderiler yağıldığında email yoluyla bildirim alırsınız. Ve sevgiyi paylaşmak için gönderileri beğenebilirsiniz. :heartbeat:" + hidden_for_session: "Tamamdır, yarın tekrar soracağım. İstediğiniz zaman 'Giriş' kısmını kullanarak da hesap oluşturabilirsiniz." + intro: "Hey naber! :heart_eyes: Görünüşe göre tartışmaların keyfini çıkarıyorsun, fakat henüz bir hesap almak için kayıt olmamışsın." + value_prop: "Bir hesap oluşturduğunuzda, tam olarak neyi okuyor olduğunuzu hatırlarız, böylece her zaman okumayı bırakmış olduğunuz yere geri gelirsiniz. Ayrıca burada, yeni gönderiler yığıldığında e-posta yoluyla bildirim alırsınız. Ve sevgiyi paylaşmak için gönderileri beğenebilirsiniz. :heartbeat:" summary: enabled_description: "Bu konunun özetini görüntülemektesiniz: topluluğun en çok ilgisini çeken gönderiler" - description: "{{replyCount}} adet yanıt var." - description_time: "Tahmini okuma süresi {{readingTime}} dakika olan {{replyCount}} yanıt var." - enable: 'Bu Konuyu Özetle.' + description: "{{replyCount}} adet cevap var." + description_time: "Tahmini okuma süresi {{readingTime}} dakika olan {{replyCount}} cevap var." + enable: 'Bu Konuyu Özetle' disable: 'Tüm Gönderileri Göster' deleted_filter: enabled_description: "Bu konu gizlenen silinmiş gönderiler içeriyor." @@ -776,10 +784,10 @@ tr_TR: enable: "Silinen Gönderileri Gizle" disable: "Silinen Gönderileri Göster" private_message_info: - title: "Mesaj" + title: "İleti" invite: "Diğerlerini Davet Et..." - remove_allowed_user: "Bu mesajlaşmadan {{name}} isimli kullanıcıyı çıkarmak istediğinize emin misiniz?" - remove_allowed_group: "{{name}} bunu gerçekten mesajdan kaldırmak istiyor musunuz?" + remove_allowed_user: "Bu iletiden {{name}} isimli kullanıcıyı çıkarmak istediğinize emin misiniz?" + remove_allowed_group: "{{name}} bunu gerçekten iletiden kaldırmak istiyor musunuz?" email: 'E-posta' username: 'Kullanıcı Adı' last_seen: 'Son Görülme' @@ -821,9 +829,9 @@ tr_TR: not_allowed_from_ip_address: "Bu IP adresiyle oturum açamazsınız." admin_not_allowed_from_ip_address: "Bu IP adresinden yönetici olarak oturum açamazsınız." resend_activation_email: "Etkinleştirme e-postasını tekrar yollamak için buraya tıklayın. " - sent_activation_email_again: "{{currentEmail}} adresine yeni bir etkinleştirme e-postası yolladık. Bu e-postanın size ulaşması bir kaç dakika sürebilir; spam klasörüzü kontrol etmeyi unutmayın." + sent_activation_email_again: "{{currentEmail}} adresine yeni bir etkinleştirme e-postası yolladık. Bu e-postanın size ulaşması bir kaç dakika sürebilir; istenmeyen klasörüzü kontrol etmeyi unutmayın." to_continue: "Lütfen Giriş Yap" - preferences: "Seçeneklerinizi değiştirebilmek için giriş yapmanız gerekiyor." + preferences: "Tercihlerinizi değiştirebilmek için giriş yapmanız gerekiyor." forgot: "Hesap bilgilerimi hatırlamıyorum" google: title: "Google ile" @@ -852,6 +860,10 @@ tr_TR: twitter: "Twitter" emoji_one: "Emoji One" win10: "Win10" + category_page_style: + categories_only: "Yalnızca Kategoriler" + categories_with_featured_topics: "Kategoriler ve Öne Çıkarılan Konular" + categories_and_latest_topics: "Kategoriler ve Son Konular" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' @@ -861,21 +873,26 @@ tr_TR: more_emoji: "dahası..." options: "Seçenekler" whisper: "fısıltı" + unlist: "listelenmedi" add_warning: "Bu resmi bir uyarıdır." - toggle_whisper: "Fısıldamayı Göster/Gizle" + toggle_whisper: "Fısıldamayı Aç/Kapa" + toggle_unlisted: "Listelenmeme aç/kapa" posting_not_on_topic: "Hangi konuyu cevaplamak istiyorsun?" saving_draft_tip: "kaydediliyor..." saved_draft_tip: "kaydedildi" saved_local_draft_tip: "yerele kaydedildi" similar_topics: "Konunuz şunlara çok benziyor..." drafts_offline: "çevrimdışı taslaklar" + group_mentioned: + other: "{{group}} hakkında konuşarak {{count}} kişiyi bilgilendirmek üzeresin, emin misin?" + duplicate_link: "Görünüşe göre {{domain}} alan adına bağlanan bağlantınız @{{username}} tarafından a cevabı içerisinde {{ago}} yayınlanmış görünüyor. – tekrar yayınlamak istediğinize emin misiniz?" error: title_missing: "Başlık gerekli" title_too_short: "Başlık en az {{min}} karakter olmalı" title_too_long: "Başlık {{max}} karakterden daha uzun olamaz" post_missing: "Gönderiler boş olamaz" post_length: "Gönderi en az {{min}} karakter olmalı" - try_like: ' butonunu denediniz mi?' + try_like: ' düğmesini denediniz mi?' category_missing: "Bir kategori seçmelisiniz" save_edit: "Değişikliği Kaydet" reply_original: "Ana Konuyu Cevapla" @@ -883,7 +900,7 @@ tr_TR: reply: "Cevapla" cancel: "İptal et" create_topic: "Konu Oluştur" - create_pm: "Mesaj" + create_pm: "İleti" title: "Ya da Ctrl+Enter'a bas" users_placeholder: "Kullanıcı ekle" title_placeholder: "Bir cümlede açıklamak gerekirse bu tartışmanın konusu nedir?" @@ -898,14 +915,16 @@ tr_TR: show_preview: 'önizlemeyi göster »' hide_preview: '« önizlemeyi gizle' quote_post_title: "Tüm gönderiyi alıntıla" + bold_label: "B" bold_title: "Kalın" bold_text: "kalın yazı" + italic_label: "I" italic_title: "Vurgular" italic_text: "vurgulanan yazı" link_title: "Bağlantı" link_description: "buraya bağlantı açıklamasını girin" link_dialog_title: "Bağlantı ekle" - link_optional_text: "opsiyonel başlık" + link_optional_text: "isteğe bağlı başlık" link_url_placeholder: "http://ornek.com" quote_title: "Blok-alıntı" quote_text: "Blok-alıntı" @@ -917,6 +936,7 @@ tr_TR: olist_title: "Numaralandırılmış Liste" ulist_title: "Madde İşaretli Liste" list_item: "Liste öğesi" + heading_label: "H" heading_title: "Başlık" heading_text: "Başlık" hr_title: "Yatay Çizgi" @@ -924,8 +944,11 @@ tr_TR: toggler: "yazım alanını gizle veya göster" modal_ok: "Tamam" modal_cancel: "İptal" - cant_send_pm: "Üzgünüz, %{username} kullanıcısına mesaj gönderemezsiniz." - admin_options_title: "Bu konu için opsiyonel görevli ayarları" + cant_send_pm: "Üzgünüz, %{username} kullanıcısına ileti gönderemezsiniz." + yourself_confirm: + title: "Alıcıları eklemeyi unuttun mu?" + body: "Bu ileti şu an sadece sana gönderiliyor!" + admin_options_title: "Bu konu için isteğe bağlı görevli ayarları" auto_close: label: "Başlığı otomatik kapatma zamanı:" error: "Lütfen geçerli bir değer giriniz." @@ -936,11 +959,11 @@ tr_TR: units: "(saat sayısı)" examples: 'Saat sayısını giriniz (24).' notifications: - title: "@isim bahsedilişleri, gönderileriniz ve konularınıza verilen cevaplar, mesajlarla vb. ilgili bildiriler" + title: "@isim bahsedilişleri, gönderileriniz ve konularınıza verilen cevaplar, iletilerle vb. ilgili bildiriler" none: "Şu an için bildirimler yüklenemiyor." - empty: "Bildirim Yok" + empty: "Bildirim yok." more: "daha eski bildirimleri görüntüle" - total_flagged: "tüm bayraklanan gönderiler" + total_flagged: "toplam bildirilen gönderiler" mentioned: "{{username}} {{description}}
" group_mentioned: "{{username}} {{description}}
" quoted: "{{username}} {{description}}
" @@ -951,16 +974,16 @@ tr_TR: liked_2: "{{username}}, {{username2}} {{description}}
" liked_many: other: "{{username}}, {{username2}} ve diğer {{count}} kişi {{description}}
" - private_message: "{{username}} {{description}}
" - invited_to_private_message: "{{username}} {{description}}
" + private_message: "{{username}} {{description}}
" + invited_to_private_message: "{{username}} {{description}}
" invited_to_topic: "{{username}} {{description}}
" invitee_accepted: "{{username}} davetini kabul etti!
" moved_post: "{{username}} taşıdı {{description}}
" - linked: "{{username}} {{description}}
" + linked: "{{username}} {{description}}
" granted_badge: "{{description}} rozeti kazandınız!
" - watching_first_post: "Yeni Konu {{description}}
" + watching_first_post: "Yeni Konu {{description}}
" group_message_summary: - other: "{{group_name}} isimli grubunuzun gelen kutusunda {{count}} adet mesaj var
" + other: "{{group_name}} isimli grubunuzun gelen kutusunda {{count}} adet ileti var
" alt: mentioned: "Bahsedildi, şu kişi tarafından" quoted: "Alıntılandı, şu kişi tarafından" @@ -968,21 +991,21 @@ tr_TR: posted: "Gönderildi, şu kişi tarafından" edited: "Gönderiniz düzenlendi, şu kişi tarafından" liked: "Gönderiniz beğenildi" - private_message: "Özel mesaj, şu kişiden" - invited_to_private_message: "Bir özel mesaja davet edildiniz, şu kişi tarafından" + private_message: "Özel ileti, şu kişiden" + invited_to_private_message: "Şu kişi tarafından özel iletiyle davet edildiniz" invited_to_topic: "Bir konuya davet edildiniz, şu kişi tarafından" invitee_accepted: "Davet kabul edildi, şu kişi tarafından" moved_post: "Gönderiniz taşındı, şu kişi tarafından" linked: "Gönderinize bağlantı" granted_badge: "Rozet alındı" - group_message_summary: "Grup gelen kutusundaki mesajlar" + group_message_summary: "Grup gelen kutusundaki iletiler" popup: mentioned: '{{username}}, "{{topic}}" başlıklı konuda sizden bahsetti - {{site_title}}' group_mentioned: '{{username}} sizden bahsetti "{{topic}}" - {{site_title}}' quoted: '{{username}}, "{{topic}}" başlıklı konuda sizden alıntı yaptı - {{site_title}}' replied: '{{username}}, "{{topic}}" başlıklı konuda size cevap verdi - {{site_title}}' posted: '{{username}}, "{{topic}}" başlıklı konuya yazdı - {{site_title}}' - private_message: '{{username}}, "{{topic}}" başlıklı konuda size özel mesaj gönderdi - {{site_title}}' + private_message: '{{username}}, "{{topic}}" başlıklı konuda size özel ileti gönderdi - {{site_title}}' linked: '{{username}}, "{{topic}}" başlıklı konudaki gönderinize bağlantı yaptı - {{site_title}}' upload_selector: title: "Resim ekle" @@ -990,10 +1013,10 @@ tr_TR: from_my_computer: "Kendi cihazımdan" from_the_web: "Webden" remote_tip: "resme bağlantı ver" - remote_tip_with_attachments: "dosya yada imaj linki {{authorized_extensions}}" + remote_tip_with_attachments: "dosya ya da resim bağlantısı {{authorized_extensions}}" local_tip: "cihazınızdan resimler seçin" - local_tip_with_attachments: "cihaınızdan imaj yada dosya seçin {{authorized_extensions}}" - hint: "(editöre sürekle & bırak yaparak da yükleyebilirsiniz)" + local_tip_with_attachments: "cihazınızdan resim ya da dosya seçin {{authorized_extensions}}" + hint: "(düzenleyiciye sürekle & bırak yaparak da yükleyebilirsiniz)" hint_for_supported_browsers: "ayrıca resimleri düzenleyiciye sürükleyip bırakabilir ya da yapıştırabilirsiniz" uploading: "Yükleniyor" select_file: "Dosya seçin" @@ -1006,37 +1029,74 @@ tr_TR: most_liked: "En Çok Beğenilen" select_all: "Tümünü Seç" clear_all: "Tümünü Temizle" + too_short: "Aradığın terim çok kısa." result_count: - other: "\"{{term}}\" için sonuçlar {{count}}" + other: "\"{{term}}\" için {{count}} sonuç " title: "konu, gönderi, kullanıcı veya kategori ara" no_results: "Hiç bir sonuç bulunamadı." no_more_results: "Başka sonuç yok." - search_help: Arama yardımı searching: "Aranıyor..." post_format: "{{username}} tarafından #{{post_number}}" context: user: "@{{username}} kullancısına ait gönderilerde ara" category: "#{{category}} kategorisini ara" topic: "Bu konuda ara" - private_messages: "Mesajlarda ara" + private_messages: "İletilerde ara" + advanced: + title: Gelişmiş Arama + posted_by: + label: Gönderen + in_category: + label: Şu Kategoride + in_group: + label: Şu Grupta + with_tags: + label: Şu Etiketli + filters: + label: Yalnızca bu özelliğe sahip konuları/gönderileri göster... + likes: beğendiğim + posted: gönderide bulunduğum + watching: gözlediğim + tracking: takip ettiğim + private: iletilerimde olan + bookmarks: imlediğim + pinned: tutturulmuş + unpinned: tutturulmamış + wiki: wiki olan + statuses: + label: Şöyle olan konular + open: açık + closed: kapalı + archived: arşivlenmiş + noreplies: sıfır cevabı olan + single_user: tek kullanıcı içeren + post: + count: + label: En az gönderi sayısı + time: + label: Gönderilme + before: önce + after: sonra hamburger_menu: "bir diğer konu ya da kategoriye git" new_item: "yeni" go_back: 'geri dön' - not_logged_in_user: 'güncel aktivitelerin ve ayarların özetinin bulunduğu kullanıcı sayfası' + not_logged_in_user: 'güncel etkinliklerin ve tercihlerin özetinin bulunduğu kullanıcı sayfası' current_user: 'kendi kullanıcı sayfana git' topics: + new_messages_marker: "son ziyaret" bulk: + select_all: "Tümünü Seç" unlist_topics: "Konuları Listeleme" reset_read: "Okunmuşları Sıfırla" delete: "Konuları Sil" dismiss: "Yoksay" dismiss_read: "Okumadıklarını yoksay" dismiss_button: "Yoksay..." - dismiss_tooltip: "Yeni gönderileri görmezden gel yada konuları izlemeyi bırak" - also_dismiss_topics: "Bana, tekrar okunmamış olarak gösterilmemesi için bu konuları izlemeyi bırak." + dismiss_tooltip: "Yeni gönderileri görmezden gel ya da konuları takip etmeyi bırak" + also_dismiss_topics: "Bana, tekrar okunmamış olarak gösterilmemesi için bu konuları takip etmeyi bırak." dismiss_new: "Yenileri Yoksay" toggle: "konuların toplu seçimini aç/kapa" - actions: "Toplu İşlemler" + actions: "Toplu Eylemler" change_category: "Kategoriyi Değiştir" close_topics: "Konuları Kapat" archive_topics: "Konuları Arşivle" @@ -1046,6 +1106,7 @@ tr_TR: other: "{{count}} konu seçtiniz." change_tags: "Etiketleri Değiştir" choose_new_tags: "Konular için yeni etiketler seçin:" + changed_tags: "Bu konuların etiketleri değiştirildi." none: unread: "Okunmamış konunuz yok." new: "Yeni konunuz yok." @@ -1053,38 +1114,39 @@ tr_TR: posted: "Henüz herhangi bir konuda gönderi oluşturmadınız." latest: "Son bir konu yok. Bu üzücü." hot: "Sıcak bir konu yok." - bookmarks: "Henüz bir konu işaretlememişsiniz." + bookmarks: "Henüz bir konu imlememişsiniz." category: "{{category}} konusu yok." - top: "Popüler bir konu yok." + top: "Gözde bir konu yok." search: "Arama sonuçları yok." educate: - new: 'Yeni konunuz burada görünecektir.
Varsayalına olarak son 2 gün içerisinde oluşturulmuş konular yeni olarak nitelendirilir ve yeni ibaresiyle işeretli olarak gösterilir.
ayarlar sayfanızı ziyaret ederek bunu değiştirebilirsiniz.
' - unread: 'Okunmamış konularınız burda görünecektir.
By default, topics are considered unread and will show unread counts 1 if you:
Or if you have explicitly set the topic to Tracked or Watched via the notification control at the bottom of each topic.
Visit your preferences to change this.
' + new: 'Yeni konular burada görünecektir.
Öntanımlı olarak son 2 gün içerisinde oluşturulmuş konular yeni olarak nitelendirilir ve yeni ibaresiyle işaretli olarak gösterilir.
tercihler sayfanızı ziyaret ederek bunu değiştirebilirsiniz.
' + unread: 'Okumadığınız konular burada görünecektir.
Öntanımlı olarak, konuların okunmamış sayılması ve kaç tane1 okunmamış ileti olduğunun gösterilmesi için
Veya, konuyu her konunun altında bulunan bildirim kontrol alanından Gözleniyor veya Takip Ediliyor olarak seçmeniz durumlarından en az biri gerekir.
tercihler sayfanızı ziyaret ederek bunu değiştirebilirsiniz.
' bottom: latest: "Daha fazla son konu yok." hot: "Daha fazla sıcak bir konu yok." - posted: "Daha fazla konu yok." + posted: "Daha fazla gönderilmiş konu yok." read: "Daha fazla okunmuş konu yok." new: "Daha fazla yeni konu yok." unread: "Daha fazla okunmamış konu yok." category: "Daha fazla {{category}} konusu yok." - top: "Daha fazla popüler konu yok" - bookmarks: "Daha fazla işaretlenmiş konu yok." + top: "Daha fazla gözde konu yok." + bookmarks: "Daha fazla imlenmiş konu yok." search: "Daha fazla arama sonucu yok." topic: unsubscribe: stop_notifications: "Artık {{title}} için daha az bildirim alacaksınız." change_notification_state: "Geçerli bildirim durumunuz" - filter_to: "Bu konuda {{post_count}} gönderi" + filter_to: + other: "konuda {{count}} tane gönderi var" create: 'Yeni Konu' create_long: 'Yeni bir konu oluştur' - private_message: 'Mesajlaşma başlat' + private_message: 'İleti başlat' archive_message: - help: 'Mesajı arşivine taşı' + help: 'İletiyi arşivine taşı' title: ' Arşiv' move_to_inbox: title: 'Gelen kutusuna taşı' - help: 'Mesajı yeniden gelen kutusuna taşı' + help: 'İletiyi yeniden gelen kutusuna taşı' list: 'Konular' new: 'yeni konu' unread: 'okunmamış' @@ -1124,16 +1186,16 @@ tr_TR: jump_reply_up: Daha önceki cevaba geç jump_reply_down: Daha sonraki cevaba geç deleted: "Konu silindi " - auto_close_notice: "Bu konu otomatik olarak kapanacak %{timeLeft}." + auto_close_notice: "Bu konu %{timeLeft} otomatik olarak kapanacak." auto_close_notice_based_on_last_post: "Bu konu son cevaptan %{duration} sonra kapanacak." auto_close_title: 'Otomatik Kapatma Ayarları' auto_close_save: "Kaydet" auto_close_remove: "Bu Konuyu Otomatik Olarak Kapatma" - auto_close_immediate: "Son konudaki mesaj %{hours} saat olmuş, bu yüzden konu hemen kapanacak" + auto_close_immediate: + other: "Konudaki son gönderi zaten %{count} saat eski, bu yüzden konu hemen kapatılacak." timeline: back: "Geri" back_description: "Okunmamış son gönderine dön" - replies: "%{current} / %{total} Cevap" replies_short: "%{current} / %{total}" progress: title: konu gidişatı @@ -1141,13 +1203,16 @@ tr_TR: go_bottom: "en alt" go: "git" jump_bottom: "son gönderiye geç" - jump_prompt: "Gönderiye git" + jump_prompt: "gönderiye git" + jump_prompt_long: "Hangi gönderiye gitmek istersin?" jump_bottom_with_number: "%{post_number} numaralı gönderiye geç" total: tüm gönderiler current: şu anki gönderi - position: "%{total} gönderi arasından %{current}." notifications: + title: bu konu hakkında ne sıklıkla bildirim alacağını değiştir reasons: + mailing_list_mode: "Duyuru listesi modunu etkinleştirdin, bundan dolayı bu konuya gelen cevaplarla ilgili bildirimleri e-posta yoluyla alacaksın. " + '3_10': 'Bu konuyla ilgili bir etiketi gözlediğin için bildirim alacaksın.' '3_6': 'Bu kategoriyi gözlediğiniz için bildirimlerini alacaksınız.' '3_5': 'Bu konuyu otomatik olarak gözlemeye başladığınız için bildirimlerini alacaksınız.' '3_2': 'Bu konuyu gözlediğiniz için bildirimlerini alacaksınız.' @@ -1157,35 +1222,35 @@ tr_TR: '2_4': 'Bu konuya cevap yazdığınız için bildirimlerini alacaksınız.' '2_2': 'Bu konuyu takip ettiğiniz için bildirimlerini alacaksınız.' '2': 'Bu konuyu okuduğunuz için bildirimlerini alacaksınız.' - '1_2': 'Birisi @isim şeklinde sizden bahsederse ya da gönderinize cevap verirse bildirim alacaksınız.' - '1': 'Birisi @isim şeklinde sizden bahsederse ya da gönderinize cevap verirse bildirim alacaksınız.' + '1_2': 'Birisi @isminizden bahsederse ya da size cevap verirse bildirim alacaksınız.' + '1': 'Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız.' '0_7': 'Bu kategoriye ait tüm bildirimleri görmezden geliyorsunuz.' '0_2': 'Bu konuya ait tüm bildirimleri görmezden geliyorsunuz.' '0': 'Bu konuya ait tüm bildirimleri görmezden geliyorsunuz.' watching_pm: title: "Gözleniyor" - description: "Bu mesajlaşmada ki her yeni gönderi için bir bildirim alacaksınız. Okunmamış ve yeni gönderilerin sayısı konunun yanında belirecek." + description: "Bu iletideki her yeni gönderi için bir bildirim alacaksınız. Okunmamış ve yeni gönderilerin sayısı konunun yanında belirecek." watching: title: "Gözleniyor" - description: "Bu konudaki her yeni gönderi için bir bildirim alacaksınız. Okunmamış ve yeni gönderilerin sayısı konunun yanında belirecek." + description: "Bu konudaki her yeni gönderi için bildirim alacaksınız. Okunmamış ve yeni gönderilerin sayısı konunun yanında belirecek." tracking_pm: title: "Takip Ediliyor" - description: "Okunmamış ve yeni gönderi sayısı mesajın yanında belirecek. Birisi @isim şeklinde sizden bahsederse ya da gönderinize cevap verirse bildirim alacaksınız." + description: "Okunmamış ve yeni gönderi sayısı iletinin yanında belirecek. Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." tracking: title: "Takip Ediliyor" - description: "Okunmamış ve yeni gönderi sayısı başlığın yanında belirecek. Birisi @isim şeklinde sizden bahsederse ya da gönderinize cevap verirse bildirim alacaksınız." + description: "Okunmamış ve yeni gönderi sayısı başlığın yanında belirecek. Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." regular: title: "Olağan" - description: "Birisi @isim şeklinde sizden bahsederse ya da gönderinize cevap verirse bildirim alacaksınız." + description: "Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." regular_pm: title: "Olağan" - description: "Birisi @isim şeklinde sizden bahsederse ya da gönderinize mesajla cevap verirse bildirim alacaksınız." + description: "Birisi @isminizden bahsederse veya size cevap verirse bildirim alacaksınız." muted_pm: title: "Susturuldu" - description: "Bu mesajlaşmayla ilgili hiç bir bildirim almayacaksınız." + description: "Bu ileti ile ilgili hiç bir bildirim almayacaksınız." muted: title: "Susturuldu" - description: "Bu konu en son gönderilerde belirmeyecek, ve hakkında hiçbir bildirim almayacaksınız." + description: "Bu konu en son gönderilerde gözükmeyecek, ve hakkında hiçbir bildirim almayacaksınız." actions: recover: "Konuyu Geri Getir" delete: "Konuyu Sil" @@ -1200,7 +1265,8 @@ tr_TR: invisible: "Gizle" visible: "Görünür Yap" reset_read: "Görüntüleme Verilerini Sıfırla" - make_private: "Özel mesaj oluştur" + make_public: "Herkese Açık Konu Yap" + make_private: "Özel İleti Oluştur" feature: pin: "Başa Tuttur" unpin: "Baştan Kaldır" @@ -1216,10 +1282,13 @@ tr_TR: share: title: 'Paylaş' help: 'bu konunun bağlantısını paylaşın' + print: + title: 'Yazdır' + help: 'Bu konunun yazıcı dostu olan sürümünü aç' flag_topic: - title: 'Bayrakla' - help: 'bu gönderiyi kontrol edilmesi için özel olarak bayraklayın ya da bununla ilgili özel bir bildirim yollayın' - success_message: 'Bu konuyu başarıyla bayrakladınız.' + title: 'Bildir' + help: 'bu gönderiyi kontrol edilmesi için özel olarak bildirin ya da bununla ilgili özel bir bildirim yollayın' + success_message: 'Bu konuyu başarıyla bildirdiniz.' feature_topic: title: "Bu konuyu ön plana çıkar" pin: "Şu zamana kadar bu konunun {{categoryLink}} kategorisinin başında görünmesini sağla" @@ -1227,7 +1296,7 @@ tr_TR: unpin: "Bu konuyu {{categoryLink}} kategorisinin en üstünden kaldır." unpin_until: "Bu konuyu {{categoryLink}} kategorisinin başından kaldır ya da şu zamana kadar bekle: %{until}." pin_note: "Kullanıcılar kendileri için konunun başa tutturulmasını kaldırabilir." - pin_validation: "Bu konuyu sabitlemek için bir tarih gerekli." + pin_validation: "Bu konuyu başa tutturmak için bir tarih gerekli." not_pinned: " {{categoryLink}} kategorisinde başa tutturulan herhangi bir konu yok." already_pinned: other: "Şu an {{categoryLink}} kategorisinde başa tutturulan konular: {{count}}." @@ -1245,12 +1314,14 @@ tr_TR: no_banner_exists: "Manşet konusu yok." banner_exists: "Şu an bir manşet konusu var." inviting: "Davet Ediliyor..." + automatically_add_to_groups: "Bu davet aynı zamanda bu gruplara erişim izni sağlar:" invite_private: - title: 'Mesajlaşmaya Davet Et' + title: 'İletiye Davet Et' email_or_username: "Davet edilenin e-postası ya da kullanıcı adı" email_or_username_placeholder: "e-posta ya da kullanıcı adı" action: "Davet et" - success: "O kullanıcıyı bu mesajlaşmaya davet ettik." + success: "O kullanıcıyı bu iletiye davet ettik." + success_group: "Grubu bu iletiye katılması için davet ettik." error: "Üzgünüz, kullanıcı davet edilirken bir hata oluştu." group_name: "grup adı" controls: "Konu Kontrolleri" @@ -1262,7 +1333,7 @@ tr_TR: to_forum: "Arkadaşınıza, oturum açması gerekmeden, bir bağlantıya tıklayarak katılabilmesi için kısa bir e-posta göndereceğiz. " sso_enabled: "Bu konuya davet etmek istediğiniz kişinin kullanıcı adını girin." to_topic_blank: "Bu konuya davet etmek istediğiniz kişinin kullanıcı adını veya e-posta adresini girin." - to_topic_email: "Bir email adresi girdiniz. Arkadaşınızın konuya hemen cevap verebilmesini sağlayacak bir davetiye e-postalayacağız." + to_topic_email: "Bir e-posta adresi girdiniz. Arkadaşınızın konuya hemen cevap verebilmesini sağlayacak bir davetiye e-postalayacağız." to_topic_username: "Bir kullanıcı adı girdiniz. Kullanıcıya, bu konuya davet bağlantısı içeren bir bildiri yollayacağız." to_username: "Davet etmek istediğiniz kişinin kullanıcı adını girin. Kullanıcıya, bu konuya davet bağlantısı içeren bir bildiri yollayacağız." email_placeholder: 'isim@örnek.com' @@ -1287,6 +1358,10 @@ tr_TR: error: "Gönderiler konuya aşınırken bir hata oluştu." instructions: other: "Lütfen bu {{count}} gönderiyi taşımak istediğiniz konuyu seçin. " + merge_posts: + title: "Seçili Gönderileri Birleştir" + action: "seçili gönderileri birleştir" + error: "Seçili gönderileri birleştirirken bir hata oluştu." change_owner: title: "Gönderilerin Sahibini Değiştir" action: "sahipliğini değiştir" @@ -1297,8 +1372,8 @@ tr_TR: other: "Lütfen {{old_user}} kullanıcısına ait {{count}} gönderinin yeni sahibini seçin." instructions_warn: "Bu gönderi ile ilgili geriye dönük biriken bildirimler yeni kullanıcıya aktarılmayacak.+
+ tagging: - all_tags: "Tüm etiketler" + all_tags: "Tüm Etiketler" selector_all_tags: "tüm etiketler" + selector_no_tags: "etiket yok" changed: "değişen etiketler:" tags: "Etiketler" choose_for_topic: "bu konu için etiket seçiniz" - delete_tag: "Etiketi sil" + delete_tag: "Etiketi Sil" delete_confirm: "Bu etiketi silmek istiyor musunuz?" rename_tag: "Etiketi Yeniden Adlandır" rename_instructions: "Bu etiket için yeni bir ad seçin:" sort_by: "Sırala:" - sort_by_count: "say" + sort_by_count: "sayaç" sort_by_name: "ad" manage_groups: "Etiket Grubunu Yönet" manage_groups_description: "Etiket gurubunu yönetmek için grup tanımla" filters: without_category: "%{filter} %{tag} konular" - with_category: "%{category} içerisinkeri konular%{filter} %{tag}" + with_category: "%{category} içerisindeki konular %{filter} %{tag}" + untagged_without_category: "%{filter} etiketlenmemiş konular" + untagged_with_category: "%{category} içindeki %{filter} etiketlenmemiş konular" notifications: watching: - title: "İzleniyor" + title: "Gözleniyor" + description: "Bu etiketteki tüm konuları gözleyeceksiniz. Tüm yeni gönderi ve konulardan haberdar olabilecek ve yeni gönderi sayısını da konunun yanında görebileceksiniz." watching_first_post: - title: "İlk gönderi izlemeniz" + title: "İlk gönderi gözlemeniz" description: "Bu etikette bulunan tüm konuların sadece ilk gönderilerinde bildirim alacaksınız." tracking: - title: "İzleme" + title: "Takip ediliyor" + description: "Bu etiketteki tüm konuları otomatik olarak takip ediyor olacaksınız. Okunmamış yeni gönderilerin bir kısmı konunun yanında görünecektir." regular: - title: "Düzenli" - description: "Eğer bir kişi adınızın tagini kullanırsa (@isminiz gibi) veya oluşturduğunuz konuya cevap yazarsa bildirim alacaksınız." + title: "Müdavim" + description: "Birisi @isminizden bahsederse veya gönderinize cevap verirse bildirim alacaksınız." muted: title: "Susturuldu" + description: "Bu etikette beliren yeni konular hakkında bildirim almayacaksınız ve bunlar okunmamışlar sekmesinde belirmeyecek." groups: title: "Etiket Grupları" about: "Konuları kolayca yönetmek için onlara etiket ekleyiniz." - new: "Yeni grup" + new: "Yeni Grup" tags_label: "Bu gruptaki etiketler:" parent_tag_label: "Üst etiket:" parent_tag_placeholder: "İsteğe Bağlı" + parent_tag_description: "Bu gruptaki etiketler üst etiketi olduğu sürece kullanılamaz." one_per_topic_label: "Bu etiket grubundan her konu için bir etiket ile sınırla" new_name: "Yeni Etiket Grubu" save: "Kaydet" @@ -1846,36 +1948,39 @@ tr_TR: unread: "Okunmamış konunuz bulunmuyor." new: "Yeni konunuz bulunmuyor" read: "Henüz bir konu okumadınız." - posted: "Henüz bir konu oluşturmadınız." + posted: "Henüz herhangi bir konuya gönderim yapmadınız." latest: "Yeni eklenen konu bulunmuyor." hot: "Hareketli konu bulunmuyor." - bookmarks: "Henüz yer imi eklenmiş bir konunuz bulunmuyor." - top: "Üst sırada bir konu bulunmuyor." + bookmarks: "Henüz imlenmiş bir konunuz bulunmuyor." + top: "Hareketli bir konu bulunmuyor." search: "Arama sonucu hiçbirşey bulunamadı." bottom: latest: "Daha fazla yeni eklenmiş konu bulunmuyor." hot: "Daha fazla hareketli konu bulunmuyor." - posted: "Daha fazla oluşturulmuş konu bulunmuyor." + posted: "Daha fazla gönderilmiş konu bulunmuyor." read: "Okunacak daha fazla konu bulunmuyor." new: "Daha fazla yeni konu bulunmuyor." unread: "Daha fazla okunmamış konu bulunmuyor." - top: "Daha falza üst sıralarda konu bulunmuyor." + top: "Daha fazla üst sıralarda konu bulunmuyor." bookmarks: "Daha fazla imlenmiş konu bulunmuyor." search: "Daha fazla arama sonucu bulunmuyor." invite: - custom_message_link: "kişiselleştirilmiş mesak" - custom_message_placeholder: "Kişiselleştirilmiş mesajınızı düzenleyin" - custom_message_template_forum: "Hey, bu foruma üye olsan iyi olur!" + custom_message: "Davetini daha özel hale getirmek için şunu yaz" + custom_message_link: "kişiselleştirilmiş ileti" + custom_message_placeholder: "Kişiselleştirilmiş iletinizi düzenleyin" + custom_message_template_forum: "Hey, bu foruma katılmalısın!" custom_message_template_topic: "Hey, bu konu senin için eğleceli olabilir!" + safe_mode: + enabled: "Güvenli mod etkin, çıkmak için bu tarayıcı penceresini kapatın" admin_js: - type_to_filter: "filtre girin..." + type_to_filter: "süzgeç girin..." admin: title: 'Discourse Yönetici Paneli' moderator: 'Moderatör' dashboard: - title: "Yönetici Paneli" - last_updated: "Yönetici panelinin son güncellenmesi:" - version: "Versiyon" + title: "Göstergeler" + last_updated: "Göstergelerin son güncellenmesi:" + version: "Sürüm" up_to_date: "Sisteminiz güncel durumda!" critical_available: "Önemli bir güncelleme var." updates_available: "Yeni güncellemeler var." @@ -1893,17 +1998,17 @@ tr_TR: admins: 'Yöneticiler:' blocked: 'Engellenmiş:' suspended: 'Uzaklaştırılmışlar:' - private_messages_short: "Mesajlar" - private_messages_title: "Mesajlar" + private_messages_short: "İletiler" + private_messages_title: "İletiler" mobile_title: "Mobil" space_free: "{{size}} serbest" uploads: "yüklemeler" - backups: "Yedekler" + backups: "yedekler" traffic_short: "Trafik" traffic: "Uygulama web istekleri" page_views: "API istekleri" page_views_short: "API istekleri" - show_traffic_report: "Detaylı Trafik Raporunu Görüntüle" + show_traffic_report: "Ayrıntılı Trafik Raporunu Görüntüle" reports: today: "Bugün" yesterday: "Dün" @@ -1914,7 +2019,7 @@ tr_TR: 30_days_ago: "30 Gün Önce" all: "Hepsi" view_table: "tablo" - view_graph: "grafik" + view_graph: "çizge" refresh_report: "Raporu Yenile" start_date: "Başlangıç tarihi" end_date: "Bitiş Tarihi" @@ -1923,51 +2028,51 @@ tr_TR: latest_changes: "En son değişiklikler: lütfen sık güncelleyin!" by: "tarafından" flags: - title: "Bayraklar" + title: "Bildirilenler" old: "Eski" active: "Etkin" agree: "Onayla" - agree_title: "Bu bayrağı geçerli ve doğru olarak onayla" + agree_title: "Bu bildirimi geçerli ve doğru olarak onayla" agree_flag_modal_title: "Onayla ve..." - agree_flag_hide_post: "Onayla (gönderiyi gizle + özel mesaj yolla)" - agree_flag_hide_post_title: "Bu gönderiyi gizle ve otomatik olarak kullanıcıya acilen düzenleme yapmasını belirten bir mesaj gönder" + agree_flag_hide_post: "Onayla (gönderiyi gizle + özel ileti yolla)" + agree_flag_hide_post_title: "Bu gönderiyi gizle ve otomatik olarak kullanıcıya acilen düzenleme yapmasını belirten bir ileti gönder" agree_flag_restore_post: "Kabul ediyorum (gönderiyi geri getir)" agree_flag_restore_post_title: "Gönderiyi geri getir" - agree_flag: "Bayrağı onayla" - agree_flag_title: "Bayrağı onayla ve gönderide değişiklik yapma" + agree_flag: "Bildirimi onayla" + agree_flag_title: "Bildirimi onayla ve gönderide değişiklik yapma" defer_flag: "Ertele" - defer_flag_title: "Bu bayrağı kaldır; şu an için bir seçeneği uygulamak gerekmiyor." + defer_flag_title: "Bu bildirimi kaldır; şu an için bir şey yapmak gerekmiyor." delete: "Sil" - delete_title: "Bu bayrağın ait olduğu gönderiyi sil." - delete_post_defer_flag: "Gönderiyi sil ve bayrağı ertele" + delete_title: "Bu bildirimin ait olduğu gönderiyi sil." + delete_post_defer_flag: "Gönderiyi sil ve bildirimi ertele" delete_post_defer_flag_title: "Gönderiyi sil; başka gönderi yoksa, konuyu da sil." - delete_post_agree_flag: "Gönderiyi sil ve bayrağı onayla" + delete_post_agree_flag: "Gönderiyi sil ve bildirimi onayla" delete_post_agree_flag_title: "Gönderiyi sil; başka gönderi yoksa, konuyu da sil." delete_flag_modal_title: "Sil ve..." delete_spammer: "Spamcıyı Sil" delete_spammer_title: "Kullanıcıyı ve kullanıcıya ait tüm konu ve gönderileri kaldır. " disagree_flag_unhide_post: "Onaylama (gönderiyi gizleme)" - disagree_flag_unhide_post_title: "Bu gönderiye ait tüm bayrakları kaldır ve gönderiyi tekrar görünür hale getir" + disagree_flag_unhide_post_title: "Bu gönderiye ait tüm bildirimleri kaldır ve gönderiyi tekrar görünür hale getir" disagree_flag: "Onaylama" - disagree_flag_title: "Bu bayrağı geçersiz ya da yanlış sayarak reddet" + disagree_flag_title: "Bu bildirimi geçersiz ya da yanlış sayarak reddet" clear_topic_flags: "Tamam" - clear_topic_flags_title: "Bu konu araştırıldı ve sorunlar çözüldü. Bayrakları kaldırmak için Tamam butonuna basın. " + clear_topic_flags_title: "Bu konu araştırıldı ve sorunlar çözüldü. Bildirimleri kaldırmak için Tamam düğmesine basın. " more: "(daha fazla cevap...)" dispositions: agreed: "onaylandı" disagreed: "onaylanmadı" deferred: "ertelendi" - flagged_by: "Bayraklayan" + flagged_by: "Bildiren" resolved_by: "Çözen" took_action: "İşlem uygulandı" system: "Sistem" error: "Bir şeyler ters gitti" - reply_message: "Yanıtla" - no_results: "Bayraklanan içerik yok." - topic_flagged: "Bu konu bayraklandı." - visit_topic: "Aksiyon almak için konuyu ziyaret edin" - was_edited: "İlk bayraktan edilmesinden sonra gönderi düzenlendi" - previous_flags_count: "Bu gönderi daha önce {{count}} defa bayraklanmış." + reply_message: "Cevapla" + no_results: "Bildirilen içerik yok." + topic_flagged: "Bu konu bildirildi." + visit_topic: "Harekete geçmek için konuyu ziyaret edin" + was_edited: "İlk bildirimden sonra gönderi düzenlendi" + previous_flags_count: "Bu gönderi daha önce {{count}} defa bildirilmiş." summary: action_type_3: other: "konu dışı x{{count}}" @@ -1978,7 +2083,7 @@ tr_TR: action_type_7: other: "özel x{{count}}" action_type_8: - other: "spam x{{count}}" + other: "istenmeyen x{{count}}" groups: primary: "Ana Grup" no_primary: "(ana grup yok)" @@ -1987,26 +2092,23 @@ tr_TR: refresh: "Yenile" new: "Yeni" selector_placeholder: "kullanıcı adı girin" - name_placeholder: "Grup adı, kullanıcı adındaki gibi boşluksuz olmalı" about: "Grup üyeliğinizi ve isimleri burada düzenleyin" group_members: "Grup üyeleri" delete: "Sil" delete_confirm: "Grup silinsin mi?" delete_failed: "Grup silinemedi. Bu otomatik oluşturulmuş bir grup ise, yok edilemez." - delete_member_confirm: "'%{username}' adlı kullanıcıyı '%{group}' grubundan çıkart?" - delete_owner_confirm: "'%{username}' için sahiplik imtiyazı kaldırılsın mı?" - name: "Ad" + delete_owner_confirm: "'%{username}' için sahiplik izni kaldırılsın mı?" add: "Ekle" add_members: "Üye ekle" custom: "Özel" bulk_complete: "Kullanıcılar gruba eklendi." bulk: "Topluca Gruba Ekle" - bulk_paste: "Kullanıcı adı yada eposta listesini yapıştırın, her satıra bir tane gelecek:" + bulk_paste: "Kullanıcı adı ya da e-posta listesini yapıştırın, her satıra bir tane gelecek şekilde:" bulk_select: "(bir grup seçin)" automatic: "Otomatik" automatic_membership_email_domains: "Bu listedeki bir e-posta alan adıyla kaydolan kullanıcılar otomatik olarak bu gruba eklenecekler:" automatic_membership_retroactive: "Varolan kayıtlı kullanıcıları eklemek için aynı e-posta alan adı kuralını uygula" - default_title: "Bu gruptaki tüm kullanıcılar için varsayılan başlık" + default_title: "Bu gruptaki tüm kullanıcılar için öntanımlı başlık" primary_group: "Otomatik olarak ana grup yap" group_owners: Sahipler add_owners: Sahiplik ekle @@ -2026,13 +2128,80 @@ tr_TR: info_html: "API anahtarınız JSON çağrıları kullanarak konu oluşturup güncelleyebilmenize olanak sağlayacaktır." all_users: "Tüm Kullanıcılar" note_html: "Bu anahtarı gizli tutun, anahtara sahip kullanıcılar her hangi bir kullanıcı adı altında istedikleri gönderiyi oluşturabilirler." + web_hooks: + title: "Web Kancaları" + none: "Şu anda bir web kancası yok." + instruction: "Web kancaları, sitenizde belirli olaylar meydana geldiğinde dış servisleri haberdar etmek için kullanılır. Bir web kancası tetiklendiğinde, belirtilen URL'e bir POST isteği gönderilir." + detailed_instruction: "Seçilen olay olduğunda bir POST isteği verilen URL'e gönderilecek." + new: "Yeni Web Kancası" + create: "Oluştur" + save: "Kaydet" + destroy: "Sil" + description: "Açıklama" + controls: "Kontroller" + go_back: "Listeye geri dön" + payload_url: "Veri yükü URL'i" + payload_url_placeholder: "https://ornek.com/gonderial" + warn_local_payload_url: "Öyle görünüyor ki, web kancasını yerel bir URL'e ayarlamaya çalışıyorsunuz. Yerel bir adrese iletilen olay yan etki veya beklenmedik davranışlara neden olabilir. Devam edilsin mi?" + secret_invalid: "Gizli alanında boş karakter olamaz." + secret_too_short: "Gizi en azından 12 karakter olmalı." + secret_placeholder: "İsteğe bağlı bir kelime, imza oluşturmak için kullanılacak" + event_type_missing: "En az bir olay tipi ayarlamalısınız." + content_type: "İçerik Türü" + secret: "Gizli" + event_chooser: "Bu web kancasını tetikleyecek olayların neler olmasını isterdiniz?" + wildcard_event: "Bana her şeyi gönder." + individual_event: "Belirli olayları seç" + verify_certificate: "Veri yükü URL'inin TLS sertifikasını kontrol edin." + active: "Etkin" + active_notice: "Olduğu zaman olay detaylarını ileteceğiz." + categories_filter_instructions: "Alakalı web kancaları, eğer olay belirtilen kategoriler ile alakalıysa tetiklenecektir. Bütün kategoriler için web kancalarını tetiklemek için boş bırakın." + categories_filter: "Tetiklenmiş Kategoriler" + groups_filter_instructions: "Alakalı web kancaları, eğer olay belirtilen gruplar ile alakalıysa tetiklenecektir. Bütün gruplar için web kancalarını tetiklemek için boş bırakın." + groups_filter: "Tetiklenmiş Gruplar" + delete_confirm: "Bu web kancasını sil?" + topic_event: + name: "Konu Olayı" + details: "Yeni bir konu oluşturulduğunda, düzenlendiğinde veya silindiğinde." + post_event: + name: "Gönderme Olayı" + details: "Yeni bir cevap oluşturulduğunda, düzenlendiğinde veya silindiğinde." + user_event: + name: "Kullanıcı Olayı" + delivery_status: + title: "Teslim Durumu" + inactive: "Etkin Değil" + failed: "Başarısız" + successful: "Başarılı" + events: + none: "İlgili bir olay yok." + redeliver: "Yeniden ilet" + incoming: + other: "Şu anda {{count}} yeni olay var." + completed_in: + other: "{{count}} saniyede tamamlandı." + request: "İstek" + response: "Yanıt" + redeliver_confirm: "Aynı veri yükünü tekrar iletmek istediğinize emin misiniz?" + headers: "Başlıklar" + payload: "Veri yükü" + body: "İçerik" + go_list: "Listeye git" + go_details: "Web kancasını düzenle" + go_events: "Olaylara git" + ping: "Ping" + status: "Durum Kodu" + event_id: "Kimlik" + timestamp: "Oluşturulma" + completion: "Tamamlanma Zamanı" + actions: "Eylemler" plugins: title: "Eklentiler" installed: "Yüklü Eklentiler" name: "İsim" none_installed: "Yüklenmiş herhangi bir eklentiniz yok." - version: "Versiyon" - enabled: "Etkinleştirildi mi?" + version: "Sürüm" + enabled: "Etkin?" is_enabled: "E" not_enabled: "H" change_settings: "Ayarları Değiştir" @@ -2046,12 +2215,12 @@ tr_TR: none: "Yedek bulunmuyor." read_only: enable: - title: "Salt okuma modunu etkinleştir" - label: "Salt okumayı etkinleştir" - confirm: "Salt okuma modunu aktifleştirmek istediğinizden emin misiniz?" + title: "Yalnızca okuma modunu etkinleştir" + label: "Yalnızca okumayı etkinleştir" + confirm: "Yalnızca okuma modunu etkinleştirmek istediğinizden emin misiniz?" disable: - title: "Salt okuma modunu engelle" - label: "Salt okumayı engelle" + title: "Yalnızca okuma modunu kapatır" + label: "Yalnızca okumayı kapa" logs: none: "Henüz kayıt bulunmuyor..." columns: @@ -2059,7 +2228,7 @@ tr_TR: size: "Boyut" upload: label: "Yedek Yükle" - title: "Bu oluşuma bir yedekleme yükle" + title: "Bu oluşuma bir yedek yükle" uploading: "Yükleniyor..." success: "'{{filename}}' başarıyla yüklendi." error: "'{{filename}}': {{message}} yüklenirken bir hata oluştu" @@ -2082,26 +2251,24 @@ tr_TR: title: "Yedeği kaldır" confirm: "Bu yedeği yok etmek istediğinize emin misiniz?" restore: - is_disabled: "Geri getirme site ayarlarında devredışı bırakılmış." + is_disabled: "Geri getirme site ayarlarında devre dışı bırakılmış." label: "Geri Yükle" - title: "Yedeği geri getir" - confirm: "Bu yedekten geri dönmek istediğinize emin misiniz?" + title: "Yedeğe geri dön" + confirm: "Bu yedeğe geri dönmek istediğinize emin misiniz?" rollback: label: "Geri al" - title: "Veritabanını calışan son haline geri al." + title: "Veritabanını calışan son haline geri al" confirm: "Veritabanını çalışan son haline döndürmek istediğinize emin misiniz?" export_csv: - user_archive_confirm: "Gönderilerinizi indirmek istediğinize emin misiniz ?" - success: "Dışarı aktarma başlatıldı, işlem tamamlandığında mesajla bilgilendirileceksiniz." + success: "Dışarı aktarma başlatıldı, işlem tamamlandığında iletiyle bilgilendirileceksiniz." failed: "Dışa aktarırken hata oluştu. Lütfen kayıtları kontrol edin." - rate_limit_error: "Gönderiler günde bir kez indirilebilir, lütfen yarın tekrar deneyin." button_text: "Dışa aktar" button_title: - user: "Tüm kullanıcı listesini CSV formatında dışa aktar." - staff_action: "Tüm görevli aksiyonları logunu CSV formatında dışa aktar." - screened_email: "Tüm taranmış e-postalar listesini CSV formatında dışa aktar." - screened_ip: "Tüm taranmış IPler listesini CSV formatında dışa aktar." - screened_url: "Tüm taranmış URLler listesini CSV formatında dışa aktar." + user: "Tüm kullanıcı listesini CSV biçiminde dışa aktar." + staff_action: "Tüm görevli eylemleri kaydını CSV biçiminde dışa aktar." + screened_email: "Tüm taranmış e-postalar listesini CSV biçiminde dışa aktar." + screened_ip: "Tüm taranmış IPler listesini CSV biçiminde dışa aktar." + screened_url: "Tüm taranmış URLler listesini CSV biçiminde dışa aktar." export_json: button_text: "Dışarı Aktar" invite: @@ -2121,22 +2288,22 @@ tr_TR: body_tag: text: "" - title: "HTML that will be inserted before the tag" - override_default: "Do not include standard style sheet" enabled: "مفعل؟" preview: "معاينة" undo_preview: "ازالة المعاينة" @@ -2333,82 +2653,75 @@ ar: import_title: "حدد ملف او انسخ نص" delete: "حذف" delete_confirm: "حذف هذا التخصيص؟" - about: "Modify CSS stylesheets and HTML headers on the site. Add a customization to start." - color: "Color" - opacity: "Opacity" copy: "نسخ" email_templates: title: "قالب البريد الالكتروني " subject: "الموضوع" multiple_subjects: "قالب البريد الإلكتروني هذا لديه موضوعات متعددة." body: "المحتوى" - none_selected: "اختر قالب بريد الكتروني لتبدا بتعديله " + none_selected: "اختر أحد قوالب البريد لتعدله." revert: "اعاده التغيرات " revert_confirm: "هل انت متاكد من انك تريد اعاده التغيرات؟ " - css_html: - title: "CSS/HTML" - long_title: "CSS and HTML Customizations" colors: - title: "اللون" - long_title: "نمط الألوان" - about: "Modify the colors used on the site without writing CSS. Add a scheme to start." - new_name: "نمط ألوان جديد" + title: "الألوان" + long_title: "مخططات الألوان" + new_name: "مخطط ألوان جديد" copy_name_prefix: "نسخة من" - delete_confirm: "حذف جميع الالوان؟" + delete_confirm: "أأحذف مخطط الألوان هذا؟" undo: "تراجع" undo_title: "التراجع عن تغيير اللن الى اللون السابق" revert: "تراجع" revert_title: "اعادة ضبط اللون الى اللون الافتراضي للموقع" primary: - name: 'اساسي' - description: 'Most text, icons, and borders.' + name: 'الأساسي' secondary: - name: 'ثانوي' - description: 'اللون الاساسي للخلفية, والنص للايقونة' + name: 'الثانوي' + description: 'لون الخلفية الأساسي، ولون نصوص بعض الأزرار.' tertiary: - name: 'ثلاثي' - description: 'الروابط، الأزرار، الإشعارات و أشياء أخرى.' + name: 'الثلاثي' + description: 'الوصلات، وبعض الأزرار، والإشعارات ولون الإبراز.' quaternary: - name: "رباعي" - description: "الروابط" + name: "الرباعي" + description: "وصلات التنقل." header_background: - name: "خلفية رأس الصفحة" - description: "لون الخلفية لرأس الصفحة الخاصة بالموقع" + name: "خلفية الترويسة" + description: "لون خلفية ترويسة الموقع." header_primary: name: "رأس الصفحة الأساسي" - description: "لون و أيقونات رأس الصفحة الخاصة بالموقع." + description: "النص والأيقونات في ترويسة الموقع." highlight: - name: 'تحديد' - description: 'لون خلفية النصوص و العناصر المحددة في جسم الصفحة مثل المشاركات و المواضيع.' + name: 'الإبراز' + description: 'لون خلفية العناصر المُبرزة في الصفحة، كالمشاركات والمواضيع.' danger: - name: 'خطر' - description: 'لون بعض الأوامر مثل حذف المشاركات و المواضيع' + name: 'الخطر' + description: 'لون إبراز إجراءات حذف المشاركات والمواضيع (مثلا).' success: - name: 'نجاح' + name: 'النجاح' description: 'يستخدم لإظهار نجاح عملية ما.' love: name: 'إعجاب' description: "لون زر الإعجاب." email: - title: "رسائل البريد الالكتروني" - settings: "اعدادات" - templates: "نماذج" + title: "البُرد الإلكترونية" + settings: "إعدادات" + templates: "القوالب" preview_digest: "ملخص المعاينة." - sending_test: "إرسال بريد إلكتروني للتجربة..." + sending_test: "يرسل بريدا إلكترونيا اختباريا..." error: "خطأ - %{server_error}" test_error: "حدث خطأ أثناء إرسال رسالة تجريبية. الرجاء فحص إعدادات البريد الإلكتروني و التأكد من أن الاستضافة لا تمنع مرور البريد الإلكتروني والمحاولة مرة أخرى." - sent: "تم الإرسال" - skipped: "تم التجاوز" - received: "وارد" + sent: "المُرسلة" + skipped: "المتخطّاة" + bounced: "مروج" + received: "المُستلمة" rejected: "مرفوض" - sent_at: "أرسلت في" + sent_at: "أُرسلت في" time: "الوقت" user: "المستخدم" email_type: "نوع البريد الكتروني" - to_address: "الى العناوين" - test_email_address: "عنوان البريد الكتروني للتجربة" - send_test: "ارسل رسالة تجربة" - sent_test: "اٌرسلت!" + to_address: "إلى العنوان" + test_email_address: "عنوان البريد الإلكتروني للاختبار" + send_test: "أرسل رسالة اختبار" + sent_test: "أُرسلت!" delivery_method: "طريقة التسليم" preview_digest_desc: "معاينة محتوى رسائل البريد الإلكتروني الملخص المرسلة للأعضاء الغير متاحين." refresh: "تحديث" @@ -2428,6 +2741,7 @@ ar: modal: title: "تفاصيل الرسائل الوارده" error: "خطأ" + headers: "رؤوس" subject: "الموضوع" body: "المحتوى" rejection_message: "البريد المحظور" @@ -2438,24 +2752,24 @@ ar: subject_placeholder: "موضوع..." error_placeholder: "خطأ" logs: - none: "لا يوجد سجلات." + none: "لا سجلات." filters: - title: "المنقي" + title: "رشّح" user_placeholder: "اسم المستخدم" address_placeholder: "name@example.com" type_placeholder: "الخلاصة، إنشاء حساب..." reply_key_placeholder: "مفتاح الرد" skipped_reason_placeholder: "السبب" logs: - title: "سجلات" - action: "عملية" + title: "السجلات" + action: "الإجراء" created_at: "مكتوبة" last_match_at: "اخر تطابق" match_count: "تطابقات" ip_address: "IP" - topic_id: "رقم معرّف الموضوع" - post_id: "رقم المشاركة" - category_id: "معرف الفئة" + topic_id: "معرّف الموضوع" + post_id: "معرّف المشاركة" + category_id: "معرّف الفئة" delete: 'حذف' edit: 'تعديل' save: 'حفظ' @@ -2492,7 +2806,7 @@ ar: grant_badge: "منح شارة" revoke_badge: "حذف الشعار" check_email: "التحقق من البريد" - delete_topic: "حذف الموضوع" + delete_topic: "احذف الموضوع" delete_post: "حذف المشاركة" impersonate: "إنتحال" anonymize_user: "مستخدم مجهول" @@ -2507,9 +2821,12 @@ ar: grant_moderation: "عين كمشرف" revoke_moderation: "سحب صلاحيات المشرف" backup_operation: "عمليه النسخ الاحتياطي" + deleted_tag: "علامة وصفية محذوفة" + renamed_tag: "اعادة تسمية العلامة الوصفية" + revoke_email: "حذف البريد الالكتروني" screened_emails: title: "عناوين بريد إلكتروني محجوبة." - description: "عندما تتم محاول انشاء حساب جديد, سيتم التحقق من قائمة البريد الالكتروني وسيتم حظر التسجيل لهذا البريد واتخاذ اي اجراء متبع" + description: "عندما يحاول أحدهم إنشاء حساب جديد، ستُفحص عناوين البريد الإلكتروني وسيُمنع التسجيل إن تطابق إحداها، أو أن يُتّخذ أي إجراء آخر." email: "قائمة البريد الالكتروني" actions: allow: "سماح" @@ -2524,7 +2841,6 @@ ar: delete_confirm: "هل أنت متأكد أنك تريد إزالة القاعدة لـ %{ip_address} ؟" roll_up_confirm: "هل أنت متأكد أنك تريد تغيير مصفي عناوين IP الشائعة إلى الشبكات الفرعية ؟" rolled_up_some_subnets: "تم بنجاح حظر IP متغير يدخل إلى هذه الشبكات الفرعية : %{subnets}." - rolled_up_no_subnet: "ليس هنالك شيء ليتدحرج" actions: block: "حظر" do_nothing: "سماح" @@ -2542,24 +2858,24 @@ ar: impersonate: title: "انتحال الشخصية" help: "استخدم هذه الأداة لانتحال شخصية حساب مستخدم لأغراض التصحيح. سيتم تسجيل خروجك عندما تنتهي." - not_found: "ﻻيمكن إيجاد ذلك المستخدم." + not_found: "تعذر إيجاد المستخدم." invalid: "عذراً , لايمكنك تمثل شخصية ذلك العضو." users: - title: 'مستخدمين' + title: 'المستخدمون' create: 'اضافة مدير' last_emailed: "آخر بريد الكتروني" - not_found: "نعتذر، لا يوجد اسم المستخدم هذا في نظامنا." - id_not_found: "خطاء !! , إسم المستخدم غير موجود" + not_found: "آسفون، اسم هذا المستخدم غير موجود في النظام." + id_not_found: "آسفون، معرّف هذا المستخدم غير موجود في النظام." active: "نشط" show_emails: "عرض الرسائل" nav: - new: "جديد" - active: "نشط" + new: "الجدد" + active: "النشطون" pending: "قيد الانتظار" - staff: 'الإدارة' + staff: 'الطاقم' suspended: 'موقوف' blocked: 'محظور' - suspect: 'مريب' + suspect: 'المريبون' approved: "موافقة؟" approved_selected: zero: "وافق المستخدم" @@ -2576,20 +2892,20 @@ ar: many: "رفض المستخدمين ({{count}})" other: "رفض المستخدمين ({{count}})" titles: - active: 'مستخدمين نشطين' - new: 'مستخدمين جدد ' + active: 'المستخدمون النشطون' + new: 'المستخدمون الجدد' pending: 'أعضاء بانتظار المراجعة' newuser: 'أعضاء في مستوى الثقة 0 (عضو جديد)' basic: 'أعضاء في مستوى الثقة 1 (عضو أساسي)' member: 'الاعضاء في مستوى الثقة رقم 2 (أعضاء)' regular: 'الاعضاء في مستوى الثقة رقم 3 (عاديين)' leader: 'الاعضاء في مستوى الثقة رقم 4 (قادة)' - staff: "طاقم" - admins: 'مستخدمين مدراء' - moderators: 'مراقبين' + staff: "الطاقم" + admins: 'المستخدمون المدراء' + moderators: 'المشرفون' blocked: 'مستخدمين محظورين:' suspended: 'أعضاء موقوفين' - suspect: 'أعضاء مريبين' + suspect: 'المستخدمون المريبون' reject_successful: zero: "رفض بنجاح 1 مستخدم" one: "رفض بنجاح 1 مستخدم" @@ -2606,7 +2922,7 @@ ar: other: "فشل لرفض %{count} مستخدمين." not_verified: "لم يتم التحقق" check_email: - title: "اظهار عوان البريد الالكتروني لهذا العضو." + title: "اكشف عنوان البريد الإلكتروني لهذا العضو" text: "إظهار" user: suspend_failed: "حدث خطأ ما أوقف هذا المستخدم {{error}}." @@ -2616,8 +2932,8 @@ ar: suspend_reason_label: "لماذا هل أنت عالق؟ هذا النص سيكون ظاهراً للكل على صفحة تعريف هذا العضو, وسيكون ظاهراً للعضو عندما يحاول تسجل الدخول. احفظها قصيرة." suspend_reason: "سبب" suspended_by: "محظور من قبل" - delete_all_posts: "حذف جميع المشاركات" - delete_all_posts_confirm: "هل أنت متأكد من أنك تريد حذف %{posts} مشاركات و %{topics} مواضيع ؟" + delete_all_posts: "احذف كل مشاركاته" + delete_all_posts_confirm_MF: "أنت على وشك {POSTS, plural, zero {عدم حذف شيء} one {حذف مشاركة واحدة} two {حذف مشاركتين} few {حذف # مشاركات} many {حذف # مشاركة} other {حذف # مشاركة}}{TOPICS, plural, zero {} one { وموضوع واحد} two { وموضوعين} few { و# مواضيع} many {و# موضوعا} other {و# موضوع}}. أمتأكد؟" suspend: "علّق" unsuspend: "إلقاء التعليق" suspended: "معلّق؟" @@ -2628,13 +2944,13 @@ ar: show_admin_profile: "مدير" edit_title: "تعديل العنوان" save_title: "حفظ العنوان" - refresh_browsers: "تحديث المتصفحات اجبارياً" + refresh_browsers: "أجبر إنعاش المتصفح" refresh_browsers_message: "الرسالة أُرسلت إلى كل الأعضاء!" show_public_profile: "عرض الملف العام." impersonate: 'انتحال شخصية' ip_lookup: "جدول \"IP\"" log_out: "تسجيل الخروج" - logged_out: "العضو قام بتسجيل الخروج من جميع الأجهزه" + logged_out: "أخرجنا العضو من كل أجهزته" revoke_admin: 'سحب الإدارة' grant_admin: 'منحة إدارية' revoke_moderation: 'سحب المراقبة' @@ -2664,15 +2980,15 @@ ar: anonymize_yes: "نعم، أخفي هذا الحساب." anonymize_failed: "كانت هناك مشكلة من حساب مجهول المصدر" delete: "حذف المستخدم" - delete_forbidden_because_staff: "لا يمكن حذف مدراء والمشرفين." + delete_forbidden_because_staff: "لا يمكن حذف المدراء والمشرفين." delete_posts_forbidden_because_staff: "لا يمكن حذف جميع المشاركات للمدراء والمشرفين. " delete_forbidden: - zero: "لا يمكن حذف الأعضاء إذا كان لديهم مشاركات. احذف جميع المشاركات قبل المحاولة بحذف العضو." - one: "لا يمكن للأعضاء الحذف إذا كان لديهم مشاركات. احذف جميع المشاركات قبل المحاولة بحذف العضو. (المشاركات الأقدم من يوم لا يمكن حذفها.)" - two: "لا يمكن حذف الأعضاء إذا كان لديهم مشاركات. احذف جميع المشاركات قبل المحاولة بحذف العضو. (المشاركات الأقدم من يومين لا يمكن حذفها.)" - few: "لا يمكن حذف الأعضاء إذا كان لديهم مشاركات. احذف جميع المشاركات قبل المحاولة بحذف العضو.\n(المشاركات الأقدم من أيام قليلة لا يمكن حذفها.)" - many: "لا يمكن حذف الأعضاء إذا كان لديهم مشاركات. احذف جميع المشاركات قبل المحاولة بحذف العضو. (المشاركات الأقدم من أيام %{كثيرة} لا يمكن حذفها.)" - other: "لا يمكن للأعضاء الحذف إذا كان لديهم مشاركات. احذف جميع المشاركات قبل المحاولة بحذف العضو. (المشاركات الأقدم من %{count} أيام لا يمكن حذفها.)" + zero: "لا يمكن حذف مَن لديه مشاركات. احذف كل المشاركات أولا قبل حذف المستخدم. (المشاركات الآن لا يمكن حذفها.)" + one: "لا يمكن حذف مَن لديه مشاركات. احذف كل المشاركات أولا قبل حذف المستخدم. (المشاركات الأقدم من يوم واحد لا يمكن حذفها.)" + two: "لا يمكن حذف مَن لديه مشاركات. احذف كل المشاركات أولا قبل حذف المستخدم. (المشاركات الأقدم من يومين لا يمكن حذفها.)" + few: "لا يمكن حذف مَن لديه مشاركات. احذف كل المشاركات أولا قبل حذف المستخدم. (المشاركات الأقدم من %{count} أيام لا يمكن حذفها.)" + many: "لا يمكن حذف مَن لديه مشاركات. احذف كل المشاركات أولا قبل حذف المستخدم. (المشاركات الأقدم من %{count} يوما لا يمكن حذفها.)" + other: "لا يمكن حذف مَن لديه مشاركات. احذف كل المشاركات أولا قبل حذف المستخدم. (المشاركات الأقدم من %{count} يوم لا يمكن حذفها.)" cant_delete_all_posts: zero: "لا تستطيع حذف جميع المشاركات. (The delete_user_max_post_age setting.)" one: "لا تستطيع حذف جميع المشاركات. بعض المشاركات أقدم من يوم. (The delete_user_max_post_age setting.)" @@ -2687,11 +3003,11 @@ ar: few: "لا يمكن مسح كل المشاركات لأن العضو لديه أكثر من %{count} مشاركات.\n(delete_all_posts_max)" many: "لا يمكن مسح كل المشاركات لأن العضو لديه أكثر من %{count} مشاركة.\n(delete_all_posts_max)" other: "لا يمكن مسح كل المشاركات لأن العضو لديه أكثر من %{count} مشاركة.\n(delete_all_posts_max)" - delete_confirm: "هل أنت متأكد من حذف هذا العضو ؟ الحذف نهائي بلا رجعه" - delete_and_block: "حذف و حظر this email and IP address" - delete_dont_block: "حذفه فقط" - deleted: "تم حذف المستخدم." - delete_failed: "حدث خطأ عند حذف المستخدم. يجب التاكد من انك حذفت جميع مشاركات المستخدم قبل محاولة حذف المستخدم." + delete_confirm: "أمتأكّد من حذف هذا المستخدم؟ لا عودة في هذا!" + delete_and_block: "احذفه وامنع بريده وعنوان IP" + delete_dont_block: "فقط احذفه" + deleted: "حُذف المستخدم." + delete_failed: "حدث خطأ في حذف المستخدم. تأكد من أن كل مشاركاته محذوفة قبل حذفه." send_activation_email: "ارسل رسالة تفعيل" activation_email_sent: "تم ارسال رسالة التفعيل الى البريد." send_activation_email_failed: "حدث خطأ عند محاولة ارسال رسالة تفعيل مرّة أخرى. %{error}" @@ -2703,9 +3019,18 @@ ar: block_failed: 'حدث خطأ عند حظر هذا المستخدم.' block_confirm: 'هل انت متأكد من حظر هذا المستخدم؟ لن يستطيع انشاء مواضيع او ردود جديدة' block_accept: 'نعم, حظر هذا المستخدم' + bounce_score: "سجل الترويج" + reset_bounce_score: + label: "اعادة تعيين" + title: "اعادة تعيين سجل الترويج الى 0" deactivate_explanation: "المستخدم الغير نشط يحب أن يتأكد من البريد الالكتروني" suspended_explanation: "المستخدم الموقوف لايملك صلاحية تسجيل الدخول" block_explanation: "المستخدم الموقوف لايستطيع أن يشارك" + staged_explanation: "العضو المنظم يمكنه فقط النشر عن طريق البريد الالكتروني في المواضيع المخصصه ." + bounce_score_explanation: + none: "لا ترويجات تم استلامها من هذا البريد الالكتروني" + some: "هناك بعض الترويجات تم استلامها مؤخرا من هذا البريد الالكتروني" + threshold_reached: "تم استلام الكثير من الترويجات من هذا البريد الالكتروني" trust_level_change_failed: "هناك مشكلة في تغيير مستوى ثقة المستخدم " suspend_modal_title: "حظر المستخدم" trust_level_2_users: "أعضاء مستوى الثقة 2." @@ -2716,7 +3041,6 @@ ar: unlock_trust_level: "فتح مستوى الثقة " tl3_requirements: title: "المتطلبات لمستوى الثقة 3." - table_title: "في أخر %{time_period} أيام:" value_heading: "تصويت" requirement_heading: "متطلبات" visits: "الزيارات" @@ -2748,12 +3072,12 @@ ar: external_avatar_url: "رابط الملف الشخصي" user_fields: title: "حقول المستخدم" - help: "إضافة الحقول التي يمكن للمستخدمين ملئها ." + help: "أضف حقولا يمكن للمستخدمين ملئها." create: "أضف حقل مستخدم" untitled: "بدون عنوان" name: "اسم الحقل" type: "نوع الحقل " - description: "حقل الوصف" + description: "وصف الحقل" save: "حفظ" edit: "تعديل" delete: "حذف" @@ -2772,12 +3096,16 @@ ar: title: "عرض في الملف الشحصي العام؟" enabled: "عرض في الملف الشخصي" disabled: "عدم الأظهار في الملف الشخصي" + show_on_user_card: + title: "اظهارها على كرت المستخدم؟" + enabled: "ظاهرة على كرت المستخدم" + disabled: "غير ظاهرة على كرت المستخدم" field_types: text: 'حقل النص' confirm: 'تأكيد' dropdown: "القائمة المنسدلة" site_text: - description: "يمكنك تخصيص اي نص في مدونتك . الرجاء البدء بالبحث في الاسفل:" + description: "يمكنك تخصيص أيّ من نصوص هذا المنتدى. يمكنك استكشاف ذلك أدناه:" search: "ابحث عن النص الذي تريد تعديله" title: 'محتوى النص' edit: 'تعديل' @@ -2787,11 +3115,10 @@ ar: recommended: "نوصيك بتخصيص النص التالي ليلائم احتياجاتك:" show_overriden: 'اظهر التجاوزات فقط' site_settings: - show_overriden: 'تظهر فقط تجاوز' - title: 'اعدادات' + title: 'إعدادات' reset: 'إعادة تعيين' none: 'لا شيء' - no_results: "لا توجد نتائج." + no_results: "لا نتائج." clear_filter: "مسح" add_url: "أضافة رابط" add_host: "أضافة نطاق" @@ -2817,14 +3144,17 @@ ar: login: "تسجيل الدخول" plugins: "الإضافات " user_preferences: "تفضيلات العضو" + tags: "الوسوم" + search: "البحث" badges: - title: 'شعارات ' + title: الشارات new_badge: شعار جديد new: 'جديد ' name: 'إسم ' badge: 'شعار ' display_name: إسم العرض description: الوصف + long_description: وصف طويل badge_type: نوع الشعار badge_grouping: المجموعة badge_groupings: @@ -2834,7 +3164,7 @@ ar: reason_help: ( رابط إلى مشاركة أو موضوع ) save: حفظ delete: حذف - delete_confirm: هل أنت متأكد من أنك تريد حذف هذا الشعار ؟ + delete_confirm: أمتأكد من حذف هذه الشارة؟ revoke: تعطيل reason: السبب expand: توسيع &مساعدة; @@ -2864,6 +3194,7 @@ ar: post_revision: "عندما يقوم عضو بتعديل أو إنشاء مشاركة." trust_level_change: "عندما يقوم شخص بتغير مستوى الثقة." user_change: "عندما يتم تعديل عضو أو انشاءه." + post_processed: "بعد تنفيذ المشاركة" preview: link_text: "معاينة الأوسمة الممنوحة." plan_text: "معاينة مع خطة الاستعلام." @@ -2914,6 +3245,7 @@ ar: embed_truncate: "بتر المشاركات المضمنة" embed_whitelist_selector: "منتقي CSS للعناصر التي تسمح في التضمينات." embed_blacklist_selector: "منتقي CSS للعناصر التي حذفت من التضمينات." + embed_classname_whitelist: "اسماء اصناف المظاهر الجمالية المسموح بها" feed_polling_enabled: "استورد المشاركات عبر RSS/ATOM" feed_polling_url: "URL مغذي RSS/ATOM يتقدم ببطء." save: "أحفظ الإعدادات المضمنة" @@ -2932,3 +3264,26 @@ ar: label: "جديد :" add: "أضف" filter: "بحث ( رابط داخلي أو خارجي )" + wizard_js: + wizard: + done: "انتهى" + back: "الى الخلف" + next: "التالي" + step: "%{current} من %{total}" + upload: "رفع" + uploading: "جاري رفع الملفات.." + quit: "ربما لاحقا" + staff_count: + zero: "شركتك لديها %{count} من الموظفين" + one: "شركتك لديها 1 موظف فقط" + two: "شركتك لديها %{count} من الموظفين" + few: "شركتك لديها %{count} من الموظفين" + many: "شركتك لديها %{count} من الموظفين" + other: "شركتك لديها %{count} من الموظفين" + invites: + add_user: "أضف" + none_added: "لم تقم بدعوة أي موظفين. هل أنت متأكد انك تريد المتابعة؟" + roles: + admin: "مدير" + moderator: "مشرف" + regular: "مستخدم عادي" diff --git a/config/locales/client.bs_BA.yml b/config/locales/client.bs_BA.yml index 1c9079a90e2..6d615d520e1 100644 --- a/config/locales/client.bs_BA.yml +++ b/config/locales/client.bs_BA.yml @@ -28,6 +28,7 @@ bs_BA: millions: "{{number}} miliona" dates: time: "h:mm a" + timeline_date: "MMM YYYY" long_no_year: "MMM D h:mm a" long_no_year_no_time: "MMM D" full_no_year_no_time: "MMMM Do" @@ -49,10 +50,6 @@ bs_BA: one: "1 sekunda" few: "%{count} sekundi" other: "%{count} sekundi" - less_than_x_minutes: - one: "<1 minuta" - few: "%{count} minuta" - other: "%{count} minuta" date_month: "MMM D" date_year: "MMM 'YY" medium: @@ -368,8 +365,6 @@ bs_BA: latest_by: "zadnje od" toggle_ordering: "toggle ordering control" subcategories: "Podkategorije" - topic_stats: "Broj novih tema." - post_stats: "Broj novih postova." ip_lookup: title: IP Address Lookup hostname: Hostname @@ -391,7 +386,6 @@ bs_BA: profile: "Profil" mute: "Mutiraj" edit: "Uredi Postavke" - download_archive: "skini arhivu mojih odgovora" new_private_message: "Nova poruka" private_message: "Privatne Poruke" private_messages: "Poruke" @@ -592,11 +586,8 @@ bs_BA: create: "Pošalji Pozivnicu" generate_link: "Kopiraj link za invite" bulk_invite: - none: "You haven't invited anyone here yet. You can send individual invites, or invite a bunch of people at once by uploading a bulk invite file." text: "Bulk Invite from File" - uploading: "Uploading..." success: "File uploaded successfully, you will be notified shortly with progress." - error: "There was an error uploading '{{filename}}': {{message}}" password: title: "Šifra" too_short: "Vaša šifra je prekratka." @@ -868,7 +859,6 @@ bs_BA: title: "traži teme, postove, članove ili kategorije" no_results: "Nema rezultata." no_more_results: "Nema rezultata pretrage." - search_help: Pomoć pri pretrazi searching: "Potražujem..." post_format: "#{{post_number}} od {{username}}" context: @@ -911,7 +901,6 @@ bs_BA: category: "Nema više tema na kategoriji {{category}}." top: "Nema više popularnih tema." topic: - filter_to: "{{post_count}} odgovora u temi" create: 'Započni Temu' create_long: 'Započni novu Temu' private_message: 'Započni privatnu konverzaciju' @@ -955,7 +944,6 @@ bs_BA: jump_bottom_with_number: "skoči na post %{post_number}" total: ukupan broj current: trenutni post - position: "post %{current} od %{total}" notifications: reasons: '3_6': 'Dobijat ćete notifikacije zato što motrite ovu temu.' @@ -1067,7 +1055,6 @@ bs_BA: select_all: select all deselect_all: deselect all post: - quote_reply: "citiraj odgovor" edit: "Editing {{link}} by {{replyAvatar}} {{username}}" edit_reason: "Razlog: " post_number: "post {{number}}" @@ -1078,7 +1065,6 @@ bs_BA: show_full: "Pogledaj Cijeli Post" show_hidden: 'Pogledaj sakriven sadržaj.' expand_collapse: "digni/spusti" - more_links: "{{count}} više..." unread: "Post je nepročitan" errors: create: "Sorry, there was an error creating your post. Please try again." @@ -1120,14 +1106,6 @@ bs_BA: unhide: "Unhide" actions: flag: 'Opomena' - it_too: - off_topic: "Opomeni i ti" - spam: "Opomeni i ti" - inappropriate: "Opomeni i ti" - custom_flag: "Opomeni i ti" - bookmark: "Bookmark it too" - like: "Lajkuj i ti" - vote: "Glasaj i ti" undo: off_topic: "Otkaži opomenu" spam: "Otkaži opomenu" @@ -1225,7 +1203,6 @@ bs_BA: take_action: "Poduzmi Akciju" notify_action: 'Privatna Poruka' delete_spammer: "Obriši Spamera" - delete_confirm: "You are about to delete %{posts} posts and %{topics} topics from this user, remove their account, block signups from their IP address %{ip_address}, and add their email address %{email} to a permanent block list. Are you sure this user is really a spammer?" yes_delete_spammer: "Da, Obriši Spamera" ip_address_missing: "(N/A)" hidden_email_address: "(hidden)" @@ -1234,10 +1211,6 @@ bs_BA: cant: "Nažalost, ne možete opomenuti ovaj post trenutno." custom_placeholder_notify_user: "Zašto ovaj post nalaže da kontaktirate korisnika privatno. Budite detaljni, pristojni i korektni." custom_placeholder_notify_moderators: "Zašto ovaj post zaslužuje pažnju moderatora. Navedite vaš razlog po mogućnosti ostavite link ako je nužno." - custom_message: - at_least: "enter at least {{n}} characters" - more: "{{n}} to go..." - left: "{{n}} remaining" flagging_topic: title: "Zašto privatno opominjete ovu temu?" action: "Opomeni Temu" @@ -1251,6 +1224,8 @@ bs_BA: help: "Ova tema je zatvorena; zvanično ne prima nove postove" archived: help: "Ova tema je arhivirana; zaleđena je i ne može biti promjenjena" + locked_and_archived: + help: "Ova tema je zatvorena i arhivirana; zvanično ne prima nove postove" unpinned: title: "Unpinned" help: "This topic is unpinned; it will display in default order" @@ -1262,7 +1237,6 @@ bs_BA: invisible: help: "Ovu temu sajt ne lista među najnovijim temama. Neće biti prisutna ni među listama tema unutar kategorija. Jedini način da se dođe do ove teme je direktan link" posts: "Odgovori" - posts_lowercase: "odgovori" posts_long: "postoji {{number}} odgovora u ovoj temi" posts_likes_MF: | This topic has {count, plural, one {1 post} other {# posts}} {ratio, select, @@ -1301,7 +1275,16 @@ bs_BA: unread: help: "teme koje trenutno pratite i motrite sa nepročitanim postovima" new: + lower_title_with_count: + one: "1 novi" + few: "{{count}} nova" + other: "{{count}} novih" lower_title: "nova" + title: "Novo" + title_with_count: + one: "Novo (1)" + few: "Novo ({{count}})" + other: "Novo ({{count}})" help: "teme kreirane u zadnjih nekoliko dana" posted: title: "Moji Odgovori" @@ -1328,7 +1311,7 @@ bs_BA: admin_js: type_to_filter: "kucaj da sortiraš..." admin: - title: 'Revolucionar Admin' + title: 'Discourse Admin' moderator: 'Moderator' dashboard: title: "Dashboard" @@ -1343,7 +1326,7 @@ bs_BA: version_check_pending: "Looks like you upgraded recently. Fantastic!" installed_version: "Installed" latest_version: "Najnovije" - problems_found: "Problemi su nađeni sa instalacijom Revolucionara:" + problems_found: "Pronašli smo probleme s vašom instalacijom Discoursea:" last_checked: "Zadnje pogledani" refresh_problems: "Osvježi" no_problems: "No problems were found." @@ -1353,7 +1336,12 @@ bs_BA: suspended: 'Suspended:' private_messages_short: "PP" private_messages_title: "Privatne Poruke" + mobile_title: "Mobiteli" space_free: "{{size}} slobodno" + uploads: "Učitavanja" + backups: "backupovi" + page_views_short: "API pozivi" + show_traffic_report: "Pokaži detaljan izvještaj prometa" reports: today: "Today" yesterday: "Yesterday" @@ -1421,7 +1409,6 @@ bs_BA: refresh: "Refresh" new: "New" selector_placeholder: "add users" - name_placeholder: "Group name, no spaces, same as username rule" about: "Edit your group membership and names here" group_members: "Group members" delete: "Delete" @@ -1441,6 +1428,18 @@ bs_BA: info_html: "Your API key will allow you to create and update topics using JSON calls." all_users: "All Users" note_html: "Keep this key secret, all users that have it may create arbitrary posts as any user." + plugins: + title: "Pluginovi" + installed: "Instalirani pluginovi" + name: "Ime" + none_installed: "Nemate instaliran niti jedan plugin" + version: "Verzija" + enabled: "Omogućen?" + is_enabled: "Da" + not_enabled: "Ne" + change_settings: "Izmijeni postavke" + change_settings_short: "Postavke" + howto: "Kako instaliram pluginove?" backups: title: "Backups" menu: @@ -1546,12 +1545,18 @@ bs_BA: name: 'love' description: "The like button's color." email: + title: "Emailovi" settings: "Settings" + templates: "Predlošci" preview_digest: "Pregled Sajta" sending_test: "Sending test Email..." + error: "Greška - %{server_error}" test_error: "There was a problem sending the test email. Please double-check your mail settings, verify that your host is not blocking mail connections, and try again." sent: "Sent" skipped: "Skipped" + bounced: "Vraćeni" + received: "Primljeno" + rejected: "Odbijeni" sent_at: "Sent At" time: "Time" user: "User" @@ -1561,6 +1566,7 @@ bs_BA: send_test: "Send Test Email" sent_test: "sent!" delivery_method: "Delivery Method" + preview_digest_desc: "Prikaži sadržaj sažetih poruka pošte poslanih neaktivnim korisnicima." refresh: "Refresh" format: "Format" html: "html" @@ -1568,6 +1574,26 @@ bs_BA: last_seen_user: "Last Seen User:" reply_key: "Reply Key" skipped_reason: "Skip Reason" + incoming_emails: + from_address: "Od" + to_addresses: "Za" + cc_addresses: "Cc" + subject: "Naslov" + error: "Greška" + none: "Nema dolaznih poruka pošte." + modal: + title: "Detalji dolaznih poruka pošte" + error: "Greška" + headers: "Zaglavlja" + subject: "Naslov" + body: "Tijelo" + rejection_message: "Poruka odbijenica" + filters: + from_placeholder: "from@example.com" + to_placeholder: "to@example.com" + cc_placeholder: "cc@example.com" + subject_placeholder: "Naslov..." + error_placeholder: "Greška" logs: none: "No logs found." filters: @@ -1688,7 +1714,6 @@ bs_BA: suspend_reason: "Reason" suspended_by: "Suspended by" delete_all_posts: "Delete all posts" - delete_all_posts_confirm: "You are about to delete %{posts} posts and %{topics} topics. Are you sure?" suspend: "Suspend" unsuspend: "Unsuspend" suspended: "Suspended?" @@ -1896,3 +1921,26 @@ bs_BA: with_post: %{username} for post in %{link} with_post_time: %{username} for post in %{link} at %{time} with_time: %{username} at %{time} + emoji: + add: "Dodaj novi emoji" + permalink: + form: + label: "Novo:" + wizard_js: + wizard: + back: "Prethodno" + next: "Iduće" + step: "%{current} od %{total}" + upload: "Učitaj" + uploading: "Učitavanje..." + quit: "Možda kasnije" + staff_count: + one: "Vaša zajednica ima 1 člana osoblja." + few: "Vaša zajednica ima 2 člana osoblja." + other: "Vaša zajednica ima %{count} članova osoblja." + invites: + add_user: "Dodaj" + roles: + admin: "Admin" + moderator: "Moderator" + regular: "Regularan korisnik" diff --git a/config/locales/client.cs.yml b/config/locales/client.cs.yml index b44e32bdd11..74ce5362ea4 100644 --- a/config/locales/client.cs.yml +++ b/config/locales/client.cs.yml @@ -51,10 +51,6 @@ cs: one: "1s" few: "%{count}s" other: "%{count}s" - less_than_x_minutes: - one: "< 1m" - few: "< %{count}m" - other: "< %{count}m" x_minutes: one: "1m" few: "%{count}m" @@ -169,7 +165,13 @@ cs: us_gov_west_1: "AWS GovCloud (USA)" eu_west_1: "EU (Irsko)" eu_central_1: "EU (Frankfurt)" + ap_southeast_1: "Asia Pacific (Singapur)" + ap_southeast_2: "Asia Pacific (Sydney)" + ap_south_1: "Asia Pacific (Bombaj)" + ap_northeast_1: "Asia Pacific (Tokyo)" + ap_northeast_2: "Asia Pacific (Soul)" sa_east_1: "Jižní Amerika (Sao Paulo)" + cn_north_1: "Čína (Peking)" edit: 'upravit název a kategorii příspěvku' not_implemented: "Tato funkce ještě nebyla naprogramována, omlouváme se." no_value: "Ne" @@ -345,12 +347,6 @@ cs: few: "%{count} uživatelé" other: "%{count} uživatelů" groups: - empty: - posts: "V této skupině není od žádného člena ani jeden příspěvek." - members: "V této skupině není žádny uživatel." - mentions: "Tato skupina nebyla ještě @zmíněna." - messages: "Pro tuto skupinu není žádná zpráva." - topics: "V této skupině není od žádného člena ani jedno téma." add: "Přidat" selector_placeholder: "Přidat členy" owner: "Vlastník" @@ -423,16 +419,14 @@ cs: latest_by: "latest by" toggle_ordering: "Přepnout editaci pořadí" subcategories: "Podkategorie" - topic_stats: "Počet nových témat." + topic_sentence: + one: "1 téma" + few: "%{count} témata" + other: "%{count} témat" topic_stat_sentence: one: "%{count} nové téma za posledních %{unit}." few: "%{count} nová témata za posledních %{unit}." other: "%{count} nových témat za posledních %{unit}." - post_stats: "Počet nových příspěvků." - post_stat_sentence: - one: "%{count} nový příspěvěk za posledních %{unit}." - few: "%{count} nové příspěvky za posledních %{unit}." - other: "%{count} nových příspěvků za posledních %{unit}." ip_lookup: title: Vyhledávání podle IP adresy hostname: Hostname @@ -455,7 +449,6 @@ cs: profile: "Profil" mute: "Ignorovat" edit: "Upravit nastavení" - download_archive: "Stáhnout moje příspěvky" new_private_message: "Nová zpráva" private_message: "Zpráva" private_messages: "Zprávy" @@ -501,19 +494,24 @@ cs: Ztlumená témata a kategorie nejsou zahrnuté v těchto emailech. daily: "Denně posílat aktuality" individual: "Upozornit emailem na každý nový příspěvek" + individual_no_echo: "Upozornit emailem na každý nový příspěvek kromě mých vlastních" many_per_day: "Upozornit emailem na každý nový příspěvek (asi {{dailyEmailEstimate}} každý den)" few_per_day: "Upozornit emailem na každý nový příspěvek (asi 2 každý den)" tag_settings: "Štítky" watched_tags: "Hlídané" watched_tags_instructions: "Budete automaticky hlídat všechna nová témata s těmito štítky. Na všechny nové příspěvky a témata budete upozorněni. Počet nových příspěvků se zobrazí vedle tématu." tracked_tags: "Sledované" + tracked_tags_instructions: "Budete automaticky sledovat všechna témata s těmito štítky. Počet nových příspěvků se zobrazí vedle tématu." muted_tags: "Ztišené" muted_tags_instructions: "Nikdy nebudete dostávat upozornění na nová témata s těmito štítky a neobjeví se v aktuálních." watched_categories: "Hlídané" watched_categories_instructions: "Budete automaticky sledovat všechna nová témata v těchto kategoriích. Na všechny nové příspěvky budete upozorněni. Počet nových příspěvků se zobrazí vedle tématu." tracked_categories: "Sledované" + tracked_categories_instructions: "Všechna témata v této kategorii budou automaticky hlídaná. Počet nepřečtených a nových příspěvků se zobrazí vedle tématu." watched_first_post_categories: "Hlídané první příspěvky" watched_first_post_categories_instructions: "Budete informováni o prvním novém příspěvku v každém novém tématu vytvořeném v těchto kategoriích." + watched_first_post_tags: "Hlídané první příspěvky" + watched_first_post_tags_instructions: "Budete informováni o prvním novém příspěvku v každém novém tématu s těmito štítky." muted_categories: "Ztišené" muted_categories_instructions: "Budeš přijímat upornění na nová témata v těchto kategoriích a ty se neobjeví v aktuálních." delete_account: "Smazat můj účet" @@ -528,6 +526,9 @@ cs: muted_topics_link: "Ukázat utlumená témata" watched_topics_link: "Ukázat hlídaná témata" automatically_unpin_topics: "Atomaticky odepni téma jakmile se dostanu na konec." + apps: "Aplikace" + revoke_access: "Odebrat přístup" + api_approved: "Schváleno:" staff_counters: flags_given: "užitečná nahlášení" flagged_posts: "nahlášených příspěvků" @@ -674,6 +675,7 @@ cs: after_4_minutes: "po 4 minutách" after_5_minutes: "po 5 minutách" after_10_minutes: "po 10 minutách" + notification_level_when_replying: "Když přidám příspěvek k tématu, nastav toto téma na:" invited: search: "pište pro hledání v pozvánkách..." title: "Pozvánky" @@ -705,13 +707,9 @@ cs: account_age_days: "Stáří účtu ve dnech" create: "Poslat pozvánku" generate_link: "Zkopírovat odkaz na pozvánku" - generated_link_message: '
Odkaz na poznámku byl úspěšně vygenerován!
Odkaz na pozvánku je platný jen pro tuto e-mailovou adresu: %{invitedEmail}
' bulk_invite: - none: "Zatím jste nikoho nepozval. Můžete poslat individuální pozvánku nebo pozvat skupinu lidí naráz pomocí nahrání souboru." text: "Hromadné pozvání s pomocí souboru" - uploading: "Nahrávám..." success: "Nahrání souboru proběhlo úspěšně. O dokončení celého procesu budete informování pomocí zprávy." - error: "Nastala chyba při nahrávání '{{filename}}': {{message}}" password: title: "Heslo" too_short: "Vaše heslo je příliš krátké." @@ -812,7 +810,16 @@ cs: enabled: "Tato stránka je v režimu jen pro čtení. Prosim pokračujte v prohlížení, ale odpovídání a ostatní operace jsou momentálně vypnuté." login_disabled: "Přihlášení je zakázáno jelikož je stránka v režimu jen pro čtení." logout_disabled: "Odhlášení je zakázáno zatímco je stránka v režimu jen pro čtení." + logs_error_rate_notice: + reached: "%{relativeAge} – %{rate} dosáhlo limitu stránky, který je %{siteSettingRate}." + exceeded: "%{relativeAge} – %{rate} přesahuje limit stránky, který je %{siteSettingRate}." + rate: + one: "1 chyba/%{duration}" + few: "%{count} chyby/%{duration}" + other: "%{count} chyb/%{duration}" learn_more: "více informací..." + all_time: 'celkem' + all_time_desc: 'témat vytvořeno' year: 'rok' year_desc: 'témata za posledních 365 dní' month: 'měsíc' @@ -838,6 +845,8 @@ cs: value_prop: "Pokud si založíš účet, budeme si přesně pomatovat, co jsi četly, takže se vždycky vrátíš do bodu, odkud jsi odešel. Také budeš dostávat upozornění, zde a přes e-mail, kdykoli přibydou nově příspěvky. A můžeš přidávat 'to se mi líbí' a šířit tak lásku. :heartbeat:" summary: enabled_description: "Čtete shrnutí tohoto tématu: nejzajímavější příspěvky podle komunity." + description: "Je tu {{replyCount}} odpovědí." + description_time: "Je tu {{replyCount}} odpovědí o odhadovaném času čtení {{readingTime}} minut." enable: 'Přepnout na "nejlepší příspěvky"' disable: 'Přepnout na normální zobrazení' deleted_filter: @@ -885,7 +894,7 @@ cs: or: "Nebo" authenticating: "Autorizuji..." awaiting_confirmation: "Váš účet nyní čeká na aktivaci, použijte odkaz pro zapomené heslo, jestli chcete, abychom vám zaslali další aktivační email." - awaiting_approval: "Váš účet zatím nebyl schválen moderátorem. Až se tak stane, budeme vás informovat emailem." + awaiting_approval: "Váš účet zatím nebyl schválen členem redakce. Až se tak stane, budeme vás informovat emailem." requires_invite: "Promiňte, toto fórum je pouze pro zvané." not_activated: "Ještě se nemůžete přihlásit. Zaslali jsme vám aktivační email v {{sentTo}}. Prosím následujte instrukce v tomto emailu, abychom mohli váš účet aktivovat." not_allowed_from_ip_address: "Z této IP adresy se nemůžete přihlásit." @@ -916,6 +925,16 @@ cs: github: title: "přes GitHub" message: "Autentizuji přes GitHub (ujistěte se, že nemáte zablokovaná popup okna)" + emoji_set: + apple_international: "Apple/Mezinárodní" + google: "Google" + twitter: "Twitter" + emoji_one: "Emoji One" + win10: "Win10" + category_page_style: + categories_only: "Pouze kategorie" + categories_with_featured_topics: "Kategorie a vybrané příspěvky" + categories_and_latest_topics: "Kategorie a nejnovější témata" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' @@ -925,14 +944,21 @@ cs: more_emoji: "více..." options: "Možnosti" whisper: "šeptat" + unlist: "neviditelné" add_warning: "Toto je oficiální varování." toggle_whisper: "Přepnout šeptání" + toggle_unlisted: "Přepnout neviditelné" posting_not_on_topic: "Rozepsali jste odpověď na téma \"{{title}}\", ale nyní máte otevřené jiné téma." saving_draft_tip: "ukládá se..." saved_draft_tip: "uloženo" saved_local_draft_tip: "uloženo lokálně" similar_topics: "Podobná témata" drafts_offline: "koncepty offline" + group_mentioned: + one: "Zmíněním {{group}}, upozorníš 1 člověka – jste si jistý/á?" + few: "Zmíněním {{group}}, upozorníš {{count}} lidi – jste si jistý/á?" + other: "Zmíněním {{group}}, upozorníš {{count}} lidí – jste si jistý/á?" + duplicate_link: "Zdá se, že tvůj odkaz na {{domain}} byl již v tomto tématu použit uživatelem @{{username}} v odpověď {{ago}} – určitě jej chceš uvést znova?" error: title_missing: "Název musí být vyplněn" title_too_short: "Název musí být dlouhý alespoň {{min}} znaků" @@ -962,8 +988,10 @@ cs: show_preview: 'zobrazit náhled »' hide_preview: '« skrýt náhled' quote_post_title: "Citovat celý příspěvek" + bold_label: "B" bold_title: "Tučně" bold_text: "tučný text" + italic_label: "I" italic_title: "Kurzíva" italic_text: "text kurzívou" link_title: "Odkazy" @@ -981,6 +1009,7 @@ cs: olist_title: "Číslovaný seznam" ulist_title: "Odrážkový seznam" list_item: "Položka seznam" + heading_label: "H" heading_title: "Nadpis" heading_text: "Nadpis" hr_title: "Horizontální oddělovač" @@ -989,7 +1018,10 @@ cs: modal_ok: "OK" modal_cancel: "Zrušit" cant_send_pm: "Bohužel, nemůžete poslat zprávu uživateli %{username}." - admin_options_title: "Volitelné administrační nastavení tématu" + yourself_confirm: + title: "Zapomněl/a jste přidat přijemce?" + body: "Nyní tuto zprávu posíláte pouze sám/sama sobě!" + admin_options_title: "Volitelné redakční nastavení tématu" auto_close: label: "Automaticky zavřít téma za:" error: "Prosím zadejte platnou hodnotu." @@ -1009,14 +1041,26 @@ cs: group_mentioned: "
{{username}} {{description}}
" quoted: "
{{username}} {{description}}
" replied: "
{{username}} {{description}}
" + posted: "
{{username}} {{description}}
" edited: "
{{username}} {{description}}
" liked: "
{{username}} {{description}}
" + liked_2: "
{{username}}, {{username2}} {{description}}
" + liked_many: + one: "
{{username}}, {{username2}} a 1 dalšího {{description}}
" + few: "
{{username}}, {{username2}} a {{count}} další {{description}}
" + other: "
{{username}}, {{username2}} a {{count}} dalších {{description}}
" private_message: "
{{username}} {{description}}
" invited_to_private_message: "
{{username}} {{description}}
" invited_to_topic: "
{{username}} {{description}}
" invitee_accepted: "
{{username}} přijal vaši pozvánku
" moved_post: "
{{username}} přesunul {{description}}
" + linked: "
{{username}} {{description}}
" granted_badge: "
Získáno '{{description}}'
" + watching_first_post: "
Nové téma {{description}}
" + group_message_summary: + one: "
{{count}} zpráva ve tvé {{group_name}} schránce
" + few: "
{{count}} zprávy ve tvé {{group_name}} schránce
" + other: "
{{count}} zpráv ve tvé {{group_name}} schránce
" alt: mentioned: "Zmíněno" quoted: "Citováno" @@ -1062,6 +1106,7 @@ cs: most_liked: "Nejoblíbenější" select_all: "Vybrat vše" clear_all: "Vymazat vše" + too_short: "Hledaný výraz je příliš krátký." result_count: one: "1 výsledek pro \"{{term}}\"" few: "{{count}} výsledků pro \"{{term}}\"" @@ -1069,7 +1114,6 @@ cs: title: "vyhledávat témata, příspěvky, uživatele nebo kategorie" no_results: "Nenalezeny žádné výsledky." no_more_results: "Nenalezeny žádné další výsledky." - search_help: Pomoc s hledáním searching: "Hledám ..." post_format: "#{{post_number}} od {{username}}" context: @@ -1077,12 +1121,51 @@ cs: category: "Hledat v kategorii #{{category}}" topic: "Vyhledat v tomto tématu" private_messages: "Hledat ve zprávách" + advanced: + title: Pokročilé hledání + posted_by: + label: Zaslal + in_category: + label: V kategorii + in_group: + label: Ve skupině + with_badge: + label: S odznakem + with_tags: + label: Se štítky + filters: + label: Zobraz jen témata/příspěvky, které... + likes: líbí se mi + posted: Přidal jsem příspěvek + watching: Sleduji + tracking: Sleduji. + private: jsou v mých zprávách + bookmarks: Mám v záložkách + first: jsou první příspěvek v tématu + pinned: jsou připnuty + unpinned: nejsou připnuty + wiki: jsou wiki + statuses: + label: Kde příspěvky + open: jsou otevřeny + closed: jsou zavřeny + archived: jsou archivovány + noreplies: jsou bez odpovědi + single_user: obsahují jen jednoho uživatele + post: + count: + label: Minimální počet příspěvků + time: + label: Přidáno + before: před + after: po hamburger_menu: "jít na jiný seznam témat nebo kategorii" new_item: "nové" go_back: 'jít zpět' not_logged_in_user: 'stránka uživatele s přehledem o aktuální činnosti a nastavení' current_user: 'jít na vaši uživatelskou stránku' topics: + new_messages_marker: "poslední navštívení" bulk: unlist_topics: "Odebrat témata ze seznamu" reset_read: "reset přečteného" @@ -1118,6 +1201,9 @@ cs: category: "V kategorii {{category}} nejsou žádná témata." top: "Nejsou tu žádná populární témata." search: "There are no search results." + educate: + new: '
Zde se zobrazují vaše nová témata.
Dle výchozího nastavení se za nové příspěvky, které budou mít štíteknové , považují příspěvky, které byly vytvořeny během posledních 2 dnů.
Toto můžete změnit ve svém nastavení.
' + unread: '
Zde se zobrazují vaše nepřečtená témata.
Podle výchozího nastavení jsou za nepřečtená témata, u kterých se zobrazuje počet nepřečtení 1, považována ta, která jste:
Nebo pokud jste nastavil téma jako Hlídané či Sledované pomocí nabídky na spodu každého tématu.
Toto chování můžete změnit v nastavení.
'
bottom:
latest: "Nejsou tu žádná další témata z poslední doby."
hot: "Nejsou tu žádná další populární témata k přečtení."
@@ -1133,7 +1219,10 @@ cs:
unsubscribe:
stop_notifications: "Budete dostávat méně upozornění pro {{title}}"
change_notification_state: "Váš momentální stav oznámení je"
- filter_to: "{{post_count}} příspěvků v tématu"
+ filter_to:
+ one: "1 příspěvek v tématu"
+ few: "{{count}} příspěvky v tématu"
+ other: "{{count}} příspěvků v tématu"
create: 'Nové téma'
create_long: 'Vytvořit nové téma'
private_message: 'Vytvořit zprávu'
@@ -1187,6 +1276,7 @@ cs:
toggle_information: "zobrazit/skrýt detaily tématu"
read_more_in_category: "Chcete si toho přečíst víc? Projděte si témata v {{catLink}} nebo {{latestLink}}."
read_more: "Chcete si přečíst další informace? {{catLink}} nebo {{latestLink}}."
+ read_more_MF: "{ UNREAD, plural, =0 {} one { Je tu 1 nepřečtené } other { Je tu # nepřečtených } } { NEW, plural, =0 {} one { {BOTH, select, true{and } false {is } other{}} 1 nové téma} other { {BOTH, select, true{and } false {are } other{}} # nových témat} } remaining, nebo {CATEGORY, select, true {si projděte ostatní témata v kategorii {catLink}} false {{latestLink}} other {}}"
browse_all_categories: Projděte všechny kategorie
view_latest_topics: si zobrazte populární témata
suggest_create_topic: Co takhle založit nové téma?
@@ -1198,21 +1288,29 @@ cs:
auto_close_title: 'Nastavení automatického zavření'
auto_close_save: "Uložit"
auto_close_remove: "Nezavírat téma automaticky"
+ auto_close_immediate:
+ one: "Poslední příspěvek v témetu je již 1 hodinu starý, takže toto téma bude okamžitě uzavřeno."
+ few: "Poslední příspěvek v témetu je již %{count} hodiny starý, takže toto téma bude okamžitě uzavřeno."
+ other: "Poslední příspěvek v témetu je již %{count} hodin starý, takže toto téma bude okamžitě uzavřeno."
timeline:
back: "Zpět"
back_description: "Přejít na poslední nepřečtený příspěvek"
+ replies_short: "%{current} / %{total}"
progress:
title: pozice v tématu
go_top: "nahoru"
go_bottom: "dolů"
go: "go"
jump_bottom: "na poslední příspěvek"
+ jump_prompt: "přejít na příspěvek"
+ jump_prompt_long: "Na který příspěvek chcete přejít?"
jump_bottom_with_number: "Skočit na příspěvěk %{post_number}"
total: celkem příspěvků
current: aktuální příspěvek
- position: "příspěvek %{current} z %{total}"
notifications:
+ title: změňte, jak často budete upozornění na toto téma
reasons:
+ '3_10': 'Budete dostávat oznámení, protože hlídáte štítek na tomto tématu.'
'3_6': 'Budete dostávat oznámení, protože hlídáte tuhle kategorii.'
'3_5': 'Budete dostávat oznámení, protože jste tohle téma automaticky začali hlídat.'
'3_2': 'Budete dostávat oznámení, protože hlídáte toto téma.'
@@ -1282,6 +1380,9 @@ cs:
share:
title: 'Sdílet'
help: 'sdílet odkaz na toto téma'
+ print:
+ title: 'Tisk'
+ help: 'Otevři verzi tématu určenou k tisku'
flag_topic:
title: 'Nahlásit'
help: 'Soukromě nahlásit tento příspěvek moderátorům'
@@ -1295,6 +1396,10 @@ cs:
pin_note: "Uživatelé mohou odepnout téma sami pro sebe."
pin_validation: "Pro připíchnutí tohoto tématu je třeba datum."
not_pinned: "V kategorii {{categoryLink}} nejsou žádná připnutá témata."
+ already_pinned:
+ one: "Připevněné téma v {{categoryLink}}: {{count}}"
+ few: "Připevněná témata v {{categoryLink}}: {{count}}"
+ other: "Připevněná témata v {{categoryLink}}: {{count}}"
pin_globally: "Zobrazit toto téma na vrcholu seznamu všech témat dokud"
confirm_pin_globally: "Již máte {{count}} globálně připevněných příspěvků. Příliš mnoho připevněných příspěvků může zatěžovat nové nebo anonymní uživatele. Určitě chcete připevnit další téma globálně?"
unpin_globally: "Odstranit toto téma z vrcholu všech seznamů s tématy."
@@ -1311,14 +1416,17 @@ cs:
no_banner_exists: "Žádné téma není jako banner."
banner_exists: "V současnosti je zde téma jako banner."
inviting: "Odesílám pozvánku..."
+ automatically_add_to_groups: "Tato pozvánka obsahuje také přístup do těchto skupin:"
invite_private:
title: 'Pozvat do konverzace'
email_or_username: "Email nebo uživatelské jméno pozvaného"
email_or_username_placeholder: "emailová adresa nebo uživatelské jméno"
action: "Pozvat"
success: "Pozvali jsme tohoto uživatele, aby se připojil do této zprávy."
+ success_group: "Pozvali jsme tuto skupinu, aby se připojila do této zprávy."
error: "Bohužel nastala chyba při odesílání pozvánky."
group_name: "název skupiny"
+ controls: "Správa témat"
invite_reply:
title: 'Pozvat k diskuzi'
username_placeholder: "uživatelské jméno"
@@ -1358,6 +1466,10 @@ cs:
one: "Prosím, vyberte téma, do kterého chcete příspěvek přesunout."
few: "Prosím, vyberte téma, do kterého chcete tyto {{count}} příspěvky přesunout."
other: "Prosím, vyberte téma, do kterého chcete těchto {{count}} příspěvků přesunout."
+ merge_posts:
+ title: "Sluč vybrané příspěvky"
+ action: "sluč vybrané příspěvky"
+ error: "Během slučování vybraných příspěvků došlo k chybě."
change_owner:
title: "Změnit autora"
action: "změna autora"
@@ -1390,7 +1502,6 @@ cs:
post:
reply: " {{replyAvatar}} {{usernameLink}}"
reply_topic: " {{link}}"
- quote_reply: "odpověď s citací"
edit: "Editujete {{link}} {{replyAvatar}} {{username}}"
edit_reason: "Důvod: "
post_number: "příspěvek č. {{number}}"
@@ -1409,7 +1520,6 @@ cs:
one: "zobrazit 1 skrytou odpověď"
few: "zobrazit {{count}} skryté odpovědi"
other: "zobrazit {{count}} skrytých odpovědí"
- more_links: "{{count}} dalších..."
unread: "Příspěvek je nepřečtený."
has_replies:
one: "{{count}} odpověď"
@@ -1432,7 +1542,9 @@ cs:
create: "Bohužel nastala chyba při vytváření příspěvku. Prosím zkuste to znovu."
edit: "Bohužel nastala chyba při editaci příspěvku. Prosím zkuste to znovu."
upload: "Bohužel nastala chyba při nahrávání příspěvku. Prosím zkuste to znovu."
+ file_too_large: "Soubor, který se snažíte nahrát, je bohužel příliš velký (maximální velikost je {{max_size_kb}}kb). Co třeba jej nahrát na cloudovou službu a nasdílet sem odkaz?"
too_many_uploads: "Bohužel, najednou smíte nahrát jen jeden soubor."
+ too_many_dragged_and_dropped_files: "Bohužel, najednou smíte nahrát jen 10 souborů."
upload_not_authorized: "Bohužel, soubor, který se snažíte nahrát, není povolený (povolené přípony: {{authorized_extensions}})."
image_upload_not_allowed_for_new_user: "Bohužel, noví uživatelé nemohou nahrávat obrázky."
attachment_upload_not_allowed_for_new_user: "Bohužel, noví uživatelé nemohou nahrávat přílohy."
@@ -1442,9 +1554,13 @@ cs:
no_value: "Nezahazovat"
yes_value: "Ano, zahodit"
via_email: "tento příspěvek byl přijat přes email"
+ via_auto_generated_email: "tento příspěvek byl přijat přes automaticky generovaný email"
whisper: "tento příspěvek je soukromé šeptání pro moderátory"
+ wiki:
+ about: "toto je wiki příspěvek"
archetypes:
save: 'Uložit nastavení'
+ few_likes_left: "Díky za šíření lásky! Zbývá ti pro dnešek už jen několi \"líbí se\"."
controls:
reply: "otevře okno pro sepsání odpovědi na tento příspěvek"
like: "to se mi líbí"
@@ -1467,8 +1583,8 @@ cs:
admin: "post admin actions"
wiki: "Vytvořte Wiki"
unwiki: "Odtraňte Wiki"
- convert_to_moderator: "Přidejte Staff Color"
- revert_to_regular: "Odstraňte Staff Color"
+ convert_to_moderator: "Přidejte redakční barvu"
+ revert_to_regular: "Odstraňte redakční barvu"
rebake: "Obnovit HTML"
unhide: "Odkrýt"
change_owner: "Změna autora"
@@ -1478,14 +1594,6 @@ cs:
one: "Odložit nahlášení"
few: "Odložit nahlášení"
other: "Odložit nahlášení"
- it_too:
- off_topic: "Také nahlásit"
- spam: "Také nahlásit"
- inappropriate: "Také nahlásit"
- custom_flag: "Také nahlásit"
- bookmark: "Také přidat do záložek"
- like: "To se mi také líbí"
- vote: "Hlasovat také"
undo:
off_topic: "Zrušit nahlášení"
spam: "Zrušit nahlášení"
@@ -1493,6 +1601,15 @@ cs:
bookmark: "Odebrat ze záložek"
like: "Už se mi to nelíbí"
vote: "Zrušit hlas"
+ people:
+ off_topic: "označil příspěvek jako off-topic"
+ spam: "označil příspěvek jako spam"
+ inappropriate: "označil příspěvek jako nevhodný"
+ notify_moderators: "označil příspěvek pro moderátora"
+ notify_user: "odeslal zprávu"
+ bookmark: "záložka přidána"
+ like: "se líbí"
+ vote: "hlasoval pro tento příspěvek"
by_you:
off_topic: "Označili jste tento příspěvek jako off-topic"
spam: "Označili jste tento příspěvek jako spam"
@@ -1573,6 +1690,11 @@ cs:
one: "Opravdu chcete odstranit tento příspěvek?"
few: "Opravdu chcete odstranit všechny tyto příspěvky?"
other: "Opravdu chcete odstranit všechny tyto příspěvky?"
+ merge:
+ confirm:
+ one: "Určite chcete sloučit tyto příspěvky?"
+ few: "Určite chcete sloučit tyto {{count}} příspěvky?"
+ other: "Určite chcete sloučit těchto {{count}} příspěvků?"
revisions:
controls:
first: "První revize"
@@ -1581,6 +1703,7 @@ cs:
last: "Poslední revize"
hide: "Schovejte revizi"
show: "Zobrazte revizi"
+ revert: "Vrátit se k této revizi"
comparing_previous_to_current_out_of_total: "{{previous}} {{current}} / {{total}}"
displays:
inline:
@@ -1603,6 +1726,11 @@ cs:
general: 'Základní'
settings: 'Nastavení'
topic_template: "Šablona tématu"
+ tags: "Štítky"
+ tags_allowed_tags: "Štítky, které mohou být použity pouze v této kategorii:"
+ tags_allowed_tag_groups: "Skupiny štítků, které mohou být použity pouze v této kategorii:"
+ tags_placeholder: "(Volitelné) seznam dovolených štítků"
+ tag_groups_placeholder: "(Volitelné) seznam dovolených skupin štítků"
delete: 'Smazat kategorii'
create: 'Nová kategorie'
create_long: 'Vytvořit novou kategorii'
@@ -1628,6 +1756,7 @@ cs:
change_in_category_topic: "navštivte téma kategorie pro editaci jejího popisu"
already_used: 'Tato barva je již použita jinou kategorií'
security: "Zabezpečení"
+ special_warning: "Varování: Tato kategorie je přednastavená a její nastavení bezpečnosti nelze změnit. Pokud tuto kategorii nechcete používat, tak ji smažte a nesnažte se ji měnit."
images: "Obrázky"
auto_close_label: "Automaticky zavírat témata po:"
auto_close_units: "hodinách"
@@ -1636,6 +1765,7 @@ cs:
email_in_disabled: "Přidávání nových témat před email je zakázáno v Nastavení fóra. K povolení nových témat přes email,"
email_in_disabled_click: 'povolit nastavení "email in"'
suppress_from_homepage: "Potlač tuto kategorii na domovské stránce."
+ sort_order: "Výchozít řazení:"
allow_badges_label: "Povolit používání odznaků v této kategorii"
edit_permissions: "Upravit oprávnění"
add_permission: "Přidat oprávnění"
@@ -1648,27 +1778,46 @@ cs:
notifications:
watching:
title: "Hlídání"
+ description: "Budete automaticky sledovat všechna témata v těchto kategoriích. Budete upozorněni na každý nový příspěvek v každém tématu a zobrazí se počet nových odpovědí."
+ watching_first_post:
+ title: "Hlídání prvního příspěvku"
+ description: "Budete informováni o prvním novém příspěvku v každém novém tématu vytvořeném v těchto kategoriích."
tracking:
title: "Sledování"
+ description: "Budete automaticky sledovat všechna nová témata v těchto kategoriích. Budete upozorněni, pokud někdo zmíní vaše @jméno nebo vám odpoví, a zobrazí se počet nových odpovědí."
regular:
title: "Normální"
description: "Budete informováni pokud někdo zmíní vaše @jméno nebo odpoví na váš příspěvek."
muted:
title: "Ztišený"
description: "Nikdy nebudete dostávat upozornění na nová témata v těchto kategoriích a neobjeví se v aktuálních."
+ sort_options:
+ default: "výchozí"
+ likes: "Líbí se"
+ op_likes: "Původní \"Líbí se\" u příspěvků"
+ views: "Zobrazení"
+ posts: "Příspěvky"
+ activity: "Aktivita"
+ posters: "Přispěvatelé"
+ category: "Kategorie"
+ created: "Vytvořena"
+ sort_ascending: 'Vzestupně'
+ sort_descending: 'Sestupně'
flagging:
title: 'Děkujeme, že pomáháte udržovat komunitu zdvořilou!'
action: 'Nahlásit příspěvek'
take_action: "Zakročit"
notify_action: 'Zpráva'
+ official_warning: 'Oficiální varování'
delete_spammer: "Odstranit spamera"
- delete_confirm: "Chystáte se odstranit %{posts} příspěvků a %{topics} témat od tohoto uživatele, smazat jeho účet, a vložit jeho emailovou adresu %{email} na seznam permanentně blokovaných. Jste si jistí, že je tento uživatel opravdu spamer?"
+ delete_confirm_MF: "Chystáte se odstranit {POSTS, plural, one {1 příspěvek} other {# příspěvků}} a {TOPICS, plural, one {1 téma} other {# témat}} od tohoto uživatele, smazat jeho účet, zablokovat přihlášení z jejich IP adresy {ip_address}, a přidat jejich emailovou adresu {email} na seznam permanentně blokovaných. Jste si jistí, že je tento uživatel opravdu spamer?"
yes_delete_spammer: "Ano, odstranit spamera"
ip_address_missing: "(N/A)"
hidden_email_address: "(skrytý)"
submit_tooltip: "Podat soukromé nahlášení"
take_action_tooltip: "Ihned dosáhni vlaječky prahu, než aby jsi čekal na více komunitních vlaječek"
cant: "Bohužel nyní nemůžete tento příspěvek nahlásit."
+ notify_staff: 'Napište členům redakce soukromě'
formatted_name:
off_topic: "Je to mimo téma."
inappropriate: "Je to nevhodné"
@@ -1676,9 +1825,18 @@ cs:
custom_placeholder_notify_user: "Buďte věcný, konstruktivní a vždy zdvořilý."
custom_placeholder_notify_moderators: "Sdělte nám, co vás přesně trápí a kde to bude možné, tak nám poskytněte související odkazy a příklady."
custom_message:
- at_least: "zadejte alespoň {{n}} znaků"
- more: "ještě {{n}}..."
- left: "{{n}} zbývá"
+ at_least:
+ one: "zadejte alespoň 1 znak"
+ few: "zadejte alespoň {{count}} znaky"
+ other: "zadejte alespoň {{count}} znaků"
+ more:
+ one: "ještě 1..."
+ few: "ještě {{count}}..."
+ other: "ještě {{count}}..."
+ left:
+ one: "1 zbývá"
+ few: "{{count}} zbývají"
+ other: "{{count}} zbývá"
flagging_topic:
title: "Děkujeme, že pomáháte udržovat komunitu zdvořilou!"
action: "Nahlásit téma"
@@ -1687,10 +1845,17 @@ cs:
title: "Souhrn tématu"
participants_title: "Častí přispěvatelé"
links_title: "Populární odkazy"
+ links_shown: "zobrazit více odkazů..."
clicks:
one: "1 kliknutí"
few: "%{count} kliknutí"
other: "%{count} kliknutí"
+ post_links:
+ about: "expandovat více odkazů v tomto příspěvku"
+ title:
+ one: "1 více"
+ few: "%{count} více"
+ other: "%{count} více"
topic_statuses:
warning:
help: "Toto je oficiální varování."
@@ -1714,7 +1879,6 @@ cs:
invisible:
help: "Toto téma je neviditelné; nebude se zobrazovat v seznamu témat a lze ho navštívit pouze přes přímý odkaz"
posts: "Příspěvků"
- posts_lowercase: "příspěvky"
posts_long: "v tomto tématu je {{number}} příspěvků"
posts_likes_MF: |
Toto téma má {count, plural, one {1 příspěvek} other {# příspěvků}} {ratio, select,
@@ -1835,6 +1999,170 @@ cs:
full: "Vytvářet / Odpovídat / Prohlížet"
create_post: "Odpovídat / Prohlížet"
readonly: "Prohlížet"
+ lightbox:
+ download: "stáhnout"
+ keyboard_shortcuts_help:
+ title: 'Klávesové zkratky'
+ jump_to:
+ title: 'Jump To'
+ home: 'g, h Domů'
+ latest: 'g, l Poslední'
+ new: 'g, n Nový'
+ unread: 'g, u Nepřečtěné'
+ categories: 'g, c Kategorie'
+ top: 'g, t Nahoru'
+ bookmarks: 'g, b Záložky'
+ profile: 'g, p Profil'
+ messages: 'g, m Zprávy'
+ navigation:
+ title: 'Navigace'
+ jump: '# Přejdi na příspěvek #'
+ back: 'u Zpět'
+ up_down: 'k/j Posunout označení ↑ ↓'
+ open: 'o nebo Enter Otevři vybrané téma'
+ next_prev: 'shift+j/shift+k Následující/předchozí výběr'
+ application:
+ title: 'Aplikace'
+ create: 'c Vytvořit nové téma'
+ notifications: 'n Otevře upozornění'
+ hamburger_menu: '= Otevře hamburgerové menu'
+ user_profile_menu: 'p Otevře uživatelské menu'
+ show_incoming_updated_topics: '. Ukáže aktualizovaná témata'
+ search: '/ Hledání'
+ help: '? Otevře seznam klávesových zkratek'
+ log_out: 'shift+z shift+z Odhlásit se'
+ actions:
+ title: 'Akce'
+ bookmark_topic: 'Přidat záložku na téma'
+ pin_unpin_topic: 'shift+p Připnout/Odepnout téma'
+ share_topic: 'shift+s Sdílet téma'
+ share_post: 's Sdílet příspěvek'
+ reply_as_new_topic: 't Odpovědět v propojeném tématu'
+ reply_topic: 'shift+r Odpovědět na téma'
+ reply_post: 'r Odpovědět na příspěvek'
+ quote_post: 'q Citovat příspěvek'
+ like: 'l Dát "líbí se" k příspěvku'
+ flag: '! Nahlásit příspěvek'
+ bookmark: 'b Přidat záložku na příspěvek'
+ edit: 'e Upravit příspěvek'
+ delete: 'd Smazat příspěvek'
+ mark_muted: 'm, m Ztišit téma'
+ mark_tracking: 'm, t Sledovat téma'
+ mark_watching: 'm, w Hlídat téma'
+ print: 'ctrl+p Vytiskni téma'
+ badges:
+ granted_on: "Získán %{date}"
+ others_count: "Ostatní s tímto odznakem (%{count})"
+ title: Odznaky
+ allow_title: "dostupný nadpis"
+ badge_count:
+ one: "1 odznak"
+ few: "%{count} odznaky"
+ other: "%{count} odznaků"
+ more_badges:
+ one: "+1 další"
+ few: "+%{count} další"
+ other: "+%{count} dalších"
+ granted:
+ one: "1 přidělen"
+ few: "%{count} přidělen"
+ other: "%{count} přidělen"
+ select_badge_for_title: Vyberte odznak, který chcete použít jako svůj titul
+ none: "
+ Hledej pomocí Google
+
+ tagging:
+ all_tags: "Všechny štítky"
+ selector_all_tags: "všechny štítky"
+ selector_no_tags: "bez štítků"
+ changed: "změněné štítky:"
+ tags: "Štítky"
+ choose_for_topic: "zvolte volitelné štítky pro toto téma"
+ delete_tag: "Smaž štítek"
+ delete_confirm: "Opravdu chcete smazat tento štítek?"
+ rename_tag: "Přejmenovat štítek"
+ rename_instructions: "Vyber název nového štítku:"
+ sort_by: "Seřadit dle:"
+ sort_by_count: "počtu"
+ sort_by_name: "jména"
+ manage_groups: "Spravovat skupiny štítků"
+ manage_groups_description: "Definice skupin pro organizaci štítků"
+ filters:
+ without_category: "%{filter} %{tag} témata"
+ with_category: "%{filter} %{tag} témata v %{category}"
+ untagged_without_category: "%{filter} témata bez štítků"
+ untagged_with_category: "%{filter} témata bez štítků v %{category}"
+ notifications:
+ watching:
+ title: "Hlídání"
+ description: "Budete automaticky hlídat všechna nová témata s těmito štítky. Na všechny nové příspěvky a témata budete upozorněni. Počet nových příspěvků se zobrazí vedle tématu."
+ watching_first_post:
+ title: "Hlídané první příspěvky"
+ description: "Budete informováni pouze o prvním příspěvku v každém novém tématu s tímto štítkem."
+ tracking:
+ title: "Sledování"
+ description: "Všechna nová témata pro tento štítek budou automaticky sledovaná. Počet nepřečtených a nových příspěvků se zobrazí vedle tématu."
+ regular:
+ description: "Budete informováni pokud někdo zmíní vaše @jméno nebo odpoví na váš příspěvek."
+ muted:
+ title: "Ztišené"
+ description: "Nebudete upozorněni na žádná nová témata pro tento štítek a ani se nebudou zobrazovat jako nepřečtené."
+ groups:
+ title: "Skupiny štítků"
+ about: "Přidej štítky do skupin pro přehlednost"
+ new: "Nová skupina"
+ tags_label: "Štítky v této skupině:"
+ parent_tag_label: "Nadřazený štítek:"
+ parent_tag_placeholder: "Volitelné"
+ parent_tag_description: "Štítky z této skupiny nemohou být použity pokud není přítomen nadřazený štítek."
+ new_name: "Nová skupina štítků"
+ save: "Uložit"
+ delete: "Smazat"
+ confirm_delete: "Jste si jistí, že chcete smazat tuto skupinu štítků?"
+ topics:
+ none:
+ unread: "Nemáte žádná nepřečtená témata."
+ new: "Nemáte žádná nová témata ke čtení."
+ read: "Zatím jste nečetli žádná témata."
+ posted: "Zatím jste nepřispěli do žádného tématu."
+ latest: "Nejsou tu žádná další témata z poslední doby k přečtení."
+ hot: "Nejsou tu žádná populární témata."
+ bookmarks: "V tématech nemáte žádné záložky."
+ top: "Nejsou tu žádná populární témata."
+ search: "Vyhledávání nic nenašlo."
+ bottom:
+ latest: "Nejsou tu žádná další témata z poslední doby k přečtení."
+ hot: "Nejsou tu žádná další populární témata k přečtení."
+ posted: "Nejsou tu žádná další zaslaná témata k přečtení."
+ read: "Nejsou tu žádná další přečtená témata."
+ new: "Nejsou tu žádná další nová témata k přečtení."
+ unread: "Nejsou tu žádná další nepřečtená témata."
+ top: "Nejsou tu žádná další populární témata."
+ bookmarks: "Žádná další oblíbená témata nejsou k dispozici."
+ search: "Vyhledávání nic nenašlo."
+ invite:
+ custom_message: "Aby byla pozvánka osobnější, napište"
+ custom_message_link: "vlastní zprávu"
+ custom_message_placeholder: "Vložte vlastní zprávu"
+ custom_message_template_forum: "Ahoj! Měl by se připojit na toto fórum!"
admin_js:
type_to_filter: "text pro filtrování..."
admin:
@@ -1882,9 +2210,11 @@ cs:
30_days_ago: "Měsíc"
all: "Celkem"
view_table: "tabulka"
+ view_graph: "graf"
refresh_report: "Obnovit hlášení"
start_date: "Datum začátku"
end_date: "Datum konce"
+ groups: "Všechny skupiny"
commits:
latest_changes: "Poslední změny:"
by: "od"
@@ -1963,15 +2293,12 @@ cs:
refresh: "Obnovit"
new: "Nová"
selector_placeholder: "zadejte uživatelské jméno"
- name_placeholder: "Název skupiny, bez mezer, stejná pravidla jako pro uživatelská jména"
about: "Zde můžete upravit názvy skupin a členství"
group_members: "Členové skupiny"
delete: "Smazat"
delete_confirm: "Smazat toto skupiny?"
delete_failed: "Unable to delete group. If this is an automatic group, it cannot be destroyed."
- delete_member_confirm: "Odstranit '%{username}' ze '%{group}' skupiny?"
delete_owner_confirm: "Odstranit vlastnickou výsadu od '%{username}'?"
- name: "Jméno"
add: "Přidat"
add_members: "Přidat členy"
custom: "Přizpůsobené"
@@ -2002,6 +2329,35 @@ cs:
info_html: "Váš API klíč umožní vytvářet a aktualizovat témata pomocí JSONových volání."
all_users: "Všichni uživatelé"
note_html: "Uchovejte tento klíč v bezpečí, každý, kdo má tento klíč, může libovolně vytvářet příspěvky na fóru i za ostatní uživatele."
+ web_hooks:
+ title: "Webhooks"
+ new: "Nový Webhook"
+ create: "Vytvoř"
+ save: "Uložit"
+ destroy: "Smazat"
+ description: "Popis"
+ go_back: "Zpět na seznam"
+ payload_url_placeholder: "https://example.com/postreceive"
+ active: "Aktivní"
+ delivery_status:
+ inactive: "Neaktivní"
+ events:
+ incoming:
+ one: "1 nová událost"
+ few: "{{count}} nové události"
+ other: "{{count}} nových událostí"
+ completed_in:
+ one: "Dokončen za 1 sekundu."
+ few: "Dokončen za {{count}} sekundy."
+ other: "Dokončen za {{count}} sekund."
+ request: "Požadavek"
+ response: "Odezva"
+ headers: "Hlavičky"
+ body: "Tělo"
+ go_details: "Editovat webhook"
+ ping: "Ping"
+ event_id: "ID"
+ actions: "Akce"
plugins:
title: "Pluginy"
installed: "Nainstalované pluginy"
@@ -2020,6 +2376,14 @@ cs:
backups: "Zálohy"
logs: "Logy"
none: "Žádné zálohy nejsou k dispozici."
+ read_only:
+ enable:
+ title: "Zapnout režim jen pro čtení"
+ label: "Zapnout jen pro čtení"
+ confirm: "Opravdu chcete zapnout režim jen pro čtení?"
+ disable:
+ title: "Vypnout režim jen pro čtení"
+ label: "Vypnout jen pro čtení"
logs:
none: "Zatím je log prázdný..."
columns:
@@ -2053,14 +2417,13 @@ cs:
is_disabled: "Restore is disabled in the site settings."
label: "Obnovit"
title: "Restore the backup"
+ confirm: "Opravdu chcete obnovit tuto zálohu?"
rollback:
label: "Rollback"
title: "Rollback the database to previous working state"
export_csv:
- user_archive_confirm: "Jste si jistí, že chcete stáhnout všechny své příspěvky?"
success: "Export byl spuštěn. O dokončení celého procesu budete informování pomocí zprávy."
failed: "Exportování selhalo. Prosím zkontrolujte logy."
- rate_limit_error: "Příspěvky mohou být staženy jednou za den. Prosíme, zkuste to znovu zítra."
button_text: "Export"
button_title:
user: "Exportovat kompletní seznam uživatelů v CSV formátu."
@@ -2158,13 +2521,17 @@ cs:
name: 'láska'
description: "Barva tlačítka Like."
email:
+ title: "Emaily"
settings: "Nastavení"
+ templates: "Šablony"
preview_digest: "Náhled souhrnu"
sending_test: "Zkušební email se odesílá..."
error: "CHYBA - %{server_error}"
test_error: "Nastal problém při odesílání testovacího emailu. Zkontroluj si, prosím, své mailové nastavení, ověř, že hosting neblokuje mailové spojení a zkus to znova."
sent: "Odeslané"
skipped: "Přeskočené"
+ received: "Obdržených"
+ rejected: "Odmítnutých"
sent_at: "Odesláno"
time: "Čas"
user: "Uživatel"
@@ -2228,10 +2595,10 @@ cs:
block: "blokovat"
do_nothing: "nedělat nic"
staff_actions:
- title: "Akce moderátorů"
+ title: "Akce redaktorů"
instructions: "Pro filtrování seznamu klikejte na uživatele a akce. Kliknutí na avatar otevře profil uživatele."
clear_filters: "Zobrazit vše"
- staff_user: "Moderátor"
+ staff_user: "Člen redakce"
target_user: "Cílový uživatel"
subject: "Předmět"
when: "Kdy"
@@ -2251,6 +2618,7 @@ cs:
change_site_setting: "změna nastavení"
change_site_customization: "změna přizpůsobení"
delete_site_customization: "odstranit přizpůsobení"
+ change_site_text: "změnit text webu"
suspend_user: "suspendovat uživatele"
unsuspend_user: "zrušit suspendování"
grant_badge: "udělit odznak"
@@ -2263,6 +2631,16 @@ cs:
change_category_settings: "změnit nastavení kategorie"
delete_category: "smazat kategorii"
create_category: "vytvořit kategorii"
+ block_user: "zablokuj uživatele"
+ unblock_user: "odblokuj uživatele"
+ grant_admin: "udělit administrátorská práva"
+ revoke_admin: "odebrat administrátorská práva"
+ grant_moderation: "udělit moderátorská práva"
+ revoke_moderation: "odebrat moderátorská práva"
+ backup_operation: "zálohování"
+ deleted_tag: "smazaný štítek"
+ renamed_tag: "přejmenovaný štítek"
+ revoke_email: "Odebrat email"
screened_emails:
title: "Filtrované emaily"
description: "Při registraci nového účtu budou konzultovány následujíci adresy. Při shodě bude registrace zablokována, nebo bude provedena jiná akce."
@@ -2305,7 +2683,7 @@ cs:
new: "Noví"
active: "Aktivní"
pending: "Čeká na schválení"
- staff: 'Štáb'
+ staff: 'Redakce'
suspended: 'Zakázaní'
blocked: 'Blokovaní'
suspect: 'Podezřelí'
@@ -2327,8 +2705,8 @@ cs:
member: 'Uživatelé s věrohodností 2 (Člen)'
regular: 'Uživatelé s věrohodností 3 (Pravidelný uživatel)'
leader: 'Uživatelé s věrohodností 4 (Vedoucí)'
- staff: "Štáb"
- admins: 'Admininstrátoři'
+ staff: "Redakce"
+ admins: 'Administrátoři'
moderators: 'Moderátoři'
blocked: 'Blokovaní uživatelé'
suspended: 'Zakázaní uživatelé'
@@ -2354,7 +2732,7 @@ cs:
suspend_reason: "Reason"
suspended_by: "Suspended by"
delete_all_posts: "Smazat všechny příspěvky"
- delete_all_posts_confirm: "You are about to delete %{posts} posts and %{topics} topics. Are you sure?"
+ delete_all_posts_confirm_MF: "Chystáte se smazat {POSTS, plural, one {1 příspěvek} other {# příspěvků}} and {TOPICS, plural, one {1 téma} other {# témat}}. Jste si jistí?"
suspend: "Zakázat"
unsuspend: "Povolit"
suspended: "Zakázán?"
@@ -2428,6 +2806,12 @@ cs:
deactivate_failed: "Nastal problém při deaktivování tohoto uživatele."
unblock_failed: 'Nastal problém při odblokování uživatele.'
block_failed: 'Nastal problém při blokování uživatele.'
+ block_confirm: 'Jste si jistí, že chcete zablokovat tohoto uživatele? Nebudou poté oprávněni vytvářet žádné témata ani příspěvky.'
+ block_accept: 'Ano, zablokuj tohoto uživatele:'
+ bounce_score: "Bounce skóre"
+ reset_bounce_score:
+ label: "obnovit výchozí"
+ title: "Resetovat bounce skóre zpět na 0"
deactivate_explanation: "Uživatel bude muset znovu potvrdit emailovou adresu."
suspended_explanation: "Zakázaný uživatel se nemůže přihlásit."
block_explanation: "Zablokovaný uživatel nemůže přispívat nebo vytvářet nová témata."
@@ -2441,6 +2825,10 @@ cs:
unlock_trust_level: "Odemknout úroveň důvěryhodnosti"
tl3_requirements:
title: "Požadavky pro důvěryhodnost 3"
+ table_title:
+ one: "V posledním dnu:"
+ few: "Za posledních %{count} dny:"
+ other: "Za posledních %{count} dní:"
value_heading: "Hodnota"
requirement_heading: "Požadavek"
visits: "Návštěv"
@@ -2539,12 +2927,14 @@ cs:
developer: 'Vývojáři'
embedding: "Embedding"
legal: "Právní záležitosti"
+ user_api: 'Uživatelské API'
uncategorized: 'Ostatní'
backups: "Zálohy"
login: "Login"
plugins: "Pluginy"
user_preferences: "Uživatelká nastavení"
tags: "Tagy"
+ search: "Vyhledávání"
badges:
title: Odznaky
new_badge: Nový odznak
@@ -2631,6 +3021,7 @@ cs:
embed_by_username: "Uživatelské jméno pro vytvářéní témat"
embed_post_limit: "Maximální počet příspěvků k zabudování"
embed_truncate: "Useknout zabudované příspěvky"
+ embed_classname_whitelist: "Povolená jména CSS tříd"
feed_polling_enabled: "Importovat příspěvky pomocí RSS/ATOM"
save: "Uložit nastavení zabudování"
permalink:
@@ -2648,3 +3039,23 @@ cs:
label: "Nové:"
add: "Přidat"
filter: "Hledat (URL nebo externí URL)"
+ wizard_js:
+ wizard:
+ done: "Hotovo"
+ back: "Zpět"
+ next: "Další"
+ step: "%{current} z %{total}"
+ upload: "Nahrát"
+ uploading: "Nahrává se..."
+ quit: "Možná později"
+ staff_count:
+ one: "Vaše komunita má 1 redakčního člena."
+ few: "Vaše komunita má %{count} redakční členy."
+ other: "Vaše komunita má %{count} členů v redakci."
+ invites:
+ add_user: "přidat"
+ none_added: "Nepozvali jste nikoho z redakce. Určitě chcete pokračovat?"
+ roles:
+ admin: "Administrátor"
+ moderator: "Moderátor"
+ regular: "pravidelný uživatel"
diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml
index 7f61c3b5929..3ab1cb7ed32 100644
--- a/config/locales/client.da.yml
+++ b/config/locales/client.da.yml
@@ -27,6 +27,7 @@ da:
millions: "{{number}}M"
dates:
time: "h:mm a"
+ timeline_date: "MMM YYYY"
long_no_year: "MMM D h:mm a"
long_no_year_no_time: "MMM D"
full_no_year_no_time: "MMMM Do"
@@ -38,6 +39,7 @@ da:
long_date_with_year_without_time: "MMM D, 'YY"
long_date_without_year_with_linebreak: "MMM D
LT"
long_date_with_year_with_linebreak: "MMM D, 'YY
LT"
+ wrap_ago: "%{date} siden"
tiny:
half_a_minute: "< 1m"
less_than_x_seconds:
@@ -46,9 +48,6 @@ da:
x_seconds:
one: "1s"
other: "%{count}s"
- less_than_x_minutes:
- one: "< 1m"
- other: "< %{count}m"
x_minutes:
one: "1m"
other: "%{count}m"
@@ -112,9 +111,12 @@ da:
email: 'send dette link i en e-mail'
action_codes:
public_topic: "offentliggjorde dette emne %{when}"
+ private_topic: "gjorde dette emne privat %{when}"
split_topic: "delte dette emne op %{when}"
invited_user: "Inviterede %{who} %{when}"
+ invited_group: "inviterede %{who} %{when}"
removed_user: "fjernede %{who} %{when}"
+ removed_group: "fjernede %{who} %{when}"
autoclosed:
enabled: 'lukket %{when}'
disabled: 'åbnet %{when}'
@@ -135,6 +137,23 @@ da:
disabled: 'aflistet %{when}'
topic_admin_menu: "administrationshandlinger på emne"
emails_are_disabled: "Alle udgående emails er blevet deaktiveret globalt af en administrator. Ingen emailnotifikationer af nogen slags vil blive sendt."
+ bootstrap_mode_enabled: "For at gøre det nemmere at lancere dit nye website, er du i bootstrap tilstand. Alle nye brugere vil blive tildelt niveau 1 og daglige email updateringer vil være slået til. Dette vil blive automatisk slået fra når total antal brugere overskrider %{min_users} brugere."
+ bootstrap_mode_disabled: "Bootstrap tilstand vil blive deaktiveret indenfor de næste 24 timer."
+ s3:
+ regions:
+ us_east_1: "US East (N. Virginia)"
+ us_west_1: "US West (N. California)"
+ us_west_2: "US West (Oregon)"
+ us_gov_west_1: "AWS GovCloud (US)"
+ eu_west_1: "EU (Irland)"
+ eu_central_1: "EU (Frankfurt)"
+ ap_southeast_1: "Asien (Singapore)"
+ ap_southeast_2: "Asien (Sydney)"
+ ap_south_1: "Asien (Mumbai)"
+ ap_northeast_1: "Asien (Tokyo)"
+ ap_northeast_2: "Asien (Seoul)"
+ sa_east_1: "Sydamerika (Sao Paulo)"
+ cn_north_1: "Kina (Beijing)"
edit: 'redigér titel og kategori for dette emne'
not_implemented: "Beklager, denne feature er ikke blevet implementeret endnu."
no_value: "Nej"
@@ -200,7 +219,7 @@ da:
contact_info: "I tilfælde af kritiske situationer eller vigtige spørgsmål angående denne side, kontakt os venligst på %{contact_info}."
bookmarked:
title: "Bogmærke"
- clear_bookmarks: "Ryd Bogmærker"
+ clear_bookmarks: "Fjern bogmærker"
help:
bookmark: "Klik for at sætte et bogmærke i det første indlæg i denne tråd"
unbookmark: "Klik for at fjerne alle bogmærker i dette emne"
@@ -235,6 +254,8 @@ da:
undo: "Fortryd"
revert: "Gendan"
failed: "Fejlet"
+ switch_to_anon: "Gå i anonym tilstand"
+ switch_from_anon: "Afslut anonym tilstand"
banner:
close: "Afvis denne banner."
edit: "Rediger dette banner >>"
@@ -300,12 +321,6 @@ da:
one: "1 bruger"
other: "%{count} brugere"
groups:
- empty:
- posts: "Der er ingen indlæg af medlemmer af denne gruppe."
- members: "Der er ingen medlemmer i denne gruppe."
- mentions: "Denne gruppe er ikke nævnt."
- messages: "Der er ingen besked til denne gruppe."
- topics: "Der er intet emne af medlemmer af denne gruppe."
add: "Tilføj"
selector_placeholder: "Tilføj medlemmer"
owner: "ejer"
@@ -332,6 +347,9 @@ da:
watching:
title: "Kigger"
description: "Du får beskeder om hvert nyt indlæg i hver besked og antallet af nye svar bliver vist."
+ watching_first_post:
+ title: "Ser på første indlæg"
+ description: "Du får kun besked om første indlæg i hvert nyt emne i denne gruppe."
tracking:
title: "Følger"
description: "Du får besked hvis nogen nævner dit @navn eller svarer dig og antallet af nye svar bliver vist."
@@ -374,14 +392,12 @@ da:
latest_by: "seneste af"
toggle_ordering: "vis/skjul rækkefølgeskifter"
subcategories: "Underkategorier:"
- topic_stats: "Antallet af nye emner."
+ topic_sentence:
+ one: "1 emne"
+ other: "%{count} emner"
topic_stat_sentence:
one: "%{count} nyt emne i den/det seneste %{unit}."
other: "%{count} nye emner i den/det seneste %{unit}."
- post_stats: "Antallet af nye indlæg."
- post_stat_sentence:
- one: "%{count} nyt indlæg i den seneste %{unit}."
- other: "%{count} nye indlæg i den seneste %{unit}."
ip_lookup:
title: IP-adresse opslag
hostname: Værtsnavn
@@ -404,7 +420,6 @@ da:
profile: "Profil"
mute: "Mute"
edit: "Redigér indstillinger"
- download_archive: "Download Mine Posts"
new_private_message: "Ny Besked"
private_message: "Besked"
private_messages: "Beskeder"
@@ -426,6 +441,7 @@ da:
disable: "Deaktiver notifikationer"
enable: "Aktiver notifikationer"
each_browser_note: "Bemærk: Du skal ændre indstillingen i alle dine browsere."
+ dismiss_notifications: "Afvis alle"
dismiss_notifications_tooltip: "Marker alle ulæste notifikationer som læst"
disable_jump_reply: "Ikke hop til mit indlæg efter jeg svarer"
dynamic_favicon: "Vis nyt / opdateret emnetal på browserikon"
@@ -440,8 +456,32 @@ da:
suspended_notice: "Denne bruger er suspenderet indtil {{date}}."
suspended_reason: "Begrundelse: "
github_profile: "Github"
+ email_activity_summary: "Resumé over aktivitet"
+ mailing_list_mode:
+ label: "Mailing list tilstand"
+ enabled: "Aktiverer mailing list tilstand"
+ instructions: |
+ Denne indstillilng har indflydelse på opsummeringen af aktiviteter.
+ Fravalgte / 'muted' emner og kategorier fer ikke inkluderet i disse mails.
+ daily: "Send daglige opdateringer"
+ individual: "Send en email for hvert nyt indlæg"
+ many_per_day: "Send mig en email for hvert nyt indlæg (omkring {{dailyEmailEstimate}} per dag)"
+ few_per_day: "Send mig en email or hvert nyt indlæg (cirka 2 om dagen)"
+ tag_settings: "Tags"
+ watched_tags: "Følger"
+ watched_tags_instructions: "Du vil automatisk følge alle emner med disse tags. Du bliver informeret om alle nye indlæg og emner og antallet af nye indlæg bliver vises ved emnet."
+ tracked_tags: "Sporet"
+ tracked_tags_instructions: "Du tracker automatisk alle emner med disse tags. Antallet af nye indlæg bliver vises ved hvert emne."
+ muted_tags: "Lydløs / 'muted'"
+ muted_tags_instructions: "Du vil ikke få besked om nye emner med disse tags, og de vil ikke fremgå af 'seneste'."
watched_categories: "Overvåget"
+ watched_categories_instructions: "Du overvåger automatisk alle emner i disse kategorier. Du får besked om alle nye indlæg og emner, og antallet af nye indlæg vises ved hvert emne."
tracked_categories: "Fulgt"
+ tracked_categories_instructions: "Du tracker automatisk alle emner i disse kategorier. Antallet af nye indlæg vises ved hvert emne."
+ watched_first_post_categories: "Ser første indlæg"
+ watched_first_post_categories_instructions: "Du vil blive adviseret om alle første indlæg, i emner, under disse kategorier"
+ watched_first_post_tags: "Ser Første Indlæg"
+ watched_first_post_tags_instructions: "Du får besked om første indlæg i hvert nyt emne med disse tags."
muted_categories: "Ignoreret"
muted_categories_instructions: "Du får ikke beskeder om nye emner i disse kategorier og de fremstår ikke i seneste."
delete_account: "Slet min konto"
@@ -454,6 +494,12 @@ da:
muted_users: "Ignoreret"
muted_users_instructions: "Undertryk alle notifikationer fra disse brugere."
muted_topics_link: "Vis mute emner"
+ watched_topics_link: "Vis sete emner"
+ automatically_unpin_topics: "Automatisk stop med at følge emner, når jeg når til bunden."
+ apps: "Apps"
+ revoke_access: "Tilbagekald adgang"
+ undo_revoke_access: "Revider tilbagekald adgang"
+ api_approved: "Godkendt:"
staff_counters:
flags_given: "hjælpsomme markeringer"
flagged_posts: "markerede indlæg"
@@ -479,8 +525,10 @@ da:
set_password: "Skriv password"
change_about:
title: "Skift “Om mig”"
+ error: "Der opstod en fejl i ændringen af denne værdi."
change_username:
title: "Skift brugernavn"
+ confirm: "Hvis du ændrer dit brugernavn, vil alle tidligere citeringer af dine indlæg ikke længere kunne vises. Er du helt sikker på at du ønsker at ændre brugernavn?"
taken: "Beklager, det brugernavn er optaget."
error: "Der skete en fejl i forbindelse med skift af dit brugernavn."
invalid: "Det brugernavn er ugyldigt. Det må kun bestå af bogstaver og tal."
@@ -564,12 +612,14 @@ da:
always: "altid"
never: "aldrig"
email_digests:
+ title: "Når jeg ikke kommer forbi her, send mig da en email opsummering af populære emner og indlæg"
every_30_minutes: "hvert 30. minut"
every_hour: "hver time"
daily: "dagligt"
every_three_days: "hver tredje dag"
weekly: "ugenligt"
every_two_weeks: "hver anden uge"
+ include_tl0_in_digests: "Inkluder indhold fra nye brugere i opsummerende mails"
email_in_reply_to: "Inkluder et uddrag af svaret indlæg i emails"
email_direct: "Send mig en email når nogen citerer mig, svarer på mit indlæg, nævner mit @brugernavn eller inviterer mig til et emne"
email_private_messages: "Send mig en email når nogen sender mig en besked"
@@ -617,19 +667,17 @@ da:
rescind: "Fjern"
rescinded: "Invitation fjernet"
reinvite: "Gensend invitation"
+ reinvite_all: "Gensend alle invitationer"
reinvited: "Invitation gensendt"
+ reinvited_all: "Alle invitationerne er gensendt!"
time_read: "Læsetid"
days_visited: "Besøgsdage"
account_age_days: "Kontoens alder i dage"
create: "Send en invitation"
generate_link: "Kopier invitations-link"
- generated_link_message: '
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" - uploading: "Uploader..." success: "Fil uploaded successfuldt, du vil blive meddelt via en beskede når processen er fuldendt." - error: "Der var en fejl ved upload af filen '{{filename}}': {{message}}" password: title: "Adgangskode" too_short: "Din adgangskode er for kort." @@ -639,14 +687,45 @@ da: ok: "Din adgangskode ser fin ud." instructions: "Mindst %{count} tegn" summary: - title: "Resume" + title: "Statistik" stats: "Statistik" + time_read: "læsetid" + topic_count: + one: "emne oprettet" + other: "emner oprettet" + post_count: + one: "Indlæg oprettet" + other: "Indlæg oprettet" + likes_given: + one: " givet" + other: " givet" + likes_received: + one: " modtaget" + other: " modtaget" + days_visited: + one: "dag besøgt" + other: "dage besøgt" + posts_read: + one: "Indlæg læst" + other: "Indlæg læst" + bookmark_count: + one: "bogmærke" + other: "bogmærker" top_replies: "Top svar" + no_replies: "Ingen svar, endnu." more_replies: "Flere svar" top_topics: "Top emner" + no_topics: "Ingen emner endnu." more_topics: "Flere emner" top_badges: "Top badges" + no_badges: "Ingen 'badges' endnu." more_badges: "Flere badges" + top_links: "Top Links" + no_links: "Ingen links, endnu" + most_liked_by: "Mest Populære" + most_liked_users: "Most Liked" + most_replied_to_users: "Flest har responderet" + no_likes: "Ingen likes, endnu." associated_accounts: "Logins" ip_address: title: "Sidste IP-adresse" @@ -733,6 +812,7 @@ da: title: "Besked" invite: "Invitér andre…" remove_allowed_user: "Ønsker du virkelig at fjerne {{name}} fra denne samtale?" + remove_allowed_group: "Er du sikker på du vil fjerne {{name}} fra denne besked?" email: 'E-mail' username: 'Brugernavn' last_seen: 'Sidst set' @@ -799,6 +879,15 @@ da: github: title: "med GitHub" message: "Logger ind med GitHub (kontrollér at pop-op-blokering ikke er aktiv)" + emoji_set: + apple_international: "Apple/International" + google: "Google" + twitter: "Twitter" + emoji_one: "Emoji One" + win10: "Win10" + category_page_style: + categories_only: "Kun Kategorier" + categories_and_latest_topics: "Kategorier og Seneste Emner" shortcut_modifier_key: shift: 'Skift' ctrl: 'Ctrl' @@ -808,8 +897,10 @@ da: more_emoji: "mere..." options: "Indstillinger" whisper: "hvisken" + unlist: "Ikke listede" add_warning: "Dette er en officiel advarsel." toggle_whisper: "Slå hvisken til/fra" + toggle_unlisted: "Slå listning til/fra" posting_not_on_topic: "Hvilket emne vil du svare på?" saving_draft_tip: "gemmer..." saved_draft_tip: "gemt" @@ -845,23 +936,28 @@ da: show_preview: 'forhåndsvisning »' hide_preview: '« skjul forhåndsvisning' quote_post_title: "Citér hele indlægget" + bold_label: "B" bold_title: "Fed" bold_text: "fed skrift" + italic_label: "I" italic_title: "Kursiv" italic_text: "kursiv skrift" link_title: "Link" link_description: "skriv linkets beskrivelse her" link_dialog_title: "Indsæt link" link_optional_text: "evt. titel" + link_url_placeholder: "http://example.com" quote_title: "Citatblok" quote_text: "Citatblok" code_title: "Præformateret tekst" code_text: "indryk præformateret tekst med 4 mellemrum" + paste_code_text: "skriv eller indsæt kode her" upload_title: "Billede" upload_description: "skriv billedets beskrivelse her" olist_title: "Nummereret liste" ulist_title: "Punktopstilling" list_item: "Listepunkt" + heading_label: "T" heading_title: "Overskrift" heading_text: "Overskrift" hr_title: "Vandret streg" @@ -870,6 +966,9 @@ da: modal_ok: "OK" modal_cancel: "Annuller" cant_send_pm: "Beklager, du kan ikke sende en besked til %{username}." + yourself_confirm: + title: "Glemte du at tilføje modtagere?" + body: "Lige nu bliver denne besked kun sendt til dig selv!" admin_options_title: "Valgfrie staff-indstillinger for dette emne" auto_close: label: "Tidspunkt for automatisk lukning af emne:" @@ -883,6 +982,7 @@ da: notifications: 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." + empty: "Ingen notifikationer fundet." more: "se ældre notifikationer" total_flagged: "total markerede indlæg" mentioned: "
{{username}} {{description}}
" @@ -898,7 +998,9 @@ da: invited_to_topic: "
{{username}} {{description}}
" invitee_accepted: "
{{username}} accepted your invitation
" moved_post: "
{{username}} moved {{description}}
" + linked: "
{{username}} {{description}}
" granted_badge: "
Du blev tildelt '{{description}}'
" + watching_first_post: "
Nyt Emne {{description}}
" group_message_summary: one: "
{{count}} besked i din {{group_name}} inbox
" other: "
{{count}} beskeder i din {{group_name}} inbox
" @@ -947,17 +1049,18 @@ da: most_liked: "Mest likede" select_all: "Vælg alle" clear_all: "Ryd alle" + too_short: "Dit søgekriterie er for kort." result_count: one: "1 resultat for \"{{term}}\"" - other: "{{count}} reultater for \"{{term}}\"" + other: "{{count}} resultater for \"{{term}}\"" title: "søg efter emner, indlæg, brugere eller kategorier" no_results: "Ingen resultater fundet." no_more_results: "Ikke flere resultater." - search_help: Hjælp til søgning searching: "Søger…" post_format: "#{{post_number}} af {{username}}" context: user: "Søg i indlæg fra @{{username}}" + category: "Søg i #{{category}} kategorien" topic: "Søg i dette emne" private_messages: "Søg i beskeder" hamburger_menu: "gå til en anden emneliste eller kategori" @@ -986,6 +1089,9 @@ da: selected: one: "Du har valgt 1 indlæg." other: "Du har valgt {{count}} indlæg." + change_tags: "Skift Tags" + choose_new_tags: "Vælg nye tags for dette emne" + changed_tags: "Tags for dette emne blev ændret" none: unread: "Du har ingen ulæste emner." new: "Du har ingen nye emner." @@ -997,6 +1103,9 @@ da: category: "Der er ingen emner i kategorien {{category}}." top: "Der er ingen top emner" search: "Der er ingen søgeresultater." + educate: + new: '
Dine nye emner vises her.
Som standard, betragtes emner som ulæste og vil vise en ny indikator hvis de var oprettet indenfor de sidste 2 dage
Du kan ændre dette i dine indstillinger
' + unread: '
Dine nye emner vises her.
Som standard, betragtes emner som ulæste og vil vise en 1 hvis du:
Eller hvis du udtrykkeligt sat emnet til Sporet eller Følger via notifikations indstillinger i bunden af hvert emne.
Tilgå dine indstillinger for at ændre dette.
'
bottom:
latest: "Der er ikke flere populære emner."
hot: "There are no more hot topics."
@@ -1012,7 +1121,6 @@ da:
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'
private_message: 'Start en besked'
@@ -1060,7 +1168,7 @@ da:
toggle_information: "vis detaljer om emnet"
read_more_in_category: "Mere læsestof? Se andre emner i {{catLink}} eller {{latestLink}}."
read_more: "Mere læsestof? {{catLink}} eller {{latestLink}}."
- read_more_MF: "There { UNREAD, plural, =0 {} one { is 1 unread } other { are # unread } } { NEW, plural, =0 {} one { {BOTH, select, true{and } false {is } other{}} 1 new topic} other { {BOTH, select, true{and } false {are } other{}} # new topics} } remaining, or {CATEGORY, select, true {browse other topics in {catLink}} false {{latestLink}} other {}}"
+ read_more_MF: "Der { UNREAD, plural, =0 {} one { er 1 ulæst } other { er # ulæste } } { NEW, plural, =0 {} one { {BOTH, select, true{and } false {is } other{}} 1 new topic} other { {BOTH, select, true{and } false {are } other{}} # new topics} } tilbage, eller {CATEGORY, select, true {kig på andre emner i {catLink}} false {{latestLink}} other {}}"
browse_all_categories: Vis alle kategorier
view_latest_topics: vis seneste emner
suggest_create_topic: Hvorfor ikke oprette et emne?
@@ -1072,19 +1180,29 @@ da:
auto_close_title: 'Indstillinger for automatisk lukning'
auto_close_save: "Gem"
auto_close_remove: "Luk ikke dette emne automatisk"
- auto_close_immediate: "Seneste indlæg i emnet er allerede %{hours} timer gammelt så emnet bliver lukket med det samme."
+ auto_close_immediate:
+ one: "Seneste indlæg i emnet er allerede 1 time gammelt så emnet bliver lukket med det samme."
+ other: "Seneste indlæg i emnet er allerede %{hours} timer gammelt så emnet bliver lukket med det samme."
+ timeline:
+ back: "Tilbage"
+ back_description: "Tilbage til dit seneste ulæste indlæg"
+ replies_short: "%{current} / %{total}"
progress:
title: emnestatus
go_top: "top"
go_bottom: "bund"
go: "start"
jump_bottom: "Hop til sidste indlæg"
+ jump_prompt: "hop til indlæg"
+ jump_prompt_long: "Hvilket indlæg vil du gerne springe til?"
jump_bottom_with_number: "hop til indlæg %{post_number}"
total: antal indlæg
current: nuværende indlæg
- position: "indlæg %{current} af %{total}"
notifications:
+ title: skift hvor ofte du vil blive notificeret om dette emne
reasons:
+ mailing_list_mode: "Du har maillist mode slået til, så du bliver notificeret omkring svar på dette emne via e-mail"
+ '3_10': 'Du får notifikationer fordi du overvåger et tag på dette emne'
'3_6': 'Du får notifikationer fordi du overvåger denne kategori.'
'3_5': 'Du får notifikationer fordi du overvåger dette emne automatisk.'
'3_2': 'Du får notifikationer fordi du overvåger dette emne.'
@@ -1137,6 +1255,8 @@ da:
invisible: "Gør ulistet"
visible: "Går listet"
reset_read: "Glem hvilke emner jeg har læst"
+ make_public: "Gør til offentligt emne"
+ make_private: "Gør til privat besked"
feature:
pin: "Fastgør Emne"
unpin: "Fjern Fastgøring af Emne"
@@ -1183,15 +1303,17 @@ da:
no_banner_exists: "Der er ikke noget banner-emne."
banner_exists: "Der er aktuelt et banner-emne."
inviting: "Inviterer…"
+ automatically_add_to_groups: "Denne invitation inkluderer også adgang til disse groupper:"
invite_private:
title: 'Inviter til besked'
email_or_username: "Inviteret brugers e-mail eller brugernavn"
email_or_username_placeholder: "e-mail-adresse eller brugernavn"
action: "Invitér"
success: "Vi har inviteret denne bruger til at være med i denne besked."
+ success_group: "We har inviteret denne gruppe til at deltage i denne besked"
error: "Beklager, der skete en fejl, da vi forsøgte at invitere brugeren."
group_name: "gruppe navn"
- controls: "Emnestyring"
+ controls: "Vælg handling"
invite_reply:
title: 'Invitér'
username_placeholder: "brugernavn"
@@ -1228,6 +1350,10 @@ da:
instructions:
one: "Vælg venligst det emne som indlægget skal flyttes til."
other: "Vælg venligst det emne som de {{count}} indlæg skal flyttes til."
+ merge_posts:
+ title: "Flet valgte indlæg"
+ action: "flet valgte indlæg"
+ error: "Der opstod en fejl med at flette de valgte indlæg."
change_owner:
title: "Skift hvem der ejer emnet"
action: "skift ejerskab"
@@ -1258,7 +1384,6 @@ da:
post:
reply: " {{replyAvatar}} {{usernameLink}}"
reply_topic: " {{link}}"
- quote_reply: "citér svar"
edit: "Redigerer {{link}} {{replyAvatar}} {{username}}"
edit_reason: "Reason: "
post_number: "indlæg {{number}}"
@@ -1275,7 +1400,6 @@ da:
gap:
one: "se 1 udeladt indlæg "
other: "se {{count}} udeladte indlæg "
- more_links: "{{count}} endnu..."
unread: "Indlæg er ulæst"
has_replies:
one: "{{count}} svar"
@@ -1294,7 +1418,9 @@ da:
create: "Beklager, der opstod en fejl under oprettelsen af dit indlæg. Prøv venligst igen."
edit: "Beklager, der opstrod en fejl under redigeringen af dit indlæg. Prøv venligst igen."
upload: "Beklager, der opstod en fejl ved upload af filen. Prøv venligst igen."
+ file_too_large: "Beklager, filen du prøver at uploade er for stor (den maksimale størrelse er {{max_size_kb}}kb). Du kan evt. uploade filen til en fildelings service og dele linket her."
too_many_uploads: "Beklager, men du kan kun uploade én fil ad gangen."
+ too_many_dragged_and_dropped_files: "Beklager, du kan maksimalt uploade 10 filer ad gangen"
upload_not_authorized: "Beklager, filen, som du forsøger at uploade, er ikke godkendt (godkendte filendelser: {{authorized_extensions}})."
image_upload_not_allowed_for_new_user: "Beklager, nye brugere kan ikke uploade billeder."
attachment_upload_not_allowed_for_new_user: "Beklager, nye brugere kan ikke uploade vedhæftede filer."
@@ -1304,6 +1430,7 @@ da:
no_value: "Nej"
yes_value: "Ja"
via_email: "dette indlæg blev oprettet via email"
+ via_auto_generated_email: "dette indlæg blev oprettet af en auto genereret e-mail"
whisper: "dette indlæg er en privat hvisken for moderatorer"
wiki:
about: "dette indlæg er en wiki"
@@ -1341,14 +1468,6 @@ da:
defer_flags:
one: "Udsæt markering"
other: "Udsæt markeringer"
- it_too:
- off_topic: "Flag det også"
- spam: "Flag det også"
- inappropriate: "Flag det også"
- custom_flag: "Flag det også"
- bookmark: "Bogmærk det også"
- like: "Like det også"
- vote: "Stem på det også"
undo:
off_topic: "Undo flag"
spam: "Undo flag"
@@ -1428,6 +1547,10 @@ da:
confirm:
one: "Er du sikker på, at du vil slette indlægget?"
other: "Er du sikker på, at du vil slette alle de valgte indlæg?"
+ merge:
+ confirm:
+ one: "Er du sikker på du vil flette de indlæg?"
+ other: "Er du sikker på at du vil flette disse {{count}} indlæg?"
revisions:
controls:
first: "Første udgave"
@@ -1459,6 +1582,11 @@ da:
general: 'Overordnet'
settings: 'Indstillinger'
topic_template: "Skabelon for emne"
+ tags: "Tags"
+ tags_allowed_tags: "Mærker der kun kan bruges i denne kategori:"
+ tags_allowed_tag_groups: "Mærke grupper der kun kan bruges i denne kategori:"
+ tags_placeholder: "(Valgfri) liste af tiladte mærker"
+ tag_groups_placeholder: "(Valgfri) liste af tiladte mærke grupper"
delete: 'Slet kategori'
create: 'Ny kategori'
create_long: 'Opret en ny kategori'
@@ -1505,8 +1633,13 @@ da:
notifications:
watching:
title: "Overvåger"
+ description: "Du overvåger automatisk alle emner i disse kategorier. Du får besked om hvert nyt indlæg i hvert emne og antallet af nye svar bliver vist."
+ watching_first_post:
+ title: "Overvåger Første Indlæg"
+ description: "Du vil kun blive notificeret om det første indlæg under hvert nyt emne i denne kategori."
tracking:
title: "Følger"
+ description: "Du tracker automatisk alle emner i disse kategorier. Du får besked hvis nogen nævner dit @navn eller svarer dig, og antallet af nye svar bliver vist."
regular:
title: "Normal"
description: "Du vil modtage en notifikation, hvis nogen nævner dit @name eller svarer dig."
@@ -1518,8 +1651,9 @@ da:
action: 'Flag indlæg'
take_action: "Reagér"
notify_action: 'Besked'
+ official_warning: 'Officiel Advarsel'
delete_spammer: "Slet spammer"
- delete_confirm: "Du er ved at slette %{posts} indlæg og %{topics} emner oprettet af denne bruger, fjerne deres konto, blokere tilmeldinger fra deres IP-adresse %{ip_address} og tilføje deres e-mail-adresse %{email} til en permanent blokeringsliste. Er du sikker på, at denne bruger virkelig er en spammer?"
+ delete_confirm_MF: "Du er ved at slette {posts} indlæg og {TOPICS, plural, one {1 emne} other {# emner}} oprettet af denne bruger, fjerne deres konto, blokere tilmeldinger fra deres IP-adresse {ip_address} og tilføje deres e-mail-adresse {email} til en permanent blokeringsliste. Er du sikker på, at denne bruger virkelig er en spammer?"
yes_delete_spammer: "Ja, slet spammer"
ip_address_missing: "(Ikke tilgængelig)"
hidden_email_address: "(skjult)"
@@ -1533,10 +1667,6 @@ da:
spam: "Det er spam"
custom_placeholder_notify_user: "Vær præcis, vær kontruktiv og vær altid venlig."
custom_placeholder_notify_moderators: "Lad os vide præcis hvad du er bekymret over og giv relevante links og eksempler hvor det er muligt."
- custom_message:
- at_least: "indtast mindst {{n}} tegn"
- more: "{{n}} flere..."
- left: "{{n}} tilbage"
flagging_topic:
title: "Tak fordi du hjælper med at holde vores forum civiliseret!"
action: "Rapporter emne"
@@ -1545,9 +1675,12 @@ da:
title: "Emne-resumé"
participants_title: "Hyppige forfattere"
links_title: "Populære Links"
+ links_shown: "vis flere links..."
clicks:
one: "1 klik"
other: "%{count} klik"
+ post_links:
+ about: "udvid flere links for dette indlæg"
topic_statuses:
warning:
help: "Dette er en officiel advarsel."
@@ -1571,7 +1704,6 @@ da:
invisible:
help: "Dette emne er ulistet; det vil ikke blive vist i listen over emner og kan kun tilgås med et direkte link"
posts: "Indlæg"
- posts_lowercase: "indlæg"
posts_long: "{{number}} indlæg i dette emne"
posts_likes_MF: |
Dette emne har {count, plural, one {1 svar} other {# svar}} {ratio, select,
@@ -1683,6 +1815,124 @@ da:
full: "Opret / Besvar / Se"
create_post: "Besvar / Se"
readonly: "Se"
+ lightbox:
+ download: "download"
+ keyboard_shortcuts_help:
+ title: 'Tastaturgenveje'
+ jump_to:
+ title: 'Hop til'
+ home: 'g, h Hjem'
+ latest: 'g, l Seneste'
+ new: 'g, n Ny'
+ unread: 'g, u Ulæst'
+ categories: 'g, c Kategorier'
+ top: 'g, t Top'
+ bookmarks: 'g, b Bogmærker'
+ profile: 'g, p Profil'
+ messages: 'g, m Beskeder'
+ navigation:
+ title: 'Navigation'
+ jump: '# Gå til indlæg #'
+ back: 'u Tilbage'
+ up_down: 'k/j Flyt udvalgte ↑ ↓'
+ open: 'o eller Enter Åben det valgte emne'
+ next_prev: 'shift+j/shift+k Næste/Forrige'
+ application:
+ title: 'Applikation'
+ create: 'c Opret nyt emne'
+ notifications: 'n Åben notifikationer'
+ hamburger_menu: '= Åben hamburger menu'
+ user_profile_menu: 'p Åben bruger menu'
+ show_incoming_updated_topics: '. Vis opdaterede emner'
+ search: '/ Søg'
+ help: '? Åben tastaturhjælp'
+ dismiss_new_posts: 'x, r Afvis Nyt/Indlæg'
+ dismiss_topics: 'x, t Afvis emner'
+ log_out: 'shift+z shift+z Log ud'
+ actions:
+ title: 'Handlinger'
+ badges:
+ title: Badges
+ allow_title: "tilgængelig titel"
+ multiple_grant: "tildelt flere gange"
+ none: " Einladungslink erfolgreich generiert! Der Einladungslink ist nur für folgende E-Mail-Adresse gültig: %{invitedEmail} Invite link generated successfully! Invite link is only valid for this email address: %{invitedEmail} ¡Enlace de Invitación generado con éxito! Este enlace de Invitación es sólo válido para la siguiente dirección de email: %{invitedEmail} Kutse viide edukalt genereeritud! Kutse viide on kehtiv vaid selle meiliaadressi jaoks: %{invitedEmail} {{username}} {{description}} {{username}} {{description}} {{username}} võttis Sinu kutse vastu {{username}} liigutas {{description}} {{username}} {{description}} Teenisid '{{description}}' Uus teema {{description}} {{count}} sõnum Sinu {{group_name}} postkastis {{count}} sõnumit Sinu {{group_name}} postkastis
+
- Stummgeschaltete Themen und Kategorien werden in diesen E-Mails nicht eingeschlossen.
+ Stummgeschaltete Themen und Kategorien werden in diese E-Mails nicht eingeschlossen.
daily: "Aktualisierungen täglich senden"
individual: "Für jeden Beitrag eine E-Mail senden"
+ individual_no_echo: "Sende für alle fremden Beträge eine Email"
many_per_day: "Sende mir für jeden neuen Beitrag eine E-Mail (etwa {{dailyEmailEstimate}} pro Tag)"
few_per_day: "Sende mir für jeden neuen Beitrag eine E-Mail (etwa 2 pro Tag)"
tag_settings: "Schlagwörter"
@@ -509,6 +562,10 @@ de:
muted_topics_link: "Zeige stummgeschaltete Themen"
watched_topics_link: "Zeige beobachtete Themen"
automatically_unpin_topics: "Angeheftete Themen automatisch loslösen, wenn ich deren letzten Beitrag gelesen habe."
+ apps: "Apps"
+ revoke_access: "Entziehe Zugriffsrecht"
+ undo_revoke_access: "Entziehe Zugriffsrecht widerrufen"
+ api_approved: "Genehmigt:"
staff_counters:
flags_given: "hilfreiche Meldungen"
flagged_posts: "gemeldete Beiträge"
@@ -590,13 +647,14 @@ de:
not_available: "Nicht verfügbar. Wie wäre es mit {{suggestion}}?"
too_short: "Dein Benutzername ist zu kurz"
too_long: "Dein Benutzername ist zu lang"
- checking: "Verfügbarkeit wird geprüft..."
+ checking: "Verfügbarkeit wird geprüft…"
enter_email: 'Benutzername gefunden; gib die zugehörige E-Mail-Adresse ein'
prefilled: "E-Mail-Adresse entspricht diesem registrierten Benutzernamen"
locale:
title: "Oberflächensprache"
instructions: "Die Sprache der Forumsoberfläche. Diese Änderung tritt nach dem Neuladen der Seite in Kraft."
default: "(Standard)"
+ any: "jegliche"
password_confirmation:
title: "Wiederholung des Passworts"
last_posted: "Letzter Beitrag"
@@ -654,8 +712,9 @@ de:
after_4_minutes: "nach 4 Minuten"
after_5_minutes: "nach 5 Minuten"
after_10_minutes: "nach 10 Minuten"
+ notification_level_when_replying: "Wenn ich in einem Thema antworte, setze das Thema auf"
invited:
- search: "zum Suchen nach Einladungen hier eingeben..."
+ search: "zum Suchen nach Einladungen hier eingeben…"
title: "Einladungen"
user: "Eingeladener Benutzer"
sent: "Gesendet"
@@ -684,13 +743,12 @@ de:
account_age_days: "Konto-Alter in Tagen"
create: "Einladung versenden"
generate_link: "Einladungslink kopieren"
- generated_link_message: 'Otsi Google abil
+
tagging: all_tags: "Kõik sildid" selector_all_tags: "kõik sildid" @@ -1789,6 +2092,9 @@ et: delete_confirm: "Oled Sa kindel, et soovid selle sildi kustutada?" rename_tag: "Nimeta silt ümber" rename_instructions: "Vali sildile uus nimi:" + sort_by: "Järjesta:" + sort_by_count: "üldarv" + sort_by_name: "nimi" manage_groups: "Halda siltide gruppe" manage_groups_description: "Määra siltide organiseerimiseks grupid" filters: @@ -1801,26 +2107,59 @@ et: title: "Vaatlen" description: "Sa vaatled kõiki selle sildiga teemasid automaatselt. Sind teavitatakse kõigist uutest postitustest ja teemadest, koos lugemata ja uute postituste arvuga teema pealkirja kõrval." watching_first_post: + title: "Vaatan esimest postitust" description: "Sind teavitatakse vaid esimesest postitusest igas uues selle sildiga teemas." tracking: + title: "Jälgin" description: "Sa jälgid kõiki selle sildiga uusi teemasid. Lugemata ja uute postituste arv on näha teema pealkirja kõrval." + regular: + title: "Tavaline" + description: "Sind teavitatakse, kui keegi Sinu @name mainib või vastab Sinu positusele." muted: + title: "Vaigistatud" description: "Sind ei teavitata ühestki uuest selle sildiga teemast, samuti ei ilmu nad lugemata postituste sakil." groups: title: "Siltide grupid" about: "Hõlpsamaks haldamiseks lisa sildid gruppidesse." + new: "Uus grupp" tags_label: "Sildid selles grupis:" parent_tag_label: "Ülemsilt:" parent_tag_placeholder: "Valikuline" parent_tag_description: "Sellesse gruppi kuuluvaid silte ei saa kasutada, kui ülemsilt on puudu." one_per_topic_label: "Vaid üks selle grupi silt teema kohta" new_name: "Uus siltide grupp" + save: "Salvesta" + delete: "Kustuta" confirm_delete: "Oled kindel, et soovid selle siltide grupi kustutada?" topics: none: unread: "Sul ei ole lugemata teemasid." + new: "Sul ei ole uusi teemasid." + read: "Sa ei ole veel ühtegi teemat lugenud." + posted: "Sa ei ole veel ühtegi teemasse postitanud." + latest: "Ühtegi värsket teemat pole." + hot: "Ühtegi kuuma teemat pole." + bookmarks: "Sul ei ole veel ühtegi järjehoidjaga teemal." + top: "Ühtegi parimat teemat pole." + search: "Otsing ei andnud tulemusi." bottom: + latest: "Rohkem värskeid teemasid pole." + hot: "Rohkem kuumi teemasid pole." + posted: "Rohkem uute postitustega teemasid pole." + read: "Rohkem loetud teemasid pole." + new: "Rohkem uusi teemasid pole." unread: "Rohkem lugemata teemasid pole." + top: "Rohkem parimaid teemasid pole." + bookmarks: "Rohkem järjehoidjaga teemasid pole." + search: "Rohkem otsingutulemusi pole." + invite: + custom_message: "Muuda oma kutse veidi personaalsemaks kirjutades" + custom_message_link: "individuaalne sõnum" + custom_message_placeholder: "Sisesta oma individuaalne sõnum" + custom_message_template_forum: "Kuule, Sa peaksid selle foorumiga liituma!" + custom_message_template_topic: "Kuule, arvan et see teema meeldiks Sulle!" + safe_mode: + enabled: "Kaitstud režiim on aktiivne, väljumiseks sulge see brauseri aken." admin_js: type_to_filter: "filtreerimiseks trüki..." admin: @@ -1868,6 +2207,7 @@ et: 30_days_ago: "30 päeva tagasi" all: "Kõik" view_table: "tabel" + view_graph: "diagramm" refresh_report: "Värskenda raportit" start_date: "Alguskuupäev" end_date: "Lõpukuupäev" @@ -1945,15 +2285,12 @@ et: refresh: "Värskenda" new: "Uus" selector_placeholder: "sisesta kasutajanimi" - name_placeholder: "Grupi nimi, tühikuteta, vastab kasutajanime reeglitele" about: "Siin saad muuta oma grupi liikmelisust ja nimesid" group_members: "Grupi liikmed" delete: "Kustuta" delete_confirm: "Kustutame selle grupi?" delete_failed: "Ei suuda kustutada seda gruppi. Kui see on automaatne grupp, ei saa seda hävitada." - delete_member_confirm: "Eemalda '%{username}' grupist '%{group}'?" delete_owner_confirm: "Eemaldan kasutajalt '%{username}' omaniku õigused?" - name: "Nimi" add: "Lisa" add_members: "Lisa liikmeid" custom: "Individuaalne" @@ -1984,6 +2321,76 @@ et: info_html: "See API võti lubab Sul teemasid luua ja uuendada JSON kutsete kaudu." all_users: "Kõik kasutajad" note_html: "Hoia seda võtit salajas, iga kasutaja, kes seda omab, võib luua suvalisi postitusi suvalise kasutaja nime alt." + web_hooks: + title: "Veebihaagid" + none: "Hetkel veebihaagid puuduvad." + instruction: "Veebihaagid lubavad Discourse'l teavitada muid teenuseid sündmustest Sinu saidil. Kui veebihaak vallandub, saadetakse etteantud URL-dele POST päring." + detailed_instruction: "Valitud sündmuse toimumisel saadetakse etteantud URL-le POST päring." + new: "Uus veebihaak" + create: "Loo" + save: "Salvesta" + destroy: "Kustuta" + description: "Kirjeldus" + controls: "Juhtpult" + go_back: "Tagasi nimekirja" + payload_url: "Kasuliku lasti URL" + payload_url_placeholder: "https://example.com/postreceive" + warn_local_payload_url: "Näib, et püüad seada veebihaaki lokaalsele URL-le. Lokaalsele aadressile saadetud sündmus võib esile kusuda kõrvalnähte või ootamatusi. Kas jätkame?" + secret_invalid: "Salavõti ei tohi sisaldada tühikuid." + secret_too_short: "Salavõti peab olema vähemalt 12 sümbolit pikk." + secret_placeholder: "Valikuline tekst, kasutatakse allkirja genereerimiseks" + event_type_missing: "Pead seadistama vähemalt ühe sündmuse liigi." + content_type: "Sisutüüp" + secret: "Salavõti" + event_chooser: "Millised sündmused peaksid selle veebihaagi käivitama?" + wildcard_event: "Saada mulle kõik." + individual_event: "Vali üksikud sündmused." + verify_certificate: "Kontrolli kasuliku lasti URL-i TLS sertifikaati" + active: "Aktiivne" + active_notice: "Teavitame sündmuse üksikasjadest peale selle toimumist." + categories_filter_instructions: "Asjakohased veebihaagid vallanduvad vaid juhul, kui sündmus on seotud määratud foorumitega. Jäta tühjaks, kui soovid veebihaagid vallandada kõigi foorumite jaoks." + categories_filter: "Käivitatud foorumid" + groups_filter_instructions: "Asjakohased veebihaagid vallanduvad vaid juhul, kui sündmus on seotud määratud gruppidega. Jäta tühjaks, kui soovid veebihaagid vallandada kõigi gruppide jaoks." + groups_filter: "Käivitatud grupid" + delete_confirm: "Kustutame selle veebihaagi?" + topic_event: + name: "Teema sündmus" + details: "Kui teema luuakse, muudetakse või kustutatakse." + post_event: + name: "Postituse sündmus" + details: "Kui teemas on uus vastus, muudatus, kustutamine või taastamine." + user_event: + name: "Kasutaja sündmus" + details: "Kui kasutaja luuakse, kinnitatakse või muudetakse." + delivery_status: + title: "Kättetoimetamise staatus" + inactive: "Mitteaktiivne" + failed: "Ebaõnnestunud" + successful: "Edukas" + events: + none: "Ühtegi seotud sündmust pole." + redeliver: "Saada uuesti" + incoming: + one: "On tekkinud uus sündmus." + other: "On tekkinud {{count}} uut sündmust." + completed_in: + one: "Lõpetatud 1 sekundiga." + other: "Lõpetatud {{count}} sekundiga." + request: "Päring" + response: "Vastus" + redeliver_confirm: "Oled kindel, et soovid sama kasulikku lasti uuesti saata?" + headers: "Päised" + payload: "Kasulik last" + body: "Sisu" + go_list: "Mine nimekirja" + go_details: "Muuda veebihaaki" + go_events: "Mine sündmuste juurde" + ping: "Ping" + status: "Staatus" + event_id: "ID" + timestamp: "Loaded" + completion: "Soorituse aeg" + actions: "Tegevused" plugins: title: "Plugin" installed: "Paigaldatud pluginad" @@ -2049,10 +2456,8 @@ et: title: "Pööra andmebaas tagasi viimati toiminud olekusse" confirm: "Oled kindel, et soovid andmebaasi tagasi viimati toiminud olekusse pöörata?" export_csv: - user_archive_confirm: "Oled kindel, et soovid enda postitused alla laadida?" success: "Eksportimine käivitatud. Protsessi lõppemisel saadetakse Sulle teade." failed: "Eksportimine ebaõnnestus. Kontrolli logisid." - rate_limit_error: "Postitusi saab alla laadida üks kord ööpäevas. Palun proovi homme uuesti." button_text: "Ekspordi" button_title: user: "Ekspordi täielik kasutajate nimekiri CSV formaadis." @@ -2160,12 +2565,13 @@ et: test_error: "Testmeili saatmisel tekkis viga. Palun kontrolli oma meilisätteid, veendu, et sinu teenusepakkuja ei blokeeri meiliühendusi ja proovi uuesti." sent: "Saadetud" skipped: "Üle hüpatud" + bounced: "Välja visatud" received: "Saadud" rejected: "Tagasi lükatud" sent_at: "Saadetud" time: "Aeg" user: "Kasutaja" - email_type: "Meili liik" + email_type: "Meili tüüp" to_address: "Aadressile" test_email_address: "testitav meiliaadress" send_test: "Saada testmeil" @@ -2173,10 +2579,14 @@ et: delivery_method: "Kättetoimetamise viis" preview_digest_desc: "Passiivsetele kasutajatele meilitud saadetiste sisu eelvaatlus." refresh: "Värskenda" + send_digest_label: "Saada see tulemus:" + send_digest: "Saada" + sending_email: "Saadan meili..." format: "Formaat" html: "html" text: "tekst" last_seen_user: "Viimati nähtud kasutaja:" + no_result: "Referaadile ei leitud ühtegi tulemust." reply_key: "Vastuse võti" skipped_reason: "Ülehüppamise põhjus" incoming_emails: @@ -2217,7 +2627,7 @@ et: ip_address: "IP" topic_id: "Teema ID" post_id: "Postituse ID" - category_id: "Liigi ID" + category_id: "Foorumi ID" delete: 'Kustuta' edit: 'Muuda' save: 'Salvesta' @@ -2259,9 +2669,9 @@ et: impersonate: "kehastu ümber" anonymize_user: "muuda kasutaja anonüümseks" roll_up: "Koonda IP-aadressi blokid kokku" - change_category_settings: "muuda liigi sätteid" - delete_category: "kustuta liik" - create_category: "loo liik" + change_category_settings: "muuda foorumi sätteid" + delete_category: "kustuta foorum" + create_category: "loo foorum" block_user: "blokeeri kasutaja" unblock_user: "vabasta kasutaja blokeeringust" grant_admin: "anna admin-õigus" @@ -2269,6 +2679,9 @@ et: grant_moderation: "anna modereerimisõigus" revoke_moderation: "võta modereerimisõigus ära" backup_operation: "varundustoiming" + deleted_tag: "kustutatud silt" + renamed_tag: "ümbernimetatud silt" + revoke_email: "kutsu meil tagasi" screened_emails: title: "Varjestatud meilid" description: "Kui keegi üritab uut kontot luua, siis kontrollitakse järgmisi meiliaadresse ja vastavuse korral registreerimine peatatakse või tehakse mõni muu toiming." @@ -2363,7 +2776,7 @@ et: suspend_reason: "Põhjus" suspended_by: "Peatati kasutaja poolt" delete_all_posts: "Kustuta kõik postitused" - delete_all_posts_confirm: "Sa oled kustutamas %{posts} postitust ja %{topics} teemat. Oled Sa kindel?" + delete_all_posts_confirm_MF: "Sa oled kustutamas {POSTS, plural, one {1 post} other {# posts}} and {TOPICS, plural, one {1 topic} other {# topics}}. Oled Sa kindel?" suspend: "Peata" unsuspend: "Taasluba" suspended: "Peatatud?" @@ -2437,9 +2850,18 @@ et: block_failed: 'Viga kasutaja blokeerimisel.' block_confirm: 'Oled Sa kindel, et soovid seda kasutajat blokeerida? Kasutaja ei saa peale seda luua ühtegi teemat ega postitust.' block_accept: 'Jah, blokeeri see kasutaja' + bounce_score: "Väljaviskamiste skoor" + reset_bounce_score: + label: "Lähtesta" + title: "Lähtesta väljaviskamiste skoor tagasi 0" deactivate_explanation: "Deaktiveeritud kasutaja peab valideerima oma meiliaadressi." suspended_explanation: "Peatatud kasutaja ei saa sisse logida." block_explanation: "Blokeeritud kasutaja ei saa postitada ega alustada teemasid." + staged_explanation: "Ettevalmistamisel oleval kasutajal on lubatud postitada ettemääratud teemadesse vaid meili teel." + bounce_score_explanation: + none: "Sellelt meiliaadressilt pole viimasel ajal tagasipõrgatusi saabunud." + some: "Sellelt meiliaadressilt on viimasel ajal mõned tagasipõrgatused saabunud." + threshold_reached: "Sellelt meiliaadressilt on saabunud liiga palju tagasipõrgatusi." trust_level_change_failed: "Viga kasutaja usaldustaseme muutmisel." suspend_modal_title: "Peata kasutaja" trust_level_2_users: "Kasutajad usaldustasemel 2" @@ -2450,7 +2872,9 @@ et: unlock_trust_level: "Eemalda usaldustaseme lukustus" tl3_requirements: title: "Usaldustaseme 3 nõuded" - table_title: "Viimasel %{time_period} päeval:" + table_title: + one: "viimase päeva jooksul:" + other: "viimase %{count} päeva jooksul:" value_heading: "Väärtus" requirement_heading: "Nõue" visits: "Külastusi" @@ -2550,11 +2974,15 @@ et: developer: 'Arendaja' embedding: "Manustamised" legal: "Õiguslik" + user_api: 'Kasutaja API' uncategorized: 'Muu' backups: "Varukoopiad" login: "Sisselogimine" plugins: "Pistikprogrammid" user_preferences: "Kasutaja seaded" + tags: "Sildid" + search: "Otsi" + groups: "Grupid" badges: title: Märgised new_badge: Uus märgis @@ -2636,8 +3064,9 @@ et: sample: "Kasuta järgnevat HTML koodi oma saidil, et luua ja lisada/sängitada discourse teemad oma saidile. Asenda REPLACE_ME kanoonilise lehe URL-viitega, kuhu Sa seda lisad." title: "Sängitamine" host: "Lubatud hostid" + path_whitelist: "Lubatud aadressiosad" edit: "muuda" - category: "Postita liiki" + category: "Postita foorumisse" add_host: "Lisa host" settings: "Sängitamise sätted" feed_settings: "Voo sätted" @@ -2647,9 +3076,11 @@ et: embed_by_username: "Kasutajanimi teema loomiseks" embed_post_limit: "Maksimaalne postituste arv, mida sängitada" embed_username_key_from_feed: "Võti discourse kasutajanime eraldamiseks voost" + embed_title_scrubber: "Regex postituste päiste puhastamiseks" embed_truncate: "Lühenda sängitatud postitused" embed_whitelist_selector: "CSS valik elementidele, mida lubada sängitamistes" embed_blacklist_selector: "CSS valik elementidele, mida eemaldada sängitamistes" + embed_classname_whitelist: "CSS klasside lubatud nimed" feed_polling_enabled: "Impordi postitused RSS/ATOM'i kaudu" feed_polling_url: "URL või RSS/ATOM voog, mida kududa" save: "Salvesta sängitamise sätted" @@ -2660,11 +3091,30 @@ et: topic_title: "Teema" post_id: "Postituse ID" post_title: "Postitus" - category_id: "Liigi ID" - category_title: "Liik" + category_id: "Foorumi ID" + category_title: "Foorum" external_url: "Väline URL" delete_confirm: Oled Sa kindel, et soovid seda püsiviidet kustutada? form: label: "Uus" add: "Lisa" filter: "Otsi (URL või väline URL)" + wizard_js: + wizard: + done: "Tehtud" + back: "Tagasi" + next: "Järgmine" + step: "%{current} %{total}st" + upload: "Lae üles" + uploading: "Laen üles..." + quit: "Võib-olla hiljem" + staff_count: + one: "Sinu kommuunis on 1 tiimi liige." + other: "Sinu kommuunis on %{count} tiimi liiget." + invites: + add_user: "lisa" + none_added: "Sa ei ole kutsunud ühtegi tiimi liiget. Oled Sa kindel, et soovid jätkata?" + roles: + admin: "Admin" + moderator: "Moderator" + regular: "Tavakasutaja" diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml index 9ddb06aa75f..c4c1eadfc36 100644 --- a/config/locales/client.fa_IR.yml +++ b/config/locales/client.fa_IR.yml @@ -45,8 +45,6 @@ fa_IR: other: "< %{count} ثانیه" x_seconds: other: "%{count} ثانیه" - less_than_x_minutes: - other: "< %{count} دقیقه" x_minutes: other: "%{count} دقیقه" about_x_hours: @@ -266,16 +264,12 @@ fa_IR: total_rows: other: "%{count} کاربران" groups: - empty: - posts: "در این گروه هیچ پستی توسط کاربران " - members: "هیچ عضوی در این گروه وجود ندارد." - mentions: "هیچ کجا به این گروه اشارهای نشده است." - messages: "پیامی در این گروه وجود ندارد." - topics: "در این گروه هیچ موضوعی توسط کاربران ارسال نشده." add: "افزودن" selector_placeholder: "افزودن عضو" owner: "مالک" visible: "همهٔ کاربران گروه را میبینند" + index: + title: "گروهها" title: other: "گروهها" members: "اعضا" @@ -336,12 +330,8 @@ fa_IR: latest_by: "آخرین توسط" toggle_ordering: "ضامن کنترل مرتب سازی" subcategories: "زیر دسته بندی ها" - topic_stats: "شمار موضوعات تازه." topic_stat_sentence: other: "%{count} موضوعات تازه در %{unit} گذشته." - post_stats: "تعداد نوشته های جدید." - post_stat_sentence: - other: "%{count} نوشته تازه در %{unit} گذشته." ip_lookup: title: جستجوی نشانی IP hostname: نام میزبان @@ -364,7 +354,6 @@ fa_IR: profile: "نمایه" mute: "بی صدا" edit: "ویرایش تنظیمات" - download_archive: "دانلود نوشته های من" new_private_message: "پیام های جدید" private_message: "پیام" private_messages: "پیامها" @@ -565,13 +554,9 @@ fa_IR: account_age_days: "عمر حساب بر اساس روز" create: "فرستادن یک دعوتنامه" generate_link: "کپی لینک دعوت" - generated_link_message: '
لینک دعوت با موفقیت تولید شد!
لینک دعوت فقط برای این ایمیل آدرس معتبر است: %{invitedEmail}
' bulk_invite: - none: "شما هنوز کسی را اینجا دعوت نکرده اید. می توانید بصورت تکی یا گروهی یکجا دعوتنامه را بفرستید از طریق بارگذار فراخوانه فله ای ." text: "دعوت گروهی از طریق فایل" - uploading: "بارگذاری..." success: "فایل با موفقیت بارگذاری شد٬ وقتی که پروسه تمام شد به شما را از طریق پیام اطلاع می دهیم. " - error: "در بارگذاری «{{filename}}» خطایی روی داد: {{message}}" password: title: "رمزعبور" too_short: "رمز عبورتان خیلی کوتاه است" @@ -580,6 +565,10 @@ fa_IR: same_as_email: "رمز عبورتان با ایمیل شما برابر است. " ok: "گذرواژهٔ خوبی است." instructions: "در آخرین %{count} کاراکتر" + summary: + top_badges: "مدال های برتر" + no_badges: "هنوز مدالی نیست." + more_badges: "مدال های بیشتر" associated_accounts: "ورود ها" ip_address: title: "آخرین نشانی IP" @@ -870,7 +859,6 @@ fa_IR: title: "جستجوی موضوعات، نوشته ها، کاربران یا دسته بندی ها" no_results: "چیزی یافت نشد." no_more_results: "نتایجی بیشتری یافت نشد." - search_help: راهنمای جستجو searching: "جستجو کردن..." post_format: "#{{post_number}} توسط {{username}}" context: @@ -913,6 +901,8 @@ fa_IR: category: "هیچ موضوعاتی در {{category}} نیست." top: "موضوع برتر وجود ندارد." search: " هیچ نتیجه جستجویی وجود ندارد." + educate: + unread: '
موضوعات جدید در اینجا قرار می گیرند.
به طور پیش فرض، موضوعات جدید در نظر گرفته خواهند شد و نشان داده می شوند جدید شاخص اگر آنها در 2 روز گذشته ایجاد شده باشند
شما می توانید این را برای خود تغییر دهید تنظیمات.
'
bottom:
latest: "موضوع تازهٔ دیگری نیست."
hot: "موضوع داغ دیگری نیست."
@@ -928,7 +918,6 @@ fa_IR:
unsubscribe:
stop_notifications: "حالا شما اعلانات کمتری برای {{title}} دریافت میکنید"
change_notification_state: "وضعیت فعلی اعلانات شما این هست"
- filter_to: "نوشته در موضوع {{post_count}} "
create: 'موضوع جدید'
create_long: 'ساخت یک موضوع جدید'
private_message: 'شروع یک پیام'
@@ -976,7 +965,6 @@ fa_IR:
auto_close_title: 'تنضیمات قفل خوکار'
auto_close_save: "ذخیره"
auto_close_remove: "این موضوع را خوکار قفل نکن"
- auto_close_immediate: "زمان ارسال آخرین پست در موضوع برای %{hours} ساعت پیش است، بنابر این موضوع بلافاصله بسته میشود."
progress:
title: نوشته ی در حال اجرا
go_top: "بالا"
@@ -986,7 +974,6 @@ fa_IR:
jump_bottom_with_number: "رفتن به نوشته ی %{post_number}"
total: همهٔ نوشتهها
current: نوشته کنونی
- position: "نوشته %{current} از %{total}"
notifications:
reasons:
'3_6': 'شما آگاهسازیها را دریافت خواهید کرد، زیرا شما در حال مشاهده ی این دسته بندی هستید.'
@@ -1155,7 +1142,6 @@ fa_IR:
post:
reply: " {{replyAvatar}} {{usernameLink}}"
reply_topic: " {{link}}"
- quote_reply: "پاسخ با نقل قول"
edit: "در حال ویرایش {{link}} {{replyAvatar}} {{username}}"
edit_reason: "دلیل:"
post_number: "نوشته {{number}}"
@@ -1170,7 +1156,6 @@ fa_IR:
expand_collapse: "باز کردن/گستردن"
gap:
other: "{{count}} پاسخ پنهان را مشاهده کنید"
- more_links: "{{count}} مورد دیگر..."
unread: "نوشته خوانده نشده است"
has_replies:
other: "{{count}} پاسخ"
@@ -1227,14 +1212,6 @@ fa_IR:
flag: 'پرچم'
defer_flags:
other: "پرچم تسلیم"
- it_too:
- off_topic: "همچنین آن یکی را پرچم بزنید"
- spam: "همچنین آن یکی را پرچم بزنید"
- inappropriate: "همچنین آن یکی را پرچم بزنید"
- custom_flag: "همچنین آن یکی را پرچم بزنید"
- bookmark: "همچنین نشانکگذاری آن یکی"
- like: "همچنین آن یکی را پسند کنید"
- vote: "همچنین به آن یکی رأی دهید"
undo:
off_topic: "برداشتن پرچم"
spam: "برداشتن پرچم"
@@ -1378,7 +1355,6 @@ fa_IR:
take_action: "اقدام"
notify_action: 'پیام'
delete_spammer: "پاک کردن هرزنگار"
- delete_confirm: "شما در مورد حذف %{posts} نوشته ها و %{topics} موضوغات این کاربر،و حذف حساب کاربری وی، مسدود شدن ثبت نام از این آدرس آی پی%{ip_address} و اضافه شدن ایمیل %{email} به لیست مسدودیت دائمی.\nآیا اطمینان دارید که این کاربر یک اسپمر است ؟"
yes_delete_spammer: "بله، پاککردن هرزنگار"
ip_address_missing: "(N/A)"
hidden_email_address: "(مخفی)"
@@ -1391,10 +1367,6 @@ fa_IR:
spam: "آن هرزنامه است"
custom_placeholder_notify_user: "خاص، سودمند باشید و همیشه مهربان."
custom_placeholder_notify_moderators: "به ما اجازه دهید بدانیم شما در مورد چه چیز آن نگران هستید، و ارائه لینک مربوطه و نمونه آن امکان پذیر است."
- custom_message:
- at_least: "دستکم {{n}} نویسه بنویسید"
- more: "{{n}} نویسهٔ دیگر تا..."
- left: "{{n}} مانده"
flagging_topic:
title: "تشکر برای کمک به جامعه مدنی انجمن ما!"
action: "پرچمگذاری موضوع"
@@ -1428,7 +1400,6 @@ fa_IR:
invisible:
help: "این موضوع از لیست خارج شد: آن درلیست موضوعات نمایش داده نخواهد شد، و فقط از طریق لینک مستقیم در دسترس خواهد بود. "
posts: "نوشتهها"
- posts_lowercase: "نوشته ها"
posts_long: "این موضوع {{number}} نوشته دارد"
posts_likes_MF: |
این موضوع است {count, plural, one {1 reply} other {# replies}} {ratio, select,
@@ -1531,6 +1502,14 @@ fa_IR:
full: "ساختن / پاسخ دادن / دیدن"
create_post: "پاسخ دادن / دیدن"
readonly: "دیدن"
+ badges:
+ earned_n_times:
+ other: "این مدال را %{count} بار به دست آورده"
+ others_count: "بقیه با این مدال (%{count})"
+ title: مدال ها
+ badge_count:
+ other: "%{count} مدال"
+ select_badge_for_title: انتخاب یک مدال برای استفاده در عنوان خود
admin_js:
type_to_filter: "بنویسید تا فیلتر کنید..."
admin:
@@ -1649,15 +1628,12 @@ fa_IR:
refresh: "تازه کردن"
new: "جدید"
selector_placeholder: "نام کاربری را وارد نمایید ."
- name_placeholder: "نام گروه، بدون فاصله، همان قاعده نام کاربری"
about: "اعضای گروهت و نام ها را اینجا ویرایش کن"
group_members: "اعضای گروه"
delete: "حذف"
delete_confirm: "حفظ کردن این گروه؟"
delete_failed: "قادر به حذف گروه نیستیم. اگر این یک گروه خودکار است، نمی توان آن را از بین برد."
- delete_member_confirm: "حذف کردن '%{username}' از '%{group}' گروه؟"
delete_owner_confirm: "حذف حق مالکیت برای '%{username}'؟"
- name: "نام"
add: "اضافه کردن"
add_members: "اضافه کردن عضو"
custom: "دلخواه"
@@ -1688,6 +1664,19 @@ fa_IR:
info_html: "موضوعات تازه پس از آخرین بازدید شما"
all_users: "همه کاربران"
note_html: "این کلید را امن نگهدارید، تمام کاربرانی که آن را دارند می توانند نوشته های دلخواه بسازند به عنوان هر کاربری"
+ web_hooks:
+ active: "فعال"
+ delivery_status:
+ failed: "ناموفق"
+ successful: "موفق"
+ events:
+ request: "درخواست"
+ response: "پاسخ"
+ body: "بدنه"
+ go_list: "برو به لیست"
+ event_id: "آی دی"
+ timestamp: "ساخته شده"
+ actions: "کار ها"
plugins:
title: "افزونه ها"
installed: "افزونه های نصب شده"
@@ -1739,14 +1728,13 @@ fa_IR:
is_disabled: "بازگردانی در تنظیمات سایت از کار انداخته شده است."
label: "بازیابی"
title: "بازیابی پشتیبان"
+ confirm: "آیا از بازگردانی این پشتیبان مطمئن هستید ؟"
rollback:
label: "عقبگرد"
title: "عقب گرد پایگاه داده به حالت کار قبلی"
export_csv:
- user_archive_confirm: "آیا مطمئنید که میخواهید نوشتههایتان را دانلود کنید؟"
success: "فرایند برون ریزی، به شما از طریق پیام اطلاع رسانی خواهد شد وقتی این فرایند تکمیل شود."
failed: "برون ریزی شکست خورد. لطفا لوگ گزارشات را مشاهده فرمایید."
- rate_limit_error: "نوشته ها را می توانید روزی فقط یک بار دانلود کنید. لطفا فردا دوباره امتحان کنید."
button_text: "خروجی گرفتن"
button_title:
user: "برون ریزی لیست کاربر در قالب CSV ."
@@ -1845,13 +1833,17 @@ fa_IR:
name: 'دوست داشتن'
description: "رنگ دکمه های لایک"
email:
+ title: "رایانامه ها "
settings: "تنظیمات"
+ templates: "قالب ها"
preview_digest: "پیشنمایش خلاصه"
sending_test: "فرستادن ایمیل آزمایشی..."
error: "خطا - %{server_error}"
test_error: "در ارسال ایمیل آزمایشی مشکلی وجود داشته است. لطفاً مجدداً تنظیمات ایمیل خود را بررسی کنید، از این که هاستتان اتصالات ایمیل را مسدود نکرده اطمینان حاصل کرده و مجدداً تلاش کنید."
sent: "فرستاده شده"
skipped: "رد داده شده"
+ received: "دریافت شده"
+ rejected: "رد شده"
sent_at: "ارسال شده در"
time: "زمان"
user: "کاربر"
@@ -1869,6 +1861,8 @@ fa_IR:
last_seen_user: "آخرین مشاهده کاربر :"
reply_key: "کلید پاسخ"
skipped_reason: "رد دادن دلیل"
+ incoming_emails:
+ from_address: "از طرف"
logs:
none: "هیچ آماری یافت نشد."
filters:
@@ -2022,7 +2016,6 @@ fa_IR:
suspend_reason: "دلیل"
suspended_by: "تعلیق شده توسط"
delete_all_posts: "پاک کردن همهٔ نوشتهها"
- delete_all_posts_confirm: "شما می خواهید تعداد %{posts} نوشته و تعداد %{topics} موضوع خذف کنید،آیا مطمئن هستید؟"
suspend: "تعلیق"
unsuspend: "خارج کردن از تعلیق"
suspended: "تعلیق شد ؟"
@@ -2103,7 +2096,6 @@ fa_IR:
unlock_trust_level: "باز کردن سطح اعتماد"
tl3_requirements:
title: "شرایط لازم برای سطح اعتماد 3."
- table_title: "در %{time_period} روز گذشته:"
value_heading: "مقدار"
requirement_heading: "نیازمندیها"
visits: "بازدیدها"
diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml
index 7db412545ed..76302a9aec3 100644
--- a/config/locales/client.fi.yml
+++ b/config/locales/client.fi.yml
@@ -48,9 +48,6 @@ fi:
x_seconds:
one: "1 s"
other: "%{count} s"
- less_than_x_minutes:
- one: "< 1 min"
- other: "< %{count} min"
x_minutes:
one: "1 min"
other: "%{count} min"
@@ -139,6 +136,7 @@ fi:
enabled: 'listasi %{when}'
disabled: 'poisti listauksista %{when}'
topic_admin_menu: "ketjun ylläpitotoimet"
+ wizard_required: "Konfiguroidaan foorumisi! Aloita ohjattu asennus!"
emails_are_disabled: "Ylläpitäjä on estänyt kaiken lähtevän sähköpostiliikenteen. Mitään sähköposti-ilmoituksia ei lähetetä."
bootstrap_mode_enabled: "Jotta uuden palsta käynnistäminen olisi helpompaa, on sivusto asetettu aloitustilaan. Kaikki uudet käyttäjät siirretään automaattisesti luottamustasolle 1 ja heille lähetetään sähköpostitiivistelmät päivittäin. Tämä tila poistetaan automaattisesti, kun käyttäjien määrä ylittää %{min_users}."
bootstrap_mode_disabled: "Aloitustila poistetaan seuraavan 24 tunnin aikana."
@@ -323,28 +321,68 @@ fi:
total_rows:
one: "1 käyttäjä"
other: "%{count} käyttäjää"
+ group_histories:
+ actions:
+ change_group_setting: "Muuta ryhmän asetusta"
+ add_user_to_group: "Lisää käyttäjä"
+ remove_user_from_group: "Poista käyttäjä"
+ make_user_group_owner: "Myönnä isännyys"
+ remove_user_as_group_owner: "Peru isännyys"
groups:
+ logs:
+ title: "Lokit"
+ when: "Milloin"
+ action: "Toiminta"
+ acting_user: "Toimiva käyttäjä"
+ target_user: "Kohdekäyttäjä"
+ subject: "Aihe"
+ details: "Yksityiskohdat"
+ edit:
+ title: 'Muuta ryhmää'
+ full_name: 'Täysimittainen nimi'
+ add_members: "Lisää jäseniä"
+ delete_member_confirm: "Poista '%{username}' ryhmästä '%{group}'?"
+ request_membership_pm:
+ title: "Jäsenhakemus"
+ body: "Haluaisin ryhmään @%{groupName}."
+ name_placeholder: "Ryhmän nimi. Ei välilyöntejä, samat säännöt kuin käyttäjänimillä"
+ public: "Salli jäsenten liittyä/poistua ryhmästä vapaasti (ryhmän tulee olla näkyvillä)"
empty:
- posts: "Ryhmän jäsenet eivät ole kirjoittaneet viestejä."
- members: "Kukaan ei kuulu tähän ryhmään."
+ posts: "Ryhmän jäsenet eivät ole lähettäneet viestejä."
+ members: "Ryhmässä ei ole jäseniä."
mentions: "Ryhmää ei ole mainittu."
- messages: "Tällä ryhmällä ei ole yksityistä ketjua."
- topics: "Ryhmän jäsenet eivät ole aloittaneet ketjuja."
+ messages: "Ryhmälle ei ole yksityisviestejä."
+ topics: "Ryhmän jäsenet eivät ole luoneet ketjuja."
+ logs: "Ryhmälle ei ole lokitietoja."
add: "Lisää"
+ join: "Liity ryhmään"
+ leave: "Poistu ryhmästä"
+ request: "Hae ryhmään"
+ automatic_group: Automaattinen ryhmä
+ closed_group: Suljettu ryhmä
+ is_group_user: "Olet tämän ryhmän jäsen"
+ allow_membership_requests: "Salli käyttäjien lähettää jäsenhakemuksia ryhmien isännille (vaatii että kaikki voivat mainita ryhmän)"
+ membership: "Jäsenyys"
+ name: "Nimi"
+ user_count: "Jäsenmäärä"
+ bio: "Tietoa ryhmästä"
selector_placeholder: "Lisää jäseniä"
owner: "omistaja"
visible: "Ryhmä näkyy kaikille käyttäjille"
- index: "Ryhmät"
+ index:
+ title: "Ryhmät"
+ empty: "Näkyvillä olevia ryhmiä ei ole."
title:
one: "ryhmä"
other: "ryhmät"
+ activity: "Toiminta"
members: "Jäsenet"
topics: "Ketjut"
posts: "Viestit"
- mentions: "Viittaukset"
+ mentions: "Maininnat"
messages: "Viestit"
alias_levels:
- title: "Ketkä voivat lähettää viestejä tälle ryhmälle tai @viitata siihen?"
+ title: "Ketkä voivat lähettää viestejä tälle ryhmälle tai @mainita sen?"
nobody: "Ei kukaan"
only_admins: "Vain ylläpitäjät"
mods_and_admins: "Vain ylläpitäjät ja valvojat"
@@ -358,7 +396,7 @@ fi:
title: "Tarkkaillut"
description: "Saat ilmoituksen uusista viesteistä jokaisessa viestiketjussa, ja uusien vastausten lukumäärä näytetään."
watching_first_post:
- title: "Tarkkaillaan uusia ketjuja"
+ title: "Tarkkaile uusia ketjuja"
description: "Saat ilmoituksen vain ketjujen ensimmäisistä viesteistä tässä ryhmässä."
tracking:
title: "Seurannassa"
@@ -369,6 +407,15 @@ fi:
muted:
title: "Vaimennetut"
description: "Et saa ilmoituksia uusista ketjuista tässä ryhmässä."
+ flair_url: "Avatarpinssin kuva"
+ flair_url_placeholder: "(Valinnainen) kuvan URL tai Font Awesome -luokka"
+ flair_bg_color: "Avatar-pinssin taustaväri"
+ flair_bg_color_placeholder: "(Valinnainen) värin Hex-arvo"
+ flair_color: "Avatarpinssin väri"
+ flair_color_placeholder: "(Valinnainen) värin Hex-arvo"
+ flair_preview_icon: "Ikonin esikatselu"
+ flair_preview_image: "Kuvan esikatselu"
+ flair_note: "Huom. Käyttäjän ensisijainen ryhmä määrää pinssin."
user_action_groups:
'1': "Annetut tykkäykset"
'2': "Saadut tykkäykset"
@@ -376,7 +423,7 @@ fi:
'4': "Ketjut"
'5': "Vastauksia"
'6': "Vastaukset"
- '7': "Viittaukset"
+ '7': "Maininnat"
'9': "Lainaukset"
'11': "Muokkaukset"
'12': "Lähetetyt"
@@ -402,14 +449,12 @@ fi:
latest_by: "tuorein"
toggle_ordering: "vaihda järjestystä"
subcategories: "Tytäralueet"
- topic_stats: "Uusien ketjujen lukumäärä."
+ topic_sentence:
+ one: "1 ketju"
+ other: "%{count} ketjua"
topic_stat_sentence:
one: "%{count} uusi ketju viimeisen %{unit} aikana."
other: "%{count} uutta ketjua viimeisen %{unit} aikana."
- post_stats: "Uusien viestien lukumäärä."
- post_stat_sentence:
- one: "%{count} uusi viesti viimeisen %{unit} aikana."
- other: "%{count} uutta viestiä viimeisen %{unit} aikana."
ip_lookup:
title: IP osoitteen haku
hostname: Isäntänimi
@@ -432,7 +477,11 @@ fi:
profile: "Profiili"
mute: "Vaimenna"
edit: "Muokkaa asetuksia"
- download_archive: "Lataa viestini"
+ download_archive:
+ button_text: "Lataa viestini"
+ confirm: "Haluatko varmasti ladata viestisi?"
+ success: "Lataus aloitettu. Saat ilmoituksen yksityisviestinä, kun prosessi on valmis."
+ rate_limit_error: "Viestit voi ladata kerran vuorokaudessa. Yritä huomenna uudelleen."
new_private_message: "Uusi viesti"
private_message: "Viesti"
private_messages: "Viestit"
@@ -456,6 +505,7 @@ fi:
each_browser_note: "Huom: Sinun täytyy vaihtaa tämä asetus kaikissa selaimista, joita käytät."
dismiss_notifications: "Unohda kaikki"
dismiss_notifications_tooltip: "Merkitse kaikki lukemattomat ilmoitukset luetuiksi"
+ first_notification: "Ensimmäinen ilmoitus sinulle! Valitse se niin aloitetaan."
disable_jump_reply: "Älä siirry uuteen viestiini lähetettyäni sen"
dynamic_favicon: "Näytä uusien / päivittyneiden ketjujen määrä selaimen ikonissa"
external_links_in_new_tab: "Avaa sivuston ulkopuoliset linkit uudessa välilehdessä"
@@ -473,11 +523,12 @@ fi:
mailing_list_mode:
label: "Postituslistatila"
enabled: "Ota käyttöön postituslistatila"
- instructions: |
+ instructions: |+
Asetus syrjäyttää koosteet tapahtumista.
Vaimennettujen ketjujen ja alueiden viestejä ei sisällytetä sähköposteihin.
daily: "Lähetä päivittäin"
individual: "Lähetä sähköpostia jokaisesta uudesta viestistä"
+ individual_no_echo: "Lähetä sähköposti jokaisesta uudesta viestistä lukuun ottamatta omiani"
many_per_day: "Lähetä minulle sähköpostia jokaisesta uudesta viestistä (noin {{dailyEmailEstimate}} päivässä)"
few_per_day: "Lähetä minulle sähköpostia jokaisesta uudesta viestistä (noin 2 päivässä)"
tag_settings: "Tunnisteet"
@@ -496,7 +547,7 @@ fi:
watched_first_post_tags: "Tarkkaillaan uusia ketjuja"
watched_first_post_tags_instructions: "Saat ilmoituksen uusista ketjuista, joilla on joku näistä tunnisteista."
muted_categories: "Vaimennetut"
- muted_categories_instructions: "Et saa imoituksia uusista viesteistä näillä alueilla, eivätkä ne näy tuoreimmissa."
+ muted_categories_instructions: "Et saa ilmoituksia uusista viesteistä näillä alueilla, eivätkä ne näy tuoreimmissa."
delete_account: "Poista tilini"
delete_account_confirm: "Oletko varma, että haluat lopullisesti poistaa käyttäjätilisi? Tätä toimintoa ei voi perua!"
deleted_yourself: "Käyttäjätilisi on poistettu."
@@ -509,9 +560,13 @@ fi:
muted_topics_link: "Näytä vaimennetut ketjut"
watched_topics_link: "Näytä tarkkaillut ketjut"
automatically_unpin_topics: "Poista kiinnitetyn ketjun kiinnitys automaattisesti, kun olen selannut sen loppuun."
+ apps: "Sovellukset"
+ revoke_access: "Peru käyttöoikeus"
+ undo_revoke_access: "Peru käyttöoikeuden peruminen"
+ api_approved: "Sallittu:"
staff_counters:
flags_given: "hyödyllistä liputusta"
- flagged_posts: "liputettuja viestejä"
+ flagged_posts: "liputettua viestiä"
deleted_posts: "poistettua viestiä"
suspensions: "hyllytyksiä"
warnings_received: "varoituksia"
@@ -568,7 +623,7 @@ fi:
title: "Sähköposti"
instructions: "Ei tule julkiseksi"
ok: "Lähetämme sinulle sähköpostin varmistukseksi."
- invalid: "Ole hyvä ja anna toimiva sähköpostiosoite"
+ invalid: "Sähköpostiosoite ei kelpaa."
authenticated: "{{provider}} on todentanut sähköpostiosoitteesi"
frequency_immediately: "Saat sähköpostia välittömästi, jollet ole jo lukenut asiaa, jota sähköpostiviesti koskee."
frequency:
@@ -597,6 +652,7 @@ fi:
title: "Käyttöliittymän kieli"
instructions: "Käyttöliittymän kieli. Kieli vaihtuu sivun uudelleen lataamisen yhteydessä."
default: "(oletus)"
+ any: "mikä tahansa"
password_confirmation:
title: "Salasana uudelleen"
last_posted: "Viimeisin viesti"
@@ -630,7 +686,7 @@ fi:
every_two_weeks: "joka toinen viikko"
include_tl0_in_digests: "Sisällytä uusien käyttäjien viestit sähköpostikoosteisiin"
email_in_reply_to: "Liitä sähköpostiin lyhennelmä viestistä, johon vastataan"
- email_direct: "Lähetä minulle sähköposti, jos joku lainaa viestiäni, vastaa viestiini, viittaa @nimeeni, tai kutsuu minut viestiketjuun"
+ email_direct: "Lähetä minulle sähköposti, jos joku lainaa viestiäni, vastaa viestiini, maintsee @nimeni tai kutsuu minut viestiketjuun"
email_private_messages: "Lähetä minulle sähköposti, kun joku lähettää minulle viestin"
email_always: "Lähetä sähköposti-ilmoitukset, vaikka olen aktiivinen palstalla."
other_settings: "Muut"
@@ -654,6 +710,7 @@ fi:
after_4_minutes: "4 minuutin jälkeen"
after_5_minutes: "5 minuutin jälkeen"
after_10_minutes: "10 minuutin jälkeen"
+ notification_level_when_replying: "Kun kirjoitan ketjuun, aseta se "
invited:
search: "kirjoita etsiäksesi kutsuja..."
title: "Kutsut"
@@ -684,13 +741,12 @@ fi:
account_age_days: "Tilin ikä päivissä"
create: "Lähetä kutsu"
generate_link: "Kopioi kutsulinkki"
- generated_link_message: '
Kutsulinkin kopiointi onnistui!
Kutsulinkki kelpaa vain tällä sähköpostiosoitteella: %{invitedEmail}
' + link_generated: "Kutsulinkki luotiin onnistuneesti!" + valid_for: "Kutsulinkki on käypä tälle sähköpostiosoitteelle: %{email}" bulk_invite: - none: "Et ole kutsunut vielä ketään. Voit lähettää yksittäisiä kutsuja tai kutsua useita ihmisiä kerralla lähettämällä massakutsun tiedostosta." + none: "Et ole kutsunut vielä ketään tänne. Voit lähettää yksittäisiä kutsuja tai kutsua joukon ihmisiä kerralla lataamalla CSV-tiedoston." text: "Lähetä massakutsu tiedostosta" - uploading: "Lähettää..." success: "Tiedoston lähettäminen onnistui. Saat viestin, kun prosessi on valmis." - error: "Tiedoston '{{filename}}' lähetyksen aikana tapahtui virhe: {{message}}" password: title: "Salasana" too_short: "Salasanasi on liian lyhyt." @@ -730,14 +786,14 @@ fi: top_topics: "Parhaat ketjut" no_topics: "Ei avattuja ketjuja toistaiseksi." more_topics: "Lisää ketjuja" - top_badges: "Parhaat arvomerkit" - no_badges: "Ei arvomerkkejä toistaiseksi." - more_badges: "Lisää arvomerkkejä" + top_badges: "Parhaat ansiomerkit" + no_badges: "Ei ansiomerkkejä toistaiseksi." + more_badges: "Lisää ansiomerkkejä" top_links: "Suosituimmat linkit" no_links: "Ei linkkejä toistaiseksi." most_liked_by: "Eniten tykkäyksiä saatu" most_liked_users: "Eniten tykkäyksiä annettu" - most_replied_to_users: "Useiten vastannut" + most_replied_to_users: "Useimmin vastannut" no_likes: "Ei tykkäyksiä toistaiseksi." associated_accounts: "Kirjautumiset" ip_address: @@ -788,12 +844,14 @@ fi: too_few_topics_notice: "Laitetaanpa keskustelu alulle! Tällä hetkellä palstalla on %{currentTopics} / %{requiredTopics} ketjua. Uusia kävijöitä varten tarvitaan keskusteluita, joita voivat lukea ja joihin vastata." too_few_posts_notice: "Laitetaanpa keskustelu alulle! Tällä hetkellä palstalla on %{currentPosts} / %{requiredPosts} viestiä. Uusia kävijöitä varten tarvitaan keskusteluita, joita voivat lukea ja joihin vastata." logs_error_rate_notice: - reached: "[%{relativeAge}] Virheiden määrä %{rate} on saavuttanut sivuston asetuksissa määritellyn rajan %{siteSettingRate}." - exceeded: "[%{relativeAge}] Virheiden määrä %{rate} on ylittänyt sivuston asetuksissa määritellyn rajan %{siteSettingRate}." + reached: "%{relativeAge} – %{rate} saavutti sivuston asetuksissa määritellyn rajan %{siteSettingRate}." + exceeded: "%{relativeAge} – %{rate} ylittää sivuston asetuksissa määritellyn rajan %{siteSettingRate}." rate: one: "1 virhe/%{duration}" other: "%{count} virhettä/%{duration}" learn_more: "opi lisää..." + all_time: 'yhteensä' + all_time_desc: 'ketjuja luotu yhteensä' year: 'vuosi' year_desc: 'viimeisen 365 päivän aikana luodut ketjut' month: 'kuukausi' @@ -840,6 +898,7 @@ fi: trust_level: 'Luottamustaso' search_hint: 'käyttäjätunnus, sähköposti tai IP-osoite' create_account: + disclaimer: "Rekisteröitymällä hyväksyt sivuston rekisteriselosteen ja käyttöehdot." title: "Luo uusi tunnus" failed: "Jotain meni pieleen. Ehkäpä tämä sähköpostiosoite on jo rekisteröity, kokeile salasana unohtui -linkkiä." forgot_password: @@ -860,7 +919,7 @@ fi: email_placeholder: "sähköposti tai käyttäjätunnus" caps_lock_warning: "Caps Lock on päällä" error: "Tuntematon virhe" - rate_limit: "Ole hyvä ja odota hetki ennen kuin yrität kirjautua uudelleen." + rate_limit: "Odota hetki ennen kuin yrität kirjautua uudelleen." blank_username_or_password: "Kirjoita sähköpostiosoite tai käyttäjänimi ja salasana." reset_password: 'Uusi salasana' logging_in: "Kirjaudutaan..." @@ -873,7 +932,7 @@ fi: not_allowed_from_ip_address: "Kirjautuminen estetty tästä IP-osoitteesta." admin_not_allowed_from_ip_address: "Et voi kirjautua ylläpitäjänä tästä IP-osoitteesta." resend_activation_email: "Klikkaa tästä lähettääksesi vahvistusviestin uudelleen." - sent_activation_email_again: "Lähetimme uuden vahvistusviestin sinulle osoitteeseen {{sentTo}}. Viestin saapumisessa voi kestää muutama minuutti, muista tarkastaa myös roskapostikansio." + sent_activation_email_again: "Lähetimme uuden vahvistusviestin sinulle osoitteeseen {{currentEmail}}. Viestin saapumisessa voi kestää muutama minuutti; muista tarkastaa myös roskapostikansio." to_continue: "Ole hyvä ja kirjaudu sisään" preferences: "Sinun täytyy olla kirjautuneena sisään muokataksesi tilisi asetuksia" forgot: "En muista käyttäjätilini tietoja" @@ -904,6 +963,10 @@ fi: twitter: "Twitter" emoji_one: "Emoji One" win10: "Win10" + category_page_style: + categories_only: "Vain alueet" + categories_with_featured_topics: "Alueet, joiden yhteydessä ketjuja" + categories_and_latest_topics: "Alueet ja tuoreimmat ketjut" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' @@ -913,15 +976,22 @@ fi: more_emoji: "lisää..." options: "Asetukset" whisper: "kuiskaus" + unlist: "listaamaton" add_warning: "Tämä on virallinen varoitus." toggle_whisper: "Vaihda kuiskaus" + toggle_unlisted: "Listauksissa näkyminen" posting_not_on_topic: "Mihin ketjuun haluat vastata?" saving_draft_tip: "tallennetaan..." saved_draft_tip: "tallennettu" saved_local_draft_tip: "tallennettu omalla koneella" similar_topics: "Tämä ketju vaikuttaa samalta kuin.." drafts_offline: "offline luonnokset" - group_mentioned: "Jos viittaat ryhmään {{group}}, {{count}} käyttäjää saa ilmoituksen – oletko varma?" + group_mentioned: + one: "Jos mainitset ryhmän {{group}}, 1 käyttäjä saa ilmoituksen – oletko varma?" + other: "Jos mainitset ryhmän {{group}}, {{count}} käyttäjää saa ilmoituksen – oletko varma?" + cannot_see_mention: + category: "Mainitsit käyttäjän {{username}} mutta hän ei saa ilmoitusta, koska hänellä ei ole pääsyä tälle alueelle. Hänet tulee lisätä ryhmään, jolla on pääsy alueelle." + private: "Mainitsit käyttäjän {{username}} mutta hän ei saa ilmoitusta, koska hän ei näe tätä yksityiskeskustelua. Hänet tulee kutsua tähän yksityiskeskusteluun." duplicate_link: "Näyttää siltä, että @{{username}} on jo lähettänyt saman linkin kohteeseen {{domain}} ketjun aiemmassa viestissä {{ago}} – oletko varma, että haluat lähettää sen uudestaan?" error: title_missing: "Otsikko on pakollinen" @@ -941,19 +1011,23 @@ fi: title: "Tai paina Ctrl+Enter" users_placeholder: "Lisää käyttäjä" title_placeholder: "Kuvaile lyhyesti mistä tässä ketjussa on kyse?" + title_or_link_placeholder: "Kirjoita otsikko tai liitä linkki tähän" edit_reason_placeholder: "miksi muokkaat viestiä?" show_edit_reason: "(lisää syy muokkaukselle)" + topic_featured_link_placeholder: "Tähän linkki, joka näytetään otsikon yhteydessä." reply_placeholder: "Kirjoita tähän. Käytä Markdownia, BBCodea tai HTML:ää muotoiluun. Raahaa tai liitä kuvia." view_new_post: "Katsele uutta viestiäsi." saving: "Tallennetaan" saved: "Tallennettu!" - saved_draft: "Viestiluonnos kesken. Klikkaa tähän jatkaaksesi." + saved_draft: "Viestiluonnos kesken. Jatka klikkaamalla tästä." uploading: "Lähettää..." show_preview: 'näytä esikatselu »' hide_preview: '« piilota esikatselu' quote_post_title: "Lainaa koko viesti" + bold_label: "B" bold_title: "Lihavoitu" bold_text: "lihavoitu teksti" + italic_label: "I" italic_title: "Kursiivi" italic_text: "kursivoitu teksti" link_title: "Hyperlinkki" @@ -971,6 +1045,7 @@ fi: olist_title: "Numeroitu lista" ulist_title: "Luettelomerkillinen luettelo" list_item: "Listan alkio" + heading_label: "H" heading_title: "Otsikko" heading_text: "Otsikko" hr_title: "Vaakaviiva" @@ -979,10 +1054,13 @@ fi: modal_ok: "OK" modal_cancel: "Peruuta" cant_send_pm: "Et voi lähettää viestiä käyttäjälle %{username}." + yourself_confirm: + title: "Unohditko lisätä vastaanottajia?" + body: "Olet lähettämässä viestiä vain itsellesi!" admin_options_title: "Tämän ketjun vain henkilökunnalle näytettävät asetukset" auto_close: label: "Sulje ketju automaattisesti tämän ajan jälkeen:" - error: "Ole hyvä ja syötä kelpaava arvo." + error: "Arvo ei kelpaa." based_on_last_post: "Älä sulje ennen kuin viimeisin viesti ketjussa on vähintään näin vanha." all: examples: 'Syötä aika tunteina (24), absoluuttisena aikana (17:30) tai aikaleimana (2013-11-22 14:00).' @@ -1012,13 +1090,13 @@ fi: invitee_accepted: "
{{username}} hyväksyi kutsusi
" moved_post: "
{{username}} siirsi {{description}}
" linked: "
{{username}} {{description}}
" - granted_badge: "
Ansaitsit '{{description}}'
" + granted_badge: "
Ansaitsit '{{description}}'
" watching_first_post: "
Uusi ketju {{description}}
" group_message_summary: one: "
{{count}} viesti ryhmän {{group_name}} saapuneissa
" other: "
{{count}} viestiä ryhmän {{group_name}} saapuneissa
" alt: - mentioned: "Viittaaja" + mentioned: "Mainitsija" quoted: "Lainaaja" replied: "Vastasi" posted: "Kirjoittaja" @@ -1030,7 +1108,7 @@ fi: invitee_accepted: "Kutsun hyväksyi" moved_post: "Viestisi siirsi" linked: "Linkki viestiisi" - granted_badge: "Arvomerkki myönnetty" + granted_badge: "Ansiomerkki myönnetty" group_message_summary: "Viestejä ryhmän saapuneissa viesteissä." popup: mentioned: '{{username}} mainitsi sinut ketjussa "{{topic}}" - {{site_title}}' @@ -1062,13 +1140,13 @@ fi: most_liked: "Tykätyin" select_all: "Valitse kaikki" clear_all: "Tyhjennä kaikki" + too_short: "Hakusana on liian lyhyt." 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." - search_help: Haun ohje searching: "Etsitään ..." post_format: "#{{post_number}} käyttäjältä {{username}}" context: @@ -1076,13 +1154,54 @@ fi: category: "Etsi alueelta #{{category}}" topic: "Etsi tästä ketjusta" private_messages: "Etsi viesteistä" - hamburger_menu: "siirry toiseen ketjuun tai alueelle" + advanced: + title: Tarkennettu haku + posted_by: + label: Kirjoittaja + in_category: + label: Alue + in_group: + label: Kirjoittajan ryhmä + with_badge: + label: Kirjoittajalla ansiomerkki + with_tags: + label: Tunniste + filters: + label: Tuloksiin vain ketjuja/viestejä, ... + likes: joista olen tykännyt + posted: joihin olen kirjoittanut + watching: joita tarkkailen + tracking: joita seuraan + private: jotka ovat yksityisviesteistäni + bookmarks: jotka olen lisännyt kirjanmerkkeihini + first: jotka ovat ketjun avausviestejä + pinned: jotka on kiinnitettyjä + unpinned: jotka eivät ole kiinnitettyjä + wiki: ovat wiki-viestejä + statuses: + label: Ketju/Ketjuun + open: on avoin + closed: on suljettu + archived: on arkistoitu + noreplies: ei ole vastattu + single_user: on kirjoittanut vain yksi käyttäjä + post: + count: + label: Viestejä vähintään + time: + label: Kirjoitettu + before: ennen + after: jälkeen + hamburger_menu: "vaihda ketjulistausta tai siirry toiselle alueelle" new_item: "uusi" go_back: 'mene takaisin' 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' topics: + new_messages_marker: "edellinen vierailu" bulk: + select_all: "Valitse kaikki" + clear_all: "Tyhjennä kaikki" unlist_topics: "Poista ketjuja listauksista" reset_read: "Palauta lukutila" delete: "Poista ketjut" @@ -1117,7 +1236,7 @@ fi: top: "Huippuketjuja ei ole." search: "Hakutuloksia ei löytynyt." educate: - new: '
Uuden ketjut näytetään tässä.
Ketjut tulkitaan uusiksi ja niiden yhteydessä näytetään uusi-merkki, kun ne on luotu edellisen kahden päivän aikana.
Voit muuttaa tätä käyttäjäasetuksistasi.
' + new: '
Sinulle uudet ketjut näytetään tässä.
Ketjut tulkitaan uusiksi ja niiden yhteydessä näytetään uusi-merkintä, jos ne on luotu edellisten kahden päivän aikana.
Aikarajaa voit muuttaa käyttäjäasetuksissasi.
' unread: '
Lukemattomia viestejä sisältävät ketjut näytetään tässä.
Ketjun yhteydessä näytetään lukemattomien viestien lukumäärä 1 jos olet:
tai, jos olet erikseen merkannut ketjun seurattavaksi tai tarkkailtavaksi ketjun lopusta löytyvästä painikkeesta.
Voit muuttaa tätä käyttäjäasetuksistasi.
'
bottom:
latest: "Tuoreimpia ketjuja ei ole enempää."
@@ -1134,7 +1253,9 @@ fi:
unsubscribe:
stop_notifications: "Saat tästä lähtien vähemmän ilmoituksia aiheesta {{title}}"
change_notification_state: "Nykyinen ilmoitusasetuksesti on"
- filter_to: "{{post_count}} viestiä ketjussa"
+ filter_to:
+ one: "1 viesti ketjussa"
+ other: "{{count}} viestiä ketjussa"
create: 'Uusi ketju'
create_long: 'Luo uusi ketju'
private_message: 'Luo viesti'
@@ -1194,11 +1315,12 @@ fi:
auto_close_title: 'Automaattisen sulkemisen asetukset'
auto_close_save: "Tallenna"
auto_close_remove: "Älä sulje tätä ketjua automaattisesti"
- auto_close_immediate: "Viimeisin viesti tässä ketjussa on jo %{hours} tuntia vanha, joten ketju suljetaan heti."
+ auto_close_immediate:
+ one: "Ketjun viimeisin viesti on jo tunnin vanha, joten ketju suljetaan heti."
+ other: "Ketjun viimeisin viesti on jo %{hours} tuntia vanha, joten ketju suljetaan heti."
timeline:
back: "Takaisin"
back_description: "Siirry takaisin viimeisimpään lukemattomaan viestiin"
- replies: "%{current} / %{total} vastausta"
replies_short: "%{current} / %{total}"
progress:
title: ketjun edistyminen
@@ -1206,12 +1328,12 @@ fi:
go_bottom: "loppuun"
go: "siirry"
jump_bottom: "hyppää viimeisimpään viestiin"
- jump_prompt: "hyppää viestiin"
+ jump_prompt: "hyppää..."
+ jump_prompt_of: "%{count} viestistä"
jump_prompt_long: "Mihin viestiin haluat siirtyä?"
jump_bottom_with_number: "hyppää viestiin %{post_number}"
total: yhteensä viestejä
current: tämänhetkinen viesti
- position: "viesti %{current} / %{total}"
notifications:
title: muuta sitä, kuinka usein saat muistutuksia tästä ketjusta
reasons:
@@ -1286,6 +1408,9 @@ fi:
share:
title: 'Jaa'
help: 'jaa linkki tähän ketjuun'
+ print:
+ title: 'Tulosta'
+ help: 'Avaa tulostettava versio tästä ketjusta'
flag_topic:
title: 'Liputa'
help: 'liputa tämä ketju tai lähetä siitä yksityinen ilmoitus valvojalle'
@@ -1362,8 +1487,8 @@ fi:
action: "siirrä olemassa olevaan ketjuun"
error: "Viestien siirtämisessä ketjuun tapahtui virhe."
instructions:
- one: "Valitse ketju, johon haluat siirtää viestin."
- other: "Valitse ketju, johon haluat siirtää{{count}} viestiä."
+ one: "Valitse ketju, johon haluat siirtää valitun viestin."
+ other: "Valitse ketju, johon haluat siirtää valitut {{count}} viestiä."
merge_posts:
title: "Yhdistä valitut viestit"
action: "yhdistä valitut viestit"
@@ -1398,7 +1523,7 @@ fi:
post:
reply: " {{replyAvatar}} {{usernameLink}}"
reply_topic: " {{link}}"
- quote_reply: "lainaa"
+ quote_reply: "Lainaa"
edit: "Muokataan {{link}} {{replyAvatar}} {{username}}"
edit_reason: "Syy:"
post_number: "viesti {{number}}"
@@ -1415,7 +1540,6 @@ fi:
gap:
one: "näytä 1 piilotettu vastaus"
other: "näytä {{count}} piilotettua vastausta"
- more_links: "{{count}} lisää..."
unread: "Viesti on lukematta"
has_replies:
one: "{{count}} vastaus"
@@ -1437,7 +1561,7 @@ fi:
file_too_large: "Pahoittelut, tiedosto jonka latausta yritit on liian suuri (suurin tiedostokoko on {{max_size_kb}}kb). Mitäpä jos lataisit tiedoston johonkin pilvipalveluun ja jakaisit täällä siihen linkin?"
too_many_uploads: "Pahoittelut, voit ladata vain yhden tiedoston kerrallaan."
too_many_dragged_and_dropped_files: "Pahoittelut, voit ladata korkeintaan 10 tiedostoa kerrallaan."
- upload_not_authorized: "Pahoittelut, tiedostomuoto ei ole sallittu (sallitut tiedostopäätteet: {{authorized_extensions}})."
+ upload_not_authorized: "Pahoittelut, tiedosto jota yrität ladata ei ole sallittu (sallitut laajennukset: {{authorized_extensions}})."
image_upload_not_allowed_for_new_user: "Pahoittelut, uudet käyttjät eivät saa ladata kuvia."
attachment_upload_not_allowed_for_new_user: "Pahoittelut, uudet käyttäjät eivät saa ladata liitteitä."
attachment_download_requires_login: "Pahoittelut, sinun täytyy kirjautua sisään voidaksesi ladata liitetiedostoja."
@@ -1484,14 +1608,6 @@ fi:
defer_flags:
one: "Lykkää lippua"
other: "Lykkää lippuja"
- it_too:
- off_topic: "Liputa sinäkin"
- spam: "Liputa sinäkin"
- inappropriate: "Liputa sinäkin"
- custom_flag: "Liputa sinäkin"
- bookmark: "Lisää oma kirjanmerkki"
- like: "Tykkää sinäkin"
- vote: "Äänestä sinäkin"
undo:
off_topic: "Peru lippu"
spam: "Peru lippu"
@@ -1611,6 +1727,7 @@ fi:
tags_allowed_tag_groups: "Tällä alueella sallitut tunnisteryhmät:"
tags_placeholder: "(Valinnainen) lista sallituista tunnisteista"
tag_groups_placeholder: "(Valinnainen) lista sallituista tunnisteryhmistä"
+ topic_featured_link_allowed: "Salli ketjulinkit tällä alueella"
delete: 'Poista alue'
create: 'Uusi alue'
create_long: 'Luo uusi alue'
@@ -1644,12 +1761,14 @@ fi:
email_in_allow_strangers: "Hyväksy viestejä anonyymeiltä käyttäjiltä joilla ei ole tiliä"
email_in_disabled: "Uusien ketjujen luominen sähköpostitse on otettu pois käytöstä sivuston asetuksissa. Salliaksesi uusien ketjujen luomisen sähköpostilla, "
email_in_disabled_click: 'ota käyttöön "email in" asetus.'
- suppress_from_homepage: "Vaimenna tämä ketju kotisivulta."
- allow_badges_label: "Salli arvomerkkien myöntäminen tältä alueelta"
+ suppress_from_homepage: "Vaimenna alue kotisivulta."
+ all_topics_wiki: "Tee uusista ketjuista wiki-viestejä oletuksena."
+ sort_order: "Oletusjärjestys:"
+ allow_badges_label: "Salli ansiomerkkien myöntäminen tältä alueelta"
edit_permissions: "Muokkaa oikeuksia"
add_permission: "Lisää oikeus"
this_year: "tänä vuonna"
- position: "arvo"
+ position: "sijainti"
default_position: "Oletuspaikka"
position_disabled: "Alueet näytetään aktiivisuusjärjestyksessä. Muokataksesi järjestystä,"
position_disabled_click: 'ota käyttöön "pysyvä aluejärjestys" asetuksista.'
@@ -1657,17 +1776,31 @@ fi:
notifications:
watching:
title: "Tarkkaile"
+ description: "Tarkkailet kaikkia ketjuja näillä alueilla. Saat ilmoituksen jokaisesta uudesta viestistä missä tahansa ketjussa, ja uusien vastausten määrä näytetään."
watching_first_post:
- title: "Tarkkaillaan uusia ketjuja"
+ title: "Tarkkaile uusia ketjuja"
description: "Saat ilmoituksen näille alueille luoduista ketjuista."
tracking:
title: "Seuraa"
+ description: "Seuraat kaikkia ketjuja näillä alueilla. Saat ilmoituksen jos joku mainitsee @nimesi tai vastaa sinulle, ja uusien vastausten määrä näytetään."
regular:
title: "Tavallinen"
description: "Saat ilmoituksen jos joku mainitsee @nimesi tai vastaa sinulle."
muted:
title: "Vaimennettu"
description: "Et saa ilmoituksia uusista ketjuista näillä alueilla, eivätkä ne näy tuoreimmissa."
+ sort_options:
+ default: "oletus"
+ likes: "Tykkäykset"
+ op_likes: "Avausviestin tykkäykset"
+ views: "Katselut"
+ posts: "Viestit"
+ activity: "Toiminta"
+ posters: "Kirjoittajat"
+ category: "Alue"
+ created: "Luomisaika"
+ sort_ascending: 'Nouseva'
+ sort_descending: 'Laskeva'
flagging:
title: 'Kiitos avustasi yhteisön hyväksi!'
action: 'Liputa viesti'
@@ -1675,7 +1808,7 @@ fi:
notify_action: 'Viesti'
official_warning: 'Virallinen varoitus'
delete_spammer: "Poista roskapostittaja"
- delete_confirm: "Olet aikeissa poistaa %{posts} viestiä ja %{topics} ketjua tältä käyttäjältä, sekä käyttäjätilin, estää tunnuksen luomisen tästä IP osoitteesta %{ip_address}, ja lisätä sähköpostiosoitteen %{email} pysyvästi estolistalle. Oletko varma, että tämä käyttäjä todella on roskapostittaja?"
+ delete_confirm_MF: "Olet poistamassa {POSTS, plural, one {1 viestin} other {# viestiä}} ja {TOPICS, plural, one {1 ketjun} other {# ketjua}} tältä käyttäjältä, poistamassa käyttäjätilin, estämässä uusien tunnusten luonnin IP-osoitteestaan {ip_address} ja lisäämässä sähköpostiosoitteensa {email} pysyvälle estolistalle. Oletko varma, että käyttäjä todella on roskapostittaja?"
yes_delete_spammer: "Kyllä, poista roskapostittaja"
ip_address_missing: "-"
hidden_email_address: "(piilotettu)"
@@ -1690,9 +1823,15 @@ fi:
custom_placeholder_notify_user: "Esitä asiasi ymmärrettäväsi, ole rakentava ja kohtelias."
custom_placeholder_notify_moderators: "Kerro ymmärrettävästi ja selvästi, mistä olet huolestunut ja lisää viestiin oleelliset esimerkit ja linkit, jos mahdollista."
custom_message:
- at_least: "kirjoita vähintään {{n}} merkkiä"
- more: "vielä {{n}}..."
- left: "{{n}} jäljellä"
+ at_least:
+ one: "syötä vähintään 1 merkki"
+ other: "syötä vähintään {{count}} merkkiä"
+ more:
+ one: "Vielä 1..."
+ other: "Vielä {{count}}..."
+ left:
+ one: "1 jäljellä"
+ other: "{{count}} jäljellä"
flagging_topic:
title: "Kiitos avustasi yhteisön hyväksi!"
action: "Liputa ketju"
@@ -1733,7 +1872,6 @@ fi:
invisible:
help: "Tämä ketju on poistettu listauksista; sitä ei näytetä ketjujen listauksissa ja siihen pääsee vain suoralla linkillä"
posts: "Viestejä"
- posts_lowercase: "viestejä"
posts_long: "tässä ketjussa on {{number}} viestiä"
posts_likes_MF: |
Tässä ketjussa on {count, plural, one {1 vastaus} other {# vastausta}} {ratio, select,
@@ -1771,7 +1909,7 @@ fi:
latest:
title: "Tuoreimmat"
title_with_count:
- one: "Tuoremmat (1)"
+ one: "Tuoreimmat (1)"
other: "Tuoreimmat ({{count}})"
help: "ketjut, joissa on viimeaikaisia viestejä"
hot:
@@ -1847,8 +1985,6 @@ fi:
readonly: "Nähdä"
lightbox:
download: "lataa"
- search_help:
- title: 'Haun ohjeet'
keyboard_shortcuts_help:
title: 'Näppäinoikotiet'
jump_to:
@@ -1900,25 +2036,26 @@ fi:
mark_regular: 'm, r Tavallinen (oletus) ketju'
mark_tracking: 'm, t Seuraa ketjua'
mark_watching: 'm, w Tarkkaile ketjua'
+ print: 'ctrl+p Tulosta ketju'
badges:
earned_n_times:
- one: "Ansaitsi tämän arvomerkin yhden kerran"
- other: "Ansaitsi tämän arvomerkin %{count} kertaa"
+ one: "Ansaitsi tämän ansiomerkin yhden kerran"
+ other: "Ansaitsi tämän ansiomerkin %{count} kertaa"
granted_on: "Myönnetty %{date}"
- others_count: "Muita, joilla on tämä arvomerkki (%{count})"
- title: Arvomerkit
+ others_count: "Muita, joilla on tämä ansiomerkki (%{count})"
+ title: Ansiomerkit
allow_title: "sallittu titteli"
multiple_grant: "myönnettävissä useaan kertaan"
badge_count:
- one: "1 Arvomerkki"
- other: "%{count} Arvomerkkiä"
+ one: "1 ansiomerkki"
+ other: "%{count} ansiomerkkiä"
more_badges:
one: "+1 Lisää"
other: "+%{count} Lisää"
granted:
one: "1 myönnetty"
other: "%{count} myönnettyä"
- select_badge_for_title: Valitse tittelisi arvomerkeistä
+ select_badge_for_title: Valitse tittelisi ansiomerkeistä
none: " Le lien d''invitation a été généré avec succès ! Le lien d''invitation est valide uniquement pour cette adresse : %{invitedEmail} {{username}} {{description}} {{username}} {{description}} {{username}} {{description}} Vos nouveaux sujets apparaissent ici. Par défaut, les sujets sont considérés comme nouveaux et affichent l''indicateur nouveau lorsqu''ils ont été créés depuis moins de 2 jours. Vous pouvez modifier cela dans vos préférences. Vos sujets non lus apparaissent ici. Par défaut, les sujets considérés comme non lus et qui affichent le nombre de messages non lus 1 sont ceux : ou que vous avez explicitement suivis ou surveillés. Vous pouvez modifier cela dans vos préférences. Vos sujets non lus apparaissent ici. Par défaut, les sujets considérés comme non lus et qui affichent le nombre de messages non lus 1 sont ceux : ou que vous avez explicitement suivis ou surveillés. Vous pouvez modifier cela dans vos préférences.
@@ -1945,13 +2082,13 @@ fr:
tagging:
all_tags: "Tous les tags"
selector_all_tags: "tous les tags"
- selector_no_tags: "aucun tags"
+ selector_no_tags: "aucun tag"
changed: "tags modifiés :"
tags: "Tags"
choose_for_topic: "choisir des tags optionnels pour ce sujet"
delete_tag: "Supprimer le tag"
delete_confirm: "Êtes-vous sûr de vouloir supprimer ce tag ?"
- rename_tag: "Renommer ce tag"
+ rename_tag: "Renommer le tag"
rename_instructions: "Choisir un nouveau nom pour ce tag :"
sort_by: "Trier par :"
sort_by_count: "nombre"
@@ -1965,7 +2102,7 @@ fr:
untagged_with_category: "%{filter} sujets non tagués dans %{category}"
notifications:
watching:
- title: "Abonné"
+ title: "Surveiller"
description: "Vous surveillerez automatiquement tous les sujets avec ce tag. Vous serez notifié de tous les nouveaux messages et sujets, et le nombre de messages non lus et nouveaux apparaîtra à côté du sujet."
watching_first_post:
title: "Surveiller les nouveaux sujets"
@@ -2000,7 +2137,7 @@ fr:
posted: "Vous n'avez écrit dans aucun sujet pour le moment."
latest: "Il n'y a pas de sujets récents."
hot: "Il n'y a pas de sujets populaires."
- bookmarks: "Vous n'avez pas encore ajouté de sujets à vos signets"
+ bookmarks: "Vous n'avez pas encore mis de signets à des sujets."
top: "Il n'y a pas de meilleurs sujets."
search: "Il n'y a pas de résultats de recherche."
bottom:
@@ -2011,7 +2148,7 @@ fr:
new: "Il n'y a plus de nouveaux sujets."
unread: "Il n'y a plus de sujets non lus."
top: "Il n'y a plus de meilleurs sujets."
- bookmarks: "Il n'y a plus de sujets dans vos signets."
+ bookmarks: "Il n'y a plus de sujets avec des signets."
search: "Il n'y a plus de résultats de recherche."
invite:
custom_message: "Rendez votre invitation plus personnelle en écrivant un"
@@ -2019,24 +2156,26 @@ fr:
custom_message_placeholder: "Entrez votre message personnalisé"
custom_message_template_forum: "Hey, tu devrais rejoindre ce forum !"
custom_message_template_topic: "Hey, je pensais que tu pourrais aimer ce sujet !"
+ safe_mode:
+ enabled: "Le mode sans échec est activé ; fermez cette fenêtre de navigateur pour le quitter"
admin_js:
- type_to_filter: "Commencez à taper pour filtrer..."
+ type_to_filter: "commencez à taper pour filtrer…"
admin:
title: 'Administrateur'
moderator: 'Modérateur'
dashboard:
title: "Tableau de bord"
last_updated: "Tableau de bord actualisé le :"
- version: "Version de Discourse"
- up_to_date: "Vous utilisez la dernière version de Discourse."
+ version: "Version"
+ up_to_date: "À jour !"
critical_available: "Une mise à jour critique est disponible."
updates_available: "Des mises à jour sont disponibles."
please_upgrade: "Veuillez mettre à jour !"
no_check_performed: "Une vérification des mises à jour n'a pas été effectuée. Vérifiez que sidekiq est en cours d'exécution."
stale_data: "Une vérification des mises à jour n'a pas été effectuée récemment. Vérifiez que sidekiq est en cours d'exécution."
- version_check_pending: "On dirait que vous avez fait une mise à jour récemment. Fantastique!"
- installed_version: "Version installée"
- latest_version: "Dernière version"
+ version_check_pending: "On dirait que vous avez récemment fait une mise à jour. Super !"
+ installed_version: "Installée"
+ latest_version: "Dernière"
problems_found: "Quelques problèmes ont été trouvés dans votre installation de Discourse :"
last_checked: "Dernière vérification"
refresh_problems: "Rafraîchir"
@@ -2044,24 +2183,24 @@ fr:
moderators: 'Modérateurs :'
admins: 'Administateurs :'
blocked: 'Bloqués :'
- suspended: 'Suspendu :'
+ suspended: 'Suspendus :'
private_messages_short: "Msgs"
private_messages_title: "Messages"
mobile_title: "Mobile"
space_free: "{{size}} libre"
- uploads: "téléchargements"
+ uploads: "fichiers envoyés"
backups: "sauvegardes"
traffic_short: "Trafic"
traffic: "Requêtes Web Application"
page_views: "Requêtes API"
page_views_short: "Requêtes API"
- show_traffic_report: "Voir rapport de trafic détaillé"
+ show_traffic_report: "Afficher le rapport de trafic détaillé"
reports:
today: "Aujourd'hui"
yesterday: "Hier"
- last_7_days: "les 7 derniers jours"
- last_30_days: "les 30 derniers jours"
- all_time: "depuis toujours"
+ last_7_days: "Les 7 derniers jours"
+ last_30_days: "Les 30 derniers jours"
+ all_time: "Depuis toujours"
7_days_ago: "il y a 7 jours"
30_days_ago: "il y a 30 jours"
all: "Tous"
@@ -2072,30 +2211,30 @@ fr:
end_date: "Date de fin"
groups: "Tous les groupes"
commits:
- latest_changes: "Dernières modifications: merci de mettre à jour régulièrement!"
+ latest_changes: "Dernières modifications : veuillez mettre à jour régulièrement !"
by: "par"
flags:
title: "Signalements"
- old: "Ancien"
+ old: "Anciens"
active: "Actifs"
agree: "Accepter"
- agree_title: "Confirme que le signalement est correct et valide."
- agree_flag_modal_title: "Accepter et..."
+ agree_title: "Confirmer que le signalement est valide et correcte"
+ agree_flag_modal_title: "Accepter et…"
agree_flag_hide_post: "Accepter (cacher le message + envoi d'un MP)"
agree_flag_hide_post_title: "Masquer ce message et envoyer automatiquement un message à l'utilisateur afin qu'il le modifie rapidement"
- agree_flag_restore_post: "Accepter (restauré le message)"
+ agree_flag_restore_post: "Accepter (rétablir le message)"
agree_flag_restore_post_title: "Restaurer ce message"
agree_flag: "Accepter le signalement"
agree_flag_title: "Accepter le signalement et garder le message inchangé"
defer_flag: "Reporter"
- defer_flag_title: "Retirer le signalement; il ne requière pas d'action pour le moment."
+ defer_flag_title: "Retirer le signalement ; il ne nécessite aucune action pour le moment."
delete: "Supprimer"
delete_title: "Supprimer le message signalé."
delete_post_defer_flag: "Supprimer le message et reporter le signalement"
- delete_post_defer_flag_title: "Supprimer le message; si c'est le premier message, le sujet sera supprimé"
+ delete_post_defer_flag_title: "Supprimer le message ; si c'est le premier message, le sujet sera supprimé"
delete_post_agree_flag: "Supprimer le message et accepter le signalement"
- delete_post_agree_flag_title: "Supprimer le message; si c'est le premier message, le sujet sera supprimé"
- delete_flag_modal_title: "Supprimer et..."
+ delete_post_agree_flag_title: "Supprimer le message ; si c'est le premier message, le sujet sera supprimé"
+ delete_flag_modal_title: "Supprimer et…"
delete_spammer: "Supprimer le spammer"
delete_spammer_title: "Supprimer cet utilisateur et tous ses messages et sujets de ce dernier."
disagree_flag_unhide_post: "Refuser (ré-afficher le message)"
@@ -2104,21 +2243,21 @@ fr:
disagree_flag_title: "Refuser le signalement car il est invalide ou incorrect"
clear_topic_flags: "Terminer"
clear_topic_flags_title: "Ce sujet a été étudié et les problèmes ont été résolus. Cliquez sur Terminer pour enlever les signalements."
- more: "(plus de réponses...)"
+ more: "(plus de réponses…)"
dispositions:
agreed: "accepté"
disagreed: "refusé"
deferred: "reporté"
flagged_by: "Signalé par"
resolved_by: "Résolu par"
- took_action: "Prendre une mesure"
+ took_action: "Intervenu"
system: "Système"
error: "Quelque chose s'est mal passé"
reply_message: "Répondre"
- no_results: "Il n'y a aucun signalements."
+ no_results: "Il n'y a aucun signalement."
topic_flagged: "Ce sujet a été signalé."
visit_topic: "Consulter le sujet pour intervenir"
- was_edited: "Le message a été édité après le premier signalement"
+ was_edited: "Le message a été modifié après le premier signalement"
previous_flags_count: "Ce message a déjà été signalé {{count}} fois."
summary:
action_type_3:
@@ -2137,25 +2276,22 @@ fr:
one: "spam"
other: "spam x{{count}}"
groups:
- primary: "Groupe primaire"
- no_primary: "(pas de groupe primaire)"
+ primary: "Groupe principal"
+ no_primary: "(pas de groupe principal)"
title: "Groupes"
- edit: "Éditer les groupes"
+ edit: "Modifier les groupes"
refresh: "Actualiser"
new: "Nouveau"
selector_placeholder: "entrer le pseudo"
- name_placeholder: "Nom du groupe, sans espace, mêmes règles que pour les pseudos"
about: "Modifier votre adhésion et les noms ici"
group_members: "Membres du groupe"
delete: "Supprimer"
delete_confirm: "Supprimer ce groupe ?"
delete_failed: "Impossible de supprimer le groupe. Si c'est un groupe automatique il ne peut être détruit."
- delete_member_confirm: "Enlever '%{username}' du groupe '%{group}'?"
- delete_owner_confirm: "Retirer les privilèges de propriétaire pour '%{username}' ?"
- name: "Nom"
+ delete_owner_confirm: "Retirer les privilèges de propriétaire pour %{username} ?"
add: "Ajouter"
add_members: "Ajouter des membres"
- custom: "Personnaliser"
+ custom: "Personnalisé"
bulk_complete: "Les utilisateurs ont été ajoutés au groupe"
bulk: "Ajouter au groupe en masse"
bulk_paste: "Coller une liste de pseudo ou courriel, un par ligne :"
@@ -2164,13 +2300,13 @@ fr:
automatic_membership_email_domains: "Les utilisateurs qui s'enregistrent avec un domaine courriel qui correspond exactement à un élément de cette liste seront automatiquement ajoutés à ce groupe:"
automatic_membership_retroactive: "Appliquer la même règle de domaine courriel pour les utilisateurs existants"
default_title: "Titre par défaut pour tous les utilisateurs de ce groupe"
- primary_group: "Définir comme groupe primaire automatiquement"
+ primary_group: "Définir comme groupe principal automatiquement"
group_owners: Propriétaires
add_owners: Ajouter des propriétaires
- incoming_email: "Adresse e-mail d'expédition personnalisée"
- incoming_email_placeholder: "Entrer une adresse e-mail"
+ incoming_email: "Adresse de courriel entrant personnalisée"
+ incoming_email_placeholder: "Entrer une adresse de courriel"
api:
- generate_master: "Générer une clé Maître pour l'API"
+ generate_master: "Générer une clé d'API maître"
none: "Il n'y a pas de clés API actives en ce moment."
user: "Utilisateur"
title: "API"
@@ -2181,20 +2317,90 @@ fr:
confirm_regen: "Êtes-vous sûr de vouloir remplacer cette clé API par une nouvelle ?"
confirm_revoke: "Êtes-vous sûr de vouloir révoquer cette clé ?"
info_html: "Cette clé vous permettra de créer et mettre à jour des sujets à l'aide d'appels JSON."
- all_users: "Tous les Utilisateurs"
- note_html: "Gardez cette clé secrète ! Tous les personnes qui la possède peuvent créer des messages au nom de n'import quel utilisateur."
+ all_users: "Tous les utilisateurs"
+ note_html: "Gardez cette clé secrète. Tous les utilisateurs qui la possèdent peuvent créer des messages au nom de n'importe quel utilisateur."
+ web_hooks:
+ title: "Webhooks"
+ none: "Il n'y a aucun Webhook actuellement."
+ instruction: "Les Webhooks permettent à Discourse de notifier des services externes lorsque certains événements se produisent sur votre site. Quand un Webhook est déclenché, une requête POST est envoyée aux URLs fournies."
+ detailed_instruction: "Une requête POST sera envoyée à l'URL fournie lorsque l'événement choisi se produira."
+ new: "Nouveau Webhook"
+ create: "Créer"
+ save: "Sauvegarder"
+ destroy: "Supprimer"
+ description: "Description"
+ controls: "Contrôles"
+ go_back: "Retour à la liste"
+ payload_url: "URL cible"
+ payload_url_placeholder: "https://example.com/postreceive"
+ warn_local_payload_url: "Il semble que vous essayez de configurer le Webhook vers une URL locale. Les événements délivrés à une adresse locale peuvent causer des effets de bords ou des comportements inattendus. Continuer ?"
+ secret_invalid: "La clé secrète ne doit pas contenir d'espaces."
+ secret_too_short: "La clé secrète doit contenir au moins 12 caractères."
+ secret_placeholder: "Une chaîne de caractères facultative pour générer la signature"
+ event_type_missing: "Vous devez configurer au moins un type d'évènement."
+ content_type: "Type de contenu"
+ secret: "Clé secrète"
+ event_chooser: "Quels événements doivent déclencher ce Webhook ?"
+ wildcard_event: "Tout m'envoyer."
+ individual_event: "Sélectionner des événements individuels."
+ verify_certificate: "Vérifier le certificat TLS de l'URL cible"
+ active: "Actif"
+ active_notice: "Nous delivrerons les détails de l'évènement quand il se produit."
+ categories_filter_instructions: "Les Webhooks appropriés seront uniquement déclenchés si les événements sont liés aux catégories définies. Laisser vide pour les déclencher pour toutes les catégories."
+ categories_filter: "Catégories"
+ groups_filter_instructions: "Les Webhooks appropriés seront uniquement déclenchés si les événements sont liés aux groupes définis. Laisser vide pour les déclencher pour tous les groupes."
+ groups_filter: "Groupes"
+ delete_confirm: "Supprimer ce Webhook ?"
+ topic_event:
+ name: "Événement de sujet"
+ details: "Quand il y a un sujet nouveau, modifié ou supprimé."
+ post_event:
+ name: "Événement de message"
+ details: "Quand il y a une réponse nouvelle, modifiée, supprimée ou rétablie."
+ user_event:
+ name: "Événement d'utilisateur"
+ details: "Quand un utilisateur est créé, approuvé ou mis à jour."
+ delivery_status:
+ title: "État de l'envoi"
+ inactive: "Inactif"
+ failed: "Échec"
+ successful: "Succès"
+ events:
+ none: "Il n'y aucun évènement lié."
+ redeliver: "Redélivrer"
+ incoming:
+ one: "Il y a un nouvel événement."
+ other: "Il y a {{count}} nouveaux événements."
+ completed_in:
+ one: "Terminé en 1 seconde."
+ other: "Terminé en {{count}} secondes."
+ request: "Requête"
+ response: "Réponse"
+ redeliver_confirm: "Êtes-vous sûr de vouloir redélivrer les mêmes données ?"
+ headers: "Entêtes"
+ payload: "Données"
+ body: "Corps"
+ go_list: "Aller à la liste"
+ go_details: "Modifier le Webhook"
+ go_events: "Aller aux événements"
+ ping: "Ping"
+ status: "Code de retour"
+ event_id: "ID"
+ timestamp: "Créé"
+ completion: "Temps d'exécution"
+ actions: "Actions"
plugins:
- title: "Plugins"
- installed: "Plugins installés"
- name: "Nom du plugin"
- none_installed: "Vous n'avez aucun plugin installé."
- version: "Version du plugin"
- enabled: "Activé ?"
+ title: "Extensions"
+ installed: "Extensions installées"
+ name: "Nom"
+ none_installed: "Vous n'avez aucune extension installée."
+ version: "Version"
+ enabled: "Activée ?"
is_enabled: "O"
not_enabled: "N"
change_settings: "Changer les paramètres"
change_settings_short: "Paramètres"
- howto: "Comment installer des plugins ?"
+ howto: "Comment installer des extensions ?"
backups:
title: "Sauvegardes"
menu:
@@ -2205,28 +2411,28 @@ fr:
enable:
title: "Activer le mode lecture seule"
label: "Activer la lecture seule"
- confirm: "Etes-vous sûr de vouloir activer le mode lecture seule?"
+ confirm: "Êtes-vous sûr de vouloir activer le mode lecture seule ?"
disable:
title: "Désactiver le mode lecture seule"
label: "Désactiver lecture seule"
logs:
- none: "Pas de journaux pour l'instant..."
+ none: "Pas de journaux pour l'instant…"
columns:
filename: "Nom du fichier"
size: "Taille"
upload:
label: "Envoyer"
title: "Envoyer une sauvegarde à cette instance"
- uploading: "Envoi en cours..."
- success: "'{{filename}}' a été envoyé avec succès."
- error: "Il y a eu une erreur lors de l'envoi de '{{filename}}': {{message}}"
+ uploading: "Envoi en cours…"
+ success: "« {{filename}} » a été envoyé avec succès."
+ error: "Il y a eu une erreur lors de l'envoi de « {{filename}} » : {{message}}"
operations:
- is_running: "Une opération est en cours d'exécution ..."
+ is_running: "Une opération est en cours d'exécution…"
failed: "Le/La {{operation}} a échoué(e). Veuillez consulter les journaux."
cancel:
label: "Annuler"
title: "Annuler l'opération en cours"
- confirm: "Êtes-vous sûr de vouloir annuler l'opération en cours?"
+ confirm: "Êtes-vous sûr de vouloir annuler l'opération en cours ?"
backup:
label: "Sauvegarder"
title: "Créer une sauvegarde"
@@ -2248,10 +2454,8 @@ fr:
title: "Restaurer (RollBack) la base de données à l'état de travail précédent"
confirm: "Êtes-vous sûr de vouloir restaurer la base de données à l'état de fonctionnement précédent?"
export_csv:
- user_archive_confirm: "Êtes-vous sûr de vouloir télécharger vos messages?"
success: "L'exportation a été démarrée. Vous serez notifié par message lorsque le traitement sera terminé."
- failed: "L'export a échoué. Veuillez consulter les logs."
- rate_limit_error: "Les messages peuvent être téléchargés une fois par jour, veuillez ressayer demain."
+ failed: "L'exportation a échoué. Veuillez consulter les journaux."
button_text: "Exporter"
button_title:
user: "Exporter la liste des utilisateurs dans un fichier CSV."
@@ -2266,9 +2470,9 @@ fr:
button_title: "Envoyer invitations"
customize:
title: "Personnaliser"
- long_title: "Personnalisation du site"
+ long_title: "Personnalisations du site"
css: "CSS"
- header: "En-tête"
+ header: "Entête"
top: "Top"
footer: "Pied de page"
embedded_css: "CSS intégré"
@@ -2300,14 +2504,14 @@ fr:
email_templates:
title: "Modèle de courriel"
subject: "Objet"
- multiple_subjects: "Ce modèle d'e-mail a plusieurs objets."
+ multiple_subjects: "Ce modèle de courriel a plusieurs objets."
body: "Corps"
- none_selected: "Choisissez un modèle de courriel pour commencer l'édition"
+ none_selected: "Choisissez un modèle de courriel pour commencer l'édition."
revert: "Annuler les changements"
- revert_confirm: "Êtes-vous sur de vouloir annuler vos changements ?"
+ revert_confirm: "Êtes-vous sûr de vouloir annuler vos changements ?"
css_html:
title: "CSS/HTML"
- long_title: "Personnalisation du CSS et HTML"
+ long_title: "Personnalisations du CSS et HTML"
colors:
title: "Couleurs"
long_title: "Palettes de couleurs"
@@ -2316,7 +2520,7 @@ fr:
copy_name_prefix: "Copie de"
delete_confirm: "Supprimer cette palette de couleurs ?"
undo: "annuler"
- undo_title: "Annuler vos modifications sur cette couleur depuis la dernière fois qu'elle a été sauvegarder."
+ undo_title: "Annuler vos modifications sur cette couleur depuis la dernière fois qu'elle a été sauvegardée."
revert: "rétablir"
revert_title: "Rétablir la couleur de la palette par défaut de Discourse."
primary:
@@ -2324,7 +2528,7 @@ fr:
description: 'La plupart des textes, icônes et bordures.'
secondary:
name: 'secondaire'
- description: 'Les couleurs principales du fond et des textes de certains boutons.'
+ description: 'Les couleurs principales du fond et du texte de certains boutons.'
tertiary:
name: 'tertiaire'
description: 'Liens, boutons, notifications et couleurs d''accentuation.'
@@ -2332,56 +2536,60 @@ fr:
name: "quaternaire"
description: "Liens de navigation."
header_background:
- name: "fond du header"
- description: "Couleur de fond du header."
+ name: "arrière-plan de l'entête"
+ description: "Couleur d'arrière-plan de l'entête du site."
header_primary:
- name: "header primaire"
- description: "Textes et icônes du header. "
+ name: "primaire de l'entête"
+ description: "Textes et icônes dans l'entête du site. "
highlight:
name: 'accentuation'
description: 'La couleur de fond des éléments accentués sur la page, comme les messages et sujets.'
danger:
name: 'danger'
- description: 'Couleur d''accentuation pour les actions comme les messages et sujets supprimés.'
+ description: 'Couleur d''accentuation pour les actions comme la suppression de messages et de sujets.'
success:
name: 'succès'
- description: 'Utiliser pour indiquer qu''une action a réussi.'
+ description: 'Utilisée pour indiquer qu''une action a réussi.'
love:
name: 'aimer'
- description: "La couleur du bouton \"J'aime\"."
+ description: "La couleur du bouton J'aime."
email:
title: "Courriels"
settings: "Paramètrage"
templates: "Modèles"
preview_digest: "Prévisualisation du courriel"
- sending_test: "Envoi en cours du courriel de test..."
+ sending_test: "Envoi du courriel de test…"
error: "ERREUR - %{server_error}"
test_error: "Il y a eu un problème avec l'envoi du courriel de test. Veuillez vérifier vos paramètres, que votre hébergeur ne bloque pas les connections aux courriels, et réessayer."
sent: "Envoyés"
skipped: "Ignorés"
- bounced: "Rejeté"
+ bounced: "Rejetés"
received: "Reçus"
rejected: "Rejetés"
- sent_at: "Envoyer à"
+ sent_at: "Envoyé à"
time: "Heure"
user: "Utilisateur"
email_type: "Type de courriel"
to_address: "À l'adresse"
- test_email_address: "Adresse de courriel à tester"
+ test_email_address: "adresse de courriel à tester"
send_test: "Envoyer un courriel de test"
sent_test: "Envoyé !"
delivery_method: "Méthode d'envoi"
preview_digest_desc: "Prévisualiser le contenu des courriels hebdomadaires sommaires envoyés aux utilisateurs inactifs."
refresh: "Rafraîchir"
+ send_digest_label: "Envoyer ce résultat à :"
+ send_digest: "Envoyer"
+ sending_email: "Courriel en cours d'envoi…"
format: "Format"
html: "html"
text: "texte"
- last_seen_user: "Dernière utilisateur vu :"
+ last_seen_user: "Dernièr utilisateur vu :"
+ no_result: "Aucun résultat trouvé pour le résumé."
reply_key: "Répondre"
skipped_reason: "Passer Raison"
incoming_emails:
from_address: "De"
- to_addresses: "A"
+ to_addresses: "À"
cc_addresses: "Cc"
subject: "Objet"
error: "Erreur"
@@ -2389,15 +2597,15 @@ fr:
modal:
title: "Détails du courriel entrant"
error: "Erreur"
- headers: "En-têtes"
- subject: "Subject"
- body: "Body"
+ headers: "Entêtes"
+ subject: "Objet"
+ body: "Corps"
rejection_message: "Courriel de refus"
filters:
from_placeholder: "from@example.com"
to_placeholder: "to@example.com"
cc_placeholder: "cc@example.com"
- subject_placeholder: "Objet..."
+ subject_placeholder: "Objet…"
error_placeholder: "Erreur"
logs:
none: "Pas de journaux trouvés."
@@ -2405,7 +2613,7 @@ fr:
title: "Filtrer"
user_placeholder: "pseudo"
address_placeholder: "nom@exemple.com"
- type_placeholder: "résumé, inscription..."
+ type_placeholder: "résumé, inscription…"
reply_key_placeholder: "clé de réponse"
skipped_reason_placeholder: "raison"
logs:
@@ -2417,18 +2625,18 @@ fr:
ip_address: "IP"
topic_id: "Identifiant du sujet"
post_id: "Identifiant du message"
- category_id: "ID catégorie"
+ category_id: "Identifiant de la catégorie"
delete: 'Supprimer'
- edit: 'Éditer'
+ edit: 'Modifier'
save: 'Sauvegarder'
screened_actions:
block: "bloquer"
do_nothing: "ne rien faire"
staff_actions:
- title: "Actions des modérateurs"
+ title: "Actions des responsables"
instructions: "Cliquez sur les pseudos et les actions pour filtrer la liste. Cliquez sur les images de profil pour aller aux pages des utilisateurs."
- clear_filters: "Tout Afficher"
- staff_user: "Membre de l'équipe des modérateurs"
+ clear_filters: "Tout afficher"
+ staff_user: "Responsable"
target_user: "Utilisateur cible"
subject: "Sujet"
when: "Quand"
@@ -2436,13 +2644,13 @@ fr:
details: "Détails"
previous_value: "Précédent"
new_value: "Nouveau"
- diff: "Diff"
+ diff: "Différence"
show: "Afficher"
modal_title: "Détails"
no_previous: "Il n'y a pas de valeur précédente."
deleted: "Pas de nouvelle valeur. L'enregistrement a été supprimé."
actions:
- delete_user: "Supprimer l'utilisateur"
+ delete_user: "supprimer l'utilisateur"
change_trust_level: "modifier le niveau de confiance"
change_username: "modifier pseudo"
change_site_setting: "modifier les paramètres du site"
@@ -2450,8 +2658,8 @@ fr:
delete_site_customization: "supprimer la personnalisation du site"
change_site_text: "modifier le texte du site"
suspend_user: "suspendre l'utilisateur"
- unsuspend_user: "retirer la suspension de l'utilisateur"
- grant_badge: "décerné le badge"
+ unsuspend_user: "annuler la suspension de l'utilisateur"
+ grant_badge: "décerner le badge"
revoke_badge: "retirer le badge"
check_email: "vérifier l'adresse courriel"
delete_topic: "supprimer le sujet"
@@ -2464,8 +2672,8 @@ fr:
create_category: "créer une catégorie"
block_user: "bloquer l'utilisateur"
unblock_user: "débloquer l'utilisateur"
- grant_admin: "Accorder les droits d'admin"
- revoke_admin: "Révoquer les droits d'admin"
+ grant_admin: "accorder les droits d'administration"
+ revoke_admin: "révoquer les droits d'administration"
grant_moderation: "Accorder les droits de modération"
revoke_moderation: "Révoquer les droits de modération"
backup_operation: "sauvegarde"
@@ -2474,7 +2682,7 @@ fr:
revoke_email: "révoquer le courriel"
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."
+ description: "Lorsque quelqu'un essaye de créer un nouveau compte, les adresses de courriel suivantes seront vérifiées et l'inscription sera bloquée, ou une autre action sera réalisée."
email: "Courriel"
actions:
allow: "Autoriser"
@@ -2484,10 +2692,10 @@ fr:
url: "URL"
domain: "Domaine"
screened_ips:
- title: "IP surveillés"
+ title: "IP surveillées"
description: 'Adresses IP qui sont surveillés. Utiliser "Autoriser" pour ajouter les adresses IP à la liste blanche.'
delete_confirm: "Êtes-vous sûr de vouloir supprimer la règle pour %{ip_address} ?"
- roll_up_confirm: "Êtes-vous certain de vouloir consolider les adresses IP interdites sous forme de plages de sous réseaux ?"
+ roll_up_confirm: "Êtes-vous sûr de vouloir consolider les adresses IP interdites sous forme de plages de sous réseaux ?"
rolled_up_some_subnets: "Consolidation réussie des adresses IP interdites vers ces plages de sous réseau: %{subnets}."
rolled_up_no_subnet: "Aucune consolidation possible."
actions:
@@ -2503,7 +2711,7 @@ fr:
text: "Consolider"
title: "Créer de nouvelles plages de sous réseaux à bannir s'il y a au moins 'min_ban_entries_for_roll_up' entrées."
logster:
- title: "Logs d'erreurs"
+ title: "Journal d'erreurs"
impersonate:
title: "Incarner"
help: "Utiliser cet outil pour incarner un compte utilisateur à des fins de tests.\nVous devrez vous déconnecter une fois terminé."
@@ -2512,7 +2720,7 @@ fr:
users:
title: 'Utilisateurs'
create: 'Ajouter un administateur'
- last_emailed: "Derniers contacts"
+ last_emailed: "Dernier courriel"
not_found: "Désolé ce pseudo n'existe pas dans notre système."
id_not_found: "Désolé cet identifiant d'utilisateur n'existe pas dans notre système."
active: "Actifs"
@@ -2524,11 +2732,11 @@ fr:
staff: 'Responsables'
suspended: 'Suspendus'
blocked: 'Bloqués'
- suspect: 'Suspect'
+ suspect: 'Suspects'
approved: "Approuvé ?"
approved_selected:
- one: "Approuver l'utilisateur"
- other: "Approuver les {{count}} utilisateurs"
+ one: "approuver l'utilisateur"
+ other: "approuver les utilisateurs ({{count}})"
reject_selected:
one: "utilisateur rejeté"
other: "utilisateurs rejetés ({{count}})"
@@ -2541,7 +2749,7 @@ fr:
member: 'Utilisateurs au Niveau de confiance 2 (Membre)'
regular: 'Utilisateurs au Niveau de confiance 3 (Habitué)'
leader: 'Utilisateurs au Niveau de confiance 4 (Meneur)'
- staff: "Membres de l'équipe des responables"
+ staff: "Responsables"
admins: 'Administrateurs'
moderators: 'Modérateurs'
blocked: 'Utilisateurs bloqués'
@@ -2566,15 +2774,15 @@ fr:
suspend_reason: "Raison"
suspended_by: "Suspendu par"
delete_all_posts: "Supprimer tous les messages"
- delete_all_posts_confirm: "Vous allez supprimer %{posts} messages et %{topics} sujets. Êtes-vous sûr ?"
+ delete_all_posts_confirm_MF: "Vous êtes sur le point de supprimer {POSTS, plural, one {1 message} other {# messages}} et {TOPICS, plural, one {1 sujet} other {# sujets}}. Êtes-vous sûr ?"
suspend: "Suspendre"
- unsuspend: "Retirer la suspension"
+ unsuspend: "Annuler la suspension"
suspended: "Suspendu ?"
moderator: "Modérateur ?"
- admin: "Admin ?"
+ admin: "Administrateur ?"
blocked: "Bloqué ?"
- staged: "En attente?"
- show_admin_profile: "Admin"
+ staged: "En attente ?"
+ show_admin_profile: "Administration"
edit_title: "Modifier le titre"
save_title: "Sauvegarder le titre"
refresh_browsers: "Forcer le rafraîchissement du navigateur"
@@ -2584,8 +2792,8 @@ fr:
ip_lookup: "IP de consultation"
log_out: "Déconnecter l'utilisateur"
logged_out: "L'utilisateur s'est déconnecté de tous les appareils"
- revoke_admin: 'Révoquer les droits d''admin'
- grant_admin: 'Accorder les droits d''admin'
+ revoke_admin: 'Révoquer les droits d''administration'
+ grant_admin: 'Accorder les droits d''administration'
revoke_moderation: 'Révoquer les droits de modération'
grant_moderation: 'Accorder les droits de modération'
unblock: 'Débloquer'
@@ -2593,20 +2801,20 @@ fr:
reputation: Réputation
permissions: Permissions
activity: Activité
- like_count: J'aimes donnés / reçus
+ like_count: J'aime donnés / reçus
last_100_days: 'dans les 100 derniers jours'
- private_topics_count: Messages privés
+ private_topics_count: Sujets privés
posts_read_count: Messages lus
- post_count: Messages crées
- topics_entered: Sujets consultés
+ post_count: Messages créés
+ topics_entered: Sujets vus
flags_given_count: Signalements effectués
flags_received_count: Signalements reçus
warnings_received_count: Avertissements reçus
- flags_given_received_count: 'Signalements émis / reçus'
- approve: 'Approuvé'
+ flags_given_received_count: 'Signalements effectués / reçus'
+ approve: 'Approuver'
approved_by: "approuvé par"
approve_success: "Utilisateur approuvé et un courriel avec les instructions d'activation a été envoyé."
- approve_bulk_success: "Bravo! Tous les utlisateurs sélectionnés ont été approuvés et notifiés."
+ approve_bulk_success: "Bravo ! Tous les utilisateurs sélectionnés ont été approuvés et notifiés."
time_read: "Temps de lecture"
anonymize: "Rendre l'utilisateur anonyme"
anonymize_confirm: "Êtes-vous sûr de vouloir rendre ce compte anonyme ? Ceci entraînera la modification du pseudo et de l'adresse courriel, et réinitialisera les informations du profil."
@@ -2614,7 +2822,7 @@ fr:
anonymize_failed: "Il y a eu un problème lors de l'anonymisation de ce compte."
delete: "Supprimer l'utilisateur"
delete_forbidden_because_staff: "Administrateurs et modérateurs ne peuvent pas être supprimés."
- delete_posts_forbidden_because_staff: "Vous ne pouvez pas supprimer tous les messages des administrateurs ou des modérateurs."
+ delete_posts_forbidden_because_staff: "Vous ne pouvez pas supprimer tous les messages des administrateurs et des modérateurs."
delete_forbidden:
one: "Les utilisateurs ne peuvent pas être supprimés s'ils ont posté des messages Supprimer tous les messages avant d'essayer de supprimer un utilisateur. (Les messages plus vieux que %{count} jour ne peut pas être supprimé.)"
other: "Les utilisateurs ne peuvent pas être supprimés s'ils ont crée des messages. Supprimer tous les messages avant d'essayer de supprimer un utilisateur. (Les messages plus vieux que %{count} jours ne peuvent pas être supprimés.)"
@@ -2622,31 +2830,31 @@ fr:
one: "Impossible de supprimer tout les messages. Certains messages sont âgés de plus de %{count} jour. (voir l'option delete_user_max_post_age)"
other: "Impossible de supprimer tout les messages. Certains messages sont âgés de plus de %{count} jours. (voir l'option delete_user_max_post_age)"
cant_delete_all_too_many_posts:
- one: "Impossible de supprimer tout les messages parce-que l'utilisateur a plus d'un message. (delete_all_posts_max)"
- other: "Impossible de supprimer tout les messages parce-que l'utilisateur a plus de %{count} messages. (delete_all_posts_max)"
+ one: "Impossible de supprimer tous les messages parce que l'utilisateur a plus d'un message. (delete_all_posts_max)"
+ other: "Impossible de supprimer tous les messages parce que l'utilisateur a plus de %{count} messages. (delete_all_posts_max)"
delete_confirm: "Êtes-vous SÛR de vouloir supprimer cet utilisateur ? Cette action est irréversible !"
delete_and_block: "Supprimer et bloquer cette adresse de courriel et adresse IP."
delete_dont_block: "Supprimer uniquement"
deleted: "L'utilisateur a été supprimé."
- delete_failed: "Il y a eu une erreur lors de la suppression de l'utilisateur. Veuillez vous assurez que tous ses messages ont bien été supprimmés avant d'essayer de supprimer l'utilisateur."
+ delete_failed: "Il y a eu une erreur lors de la suppression de l'utilisateur. Veuillez vous assurer que tous ses messages ont bien été supprimmés avant d'essayer de supprimer l'utilisateur."
send_activation_email: "Envoyer le courriel d'activation"
activation_email_sent: "Un courriel d'activation a été envoyé."
send_activation_email_failed: "Il y a eu un problème lors du renvoi du courriel d'activation. %{error}"
activate: "Activer le compte"
activate_failed: "Il y a eu un problème lors de l'activation du compte."
- deactivate_account: "Désactive le compte"
+ deactivate_account: "Désactiver le compte"
deactivate_failed: "Il y a eu un problème lors de la désactivation du compte."
- unblock_failed: 'Problème rencontré lors du déblocage de l''utilisateur.'
- block_failed: 'Problème rencontré lors du blocage de l''utilisateur.'
+ unblock_failed: 'Il y a eu un problème lors du déblocage de l''utilisateur.'
+ block_failed: 'Il y a eu un problème lors du blocage de l''utilisateur.'
block_confirm: 'Êtes-vous sûr de vouloir bloquer cet utilisateur ? Il ne pourra plus créer de sujets ou messages.'
block_accept: 'Oui, bloquer cet utilisateur'
bounce_score: "Score de rejet"
reset_bounce_score:
label: "Réinitialiser"
- title: "Réinitialiser compteur de rejets à 0"
+ title: "Réinitialiser le score de rejets à 0"
deactivate_explanation: "Un utilisateur désactivé doit revalider son adresse de courriel."
suspended_explanation: "Un utilisateur suspendu ne peut pas se connecter."
- block_explanation: "Un utilisateur bloqué ne peut pas écrire de message, ni créer de sujet."
+ block_explanation: "Un utilisateur bloqué ne peut pas écrire de messages ni créer de sujets."
staged_explanation: "Un utilisateur en attente ne peut envoyer des messages par courriel que pour des sujets spécifiques."
bounce_score_explanation:
none: "Aucune rejet récent pour cette adresse courriel."
@@ -2655,36 +2863,38 @@ fr:
trust_level_change_failed: "Il y a eu un problème lors de la modification du niveau de confiance de l'utilisateur."
suspend_modal_title: "Suspendre l'utilisateur"
trust_level_2_users: "Utilisateurs de niveau de confiance 2"
- trust_level_3_requirements: "Niveaux de confiance 3 Pré-requis"
+ trust_level_3_requirements: "Pré-requis du niveau de confiance 3"
trust_level_locked_tip: "Le niveau de confiance est verrouillé. Le système ne changera plus le niveau de confiance de cet utilisateur."
trust_level_unlocked_tip: "les niveaux de confiance sont déverrouillés. Le système pourra promouvoir ou rétrograder des utilisateurs."
lock_trust_level: "Verrouiller le niveau de confiance"
unlock_trust_level: "Déverrouiller le niveau de confiance"
tl3_requirements:
title: "Pré-requis pour le niveau de confiance 3"
- table_title: "Dans les %{time_period} derniers jours:"
+ table_title:
+ one: "Lors du dernier jour :"
+ other: "Lors des %{count} derniers jours :"
value_heading: "Valeur"
requirement_heading: "Pré-requis"
visits: "Visites"
days: "jours"
- topics_replied_to: "Sujets auquels l'utilisateur a répondu"
+ topics_replied_to: "Sujets auxquels l'utilisateur a répondu"
topics_viewed: "Sujets vus"
topics_viewed_all_time: "Sujets vus (depuis le début)"
posts_read: "Messages lus"
posts_read_all_time: "Messages lus (depuis le début)"
flagged_posts: "Messages signalés"
flagged_by_users: "Utilisateurs signalés"
- likes_given: "J'aimes donnés"
- likes_received: "J'aimes reçus"
+ likes_given: "J'aime donnés"
+ likes_received: "J'aime reçus"
likes_received_days: "J'aime reçus : par jour"
likes_received_users: "J'aime reçus : par utilisateur"
qualifies: "Admissible au niveau de confiance 3."
does_not_qualify: "Non admissible au niveau de confiance 3."
- will_be_promoted: "Sera promu prochainement."
- will_be_demoted: "Sera rétrograder prochainement."
- on_grace_period: "Actuellement en période de grâce, sera bientôt rétrograder."
+ will_be_promoted: "Sera bientôt promu."
+ will_be_demoted: "Sera bientôt rétrogragé."
+ on_grace_period: "Actuellement en période de grâce, ne sera pas rétrogradé."
locked_will_not_be_promoted: "Niveau de confiance verrouillé. Ne sera jamais promu."
- locked_will_not_be_demoted: "Niveau de confiance verrouillé. Ne sera jamais rétrograder."
+ locked_will_not_be_demoted: "Niveau de confiance verrouillé. Ne sera jamais rétrogradé."
sso:
title: "Authentification unique (SSO)"
external_id: "ID Externe"
@@ -2699,40 +2909,40 @@ fr:
untitled: "Sans titre"
name: "Nom du champ"
type: "Type du champ"
- description: "Description du champs"
+ description: "Description du champ"
save: "Sauvegarder"
edit: "Modifier"
delete: "Supprimer"
cancel: "Annuler"
- delete_confirm: "Etes vous sur de vouloir supprimer ce champ utilisateur ?"
+ delete_confirm: "Êtes-vous sûr de vouloir supprimer ce champ utilisateur ?"
options: "Options"
required:
title: "Obligatoire à l'inscription ?"
enabled: "obligatoire"
- disabled: "optionnel"
+ disabled: "facultatif"
editable:
title: "Modifiable après l'inscription ?"
enabled: "modifiable"
disabled: "non modifiable"
show_on_profile:
- title: "Afficher dans le profil public"
+ title: "Afficher sur le profil public ?"
enabled: "affiché dans le profil"
disabled: "pas affiché dans le profil"
show_on_user_card:
- title: "Montrer sur la carte de l'utilisateur?"
- enabled: "montré sur la carte de l'utilisateur"
- disabled: "non montré sur la carte de l'utilisateur"
+ title: "Afficher sur la carte de l'utilisateur ?"
+ enabled: "affiché sur la carte de l'utilisateur"
+ disabled: "non affiché sur la carte de l'utilisateur"
field_types:
text: 'Zone de texte'
confirm: 'Confirmation'
dropdown: "Menu déroulant"
site_text:
- description: "Vous pouvez personnaliser n'importe quel libellé dans votre forum. Commencez en utilisant la recherche ci-dessous :"
+ description: "Vous pouvez personnaliser n'importe quel texte de votre forum. Commencez en utilisant la recherche ci-dessous :"
search: "Cherchez le texte que vous souhaitez modifier"
title: 'Contenu'
edit: 'modifier'
revert: "Annuler les changements"
- revert_confirm: "Êtes-vous sur de vouloir annuler vos changements ?"
+ revert_confirm: "Êtes-vous sûr de vouloir annuler vos changements ?"
go_back: "Retour à la recherche"
recommended: "Nous vous recommandons de personnaliser le texte suivant selon vos besoins :"
show_overriden: 'Ne montrer que ce qui a été personnalisé'
@@ -2748,7 +2958,7 @@ fr:
categories:
all_results: 'Toutes'
required: 'Requis'
- basic: 'Globaux'
+ basic: 'Général'
users: 'Utilisateurs'
posting: 'Messages'
email: 'Courriel'
@@ -2762,15 +2972,18 @@ fr:
developer: 'Développeur'
embedding: "Externe"
legal: "Légal"
+ user_api: 'API utilisateur'
uncategorized: 'Autre'
backups: "Sauvegardes"
login: "Connexion"
- plugins: "Plugins"
+ plugins: "Extensions"
user_preferences: "Préférences"
tags: "Tags"
+ search: "Rechercher"
+ groups: "Groupes"
badges:
title: Badges
- new_badge: Nouveau Badge
+ new_badge: Nouveau badge
new: Nouveau
name: Nom
badge: Badge
@@ -2780,7 +2993,7 @@ fr:
badge_type: Type de badge
badge_grouping: Groupe
badge_groupings:
- modal_title: Regroupement de badge
+ modal_title: Groupes de badges
granted_by: Décerné par
granted_at: Décerné le
reason_help: (Lien vers un message ou sujet)
@@ -2790,15 +3003,15 @@ fr:
revoke: Retirer
reason: Raison
expand: Développer …
- revoke_confirm: Êtes-vous sur de vouloir retirer ce badge à cet utilisateur ?
+ revoke_confirm: Êtes-vous sûr de vouloir retirer ce badge ?
edit_badges: Modifier les badges
grant_badge: Décerner le badge
granted_badges: Badges décernés
grant: Décerner
no_user_badges: "%{name} ne s'est vu décerné aucun badge."
- no_badges: Il n'y a aucun badges qui peuvent être décernés.
+ no_badges: Il n'y a aucun badge pouvant être décerné.
none_selected: "Sélectionnez un badge pour commencer"
- allow_title: Autoriser l'utilisation du badge comme titre
+ allow_title: Autoriser le badge à être utilisé comme un titre
multiple_grant: Peut être décerné plusieurs fois
listable: Afficher le badge sur la page publique des badges
enabled: Activer le badge
@@ -2816,10 +3029,10 @@ fr:
post_revision: "Lorsqu'un utilisateur modifie ou crée un message"
trust_level_change: "Lorsqu'un utilisateur change de niveau de confiance"
user_change: "Lorsqu'un utilisateur est modifié ou crée"
- post_processed: "Après un message est traité"
+ post_processed: "Après qu'un message soit traité"
preview:
link_text: "Aperçu du badge accordé"
- plan_text: "Aperçu avant le plan de requête"
+ plan_text: "Aperçu avec le plan de requête"
modal_title: "Aperçu de la requête du badge"
sql_error_header: "Il y a une erreur avec la requête."
error_help: "Consulter les liens suivants pour obtenir de l'aide sur les requêtes de badge."
@@ -2842,16 +3055,17 @@ fr:
add: "Ajouter un nouvel emoji"
name: "Nom"
image: "Image"
- delete_confirm: "Etes vous sûr de vouloir supprimer l'emoji :%{name}: ?"
+ delete_confirm: "Êtes-vous sûr de vouloir supprimer l'emoji :%{name}: ?"
embedding:
get_started: "Si vous aimeriez intégrer Discourse dans un autre site, commencez par ajouter l'hôte."
confirm_delete: "Êtes-vous sûr de vouloir supprimer cet hôte?"
sample: "Introduire le code HTML suivant dans votre site pour créer et intégrer des sujets Discourse. Remplacer REPLACE_ME avec l'URL de la page dans laquelle vous l'intégrer."
title: "Intégration externe"
- host: "Hôtes permis"
- edit: "éditer"
- category: "Ajouter dans catégorie"
- add_host: "Ajouter hôte"
+ host: "Hôtes autorisés"
+ path_whitelist: "Chemins autorisés"
+ edit: "modifier"
+ category: "Écrire dans la catégorie"
+ add_host: "Ajouter un hôte"
settings: "Paramètres d'intégration externe"
feed_settings: "Paramètres de flux RSS/ATOM"
feed_description: "Fournir un flux RSS/ATOM pour votre site peut améliorer la capacité de Discourse à importer votre contenu."
@@ -2860,13 +3074,14 @@ fr:
embed_by_username: "Pseudo pour création de sujet"
embed_post_limit: "Le nombre maximum de messages à intégrer"
embed_username_key_from_feed: "Clé pour extraire le pseudo du flux."
+ embed_title_scrubber: "Expression régulière utilisée pour nettoyer le titre des messages"
embed_truncate: "Tronquer les messages intégrés"
embed_whitelist_selector: "Sélecteur CSS pour les éléments qui seront autorisés dans les contenus intégrés"
embed_blacklist_selector: "Sélecteur CSS pour les éléments qui seront interdits dans les contenus intégrés"
embed_classname_whitelist: "Classes CSS autorisées"
feed_polling_enabled: "Importer les messages via flux RSS/ATOM"
feed_polling_url: "URL du flux RSS/ATOM à importer"
- save: "Sauvegarder paramètres d'intégration"
+ save: "Sauvegarder les paramètres d'intégration"
permalink:
title: "Permaliens"
url: "URL"
@@ -2877,8 +3092,27 @@ fr:
category_id: "ID catégorie"
category_title: "Catégorie"
external_url: "URL externe"
- delete_confirm: Êtes-vous sur de vouloir supprimer ce permalien ?
+ delete_confirm: Êtes-vous sûr de vouloir supprimer ce permalien ?
form:
label: "Nouveau :"
add: "Ajouter"
filter: "Rechercher (URL ou URL externe)"
+ wizard_js:
+ wizard:
+ done: "Terminer"
+ back: "Retour"
+ next: "Suivant"
+ step: "%{current} sur %{total}"
+ upload: "Envoi"
+ uploading: "Envoi en cours…"
+ quit: "Peut-être plus tard"
+ staff_count:
+ one: "Votre communauté a 1 responsable."
+ other: "Votre communauté a %{count} responsables."
+ invites:
+ add_user: "ajouter"
+ none_added: "Vous n'avez invité aucun responsable. Êtes-vous sûr de vouloir continuer ?"
+ roles:
+ admin: "Administrateur"
+ moderator: "Modérateur"
+ regular: "Utilisateur"
diff --git a/config/locales/client.gl.yml b/config/locales/client.gl.yml
index d0034dfd31b..c4fdae32cb1 100644
--- a/config/locales/client.gl.yml
+++ b/config/locales/client.gl.yml
@@ -27,6 +27,7 @@ gl:
millions: "{{number}}M"
dates:
time: "h:mm a"
+ timeline_date: "MMM YYYY"
long_no_year: "D MMM h:mm a"
long_no_year_no_time: "D MMM"
full_no_year_no_time: "D MMMM"
@@ -38,6 +39,7 @@ gl:
long_date_with_year_without_time: "D MMM, 'YY"
long_date_without_year_with_linebreak: "D MMM A ligazón do convite xerouse correctamente. A ligazón do convite só é válida para este enderezo de correo-e: %{invitedEmail} הזמנה נוצרה בהצלחה לינק ההזמנה תקף רק למייל הזה: %{invitedEmail} {{username}} {{description}} {{username}} {{description}} {{username}} {{description}} {{username}} {{description}} {{username}} {{description}} {{username}} {{description}} {{username}} {{description}} {{username}}, {{username2}} {{description}} {{username}}, {{username2}} ו 1 אחר {{description}} {{username}}, {{username2}} ו {{count}} אחרים {{description}} {{username}} {{description}} {{username}} {{description}} {{username}} {{description}} {{username}} אישר/ה את הזמנתך {{username}} הזיז/ה {{description}} הרוויח/ה '{{description}}' {{username}} {{description}} הרוויחו '{{description}}' נושא חדש {{description}} {{count}} הודעה בתיבת הודעות הקבוצה {{group_name}} {{count}} הודעות בתיבת הודעות הקבוצה {{group_name}} הנושאים החדשים שלכם יופיעו כאן. כברירת מחדל, נושאים נחשבים חדשים ויופיעו עם האינדיקציה חדש אם הם נוצרו ב-2 הימים האחרונים בקרו בעמוד ההעדפות שלכם כדי לשנות זאת. הנושאים הלא נקראים שלכם יופיעו כאן. כברירת מחדל, נושאים נחשבים כלא-נקראים ויציגו את הספירה 1 אם את/ה: או אם הגדרת בצורה מפורשת את הנושא כנושא במעקב או בצפייה דרך מנגנון ההתראות המופיע בתחתית כל נושא. בקר/י בעמוד ההעדפות שלך כדי לשנות זאת '
bottom:
- latest: "אין עוד פוסטים מדוברים."
- hot: "אין עוד פוסטים חמים."
- posted: "אין עוד פוסטים שפורסמו."
- read: "אין עוד פוסטים שנקראו."
- new: "אין עוד פוסטים חדשים."
- unread: "אין עוד פוסטים שלא נקראו."
- category: "אין עוד פוסטים בקטגוריה {{category}}."
- top: "אין עוד פוסטים מובילים."
- bookmarks: "אין עוד סימניות לפוסטים."
+ latest: "אין עוד נושאים אחרונים."
+ hot: "אין עוד נושאים חמים."
+ posted: "אין עוד נושאים שפורסמו."
+ read: "אין עוד נושאים שנקראו."
+ new: "אין עוד נושאים חדשים."
+ unread: "אין עוד נושאים שלא נקראו."
+ category: "אין עוד נושאים בקטגוריה {{category}}."
+ top: "אין עוד נושאים מובילים."
+ bookmarks: "אין עוד סימניות לנושאים."
search: "אין עוד תוצאות חיפוש"
topic:
unsubscribe:
stop_notifications: "תקבלו פחות התראות עבור {{title}}"
- change_notification_state: "מצב ההתראות הנוכחי שלך הוא"
- filter_to: "{{post_count}} הודעות בפוסט"
- create: 'פוסט חדש'
- create_long: 'יצירת פוסט חדש'
+ change_notification_state: "מצב ההתראות הנוכחי שלכם הוא"
+ filter_to:
+ one: "פוסט אחד בנושא"
+ other: "{{count}} פוסטים בנושא"
+ create: 'נושא חדש'
+ create_long: 'יצירת נושא חדש'
private_message: 'תחילת הודעה'
archive_message:
help: 'העברת הודעה לארכיון'
@@ -1089,168 +1269,186 @@ he:
move_to_inbox:
title: 'העברה לדואר נכנס'
help: 'החזרת הודעה לדואר נכנס'
- list: 'פוסטים'
- new: 'פוסט חדש'
- unread: 'לא נקרא/ו'
+ list: 'נושאים'
+ new: 'נושא חדש'
+ unread: 'לא נקראו'
new_topics:
- one: 'פוסט חדש אחד'
- other: '{{count}} פוסטים חדשים'
+ one: 'נושא חדש אחד'
+ other: '{{count}} נושאים חדשים'
unread_topics:
one: '1 שלא נקרא'
- other: '{{count}} פוסטים שלא נקראו'
- title: 'פוסט'
+ other: '{{count}} נושאים שלא נקראו'
+ title: 'נושא'
invalid_access:
- title: "הפוסט פרטי"
- description: "סליחה, איך אין לך גישה לפוסט הזה!"
- login_required: "עליכם להתחבר כדי לצפות בפוסט זה."
+ title: "הנושא פרטי"
+ description: "סליחה, איך אין לך גישה לנושא הזה!"
+ login_required: "עליכם להתחבר כדי לצפות בנושא זה."
server_error:
- title: "שגיאה בטעינת הפוסט"
- description: "סליחה, לא יכולנו לטעון את הפוסט הזה, ייתכן שבשל תקלת תקשורת. אנא נסי שוב. אם הבעיה נמשכת, הודיעו לנו."
+ title: "שגיאה בטעינת הנושא"
+ description: "סליחה, לא יכולנו לטעון את הנושא הזה, ייתכן שבשל תקלת תקשורת. אנא נסו שוב. אם הבעיה נמשכת, הודיעו לנו."
not_found:
- title: "הפוסט לא נמצא"
- description: "סליחה, לא יכולנו למצוא את הפוסט הזה. אולי הוא הוסר על ידי מנהל?"
+ title: "הנושא לא נמצא"
+ description: "סליחה, לא יכולנו למצוא את הנושא הזה. אולי הוא הוסר על ידי מנחה?"
total_unread_posts:
- one: "יש לכם פרסום אחד שלא נקרא בנושא זה"
- other: "יש לכם {{count}} פרסומים שלא נקראו בפוסט זה"
+ one: "יש לכם פוסט אחד שלא נקרא בנושא זה"
+ other: "יש לכם {{count}} פוסטים שלא נקראו בנושא זה"
unread_posts:
- one: "יש לך הודעה אחת שלא נקראה בנושא הזה"
- other: "יש לך {{count}} הודעות ישנות שלא נקראו בפוסט הזה"
+ one: "יש לכם פוסט אחד שלא נקרא בנושא הזה"
+ other: "יש לכם {{count}} פוסטים ישנים שלא נקראו בנושא הזה"
new_posts:
- one: "יש הודעה אחת חדשה בנושא הזה מאז שקראת אותו לאחרונה"
- other: "יש {{count}} הודעות חדשות בפוסט הזה מאז שקראת אותו לאחרונה"
+ one: "יש פוסט אחד חדש בנושא הזה מאז שקראתם אותו לאחרונה"
+ other: "יש {{count}} פוסטים חדשים בנושא זה מאז שקראתם אותו לאחרונה"
likes:
one: "יש לייק אחד בנושא הזה"
- other: "יש {{count}} לייקים בפוסט הזה"
- back_to_list: "חזרה לרשימת הפוסטים"
- options: "אפשרויות פוסט"
- show_links: "הצג קישורים בתוך הפוסט הזה"
- toggle_information: "הצגת פרטי פוסט"
- read_more_in_category: "רוצה לקרוא עוד? עיין פוסטים אחרים ב {{catLink}} או {{latestLink}}."
+ other: "יש {{count}} לייקים בנושא זה"
+ back_to_list: "חזרה לרשימת הנושאים"
+ options: "אפשרויות נושא"
+ show_links: "הצג קישורים בתוך הנושא הזה"
+ toggle_information: "הצגת פרטי נושא"
+ read_more_in_category: "רוצים לקרוא עוד? עיינו בנושאים אחרים ב {{catLink}} או {{latestLink}}."
read_more: "רוצה לקרוא עוד? {{catLink}} or {{latestLink}}."
- read_more_MF: "There { UNREAD, plural, =0 {} one { is 1 unread } other { are # unread } } { NEW, plural, =0 {} one { {BOTH, select, true{and } false {is } other{}} 1 new topic} other { {BOTH, select, true{and } false {are } other{}} # new topics} } remaining, or {CATEGORY, select, true {browse other topics in {catLink}} false {{latestLink}} other {}}"
- browse_all_categories: עיין בכל הקטגוריות
- view_latest_topics: הצגת פוסטים מדוברים
- suggest_create_topic: לחצו כאן כדי ליצור פוסט חדש.
+ read_more_MF: "יש { UNREAD, plural, =0 {} one { 1 שלא נקרא } other { # שלא נקראו } } { NEW, plural, =0 {} one { {BOTH, select, true{ו} false {} other{}} נושא חדש אחד} other { {BOTH, select, true{ו} false {} other{}} # נושאים חדשים} } נותרים, or {CATEGORY, select, true {עיין בנושאים אחרים ב {catLink}} false {{latestLink}} other {}}"
+ browse_all_categories: עיינו בכל הקטגוריות
+ view_latest_topics: הצגת נושאים אחרונים
+ suggest_create_topic: למה לא ליצור נושא חדש?
jump_reply_up: קפיצה לתגובה קודמת
jump_reply_down: קפיצה לתגובה מאוחרת
- deleted: "הפוסט הזה נמחק"
- auto_close_notice: "הפוסט הזה ינעל אוטומטית %{timeLeft}."
- auto_close_notice_based_on_last_post: "פוסט זה ייסגר %{duration} אחר התגובה האחרונה."
- auto_close_title: 'הגדרות נעילה אוטומטית'
+ deleted: "הנושא הזה נמחק"
+ auto_close_notice: "הנושא הזה יסגר אוטומטית %{timeLeft}."
+ auto_close_notice_based_on_last_post: "נושא זה ייסגר %{duration} אחר התגובה האחרונה."
+ auto_close_title: 'הגדרות סגירה אוטומטית'
auto_close_save: "שמור"
- auto_close_remove: "אל תנעל פוסט זה אוטומטית"
+ auto_close_remove: "אל תנעל נושא זה אוטומטית"
+ auto_close_immediate:
+ one: "הפוסט האחרון בנושא הוא כבר בן שעה, אז הנושא ייסגר מיידית."
+ other: "הפוסט האחרון בנושא הוא כבר בן %{count} שעות, אז הנושא ייסגר אוטומטית."
timeline:
back: "חזרה"
back_description: "חיזרו לפוסט האחרון שלא-נקרא על-ידיכם"
replies_short: "%{current} / %{total}"
progress:
- title: התקדמות פוסט
+ title: התקדמות נושא
go_top: "למעלה"
go_bottom: "למטה"
go: "קדימה"
- jump_bottom: "עבור להודעה האחרונה"
+ jump_bottom: "מעבר לפוסט האחרון"
jump_prompt: "קפיצה לפוסט"
+ jump_prompt_of: "מתוך %{count} פוסטים"
jump_prompt_long: "לאיזה פוסט הייתם רוצים לקפוץ?"
- jump_bottom_with_number: "קפיצה להודעה %{post_number}"
- total: סך הכל הודעות
- current: הודעה נוכחית
- position: "הודעה %{current} מתוך %{total}"
+ jump_bottom_with_number: "קפיצה לפוסט %{post_number}"
+ total: סך הכל הפוסטים
+ current: פוסט נוכחי
notifications:
title: שנו את תדירות ההתראות על הנושא הזה
reasons:
- '3_6': 'תקבלו התראות כיוון שאת/ה עוקב אחרי קטגוריה זו.'
- '3_5': 'תקבל/י התראות כיוון שהתחלת לעקוב אחרי הפוסט הזה אוטומטית.'
- '3_2': 'תקבל/י התראות כיוון שאת/ה עוקב אחרי הפוסט הזה.'
- '3_1': 'תקבל/י התראות כיוון שאת/ה יצרת את הפוסט הזה.'
- '3': 'תקבל/י התראות כיוון שאת/ה עוקב אחרי פוסט זה.'
- '2_8': 'תקבלו התראות כיוון שאת/ה צופה בקטגוריה הזו.'
- '2_4': 'תקבל/י התראות כיוון שפרסמת תגובה לפוסט הזה.'
- '2_2': 'תקבל/י התראות כיוון שאת/ה צופה אחרי הפוסט הזה.'
- '2': 'תקבל/י התראות כיוון שקראת את הפוסט הזה.'
- '1_2': 'תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלך או ישיב לפרסום שלך.'
- '1': 'תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלך או ישיב לפרסום שלך.'
- '0_7': 'את/ה מתעלם/מתעלמת מכל ההתראות בקטגוריה זו.'
- '0_2': 'אתה מתעלם מכל ההתראות בפוסט זה.'
- '0': 'אתה מתעלם מכל ההתראות בפוסט זה.'
+ mailing_list_mode: "אתם במצב רשימת תפוצה, אז תיודעו לגבי תגובות לנושא זה באמצעות מייל."
+ '3_10': 'תקבלו התראות כיוון שאתם צופים בתג שקשור לנושא זה.'
+ '3_6': 'תקבלו התראות כיוון שאתם עוקבים אחרי קטגוריה זו.'
+ '3_5': 'תקבלו התראות כיוון שהתחלתם לעקוב אחרי הנושא הזה אוטומטית.'
+ '3_2': 'תקבלו התראות כיוון שאתם עוקבים אחרי הנושא הזה.'
+ '3_1': 'תקבלו התראות כיוון שאתם יצרתם את הנושא הזה.'
+ '3': 'תקבלו התראות כיוון שאתם עוקבים אחרי הנושא זה.'
+ '2_8': 'תקבלו התראות כיוון שאתם עוקבים אחר קטגוריה זו.'
+ '2_4': 'תקבלו התראות כיוון שפרסמתם תגובה לנושא זה.'
+ '2_2': 'תקבלו התראות כיוון שאתם עוקבים אחרי הנושא הזה.'
+ '2': 'תקבלו התראות כיוון שקראתם את הנושא הזה.'
+ '1_2': 'תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלכם או ישיב לכם.'
+ '1': 'תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלכם או ישיב לכם.'
+ '0_7': 'אתם מתעלמים מכל ההתראות בקטגוריה זו.'
+ '0_2': 'אתם מתעלמים מכל ההתראות בנושא זה.'
+ '0': 'אתם מתעלמים מכל ההתראות בנושא זה.'
watching_pm:
title: "עוקב"
- description: "תקבל/י התראה על כל תגובה חדשה בהודעה זו. בנוסף מספר התגובות שלא נקראו יופיעו ליד ההודעה. "
+ description: "תקבלו התראה על כל תגובה חדשה בהודעה זו. בנוסף מספר התגובות שלא נקראו יופיעו ליד ההודעה."
watching:
title: "עוקב"
- description: "תקבל/י התראה על כל תגובה חדשה בפוסט זה ומספר התגובות החדשות יוצג. "
+ description: "תקבלו התראה על כל תגובה חדשה בנושא זה ומספר התגובות החדשות יוצג. "
tracking_pm:
- title: "רגיל+"
- description: "כמו רגיל, בנוסף מספר התגובות החדשות יוצג ליד ההודעה. "
+ title: "עוקב"
+ description: "ספירה של תגובות חדשות תופיע עבור הודעה זו. אתם תיודעו אם מישהו מזכיר את @שמכם או עונה לכם."
tracking:
- title: "רגיל+"
- description: "כמו רגיל, בנוסף מספר התגובות שלא נקראו יוצג לפוסט זה. "
+ title: "עוקב"
+ description: "כמו רגיל, בנוסף מספר התגובות שלא נקראו יוצג לנושא זה."
regular:
title: "רגיל"
- description: "תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלך או ישיב לפרסום שלך."
+ description: "תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלכם או ישיב לכם."
regular_pm:
title: "רגיל"
- description: "תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלך או ישיב לפרסום שלך."
+ description: "תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלכם או ישיב לכם."
muted_pm:
title: "מושתק"
- description: "לעולם לא תקבל/י התראה בנוגע להודעה זו."
+ description: "לעולם לא תקבלו התראה בנוגע להודעה זו."
muted:
title: "מושתק"
+ description: "לעולם לא תיודעו לגבי דבר בנוגע לנושא זה, והוא לא יופיע ב״אחרונים״."
actions:
- recover: "שחזר פוסט"
- delete: "מחק פוסט"
- open: "פתח פוסט"
- close: "נעל פוסט"
- multi_select: "בחר/י פרסומים..."
+ recover: "שחזר נושא"
+ delete: "מחיקת נושא"
+ open: "פתיחת נושא"
+ close: "סגירת נושא"
+ multi_select: "בחרו פוסטים..."
auto_close: "סגירה אוטומטית..."
- pin: "נעיצת פוסט.."
- unpin: "שחרור נעיצת פוסט..."
- unarchive: "הוצא פוסט מארכיון"
- archive: "הכנס פוסט לארכיון"
+ pin: "נעיצת נושא..."
+ unpin: "שחרור נעיצת נושא..."
+ unarchive: "הוצאת נושא מארכיון"
+ archive: "ארכוב נושא"
invisible: "הסתרה"
visible: "גילוי"
reset_read: "אפס מידע שנקרא"
make_public: "הפיכת הנושא לפומבי"
make_private: "הפיכה להודעה פרטית"
feature:
- pin: "נעיצת פוסט"
- unpin: "שחרור נעיצת פוסט"
- pin_globally: "נעיצת פוסט גלובלית"
- make_banner: "באנר פוסט"
- remove_banner: "הסרת באנר פוסט"
+ pin: "נעיצת נושא"
+ unpin: "שחרור נעיצת נושא"
+ pin_globally: "נעיצת נושא גלובלית"
+ make_banner: "נושא באנר"
+ remove_banner: "הסרת נושא באנר"
reply:
title: 'תגובה'
- help: 'החל בכתיבת הודעה לפוסט זה'
+ help: 'התחילו לכתוב תגובה לנושא זה'
clear_pin:
title: "נקה נעיצה"
- help: "נקה סטטוס נעוץ של פוסט זה כדי שהוא לא יופיע עוד בראש רשימת הפוסטים שלך"
+ help: "נקה סטטוס נעוץ של נושא זה כדי שהוא לא יופיע עוד בראש רשימת הנושאים שלכם"
share:
title: 'שיתוף'
- help: 'שתפו קישור לפוסט זה'
+ help: 'שתפו קישור לנושא זה'
+ print:
+ title: 'הדפסה'
+ help: 'פתיחת גרסה ידידותית להדפסה של נושא זה'
flag_topic:
- title: 'סימון'
- help: 'סמנו פוסט זה באופן פרטי לתשומת לב או שלחו התראה פרטית בנוגע אליו'
- success_message: 'סמנת פוסט זה בהצלחה.'
+ title: 'דגל'
+ help: 'דגלו נושא זה באופן פרטי לתשומת לב או שלחו התראה פרטית בנוגע אליו'
+ success_message: 'דיגלתם נושא זה בהצלחה.'
feature_topic:
- title: "הצגת פוסט זה"
- pin: "גרמו לפוסט זה להופיע בראש קטגוריה {{categoryLink}} עד"
- confirm_pin: "יש לך כבר {{count}} פוסטים נעוצים. מספר גדול מידי של פוסטים נעוצים עשויים להכביד על משתמשים חדשים או אנונימיים. האם את/ה בטוחים שאתם רוצים להצמיד פוסט נוסף בקטגוריה זו? "
- unpin: "הסרת פוסט זה מראש הקטגוריה {{categoryLink}}."
- unpin_until: "גרמו לפוסט זה להופיע בראש הקטגוריה {{categoryLink}} או המתן עד %{until}."
- pin_note: "המשתמש/ת יכולים להסיר את הפוסט באופן עצמאי עבור עצמם."
- pin_validation: "דרוש תאריך על מנת לנעוץ את הפוסט. "
- pin_globally: "גרמו לפוסט זה להופיע בראש כל רשימות הפוסטים עד"
- confirm_pin_globally: "יש לך כבר {{count}} פוסטים המוצמדים באופן גלובאלי. עודף פוסטים מוצמדים עשוי להכביד על משתמשים חדשים או אנונימיים. האם את/ה בטוחים שאתם מעוניינים להצמיד פוסט גלובאלי נוסף?"
- unpin_globally: "הסרת פוסט זה מראש כל רשימות הפוסטים."
- unpin_globally_until: "הסרת פוסט זה מראש כל רשימות הפוסטים או המתינו עד %{until}."
- global_pin_note: "משתמשים יכולים להסיר את הצמדת הפוסט באופן עצמאי לעצמם."
- make_banner: "הפכו פוסט זה לבאנר אשר מופיע בראש כל העמודים."
+ title: "המליצו על נושא זה"
+ pin: "גרמו לנושא זה להופיע בראש קטגוריה {{categoryLink}} עד"
+ confirm_pin: "יש לכם כבר {{count}} נושאים נעוצים. מספר גדול מידי של נושאים נעוצים עשויים להכביד על משתמשים חדשים או אנונימיים. האם אתם בטוחים שאתם רוצים לנעוץ נושא נוסף בקטגוריה זו? "
+ unpin: "הסרת נושא זה מראש הקטגוריה {{categoryLink}}."
+ unpin_until: "גרמו לנושא זה להופיע בראש הקטגוריה {{categoryLink}} או המתינו עד %{until}."
+ pin_note: "משתמשים יכולים להסיר את נעיצת הנושא באופן עצמאי עבור עצמם."
+ pin_validation: "דרוש תאריך על מנת לנעוץ את הנושא."
+ not_pinned: "אין נושאים שננעצו בקטגוריה {{categoryLink}}."
+ already_pinned:
+ one: "נושא שננעצו, נכון לעכשיו בקטגוריה {{categoryLink}}: 1"
+ other: "נושאים ננעצו, נכון לעכשיו, בקטגוריה {{categoryLink}}.: {{count}}"
+ pin_globally: "גרמו לנושא זה להופיע בראש כל רשימות הנושאים עד"
+ confirm_pin_globally: "יש לך כבר {{count}} נושאים הנעוצים באופן גלובאלי. עודף נושאים נעוצים עשוי להכביד על משתמשים חדשים או אנונימיים. האם אתם בטוחים שאתם מעוניינים לנעוץ נושא גלובאלי נוסף?"
+ unpin_globally: "הסרת נושא זה מראש כל רשימות הנושאים."
+ unpin_globally_until: "הסירו נושא זה מראש כל רשימות הנושאים או המתינו עד %{until}."
+ global_pin_note: "משתמשים יכולים להסיר את הצמדת הנושא באופן עצמאי לעצמם."
+ not_pinned_globally: "אין נושאים נעוצים גלובאלית."
+ already_pinned_globally:
+ one: "נושאים שכרגע נעוצים גלובאלית: 1"
+ other: "נושאים שכרגע נעוצים גלובאלית: {{count}}"
+ make_banner: "הפכו נושא זה לבאנר אשר מופיע בראש כל העמודים."
remove_banner: "הסרת הבאנר שמופיע בראש כל העמודים."
banner_note: "משתמשים יכולים לבטל את הבאנר על ידי סגירתו. רק פוסט אחד יכול לשמש כבאנר בזמן נתון."
no_banner_exists: "אין נושא באנר"
+ banner_exists: "יש כרגע נושא באנר."
inviting: "מזמין..."
automatically_add_to_groups: "הזמנה זו כוללת גם גישה לקבוצות הבאות:"
invite_private:
- title: 'הזמן להודעה'
+ title: 'הזמינו להודעה'
email_or_username: "כתובת דואר אלקטרוני או שם משתמש של המוזמן"
email_or_username_placeholder: "כתובת דואר אלקטרוני או שם משתמש"
action: "הזמנה"
@@ -1258,62 +1456,63 @@ he:
success_group: "הזמנו את הקבוצה הזו להשתתף בהודעה זו."
error: "סליחה, הייתה שגיאה בהזמנת משתמש זה."
group_name: "שם הקבוצה"
+ controls: "מכווני נושא"
invite_reply:
title: 'הזמנה'
username_placeholder: "שם משתמש"
action: 'שלח הזמנה'
- help: 'הזמן אנשים אחרים לפוסט זה דרך דואר אלקטרוני או התראות'
- to_forum: "נשלח מייל קצר המאפשר לחברך להצטרף באופן מיידי באמצעות לחיצה על קישור, ללא צורך בהתחברות למערכת הפורומים."
- sso_enabled: "הכנס את שם המשתמש של האדם שברצונך להזמין לפוסט זה."
- to_topic_blank: "הכנס את שם המשתמש או כתובת דואר האלקטרוני של האדם שברצונך להזמין לפוסט זה."
- to_topic_email: "הזנת כתובת אימייל. אנחנו נשלח הזמנה שתאפשר לחברך להשיב לפוסט הזה."
- to_topic_username: "הזנת שם משתמש/ת. נשלח התראה עם לינק הזמנה לפוסט הזה. "
- to_username: "הכנסת את שם המשתמש של האדם שברצונך להזמין. אנו נשלח התראה למשתמש זה עם קישור המזמין אותו לפוסט זה."
+ help: 'הזמינו אנשים אחרים לנושא זה דרך דואר אלקטרוני או התראות'
+ to_forum: "נשלח מייל קצר המאפשר לחבריכם להצטרף באופן מיידי באמצעות לחיצה על קישור, ללא צורך בהתחברות למערכת הפורומים."
+ sso_enabled: "הכניסו את שם המשתמש של האדם שברצונכם להזמין לנושא זה."
+ to_topic_blank: "הכניסו את שם המשתמש או כתובת הדואר האלקטרוני של האדם שברצונכם להזמין לנושא זה."
+ to_topic_email: "הזנת כתובת אימייל. אנחנו נשלח הזמנה שתאפשר לחבריכם להשיב לנושא הזה."
+ to_topic_username: "הזנת שם משתמש/ת. נשלח התראה עם לינק הזמנה לנושא הזה. "
+ to_username: "הכנסתם את שם המשתמש של האדם שברצונכם להזמין. אנו נשלח התראה למשתמש זה עם קישור המזמין אותו לנושא זה."
email_placeholder: 'name@example.com'
- success_email: "שלחנו הזמנה ל: {{emailOrUsername}}. נודיע לך כשהזמנה תענה. בדוק את טאב ההזמנות בעמוד המשתמש שלך בשביל לעקוב אחרי ההזמנות ששלחת. "
- success_username: "הזמנו את המשתמש להשתתף בפוסט."
- error: "מצטערים, לא יכלנו להזמין האיש הזה. אולי הוא כבר הוזמן בעבר? (תדירות שליחת ההזמנות מוגבלת)"
+ success_email: "שלחנו הזמנה ל: {{emailOrUsername}}. נודיע לכם כשהזמנה תענה. בידקו את טאב ההזמנות בעמוד המשתמש שלכם בשביל לעקוב אחרי ההזמנות ששלחתם."
+ success_username: "הזמנו את המשתמש להשתתף בנושא."
+ error: "מצטערים, לא יכלנו להזמין משתמש/ת אלו. אולי הם כבר הוזמנו בעבר? (תדירות שליחת ההזמנות מוגבלת)"
login_reply: 'התחברו כדי להשיב'
filters:
n_posts:
- one: "הודעה אחת"
- other: "{{count}} הודעות"
+ one: "פוסט אחד"
+ other: "{{count}} פוסטים"
cancel: "הסרת הסינון"
split_topic:
- title: "העבר לפוסט חדש"
- action: "העבר לפוסט חדש"
- topic_name: "שם הפוסט החדש"
- error: "הייתה שגיאה בהעברת ההודעות לפוסט החדש."
+ title: "העבר לנושא חדש"
+ action: "העבר לנושא חדש"
+ topic_name: "שם הנושא החדש"
+ error: "הייתה שגיאה בהעברת הפוסטים לנושא החדש."
instructions:
- one: "אתה עומד ליצור פוסט חדש ולמלא אותו עם ההודעה שבחרת."
- other: "אתה עומד ליצור פוסט חדש ולמלא אותו עם {{count}} ההודעות שבחרת."
+ one: "אתם עומדים ליצור נושא חדש ולמלא אותו עם הפוסטים שבחרתם."
+ other: "אתם עומדים ליצור נושא חדש ולמלא אותו עם {{count}} הפוסטים שבחרתם."
merge_topic:
- title: "העבר לפוסט קיים"
- action: "העבר לפוסט קיים"
- error: "התרחשה שגיאה בהעברת ההודעות לפוסט הזה."
+ title: "העבר לנושא קיים"
+ action: "העבר לנושא קיים"
+ error: "התרחשה שגיאה בהעברת הפוסטים לנושא הזה."
instructions:
- one: "בבקשה בחר נושא אליו הייתי רוצה להעביר את ההודעה"
- other: "בבקשה בחר את הפוסט אליו תרצה להעביר את {{count}} ההודעות."
+ one: "בבקשה בחרו נושא אליו הייתם רוצים להעביר את הפוסט."
+ other: "בבקשה בחרו את הנושא אליו תרצה להעביר את {{count}} הפוסטים."
merge_posts:
title: "ניזוג פוסטים שנבחרו"
action: "מיזוג פוסטים שנבחרו"
error: "ארעה שגיאה במיזוג הפוסטים שנבחרו."
change_owner:
- title: "שנה בעלים של הודעות"
+ title: "שנו בעלים של פוסטים"
action: "שנה בעלות"
error: "התרחשה שגיאה בשינוי הבעלות של ההדעות."
- label: "בעלים חדש של ההודעות"
+ label: "בעלים חדשים של פוסטים"
placeholder: "שם המשתמש של הבעלים החדש"
instructions:
- one: "אנא בחר את הבעלים החדש של ההודעות מאת {{old_user}}."
- other: "אנא בחר את הבעלים החדש של {{count}} ההודעות מאת {{old_user}}."
- instructions_warn: "יש לשים לב שהתראות על הודעה זו יועברו למשתמש החדש רטרואקטיבית.
+ Il collegamento di invito è stato generato con successo! Il collegamento sarà valido solo per la seguente email: %{invitedEmail} {{username}} {{description}} {{username}} {{description}} {{username}} {{description}} {{username}} {{description}} {{username}} {{description}} {{username}} {{description}} {{username}} {{description}} {{username}}, {{username2}} {{description}} {{username}}, {{username2}} e 1 altro {{description}} {{username}}, {{username2}} e {{count}} altri {{description}} {{username}} {{description}} {{username}} {{description}} {{username}} {{description}} {{username}}ha accettato il tuo invito {{username}} ha spostato {{description}} {{username}} {{description}} Guadagnato '{{description}}' Nuovo Argomento {{description}} {{count}} messaggio nella tua casella {{group_name}} {{count}} messaggi nella tua casella {{group_name}}
+
Attention: Actuellement, aucune donnée lié au message n'est transféré vers le nouvel auteur. À utiliser avec précaution."
+ instructions_warn: "Aucune notification à propos de ce message ne sera transférée rétroactivement au nouvel utilisateur.
Attention : actuellement, aucune donnée liée aux messages n'est transféré vers le nouvel utilisateur. À utiliser avec précaution."
change_timestamp:
title: "Modifier la date/heure"
action: "modifier la date/heure"
@@ -1386,7 +1513,7 @@ fr:
instructions: "Veuillez sélectionner la nouvelle date/heure du sujet. Les messages dans ce topic seront mis à jour pour maintenir la même différence d'heure."
multi_select:
select: 'sélectionner'
- selected: '({{count}}) sélectionnés'
+ selected: 'sélectionnés ({{count}})'
select_replies: 'selectionner +réponses'
delete: supprimer la sélection
cancel: annuler la sélection
@@ -1399,14 +1526,14 @@ fr:
reply: " {{replyAvatar}} {{usernameLink}}"
reply_topic: " {{link}}"
quote_reply: "Citer"
- edit: "Éditer {{link}} par {{replyAvatar}} {{username}}"
+ edit: "Modifier {{link}} par {{replyAvatar}} {{username}}"
edit_reason: "Raison :"
post_number: "message {{number}}"
- last_edited_on: "message dernièrement édité le"
- reply_as_new_topic: "Répondre en créant un sujet lié"
- continue_discussion: "Suite du sujet {{postLink}}:"
- follow_quote: "Voir le message cité"
- show_full: "Voir le message en entier"
+ last_edited_on: "message dernièrement modifié le"
+ reply_as_new_topic: "Répondre par un nouveau sujet"
+ continue_discussion: "Suite du sujet {{postLink}} :"
+ follow_quote: "aller au message cité"
+ show_full: "Afficher le message complet"
show_hidden: 'Afficher le contenu caché.'
deleted_by_author:
one: "(message supprimé par son auteur, sera supprimé automatiquement dans %{count} heure à moins qu'il ne soit signalé)"
@@ -1415,11 +1542,10 @@ fr:
gap:
one: "voir 1 réponse cachée"
other: "voir {{count}} réponses cachées"
- more_links: "{{count}} de plus..."
unread: "Ce message est non lu"
has_replies:
- one: "{{count}} Réponse"
- other: "{{count}} Réponses"
+ one: "{{count}} réponse"
+ other: "{{count}} réponses"
has_likes:
one: "{{count}} J'aime"
other: "{{count}} J'aime"
@@ -1432,91 +1558,83 @@ fr:
other: "vous et {{count}} autres personnes ont aimé ce message"
errors:
create: "Désolé, il y a eu une erreur lors de la publication de votre message. Merci de réessayer."
- edit: "Désolé, il y a eu une erreur lors de l'édition de votre message. Merci de réessayer."
+ edit: "Désolé, il y a eu une erreur lors de la modification de votre message. Merci de réessayer."
upload: "Désolé, il y a eu une erreur lors de l'envoi du fichier. Merci de réessayer."
file_too_large: "Désolé, ce fichier est trop gros (la taille maximale est {{max_size_kb}}kb). Pourquoi ne pas télécharger votre gros fichier sur un service partagé cloud, puis partager le lien?"
too_many_uploads: "Désolé, vous ne pouvez envoyer qu'un seul fichier à la fois."
too_many_dragged_and_dropped_files: "Désolé, vous ne pouvez télécharger que 10 fichiers à la fois."
- upload_not_authorized: "Désolé, le fichier que vous êtes en train d'envoyer n'est pas autorisé (extensions autorisées : {{authorized_extensions}})."
- image_upload_not_allowed_for_new_user: "Désolé, les nouveaux utilisateurs ne peuvent pas envoyer d'image."
+ upload_not_authorized: "Désolé, le fichier que vous essayez d'envoyer n'est pas autorisé (extensions autorisées : {{authorized_extensions}})."
+ image_upload_not_allowed_for_new_user: "Désolé, les nouveaux utilisateurs ne peuvent pas envoyer d'images."
attachment_upload_not_allowed_for_new_user: "Désolé, les nouveaux utilisateurs ne peuvent pas envoyer de fichier."
attachment_download_requires_login: "Désolé, vous devez être connecté pour télécharger une pièce jointe."
abandon:
confirm: "Êtes-vous sûr de vouloir abandonner votre message ?"
no_value: "Non, le conserver"
yes_value: "Oui, abandonner"
- via_email: "message depuis un courriel"
+ via_email: "ce message est arrivé par courriel"
via_auto_generated_email: "ce message est arrivé via un courriel généré automatiquement"
whisper: "ce message est un murmure privé pour les modérateurs"
wiki:
about: "ce message est un wiki"
archetypes:
save: 'Sauvegarder les options'
- few_likes_left: "Merci de partager votre amour! Vous avez plus que quelques j'aime à distribuer pour aujourd'hui."
+ few_likes_left: "Merci de partager votre amour ! Vous n'avez plus que quelques J'aime à distribuer pour aujourd'hui."
controls:
- reply: "Rédiger une réponse à ce message"
+ reply: "commencez à répondre à ce message"
like: "J'aime ce message"
has_liked: "vous avez aimé ce message"
- undo_like: "annuler j'aime"
- edit: "Éditer ce message"
- edit_anonymous: "Désolé, mais vous devez être connecté pour éditer ce message."
+ undo_like: "annuler le J'aime"
+ edit: "modifier ce message"
+ edit_anonymous: "Désolé, mais vous devez être connecté pour modifier ce message."
flag: "signaler secrètement ce message pour attirer l'attention ou envoyer une notification privée à son sujet"
- delete: "Supprimer ce message"
- undelete: "Annuler la suppression de ce message"
- share: "Partager ce message"
+ delete: "supprimer ce message"
+ undelete: "annuler la suppression de ce message"
+ share: "partager ce message"
more: "Plus"
delete_replies:
confirm:
one: "Voulez-vous aussi supprimer la réponse qui suit directement ce message ?"
- other: "Voulez-vous aussi supprimer les {{count}} réponse qui suivent directement ce message ?"
- yes_value: "Oui, supprimer les réponses égalements"
+ other: "Voulez-vous aussi supprimer les {{count}} réponses qui suivent directement ce message ?"
+ yes_value: "Oui, supprimer les réponses également"
no_value: "Non, juste ce message"
- admin: "action sur message d'administrateur"
- wiki: "Basculer en mode wiki"
- unwiki: "Retirer le mode wiki"
+ admin: "actions d'administration sur le message"
+ wiki: "Basculer en mode Wiki"
+ unwiki: "Retirer le mode Wiki"
convert_to_moderator: "Ajouter la couleur modérateur"
revert_to_regular: "Retirer la couleur modérateur"
rebake: "Reconstruire l'HTML"
unhide: "Ré-afficher"
- change_owner: "Modifier la propriété"
+ change_owner: "Modifier l'auteur"
actions:
flag: 'Signaler'
defer_flags:
one: "Reporter le signalement"
other: "Reporter les signalements"
- it_too:
- off_topic: "Le signaler également"
- spam: "Le signaler également"
- inappropriate: "Le signaler également"
- custom_flag: "Le signaler également"
- bookmark: "L'ajouter également en signet"
- like: "L'aimer également"
- vote: "Votez pour lui également"
undo:
off_topic: "Annuler le signalement"
spam: "Annuler le signalement"
inappropriate: "Annuler le signalement"
- bookmark: "Retirer de vos signets"
- like: "Annuler j'aime"
- vote: "Retirer votre vote"
+ bookmark: "Retirer le signet"
+ like: "Annuler le J'aime"
+ vote: "Retirer le vote"
people:
- off_topic: "signalé comme hors-sujet."
+ off_topic: "signalé comme hors-sujet"
spam: "signalé comme spam"
inappropriate: "signalé comme inapproprié"
notify_moderators: "signalé aux modérateurs"
notify_user: "a envoyé un message"
- bookmark: "ajouté aux signets"
+ bookmark: "signet ajouté"
like: "a aimé ceci"
- vote: "a voté pour ce message"
+ vote: "a voté pour ceci"
by_you:
off_topic: "Vous l'avez signalé comme étant hors-sujet"
spam: "Vous l'avez signalé comme étant du spam"
- inappropriate: "Vous l'avez signalé comme inapproprié"
+ inappropriate: "Vous l'avez signalé comme étant inapproprié"
notify_moderators: "Vous l'avez signalé pour modération"
notify_user: "Vous avez envoyé un message à cet utilisateur"
- bookmark: "Vous l'avez ajouté à vos signets"
+ bookmark: "Vous avez mis un signet à ce message"
like: "Vous l'avez aimé"
- vote: "Vous avez voté pour"
+ vote: "Vous avez voté pour ce message"
by_you_and_others:
off_topic:
one: "Vous et 1 autre personne l'avez signalé comme étant hors-sujet"
@@ -1525,23 +1643,23 @@ fr:
one: "Vous et 1 autre personne l'avez signalé comme étant du spam"
other: "Vous et {{count}} autres personnes l'avez signalé comme étant du spam"
inappropriate:
- one: "Vous et 1 autre personne l'avez signalé comme inapproprié"
- other: "Vous et {{count}} autres personnes l'avez signalé comme inapproprié"
+ one: "Vous et 1 autre personne l'ont signalé comme inapproprié"
+ other: "Vous et {{count}} autres personnes l'ont signalé comme inapproprié"
notify_moderators:
- one: "Vous et 1 autre personne l'avez signalé pour modération"
- other: "Vous et {{count}} autres personnes l'avez signalé pour modération"
+ one: "Vous et 1 autre personne l'ont signalé pour modération"
+ other: "Vous et {{count}} autres personnes l'ont signalé pour modération"
notify_user:
one: "1 autre personne et vous avez envoyé un message à cet utilisateur"
other: "{{count}} autres personnes et vous avez envoyé un message à cet utilisateur"
bookmark:
- one: "Vous et 1 autre personne l'avez ajouté à vos signets"
- other: "Vous et {{count}} autres personnes l'avez ajouté à vos signets"
+ one: "Vous et 1 autre personne ont mis un signet à ce message"
+ other: "Vous et {{count}} autres personnes ont mis un signet à ce message"
like:
- one: "Vous et 1 autre personne l'avez aimé"
- other: "Vous et {{count}} autres personnes l'avez aimé"
+ one: "Vous et 1 autre personne l'ont aimé"
+ other: "Vous et {{count}} autres personnes l'ont aimé"
vote:
- one: "Vous et 1 autre personne avez voté pour"
- other: "Vous et {{count}} autres personnes avez voté pour"
+ one: "Vous et 1 autre personne ont voté pour"
+ other: "Vous et {{count}} autres personnes ont voté pour"
by_others:
off_topic:
one: "1 personne l'a signalé comme étant hors-sujet"
@@ -1559,8 +1677,8 @@ fr:
one: "1 personne a envoyé un message à cet utilisateur"
other: "{{count}} personnes ont envoyé un message à cet utilisateur"
bookmark:
- one: "1 personne a ajouté ceci à ses signets"
- other: "{{count}} personnes ont ajouté ceci à leurs signets"
+ one: "1 personne a mis un signet à ce message"
+ other: "{{count}} personnes ont mis un signet à ce message"
like:
one: "1 personne a aimé ceci"
other: "{{count}} personnes ont aimé ceci"
@@ -1577,7 +1695,7 @@ fr:
other: "Êtes-vous sûr de vouloir fusionner ces {{count}} messages ?"
revisions:
controls:
- first: "Première Révision"
+ first: "Première révision"
previous: "Révision précédente"
next: "Révision suivante"
last: "Dernière révision"
@@ -1590,33 +1708,34 @@ fr:
title: "Afficher le rendu avec les ajouts et les retraits en ligne"
button: ' HTML'
side_by_side:
- title: "Afficher les diffs de rendus côte-à-côte"
+ title: "Afficher les différences de rendu côte-à-côte"
button: ' HTML'
side_by_side_markdown:
title: "Afficher les différences de la source côte-à-côte"
button: ' Brut'
category:
can: 'peut… '
- none: '(pas de catégorie)'
+ none: '(aucune catégorie)'
all: 'Toutes les catégories'
choose: 'Sélectionner une catégorie…'
- edit: 'éditer'
+ edit: 'modifier'
edit_long: "Modifier"
- view: 'Voir les sujets dans cette catégorie'
+ view: 'Voir les sujets dans la catégorie'
general: 'Général'
settings: 'Paramètres'
- topic_template: "Modèle de Sujet"
+ topic_template: "Modèle de sujet"
tags: "Tags"
tags_allowed_tags: "Tags pouvant être utilisés uniquement dans cette catégorie :"
tags_allowed_tag_groups: "Groupes de tags pouvant être utilisés uniquement dans cette catégorie :"
tags_placeholder: "(Facultatif) liste des tags autorisés"
tag_groups_placeholder: "(Facultatif) liste des groupes de tags autorisés"
+ topic_featured_link_allowed: "Autoriser les sujets avec lien dans cette catégorie"
delete: 'Supprimer la catégorie'
create: 'Nouvelle catégorie'
create_long: 'Créer une nouvelle catégorie'
save: 'Enregistrer la catégorie'
slug: 'Identifiant de la catégorie'
- slug_placeholder: '(Facultatif) insérer tirets entre mots dans url'
+ slug_placeholder: '(Facultatif) mots séparés par des tirets pour l''URL'
creation_error: Il y a eu une erreur lors de la création de la catégorie.
save_error: Il y a eu une erreur lors de la sauvegarde de la catégorie.
name: "Nom de la catégorie"
@@ -1631,32 +1750,34 @@ fr:
color_placeholder: "N'importe quelle couleur"
delete_confirm: "Êtes-vous sûr de vouloir supprimer cette catégorie ?"
delete_error: "Il y a eu une erreur lors de la suppression."
- list: "Liste des catégories"
- no_description: "Veuillez ajouter une description pour cette catégorie"
- change_in_category_topic: "Éditer la description"
+ list: "Lister les catégories"
+ no_description: "Veuillez ajouter une description pour cette catégorie."
+ change_in_category_topic: "Modifier 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."
+ 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"
- email_in: "Adresse de courriel entrante personnalisée :"
+ email_in: "Adresse de courriel entrant personnalisée :"
email_in_allow_strangers: "Accepter les courriels d'utilisateurs anonymes sans compte"
email_in_disabled: "La possibilité de créer des nouveaux sujets via courriel est désactivé dans les Paramètres. Pour l'activer,"
email_in_disabled_click: 'activer le paramètre "email in".'
suppress_from_homepage: "Retirer cette catégorie de la page d'accueil"
+ all_topics_wiki: "Faire des nouveaux sujets des Wikis par défaut"
+ sort_order: "Tri par défaut :"
allow_badges_label: "Autoriser les badges à être accordé dans cette catégorie"
- edit_permissions: "Éditer les permissions"
- add_permission: "Ajouter une Permission"
+ edit_permissions: "Modifier les permissions"
+ add_permission: "Ajouter la permission"
this_year: "cette année"
position: "position"
default_position: "Position par défaut"
position_disabled: "Les catégories seront affichées dans l'ordre d'activité. Pour contrôler l'ordre des catégories dans la liste,"
position_disabled_click: 'activer le paramètre "fixed category positions"'
- parent: "Catégorie Parent"
+ parent: "Catégorie parente"
notifications:
watching:
- title: "S'abonner"
+ title: "Surveiller"
description: "Vous surveillerez automatiquement tous les sujets dans ces catégories. Vous serez notifié des nouveaux messages dans tous les sujets, et le nombre de nouvelles réponses sera affiché."
watching_first_post:
title: "Surveiller les nouveaux sujets"
@@ -1670,14 +1791,26 @@ fr:
muted:
title: "Silencieux"
description: "Vous ne serez jamais notifié de rien concernant les nouveaux sujets dans ces catégories, et elles n'apparaîtront pas dans les dernières catégories."
+ sort_options:
+ default: "standard"
+ likes: "J'aime"
+ op_likes: "J'aime du premier message"
+ views: "Vues"
+ posts: "Messages"
+ activity: "Activité"
+ posters: "Auteurs"
+ category: "Catégorie"
+ created: "Création"
+ sort_ascending: 'Croissant'
+ sort_descending: 'Décroissant'
flagging:
- title: 'Merci de nous aider à garder notre communauté aimable !'
+ title: 'Merci d''aider à garder notre communauté civilisée !'
action: 'Signaler ce message'
- take_action: "Signaler"
+ take_action: "Intervenir"
notify_action: 'Message'
official_warning: 'Avertissement officiel'
delete_spammer: "Supprimer le spammeur"
- delete_confirm: "Vous vous apprêtez à supprimer %{posts} messages et %{topics} sujets de cet utilisateur, supprimer son compte, bloquer les inscriptions depuis son adresse IP %{ip_address} et à ajouter son adresse de courriel %{email} à la liste des utilisateurs bloqués. Etes-vous sûr que cet utilisateur est un spammeur ?"
+ delete_confirm_MF: "Vous êtes sur le point de supprimer {POSTS, plural, one {1 message} other {# messages}} et {TOPICS, plural, one {1 sujet} other {# sujets}} de cet utilisateur, supprimer son compte, bloquer les inscriptions depuis son adresse IP {ip_address} et ajouter son adresse courriel {email} à une liste de blocage permanent. Êtes-vous sûr que cet utilisateur est réellement un spammeur ?"
yes_delete_spammer: "Oui, supprimer le spammeur"
ip_address_missing: "(N/A)"
hidden_email_address: "(masqué)"
@@ -1692,9 +1825,15 @@ fr:
custom_placeholder_notify_user: "Soyez précis, constructif, et toujours respectueux."
custom_placeholder_notify_moderators: "Dites-nous ce qui vous dérange spécifiquement, et fournissez des liens pertinents et exemples si possible."
custom_message:
- at_least: "saisir au moins {{n}} caractères"
- more: "{{n}} restants..."
- left: "{{n}} restants"
+ at_least:
+ one: "saisir au moins 1 caractère"
+ other: "saisir au moins {{count}} caractères"
+ more:
+ one: "1 restant…"
+ other: "{{count}} restants…"
+ left:
+ one: "1 restant"
+ other: "{{count}} restants"
flagging_topic:
title: "Merci de nous aider à garder notre communauté civilisé !"
action: "Signaler Sujet"
@@ -1703,7 +1842,7 @@ fr:
title: "Résumé du sujet"
participants_title: "Auteurs fréquents"
links_title: "Liens populaires"
- links_shown: "afficher plus de liens..."
+ links_shown: "afficher plus de liens…"
clicks:
one: "1 clic"
other: "%{count} clics"
@@ -1716,32 +1855,31 @@ fr:
warning:
help: "Ceci est un avertissement officiel."
bookmarked:
- help: "Vous avez ajouté ce sujet à vos signets"
+ help: "Vous avez mis un signet à ce sujet"
locked:
- help: "Ce sujet est fermé; il n'accepte plus de nouvelles réponses"
+ help: "Ce sujet est fermé ; il n'accepte plus de nouvelles réponses"
archived:
- help: "Ce sujet est archivé; il est gelé et ne peut être modifié"
+ help: "Ce sujet est archivé ; il est figé et ne peut être modifié"
locked_and_archived:
help: "Ce sujet est fermé et archivé ; il n'accepte plus de nouvelles réponses et ne peut plus être modifié"
unpinned:
title: "Désépinglé"
- help: "Ce sujet est désépinglé pour vous; il sera affiché dans l'ordre par défaut"
+ help: "Ce sujet est désépinglé pour vous ; il sera affiché dans l'ordre par défaut"
pinned_globally:
- title: "Épingler globalement"
- help: "Ce sujet est épinglé globalement; il apparaîtra en premier dans la liste des derniers sujets et dans sa catégorie"
+ title: "Épinglé globalement"
+ help: "Ce sujet est épinglé globalement ; il apparaîtra en premier dans la liste des derniers sujets et dans sa catégorie"
pinned:
- title: "Épingler"
- help: "Ce sujet est épinglé pour vous; il s'affichera en haut de sa catégorie"
+ title: "Épinglé"
+ help: "Ce sujet est épinglé pour vous ; il s'affichera en haut de sa catégorie"
invisible:
help: "Ce sujet n'apparait plus dans la liste des sujets et sera seulement accessible via un lien direct"
posts: "Messages"
- posts_lowercase: "messages"
posts_long: "il y a {{number}} messages dans ce sujet"
posts_likes_MF: |
Ce sujet a {count, plural, one {1 réponse} other {# réponses}} {ratio, select,
- low {avec un haut ratio de J'aime/Message}
- med {avec un très haut ratio J'aime/Message}
- high {avec un énorme ratio J'aime/Message}
+ low {avec un haut ratio J'aime/messages}
+ med {avec un très haut ratio J'aime/messages}
+ high {avec un énorme ratio J'aime/messages}
other {}}
original_post: "Message original"
views: "Vues"
@@ -1755,7 +1893,7 @@ fr:
likes_lowercase:
one: "J'aime"
other: "J'aime"
- likes_long: "il y a {{number}} j'aime dans ce sujet"
+ likes_long: "il y a {{number}} J'aime dans ce sujet"
users: "Utilisateurs"
users_lowercase:
one: "utilisateur"
@@ -1766,7 +1904,7 @@ fr:
raw_email:
title: "Couriel au format brut"
not_available: "Indisponible !"
- categories_list: "Liste des Catégories"
+ categories_list: "Liste des catégories"
filters:
with_topics: "Sujets %{filter}"
with_category: "Sujets %{filter} sur %{category}"
@@ -1792,9 +1930,9 @@ fr:
unread:
title: "Non lus"
title_with_count:
- one: "1 non lu"
- other: " ({{count}}) non lus"
- help: "sujets que vous suivez ou suivez attentivement actuiellement avec des messages non lus"
+ one: "Non lu (1)"
+ other: "Non lus ({{count}})"
+ help: "sujets avec des messages non lus que vous suivez ou surveillez"
lower_title_with_count:
one: "1 non lu"
other: "{{count}} non lus"
@@ -1813,7 +1951,7 @@ fr:
help: "sujets auxquels vous avez participé"
bookmarks:
title: "Signets"
- help: "sujets ajoutés à vos signets"
+ help: "sujets auxquels vous avez mis un signet"
category:
title: "{{categoryName}}"
title_with_count:
@@ -1824,7 +1962,7 @@ fr:
title: "Top"
help: "les meilleurs sujets de l'année, du mois, de la semaine ou du jour"
all:
- title: "depuis toujours"
+ title: "Depuis toujours"
yearly:
title: "Annuel"
quarterly:
@@ -1849,8 +1987,6 @@ fr:
readonly: "Voir"
lightbox:
download: "télécharger"
- search_help:
- title: 'Aide à la recherche'
keyboard_shortcuts_help:
title: 'Raccourcis clavier'
jump_to:
@@ -1886,7 +2022,7 @@ fr:
actions:
title: 'Actions'
bookmark_topic: 'f Modifier le signet du sujet'
- pin_unpin_topic: 'MAJ.+p Épingler/desépingler le sujet'
+ pin_unpin_topic: 'MAJ.+p Épingler/désépingler le sujet'
share_topic: 'MAJ.+s Partager le sujet'
share_post: 's Partager le message'
reply_as_new_topic: 't Répondre en tant que sujet lié'
@@ -1895,13 +2031,14 @@ fr:
quote_post: 'q Citer le message'
like: 'l Aimer le message'
flag: '! Signaler le message'
- bookmark: 'b Ajouter le message aux signets'
+ bookmark: 'b Mettre un signet au message'
edit: 'e Modifier le message'
delete: 'd Supprimer le message'
mark_muted: 'm, m Mettre le sujet en silencieux'
mark_regular: 'm, r Notifications par défaut pour le sujet'
mark_tracking: 'm, t Suivre le sujet'
mark_watching: 'm, w Surveiller le sujet'
+ print: 'Ctrl+p Imprimer le sujet'
badges:
earned_n_times:
one: "A reçu ce badge 1 fois"
@@ -1921,10 +2058,10 @@ fr:
one: "1 décerné"
other: "%{count} décernés"
select_badge_for_title: Sélectionner un badge comme titre
- none: "Rechercher avec Google
LT"
long_date_with_year_with_linebreak: "D MMM, 'YY
LT"
+ wrap_ago: "fai %{date}"
tiny:
half_a_minute: "< 1m"
less_than_x_seconds:
@@ -46,9 +48,6 @@ gl:
x_seconds:
one: "1s"
other: "%{count}s"
- less_than_x_minutes:
- one: "< 1m"
- other: "< %{count}m"
x_minutes:
one: "1m"
other: "%{count}m"
@@ -111,9 +110,13 @@ gl:
google+: 'compartir esta ligazón no Google+'
email: 'enviar esta ligazón nun correo electrónico'
action_codes:
+ public_topic: "fixo esta publicación pública no %{when}"
+ private_topic: "fixo esta publicación privada no %{when}"
split_topic: "este tema dividiuse o %{when}"
invited_user: "convidou a %{who} %{when}"
+ invited_group: "invitou %{who} o %{when}"
removed_user: "eliminou a %{who} %{when}"
+ removed_group: "eliminou %{who} o %{when}"
autoclosed:
enabled: 'pechado o %{when}'
disabled: 'aberto o %{when}'
@@ -133,6 +136,7 @@ gl:
enabled: 'listado o %{when}'
disabled: 'retirado da lista o %{when}'
topic_admin_menu: "accións do administrador de temas"
+ wizard_required: "É hora de configura-lo teu foro! Inicie o Asistente de Configuración!"
emails_are_disabled: "Todos os correos electrónicos saíntes foron desactivados globalmente por un administrador. Non se enviará ningún tipo de notificación por correo electrónico."
s3:
regions:
@@ -310,12 +314,6 @@ gl:
one: "Un usuario"
other: "%{count} usuarios"
groups:
- empty:
- posts: "Non hai publicacións de membros deste grupo."
- members: "Non hai ningún membro neste grupo."
- mentions: "Non hai ningunha mención deste grupo."
- messages: "Non hai ningunha mensaxe para este grupo."
- topics: "Non hai temas por membros deste grupo."
add: "Engadir"
selector_placeholder: "Engadir membros"
owner: "propietario"
@@ -384,14 +382,9 @@ gl:
latest_by: "últimos de"
toggle_ordering: "trocar o control de ordenación"
subcategories: "Subcategorías"
- topic_stats: "Número de temas novos."
topic_stat_sentence:
one: "%{count} tema novo no último %{unit}."
other: "%{count} temas novos no último %{unit}."
- post_stats: "O número de publicacións novas."
- post_stat_sentence:
- one: "%{count} nova publicación na última %{unit}."
- other: "%{count} novas publicacións na última %{unit}."
ip_lookup:
title: Busca do enderezo IP
hostname: Nome do servidor
@@ -414,7 +407,6 @@ gl:
profile: "Perfil"
mute: "Silenciar"
edit: "Editar preferencias"
- download_archive: "Descargar as miñas publicacións"
new_private_message: "Nova mensaxe"
private_message: "Mensaxe"
private_messages: "Mensaxes"
@@ -634,13 +626,9 @@ gl:
account_age_days: "Tempo da conta en días"
create: "Enviar un convite"
generate_link: "Copiar a ligazón do convite"
- generated_link_message: '
+ נושאים וקטגוריות שהושתקו לא יכללו במיילים אלו.
daily: "שלח עדכונים יומיים"
individual: "שליחת מייל עבור כל פוסט חדש"
+ individual_no_echo: "שלח מייל עבור כל פוסט חדש מלבד שלי"
many_per_day: "שלחו לי מייל עבור כל פוסט חדש (בערך {{dailyEmailEstimate}} ביום)"
few_per_day: "שלחו לי מייל עבור כל פוסט חדש (בערך 2 ביום)"
tag_settings: "תגיות"
watched_tags: "נצפה"
+ watched_tags_instructions: "תעקבו באופן אוטומטי אחרי כל הנושאים עם התגיות הללו. תקבלו התראה על כל הפרסומים והנושאים החדשים. מספר הפרסומים יופיע לצד כותרת הנושא."
tracked_tags: "במעקב"
+ tracked_tags_instructions: "אתם תעקבו אוטומטית אחר כל הנושאים עם תגיות אלו. ספירה של פוסטים חדשים תופיע ליד הנושא."
muted_tags: "מושתק"
- watched_categories: "עוקב"
- tracked_categories: "רגיל+"
- watched_first_post_categories: "צפייה בהודעה ראשונה"
- watched_first_post_tags: "צפייה בהודעה ראשונה"
+ muted_tags_instructions: "אתם לא תיודעו לגבי דבר בנוגע לנושאים חדשים עם תגיות אלו, והם לא יופיעו ברשימת האחרונים."
+ watched_categories: "נצפה"
+ watched_categories_instructions: "תעקבו באופן אוטומטי אחרי כל הנושאים בקטגוריות אלו. תקבלו התראה על כל הפוסטים והנושאים החדשים. מספר הפוסטים יופיע לצד כותרת הנושא."
+ tracked_categories: "במעקב"
+ tracked_categories_instructions: "אתם תעקבו אוטומטית אחר כל הנושאים עם קטגוריות אלו. ספירה של פוסטים חדשים תופיע ליד הנושא."
+ watched_first_post_categories: "צפייה בפוטס הראשון"
+ watched_first_post_categories_instructions: "אתם תיודעו לגבי הפוסט הראשון בכל נושא חדש בקטגוריות אלו."
+ watched_first_post_tags: "צפייה בפוסט ראשון"
+ watched_first_post_tags_instructions: "אתם תיודעו לגבי הפוסט הראשון בכל נושא חדש בתגיות אלו."
muted_categories: "מושתק"
+ muted_categories_instructions: "אתם לא תיודעו על שום דבר לגבי נושאים חדשים בקטגוריות אלו, והם לא יופיעו ב״אחרונים״."
delete_account: "מחק את החשבון שלי"
- delete_account_confirm: "אתה בטוח שברצונך למחוק את החשבון? לא ניתן לבטל פעולה זו!"
+ delete_account_confirm: "אתם בטוחים שברצונכם למחוק את החשבון? לא ניתן לבטל פעולה זו!"
deleted_yourself: "חשבונך נמחק בהצלחה."
- delete_yourself_not_allowed: "אתה לא יכול למחוק את חשבונך כרגע. צור קשר עם מנהל כדי שימחק אותו בשבילך."
+ delete_yourself_not_allowed: "אתם לא יכולים למחוק את חשבונכם כרגע. צרו קשר עם מנהל כדי שימחק אותו בשבילכם."
unread_message_count: "הודעות"
admin_delete: "מחק"
users: "משתמשים"
muted_users: "מושתק"
muted_users_instructions: "להשבית כל התראה ממשתמשים אלו"
- muted_topics_link: "הצג פוסטים שהוסתרו"
+ muted_topics_link: "הצג נושאים שהושתקו"
watched_topics_link: "הצגת נושאים נצפים"
+ automatically_unpin_topics: "בטל נעיצת נושאים באופן אוטומטי כאשר אני מגיע/ה לתחתית."
+ apps: "אפליקציות"
+ revoke_access: "שלילת גישה"
+ undo_revoke_access: "ביטול שלילת גישה"
+ api_approved: "אושרו:"
staff_counters:
- flags_given: "סימונים שעוזרים"
- flagged_posts: "הודעות מסומנות"
- deleted_posts: "הודעות שנמחקו"
+ flags_given: "דגלים שעוזרים"
+ flagged_posts: "פסטים מדוגלים"
+ deleted_posts: "פוסטים שנמחקו"
suspensions: "השעיות"
warnings_received: "אזהרות"
messages:
@@ -525,6 +594,7 @@ he:
error: "ארעה שגיאה בשינוי ערך זה."
change_username:
title: "שנה שם משתמש"
+ confirm: "אם תשנו את שם המשתמש שלכם, כל הציטוטים הקודמים של פוסטים שלכם ואזכורי @שמות ישברו. האם אתם בטוחים לחלוטין שזה מה שתרצו לעשות?"
taken: "סליחה, שם המשתמש הזה תפוס."
error: "ארעה שגיאה בשינוי שם המשתמש שלך."
invalid: "שם המשתמש אינו תקין. עליו לכלול רק אותיות באנגלית ומספרים."
@@ -532,16 +602,16 @@ he:
title: "שנה דואר אלקטרוני"
taken: "סליחה, הכתובת הזו אינה זמינה."
error: "הייתה שגיאה בשינוי כתובת הדואר האלקטרוני שלך. אולי היא תפוסה?"
- success: "שלחנו דואר אלקטרוני לכתובת הדואר הזו. בבקשה עקוב אחרי הוראות האישור שם."
+ success: "שלחנו דואר אלקטרוני לכתובת הדואר הזו. בבקשה עיקבו אחרי הוראות האישור שם."
change_avatar:
title: "שינוי תמונת הפרופיל"
gravatar: "Gravatar, מבוסס על"
- gravatar_title: "שנה את ה-avatar שלך באתר-Gravatar"
+ gravatar_title: "שנו את הדמות שלכם באתר-Gravatar"
refresh_gravatar_title: "רענון האווטר שלכם"
- letter_based: "תמונת פרופיל משובצת מערכתית"
+ letter_based: "תמונת פרופיל משובצת מהמערכת"
uploaded_avatar: "תמונה אישית"
- uploaded_avatar_empty: "הוסף תמונה אישית"
- upload_title: "העלה את התמונה שלך"
+ uploaded_avatar_empty: "הוסיפו תמונה אישית"
+ upload_title: "העלו את התמונה שלכם"
upload_picture: "העלאת תמונה"
image_is_not_a_square: "אזהרה: קיצצנו את התמונה שלך; האורך והרוחב לא היו שווים."
cache_notice: "שינית את תמונת הפרופיל שלך בהצלחה אבל יכול לקחת קצת זמן עד שהתמונה תופיע."
@@ -554,9 +624,13 @@ he:
email:
title: "דואר אלקטרוני"
instructions: "לא נצפו מעולם"
- ok: "נשלח לך דואר אלקטרוני לאישור"
- invalid: "בבקשה הכנס כתובת דואר אלקטרוני חוקית"
+ ok: "נשלח אליכם דואר אלקטרוני לאישור"
+ invalid: "בבקשה הכניסו כתובת דואר אלקטרוני תקינה"
authenticated: "כתובת הדואר האלקטרוני שלך אושרה על ידי {{provider}}"
+ frequency_immediately: "נשלח לכם מייל מיידית אם לא קראתם את מה ששלחנו לכם עליו מייל."
+ frequency:
+ one: "נשלח אליכם דוא\"ל רק אם לא ראינו אתכם בדקה האחרונה."
+ other: "נשלח אליכם דוא\"ל רק אם לא ראינו אתכם ב{{count}} הדקות האחרונות."
name:
title: "שם"
instructions: "שמך המלא (רשות)"
@@ -564,13 +638,13 @@ he:
too_short: "השם שלך קצר מידי"
ok: "השם נראה טוב"
username:
- title: "שם משתמש"
+ title: "שם משתמש/ת"
instructions: "ייחודי, ללא רווחים וקצר"
short_instructions: "אנשים יכולים לאזכר אותך כ @{{username}}"
available: "שם המשתמש שלך פנוי"
global_match: "הדואר האלקטרוני תואם את שם המשתמש הרשום"
- global_mismatch: "כבר רשום. נסה {{suggestion}}?"
- not_available: "לא זמין. נסה {{suggestion}}?"
+ global_mismatch: "כבר רשום. נסו {{suggestion}}?"
+ not_available: "לא זמין. נסו {{suggestion}}?"
too_short: "שם המשתמש שלך קצר מידי"
too_long: "שם המשתמש שלך ארוך מידי"
checking: "בודק זמינות שם משתמש..."
@@ -580,19 +654,21 @@ he:
title: "שפת ממשק"
instructions: "שפת ממשק המשתמש. היא תתחלף כשתרעננו את העמוד."
default: "(ברירת מחדל)"
+ any: "כלשהו"
password_confirmation:
title: "סיסמה שוב"
- last_posted: "פרסום אחרון"
+ last_posted: "פוסט אחרון"
last_emailed: "נשלח לאחרונה בדואר אלקטרוני"
last_seen: "נראה"
- created: "הצטרף"
+ created: "הצטרפו"
log_out: "התנתקות"
location: "מיקום"
card_badge:
- title: "תג כרטיס משתמש/ת"
+ title: "עיטור כרטיס משתמש/ת"
website: "אתר"
email_settings: "דואר אלקטרוני"
like_notification_frequency:
+ title: "התראה כשנאהב"
always: "תמיד"
first_time_and_daily: "בפעם הראשונה שמישהו אוהב פוסט ומידי יום"
first_time: "בפעם הראשונה שמישהו אוהב פוסט"
@@ -611,21 +687,21 @@ he:
weekly: "שבועית"
every_two_weeks: "כל שבועיים"
include_tl0_in_digests: "כללו תכנים ממשתמשים חדשים במיילים מסכמים"
- email_in_reply_to: "כלילת ציטוטים מפוסטים שהגיבו אליהם במיילים"
- email_direct: "שלחו לי דוא\"ל כשמישהו/י מצטטים אותי, מגיבם לפרסום שלי, מזכירים את @שם_המשתמש/ת שלי, או מזמינים אותי לפוסט"
- email_private_messages: "שלחו לי דוא\"ל כשמישהו/י שולחים לי מסר"
- email_always: "שלח לי נוטיפקציות מייל גם כשאני פעיל/ה באתר. "
+ email_in_reply_to: "הכללת ציטוטים מתגובות לפרסומים שנשלחו בדוא\"ל"
+ email_direct: "שלחו לי דוא\"ל כשמישהם מצטטים אותי, מגיבים לפוסט שלי, מזכירים את @שם-המשתמש/ת שלי, או מזמינים אותי לנושא"
+ email_private_messages: "שלחו לי דוא\"ל כשמישהם שולחים לי הודעות"
+ email_always: "שלח לי התראות מייל גם כשאני פעיל/ה באתר. "
other_settings: "אחר"
categories_settings: "קטגוריות"
new_topic_duration:
- label: "פוסט יחשב כפוסט חדש כאשר"
+ label: "נושא יחשב כנושא חדש כאשר"
not_viewed: "עוד לא ראיתי אותם"
last_here: "נוצרו מאז הביקור האחרון שלי כאן"
after_1_day: "נוצר ביום האחרון"
after_2_days: "נוצר במהלך היומיים האחרונים"
after_1_week: "נוצר במהלך השבוע האחרון"
after_2_weeks: "נוצר בשבועיים האחרונים"
- auto_track_topics: "מעקב אוטומטי פוסטים אליהם נכנסתי"
+ auto_track_topics: "מעקב אוטומטי אחר נושאים אליהם נכנסתי"
auto_track_options:
never: "אף פעם"
immediately: "מיידי"
@@ -636,12 +712,13 @@ he:
after_4_minutes: "אחרי 4 דקות"
after_5_minutes: "אחרי 5 דקות"
after_10_minutes: "אחרי 10 דקות"
+ notification_level_when_replying: "כאשר אני מפרסם נושא, קבע נושא זה ל"
invited:
search: "הקלידו כדי לחפש הזמנות..."
title: "הזמנות"
- user: "משתמש/ת שהוזמנו"
+ user: "משתמשים שהוזמנו"
sent: "נשלח"
- none: "אין הזמנות ממתינות להציג"
+ none: "אין הזמנות ממתינות להציג."
truncated:
one: "מראה את ההזמנה הראשונה."
other: "מראה את {{count}} ההזמנות הראשונות."
@@ -652,8 +729,8 @@ he:
pending: "הזמנות ממתינות"
pending_tab: "ממתין"
pending_tab_with_count: "ממתינות ({{count}})"
- topics_entered: "פוסטים נצפו"
- posts_read_count: "הודעות נקראו"
+ topics_entered: "נושאים נצפו"
+ posts_read_count: "פוסטים נקראו"
expired: "פג תוקף ההזמנה."
rescind: "הסרה"
rescinded: "הזמנה הוסרה"
@@ -665,14 +742,13 @@ he:
days_visited: "מספר ימי ביקור"
account_age_days: "גיל החשבון בימים"
create: "שליחת הזמנה"
- generate_link: "העתק קישור הזמנה"
- generated_link_message: '
+
+
זהירות: כרגע, שום מידע תלוי-הודעה אינו מועבר למשתמש החדש. השתמשו בזהירות."
+ one: "אנא בחר את הבעלים החדש של הפוסטים מאת {{old_user}}."
+ other: "אנא בחרו את הבעלים החדש של {{count}} הפוסטים מאת {{old_user}}."
+ instructions_warn: "יש לשים לב שהתראות על פוסט זה יועברו למשתמש החדש רטרואקטיבית.
זהירות: כרגע, שום מידע תלוי-פוסט אינו מועבר למשתמש החדש. השתמשו בזהירות."
change_timestamp:
- title: "שנה חותמת זמן"
- action: "זנה חותמת זמן"
- invalid_timestamp: "חותמת זמן לא יכולה להיות בעתיד"
- error: "הייתה שגיאה בשינוי חותמת הזמן של הפוסט"
- instructions: "אנא בחרו את חותמת הזמן החדשה של הפוסט. פרסומים בפוסט יועדכנו לאותם הפרשי זמנים."
+ title: "שינוי חותמת זמן"
+ action: "שינוי חותמת זמן"
+ invalid_timestamp: "חותמת זמן לא יכולה להיות בעתיד."
+ error: "היתה שגיאה בשינוי חותמת הזמן של הנושא."
+ instructions: "אנא בחרו את חותמת הזמן החדשה של הנושא. פוסטים בנושא יועדכנו לאותם הפרשי זמנים."
multi_select:
select: 'בחירה'
selected: 'נבחרו ({{count}})'
@@ -1323,29 +1522,28 @@ he:
select_all: בחר הכל
deselect_all: בחר כלום
description:
- one: בחרת הודעה אחת.
- other: בחרת {{count}} הודעות.
+ one: בחרתם פוסט אחד.
+ other: בחרתם {{count}} פוסטים.
post:
reply: " {{replyAvatar}} {{usernameLink}}"
reply_topic: " {{link}}"
- quote_reply: "תגובה עם ציטוט"
+ quote_reply: "ציטוט"
edit: "עורך את {{link}} {{replyAvatar}} {{username}}"
edit_reason: "סיבה: "
- post_number: "הודעה {{number}}"
- last_edited_on: "הודעה נערכה לאחרונה ב"
- reply_as_new_topic: "תגובה כפוסט מקושר"
+ post_number: "פוסט {{number}}"
+ last_edited_on: "הפוסט נערך לאחרונה ב"
+ reply_as_new_topic: "תגובה כנושא מקושר"
continue_discussion: "ממשיך את הדיון מ {{postLink}}:"
- follow_quote: "מעבר להודעה המצוטטת"
- show_full: "הראה הודעה מלאה"
+ follow_quote: "מעבר לפוסט המצוטט"
+ show_full: "הצגת פוסט מלא"
show_hidden: 'הצגת תוכן מוסתר.'
deleted_by_author:
- one: "(ההודעה בוטלה על ידי הכותב, היא תמחק אוטומטית בעוד %{count} שעות אלא אם תסומן בדגל)"
- other: "(ההודעה בוטלה על ידי הכותב/ת, היא תמחק אוטומטית בעוד %{count} שעות אלא אם כן היא תסומן )"
+ one: "(הפוסט בוטל על ידי הכותבים, הוא ימחק אוטומטית בעוד %{count} שעות אלא אם יסומן בדגל)"
+ other: "(הפוסט נלקח בחזרה על ידי הכותבים, הוא ימחק אוטומטית בעוד %{count} שעות אלא אם כן הוא ידוגל)"
expand_collapse: "הרחב/צמצם"
gap:
- one: "הצג הודעה אחת שהוסתרה"
- other: "הצג {{count}} הודעות שהוסתרו"
- more_links: "עוד {{count}}..."
+ one: "הצג תגובה אחת שהוסתרה"
+ other: "הצגת {{count}} תגובות שהוסתרו"
unread: "הפוסט טרם נקרא"
has_replies:
one: "תגובה אחת"
@@ -1356,47 +1554,52 @@ he:
has_likes_title:
one: "מישהו אחד אהב את התגובה הזו"
other: "{{count}} אנשים אהבו את התגובה הזו"
- has_likes_title_only_you: "אתה אהבת את התגובה הזו"
+ has_likes_title_only_you: "אתם אהבתם את התגובה הזו"
+ has_likes_title_you:
+ one: "אתם ועוד מישהו אהבתם את הפוסט הזה"
+ other: "אתם ו {{count}} אנשים אחרים אהבתם את הפוסט הזה"
errors:
- create: "סליחה, הייתה שגיאה ביצירת ההודעה שלך. אנא נסה שנית."
- edit: "סליחה, הייתה שגיאה בעריכת ההודעה שלך. אנא נסה שנית."
- upload: "סליחה, הייתה שגיאה בהעלאת הקובץ שלך. אנא נסה שנית"
+ create: "סליחה, הייתה שגיאה ביצירת הפוסט שלכם. אנא נסו שנית."
+ edit: "סליחה, הייתה שגיאה בעריכת הפוסט שלכם. אנא נסו שנית."
+ upload: "סליחה, הייתה שגיאה בהעלאת הקובץ שלך. אנא נסו שנית"
+ file_too_large: "מצטערים, הקובץ גדול מידי (הגודל המירבי הוא {{max_size_kb}}kb). אולי תקצו להעלות קבצים גדולים לשירות שיתוף בענן ולשתף את הקישור."
too_many_uploads: "סליחה, אך ניתן להעלות רק קובץ אחת כל פעם."
too_many_dragged_and_dropped_files: "מצטערים, אתם יכולים להעלות עד 10 קבצים בו זמנית."
- upload_not_authorized: "סליחה, אך סוג הקובץ שאתה מנסה להעלות אינו מורשה (סיומות מורשות: {{authorized_extensions}})."
+ upload_not_authorized: "סליחה, אך סוג הקובץ שאתם מנסים להעלות אינו מורשה (סיומות מורשות: {{authorized_extensions}})."
image_upload_not_allowed_for_new_user: "סליחה, משתמשים חדשים לא יכולים להעלות תמונות."
attachment_upload_not_allowed_for_new_user: "סליחה, משתמשים חדשים לא יכולים להעלות קבצים."
attachment_download_requires_login: "מצטערים, עליכם להיות מחוברים כדי להוריד את הקבצים המצורפים."
abandon:
- confirm: "האם אתה רוצה לנטוש את ההודעה שלך?"
- no_value: "לא, שמור אותה"
+ confirm: "האם אתם רוצים לנטוש את הפוסט שלכם?"
+ no_value: "לא, שמור אותו"
yes_value: "כן, נטוש"
- via_email: "פרסום זה הגיע באמצעות דוא\"ל"
+ via_email: "פוסט זה הגיע באמצעות דוא\"ל"
via_auto_generated_email: "פוסט זה הגיע דרך מייל שנוצר אוטומטית"
- whisper: "פרסום זה הוא לחישה פרטית לצוות האתר"
+ whisper: "פוסט זה הוא לחישה פרטית למנחים"
wiki:
about: "פוסט זה הוא ויקי"
archetypes:
save: 'שמור אפשרויות'
+ few_likes_left: "תודה שאתם מפזרים אהבה! נותרו לכם מעט לייקים להיום."
controls:
- reply: "התחל לכתוב תגובה להודעה זו"
- like: "תן לייק להודעה זו"
+ reply: "התחילו לכתוב תגובה לפוסט זה"
+ like: "תנו לייק לפוסט זה"
has_liked: "אהבת פוסט זה"
undo_like: "בטל 'אהוב'"
- edit: "ערוך הודעה זו"
- edit_anonymous: "מצטערים, אך עליכם להיות מחוברים בכדי לערוך פרסום זה."
- flag: "סימון הודעה זו באופן פרטי לתשומת לב או שלח התראה פרטית עליה"
- delete: "מחק הודעה זו"
- undelete: "שחזר הודעה זו"
- share: "שיתוף קישור להודעה זו"
+ edit: "עירכו פוסט זה"
+ edit_anonymous: "מצטערים, אך עליכם להיות מחוברים בכדי לערוך פוסט זה."
+ flag: "דגלו פוסט זה באופן פרטי לתשומת לב או שלחו התראה פרטית עליו"
+ delete: "מחק פוסט זה"
+ undelete: "שחזר פוסט זה"
+ share: "שיתוף קישור לפוסט זה"
more: "עוד"
delete_replies:
confirm:
- one: "אתה רוצה למחוק את התגובה הישירה להודעה זו?"
- other: "אתה רוצה למצחוק את {{count}} התגובות הישירות להודעה זו?"
+ one: "אתם רוצים למחוק את התגובה הישירה לפוסט זה?"
+ other: "אתם רוצים למחוק את {{count}} התגובות הישירות לפוסט זה?"
yes_value: "כן, מחק גם את התגובות"
- no_value: "לא, רק את ההודעה"
- admin: "פרסום פעולות מנהל/ת"
+ no_value: "לא, רק את הפוסט"
+ admin: "פעולות ניהול של הפוסט"
wiki: "יצירת wiki"
unwiki: "הסרת ה-Wiki"
convert_to_moderator: "הוספת צבע צוות"
@@ -1405,97 +1608,93 @@ he:
unhide: "הסרת הסתרה"
change_owner: "שינוי בעלות"
actions:
- flag: 'סימון'
+ flag: 'דיגול'
defer_flags:
one: "דחיית סימון"
- other: "דחיית סימונים"
- it_too:
- off_topic: "דגלל גם את זה"
- spam: "סמנו גם את זה"
- inappropriate: "סמנו גם את זה"
- custom_flag: "סמנו גם את זה"
- bookmark: "העדף גם את זה"
- like: "תן לייק גם לזה"
- vote: "הצבע גם לזה"
+ other: "דחיית דגלים"
undo:
- off_topic: "ביטול סימון"
- spam: "ביטול סימון"
- inappropriate: "ביטול סימון"
+ off_topic: "ביטול דיגול"
+ spam: "ביטול דיגול"
+ inappropriate: "ביטול דיגול"
bookmark: "בטל העדפה"
like: "בטל לייק"
vote: "בטל הצבעה"
people:
- off_topic: "סומן כלא קשור לנושא השיחה"
- spam: "סומן כספאם"
- inappropriate: "סומן כלא ראוי"
+ off_topic: "דוגל כאוף-טופיק"
+ spam: "דוגל כספאם"
+ inappropriate: "דוגל כלא ראוי"
notify_moderators: "דווח לעורכים"
notify_user: "נשלחה הודעה"
bookmark: "סומן"
like: "אהבו את זה"
vote: "הצביעו לזה"
by_you:
- off_topic: "סמנת פרסום זה כמחוץ לנושא הפוסט"
- spam: "סמנת את זה כספאם"
- inappropriate: "סמנת את זה כלא ראוי"
- notify_moderators: "סמנת את זה עבור המנהלים"
- notify_user: "שלחת הודעה למשתמש זה"
- bookmark: "סימנת הודעה זו כמועדפת"
+ off_topic: "דיגלתם פרסום זה כאוף-טופיק"
+ spam: "דיגלתם את זה כספאם"
+ inappropriate: "דיגלתם את זה כלא ראוי"
+ notify_moderators: "דיגלתם זאת עבור המנחים"
+ notify_user: "שלחתם הודעה למשתמש זה"
+ bookmark: "סימנתם פוסט זה עם סימנייה"
like: "נתת לזה לייק"
- vote: "הצבעת להודעה זו"
+ vote: "הצבעתם לפוסט זה"
by_you_and_others:
off_topic:
- one: "אתה ועוד אחד דגללתם את זה כאוף-טופיק"
- other: "את/ה ועוד {{count}} אנשים אחרים סמנתם את זה כמחוץ לנושא הפוסט"
+ one: "אתם ועוד אחד דיגלתם את זה כאוף-טופיק"
+ other: "אתם ועוד {{count}} אנשים אחרים דיגלתם את זה כאוף-טופיק"
spam:
- one: "אתה ועוד אחד דגללתם את זה כספאם"
- other: "את/ה ועוד {{count}} אנשים אחרים סמנתם את זה כספאם"
+ one: "אתם ועוד אחד דיגלתם את זה כספאם"
+ other: "אתם ועוד {{count}} אנשים אחרים דיגלתם את זה כספאם"
inappropriate:
- one: "אתה ועוד אחד דגלתתם את זה כלא ראוי"
- other: "את/ה ועוד {{count}} אנשים אחרים סמנתם את זה כלא ראוי"
+ one: "אתם ועוד אחד דיגלתם את זה כלא ראוי"
+ other: "אתם ועוד {{count}} אנשים אחרים דיגלתם את זה כלא ראוי"
notify_moderators:
- one: "אתה ועוד אחד דגללתם את זה עבור ניהול"
- other: "את/ה ועוד {{count}} אנשים אחרים סמנתם את זה לניהול"
+ one: "אתם ועוד אחד דיגלתם את זה עבור המנחים"
+ other: "אתם ועוד {{count}} אנשים אחרים דיגלתם את זה למנחים"
notify_user:
- one: "אתה ו-1 נוסף שלחתם הודעה למשתמש הזה. "
- other: "אתה ו{{count}} אנשים נוספים שלחתם הודעה למשתמש הזה"
+ one: "אתם ו-1 נוסף שלחתם הודעה למשתמש הזה. "
+ other: "אתם ו{{count}} אנשים נוספים שלחתם הודעה למשתמש הזה"
bookmark:
- one: "אתה ועוד אחד סימנתם הודעה זו כמועדפת"
- other: "אתה ועוד {{count}} אנשים אחרים סימנתם הודעה זו כמועדפת"
+ one: "אתה ועוד אחד סימנתם פוסט זה עם סימנייה"
+ other: "אתה ועוד {{count}} אנשים אחרים סימנתם פוסט זה עם סימנייה"
like:
one: "אתה ועוד אחד נתתם לייק לזה"
other: "אתה ועוד {{count}} אנשים אחרים נתתם לייק לזה"
vote:
- one: "אתה ועוד אחד הצבעת להודעה זו"
- other: "אתה ועוד {{count}} אנשים אחרים הצבעתם להודעה זו"
+ one: "אתה ועוד אחד הצבעתם לפוסט זה"
+ other: "אתה ועוד {{count}} אנשים אחרים הצבעתם לפוסט זה"
by_others:
off_topic:
- one: "אדם אחד דגלל את זה כאוף-טופיק"
+ one: "אדם אחד דיגל את זה כאוף-טופיק"
other: "{{count}} אנשים סמנו את זה כאוף-טופיק"
spam:
- one: "אדם אחד דגלל את זה כספאם"
- other: "{{count}} אנשים סמנו את זה כספאם"
+ one: "אדם אחד דיגל את זה כספאם"
+ other: "{{count}} אנשים דיגלו את זה כספאם"
inappropriate:
- one: "אדם אחד דגלל את זה כלא ראוי"
- other: "{{count}} אנשים סמנו את זה כלא ראוי"
+ one: "אדם אחד דיגל את זה כלא ראוי"
+ other: "{{count}} אנשים דיגלו את זה כלא ראוי"
notify_moderators:
- one: "אדם אחד דגלל את זה לניהול"
- other: "{{count}} אנשים סמנו את זה לניהול"
+ one: "אדם אחד דיגל את זה למנחים"
+ other: "{{count}} אנשים דיגלו את זה למנחים"
notify_user:
one: "אדם אחד שלח הודעה למשתמש זה"
other: "{{count}} שלחו הודעה למשתמש זה"
bookmark:
- one: "אדם אחד סימן הודעה זו כמועדפת"
- other: "{{count}} אנשים סימנו הודעה זו כמועדפת"
+ one: "אדם אחד סימן פוסט זה כמועדף"
+ other: "{{count}} אנשים סימנו פוסט זה כמועדף"
like:
one: "אדם אחד נתן לזה לייק"
other: "{{count}} אנשים נתנו לזה לייק"
vote:
- one: "אדם אחד הצביע להודעה זו"
- other: "{{count}} אנשים הצביעו להודעה זו"
+ one: "אדם אחד הצביע לפוסט זה"
+ other: "{{count}} אנשים הצביעו לפוסט זה"
delete:
confirm:
- one: "Are you sure you want to delete that post?"
- other: "Are you sure you want to delete all those posts?"
+ one: "האם אתם בטוחים שאתם מעוניינים למחוק פוסט זה?"
+ other: "האם אתם בטוחים שאתם מעוניינים למחוק את כל הפוסטים האלו?"
+ merge:
+ confirm:
+ one: "אתם בטוחים שאתם מעוניינים למזג את הפוסטים האלו?"
+ other: "אתם בטוחים שאתם מעוניינים למזג את {{count}} הפוסטים האלו?"
revisions:
controls:
first: "מהדורה ראשונה"
@@ -1505,7 +1704,7 @@ he:
hide: "הסתרת שינויים"
show: "הצגת שינויים"
revert: "חזרה לגרסה זו"
- comparing_previous_to_current_out_of_total: "{{קודם}} {{נוכחי}} / {כוללl}}"
+ comparing_previous_to_current_out_of_total: "{{previous}} {{current}} / {{total}}"
displays:
inline:
title: "הצג את הפלט עם תוספות והסרות בתוכו"
@@ -1523,17 +1722,20 @@ he:
choose: 'בחר קטגוריה…'
edit: 'ערוך'
edit_long: "עריכה"
- view: 'הצג פוסטים בקטגוריה'
+ view: 'הצגת נושאים בקטגוריה'
general: 'כללי'
settings: 'הגדרות'
- topic_template: "תבנית פוסט"
+ topic_template: "תבנית נושא"
tags: "תגיות"
tags_allowed_tags: "תגיות שניתנות לשימוש בקטגוריה זו בלבד:"
tags_allowed_tag_groups: "קבוצות תגים שניתנות לשימוש בקטגוריה זו:"
+ tags_placeholder: "(אופציונלי) רשימת תגים מותרים"
+ tag_groups_placeholder: "(אופציונלי) רשימת קבוצות תגים"
+ topic_featured_link_allowed: "אפשרו קישורים מומלצים בקטגוריה זו"
delete: 'מחק קטגוריה'
create: 'קטגוריה חדשה'
- create_long: 'צור קטגוריה חדשה'
- save: 'שמור קטגוריה'
+ create_long: 'יצירת קטגוריה חדשה'
+ save: 'שמירת קטגוריה'
slug: 'כתובת חלזונית לקטגוריה'
slug_placeholder: '(אופציונאלי) מלים-מחוברות-במקפים-לכתובת-URL'
creation_error: ארעה שגיאה במהלך יצירת הקטגוריה הזו.
@@ -1543,7 +1745,7 @@ he:
topic: "נושא הקטגוריה"
logo: "תמונת לוגו לקטגוריה"
background_image: "תמונת רקע לקטגוריה"
- badge_colors: "צבעי התג"
+ badge_colors: "צבעי העיטורים"
background_color: "צבע רקע"
foreground_color: "צבע קדמי"
name_placeholder: "מילה או שתיים לכל היותר"
@@ -1555,16 +1757,18 @@ he:
change_in_category_topic: "ערוך תיאור"
already_used: 'הצבע הזה בשימוש על ידי קטגוריה אחרת'
security: "אבטחה"
- special_warning: "Warning: This category is a pre-seeded category and the security settings cannot be edited. If you do not wish to use this category, delete it instead of repurposing it."
+ special_warning: "אזהרה: קטגוריה זו הגיעה מראש והגדרות האבטחה שלה אינן ניתנות לשינוי. אם אתם מעוניינים להשתמש בקטגוריה זו, מחקו אותה במקום להשתמש בה מחדש."
images: "תמונות"
- auto_close_label: "נעל פוסטים אוטומטית אחרי:"
+ auto_close_label: "סגור נושאים אוטומטית אחרי:"
auto_close_units: "שעות"
email_in: "כתובת דואר נכנס מותאמת אישית:"
email_in_allow_strangers: "קבלת דוא\"ל ממשתמשים אנונימיים ללא חשבונות במערכת הפורומים"
- email_in_disabled: "האפשרות פרסום פוסטים חדשים דרך הדוא\"ל נוטרלה דרך הגדרות האתר. לאפשר פרסום באמצעות משלוח דוא\"ל."
+ email_in_disabled: "אפשרות הפרסום של נושאים חדשים דרך דוא\"ל נוטרלה בהגדרות האתר. כדי לאפשר פרסום באמצעות משלוח דוא\"ל,"
email_in_disabled_click: 'אפשרו את את ההגדרה "דוא"ל נכנס"'
- suppress_from_homepage: "הרחק קטגוריה זו מהעמוד הראשי"
- allow_badges_label: "הרשו לתגים (badges) להיות מוענקים בקטגוריה זו"
+ suppress_from_homepage: "הרחיקו קטגוריה זו מהעמוד הראשי."
+ all_topics_wiki: "כברירת מחדל נושאים חדשים יהיו וויקי."
+ sort_order: "סידור ברירת מחדל:"
+ allow_badges_label: "הרשו לעיטורים להיות מוענקים בקטגוריה זו"
edit_permissions: "ערוך הרשאות"
add_permission: "הוסף הרשאה"
this_year: "השנה"
@@ -1576,47 +1780,68 @@ he:
notifications:
watching:
title: "עוקב"
+ description: "תצפו באופן אוטומטי בכל הנושאים שבקטגוריות אלו. תקבלו התראה על כל פוסט חדש בכל אחד מהנושאים בקטגוריה ואת מספר התגובות לכל אחד מהם."
watching_first_post:
- title: "צפייה בהודעה ראשונה"
+ title: "צפייה בפוסט הראשון"
+ description: "תקבלו התראה על הפוסט הראשון בכל אחד מהנושאים בקטגוריות אלו."
tracking:
- title: "רגיל+"
+ title: "עוקב"
+ description: "אתם תעקבו אוטומטית אחרי כל הנושאים בקטגוריות אלו. אתם תיודעו אם מישהו מזכיר את @שמכם או עונה לכם, וספירה של תגובות חדשות תופיע לכם."
regular:
title: "נורמלי"
- description: "תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלך או ישיב לפרסום שלך."
+ description: "תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלכם או ישיב לכם."
muted:
title: "מושתק"
- description: "לא תקבלו התראות על נושאים חדשים בקטגוריות אלו, והם לא יופיעו בעמוד הלא נקראו שלך."
+ description: "לא תקבלו התראות על נושאים חדשים בקטגוריות אלו, והם לא יופיעו בעמוד הלא-נקראו שלך."
+ sort_options:
+ default: "ברירת מחדל"
+ likes: "לייקים"
+ op_likes: "לייקים של הפוסט המקורי"
+ views: "מבטים"
+ posts: "פוסטים"
+ activity: "פעילות"
+ posters: "מפרסמים"
+ category: "קטגוריה"
+ created: "נוצרו"
+ sort_ascending: 'בסדר עולה'
+ sort_descending: 'בסדר יורד'
flagging:
title: 'תודה על עזרתך לשמירה על תרבות הקהילה שלנו!'
- action: 'סימון פרסום'
- take_action: "בצע פעולה"
+ action: 'דגלו פוסט'
+ take_action: "ניקטו פעולה"
notify_action: 'הודעה'
official_warning: 'אזהרה רשמית'
delete_spammer: "מחק ספאמר"
- delete_confirm: "אתה עומד למחוק %{posts} הודעות ו-%{topics} פוסטים של המשתמש הזה, להסיר את החשבון שלהם, לחסור הרשמה מכתובת ה-IP שלהם %{ip_address}, ולהוסיף את כתובת הדואר האלקטרוני %{email} לרשימה שחורה. אתה בטוח שזה באמת ספאמר?"
+ delete_confirm_MF: "אתם עומדים למחוק {POSTS, plural, one {פוסט אחד} other {# פוסטים}} ו{TOPICS, plural, one {נושא אחד} other {# נושאים}} ממשתמש זה, להסיר את החשבון שלו, לחסום הרשמה מכתובת ה IP {ip_address}, ולהוסיף את כתובת המייל שלו {email} לרשימה שחורה. האם אתם בטוחים שמשתמש זה הוא באמת ספאמר?"
yes_delete_spammer: "כן, מחק ספאמר"
ip_address_missing: "(N/A)"
hidden_email_address: "(מוסתר)"
- submit_tooltip: "שידור הסימון כ \"פרטי\""
- take_action_tooltip: "הגעה באופן מיידי למספר הסימונים האפשרי, במקום להמתין לסימונים נוספים מן הקהילה"
- cant: "סליחה, לא ניתן לסמן הודעה זו כרגע."
- notify_staff: 'הודעה לצוות באופן פרטי'
+ submit_tooltip: "שלחו את הדגל הפרטי"
+ take_action_tooltip: "הגעה באופן מיידי למספר הדגלים האפשרי, במקום להמתין לדגלים נוספים מן הקהילה"
+ cant: "סליחה, לא ניתן לדגל פוסט זה כרגע."
+ notify_staff: 'התראה לצוות באופן פרטי'
formatted_name:
- off_topic: "מחוץ לנושא הפוסט"
+ off_topic: "אוף-טופיק"
inappropriate: "לא ראוי"
spam: "זהו ספאם"
- custom_placeholder_notify_user: "היה ממוקד, חיובי ואדיב תמיד."
- custom_placeholder_notify_moderators: "ספר לנו מה בדיוק מטריד אותך וצרף קישורים רלוונטיים ודוגמאות במידת האפשר."
+ custom_placeholder_notify_user: "היו ממוקדים, חיובים ותמיד אדיבים."
+ custom_placeholder_notify_moderators: "ספרו לנו מה בדיוק מטריד אתכם וצרפו קישורים רלוונטיים ודוגמאות במידת האפשר."
custom_message:
- at_least: "הזן לפחות {{n}} תווים"
- more: "{{n}} נשארו..."
- left: "{{n}} נותרו"
+ at_least:
+ one: "הכניסו לפחות תו אחד"
+ other: "הכניסו לפחות {{count}} תווים"
+ more:
+ one: "נשאר אחד"
+ other: "{{count}} נשארו..."
+ left:
+ one: "נותר אחד"
+ other: "{{count}} נותרו"
flagging_topic:
title: "תודה על עזרתך לשמירה על תרבות הקהילה שלנו!"
- action: "סימון פוסט"
+ action: "דגלו נושא"
notify_action: "הודעה"
topic_map:
- title: "סיכום פוסט"
+ title: "סיכום נושא"
participants_title: "מפרסמים מתמידים"
links_title: "לינקים פופלארים"
links_shown: "הצגת קישורים נוספים..."
@@ -1624,6 +1849,7 @@ he:
one: "לחיצה אחת"
other: "%{count} לחיצות"
post_links:
+ about: "הרחיבו לינקים נוספים לפוסט זה"
title:
one: "עוד 1"
other: "עוד %{count}"
@@ -1631,46 +1857,45 @@ he:
warning:
help: "זוהי אזהרה רשמית."
bookmarked:
- help: "יצרת סימניה לפוסט זה"
+ help: "יצרתם סימניה לנושא זה"
locked:
- help: "הפוסט הזה נעול, הוא לא מקבל יותר תגובות חדשות"
+ help: "הנושא הזה סגור, הוא לא מקבל יותר תגובות חדשות"
archived:
- help: "הפוסט הזה אוכסן בארכיון; הוא הוקפא ולא ניתן לשנותו"
+ help: "הנושא הזה אוכסן בארכיון; הוא הוקפא ולא ניתן לשנותו"
locked_and_archived:
- help: "הפוסט הזה סגור ומאורכב. לא ניתן להגיב בו יותר או לשנות אותו. "
+ help: "הנושא הזה סגור ומאורכב. לא ניתן להגיב בו יותר או לשנות אותו. "
unpinned:
title: "הורד מנעיצה"
- help: "פוסט זה אינו מקובע עבורך; הוא יופיע בסדר הרגיל"
+ help: "נושא זה אינו מקובע עבורכם; הוא יופיע בסדר הרגיל"
pinned_globally:
title: "נעוץ גלובאלית"
help: "הנושא הזה נעוץ בכל האתר; הוא יוצג בראש הקטגוריה שלו כחדש ביותר"
pinned:
title: "נעוץ"
- help: "פוסט זה מקובע עבורך, הוא יופיע בראש הקטגוריה"
+ help: "נושא זה ננעץ עבורכם, הוא יופיע בראש הקטגוריה"
invisible:
- help: "פוסט זה מוסתר; הוא לא יוצג ברשימות הפוסטים, וזמין רק באמצעות קישור ישיר."
- posts: "הודעות"
- posts_lowercase: "פרסומים"
- posts_long: "יש {{number}} הודעות בפוסט הזה"
+ help: "נושא זה מוסתר; הוא לא יוצג ברשימות הנושאים, וזמין רק באמצעות קישור ישיר."
+ posts: "פוסטים"
+ posts_long: "יש {{number}} פוסטים בנושא הזה"
posts_likes_MF: |
- לנושא זה יש {count, plural, one {פרסום אחד} other {# פרסומים}}
- נמוך {עם יחס גבוה של לייקים לפרסום}
- בינוני {עם יחס גבוה מאוד של לייקים לפרסום}
- גבוה {עם יחס גבוה בצורה יוצאת דופן של לייקים לפרסום}
- אחר {}}
- original_post: "הודעה מקורית"
+ לנושא זה יש {count, plural, one {תגובה 1} other {# תגובות}} {ration, select,
+ low {עם יחס גבוה של לייקים לפוסט}
+ med {עם יחס גבוה מאוד של לייקים לפוסט}
+ high {עם יחס גבוה בצורה יוצאת דופן של לייקים לפוסט}
+ other {}}
+ original_post: "פוסט מקורי"
views: "צפיות"
views_lowercase:
one: "צפיה"
other: "צפיות"
replies: "תגובות"
- views_long: "הפוסט הזה נצפה {{number}} פעמים"
+ views_long: "הנושא הזה נצפה {{number}} פעמים"
activity: "פעילות"
likes: "לייקים"
likes_lowercase:
- one: "לייקים"
+ one: "לייק"
other: "לייקים"
- likes_long: "יש {{number}} לייקים לפוסט הזה"
+ likes_long: "יש {{number}} לייקים לנושא הזה"
users: "משתמשים"
users_lowercase:
one: "משתמש"
@@ -1683,36 +1908,36 @@ he:
not_available: "לא זמין!"
categories_list: "רשימת קטגוריות"
filters:
- with_topics: "%{filter} פוסטים"
- with_category: "%{filter} %{category} פוסטים"
+ with_topics: "%{filter} נושאים"
+ with_category: "%{filter} %{category} נושאים"
latest:
title: "פורסמו לאחרונה"
title_with_count:
one: "האחרון (1)"
other: "({{count}}) פורסמו לאחרונה"
- help: "פוסטים עם תגובות לאחרונה"
+ help: "נושאים עם תגובות לאחרונה"
hot:
title: "חם"
- help: "מבחר הפוסטים החמים ביותר"
+ help: "מבחר הנושאים החמים ביותר"
read:
title: "נקרא"
- help: "פוסטים שקראת, לפי סדר קריאתם"
+ help: "נושאים שקראתם, לפי סדר קריאתם"
search:
title: "חיפוש"
- help: "חיפוש בכל הפוסטים"
+ help: "חיפוש בכל הנושאים"
categories:
title: "קטגוריות"
title_in: "קטגוריה - {{categoryName}}"
- help: "כל הפוסטים תחת הקטגוריה הזו"
+ help: "כל הנושאים תחת הקטגוריה הזו"
unread:
- title: "לא נקרא"
+ title: "לא-נקראו"
title_with_count:
- one: "לא נקרא(1)"
- other: "לא נקראו ({{count}})"
- help: "פוסטים שאתם כרגע צופים או עוקבים אחריהם עם פרסומים שלא נקראו"
+ one: "לא נקרא (1)"
+ other: "לא-נקראו ({{count}})"
+ help: "נושאים שאתם כרגע צופים או עוקבים אחריהם עם פוסטים שלא נקראו"
lower_title_with_count:
one: "לא נקרא (1)"
- other: "לא נקראו {{count}} "
+ other: "לא-נקראו {{count}} "
new:
lower_title_with_count:
one: "חדש (1)"
@@ -1722,22 +1947,22 @@ he:
title_with_count:
one: "חדש (1)"
other: "חדשים ({{count}})"
- help: "פרסומים נוצרו בימים האחרונים"
+ help: "נושאים שנוצרו בימים האחרונים"
posted:
- title: "ההודעות שלי"
- help: "פוסטים בהם פרסמת"
+ title: "הפוסטים שלי"
+ help: "נושאים בהם פרסמת"
bookmarks:
title: "סימניות"
- help: "פוסטים עבורם יצרת סימניות"
+ help: "נושאים עבורם יצרתם סימניות"
category:
title: "{{categoryName}}"
title_with_count:
one: "{{categoryName}} (1)"
other: "{{categoryName}} ({{count}})"
- help: "פוסטים מדוברים בקטגוריה {{categoryName}}"
+ help: "נושאים מדוברים בקטגוריה {{categoryName}}"
top:
title: "מובילים"
- help: "הפוסטים הפעילים ביותר בשנה, חודש, שבוע או יום האחרונים"
+ help: "הנושאים הפעילים ביותר בשנה, חודש, שבוע או יום האחרונים"
all:
title: "תמיד"
yearly:
@@ -1759,21 +1984,31 @@ he:
other_periods: "ראה חלק עליון"
browser_update: 'למרבה הצער, הדפדפן שלכם זקן מידי מכדי לעבוד באתר זה.. אנא שדרגו את הדפדפן שלכם.'
permission_types:
- full: "צרו / תגובה/ צפייה"
+ full: "יצירה / תגובה / צפייה"
create_post: "תגובה / צפייה"
readonly: "צפה"
lightbox:
download: "הורדה"
- search_help:
- title: 'חיפוש בעזרה'
keyboard_shortcuts_help:
title: 'קיצורי מקלדת'
jump_to:
title: 'קפצו אל'
+ home: 'g, h בית'
+ latest: 'g, l אחרונים'
+ new: 'g, n חדשים'
+ unread: 'g, u לא-נקראו'
+ categories: 'g, c קטגוריות'
+ top: 'g, t מובילים'
+ bookmarks: 'g, b סימניות'
+ profile: 'g, p פרופיל'
+ messages: 'g, m הודעות'
navigation:
title: 'ניווט'
jump: '# מעבר לפוסט #'
back: 'u חזרה'
+ up_down: 'k/j הזיזו בחירה ↑ ↓'
+ open: 'o or Enter פתחו נושא נבחר'
+ next_prev: 'shift+j/shift+k תחום הבא/קודם'
application:
title: 'אפליקציה'
create: 'c יצירת נושא חדש'
@@ -1783,30 +2018,76 @@ he:
show_incoming_updated_topics: '. הצגת נושאים שהתעדכנו'
search: '/ חיפוש'
help: '? פתיחת קיצורי מקשים'
+ dismiss_new_posts: 'x, r בטלו חדשים/פוסטים'
+ dismiss_topics: 'x, t בטלו נושאים'
+ log_out: 'shift+z shift+z התנתקות'
actions:
title: 'פעולות'
+ bookmark_topic: 'f סמנו/בטלו-סימנייה של נושא'
+ pin_unpin_topic: 'shift+p נעצו/בטלו נעיצה בנושא'
+ share_topic: 'shift+s שיתוף נושא'
share_post: 's שיתוף פוסט'
+ reply_as_new_topic: 't מענה כנושא קשור'
+ reply_topic: 'shift+r ענו לנושא'
reply_post: 'r תגובה לפוסט'
quote_post: 'q ציטוט פוסט'
- flag: '! דיווח על פוסט'
+ like: 'l אהבו פוסט'
+ flag: '! דגלו פוסט'
bookmark: 'b סימון פוסט'
edit: 'e עריכת פוסט'
+ delete: 'd מחיקת פוסט'
+ mark_muted: 'm, m השתקת נושא'
+ mark_regular: 'm, r נושא רגיל'
+ mark_tracking: 'm, t עקבו אחר נושא'
+ mark_watching: 'm, w צפו בנושא'
+ print: 'ctrl+p הדפסת נושא'
badges:
+ earned_n_times:
+ one: "הרוויחו עיטור זה פעם אחת"
+ other: "הרוויחו עיטור זה %{count} פעמים"
+ granted_on: "הוענק לפני %{date}"
+ others_count: "אחרים עם עיטור זה (%{count})"
+ title: עיטורים
+ allow_title: "כותרת פנויה"
multiple_grant: "ניתן מספר פעמים"
+ badge_count:
+ one: "1 עיטורים"
+ other: "%{count} עיטורים"
+ more_badges:
+ one: "+1 נוסף"
+ other: "+%{count} נוספים"
+ granted:
+ one: "הוענק"
+ other: "%{count} הוענקו"
+ select_badge_for_title: בחרו בעיטור לשימוש בכותרת שלכם
none: "חפשו באמצעות גוגל
+
+ Gli argomenti e le categorie silenziate non sono incluse in queste email.
+ daily: "Invia aggiornamenti giornalieri"
+ individual: "Invia una email per ogni nuovo messaggio"
+ individual_no_echo: "Invia una email per ogni nuovo messaggio, eccetto per i miei"
+ many_per_day: "Inviamo una email per ogni nuovo messaggio (circa {{dailyEmailEstimate}} al giorno)"
+ few_per_day: "Inviami una email per ogni nuovo messaggio (circa 2 al giorno)"
tag_settings: "Etichette"
+ watched_tags: "Osservate"
+ watched_tags_instructions: "Osserverai automaticamente tutti gli argomenti con queste etichette. Verrai notificato di tutti i nuovi messaggi e argomenti, e accanto all'argomento apparirà anche un conteggio dei nuovi messaggi."
+ tracked_tags: "Seguite"
+ tracked_tags_instructions: "Seguirai automaticamente tutti gli argomenti con queste etichette. Accanto all'argomento apparirà il conteggio dei nuovi messaggi."
muted_tags: "Silenziati"
+ muted_tags_instructions: "Non riceverai notifiche circa i nuovi argomenti con queste etichette, inoltre non appariranno in \"Ultimi\"."
watched_categories: "Osservate"
+ watched_categories_instructions: "Osserverai automaticamente tutti gli argomenti in queste categorie. Riceverai notifiche su tutti i nuovi messaggi e argomenti e, accanto all'argomento, apparirà il conteggio dei nuovi messaggi."
tracked_categories: "Seguite"
+ tracked_categories_instructions: "Seguirai automaticamente tutti gli argomenti appartenenti a queste categorie. Accanto all'argomento comparirà il conteggio dei nuovi messaggi."
+ watched_first_post_categories: "Osservando Primo Messaggio"
+ watched_first_post_categories_instructions: "Riceverai la notifica per il primo messaggio di ogni nuovo argomento in queste categorie."
+ watched_first_post_tags: "Osservando Primo Messaggio"
+ watched_first_post_tags_instructions: "Riceverai la notifica per il primo messaggio di ogni nuovo argomento con queste etichette."
muted_categories: "Silenziate"
muted_categories_instructions: "Non ti verrà notificato nulla sui nuovi argomenti in queste categorie, e non compariranno nell'elenco Ultimi."
delete_account: "Cancella il mio account"
@@ -484,7 +497,12 @@ it:
muted_users: "Silenziati"
muted_users_instructions: "Occulta tutte le notifiche da questi utenti."
muted_topics_link: "Mostra argomenti silenziati"
+ watched_topics_link: "Mostra argomenti osservati"
automatically_unpin_topics: "Spunta automaticamente gli argomenti quando arrivi in fondo."
+ apps: "Applicazioni"
+ revoke_access: "Revoca Accesso"
+ undo_revoke_access: "Annullare Revoca Accesso"
+ api_approved: "Approvato:"
staff_counters:
flags_given: "segnalazioni utili"
flagged_posts: "messaggi segnalati"
@@ -513,6 +531,7 @@ it:
error: "Si è verificato un errore durante la modifica del valore."
change_username:
title: "Cambia Utente"
+ confirm: "Se modifichi il nome utente, tutte le precedenti menzioni al tuo @nome non saranno più valide. Sei assolutamente sicuro di volerlo fare?"
taken: "Spiacenti, questo nome utente è già riservato."
error: "C'è stato un problema nel cambio del tuo nome utente."
invalid: "Nome utente non valido: usa solo lettere e cifre"
@@ -572,16 +591,17 @@ it:
title: "Lingua dell'interfaccia"
instructions: "Lingua dell'interfaccia utente. Cambierà quando aggiornerai la pagina."
default: "(default)"
+ any: "qualunque"
password_confirmation:
title: "Ripeti la password"
last_posted: "Ultimo Messaggio"
last_emailed: "Ultima email inviata"
last_seen: "Ultima visita"
created: "Membro da"
- log_out: "Esci"
+ log_out: "Disconnetti"
location: "Località"
card_badge:
- title: "Targhetta Scheda Utente"
+ title: "Distintivo Scheda Utente"
website: "Sito Web"
email_settings: "Email"
like_notification_frequency:
@@ -596,12 +616,14 @@ it:
always: "sempre"
never: "mai"
email_digests:
+ title: "Quando non visito il sito, inviami un riassunto via email degli argomenti più discussi e delle risposte"
every_30_minutes: "ogni 30 minuti"
every_hour: "ogni ora"
daily: "ogni giorno"
every_three_days: "ogni tre giorni"
weekly: "ogni settimana"
every_two_weeks: "ogni due settimane"
+ include_tl0_in_digests: "Includi contenuti dei nuovi utenti nelle email di riepilogo"
email_in_reply_to: "Nelle email includi un estratto delle risposte al messaggio"
email_direct: "Inviami un'email quando qualcuno mi cita, risponde a un mio messaggio, menziona il mio @nome o mi invita ad un argomento"
email_private_messages: "Inviami una email quando qualcuno mi scrive un messaggio"
@@ -627,6 +649,7 @@ it:
after_4_minutes: "dopo 4 minuti"
after_5_minutes: "dopo 5 minuti"
after_10_minutes: "dopo 10 minuti"
+ notification_level_when_replying: "Quando scrivo in un argomento, modifica il titolo dell'argomento a"
invited:
search: "digita per cercare inviti..."
title: "Inviti"
@@ -649,19 +672,19 @@ it:
rescind: "Rimuovi"
rescinded: "Invito revocato"
reinvite: "Rinvia Invito"
+ reinvite_all: "Rispedisci tutti gli Inviti"
reinvited: "Invito rinviato"
+ reinvited_all: "Tutti gli inviti sono stati rispediti!"
time_read: "Ora di Lettura"
days_visited: "Presenza (giorni)"
account_age_days: "Età dell'utente in giorni"
create: "Invia un Invito"
generate_link: "Copia il collegamento di invito"
- generated_link_message: 'Cerca con Google
+
+ tagging: + all_tags: "Etichette" + selector_all_tags: "tutte le etichette" + selector_no_tags: "nessuna etichetta" + changed: "etichette cambiate:" + tags: "Etichette" + choose_for_topic: "scegli delle etichette opzionali per questo argomento" + delete_tag: "Cancella Etichetta" + delete_confirm: "Sicuro di voler cancellare questa etichetta?" + rename_tag: "Rinomina Etichetta" + rename_instructions: "Scegli un altro nome per l'etichetta:" + sort_by_name: "nome" + manage_groups: "Gestisci Gruppi Etichette" + manage_groups_description: "Definisci gruppi per organizzare le etichette" + filters: + without_category: "%{filter} %{tag} argomenti" + with_category: "%{filter} %{tag} argomenti in %{category}" + untagged_without_category: "%{filter} argomenti non etichettati" + untagged_with_category: "%{filter} argomenti non etichettati in %{category}" + notifications: + watching: + title: "In osservazione" + description: "Visualizzerai automaticamente tutti gli argomenti con questa etichetta. Riceverai una notifica per tutti i nuovi messaggi e argomenti. Inoltre, accanto all'argomento apparirà il conteggio dei messaggi non letti e di quelli nuovi." + watching_first_post: + title: "Osservando Primo Messaggio" + description: "Riceverai solo la notifica per il primo messaggio di ogni nuovo argomenti con questa etichetta." + tracking: + title: "Seguiti" + description: "Seguirai automaticamente tutti gli argomenti con questa etichetta. Accanto all'argomento apparirà un conteggio dei messaggi non letti e di quelli nuovi." + regular: + title: "Normale" + description: "Riceverai una notifica se qualcuno menziona il tuo @nome o risponde al tuo messaggio." + muted: + title: "Silenziato" + description: "Non riceverai alcuna notifica per nuovi argomenti con questa etichetta, e non compariranno nella tab dei messaggi non letti." + groups: + title: "Gruppi Etichette" + about: "Aggiungi etichette a gruppi per poterle gestire più facilmente." + new: "Nuovo Gruppo" + tags_label: "Etichette in questo gruppo:" + parent_tag_label: "Etichetta padre:" + parent_tag_placeholder: "Opzionale" + parent_tag_description: "Le etichette di questo gruppo non possono essere usate finché è presente l'etichetta padre." + one_per_topic_label: "Limita ad una sola etichetta per argomento in questo gruppo" + new_name: "Nuovo Gruppo Etichette" + save: "Salva" + delete: "Elimina" + confirm_delete: "Sicuro di voler cancellare questo gruppo di etichette?" + topics: + none: + unread: "Non hai argomenti non letti." + new: "Non hai nuovi argomenti." + read: "Non hai ancora letto nessun argomento." + posted: "Non hai ancora scritto in nessun argomento." + latest: "Non ci sono argomenti più recenti." + hot: "Non ci sono argomenti importanti." + bookmarks: "Non hai ancora argomenti nei segnalibri." + top: "Non ci sono argomenti di punta." + search: "Non ci sono risultati di ricerca." + bottom: + latest: "Non ci sono ulteriori argomenti più recenti." + hot: "Non ci sono ulteriori argomenti importanti." + posted: "Non ci sono ulteriori argomenti inseriti." + read: "Non ci sono ulteriori argomenti letti." + new: "Non ci sono ulteriori nuovi argomenti." + unread: "Non ci sono ulteriori argomenti non letti." + top: "Non ci sono ulteriori argomenti di punta." + bookmarks: "Non ci sono ulteriori argomenti nei segnalibri." + search: "Non ci sono ulteriori risultati di ricerca." + invite: + custom_message: "Rendi l'invito un po' più personale scrivendo un" + custom_message_link: "messaggio personalizzato" + custom_message_placeholder: "Inserisci il tuo messaggio personalizzato" + custom_message_template_forum: "Ehi, unisciti a questo forum!" admin_js: type_to_filter: "digita per filtrare..." admin: @@ -1912,15 +2172,12 @@ it: refresh: "Aggiorna" new: "Nuovo" selector_placeholder: "inserisci nome utente" - name_placeholder: "Nome del gruppo, senza spazi, stesse regole del nome utente" about: "Modifica qui la tua appartenenza ai gruppi e i loro nomi" group_members: "Membri del gruppo" delete: "Cancella" delete_confirm: "Cancellare questo gruppo?" delete_failed: "Impossibile cancellare il gruppo. Se questo è un gruppo automatico, non può essere eliminato." - delete_member_confirm: "Rimuovere '%{username}' dal gruppo '%{group}'?" delete_owner_confirm: "Rimuovere i privilegi per '%{username}'?" - name: "Nome" add: "Aggiungi" add_members: "Aggiungi membri" custom: "Personalizzato" @@ -1951,6 +2208,20 @@ it: info_html: "La tua chiave API ti permetterà di creare e aggiornare gli argomenti usando chiamate JSON." all_users: "Tutti gli Utenti" note_html: "Mantieni segreta questa chiave, tutti gli utenti che la possiedono possono creare messaggi per conto di altri." + web_hooks: + title: "Webhook" + none: "Non ci sono webhook disponibili adesso." + instruction: "Webhook consente a Discourse di notificare servizi esterni quando sul tuo sito si verificano determinati eventi. Quando un webhook viene innescato, una richiesta di MESSAGGIO viene inviata agli URL forniti." + detailed_instruction: "Una richiesta di MESSAGGIO verrà inviata agli URL forniti quando si verifica un evento scelto." + new: "Nuovo Webhook" + create: "Crea" + save: "Salva" + destroy: "Elimina" + description: "Descrizione" + controls: "Componenti" + go_back: "Torna all'elenco" + payload_url: "Aggiungi URL" + payload_url_placeholder: "https://example.com/postreceive" plugins: title: "Plugin" installed: "Plugin Installati" @@ -2016,10 +2287,8 @@ it: title: "Ripristina il database a una versione funzionante precedente" confirm: "Sei sicuro di voler ripristinare il database alla versione funzionante precedente?" export_csv: - user_archive_confirm: "Sei sicuro di voler scaricare i tuoi messaggi?" success: "Esportazione iniziata, verrai avvertito con un messaggio al termine del processo." failed: "Esportazione fallita. Controlla i log." - rate_limit_error: "I messaggi possono essere scaricati una volta al giorno, prova ancora domani." button_text: "Esporta" button_title: user: "Esporta l'intero elenco di utenti in formato CSV." @@ -2218,8 +2487,8 @@ it: change_site_text: "cambia il testo del sito" suspend_user: "utente sospeso" unsuspend_user: "utente riattivato" - grant_badge: "assegna targhetta" - revoke_badge: "revoca targhetta" + grant_badge: "assegna distintivo" + revoke_badge: "revoca distintivo" check_email: "controlla email" delete_topic: "cancella argomento" delete_post: "cancella messaggio" @@ -2272,7 +2541,7 @@ it: title: "Log Errori" impersonate: title: "Impersona" - help: "Usa questo strumento per impersonare un account utente ai fini del debugging. Una volta finito dovrai scollegarti." + help: "Usa questo strumento per impersonare un account utente ai fini del debugging. Una volta finito dovrai disconnetterti." not_found: "Impossibile trovare questo utente." invalid: "Spiacenti, non puoi impersonare questo utente." users: @@ -2328,11 +2597,10 @@ it: unsuspend_failed: "Si è verificato un errore riabilitando questo utente {{error}}" suspend_duration: "Per quanto tempo l'utente sarà sospeso?" suspend_duration_units: "(giorni)" - suspend_reason_label: "Perché lo stai sospendendo? Questo testo sarà visibile a tutti nella pagina del profilo dell'utente, e gli verrà mostrato tutte le volte che effettuerà il login. Scrivi il meno possibile." + suspend_reason_label: "Perché lo stai sospendendo? Questo testo sarà visibile a tutti nella pagina del profilo dell'utente, e gli verrà mostrato tutte le volte che si connetterà. Scrivi il meno possibile." suspend_reason: "Motivo" suspended_by: "Sospeso da" delete_all_posts: "Cancella tutti i messaggi" - delete_all_posts_confirm: "Stai per cancellare %{posts} messaggi e %{topics} argomenti. Sei sicuro?" suspend: "Sospendi" unsuspend: "Riabilita" suspended: "Sospeso?" @@ -2407,7 +2675,7 @@ it: block_confirm: 'Sei sicuro di voler bloccare questo utente? Non sarà più in grado di creare alcun nuovo argomento o messaggio.' block_accept: 'Sì, blocca questo utente' deactivate_explanation: "Un utente disattivato deve riconvalidare la propria email." - suspended_explanation: "Un utente sospeso non può fare il login." + suspended_explanation: "Un utente sospeso non può connettersi." block_explanation: "Un utente bloccato non può pubblicare messaggi o iniziare argomenti." trust_level_change_failed: "C'è stato un problema nel cambio di livello di esperienza di questo utente. " suspend_modal_title: "Sospendi Utente" @@ -2419,7 +2687,6 @@ it: unlock_trust_level: "Sblocca Livello Esperienza" tl3_requirements: title: "Requisiti per Livello Esperienza 3" - table_title: "Negli ultimi %{time_period} giorni:" value_heading: "Valore" requirement_heading: "Requisito" visits: "Visite" @@ -2521,51 +2788,51 @@ it: legal: "Legale" uncategorized: 'Altro' backups: "Backup" - login: "Accesso" + login: "Connessione" plugins: "Plugin" user_preferences: "Preferenze Utente" tags: "Etichette" badges: - title: Targhette - new_badge: Nuova Targhetta + title: Distintivi + new_badge: Nuovo Distintivo new: Nuovo name: Nome - badge: Targhetta + badge: Distintivo display_name: Nome Visualizzato description: Descrizione long_description: Descrizione Lunga - badge_type: Tipo Targhetta + badge_type: Tipo Distintivo badge_grouping: Gruppo badge_groupings: - modal_title: Raggruppamento Targhette + modal_title: Raggruppamento Distintivi granted_by: Assegnata Da granted_at: Assegnata in data reason_help: (Un collegamento a un messaggio o argomento) save: Salva delete: Cancella - delete_confirm: Sei sicuro di voler cancellare questa targhetta? + delete_confirm: Sei sicuro di voler cancellare questo distintivo? revoke: Revoca reason: Motivazione expand: Espandi … - revoke_confirm: Sei sicuro di voler revocare questa targhetta? - edit_badges: Modifica Targhette - grant_badge: Assegna Targhetta - granted_badges: Targhette Assegnate + revoke_confirm: Sei sicuro di voler revocare questo distintivo? + edit_badges: Modifica Distintivi + grant_badge: Assegna Distintivo + granted_badges: Distintivi Assegnati grant: Assegna - no_user_badges: "%{name} non ha ricevuto alcuna targhetta." - no_badges: Non ci sono targhette da assegnare. - none_selected: "Seleziona una targhetta per iniziare" - allow_title: Permetti di utilizzare le targhette come titoli + no_user_badges: "%{name} non ha ricevuto alcun distintivo." + no_badges: Non ci sono distintivi da assegnare. + none_selected: "Seleziona un distintivo per iniziare" + allow_title: Permetti di utilizzare un distintivo come titolo multiple_grant: Può essere assegnata più volte - listable: Mostra targhetta sulla pagina pubblica delle targhette - enabled: Attiva targhetta + listable: Mostra distintivo sulla pagina pubblica dei distintivi + enabled: Attiva distintivo icon: Icona image: Immagine icon_help: "Usa una classe Font Awesome o la URL di un'immagine" - query: Badge Query (SQL) + query: Query Distintivo (SQL) target_posts: Interroga i messaggi destinazione auto_revoke: Avvia l'istruzione di revoca giornalmente - show_posts: Visualizza i messaggi che assegnano le targhette sulla pagina delle targhette + show_posts: Visualizza i messaggi che assegnano distintivi sulla pagina dei distintivi trigger: Trigger trigger_type: none: "Aggiorna giornalmente" @@ -2575,18 +2842,18 @@ it: user_change: "Quando un utente viene modificato o creato" post_processed: "Dopo che un messaggio viene elaborato" preview: - link_text: "Anteprima targhette guadagnate" + link_text: "Anteprima distintivi guadagnati" plan_text: "Anteprima con query plan" - modal_title: "Anteprima Query Targhetta" + modal_title: "Anteprima Query Distintivo" sql_error_header: "Si è verificato un errore con la query." - error_help: "Visita i seguenti collegamenti per un aiuto con le query delle targhette." + error_help: "Visita i seguenti collegamenti per un aiuto con le query dei distintivi." bad_count_warning: header: "ATTENZIONE!" - text: "Ci sono esempi di grant mancanti. Ciò accade quando la query delle targhette ritorna ID utenti o ID messaggi inesistenti. Successivamente ciò può causare risultati inattesi - controlla bene la tua query." - no_grant_count: "Nessuna targhetta da assegnare." + text: "Ci sono esempi di grant mancanti. Ciò accade quando la query dei distintivi ritorna ID utenti o ID messaggi inesistenti. Successivamente ciò può causare risultati inattesi - controlla bene la tua query." + no_grant_count: "Nessun distintivo da assegnare." grant_count: - one: "1 targhetta da assegnare." - other: "%{count} targhette da assegnare." + one: "1 distintivo da assegnare." + other: "%{count} distintivi da assegnare." sample: "Esempio:" grant: with: %{username} @@ -2638,3 +2905,21 @@ it: label: "Nuovo:" add: "Aggiungi" filter: "Cerca (URL o URL Esterna)" + wizard_js: + wizard: + done: "Fatto" + back: "Indietro" + next: "Avanti" + step: "%{current} di %{total}" + upload: "Carica" + uploading: "Caricamento..." + quit: "Forse Dopo" + staff_count: + one: "La tua comunità ha 1 membro dello staff." + other: "La tua comunità ha %{count} membri dello staff." + invites: + add_user: "aggiungi" + roles: + admin: "Amministratore" + moderator: "Moderatore" + regular: "Utente Normale" diff --git a/config/locales/client.ja.yml b/config/locales/client.ja.yml index 39aa21c2b34..ff7a6be70dd 100644 --- a/config/locales/client.ja.yml +++ b/config/locales/client.ja.yml @@ -45,8 +45,6 @@ ja: other: "%{count}秒前" x_seconds: other: "%{count}秒" - less_than_x_minutes: - other: "%{count}分以内" x_minutes: other: "%{count}分前" about_x_hours: @@ -94,8 +92,8 @@ ja: google+: 'Google+ でこのリンクを共有する' email: 'メールでこのリンクを送る' action_codes: - public_topic: "%{when} にこのトピックは公開されました" - private_topic: "%{when} にこのトピックは非公開にされました" + public_topic: "トピックを公開しました: %{when} " + private_topic: "トピックを非公開にしました: %{when}" invited_user: "%{who} から招待されました: %{when}" removed_user: "%{who}が %{when}に削除しました" autoclosed: @@ -108,7 +106,7 @@ ja: enabled: '%{when}にアーカイブしました' disabled: '%{when}にアーカイブを解除しました' pinned: - enabled: '%{when}に固定しました' + enabled: '固定しました: %{when}' disabled: '%{when}に固定を解除しました' pinned_globally: enabled: '%{when}に全体への固定をしました' @@ -118,6 +116,8 @@ ja: disabled: 'リストから非表示: %{when}' topic_admin_menu: "トピックの管理" emails_are_disabled: "メールアドレスの送信は管理者によって無効化されています。全てのメール通知は行われません" + bootstrap_mode_enabled: "かんたんにサイトを立ち上げられるようにするため、ブートストラップモードが有効になっています。新しいユーザーは全員、トラストレベル1を付与し、毎日更新がメールで届けられます。これらの機能は総ユーザー数が%{min_users}を超えた時にオフになります。" + bootstrap_mode_disabled: "ブートストラップモードは24時間後に無効化されます。" s3: regions: us_east_1: "US East (N. Virginia)" @@ -159,7 +159,7 @@ ja: or: "あるいは" now: "たった今" read_more: 'もっと読む' - more: "More" + more: "もっと見る" less: "Less" never: "never" every_30_minutes: "30分毎" @@ -188,8 +188,8 @@ ja: like_count: "いいね!" topic_count: "トピック" post_count: "投稿" - user_count: "新規ユーザ" - active_user_count: "アクティブユーザ" + user_count: "新規ユーザー" + active_user_count: "アクティブユーザー" contact: "お問い合わせ" contact_info: "このサイトに影響を与える重要な問題や緊急の問題が発生した場合は、 %{contact_info}までご連絡ください" bookmarked: @@ -206,7 +206,7 @@ ja: remove: "ブックマークを削除" confirm_clear: "このトピックの全てのブックマークを削除してもよいですか?" topic_count_latest: - other: "{{count}} 個の新規または更新されたトピック。" + other: "{{count}}件の新規/更新トピックがあります。" topic_count_unread: other: "{{count}} 個の未読トピック。" topic_count_new: @@ -238,7 +238,7 @@ ja: topic: "トピック:" approve: '承認' reject: 'リジェクト' - delete_user: '削除されたユーザ' + delete_user: '削除されたユーザー' title: "承認待ち" none: "レビュー待ちの投稿はありません。" edit: "編集" @@ -269,8 +269,8 @@ ja: sent_by_user: "{{user}} が送信" sent_by_you: "あなた が送信" directory: - filter_name: "ユーザ名でフィルタ" - title: "ユーザ" + filter_name: "ユーザー名でフィルタ" + title: "ユーザー" likes_given: "与えた" likes_received: "もらった" topics_entered: "閲覧数" @@ -286,18 +286,22 @@ ja: posts_read: "既読" posts_read_long: "投稿の閲覧数" total_rows: - other: "%{count}人のユーザ" + other: "%{count}人のユーザー" groups: - empty: - posts: "このグループのメンバーからの投稿はありません。" - members: "このグループからの投稿はありません。" - mentions: "このグループのメンションはありません。" - messages: "このグループへのメッセージはありません。" - topics: "このグループのメンバーのトピックは何もありません。" + request_membership_pm: + title: "メンバーシップリクエスト" add: "追加" + automatic_group: 自動作成グループ + closed_group: クローズドグループ + allow_membership_requests: "ユーザーがグループオーナーに対してメンバーシップリクエストを送信できるようにする(全ユーザーがグループへメンション出来るようにする必要があります。)" + membership: "メンバーシップ" + user_count: "メンバー数" selector_placeholder: "メンバーを追加" owner: "オーナー" - visible: "このグループは全てのユーザに表示されています。" + visible: "このグループは全てのユーザーに表示されています。" + index: + title: "グループ" + empty: "表示するグループはありません。" title: other: "グループ" members: "メンバー" @@ -356,12 +360,8 @@ ja: latest_by: "最新投稿: " toggle_ordering: "カテゴリの並び替えモードを切り替え" subcategories: "サブカテゴリ:" - topic_stats: "新しいトピックの数" topic_stat_sentence: other: "過去 %{unit} 間 %{count} 個の新着トピック。" - post_stats: "新しい投稿の数" - post_stat_sentence: - other: "過去 %{unit} 間 %{count} 個の新しい投稿。" ip_lookup: title: IPアドレスを検索 hostname: ホスト名 @@ -371,7 +371,7 @@ ja: phone: 電話 other_accounts: "同じIPアドレスを持つアカウント" delete_other_accounts: "%{count}件削除" - username: "ユーザ名" + username: "ユーザー名" trust_level: "トラストレベル" read_time: "読んだ時間" topics_entered: "入力したトピック" @@ -384,7 +384,6 @@ ja: profile: "プロフィール" mute: "ミュート" edit: "プロフィールを編集" - download_archive: "自分の投稿をダウンロード" new_private_message: "メッセージを作成" private_message: "メッセージ" private_messages: "メッセージ" @@ -406,18 +405,19 @@ ja: disable: "通知を無効にする" enable: "通知を有効にする" each_browser_note: "注意: 利用するすべてのブラウザでこの設定を変更する必要があります" + dismiss_notifications: "すべて既読にする" dismiss_notifications_tooltip: "全ての未読の通知を既読にします" disable_jump_reply: "返信した後に投稿へ移動しない" - dynamic_favicon: "新規または更新されたトピックのカウントをブラウザアイコンに表示する" + dynamic_favicon: "新規/更新トピックの件数をブラウザのアイコンに表示する" external_links_in_new_tab: "外部リンクをすべて別のタブで開く" enable_quoting: "選択したテキストを引用して返信する" change: "変更" moderator: "{{user}} はモデレータです" admin: "{{user}} は管理者です" - moderator_tooltip: "このユーザはモデレータであり" - admin_tooltip: "このユーザは管理者です" - blocked_tooltip: "このユーザはブロックされています" - suspended_notice: "このユーザは {{date}} まで凍結状態です。" + moderator_tooltip: "このユーザーはモデレータです" + admin_tooltip: "このユーザーは管理者です" + blocked_tooltip: "このユーザーはブロックされています" + suspended_notice: "このユーザーは {{date}} まで凍結状態です。" suspended_reason: "理由: " github_profile: "Github" email_activity_summary: "アクティビティの情報" @@ -438,9 +438,9 @@ ja: delete_yourself_not_allowed: "アカウントを削除できませんでした。サイトの管理者へ連絡してください。" unread_message_count: "メッセージ" admin_delete: "削除" - users: "ユーザ" + users: "ユーザー" muted_users: "ミュート" - muted_users_instructions: "ユーザからの通知をすべて行いません" + muted_users_instructions: "ユーザーからの通知をすべて行いません" muted_topics_link: "ミュートしたトピックを表示する" staff_counters: flags_given: "役に立った通報" @@ -469,10 +469,10 @@ ja: title: "プロフィールを変更" error: "変更中にエラーが発生しました。" change_username: - title: "ユーザ名を変更" - taken: "このユーザ名は既に使われています。" - error: "ユーザ名変更中にエラーが発生しました。" - invalid: "このユーザ名は無効です。英数字のみ利用可能です。" + title: "ユーザー名を変更" + taken: "このユーザー名は既に使われています。" + error: "ユーザー名の変更中にエラーが発生しました。" + invalid: "このユーザー名は無効です。英数字のみ利用可能です。" change_email: title: "メールアドレスを変更" taken: "このメールアドレスは既に使われています。" @@ -494,7 +494,7 @@ ja: title: "プロフィールの背景画像" instructions: "プロフィールの背景画像は、幅850pxで中央揃えになります" change_card_background: - title: "ユーザカードの背景画像" + title: "ユーザーカードの背景画像" instructions: "背景画像は、幅590pxで中央揃えになります" email: title: "メールアドレス" @@ -511,7 +511,7 @@ ja: too_short: "名前が短いです" ok: "問題ありません" username: - title: "ユーザ名" + title: "ユーザー名" instructions: "空白を含まず、被らない名前を入力してください" short_instructions: "@{{username}} であなたにメンションを送ることができます" available: "ユーザ名は利用可能です" @@ -601,11 +601,8 @@ ja: create: "招待を送る" generate_link: "招待リンクをコピー" bulk_invite: - none: "まだだれも招待していません。ひとりひとりを招待することもできますが、一括招待ファイルをアップロードすることで、一度に複数のユーザを招待する事ができます。" text: "ファイルからまとめて招待をする" - uploading: "アップロードしています..." success: "ファイルは無事にアップロードされました。完了されましたらメッセージでお知らせをさせていただきます。" - error: "ファイルアップロードエラー:'{{filename}}': {{message}}" password: title: "パスワード" too_short: "パスワードが短すぎます。" @@ -929,11 +926,11 @@ ja: title: "トピック、投稿、ユーザ、カテゴリを探す" no_results: "何も見つかりませんでした。" no_more_results: "検索結果は以上です。" - search_help: 検索ヘルプ searching: "検索中..." post_format: "#{{post_number}} {{username}}から" context: user: "@{{username}}の投稿を検索" + category: "#{{category}} から検索する" topic: "このトピックを探す" private_messages: "メッセージ検索" hamburger_menu: "他のトピック一覧やカテゴリを見る" @@ -946,6 +943,10 @@ ja: unlist_topics: "トピックをリストから非表示にする" reset_read: "未読に設定" delete: "トピックを削除" + dismiss: "既読" + dismiss_read: "未読をすべて既読にする" + dismiss_button: "既読..." + dismiss_tooltip: "新規投稿を既読にしてトピックの追跡を停止" dismiss_new: "既読にする" toggle: "選択したトピックを切り替え" actions: "操作" @@ -969,7 +970,7 @@ ja: top: "トップトピックはありません。" search: "検索結果はありません。" educate: - new: '
新しいトピックがここに表示されます。
デフォルトで、新しいトピックがある場合は2日間、 new が表示されます。
設定はプロフィール設定から変更できます。
' + new: '
新しいトピックがここに表示されます。
デフォルトでは新しいトピックがある場合に2日間、newが表示されます。
設定はプロフィール設定から変更できます。
' unread: '
新しいトピックがここに表示されます。
未読のトピックがある場合は、1が表示されます。 もし、
などを行った場合、トピックを追跡してそれぞれのトピックの下にある通知の設定を経由してウォッチします。
プロフィールから変更できます。
' bottom: latest: "最新のトピックは以上です。" @@ -983,7 +984,6 @@ ja: bookmarks: "ブックマーク済みのトピックはこれ以上ありません。" search: "検索結果は以上です。" topic: - filter_to: "トピック内の{{post_count}}個のポストを表示" create: '新規トピック' create_long: '新しいトピックの作成' private_message: 'メッセージを書く' @@ -1048,7 +1048,6 @@ ja: jump_bottom_with_number: "%{post_number}番へジャンプ" total: 投稿の合計 current: 現在の投稿 - position: "投稿: %{current}/%{total}" notifications: reasons: '3_6': 'このカテゴリに参加中のため通知されます' @@ -1209,7 +1208,6 @@ ja: post: reply: " {{replyAvatar}} {{usernameLink}}" reply_topic: " {{link}}" - quote_reply: "引用して返信" edit: "編集中 {{link}} {{replyAvatar}} {{username}}" edit_reason: "理由: " post_number: "投稿{{number}}" @@ -1224,7 +1222,6 @@ ja: expand_collapse: "開く/折りたたみ" gap: other: "{{count}}個の返信をすべて表示する" - more_links: "{{count}} つのリンク..." unread: "未読の投稿" has_replies: other: "{{count}} 件の返信" @@ -1279,14 +1276,6 @@ ja: flag: '通報' defer_flags: other: "取り下げた通報" - it_too: - off_topic: "通報する" - spam: "通報する" - inappropriate: "通報する" - custom_flag: "通報する" - bookmark: "ブックマークする" - like: "あなたも「いいね!」する" - vote: "投票する" undo: off_topic: "通報を取り消す" spam: "通報を取り消す" @@ -1395,7 +1384,7 @@ ja: delete_confirm: "このカテゴリを削除してもよろしいですか?" delete_error: "カテゴリ削除に失敗しました。" list: "カテゴリをリストする" - no_description: "このカテゴリの説明はありません。トピック定義を編集してください。" + no_description: "このカテゴリの説明はありません。" change_in_category_topic: "カテゴリ内容を編集" already_used: 'この色は他のカテゴリで利用しています' security: "セキュリティ" @@ -1431,7 +1420,6 @@ ja: take_action: "アクションをする" notify_action: 'メッセージ' delete_spammer: "スパムの削除" - delete_confirm: "このユーザのアカウントと、%{posts}個の投稿、%{topics}個のトピックを削除し、メールアドレス %{email} をブロックリストに追加しようとしています。本当にこのユーザをスパムユーザーとして認識してもよろしいですか?" yes_delete_spammer: "はい、スパムを削除する" ip_address_missing: "(N/A)" hidden_email_address: "(hidden)" @@ -1444,10 +1432,6 @@ ja: spam: "スパム" custom_placeholder_notify_user: "具体的に、建設的に、そして常に親切にしましょう。" custom_placeholder_notify_moderators: "特にどのような問題が発生しているか記入して下さい。可能なら、関連するリンクなどを教えて下さい。" - custom_message: - at_least: "少なくとも{{n}}文字入力してください" - more: "あと{{n}}文字..." - left: "残り{{n}}文字" flagging_topic: title: "報告していただきありがとうございます。" action: "トピックを通報" @@ -1480,7 +1464,6 @@ ja: invisible: help: "このトピックはリストされていません。トピックリストには表示されません。直接リンクでのみアクセス可能です" posts: "投稿" - posts_lowercase: "投稿" posts_long: "このトピックには{{number}}個の投稿があります" posts_likes_MF: | This topic has {count, plural, one {1 reply} other {# replies}} {ratio, select, @@ -1595,21 +1578,26 @@ ja: profile: 'g, p プロフィール' messages: 'g, m メッセージ' navigation: + title: 'ナビゲーション' jump: '# # 投稿へ' back: 'u 戻る' + up_down: 'k/j 選択を移動 ↑ ↓' open: 'o or Enter トピックへ' + next_prev: 'shift+j/shift+k 選択を次/前へ移動' application: + title: 'アプリケーション' create: 'c 新しいトピックを作成' notifications: 'n お知らせを開く' hamburger_menu: '= メニューを開く' - user_profile_menu: 'p ユーザメニュを開く' + user_profile_menu: 'p ユーザーメニューを開く' show_incoming_updated_topics: '. 更新されたトピックを表示する' search: '/ 検索' help: '? キーボードヘルプを表示する' - dismiss_new_posts: 'x, r 新しい投稿を非表示にする' - dismiss_topics: 'Dismiss Topics' + dismiss_new_posts: 'x, r 新規投稿を非表示にする' + dismiss_topics: 'x, t トピックを既読にする' log_out: 'shift+j/shift+k 次のセクション/前のセクション' actions: + title: 'アクション' bookmark_topic: 'f トピックのブックマークを切り替え' pin_unpin_topic: 'shift+pトピックを ピン留め/ピン留め解除' share_topic: 'shift+s トピックをシェア' @@ -1627,7 +1615,10 @@ ja: mark_tracking: 'm, t トピックを追跡する' mark_watching: 'm, w トピックをウォッチする' badges: + granted_on: "%{date}にゲット!" title: バッジ + allow_title: "タイトルに使える" + multiple_grant: "何回もゲット出来る" badge_count: other: "%{count}個のバッジ" tagging: @@ -1650,7 +1641,7 @@ ja: updates_available: "アップデートが存在します。" please_upgrade: "今すぐアップデートしてください!" no_check_performed: "アップデートの確認が正しく動作していません。sidekiq が起動していることを確認してください。" - stale_data: "最近アップデートの確認が正しく動作していません。sidekiq が起動していることを確認してください。" + stale_data: "更新のチェックが最近行われておりません。Sidekiqが動作しているか確認してください。" version_check_pending: "アップロードしたてです。素晴らしいです! " installed_version: "インストール済み" latest_version: "最新" @@ -1686,6 +1677,7 @@ ja: refresh_report: "Refresh Report" start_date: "Start Date" end_date: "End Date" + groups: "すべてのグループ" commits: latest_changes: "最新の更新内容:" by: "by" @@ -1751,17 +1743,14 @@ ja: no_primary: "(プライマリーグループなし)" title: "グループ" edit: "グループの編集" - refresh: "リフレッシュ" + refresh: "更新" new: "新規" selector_placeholder: "ユーザ名を入力" - name_placeholder: "グループ名を入力 (ユーザ名同様にスペースなし)" about: "グループメンバーとグループ名を編集" group_members: "グループメンバー" delete: "削除" delete_confirm: "このグループを削除しますか?" delete_failed: "グループの削除に失敗しました。自動作成グループを削除することはできません。" - delete_member_confirm: "'%{group}' グループから'%{username}' を削除しますか?" - name: "名前" add: "追加" add_members: "メンバーを追加" custom: "カスタム" @@ -1790,6 +1779,11 @@ ja: info_html: "API キーを使うと、JSON 呼び出しでトピックの作成・更新を行うことが出来ます。" all_users: "全てのユーザ" note_html: "このキーは、秘密にしてください。このキーを持っている全てのユーザは任意のユーザとして、好きな投稿を作成できます" + web_hooks: + title: "Webhooks" + none: "現在、Webhooksはありません。" + events: + actions: "アクション" plugins: title: "プラグイン" installed: "インストール済みプラグイン" @@ -1854,10 +1848,8 @@ ja: label: "ロールバック" title: "データベースを前回の状態に戻します" export_csv: - user_archive_confirm: "投稿をダウンロードしてもよろしいですか?" success: "エクスポートを開始しました。処理が完了した後、メッセージでお知らせします。" failed: "出力失敗。詳しくはログに参考してください。" - rate_limit_error: "投稿は1日に1度だけダウンロードできます。また明日お試しください。" button_text: "エクスポート" button_title: user: "全てのユーザをCSV出力" @@ -2143,7 +2135,6 @@ ja: suspend_reason: "理由" suspended_by: "凍結したユーザ" delete_all_posts: "全ての投稿を削除" - delete_all_posts_confirm: "%{posts}件の投稿と%{topics}個のトピックが削除されます。よろしいですか?" suspend: "凍結" unsuspend: "凍結解除" suspended: "凍結状態" @@ -2154,7 +2145,7 @@ ja: show_admin_profile: "アカウントの管理" edit_title: "タイトルを編集" save_title: "タイトルを保存" - refresh_browsers: "ブラウザを強制リフレッシュ" + refresh_browsers: "ブラウザを強制更新" refresh_browsers_message: "全てのクライアントにメッセージが送信されました!" show_public_profile: "パブリックプロフィールを見る" impersonate: 'このユーザになりすます' @@ -2227,7 +2218,6 @@ ja: unlock_trust_level: "トラストレベルをアンロック" tl3_requirements: title: "トラストレベル3の条件" - table_title: "過去%{time_period} 日間に" value_heading: "値" requirement_heading: "条件" visits: "訪問" @@ -2290,8 +2280,13 @@ ja: confirm: '確認' dropdown: "ドロップダウン" site_text: + description: "フォーラム上のテキストを編集することができます。下のフォームで検索する事ができます:" + search: "編集したいものを入力して検索" title: 'テキストコンテンツ' edit: '編集' + go_back: "戻る" + recommended: "それぞれにあわせて、文章を変えることをオススメします:" + show_overriden: '上書き部分のみ表示' site_settings: show_overriden: '上書き部分のみ表示' title: '設定' @@ -2323,6 +2318,7 @@ ja: login: "ログイン" plugins: "プラグイン" user_preferences: "ユーザ設定" + groups: "グループ" badges: title: バッジ new_badge: 新しいバッジ diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index 56852e27450..4343bb203d5 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -44,8 +44,6 @@ ko: other: "< %{count}초" x_seconds: other: "%{count}초 전" - less_than_x_minutes: - other: "< %{count}분" x_minutes: other: "%{count}분 전" about_x_hours: @@ -93,9 +91,13 @@ ko: google+: 'Google+로 공유' email: '이메일로 공유' action_codes: + public_topic: "이 토픽을 %{when} 에 공개" + private_topic: "이 토픽을 %{when} 에 비공개" split_topic: "이 주제를 ${when} 분리" invited_user: "%{who}이(가) %{when}에 초대됨" + invited_group: "%{who} 이(가) %{when} 에 초대됨" removed_user: "%{who}이(가) %{when}에 삭제됨" + removed_group: "%{who}이(가) %{when}에 삭제됨" autoclosed: enabled: '%{when}에 닫힘' disabled: '%{when}에 열림' @@ -116,6 +118,8 @@ ko: disabled: '%{when} 목록에서 감춤' topic_admin_menu: "주제 관리자 기능" emails_are_disabled: "관리자가 이메일 송신을 전체 비활성화 했습니다. 어떤 종류의 이메일 알림도 보내지지 않습니다." + bootstrap_mode_enabled: "쉬운 시작을 위해 부트스트랩 모드로 구동 되었습니다. 모든 새로운 사용자에게 신뢰 수준 1이 부여되고 매일 이메일 다이제스트가 보내집니다. 이 기능은 총 사용자 수가% {min_users} 를 초과 할 때 자동으로 꺼집니다." + bootstrap_mode_disabled: "부트스트랩 모드는 24시간 뒤 비활성화 될 것입니다." s3: regions: us_east_1: "미국 동부 (N. 버지니아)" @@ -126,9 +130,11 @@ ko: eu_central_1: "유럽연합 (프랑크푸르트)" ap_southeast_1: "아시아 태평양 (싱가폴)" ap_southeast_2: "아시아 태평양 (시드니)" + ap_south_1: "아시아 태평양 (뭄바이)" ap_northeast_1: "아시아 태평양 (토쿄)" ap_northeast_2: "아시아 태평양 (서울)" sa_east_1: "남 아메리카 (상파울로)" + cn_north_1: "중국 (북경)" edit: '이 주제의 제목과 카테고리 편집' not_implemented: "죄송합니다. 아직 사용할 수 없는 기능입니다." no_value: "아니오" @@ -149,7 +155,7 @@ ko: faq: "FAQ" guidelines: "가이드라인" privacy_policy: "개인보호 정책" - privacy: "개인정보 취급방침" + privacy: "개인정보처리방침" terms_of_service: "서비스 이용약관" mobile_view: "모바일로 보기" desktop_view: "PC로 보기" @@ -224,6 +230,8 @@ ko: undo: "실행 취소" revert: "되돌리기" failed: "실패" + switch_to_anon: "익명 모드 들어가기" + switch_from_anon: "익명 모드 나가기" banner: close: "배너 닫기" edit: "이 배너 수정 >>" @@ -286,12 +294,6 @@ ko: total_rows: other: "%{count} 사용자" groups: - empty: - posts: "이 그룹의 구성원에 의해 작성된 게시물은 없습니다." - members: "이 그룹에는 구성원이 없습니다." - mentions: "이 그룹에 대한 언급이 없습니다." - messages: "이 그룹에 대한 메시지는 없습니다." - topics: "이 그룹의 구성원에 의해 작성된 주제글이 없습니다." add: "추가" selector_placeholder: "멤버 추가" owner: "소유자" @@ -359,12 +361,10 @@ ko: latest_by: "가장 최근" toggle_ordering: "정렬 컨트롤 토글" subcategories: "하위 카테고리" - topic_stats: "새로운 주제 수" + topic_sentence: + other: "%{count}개의 주제" topic_stat_sentence: other: "지난 %{unit} 동안 %{count}개의 새로운 주제가 있습니다." - post_stats: "새 게시글 수" - post_stat_sentence: - other: "지난 %{unit} 동안 %{count}개의 새로운 게시글이 있습니다." ip_lookup: title: IP Address Lookup hostname: Hostname @@ -387,7 +387,6 @@ ko: profile: "프로필" mute: "알림 끄기" edit: "환경 설정 편집" - download_archive: "내 게시글 다운로드" new_private_message: "새로운 메시지" private_message: "메시지" private_messages: "메시지" @@ -409,6 +408,7 @@ ko: disable: "알림 비활성화" enable: "알림 활성화" each_browser_note: "노트: 사용하시는 모든 브라우저에서 이 설정을 변경해야합니다." + dismiss_notifications: "모두 해지" dismiss_notifications_tooltip: "읽지 않은 알림을 모두 읽음으로 표시" disable_jump_reply: "댓글을 작성했을 때, 새로 작성한 댓글로 화면을 이동하지 않습니다." dynamic_favicon: "새 글이나 업데이트된 글 수를 브라우저 아이콘에 보이기" @@ -424,6 +424,16 @@ ko: suspended_reason: "이유: " github_profile: "Github" email_activity_summary: "활동 요약" + mailing_list_mode: + label: "메일링 리스트 모드" + enabled: "메일링 리스트 모드 활성화" + individual: "모든 새로운 게시글에 대해 메일을 보내주세요." + few_per_day: "모든 새로운 게시글에 대해 메일을 보내주세요 (하루에 약 2개)." + tag_settings: "태그" + watched_tags: "지켜보기" + tracked_tags: "추적하기" + muted_tags: "알람 끄기" + muted_tags_instructions: "이 태그의 새 주제에 대해 어떠한 알림도 받을 수 없으며, 최근의 주제도 나타나지 않습니다." watched_categories: "지켜보기" tracked_categories: "추적하기" muted_categories: "알림 끄기" @@ -439,6 +449,7 @@ ko: muted_users_instructions: "이 회원이 보낸 알림 모두 숨김" muted_topics_link: "알림을 끈 주제 보기" automatically_unpin_topics: "글 끝에 다다르면 자동으로 주제 고정을 해제합니다." + api_approved: "승인됨:" staff_counters: flags_given: "유용한 신고" flagged_posts: "신고된 글" @@ -605,13 +616,9 @@ ko: account_age_days: "일일 계정 나이" create: "이 포럼에 친구를 초대하기" generate_link: "초대 링크 복사" - generated_link_message: '
초대 링크가 성공적으로 생성되었습니다!
초대 링크는 다음 이메일에 한해 유효합니다: %{invitedEmail}
'
bulk_invite:
- none: "아직 아무도 초대하지 않았습니다. 초대장을 각각 보내거나, uploading a bulk invite file을 이용하여 단체 초대를 보낼 수 있습니다."
text: "파일로 대량 초대하기"
- uploading: "업로드 중..."
success: "파일이 성공적으로 업로드되었습니다. 완료되면 메시지로 알려드리겠습니다."
- error: "'{{filename}}': {{message}} 업로드중 에러가 있었습니다."
password:
title: "비밀번호"
too_short: "암호가 너무 짧습니다."
@@ -633,8 +640,10 @@ ko:
likes_received:
other: "받음"
top_replies: "인기 댓글"
+ no_replies: "아직 답글이 없습니다."
more_replies: "답글 더 보기"
top_topics: "인기 주제"
+ no_topics: "아직 주제가 없습니다."
more_topics: "주제 더 보기"
top_badges: "인기 배지"
no_badges: "아직 배지가 없습니다."
@@ -683,9 +692,9 @@ ko:
read_only_mode:
enabled: "이 사이트는 현재 읽기전용 모드입니다. 브라우징은 가능하지만, 댓글달기, 좋아요 등 다른 행위들은 현재 비활성화 되어있습니다."
login_disabled: "사이트가 읽기 전용모드로 되면서 로그인은 비활성화되었습니다."
- too_few_topics_and_posts_notice: "토론을 시작하시죠! 현재 %{currentTopics} / %{requiredTopics} 주제와 %{currentPosts} / %{requiredPosts} 글이 있습니다. 새 방문자는 읽고 응답할 대화꺼리가 좀 필요해요."
- too_few_topics_notice: "토론을 시작하시죠! 현재 %{currentTopics} / %{requiredTopics} 주제가 있습니다. 새 방문자는 읽고 응답할 대화꺼리가 좀 필요해요."
- too_few_posts_notice: "토론을 시작하시죠! 현재 %{currentPosts} / %{requiredPosts} 글이 있습니다. 새 방문자는 읽고 응답할 대화꺼리가 좀 필요해요."
+ too_few_topics_and_posts_notice: "토론을 시작하시죠! 현재 %{currentTopics} / %{requiredTopics} 주제와 %{currentPosts} / %{requiredPosts} 글이 있습니다. 새 방문자에게는 읽고 응답할 대화거리가 필요합니다."
+ too_few_topics_notice: "토론을 시작하시죠! 현재 %{currentTopics} / %{requiredTopics} 주제가 있습니다. 새 방문자에게는 읽고 응답할 대화거리가 필요합니다."
+ too_few_posts_notice: "토론을 시작하시죠! 현재 %{currentPosts} / %{requiredPosts} 글이 있습니다. 새 방문자에게는 읽고 응답할 대화거리가 필요합니다."
learn_more: "더 배우기"
year: '년'
year_desc: '지난 365일간 생성된 주제'
@@ -936,7 +945,6 @@ ko:
title: "주제, 글, 사용자, 카테고리 검색"
no_results: "검색 결과가 없습니다"
no_more_results: "더 이상 결과가 없습니다."
- search_help: 검색 도움말
searching: "검색중..."
post_format: "#{{post_number}} by {{username}}"
context:
@@ -997,7 +1005,6 @@ ko:
unsubscribe:
stop_notifications: "{{title}}에 대한 알림은 이제 덜 받게 됩니다."
change_notification_state: "현재 당신의 알림 설정 : "
- filter_to: "이 주제에 {{post_count}}개의 글이 있습니다"
create: '새 주제 만들기'
create_long: '새로운 주제 만들기'
private_message: '메시지 시작'
@@ -1051,7 +1058,6 @@ ko:
auto_close_title: '자동으로 닫기 설정'
auto_close_save: "저장"
auto_close_remove: "이 주제를 자동으로 닫지 않기"
- auto_close_immediate: "주제에 마지막 글이 올라온 지 %{hours} 시간 지났기 때문에 이 주제는 즉시 닫힐 예정입니다."
progress:
title: 진행 중인 주제
go_top: "맨위"
@@ -1061,7 +1067,6 @@ ko:
jump_bottom_with_number: "jump to post %{post_number}"
total: 총 글
current: 현재 글
- position: "post %{current} of %{total}"
notifications:
reasons:
'3_6': '이 카테고리를 보고 있어서 알림을 받게 됩니다.'
@@ -1228,7 +1233,6 @@ ko:
post:
reply: " {{replyAvatar}} {{usernameLink}}"
reply_topic: " {{link}}"
- quote_reply: "인용한 답글"
edit: "{{link}} {{replyAvatar}} {{username}} 편집"
edit_reason: "Reason: "
post_number: "{{number}}번째 글"
@@ -1243,7 +1247,6 @@ ko:
expand_collapse: "확장/축소"
gap:
other: "{{count}}개의 숨겨진 답글 보기"
- more_links: "{{count}}개 더..."
unread: "읽지 않은 포스트"
has_replies:
other: "{{count}} 답글"
@@ -1302,14 +1305,6 @@ ko:
flag: '신고하기'
defer_flags:
other: "신고 보류하기"
- it_too:
- off_topic: "나도 신고하기"
- spam: "나도 신고하기"
- inappropriate: "나도 신고하기"
- custom_flag: "나도 신고하기"
- bookmark: "나도 북마크하기"
- like: "나도 좋아해요"
- vote: "나도 투표하기"
undo:
off_topic: "신고 취소"
spam: "신고 취소"
@@ -1399,7 +1394,7 @@ ko:
edit: '편집'
edit_long: "카테고리 편집"
view: '카테고리 안의 주제 보기'
- general: '장군'
+ general: '일반'
settings: '설정'
topic_template: "주제 템플릿"
delete: '카테고리 삭제'
@@ -1460,7 +1455,6 @@ ko:
take_action: "조치하기"
notify_action: '메시지 보내기'
delete_spammer: "네, 스패머 회원을 삭제합니다"
- delete_confirm: "이 회원의 글 %{posts}개 및 주제 %{topics}개를 삭제하고 IP주소 %{ip_address}와 이메일 %{email}을 영구 차단하려고 합니다. 이 회원이 정말 스패머가 확실합니까?"
yes_delete_spammer: "예, 스팸 회원을 삭제합니다"
ip_address_missing: "(알 수 없음)"
hidden_email_address: "(숨김)"
@@ -1473,10 +1467,6 @@ ko:
spam: "스팸입니다"
custom_placeholder_notify_user: "구체적이고, 건설적이며, 항상 친절하세요."
custom_placeholder_notify_moderators: "구체적으로 회원님이 걱정하는 내용과 가능한 모든 관련된 링크를 제공해주세요."
- custom_message:
- at_least: "최소한 {{n}}자를 입력하세요"
- more: "{{n}} 이동합니다"
- left: "{{n}} 나머지"
flagging_topic:
title: "우리 커뮤니티 질서를 지키는데 도와주셔서 감사합니다!"
action: "주제 신고하기"
@@ -1507,7 +1497,6 @@ ko:
invisible:
help: "이 주제는 목록에서 제외됩니다. 주제 목록에 표시되지 않으며 링크를 통해서만 접근 할 수 있습니다."
posts: "글"
- posts_lowercase: "글"
posts_long: "이 주제의 글 수는 {{number}}개 입니다."
posts_likes_MF: |
This topic has {count, plural, one {1 reply} other {# replies}} {ratio, select,
@@ -1736,15 +1725,12 @@ ko:
refresh: "새로고침"
new: "새로운"
selector_placeholder: "아이디를 입력하세요"
- name_placeholder: "그룹 이름, 사용자 이름처럼 빈칸 없이 작성"
about: "회원과 이름을 변경"
group_members: "그룹 멤버"
delete: "삭제"
delete_confirm: "이 그룹을 삭제 하시겠습니까?"
delete_failed: "이것은 자동으로 생성된 그룹입니다. 삭제할 수 없습니다."
- delete_member_confirm: "'%{group}' 그룹에서 '%{username}'을 제외시키겠습니까?"
delete_owner_confirm: "'%{username}' 님에게서 소유자권한을 제거할까요?"
- name: "이름"
add: "추가"
add_members: "사용자 추가하기"
custom: "Custom"
@@ -1831,10 +1817,8 @@ ko:
title: "데이터베이스를 이전 workiong state로 되돌리기"
confirm: "데이타베이스를 이전 상태로 롤백 또는 되돌리기 할까요?"
export_csv:
- user_archive_confirm: "정말로 내 글을 다운로드 받습니까?"
success: "Export initiated, you will be notified via message when the process is complete."
failed: "내보내기가 실패했습니다. 로그를 확인해주세요"
- rate_limit_error: "글은 하루에 한번 다운로드 받을 수 있습니다. 내일 다시 시도해주십시요."
button_text: "내보니기"
button_title:
user: "모든 사용자 목록을 CSV 형식으로 내보내기"
@@ -2138,7 +2122,6 @@ ko:
suspend_reason: "Reason"
suspended_by: "접근 금지자"
delete_all_posts: "모든 글을 삭제합니다"
- delete_all_posts_confirm: "%{posts}개의 글과 %{topics}개의 주제를 지우려고 합니다. 확실합니까?"
suspend: "접근 금지"
unsuspend: "접근 허용"
suspended: "접근 금지?"
@@ -2186,7 +2169,7 @@ ko:
anonymize_failed: "There was a problem anonymizing the account."
delete: "사용자 삭제"
delete_forbidden_because_staff: "관리자 및 운영자 계정은 삭제할 수 없습니다."
- delete_posts_forbidden_because_staff: "어드민와 운영자들의 포스트는 삭제할 수 없습니다."
+ delete_posts_forbidden_because_staff: "관리자와 운영자의 글은 삭제할 수 없습니다."
delete_forbidden:
other: "사용자가 작성한 글이 있으면 사용자를 삭제 할 수 없습니다. 사용자를 삭제 하기 전에 사용자가 작성한 글을 모두 삭제해야 합니다. (%{count}일 이전에 작성한 글은 삭제할 수 없습니다.)"
cant_delete_all_posts:
@@ -2222,7 +2205,6 @@ ko:
unlock_trust_level: "회원등급 고정 해제"
tl3_requirements:
title: "3등급 회원이 되기 위한 자격"
- table_title: "지난 %{time_period} 일간"
value_heading: "값"
requirement_heading: "자격요건"
visits: "방문횟수"
diff --git a/config/locales/client.nb_NO.yml b/config/locales/client.nb_NO.yml
index 50c70993cac..9ce8c0f148c 100644
--- a/config/locales/client.nb_NO.yml
+++ b/config/locales/client.nb_NO.yml
@@ -27,17 +27,19 @@ nb_NO:
millions: "{{number}}M"
dates:
time: "h:mm a"
+ timeline_date: "MMM YYYY"
long_no_year: "D MMM h:mm a"
long_no_year_no_time: "D MMM"
- full_no_year_no_time: "MMMM Do"
+ full_no_year_no_time: "D. MMMM"
long_with_year: "D MMM, YYYY h:mm a"
long_with_year_no_time: "D MMM, YYYY"
- full_with_year_no_time: "MMMM Do, YYYY"
+ full_with_year_no_time: "D. MMMM, YYYY"
long_date_with_year: "D MMM, 'YY LT"
long_date_without_year: "D MMM, LT"
long_date_with_year_without_time: "D MMM, 'YY"
long_date_without_year_with_linebreak: "D MMM
LT"
- long_date_with_year_with_linebreak: "D MMM, 'YY
LT"
+ long_date_with_year_with_linebreak: "D. MMM, 'YY
LT"
+ wrap_ago: "%{date} siden"
tiny:
half_a_minute: "< 1m"
less_than_x_seconds:
@@ -46,9 +48,6 @@ nb_NO:
x_seconds:
one: "1s"
other: "%{count}s"
- less_than_x_minutes:
- one: "< 1m"
- other: "< %{count}m"
x_minutes:
one: "1m"
other: "%{count}m"
@@ -79,7 +78,7 @@ nb_NO:
x_days:
one: "1 dag"
other: "%{count} dager"
- date_year: "D MMM, 'YY"
+ date_year: "D. MMM, 'YY"
medium_with_ago:
x_minutes:
one: "1 minutt siden"
@@ -100,8 +99,8 @@ nb_NO:
x_years:
one: "1 år senere"
other: "%{count} år senere"
- previous_month: 'Forrige Måned'
- next_month: 'Neste Måned'
+ previous_month: 'Forrige måned'
+ next_month: 'Neste måned'
share:
topic: 'del en lenke til dette emnet'
post: 'innlegg #%{postNumber}'
@@ -113,8 +112,11 @@ nb_NO:
action_codes:
public_topic: "gjorde dette emnet offentlig %{when}"
private_topic: "gjorde dette emnet privat %{when}"
+ split_topic: "splittet dette emnet %{when}"
invited_user: "inviterte %{who} %{when}"
+ invited_group: "inviterte %{who} %{when}"
removed_user: "fjernet %{who} %{when}"
+ removed_group: "fjernet %{who} %{when}"
autoclosed:
enabled: 'lukket %{when}'
disabled: 'åpnet %{when}'
@@ -126,11 +128,33 @@ nb_NO:
disabled: 'fjernet fra arkiv %{when}'
pinned:
enabled: 'festet %{when}'
- disabled: 'avfestet %{when}'
+ disabled: 'feste fjernet %{when}'
pinned_globally:
enabled: 'festet globalt %{when}'
+ disabled: 'feste fjernet %{when}'
+ visible:
+ enabled: 'gjort synlig %{when}'
+ disabled: 'skjult %{when}'
topic_admin_menu: "admin-handlinger for emne"
+ wizard_required: "Det er på tide å sette opp forumet! Start veiviseren!"
emails_are_disabled: "All utgående e-post har blitt deaktivert globalt av en administrator. Ingen e-postvarslinger vil bli sendt."
+ bootstrap_mode_enabled: "For å gjøre det enklere å lansere det nye nettstedet ditt er det i bootstrap-modus. Alle nye brukere vil få tillitsnivå 1 og få daglige oppdateringer på e-post aktivert. Dette vil automatisk bli slått av når antallet brukere overstiger %{min_users}."
+ bootstrap_mode_disabled: "Bootstrap modus vil bli deaktivert i løpet av de neste 24 timene."
+ s3:
+ regions:
+ us_east_1: "USA øst (N. Virginia)"
+ us_west_1: "USA vest (N. California)"
+ us_west_2: "USA vest (Oregon)"
+ us_gov_west_1: "AWS GovCloud (USA)"
+ eu_west_1: "EU (Irland)"
+ eu_central_1: "EU (Frankfurt)"
+ ap_southeast_1: "Asia/Stillehavsregionen (Singapore)"
+ ap_southeast_2: "Asia/Stillehavsregionen (Sydney)"
+ ap_south_1: "Asia/Stillehavsregionen (Mumbai)"
+ ap_northeast_1: "Asia/Stillehavsregionen (Tokyo)"
+ ap_northeast_2: "Asia/Stillehavsregionen (Seoul)"
+ sa_east_1: "Asia/Stillehavsregionen (Sao Paulo)"
+ cn_north_1: "Kina (Beijing)"
edit: 'rediger tittelen og kategorien til dette emnet'
not_implemented: "Beklager, denne funksjonen har ikke blitt implementert enda."
no_value: "Nei"
@@ -148,12 +172,12 @@ nb_NO:
links: "Lenker"
links_lowercase:
one: "link"
- other: "linker"
+ other: "lenker"
faq: "FAQ"
guidelines: "Retningslinjer"
- privacy_policy: "Personvern"
+ privacy_policy: "Personvernerklæring"
privacy: "Personvern"
- terms_of_service: "Betingelser"
+ terms_of_service: "Bruksvilkår"
mobile_view: "Mobilvisning"
desktop_view: "Skrivebordsvisning"
you: "Du"
@@ -163,7 +187,7 @@ nb_NO:
more: "Mer"
less: "Mindre"
never: "aldri"
- every_30_minutes: "hvert 30 minutt"
+ every_30_minutes: "hvert 30. minutt"
every_hour: "hver time"
daily: "daglig"
weekly: "ukentlig"
@@ -176,7 +200,7 @@ nb_NO:
other: "{{count}} tegn"
suggested_topics:
title: "Anbefalte emner"
- pm_title: "Foreslåtte Meldinger"
+ pm_title: "Anbefalte meldinger"
about:
simple_title: "Om"
title: "Om %{title}"
@@ -192,8 +216,8 @@ nb_NO:
post_count: "Innlegg"
user_count: "Nye brukere"
active_user_count: "Aktive brukere"
- contact: "Kontakt Oss"
- contact_info: "Hvis noe kritisk skulle oppstå eller det er en hastesak som påvirker siden, ta kontakt på %{contact_info}."
+ contact: "Kontakt oss"
+ contact_info: "I tilfelle en kritisk hendelse skulle inntreffe eller det er en hastesak som påvirker siden, ta kontakt på %{contact_info}."
bookmarked:
title: "Bokmerke"
clear_bookmarks: "Fjern bokmerker"
@@ -231,6 +255,8 @@ nb_NO:
undo: "Angre"
revert: "Reverser"
failed: "Mislykket"
+ switch_to_anon: "Start inkognitomodus"
+ switch_from_anon: "Avslutt inkognitomodus"
banner:
close: "Fjern denne banneren"
edit: "Endre denne banneren >>"
@@ -248,14 +274,15 @@ nb_NO:
none: "Det er ingen innlegg som må evalueres."
edit: "Rediger"
cancel: "Avbryt"
- view_pending: "vis påventende innlegg"
+ view_pending: "vis ventende innlegg"
has_pending_posts:
one: "Dette emnet har 1 innlegg som venter på godkjenning"
other: "Dette emnet har {{count}} innlegg som venter på godkjenning"
confirm: "Lagre endringer"
+ delete_prompt: "Er du sikker du ønsker å slette %{username}? Dette vil fjerne alle brukerens innnlegg og blokkere brukerens epost- og ip-addresse."
approval:
- title: "Innlegg Behøver Godkjenning"
- description: "Vi har mottatt ditt nye innlegg men det krever godkjenning av en moderator før det vises. Venligst vær tålmodig."
+ title: "Innlegg trenger godkjenning"
+ description: "Vi har mottatt ditt nye innlegg men det krever godkjenning av en moderator før det vises. Vennligst vær tålmodig."
pending_posts:
one: "Du har 1 innlegg som venter på godkjenning."
other: "Du har {{count}} innlegg som venter på godkjenning."
@@ -279,6 +306,7 @@ nb_NO:
title: "Brukere"
likes_given: "Gitt"
likes_received: "Mottatt"
+ topics_entered: "Lest"
topics_entered_long: "Emner Sett"
time_read: "Tid lest"
topic_count: "Emner"
@@ -289,45 +317,103 @@ nb_NO:
days_visited: "Besøk"
days_visited_long: "Dager besøkt"
posts_read: "Lest"
- posts_read_long: "Lest"
+ posts_read_long: "Innlegg lest"
total_rows:
one: "1 bruker"
other: "%{count} brukere"
+ group_histories:
+ actions:
+ change_group_setting: "Endre gruppeinnstillinger"
+ add_user_to_group: "Legg til bruker"
+ remove_user_from_group: "Slett bruker"
+ make_user_group_owner: "Gjør til eier"
+ remove_user_as_group_owner: "Fjern som eier"
groups:
+ logs:
+ title: "Logger"
+ when: "Når"
+ action: "Handling"
+ acting_user: "Utførende bruker"
+ target_user: "Målbruker"
+ subject: "Emne"
+ details: "Detaljer"
+ from: "Fra"
+ to: "Til"
+ edit:
+ title: 'Rediger gruppe'
+ full_name: 'Fullt navn'
+ add_members: "Legg til medlemmer"
+ delete_member_confirm: "Fjern '%{username}' fra gruppen '%{group}'?"
+ request_membership_pm:
+ title: "Ønske om medlemskap"
+ body: "Jeg vil be om å bli medlem av gruppen @%{groupName}."
+ name_placeholder: "Gruppenavn, ingen mellomrom, samme regler som for brukernavn"
+ public: "Tillatt brukere å bli medlem av og forlate gruppen fritt (Krever at gruppen er synlig)"
empty:
- posts: "Det er ingen innlegg av medlemmene i denne gruppen."
- members: "Det er ingen medlemmer i denne gruppen."
- messages: "Det er ingen meldinger for denne gruppen."
+ posts: "Det er ingen innlegg av medlemmer i denne gruppen."
+ members: "Det er ingen medlemmer av denne gruppen."
+ mentions: "Denne gruppen har aldri blitt nevnt."
+ messages: "Det er ingen meldinger til denne gruppen."
+ topics: "Det er ingen emner av medlemmer av denne gruppen."
+ logs: "Det er ingen logger for denne gruppen."
add: "Legg til"
+ join: "Bli medlem av gruppe"
+ leave: "Forlat gruppe"
+ request: "Be om gruppemedlemskap"
+ automatic_group: Automatisk gruppe
+ closed_group: Lukket gruppe
+ is_group_user: "Du er medlem av denne gruppen"
+ allow_membership_requests: "Tillat brukere å sende forespørsler om medlemskap av gruppen til eiere (Krever at alle kan nevne gruppen)"
+ membership: "Medlemskap"
+ name: "Navn"
+ user_count: "Antall medlemmer"
+ bio: "Om gruppe"
selector_placeholder: "Legg til medlemmer"
owner: "eier"
visible: "Gruppen er synlig for alle brukere"
+ index:
+ title: "Grupper"
+ empty: "Det er ingen synlige grupper"
title:
one: "gruppe"
other: "grupper"
+ activity: "Aktivitet"
members: "Medlemmer"
topics: "Emner"
posts: "Innlegg"
mentions: "Omtalelser"
messages: "Meldinger"
alias_levels:
+ title: "Hvem kan sende meldinger til og @nevne denne gruppen?"
nobody: "Ingen"
only_admins: "Kun administratorer"
mods_and_admins: "Kun moderatorer og administratorer"
members_mods_and_admins: "Kun gruppemedlemmer, moderatorer og administratorer"
everyone: "Alle"
trust_levels:
+ title: "Tillitsnivå som automatisk gis til nye medlemmer når de legges til:"
none: "ingen"
notifications:
watching:
title: "Følger"
+ description: "Du vil bli varslet om hvert nye innlegg i hver beskjed, og antallet nye svar vil bli vist."
+ watching_first_post:
+ title: "Følger første innlegg"
+ description: "Du vil bare bli varslet om det første innlegget i hvert nye emne i denne gruppen."
tracking:
- title: "Sporer"
+ title: "Overvåker"
+ description: "Du vil få beskjeddersom nevner @navnet_ditt eller svarer deg, og antallet nye svar vil bli vist."
regular:
title: "Normal"
description: "Du vil bli varslet hvis noen nevner ditt @navn eller svarer deg."
muted:
- title: "Dempet"
+ title: "Ignorert"
+ description: "Du vil aldri bli varslet om noe angående nye emner i denne gruppen."
+ flair_url_placeholder: "(Valgfritt) Font Awesome-klasse eller URL til bilde"
+ flair_bg_color_placeholder: "(Valgfritt) Fargekode som hex-verdi"
+ flair_color_placeholder: "(Valgfritt) Fargekode som hex-verdi"
+ flair_preview_icon: "Forhåndsvis ikon"
+ flair_preview_image: "Forhåndsvis bilde"
user_action_groups:
'1': "Liker tildelt"
'2': "Liker mottatt"
@@ -346,26 +432,31 @@ nb_NO:
all_subcategories: "alle"
no_subcategory: "ingen"
category: "Kategori"
+ category_list: "Vis kategoriliste"
reorder:
+ title: "Endre rekkefølge på kategorier"
+ title_long: "Reorganiser kategorilisten"
+ fix_order: "Lås posisjoner"
+ fix_order_tooltip: "Ikke alle kategoriene har et unikt posisjonsnummer. Det kan gi uventede resultater."
save: "Lagre Rekkefølge"
+ apply_all: "Bruk"
+ position: "Posisjon"
posts: "Innlegg"
topics: "Emner"
latest: "Siste"
latest_by: "siste av"
toggle_ordering: "veksle rekkefølge"
subcategories: "Underkategorier"
- topic_stats: "Antall nye emner."
+ topic_sentence:
+ one: "1 emne"
+ other: "%{count} nye emner"
topic_stat_sentence:
one: "%{count} nytt emner de siste %{unit}."
other: "%{count} nye emner de siste %{unit}."
- post_stats: "Antall nye innlegg."
- post_stat_sentence:
- one: "%{count} nye innlegg den siste %{unit}."
- other: "%{count} nye innlegg de siste %{unit}."
ip_lookup:
title: Slå opp IP-adresse
hostname: Vertsnavn
- location: Posisjon
+ location: Sted
location_not_found: (ukjent)
organisation: Organisasjon
phone: Telefon
@@ -382,14 +473,19 @@ nb_NO:
user:
said: "{{username}}:"
profile: "Profil"
- mute: "Demp"
+ mute: "Ignorer"
edit: "Rediger innstillinger"
- download_archive: "Last ned mine innlegg"
+ download_archive:
+ button_text: "Last ned mine innlegg"
+ confirm: "Er du sikker på at du vil laste ned dine innlegg?"
+ success: "Nedlasting iverksatt. Du vil bli varslet med en melding når prosessen er fullført."
+ rate_limit_error: "Innlegg kan lastes ned en gang om dagen, vennligst prøv igjen i morgen."
new_private_message: "Ny Melding"
private_message: "Melding"
private_messages: "Meldinger"
activity_stream: "Aktivitet"
preferences: "Innstillinger"
+ expand_profile: "Utvid"
bookmarks: "Bokmerker"
bio: "Om meg"
invited_by: "Invitert av"
@@ -398,12 +494,15 @@ nb_NO:
statistics: "Statistikk"
desktop_notifications:
label: "Skrivebordsvarslinger"
+ not_supported: "Varsler er ikke støttet på denne nettleseren. Beklager."
perm_default: "Slå på varslinger"
perm_denied_btn: "Tillatelse avslått"
+ perm_denied_expl: "Du tillot ikke varsler. Tillat varsler via innstillingene i din nettleser."
disable: "Slå av varslinger"
enable: "Slå på varslinger"
each_browser_note: "Merk: Du må endre denne innstillinger for hver nettleser du bruker."
dismiss_notifications_tooltip: "Merk alle uleste varslinger som lest"
+ first_notification: "Ditt første varsel! Velg det for å komme i gang."
disable_jump_reply: "Ikke hopp til ditt nye innlegg etter svar"
dynamic_favicon: "Vis antall nye / oppdaterte emner på nettleser ikonet"
external_links_in_new_tab: "Åpne alle eksterne lenker i ny fane"
@@ -417,9 +516,35 @@ nb_NO:
suspended_notice: "Denne brukeren er bannlyst til {{date}}."
suspended_reason: "Begrunnelse:"
github_profile: "Github"
- watched_categories: "Følger"
- tracked_categories: "Sporet"
- muted_categories: "Dempet"
+ email_activity_summary: "Oppsummering av aktivitet"
+ mailing_list_mode:
+ label: "E-postlistemodus"
+ enabled: "Slå på e-postlistemodus"
+ instructions: |
+ Denne innstillingen overstyrer oppsummeringen av aktivitet.
+ Ignorerte emner og kategorier blir ikke inkludert i disse e-postene.
+ daily: "Send daglige oppdateringer"
+ individual: "Send en e-post for hvert nye innlegg"
+ individual_no_echo: "Send en e-post for hvert nye innlegg bortsett fra mine egne"
+ many_per_day: "Send meg en e-post for hvert nye innlegg (rundt {{dailyEmailEstimate}} daglig)"
+ few_per_day: "Send meg en e-post for hvert nye innlegg (rundt 2 daglig)"
+ tag_settings: "Stikkord"
+ watched_tags: "Fulgt"
+ watched_tags_instructions: "Du vil automatisk følge alle emner med disse stikkordene. Du vil bli varslet om alle nye innlegg og emner, og tallet på nye innlegg til også vises ved siden av emnet."
+ tracked_tags: "Overvåkes"
+ tracked_tags_instructions: "Du vil automatisk overvåke alle emner med disse stikkordene. Tallet på nye innlegg vil vises ved siden av emnet."
+ muted_tags: "Ignorert"
+ muted_tags_instructions: "Du vil ikke bli varslet om noe med tanke på nye emner med disse stikkordene, og de vil ikke vises i siste."
+ watched_categories: "Fulgt"
+ watched_categories_instructions: "Du vil automatisk følge alle emner i disse kategoriene. Du vil bli varslet om alle nye innlegg og emner, og tallet på nye innlegg vil vises ved siden av emnet."
+ tracked_categories: "Overvåkes"
+ tracked_categories_instructions: "Du vil automatisk overvåke alle emner i disse kategoriene. Tallet på nye innlegg vil vises ved siden av emnet."
+ watched_first_post_categories: "Følger første innlegg"
+ watched_first_post_categories_instructions: "Du vil bli varslet om det første innlegget i hvert nye emner i disse kategoriene."
+ watched_first_post_tags: "Følger første innlegg"
+ watched_first_post_tags_instructions: "Du vil bli varslet om det første innlegget i hvert nye emne med disse stikkordene."
+ muted_categories: "Ignorert"
+ muted_categories_instructions: "Du vil ikke bli varslet om noe med tanke på nye emner i disse kategoriene, og de vil ikke vises i siste."
delete_account: "Slett kontoen min"
delete_account_confirm: "Er du sikker på at du vil slette kontoen din permanent? Denne handlingen kan ikke angres!"
deleted_yourself: "Slettingen av din konto har vært vellykket."
@@ -427,8 +552,15 @@ nb_NO:
unread_message_count: "Meldinger"
admin_delete: "Slett"
users: "Brukere"
- muted_users: "Dempet"
+ muted_users: "Ignorert"
muted_users_instructions: "Skjul alle varsler fra denne brukeren"
+ muted_topics_link: "Vis ignorerte emner"
+ watched_topics_link: "Se emner som følges"
+ automatically_unpin_topics: "Automatisk fjern feste for emner når jeg når bunnen."
+ apps: "Apper"
+ revoke_access: "Trekk tilbake tilgang"
+ undo_revoke_access: "Angre \"trekk tilbake tilgang\""
+ api_approved: "Godkjent:"
staff_counters:
flags_given: "nyttige rapporteringer"
flagged_posts: "rapporterte innlegg"
@@ -439,20 +571,25 @@ nb_NO:
all: "Alle"
inbox: "Innboks"
sent: "Sendt"
+ archive: "Arkiver"
groups: "Mine grupper"
bulk_select: "Velg meldinger"
move_to_inbox: "Flytt til inboks"
- select_all: "Velg Alle"
+ move_to_archive: "Arkiver"
+ failed_to_move: "Kunne ikke flytte valgte meldinger (kanskje nettforbindelsen din er nede)"
+ select_all: "Velg alle"
change_password:
success: "(e-post sendt)"
in_progress: "(sender e-post)"
error: "(feil)"
- action: "Send e-post for passordnullstilling"
+ action: "Send e-post for nullstilling av passord"
set_password: "Sett passord"
change_about:
title: "Rediger om meg"
+ error: "Det oppstod en feil ved endring av denne verdien."
change_username:
title: "Endre brukernavn"
+ confirm: "Hvis du endrer brukernavnet ditt, vil alle gamle sitater av dine innlegg og @navn-nevninger feile. Er du helt sikker på at du vil bytte brukernavn?"
taken: "Beklager, det brukernavnet er tatt."
error: "Det skjedde en feil ved endring av ditt brukernavn."
invalid: "Det brukernavnet er ugyldig. Det kan bare inneholde nummer og bokstaver."
@@ -472,18 +609,23 @@ nb_NO:
upload_title: "Last opp bilde"
upload_picture: "Last opp bilde"
image_is_not_a_square: "Vi har beskjært bildet ditt, høyde og bredde er ikke lik"
+ cache_notice: "Profilbildet ditt er oppdatert, men på grunn av mellomlagring i nettlesere kan det ta litt tid før det synes."
change_profile_background:
title: "Profilbakgrunn"
- instructions: "Profil bakgrunner vil bli sentrert med en standard bredde på 850px"
+ instructions: "Profilbakgrunner vil bli sentrert med en standardbredde på 850 piksler."
change_card_background:
title: "Brukerkort bakgrunn"
- instructions: "Bakgrunnsbilder vil bli sentrert og ha en standard bredde på 590px."
+ instructions: "Bakgrunnsbilder vil bli sentrert og ha en standardbredde på 590 piksler."
email:
title: "E-post"
instructions: "Blir aldri vist offentlig"
ok: "Vi sender deg en e-post for å bekrefte"
invalid: "Vennligst oppgi en gyldig e-postadresse"
authenticated: "Din e-post har blitt autentisert av {{provider}}"
+ frequency_immediately: "Vi sender deg umiddelbart en e-post hvis du ikke har lest det vi sender e-post om."
+ frequency:
+ one: "Vi sender deg bare e-post hvis vi ikke har sett deg deg det siste minuttet."
+ other: "Vi sender deg bare e-post hvis vi ikke har sett deg de siste {{count}} minuttene."
name:
title: "Navn"
instructions: "Ditt fulle navn (valgfritt)"
@@ -507,6 +649,7 @@ nb_NO:
title: "Språk for grensesnitt"
instructions: "Språk for grensesnitt. Endringen vil tre i kraft når du oppdaterer siden."
default: "(standard)"
+ any: "hvilken som helst"
password_confirmation:
title: "Passord igjen"
last_posted: "Siste Innlegg"
@@ -514,51 +657,63 @@ nb_NO:
last_seen: "Sist sett"
created: "Medlem fra"
log_out: "Logg ut"
- location: "Posisjon"
+ location: "Sted"
card_badge:
- title: "Brukerkort merke"
+ title: "Brukerkort-merke"
website: "Nettsted"
email_settings: "E-post"
like_notification_frequency:
title: "Varsle når likt"
always: "Alltid"
- first_time_and_daily: "Første gnag et innlegg blir likt og daglig"
+ first_time_and_daily: "Første gang et innlegg blir likt, og daglig"
first_time: "Første gang et innlegg blir likt"
never: "Aldri"
email_previous_replies:
+ title: "Inkludér tidligere svar nederst i e-poster"
+ unless_emailed: "med mindre sendt tidligere"
always: "alltid"
never: "aldri"
email_digests:
+ title: "Send meg en oppsummering på e-post av populære emner og svar dersom jeg ikke besøker siden"
every_30_minutes: "hvert 30 minutt"
every_hour: "hver time"
daily: "daglig"
every_three_days: "hver tredje dag"
weekly: "ukentlig"
every_two_weeks: "annenhver uke"
- email_direct: "Motta en e-post når noen siterer deg, svarer på dine innlegg, nevner ditt brukernavn eller inviterer deg til et emne"
- email_private_messages: "Motta en e-post når noen sender deg en melding"
- email_always: "Send meg varsler på epost selv når jeg er aktiv på nettstedet"
+ include_tl0_in_digests: "Inkludér innhold fra nye brukere i oppsummerings-eposter"
+ email_in_reply_to: "Inkludér et utdrag i e-poster av innlegget man svarer på"
+ email_direct: "Motta en e-post når noen siterer meg, svarer på innlegget mitt, nevner @brukernavnet mitt eller inviterer meg til et emne"
+ email_private_messages: "Motta en e-post når noen sender meg en melding"
+ email_always: "Send meg varsler på e-post selv når jeg er aktiv på nettstedet"
other_settings: "Annet"
categories_settings: "Kategorier"
new_topic_duration:
label: "Anse emner som nye når"
- not_viewed: "Jeg har ikke sett på dem enda."
+ not_viewed: "jeg ikke har sett dem ennå"
last_here: "opprettet siden jeg var her sist"
- auto_track_topics: "Følg automatisk emner jeg åpner"
+ after_1_day: "opprettet i løpet av det siste døgnet"
+ after_2_days: "opprettet i løpet av de siste 2 døgnene"
+ after_1_week: "opprettet i løpet av sist uke"
+ after_2_weeks: "opprettet i løpet av de siste 2 ukene"
+ auto_track_topics: "Overvåk automatisk emner jeg åpner"
auto_track_options:
never: "aldri"
immediately: "øyeblikkelig"
+ after_30_seconds: "etter 30 sekunder"
after_1_minute: "etter 1 minutt"
after_2_minutes: "etter 2 minutt"
after_3_minutes: "etter 3 minutt"
after_4_minutes: "etter 4 minutt"
- after_5_minutes: "etter 5 minut"
+ after_5_minutes: "etter 5 minutt"
after_10_minutes: "etter 10 minutt"
+ notification_level_when_replying: "Når jeg publiserer noe i et emner, sett det emnet til"
invited:
search: "skriv for å søke etter invitasjoner..."
title: "invitasjoner"
user: "Invitert bruker"
sent: "Sendt"
+ none: "Det er ingen ventende invitasjoner å vise."
redeemed: "Løs inn invitasjoner"
redeemed_tab: "Brukt"
redeemed_at: "Løst inn ved"
@@ -570,17 +725,18 @@ nb_NO:
rescind: "Fjern"
rescinded: "Invitasjon fjernet"
reinvite: "Send invitasjon igjen"
+ reinvite_all: "Send alle invitasjoner på nytt"
reinvited: "Invitasjon sendt igjen"
+ reinvited_all: "Alle invitasjoner sendt på nytt!"
time_read: "Lesetid"
days_visited: "Dager besøkt"
account_age_days: "Kontoalder i dager"
create: "Send en invitasjon"
+ generate_link: "Kopier invitasjonslenke"
+ valid_for: "Invitasjonslenke er kun gyldig for denne e-postadressen: %{email}"
bulk_invite:
- none: "Du har ikke invitert noen hit enda. Du kan sende individuelle invitasjoner, eller invitere en gruppe folk på en gang ved å laste opp en fil med flere invitasjoner."
text: "Masseinvitasjon fra fil"
- uploading: "Laster opp..."
success: "Filen er lastet opp, du vil motta en melding når prosessesen er ferdig"
- error: "En feil oppsto ved opplastingen av '{{filename}}': {{message}}"
password:
title: "Passord"
too_short: "Passordet ditt er for kort"
@@ -592,9 +748,37 @@ nb_NO:
summary:
title: "Oppsummering"
stats: "Statistikk"
+ time_read: "lesetid"
+ topic_count:
+ one: "emne opprettet"
+ other: "emner opprettet"
+ post_count:
+ one: "innlegg skrevet"
+ other: "innlegg skrevet"
+ likes_given:
+ one: " gitt"
+ other: " gitt"
+ likes_received:
+ one: " mottatt"
+ other: " mottatt"
+ days_visited:
+ one: "dag besøkt"
+ other: "dager besøkt"
+ posts_read:
+ one: "innlegg lest"
+ other: "innlegg lest"
+ bookmark_count:
+ one: "bokmerke"
+ other: "bokmerker"
top_replies: "Mest Populære Svar"
+ no_replies: "Ingen svar enda."
+ more_replies: "Flere svar"
top_topics: "Mest Populære Emner"
+ no_topics: "Ingen emner enda."
more_topics: "Flere Emner"
+ no_badges: "Ennå ingen merker."
+ more_badges: "Flere merker"
+ no_links: "Ingen lenker enda"
associated_accounts: "Innloggingsforsøk"
ip_address:
title: "Siste IP-adresse"
@@ -626,18 +810,23 @@ nb_NO:
network_fixed: "Ser ut som om den er tilbake."
server: "Feilkode: {{status}}"
forbidden: "Du har ikke tilgang til dette."
- not_found: "Oops, applikasjonen forsøkte å laste en URL som ikke eksisterer."
+ not_found: "Oisann, applikasjonen forsøkte å laste en URL som ikke eksisterer."
unknown: "Noe gikk galt."
buttons:
back: "Gå tilbake"
again: "Prøv igjen"
fixed: "Last side"
close: "Lukk"
- assets_changed_confirm: "Dette nettstedet ble nettopp oppdatert. Oppdater nå for nyeste versjon?"
+ assets_changed_confirm: "Dette nettstedet ble nettopp oppdatert. Oppdater nå for siste versjon?"
logout: "Du ble logget ut"
refresh: "Refresh"
read_only_mode:
+ enabled: "Dette nettstedet er i lese-modus. Fortsett gjerne, men du kan ikke svare, trykke liker eller utføre andre handlinger som er slått av."
login_disabled: "Innlogging er deaktivert mens nettsiden er i skrivebeskyttet modus."
+ logout_disabled: "Du kan ikke logge ut når nettstedet er i lese-modus."
+ too_few_topics_and_posts_notice: "La oss få i gang diskusjonen. Det finnes for øyeblikket %{currentTopics} / %{requiredTopics} emner og %{currentPosts} / %{requiredPosts} innlegg. Nye brukere trenger noen samtaler å lese og svare på."
+ too_few_topics_notice: "La oss få i gang diskusjonen. Det finnes for øyeblikket %{currentTopics} / %{requiredTopics} emner. Nye brukere trenger noen samtaler å lese og svare på."
+ too_few_posts_notice: "La oss få i gang diskusjonen. Det finnes for øyeblikket %{currentPosts} / %{requiredPosts} innlegg. Nye brukere trenger noen samtaler å lese og svare på."
learn_more: "lær mer..."
year: 'år'
year_desc: 'emner opprettet de siste 365 dagene'
@@ -647,8 +836,8 @@ nb_NO:
week_desc: 'emner opprettet de siste 7 dagene'
day: 'dag'
first_post: Første innlegg
- mute: Demp
- unmute: Fjern demping
+ mute: Ignorer
+ unmute: Fjern ignorering
last_post: Siste innlegg
last_reply_lowercase: siste svar
replies_lowercase:
@@ -662,7 +851,8 @@ nb_NO:
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."
+ enabled_description: "Du ser for øyeblikket en oppsummering av dette emnet: de mest interessante innleggene ifølge fellesskapet."
+ description: "Det er {{replyCount}} svar."
enable: 'Oppsummer dette emnet'
disable: 'Vis alle innlegg'
deleted_filter:
@@ -672,8 +862,9 @@ nb_NO:
disable: "Vis slettede innlegg"
private_message_info:
title: "Send"
- invite: "Inviter andre..."
+ invite: "Invitér andre..."
remove_allowed_user: "Er du sikker på at du vil fjerne {{name}} fra denne meldingen?"
+ remove_allowed_group: "Vil du virkelig fjerne {{name}} fra denne meldingen?"
email: 'E-post'
username: 'Brukernavn'
last_seen: 'Sist sett'
@@ -682,6 +873,7 @@ nb_NO:
trust_level: 'Tillitsnivå'
search_hint: 'brukernavn, e-post eller IP-adresse'
create_account:
+ disclaimer: "Ved å registrere deg samtykker du til Personvernerklæringen og Bruksvilkårene."
title: "Opprett ny konto"
failed: "Noe gikk galt, kanskje denne e-postadressen allerede er registrert. Prøv lenke for glemt passord"
forgot_password:
@@ -728,6 +920,8 @@ nb_NO:
twitter:
title: "med Twitter"
message: "Autentiserer med Twitter (sørg for at du tillater pop-up vindu)"
+ instagram:
+ title: "med Instagram"
facebook:
title: "med Facebook"
message: "Autentiserer med Facebook (sørg for at du tillater pop-up vindu)"
@@ -737,6 +931,14 @@ nb_NO:
github:
title: "med GitHub"
message: "Autentiserer med GitHub (sørg for at du tillater pop-up vindu)"
+ emoji_set:
+ apple_international: "Apple/Internasjonalt"
+ google: "Google"
+ twitter: "Twitter"
+ emoji_one: "Emoji One"
+ win10: "Win10"
+ category_page_style:
+ categories_only: "Kun kategorier"
shortcut_modifier_key:
shift: 'Shift'
ctrl: 'Ctrl'
@@ -746,19 +948,23 @@ nb_NO:
more_emoji: "mer..."
options: "Alternativer"
whisper: "hvisker"
+ unlist: "skjult"
add_warning: "Dette er en offisiell advarsel."
+ toggle_unlisted: "Skjul eller gjør synlig"
posting_not_on_topic: "Du svarer på emnet \"{{title}}\", men for øyeblikket ser du på et annet emne."
saving_draft_tip: "lagrer..."
saved_draft_tip: "lagret"
saved_local_draft_tip: "lagret lokalt"
similar_topics: "Emnet ditt har likheter med..."
drafts_offline: "utkast offline"
+ cannot_see_mention:
+ category: "Du nevnte {{username}}, men de vil ikke ikke bli varslet fordi de ikke hara tilgang til denne kategorien. Du må legge dem til en gruppe som har tilgang til denne kategorien."
error:
title_missing: "Tittel er påkrevd"
- title_too_short: "Tittel må være minst {{min}} tegn"
+ title_too_short: "Tittel må være på minst {{min}} tegn"
title_too_long: "Tittel kan ikke være mer enn {{max}} tegn"
post_missing: "Innlegget kan ikke være tomt"
- post_length: "Innlegget må være minst {{min}} tegn"
+ post_length: "Innlegget må være på minst {{min}} tegn"
try_like: 'Har du prøvd knappen?'
category_missing: "Du må velge en kategori"
save_edit: "Lagre endring"
@@ -766,7 +972,7 @@ nb_NO:
reply_here: "Svar her"
reply: "Svar"
cancel: "Avbryt"
- create_topic: "Nytt Emne"
+ create_topic: "Opprett emne"
create_pm: "Melding"
title: "Eller trykk Ctrl+Enter"
users_placeholder: "Legg til en bruker"
@@ -789,10 +995,12 @@ nb_NO:
link_description: "beskriv lenken her"
link_dialog_title: "Sett inn hyperlenke"
link_optional_text: "valgfri tittel"
+ link_url_placeholder: "http://example.com"
quote_title: "Sitatramme"
quote_text: "Sitatramme"
code_title: "Kode Utsnitt"
code_text: "Skriv inn preformattert tekst med 4 mellomroms innrykk."
+ paste_code_text: "skriv inn eller kopier kode her"
upload_title: "Bilde"
upload_description: "beskriv bildet her"
olist_title: "Nummerert Liste"
@@ -805,7 +1013,10 @@ nb_NO:
toggler: "gjem eller vis redigeringspanelet"
modal_ok: "OK"
modal_cancel: "Avbryt"
- admin_options_title: "Valgfrie emne-instillinger for ansatte"
+ cant_send_pm: "Beklager, du kan ikke sende privat melding til %{username}."
+ yourself_confirm:
+ title: "Glemte du å legge til mottagere?"
+ admin_options_title: "Valgfrie emne-instillinger for stab"
auto_close:
label: "Tid for auto-lukking av emnet:"
error: "Vennligst skriv en gyldig verdi."
@@ -818,6 +1029,7 @@ nb_NO:
notifications:
title: "varsler om at ditt @navn blir nevnt, svar på dine innlegg, emner, meldinger, osv"
none: "Notifikasjoner er ikke tilgjengelig for øyeblikket."
+ empty: "Ingen varsler funnet."
more: "se gamle varsler"
total_flagged: "totalt rapporterte innlegg"
mentioned: "
{{username}} {{description}}
" @@ -840,8 +1052,10 @@ nb_NO: private_message: "Privat melding fra" linked: "Link til innlegget ditt" granted_badge: "Merke innvilget" + group_message_summary: "Meldinger i gruppeinnboks" popup: mentioned: '{{username}} nevnte deg i "{{topic}}" - {{site_title}}' + group_mentioned: '{{username}} nevnte deg i "{{topic}}" - {{site_title}}' quoted: '{{username}} siterte deg i "{{topic}}" - {{site_title}}' replied: '{{username}} svarte deg i "{{topic}}" - {{site_title}}' posted: '{{username}} skrev i "{{topic}}" - {{site_title}}' @@ -856,35 +1070,50 @@ nb_NO: local_tip: "velg bilder fra din enhet" hint: "(du kan også drag & drop inn i editoren for å laste dem opp)" uploading: "Laster opp bilde" - select_file: "Velg Fil" + select_file: "Velg fil" image_link: "lenken som bildet skal peke til" search: sort_by: "Sorter etter" relevance: "Relevanse" - latest_post: "Nyeste Innlegg" + latest_post: "Siste innlegg" most_viewed: "Mest Lest" most_liked: "Mest Likt" - select_all: "Velg Alle" + select_all: "Velg alle" clear_all: "Fjern Alle" + too_short: "Din søketekst er for kort." title: "søk etter emner, innlegg, brukere eller kategorier" no_results: "Ingen resultater funnet." no_more_results: "Ingen flere resultater funnet." - search_help: Søkehjelp searching: "Søker ..." post_format: "#{{post_number}} av {{username}}" context: user: "Søk innleggene av @{{username}}" topic: "Søk i dette emnet" private_messages: "Søk i meldinger" + advanced: + title: Avansert søk + filters: + label: Returner bare emner/innlegg som... + watching: Jeg følger + tracking: Jeg overvåker + post: + time: + before: før + after: etter hamburger_menu: "gå til en annen emneliste eller kategori" new_item: "ny" go_back: 'gå tilbake' - not_logged_in_user: 'brukerside med oppsummering av nylig aktivtet og preferanser.' + not_logged_in_user: 'brukerside med oppsummering av nåværende aktivtet og preferanser.' current_user: 'go til din brukerside' topics: + new_messages_marker: "siste besøk" bulk: + select_all: "Velg alle" + clear_all: "Fjern alle" reset_read: "Nullstill lest" - delete: "Slett Emne" + delete: "Slett emne" + dismiss_tooltip: "Avslå bare nye innlegg eller slutt å overvåke emner" + also_dismiss_topics: "Slutt å overvåke disse emnene slik at de aldri igjen vises til meg som ulest" dismiss_new: "Lest" toggle: "Veksle mellom massevelging av emner" actions: "Massehandlinger" @@ -901,25 +1130,26 @@ nb_NO: new: "Du har ingen nye emner å lese." read: "Du har ikke lest noen emner enda." posted: "Du har ikke postet i noen emner enda." - latest: "Det er ingen siste emner. Det er trist." + latest: "Det finnes ingen siste emner. Det var synd." hot: "Det er ingen populære emner." bookmarks: "Du har ingen bokmerkede emner." category: "Det er ingen {{category}} emner." top: "Det er ingen populære emner." search: "Det er ingen søkeresultater" + educate: + unread: '
Dine uleste emner vil vises her.
Som standard anses emner for å være ulest og vil vise ulest-tall 1 dersom du:
Eller dersom du uttrykkelig har satt emnet som overvåkes eller sett via varselkontrollen nederst i hvert emne.
Gå tilinnstillingene dine for å endre dette.
' bottom: - latest: "Det er ikke noen siste emner igjen å lese." - hot: "Det er ikke noen populære emner igjen å lese." - posted: "Det er ikke noen postede emner igjen å lese." - read: "Det er ikke noen leste emner igjen å lese." - new: "Det er ikke noen nye emner igjen å lese." - unread: "Det er ikke noen uleste emner igjen å lese." - category: "Det er ikke noen {{category}} emner igjen." + latest: "Det er ingen siste emner igjen å lese." + hot: "Det er ingen populære emner igjen å lese." + posted: "Det er ingen postede emner igjen å lese." + read: "Det er ingen leste emner igjen å lese." + new: "Det er ingen nye emner igjen å lese." + unread: "Det er ingen uleste emner igjen å lese." + category: "Det er ingen {{category}} emner igjen." top: "Det er ingen flere populære emner." bookmarks: "Det er ingen bokmerkede emner." search: "Det er ingen flere søkeresultater" topic: - filter_to: "{{post_count}} innlegg i dette emnet." create: 'Nytt emne' create_long: 'Opprett et nytt emne' private_message: 'Begynn en melding' @@ -975,29 +1205,30 @@ nb_NO: deleted: "Emnet har blitt slettet" auto_close_notice: "Dette emnet vil automatisk lukkes %{timeLeft}." auto_close_notice_based_on_last_post: "Dette emnet vil bli lukket %{duration} etter det siste innlegget." - auto_close_title: 'Auto-Lukk Innstillinger' + auto_close_title: 'Auto-lukk innstillinger' auto_close_save: "Lagre" auto_close_remove: "Ikke lukk dette emnet automatisk" progress: - title: emnefrangang + title: emneframgang go_top: "topp" go_bottom: "bunn" - go: "Gå" + go: "gå" jump_bottom: "Hopp til nyeste innlegg" jump_bottom_with_number: "hopp til innlegg %{post_number}" total: innlegg totalt current: gjeldende innlegg - position: "innlegg %{current} av %{total}" notifications: reasons: + mailing_list_mode: "Du har slått på e-postlistemodus, så du vil bli varslet på e-post om svar på dette emnet." + '3_10': 'Du vil motta varsler fordi du følger et stikkord for dette emnet' '3_6': 'Du vil motta varsler fordi du følger denne kategorien' '3_5': 'Du vil motta varsler fordi du startet å følge dette emnet automatisk.' '3_2': 'Du vil motta varsler fordi du følger dette emnet.' '3_1': 'Du vil motta varsler fordi du opprettet dette emnet.' '3': 'Du vil motta varsler fordi du følger dette emnet.' - '2_8': 'Du vil motta varsler fordi du følger denne kategorien.' + '2_8': 'Du vil motta varsler fordi du overvåker denne kategorien.' '2_4': 'Du vil motta varsler fordi du svarte på dette emnet.' - '2_2': 'Du vil motta varsler fordi du følger dette emnet.' + '2_2': 'Du vil motta varsler fordi du overvåker dette emnet.' '2': 'Du vil motta varsler fordi du read this topic.' '1_2': 'Du vil bli varslet om noen nevner ditt @navn eller svarer på ditt innlegg.' '1': 'Du vil bli varslet om noen nevner ditt @navn eller svarer på ditt innlegg.' @@ -1011,10 +1242,10 @@ nb_NO: title: "Følger" description: "Du vil bli varslet om hvert nye innlegg i dette emnet. Antall nye tilbakemeldinger vil også bli vist. " tracking_pm: - title: "Følger" + title: "Overvåker" description: "Antall nye tilbakemeldinger vil bli vist for denne meldingen. Du vil bli varslet om noen nevner ditt @name eller svarer på din melding. " tracking: - title: "Følger" + title: "Overvåker" description: "Antall nye svar vil bli vist for dette emnet. Du vil bli varslet om noen nevner ditt @name eller svarer på ditt innlegg.. " regular: title: "Normal" @@ -1023,30 +1254,30 @@ nb_NO: title: "Normal" description: "Du vil bli varslet om noen nevner ditt @navn eller svarer på ditt innlegg." muted_pm: - title: "Dempet" + title: "Ignorert" description: "Du vil ikke få varslinger om noe i denne meldingnen. " muted: - title: "Dempet" + title: "Ignorert" actions: recover: "Gjenopprett emne" - delete: "slett emne" - open: "Åpne Emne" - close: "Lukk Emne" - multi_select: "Velg Innlegg..." - auto_close: "Lukk Automatisk" + delete: "Slett emne" + open: "Åpne emne" + close: "Lukk emne" + multi_select: "Velg innlegg..." + auto_close: "Lukk automatisk" pin: "Feste emnet..." - unpin: "Løsgjør Emne" - unarchive: "Uarkiver Emne" - archive: "Arkiver Emne" - invisible: "Skjul Emnet" - visible: "Vist Emnet" - reset_read: "Tilbakestill Lesedata" + unpin: "Løsgjør emne" + unarchive: "Opphev arkivering av emne" + archive: "Arkiver emne" + invisible: "Skjul emnet" + visible: "Gjør synlig" + reset_read: "Tilbakestill lesedata" feature: - pin: "Fest Emnet" - unpin: "Løsgjør Emnet" - pin_globally: "Fest Emnet Globalt" + pin: "Fest emnet" + unpin: "Løsgjør emnet" + pin_globally: "Fest emnet globalt" make_banner: "Banneremne" - remove_banner: "Fjern Banneremne" + remove_banner: "Fjern banneremne" reply: title: 'Svar' help: 'begynn å skrive et svar til dette emnet' @@ -1056,6 +1287,9 @@ nb_NO: share: title: 'Del' help: 'del en lenke til dette emnet' + print: + title: 'Skriv ut' + help: 'Åpne en utskriftsvennlig utgave av dette emnet.' flag_topic: title: 'Rapporter' help: 'rapporter dette innlegget privat eller send et privat varsel om det' @@ -1064,36 +1298,36 @@ nb_NO: title: "Fremhev dette emnet" confirm_pin: "Du har allerede {{count}} låste emner. For mange låste emner kan være et problem for nye og anonyme brukere. Er du sikker på at du ønsker å låse et til emne i denne kategorien?" unpin: "Fjern dette emnet fra toppen av {{categoryLink}} kategorien." - pin_note: "Brukere kan låse opp emnet selv." + pin_note: "Brukere kan selv fjerne festet for dette emnet." confirm_pin_globally: "Du har allerede {{count}} globalt låste emner. For mange låste emner kan bli en byrde for nye og anonyme brukere. Er du sikker på at du vil låse et til emne globalt? " unpin_globally: "Fjern dette emnet fra toppen av alle emnelister. " - global_pin_note: "Brukere kan låse opp emner for dem selv. " + global_pin_note: "Brukere kan fjerne festet for emnet for seg selv" make_banner: "Gjør dette emnet til et banner som dukker opp på toppen av alle sider." remove_banner: "Fjern banneret som dukker opp på toppen av alle sider. " banner_note: "Brukere kan fjerne banneret ved å lukke det. Kun et emne kan være banner på en og samme tid. " inviting: "Inviterer..." invite_private: - title: 'Inviter til samtale' + title: 'Invitér til samtale' email_or_username: "Invitertes e-post eller brukernavn." email_or_username_placeholder: "e-postadresse eller brukernavn" - action: "Inviter" + action: "Invitér" success: "Vi har invitert denne brukeren til å delta i denne meldingen." error: "Beklager, det oppstod en feil ved å invitere den brukeren." group_name: "gruppenavn" controls: "Emnefunksjoner" invite_reply: - title: 'Inviter' + title: 'Invitér' username_placeholder: "brukernavn" action: 'Send Invitasjon' - help: 'Inviter andre til dette emnet via epost eller varsler' + help: 'Inviter andre til dette emnet via e-post eller varsler' to_forum: "Vi sender en kortfattet e-post som gjør det mulig for en venn å umiddelbart registreres ved å klikke på en lenke. Ingen innlogging er nødvendig." sso_enabled: "Oppgi brukernavnet til personen du ønsker å invitere til dette emnet." - to_topic_blank: "Oppgi brukernavnet eller epost-adressen til personen du ønsker å invitere til dette emnet." - to_topic_email: "Du har oppgitt en epostadresse. Vi vil sende invitasjonen som later vennen din umiddelbart svare på dette emnet." + to_topic_blank: "Oppgi brukernavnet eller e-post-adressen til personen du ønsker å invitere til dette emnet." + to_topic_email: "Du har oppgitt en e-postadresse. Vi vil sende invitasjonen som lar vennen din svare på dette emnet umiddelbart." to_topic_username: "Du har oppgitt et brukernavn. Vi sender et varsel med en link som inviterer dem til dette emnet." to_username: "Oppgi brukernavnet til personen du ønsker å invitere. Vi sender et varsel med en lenke som inviterer dem til dette emnet." email_placeholder: 'navn@example.com' - success_email: "Vi har sendt ut en invitasjon til {{emailOrUsername}}. Vi varsler deg når invitasjonen er godtatt. Sjekk invitiasjonsfanen på brukersiden din for å holde styr på invitasjonene dine." + success_email: "Vi har sendt ut en invitasjon til {{emailOrUsername}}. Vi varsler deg når invitasjonen er godtatt. Sjekk invitiasjonsfanen på brukersiden din for å beholde oversikten over invitasjonene dine." success_username: "Vi har invitert brukeren til å delta i dette emnet." error: "Beklager, vi kunne ikke invitere den brukeren. De har muligens allerede blitt invitert?" login_reply: 'Logg Inn for å svare' @@ -1103,9 +1337,9 @@ nb_NO: other: "{{count}} innlegg" cancel: "Fjern filter" split_topic: - title: "Del opp Emne" + title: "Del opp emne" action: "del opp emne" - topic_name: "Nytt Emnenavn:" + topic_name: "Nytt emnenavn:" error: "Det oppsto en feil ved deling av dette emnet." instructions: one: "Du er i ferd med å lage et nytt emne basert på innlegget du har valgt.." @@ -1117,6 +1351,9 @@ nb_NO: instructions: one: "Vennligst velg det emnet du vil flytte det innlegget til." other: "Vennligst velg emnet du vil flytte de {{count}} innleggene til." + merge_posts: + title: "Slå sammen valgte innlegg" + action: "slå sammen valgte innlegg" change_owner: title: "Endre innleggenes eier" action: "Endre eierskap" @@ -1139,7 +1376,7 @@ nb_NO: one: Du har valgt 1 innlegg. other: Du har valgt {{count}} innlegg. post: - quote_reply: "siter svar" + quote_reply: "Sitat" edit: "Redigerer {{link}} {{replyAvatar}} {{username}}" edit_reason: "Begrunnelse:" post_number: "post {{number}}" @@ -1156,11 +1393,10 @@ nb_NO: gap: one: "vis 1 skjult svar" other: "vis {{count}} skjulte svar" - more_links: "{{count}} flere..." unread: "Innlegget er ulest" has_replies: - one: "{{count}} Svar" - other: "{{count}} Svar" + one: "{{count}} svar" + other: "{{count}} svar" has_likes: one: "{{count}} Like" other: "{{count}} liker" @@ -1176,6 +1412,7 @@ nb_NO: edit: "Beklager, det oppstod en feil ved redigeringen av ditt innlegg. Vennligst prøv igjen." upload: "Sorry, there was an error uploading that file. Please try again." too_many_uploads: "Beklager, du kan bare laste opp ett bilde om gangen." + too_many_dragged_and_dropped_files: "Beklager, du kan bare laste opp 10 filer om gangen." upload_not_authorized: "Beklager, filen du prøver å laste opp er ikke godkjent (godkjente filtyper: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Beklager, nye brukere kan ikke laste opp bilder" attachment_upload_not_allowed_for_new_user: "Beklager, nye brukere kan ikke laste opp vedlegg." @@ -1217,14 +1454,6 @@ nb_NO: defer_flags: one: "Utsett rapportering" other: "Utsett rapporteringer" - it_too: - off_topic: "Rapporter det også" - spam: "Rapporter det også" - inappropriate: "Rapporter det også" - custom_flag: "Rapporter det også" - bookmark: "Bokmerk det også" - like: "Lik det også" - vote: "Stem for det også" undo: off_topic: "Angre rapportering" spam: "Angre rapportering" @@ -1304,12 +1533,13 @@ nb_NO: other: "Er du sikker på at du vil slette alle de innleggene?" revisions: controls: - first: "Første revisjon" - previous: "Forrige revisjon" - next: "Neste revisjon" - last: "Siste revisjon" - hide: "Skjul revisjon" - show: "Vis revisjon" + first: "Første versjon" + previous: "Forrige versjon" + next: "Neste versjon" + last: "Siste versjon" + hide: "Skjul versjon" + show: "Vis versjon" + revert: "Gå tilbake til denne versjonen" comparing_previous_to_current_out_of_total: "{{previous}} {{current}} / {{total}}" displays: inline: @@ -1332,12 +1562,14 @@ nb_NO: general: 'Generellt' settings: 'Innstillinger' topic_template: "Emnemal" + tags_placeholder: "(Valgfritt) Liste over tillatte stikkord" + tag_groups_placeholder: "(Valgfritt) Liste over tillatte stikkordgrupper" delete: 'Slett kategori' create: 'Ny Kategori' create_long: 'Opprett en ny kategori' save: 'Lagre Kategori' slug: 'Kategorinavn i URL' - slug_placeholder: '(valgfritt) sammensatte ord for bruk i URL' + slug_placeholder: '(valgfritt) Sammensatte ord for bruk i URL' creation_error: Det oppstod en feil ved å lage denne kategorien. save_error: Det oppstod en feil ved lagrinen av denne kategorien. name: "Kategorinavn" @@ -1371,18 +1603,22 @@ nb_NO: position: "posisjon" default_position: "Standard posisjon" position_disabled: "Kategorier vil bli vist i henhold til aktivitet. For å styre rekkefølgen av kategorier i listen" - position_disabled_click: 'kan du aktivere "faste kategoriposisjoner" i innstillinger.' + position_disabled_click: 'aktivere "faste kategoriposisjoner"-innstillingen.' parent: "Foreldrekategori" notifications: watching: title: "Følger" + description: "Du vil automatisk følge alle emnene i disse kategoriene. Du vil bli varslet om hvert nye innlegg i hvert emne, og antall nye svar vil bli vist." + watching_first_post: + title: "Følger første innlegg" tracking: - title: "Sporing" + title: "Overvåkning" + description: "Du vil automatisk overvåke alle emner i disse kategoriene. Du vil bli varslet dersom noen nevner @navnet ditt eller svarer deg, og antallet nye svar vil bli vist." regular: title: "Normal" description: "Du vil bli varslet om noen nevner ditt @navn eller svarer deg." muted: - title: "Dempet" + title: "Ignorert" flagging: title: 'Takk for at du hjelper å holde forumet ryddig!' action: 'Rapporter innlegg' @@ -1390,7 +1626,6 @@ nb_NO: notify_action: 'Melding' official_warning: 'Offisiell Advarsel' delete_spammer: "Slett spammer" - delete_confirm: "Du er i ferd med å slette %{posts} innlegg og %{topics} emner av denne brukeren, slette brukerens konto, blokkere registrering fra brukerens IP-adresse %{ip_address}, og legge brukerens e-postadresse %{email} i en permanent svarteliste. Er du sikker på at denne brukeren virkelig er en spammer?" yes_delete_spammer: "Ja, slett spammer" ip_address_missing: "(N/A)" hidden_email_address: "(skjult)" @@ -1403,10 +1638,6 @@ nb_NO: spam: "Det er reklame" custom_placeholder_notify_user: "Vær spesifikk, konstruktiv og snill." custom_placeholder_notify_moderators: "La oss vite nøyaktig hva problemet er, og del relevante lenker og eksempler hvorvidt det er mulig." - custom_message: - at_least: "skriv minst {{n}} bokstaver" - more: "{{n}} igjen..." - left: "{{n}} gjenstående" flagging_topic: title: "Takk for at du hjelper med å vedlikeholde god skikk i samfundet vårt!" action: "Rapporter emne" @@ -1428,17 +1659,16 @@ nb_NO: archived: help: "dette emnet er arkivert; det er fryst og kan ikke bli aktivert" unpinned: - title: "Løsgjort" - help: "Dette emnet er ikke lenger fastsatt, det vil vises i vanlig rekkefølge" + title: "Feste fjernet" + help: "Dette emnet er ikke lenger festet, det vil vises i vanlig rekkefølge" pinned_globally: title: "Globalt fastsatt" pinned: title: "Fastsatt" help: "Dette emnet er fastsatt for deg; det vil vises i toppen av sin kategori" invisible: - help: "Dette emnet er ikke listet; det vil ikke vises i emnelister, og kan kun leses via en direktelenke" + help: "Dette emnet er ikke synlig; det vil ikke vises i emnelister, og kan kun leses via en direktelenke" posts: "Innlegg" - posts_lowercase: "innlegg" posts_long: "{{number}} innlegg i dette emnet" posts_likes_MF: | This topic has {count, plural, one {1 reply} other {# replies}} {ratio, select, @@ -1493,11 +1723,11 @@ nb_NO: title_in: "Kategori - {{categoryName}}" help: "alle emner sortert etter kategori" unread: - title: "Ulest" + title: "Uleste" title_with_count: one: "Ulest (1)" other: "Ulest ({{count}})" - help: "emner du for øyeblikket følger eller sporer med uleste innlegg" + help: "emner med uleste innlegg du for øyeblikket følger eller overvåker" lower_title_with_count: one: "1 ulest" other: "{{count}} uleste" @@ -1506,7 +1736,7 @@ nb_NO: one: "1 ny" other: "{{count}} nye" lower_title: "ny" - title: "Ny" + title: "Nye" title_with_count: one: "Nye (1)" other: "Nye ({{count}})" @@ -1550,6 +1780,51 @@ nb_NO: full: "Opprett / Svar / Se" create_post: "Svar / Se" readonly: "Se" + lightbox: + download: "last ned" + keyboard_shortcuts_help: + title: 'Tastatursnarveier' + jump_to: + title: 'Hopp til' + home: 'g, h Hjem' + latest: 'g, l Siste' + new: 'g, n Nye' + unread: 'g, u Uleste' + categories: 'g, c Kategorier' + top: 'g, t Topp' + bookmarks: 'g, b Bokmerker' + profile: 'g, p Profil' + messages: 'g, m Meldinger' + navigation: + title: 'Navigasjon' + jump: '# Gå til innlegg #' + back: 'u Tilbake' + open: 'o or Enter Åpne valgt emne' + application: + notifications: 'n Åpne varsler' + search: '/ Søk' + help: '? Åpne tastaturhjelp' + actions: + pin_unpin_topic: 'shift+p Fest/fjern feste for emne' + mark_muted: 'm, m Ignorer emnet' + mark_tracking: 'm, t Overvåk emne' + mark_watching: 'm, w Følg emne' + badges: + title: Merker + tagging: + notifications: + watching: + title: "Følger" + description: "Du vil automatisk følge alle emnene med dette stikkordet. Du vil bli varslet om alle nye innlegg og emner; i tillegg vil antallet uleste og nye innlegg vises ved siden av emnet." + watching_first_post: + title: "Følger første innlegg" + tracking: + title: "Overvåkning" + description: "Du vil automatisk overvåke alle emner med dette stikkordet. Antallet uleste og nye innlegg vil vises ved siden av emnet." + regular: + title: "Aktivt medlem" + muted: + title: "Ignorert" admin_js: type_to_filter: "skriv for å filtrere..." admin: @@ -1567,7 +1842,7 @@ nb_NO: stale_data: "Det har ikke vært sjekket for oppdateringer på en stund. Sjekk at sidekiq kjører." version_check_pending: "Ser ut som om du oppgraderte nylig. Fantastisk!" installed_version: "Installert" - latest_version: "Seneste" + latest_version: "Siste" problems_found: "Det har oppstått noen problemer med din installasjon av Discourse:" last_checked: "Sist sjekket" refresh_problems: "Last inn siden på nytt" @@ -1675,25 +1950,22 @@ nb_NO: refresh: "Last inn på nytt" new: "Ny" selector_placeholder: "oppgi brukernavn" - name_placeholder: "Gruppenavn, ingen mellomrom, samme regler som for brukernavn" about: "Rediger gruppemedlemskap og navn her." group_members: "Gruppemedlemmer" delete: "Slett" delete_confirm: "Slette denne grupper?" delete_failed: "Unable to delete group. If this is an automatic group, it cannot be destroyed." - delete_member_confirm: "Fjern '%{username}' fra '%{group}' gruppen?" - name: "Navn" add: "Legg til" add_members: "Legg til medlemmer" custom: "Egendefinert" automatic: "Automatisk" - automatic_membership_email_domains: "Brukere som registererer seg med et epostdomene som matcher en i denne listen vil automatisk bli lagt til i denne gruppen." - automatic_membership_retroactive: "Benytt samme epostdomeneregel for å legge til eksisterende brukere" + automatic_membership_email_domains: "Brukere som registererer seg med et e-postdomene som er det samme som et i denne listen, vil automatisk bli lagt til i denne gruppen." + automatic_membership_retroactive: "Benytt samme e-postdomeneregel for å legge til eksisterende brukere" default_title: "Standardtittel for alle brukere i denne gruppen" primary_group: "Sett som primærgruppe automatisk" group_owners: Eiere add_owners: Legg til eiere - incoming_email_placeholder: "oppgi epostadresse" + incoming_email_placeholder: "oppgi e-postadresse" api: generate_master: "Generer Master API-nøkkel" none: "Det er ingen aktive API-nøkler akkurat nå." @@ -1708,6 +1980,76 @@ nb_NO: info_html: "Din API nøkkel vil tillate deg å lage og oppdatere emner ved å bruke JSON samteler." all_users: "Alle brukere" note_html: "Hold denne nøkkelen hemmelig. Alle brukere som har den vil kunne opprette vilkårlige innlegg som en hvilken som helst bruker. " + web_hooks: + title: "Webhooker" + none: "Det finnes ingen webhooker for tiden." + instruction: "Webhooker lar Discourse sende meldinger til eksterne tjenester når spesifiserte situasjoner oppstår på nettstedet. Når en webhook utløses, sendes en POST-forespørsel til URL-ene du angir." + detailed_instruction: "En POST-forespørsel sendes til den angitte URL-en når den valgte hendelsen skjer." + new: "Ny webhook" + create: "Opprett" + save: "Lagre" + destroy: "Slett" + description: "Beskrivelse" + controls: "Kontroller" + go_back: "Tilbake til liste" + payload_url: "Payload URL" + payload_url_placeholder: "https://example.com/postreceive" + warn_local_payload_url: "Det ser ut som du prøver å sende webhooken til en lokal URL. Hendelser som sendes til lokale adresser kan gi sideeffekter eller føre til uventet oppførsel. Fortsette?" + secret_invalid: "Delt hemmelighet kan ikke inneholde blanke tegn." + secret_too_short: "Delt hemmelighet må være minst 12 tegn." + secret_placeholder: "En valgfri streng, brukt til å generere signatur" + event_type_missing: "Du må sette opp minst en type hendelse." + content_type: "Content Type" + secret: "Delt hemmelighet" + event_chooser: "Hvilke hendelser skal utløse denne webhooken?" + wildcard_event: "Send meg alt" + individual_event: "Velg hendelser enkeltvis." + verify_certificate: "Kontroller TLSs-sertifikat til payload url" + active: "Aktiv" + active_notice: "Vi sender hendelsesdetaljer når det skjer." + categories_filter_instructions: "Relevante webhooker vil bare bli utløst hvis hendelsene er relatert til valgte kategorier. La være blank for å utløse webhooker for alle kategorier." + categories_filter: "Utløste kategorier" + groups_filter_instructions: "Relevante webhooker vil bare bli utløst hvis hendelsene er relatert til valgte grupper. La være blank for å utløse webhooker for alle grupper." + groups_filter: "Utløse grupper" + delete_confirm: "Slette denne webhooken?" + topic_event: + name: "Emnehendelse" + details: "Når det et nytt, revidert, endret eller slettet emne." + post_event: + name: "Innleggshendelse" + details: "Når det er et nytt, redigert, slettet eller gjenopprettet innlegg." + user_event: + name: "Brukerhendelse" + details: "Når en bruker blir opprettet, godkjent eller oppdatert." + delivery_status: + title: "Sendingsstatus" + inactive: "Inaktiv" + failed: "Feilet" + successful: "Vellykket" + events: + none: "Det er ingen relaterte hendelser." + redeliver: "Send på nytt" + incoming: + one: "Det er en ny hendelse." + other: "Det er {{count}} nye hendelser." + completed_in: + one: "Ferdig på 1 sekund." + other: "Ferdig på {{count}} sekunder." + request: "Forespørsel" + response: "Svar" + redeliver_confirm: "Er du sikker på at du vil sende samme payload på nytt?" + headers: "Headere" + payload: "Payload" + body: "Body" + go_list: "Gå til liste" + go_details: "Rediger webhook" + go_events: "Gå til hendelser" + ping: "Ping" + status: "Statuskode" + event_id: "ID" + timestamp: "Opprettet" + completion: "Gjennomføringstid" + actions: "Handlinger" plugins: title: "Utvidelser" installed: "Installerte Utvidelser" @@ -1763,15 +2105,13 @@ nb_NO: label: "Gjenopprett" title: "Gjenopprett databasen til en tidligere fungerende tilstand" export_csv: - user_archive_confirm: "Er du sikker på at du vil laste ned innleggene dine?" success: "Eksportering iverksatt. Du vil bli varslet med en melding når prosessen er fullført." failed: "Eksporteringen feilet. Venligst undersøk loggene." - rate_limit_error: "Innlegg kan lastes ned en gang om dagen, vennligst prøv igjen i morgen." button_text: "Eksporter" button_title: user: "Eksporter full medlemsliste i CSV format." staff_action: "Eksporter full handligslogg i CSV format." - screened_email: "Eksporter komplett liste over filtrerte epostadresser i CSV format." + screened_email: "Eksporter komplett liste over filtrerte e-postadresser i CSV format." screened_ip: "Eksporter komplett liste over filtrerte IP-addresser i CSV format." screened_url: "Eksporter komplett liste over filtrerte URL'er i CSV format." export_json: @@ -1859,7 +2199,7 @@ nb_NO: name: 'liker' description: "Fargen til Liker-knappen." email: - title: "Eposter" + title: "E-poster" settings: "Instillinger" preview_digest: "Forhåndsvis Oppsummering" sending_test: "Sender e-post for testing" @@ -1958,8 +2298,8 @@ nb_NO: actions: allow: "Tillat" screened_urls: - title: "Kontrollerte URLs" - description: "URLer listet her ble brukt i innlegg av brukere som har blitt identifisert som spammere." + title: "Kontrollerte URL-er" + description: "Disse URLene ble brukt i innlegg av brukere som har blitt identifisert som spammere." url: "URL" domain: "Domene" screened_ips: @@ -2041,7 +2381,6 @@ nb_NO: suspend_reason: "Begrunnelse" suspended_by: "Bannlyst av" delete_all_posts: "Slett alle innlegg" - delete_all_posts_confirm: "Du skal til å slette %{posts} innlegg og %{topics} emner. Er du sikker?" suspend: "Bannlyst" unsuspend: "Gjeninnsett\"" suspended: "Bannlyst?" @@ -2200,7 +2539,7 @@ nb_NO: required: 'Påkrevd' basic: 'Grunnleggende oppsett' users: 'Brukere' - posting: 'Posting' + posting: 'Innlegg' email: 'E-post' files: 'Filer' trust: 'Tillitsnivå' @@ -2216,6 +2555,8 @@ nb_NO: backups: "Sikkerhetskopier" login: "Login" plugins: "Utvidelser" + user_preferences: "Brukerinnstillinger" + search: "Søk" badges: title: Merker new_badge: Nytt merke @@ -2300,3 +2641,9 @@ nb_NO: label: "Ny:" add: "Legg til" filter: "Søk (URL eller ekstern URL)" + wizard_js: + wizard: + done: "Ferdig" + back: "Forrige" + next: "Neste" + step: "%{current} av %{total}" diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml index c7ef5ba7ca9..0b0c70421e7 100644 --- a/config/locales/client.nl.yml +++ b/config/locales/client.nl.yml @@ -48,9 +48,6 @@ nl: x_seconds: one: "1s" other: "%{count}s" - less_than_x_minutes: - one: "< 1m" - other: "< %{count}m" x_minutes: one: "1m" other: "%{count}m" @@ -139,6 +136,7 @@ nl: enabled: 'zichtbaar %{when}' disabled: 'niet zichtbaar %{when}' topic_admin_menu: "Adminacties voor topic" + wizard_required: "Het is tijd om je forum te configureren! Start de Setup Wizard!" emails_are_disabled: "Alle uitgaande e-mails zijn uitgeschakeld door een beheerder. Geen enkele vorm van e-mail notificatie wordt verstuurd." bootstrap_mode_enabled: "Om het lanceren van een website makkelijker te maken, zit je nu in bootstrapmodus. Alle nieuwe gebruikers krijgen trustlevel 1 en zullen dagelijkse e-mailupdates krijgen. Dit wordt automatisch uitgeschakeld wanneer het totale gebruikersaantal hoger dan %{min_users} gebruikers wordt." bootstrap_mode_disabled: "Bootstrap modus zal uitgeschakeld worden in de komende 24 uur." @@ -324,17 +322,10 @@ nl: one: "1 lid" other: "%{count} leden" groups: - empty: - posts: "Er is geen enkel bericht door leden van deze groep." - members: "Er zijn geen leden in deze groep." - mentions: "Deze groep wordt niet benoemd." - messages: "Er zijn geen berichten voor deze groep." - topics: "Er is geen topic gemaakt door de leden van deze groep." add: "Voeg toe" selector_placeholder: "Voeg leden toe" owner: "eigenaar" visible: "Groep is zichtbaar voor alle gebruikers" - index: "Groepen" title: one: "groep" other: "groepen" @@ -356,10 +347,10 @@ nl: notifications: watching: title: "In de gaten houden" - description: "Je krijgt een notificatie bij elke nieuwe post of bericht, en het aantal nieuwe reacties wordt weergeven." + description: "Je krijgt een notificatie bij elk nieuw bericht, en het aantal nieuwe reacties wordt weergeven." watching_first_post: title: "Eerste bericht in de gaten houden" - description: "Je krijgt alleen een notificatie van de eerste post in elk nieuw topic in deze groep." + description: "Je krijgt alleen een notificatie van het eerste bericht in elk nieuw topic in deze groep." tracking: title: "Volgen" description: "Je krijgt een notificatie wanneer iemand jouw @name noemt of reageert, en het aantal nieuwe reacties wordt weergeven." @@ -402,14 +393,12 @@ nl: latest_by: "Laatste door" toggle_ordering: "schakel sorteermethode" subcategories: "Subcategorieën" - topic_stats: "Het aantal nieuwe topics." + topic_sentence: + one: "1 topic" + other: "%{count} topics" topic_stat_sentence: one: "%{count} nieuw topic in de afgelopen %{unit}." other: "%{count} nieuwe topics in de afgelopen %{unit}." - post_stats: "Het aantal nieuwe berichten." - post_stat_sentence: - one: "%{count} nieuw bericht in de afgelopen %{unit}." - other: "%{count} nieuwe berichten in de afgelopen %{unit}." ip_lookup: title: IP-adres lookup hostname: Hostname @@ -432,7 +421,11 @@ nl: profile: "Profiel" mute: "Negeer" edit: "Wijzig voorkeuren" - download_archive: "Download mijn berichten" + download_archive: + button_text: "Download mijn berichten" + confirm: "Weet je zeker dat je je berichten wilt downloaden?" + success: "Downloaden is gestart, je krijgt een bericht als het proces is afgerond." + rate_limit_error: "Berichten kunnen slechts één keer per dag gedownload worden, probeer het morgen nog eens." new_private_message: "Nieuw bericht" private_message: "Bericht" private_messages: "Berichten" @@ -456,6 +449,7 @@ nl: each_browser_note: "Let op: Je moet deze optie instellen voor elke browser die je gebruikt." dismiss_notifications: "Markeer alles als gelezen" dismiss_notifications_tooltip: "Markeer alle ongelezen berichten als gelezen" + first_notification: "Je eerste notificatie! Selecteer het om te beginnen." disable_jump_reply: "Niet naar je nieuwe bericht gaan na reageren" dynamic_favicon: "Laat aantal nieuwe / bijgewerkte topics zien in favicon" external_links_in_new_tab: "Open alle externe links in een nieuw tabblad" @@ -478,6 +472,7 @@ nl: Genegeerde topics en categorieën zitten niet in deze e-mails. daily: "Verzend dagelijkse updates" individual: "Verstuur een e-mail voor elk nieuw bericht" + individual_no_echo: "Stuur een e-mail voor elk nieuw bericht behalve die van mijzelf." many_per_day: "Stuur mij een e-mail voor elk nieuw bericht (ongeveer {{dailyEmailEstimate}} per dag)" few_per_day: "Stuur mij een e-mail voor elk nieuw bericht (ongeveer 2 per dag)" tag_settings: "Tags" @@ -509,6 +504,10 @@ nl: muted_topics_link: "Toon genegeerde topics" watched_topics_link: "Toon in de gaten gehouden topics" automatically_unpin_topics: "Topics automatisch lospinnen als ik het laatste bericht bereik." + apps: "Apps" + revoke_access: "Toegang Intrekken" + undo_revoke_access: "Toegang Intrekken Ongedaan Maken" + api_approved: "Goedgekeurd:" staff_counters: flags_given: "behulpzame markeringen" flagged_posts: "gemarkeerde berichten" @@ -597,6 +596,7 @@ nl: title: "Interfacetaal" instructions: "De taal waarin het forum wordt getoond. Deze verandert als je de pagina herlaadt." default: "(standaard)" + any: "elke" password_confirmation: title: "Nogmaals het wachtwoord" last_posted: "Laatste bericht" @@ -654,6 +654,7 @@ nl: after_4_minutes: "na 4 minuten" after_5_minutes: "na 5 minuten" after_10_minutes: "na 10 minuten" + notification_level_when_replying: "Als ik een bericht in een topic plaats , zet dat topic op" invited: search: "Typ om uitnodigingen te zoeken..." title: "Uitnodigingen" @@ -684,13 +685,12 @@ nl: account_age_days: "leeftijd van account in dagen" create: "Stuur een uitnodiging" generate_link: "Kopieer uitnodigingslink" - generated_link_message: '
Uitnodigingslink succesvol aangemaakt!
Uitnodigingslink is alleen geldig voor dit e-mailadres: %{invitedEmail}
'
+ link_generated: "Uitnodigingslink is succesvol aangemaakt!"
+ valid_for: "De uitnodigingslink is alleen geldig voor dit e-mailadres: %{email}"
bulk_invite:
- none: "Je hebt nog niemand uitgenodigd. Je kan individueel uitnodigen of een groep mensen tegelijk door een groepsuitnodiging-bestand te uploaden"
+ none: "Je hebt nog niemand hier uitgenodigd. Je kunt individueel uitnodigen, of een groep mensen tegelijk uitnodigen door een CSV-bestand te uploaden."
text: "Groepsuitnodiging via bestand"
- uploading: "Uploaden..."
success: "Het uploaden van het bestand is gelukt, je krijgt een notificatie via een bericht als het proces afgerond is."
- error: "Het uploaden van '{{filename}}' is niet gelukt: {{message}}"
password:
title: "Wachtwoord"
too_short: "Je wachtwoord is te kort."
@@ -788,12 +788,14 @@ nl:
too_few_topics_notice: "Laten we de discussie starten! Er zijn al %{currentTopics} / %{requiredTopics} topics. Nieuwe bezoekers hebben conversaties nodig om te lezen en reageren."
too_few_posts_notice: "Laten we de discussie starten!. Er zijn op dit moment %{currentPosts} / %{requiredPosts} berichten. Nieuwe bezoekers hebben conversaties nodig om te lezen en reageren."
logs_error_rate_notice:
- reached: "[%{relativeAge}] Huidige waarde van %{rate} heeft de limiet van %{siteSettingRate} bereikt, zoals ingesteld in de site-instellingen."
- exceeded: "[%{relativeAge}] Huidige waarde van %{rate} heeft de limiet van %{siteSettingRate} overschreden, zoals ingesteld in de site-instellingen."
+ reached: "%{relativeAge} – %{rate} heeft site-instelling limiet van %{siteSettingRate} bereikt."
+ exceeded: "%{relativeAge} – %{rate} heeft site-instelling limiet van %{siteSettingRate} overschreden."
rate:
one: "1 fout/%{duration}"
other: "%{count} fouten/%{duration}"
learn_more: "leer meer..."
+ all_time: 'totaal'
+ all_time_desc: 'aantal aangemaakte topics'
year: 'jaar'
year_desc: 'topics die in de afgelopen 365 dagen gemaakt zijn'
month: 'maand'
@@ -815,7 +817,7 @@ nl:
hide_forever: "nee, dank je"
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, wordt daarin bijgehouden wat je gelezen hebt, zodat je direct door kan lezen vanaf waar je gestopt bent. Je kan op de site en via e-mail notificaties krijgen wanneer nieuwe posts gemaakt zijn, en je kan ook nog posts liken. :heartbeat:"
+ value_prop: "Wanneer je een account aangemaakt hebt, wordt daarin bijgehouden wat je gelezen hebt, zodat je direct door kan lezen vanaf waar je gestopt bent. Je kan op de site en via e-mail notificaties krijgen wanneer nieuwe berichten geplaatst zijn, en je kan ook nog berichten liken. :heartbeat:"
summary:
enabled_description: "Je leest een samenvatting van dit topic: alleen de meeste interessante berichten zoals bepaald door de community. "
description: "Er zijn {{replyCount}} reacties."
@@ -904,6 +906,10 @@ nl:
twitter: "Twitter"
emoji_one: "Emoji One"
win10: "Win10"
+ category_page_style:
+ categories_only: "Alleen categorieën"
+ categories_with_featured_topics: "Categorieën met aanbevolen topics"
+ categories_and_latest_topics: "Categorieën en recente topics"
shortcut_modifier_key:
shift: 'Shift'
ctrl: 'Ctrl'
@@ -913,16 +919,23 @@ nl:
more_emoji: "meer..."
options: "Opties"
whisper: "Fluister"
+ unlist: "onzichtbaar"
add_warning: "Dit is een officiële waarschuwing."
toggle_whisper: "Fluistermode in- of uitschakelen"
+ toggle_unlisted: "Onzichtbaar in- of uitschakelen"
posting_not_on_topic: "In welke topic wil je je antwoord plaatsen?"
saving_draft_tip: "opslaan..."
saved_draft_tip: "opgeslagen"
saved_local_draft_tip: "lokaal opgeslagen"
similar_topics: "Jouw topic lijkt op..."
drafts_offline: "concepten offline"
- group_mentioned: "Door het noemen van {{group}}, sta je op het punt om {{count}} mensen op de hoogte te brengen - weet je dit zeker?"
- duplicate_link: "Het ziet er naar uit dat je link naar {{domain}} al genoemd is in deze topic door @{{username}} in een bericht {{ago}} – weet je zeker dat je dit opnieuw wilt posten?"
+ group_mentioned:
+ one: "Door het noemen van de groep {{group}}, sta je op het punt om 1 persoon op de hoogte te brengen – weet je dit zeker?"
+ other: "Door het noemen van de groep {{group}}, sta je op het punt om {{count}} personen op de hoogte te brengen – weet je dit zeker?"
+ cannot_see_mention:
+ category: "Je hebt {{username}} genoemd, maar het lid zal geen notificatie krijgen omdat het geen toegang heeft tot deze categorie. Je zult {{username}} moeten toevoegen aan een groep die toegang heeft tot deze categorie."
+ private: "Je hebt {{username}} genoemd, maar het lid zal geen notificatie krijgen omdat het dit persoonlijke bericht niet kan zien. Je zult {{username}} moeten uitnodigen voor dit PB."
+ duplicate_link: "Het ziet er naar uit dat je link naar {{domain}} al genoemd is in deze topic door @{{username}} in een bericht {{ago}} – weet je zeker dat je dit opnieuw wilt plaatsen?"
error:
title_missing: "Titel is verplicht"
title_too_short: "Titel moet uit minstens {{min}} tekens bestaan"
@@ -943,6 +956,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)"
+ topic_featured_link_placeholder: "Plaats gegeven link met titel."
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"
@@ -952,8 +966,10 @@ nl:
show_preview: 'toon voorbeeld »'
hide_preview: '« verberg voorbeeld'
quote_post_title: "Citeer hele bericht"
+ bold_label: "B"
bold_title: "Vet"
bold_text: "Vetgedrukte tekst"
+ italic_label: "I"
italic_title: "Cursief"
italic_text: "Cursieve tekst"
link_title: "Weblink"
@@ -971,6 +987,7 @@ nl:
olist_title: "Genummerde lijst"
ulist_title: "Lijst met bullets"
list_item: "Lijstonderdeel"
+ heading_label: "H"
heading_title: "Kop"
heading_text: "Kop"
hr_title: "Horizontale lijn"
@@ -979,6 +996,9 @@ nl:
modal_ok: "OK"
modal_cancel: "Annuleer"
cant_send_pm: "Sorry, je kan geen bericht sturen naar %{username}."
+ yourself_confirm:
+ title: "Ben je vergeten om ontvangers toe te voegen?"
+ body: "Het bericht wordt nu alleen naar jezelf verzonden!"
admin_options_title: "Optionele stafinstellingen voor deze topic"
auto_close:
label: "Tijd waarna topic automatisch wordt gesloten:"
@@ -1062,13 +1082,13 @@ nl:
most_liked: "Meest geliked"
select_all: "Alles selecteren"
clear_all: "Wis Alles"
+ too_short: "Je zoekterm is te kort."
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."
- search_help: Zoek in help
searching: "Zoeken..."
post_format: "#{{post_number}} door {{username}}"
context:
@@ -1076,13 +1096,54 @@ nl:
category: "Doorzoek de #{{category}} categorie"
topic: "Zoek in deze topic"
private_messages: "Zoek berichten"
+ advanced:
+ title: Uitgebreid Zoeken
+ posted_by:
+ label: Gepost door
+ in_category:
+ label: In Categorie
+ in_group:
+ label: In Groep
+ with_badge:
+ label: Meld Badge
+ with_tags:
+ label: Met Tags
+ filters:
+ label: Alleen topics/posts vinden...
+ likes: die ik geliked heb
+ posted: waar ik in gepost heb
+ watching: die ik watch
+ tracking: die ik volg
+ private: die in mijn berichten staan
+ bookmarks: die ik opgeslagen heb als favoriet
+ first: die het eerste bericht zijn
+ pinned: die gepind zijn
+ unpinned: die niet gepind zijn
+ wiki: die een wiki zijn
+ statuses:
+ label: Waar onderwerpen
+ open: open zijn
+ closed: gesloten zijn
+ archived: gearchiveerd zijn
+ noreplies: geen reacties hebben
+ single_user: een enkele gebruiker bevatten
+ post:
+ count:
+ label: Minimaal Bericht Aantal
+ time:
+ label: Geplaatst
+ before: voor
+ after: na
hamburger_menu: "ga naar een andere topiclijst of categorie"
new_item: "nieuw"
go_back: 'ga terug'
not_logged_in_user: 'gebruikerspagina met samenvatting van huidige activiteit en voorkeuren'
current_user: 'ga naar je gebruikerspagina'
topics:
+ new_messages_marker: "laatste bezoek"
bulk:
+ select_all: "Alles selecteren"
+ clear_all: "Alles wissen"
unlist_topics: "Topics van lijst halen"
reset_read: "markeer als ongelezen"
delete: "Verwijder topics"
@@ -1134,7 +1195,9 @@ nl:
unsubscribe:
stop_notifications: "Je zal nu minder notificaties ontvangen voor {{title}}"
change_notification_state: "Je huidige notificatiestatus is"
- filter_to: "{{post_count}} berichten in topic"
+ filter_to:
+ one: "1 bericht in topic"
+ other: "{{count}} berichten in topic"
create: 'Nieuw topic'
create_long: 'Maak een nieuw topic'
private_message: 'Stuur een bericht'
@@ -1194,11 +1257,12 @@ nl:
auto_close_title: 'Instellingen voor automatisch sluiten'
auto_close_save: "Opslaan"
auto_close_remove: "Sluit deze topic niet automatisch"
- auto_close_immediate: "De laatste post in deze topic is al %{hours} uur oud, dus deze topic wordt meteen gesloten."
+ auto_close_immediate:
+ one: "Het laatste bericht in deze topic is al 1 uur oud, dus de topic zal meteen gesloten worden."
+ other: "Het laatste bericht in deze topic is al %{count} uur oud, dus de topic zal meteen gesloten worden."
timeline:
back: "Terug"
back_description: "Keer terug naar je laatste ongelezen bericht"
- replies: "%{current} / %{total} antwoorden"
replies_short: "%{current} / %{total}"
progress:
title: topicvoortgang
@@ -1211,12 +1275,11 @@ nl:
jump_bottom_with_number: "spring naar bericht %{post_number}"
total: totaal aantal berichten
current: huidige bericht
- position: "bericht %{current} van %{total}"
notifications:
title: verander de frequentie van notificaties over deze topic
reasons:
mailing_list_mode: "De mailinglijstmodus staat ingeschakeld, dus zul je via e-mail notificaties ontvangen bij nieuwe antwoorden in deze topic."
- '3_10': 'Je zal notificaties ontvangen omdat je een tag op deze topic in de gaten houdt.'
+ '3_10': 'Je ontvangt notificaties omdat je een tag in deze topic in de gaten houdt.'
'3_6': 'Je ontvangt notificaties omdat je deze categorie in de gaten houdt.'
'3_5': 'Je ontvangt notificaties omdat je deze topic automatisch in de gaten houdt.'
'3_2': 'Je ontvangt notificaties omdat je deze topic in de gaten houdt.'
@@ -1286,6 +1349,9 @@ nl:
share:
title: 'Deel'
help: 'deel een link naar deze topic'
+ print:
+ title: 'Printen'
+ help: 'Open een printervriendelijke versie van dit topic'
flag_topic:
title: 'Markeer'
help: 'geef een privé-markering aan deze topic of stuur er een privé-bericht over'
@@ -1398,7 +1464,7 @@ nl:
post:
reply: " {{replyAvatar}} {{usernameLink}}"
reply_topic: " {{link}}"
- quote_reply: "citeer"
+ quote_reply: "Citeer"
edit: "Aan het bewerken {{link}} {{replyAvatar}} {{username}}"
edit_reason: "Reden: "
post_number: "bericht {{number}}"
@@ -1415,7 +1481,6 @@ nl:
gap:
one: "bekijk 1 verborgen reactie"
other: "bekijk {{count}} verborgen reacties"
- more_links: "{{count}} meer..."
unread: "Bericht is ongelezen"
has_replies:
one: "{{count}} Reactie"
@@ -1484,14 +1549,6 @@ nl:
defer_flags:
one: "Markering negeren"
other: "Markeringen negeren"
- it_too:
- off_topic: "Markeer het ook"
- spam: "Markeer het ook"
- inappropriate: "Markeer deze ook"
- custom_flag: "Markeer het ook"
- bookmark: "Voeg ook toe aan favorieten"
- like: "Like het ook"
- vote: "Stem ook"
undo:
off_topic: "Verwijder markering"
spam: "Verwijder markering"
@@ -1645,6 +1702,7 @@ nl:
email_in_disabled: "Het plaatsen van nieuwe topics via e-mail is uitgeschakeld in de webite-instellingen. Om het plaatsen van nieuwe topic via e-mail mogelijk te maken,"
email_in_disabled_click: 'schakel "e-mail in" instelling in.'
suppress_from_homepage: "Negeer deze categorie op de homepage"
+ sort_order: "Standaardsortering:"
allow_badges_label: "Laat badges toekennen voor deze categorie"
edit_permissions: "Wijzig permissies"
add_permission: "Nieuwe permissie"
@@ -1670,14 +1728,19 @@ nl:
muted:
title: "Genegeerd"
description: "Je zult niet op de hoogte worden gebracht over nieuwe topics in deze categorie en ze zullen niet verschijnen in Recent."
+ sort_options:
+ default: "standaard"
+ category: "Categorie"
+ sort_ascending: 'Oplopend'
+ sort_descending: 'Aflopend'
flagging:
- title: 'Bedankt voor het helpen beleefd houden van onze gemeenschap!'
+ title: 'Bedankt voor het beleefd houden van onze gemeenschap!'
action: 'Meld bericht'
take_action: "Onderneem actie"
notify_action: 'Bericht'
official_warning: 'Officiële waarschuwing'
delete_spammer: "Verwijder spammer"
- delete_confirm: "Je gaat nu %{posts} berichten en %{topics} topics van deze gebruiker verwijderen, het account verwijderen, nieuwe aanmeldingen vanaf het IP-adres %{ip_address} blokkeren en het e-mailadres %{email} op een permanente blokkeerlijst zetten. Weet je zeker dat dit een spammer is?"
+ delete_confirm_MF: "Je gaat nu {POSTS, plural, one {1 bericht} other {# berichten}} en {TOPICS, plural, one {1 topic} other {# topics}} van deze gebruiker verwijderen, het account verwijderen, nieuwe aanmeldingen vanaf het IP-adres {ip_address} blokkeren en het e-mailadres {email} op een permanente blokkeerlijst zetten. Weet je zeker dat dit een spammer is?"
yes_delete_spammer: "Ja, verwijder spammer"
ip_address_missing: "(N.V.T.)"
hidden_email_address: "(verborgen)"
@@ -1692,11 +1755,17 @@ nl:
custom_placeholder_notify_user: "Wees specifiek, opbouwend en blijf altijd beleefd."
custom_placeholder_notify_moderators: "Laat ons specifiek weten waar je je zorgen om maakt en stuur relevante links en voorbeelden mee waar mogelijk."
custom_message:
- at_least: "Gebruik ten minste {{n}} tekens"
- more: "Nog {{n}} te gaan..."
- left: "Nog {{n}}"
+ at_least:
+ one: "gebruik ten minste 1 teken"
+ other: "gebruik ten minste {{count}} tekens"
+ more:
+ one: "1 teken te gaan..."
+ other: "{{count}} tekens te gaan..."
+ left:
+ one: "1 resterend"
+ other: "{{count}} resterend"
flagging_topic:
- title: "Bedankt voor het helpen beleefd houden van onze gemeenschap!"
+ title: "Bedankt voor het beleefd houden van onze gemeenschap!"
action: "Markeer topic"
notify_action: "Bericht"
topic_map:
@@ -1735,7 +1804,6 @@ nl:
invisible:
help: "Dit topic is niet zichtbaar; het zal niet verschijnen in de topiclijst en kan alleen bekeken worden met een directe link"
posts: "Berichten"
- posts_lowercase: "berichten"
posts_long: "er zijn {{number}} berichten in deze topic"
posts_likes_MF: |
Dit topic heeft {count, plural, one {1 antwoord} other {# antwoorden}} {ratio, select,
@@ -1849,8 +1917,6 @@ nl:
readonly: "Bekijk"
lightbox:
download: "download"
- search_help:
- title: 'Zoeken in Help'
keyboard_shortcuts_help:
title: 'Sneltoetsen'
jump_to:
@@ -1902,6 +1968,7 @@ nl:
mark_regular: 'm, r Markeer topic als normaal'
mark_tracking: 'm, t Volg topic'
mark_watching: 'm, w Houd topic in de gaten'
+ print: 'ctrl+p Print topic'
badges:
earned_n_times:
one: "Deze badge is 1 keer verdiend"
@@ -2144,15 +2211,12 @@ nl:
refresh: "Herlaad"
new: "Nieuw"
selector_placeholder: "vul gebruikersnaam in"
- name_placeholder: "Groepsnaam, geen spaties, zelfde regels als bij een gebruikersnaam"
about: "Wijzig hier je deelname aan groepen en je namen"
group_members: "Groepsleden"
delete: "Verwijder"
delete_confirm: "Verwijder deze groepen?"
delete_failed: "Kan groep niet verwijderen. Als dit een automatische groep is, kan deze niet verwijderd worden."
- delete_member_confirm: "Verwijder '%{username}' uit de '%{group'} groep?"
delete_owner_confirm: "Verwijder eigenaarsprivileges van '% {username}'?"
- name: "Naam"
add: "Voeg toe"
add_members: "Voeg leden toe"
custom: "Aangepast"
@@ -2183,6 +2247,75 @@ nl:
info_html: "Met deze API-key kun je met behulp van JSON-calls topics maken en bewerken."
all_users: "Alle gebruikers"
note_html: "Houd deze key geheim, alle gebruikers die hierover beschikken kunnen berichten plaatsen als elke andere gebruiker."
+ web_hooks:
+ title: "Webhooks"
+ none: "Er zijn geen actieve webhooks."
+ instruction: "Webhooks laten Discourse externe services notificeren wanneer bepaalde gebeurtenissen plaatsvinden in je site. Wanneer een webhook afgevuurd wordt zal een POST-verzoek gestuurd worden naar de opgegeven URL."
+ detailed_instruction: "Wanneer de gekozen gebeurtenis plaatsvindt zal er een POST-verzoek gestuurd worden naar de opgegeven URL."
+ new: "Nieuwe webhook"
+ create: "Aanmaken"
+ save: "Opslaan"
+ destroy: "Verwijder"
+ description: "Omschrijving"
+ controls: "Controlepaneel"
+ go_back: "Terug naar lijst"
+ payload_url: "Payload URL"
+ payload_url_placeholder: "https://example.com/postreceive"
+ warn_local_payload_url: "Zo te zien probeer je een webhook naar een lokale URL te laten wijzen. Gebeurtenissen die hierheen gestuurd worden kunnen mogelijk resulteren in onverwacht gedrag. Doorgaan?"
+ secret_invalid: "Secret mag geen lege tekens bevatten."
+ secret_too_short: "Secret moet uit minimaal 12 tekens bestaan."
+ secret_placeholder: "Een optionele waarde, gebruikt bij het maken van een handtekening"
+ event_type_missing: "Stel minstens één event type in."
+ content_type: "Type inhoud"
+ secret: "Secret"
+ event_chooser: "Welke gebeurtenissen moeten deze webhook afvuren?"
+ wildcard_event: "Stuur mij alles."
+ individual_event: "Selecteer individuele gebeurtenissen."
+ verify_certificate: "Controleer het TLS-certificaat van de payload URL"
+ active: "Actief"
+ active_notice: "We sturen details over de gebeurtenis wanneer deze plaatsvindt."
+ categories_filter_instructions: "Alleen als de gebeurtenis bij specifieke categorieën hoort worden de relevante webhooks afgevuurd. Laat leeg om webhooks bij alle categorieën af te vuren."
+ categories_filter: "Vuur af bij categorieën "
+ groups_filter_instructions: "Alleen als de gebeurtenis bij specifieke groepen hoort worden de relevante webhooks afgevuurd. Laat leeg om webhooks bij alle groepen af te vuren."
+ groups_filter: "Vuur af bij groepen"
+ delete_confirm: "Deze webhook verwijderen?"
+ topic_event:
+ name: "Topicgebeurtenis"
+ details: "Wanneer een nieuwe topic geplaatst, gereviseerd, veranderd of verwijderd wordt."
+ post_event:
+ name: "Berichtgebeurtenis"
+ details: "Wanneer een nieuw bericht geplaatst, bewerkt, verwijderd of hersteld wordt."
+ user_event:
+ name: "Gebruikersgebeurtenis"
+ delivery_status:
+ title: "Afleveringsstatus"
+ inactive: "Inactief"
+ failed: "Mislukt"
+ successful: "Succesvol "
+ events:
+ none: "Er zijn geen verwante gebeurtenissen."
+ redeliver: "Opnieuw afleveren"
+ incoming:
+ one: "Er is een nieuwe gebeurtenis."
+ other: "Er zijn {{count}} nieuwe gebeurtenissen."
+ completed_in:
+ one: "Voltooid in 1 seconde."
+ other: "Voltooid in {{count}} seconden."
+ request: "Verzoek"
+ response: "Reactie"
+ redeliver_confirm: "Weet je zeker dat je dezelfde payload opnieuw wilt afleveren?"
+ headers: "Koppen"
+ payload: "Payload"
+ body: "Inhoud"
+ go_list: "Naar lijst"
+ go_details: "Webhook bewerken"
+ go_events: "Naar gebeurtenissen"
+ ping: "Ping"
+ status: "Statuscode"
+ event_id: "ID"
+ timestamp: "Gemaakt"
+ completion: "Verstreken tijd"
+ actions: "Acties"
plugins:
title: "Plugins"
installed: "Geïnstalleerde plugins"
@@ -2248,10 +2381,8 @@ nl:
title: "Herstel de database naar de laatst werkende versie"
confirm: "Weet je zeker dat je de database wilt terugzetten naar de vorige werkende staat?"
export_csv:
- user_archive_confirm: "Weet je zeker dat je al je berichten wilt downloaden?"
success: "Exporteren is gestart, je zult een bericht ontvangen als het proces is afgerond."
failed: "Exporteren is mislukt. Controleer de logbestanden."
- rate_limit_error: "Berichten kunnen één keer per dag gedownload worden, probeer het morgen nog eens."
button_text: "Exporteren"
button_title:
user: "Exporteer volledige gebruikerslijst in CSV-formaat"
@@ -2268,7 +2399,7 @@ nl:
title: "Aanpassingen"
long_title: "Aanpassingen aan de site"
css: "CSS"
- header: "Header"
+ header: "Koptekst"
top: "Top"
footer: "Voettekst"
embedded_css: "Embedded CSS"
@@ -2293,7 +2424,7 @@ nl:
import_title: "Selecteer een bestand of plak tekst"
delete: "Verwijder"
delete_confirm: "Verwijder deze aanpassing?"
- about: "Pas CSS stylesheets en HTML headers aan op de site. Voeg een aanpassing toe om te beginnen."
+ about: "Pas CSS-stylesheets en HTML-kopteksten aan op de site. Voeg een aanpassing toe om te beginnen."
color: "Kleur"
opacity: "Doorzichtigheid"
copy: "Kopieër"
@@ -2332,11 +2463,11 @@ nl:
name: "quaternaire"
description: "Navigatie."
header_background:
- name: "headerachtergrond"
- description: "Achtergrondkleur van de header."
+ name: "koptekstachtergrond"
+ description: "Achtergrondkleur van de koptekst."
header_primary:
- name: "eerste header"
- description: "Tekst en iconen in de header."
+ name: "eerste koptekst"
+ description: "Tekst en iconen in de koptekst."
highlight:
name: 'opvallen'
description: 'De achtergrondkleur van gemarkeerde elementen op de pagina, zoals berichten en topics. '
@@ -2373,6 +2504,8 @@ nl:
delivery_method: "Verzendmethode"
preview_digest_desc: "Bekijk een voorbeeld van de digest e-mails die gestuurd worden naar inactieve leden."
refresh: "Verniew"
+ send_digest_label: "Stuur dit resultaat naar:"
+ sending_email: "E-mail wordt verzonden..."
format: "Formaat"
html: "html"
text: "text"
@@ -2566,7 +2699,7 @@ nl:
suspend_reason: "Reden"
suspended_by: "Geschorst door"
delete_all_posts: "Verwijder alle berichten"
- delete_all_posts_confirm: "Je staat op het punt om %{posts} berichten en %{topics} topics verwijderen. Weet je het zeker?"
+ delete_all_posts_confirm_MF: "Je staat op het punt om {POSTS, plural, one {1 bericht} other {# berichten}} en {TOPICS, plural, one {1 topic} other {# topics}} te verwijderen. Weet je het zeker?"
suspend: "Schors"
unsuspend: "Herstel schorsing"
suspended: "Geschorst?"
@@ -2662,7 +2795,9 @@ nl:
unlock_trust_level: "Geef trustlevel vrij"
tl3_requirements:
title: "Vereisten voor trustlevel 3"
- table_title: "In de laatste %{time_period} dagen:"
+ table_title:
+ one: "In de laatste dag:"
+ other: "In de laatste %{count} dagen:"
value_heading: "Waarde"
requirement_heading: "Vereiste"
visits: "Bezoeken"
@@ -2762,12 +2897,14 @@ nl:
developer: 'Ontwikkelaar'
embedding: "Embedden"
legal: "Juridisch"
+ user_api: 'Gebruikers-API'
uncategorized: 'Overige'
backups: "Backups"
login: "Gebruikersnaam"
plugins: "Plugins"
user_preferences: "Gebruikersvoorkeuren"
tags: "Tags"
+ search: "Zoek"
badges:
title: Badges
new_badge: Nieuwe badge
@@ -2849,6 +2986,7 @@ nl:
sample: "Gebruik de volgende HTML-code om discourse topics te maken en te embedden in je website. Vervang REPLACE_ME met de volledige URL van de pagina waarin je het topic wilt embedden."
title: "Embedden"
host: "Toegestane hosts"
+ path_whitelist: "Toegestane paden"
edit: "wijzig"
category: "Bericht naar categorie"
add_host: "Voeg host toe"
@@ -2860,6 +2998,7 @@ nl:
embed_by_username: "Gebruikersnaam voor het maken van topics"
embed_post_limit: "Maximaal aantal berichten om te embedden"
embed_username_key_from_feed: "Key om de discourse gebruikersnaam uit de feed te halen"
+ embed_title_scrubber: "Reguliere expressie voor het afleiden van de titels van berichten"
embed_truncate: "Embedde berichten inkorten"
embed_whitelist_selector: "CSS selector voor elementen die worden toegestaan bij embedding"
embed_blacklist_selector: "CSS selector voor elementen die worden verwijderd bij embedding"
@@ -2882,3 +3021,22 @@ nl:
label: "Nieuw:"
add: "Voeg toe"
filter: "Zoeken (URL of Externe URL)"
+ wizard_js:
+ wizard:
+ done: "Klaar"
+ back: "Vorige"
+ next: "Volgende"
+ step: "%{current} van %{total}"
+ upload: "Uploaden"
+ uploading: "Uploaden..."
+ quit: "Misschien Later"
+ staff_count:
+ one: "Jouw community heeft 1 staflid."
+ other: "Jouw community heeft %{count} stafleden."
+ invites:
+ add_user: "toevoegen"
+ none_added: "Je hebt geen stafleden uitgenodigd. Weet je zeker dat je verder wilt gaan?"
+ roles:
+ admin: "Beheerder"
+ moderator: "Moderator"
+ regular: "Normale Gebruiker"
diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml
index 3c42db1aba5..f2e4798334a 100644
--- a/config/locales/client.pl_PL.yml
+++ b/config/locales/client.pl_PL.yml
@@ -28,6 +28,7 @@ pl_PL:
millions: "{{number}}M"
dates:
time: "H:mm"
+ timeline_date: "MMM YYYY"
long_no_year: "D MMM H:mm"
long_no_year_no_time: "D MMM"
full_no_year_no_time: "MMMM Do"
@@ -39,6 +40,7 @@ pl_PL:
long_date_with_year_without_time: "D MMM 'YY"
long_date_without_year_with_linebreak: "D MMM
LT"
long_date_with_year_with_linebreak: "D MMM 'YY
LT"
+ wrap_ago: "%{date} temu"
tiny:
half_a_minute: "< 1m"
less_than_x_seconds:
@@ -49,10 +51,6 @@ pl_PL:
one: "1s"
few: "%{count}s"
other: "%{count}s"
- less_than_x_minutes:
- one: "< 1m"
- few: "< %{count}m"
- other: "< %{count}m"
x_minutes:
one: "1m"
few: "%{count}m"
@@ -130,9 +128,13 @@ pl_PL:
google+: 'udostępnij ten odnośnik na Google+'
email: 'wyślij ten odnośnik przez email'
action_codes:
+ public_topic: "Upublicznij ten temat %{when}"
+ private_topic: "Uprywatnij ten temat %{when}"
split_topic: "podziel ten temat %{when}"
invited_user: "%{who} został zaproszony %{when}"
+ invited_group: "%{who} został zaproszony %{when}"
removed_user: "%{who} został usunięty %{when}"
+ removed_group: "%{who} został usunięty %{when}"
autoclosed:
enabled: 'zamknięcie %{when}'
disabled: 'otworzenie %{when}'
@@ -152,20 +154,25 @@ pl_PL:
enabled: 'wylistowanie %{when}'
disabled: 'odlistowanie %{when}'
topic_admin_menu: "akcje administratora"
+ wizard_required: "Teraz czas na konfigurację twojego forum! Rozpocznij Kreator Konfiguracji!"
emails_are_disabled: "Wysyłanie e-maili zostało globalnie wyłączone przez administrację. Powiadomienia e-mail nie będą dostarczane."
+ bootstrap_mode_enabled: "Aby ułatwić uruchomienie Twojego nowego serwisu, znajdujesz się w trybie bootstrap. Wszyscy nowi użytkownicy otrzymają 1. poziom zaufania i będą otrzymywać codzienne podsumowania drogą mailową. To się zmieni, gdy liczba użytkowników przekroczy liczbę %{min_users}."
+ bootstrap_mode_disabled: "Tryb Bootstrap zostanie wyłączony w ciągu najbliższych 24 godzin."
s3:
regions:
us_east_1: "US East (N. Virginia)"
us_west_1: "US West (N. California)"
us_west_2: "US West (Oregon)"
us_gov_west_1: "AWS GovCloud (US)"
- eu_west_1: "EU (Ireland)"
+ eu_west_1: "EU (Irlandia)"
eu_central_1: "EU (Frankfurt)"
ap_southeast_1: "Asia Pacific (Singapore)"
ap_southeast_2: "Asia Pacific (Sydney)"
+ ap_south_1: "Asia Pacific (Mumbai)"
ap_northeast_1: "Asia Pacific (Tokyo)"
ap_northeast_2: "Asia Pacific (Seoul)"
- sa_east_1: "South America (Sao Paulo)"
+ sa_east_1: "Ameryka Południowa (Sao Paulo)"
+ cn_north_1: "Chiny (Beijing)"
edit: 'edytuj tytuł i kategorię tego tematu'
not_implemented: "Bardzo nam przykro, ale ta funkcja nie została jeszcze zaimplementowana."
no_value: "Nie"
@@ -269,7 +276,10 @@ pl_PL:
enable: "Włącz"
disable: "Wyłącz"
undo: "Cofnij"
+ revert: "Przywróć"
failed: "Niepowodzenie"
+ switch_to_anon: "Włącz tryb anonimowy"
+ switch_from_anon: "Zakończ tryb anonimowy"
banner:
close: "Zamknij ten baner."
edit: "Edytuj ten baner >>"
@@ -321,6 +331,8 @@ pl_PL:
title: "Użytkownicy"
likes_given: "Oddane"
likes_received: "Otrzymane"
+ topics_entered: "Odsłony"
+ topics_entered_long: "Wyświetlone Tematy"
time_read: "Czas"
topic_count: "Tematy"
topic_count_long: "Utworzone tematy"
@@ -335,19 +347,62 @@ pl_PL:
one: "1 użytkownik"
few: "%{count} użytkownicy"
other: "%{count} użytkowników"
+ group_histories:
+ actions:
+ change_group_setting: "Zmień ustawienia grupy"
+ add_user_to_group: "Dodaj użytkownika"
+ remove_user_from_group: "Usuń użytkownika"
+ make_user_group_owner: "Nadaj prawa właściciela"
+ remove_user_as_group_owner: "Usuń prawa właściciela"
groups:
+ logs:
+ title: "Logi"
+ when: "Kiedy"
+ action: "Akcja"
+ subject: "Kontekst"
+ details: "Szczegóły"
+ from: "Od"
+ to: "Do"
+ edit:
+ title: 'Edytuj grupę'
+ full_name: 'Pełna nazwa'
+ add_members: "Dodaj użytkowników"
+ delete_member_confirm: "Usuń '%{username}' z grupy '%{group}'?"
+ request_membership_pm:
+ title: "Prośba o członkostwo"
+ body: "Chciałbym(-am) poprosić o członkostwo w grupie @%{groupName}."
+ name_placeholder: "Nazwa grupy, bez spacji, takie same zasady jak przy nazwie użytkownika"
+ public: "Zezwalaj użytkownikom na zapraszanie/opuszczanie grupy (Grupa musi być widoczna)"
empty:
posts: "Członkowie tej grupy nie opublikowali żadnych postów."
- members: "W tej grupie nie ma żadnych członków."
- topics: "Członkowie tej grupy nie opublikowali żadnych postów."
+ members: "Nie ma użytkowników w tej grupie"
+ mentions: "Nie ma wspomnień tej grupy"
+ messages: "Nie ma wiadomości dla tej grupy"
+ topics: "Nie ma wątków stworzonych przez użytkowników tej grupy"
+ logs: "Nie ma logów dla tej grupy"
add: "Dodaj"
+ join: "Dołącz do grupy"
+ leave: "Opuść grupę"
+ request: "Żądanie dołączenia do grupy"
+ automatic_group: Automatyczna grupa
+ closed_group: Zamknięta grupa
+ is_group_user: "Jesteś członkiem tej grupy"
+ allow_membership_requests: "Pozwalaj użytkownikom wysyłać prośby o członkostwo do właścicieli grup (Wymagane jest aby wszyscy mogli wspominać grupę)"
+ membership: "Członkostwo"
+ name: "Nazwa"
+ user_count: "Ilość użytkowników"
+ bio: "O grupie"
selector_placeholder: "Dodaj członków"
owner: "właściciel"
visible: "Grupa jest widoczna dla wszystkich użytkowników"
+ index:
+ title: "Grupy"
+ empty: "Nie ma widocznych grup"
title:
one: "grupa"
few: "grupy"
other: "grupy"
+ activity: "Aktywność"
members: "Członkowie"
topics: "Tematy"
posts: "Wpisów"
@@ -366,6 +421,10 @@ pl_PL:
notifications:
watching:
title: "Obserwowanie"
+ description: "Dostaniesz powiadomienie o każdym nowym wpisie w każdej dyskusji, zobaczysz również ilość odpowiedzi."
+ watching_first_post:
+ title: "Oglądasz pierwszy post"
+ description: "Zostaniesz powiadomiony tylko o pierwszym wpisie w każdym nowym temacie w tej grupie."
tracking:
title: "Śledzenie"
description: "Dostaniesz powiadomienie, gdy ktoś ci odpowie lub wspomni twoją @nazwę, zobaczysz również liczbę odpowiedzi."
@@ -375,6 +434,12 @@ pl_PL:
muted:
title: "Wyciszony"
description: "Nie otrzymasz powiadomień o nowych tematach w tej grupie."
+ flair_url: "Awatar "
+ flair_url_placeholder: "(Opconalne) Link do obrazka lub klasa Font Awesome"
+ flair_bg_color_placeholder: "(Opcjonalne) Kolor w formacie Hex"
+ flair_color_placeholder: "(Opcjonalne) Kolor w formacie Hex"
+ flair_preview_icon: "Podgląd ikony"
+ flair_preview_image: "Podgląd obrazka"
user_action_groups:
'1': "Przyznane lajki"
'2': "Otrzymane lajki"
@@ -408,16 +473,14 @@ pl_PL:
latest_by: "najnowszy wpis: "
toggle_ordering: "przełącz kolejność kontroli"
subcategories: "Podkategorie"
- topic_stats: "Liczba nowych tematów."
+ topic_sentence:
+ one: "1 temat"
+ few: "Kilka tematów"
+ other: "%{count} tematów"
topic_stat_sentence:
one: "ostatni %{unit}: %{count} nowy temat."
few: "ostatni %{unit}: %{count} nowe tematy."
other: "ostatni %{unit}: %{count} nowych tematów."
- post_stats: "Liczba nowych wpisów."
- post_stat_sentence:
- one: "ostatni %{unit}: %{count} nowy wpis."
- few: "ostatni %{unit}: %{count} nowe wpisy."
- other: "ostatni %{unit}: %{count} nowych wpisów."
ip_lookup:
title: Wyszukiwanie adresu IP
hostname: Nazwa hosta
@@ -440,7 +503,11 @@ pl_PL:
profile: "Profil"
mute: "Wycisz"
edit: "Edytuj ustawienia"
- download_archive: "Pobierz moje wpisy"
+ download_archive:
+ button_text: "Pobierz moje wpisy"
+ confirm: "Czy na pewno chcesz pobrać swoje wszystkie wpisy?"
+ success: "Rozpoczęto eksport: otrzymasz wiadomość, gdy proces zostanie zakończony."
+ rate_limit_error: "Wpisy mogą być pobierane raz dziennie, spróbuj ponownie jutro."
new_private_message: "Nowa wiadomość"
private_message: "Wiadomość"
private_messages: "Wiadomości"
@@ -458,10 +525,13 @@ pl_PL:
not_supported: "Powiadomienia nie są wspierane przez tę przeglądarkę. Przepraszamy."
perm_default: "Włącz powiadomienia"
perm_denied_btn: "Brak uprawnień"
+ perm_denied_expl: "Odmówiłeś dostępu dla powiadomień. Pozwól na powiadomienia w ustawieniach przeglądarki."
disable: "Wyłącz powiadomienia"
enable: "Włącz powiadomienia"
each_browser_note: "Uwaga: to ustawienie musisz zmienić w każdej przeglądarce której używasz."
+ dismiss_notifications: "Odrzuć wszystkie"
dismiss_notifications_tooltip: "Oznacz wszystkie powiadomienia jako przeczytane"
+ first_notification: "Twoje pierwsze powiadomienie! Kliknij aby zacząć."
disable_jump_reply: "Po odpowiedzi nie przechodź do nowego wpisu"
dynamic_favicon: "Pokazuj licznik powiadomień na karcie jako dynamiczny favicon"
external_links_in_new_tab: "Otwieraj wszystkie zewnętrzne odnośniki w nowej karcie"
@@ -475,8 +545,28 @@ pl_PL:
suspended_notice: "ten użytkownik jest zawieszony do {{date}}."
suspended_reason: "Powód: "
github_profile: "Github"
+ email_activity_summary: "Podsumowanie aktywności"
+ mailing_list_mode:
+ label: "Tryb listy mailingowej"
+ enabled: "Włącz tryb listy mailingowej"
+ instructions: |
+ To ustawienie nadpisuje podsumowanie aktywności.
+ daily: "Wyślij codzienne aktualizacje"
+ individual: "Wyślij e-mail dla każdego nowego postu"
+ individual_no_echo: "Wysyłaj emaile dla każdego nowego postu oprócz mojego"
+ many_per_day: "Wyślij mi e-mail dla każdego nowego posta (około {{dailyEmailEstimate}} na dzień)"
+ few_per_day: "Wyślij mi e-mail dla każdego nowego posta (około 2 dziennie)"
+ tag_settings: "Tagi"
+ watched_tags: "Obserwowane"
+ watched_tags_instructions: "Będziesz automatycznie śledzić wszystkie nowe tematy z tymi tagami, będziesz otrzymywać powiadomienie o każdym nowym wpisie i temacie, a liczba nieprzeczytanych i nowych wpisów będzie wyświetlana obok tytułów na liście tematów. "
+ tracked_tags: "Śledzone"
+ tracked_tags_instructions: "Będziesz automatycznie śledzić wszystkie nowe tematy z tymi tagami. Licznik nowych wpisów pojawi się obok tytułu na liście tematów."
+ muted_tags: "Wyciszone"
watched_categories: "Obserwowane"
tracked_categories: "Śledzone"
+ watched_first_post_categories: "Oglądasz pierwszy post"
+ watched_first_post_tags: "Oglądasz pierwszy post"
+ watched_first_post_tags_instructions: "Zostaniesz powiadomiony tylko o pierwszym wpisie w każdym nowym temacie oznaczonym tymi tagami."
muted_categories: "Wyciszone"
muted_categories_instructions: "Nie będziesz powiadamiany o nowych tematach w tych kategoriach. Nie pojawią się na liście nieprzeczytanych."
delete_account: "Usuń moje konto"
@@ -489,6 +579,12 @@ pl_PL:
muted_users: "Uciszeni"
muted_users_instructions: "Wstrzymaj powiadomienia od tych użytkowników."
muted_topics_link: "Pokaż wyciszone tematy"
+ watched_topics_link: "Pokaż obserwowane tematy"
+ automatically_unpin_topics: "Automatycznie odpinaj tematy kiedy dotrę do końca strony."
+ apps: "Aplikacje"
+ revoke_access: "Zablokuj dostęp"
+ undo_revoke_access: "Cofnij zablokowanie dostępu"
+ api_approved: "Zatwierdzony:"
staff_counters:
flags_given: "uczynnych oflagowań"
flagged_posts: "oflagowane wpisy"
@@ -514,6 +610,7 @@ pl_PL:
set_password: "Ustaw hasło"
change_about:
title: "Zmień O mnie"
+ error: "Wystąpił błąd podczas zmiany tej wartości."
change_username:
title: "Zmień nazwę użytkownika"
taken: "Przykro nam, ale ta nazwa jest zajęta."
@@ -576,6 +673,7 @@ pl_PL:
title: "Język interfejsu"
instructions: "Język interfejsu użytkownika. Zmieni się, gdy odświeżysz stronę."
default: "(domyślny)"
+ any: "każdy"
password_confirmation:
title: "Powtórz hasło"
last_posted: "Ostatni wpis"
@@ -595,6 +693,7 @@ pl_PL:
first_time: "Pierwszy lajk"
never: "Nigdy"
email_previous_replies:
+ unless_emailed: "chyba wcześniej wysłany"
always: "zawsze"
never: "nigdy"
email_digests:
@@ -651,19 +750,18 @@ pl_PL:
rescind: "Usuń"
rescinded: "Zaproszenie usunięte"
reinvite: "Ponów zaproszenie"
+ reinvite_all: "Wyślij ponownie wszystkie zaproszenia"
reinvited: "Ponowne wysłanie zaproszenia"
+ reinvited_all: "Wszystkie zaproszenia zostały ponownie wysłane!"
time_read: "Czas odczytu"
days_visited: "Dni odwiedzin"
account_age_days: "Wiek konta w dniach"
create: "Wyślij zaproszenie"
generate_link: "Skopiuj link z zaproszeniem"
- generated_link_message: '
Link z zaproszeniem został wygenerowany pomyślnie!
Link zaproszenia jest ważny jedynie dla tego adresu e-mail: %{invitedEmail}
' + link_generated: "Link z zaproszenie został poprawnie wygenerowany!" bulk_invite: - none: "Jeszcze nikogo nie zaproszono. Możesz wysłać pojedyncze zaproszenie lub zaprosić wiele osób na raz wysyłając odpowiedni plik." text: "Zaproszenia hurtowe z pliku" - uploading: "Wysyłanie…" success: "Plik został przesłany pomyślnie: otrzymasz prywatną wiadomość, gdy proces zostanie zakończony." - error: "Podczas przesyłania wystąpił błąd '{{filename}}': {{message}}" password: title: "Hasło" too_short: "Hasło jest za krótkie." @@ -675,14 +773,49 @@ pl_PL: summary: title: "Podsumowanie" stats: "Statystyki" + time_read: "czas odczytu" + topic_count: + one: "utworzono temat" + few: "utworzono tematów" + other: "utworzono tematy" + post_count: + one: "utworzono post" + few: "utworzonych postów" + other: "utworzono posty" + likes_given: + one: "dano" + few: "dano" + other: "dano" + likes_received: + one: "otrzymano" + few: "otrzymano" + other: "otrzymano" + days_visited: + one: "dzień odwiedzin" + few: "dni odwiedzin" + other: "dni odwiedzin" + posts_read: + one: "przeczytany post" + few: "przeczytanych postów" + other: "przeczytane posty" + bookmark_count: + one: "zakładka" + few: "zakładki" + other: "zakładki" top_replies: "Najlepsze odpowiedzi" + no_replies: "Póki co brak odpowiedzi." more_replies: "Więcej odpowiedzi" top_topics: "Najlepsze tematy" + no_topics: "Póki co brak tematów." more_topics: "Więcej tematów" top_badges: "Najlepsze odznaki" + no_badges: "Póki co brak odznak." more_badges: "Więcej odznak" + top_links: "Najlepsze linki" + no_links: "Póki co brak linków." most_liked_by: "Najbardziej lajkowane przez" most_liked_users: "Najbardziej lajkowane" + most_replied_to_users: "Najwięcej odpowiedzi do" no_likes: "Brak lajków." associated_accounts: "Powiązane konta" ip_address: @@ -728,10 +861,13 @@ pl_PL: read_only_mode: enabled: "Strona jest w trybie tylko-do-odczytu. Możesz nadal przeglądać serwis, ale operacje takie jak postowanie, lajkowanie i inne są wyłączone." login_disabled: "Logowanie jest zablokowane, gdy strona jest w trybie tylko do odczytu." + logout_disabled: "Wylogowanie 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…" + all_time: 'łącznie' + all_time_desc: 'łącznie utworzonych tematów' year: 'rok' year_desc: 'tematy dodane w ciągu ostatnich 365 dni' month: 'miesiąc' @@ -769,6 +905,7 @@ pl_PL: title: "Wiadomość" invite: "Zaproś innych" remove_allowed_user: "Czy naprawdę chcesz usunąć {{name}} z tej dyskusji?" + remove_allowed_group: "Czy naprawdę chcesz usunąć {{name}} z tej wiadomości?" email: 'Email' username: 'Nazwa konta' last_seen: 'Ostatnio oglądane' @@ -823,6 +960,9 @@ pl_PL: twitter: title: "przez Twitter" message: "Uwierzytelnianie przy pomocy konta na Twitterze (upewnij się, że blokada wyskakujących okienek nie jest włączona)" + instagram: + title: "z Instagram" + message: "Uwierzytelnianie przy pomocy konta na Instagramie (upewnij się, że blokada wyskakujących okienek nie jest włączona)" facebook: title: "przez Facebook" message: "Uwierzytelnianie przy pomocy konta Facebook (upewnij się, że blokada wyskakujących okienek nie jest włączona)" @@ -832,11 +972,21 @@ pl_PL: github: title: "przez GitHub" message: "Uwierzytelnianie przez GitHub (upewnij się, że blokada wyskakujących okienek nie jest włączona)" + emoji_set: + apple_international: "Apple/Międzynarodowy" + google: "Google" + twitter: "Twitter" + emoji_one: "Emoji One" + win10: "Win10" + category_page_style: + categories_only: "Tylko kategorie" + categories_and_latest_topics: "Kategorie i ostatnie tematy" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' alt: 'Alt' composer: + emoji: "Emoji :)" more_emoji: "więcej…" options: "Opcje" whisper: "szept" @@ -877,23 +1027,28 @@ pl_PL: show_preview: 'pokaż podgląd »' hide_preview: '« schowaj podgląd' quote_post_title: "Cytuj cały wpis" + bold_label: "Pogrubienie" bold_title: "Pogrubienie" bold_text: "pogrubiony tekst" + italic_label: "Kursywa" italic_title: "Wyróżnienie" italic_text: "wyróżniony tekst" link_title: "Odnośnik" link_description: "wprowadź tutaj opis odnośnika" link_dialog_title: "Wstaw odnośnik" link_optional_text: "opcjonalny tytuł" + link_url_placeholder: "http://example.com" quote_title: "Cytat" quote_text: "Cytat" code_title: "Tekst sformatowany" code_text: "Sformatowany blok tekstu poprzedź 4 spacjami" + paste_code_text: "wpisz lub wklej tutaj kod" upload_title: "Dodaj" upload_description: "wprowadź opis tutaj" olist_title: "Lista numerowana" ulist_title: "Lista wypunktowana" list_item: "Element listy" + heading_label: "Nagłówek" heading_title: "Nagłówek" heading_text: "Nagłówek" hr_title: "Pozioma linia" @@ -902,6 +1057,9 @@ pl_PL: modal_ok: "OK" modal_cancel: "Anuluj" cant_send_pm: "Przepraszamy, niestety nie możesz wysłać prywatnej wiadomości do %{username}." + yourself_confirm: + title: "Nie zapomniałeś dodać odbiorców?" + body: "Aktualnie ta wiadomość będzie wysłana tylko do ciebie!" admin_options_title: "Opcjonalne ustawienia obsługi dla tego tematu" auto_close: label: "Automatycznie zamykaj tematy po:" @@ -915,6 +1073,7 @@ pl_PL: notifications: title: "powiadomienia o wywołanej @nazwie, odpowiedzi do twoich wpisów i tematów, prywatne wiadomości, itp" none: "Nie udało się załadować listy powiadomień." + empty: "Nie znaleziono powiadomień." more: "pokaż starsze powiadomienia" total_flagged: "wszystkie oflagowane wpisy" mentioned: "
{{username}} {{description}}
" @@ -924,6 +1083,7 @@ pl_PL: posted: "
{{username}} {{description}}
" edited: "
{{username}} {{description}}
" liked: "
{{username}} {{description}}
" + liked_2: "
{{username}} {{description}}
" liked_many: one: "
{{username}}, {{username2}} oraz 1 inna osoba {{description}}
" few: "
{{username}}, {{username2}} i {{count}} innych osób {{description}}
"
@@ -952,6 +1112,7 @@ pl_PL:
moved_post: "Twój wpis został przeniesiony przez"
linked: "Linkownie do twojego wpisu"
granted_badge: "Przyznanie odznaki"
+ group_message_summary: "Wiadomości w grupowej skrzynce odbiorczej"
popup:
mentioned: '{{username}} wspomina o tobie w "{{topic}}" - {{site_title}}'
group_mentioned: '{{username}} wspomniał o Tobie w "{{topic}}" - {{site_title}}'
@@ -982,6 +1143,7 @@ pl_PL:
most_liked: "Najbardziej lajkowane"
select_all: "Zaznacz wszystkie"
clear_all: "Wyczyść wszystkie"
+ too_short: "Wyszukiwane określenie jest zbyt krótkie."
result_count:
one: "1 wynik dla \"{{term}}\""
few: "{{count}} wyniki dla \"{{term}}\""
@@ -989,20 +1151,55 @@ pl_PL:
title: "szukaj tematów, wpisów, użytkowników lub kategorii"
no_results: "Brak wyników wyszukiwania"
no_more_results: "Nie znaleziono więcej wyników."
- search_help: Wyszukaj w pomocy
searching: "Szukam…"
post_format: "#{{post_number}} za {{username}}"
context:
user: "Szukaj wpisów @{{username}}"
+ category: "Szukaj w kategorii #{{category}}"
topic: "Szukaj w tym temacie"
private_messages: "Wyszukiwanie wiadomości"
+ advanced:
+ title: Zaawansowane wyszukiwanie
+ posted_by:
+ label: Wysłane przez
+ in_category:
+ label: W kategorii
+ in_group:
+ label: W grupie
+ with_badge:
+ label: Z odnaką
+ with_tags:
+ label: Z tagami
+ filters:
+ likes: Lubię
+ watching: Obserwuję
+ tracking: Śledzę
+ private: są w moich wiadomościach
+ bookmarks: Dodałeś do zakładek
+ pinned: są przypięte
+ unpinned: są nie przypięte
+ wiki: są postami wiki
+ statuses:
+ label: Tematy gdzie
+ open: są otwarte
+ closed: są zamknięte
+ archived: są archiwizowane
+ noreplies: ma zero odpowiedzi
+ single_user: zawierają użytkownika
+ post:
+ time:
+ before: przed
+ after: po
hamburger_menu: "przejdź do innej listy lub kategorii"
new_item: "nowy"
go_back: 'wróć'
not_logged_in_user: 'strona użytkownika z podsumowaniem bieżących działań i ustawień'
current_user: 'idź do swojej strony użytkowanika'
topics:
+ new_messages_marker: "ostatnia wizyta"
bulk:
+ select_all: "Zaznacz wszystkie"
+ clear_all: "Wyczyść wszystko"
unlist_topics: "Ukryj tematy"
reset_read: "Wyzeruj przeczytane"
delete: "Usuń tematy"
@@ -1023,6 +1220,9 @@ pl_PL:
one: "Zaznaczono 1 temat."
few: "Zaznaczono {{count}} tematy."
other: "Zaznaczono {{count}} tematów."
+ change_tags: "Zmień tagi"
+ choose_new_tags: "Wybierz nowe tagi dla tych tematów:"
+ changed_tags: "Tagi tych tematów były zmieniane."
none:
unread: "Nie masz nieprzeczytanych tematów."
new: "Nie masz nowych tematów."
@@ -1051,7 +1251,6 @@ pl_PL:
unsubscribe:
stop_notifications: "Będziesz otrzymywać mniej powiadomień o {{title}}"
change_notification_state: "Twój aktualny stan powiadomień to"
- filter_to: "{{post_count}} wpisów w temacie"
create: 'Nowy temat'
create_long: 'Utwórz nowy temat'
private_message: 'Napisz wiadomość'
@@ -1105,6 +1304,7 @@ pl_PL:
toggle_information: "przełącz szczegóły tematu"
read_more_in_category: "Chcesz przeczytać więcej? Przeglądaj inne tematy w {{catLink}} lub {{latestLink}}."
read_more: "Chcesz przeczytać więcej? {{catLink}} lub {{latestLink}}."
+ read_more_MF: "Masz do zobaczenia { UNREAD, plural, =0 {} one { is 1 nieprzeczytany } other { are # nieprzeczytanych } } { NEW, plural, =0 {} one { {BOTH, select, true{and } false {is } other{}} 1 nowy temat} other { {BOTH, select, true{and } false {are } other{}} # nowych tematów} }, lub {CATEGORY, select, true {przeglądaj inne tematy w {catLink}} false {{latestLink}} other {}}"
browse_all_categories: Przeglądaj wszystkie kategorie
view_latest_topics: pokaż aktualne tematy
suggest_create_topic: Może rozpoczniesz temat?
@@ -1116,17 +1316,20 @@ pl_PL:
auto_close_title: 'Ustawienia automatycznego zamykania'
auto_close_save: "Zapisz"
auto_close_remove: "Nie zamykaj automatycznie tego tematu"
- auto_close_immediate: "Ostatni wpis w tym temacie został zamieszczony %{hours} godzin temu, więc zostanie on natychmiastowo zamknięty."
+ timeline:
+ back: "Wstecz"
+ back_description: "Wróć do ostatniego nieprzeczytanego postu"
+ replies_short: "%{current} / %{total}"
progress:
title: postęp tematu
go_top: "początek"
go_bottom: "koniec"
go: "idź"
jump_bottom: "Przejdź na koniec"
+ jump_prompt: "skocz do..."
jump_bottom_with_number: "przeskocz do wpisu %{post_number}"
total: w sumie wpisów
current: obecny wpis
- position: "wpis %{current} z %{total}"
notifications:
reasons:
'3_6': 'Będziesz otrzymywać powiadomienia o każdym nowym wpisie i temacie, ponieważ obserwujesz tę kategorię.'
@@ -1181,6 +1384,8 @@ pl_PL:
invisible: "Ustaw jako niewidoczny"
visible: "Ustaw jako widoczny"
reset_read: "Zresetuj przeczytane dane"
+ make_public: "Upublicznij temat"
+ make_private: "Utwórz prywatną wiadomość"
feature:
pin: "Przypnij temat"
unpin: "Odepnij temat"
@@ -1196,6 +1401,8 @@ pl_PL:
share:
title: 'Udostępnij'
help: 'udostępnij odnośnik do tego tematu'
+ print:
+ title: 'Drukuj'
flag_topic:
title: 'Zgłoś'
help: 'zgłoś ten temat, aby zwrócić uwagę moderacji lub wyślij powiadomienie o nim'
@@ -1229,6 +1436,7 @@ pl_PL:
no_banner_exists: "Baner nie jest obecnie ustawiony."
banner_exists: "Baner jest obecnie ustawiony."
inviting: "Zapraszam…"
+ automatically_add_to_groups: "To zaproszenie obejmuje również dostęp do tych grup:"
invite_private:
title: 'Zaproś do dyskusji'
email_or_username: "Adres email lub nazwa użytkownika zapraszanej osoby"
@@ -1276,6 +1484,9 @@ pl_PL:
one: "Wybierz temat, do którego chcesz przenieś ten wpis."
few: "Wybierz temat, do którego chcesz przenieść wybrane {{count}} wpisy."
other: "Wybierz temat, do którego chcesz przenieść {{count}} wybranych wpisów."
+ merge_posts:
+ title: "Scal wybrane posty"
+ action: "scal wybrane posty"
change_owner:
title: "Zmień właściciela wpisów"
action: "zmień właściciela"
@@ -1308,7 +1519,7 @@ pl_PL:
post:
reply: " {{replyAvatar}} {{usernameLink}}"
reply_topic: " {{link}}"
- quote_reply: "odpowiedz na ten cytat"
+ quote_reply: "Cytuj"
edit: "Edycja {{link}} {{replyAvatar}} {{username}}"
edit_reason: "Powód"
post_number: "wpis {{number}}"
@@ -1327,7 +1538,6 @@ pl_PL:
one: "pokaż 1 ukrytą odpowiedź"
few: "pokaż {{count}} ukryte odpowiedzi"
other: "pokaż {{count}} ukrytych odpowiedzi"
- more_links: "{{count}} więcej…"
unread: "Nieprzeczytany wpis"
has_replies:
one: "{{count}} odpowiedź"
@@ -1351,6 +1561,7 @@ pl_PL:
edit: "Przepraszamy, podczas edytowania twojego wpisu wystąpił błąd. Spróbuj ponownie."
upload: "Przepraszamy, wystąpił błąd podczas wczytywania Twojego pliku. Proszę, spróbuj ponownie."
too_many_uploads: "Przepraszamy, ale możesz wgrać tylko jeden plik naraz."
+ too_many_dragged_and_dropped_files: "Przepraszamy, ale możesz wgrać tylko 10 plików naraz."
upload_not_authorized: "Przepraszamy, ale plik który chcesz wgrać jest niedozwolony (dozwolone rozszerzenia: {{authorized_extensions}})."
image_upload_not_allowed_for_new_user: "Przepraszamy, ale nowi użytkownicy nie mogą wgrywać obrazów."
attachment_upload_not_allowed_for_new_user: "Przepraszamy, ale nowi użytkownicy nie mogą wgrywać załączników."
@@ -1360,7 +1571,10 @@ pl_PL:
no_value: "Nie, pozostaw"
yes_value: "Tak, porzuć"
via_email: "ten wpis został dodany emailem"
+ via_auto_generated_email: "ten post został dodany poprzez automatycznie wygenerowaną wiadomość e-mail"
whisper: "ten wpis jest prywatnym szeptem do moderatorów"
+ wiki:
+ about: "ten post jest Wiki"
archetypes:
save: 'Opcje zapisu'
controls:
@@ -1396,14 +1610,6 @@ pl_PL:
one: "Odrocz flagę"
few: "Odrocz flagi"
other: "Odrocz flagi"
- it_too:
- off_topic: "Oflaguj też to"
- spam: "Oflaguj też to"
- inappropriate: "Oflaguj też to"
- custom_flag: "Oflaguj też to"
- bookmark: "Utwórz zakładkę"
- like: "Lajkuj"
- vote: "Zagłosuj za tym"
undo:
off_topic: "Cofnij flagę"
spam: "Cofnij flagę"
@@ -1500,6 +1706,11 @@ pl_PL:
one: "Jesteś pewny(-a), że chcesz usunąć ten wpis?"
few: "Jesteś pewny(-a), że chcesz usunąć te wszystkie wpisy?"
other: "Czy na pewno chcesz usunąć te wszystkie wpisy?"
+ merge:
+ confirm:
+ one: "Czy na pewno chcesz scalić te posty?"
+ few: "Czy na pewno chcesz scalić te {{count}} postów?"
+ other: "Czy na pewno chcesz scalić te {{count}} postów?"
revisions:
controls:
first: "Pierwsza wersja"
@@ -1508,6 +1719,7 @@ pl_PL:
last: "Ostatnia wersja"
hide: "Ukryj tę wersję"
show: "Pokaż tę wersję"
+ revert: "Przywróć do tej wersji"
comparing_previous_to_current_out_of_total: "{{previous}} {{current}} / {{total}}"
displays:
inline:
@@ -1530,6 +1742,9 @@ pl_PL:
general: 'Ogólne'
settings: 'Ustawienia'
topic_template: "Szablon tematu"
+ tags: "Tagi"
+ tags_placeholder: "(Opcjonalnie) lista dozwolonych tagów"
+ tag_groups_placeholder: "(Opcjonalnie) lista dozwolonych grup tagów"
delete: 'Usuń kategorię'
create: 'Nowa kategoria'
create_long: 'Utwórz nową kategorię'
@@ -1564,6 +1779,7 @@ pl_PL:
email_in_disabled: "Tworzenie nowych tematów emailem jest wyłączone w ustawieniach serwisu. "
email_in_disabled_click: 'Kliknij tu, aby włączyć.'
suppress_from_homepage: "Nie wyświetlaj tej kategorii na stronie głównej."
+ sort_order: "Domyślnie sortuj:"
allow_badges_label: "Włącz przyznawanie odznak na podstawie aktywności w tej kategorii"
edit_permissions: "Edytuj uprawnienia"
add_permission: "Dodaj uprawnienie"
@@ -1576,37 +1792,47 @@ pl_PL:
notifications:
watching:
title: "Obserwuj wszystko"
+ watching_first_post:
+ title: "Oglądasz pierwszy post"
tracking:
title: "Śledzona"
+ description: "Będziesz automatycznie śledzić wszystkie nowe tematy w tych kategoriach. Dostaniesz powiadomienie, gdy ktoś ci odpowie lub wspomni twoją @nazwę. Zobaczysz również liczbę odpowiedzi."
regular:
title: "Normalny"
description: "Dostaniesz powiadomienie jedynie, gdy ktoś wspomni twoją @nazwę lub odpowie na twój wpis."
muted:
title: "Wyciszone"
description: "Nie otrzymasz powiadomień o nowych tematach w tych kategoriach. Nie pojawią się na liście nieprzeczytanych."
+ sort_options:
+ default: "domyślny"
+ likes: "Polubienia"
+ views: "Odsłony"
+ posts: "Posty"
+ activity: "Aktywność"
+ category: "Kategoria"
+ created: "Utworzony"
+ sort_ascending: 'Rosnąco'
+ sort_descending: 'Malejąco'
flagging:
title: 'Dziękujemy za pomoc w utrzymaniu porządku w naszej społeczności!'
action: 'Oflaguj wpis'
take_action: "Podejmij działanie"
notify_action: 'Wiadomość'
+ official_warning: 'Oficjalne ostrzeżenie'
delete_spammer: "Usuń spamera"
- delete_confirm: "Zamierzasz usunąć%{posts} wpisów i %{topics} tematów użytkownika, usunąć jest konto, zablokować możliwość zakładania kont z jego adresu IP %{ip_address} i dodać jego email %{email} do listy trwale zablokowanych. Czy na pewno ten użytkownik jest spamerem?"
yes_delete_spammer: "Tak, usuń spamera"
ip_address_missing: "(N/D)"
hidden_email_address: "(ukryto)"
submit_tooltip: "Zapisz prywatną flagę."
take_action_tooltip: "Nie czekaj, aż wpis zostanie zgłoszony przez innych, natychmiast oflaguj do działania . "
cant: "Przepraszamy, nie możesz oflagować teraz tego wpisu."
+ notify_staff: 'Powiadom zespół wiadomością prywatną'
formatted_name:
off_topic: "Jest nie-na-temat"
inappropriate: "Jest nieodpowiednie"
spam: "Jest odebrane jako spam"
custom_placeholder_notify_user: "Napisz konkretnie, konstuktywnie i kulturalnie."
custom_placeholder_notify_moderators: "Dlaczego ten wpis wymaga uwagi moderatora? Opisz co konkretnie Cię zaniepokoiło i jeśli to możliwe umieść odpowiednie odnośniki."
- custom_message:
- at_least: "wprowadź co najmniej {{n}} znaków"
- more: "{{n}} aby wysłać…"
- left: "{{n}} pozostało"
flagging_topic:
title: "Dziękujemy za pomoc w utrzymaniu porządku w naszej społeczności!"
action: "Zgłoś temat"
@@ -1615,6 +1841,7 @@ pl_PL:
title: "Podsumowanie tematu"
participants_title: "Najczęściej piszą"
links_title: "Popularne linki"
+ links_shown: "pokaż więcej linków..."
clicks:
one: "1 kliknięcie"
few: "%{count} kliknięć"
@@ -1642,7 +1869,6 @@ pl_PL:
invisible:
help: "Temat jest niewidoczny: nie będzie wyświetlany na listach tematów a dostęp do niego można uzyskać jedynie poprzez link bezpośredni"
posts: "Wpisy"
- posts_lowercase: "wpisy"
posts_long: "jest {{number}} wpisów w tym temacie"
original_post: "Oryginalny wpis"
views: "Odsłony"
@@ -1757,9 +1983,168 @@ pl_PL:
full: "tworzyć / odpowiadać / przeglądać"
create_post: "odpowiadać / przeglądać"
readonly: "przeglądać"
+ lightbox:
+ download: "pobierz"
keyboard_shortcuts_help:
+ title: 'Skróty klawiszowe'
+ jump_to:
+ title: 'Skocz do'
+ home: 'g, h Strona główna'
+ latest: 'g, l Najnowsze'
+ new: 'g, n Nowe'
+ unread: 'g, u Nieprzeczytane'
+ categories: 'g, c Kategorie'
+ top: 'g, t Góra'
+ bookmarks: 'g, b Zakładki'
+ profile: 'g, p Profil'
+ messages: 'g, m Wiadomości'
+ navigation:
+ title: 'Nawigacja'
+ jump: '# idź do postu #'
+ back: 'u wstecz'
+ up_down: 'k/j Przesuń zaznaczenie ↑ ↓'
+ open: 'o or Enter Otwórz wybrany temat'
+ application:
+ title: 'Aplikacja'
+ create: 'c utwórz nowy temat'
+ notifications: 'n otwarte powiadomienia'
+ hamburger_menu: '= Otwórz menu'
+ user_profile_menu: 'p Otwórz menu użytkownika'
+ show_incoming_updated_topics: '. Pokaż zaktualizowane tematy'
+ search: '/ Wyszukaj'
+ help: '? Pokaż skróty klawiszowe'
+ dismiss_new_posts: 'x, r wyczyść listę wpisów'
+ dismiss_topics: 'x, t wyczyść listę tematów'
+ log_out: 'shift+z shift+z Wyloguj'
actions:
+ title: 'Akcje'
+ bookmark_topic: 'f dodaj/usuń zakładkę na temat'
+ pin_unpin_topic: 'shift+p przypnij/odepnij temat'
+ share_topic: 'shift+s Udostępnij temat'
+ share_post: 's Udostępnij post'
+ reply_as_new_topic: 't Odpowiedz w nowym temacie'
+ reply_topic: 'shift+r Odpowiedz w temacie'
+ reply_post: 'r Odpowiedz na post'
+ quote_post: 'q cytuj post'
like: 'l Lajkuj post'
+ flag: '! Oznacz post'
+ bookmark: 'b Dodaj post do zakładek'
+ edit: 'e Edytuj post'
+ delete: 'd Usuń post'
+ mark_tracking: 'm, t śledź temat'
+ mark_watching: 'm, w Obserwuj wątek'
+ badges:
+ earned_n_times:
+ one: "Otrzymano tą odznakę 1 raz"
+ few: "Otrzymano tą odznakę %{count} razy"
+ other: "Otrzymano tą odznakę %{count} razy"
+ granted_on: "Przyznano %{date}"
+ others_count: "Inni użytkownicy z tą odznaką (%{count})"
+ title: Odznaki
+ allow_title: "dostępny tytuł"
+ multiple_grant: "przyznana wielokrotnie"
+ badge_count:
+ one: "1 odznaka"
+ few: "%{count} odznak"
+ other: "%{count} odznak"
+ more_badges:
+ one: "+1 więcej"
+ few: "+%{count} więcej"
+ other: "+%{count} więcej"
+ granted:
+ one: "1 przyznany"
+ few: "%{count} przyznanych"
+ other: "%{count} przyznanych"
+ select_badge_for_title: Wybierz odznakę do użycia jako twój tytuł
+ none: "
+ Szukaj z Google
+
+ tagging:
+ all_tags: "Wszystkie tagi"
+ selector_all_tags: "wszystkie tagi"
+ selector_no_tags: "brak tagów"
+ changed: "zmienione tagi:"
+ tags: "Tagi"
+ choose_for_topic: "Wybierz opcjonalne tagi dla tych tematów:"
+ delete_tag: "Usuń Tag"
+ delete_confirm: "Czy na pewno chcesz usunąć ten tag?"
+ rename_tag: "Zmień nazwę taga"
+ rename_instructions: "Wybierz nową nazwę dla tego taga:"
+ sort_by: "Sortuj po:"
+ sort_by_name: "nazwa"
+ manage_groups: "Zarządzaj grupą tagów"
+ manage_groups_description: "Definiowanie grup do organizowania tagów"
+ filters:
+ without_category: "%{filter} %{tag} tematy"
+ with_category: "%{filter} %{tag} tematy w %{category}"
+ untagged_without_category: "%{filter} nieoznaczone tematy"
+ untagged_with_category: "%{filter} nieoznaczone tematy w %{category}"
+ notifications:
+ watching:
+ title: "Obserwowane"
+ watching_first_post:
+ title: "Oglądasz pierwszy post"
+ tracking:
+ title: "Śledzenie"
+ regular:
+ title: "Normalny"
+ muted:
+ title: "Wyciszony"
+ groups:
+ title: "Tagi grup"
+ about: "Dodaj etykiety do grup aby zarządzać nimi łatwiej."
+ new: "Nowa Grupa"
+ tags_label: "Tagi w tej grupie:"
+ parent_tag_label: "Nadrzędny tag:"
+ parent_tag_placeholder: "Opcjonalnie"
+ one_per_topic_label: "Ogranicz jeden tag na temat z tej grupy"
+ new_name: "Nowa grupa tagów"
+ save: "Zapisz"
+ delete: "Usuń"
+ confirm_delete: "Czy na pewno chcesz usunąć ten tag grupy?"
+ topics:
+ none:
+ unread: "Nie masz nieprzeczytanych tematów."
+ new: "Nie masz nowych tematów."
+ read: "Nie przeczytałeś jeszcze żadnych tematów."
+ posted: "Jeszcze nie zamieściłeś postów w żadnym z tematów."
+ latest: "Brak najnowszych tematów."
+ hot: "Brak gorących tematów."
+ bookmarks: "Nie posiadasz tematów dodanych do zakładek."
+ top: "Brak najlepszych tematów."
+ search: "Brak wyników wyszukiwania."
+ bottom:
+ latest: "Nie ma więcej najnowszych tematów."
+ hot: "Nie ma więcej gorących tematów."
+ posted: "Nie ma więcej tematów, w których pisałeś."
+ read: "Nie ma więcej przeczytanych tematów."
+ new: "Nie ma więcej nowych tematów."
+ unread: "Nie ma więcej nieprzeczytanych tematów."
+ top: "Nie ma już więcej najlepszych tematów."
+ bookmarks: "Nie ma więcej dodanych tematów do zakładek."
+ search: "Nie znaleziono więcej wyników wyszukiwania."
+ invite:
+ custom_message_link: "niestandardowa wiadomość"
+ custom_message_placeholder: "Wpisz swoją niestandardową wiadomość"
+ custom_message_template_forum: "Hej, należy dołączyć do tego forum!"
admin_js:
type_to_filter: "pisz, aby filtrować…"
admin:
@@ -1807,9 +2192,11 @@ pl_PL:
30_days_ago: "30 dni temu"
all: "Wszystkie"
view_table: "tabela"
+ view_graph: "wykres"
refresh_report: "Odśwież raport"
start_date: "Data początkowa"
end_date: "Data końcowa"
+ groups: "Wszystkie grupy"
commits:
latest_changes: "Ostatnie zmiany: aktualizuj często!"
by: "przez"
@@ -1888,15 +2275,12 @@ pl_PL:
refresh: "Odśwież"
new: "Nowa"
selector_placeholder: "nazwa użytkownika"
- name_placeholder: "Nazwa grupy: bez spacji, takie same zasady jak przy nazwie użytkownika"
about: "Tu możesz edytować przypisania do grup oraz ich nazwy"
group_members: "Członkowie grupy"
delete: "Usuń"
delete_confirm: "Usunąć tę grupę?"
delete_failed: "Nie można usunąć grupy. Jeżeli jest to grupa automatyczna, nie może zostać zniszczona."
- delete_member_confirm: "Usunąć '%{username}' z grupy '%{group}' ?"
delete_owner_confirm: "Usunąć status właściciela dla '%{username}'?"
- name: "Nazwa"
add: "Dodaj"
add_members: "Dodaj członków"
custom: "Niestandardowe"
@@ -1927,6 +2311,34 @@ pl_PL:
info_html: "Twoje klucze API dają dostęp do tworzenia i aktualizowania tenatów przez wywołania JSON."
all_users: "Wszyscy użytkownicy"
note_html: "Zachowaj ten klucz w tajemnicy, wszyscy którzy go posiadają mogą tworzyć wpisy jako dowolny użytkownik."
+ web_hooks:
+ new: "Nowy webhook"
+ create: "Stwórz"
+ save: "Zapisz"
+ destroy: "Usuń"
+ description: "Opis"
+ go_back: "Powrót do listy"
+ payload_url_placeholder: "https://example.com/postreceive"
+ wildcard_event: "Wysyłaj mi wszystko."
+ active: "Aktywny"
+ delete_confirm: "Usunąć ten webhook?"
+ topic_event:
+ details: "Kiedy pojawia się nowy temat, poprawiony, zmieniony lub usunięty."
+ delivery_status:
+ title: "Status dostarczenia"
+ inactive: "Nieaktywny"
+ failed: "Niepowodzenie"
+ events:
+ request: "Żądanie"
+ response: "Odpowiedź"
+ headers: "Nagłówki"
+ go_list: "Przejdź do listy"
+ go_events: "Przejdź do wydarzeń"
+ ping: "Ping"
+ event_id: "ID"
+ timestamp: "Utworzono"
+ completion: "Czas wykonania"
+ actions: "Akcje"
plugins:
title: "Wtyczki"
installed: "Zainstalowane wtyczki"
@@ -1945,6 +2357,14 @@ pl_PL:
backups: "Kopie zapasowe"
logs: "Logi"
none: "Brak kopii zapasowych."
+ read_only:
+ enable:
+ title: "Włącz tryb tylko do odczytu"
+ label: "Włącz tylko do odczytu"
+ confirm: "Czy na pewno chcesz włączyć tryb tylko do odczytu?"
+ disable:
+ title: "Wyłącz tryb tylko do odczytu"
+ label: "Wyłącz tylko do odczytu"
logs:
none: "Póki co brak logów…"
columns:
@@ -1978,14 +2398,13 @@ pl_PL:
is_disabled: "Przywracanie jest zablokowane w ustawieniach."
label: "Przywróć"
title: "Przywróć kopię zapasową"
+ confirm: "Czy na pewno chcesz przywrócić tą kopię zapasową?"
rollback:
label: "Wycofaj"
title: "Wycofaj bazę danych do poprzedniego poprawnego stanu"
export_csv:
- user_archive_confirm: "Czy na pewno chcesz pobrać swoje wszystkie wpisy?"
success: "Rozpoczęto eksport: otrzymasz wiadomość, gdy proces zostanie zakończony."
failed: "Eksport zakończył się niepowodzeniem. Sprawdź logi."
- rate_limit_error: "Wpisy mogą być pobierane raz dziennie, spróbuj ponownie jutro."
button_text: "Eksportuj"
button_title:
user: "Eksportuj listę wszystkich użytkowników do formatu CSV."
@@ -2051,6 +2470,7 @@ pl_PL:
delete_confirm: "Usunąć ten schemat kolorów?"
undo: "cofnij"
undo_title: "Cofnij zmiany tego koloru od ostatniego zapisu"
+ revert: "przywróć"
revert_title: "Zresetuj ten kolor do wartości domyślnej."
primary:
name: 'podstawowy'
@@ -2077,18 +2497,22 @@ pl_PL:
name: 'niebezpieczeństwo'
description: 'Kolor podświetlenia dla akcji takich jak usuwanie wpisów i tematów.'
success:
+ name: 'sukces'
description: 'Używany do oznaczania operacji zakończonych sukcesem.'
love:
name: 'polubienie'
description: "Kolor przycisku lajkuj"
email:
+ title: "Emaile"
settings: "Ustawienia"
+ templates: "Szablony"
preview_digest: "Pokaż zestawienie aktywności"
sending_test: "Wysyłanie testowego emaila…"
error: "BŁAD - %{server_error}"
test_error: "Wystąpił problem podczas wysyłania testowego maila. Sprawdź ustawienia poczty, sprawdź czy Twój serwer nie blokuje połączeń pocztowych i spróbuj ponownie."
sent: "Wysłane"
skipped: "Pominięte"
+ bounced: "Odbite"
received: "Otrzymane"
rejected: "Odrzucone"
sent_at: "Wysłany na"
@@ -2102,6 +2526,9 @@ pl_PL:
delivery_method: "Metoda Dostarczenia"
preview_digest_desc: "Podgląd treści zestawienia wysyłanego e-mailem do nieaktywnych użytkowników."
refresh: "Odśwież"
+ send_digest_label: "Wyślij ten wynik do:"
+ send_digest: "Wyślij"
+ sending_email: "Wysyłanie wiadomości e-mail ..."
format: "Format"
html: "html"
text: "text"
@@ -2111,16 +2538,21 @@ pl_PL:
incoming_emails:
from_address: "Od"
to_addresses: "Do"
+ cc_addresses: "Cc"
subject: "Temat"
error: "Błąd"
+ none: "Brak przychodzących emaili."
modal:
+ title: "Szczegóły przychodzącego emaila"
error: "Błąd"
+ headers: "Nagłówki"
subject: "Temat"
body: "Treść"
filters:
from_placeholder: "from@example.com"
to_placeholder: "to@example.com"
cc_placeholder: "cc@example.com"
+ subject_placeholder: "Temat..."
error_placeholder: "Błąd"
logs:
none: "Nie znaleziono logów."
@@ -2171,6 +2603,7 @@ pl_PL:
change_site_setting: "zmiana ustawień serwisu"
change_site_customization: "modyfikacja personalizacji serwisu"
delete_site_customization: "usunięcie personalizacji strony"
+ change_site_text: "zmiana tekstu serwisu"
suspend_user: "zawieszenie użytkownika"
unsuspend_user: "odwieszenie użytkownika"
grant_badge: "przyznanie odznaki"
@@ -2186,6 +2619,12 @@ pl_PL:
create_category: "Dodaj nową kategorię"
block_user: "zablokuj użytkownika"
unblock_user: "odblokuj użytkownika"
+ grant_admin: "nadaj prawa admina"
+ revoke_admin: "odbierz prawa admina"
+ revoke_moderation: "cofnąć moderację"
+ backup_operation: "operacja tworzenia kopii zapasowej"
+ deleted_tag: "usunięty tag"
+ revoke_email: "cofnąć e-mail"
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."
@@ -2284,7 +2723,6 @@ pl_PL:
suspend_reason: "Powód"
suspended_by: "Zawieszony przez"
delete_all_posts: "Usuń wszystkie wpisy"
- delete_all_posts_confirm: "Zamierzasz usunąć %{posts} wpisów i %{topics} tematów. Czy na pewno?"
suspend: "Zawieś"
unsuspend: "Odwieś"
suspended: "Zawieszony?"
@@ -2330,7 +2768,7 @@ pl_PL:
anonymize_yes: "Tak, anonimizuj to konto."
anonymize_failed: "Wystąpił problem podczas anonimizacji konta."
delete: "Usuń użytkownika"
- delete_forbidden_because_staff: "Admini i moderatorzy nie mogą zostać usunięci."
+ delete_forbidden_because_staff: "Administratorzy i moderatorzy nie mogą zostać usunięci."
delete_posts_forbidden_because_staff: "Nie można usunąć wszystkich wpisów administratorów i moderatorów."
delete_forbidden:
one: "Użytkownik nie może zostać usunięty jeśli posiada wpisy. Usuń wszystkie jego wpisy przed usunięciem użytkownika. (Nie można usunąć wpisów starszych niż %{count} dzień.)"
@@ -2359,6 +2797,9 @@ pl_PL:
unblock_failed: 'Wystąpił problem podczaj odblokowania użytkownika.'
block_failed: 'Wystąpił problem podczas blokowania użytkownika.'
block_accept: 'Tak, zablokuj tego użytkownika'
+ bounce_score: "Wskaźnik odbić"
+ reset_bounce_score:
+ label: "Przywróć"
deactivate_explanation: "Wymusza ponowne potwierdzenie adresu email tego konta."
suspended_explanation: "Zawieszony użytkownik nie może się logować."
block_explanation: "Zablokowany użytkownik nie może tworzyć wpisów ani zaczynać tematów."
@@ -2372,7 +2813,10 @@ pl_PL:
unlock_trust_level: "Odblokuj poziom zaufania"
tl3_requirements:
title: "Wymagania dla osiągnięcia 3. poziomu zaufania"
- table_title: "W ciągu ostatnich %{time_period} dni:"
+ table_title:
+ one: "W ciągu ostatniego dnia:"
+ few: "W ciągu ostatnich %{count} dni:"
+ other: "W ciągu ostatnich %{count} dni:"
value_heading: "Wartość"
requirement_heading: "Wymaganie"
visits: "Odwiedziny"
@@ -2428,6 +2872,9 @@ pl_PL:
title: "Widoczne w publicznym profilu?"
enabled: "widoczne w profilu"
disabled: "niewidoczne w profilu"
+ show_on_user_card:
+ title: "Pokaż na karcie użytkownika?"
+ enabled: "pokazany na karcie użytkownika"
field_types:
text: 'Pole tekstowe'
confirm: 'Potwierdzenie'
@@ -2468,11 +2915,15 @@ pl_PL:
developer: 'Deweloperskie'
embedding: "Osadzanie"
legal: "Prawne"
+ user_api: 'API użytkownika'
uncategorized: 'Inne'
backups: "Kopie zapasowe"
login: "Logowanie"
plugins: "Wtyczki"
user_preferences: "Ustawienia użytk."
+ tags: "Tagi"
+ search: "Wyszukaj"
+ groups: "Grupy"
badges:
title: Odznaki
new_badge: Nowa odznaka
@@ -2481,6 +2932,7 @@ pl_PL:
badge: Odznaka
display_name: Wyświetlana nazwa
description: Opis
+ long_description: Długi opis
badge_type: Typ odznaki
badge_grouping: Grupa
badge_groupings:
@@ -2567,6 +3019,7 @@ pl_PL:
embed_truncate: "Skracaj treść osadzanych wpisów"
embed_whitelist_selector: "Selektor CSS elementów jakie mogą być osadzane"
embed_blacklist_selector: "Selektor CSS elementów jakie są usuwane podczas osadzania"
+ embed_classname_whitelist: "Dozwolone nazwy klas CSS"
feed_polling_enabled: "Importowanie wpisów via RSS/ATOM"
feed_polling_url: "URL kanału RSS/ATOM"
save: "Zapisz"
@@ -2585,3 +3038,23 @@ pl_PL:
label: "Nowy:"
add: "Dodaj"
filter: "Wyszukaj (URL or zewnętrzny URL)"
+ wizard_js:
+ wizard:
+ done: "Zrobione"
+ back: "Poprzednia"
+ next: "Następna"
+ step: "%{current} z %{total}"
+ upload: "Wyślij"
+ uploading: "Wysyłanie…"
+ quit: "Może później"
+ staff_count:
+ one: "W twojej społeczności jest 1 pracownik."
+ few: "W twojej społeczności jest %{count} pracowników."
+ other: "W twojej społeczności jest %{count} pracowników."
+ invites:
+ add_user: "dodaj"
+ none_added: "Nie zaprosiłeś nikogo. Czy na pewno chcesz kontynuować?"
+ roles:
+ admin: "Administratorzy"
+ moderator: "Moderatoratorzy"
+ regular: "Zwykli użytkownicy"
diff --git a/config/locales/client.pt.yml b/config/locales/client.pt.yml
index 00a4d32cbca..e10b8e0daf4 100644
--- a/config/locales/client.pt.yml
+++ b/config/locales/client.pt.yml
@@ -48,9 +48,6 @@ pt:
x_seconds:
one: "1s"
other: "%{count}s"
- less_than_x_minutes:
- one: "< 1m"
- other: "< %{count}m"
x_minutes:
one: "1m"
other: "%{count}m"
@@ -105,20 +102,20 @@ pt:
previous_month: 'Mês Anterior'
next_month: 'Mês Seguinte'
share:
- topic: 'partilhar uma hiperligação para este tópico'
- post: 'Mensagem #%{postNumber}'
+ topic: 'partilhar uma ligação para este tópico'
+ post: 'publicação #%{postNumber}'
close: 'fechar'
- twitter: 'partilhar esta hiperligação no Twitter'
- facebook: 'partilhar esta hiperligação no Facebook'
- google+: 'partilhar esta hiperligação no Google+'
- email: 'enviar esta hiperligação por email'
+ twitter: 'partilhar esta ligação no Twitter'
+ facebook: 'partilhar esta ligação no Facebook'
+ google+: 'partilhar esta ligação no Google+'
+ email: 'enviar esta ligação por email'
action_codes:
public_topic: "tornei este tópico publico %{when}"
private_topic: "tornei este tópico privado %{when}"
split_topic: "dividir este tópico %{when}"
- invited_user: "Convidou %{who} %{when}"
+ invited_user: "convidou %{who} %{when}"
invited_group: "convidou %{who} %{when}"
- removed_user: "Removeu %{who} %{when}"
+ removed_user: "removeu %{who} %{when}"
removed_group: "removeu %{who} %{when}"
autoclosed:
enabled: 'fechado %{when}'
@@ -139,6 +136,7 @@ pt:
enabled: 'listado %{when}'
disabled: 'removido da lista %{when}'
topic_admin_menu: "Ações administrativas dos Tópicos"
+ wizard_required: "É altura de configurar o seu fórum! Iniciar o ajudante de configuração!"
emails_are_disabled: "Todos os envios de e-mail foram globalmente desativados por um administrador. Nenhum e-mail de notificação será enviado."
bootstrap_mode_enabled: "Para facilitar o lançamento do seu novo sítio mais fácil, encontra-se agora em modo de inicialização. Qualquer utilizador novo terá nível de confiança 1 e resumos de email diários ligados. Este modo será automaticamente desligado quando o número total de utilizadores ultrapassar %{min_users}."
bootstrap_mode_disabled: "Modo de inicialização será desligado dentro das próximas 24 horas."
@@ -152,6 +150,7 @@ pt:
eu_central_1: "U.E. (Francoforte)"
ap_southeast_1: "Ásia-Pacífico (Singapura)"
ap_southeast_2: "Ásia-Pacífico (Sydney)"
+ ap_south_1: "Ásia Pacifico (Bombaim)"
ap_northeast_1: "Ásia-Pacífico (Tóquio)"
ap_northeast_2: "Ásia-Pacífico (Seoul)"
sa_east_1: "América do Sul (São Paulo)"
@@ -167,15 +166,15 @@ pt:
age: "Idade"
joined: "Juntou-se"
admin_title: "Administração"
- flags_title: "Sinalizações"
+ flags_title: "Denúncias"
show_more: "mostrar mais"
show_help: "opções"
links: "Hiperligações"
links_lowercase:
- one: "hiperligação"
+ one: "ligação"
other: "hiperligações"
faq: "FAQ"
- guidelines: "Diretrizes"
+ guidelines: "Orientações"
privacy_policy: "Política de Privacidade"
privacy: "Privacidade"
terms_of_service: "Termos de Serviço"
@@ -214,7 +213,7 @@ pt:
last_30_days: "Últimos 30 Dias"
like_count: "Gostos"
topic_count: "Tópicos"
- post_count: "Mensagens"
+ post_count: "Publicações"
user_count: "Novos Utilizadores"
active_user_count: "Utilizadores Activos"
contact: "Contacte-nos"
@@ -223,13 +222,13 @@ pt:
title: "Adicionar Marcador"
clear_bookmarks: "Remover Marcadores"
help:
- bookmark: "Clique para adicionar um marcador à primeira mensagem deste tópico"
+ bookmark: "Clique para adicionar um marcador à primeira publicação neste tópico"
unbookmark: "Clique para remover todos os marcadores deste tópico"
bookmarks:
- not_logged_in: "Pedimos desculpa, é necessário ter sessão iniciada para marcar mensagens"
- created: "adicionou esta mensagem aos marcadores"
- not_bookmarked: "leu esta mensagem; clique para adicioná-la aos marcadores"
- last_read: "esta foi a última mensagem que leu; clique para adicioná-la aos marcadores"
+ not_logged_in: "Pedimos desculpa, é necessário ter sessão iniciada para marcar publicações."
+ created: "adicionou esta publicação aos marcadores"
+ not_bookmarked: "leu esta publicação; clique para adicioná-la aos marcadores"
+ last_read: "esta foi a última publicação que leu; clique para adicioná-la aos marcadores"
remove: "Remover Marcador"
confirm_clear: "Tem a certeza que pretende eliminar todos os marcadores deste tópico?"
topic_count_latest:
@@ -259,7 +258,7 @@ pt:
switch_to_anon: "Entrar em modo Anónimo"
switch_from_anon: "Sair de modo Anónimo"
banner:
- close: "Destituir esta faixa."
+ close: "Marcar esta faixa como vista."
edit: "Editar esta faixa >>"
choose_topic:
none_found: "Nenhum tópico encontrado."
@@ -272,27 +271,27 @@ pt:
reject: 'Rejeitar'
delete_user: 'Eliminar Utilizador'
title: "Necessita de Aprovação"
- none: "Não há mensagens para rever."
+ none: "Não há publicações para rever."
edit: "Editar"
cancel: "Cancelar"
- view_pending: "ver mensagens pendentes"
+ view_pending: "ver publicações pendentes"
has_pending_posts:
- one: "Este tópico tem 1 mensagem à espera de aprovação"
- other: "Este tópico tem {{count}} mensagens à espera de aprovação"
+ one: "Este tópico tem 1 publicação à espera de aprovação"
+ other: "Este tópico tem {{count}} publicações à espera de aprovação"
confirm: "Guardar Alterações"
- delete_prompt: "Tem a certeza que deseja eliminar %{username}? Isto irá remover todas as suas mensagens e bloquear os seus emails e endereços ip."
+ delete_prompt: "Tem a certeza que deseja eliminar %{username}? Isto irá remover todas as suas publicações e bloquear os seus emails e endereços IP."
approval:
- title: "A Mensagem Necessita de Aprovação"
- description: "Recebemos a sua nova mensagem mas necessita de ser aprovada pelo moderador antes de aparecer. Por favor seja paciente."
+ title: "A Publicação Necessita de Aprovação"
+ description: "Recebemos a sua nova publicação mas necessita de ser aprovada pelo moderador antes de aparecer. Por favor seja paciente."
pending_posts:
- one: "Tem 1 mensagem pendente."
- other: "Tem {{count}} mensagens pendentes."
+ one: "Tem 1 publicação pendente."
+ other: "Tem {{count}} publicações pendentes."
ok: "OK"
user_action:
user_posted_topic: "{{user}} publicou o tópico"
- you_posted_topic: " publicouo tópico"
+ you_posted_topic: " publicou o tópico"
user_replied_to_post: "{{user}} respondeu a {{post_number}}"
- you_replied_to_post: " respondeu a {{post_number}}"
+ you_replied_to_post: "Você respondeu a {{post_number}}"
user_replied_to_topic: "{{user}} respondeu ao tópico"
you_replied_to_topic: " respondeu ao tópico"
user_mentioned_user: "{{user}} mencionou {{another_user}}"
@@ -318,28 +317,47 @@ pt:
days_visited: "Visitas"
days_visited_long: "Dias Visitados"
posts_read: "Ler"
- posts_read_long: "Mensagens Lidas"
+ posts_read_long: "Publicações Lidas"
total_rows:
one: "1 utilizador"
other: "%{count} utilizadores"
+ group_histories:
+ actions:
+ change_group_setting: "Mudar configuração do grupo"
+ add_user_to_group: "Adicionar utilizador"
+ remove_user_from_group: "Remover utilizador"
+ make_user_group_owner: "Tornar dono"
+ remove_user_as_group_owner: "Remover dono"
groups:
- empty:
- posts: "Não há nenhuma publicação feita por membros deste grupo."
- members: "Não há nenhum membro neste grupo."
- mentions: "Não há nenhuma menção deste grupo."
- messages: "Não há nenhuma mensagem para este grupo."
- topics: "Não há nenhum tópico feito por membros deste grupo."
+ logs:
+ title: "Registos"
+ when: "Quando"
+ action: "Ação"
+ acting_user: "Utlizador ator"
+ target_user: "Utilizador alvo"
+ subject: "Assunto"
+ details: "Detalhes"
+ from: "De"
+ to: "Para"
+ edit:
+ title: 'Editar Grupo'
+ full_name: 'Nome Completo'
+ add_members: "Adicionar membros"
+ delete_member_confirm: "Remover '%{username}' do grupo '%{group}'?"
+ request_membership_pm:
+ title: "Pedido de Adesão"
+ body: "Eu gostaria de aderir a @%{groupName}."
+ name_placeholder: "Nome do grupo, sem espaços, com as mesmas regras do nome de utilizador"
add: "Adicionar"
selector_placeholder: "Adicionar membros"
owner: "proprietário"
visible: "O grupo é visível para todos os utilizadores"
- index: "Grupos"
title:
one: "grupo"
other: "grupos"
members: "Membros"
topics: "Tópicos"
- posts: "Mensagens"
+ posts: "Publicações"
mentions: "Menções"
messages: "Mensagens"
alias_levels:
@@ -355,15 +373,18 @@ pt:
notifications:
watching:
title: "A vigiar"
- description: "Será notificado de cada nova publicação em todas as mensagens, e uma contagem de novas respostas será exibida."
+ description: "Será notificado de cada nova publicação em cada mensagem, e uma contagem de novas respostas será exibida."
+ watching_first_post:
+ title: "A Vigiar a Primeira Publicação"
+ description: "Será apenas notificado acerca da primeira publicação em cada tópico deste grupo."
tracking:
- title: "A Acompanhar"
+ title: "A Seguir"
description: "Será notificado se alguém mencionar o seu @nome ou lhe responder, e uma contagem de novas respostas será exibida."
regular:
title: "Habitual"
description: "Será notificado se alguém mencionar o seu @nome ou responder-lhe."
muted:
- title: "Mudo"
+ title: "Silenciado"
description: "Não será notificado de nada relacionado com novos tópicos neste grupo."
user_action_groups:
'1': "Gostos Dados"
@@ -392,20 +413,18 @@ pt:
save: "Guardar Ordem"
apply_all: "Aplicar"
position: "Posição"
- posts: "Mensagens"
+ posts: "Publicações"
topics: "Tópicos"
latest: "Recentes"
latest_by: "recentes por"
toggle_ordering: "alternar o controlo de ordenação"
subcategories: "Subcategorias"
- topic_stats: "Número de tópicos novos."
+ topic_sentence:
+ one: "1 tópico"
+ other: "%{count} tópicos"
topic_stat_sentence:
one: "%{count} novo tópico no passado %{unit}."
other: "%{count} novos tópicos no passado %{unit}."
- post_stats: "Número de mensagens novas."
- post_stat_sentence:
- one: "%{count} nova mensagem no passado %{unit}."
- other: "%{count} novas mensagens no passado %{unit}."
ip_lookup:
title: Pesquisa de Endereço IP
hostname: Nome do Servidor
@@ -419,7 +438,7 @@ pt:
trust_level: "TL"
read_time: "tempo de leitura"
topics_entered: "tópicos inseridos"
- post_count: "# mensagens"
+ post_count: "# publicações"
confirm_delete_other_accounts: "Tem a certeza que quer apagar estas contas?"
user_fields:
none: "(selecione uma opção)"
@@ -428,7 +447,11 @@ pt:
profile: "Perfil"
mute: "Silenciar"
edit: "Editar Preferências"
- download_archive: "Descarregar As Minhas Mensagens"
+ download_archive:
+ button_text: "Descarregar As Minhas Publicações"
+ confirm: "Tem a certeza que deseja descarregar as suas publicações?"
+ success: "Descarregamento iniciado, será notificado via mensagem assim que o processo estiver concluído."
+ rate_limit_error: "As publicações podem ser descarregadas uma vez por dia, por favor, tente novamente amanhã."
new_private_message: "Nova Mensagem"
private_message: "Mensagem"
private_messages: "Mensagens"
@@ -450,8 +473,10 @@ pt:
disable: "Desativar Notificações"
enable: "Ativar Notificações"
each_browser_note: "Nota: Tem que alterar esta configuração em todos os navegadores de internet que utiliza."
+ dismiss_notifications: "Marcar Visto Tudo"
dismiss_notifications_tooltip: "Marcar como lidas todas as notificações por ler"
- disable_jump_reply: "Não voltar para a minha mensagem após ter respondido"
+ first_notification: "A sua primeira notificação! Seleccione-a para começar."
+ disable_jump_reply: "Não voltar para a minha publicação após eu ter respondido"
dynamic_favicon: "Mostrar contagem de tópicos novos / atualizados no ícone do browser."
external_links_in_new_tab: "Abrir todas as hiperligações externas num novo separador"
enable_quoting: "Ativar resposta usando citação de texto destacado"
@@ -464,10 +489,33 @@ pt:
suspended_notice: "Este utilizador está suspenso até {{date}}."
suspended_reason: "Motivo: "
github_profile: "Github"
+ email_activity_summary: "Sumário de actividade"
+ mailing_list_mode:
+ label: "Modo de lista de distribuição"
+ enabled: "Ativar modo de lista de distribuição"
+ instructions: |
+ Esta configuração sobrepõe o sumário de actividade.
+ Tópicos e categorias silenciados não são incluídos nestes correios electrónicos.
+ daily: "Enviar actualizações diárias"
+ individual: "Enviar um email por cada nova publicação"
+ individual_no_echo: "Enviar um email por cada nova publicação excepto as minhas"
+ many_per_day: "Mandar-me um email por cada nova publicação (cerca de {{dailyEmailEstimate}} por dia)"
+ few_per_day: "Mandar-me um email por cada nova publicação (cerca de 2 por dia)"
tag_settings: "Etiquetas"
+ watched_tags: "A vigiar"
+ watched_tags_instructions: "Irá vigiar automaticamente todos os novos tópicos nestas categorias. Será notificado de todas as novas respostas e tópicos, e uma contagem de novas respostas irá aparecer junto ao tópico."
+ tracked_tags: "Seguido"
+ tracked_tags_instructions: "Irá seguir automaticamente todos os novos tópicos nestas categorias. Uma contagem de novas respostas irá aparecer junto ao tópico."
muted_tags: "Silenciado"
+ muted_tags_instructions: "Não será notificado de nada acerca de novos tópicos nestas categorias, e estes não irão aparecer nos recentes."
watched_categories: "Vigiado"
- tracked_categories: "Acompanhado"
+ watched_categories_instructions: "Irá vigiar automaticamente todos os novos tópicos nestas categorias. Será notificado de todas as novas respostas e tópicos, e uma contagem de novas respostas irá aparecer junto ao tópico."
+ tracked_categories: "Seguido"
+ tracked_categories_instructions: "Irá seguir automaticamente todos os novos tópicos nestas categorias. Uma contagem de novas respostas irá aparecer junto ao tópico."
+ watched_first_post_categories: "A Vigiar a Primeira Resposta"
+ watched_first_post_categories_instructions: "Será notificado acerca da primeira resposta em cada novo tópico nestas categorias."
+ watched_first_post_tags: "A Vigiar a Primeira Resposta"
+ watched_first_post_tags_instructions: "Será notificado acerca da primeira resposta em cada novo tópico nestas categorias."
muted_categories: "Silenciado"
muted_categories_instructions: "Não será notificado de nada acerca de novos tópicos nestas categorias, e estes não irão aparecer nos recentes."
delete_account: "Eliminar A Minha Conta"
@@ -477,14 +525,19 @@ pt:
unread_message_count: "Mensagens"
admin_delete: "Apagar"
users: "Utilizadores"
- muted_users: "Mudo"
+ muted_users: "Silenciado"
muted_users_instructions: "Suprimir todas as notificações destes utilizadores."
- muted_topics_link: "Mostrar tópicos mudos"
+ muted_topics_link: "Mostrar tópicos silenciados"
+ watched_topics_link: "Mostrar tópicos vigiados"
automatically_unpin_topics: "Desafixar tópicos automaticamente quando eu chegar ao final."
+ apps: "Aplicações"
+ revoke_access: "Rescindir Acesso"
+ undo_revoke_access: "Cancelar Rescissão de Acesso"
+ api_approved: "Aprovado:"
staff_counters:
- flags_given: "sinalizações úteis"
- flagged_posts: "mensagens sinalizadas"
- deleted_posts: "mensagens eliminadas"
+ flags_given: "denúncias úteis"
+ flagged_posts: "publicações denunciadas"
+ deleted_posts: "publicações eliminadas"
suspensions: "suspensões"
warnings_received: "avisos"
messages:
@@ -509,6 +562,7 @@ pt:
error: "Ocorreu um erro ao modificar este valor."
change_username:
title: "Alterar Nome de Utilizador"
+ confirm: "Se mudar o seu nome de utilizador, todas as citações das suas publicações e menções @nome serão quebradas. Tem a certeza absoluta de que o quer fazer?"
taken: "Pedimos desculpa, esse nome de utilizador já está a ser utilizado."
error: "Ocorreu um erro ao alterar o seu nome de utilizador."
invalid: "Esse nome de utilizador é inválido. Deve conter apenas números e letras."
@@ -568,23 +622,24 @@ pt:
title: "Idioma da Interface"
instructions: "Idioma da interface de utilizador. Será alterado quando atualizar a página."
default: "(pré-definido)"
+ any: "qualquer"
password_confirmation:
title: "Palavra-passe Novamente"
last_posted: "Última Publicação"
last_emailed: "Último Email"
last_seen: "Visto"
created: "Juntou-se"
- log_out: "Terminar sessão"
+ log_out: "Sair"
location: "Localização"
card_badge:
- title: "Medalha de cartão de utilizador"
+ title: "Distintivo de Cartão de Utilizador"
website: "Sítio da Internet"
email_settings: "Email"
like_notification_frequency:
title: "Notificar quando alguém gostar"
always: "Sempre"
- first_time_and_daily: "Na primeira vez que mensagem é gostada e diariamente"
- first_time: "A primeira vez que uma mensagem é gostada."
+ first_time_and_daily: "Na primeira vez que a publicação é gostada e diariamente"
+ first_time: "A primeira vez que uma publicação é gostada."
never: "Nunca"
email_previous_replies:
title: "Incluir respostas prévias no fundo do email."
@@ -592,14 +647,16 @@ pt:
always: "sempre"
never: "nunca"
email_digests:
+ title: "Quando eu não vier aqui, mandar-me um email de resumo de tópicos e respostas populares."
every_30_minutes: "a cada 30 minutos"
every_hour: "A cada hora"
daily: "diariamente"
every_three_days: "a cada três dias"
weekly: "semanalmente"
every_two_weeks: "a cada duas semanas"
- email_in_reply_to: "Incluir um excerto do mensagem respondida nos emails"
- email_direct: "Enviar-me um email quando alguém me citar, responder às minhas mensagens, mencionar o meu @nomedeutilizador, ou convidar-me para um tópico"
+ include_tl0_in_digests: "Incluir conteúdo de novos utilizadores nos emails de resumo"
+ email_in_reply_to: "Incluir um excerto da publicação respondida nos emails"
+ email_direct: "Enviar-me um email quando alguém me citar, responder às minhas publicações, mencionar o meu @nome-de-utilizador, ou convidar-me para um tópico"
email_private_messages: "Enviar-me um email quando alguém me envia uma mensagem"
email_always: "Enviar-me notificações de email mesmo quando estou ativo no sítio"
other_settings: "Outros"
@@ -612,7 +669,7 @@ pt:
after_2_days: "criado nos últimos 2 dias"
after_1_week: "criado na última semana"
after_2_weeks: "criado nas últimas 2 semanas"
- auto_track_topics: "Acompanhar automaticamente os tópicos em que eu entro"
+ auto_track_topics: "Seguir automaticamente os tópicos em que eu entro"
auto_track_options:
never: "nunca"
immediately: "imediatamente"
@@ -623,6 +680,7 @@ pt:
after_4_minutes: "após 4 minutos"
after_5_minutes: "após 5 minutos"
after_10_minutes: "após 10 minutos"
+ notification_level_when_replying: "Quando eu respondo num tópico, por esse tópico como"
invited:
search: "digite para procurar convites..."
title: "Convites"
@@ -640,24 +698,25 @@ pt:
pending_tab: "Pendente"
pending_tab_with_count: "Pendentes ({{count}})"
topics_entered: "Tópicos Visualizados"
- posts_read_count: "Mensagens Lidas"
+ posts_read_count: "Publicações Lidas"
expired: "Este convite expirou."
rescind: "Remover"
rescinded: "Convite Removido"
reinvite: "Reenviar convite"
+ reinvite_all: "Reenviar todos os Convites"
reinvited: "Convite reenviado"
+ reinvited_all: "Todos os Convites reenviados!"
time_read: "Tempo de Leitura"
days_visited: "Dias Visitados"
account_age_days: "Idade da conta, em dias"
create: "Enviar um Convite"
- generate_link: "Copiar Hiperligação do Convite"
- generated_link_message: '
Hiperligação do Convite gerada corretamente!
A hiperligação do convite é válida apenas para este endereço de email: %{invitedEmail}
' + generate_link: "Copiar Ligação do Convite" + link_generated: "Ligação de convite gerada com sucesso!" + valid_for: "Ligação de convite é válida apenas para este endereço de email: %{email}" bulk_invite: - none: "Ainda não convidou ninguém. Pode enviar convites individuais, ou convidar um grupo de pessoas de uma única vez carregando um ficheiro com convites em massa." + none: "Ainda não convidou ninguém. Pode enviar convites individuais, ou convidar um grupo de pessoas de uma única vez carregando um ficheiro CSV." text: "Convite em massa a partir de ficheiro" - uploading: "A carregar…" success: "Ficheiro carregado corretamente, será notificado via mensagem assim que o processo esteja concluído." - error: "Erro de carregamento '{{filename}}': {{message}}" password: title: "Palavra-passe" too_short: "A sua palavra-passe é muito curta." @@ -674,8 +733,8 @@ pt: one: "Tópico criado" other: "Tópicos criados" post_count: - one: "mensagem criada" - other: "mensagens criadas" + one: "publicação criada" + other: "publicações criadas" likes_given: one: " dado" other: " dados" @@ -686,23 +745,25 @@ pt: one: "dia visitado" other: "dias visitados" posts_read: - one: "mensagem lida" - other: "mensagens lidas" + one: "publicação lida" + other: "publicações lidas" bookmark_count: one: "marcador" other: "marcadores" - top_replies: "Respostas" + top_replies: "Respostas de Topo" no_replies: "Nenhuma resposta ainda." more_replies: "Mais Respostas" top_topics: "Melhores Tópicos" no_topics: "Nenhum tópico ainda." more_topics: "Mais Tópicos" - top_badges: "Melhores Medalhas" - no_badges: "Nenhuma medalha ainda." - more_badges: "Mais Medalhas" + top_badges: "Melhores Distintivos" + no_badges: "Nenhuma distintivo ainda." + more_badges: "Mais Distintivos" top_links: "Melhores hiperligações" - no_links: "Não há nenhuma hiperligação ainda." + no_links: "Não há nenhuma ligação ainda." most_liked_by: "Por mais apreciados" + most_liked_users: "Mais Gostados" + most_replied_to_users: "Mais Respondidos" no_likes: "Nenhum gostos ainda." associated_accounts: "Contas associadas" ip_address: @@ -749,14 +810,18 @@ pt: enabled: "Este sítio encontra-se no modo só de leitura. Por favor continue a navegar mas responder, dar gostos e outras acções estão de momento desativadas." login_disabled: "A função de início de sessão está desativada enquanto o sítio se encontrar no modo só de leitura." logout_disabled: "A função de término de sessão está desativada enquanto o sítio se encontrar no modo só de leitura." - too_few_topics_and_posts_notice: "Vamos começar esta discussão! Atualmente existem %{currentTopics} / %{requiredTopics} tópicos e %{currentPosts} / %{requiredPosts} mensagens. Novos visitantes precisam de conversações para ler e responder a." + too_few_topics_and_posts_notice: "Vamos começar esta discussão! Atualmente existem %{currentTopics} / %{requiredTopics} tópicos e %{currentPosts} / %{requiredPosts} respostas. Novos visitantes precisam de conversações para ler e a que responder." too_few_topics_notice: "Vamos começar esta discussão! Atualmente existem %{currentTopics} / %{requiredTopics} tópios. Novos visitantes precisam de algumas conversações para ler e responder a." - too_few_posts_notice: "Vamos começar esta discussão! Atualmente existem %{currentPosts} / %{requiredPosts} mensagens. Novos visitantes precisam de algumas conversações para ler e responder a." + too_few_posts_notice: "Vamos começar esta discussão! Atualmente existem %{currentPosts} / %{requiredPosts} respostas. Novos visitantes precisam de algumas conversações para ler e a que responder." logs_error_rate_notice: + reached: "%{relativeAge} – %{rate} atingiu o limite definido nas configurações do site de %{siteSettingRate}." + exceeded: "%{relativeAge} – %{rate} excede o limite definido nas configurações do site de %{siteSettingRate}." rate: one: "1 erro/%{duration}" other: "%{count} erros/%{duration}" learn_more: "saber mais..." + all_time: 'total' + all_time_desc: 'total de tópicos criados' year: 'ano' year_desc: 'tópicos criados nos últimos 365 dias' month: 'mês' @@ -764,10 +829,10 @@ pt: week: 'semana' week_desc: 'tópicos criados nos últimos 7 dias' day: 'dia' - first_post: Primeira mensagem + first_post: Primeira publicação mute: Silenciar - unmute: Reativar - last_post: Última mensagem + unmute: Desactivar silenciamento + last_post: Última publicação last_reply_lowercase: última resposta replies_lowercase: one: resposta @@ -778,22 +843,23 @@ pt: hide_forever: "não obrigado" hidden_for_session: "OK, Irei perguntar-lhe amanhã. Pode sempre usar 'Iniciar Sessão' para criar uma conta, também." intro: "Olá! :heart_eyes: Parece que está a gostar da discussão, mas não está inscrito para uma conta." - value_prop: "Quando cria uma conta, nós lembramo-nos exatamente do que leu, por isso volta sempre ao sítio onde ficou. Também recebe notificações, aqui ou por email, sempre que novas mensagens são feitas. E pode gostar de mensagens para partilhar o amor. :heartbeat:" + value_prop: "Quando cria uma conta, nós lembramo-nos exatamente do que leu, por isso volta sempre ao sítio onde ficou. Também recebe notificações, aqui ou por email, sempre que novas publicações são feitas. E pode gostar de publicações para partilhar o amor. :heartbeat:" summary: - enabled_description: "Está a ver um resumo deste tópico: as mensagens mais interessantes são determinados pela comunidade." + enabled_description: "Está a ver um resumo deste tópico: as respostas mais interessantes são determinadas pela comunidade." description: "Existem {{replyCount}} respostas." description_time: "Existem {{replyCount}} respostas com um tempo de leitura estimado de {{readingTime}} minutos." enable: 'Resumir Este Tópico' - disable: 'Mostrar Todas As Mensagens' + disable: 'Mostrar Todas As Respostas' deleted_filter: - enabled_description: "Este tópico contém mensagens eliminadas, as quais foram ocultas." - disabled_description: "Mensagens eliminadas no tópico são exibidas." - enable: "Ocultar mensagens eliminadas" - disable: "Exibir mensagens eliminadas" + enabled_description: "Este tópico contém respostas eliminadas, que foram ocultadas." + disabled_description: "Respostas eliminadas no tópico são exibidas." + enable: "Ocultar Respostas Eliminadas" + disable: "Exibir Respostas Eliminadas" private_message_info: title: "Mensagem" invite: "Convidar Outros..." remove_allowed_user: "Deseja mesmo remover {{name}} desta mensagem?" + remove_allowed_group: "Deseja mesmo remover {{name}} desta mensagem?" email: 'Email' username: 'Nome de utilizador' last_seen: 'Visto' @@ -802,8 +868,9 @@ pt: trust_level: 'Nível de Confiança' search_hint: 'nome de utilizador, email ou endereço de IP' create_account: + disclaimer: "Ao registrar-se, aceita a política de privacidade e os termos de serviço." title: "Criar Nova Conta" - failed: "Ocorreu um erro, talvez este email já esteja registado, tente usar a hiperligação \"Esqueci-me da Palavra-passe\"." + failed: "Ocorreu um erro, talvez este email já esteja registado, tente usar a ligação \"Esqueci-me da Palavra-passe\"." forgot_password: title: "Repor Palavra-Passe" action: "Esqueci-me da minha palavra-passe" @@ -828,7 +895,7 @@ pt: logging_in: "A iniciar sessão..." or: "Ou" authenticating: "A autenticar..." - awaiting_confirmation: "A sua conta está a aguardar ativação. Utilize a hiperligação \"Esqueci a Palavra-passe\" para pedir um novo email de ativação." + awaiting_confirmation: "A sua conta está a aguardar ativação. Utilize a ligação \"Esqueci a Palavra-passe\" para pedir um novo email de ativação." awaiting_approval: "A sua conta ainda não foi aprovada por um membro do pessoal. Receberá um email quando a sua conta for aprovada." requires_invite: "Pedimos desculpa, o acesso a este fórum é permitido somente por convite de outro membro." not_activated: "Ainda não pode iniciar sessão. Enviámos anteriormente um email de ativação para o endereço {{sentTo}}. Por favor siga as instruções contidas nesse email para ativar a sua conta." @@ -860,6 +927,16 @@ pt: github: title: "com GitHub" message: "A autenticar com GitHub (certifique-se de que os bloqueadores de popup estão desativados)" + emoji_set: + apple_international: "Apple/International" + google: "Google" + twitter: "Twitter" + emoji_one: "Emoji One" + win10: "Win10" + category_page_style: + categories_only: "Apenas Categorias" + categories_with_featured_topics: "Categorias com Tópicos Destacados" + categories_and_latest_topics: "Categorias e Tópicos Recentes" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' @@ -869,20 +946,29 @@ pt: more_emoji: "mais..." options: "Opções" whisper: "susurro" + unlist: "não listado" add_warning: "Este é um aviso oficial." toggle_whisper: "Alternar Sussuro" + toggle_unlisted: "Alternar Não Listado" posting_not_on_topic: "A que tópico quer responder?" saving_draft_tip: "a guardar..." saved_draft_tip: "guardado" saved_local_draft_tip: "guardado localmente" similar_topics: "O seu tópico é similar a..." drafts_offline: "rascunhos offline" + group_mentioned: + one: "Ao usar {{group}}, estará a notificar 1 pessoa – tem a certeza?" + other: "Ao usar {{group}}, estará a notificar {{count}} pessoas – tem a certeza?" + cannot_see_mention: + category: "Mencionou {{username}} mas este não será notificado porque não têm acesso a esta categoria. Terá de os adicionar a um grupo que tenho acesso a esta categoria." + private: "Mencionou {{username}} mas estes não serão notificados porque não conseguem ver esta mensagem privada. Terá de os convidar para esta MP." + duplicate_link: "Parce que a tua ligação a {{domain}} já foi publicada neste tópico por @{{username}} nesta resposta {{ago}} – tens a certeza de que a queres publicar outra vez?" error: title_missing: "O título é obrigatório" title_too_short: "O título tem que ter pelo menos {{min}} caracteres." title_too_long: "O tíítulo não pode conter mais do que {{max}} caracteres." - post_missing: "A mensagem não pode estar vazia" - post_length: "A mensagem tem que ter pelo menos {{min}} caracteres." + post_missing: "A publicação não pode estar vazia" + post_length: "A publicação tem que ter pelo menos {{min}} caracteres" try_like: 'Já tentou o botão ?' category_missing: "Tem que escolher uma categoria" save_edit: "Guardar alterações" @@ -897,33 +983,38 @@ pt: title_placeholder: "Numa breve frase, de que se trata esta discussão?" edit_reason_placeholder: "Porque está a editar?" show_edit_reason: "(adicione a razão para a edição)" + topic_featured_link_placeholder: "Inserir ligação mostrada com o título." reply_placeholder: "Digite aqui. Utilize Markdown, BBCode, ou HTML para formatar. Arraste ou cole imagens." - view_new_post: "Ver a sua nova mensagem." + view_new_post: "Ver a sua nova publicação" saving: "A Guardar" saved: "Guardado!" - saved_draft: "Rascunho da mensagem em progresso. Selecione para continuar." + saved_draft: "Rascunho da publicação em progresso. Selecione para continuar." uploading: "A carregar…" show_preview: 'mostrar pré-visualização »' hide_preview: '« esconder pré-visualização' - quote_post_title: "Citar mensagem inteira" + quote_post_title: "Citar publicação inteira" + bold_label: "B" bold_title: "Negrito" bold_text: "texto em negrito" + italic_label: "I" italic_title: "Itálico" italic_text: "texto em itálico" link_title: "Hiperligação" - link_description: "digite a descrição da hiperligação aqui" - link_dialog_title: "Inserir Hiperligação" + link_description: "digite a descrição da ligação aqui" + link_dialog_title: "Inserir Ligação" link_optional_text: "título opcional" link_url_placeholder: "http://example.com" quote_title: "Bloco de Citação" quote_text: "Bloco de Citação" code_title: "Texto pré-formatado" code_text: "identar texto pré-formatado até 4 espaços" + paste_code_text: "escreva ou cole código aqui" upload_title: "Carregar" upload_description: "digite aqui a descrição do ficheiro carregado" olist_title: "Lista numerada" ulist_title: "Lista de items" list_item: "Item da Lista" + heading_label: "H" heading_title: "Título" heading_text: "Título" hr_title: "Barra horizontal" @@ -932,11 +1023,14 @@ pt: modal_ok: "OK" modal_cancel: "Cancelar" cant_send_pm: "Desculpe, não pode enviar uma mensagem para %{username}." + yourself_confirm: + title: "Esqueceu-se de adicionar destinatários?" + body: "Neste momento esta mensagem está a ser enviada a você apenas!" admin_options_title: "Configurações opcionais do pessoal para este tópico" auto_close: label: "Tempo de fecho automático do tópico:" error: "Por favor introduza um valor válido." - based_on_last_post: "Não feche até que a última mensagem do tópico tenha pelo menos este tempo." + based_on_last_post: "Não fechar até que a última resposta no tópico tenha pelo menos esta idade." all: examples: 'Insira o número de horas (24), tempo absoluto (17:30) ou um selo temporal (2013-11-22 14:00).' limited: @@ -945,13 +1039,14 @@ pt: notifications: title: "notificações de menções de @nome, respostas às suas publicações e tópicos, mensagens, etc" none: "Impossível de carregar as notificações neste momento." + empty: "Nenhumas notificações encontradas." more: "ver notificações antigas" - total_flagged: "total de mensagens sinalizadas" + total_flagged: "total de publicações denunciadas" mentioned: "
{{username}} {{description}}
" group_mentioned: "
{{username}} {{description}}
" quoted: "
{{username}} {{description}}
" replied: "
{{username}} {{description}}
" - posted: "
{{username}} {{description}}
" + posted: "
{{username}} {{description}}
" edited: "
{{username}} {{description}}
" liked: "
{{username}} {{description}}
" liked_2: "
{{username}}, {{username2}} {{description}}
" @@ -962,8 +1057,10 @@ pt: invited_to_private_message: "
{{username}} {{description}}
" invited_to_topic: "
{{username}} {{description}}
" invitee_accepted: "
{{username}} aceitou o seu convite
" - moved_post: "
{{username}} moveu {{description}}
" - granted_badge: "
Ganhou '{{description}}'
" + moved_post: "
{{username}} moveu {{description}}
" + linked: "
{{username}} {{description}}
" + granted_badge: "
Ganhou '{{description}}'
" + watching_first_post: "
Novo Tópico {{description}}
" group_message_summary: one: "
{{count}} mensagem na caixa de entrada do seu grupo {{group_name}}
" other: "
{{count}} mensagens na caixa de entrada do seu grupo {{group_name}}
" @@ -972,14 +1069,14 @@ pt: quoted: "Citado por" replied: "Respondido" posted: "Publicado por" - edited: "Edição da sua mensagem por" - liked: "Gostou da sua mensagem" + edited: "Edição da sua publicação por" + liked: "Gostou da sua publicação" private_message: "Mensagem privada de" invited_to_private_message: "Convidado para uma mensagem privada de" invited_to_topic: "Convidado para um tópico de" invitee_accepted: "Convite aceite por" - moved_post: "A sua mensagem foi movida por" - linked: "Hiperligação para a sua mensagem" + moved_post: "A sua publicação foi movida por" + linked: "Ligação para a sua publicação" granted_badge: "Distintivo concedido" group_message_summary: "Mensagens na caixa de entrada do seu grupo" popup: @@ -989,58 +1086,100 @@ pt: replied: '{{username}} respondeu-lhe em "{{topic}}" - {{site_title}}' posted: '{{username}} publicou em "{{topic}}" - {{site_title}}' private_message: '{{username}} enviou-lhe uma mensagem privada em "{{topic}}" - {{site_title}}' - linked: '{{username}} ligou-se à sua mensagem a partir de "{{topic}}" - {{site_title}}' + linked: '{{username}} ligou à sua publicação de "{{topic}}" - {{site_title}}' upload_selector: title: "Adicionar uma imagem" title_with_attachments: "Adicionar uma imagem ou um ficheiro" from_my_computer: "Do meu dispositivo " from_the_web: "Da internet" - remote_tip: "hiperligação para imagem" - remote_tip_with_attachments: "hiperligação para imagem ou ficheiro {{authorized_extensions}}" + remote_tip: "ligação para imagem" + remote_tip_with_attachments: "ligação para imagem ou ficheiro {{authorized_extensions}}" local_tip: "selecionar imagens do seu dispositivo" local_tip_with_attachments: "selecionar imagens ou ficheiros a partir do seu dispositivo {{authorized_extensions}}" hint: "(pode também arrastar o ficheiro para o editor para fazer o carregamento)" hint_for_supported_browsers: "pode também arrastar e largar ou colar imagens no editor" uploading: "A carregar" select_file: "Selecionar Ficheiro" - image_link: "hiperligação da imagem irá apontar para" + image_link: "ligação da imagem irá apontar para" search: sort_by: "Ordenar por" relevance: "Relevância" - latest_post: "Última Mensagem" + latest_post: "Publicação Mais Recente" most_viewed: "Mais Visto" most_liked: "Mais Gostos" select_all: "Selecionar Tudo" - clear_all: "Limpar Tudo" + clear_all: "Remover Tudo" + too_short: "O seu termo de pesquisa é demasiado curto." result_count: one: "1 resultado para \"{{term}}\"" other: "{{count}} resultados para \"{{term}}\"" - title: "pesquisar tópicos, mensagens, utilizadores, ou categorias" + title: "pesquisar tópicos, publicações, utilizadores, ou categorias" no_results: "Não foi encontrado nenhum resultado." no_more_results: "Mais nenhum resultado encontrado." - search_help: Procurar ajuda searching: "A procurar..." - post_format: "#{{post_number}} de {{username}}" + post_format: "#{{post_number}} por {{username}}" context: - user: "Procurar mensagens de @{{username}}" + user: "Procurar publicações por @{{username}}" + category: "Pesquise na categoria #{{category}}" topic: "Pesquisar este tópico" private_messages: "Pesquisar mensagens" + advanced: + title: Pesquisa Avançada + posted_by: + label: Publicado por + in_category: + label: Na Categoria + in_group: + label: No Grupo + with_badge: + label: Com Distintivo + with_tags: + label: Com Etiquetas + filters: + label: Apenas devolver tópicos/respostas que... + likes: eu gostei + posted: Eu publiquei em + watching: estou a vigiar + tracking: estou a seguir + private: estão nas minhas mensagens + bookmarks: eu adicionei marcadores + first: são a primeira publicação + pinned: estão afixados + unpinned: não estão afixados + wiki: são wiki + statuses: + label: Aonde tópicos + open: estão abertos + closed: estão fechados + archived: estão arquivados + noreplies: têm zero respostas + single_user: contêm um único utilizador + post: + count: + label: Número Mínimo de Publicações + time: + label: Publicado + before: antes + after: depois hamburger_menu: "ir para outra lista de tópicos ou categorias" new_item: "novo" go_back: 'voltar atrás' not_logged_in_user: 'página de utilizador com resumo da atividade atual e preferências ' current_user: 'ir para a sua página de utilizador' topics: + new_messages_marker: "última visita" bulk: + select_all: "Selecionar Tudo" + clear_all: "Remover Tudo" unlist_topics: "Remover Tópicos da Lista" reset_read: "Repor Leitura" delete: "Eliminar Tópicos" - dismiss: "Destituir" - dismiss_read: "Destituir todos os não lidos" - dismiss_button: "Destituir..." - dismiss_tooltip: "Destituir apenas novas mensagens ou parar o acompanhamento de tópicos" - also_dismiss_topics: "Parar de acompanhar estes tópicos para que estes nunca me apareçam como não lidos novamente" - dismiss_new: "Destituir Novo" + dismiss: "Marcar Visto" + dismiss_read: "Marcar todos os não lidos como vistos" + dismiss_button: "Marcar visto..." + dismiss_tooltip: "Marcar como vistas apenas novas publicações ou parar de seguir tópicos" + also_dismiss_topics: "Parar de seguir estes tópicos para que estes nunca me apareçam como não lidos novamente" + dismiss_new: "Marcar Visto Novos" toggle: "ativar seleção em massa de tópicos" actions: "Ações em Massa" change_category: "Mudar Categoria" @@ -1058,7 +1197,7 @@ pt: unread: "Tem tópicos não lidos." new: "Não tem novos tópicos." read: "Ainda não leu nenhum tópico." - posted: "Ainda não publicou nenhum tópico." + posted: "Ainda não publicou em nenhum tópico." latest: "Não há tópicos recentes." hot: "Não há tópicos quentes." bookmarks: "Ainda não marcou nenhum tópico." @@ -1067,7 +1206,7 @@ pt: search: "Não há resultados na pesquisa." educate: new: '
Os seus novos tópicos aparecem aqui.
Por defeito, os tópicos são considerados novos e mostrarão o indicador novo caso tenham sido criados nos últimos 2 dias.
Pode alterar isto nas suas preferências.
' - unread: '
Os seus tópicos não lidos aparecem aqui.
Por defeito, os tópicos são considerados não lidos e aparecem nas contagens de não lidos 1 Se:</p>
Ou, se definiu explicitamente o tópico para acompanhar ou vigiar através do controlo de notificações que se encontra na parte inferior de cada tópico.
Visite as preferências para alterar isto.
' + unread: '
As suas publicações não lidas aparecem aqui.
Por defeito, tópicos são considerados não lidos e mostrarão contadores de não lidos 1 se você:
Ou marcou explicitamente o tópico como Seguido ou Vigiado via o controle de notificações no fundo de cada tópico.
Visite as suas preferências para mudar isto.
'
bottom:
latest: "Não existem mais tópicos recentes."
hot: "Não existem mais tópicos quentes."
@@ -1083,7 +1222,9 @@ pt:
unsubscribe:
stop_notifications: "Irá passar a receber menos notificações para {{title}}"
change_notification_state: "O seu estado de notificação atual é"
- filter_to: "{{post_count}} mensagens no tópico"
+ filter_to:
+ one: "1 publicação no tópico"
+ other: "{{count}} publicações no tópico"
create: 'Novo Tópico'
create_long: 'Criar um novo Tópico'
private_message: 'Iniciar uma mensagem'
@@ -1114,14 +1255,14 @@ pt:
title: "Tópico não encontrado"
description: "Pedimos desculpa, não foi possível encontrar esse tópico. Talvez tenha sido removido por um moderador?"
total_unread_posts:
- one: "tem 1 mensagem não lido neste tópico"
- other: "tem {{count}} mensagens não lidas neste tópico"
+ one: "tem 1 publicação não lida neste tópico"
+ other: "tem {{count}} publicações não lidas neste tópico"
unread_posts:
- one: "tem 1 mensagem antiga não lida neste tópico"
- other: "tem {{count}} mensagens antigas não lidas neste tópico"
+ one: "tem 1 publicação antiga não lida neste tópico"
+ other: "tem {{count}} publicações antigas não lidas neste tópico"
new_posts:
- one: "existe 1 nova mensagem neste tópico desde a sua última leitura"
- other: "existem {{count}} novas mensagens neste tópico desde a sua última leitura"
+ one: "existe 1 nova publicação neste tópico desde a sua última leitura"
+ other: "existem {{count}} novas publicações neste tópico desde a sua última leitura"
likes:
one: "existe 1 gosto neste tópico"
other: "existem {{count}} gostos neste tópico"
@@ -1143,27 +1284,37 @@ pt:
auto_close_title: 'Configurações para Fechar Automaticamente'
auto_close_save: "Guardar"
auto_close_remove: "Não Fechar Este Tópico Automaticamente"
- auto_close_immediate: "A última mensagem neste tópico já tem %{hours} horas, por isso o tópico será fechado imediatamente."
+ auto_close_immediate:
+ one: "A última publicação neste tópico já tem 1 hora, por isso o tópico será fechado imediatamente."
+ other: "A última publicação neste tópico já tem %{count} horas, por isso o tópico será fechado imediatamente."
+ timeline:
+ back: "Retroceder"
+ back_description: "Voltar à última publicação não lida"
+ replies_short: "%{current} / %{total}"
progress:
title: progresso do tópico
go_top: "topo"
go_bottom: "fim"
go: "ir"
- jump_bottom: "saltar para a última mensagem"
- jump_bottom_with_number: "avançar para a mensagem %{post_number}"
- total: total de mensagens
- current: mensagem atual
- position: "mensagem %{current} de %{total}"
+ jump_bottom: "ir para a última publicação"
+ jump_prompt: "ir para publicação"
+ jump_prompt_long: "Para que publicação gostaria de ir?"
+ jump_bottom_with_number: "ir para a publicação %{post_number}"
+ total: total de publicações
+ current: publicação atual
notifications:
+ title: mudar quão frequentemente é notificado sobre este tópico
reasons:
+ mailing_list_mode: "Tem o modo de lista de distribuição activado, por isso será notificado de respostas a este tópico por email."
+ '3_10': 'Receberá notificações porque está a vigiar uma etiqueta neste tópico.'
'3_6': 'Receberá notificações porque está a vigiar esta categoria.'
'3_5': 'Receberá notificações porque começou a vigiar automaticamente este tópico.'
'3_2': 'Receberá notificações porque está a vigiar este tópico.'
'3_1': 'Receberá notificações porque criou este tópico.'
'3': 'Receberá notificações porque está a vigiar este tópico.'
- '2_8': 'Receberá notificações porque está a acompanhar esta categoria.'
+ '2_8': 'Receberá notificações porque está a seguir esta categoria.'
'2_4': 'Receberá notificações porque publicou uma resposta a este tópico.'
- '2_2': 'Receberá notificações porque está a acompanhar este tópico.'
+ '2_2': 'Receberá notificações porque está a seguir este tópico.'
'2': 'Receberá notificações porque leu este tópico.'
'1_2': 'Será notificado se alguém mencionar o seu @nome ou responder-lhe.'
'1': 'Será notificado se alguém mencionar o seu @nome ou responder-lhe.'
@@ -1177,10 +1328,10 @@ pt:
title: "A vigiar"
description: "Será notificado de cada nova resposta neste tópico, e uma contagem de novas respostas será exibida."
tracking_pm:
- title: "Acompanhar"
+ title: "A Seguir"
description: "Uma contagem de novas respostas será exibida para esta mensagem. Será notificado se alguém mencionar o seu @nome ou responder-lhe."
tracking:
- title: "Acompanhar"
+ title: "A Seguir"
description: "Uma contagem de novas respostas será exibida para este tópico. Será notificado se alguém mencionar o seu @nome ou responder-lhe."
regular:
title: "Habitual"
@@ -1199,7 +1350,7 @@ pt:
delete: "Eliminar Tópico"
open: "Abrir Tópico"
close: "Fechar Tópico"
- multi_select: "Selecionar Mensagens..."
+ multi_select: "Selecionar Publicações..."
auto_close: "Fechar Automaticamente..."
pin: "Fixar Tópico..."
unpin: "Desafixar Tópico..."
@@ -1224,11 +1375,14 @@ pt:
help: "Remover destaque deste tópico para que o mesmo deixe de aparecer no topo da sua lista de tópicos"
share:
title: 'Partilhar'
- help: 'Partilhar uma hiperligação para este tópico'
+ help: 'Partilhar uma ligação para este tópico'
+ print:
+ title: 'Imprimir'
+ help: 'Abrir uma versão para impressão deste tópico'
flag_topic:
- title: 'Sinalizar'
- help: 'sinalizar privadamente este tópico para consideração ou enviar uma notificação privada sobre o mesmo'
- success_message: 'Sinalizou este tópico com sucesso.'
+ title: 'Denunciar'
+ help: 'denunciar privadamente este tópico para consideração ou enviar uma notificação privada sobre o mesmo'
+ success_message: 'Denunciou este tópico com sucesso.'
feature_topic:
title: "Destacar este tópico"
pin: "Fazer este tópico aparecer no topo da categoria {{categoryLink}} até"
@@ -1239,8 +1393,8 @@ pt:
pin_validation: "É necessária uma data para fixar este tópico."
not_pinned: "Não há tópicos fixados em {{categoryLink}}."
already_pinned:
- one: "Tópicos atualmente fixados em {{categoryLink}}: 1"
- other: "Tópicos atualmente fixados em {{categoryLink}}: {{count}}"
+ one: "Tópicos atualmente afixados em {{categoryLink}}: 1"
+ other: "Tópicos atualmente afixados em {{categoryLink}}: {{count}}"
pin_globally: "Fazer com que este tópico apareça no topo da lista de todos os tópicos até"
confirm_pin_globally: "Já tem {{count}} tópicos fixados globalmente. Demasiados tópicos fixados podem ser um fardo para utilizadores novos e anónimos. Tem a certeza que deseja fixar outro tópico globalmente?"
unpin_globally: "Remover este tópico do topo de todas as listas de tópicos."
@@ -1248,20 +1402,22 @@ pt:
global_pin_note: "Os utilizadores podem desafixar individualmente o tópico por si próprios."
not_pinned_globally: "Não existem tópicos fixados globalmente."
already_pinned_globally:
- one: "Tópicos atualmente fixados globalmente: 1"
- other: "Tópicos atualmente fixados globalmente: {{count}}"
+ one: "Tópicos atualmente afixados globalmente: 1"
+ other: "Tópicos atualmente afixados globalmente: {{count}}"
make_banner: "Tornar este tópico numa faixa que apareça no topo de todas as páginas."
remove_banner: "Remover a faixa que aparece no topo de todas as páginas."
- banner_note: "Os utilizadores podem destituir a faixa ao fecharem-na. Apenas um tópico pode ser considerado uma faixa em qualquer momento."
+ banner_note: "Os utilizadores podem marcar vista a faixa por fecharem-na. Apenas um tópico pode ser posto como faixa em qualquer momento."
no_banner_exists: "Não existe tópico de faixa."
banner_exists: "Existe atualmente um tópico de faixa."
inviting: "A Convidar..."
+ automatically_add_to_groups: "Este convite também inclui acesso a estes grupos:"
invite_private:
title: 'Convidar para Mensagem'
email_or_username: "Email ou Nome de Utilizador do Convidado"
email_or_username_placeholder: "endereço de email ou nome de utilizador"
action: "Convidar"
success: "Convidámos esse utilizador para participar nesta mensagem."
+ success_group: "Convidámos esse grupo para participar nesta mensagem."
error: "Pedimos desculpa, ocorreu um erro ao convidar esse utilizador."
group_name: "nome do grupo"
controls: "Controlos de Tópico"
@@ -1270,12 +1426,12 @@ pt:
username_placeholder: "nome de utilizador"
action: 'Enviar Convite'
help: 'convidar outros para este tópico via email ou notificações'
- to_forum: "Enviaremos um breve email que permitirá ao seu amigo juntar-se imediatamente clicando numa hiperligação, não sendo necessário ter sessão iniciada."
+ to_forum: "Enviaremos um breve email que permitirá ao seu amigo juntar-se imediatamente clicando numa ligação, não sendo necessário ter sessão iniciada."
sso_enabled: "Introduza o nome de utilizador da pessoa que gostaria de convidar para este tópico."
to_topic_blank: "Introduza o nome de utilizador ou endereço de email da pessoa que gostaria de convidar para este tópico."
to_topic_email: "Introduziu um endereço de email. Iremos enviar um email com um convite que permite aos seus amigos responderem a este tópico imediatamente."
- to_topic_username: "Introduziu um nome de utilizador. Iremos enviar-lhe uma notificação com uma hiperligação convidando-o para este tópico."
- to_username: "Introduza o nome de utilizador da pessoa que deseja convidar. Iremos enviar-lhe uma notificação com uma hiperligação convidando-o para este tópico."
+ to_topic_username: "Introduziu um nome de utilizador. Iremos enviar-lhe uma notificação com uma ligação convidando-o para este tópico."
+ to_username: "Introduza o nome de utilizador da pessoa que deseja convidar. Iremos enviar-lhe uma notificação com uma ligação convidando-o para este tópico."
email_placeholder: 'nome@exemplo.com'
success_email: "Enviámos por email um convite para {{emailOrUsername}}. Iremos notificá-lo quando o convite for utilizado. Verifique o separador de convites na sua página de utilizador para acompanhar os seus convites."
success_username: "Convidámos esse utilizador para participar neste tópico."
@@ -1283,40 +1439,44 @@ pt:
login_reply: 'Iniciar sessão para Responder'
filters:
n_posts:
- one: "1 mensagem"
- other: "{{count}} mensagens"
+ one: "1 publicação"
+ other: "{{count}} publicações"
cancel: "Remover filtro"
split_topic:
title: "Mover para um Novo Tópico"
action: "mover para um novo tópico"
topic_name: "Nome do Novo Tópico"
- error: "Ocorreu um erro ao mover as mensagens para um novo tópico."
+ error: "Ocorreu um erro ao mover as publicações para um novo tópico."
instructions:
- one: "Está prestes a criar um novo tópico e populá-lo com a mensagem que selecionou."
- other: "Está prestes a criar um novo tópico e populá-lo com as {{count}} mensagens que selecionou."
+ one: "Está prestes a criar um novo tópico e populá-lo com a publicação que selecionou."
+ other: "Está prestes a criar um novo tópico e populá-lo com as {{count}} publicações que selecionou."
merge_topic:
title: "Mover para Tópico Existente"
action: "mover para tópico existente"
- error: "Ocorreu um erro ao mover as mensagens para esse tópico."
+ error: "Ocorreu um erro ao mover as publicações para esse tópico."
instructions:
- one: "Por favor selecione o tópico para o qual gostaria de mover esta mensagem."
- other: "Por favor selecione o tópico para o qual gostaria de mover estas {{count}} mensagens."
+ one: "Por favor selecione o tópico para o qual gostaria de mover esta publicação."
+ other: "Por favor selecione o tópico para o qual gostaria de mover estas {{count}} publicações."
+ merge_posts:
+ title: "Juntar Publicações Selecionadas"
+ action: "juntar publicações selecionadas"
+ error: "Ocorreu um erro ao juntar os tópicos selecionados."
change_owner:
- title: "Mudar Proprietário das Mensagens"
+ title: "Mudar Dono das Publicações"
action: "mudar titularidade"
- error: "Ocorreu um erro na mudança de titularidade das mensagens."
- label: "Novo Proprietário das Mensagens"
+ error: "Ocorreu um erro na mudança de dono das publicações."
+ label: "Novo Dono das Publicações"
placeholder: "nome de utilizador do novo proprietário"
instructions:
- one: "Por favor seleccione o novo titular da mensagem de {{old_user}}."
- other: "Por favor selecione o novo titular das {{count}} mensagens de {{old_user}}."
- instructions_warn: "Note que quaisquer notificações relacionadas com esta mensagem serão transferidas retroativamente para o novo utilizador.
+
Aviso: Atualmente nenhum dado dependente da mensagem é transferido para o novo utilizador. Usar com cautela."
+ one: "Por favor seleccione o novo dono da publicação de {{old_user}}."
+ other: "Por favor selecione o novo dono das {{count}} publicações de {{old_user}}."
+ instructions_warn: "Note que quaisquer notificações relacionadas com esta publicação serão transferidas retroativamente para o novo utilizador.
Aviso: Atualmente nenhum dado dependente da publicação é transferido para o novo utilizador. Usar com cautela."
change_timestamp:
title: "Alterar Selo Temporal"
action: "alterar selo temporal"
invalid_timestamp: "O selo temporal não pode ser no futuro."
error: "Ocorreu um erro ao alterar o selo temporal do tópico."
- instructions: "Por favor selecione o novo selo temporal do tópico. Mensagens no tópico serão atualizadas para terem a mesma diferença temporal."
+ instructions: "Por favor selecione o novo selo temporal do tópico. Publicações no tópico serão atualizadas para terem a mesma diferença temporal."
multi_select:
select: 'selecionar'
selected: '({{count}}) selecionados'
@@ -1326,30 +1486,29 @@ pt:
select_all: 'selecionar tudo '
deselect_all: desmarcar tudo
description:
- one: Selecionou 1 mensagem.
- other: Selecionou {{count}} mensagens.
+ one: Selecionou 1 publicação.
+ other: Selecionou {{count}} publicações.
post:
reply: " {{replyAvatar}} {{usernameLink}}"
reply_topic: " {{link}}"
- quote_reply: "citar resposta"
+ quote_reply: "Citar"
edit: "Editar {{link}} {{replyAvatar}} {{username}}"
edit_reason: "Motivo:"
- post_number: "mensagem {{number}}"
- last_edited_on: "mensagem editada pela última vez em"
+ post_number: "publicação {{number}}"
+ last_edited_on: "publicação editada pela última vez em"
reply_as_new_topic: "Responder com novo Tópico"
- continue_discussion: "Continuar a discussão desde {{postLink}}:"
- follow_quote: "avançar para a mensagem citada"
- show_full: "Mostrar Mensagem Completa"
+ continue_discussion: "Continuar a discussão de {{postLink}}:"
+ follow_quote: "ir para a publicação citada"
+ show_full: "Mostrar Publicação Completa"
show_hidden: 'Ver conteúdo ocultado.'
deleted_by_author:
- one: "(mensagens abandonadas pelo autor serão removidas automaticamente em %{count} hora a não ser que estejam sinalizadas)"
- other: "(mensagens abandonadas pelo autor serão eliminadas automaticamente em %{count} horas a não ser que estejam sinalizadas)"
+ one: "(publicação retraída pelo autor, será removida automaticamente em %{count} hora a não ser que esteja denunciada)"
+ other: "(publicação retraída pelo autor, será eliminada automaticamente em %{count} horas a não ser que esteja denunciada)"
expand_collapse: "expandir/colapsar"
gap:
one: "ver 1 resposta oculta"
other: "ver {{count}} respostas ocultas"
- more_links: "{{count}} mais..."
- unread: "Mensagem não lida"
+ unread: "Publicação não lida"
has_replies:
one: "{{count}} Resposta"
other: "{{count}} Respostas"
@@ -1357,15 +1516,15 @@ pt:
one: "{{count}} Gosto"
other: "{{count}} Gostos"
has_likes_title:
- one: "1 pessoa gostou desta mensagem"
- other: "{{count}} pessoas gostaram desta mensagem"
- has_likes_title_only_you: "você gostou desta mensagem"
+ one: "1 pessoa gostou desta publicação"
+ other: "{{count}} pessoas gostaram desta publicação"
+ has_likes_title_only_you: "você gostou desta publicação"
has_likes_title_you:
- one: "você e 1 outra pessoa gostaram desta mensagem"
- other: "você e {{count}} outras pessoas gostaram desta mensagem"
+ one: "você e 1 outra pessoa gostaram desta publicação"
+ other: "você e {{count}} outras pessoas gostaram desta publicação"
errors:
- create: "Pedimos desculpa, ocorreu um erro ao criar a sua mensagem. Por favor, tente novamente."
- edit: "Pedimos desculpa, ocorreu um erro ao editar a sua mensagem. Por favor, tente novamente."
+ create: "Pedimos desculpa, ocorreu um erro ao criar a sua publicação. Por favor, tente novamente."
+ edit: "Pedimos desculpa, ocorreu um erro ao editar a sua publicação. Por favor, tente novamente."
upload: "Pedimos desculpa, ocorreu um erro ao carregar esse ficheiro. Por favor, tente novamente."
file_too_large: "Lamentamos mas esse ficheiro é demasiado grande (o tamanho máximo é de {{max_size_kb}}kb). Porque não carregar o seu ficheiro grande para um serviço de partilha na nuvem e depois partilhar o link?"
too_many_uploads: "Pedimos desculpa, só pode carregar um ficheiro de cada vez."
@@ -1375,36 +1534,36 @@ pt:
attachment_upload_not_allowed_for_new_user: "Pedimos desculpa, os novos utilizadores não podem carregar anexos."
attachment_download_requires_login: "Pedimos desculpa, os novos utilizadores não podem carregar anexos."
abandon:
- confirm: "Tem a certeza que deseja abandonar a sua mensagem?"
+ confirm: "Tem a certeza que deseja abandonar a sua publicação?"
no_value: "Não, manter"
yes_value: "Sim, abandonar"
- via_email: "esta mensagem chegou por email"
- via_auto_generated_email: "esta mensagem chegou via um email gerado automaticamente"
- whisper: "esta mensagem é um susurro privado para os moderadores"
+ via_email: "esta publicação chegou por email"
+ via_auto_generated_email: "esta publicação chegou via um email gerado automaticamente"
+ whisper: "esta publicação é um susurro privado para os moderadores"
wiki:
- about: "esta mensagem é uma wiki"
+ about: "esta publicação é uma wiki"
archetypes:
save: 'Guardar as Opções'
few_likes_left: "Obrigado por partilhar o amor! Restam-lhe apenas um gostos para hoje."
controls:
reply: "começar a compor uma resposta a este tópico"
like: "gostar deste tópico"
- has_liked: "gostou desta mensagem"
+ has_liked: "gostou desta publicação"
undo_like: "desfazer gosto"
- edit: "editar este tópico"
- edit_anonymous: "Pedimos desculpa, mas necessita de ter sessão iniciada para editar esta mensagem."
- flag: "sinalizar privadamente este tópico para consideração ou enviar uma notificação privada sobre o mesmo"
- delete: "eliminar esta mensagem"
- undelete: "repor esta mensagem"
- share: "partilhar uma hiperligação para esta mensagem"
+ edit: "editar esta publicação"
+ edit_anonymous: "Pedimos desculpa, mas necessita de ter sessão iniciada para editar esta publicação."
+ flag: "denunciar privadamente este tópico para moderação ou enviar uma notificação privada sobre o mesmo"
+ delete: "eliminar esta publicação"
+ undelete: "repor esta publicação"
+ share: "partilhar uma ligação a esta publicação"
more: "Mais"
delete_replies:
confirm:
- one: "Também quer eliminar a {{count}} resposta direta a esta mensagem?"
- other: "Também quer eliminar as {{count}} respostas diretas a esta mensagem?"
+ one: "Também quer eliminar a {{count}} resposta direta a esta publicação?"
+ other: "Também quer eliminar as {{count}} respostas diretas a esta publicação?"
yes_value: "Sim, eliminar as respostas também"
- no_value: "Não, somente esta mensagem"
- admin: "ações administrativas de mensagens"
+ no_value: "Não, somente esta publicação"
+ admin: "ações administrativas de publicação"
wiki: "Fazer Wiki"
unwiki: "Remover Wiki"
convert_to_moderator: "Adicionar Cor do Pessoal"
@@ -1413,97 +1572,93 @@ pt:
unhide: "Mostrar"
change_owner: "Mudar Titularidade"
actions:
- flag: 'Sinalizar'
+ flag: 'Denunciar'
defer_flags:
- one: "Diferir sinalização"
- other: "Diferir sinalizações"
- it_too:
- off_topic: "Sinalizar também"
- spam: "Sinalizar também"
- inappropriate: "Sinalizar também"
- custom_flag: "Sinalizar também"
- bookmark: "Também adicionar marcador"
- like: "Também adicionar um Gosto"
- vote: "Também adicionar um voto"
+ one: "Diferir denúncia"
+ other: "Diferir denúncias"
undo:
- off_topic: "Retirar sinalização"
- spam: "Retirar sinalização"
- inappropriate: "Retirar sinalização"
+ off_topic: "Retirar denúncia"
+ spam: "Retirar denúncia"
+ inappropriate: "Retirar denúncia"
bookmark: "Remover marcador"
like: "Retirar gosto"
vote: "Retirar voto"
people:
- off_topic: "sinalizou isto como fora de contexto"
- spam: "sinalizou isto como spam"
- inappropriate: "sinalizou isto como inapropriado"
+ off_topic: "denunciou isto como fora de contexto"
+ spam: "denunciou isto como spam"
+ inappropriate: "denunciou isto como inapropriado"
notify_moderators: "moderadores notificados"
notify_user: "enviou uma mensagem"
bookmark: "adicionou um marcador disto"
like: "gostou disto"
vote: "votou nisto"
by_you:
- off_topic: "Sinalizou isto como fora de contexto"
- spam: "Sinalizou isto como spam"
- inappropriate: "Sinalizou isto como inapropriado"
- notify_moderators: "Sinalizou isto para moderação"
+ off_topic: "Denunciou isto como fora de contexto"
+ spam: "Denunciou isto como spam"
+ inappropriate: "Denunciou isto como inapropriado"
+ notify_moderators: "Denunciou isto para moderação"
notify_user: "Enviou uma mensagem a este utilizador"
- bookmark: "Adicionou um marcador a esta mensagem"
+ bookmark: "Adicionou um marcador a esta publicação"
like: "Gostou disto"
- vote: "Votou nesta mensagem"
+ vote: "Votou nesta publicação"
by_you_and_others:
off_topic:
- one: "Para além de si, 1 pessoa sinalizou isto como fora de contexto"
- other: "Para além de si, {{count}} pessoas sinalizaram isto como fora de contexto"
+ one: "Para além de si, 1 pessoa denunciou isto como fora de contexto"
+ other: "Para além de si, {{count}} pessoas denunciaram isto como fora de contexto"
spam:
- one: "Para além de si, 1 pessoa sinalizou isto como spam"
- other: "Para além de si, {{count}} pessoas sinalizaram isto como spam"
+ one: "Para além de si, 1 pessoa denunciou isto como spam"
+ other: "Para além de si, {{count}} pessoas denunciaram isto como spam"
inappropriate:
- one: "Para além de si, 1 pessoa sinalizou isto como inapropriado"
- other: "Para além de si, {{count}} pessoas sinalizaram isto como inapropriado"
+ one: "Para além de si, 1 pessoa denunciou isto como inapropriado"
+ other: "Para além de si, {{count}} pessoas denunciaram isto como inapropriado"
notify_moderators:
- one: "Para além de si, 1 pessoa sinalizaram isto para moderação"
- other: "Para além de si, {{count}} pessoas sinalizaram isto para moderação"
+ one: "Para além de si, 1 pessoa denunciou isto para moderação"
+ other: "Para além de si, {{count}} pessoas denunciaram isto para moderação"
notify_user:
one: "Para além de si, 1 outro utilizador enviaram uma mensagem a este utilizador"
other: "Para além de si, {{count}} outros utilizadores enviaram uma mensagem a este utilizador"
bookmark:
- one: "Para além de si, 1 pessoa adicionou um marcador a esta mensagem"
- other: "Para além de si, {{count}} adicionaram um marcador a esta mensagem"
+ one: "Para além de si, 1 pessoa adicionou um marcador a esta publicação"
+ other: "Para além de si, {{count}} adicionaram um marcador a esta publicação"
like:
one: "Para além de si, 1 pessoa gostou disto"
other: "Para além de si, {{count}} pessoas gostaram disto"
vote:
- one: "Para além de si, 1 pessoa votou nesta mensagem"
- other: "Para além de si, {{count}} pessoas votaram nesta mensagem"
+ one: "Para além de si, 1 pessoa votou nesta publicação"
+ other: "Para além de si, {{count}} pessoas votaram nesta publicação"
by_others:
off_topic:
- one: "1 pessoa sinalizou isto como fora de contexto"
- other: "{{count}} pessoas sinalizaram isto como fora de contexto"
+ one: "1 pessoa denunciou isto como fora de contexto"
+ other: "{{count}} pessoas denunciaram isto como fora de contexto"
spam:
- one: "1 pessoa sinalizou isto como spam"
- other: "{{count}} pessoas sinalizaram isto como spam"
+ one: "1 pessoa denunciou isto como spam"
+ other: "{{count}} pessoas denunciaram isto como spam"
inappropriate:
- one: "1 pessoa sinalizou isto como impróprio"
- other: "{{count}} pessoas sinalizaram isto como inapropriado"
+ one: "1 pessoa denunciou isto como impróprio"
+ other: "{{count}} pessoas denunciaram isto como inapropriado"
notify_moderators:
- one: "1 pessoa sinalizou isto para moderação"
- other: "{{count}} pessoas sinalizaram isto para moderação"
+ one: "1 pessoa denunciou isto para moderação"
+ other: "{{count}} pessoas denunciaram isto para moderação"
notify_user:
one: "1 pessoa enviou uma mensagem a este utilizador"
other: "{{count}} enviaram uma mensagem a este utilizador"
bookmark:
- one: "1 pessoa adicionou um marcador a esta mensagem"
- other: "{{count}} pessoas adicionaram um marcador a esta mensagem"
+ one: "1 pessoa adicionou um marcador a esta publicação"
+ other: "{{count}} pessoas adicionaram um marcador a esta publicação"
like:
one: "1 pessoa gostou disto"
other: "{{count}} pessoas gostaram disto"
vote:
- one: "1 pessoa votou nesta mensagem"
- other: "{{count}} pessoas votaram nesta mensagem"
+ one: "1 pessoa votou nesta publicação"
+ other: "{{count}} pessoas votaram nesta publicação"
delete:
confirm:
- one: "Tem a certeza que quer eliminar essa mensagem?"
- other: "Tem a certeza que quer eliminar todas essas mensagens?"
+ one: "Tem a certeza que quer eliminar essa publicação?"
+ other: "Tem a certeza que quer eliminar todas essas publicações?"
+ merge:
+ confirm:
+ one: "Tem a certeza que quer juntar estas publicações?"
+ other: "Tem a certeza que quer unir estas {{count}} publicações?"
revisions:
controls:
first: "Primeira revisão"
@@ -1535,6 +1690,11 @@ pt:
general: 'Geral'
settings: 'Configurações'
topic_template: "Modelo do Tópico"
+ tags: "Etiquetas"
+ tags_allowed_tags: "Etiquetas que só podem ser usadas nesta categoria:"
+ tags_allowed_tag_groups: "Grupos de etiquetas que só podem ser usados nesta categoria:"
+ tags_placeholder: "(Opcional) lista de etiquetas perimitidas"
+ tag_groups_placeholder: "(Opcional) lista de grupos de etiquetas permitidos"
delete: 'Eliminar Categoria'
create: 'Nova Categoria'
create_long: 'Criar uma nova categoria'
@@ -1569,6 +1729,7 @@ pt:
email_in_disabled: "Publicar novos tópicos através do email está desactivado nas Configurações do Sítio. Para permitir a publicação de novos tópicos através do email,"
email_in_disabled_click: 'ative a definição "email em".'
suppress_from_homepage: "Suprimir esta categoria da página principal."
+ sort_order: "Ordenação Predefinida:"
allow_badges_label: "Permitir a atribuição de distintivos nesta categoria"
edit_permissions: "Editar Permissões"
add_permission: "Adicionar Permissões"
@@ -1581,28 +1742,45 @@ pt:
notifications:
watching:
title: "A vigiar"
+ description: "Irá vigiar automaticamente todos os novos tópicos nestas categorias. Será notificado de todas as novas respostas em cada tópico, e uma contagem de novas respostas será mostrada."
+ watching_first_post:
+ title: "A Vigiar a Primeira Publicação"
+ description: "Será notificado acerca da primeira resposta em cada novo tópico nestas categorias."
tracking:
- title: "Acompanhar"
+ title: "A Seguir"
+ description: "Irá seguir automaticamente todos os novos tópicos nestas categorias. Será notificado sempre que alguém menciona o seu @nome ou responde a si, e uma contagem de novas respostas será mostrada."
regular:
title: "Normal"
description: "Será notificado se alguém mencionar o seu @nome ou responder-lhe."
muted:
title: "Silenciado"
description: "Nunca será notificado de nada acerca de novos tópicos nestas categorias, e estes não irão aparecer nos recentes."
+ sort_options:
+ default: "predefinida"
+ likes: "Gostos"
+ op_likes: "Gostos à Publicação Original"
+ views: "Vistas"
+ posts: "Publicações"
+ activity: "Actividade"
+ posters: "Autores"
+ category: "Categoria"
+ created: "Criado"
+ sort_ascending: 'Ascendente'
+ sort_descending: 'Descendente'
flagging:
title: 'Obrigado por ajudar a manter a nossa comunidade cívica!'
- action: 'Sinalizar Mensagem'
+ action: 'Denunciar Publicação'
take_action: "Acionar"
notify_action: 'Mensagem'
official_warning: 'Aviso Oficial'
delete_spammer: "Eliminar Spammer"
- delete_confirm: "Está prestes a apagar %{posts} mensagens e %{topics} tópicos deste utilizador, remover a sua conta, bloquear acessos do seu endereço IP %{ip_address}, e adicionar o seu endereço de email %{email} a uma lista negra. Tem a certeza que este utilizador é de facto um spammer?"
+ delete_confirm_MF: "Está prestes a apagar {POSTS, plural, one {1 publicação} other {# publicações}} e {TOPICS, plural, one {1 tópico} other {# tópicos}} deste utilizador, remover a conta do mesmo, bloquear acessos a partir do endereço IP %{ip_address} correspondente, e adicionar o endereço de email {email} a uma lista negra permanente. Tem a certeza que este utilizador é de facto um spammer?"
yes_delete_spammer: "Sim, Eliminar Spammer"
ip_address_missing: "(N/A)"
hidden_email_address: "(escondido)"
- submit_tooltip: "Submeter a sinalização privada"
- take_action_tooltip: "Atingir imediatamente o limite de sinalizações, em vez de esperar por mais denúncias da comunidade"
- cant: "Pedimos desculpa, não é possível colocar uma sinalização nesta mensagem neste momento."
+ submit_tooltip: "Submeter a denúncia privada"
+ take_action_tooltip: "Atingir imediatamente o limite de denúncias, em vez de esperar por mais denúncias da comunidade"
+ cant: "Pedimos desculpa, não é possível colocar uma denúncia nesta publicação neste momento."
notify_staff: 'Notificar o pessoal privadamente'
formatted_name:
off_topic: "Está fora do contexto"
@@ -1611,20 +1789,32 @@ pt:
custom_placeholder_notify_user: "Seja específico, seja construtivo e seja sempre amável."
custom_placeholder_notify_moderators: "Diga-nos especificamente quais são as suas preocupações, e forneça-nos hiperligações relevantes e exemplo se possível."
custom_message:
- at_least: "insira pelo menos {{n}} caracteres"
- more: "{{n}} em falta..."
- left: "{{n}} remanescentes"
+ at_least:
+ one: "insira pelo menos 1 caráter"
+ other: "insira pelo menos {{count}} carateres"
+ more:
+ one: "1 a seguir..."
+ other: "{{count}} a seguir..."
+ left:
+ one: "1 restante"
+ other: "{{count}} restantes"
flagging_topic:
title: "Obrigado por ajudar a manter a nossa comunidade cívica!"
- action: "Sinalizar Tópico"
+ action: "Denunciar Tópico"
notify_action: "Mensagem"
topic_map:
title: "Sumário do Tópico"
participants_title: "Autores Frequentes"
links_title: "Hiperligações Populares"
+ links_shown: "mostrar mais ligações..."
clicks:
one: "1 clique"
other: "%{count} cliques"
+ post_links:
+ about: "expandir mais ligações para esta publicação"
+ title:
+ one: "1 mais"
+ other: "%{count} mais"
topic_statuses:
warning:
help: "Este é um aviso oficial."
@@ -1646,21 +1836,20 @@ pt:
title: "Fixado"
help: "Este tópico foi fixado por si; será mostrado no topo da sua categoria"
invisible:
- help: "Este tópico não está listado; não será apresentado na lista de tópicos e poderá ser acedido apenas através de uma hiperligação direta"
- posts: "Mensagens"
- posts_lowercase: "mensagens"
- posts_long: "existem {{number}} mensagens neste tópico"
+ help: "Este tópico não está listado; não será apresentado na lista de tópicos e poderá ser acedido apenas através de uma ligação direta"
+ posts: "Publicações"
+ posts_long: "existem {{number}} publicações neste tópico"
posts_likes_MF: |
Este tópico tem {count, plural, one {1 resposta} other {# respostas}} {ratio, select,
- baixo {com uma proporção de gostos alta}
- med {com uma proporção de gostos muito alta}
- alta {com uma proporção de gostos extremamente alta}
- outros {}}
- original_post: "Mensagem Original"
- views: "Visualizações"
+ low {com uma proporção de gostos para publicações alta}
+ med {com uma proporção de gostos para publicações muito alta}
+ high {com uma proporção de gostos para publicações extremamente alta}
+ other {}}
+ original_post: "Publicação Original"
+ views: "Vistas"
views_lowercase:
- one: "visualização"
- other: "visualizações"
+ one: "vista"
+ other: "vistas"
replies: "Respostas"
views_long: "este tópico foi visto {{number}} vezes"
activity: "Atividade"
@@ -1688,7 +1877,7 @@ pt:
title_with_count:
one: "Recente (1)"
other: "Recentes ({{count}})"
- help: "tópicos com mensagens recentes"
+ help: "tópicos com publicações recentes"
hot:
title: "Quente"
help: "uma seleção dos tópicos mais quentes"
@@ -1707,7 +1896,7 @@ pt:
title_with_count:
one: "Não Lido (1)"
other: "Não Lidos ({{count}})"
- help: "tópicos que está atualmente a vigiar ou a acompanhar com mensagens não lidas"
+ help: "tópicos que está atualmente a vigiar ou a seguir com publicações não lidas"
lower_title_with_count:
one: "1 não lido"
other: "{{count}} não lidos"
@@ -1722,8 +1911,8 @@ pt:
other: "Novos ({{count}})"
help: "tópicos criados nos últimos dias"
posted:
- title: "As Minhas mensagens"
- help: "tópicos nos quais publicou uma mensagem"
+ title: "As Minhas publicações"
+ help: "tópicos nos quais publicou uma publicação"
bookmarks:
title: "Marcadores"
help: "tópicos que marcou"
@@ -1760,6 +1949,179 @@ pt:
full: "Criar / Responder / Ver"
create_post: "Responder / Ver"
readonly: "Ver"
+ lightbox:
+ download: "descarregar"
+ keyboard_shortcuts_help:
+ title: 'Atalhos de Teclado'
+ jump_to:
+ title: 'Ir Para'
+ home: 'g, h Início'
+ latest: 'g, l Recentes'
+ new: 'g, n Novo'
+ unread: 'g, u Não lido'
+ categories: 'g, c Categorias'
+ top: 'g, t Topo'
+ bookmarks: 'g, b Marcadores'
+ profile: 'g, p Perfil'
+ messages: 'g, m Mensagens'
+ navigation:
+ title: 'Navegação'
+ jump: '# Ir para a publicação #'
+ back: 'u Retroceder'
+ up_down: 'k/j Mover seleção ↑ ↓'
+ open: 'o ou Enter Abrir tópico selecionado'
+ next_prev: 'shift+j/shift+k Secção seguinte/anterior'
+ application:
+ title: 'Aplicação'
+ create: 'c Criar um novo tópico'
+ notifications: 'n Abrir notificações'
+ hamburger_menu: '= Abrir menu hamburger'
+ user_profile_menu: 'p Abrir menu de utilizador'
+ show_incoming_updated_topics: '. Mostrar tópicos atualizados'
+ search: '/ Pesquisar'
+ help: '? Abrir ajuda do teclado'
+ dismiss_new_posts: 'x, r Marcar Visto Novos/Publicações'
+ dismiss_topics: 'x, t Marcar Visto Tópicos'
+ log_out: 'shift+z shift+z Sair'
+ actions:
+ title: 'Ações'
+ bookmark_topic: 'f Alternar marcador de tópico'
+ pin_unpin_topic: 'shift+p Afixar/Desafixar tópico'
+ share_topic: 'shift+s Partilhar tópico'
+ share_post: 's Partilhar publicação'
+ reply_as_new_topic: 't Responder como tópico ligado'
+ reply_topic: 'shift+r Responder ao tópico'
+ reply_post: 'r Responder à publicação'
+ quote_post: 'q Citar publicação'
+ like: 'l Gostar da publicação'
+ flag: '! Denunciar publicação'
+ bookmark: 'b Adicionar publicação aos marcadores'
+ edit: 'e Editar publicação'
+ delete: 'd Eliminar publicação'
+ mark_muted: 'm, m Silenciar tópico'
+ mark_regular: 'm, r Tópico Habitual (por defeito)'
+ mark_tracking: 'm, t Seguir tópico'
+ mark_watching: 'm, w Vigiar tópico'
+ print: 'ctrl+p Imprimir tópico'
+ badges:
+ earned_n_times:
+ one: "Ganhou este distintivo 1 vez"
+ other: "Ganhou este distintivo %{count} vezes"
+ granted_on: "Concedido %{date}"
+ others_count: "Outros com este distintivo (%{count})"
+ title: Distintivos
+ allow_title: "título disponivel"
+ multiple_grant: "atribuido multiplas vezes"
+ badge_count:
+ one: "1 Distintivo"
+ other: "%{count} Distintivos"
+ more_badges:
+ one: "+1 Mais"
+ other: "+%{count} Mais"
+ granted:
+ one: "1 concedido"
+ other: "%{count} concedidos"
+ select_badge_for_title: Selecionar um distintivo para usar como seu título
+ none: "Pesquisar com o Google
+
+ tagging:
+ all_tags: "Todas as Etiquetas"
+ selector_all_tags: "todas as etiquetas"
+ selector_no_tags: "sem etiquetas"
+ changed: "etiquetas modificadas:"
+ tags: "Etiquetas"
+ choose_for_topic: "escolha etiquetas opcionais para este tópico"
+ delete_tag: "Remover Etiqueta"
+ delete_confirm: "Tem a certeza que deseja remover esta etiqueta?"
+ rename_tag: "Renomear Etiqueta"
+ rename_instructions: "Escolha o novo nome para a etiqueta:"
+ sort_by: "Ordenar por:"
+ sort_by_count: "contagem"
+ sort_by_name: "nome"
+ manage_groups: "Gerir Grupos de Etiquetas"
+ manage_groups_description: "Definir grupos para organizar etiquetas"
+ filters:
+ without_category: "%{filter} %{tag} tópicos"
+ with_category: "%{filter} %{tag} tópicos em %{category}"
+ untagged_without_category: "%{filter} tópicos sem etiquetas"
+ untagged_with_category: "%{filter} tópicos sem etiquetas em %{category}"
+ notifications:
+ watching:
+ title: "A vigiar"
+ description: "Vigiará automaticamente todos os tópicos nesta etiqueta. Será notificado acerca de todas as novas publicações e tópicos, e será-lhe apresentada a contagem de publicações novas e por ler ao lado do tópico."
+ watching_first_post:
+ title: "A Vigiar a Primeira Publicação"
+ description: "Será notificado acerca da primeira publicação em cada tópico deste grupo."
+ tracking:
+ title: "A Seguir"
+ description: "Irá automaticamente seguir todos os tópicos nesta etiqueta. Uma contagem de publicações não lidas e novas aparecerá ao lado to tópico."
+ regular:
+ title: "Regular"
+ description: "Será notificado se alguém mencionar o seu @nome ou responder à sua publicação."
+ muted:
+ title: "Silenciado"
+ description: "Não será notificado acerca de novos tópicos sob esta etiqueta, não aparecendo eles no seu separador de não lidos."
+ groups:
+ title: "Grupos de Etiquetas"
+ about: "Adicione grupos de etiquetas para geri-las mais facilmente."
+ new: "Novo Grupo"
+ tags_label: "Etiquetas neste grupo:"
+ parent_tag_label: "Etiqueta pai:"
+ parent_tag_placeholder: "Opcional"
+ parent_tag_description: "Etiquetas deste grupo não podem ser usadas sem ter a etiqueta pai presente."
+ one_per_topic_label: "Limitar a uma etiqueta por tópico deste grupo"
+ new_name: "Novo Grupo de Etiquetas"
+ save: "Guardar"
+ delete: "Apagar"
+ confirm_delete: "Tem a certeza que quer apagar este grupo de etiquetas?"
+ topics:
+ none:
+ unread: "Não tem tópicos por ler."
+ new: "Não tem novos tópicos."
+ read: "Ainda não leu nenhum tópico."
+ posted: "Ainda não publicou em qualquer tópico."
+ latest: "Não há tópicos recentes."
+ hot: "Não há tópicos quentes."
+ bookmarks: "Ainda não marcou nenhum tópico."
+ top: "Não há melhores tópicos."
+ search: "Não há resultados da pesquisa."
+ bottom:
+ latest: "Não existem mais tópicos recentes."
+ hot: "Não existem mais tópicos quentes."
+ posted: "Não existem mais tópicos publicados."
+ read: "Não existem mais tópicos lidos."
+ new: "Não existem mais tópicos novos."
+ unread: "Não existem mais tópicos não lidos."
+ top: "Não existem mais melhores tópicos."
+ bookmarks: "Não há mais tópicos marcados."
+ search: "Não há mais resultados da pesquisa."
+ invite:
+ custom_message: "Torne o seu convite mais pessoal escrevendo uma"
+ custom_message_link: "mensagem personalizada"
+ custom_message_placeholder: "Insira a sua mensagem personalizada"
+ custom_message_template_forum: "Olá, devia juntar-se a este fórum!"
+ custom_message_template_topic: "Olá, achei que poderia gostar deste tópico!"
+ safe_mode:
+ enabled: "O modo de segurança está activado, para sair do modo de segurança feche esta janela do navegador"
admin_js:
type_to_filter: "digite para filtrar..."
admin:
@@ -1816,51 +2178,51 @@ pt:
latest_changes: "Últimas alterações: atualize com frequência!"
by: "por"
flags:
- title: "Sinalizações"
+ title: "Denúncias"
old: "Antigo"
active: "Ativo"
agree: "Aceitar"
- agree_title: "Confirmar esta sinalização como válida e correta"
+ agree_title: "Confirmar esta denúncia como válida e correta"
agree_flag_modal_title: "Aceitar e..."
- agree_flag_hide_post: "Aceitar (esconder mensagem + enviar MP)"
+ agree_flag_hide_post: "Aceitar (esconder publicação + enviar MP)"
agree_flag_hide_post_title: "Esconder esta publicação e enviar automaticamente uma mensagem ao utilizador solicitando a edição urgente da mesma"
- agree_flag_restore_post: "Concordar (restaurar mensagem)"
- agree_flag_restore_post_title: "Restaurar esta mensagem"
- agree_flag: "Concordar com a sinalização"
- agree_flag_title: "Concordar com a sinalização e manter a mensagem inalterada"
+ agree_flag_restore_post: "Concordar (restaurar publicação)"
+ agree_flag_restore_post_title: "Restaurar esta publicação"
+ agree_flag: "Concordar com a denúncia"
+ agree_flag_title: "Concordar com a denúncia e manter a publicação inalterada"
defer_flag: "Diferir"
- defer_flag_title: "Remover esta sinalização; não requer qualquer ação de momento."
+ defer_flag_title: "Remover esta denúncia; não requer qualquer ação de momento."
delete: "Eliminar"
- delete_title: "Eliminar a mensagem associada a esta sinalização."
- delete_post_defer_flag: "Eliminar mensagem e diferir a sinalização."
- delete_post_defer_flag_title: "Eliminar mensagem; se é a primeira do tópico então eliminar o tópico"
- delete_post_agree_flag: "Eliminar mensagem e Concordar com a sinalização"
- delete_post_agree_flag_title: "Eliminar mensagem; se é a primeira do tópico então eliminar o tópico"
+ delete_title: "Eliminar a publicação associada a esta denúncia."
+ delete_post_defer_flag: "Eliminar publicação e diferir a denúncia."
+ delete_post_defer_flag_title: "Eliminar publicação; se é a primeira do tópico então eliminar o tópico"
+ delete_post_agree_flag: "Eliminar publicação e Concordar com a denúncia"
+ delete_post_agree_flag_title: "Eliminar publicação; se é a primeira do tópico então eliminar o tópico"
delete_flag_modal_title: "Eliminar e…"
delete_spammer: "Eliminar Spammer"
- delete_spammer_title: "Remover utilizador e todos as mensagens e tópicos do mesmo."
- disagree_flag_unhide_post: "Discordar (exibir mensagem)"
- disagree_flag_unhide_post_title: "Remover qualquer sinalização desta mensagem e torná-la visível novamente"
+ delete_spammer_title: "Remover utilizador e todos as publicações e tópicos do mesmo."
+ disagree_flag_unhide_post: "Discordar (exibir publicação)"
+ disagree_flag_unhide_post_title: "Remover qualquer denúncia desta publicação e torná-la visível novamente"
disagree_flag: "Discordar"
- disagree_flag_title: "Negar esta sinalização como inválida ou incorreta"
+ disagree_flag_title: "Negar esta denúncia como inválida ou incorreta"
clear_topic_flags: "Concluído"
- clear_topic_flags_title: "Este tópico foi investigado e os problemas foram resolvidos. Clique em Concluído para remover as sinalizações."
+ clear_topic_flags_title: "Este tópico foi investigado e os problemas foram resolvidos. Clique em Concluído para remover as denúncias."
more: "(mais respostas...)"
dispositions:
agreed: "concordado"
disagreed: "discordado"
deferred: "diferido"
- flagged_by: "Sinalizado por"
+ flagged_by: "Denunciado por"
resolved_by: "Resolvido por"
took_action: "Realizou uma ação"
system: "Sistema"
error: "Aconteceu um erro"
reply_message: "Responder"
- no_results: "Não há sinalizações."
- topic_flagged: "Este tópico foi sinalizado."
+ no_results: "Não há denúncias."
+ topic_flagged: "Este tópico foi denunciado."
visit_topic: "Visitar tópico para acionar medidas"
- was_edited: "A mensagem foi editada após a primeira sinalização"
- previous_flags_count: "Esta mensagem já foi sinalizada {{count}} vezes."
+ was_edited: "A publicação foi editada após a primeira denúncia"
+ previous_flags_count: "Esta publicação já foi denunciada {{count}} vezes."
summary:
action_type_3:
one: "fora do contexto"
@@ -1885,15 +2247,12 @@ pt:
refresh: "Atualizar"
new: "Novo"
selector_placeholder: "insira o nome de utilizador"
- name_placeholder: "Nome do grupo, sem espaços, com as mesmas regras do nome de utilizador"
about: "Editar aqui a sua participação e nomes no grupo"
group_members: "Membros do grupo"
delete: "Eliminar"
delete_confirm: "Eliminar este grupo?"
delete_failed: "Impossível eliminar grupo. Se se trata de um grupo automático, não pode ser eliminado."
- delete_member_confirm: "Remova o '%{username}' do grupo '%{group}'?"
delete_owner_confirm: "Remover privilégios do proprietário para '%{username}'?"
- name: "Nome"
add: "Adicionar"
add_members: "Adicionar membros"
custom: "Personalizar"
@@ -1923,7 +2282,76 @@ pt:
confirm_revoke: "Tem a certeza que quer revogar essa chave?"
info_html: "A sua chave API permitirá a criação e edição de tópicos usando pedidos JSON."
all_users: "Todos os Utilizadores"
- note_html: "Manter esta chave secreta, todos os utilizadores que a tenham poderão criar mensagens arbitrárias como qualquer utilizador."
+ note_html: "Manter esta chave secreta, todos os utilizadores que a tenham poderão criar publicações arbitrárias como qualquer utilizador."
+ web_hooks:
+ title: "Webhooks"
+ none: "Não existem webhooks neste momento."
+ instruction: "Webhooks permitem ao Discourse notificar serviços externos quando certos eventos acontecem no seu site. Quando o webhook é despoletado, um pedido POST será enviado aos URLs fornecidos."
+ detailed_instruction: "Um pedido POST será enviado ao URL fornecido quando o evento escolhido acontecer."
+ new: "Novo Webhook"
+ create: "Criar"
+ save: "Guardar"
+ destroy: "Apagar"
+ description: "Descrição"
+ controls: "Controlos"
+ go_back: "Voltar à lista"
+ payload_url: "URL de carga"
+ payload_url_placeholder: "https://example.com/postreceive"
+ warn_local_payload_url: "Parece que está a tentar configurar um webhook para um url local. Eventos entregues num endereço local poderão causar efeitos secundários ou comportamentos inesperados. Continuar?"
+ secret_invalid: "O segredo não pode ter espaços."
+ secret_too_short: "O segredo tem de ter pelo menos 12 caracteres."
+ secret_placeholder: "Um texto adicional, usado para gerar uma assinatura"
+ event_type_missing: "Tem de configurar pelo menos um tipo de evento."
+ content_type: "Tipo de Conteúdo"
+ secret: "Segredo"
+ event_chooser: "Que eventos gostaria que este webhook despoletasse?"
+ wildcard_event: "Enviar-me tudo."
+ individual_event: "Selecionar eventos individuais."
+ verify_certificate: "Verificar certificado TLS do url de carga"
+ active: "Ativo"
+ active_notice: "Entregaremos detalhes do evento quando este acontecer."
+ categories_filter_instructions: "Webhooks relevantes serão despoletados apenas se o evento estiver relacionado com as categorias especificadas. Deixar em branco para despoletar webhooks para todas as categorias."
+ categories_filter: "Categorias Despoletadas"
+ groups_filter_instructions: "Webhooks relevantes serão despoletados apenas se o evento estiver relacionado com grupos especificados. Deixar em branco para despoletar webhooks para todos os grupos."
+ groups_filter: "Grupos Despoletados"
+ delete_confirm: "Apagar este webhook?"
+ topic_event:
+ name: "Evento de Tópico"
+ details: "Quando um tópico é novo, revisto, modificado ou apagado. "
+ post_event:
+ name: "Evento de Publicação"
+ details: "Quando uma resposta é nova, editada, apagada ou recuperada. "
+ user_event:
+ name: "Evento de Utilizador"
+ delivery_status:
+ title: "Estado de Entrega"
+ inactive: "Inativo"
+ failed: "Falhado"
+ successful: "Sucesso"
+ events:
+ none: "Não há eventos relacionados."
+ redeliver: "Re-entregar."
+ incoming:
+ one: "Existe 1 evento novo."
+ other: "Existem {{count}} eventos novos."
+ completed_in:
+ one: "Completado em 1 segundos."
+ other: "Completado em {{count}} segundo."
+ request: "Pedido"
+ response: "Resposta"
+ redeliver_confirm: "Tem a certeza de que quer re-entregar a mesma carga?"
+ headers: "Cabeçalhos"
+ payload: "Carga"
+ body: "Corpo"
+ go_list: "Ir para à lista"
+ go_details: "Editar webhook"
+ go_events: "Ir para eventos"
+ ping: "Ping"
+ status: "Código de Estado"
+ event_id: "ID"
+ timestamp: "Criado"
+ completion: "Tempo de Resposta"
+ actions: "Ações"
plugins:
title: "Plugins"
installed: "Plugins Instalados"
@@ -1989,10 +2417,8 @@ pt:
title: "Reverter a base de dados para um estado anterior operacional"
confirm: "Tem a certeza que pretende reverter a base de dados para o estado de funcionamento anterior?"
export_csv:
- user_archive_confirm: "Tem a certeza que deseja descarregar as suas mensagens?"
success: "Exportação iniciada, será notificado através de mensagem assim que o processo estiver concluído."
failed: "A exportação falhou. Por favor verifique os registos dos logs."
- rate_limit_error: "As mensagens podem ser descarregadas uma vez por dia. Por favor, tente novamente amanhã."
button_text: "Exportar"
button_title:
user: "Exportar lista total de utilizadores em formato CSV."
@@ -2010,7 +2436,7 @@ pt:
long_title: "Personalizações do Sítio"
css: "CSS"
header: "Cabeçalho"
- top: "Topo"
+ top: "Os Melhores"
footer: "Rodapé"
embedded_css: "CSS incorporado"
head_tag:
@@ -2080,10 +2506,10 @@ pt:
description: "Texto e ícones no cabeçalho do sítio."
highlight:
name: 'destaque'
- description: 'A cor de fundo de elementos destacados na página, tais como mensagens e tópicos.'
+ description: 'A cor de fundo de elementos destacados na página, tais como publicações e tópicos.'
danger:
name: 'perigo'
- description: 'Cor de destaque para ações como apagar mensagens e tópicos.'
+ description: 'Cor de destaque para ações como apagar publicações e tópicos.'
success:
name: 'sucesso'
description: 'Usado para indicar que uma ação foi bem sucedida.'
@@ -2100,7 +2526,7 @@ pt:
test_error: "Occorreu um problema no envio do email de teste. Por favor verifique novamente as suas definições de email, verifique se o seu host não está a bloquear conexões de email, e tente novamente."
sent: "Enviado"
skipped: "Ignorado"
- bounced: "Devolvida"
+ bounced: "Redirecionado"
received: "Recebido"
rejected: "Rejeitado"
sent_at: "Enviado em"
@@ -2114,10 +2540,14 @@ pt:
delivery_method: "Método de Entrega"
preview_digest_desc: "Pré-visualizar o conteúdo dos emails de resumo enviados aos utilizadores inativos."
refresh: "Atualizar"
+ send_digest_label: "Enviar este resultado para:"
+ send_digest: "Enviar"
+ sending_email: "A enviar email..."
format: "Formato"
html: "html"
text: "texto"
last_seen_user: "Último Utilizador Visto:"
+ no_result: "Não foram encontrados resultados para resumo."
reply_key: "Chave de Resposta"
skipped_reason: "Ignorar Motivo"
incoming_emails:
@@ -2157,7 +2587,7 @@ pt:
match_count: "Correspondência"
ip_address: "IP"
topic_id: "ID do Tópico"
- post_id: "ID da Mensagem"
+ post_id: "ID da Publicação"
category_id: "ID da Categoria"
delete: 'Eliminar'
edit: 'Editar'
@@ -2196,7 +2626,7 @@ pt:
revoke_badge: "revogar distintivo"
check_email: "verificar email"
delete_topic: "eliminar tópico"
- delete_post: "eliminar mensagem"
+ delete_post: "eliminar publicação"
impersonate: "personificar"
anonymize_user: "tornar utilizador anónimo"
roll_up: "agregar blocos IP"
@@ -2212,6 +2642,7 @@ pt:
backup_operation: "operação de cópia de segurança"
deleted_tag: "etiqueta removida"
renamed_tag: "etiqueta renomeada"
+ revoke_email: "revogar email"
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."
@@ -2220,7 +2651,7 @@ pt:
allow: "Permitir"
screened_urls:
title: "URLs Filtrados"
- description: "Os URLs listados aqui foram usados em mensagens de utilizadores que foram identificados como spammers."
+ description: "Os URLs listados aqui foram usados em publicações de utilizadores que foram identificados como spammers."
url: "URL"
domain: "Domínio"
screened_ips:
@@ -2279,7 +2710,7 @@ pt:
newuser: 'Utilizadores no Nível de Confiança 0 (Novo Utilizador)'
basic: 'Utilizadores no Nível de Confiança 1 (Utilizador Básico)'
member: 'Utilizadores no Nível de Confiança 2 (Membro)'
- regular: 'Utilizadores no Nível de Confiança 3 (Habitual)'
+ regular: 'Utilizadores no Nível de Confiança 3 (Regular)'
leader: 'Utilizadores no Nível de Confiança 4 (Líder)'
staff: "Pessoal"
admins: 'Utilizadores da Administração'
@@ -2305,8 +2736,8 @@ pt:
suspend_reason_label: "Qual é o motivo da sua suspensão? Este texto estará visível para todos na página do perfil deste utilizador, e será mostrada ao utilizador quando tentar iniciar sessão. Mantenha-o breve."
suspend_reason: "Motivo"
suspended_by: "Suspendido por"
- delete_all_posts: "Eliminar todas as mensagens"
- delete_all_posts_confirm: "Está prestes a eliminar %{posts} mensagens e %{topics} tópicos. Tem a certeza de que quer continuar?"
+ delete_all_posts: "Eliminar todas as publicações"
+ delete_all_posts_confirm_MF: "Está prestes a apagar {POSTS, plural, one {1 publicação} other {# publicações}} e {TOPICS, plural, one {1 tópico} other {# tópicos}}. Tem a certeza de que quer continuar?"
suspend: "Suspender"
unsuspend: "Retirar a suspensão"
suspended: "Suspendido?"
@@ -2322,7 +2753,7 @@ pt:
show_public_profile: "Mostrar Perfil Público"
impersonate: 'Personificar'
ip_lookup: "Pesquisa de IP"
- log_out: "Terminar Sessão"
+ log_out: "Sair"
logged_out: "Sessão do utilizador encerrada em todos os dispositivos"
revoke_admin: 'Revogar Administração'
grant_admin: 'Conceder Administração'
@@ -2336,13 +2767,13 @@ pt:
like_count: Gostos Dados / Recebidos
last_100_days: 'nos últimos 100 dias'
private_topics_count: Tópicos Privados
- posts_read_count: Mensagens lidas
- post_count: Mensagens criadas
+ posts_read_count: Publicações lidas
+ post_count: Publicações criadas
topics_entered: Tópicos Visualizados
- flags_given_count: Sinalizações Dadas
- flags_received_count: Sinalizações Recebidas
+ flags_given_count: Denúncias Dadas
+ flags_received_count: Denúncias Recebidas
warnings_received_count: Avisos Recebidos
- flags_given_received_count: 'Sinalizações Dadas / Recebidas'
+ flags_given_received_count: 'Denúncias Dadas / Recebidas'
approve: 'Aprovar'
approved_by: "aprovado por"
approve_success: "Utilizador aprovado e email enviado com instruções de ativação."
@@ -2354,21 +2785,21 @@ pt:
anonymize_failed: "Ocorreu um problema ao tornar esta conta anónima."
delete: "Eliminar Utilizador"
delete_forbidden_because_staff: "Administradores e moderadores não podem ser eliminados."
- delete_posts_forbidden_because_staff: "Não é possível eliminar todas as mensagens dos administradores e moderadores."
+ delete_posts_forbidden_because_staff: "Não é possível eliminar todas as publicações dos administradores e moderadores."
delete_forbidden:
- one: "Utilizadores não podem ser eliminados se tiverem mensagens. Apague todas as mensagens antes de eliminar o utilizador. (Mensagens com mais de %{count} dia de existência não podem ser eliminadas.)"
- other: "Utilizadores não podem ser eliminados se tiverem mensagens. Apague todas as mensagens antes de eliminar o utilizador. (Mensagens com mais de %{count} dias de existência não podem ser eliminadas.)"
+ one: "Utilizadores não podem ser eliminados se tiverem publicações. Apague todas as publicações antes de eliminar o utilizador. (Publicações com mais de %{count} dia de existência não podem ser eliminadas.)"
+ other: "Utilizadores não podem ser eliminados se tiverem publicações. Apague todas as publicações antes de eliminar o utilizador. (Publicações com mais de %{count} dias de existência não podem ser eliminadas.)"
cant_delete_all_posts:
- one: "Não é possível eliminar todas as mensagens. Algumas mensagens existem há mais de %{count} dia. (A configuração delete_user_max_post_age.)"
- other: "Não é possível eliminar todas as mensagens. Algumas mensagens existem há mais de %{count} dias. (A configuração delete_user_max_post_age.)"
+ one: "Não é possível eliminar todas as publicações. Algumas publicações existem há mais de %{count} dia. (A configuração delete_user_max_post_age.)"
+ other: "Não é possível eliminar todas as publicações. Algumas publicações existem há mais de %{count} dias. (A configuração delete_user_max_post_age.)"
cant_delete_all_too_many_posts:
- one: "Não é possível eliminar todas as mensagens porque o utilizador tem mais de 1 mensagens. (delete_all_posts_max)"
- other: "Não é possível eliminar todas as mensagens porque o utilizador tem mais de %{count} mensagens. (delete_all_posts_max)"
+ one: "Não é possível eliminar todas as publicações porque o utilizador tem mais de 1 publicações. (delete_all_posts_max)"
+ other: "Não é possível eliminar todas as publicações porque o utilizador tem mais de %{count} publicações. (delete_all_posts_max)"
delete_confirm: "Tem a CERTEZA que deseja eliminar este utilizador? Esta ação é permanente!"
delete_and_block: "Eliminar e bloquear este endereço de email e IP"
delete_dont_block: "Apenas eliminar"
deleted: "O utilizador foi eliminado."
- delete_failed: "Ocorreu um erro ao eliminar o utilizador. Certifique-se de que todas as suas mensagens foram apagadas antes de tentar eliminá-lo."
+ delete_failed: "Ocorreu um erro ao eliminar o utilizador. Certifique-se de que todas as suas publicações foram apagadas antes de tentar eliminá-lo."
send_activation_email: "Enviar Email de Ativação"
activation_email_sent: "Um email de ativação foi enviado."
send_activation_email_failed: "Ocorreu um problema ao enviar um novo email de ativação. %{error}"
@@ -2378,11 +2809,20 @@ pt:
deactivate_failed: "Ocorreu um problema ao desativar o utilizador."
unblock_failed: 'Ocorreu um problema ao desbloquear o utilizador.'
block_failed: 'Ocorreu um problema ao bloquear o utilizador.'
- block_confirm: 'Tem a certeza que pretende bloquear este utilizador? Este não será capaz de criar novos tópicos ou mensagens.'
+ block_confirm: 'Tem a certeza que pretende bloquear este utilizador? Este não será capaz de criar novos tópicos ou publicações.'
block_accept: 'Sim, bloquear este utilizador'
+ bounce_score: "Pontuação de Redirecionamento"
+ reset_bounce_score:
+ label: "Repor"
+ title: "Repor pontuação de redirecionamento a 0"
deactivate_explanation: "Um utilizador desativado deve revalidar o seu email."
suspended_explanation: "Um utilizador suspenso não pode iniciar sessão."
- block_explanation: "Um utilizador bloqueado não pode publicar mensagens ou iniciar tópicos."
+ block_explanation: "Um utilizador bloqueado não pode publicar publicações ou iniciar tópicos."
+ staged_explanation: "Um utilizador temporário pode apenas publicar por email em tópicos específicos."
+ bounce_score_explanation:
+ none: "Nenhum redirecionamento foi recebido recentemente desse email."
+ some: "Alguns redirecionamentos foram recebidos recentemente desse email."
+ threshold_reached: "Demasiados redirecionamentos recebidos desse email."
trust_level_change_failed: "Ocorreu um problema ao alterar o Nível de Confiança do utilizador."
suspend_modal_title: "Utilizador Suspenso"
trust_level_2_users: "Utilizadores no Nível de Confiança 2"
@@ -2393,7 +2833,9 @@ pt:
unlock_trust_level: "Desbloquear Nível de Confiança"
tl3_requirements:
title: "Requisitos para o Nível de Confiança 3"
- table_title: "Nos últimos %{time_period} dias:"
+ table_title:
+ one: "Nos último dia:"
+ other: "Nos últimos %{count} dias:"
value_heading: "Valor"
requirement_heading: "Requisito"
visits: "Visitas"
@@ -2401,10 +2843,10 @@ pt:
topics_replied_to: "Tópicos com Respostas"
topics_viewed: "Tópicos Visualizados"
topics_viewed_all_time: "Tópicos Visualizados (desde sempre)"
- posts_read: "Mensagens lidas"
- posts_read_all_time: "Mensagens lidas (desde sempre)"
- flagged_posts: "Mensagens Sinalizadas"
- flagged_by_users: "Utilizadores Que Sinalizaram"
+ posts_read: "Publicações lidas"
+ posts_read_all_time: "Publicações lidas (desde sempre)"
+ flagged_posts: "Publicações Denunciadas"
+ flagged_by_users: "Utilizadores Que Denunciaram"
likes_given: "Gostos Dados"
likes_received: "Gostos Recebidos"
likes_received_days: "Gostos recebidos: dias únicos"
@@ -2473,7 +2915,7 @@ pt:
reset: 'repor'
none: 'nenhum'
no_results: "Não foi encontrado nenhum resultado."
- clear_filter: "Limpar"
+ clear_filter: "Remover"
add_url: "adicionar URL"
add_host: "adicionar host"
categories:
@@ -2490,15 +2932,17 @@ pt:
seo: 'SEO'
spam: 'Spam'
rate_limits: 'Limites de Classificação'
- developer: 'Programador'
+ developer: 'Desenvolvedor'
embedding: "Incorporação"
legal: "Legal"
+ user_api: 'API de Utlizador'
uncategorized: 'Outro'
backups: "Fazer Cópias de Segurança"
login: "Iniciar Sessão"
plugins: "Plugins"
user_preferences: "Preferências do Utilizador"
tags: "Etiquetas"
+ search: "Pesquisar"
badges:
title: Distintivos
new_badge: Novo Distintivo
@@ -2514,7 +2958,7 @@ pt:
modal_title: Agrupamento de Distintivos
granted_by: Concedido Por
granted_at: Concedido Em
- reason_help: (Uma hiperligação para uma mensagem ou tópico)
+ reason_help: (Uma ligação para uma publicação ou tópico)
save: Guardar
delete: Apagar
delete_confirm: Tem a certeza que quer eliminar este distintivo?
@@ -2537,26 +2981,26 @@ pt:
image: Imagem
icon_help: "Use uma classe Font Awesome ou um URL para uma imagem"
query: '"Query" de Distintivo (SQL)'
- target_posts: '"Query" direcionada a mensagens'
+ target_posts: '"Query" direcionada a publicações'
auto_revoke: 'Executar diariamente a "query" de revogação '
- show_posts: Mostrar mensagens de concessão de distintivo na página de distintivos
+ show_posts: Mostrar publicações de concessão de distintivo na página de distintivos
trigger: Acionar
trigger_type:
none: "Atualizado diariamente"
- post_action: "Quando um utilizador atua numa mensagem"
- post_revision: "Quando um utilizador edita ou cria uma mensagem"
+ post_action: "Quando um utilizador atua numa publicação"
+ post_revision: "Quando um utilizador edita ou cria uma publicação"
trust_level_change: "Quando um utilizador muda de Nível de Confiança"
user_change: "Quando um utilizador é editado ou criado"
- post_processed: "Depois de uma mensagem ser processada"
+ post_processed: "Depois de uma publicação ser processada"
preview:
link_text: "Pré-visualizar distintivos concedidos"
plan_text: "Pré-visualizar com plano de consulta"
modal_title: "Pré-visualização da \"Query\" de Distintivo"
sql_error_header: "Ocorreu um erro com a consulta."
- error_help: "Veja as seguintes hiperligações para obter ajuda com \"queries\" de distintivos"
+ error_help: "Veja as seguintes ligações para obter ajuda com \"queries\" de distintivos"
bad_count_warning:
header: "AVISO!"
- text: "Estão em falta amostras de concessão. Isto acontece quando a \"query\" do sistema de distintivos devolve IDs de nomes de utilizador ou IDs de mensagens que não existem. Isto pode causar resultados inesperados futuramente, sendo que deverá rever a sua \"query\"."
+ text: "Estão em falta amostras de concessão. Isto acontece quando a \"query\" do sistema de distintivos devolve IDs de nomes de utilizador ou IDs de publicações que não existem. Isto pode causar resultados inesperados futuramente, sendo que deverá rever a sua \"query\"."
no_grant_count: "Nenhuns distintivos a atribuir."
grant_count:
one: "1 distintivo a atribuir."
@@ -2564,8 +3008,8 @@ pt:
sample: "Amostra:"
grant:
with: %{username}
- with_post: %{username} pela mensagem em %{link}
- with_post_time: %{username} pela mensagem em %{link} às %{time}
+ with_post: %{username} pela publicação em %{link}
+ with_post_time: %{username} pela publicação em %{link} às %{time}
with_time: %{username} às %{time}
emoji:
title: "Emoji"
@@ -2580,21 +3024,24 @@ pt:
sample: "Utilize o seguinte código HTML no seu sítio para criar e incorporar tópicos do discourse. Substitua REPLACE_ME pelo URL canónico da página onde está a incorporá-los."
title: "Incorporação"
host: "Servidores Permitidos"
+ path_whitelist: "Lista Branca de Caminhos"
edit: "editar"
- category: "Mensagem para Categoria"
+ category: "Publicação para Categoria"
add_host: "Adicionar Servidor"
settings: "Configurações de Incorporação"
feed_settings: "Configurações do Feed"
feed_description: "Fornecer um fed RSS/ATOM para o seu sítio pode melhorar a habilidade do Discourse de importar o seu conteúdo."
crawling_settings: "Configurações de Rastreio"
- crawling_description: "Quando o Discourse cria tópicos para as suas mensagens, se nenhum feed RSS/ATOM está presente o Discourse irá tentar analisar o seu conteúdo fora do seu HTML. Algumas vezes pode ser um desafio extrair o seu conteúdo, por isso temos a habilidade de especificar regras CSS para tornar a extração mais fácil. "
+ crawling_description: "Quando o Discourse cria tópicos para as suas publicações, se nenhum feed RSS/ATOM está presente o Discourse irá tentar analisar o seu conteúdo fora do seu HTML. Algumas vezes pode ser um desafio extrair o seu conteúdo, por isso temos a habilidade de especificar regras CSS para tornar a extração mais fácil. "
embed_by_username: "Nome de uilizador para criação do tópico"
- embed_post_limit: "Número máximo de mensagens a incorporar"
+ embed_post_limit: "Número máximo de publicações a incorporar"
embed_username_key_from_feed: "Chave para puxar o nome de utilizador discouse do feed"
- embed_truncate: "Truncar as mensagens incorporadas"
+ embed_title_scrubber: "Expressão regular usada para filtrar o título de publicações"
+ embed_truncate: "Truncar as publicações incorporadas"
embed_whitelist_selector: "Seletor CSS para elementos que são permitidos nas incorporações"
embed_blacklist_selector: "Seletor CSS para elementos que são removidos das incorporações"
- feed_polling_enabled: "Importar mensagens através de RSS/ATOM"
+ embed_classname_whitelist: "Nomes de classes CSS permitidas"
+ feed_polling_enabled: "Importar publicações através de RSS/ATOM"
feed_polling_url: "URL do feed RSS/ATOM para rastreio"
save: "Guardar Configurações de Incorporação"
permalink:
@@ -2602,13 +3049,32 @@ pt:
url: "URL"
topic_id: "ID do Tópico"
topic_title: "Tópico"
- post_id: "ID da Mensagem"
- post_title: "Mensagem"
+ post_id: "ID da Publicação"
+ post_title: "Publicação"
category_id: "ID da Categoria"
category_title: "Categoria"
external_url: "URL Externo"
- delete_confirm: Tem a certeza que deseja eliminar esta hiperligação permanente?
+ delete_confirm: Tem a certeza que deseja eliminar esta ligação permanente?
form:
label: "Novo:"
add: "Adicionar"
filter: "Pesquisar (URL ou URL Externo)"
+ wizard_js:
+ wizard:
+ done: "Concluído"
+ back: "Retroceder"
+ next: "Próximo"
+ step: "%{current} de %{total}"
+ upload: "Carregar"
+ uploading: "A carregar…"
+ quit: "Talvez Mais Tarde"
+ staff_count:
+ one: "A sua comunidade tem 1 membro na equipa de apoio."
+ other: "A sua comunidade tem %{count} membros na equipa de apoio."
+ invites:
+ add_user: "adicionar"
+ none_added: "Não convidou ninguém para a equipa de apio. Tem a certeza de que quer continuar?"
+ roles:
+ admin: "Administrador"
+ moderator: "Moderador"
+ regular: "Utilizador Regular"
diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml
index da3dc3cafbd..8c7bd25cb3f 100644
--- a/config/locales/client.pt_BR.yml
+++ b/config/locales/client.pt_BR.yml
@@ -9,7 +9,7 @@ pt_BR:
js:
number:
format:
- separator: "."
+ separator: ","
delimiter: ","
human:
storage_units:
@@ -48,9 +48,6 @@ pt_BR:
x_seconds:
one: "1s"
other: "%{count}s"
- less_than_x_minutes:
- one: "< 1m"
- other: "< %{count}m"
x_minutes:
one: "1m"
other: "%{count}m"
@@ -106,7 +103,7 @@ pt_BR:
next_month: 'Próximo Mês'
share:
topic: 'compartilhe o link desse tópico'
- post: 'post #%{postNumber}'
+ post: 'mensagem #%{postNumber}'
close: 'fechar'
twitter: 'compartilhe este link no Twitter'
facebook: 'compartilhe este link no Facebook'
@@ -139,7 +136,10 @@ pt_BR:
enabled: 'listou %{when}'
disabled: 'desalistou %{when}'
topic_admin_menu: "ações administrativas do tópico"
+ wizard_required: "Chegou a hora de configurar seu fórum! Começar o Assistente de Configuração!"
emails_are_disabled: "Todo o envio de email foi globalmente desabilitado por algum administrador. Nenhum email de notificações de qualquer tipo será enviado."
+ bootstrap_mode_enabled: "Para facilitar o lançamento do seu novo site, você esta no modo de inicialização. A todos os novos usuários, será concedido o nível de confiança 1 e eles terão o resumo diário de atualizações por email ativado. Isso será automaticamente desativado quando a contagem total de usuários exceder %{min_users} usuários."
+ bootstrap_mode_disabled: "O modo de inicialização será desativado nas próximas 24 horas."
s3:
regions:
us_east_1: "Leste dos EUA (N. da Virgínia)"
@@ -150,9 +150,11 @@ pt_BR:
eu_central_1: "EU (Frankfurt)"
ap_southeast_1: "Ásia Pacífico (Singapura)"
ap_southeast_2: "Ásia Pacífico (Sidney)"
+ ap_south_1: "Ásia-Pacífico (Mumbai)"
ap_northeast_1: "Ásia Pacífico (Tóquio)"
ap_northeast_2: "Ásia Pacífico (Seul)"
sa_east_1: "América do Sul (São Paulo)"
+ cn_north_1: "China (Beijing)"
edit: 'edite o título e a categoria deste tópico'
not_implemented: "Esse recurso ainda não foi implementado, desculpe!"
no_value: "Não"
@@ -253,6 +255,8 @@ pt_BR:
undo: "Desfazer"
revert: "Reverter"
failed: "Falhou"
+ switch_to_anon: "Entrar no Modo Anônimo"
+ switch_from_anon: "Sair do Modo Anônimo"
banner:
close: "Ignorar este banner."
edit: "Editar este banner >>"
@@ -317,18 +321,15 @@ pt_BR:
total_rows:
one: "1 usuário"
other: "%{count} usuários"
+ group_histories:
+ actions:
+ add_user_to_group: "Adicionar usuário"
+ remove_user_from_group: "Remover usuário"
groups:
- empty:
- posts: "Não há postagens por membros deste grupo."
- members: "Não há membros neste grupo."
- mentions: "Não há menção a este grupo."
- messages: "Não há mensagens para este grupo."
- topics: "Não há topicos por membros deste grupo."
add: "Adicionar"
selector_placeholder: "Adicionar membros"
owner: "proprietário"
visible: "Grupo é visível para todos os usuários"
- index: "Grupos"
title:
one: "grupo"
other: "grupos"
@@ -349,19 +350,20 @@ pt_BR:
none: "Nenhum"
notifications:
watching:
- title: "Assistindo"
+ title: "Observando"
description: "Você será notificado sobre toda nova postagem em toda mensagem, e uma contagem de novas mensagens será mostrada."
watching_first_post:
+ title: "Observando o primeiro post"
description: "Você somente será notificado sobre a primeira postagem em cada novo tópico neste grupo."
tracking:
- title: "Rastreando"
+ title: "Monitorando"
description: "Você será notificado se alguém mencionar seu @name ou responder a você, e uma contagem de novas respostas será mostrada."
regular:
title: "Normal"
description: "Você será notificado se alguém mencionar seu @name ou responder a você."
muted:
- title: "Mudo"
- description: "Você será notificado sobre qualquer coisa sobre novos tópicos neste grupo."
+ title: "Silenciado"
+ description: "Você nunca será notificado sobre novos tópicos nesse grupo."
user_action_groups:
'1': "Curtidas dadas"
'2': "Curtidas recebidas"
@@ -395,14 +397,12 @@ pt_BR:
latest_by: "recentes por"
toggle_ordering: "alternar controle de ordenação"
subcategories: "Subcategorias"
- topic_stats: "O número de novos tópicos."
+ topic_sentence:
+ one: "1 tópico"
+ other: "%{count} tópicos"
topic_stat_sentence:
one: "%{count} novo tópico nos últimos %{unit}."
other: "%{count} novos tópicos nos últimos %{unit}."
- post_stats: "O número de mensagens novas."
- post_stat_sentence:
- one: "%{count} nova mensagem nos últimos %{unit}."
- other: "%{count} novas mensagens nos últimos %{unit}."
ip_lookup:
title: Pesquisa do endereço de IP
hostname: Nome do host
@@ -425,7 +425,10 @@ pt_BR:
profile: "Perfil"
mute: "Silenciar"
edit: "Editar Preferências"
- download_archive: "Fazer Download dos Meus Posts"
+ download_archive:
+ button_text: "Baixar Minhas Publicações"
+ confirm: "Você tem certeza de que quer baixar as suas publicações?"
+ rate_limit_error: "Publicações podem ser baixadas somente uma vez por dia, por favor tente novamente amanhã."
new_private_message: "Nova Mensagem"
private_message: "Mensagem"
private_messages: "Mensagens"
@@ -447,7 +450,9 @@ pt_BR:
disable: "Desativar Notificações"
enable: "Ativar Notificações"
each_browser_note: "Nota: Você deve modificar essa configuração em todos navegadores que você usa."
+ dismiss_notifications: "Descartar tudo"
dismiss_notifications_tooltip: "Marcar todas as notificações não lidas como lidos"
+ first_notification: "Sua primeira notificação! Selecione-a para começar."
disable_jump_reply: "Não pular para o meu tópico depois que eu respondo"
dynamic_favicon: "Exibir ícone no navegador de tópicos novos / atualizados."
external_links_in_new_tab: "Abrir todos os links externos em uma nova aba"
@@ -463,13 +468,31 @@ pt_BR:
github_profile: "Github"
email_activity_summary: "Sumário de Atividades"
mailing_list_mode:
+ label: "Modo de lista de discussão"
+ enabled: "Ativar o modo lista de discussão"
+ instructions: |
+ Essa opção sobrepõe o sumário de atividades.
+ Tópicos e categorias silenciados não são incluídos nesses emails.
daily: "Enviar atualizações diárias"
individual: "Enviar email para cada postagem nova"
+ individual_no_echo: "Mande um email para todas as novas publicações, exceto as minhas"
+ many_per_day: "Me envie um email para cada nova postagem (aproximadamente {{dailyEmailEstimate}} por dia)"
few_per_day: "Me envie um email para cada nova postagem (aproximadamente 2 por dia)"
- tracked_tags: "Monitorado"
+ tag_settings: "Etiquetas"
+ watched_tags: "Observadas"
+ watched_tags_instructions: "Você vai observar automaticamente todos os tópicos com estas etiquetas. Você será notificado de todas as novas mensagens e tópicos. Além disso, a contagem de mensagens novas também aparecerá ao lado do tópico."
+ tracked_tags: "Monitoradas"
+ tracked_tags_instructions: "Você vai monitorar automaticamente todos os tópicos com essas etiquetas. A contagem de mensagens novas aparecerá ao lado do tópico."
muted_tags: "Silenciado"
- watched_categories: "Acompanhados"
- tracked_categories: "Monitorado"
+ muted_tags_instructions: "Você não será notificado sobre novos tópicos com estas etiquetas, e eles não aparecerão nos tópicos Recentes"
+ watched_categories: "Observando"
+ watched_categories_instructions: "Você vai observar automaticamente todos os tópicos dessas categorias. Você será notificado de todas as novas mensagens e tópicos. Além disso, a contagem de mensagens novas também aparecerá ao lado do tópico."
+ tracked_categories: "Monitoradas"
+ tracked_categories_instructions: "Você vai monitorar automaticamente todos os tópicos dessas categorias. A contagem de mensagens novas aparecerá ao lado do tópico."
+ watched_first_post_categories: "Observando a primeira mensagem"
+ watched_first_post_categories_instructions: "Você será notificado sobre a primeira postagem em cada novo tópico destas categorias."
+ watched_first_post_tags: "Observando a primeira mensagem"
+ watched_first_post_tags_instructions: "Você será notificado sobre a primeira postagem em cada novo tópico com estas etiquetas."
muted_categories: "Silenciado"
muted_categories_instructions: "Você não será notificado sobre novos tópicos nessas categorias, e não aparecerão no Recentes"
delete_account: "Excluir Minha Conta"
@@ -484,9 +507,13 @@ pt_BR:
muted_topics_link: "Mostrar tópicos silenciados"
watched_topics_link: "Mostrar tópicos observados"
automatically_unpin_topics: "Desafixar automaticamente os tópicos quando eu chegar ao fundo."
+ apps: "Aplicativos"
+ revoke_access: "Revogar Acesso"
+ undo_revoke_access: "Desfazer a Revogação de Acesso"
+ api_approved: "Aprovada:"
staff_counters:
flags_given: "sinalizadas úteis"
- flagged_posts: "posts marcados"
+ flagged_posts: "posts sinalizados"
deleted_posts: "posts apagados"
suspensions: "suspensões"
warnings_received: "avisos"
@@ -512,6 +539,7 @@ pt_BR:
error: "Houve um erro ao alterar esse valor."
change_username:
title: "Alterar Nome de Usuário"
+ confirm: "Se você mudar seu Nome de Usuário, todas as citações das suas respostas e as menções ao seu @nome serão desfeitas. Você tem certeza?"
taken: "Desculpe, esse Nome de Usuário já está sendo usado."
error: "Houve um erro ao alterar o seu Nome de Usuário."
invalid: "Esse Nome de Usuário é inválido. Deve conter apenas números e letras."
@@ -521,11 +549,11 @@ pt_BR:
error: "Houve um erro ao alterar seu email. Talvez ele já esteja sendo usado neste forum?"
success: "Enviamos um email para esse endereço. Por favor, siga as instruções de confirmação."
change_avatar:
- title: "Mudar sua imagem de perfil"
+ title: "Alterar sua imagem de perfil"
gravatar: "Gravatar, baseado em"
gravatar_title: "Alterar seu avatar no site do Gravatar"
- refresh_gravatar_title: "Atualizar o Gravatar"
- letter_based: "Imagem de perfil dada pelo sistema"
+ refresh_gravatar_title: "Atualize seu Gravatar"
+ letter_based: "Sistema concedeu imagem de perfil."
uploaded_avatar: "Foto pessoal"
uploaded_avatar_empty: "Adicionar foto pessoal"
upload_title: "Enviar sua foto"
@@ -568,16 +596,17 @@ pt_BR:
enter_email: 'Nome de usuário encontrado, insira o email correspondente. '
prefilled: "Email corresponde a esse nome de usuário registrado"
locale:
- title: "idioma da interface"
- instructions: "Idioma da interface de usuário. Irá mudar quando você atualizar a página."
+ title: "idioma de interface"
+ instructions: "Idioma de interface do usuário. Será alterado quando você atualizar a página."
default: "(padrão)"
+ any: "qualquer"
password_confirmation:
title: "Senha novamente"
last_posted: "Última resposta"
last_emailed: "Último email enviado"
last_seen: "Visto"
created: "Entrou"
- log_out: "Log Out"
+ log_out: "Sair"
location: "Localização"
card_badge:
title: "Cartão de emblemas do usuário"
@@ -586,7 +615,7 @@ pt_BR:
like_notification_frequency:
title: "Notificar ao ser curtido"
always: "Sempre"
- first_time_and_daily: "Primeira curtida em um post e diariamente"
+ first_time_and_daily: "Postagem é curtida pela primeira vez e diariamente"
first_time: "Primeira curtida em um post"
never: "Nunca"
email_previous_replies:
@@ -595,12 +624,14 @@ pt_BR:
always: "sempre"
never: "nunca"
email_digests:
+ title: "Mande-me um email com o sumário dos tópicos e respostas populares quando eu não visitar o fórum"
every_30_minutes: "a cada 30 minutos"
every_hour: "a cada hora"
daily: "diariamente"
every_three_days: "a cada três dias"
weekly: "semanalmente"
every_two_weeks: "a cada duas semanas"
+ include_tl0_in_digests: "Incluir o conteúdo de usuários novos nos emails de sumário"
email_in_reply_to: "Incluir um excerto das respostas ao post nos emails"
email_direct: "Me envie um email quando alguém me citar, responder minhas mensagens, mencionar meu @usuário, ou me convidar para um tópico"
email_private_messages: "Me envie um email quando alguém me enviar mensagem particular"
@@ -613,12 +644,12 @@ pt_BR:
new_topic_duration:
label: "Considerar tópicos como novos quando"
not_viewed: "Eu ainda não os vi"
- last_here: "criado desde de que eu estava aqui pela última vez"
+ last_here: "criado desde de que estive aqui pela última vez"
after_1_day: "criado(s) no último(s) dia"
after_2_days: "criado(s) nos último(s) 2 dias"
after_1_week: "criado na última semana"
after_2_weeks: "criado nas últimas 2 semanas"
- auto_track_topics: "Seguir automaticamente tópicos que eu entro"
+ auto_track_topics: "Monitorar automaticamente tópicos que eu entro"
auto_track_options:
never: "nunca"
immediately: "imediatamente"
@@ -629,6 +660,7 @@ pt_BR:
after_4_minutes: "depois de 4 minutos"
after_5_minutes: "depois de 5 minutos"
after_10_minutes: "depois de 10 minutos"
+ notification_level_when_replying: "Quando eu publicar um tópico, definir o tópico como"
invited:
search: "digite para pesquisar convites..."
title: "Convites"
@@ -659,13 +691,11 @@ pt_BR:
account_age_days: "Idade da conta em dias"
create: "Enviar um convite"
generate_link: "Copiar Link do Convite"
- generated_link_message: '
Link do convite gerado com sucesso!
Link do convite válido apenas para este endereço de email: %{invitedEmail}
' + link_generated: "Link de convite gerado com sucesso!" + valid_for: "Link de convite é válido apenas para esse endereço de email: %{email}" bulk_invite: - none: "Você ainda não convidou ninguém. Você pode enviar convites individuais, ou enviar vários de uma vez através da ferramenta de enviar em massa." text: "Convidar em massa a partir de arquivo" - uploading: "Subindo..." success: "Arquivo enviado com sucesso, você será notificado por mensagem quando o processo estiver completo." - error: "Houve um erro ao enviar '{{filename}}': {{message}}" password: title: "Senha" too_short: "A sua senha é muito curta." @@ -684,12 +714,21 @@ pt_BR: post_count: one: "post criado" other: "posts criados" + likes_given: + one: " dada" + other: " dadas" + likes_received: + one: " recebida" + other: " recebidas" days_visited: one: "dia visitado" other: "dias visitados" posts_read: one: "post lido" other: "posts lidos" + bookmark_count: + one: "favorito" + other: "favoritos" top_replies: "Mais Respondidos" no_replies: "Nenhuma resposta ainda." more_replies: "Mais Respostas" @@ -699,6 +738,12 @@ pt_BR: top_badges: "Principais Emblemas" no_badges: "Nenhum emblema ainda." more_badges: "Mais Emblemas" + top_links: "Principais Links" + no_links: "Ainda sem nenhum link." + most_liked_by: "Mais Curtidos Por" + most_liked_users: "Mais Curtidos" + most_replied_to_users: "Mais Respondidos" + no_likes: "Ainda sem nenhuma curtida." associated_accounts: "Logins" ip_address: title: "Último endereço IP" @@ -748,10 +793,14 @@ pt_BR: too_few_topics_notice: "Vamos começar essa discussão! Existem atualmente %{currentTopics} / %{requiredTopics} tópicos. Novos visitantes precisam de algumas conversas para ler e responder." too_few_posts_notice: "Vamos começar essa discussão! Existem atualmente %{currentPosts} / %{requiredPosts} mensagens. Novos visitantes precisam de algumas conversas para ler e responder." logs_error_rate_notice: + reached: "%{relativeAge} – %{rate} alcançou a configuração limite do site de %{siteSettingRate}." + exceeded: "%{relativeAge} – %{rate} excedeu a configuração limite do site de %{siteSettingRate}." rate: one: "1 erro/%{duration}" other: "%{count} erros/%{duration}" learn_more: "aprenda mais..." + all_time: 'total' + all_time_desc: 'total de tópicos criados' year: 'ano' year_desc: 'tópicos criados nos últimos 365 dias' month: 'mês' @@ -798,6 +847,7 @@ pt_BR: trust_level: 'Nível de confiança' search_hint: 'nome de usuário, email ou endereço de IP' create_account: + disclaimer: "Ao se registrar, você concorda com a política de privacidade e os termos de serviço." title: "Criar nova conta" failed: "Alguma coisa deu errado, talvez este email já esteja registrado, tente usar o Esqueci a Senha." forgot_password: @@ -857,8 +907,15 @@ pt_BR: title: "com GitHub" message: "Autenticando com GitHub (certifique-se de que os bloqueadores de popup estejam desativados)" emoji_set: + apple_international: "Apple/Internacional" google: "Google" twitter: "Twitter" + emoji_one: "Emoji One" + win10: "Win10" + category_page_style: + categories_only: "Categorias Apenas" + categories_with_featured_topics: "Categorias com Tópicos em Destaque" + categories_and_latest_topics: "Categorias e Últimos Tópicos" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' @@ -868,14 +925,23 @@ pt_BR: more_emoji: "mais..." options: "Opções" whisper: "sussuro" + unlist: "Não listado" add_warning: "Este é um aviso oficial." toggle_whisper: "Habilitar Sussuro" + toggle_unlisted: "Alterar não listado" posting_not_on_topic: "Qual tópico você gostaria de responder?" saving_draft_tip: "gravando..." saved_draft_tip: "salvo" saved_local_draft_tip: "salvo localmente" similar_topics: "Seu tópico é parecido com..." drafts_offline: "rascunhos offline" + group_mentioned: + one: "Ao mencionar {{group}}, você está prester a notifcar 1 pessoa – tem certeza?" + other: "Ao mencionar {{group}}, você está prestes a notificar {{count}} pessoas – tem certeza?" + cannot_see_mention: + category: "Você mencionou {{username}}, porém ele(a) não será notificado(a), pois não tem acesso a essa categoria. Você deverá adicioná-lo(a) ao grupo que tem acesso à categoria." + private: "Você mencionou {{username}}, porém ele(a) não será notificado(a), pois não pode ver essa mensagem pessoal. Você deverá convidá-lo(a) para essa MP." + duplicate_link: "Parece que o seu link para {{domain}} já foi postado no tópico por @{{username}} em uma resposta {{ago}} – tem certeza que deseja postá-lo novamente?" error: title_missing: "Título é obrigatório" title_too_short: "O título tem que ter no mínimo {{min}} caracteres" @@ -896,6 +962,7 @@ pt_BR: title_placeholder: "Sobre o que é esta discussão em uma pequena frase?" edit_reason_placeholder: "por que você está editando?" show_edit_reason: "(adicione motivo da edição)" + topic_featured_link_placeholder: "Entre com o link mostrado no título." reply_placeholder: "Escreva aqui. Use Markdown, BBCode ou HTML para formatar. Arraste ou cole uma imagens." view_new_post: "Ver sua nova resposta." saving: "Salvando" @@ -905,8 +972,10 @@ pt_BR: show_preview: 'mostrar pré-visualização »' hide_preview: '« esconder pré-visualização' quote_post_title: "Citar toda a resposta" + bold_label: "B" bold_title: "Negrito" bold_text: "texto em negrito" + italic_label: "I" italic_title: "Itálico" italic_text: "texto em itálico" link_title: "Link" @@ -918,11 +987,13 @@ pt_BR: quote_text: "Bloco de citação" code_title: "Texto pré-formatado" code_text: "identar texto pre-formatado em 4 espaços" + paste_code_text: "escreva ou cole o código aqui" upload_title: "Enviar" upload_description: "digite aqui a descrição do arquivo enviado" olist_title: "Lista numerada" ulist_title: "Lista de itens" list_item: "Item da lista" + heading_label: "H" heading_title: "Título" heading_text: "Título" hr_title: "Barra horizontal" @@ -931,6 +1002,9 @@ pt_BR: modal_ok: "OK" modal_cancel: "Cancelar" cant_send_pm: "Desculpe, você não pode enviar uma mensagem para %{username}." + yourself_confirm: + title: "Você se esqueceu de adicionar destinatários?" + body: "No momento esta mensagem está sendo enviada apenas para si mesmo!" admin_options_title: "Configurações opcionais da equipe para este tópico" auto_close: label: "Tempo para fechamento automático do tópico:" @@ -944,6 +1018,7 @@ pt_BR: notifications: title: "notificações de menção de @name, respostas às suas postagens, tópicos, mensagens, etc" none: "Não foi possível carregar notificações no momento." + empty: "Não foi encontrada nenhuma notificação." more: "ver notificações antigas" total_flagged: "total de mensagens sinalizadas" mentioned: "
{{username}} {{description}}
" @@ -962,7 +1037,9 @@ pt_BR: invited_to_topic: "
{{username}} {{description}}
" invitee_accepted: "
{{username}} accepted your invitation
" moved_post: "
{{username}} moved {{description}}
" + linked: "
{{username}} {{description}}
" granted_badge: "
Adquirido '{{description}}'
" + watching_first_post: "
Novo Tópico {{description}}
" group_message_summary: one: "
{{count}} mensagem na caixa de entrada de {{group_name}}
" other: "
{{count}} mensagens na caixa de entrada de {{group_name}}
"
@@ -979,7 +1056,7 @@ pt_BR:
invitee_accepted: "Convite aceito por"
moved_post: "Seu tópico foi movido por"
linked: "Link para sua mensagem"
- granted_badge: "Emblema recebido"
+ granted_badge: "Emblema concedido"
group_message_summary: "Mensagens na caixa de entrada do grupo"
popup:
mentioned: '{{username}} mencionou você em "{{topic}}" - {{site_title}}'
@@ -1011,26 +1088,65 @@ pt_BR:
most_liked: "Mais Curtido"
select_all: "Selecionar Todos"
clear_all: "Limpar Todos"
+ too_short: "Seu termo de pesquisa é muito curto."
result_count:
one: "1 resultado para \"{{term}}\""
other: "{{count}} resultados para \"{{term}}\""
title: "procurar em tópicos, respostas, usuários ou categorias"
no_results: "Nenhum resultado encontrado."
no_more_results: "Sem mais resultados encontrados."
- search_help: Ajuda na busca
searching: "Procurando..."
post_format: "#{{post_number}} por {{username}}"
context:
user: "Procurar respostas de @{{username}}"
+ category: "Procurar a categoria #{{category}}"
topic: "Procurar nesse tópico"
private_messages: "Procurar mensagens"
+ advanced:
+ title: Busca avançada
+ posted_by:
+ label: Postado por
+ in_category:
+ label: Em Categoria
+ in_group:
+ label: Em Grupo
+ with_badge:
+ label: Com Emblema
+ with_tags:
+ label: Com Etiquetas
+ filters:
+ label: Retornar apenas tópicos/publicações que...
+ likes: Eu gostei
+ posted: Eu publiquei em
+ watching: Eu estou assistindo
+ tracking: Eu estou rastreando
+ private: estão em minhas mensagens
+ bookmarks: Eu marquei
+ first: são a primeira publicação
+ pinned: está fixado
+ unpinned: não está fixado
+ statuses:
+ open: está aberto
+ closed: está fechado
+ archived: está arquivado
+ noreplies: tem zero respostas
+ single_user: contém um único usuário
+ post:
+ count:
+ label: Contagem de Publicação Mínima
+ time:
+ label: Publicado
+ before: antes
+ after: depois
hamburger_menu: "ir para outra listagem de tópicos ou categoria"
new_item: "novo"
go_back: 'voltar'
not_logged_in_user: 'página do usuário com resumo de atividades correntes e preferencias'
current_user: 'ir para a sua página de usuário'
topics:
+ new_messages_marker: "última visita"
bulk:
+ select_all: "Selecionar Tudo"
unlist_topics: "Tópicos Não Listados"
reset_read: "Redefinir Lido"
delete: "Apagar Tópicos"
@@ -1050,6 +1166,7 @@ pt_BR:
selected:
one: "Você selecionou 1 tópico."
other: "Você selecionou {{count}} tópicos."
+ change_tags: "Mudar Etiquetas"
choose_new_tags: "Escolha novas tags para esses tópicos:"
changed_tags: "As tags para esses tópicos foram alteradas."
none:
@@ -1081,7 +1198,9 @@ pt_BR:
unsubscribe:
stop_notifications: "Você agora vai receber menos notificações de {{title}}"
change_notification_state: "Seu estado de notificação atual é"
- filter_to: "{{post_count}} mensagens no tópico"
+ filter_to:
+ one: "1 publicação no tópico"
+ other: "{{count}} publicações no tópico"
create: 'Novo tópico'
create_long: 'Criar um novo tópico'
private_message: 'Iniciar uma mensagem'
@@ -1129,7 +1248,7 @@ pt_BR:
toggle_information: "alternar detalhes do tópico"
read_more_in_category: "Quer ler mais? Procure outros tópicos em {{catLink}} ou {{latestLink}}."
read_more: "Quer ler mais? {{catLink}} ou {{latestLink}}."
- read_more_MF: "Há { UNREAD, plural, =0 {} one { 1 não lido }\tother { are # não lidos } } { NEW, plural, =0 {} one { {BOTH, select, true{e } false {} other{}} 1 novo tópico} other { {BOTH, select, true{e } false {} other{}} # novos tópicos} } ou {CATEGORY, select, true {veja outros tópicos em {catLink}} false {{latestLink}} other {}}"
+ read_more_MF: "Há { UNREAD, plural, =0 {} one { 1 não lido }\tother {# não lidos } } { NEW, plural, =0 {} one { {BOTH, select, true{e } false {} other{}} 1 novo tópico} other { {BOTH, select, true{e } false {} other{}} # novos tópicos} } ou {CATEGORY, select, true {veja outros tópicos em {catLink}} false {{latestLink}} other {}}"
browse_all_categories: Procurar em todas as categorias
view_latest_topics: ver tópicos mais recentes
suggest_create_topic: Que tal criar um tópico?
@@ -1141,24 +1260,31 @@ pt_BR:
auto_close_title: 'Configurações para fechar automaticamente'
auto_close_save: "Salvar"
auto_close_remove: "Não fechar automaticamente este tópico"
- auto_close_immediate: "O último tópico postado foi há %{hours} horas, então o tópico será fechado imadiatamente.."
+ auto_close_immediate:
+ one: "A última publicação no tópico já tem 1 hora, portanto ele será fechado imediatamente."
+ other: "A última publicação no tópico já tem %{count} horas, portanto ele será fechado imediatamente."
timeline:
back: "Voltar"
back_description: "Volte para a sua última postagem não lida"
+ replies_short: "%{current} / %{total}"
progress:
title: progresso do tópico
go_top: "topo"
go_bottom: "último"
go: "ir"
jump_bottom: "ir para a última mensagem"
+ jump_prompt: "ir para a mensagem"
+ jump_prompt_long: "Gostaria de ir para qual mensagem?"
jump_bottom_with_number: "ir para a mensagem %{post_number}"
total: total de mensagens
current: resposta atual
- position: "mensagem %{current} de %{total}"
notifications:
+ title: altere a frequência de notificações deste tópico
reasons:
- '3_6': 'Você receberá notificações porque você está acompanhando esta categoria.'
- '3_5': 'Você receberá notificações porque começou a acompanhar este tópico automaticamente.'
+ mailing_list_mode: "Você está com o modo de lista de discussão ativado, portanto será notificado sobre as respostas deste tópico por email."
+ '3_10': 'Você receberá notificações porque está acompanhando uma etiqueta neste tópico.'
+ '3_6': 'Você receberá notificações porque você está observando esta categoria.'
+ '3_5': 'Você receberá notificações porque começou a observar este tópico automaticamente.'
'3_2': 'Você receberá notificações porque está observando este tópico.'
'3_1': 'Você receberá notificações porque criou este tópico.'
'3': 'Você receberá notificações porque você está observando este tópico.'
@@ -1172,7 +1298,7 @@ pt_BR:
'0_2': 'Você está ignorando todas as notificações deste tópico.'
'0': 'Você está ignorando todas as notificações deste tópico.'
watching_pm:
- title: "Acompanhando"
+ title: "Observando"
description: "Você será notificado de cada mensagem nova neste tópico. Um contador de mensagens novas e não lidas também aparecerá próximo ao tópico."
watching:
title: "Observar"
@@ -1194,6 +1320,7 @@ pt_BR:
description: "Você nunca será notificado de qualquer coisa sobre essa mensagem privada."
muted:
title: "Silenciar"
+ description: "Você nunca será notificado sobre esse tópico e ele não aparecerá nos tópicos recentes."
actions:
recover: "Recuperar Tópico"
delete: "Apagar tópico"
@@ -1208,6 +1335,8 @@ pt_BR:
invisible: "Tornar Invisível"
visible: "Tornar Visível"
reset_read: "Repor data de leitura"
+ make_public: "Transformar em Tópico Público"
+ make_private: "Transformar em Mensagem Privada"
feature:
pin: "Fixar Tópico"
unpin: "Desafixar Tópico"
@@ -1223,6 +1352,9 @@ pt_BR:
share:
title: 'Compartilhar'
help: 'compartilhar um link deste tópico'
+ print:
+ title: 'Imprimir'
+ help: 'Abrir uma versão imprimível deste tópico'
flag_topic:
title: 'Sinalizar'
help: 'sinaliza privativamente este tópico para chamar atenção ou notificar privativamente sobre isso'
@@ -1236,15 +1368,23 @@ pt_BR:
pin_note: "Usuários podem desafixar o tópico individualmente para si."
pin_validation: "Uma data é necessária para fixar este tópico."
not_pinned: "Não existem tópicos fixados em {{categoryLink}}."
+ already_pinned:
+ one: "Tópicos fixados em {{categoryLink}}: 1"
+ other: "Tópicos fixados em {{categoryLink}}: {{count}}"
pin_globally: "Fazer com que este tópico apareça no topo de todas listas de tópicos até"
confirm_pin_globally: "Você já tem {{count}} tópicos fixados globalmente. Muitos tópicos fixados podem prejudicar usuários novos e anônimos. Tem certeza que quer fixar outro tópico globalmente?"
unpin_globally: "Remover este tópico do inicio de todas as listas de tópicos."
unpin_globally_until: "Remover este tópico do topo de todas listagens de tópicos ou esperar até %{until}."
global_pin_note: "Usuários podem desafixar o tópico individualmente para si."
not_pinned_globally: "Não existem tópicos fixados globalmente."
+ already_pinned_globally:
+ one: "Tópicos atualmente fixados globalmente: {{count}}."
+ other: "Tópicos atualmente fixados globalmente: {{count}}"
make_banner: "Tornar este tópico em um banner que apareça no inicio de todas as páginas."
remove_banner: "Remover o banner que aparece no inicio de todas as páginas."
banner_note: "Usuários podem dispensar o banner fechando-o. Apenas um tópico pode ser colocado como banner a cada momento."
+ no_banner_exists: "Não existe tópico banner."
+ banner_exists: "Existe atualmente um tópico banner."
inviting: "Convidando..."
automatically_add_to_groups: "Este convite também inclui acesso para esses grupos:"
invite_private:
@@ -1253,6 +1393,7 @@ pt_BR:
email_or_username_placeholder: "email ou Nome de Usuário"
action: "Convite"
success: "Nós convidamos aquele usuário para participar desta mensagem privada."
+ success_group: "Nós convidamos aquele grupo para participar desta mensagem."
error: "Desculpe, houve um erro ao convidar esse usuário."
group_name: "nome do grupo"
controls: "Controles do Tópico"
@@ -1292,6 +1433,10 @@ pt_BR:
instructions:
one: "Por favor selecione o tópico para o qual você gostaria de mover esta resposta."
other: "Por favor selecione o tópico para o qual você gostaria de mover estas {{count}} respostas."
+ merge_posts:
+ title: "Unificar as Mensagens Selecionadas"
+ action: "unificar as mensagens selecionadas"
+ error: "Houve um erro ao unificar as mensagens selecionadas."
change_owner:
title: "Trocar Autor das Mensagens"
action: "trocar autor"
@@ -1322,7 +1467,7 @@ pt_BR:
post:
reply: " {{replyAvatar}} {{usernameLink}}"
reply_topic: " {{link}}"
- quote_reply: "citar resposta"
+ quote_reply: "Citação"
edit: "Em resposta a {{link}} por {{replyAvatar}} {{username}}"
edit_reason: "Motivo:"
post_number: "resposta {{number}}"
@@ -1339,7 +1484,6 @@ pt_BR:
gap:
one: "ver 1 resposta oculta"
other: "ver {{count}} respostas ocultas"
- more_links: "{{count}} mais..."
unread: "Resposta não lida"
has_replies:
one: "{{count}} Resposta"
@@ -1358,6 +1502,7 @@ pt_BR:
create: "Desculpe, houve um erro ao criar sua resposta. Por favor, tente outra vez."
edit: "Desculpe, houve um erro ao editar sua resposta. Por favor, tente outra vez."
upload: "Desculpe, houve um erro ao enviar esse arquivo. Por favor, tente outra vez."
+ file_too_large: "Desculpe, o arquivo que você está tentando enviar é muito grande (o tamanho máximo permitido é {{max_size_kb}}kb). Que tal enviar o seu arquivo grande para um serviço de hospedagem na nuvem e depois compartilhar o link?"
too_many_uploads: "Desculpe, você pode enviar apenas um arquivos por vez."
too_many_dragged_and_dropped_files: "Desculpe, você só pode subir até 10 arquivos de cada vez."
upload_not_authorized: "Desculpe, o tipo de arquivo que você está tentando enviar não está autorizado (extensões autorizadas: {{authorized_extensions}})."
@@ -1369,11 +1514,13 @@ pt_BR:
no_value: "Não, manter"
yes_value: "Sim, abandone"
via_email: "post recebido via email"
+ via_auto_generated_email: "essa mensagem chegou através de um email gerado automaticamente"
whisper: "esta mensagem é um sussuro privado para moderadores"
wiki:
about: "esta postagem é uma wiki"
archetypes:
save: 'Salvar as opções'
+ few_likes_left: "Obrigado por compartilhar o amor! Restam apenas algumas poucas curtidas sobrando para você usar hoje."
controls:
reply: "comece a compor uma resposta para este tópico"
like: "curtir esta resposta"
@@ -1405,14 +1552,6 @@ pt_BR:
defer_flags:
one: "Delegar denuncia"
other: "Delegar denúncias"
- it_too:
- off_topic: "Sinalizar também"
- spam: "Sinalizar também"
- inappropriate: "Sinalizar também"
- custom_flag: "Sinalizar também"
- bookmark: "Favoritar também"
- like: "Curtir também"
- vote: "Vote neste também"
undo:
off_topic: "Desfazer sinalização"
spam: "Desfazer sinalização"
@@ -1424,8 +1563,11 @@ pt_BR:
off_topic: "marcado como off-topic"
spam: "marcado como spam"
inappropriate: "marcado como inapropriado"
+ notify_moderators: "notificaram os moderadores"
notify_user: "enviou uma mensagem"
+ bookmark: "favoritaram isto"
like: "curtiu isto"
+ vote: "votaram nisto"
by_you:
off_topic: "Você sinalizou isto como off-topic"
spam: "Você sinalizou isto como spam"
@@ -1489,6 +1631,10 @@ pt_BR:
confirm:
one: "Tem certeza que quer apagar esta resposta?"
other: "Tem certeza que quer apagar todos essas respostas?"
+ merge:
+ confirm:
+ one: "Você tem certeza que quer fundir essas postagens?"
+ other: "Você tem certeza que quer fundir essas {{count}} postagens?"
revisions:
controls:
first: "Primeira revisão"
@@ -1520,6 +1666,11 @@ pt_BR:
general: 'Geral'
settings: 'Configurações'
topic_template: "Modelo de Tópico"
+ tags: "Etiquetas"
+ tags_allowed_tags: "Etiquetas que só podem ser usadas nesta categoria:"
+ tags_allowed_tag_groups: "Grupos de etiquetas que só podem ser usados nesta categoria:"
+ tags_placeholder: "(Opcional) lista de etiquetas permitidas"
+ tag_groups_placeholder: "(Opcional) lista de grupos de etiquetas permitidos"
delete: 'Apagar categoria'
create: 'Nova categoria'
create_long: 'Criar uma nova categoria'
@@ -1533,7 +1684,7 @@ pt_BR:
topic: "tópico da categoria"
logo: "Imagem do logo da categoria"
background_image: "Imagem de fundo da categoria"
- badge_colors: "Badge colors"
+ badge_colors: "Cores do emblema"
background_color: "Background color"
foreground_color: "Foreground color"
name_placeholder: "máximo de uma ou duas palavras"
@@ -1554,7 +1705,8 @@ pt_BR:
email_in_disabled: "Postar novos tópicos via email está desabilitado nas Configurações do Site. Para habilitar respostas em novos tópicos via email,"
email_in_disabled_click: 'habilitar a configuração de "email em".'
suppress_from_homepage: "Suprimir esta categoria da página inicial."
- allow_badges_label: "Permitir emblemas serem concedidos nessa categoria"
+ sort_order: "Ordenação Padrão:"
+ allow_badges_label: "Permitir a concessão de emblemas nessa categoria"
edit_permissions: "Editar Permissões"
add_permission: "Adicionar Permissões"
this_year: "este ano"
@@ -1566,27 +1718,45 @@ pt_BR:
notifications:
watching:
title: "Observar"
+ description: "Você vai observar automaticamente todos os tópicos dessas categorias. Você será notificado de todas as novas mensagens em todos os tópicos. Além disso, a contagem de novas respostas também será exibida."
+ watching_first_post:
+ title: "Observando o primeiro post"
+ description: "Você somente será notificado sobre a primeira postagem em cada novo tópico destas categorias."
tracking:
title: "Monitorar"
+ description: "Você vai monitorar automaticamente todos os tópicos dessas categorias. Você será notificado se alguém mencionar o seu @nome ou responder para você. Além disso, a contagem de novas respostas também será exibida."
regular:
title: "Normal"
description: "Você será notificado se alguém mencionar o seu @nome ou responder à sua mensagem."
muted:
title: "Silenciar"
description: "Você nunca será notificado sobre novos tópicos nessas categorias, e não aparecerão no Recentes."
+ sort_options:
+ default: "padrão"
+ likes: "Curtidas"
+ op_likes: "Curtidas da Publicação Original"
+ views: "Visualizações"
+ posts: "Postagens"
+ activity: "Atividade"
+ posters: "Participantes"
+ category: "Categoria"
+ created: "Criado"
+ sort_ascending: 'Ascendente'
+ sort_descending: 'Descendente'
flagging:
title: 'Obrigado por ajudar a manter a civilidade da nossa comunidade!'
action: 'Sinalizar resposta'
take_action: "Tomar Atitude"
notify_action: 'Mensagem'
+ official_warning: 'Aviso Oficial'
delete_spammer: "Apagar Spammer"
- delete_confirm: "Você está prestes a excluir %{posts} mensagens e %{topics} tópicos deste usuário, removendo a conta, bloqueando cadastro a partir do endereço IP %{ip_address} e adicionando o e-mail dele %{email} em uma lista de bloqueio permanente. Você tem certeza que este usuário é realmente um spammer?"
yes_delete_spammer: "Sim, Apagar Spammer"
ip_address_missing: "(N/D)"
hidden_email_address: "(escondido)"
submit_tooltip: "Enviar uma sinalização privada"
take_action_tooltip: "Atingir o limiar de denuncias imediatamente, ao invés de esperar para mais denuncias da comunidade"
cant: "Desculpe, não é possível colocar uma sinalização neste momento."
+ notify_staff: 'Avisar a equipe privadamente'
formatted_name:
off_topic: "É Off-Tópico"
inappropriate: "É inapropriado"
@@ -1594,9 +1764,15 @@ pt_BR:
custom_placeholder_notify_user: "Seja específico, construtivo e sempre seja gentil."
custom_placeholder_notify_moderators: "Deixe-nos saber especificamente com o que você está preocupado, e nos forneça links relevantes e exemplos quando possível."
custom_message:
- at_least: "insira pelo menos {{n}} caracteres"
- more: "{{n}} em falta..."
- left: "{{n}} restantes"
+ at_least:
+ one: "insira pelo menos 1 caractere"
+ other: "insira pelo menos {{count}} caracteres"
+ more:
+ one: "Falta apenas 1..."
+ other: "Faltam {{count}}..."
+ left:
+ one: "1 restante"
+ other: "{{count}} restantes"
flagging_topic:
title: "Obrigado por ajudar a manter a civilidade da nossa comunidade!"
action: "Sinalizar Tópico"
@@ -1609,6 +1785,11 @@ pt_BR:
clicks:
one: "1 clique"
other: "%{count} cliques"
+ post_links:
+ about: "expandir mais links para esta mensagem"
+ title:
+ one: "mais 1"
+ other: "mais %{count}"
topic_statuses:
warning:
help: "Este é um aviso oficial."
@@ -1631,8 +1812,7 @@ pt_BR:
help: "Este tópico está fixado para você; ele será mostrado no topo de sua categoria"
invisible:
help: "Este tópico está invisível; não aparecerá na listagem dos tópicos, e pode apenas ser acessado por link direto"
- posts: "Mensagens"
- posts_lowercase: "posts"
+ posts: "Postagens"
posts_long: "há {{number}} mensagens neste tópico"
posts_likes_MF: |
Este tópico tem {count, plural, one {1 resposta} other {# respostas}} {ratio, select,
@@ -1691,7 +1871,7 @@ pt_BR:
title_with_count:
one: "Não lido (1)"
other: "Não lidos ({{count}})"
- help: "tópicos que você está acompanhando ou monitorando com mensagens não lidas"
+ help: "tópicos que você está observando ou monitorando com mensagens não lidas"
lower_title_with_count:
one: "1 não lido"
other: "{{count}} não lidos"
@@ -1744,29 +1924,177 @@ pt_BR:
full: "Criar / Responder / Ver"
create_post: "Responder / Ver"
readonly: "Ver"
+ lightbox:
+ download: "download"
+ keyboard_shortcuts_help:
+ title: 'Atalhos de teclado'
+ jump_to:
+ title: 'Ir Para'
+ home: 'g, h Início'
+ latest: 'g, l Mais recentes'
+ new: 'g, n Novos'
+ unread: 'g, u Não Lidos'
+ categories: 'g, c Categorias'
+ top: 'g, t Topo'
+ bookmarks: 'g, b Favoritos'
+ profile: 'g, p Perfil'
+ messages: 'g, m Mensagens'
+ navigation:
+ title: 'Navegação'
+ jump: '# Ir para a mensagem #'
+ back: 'u Voltar'
+ up_down: 'k/j Move seleção ↑ ↓'
+ open: 'o ou Enter Abre tópico selecionado'
+ next_prev: 'shift+j/shift+k Pŕoxima seção/seção anterior'
+ application:
+ title: 'Aplicação'
+ create: 'c Criar um tópico novo'
+ notifications: 'n Abre notificações'
+ hamburger_menu: '= Abrir o menu hambúrguer'
+ user_profile_menu: 'p Abrir menu do usuário'
+ show_incoming_updated_topics: '. Exibir tópicos atualizados'
+ search: '/ Pesquisa'
+ help: '? Abrir ajuda de teclado'
+ dismiss_new_posts: 'x, r Descartar Novas Postagens'
+ dismiss_topics: 'x, t Descartar Tópicos'
+ log_out: 'shift+z shift+z Deslogar'
+ actions:
+ title: 'Ações'
+ bookmark_topic: 'f Favoritar o tópico'
+ pin_unpin_topic: 'shift+p Fixar/Desfixar tópico'
+ share_topic: 'shift+s Compartilhar tópico'
+ share_post: 's Compartilhar mensagem'
+ reply_as_new_topic: 't Responder como tópico linkado'
+ reply_topic: 'shift+r Responder ao tópico'
+ reply_post: 'r Responder a mensagem'
+ quote_post: 'q Citar resposta'
+ like: 'l Curtir a mensagem'
+ flag: '! Sinalizar mensagem'
+ bookmark: 'b Favoritar mensagem'
+ edit: 'e Editar mensagem'
+ delete: 'd Excluir mensagem'
+ mark_muted: 'm, m Silenciar tópico'
+ mark_regular: 'm, r Tópico regular (padrão)'
+ mark_tracking: 'm, t Monitorar o tópico'
+ mark_watching: 'm, w Observar o tópico'
+ print: 'ctrl+p Imprimir tópico'
badges:
+ earned_n_times:
+ one: "Emblema adquirido 1 vez"
+ other: "Emblema adquirido %{count} vezes"
+ granted_on: "Concedido em %{date}"
others_count: "Outros com esse emblema (%{count})"
title: Emblemas
+ allow_title: "título disponível"
+ multiple_grant: "concedido várias vezes"
+ badge_count:
+ one: "1 Emblema"
+ other: "%{count} Emblemas"
+ more_badges:
+ one: "+1 Mais"
+ other: "+%{count} Mais"
+ granted:
+ one: "1 concedido"
+ other: "%{count} concedidos"
select_badge_for_title: Selecione um emblema para usar como o seu título
+ none: "
+ Procurar com o Google
+
tagging:
+ all_tags: "Todas as Etiquetas"
+ selector_all_tags: "todas as etiquetas"
+ selector_no_tags: "sem etiquetas"
+ changed: "etiquetas alteradas:"
+ tags: "Etiquetas"
+ choose_for_topic: "Escolha marcadores opcionais para este tópico"
delete_tag: "Apagar marcação"
delete_confirm: "Você tem certeza que deseja apagar essa marcação?"
rename_tag: "Renomear marcador"
+ rename_instructions: "Escolha um novo nome para o marcador"
sort_by: "Ordenar por"
+ sort_by_count: "quantidade"
+ sort_by_name: "nome"
+ manage_groups: "Gerenciar grupos de marcadores"
+ manage_groups_description: "Definir grupos para organizar marcadores"
+ filters:
+ without_category: "%{filter} %{category} Tópicos"
+ with_category: "%{filter} %{tag} tópicos em %{category}"
+ untagged_without_category: "%{filter} tópicos não etiquetados"
+ untagged_with_category: "%{filter} tópicos não etiquetados em %{category}"
notifications:
+ watching:
+ title: "Observando"
+ description: "Você vai observar automaticamente todos os tópicos com esta etriqueta. 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."
+ watching_first_post:
+ title: "Observando o primeiro post"
+ description: "Você somente será notificado sobre a primeira postagem em cada novo tópico com esta etiqueta."
+ tracking:
+ title: "Monitorando"
+ description: "Automaticamente monitora todos tópicos com essa etiqueta. 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: "Silenciado"
+ description: "Você não será notificado sobre novos tópicos com essa etiqueta e eles não vão aparecer na guia de mensagens não lidas."
groups:
+ title: "Grupos de Etiquetas"
+ about: "Adicione marcadores aos grupos para gerenciá-los mais facilmente"
+ new: "Novo grupo"
+ tags_label: "Marcadores neste grupo"
+ parent_tag_label: "Categoria Principal"
+ parent_tag_placeholder: "Opcional"
+ parent_tag_description: "Etiquetas deste grupo não podem ser usadas a menos que a etiqueta principal esteja presente."
+ one_per_topic_label: "Limite uma etiqueta por tópico deste grupo"
+ new_name: "Novo Grupo de Etiquetas"
save: "Salvar"
delete: "Apagar"
+ confirm_delete: "Tem certeza de que deseja remover este grupo de etiquetas?"
topics:
none:
+ unread: "Não há nenhum tópico não lido."
new: "Você tem tópicos novos"
+ read: "Você ainda não leu nenhum tópico."
+ posted: "Você ainda não escreveu em nenhum tópico."
+ latest: "Não há tópicos recentes."
+ hot: "Não há tópicos quentes."
+ bookmarks: "Você ainda não tem tópicos nos favoritos."
+ top: "Não há tópicos em alta."
+ search: "Não foram encontrados resultados."
bottom:
+ latest: "Não há mais tópicos recentes."
+ hot: "Não há mais tópicos quentes."
+ posted: "Não há mais tópicos postados."
+ read: "Não há mais tópicos lidos."
new: "Não há mais tópicos novos."
+ unread: "Não há mais tópicos não lidos."
+ top: "Não há mais tópicos em alta."
+ bookmarks: "Não há mais tópicos nos favoritos."
+ search: "Não existem mais resultados."
+ invite:
+ custom_message: "Faça seu convite um pouco mais pessoal escrevendo um"
+ custom_message_link: "mensagem personalizada"
+ custom_message_placeholder: "Insira a sua mensagem personalizada"
+ custom_message_template_forum: "Ei, você devia entrar neste fórum!"
+ custom_message_template_topic: "Ei, eu acho que você vai gostar deste tópico!"
admin_js:
type_to_filter: "escreva para filtrar..."
admin:
@@ -1779,7 +2107,7 @@ pt_BR:
up_to_date: "Você está atualizado!"
critical_available: "Uma atualização crítica está disponível."
updates_available: "Atualizações estão disponíveis."
- please_upgrade: "Por favor atualize!"
+ please_upgrade: "Por favor, atualize!"
no_check_performed: "Não foi feita verificação por atualizações. Certifique-se de sidekiq esta em execucao."
stale_data: "Não foi feita verificação por atualizações ultimamente. Certifique-se de sidekiq esta em execucao."
version_check_pending: "Parece que você atualizou recentemente. Fantástico!"
@@ -1814,6 +2142,7 @@ pt_BR:
30_days_ago: "30 Dias Atrás"
all: "Tudo"
view_table: "tabela"
+ view_graph: "gráfico"
refresh_report: "Atualizar Relatório"
start_date: "Data de Início"
end_date: "Data do Final"
@@ -1891,19 +2220,17 @@ pt_BR:
refresh: "Atualizar"
new: "Novo"
selector_placeholder: "digite o nome de usuário"
- name_placeholder: "Nome do grupo, sem espaços, regras iguais ao nome de usuário"
about: "Editar participação no grupo e nomes aqui"
group_members: "Membros do grupo"
delete: "Apagar"
delete_confirm: "Apagar este grupos?"
delete_failed: "Unable to delete group. If this is an automatic group, it cannot be destroyed."
- delete_member_confirm: "Remover '%{username}' do grupo '%{group}'?"
delete_owner_confirm: "Remover privilégio de proprietário de '%{username}'?"
- name: "Nome"
add: "Adicionar"
add_members: "Adicionar membros"
custom: "Definidos"
bulk_complete: "Os usuários foram adicionados ao grupo."
+ bulk: "Adição em Massa ao Grupo"
bulk_paste: "Cole uma lista de usernames ou emails, um por linha:"
bulk_select: "(selecione um grupo)"
automatic: "Automático"
@@ -1913,6 +2240,8 @@ pt_BR:
primary_group: "Configurar automaticamente como grupo primário"
group_owners: Prorietários
add_owners: Adicionar proprietários
+ incoming_email: "Endereço de email de entrada personalizado"
+ incoming_email_placeholder: "Insira um endereço de email"
api:
generate_master: "Gerar chave Mestra de API"
none: "Não existem chaves API ativas no momento."
@@ -1927,6 +2256,74 @@ pt_BR:
info_html: "Sua chave de API permitirá a criação e edição de tópicos usando requests JSON."
all_users: "Todos os Usuários"
note_html: "Guarde esta chave secretamente, todos usuários que tiverem acesso a ela poderão criar posts arbritários no forum como qualquer usuário."
+ web_hooks:
+ title: "Webhooks"
+ none: "Não existem webhooks no momento."
+ instruction: "Webhooks permitem que o Discourse notifique serviços externos quando certos eventos acontecem em seu site. Quando o webhook é desencadeado, uma requisição POST é enviada às URLs fornecidas."
+ detailed_instruction: "Uma requisição POST será enviada à URL fornecida quando o evento escolhido acontecer."
+ new: "Novo Webhook"
+ create: "Criar"
+ save: "Salvar"
+ destroy: "Excluir"
+ description: "Descrição"
+ controls: "Controles"
+ go_back: "Volta à lista"
+ payload_url: "URL do Payload"
+ payload_url_placeholder: "https://example.com/postreceive"
+ warn_local_payload_url: "Parece que você está tentando configurar um webhook para uma URL local. Eventos entregues a endereços locais podem causar efeitos colaterais ou comportamentos inesperados. Continuar?"
+ secret_invalid: "O segredo não deve conter caracteres em branco."
+ secret_too_short: "O segredo deve ter pelo menos 12 caracteres."
+ secret_placeholder: "Uma string opcional, usada para gerar assinaturas"
+ event_type_missing: "Você deve configurar apenas um tipo de evento."
+ content_type: "Tipo de Conteúdo"
+ secret: "Segredo"
+ event_chooser: "Que eventos devem desencadear esse webhook?"
+ wildcard_event: "Envie-me tudo."
+ individual_event: "Selecionar eventos individuais."
+ verify_certificate: "Verificar o certificado TLS da URL do payload"
+ active: "Ativo"
+ active_notice: "Entregaremos detalhes do evento quando ele acontecer."
+ categories_filter_instructions: "Os webhooks aplicáveis serão desencadeados apenas se o evento estiver relacionado às categorias especificadas. Deixe em branco para desencadear webhooks para todas as categorias."
+ categories_filter: "Categorias Desencadeadas"
+ groups_filter_instructions: "Webhooks aplicáveis serão desencadeados apenas se o evento estiver relacionado aos grupos especificados. Deixe em branco para desencadear webhooks para todos os grupos."
+ groups_filter: "Grupos Desencadeados"
+ delete_confirm: "Deletar esse webhook?"
+ topic_event:
+ details: "Quando existir um tópico novo, revisado, modificado ou deletado."
+ post_event:
+ name: "Publicar Evento"
+ details: "Quando existir uma nova resposta, edição, deleção ou recuperação."
+ user_event:
+ name: "Evento de Usuário"
+ delivery_status:
+ title: "Status de Entrega"
+ inactive: "Inativo"
+ failed: "Falhou"
+ successful: "Sucesso"
+ events:
+ none: "Não existem eventos relacionados."
+ redeliver: "Entregar novamente"
+ incoming:
+ one: "Existe um novo evento."
+ other: "Existem {{count}} novos eventos."
+ completed_in:
+ one: "Completado em 1 segundo."
+ other: "Completado em {{count}} segundos."
+ request: "Requisição"
+ response: "Resposta"
+ redeliver_confirm: "Tem certeza que deseja enviar o mesmo payload novamente?"
+ headers: "Cabeçalhos"
+ payload: "Payload"
+ body: "Corpo"
+ go_list: "Ir para lista"
+ go_details: "Editar webhook"
+ go_events: "Ir para eventos"
+ ping: "Latência"
+ status: "Código de Status"
+ event_id: "ID"
+ timestamp: "Criado"
+ completion: "Tempo de Conclusão"
+ actions: "Ações"
plugins:
title: "Plugins"
installed: "Plugins Instalados"
@@ -1936,7 +2333,7 @@ pt_BR:
enabled: "Habilitado?"
is_enabled: "S"
not_enabled: "N"
- change_settings: "Mudar Configurações"
+ change_settings: "Alterar Configurações"
change_settings_short: "Configurações"
howto: "Como eu instalo plugins?"
backups:
@@ -1945,6 +2342,14 @@ pt_BR:
backups: "Backups"
logs: "Registros"
none: "Nenhum backup disponível."
+ read_only:
+ enable:
+ title: "Ativar o modo somente-leitura"
+ label: "Ativar somente leitura"
+ confirm: "Tem certeza que quer habilitar modo somente leitura?"
+ disable:
+ title: "Desativar o modo somente-leitura"
+ label: "Desativar somente leitura"
logs:
none: "Nenhum registro ainda..."
columns:
@@ -1958,7 +2363,7 @@ pt_BR:
error: "Houve um erro ao carregar '{{filename}}': {{message}}"
operations:
is_running: "Uma operação está sendo executada..."
- failed: "A {{operation}} falhou. Por favor, cheque os registros."
+ failed: "A {{operação}} falhou. Por favor, cheque os registros."
cancel:
label: "Cancelar"
title: "Cancelar a operação atual"
@@ -1982,11 +2387,10 @@ pt_BR:
rollback:
label: "Reverter"
title: "Reverter o banco de dados para seu estado anterior"
+ confirm: "Tem certeza que deseja reverter o banco de dados para seu estado anterior?"
export_csv:
- user_archive_confirm: "Tem certeza que você quer baixar os seus tópicos?"
success: "Exportação iniciada, você será notificado por mensagem particular quando o processo estiver completo."
failed: "Falha na exportação. Por favor verifique os logs."
- rate_limit_error: "O download de posts pode ser feito apenas uma vez por dia, por favor, tente novamente amanhã."
button_text: "Exportar"
button_title:
user: "Exportar lista de usuários completa em formato CSV."
@@ -2035,6 +2439,7 @@ pt_BR:
email_templates:
title: "Modelos de E-mail"
subject: "Assunto"
+ multiple_subjects: "Este modelo de email tem vários assuntos."
body: "Corpo"
none_selected: "Selecione um modelo de e-mail para iniciar a edição."
revert: "Reverter Alterações"
@@ -2084,13 +2489,16 @@ pt_BR:
name: 'curtir'
description: "A cor do botão curtir."
email:
+ title: "Emails"
settings: "Settings"
+ templates: "Modelos"
preview_digest: "Preview Digest"
sending_test: "Enviando e-mail de teste..."
error: "ERRO - %{server_error}"
test_error: "Houve um problema ao enviar o email de teste. Por favor, verifique as configurações de email, se o seu provedor não está bloqueando conexões de email e tente novamente."
sent: "Enviados"
skipped: "Ignorados"
+ bounced: "Devolvido"
received: "Recebido"
rejected: "Rejeitado"
sent_at: "Enviado para "
@@ -2104,12 +2512,35 @@ pt_BR:
delivery_method: "Delivery Method"
preview_digest_desc: "Pré-visualizar o conteúdo do e-mail de resumo enviado para usuários inativos."
refresh: "Atualizar"
+ send_digest_label: "Enviar esse resultado para:"
+ send_digest: "Enviar"
+ sending_email: "Enviando email..."
format: "Formato"
html: "html"
text: "texto"
last_seen_user: "Último Usuário Visto:"
reply_key: "Chave de Resposta"
skipped_reason: "Ignorar Motivo"
+ incoming_emails:
+ from_address: "De"
+ to_addresses: "Para"
+ cc_addresses: "Cc"
+ subject: "Assunto"
+ error: "Erro"
+ none: "Nenhum email recebido."
+ modal:
+ title: "Detalhes dos Emails Recebidos"
+ error: "Erro"
+ headers: "Cabeçalhos"
+ subject: "Assunto"
+ body: "Corpo"
+ rejection_message: "Email de Rejeição"
+ filters:
+ from_placeholder: "de@exemplo.com"
+ to_placeholder: "para@exemplo.com"
+ cc_placeholder: "cc@exemplo.com"
+ subject_placeholder: "Assunto..."
+ error_placeholder: "Erro"
logs:
none: "Nenhum registro encontrado."
filters:
@@ -2175,7 +2606,14 @@ pt_BR:
create_category: "criar uma categoria"
block_user: "bloquear usuário"
unblock_user: "desbloquear usuário"
+ grant_admin: "conceder admin"
+ revoke_admin: "revogar admin"
+ grant_moderation: "conceder moderação"
+ revoke_moderation: "revogar moderação"
backup_operation: "operação de backup"
+ deleted_tag: "etiqueta removida"
+ renamed_tag: "etiqueta renomeada"
+ revoke_email: "revogar email"
screened_emails:
title: "Emails Filtrados"
description: "Quando alguém tenta cria uma nova conta, os seguintes endereços de email serão verificados e o registro será bloqueado, ou outra ação será executada."
@@ -2189,7 +2627,7 @@ pt_BR:
domain: "Domínio"
screened_ips:
title: "IPs Filtrados"
- description: 'Endereços IP que estão sendo acompanhados. Use "Permitir" para confiar em endereços IP.'
+ description: 'Endereços IP que estão sendo observados. Use "Permitir" para confiar em endereços IP.'
delete_confirm: "Tem certeza que deseja remover a regra para %{ip_address}?"
roll_up_confirm: "Tem certeza que deseja combinar endereços IP filtrados comuns em subnets?"
rolled_up_some_subnets: "Entradas de IP banidos combinadas nestas subnets: %{subnets}."
@@ -2243,7 +2681,7 @@ pt_BR:
newuser: 'Usuários no Nível de Confiança 0 (Usuário Novo)'
basic: 'Usuários no Nível de Confiança 1 (Usuário Básico)'
member: 'Usuário em Nível de Confiança 2 (Membro)'
- regular: 'Usuário em Nível de Confiança 3 (Regular)'
+ regular: 'Usuário em Nível de Confiança 3 (Habitual)'
leader: 'Usuário em Nível de Confiança 4 (Líder)'
staff: "Equipe de apoio"
admins: 'Usuários Administradores'
@@ -2270,13 +2708,14 @@ pt_BR:
suspend_reason: "Motivo"
suspended_by: "Suspenso por"
delete_all_posts: "Apagar todas mensagens"
- delete_all_posts_confirm: "Você está prestes a apagar %{posts} mensagens e %{topics} tópicos. Tem certeza que quer continuar?"
+ delete_all_posts_confirm_MF: "Você está prestes a apagar {POSTS, plural, one {1 publicação} other {# publicações}} and {TOPICS, plural, one {1 tópico} other {# tópicos}}. Você tem certeza?"
suspend: "Suspender"
unsuspend: "Readmitir"
suspended: "Suspenso?"
moderator: "Moderador?"
admin: "Admin?"
blocked: "Bloqueado?"
+ staged: "Testado?"
show_admin_profile: "Admin"
edit_title: "Editar Título"
save_title: "Salvar Título"
@@ -2343,9 +2782,18 @@ pt_BR:
block_failed: 'Houve um problema ao bloquear o usuário.'
block_confirm: 'Você tem certeza que quer bloquear este usuário? Ele não vai poder criar nenhum tópico ou postagem nova.'
block_accept: 'Sim, bloquear este usuário'
+ bounce_score: "Pontuação de Devolução"
+ reset_bounce_score:
+ label: "Redefinir"
+ title: "Redefinir pontuação de devolução para 0"
deactivate_explanation: "Um usuário desativado deve revalidar seu email."
suspended_explanation: "Um usuário suspenso não pode entrar."
block_explanation: "Um usuário bloqueado não pode postar ou iniciar tópicos."
+ staged_explanation: "Um usuário de teste só pode postar por email em tópicos específicos."
+ bounce_score_explanation:
+ none: "Nenhuma devolução foi recebida recentemente daquele email."
+ some: "Algumas devoluções foram recebidas recentemente daquele email."
+ threshold_reached: "Muitas devoluções daquele email foram recebidas."
trust_level_change_failed: "Houve um problema ao trocar o nível de confiança do usuário."
suspend_modal_title: "Usuário Suspenso"
trust_level_2_users: "Usuários de Nível de Confiança 2"
@@ -2356,7 +2804,9 @@ pt_BR:
unlock_trust_level: "Destravar Nível de Confiança"
tl3_requirements:
title: "Requisitos para o Nível de Confiança 3"
- table_title: "Nos últimos %{time_period} dias:"
+ table_title:
+ one: "No último dia:"
+ other: "Nos últimos %{count} dias:"
value_heading: "Valor"
requirement_heading: "Requisito"
visits: "Visitas"
@@ -2412,6 +2862,10 @@ pt_BR:
title: "Mostrar no perfil público?"
enabled: "mostrado no perfil"
disabled: "não mostrado no perfil"
+ show_on_user_card:
+ title: "Exibir no cartão de usuário?"
+ enabled: "exibir no cartão de usuário"
+ disabled: "não exibido no cartão de usuário"
field_types:
text: 'Campo Texto'
confirm: 'Confirmação'
@@ -2424,6 +2878,7 @@ pt_BR:
revert: "Reverter alterações"
revert_confirm: "Tem certeza que deseja reverter as alterações?"
go_back: "Voltar para pesquisa"
+ recommended: "Recomendamos a personalização do seguinte texto para se adequar as suas necessidades:"
show_overriden: 'Apenas mostrar valores alterados'
site_settings:
show_overriden: 'Exibir apenas valores alterados'
@@ -2451,12 +2906,14 @@ pt_BR:
developer: 'Desenvolvedor'
embedding: "Incorporação"
legal: "Jurídico"
+ user_api: 'API de Usuário'
uncategorized: 'Outros'
backups: "Backups"
login: "Entrar"
plugins: "Plugins"
user_preferences: "Preferências de Usuário"
tags: "Marcações"
+ search: "Procurar"
badges:
title: Emblemas
new_badge: Novo Emblema
@@ -2472,7 +2929,7 @@ pt_BR:
modal_title: Agrupamentos de emblemas
granted_by: Concedido Por
granted_at: Concedido Em
- reason_help: (Um link para um post ou tópico)
+ reason_help: (Um link para uma mensagem ou tópico)
save: Salvar
delete: Remover
delete_confirm: Tem certeza de que deseja remover este emblema?
@@ -2485,9 +2942,9 @@ pt_BR:
granted_badges: Emblemas Concedidos
grant: Conceder
no_user_badges: "%{name} não teve nenhum emblema concedido."
- no_badges: Não há emblemas que podem ser concedidos.
+ no_badges: Não há emblemas que possam ser concedidos.
none_selected: "Selecione um emblema para começar"
- allow_title: Permitir ao emblema ser usado como título
+ allow_title: Permitir que o emblema seja usado como título
multiple_grant: Pode ser concedido várias vezes
listable: Mostrar emblema na página pública de emblemas
enabled: Habilitar emblema
@@ -2505,8 +2962,9 @@ pt_BR:
post_revision: "Quando um usuário edita ou cria uma resposta"
trust_level_change: "Quando um usuário muda seu nível de confiança"
user_change: "Quando um usuário é editado ou criado"
+ post_processed: "Após o processamento da mensagem"
preview:
- link_text: "Prever medalhas concedidas"
+ link_text: "Pré-visualizar emblemas concedidos"
plan_text: "Prever com plano de busca"
modal_title: "Preview da Busca de Medalhas"
sql_error_header: "Houve um erro com a busca."
@@ -2537,6 +2995,7 @@ pt_BR:
sample: "Use o seguinte código HTML no seu site para criar e incorporar tópicos do Discourse. Troque REPLACE_ME com a URL canônica da página na qual você está incorporando."
title: "Incorporar"
host: "Hosts Permitidos"
+ path_whitelist: "Lista de Caminhos Permitidos "
edit: "editar"
category: "Postar na Categoria"
add_host: "Adicionar Host"
@@ -2548,6 +3007,7 @@ pt_BR:
embed_by_username: "Nome de usuário para criação do tópico"
embed_post_limit: "Número máximo de postagens para incorporar"
embed_username_key_from_feed: "Chave para obter o nome de usuário no discourse do feed"
+ embed_title_scrubber: "Expressão regular usada para higienizar o título das publicações"
embed_truncate: "Truncar as postagens incorporadas"
embed_whitelist_selector: "Seletor de CSS para elementos que são permitidos na incorporação"
embed_blacklist_selector: "Seletor de CSS para elementos que são removidos da incorporação"
@@ -2570,3 +3030,22 @@ pt_BR:
label: "Novo:"
add: "Adicionar"
filter: "Busca (URL ou URL Externa)"
+ wizard_js:
+ wizard:
+ done: "Feito"
+ back: "Voltar"
+ next: "Próximo"
+ step: "%{current} de %{total}"
+ upload: "Enviar"
+ uploading: "Enviando..."
+ quit: "Talvez Depois"
+ staff_count:
+ one: "Sua comunidade tem 1 membro na equipe."
+ other: "Sua comunidade tem %{count} membros na equipe."
+ invites:
+ add_user: "adicionar"
+ none_added: "Você ainda não convidou ninguém para a equipe. Tem certeza que deseja continuar?"
+ roles:
+ admin: "Admin"
+ moderator: "Moderador"
+ regular: "Usuário Regular"
diff --git a/config/locales/client.ro.yml b/config/locales/client.ro.yml
index 7fbc31fff0e..4d6cf5a0470 100644
--- a/config/locales/client.ro.yml
+++ b/config/locales/client.ro.yml
@@ -28,6 +28,7 @@ ro:
millions: "{{number}}M"
dates:
time: "HH:mm"
+ timeline_date: "MMM YYYY"
long_no_year: "DD MMM HH:mm"
long_no_year_no_time: "DD MMM"
full_no_year_no_time: "Do MMMM "
@@ -39,44 +40,41 @@ ro:
long_date_with_year_without_time: "DD MMM 'YY"
long_date_without_year_with_linebreak: "DD MMM
HH:mm"
long_date_with_year_with_linebreak: "DD MMM 'YY
HH:mm"
+ wrap_ago: "%{date} (de) zile în urmă"
tiny:
half_a_minute: "< 1m"
less_than_x_seconds:
one: "< 1s"
few: "< %{count}s"
- other: "< %{count}s"
+ other: "< %{count} s"
x_seconds:
one: "1s"
- few: "%{count}s"
- other: "%{count}s"
- less_than_x_minutes:
- one: "< 1m"
- few: "< %{count}m"
- other: "< %{count}m"
+ few: "%{count} s"
+ other: "%{count} s"
x_minutes:
one: "1m"
- few: "%{count}m"
- other: "%{count}m"
+ few: "%{count} m"
+ other: "%{count} m"
about_x_hours:
one: "1h"
- few: "%{count}h"
- other: "%{count}h"
+ few: "%{count} h"
+ other: "%{count} h"
x_days:
one: "1z"
- few: "%{count}z"
- other: "%{count}z"
+ few: "%{count} z"
+ other: "%{count} z"
about_x_years:
one: "1a"
- few: "%{count}a"
- other: "%{count}a"
+ few: "%{count} a"
+ other: "%{count} a"
over_x_years:
one: "> 1a"
- few: "> %{count}a"
- other: "> %{count}a"
+ few: "> %{count} a"
+ other: "> %{count} a"
almost_x_years:
one: "1a"
- few: "%{count}a"
- other: "%{count}a"
+ few: "%{count} a"
+ other: "%{count} de a"
date_month: "DD MMMM"
date_year: "MMM 'YY"
medium:
@@ -122,15 +120,21 @@ ro:
previous_month: 'Luna anterioară'
next_month: 'Luna următoare'
share:
- topic: 'distribuie această discuție'
- post: 'distribuie postarea #%{postNumber}'
- close: 'închide'
- twitter: 'distribuie pe Twitter'
- facebook: 'distribuie pe Facebook'
- google+: 'distribuie pe Google+'
- email: 'trimite această adresă pe email'
+ topic: 'Distribuie un link cu acest subiect'
+ post: 'Distribuie postarea #%{postNumber}'
+ close: 'Închide'
+ twitter: 'Distribuie pe Twitter'
+ facebook: 'Distribuie pe Facebook'
+ google+: 'Distribuie pe Google+'
+ email: 'Drimite pe email'
action_codes:
- split_topic: "desparte acest topic %{when}"
+ public_topic: "a făcut acest subiect public %{when}"
+ private_topic: "a făcut acest subiect privat %{when}"
+ split_topic: "desparte această discuție %{when}"
+ invited_user: "a invitat pe %{who} %{when}"
+ invited_group: "a invitat pe %{who} %{when}"
+ removed_user: "a scos pe %{who} %{when}"
+ removed_group: "scos pe %{who} %{when}"
autoclosed:
enabled: 'închis %{when}'
disabled: 'deschis %{when}'
@@ -141,16 +145,19 @@ ro:
enabled: 'arhivat %{when}'
disabled: 'dezarhivat %{when}'
pinned:
- enabled: 'promovat %{when}'
- disabled: 'nepromovat %{when}'
+ enabled: 'fixat %{when}'
+ disabled: 'ne-fixat %{when}'
pinned_globally:
- enabled: 'promovat global %{when}'
- disabled: 'nepromovat %{when}'
+ enabled: 'fixat la nivel global %{when}'
+ disabled: 'ne-fixat %{when}'
visible:
- enabled: 'listat %{when}'
- disabled: 'retras %{when}'
- topic_admin_menu: "acțiuni subiect administrator"
+ enabled: 'afișat %{when}'
+ disabled: 'ascuns %{when}'
+ topic_admin_menu: "Opțiuni administrare subiect"
+ wizard_required: "Acum a sosit momentul să configurați forumul! Porniți Setup Wizard!"
emails_are_disabled: "Trimiterea de emailuri a fost dezactivată global de către un administrator. Nu vor fi trimise notificări email de nici un fel."
+ bootstrap_mode_enabled: "Pentru a ușura lansarea site-ului tău ești în modul bootstrap. Toți noii utilizatori vor primi nivelul de încredere 1 și vor avea activată primirea zilnică a unui email-rezumat. Această setare va fi dezactivată automat de îndată ce numărul total de utilizatori depășește %{min_users}."
+ bootstrap_mode_disabled: "Modul bootstrap va fi dezactivat în următoarele 24 de ore."
s3:
regions:
us_east_1: "US East (N. Virginia)"
@@ -161,10 +168,12 @@ ro:
eu_central_1: "EU (Frankfurt)"
ap_southeast_1: "Asia Pacific (Singapore)"
ap_southeast_2: "Asia Pacific (Sydney)"
+ ap_south_1: "Asia Pacific (Mumbai)"
ap_northeast_1: "Asia Pacific (Tokyo)"
ap_northeast_2: "Asia Pacific (Seoul)"
sa_east_1: "South America (Sao Paulo)"
- edit: 'editează titlul și categoria acestui subiect'
+ cn_north_1: "China (Beijing)"
+ edit: 'Editează titlul și categoria acestui subiect'
not_implemented: "Această funcționalitate nu a fost implementată încă."
no_value: "Nu"
yes_value: "Da"
@@ -175,25 +184,25 @@ ro:
age: "Vârsta"
joined: "Înregistrat"
admin_title: "Admin"
- flags_title: "Semnalare"
- show_more: "Detaliază"
+ flags_title: "Marcaje"
+ show_more: "Mai mult"
show_help: "Opțiuni"
- links: "Adrese"
+ links: "Adrese web"
links_lowercase:
- one: "adresă"
- few: "adrese"
- other: "adrese"
- faq: "Întrebări"
- guidelines: "Ajutor"
+ one: "link"
+ few: "link-uri"
+ other: "de link-uri"
+ faq: "Întrebări frecvente"
+ guidelines: "Indicații"
privacy_policy: "Politică de confidențialitate"
privacy: "Confidențialitate"
terms_of_service: "Termenii serviciului"
- mobile_view: "Ecran pentru mobil"
- desktop_view: "Ecran pentru desktop"
+ mobile_view: "Vedere pentru mobil"
+ desktop_view: "Vedere pentru desktop"
you: "Tu"
or: "sau"
- now: "Adineauri"
- read_more: 'citește mai mult'
+ now: "Acum"
+ read_more: 'Citește mai mult'
more: "Mai mult"
less: "Mai puțin"
never: "Niciodată"
@@ -202,7 +211,7 @@ ro:
daily: "Zilnic"
weekly: "Săptămânal"
every_two_weeks: "Odată la două săptamâni"
- every_three_days: "la fiecare trei zile"
+ every_three_days: "La fiecare trei zile"
max_of_count: "max din {{count}}"
alternation: "sau"
character_count:
@@ -210,14 +219,14 @@ ro:
few: "{{count}} caractere"
other: "{{count}} de caractere"
suggested_topics:
- title: "Alte discuții"
+ title: "Subiecte sugerate"
pm_title: "Mesaje sugerate"
about:
simple_title: "Despre"
title: "Despre %{title}"
stats: "Statisticile site-ului"
- our_admins: "Administratorii"
- our_moderators: "Moderatorii"
+ our_admins: "Administratori"
+ our_moderators: "Moderatori"
stat:
all_time: "Tot timpul"
last_7_days: "Ultimele 7 zile"
@@ -233,90 +242,92 @@ ro:
title: "Semn de carte"
clear_bookmarks: "Șterge semnele de carte"
help:
- bookmark: "Click pentru plasare semn de carte pe prima postare a acestei discuții"
- unbookmark: "Click pentru ștergerea tuturor semnelor de carte din această discuție"
+ bookmark: "Click pentru a adăuga semn de carte la subiectul ăsta"
+ unbookmark: "Click pentru a șterge semnele de carte"
bookmarks:
- not_logged_in: "ne pare rău, trebuie să fii autentificat pentru a pune un semn de carte"
+ not_logged_in: "Ne pare rău, trebuie să fii autentificat pentru a pune un semn de carte"
created: "Ai pus semn de carte pe acest mesaj"
- not_bookmarked: "Ai citit deja aceast mesaj; fă clic să adaugi semn de carte"
+ not_bookmarked: "Ai citit deja acest mesaj; fă clic să adaugi semn de carte"
last_read: "Acesta este ultimul mesaj citit de tine; fă click să adaugi semn de carte"
- remove: "Semn de carte înlăturat"
- confirm_clear: "Ești sigur că dorești să ştergi toate bookmark-urile din acest subiect?"
+ remove: "Șterge semn de carte"
+ confirm_clear: "Ești sigur că dorești să ștergi toate semnele de carte din acest subiect?"
topic_count_latest:
one: "{{count}} subiect nou sau actualizat."
few: "{{count}} subiecte noi sau actualizate."
- other: "{{count}} subiecte noi sau actualizate."
+ other: "{{count}} de subiecte noi sau actualizate."
topic_count_unread:
one: "Un subiect necitit."
few: "{{count}} subiecte necitite."
- other: "{{count}} de subiecte necitite."
+ other: "{{count}} (de) subiecte necitite."
topic_count_new:
one: "Un subiect nou."
few: "{{count}} subiecte noi."
other: "{{count}} de subiecte noi."
click_to_show: "Click pentru vizualizare."
- preview: "vizualizează"
- cancel: "anulează"
- save: "Salvează Schimbările"
- saving: "Se Salvează..."
+ preview: "Previzualizează"
+ cancel: "Anulează"
+ save: "Salvează schimbările"
+ saving: "Se salvează..."
saved: "Salvat!"
upload: "Încarcă"
- uploading: "Încărcare..."
+ uploading: "Se încarcă..."
uploading_filename: "Se încarcă {{filename}}..."
uploaded: "Încărcat!"
enable: "Activează"
disable: "Dezactivează"
- undo: "Anulează acțiunea precedentă"
- revert: "Refacere"
+ undo: "Anulează acțiunea"
+ revert: "Revenire la starea inițială"
failed: "Eșuat"
+ switch_to_anon: "Intrați în Modul anonim"
+ switch_from_anon: "Ieșiți din Modul anonim"
banner:
close: "Ignoră acest banner."
- edit: "Editează acest banner >>"
+ edit: "Editează acest banner."
choose_topic:
- none_found: "Nu au fost găsite discuții."
+ none_found: "Nu au fost găsite subiecte noi."
title:
- search: "Caută o discuție după nume, url sau id:"
- placeholder: "Scrie aici titlul discuției"
+ search: "Căutați un subiect după nume, url sau id:"
+ placeholder: "Scrieți aici titlul subiectului"
queue:
- topic: "Discuție:"
+ topic: "Subiect:"
approve: 'Aprobare'
- reject: 'Respinge'
+ reject: 'Respingere'
delete_user: 'Şterge utilizatorul'
title: "Necesită aprobare"
- none: "Nu sunt postări de revizuit."
+ none: "Nu sunt postări de verificat."
edit: "Editează"
cancel: "Anulează"
- view_pending: "vezi postările în aşteptare"
+ view_pending: "Vezi postările în aşteptare"
has_pending_posts:
- one: "Această discuție are 1 postare în așteptare"
- few: "Această discuţie are {{count}} postări în aşteptare."
- other: "Această discuţie are {{count}} de postări în aşteptare."
- confirm: "Salvează Schimbările"
- delete_prompt: "Ești sigur că vrei să ștergi utilizatorul %{username}? Vor fi șterse toate postările iar email-ul și IP-ul vor fi blocate."
+ one: "Acest subiect are o postare în așteptare"
+ few: "Acest subiect are {{count}} postări în așteptare."
+ other: "Acest subiect are {{count}} de postări în așteptare."
+ confirm: "Salvează schimbările"
+ delete_prompt: "Ești sigur că vrei să ștergi utilizatorul %{username}? Vor fi șterse toate postările lui iar email-ul și IP-ul vor fi blocate."
approval:
title: "Necesită aprobare"
- description: "Am primit nouă postare dar trebuie să fie aprobată de un moderator înainte că ea să apară pe site. Va rugăm să aveţi răbdare."
+ description: "Am primit noua postare dar trebuie să fie aprobată de un moderator înainte că ea să apară pe site. Te rugăm să ai răbdare."
pending_posts:
one: "Aveţi 1 postare în aşteptare."
few: "Aveţi {{count}} postări în aşteptare."
- other: "Aveţi {{count}} de postări în aşteptare."
+ other: "Aveţi {{count}} (de) postări în așteptare."
ok: "OK"
user_action:
user_posted_topic: "{{user}} a postat discuția"
- you_posted_topic: "Dvs. aţi postat discuția"
+ you_posted_topic: "ai postat subiectul"
user_replied_to_post: "{{user}}a răspuns la{{post_number}}"
- you_replied_to_post: "You a răspuns la {{post_number}}"
- user_replied_to_topic: "{{user}} a răspuns la discuție"
- you_replied_to_topic: "You a răspuns la discuție"
- user_mentioned_user: "{{user}} a menționat {{another_user}}"
- user_mentioned_you: "{{user}} a menționat you"
- you_mentioned_user: "You a menționat {{another_user}}"
- posted_by_user: "Postat de către {{user}}"
- posted_by_you: "Postat de către tine"
- sent_by_user: "Trimis de către {{user}}"
- sent_by_you: "Trimis de către tine"
+ you_replied_to_post: "Tu ai răspuns la {{post_number}}"
+ user_replied_to_topic: "{{user}} a răspuns la subiect"
+ you_replied_to_topic: "Tu ai răspuns la subiect"
+ user_mentioned_user: "{{user}} a menționat pe {{another_user}}"
+ user_mentioned_you: "{{user}} te-a menționat pe tine"
+ you_mentioned_user: "Tu ai menționat pe {{another_user}}"
+ posted_by_user: "Postat de {{user}}"
+ posted_by_you: "Postat de tine"
+ sent_by_user: "Trimis de {{user}}"
+ sent_by_you: "Trimis de tine"
directory:
- filter_name: "filtrează după utilizator"
+ filter_name: "Filtrează după nume utilizator"
title: "Utilizatori"
likes_given: "Oferite"
likes_received: "Primite"
@@ -327,115 +338,180 @@ ro:
topic_count_long: "Subiecte create"
post_count: "Răspunsuri"
post_count_long: "Răspunsuri postate"
- no_results: "Fără rezultat."
+ no_results: "Nu s-au găsit rezultate."
days_visited: "Vizite"
days_visited_long: "Zile de vizită"
posts_read: "Citite"
- posts_read_long: "Posturi citite"
+ posts_read_long: "Postări citite"
total_rows:
one: "1 utilizator"
few: "%{count} utilizatori"
- other: "%{count} utilizatori"
+ other: "%{count} de utilizatori"
+ group_histories:
+ actions:
+ change_group_setting: "Schimbă setarea grupului"
+ add_user_to_group: "Adaugă utilizator"
+ remove_user_from_group: "Șterge utilizator"
+ make_user_group_owner: "Fă proprietar"
+ remove_user_as_group_owner: "Revocă proprietar"
groups:
+ logs:
+ title: "Jurnale"
+ when: "Când"
+ action: "Acțiune"
+ acting_user: "Utilizator temporar"
+ target_user: "Utilizator țintă"
+ subject: "Subiect"
+ details: "Detalii"
+ from: "De la"
+ to: "Către"
+ edit:
+ title: 'Editează grup'
+ full_name: 'Nume complet'
+ add_members: "Adaugă membri"
+ delete_member_confirm: "Șterge utilizatorul '%{username}' din grupul '%{group}'?"
+ request_membership_pm:
+ title: "Cerere de adăugare ca membru"
+ body: "Aș dori să fac o cerere de adăugare ca membru în @%{groupName}."
+ name_placeholder: "Numele grupului, fără spații, la fel ca regula pentru nume utilizator"
+ public: "Permite utilizatorilor să intre/iasă din grup fără restricții. (Presupune ca grupul să fie vizibil)"
empty:
- mentions: "Nu sunt mențiuni ale acestui grup."
- messages: "Nu este nici un mesaj pentru acest grup."
+ posts: "Nu există postări ale membrilor acestui grup."
+ members: "Nu există nici un membru în acest grup."
+ mentions: "Nu există nicio menționare în acest grup."
+ messages: "Nu există nici un mesaj în acest grup."
+ topics: "Nu există nici un subiect creat de vreun membru al acestui grup."
+ logs: "Nu există nici un jurnal pentru acest grup."
add: "Adaugă"
+ join: "Alătură-te grupului"
+ leave: "Părăsește grupul"
+ request: "Cere să te alături grupului"
+ automatic_group: Grup automat
+ closed_group: Grup închis
+ is_group_user: "Ești membru al acestui grup"
+ allow_membership_requests: "Permite utilizatorilor să trimită cereri de adăugare ca membri către proprietarii grupului. (Presupune ca toată lumea să aibă posibilitatea de a menționa grupul)"
+ membership: "Apartenență"
+ name: "Nume"
+ user_count: "Număr de membri"
+ bio: "Despre grup"
selector_placeholder: "Adaugă membri"
- owner: "proprietar"
+ owner: "Proprietar"
visible: "Grupul este vizibil tuturor utilizatorilor"
+ index:
+ title: "Grupuri"
+ empty: "Nu există nici un grup vizibil."
title:
- one: "grup"
- few: "grupuri"
- other: "grupuri"
+ one: "Grup"
+ few: "Grupuri"
+ other: "de grupuri"
members: "Membri"
- topics: "Discuții"
+ topics: "Subiecte"
posts: "Postări"
mentions: "Mențiuni"
messages: "Mesaje"
alias_levels:
+ title: "Cine poate trimite mesaje către acest grup sau să îl @menționeze?"
nobody: "Nimeni"
- only_admins: "Doar Adminii"
+ only_admins: "Doar adminii"
mods_and_admins: "Doar moderatorii și adminii"
- members_mods_and_admins: "Doar membri grupului, moderatorii și adminii"
+ members_mods_and_admins: "Membrii grupului, moderatorii și adminii"
everyone: "Toată lumea"
trust_levels:
- none: "Nimic"
+ title: "Nivel de încredere acordat automat membrilor atunci când sunt adăugați:"
+ none: "Nimeni"
notifications:
watching:
- title: "Urmărit"
+ title: "Urmărind activ"
+ description: "Veți fi notificat pentru fiecare nouă postare în fiecare mesaj, și va fi afișat un contor al noilor răspunsuri."
+ watching_first_post:
+ title: "Urmărind activ prima postare"
+ description: "Vei fi notificat doar pentru prima postare din fiecare nou subiect al acestui grup."
tracking:
- title: "Urmărit"
+ title: "Urmărind"
+ description: "Vei fi notificat dacă cineva menționează @numele tău sau îți răspunde și va fi afișat un contor al noilor răspunsuri."
regular:
title: "Normal"
- description: "Vei fi notificat dacă cineva îți menționează @numele sau îți va scrie un reply."
+ description: "Vei fi notificat dacă cineva îți menționează @numele sau îți va răspunde."
muted:
- title: "Mut"
+ title: "Setat pe silențios"
+ description: "Nu vei fi niciodată notificat despre nimic legat de noile subiecte din acest grup."
+ flair_url: "Imagine avatar cu element distinct"
+ flair_url_placeholder: "(Opțional) URL imagine sau clasă Font Awesome"
+ flair_bg_color: "Culoarea de fundal a avatarului cu element distinct"
+ flair_bg_color_placeholder: "(Opțional) Valoarea Hex a culorii"
+ flair_color: "Culoarea avatarului cu element distinct"
+ flair_color_placeholder: "(Opțional) Valoarea Hex a culorii"
+ flair_preview_icon: "Previzualizează iconiță"
+ flair_preview_image: "Previzualizează imagine"
+ flair_note: "Observație: Elementul distinct va fi afișat doar pentru grupul principal al utilizatorului."
user_action_groups:
- '1': "Aprecieri Date"
- '2': "Aprecieri Primite"
+ '1': "Aprecieri date"
+ '2': "Aprecieri primite"
'3': "Semne de carte"
- '4': "Discuții"
+ '4': "Subiecte"
'5': "Răspunsuri"
'6': "Răspunsuri"
'7': "Mențiuni"
'9': "Citate"
'11': "Editări"
- '12': "Obiecte Trimise"
+ '12': "Elemente trimise"
'13': "Primite"
'14': "În așteptare"
categories:
- all: "toate categoriile"
- all_subcategories: "toate"
- no_subcategory: "niciuna"
+ all: "Toate categoriile"
+ all_subcategories: "Toate"
+ no_subcategory: "Niciuna"
category: "Categorie"
+ category_list: "Afișează lista de categorii"
reorder:
- title: "Rearanjeaza Categoriile"
+ title: "Rearanjează categoriile"
title_long: "Rearanjeaza lista de categorii"
- fix_order: "Pozitii fixe"
- fix_order_tooltip: "Nu toate categoriile au un numar de pozitie unic, asta poate cauze rezultate neasteptate."
- save: "Salveaza ordinea"
- apply_all: "Aplica"
- position: "Pozitie"
+ fix_order: "Fixează poziții"
+ fix_order_tooltip: "Nu toate categoriile au un numar de poziție unic, asta poate cauza rezultate neașteptate."
+ save: "Salvează ordinea"
+ apply_all: "Aplică"
+ position: "Poziție"
posts: "Postări"
- topics: "Discuții"
- latest: "Ultimele"
- latest_by: "recente dupa"
- toggle_ordering: "Control comandă comutare"
- subcategories: "Subcategorie"
- topic_stats: "Numărul de discuții noi."
+ topics: "Subiecte"
+ latest: "Cele mai recente"
+ latest_by: "Cele mai recente după"
+ toggle_ordering: "Comută criteriu de aranjare"
+ subcategories: "Subcategorii"
+ topic_sentence:
+ one: "Un subiect"
+ few: "%{count} subiecte"
+ other: "%{count} de subiecte"
topic_stat_sentence:
- one: "%{count} subiect în %{unit}."
+ one: "%{count} subiect nou în %{unit}."
few: "%{count} subiecte noi în %{unit}."
- other: "%{count} subiecte noi în %{unit}."
- post_stats: "Numărul de postări noi."
- post_stat_sentence:
- one: "%{count} mesaj nou in ultimele %{unit}."
- few: "%{count} mesaje noi in ultimele %{unit}."
- other: "%{count} mesaje noi in ultimele %{unit}."
+ other: "%{count} de subiecte noi în %{unit}."
ip_lookup:
title: Căutare adresă IP
hostname: Nume gazdă
location: Locație
- location_not_found: (necunoscut)
+ location_not_found: (necunoscută)
organisation: Organizație
phone: Telefon
other_accounts: "Alte conturi cu această adresă IP"
delete_other_accounts: "Șterge %{count}"
- username: "nume de utilizator"
- trust_level: "TL"
- read_time: "Timp de citire"
- topics_entered: "Discuții la care particip"
- post_count: "# postari"
+ username: "Nume de utilizator"
+ trust_level: "NÎ"
+ read_time: "Durată vizită pe site"
+ topics_entered: "Subiecte la care particip"
+ post_count: "# postări"
confirm_delete_other_accounts: "Ești sigur că vrei să ștergi aceste conturi?"
user_fields:
- none: "(selecteaza o optiune)"
+ none: "(alege o opțiune)"
user:
- said: "{{username}} a spus:"
+ said: "{{username}}:"
profile: "Profil"
- mute: "Anulează"
- edit: "Editează Preferințe"
- download_archive: "descarcă arhiva postărilor mele"
+ mute: "Silențios"
+ edit: "Editează preferințe"
+ download_archive:
+ button_text: "Descarcă postările mele"
+ confirm: "Ești sigur că vrei să îți descarci postările?"
+ success: "Descărcarea a început, vei fi notificat printr-un mesaj atunci când procesul se va termina."
+ rate_limit_error: "Postările pot fi descărcate doar o singură dată pe zi, te rugăm să încerci din nou mâine."
new_private_message: "Mesaj nou"
private_message: "Mesaj"
private_messages: "Mesaje"
@@ -445,242 +521,296 @@ ro:
bookmarks: "Semne de carte"
bio: "Despre mine"
invited_by: "Invitat de"
- trust_level: "Nivel de Încredere"
+ trust_level: "Nivel de încredere"
notifications: "Notificări"
statistics: "Statistici"
desktop_notifications:
- label: "Notificari desktop"
- not_supported: "Notificarile nu sunt suportate in acest browser."
- perm_default: "Activeaza notificarile"
- perm_denied_btn: "Nu se permite accesul"
- disable: "Dezactiveaza notificarile"
- enable: "Activeaza Notificarile"
- each_browser_note: "Notati: Setarile vor fi modificate pe orice alt browser."
- dismiss_notifications_tooltip: "Marchează cu citit toate notificările necitite"
+ label: "Notificări desktop"
+ not_supported: "Acest browser nu suportă notificări. Ne pare rău."
+ perm_default: "Activează notificări"
+ perm_denied_btn: "Notificări blocate"
+ perm_denied_expl: "Ai blocat notificările. Activează notificările din setările browser-ului."
+ disable: "Dezactivează notificări"
+ enable: "Activează notificările"
+ each_browser_note: "Observație: Setările trebuie modificate pe fiecare browser utilizat."
+ dismiss_notifications: "Elimină tot"
+ dismiss_notifications_tooltip: "Marchează toate notificările ca citite"
+ first_notification: "Prima notificare pe care ai primit-o! Selectează-o ca să continui. "
disable_jump_reply: "Nu sări la postarea mea după ce răspund"
- dynamic_favicon: "Arată subiectele noi/actualizate în iconiţă browserului."
+ dynamic_favicon: "Arată subiectele noi/actualizate în pictograma browserului."
external_links_in_new_tab: "Deschide toate adresele externe într-un tab nou"
- enable_quoting: "Activează răspunsuri-citat pentru textul selectat"
- change: "schimbă"
+ enable_quoting: "Activează citarea răspunsurilor pentru textul selectat"
+ change: "Schimbă"
moderator: "{{user}} este moderator"
admin: "{{user}} este admin"
moderator_tooltip: "Acest utilizator este moderator"
admin_tooltip: "Acest utilizator este admin"
blocked_tooltip: "Acest utilizator este blocat."
- suspended_notice: "Acest user este suspendat păna la {{date}}."
+ suspended_notice: "Acest utilizator este suspendat până la {{date}}."
suspended_reason: "Motiv: "
github_profile: "Github"
email_activity_summary: "Sumarul activității"
mailing_list_mode:
- label: " "
+ label: " Mod mailing list"
+ enabled: "Activați modul mailing list"
+ instructions: |
+ " Această setare nu ține cont de setarea de la sumarul activităților.
+ Subiectele setate pe silențios și categoriile nu sunt incluse în aceste emailuri."
daily: "Trimite actualizări zilnice"
individual: "Trimite un email pentru fiecare postare nouă"
- watched_categories: "Văzut"
- tracked_categories: "Tracked"
- muted_categories: "Muted"
+ individual_no_echo: "Trimite un email pentru fiecare postare nouă în afară de postările mele"
+ many_per_day: "Trimite câte un email pentru pentru fiecare nouă postare (aproximativ {{dailyEmailEstimate}} pe zi)"
+ few_per_day: "Trimite câte un email pentru fiecare nouă postare (aproximativ 2 pe zi)"
+ tag_settings: "Etichete"
+ watched_tags: "Urmărite activ"
+ watched_tags_instructions: "Vei vedea automat toate subiectele cu aceste etichete. Vei fi notificat pentru fiecare nouă postare și subiect. De asemenea, un contor al noilor postări va apărea lângă subiect."
+ tracked_tags: "Urmărite"
+ tracked_tags_instructions: "Vei urmări automat toate subiectele cu aceste etichete. De asemenea, un contor al noilor postări va apărea lângă subiect."
+ muted_tags: "Setate pe silențios"
+ muted_tags_instructions: "Nu vei fi notificat despre nimic legat de noile subiecte cu aceste etichete, și subiectele respective nu vor apărea în lista cu ultimele subiecte."
+ watched_categories: "Urmărite activ"
+ watched_categories_instructions: "Vei vizualiza automat toate subiectele din aceste categorii. Vei fi notificat cu privire la toate noile postări și subiecte. De asemenea, un contor al noilor postări va apărea lângă subiect."
+ tracked_categories: "Urmărite"
+ tracked_categories_instructions: "Vei urmări automat toate subiectele din aceste categorii. Un contor al noilor postări va apărea lângă subiect."
+ watched_first_post_categories: "Urmărire activă prima postare"
+ watched_first_post_categories_instructions: "Vei fi notificat cu privire la prima postare din fiecare nou subiect din aceste categorii. "
+ watched_first_post_tags: "Urmărire activă prima postare"
+ watched_first_post_tags_instructions: "Vei fi notificat cu privire la prima postare din fiecare nou subiect cu aceste etichete."
+ muted_categories: "Setat pe silențios"
+ muted_categories_instructions: "Nu vei fi notificat despre nimic legat de noile subiecte din aceste categorii și subiectele respective nu vor apărea în lista cu cele mai recente subiecte."
delete_account: "Șterge-mi contul"
- delete_account_confirm: "Ești sigur că vrei sa ștergi contul? Această acțiune nu este reversibilă!"
+ delete_account_confirm: "Ești sigur că vrei să ștergi contul? Această acțiune este ireversibilă!"
deleted_yourself: "Contul tău a fost șters cu succes."
- delete_yourself_not_allowed: "Nu iți poți sterge contul deocamdată. Contactează administratorul pentru ștergerea contului."
+ delete_yourself_not_allowed: "Momentan nu îți poți șterge contul. Contactează un admin pentru a o face."
unread_message_count: "Mesaje"
admin_delete: "Șterge"
users: "Utilizatori"
muted_users: "Silențios"
- muted_users_instructions: "Suprimă toate notificările de la aceşti utilizatori"
- muted_topics_link: "Arata topicurile dezactivate."
+ muted_users_instructions: "Oprește toate notificările de la aceşti utilizatori."
+ muted_topics_link: "Arată subiectele dezactivate"
+ watched_topics_link: "Arată subiectele urmărite activ"
+ automatically_unpin_topics: "Detașare automată a subiectelor când ajung la sfârșitul paginii."
+ apps: "Aplicații"
+ revoke_access: "Revocă accesul"
+ undo_revoke_access: "Anulează revocarea accesului"
+ api_approved: "Aprobate:"
staff_counters:
- flags_given: "Semnale ajutătoare"
- flagged_posts: "postări semnalate"
- deleted_posts: "postări șterse"
- suspensions: "suspendări"
- warnings_received: "avertizări"
+ flags_given: "Marcaje ajutătoare"
+ flagged_posts: "Postări marcate"
+ deleted_posts: "Postări șterse"
+ suspensions: "Suspendări"
+ warnings_received: "Avertizări"
messages:
all: "Toate"
- inbox: "Inbox"
+ inbox: "Primite"
sent: "Trimise"
- archive: "Arhivează"
- groups: "Grupurile Mele"
+ archive: "Arhivă"
+ groups: "Grupurile mele"
bulk_select: "Selectează mesaje"
- move_to_inbox: "Mută în Inbox"
+ move_to_inbox: "Mută în „Primite”"
move_to_archive: "Arhivează"
+ failed_to_move: "Mutarea mesajelor selectate a eșuat (poate că v-a căzut rețeaua)"
select_all: "Selectează tot"
change_password:
success: "(email trimis)"
in_progress: "(se trimite email)"
error: "(eroare)"
action: "Trimite email pentru resetare parolă"
- set_password: "Introduceți parolă"
+ set_password: "Introdu parolă"
change_about:
- title: "Schimbă la Profil"
+ title: "Schimbare date personale"
+ error: "A apărut o eroare la schimbarea acestei valori."
change_username:
title: "Schimbă numele utilizatorului"
+ confirm: "Dacă îți schimbi numele de utilizator, toate citările anterioare ale posturilor tale și toate mențiunile @numelui se vor pierde. Ești absolut sigur că vrei asta?"
taken: "Acest nume de utilizator este deja folosit."
- error: "S-a intâmpinat o eroare pe parcursul schimbării numelui de utilizator."
+ error: "A apărut o eroare la schimbarea numelui de utilizator."
invalid: "Acest nume de utilizator este invalid. Trebuie să includă doar cifre și litere."
change_email:
- title: "Schimbă Email"
- taken: "Acest email nu este disponibil."
- error: "A apărut o eroare la schimbarea de email. Poate această adresă este deja in folosința?"
+ title: "Schimbă email"
+ taken: "Această adresă există deja în baza de date."
+ error: "A apărut o eroare la schimbarea de email. Poate această adresă este deja utilizată?"
success: "Am trimis un email către adresa respectivă. Urmează instrucțiunile de confirmare."
change_avatar:
- title: "Schimbă poză profilului personal"
+ title: "Schimbă poza de profil"
gravatar: "Gravatar, bazat pe"
- gravatar_title: "Schimbă avatarul de pe site-ul Gravatar."
+ gravatar_title: "Schimbă-ți avatarul de pe site-ul Gravatar."
refresh_gravatar_title: "Reactualizează Gravatarul"
letter_based: "Poză de profil atribuită de sistem."
uploaded_avatar: "Poză preferată"
uploaded_avatar_empty: "Adaugă poza preferată"
- upload_title: "Încarcă poza personală"
+ upload_title: "Încarcă poza preferată"
upload_picture: "Încarcă poza"
- image_is_not_a_square: "Atenţie: poză este decupată, dar înălţimea şi lăţimea nu sunt egale."
- cache_notice: "Fotografia de profil a fost schimbata, dar poate dura ceva timp pana sa apara datorita caching-ului din browser."
+ image_is_not_a_square: "Atenţie: poza este decupată, înălțimea și lățimea nu erau egale."
+ cache_notice: "Poza de profil a fost schimbată cu succes, dar poate dura ceva timp până să fie afișată din cauza caching-ului din browser."
change_profile_background:
- title: "Datele Profilului"
+ title: "Fundal pentru pagina de profil"
instructions: "Fundalul profilului va fi centrat şi va avea o dimensiune standard de 850px."
change_card_background:
- title: "Fundal"
+ title: "Fundal pentru pagina cu date personale"
instructions: "Fundalul va fi centrat şi va avea o dimensiune standard de 590px."
email:
title: "Email"
instructions: "Emailul nu va fi făcut public."
ok: "Îți vom trimite un email pentru confirmare."
- invalid: "introduceți o adresă validă pentru confirmare."
+ invalid: "Introduceți o adresă de email validă."
authenticated: "Emailul a fost autentificat de către {{provider}}."
+ frequency_immediately: "Vom trimite imediat un email dacă nu ai citit deja despre ce este vorba. "
+ frequency:
+ one: "Vom trimite un email doar dacă nu te-am văzut în ultimul minut."
+ few: "Vom trimite un email doar dacă nu te-am văzut în ultimele {{count}} minute."
+ other: "Vom trimite un email doar dacă nu te-am văzut în ultimele {{count}} de minute."
name:
title: "Nume"
- instructions: "Versiunea lungă a numelui."
- instructions_required: "Numele dvs. complet"
+ instructions: "Nume complet (opțional)"
+ instructions_required: "Numele tău complet"
too_short: "Numele este prea scurt."
- ok: "Numele dvs arată bine."
+ ok: "Numele tău este OK."
username:
- title: "Nume Utilizator"
- instructions: "Numele de utilizator trebuie sa fie unic, fără spații, scurt."
+ title: "Nume utilizator"
+ instructions: "Unic, fără spații, scurt."
short_instructions: "Ceilalți te pot menționa ca @{{username}}."
- available: "Numele de utilizator este valabil."
+ available: "Numele de utilizator este disponibil."
global_match: "Emailul se potrivește numelui de utilizator înregistrat."
- global_mismatch: "Deja înregistrat. Încearcă:{{suggestion}}?"
- not_available: "Nu este valabil. Încearcă:{{suggestion}}?"
+ global_mismatch: "Numele este deja înregistrat. Încerci {{suggestion}}?"
+ not_available: "Nu este disponibil. Încerci {{suggestion}}?"
too_short: "Numele de utilizator este prea scurt."
too_long: "Numele de utilizator este prea lung."
- checking: "Verifică valabilitatea numelui de utilizator..."
- enter_email: 'Nume de utilizator găsit. Introduceți emailul potrivit.'
+ checking: "Verifică disponibilitatea numelui de utilizator..."
+ enter_email: 'Nume de utilizator găsit. Introduceți adresa de email corespunzătoare.'
prefilled: "Emailul se potrivește cu numele de utilizator înregistrat."
locale:
title: "Limba interfeței"
- instructions: "Limba este folosită de interfața forumului. Schimbarea se va produce odată ce reîmprospatați pagina."
- default: "(din oficiu)"
+ instructions: "Limba pentru interfața forumului. Schimbarea se va produce odată ce reîmprospătați pagina."
+ default: "(implicit)"
+ any: "oricare"
password_confirmation:
title: "Confirmă parola"
last_posted: "Ultima postare"
- last_emailed: "Ultimul email dat"
- last_seen: "Văzut"
- created: "Participare"
+ last_emailed: "Ultimul email"
+ last_seen: "Văzut acum"
+ created: "Înscris"
log_out: "Ieșire"
location: "Locație"
card_badge:
- title: "Insignă utilizator"
+ title: "Ecuson utilizator"
website: "Website"
email_settings: "Email"
like_notification_frequency:
+ title: "Notificare atunci când se primește apreciere"
always: "Întotdeauna"
+ first_time_and_daily: "Prima dată când o postare este apreciată și zilnic"
+ first_time: "Prima dată când o postare este apreciată"
never: "Niciodată"
email_previous_replies:
+ title: "Include răspunsurile precedente la sfârșitul emailurilor"
+ unless_emailed: "dacă nu a fost trimis anterior"
always: "întotdeauna"
never: "niciodată"
email_digests:
+ title: "Când nu vin aici în vizită, trimite-mi un email cu rezumatul subiectelor și răspunsurilor populare"
every_30_minutes: "La fiecare 30 de minute "
- daily: "zilnic"
- every_three_days: "la fiecare trei zile"
- weekly: "săptămânal"
- every_two_weeks: "la fiecare două săptămâni"
- email_direct: "Trimite un email când cineva mă citează, îmi răspunde la un post, menţionează @username meu, sau mă invită la o discuţie."
- email_private_messages: "Trimite-mi un mesaj când cineva îmi răspunde."
- email_always: "Trimite-mi notificarile de email atunci cand sunt activ pe site."
+ every_hour: "În fiecare oră"
+ daily: "Zilnic"
+ every_three_days: "La fiecare trei zile"
+ weekly: "Săptămânal"
+ every_two_weeks: "La fiecare două săptămâni"
+ include_tl0_in_digests: "Include conținut de la utilizatori noi în rezumatul de pe email."
+ email_in_reply_to: "Include un fragment din răspunsurile la postare în emailuri"
+ email_direct: "Trimite un email când cineva mă citează, îmi răspunde la o postare, menționează numele meu de utilizator, sau mă invită la un subiect."
+ email_private_messages: "Trimite-mi un email când cineva îmi trimite un mesaj."
+ email_always: "Trimite-mi notificările pe email atunci când sunt activ pe site."
other_settings: "Altele"
categories_settings: "Categorii"
new_topic_duration:
- label: "Consideră discuțiile ca fiind noi"
- not_viewed: "Nu le-am văzut încă "
- last_here: "Create de la ultima vizită "
- after_1_day: "creat azi"
- after_2_days: "creat in ultimele 2 zile"
- after_1_week: "creat in ultima saptamana"
- after_2_weeks: "creat in ultimele 2 saptamni"
+ label: "Consideră subiectele ca fiind noi dacă"
+ not_viewed: "nu le-am văzut încă "
+ last_here: "au fost create de la ultima vizită "
+ after_1_day: "au fostcreate în ultima zi"
+ after_2_days: "au fost create în ultimele 2 zile"
+ after_1_week: "au fost create în ultima săptămână"
+ after_2_weeks: "au fost create în ultimele 2 săptămâni"
auto_track_topics: "Urmăreşte automat discuţiile pe care le vizitez "
auto_track_options:
never: "niciodată"
immediately: "imediat"
- after_30_seconds: "dupa 30 de secunde"
- after_1_minute: "dupa 1 minut"
- after_2_minutes: "dupa 2 minute"
- after_3_minutes: "dupa 3 minute"
- after_4_minutes: "dupa 4 minute"
- after_5_minutes: "dupa 5 minute"
- after_10_minutes: "dupa 10 minute"
+ after_30_seconds: "după 30 de secunde"
+ after_1_minute: "după 1 minut"
+ after_2_minutes: "după 2 minute"
+ after_3_minutes: "după 3 minute"
+ after_4_minutes: "după 4 minute"
+ after_5_minutes: "după 5 minute"
+ after_10_minutes: "după 10 minute"
+ notification_level_when_replying: "Când postez într-un subiect, setează subiectul ca"
invited:
search: "Scrie pentru a căuta invitații..."
title: "Invitații"
- user: "Utilizatori invitați"
- sent: "Trimis"
+ user: "Utilizator invitat"
+ sent: "Trimis(e)"
none: "Nu sunt invitații în așteptare."
truncated:
- one: "Se arată prima invitație."
- few: "Se arată primele {{count}} invitații."
- other: "Se arată primele {{count}} de invitații."
- redeemed: "Invitații rascumpărate"
- redeemed_at: "Răscumpărate"
- pending: "Invitații in așteptare"
- pending_tab: "In asteptare"
- pending_tab_with_count: "In asteptare ({{count}})"
+ one: "Se afișează prima invitație."
+ few: "Se afișează primele {{count}} invitații."
+ other: "Se afișează primele {{count}} de invitații."
+ redeemed: "Invitații acceptate"
+ redeemed_tab: "Acceptate"
+ redeemed_tab_with_count: "({{count}}) Acceptate"
+ redeemed_at: "Acceptate"
+ pending: "Invitații în așteptare"
+ pending_tab: "În așteptare"
+ pending_tab_with_count: "În așteptare: ({{count}})"
topics_entered: "Subiecte văzute"
- posts_read_count: "Posturi citite"
+ posts_read_count: "Postări citite"
expired: "Această invitație a expirat."
- rescind: "Anulează"
- rescinded: "Invitație anulată"
- reinvite: "Retrimite Invitaţia"
+ rescind: "Elimină"
+ rescinded: "Invitație eliminată"
+ reinvite: "Retrimite invitaţia"
+ reinvite_all: "Retrimite toate invitațiile"
reinvited: "Invitaţia a fost retrimisă"
- time_read: "Timp de citit"
+ reinvited_all: "Toate invitațiile retrimise!"
+ time_read: "Timp de citire"
days_visited: "Zile de vizită"
account_age_days: "Vârsta contului în zile"
create: "Trimite o invitație"
+ generate_link: "Copiază link-ul de invitație"
+ link_generated: "Link de invitare generat cu succes!"
+ valid_for: "Link-ul de invitare este valid doar pentru următoarele adrese de email: %{email}"
bulk_invite:
- none: "Nu ai invitat încă pe nimeni. Poți trimite invitații individuale sau mai multor oameni deodată prin incărcarea fișierului de invitație multiplă."
- text: "Invitație multiplă din fișierul"
- uploading: "Incarcă"
- success: "Fişier încărcat cu succes, veţi fi înştiinţat printr-un mesaj când procesarea va fi completă."
- error: "A apărut o eroare la încărcarea fișierului '{{filename}}': {{message}}"
+ none: "Nu ai invitat încă pe nimeni aici. Poți trimite invitații individuale sau poți invita mai multe persoane odată încărcând un fișier CSV."
+ text: "Invitație multiplă din fișier"
+ success: "Fișier încărcat cu succes, vei fi înștiințat printr-un mesaj când procesarea este completă."
password:
title: "Parolă"
too_short: "Parola este prea scurtă."
common: "Această parolă este prea comună."
- same_as_username: "Parolă este identică cu numele de utilizator"
- same_as_email: "Parolă este identică cu adresa de email"
- ok: "Parola dumneavoastră arată bine."
- instructions: "Trebuiesc minim %{count} de caractere."
+ same_as_username: "Parolă identică cu numele de utilizator"
+ same_as_email: "Parolă identică cu adresa de email"
+ ok: "Parola dumneavoastră este OK."
+ instructions: "Trebuie minim %{count} (de) caractere."
summary:
title: "Sumar"
stats: "Statistici"
- time_read: "timp de citit"
+ time_read: "Timp petrecut pe site"
topic_count:
- one: "subiect creat"
+ one: "un subiect creat"
few: "subiecte create"
other: "de subiecte create"
post_count:
- one: "postare creată"
+ one: "o postare creată"
few: "postări create"
other: "de postări create"
likes_given:
- one: " dat"
+ one: " dată"
few: " date"
other: "de date"
likes_received:
- one: " primit"
+ one: " primită"
few: " primite"
other: "de primite"
days_visited:
- one: "zi vizitată"
- few: "vizite zilnice"
- other: "de zile vizitate"
+ one: "vizită"
+ few: "vizite"
+ other: "de vizite"
posts_read:
one: "postare citită"
few: "postări citite"
@@ -692,25 +822,26 @@ ro:
top_replies: "Top răspunsuri"
no_replies: "Nici un răspuns încă."
more_replies: "Mai multe răspunsuri"
- top_topics: "Top discuții"
- no_topics: "Nici o discuție încă."
- more_topics: "Mai multe discuții"
- top_badges: "Top insigne"
- no_badges: "Nici o insignă încă"
- more_badges: "Mai multe insigne"
+ top_topics: "Top subiecte"
+ no_topics: "Nici un subiect."
+ more_topics: "Mai multe subiecte"
+ top_badges: "Top ecusoane"
+ no_badges: "Nu există încă ecusoane"
+ more_badges: "Mai multe ecusoane"
top_links: "Top link-uri"
no_links: "Nici un link încă."
most_liked_by: "Cele mai apreciate de către"
most_liked_users: "Cele mai apreciate"
- most_replied_to_users: "Cele mai răspune pentru"
+ most_replied_to_users: "Cele mai multe răspunsuri pentru"
+ no_likes: "Nicio apreciere încă."
associated_accounts: "Conectări"
ip_address:
- title: "Ultima adresă de IP"
+ title: "Ultima adresă IP"
registration_ip_address:
- title: "Înregistrarea adresei de IP"
+ title: "Înregistrare adresă IP"
avatar:
title: "Poză de profil"
- header_title: "profil, mesaje, favorite si preferințe"
+ header_title: "profil, mesaje, semne de carte și preferințe"
title:
title: "Titlu"
filters:
@@ -719,132 +850,164 @@ ro:
posted_by: "Postat de"
sent_by: "Trimis de"
private_message: "mesaj"
- the_topic: "Subiectul"
- loading: "Încarcă..."
+ the_topic: "subiectul"
+ loading: "Se încarcă..."
errors:
- prev_page: "în timp ce încarcă"
+ prev_page: "în timp ce se încarcă"
reasons:
network: "Eroare de rețea"
- server: "Eroare de server: {{code}}"
- forbidden: "Acces nepermis"
+ server: "Eroare de server"
+ forbidden: "Acces refuzat"
unknown: "Eroare"
not_found: "Pagina nu a fost găsită"
desc:
network: "Te rugăm să verifici conexiunea."
- network_fixed: "Se pare ca și-a revenit."
- server: "Ceva nu a funcționat."
+ network_fixed: "Se pare că și-a revenit."
+ server: "Cod de eroare: {{status}}"
forbidden: "Nu ești autorizat să vezi această pagină."
not_found: "Oops, aplicația încearcă să încarce un URL care nu există."
unknown: "Ceva nu a funcționat."
buttons:
back: "Înapoi"
again: "Încearcă din nou"
- fixed: "Încarcare pagină"
+ fixed: "Încărcare pagină"
close: "Închide"
assets_changed_confirm: "Acest site tocmai a fost actualizat. Reîmprospătați pentru cea mai nouă versiune?"
logout: "Aţi fost deconectat."
refresh: "Reîmprospătează"
read_only_mode:
- login_disabled: "Autentificarea este dezactivată când siteul este în modul doar pentru citit."
+ enabled: "Acest site se află în modul exclusiv-citire. Te rugăm să continui să răsfoiești, însă sunt dezactivate acțiunile de răspuns, apreciere și altele. "
+ login_disabled: "Autentificarea este dezactivată când siteul este în modul exclusiv-citire."
+ logout_disabled: "Deautentificarea este dezactivată cât timp site-ul este în modul exclusiv-citire."
+ too_few_topics_and_posts_notice: "Haideți să pornim această discuție! Momentan sunt %{currentTopics} / %{requiredTopics} subiecte și %{currentPosts} / %{requiredPosts} postări. Vizitatorii au nevoie de niște conversații pe care să le citească și la care să răspundă."
+ too_few_topics_notice: "Haideți să pornim această discuție! Momentan sunt %{currentTopics} / %{requiredTopics} subiecte. Vizitatorii au nevoie de niște conversații pe care să le citească și la care să răspundă."
+ too_few_posts_notice: "Haideți să pornim această discuție! Momentan sunt %{currentPosts} / %{requiredPosts} postări. Vizitatorii au nevoie de niște conversații pe care să le citească și la care să răspundă."
+ logs_error_rate_notice:
+ reached: "%{relativeAge} – %{rate} a atins limita admisă de %{siteSettingRate}."
+ exceeded: "%{relativeAge} – %{rate} a depășit limita admisă de %{siteSettingRate}."
+ rate:
+ one: "o eroare/%{duration}"
+ few: "%{count} erori/%{duration}"
+ other: "%{count} de erori/%{duration}"
learn_more: "află mai multe..."
+ all_time: 'total'
+ all_time_desc: 'total subiecte create'
year: 'an'
- year_desc: 'discuții create în ultimile 365 de zile'
+ year_desc: 'subiecte create în ultimele 365 de zile'
month: 'lună'
- month_desc: 'discuții create în ultimile 30 de zile'
+ month_desc: 'subiecte create în ultimele 30 de zile'
week: 'săptămană'
- week_desc: 'discuții create în ultimile 7 zile'
+ week_desc: 'subiecte create în ultimele 7 zile'
day: 'zi'
- first_post: Prima Postare
- mute: Anulare
- unmute: Activare
- last_post: Ultima Postare
- last_reply_lowercase: ultimul răspuns
+ first_post: Prima postare
+ mute: Blochează
+ unmute: Deblochează
+ last_post: Ultima postare
+ last_reply_lowercase: Ultimul răspuns
replies_lowercase:
one: răspuns
few: răspunsuri
- other: răspunsuri
+ other: de răspunsuri
signup_cta:
sign_up: "Înregistrare"
- hide_session: "Aminteste-mi maine."
- hide_forever: "Nu, Multumesc"
- hidden_for_session: "Ok, te vom intreba maine. Poti oricand folosi 'Autentificare' pentru a crea un cont."
- value_prop: "Cand creati un cont nou, vom retine exact ce ati citit, astfel continuati intotdeauna de unde ati ramas. Deasemenea primiti notificari, aici sau prin email atunci se posteaza ceva nou. Puteti \"aprecia\" postari pentru a impartasi iubire :heartbeat:"
+ hide_session: "Amintește-mi mai târziu."
+ hide_forever: "Nu, mulțumesc"
+ hidden_for_session: "OK, vom reveni. Poți oricând folosi secțiunea de 'Autentificare' pentru a crea un cont."
+ intro: "Salutare! :heart_eyes: Se pare că îți place subiectul, dar nu ți-ai făcut cont pe site."
+ value_prop: "Când creezi un cont nou, noi reținem exact ce citești, astfel încât întotdeauna poți să te întorci exact unde ai rămas. Vei primi de asemenea și notificări, aici sau prin email, de câte ori apare o nouă postare. Și tu vei putea să apreciezi postări pentru a-ți arăta aprecierea. :heartbeat:"
summary:
- enabled_description: "Vizualizați sumarul discuției: cea mai interesantă postare, așa cum a fost determinată de comunitate. Pentru toate postările, faceți click dedesubt."
- enable: 'Fă sumarul discuției'
+ enabled_description: "Vizualizezi un rezumat al acestui subiect: cea mai interesantă postare, așa cum a fost desemnată de comunitate. "
+ description: "Există {{replyCount}} răspunsuri."
+ description_time: "Există {{replyCount}} răspunsuri cu un timp necesar pentru citire estimat la {{readingTime}} minute."
+ enable: 'Fă rezumatul acestui subiect'
disable: 'Arată toate postările'
deleted_filter:
- enabled_description: "Această discuție conține postări șterse, ce au fost ascunse. "
- disabled_description: "Postările șterse din discuție sunt vizibile."
+ enabled_description: "Acest subiect conține postări șterse, care au fost ascunse. "
+ disabled_description: "Postările șterse din subiect sunt vizibile."
enable: "Ascunde postările șterse"
disable: "Arată postările șterse"
private_message_info:
title: "Mesaj"
invite: "Invită alte persoane..."
- remove_allowed_user: "Chiar doriți să îl eliminați pe {{name}} din acest mesaj privat?"
+ remove_allowed_user: "Chiar dorești să îl elimini pe {{name}} din acest mesaj privat?"
+ remove_allowed_group: "Ești sigur că vrei să îl scoți pe {{name}} din acest mesaj?"
email: 'Email'
username: 'Nume utilizator'
last_seen: 'Văzut'
created: 'Creat'
created_lowercase: 'creat'
trust_level: 'Nivel de încredere'
- search_hint: 'Numele de utilizator sau email'
+ search_hint: 'Numele de utilizator, email sau adresă IP'
create_account:
+ disclaimer: "Înregistrându-te, ești de acord cu politica de confidențialitate și termenii de utilizare."
title: "Creează cont"
- failed: "Ceva a decurs greșit, poate că acest email e deja înregistrat, încearcă linkul parolă uitată "
+ failed: "Ceva s-a întâmplat, poate că acest email este deja înregistrat, încearcă să-ți resetezi parola la link-ul respectiv."
forgot_password:
title: "Resetare parolă"
action: "Mi-am uitat parola"
- invite: "Introduce-ți numele de utilizator sau adresa de email și vă vom trimite un email pentru resetarea parolei."
- reset: "Resetare Parolă"
- complete_username: "Dacă contul se potrivește numelui de utilizator %{username}, ar trebui să primiți în scurt timp un email cu instrucțiunile de resetare a parolei."
- complete_email: "Dacă un cont se potrivește cu %{email}, ar trebui să primiți un email în cel mai scurt timp cu instrucțiunile de resetare a parolei."
- complete_username_found: "Am găsit un cont care se potriveşte cu utilizatorul %{username}, veţi primi un email cu instrucţiunile cum să resetati parolă în cel mai scurt timp."
- complete_email_found: "Am găsit un cont care se potriveşte cu adresa %{email}, veţi primi un email cu instrucţiunile cum să resetati parolă în cel mai scurt timp."
+ invite: "Introdu numele de utilizator sau adresa de email și-ți vom trimite un email pentru resetarea parolei."
+ reset: "Resetare parolă"
+ complete_username: "Dacă contul corespunde cu numele de utilizator %{username}, ar trebui să primești în scurt timp un email cu instrucțiunile de resetare a parolei."
+ complete_email: "Dacă un cont corespunde cu %{email}, ar trebui să primești un email în cel mai scurt timp cu instrucțiunile de resetare a parolei."
+ complete_username_found: "Am găsit un cont care se potrivește cu utilizatorul %{username}, vei primi un email cu instrucțiunile de resetare a parolei în cel mai scurt timp."
+ complete_email_found: "Am găsit un cont care se potrivește cu adresa %{email}, vei primi un email cu instrucțiunile de resetare a parolei în cel mai scurt timp."
complete_username_not_found: "Nici un cont nu se potriveşte cu utilizatorul %{username}"
- complete_email_not_found: "Nici un cont nu se potriveşte adresei %{email}"
+ complete_email_not_found: "Nici un cont nu se potrivește cu adresa %{email}"
login:
- title: "Autentificare"
+ title: "Autentificare cu"
username: "Utilizator"
password: "Parolă"
email_placeholder: "email sau nume de utilizator"
- caps_lock_warning: "Caps Lock este apăsat"
+ caps_lock_warning: "Tasta Caps Lock este activă"
error: "Eroare necunoscută"
- rate_limit: "Te rog asteapta inainte de a te reconecta."
- blank_username_or_password: "Introduceți emailul sau numele de utilizator și parola."
+ rate_limit: "Te rog așteaptă înainte de a te reconecta."
+ blank_username_or_password: "Introdu emailul sau numele de utilizator și parola."
reset_password: 'Resetare parolă'
logging_in: "În curs de autentificare..."
or: "sau"
authenticating: "Se autentifică..."
- awaiting_confirmation: "Contul dumneavoastră așteaptă să fie activat .Folosiți linkul de reamintire a parolei, pentru a iniția un alt email de activare."
- awaiting_approval: "Contul dumneavoastră nu a fost aprobat încă de un admin . Veți primi un email când se aprobă."
+ awaiting_confirmation: "Contul tău așteaptă să fie activat. Folosește linkul de reamintire a parolei, pentru a cere un alt email de activare."
+ awaiting_approval: "Contul tău nu a fost aprobat încă de un admin . Vei primi un email când se aprobă."
requires_invite: "Ne pare rău, accesul la forum se face pe bază de invitație."
- not_activated: "Nu te poți loga încă. Am trimis anterior un email de activare pentru {{sentTo}}. Urmăriți instrucțiunile din email pentru a vă activa contul."
- not_allowed_from_ip_address: "Nu va puteţi conecta de la această adresa de IP."
- admin_not_allowed_from_ip_address: "Nu va puteţi conecta ca administrator de la această adresa de IP."
- resend_activation_email: "Click aici pentru a trimite emailul de activare încă odată."
- sent_activation_email_again: "Am trimis un alt email de activare pentru dvs la {{currentEmail}}. Poate dura câteva minute până ajunge; Vizitați și secțiunea de spam a mailului."
- to_continue: "Te rog sa te autentifici."
- preferences: "Trebuie sa fi autentificat pentru a schimba preferintele."
- forgot: "Nu imi amintesc detaliile contului meu."
+ not_activated: "Nu te poți loga încă. Am trimis anterior un email de activare pentru {{sentTo}}. Urmează instrucțiunile din email pentru a-ți activa contul."
+ not_allowed_from_ip_address: "Nu te poți conecta cu această adresă IP."
+ admin_not_allowed_from_ip_address: "Nu te poți conecta ca administrator cu această adresă IP."
+ resend_activation_email: "Click aici pentru a retrimite emailul de activare."
+ sent_activation_email_again: "Am trimis un alt email de activare pentru tine la {{currentEmail}}. Poate dura câteva minute până ajunge; vezi și în secțiunea de spam a mailului."
+ to_continue: "Te rog să te autentifici."
+ preferences: "Trebuie să fii autentificat pentru a schimba preferințele."
+ forgot: "Nu îmi amintesc detaliile contului meu."
google:
- title: "cu Google"
- message: "Autentificare cu Google (Asigurați-vă că barierele de pop up nu sunt active)"
+ title: "Google"
+ message: "Autentificare cu Google (Verifică browserul să nu blocheze ferestrele pop-up)"
google_oauth2:
- title: "cu Google"
- message: "Autentificare cu Google (Asigurați-vă că barierele de pop up nu sunt active)"
+ title: "Google"
+ message: "Autentificare cu Google (Verifică browserul să nu blocheze ferestrele pop-up)"
twitter:
- title: "cu Twitter"
- message: "Autentificare cu Twitter (Asigurați-vă că barierele de pop up nu sunt active)"
+ title: "Twitter"
+ message: "Autentificare cu Twitter (Verifică browserul să nu blocheze ferestrele pop-up)"
+ instagram:
+ title: "Instagram"
+ message: "Autentificare cu Instagram (Verifică browserul să nu blocheze ferestrele pop-up)"
facebook:
- title: "cu Facebook"
- message: "Autentificare cu Facebook (Asigurați-vă că barierele de pop up nu sunt active)"
+ title: "Facebook"
+ message: "Autentificare cu Facebook (Verifică browserul să nu blocheze ferestrele pop-up)"
yahoo:
- title: "cu Yahoo"
- message: "Autentificare cu Yahoo (Asigurați-vă că barierele de pop up nu sunt active)"
+ title: "Yahoo"
+ message: "Autentificare cu Yahoo (Verifică browserul să nu blocheze ferestrele pop-up)"
github:
- title: "cu GitHub"
- message: "Autentificare cu GitHub (Asigurați-vă că barierele de pop up nu sunt active)"
+ title: "GitHub"
+ message: "Autentificare cu GitHub (Verifică browserul să nu blocheze ferestrele pop-up)"
+ emoji_set:
+ apple_international: "Apple/International"
+ google: "Google"
+ twitter: "Twitter"
+ emoji_one: "Emoji One"
+ win10: "Win10"
+ category_page_style:
+ categories_only: "Numai categorii"
+ categories_with_featured_topics: "Categorii cu subiecte promovate"
+ categories_and_latest_topics: "Categorii și subiecte recente"
shortcut_modifier_key:
shift: 'Shift'
ctrl: 'Ctrl'
@@ -852,89 +1015,111 @@ ro:
composer:
emoji: "Emoji :)"
more_emoji: "mai multe..."
- options: "Optiuni"
- whisper: "soapta"
- add_warning: "Această este o avertizare oficială."
- posting_not_on_topic: "Cărei discuții vrei să-i răspunzi?"
- saving_draft_tip: "salvează..."
+ options: "Opțiuni"
+ whisper: "discret"
+ unlist: "nelistat"
+ add_warning: "Aceasta este o avertizare oficială."
+ toggle_whisper: "Comută modul discret"
+ toggle_unlisted: "Comută modul nelistat"
+ posting_not_on_topic: "În care subiect vrei să răspunzi?"
+ saving_draft_tip: "se salvează..."
saved_draft_tip: "salvat"
saved_local_draft_tip: "salvat local"
- similar_topics: "discuția dvs e similară cu..."
- drafts_offline: "proiecte offline"
+ similar_topics: "Subiectul tău seamănă cu..."
+ drafts_offline: "schiță offline"
+ group_mentioned:
+ one: "Prin menționarea {{group}}, urmează să notifici o persoană – ești sigur?"
+ few: "Prin menționarea {{group}}, urmează să notifici {{count}} persoane – ești sigur?"
+ other: "Prin menționarea {{group}}, urmează să notifici {{count}} de persoane – ești sigur?"
+ cannot_see_mention:
+ category: "Ai menționat utilizatorii: {{username}}. Însă ei nu vor notificați pentru că nu au acces la această categorie. Va trebui să îi adaugi la într-un grup care are acces la aceasta categorie."
+ private: "Ai menționat utilizatorii: {{username}}. Însă ei nu vor fi notificați pentru că nu au posibilitatea să vadă acest mesaj personal. Va trebui să îi inviți la acest MP. "
+ duplicate_link: "Se pare că link-ul tău către {{domain}} a fost deja postat în cadrul subiectului de către @{{username}} în un răspuns {{ago}} în urmă – eși sigur că vrei să îl postezi din nou?"
error:
- title_missing: "Este nevoie de titlu"
- title_too_short: "Titlul trebuie sa aibă minim {{min}} de caractere"
- title_too_long: "Titlul nu poate avea {{max}} de caractere"
- post_missing: "Postarea nu poate fi gol"
- post_length: "Postarea trebuie sa aibă minim {{min}} de caractere"
+ title_missing: "Trebuie un titlu"
+ title_too_short: "Titlul trebuie să aibă minim {{min}} (de) caractere"
+ title_too_long: "Titlul nu poate avea mai mult de {{max}} (de) caractere"
+ post_missing: "Postarea nu poate fi goală"
+ post_length: "Postarea trebuie să aibă minim {{min}} (de) caractere"
try_like: 'Ai încercat butonul ?'
category_missing: "Trebuie să alegi o categorie"
- save_edit: "Salvează Editarea"
- reply_original: "Răspunde discuției originale"
+ save_edit: "Salvează editarea"
+ reply_original: "Răspunde la subiectul inițial"
reply_here: "Răspunde aici"
reply: "Răspunde"
cancel: "Anulează"
- create_topic: "Creează o Discuţie"
+ create_topic: "Creează un subiect"
create_pm: "Mesaj"
title: "Sau apasă Ctrl+Enter"
users_placeholder: "Adaugă un utilizator"
- title_placeholder: "Care este tema discuției într-o singură propoziție?"
- edit_reason_placeholder: "de ce editați?"
+ title_placeholder: "Despre ce e vorba în acest subiect - pe scurt?"
+ title_or_link_placeholder: "Introdu titlul, sau copiază aici un link"
+ edit_reason_placeholder: "de ce editezi?"
show_edit_reason: "(adaugă motivul editării)"
- reply_placeholder: "Scrie aici. Utilizeaza Markdown, BBCode or HTML la format. Trage sau lipeste imagini."
- view_new_post: "Vizualizează noua postare."
- saving: "Salvare"
+ topic_featured_link_placeholder: "Introdu link afișat cu titlu."
+ reply_placeholder: "Scrie aici. Utilizează formatarea Markdown, BBCode sau HTML. Trage sau lipește imagini."
+ view_new_post: "Vezi noua ta postare."
+ saving: "Se salvează"
saved: "Salvat!"
- saved_draft: "Ai o postare în stadiul neterminat. Fă click oriunde pentru a continua editarea."
- uploading: "Încarcă..."
+ saved_draft: "Ai o postare neterminată. Fă click pentru a continua editarea."
+ uploading: "Se încarcă..."
show_preview: 'arată previzualizare »'
hide_preview: '« ascunde previzualizare'
quote_post_title: "Citează întreaga postare"
- bold_title: "Gros"
- bold_text: "text gros"
- italic_title: "Aplecare"
- italic_text: "text aplecat"
- link_title: "Adresă Hyper"
- link_description: "adaugă aici descrierea adresei hyper"
- link_dialog_title: "Introdu adresă hyper"
+ bold_label: "B"
+ bold_title: "Aldin"
+ bold_text: "text aldin"
+ italic_label: "I"
+ italic_title: "Italic"
+ italic_text: "text italic"
+ link_title: "Hyperlink"
+ link_description: "adaugă aici descrierea link-ului"
+ link_dialog_title: "Introdu link"
link_optional_text: "titlu opțional"
link_url_placeholder: "http://example.com"
- quote_title: "Citat-bloc"
- quote_text: "Citat-bloc"
+ quote_title: "Bloc citat"
+ quote_text: "Bloc citat"
code_title: "Text preformatat"
- code_text: "indentează preformatarea textului cu 4 spații"
+ code_text: "indentează textul preformatat cu 4 spații"
+ paste_code_text: "tastează sau lipește cod aici"
upload_title: "Încarcă"
- upload_description: "Introduceți aici descrierea fișierelor încărcate"
- olist_title: "Listă numerică"
- ulist_title: "Listă punctată"
- list_item: "conținut de listă"
+ upload_description: "Descrie fișierele de încărcat"
+ olist_title: "Listă numerotată"
+ ulist_title: "Listă cu marcatori"
+ list_item: "Element listă"
+ heading_label: "H"
heading_title: "Titlu"
heading_text: "Titlu"
- hr_title: "Linie orizontală"
- help: "Ajutor de editare"
+ hr_title: "Riglă orizontală"
+ help: "Ajutor pentru formatarea cu Markdown"
toggler: "ascunde sau arată editorul"
modal_ok: "Ok"
- modal_cancel: "Anuleaza"
+ modal_cancel: "Anulare"
cant_send_pm: "Nu poți trimite mesaje către %{username}"
- admin_options_title: "Setări opționale ale discuției pentru moderatori"
+ yourself_confirm:
+ title: "Ai uitat să adaugi destinatari?"
+ body: "În acest moment mesajul acesta nu este trimis decât către tine însuți!"
+ admin_options_title: "Setări opționale pentru moderatori cu privire la acest subiect"
auto_close:
- label: "Închide automat discuţia după:"
- error: "Introduceţi o valoare valida."
- based_on_last_post: "Nu închide discuţia până când ultimul răspuns nu are o vechime de cel puţin:"
+ label: "Închide automat discuția la:"
+ error: "Introduceţi o valoare validă."
+ based_on_last_post: "Nu închide subiectul până când ultimul răspuns nu are o vechime de cel puțin"
all:
- examples: 'Introdu numărul de ore (24), timpul absolut (17:30) sau dată şi timpul cu secunde (2013-11-22 14:00).'
+ examples: 'Introdu numărul de ore (24), timpul absolut (17:30) sau data şi ora cu secunde (2013-11-22 14:00).'
limited:
units: "(# de ore)"
examples: 'Introdu numărul de ore (24).'
notifications:
- title: "notifică menționarea @numelui, răspunsuri la postările mele, discuții, mesaje private, etc"
- none: "Nu pot încarcă notificările în acest moment."
+ title: "notificări la menționările @numelui tău, răspunsuri la postările sau subiectele tale, mesaje, etc."
+ none: "Nu pot încărca notificările în acest moment."
+ empty: "Nu au fost găsite notificări."
more: "vezi notificările mai vechi"
- total_flagged: "toate postările semnalate"
- mentioned: "@
{{username}} {{description}}
" - quoted: "
{{username}} {{description}}
" - replied: "
{{username}} {{description}}
" - posted: "
{{username}} {{description}}
" + total_flagged: "toate postările marcate" + mentioned: "
{{username}} {{description}}
" + group_mentioned: "
{{username}} {{description}}
" + quoted: "
{{username}} {{description}}
" + replied: "
{{username}} {{description}}
" + posted: "
{{username}} {{description}}
" edited: "
{{username}} {{description}}
" liked: "
{{username}} {{description}}
" liked_2: "
{{username}}, {{username2}} {{description}}
" @@ -947,112 +1132,189 @@ ro: invited_to_topic: "
{{username}} {{description}}
" invitee_accepted: "
{{username}} a acceptat invitația ta
" moved_post: "
{{username}} mutată {{description}}
" - granted_badge: "
Ţi s-a acordat {{description}}
" + linked: "
{{username}} {{description}}
" + granted_badge: "
Ţi s-a acordat {{description}}
" + watching_first_post: "
Postare nouă {{description}}
" + group_message_summary: + one: "
Există un mesaj în căsuța poștală a grupului {{group_name}}
" + few: "
Există {{count}} mesaje în căsuța poștală a grupului {{group_name}}
" + other: "
Există {{count}} de mesaje în căsuța poștală a grupului {{group_name}}
" alt: - mentioned: "Mentionat de" + mentioned: "Menționat de" quoted: "Citat de" - replied: "Raspuns" + replied: "Răspuns" posted: "Postat de" + edited: "Editează postarea prin" + liked: "V-a apreciat postarea" private_message: "Mesaj privat de la" + invited_to_private_message: "Invitat la un mesaj privat de către" + invited_to_topic: "Invitat la un subiect de către" + invitee_accepted: "Invitație acceptată de către" + moved_post: "Postarea ta a fost mutată de către" linked: "Link spre postarea ta" + granted_badge: "Ecuson acordat" + group_message_summary: "Mesaje în căsuța poștală a grupului" popup: mentioned: '{{username}} te-a menţionat în "{{topic}}" - {{site_title}}' group_mentioned: '{{username}} te-a menţionat în "{{topic}}" - {{site_title}}' quoted: '{{username}} te-a citat în "{{topic}}" - {{site_title}}' replied: '{{username}} ți-a răspuns la "{{topic}}" - {{site_title}}' - posted: '{{username}} a postal în "{{topic}}" - {{site_title}}' + posted: '{{username}} a postat în "{{topic}}" - {{site_title}}' private_message: '{{username}} ți-a trimis un mesaj privat în "{{topic}}" - {{site_title}}' - linked: '{{username}} a făcut o legătură la post-ul tău din "{{topic}}" - {{site_title}}' + linked: '{{username}} a pus un link către postarea ta din "{{topic}}" - {{site_title}}' upload_selector: title: "Adaugă o imagine" - title_with_attachments: "adaugă o imagine sau un fișier" - from_my_computer: "din dispozitivul meu" + title_with_attachments: "Adaugă o imagine sau un fișier" + from_my_computer: "Din dispozitivul meu" from_the_web: "De pe web" - remote_tip: "adresă către imagine http://example.com/image.jpg" - local_tip: "selectează imagini de pe dispozitivul tău" - local_tip_with_attachments: "selectează imagini sau fișiere de pe dispozitivul tău {{authorized_extensions}}" - hint: "(puteți să trageți și să aruncați în editor pentru a le încărca)" - uploading: "Încarcă" - select_file: "Slectează fișier" - image_link: "Adresa din imagine va duce la" + remote_tip: "link către imagine" + remote_tip_with_attachments: "link la imagine sau fișier {{authorized_extensions}}" + local_tip: "alege imagini de pe dispozitivul tău" + local_tip_with_attachments: "alege imagini sau fișiere de pe dispozitivul tău {{authorized_extensions}}" + hint: "(poți să faci drag and drop în editor pentru a le încărca)" + hint_for_supported_browsers: "Poți de asemenea să faci drag and drop sau să lipești imagini în editor" + uploading: "Se încarcă" + select_file: "Alege fișier" + image_link: "Link-ul de la imagine va duce la" search: sort_by: "Sortează după" relevance: "Relevanță" - latest_post: "Ultimele postări" + latest_post: "Cele mai recente postări" most_viewed: "Cele mai văzute" most_liked: "Cele mai apreciate" select_all: "Selectează tot" + clear_all: "Șterge tot" + too_short: "Termenul căutat este prea scurt." result_count: one: "Un rezultat pentru \"{{term}}\"" few: "{{count}} rezultate pentru \"{{term}}\"" other: "{{count}} de rezultate pentru \"{{term}}\"" - title: "caută discuții, postări, utilizatori sau categorii" - no_results: "Fără rezultat." - search_help: Ajutor căutare - searching: "Caută..." + title: "Caută subiecte, postări, utilizatori sau categorii" + no_results: "Nici un rezultat." + no_more_results: "Nu s-au mai găsit alte rezultate." + searching: "Se caută..." post_format: "#{{post_number}} de {{username}}" context: user: "Caută postări după @{{username}}" - topic: "Caută în această discuție" + category: "Caută în categoria #{{category}} " + topic: "Caută în acest subiect" private_messages: "Caută mesaje" + advanced: + title: Căutare avansată + posted_by: + label: Postat de + in_category: + label: În categoria + in_group: + label: În grupul + with_badge: + label: Cu ecusonul + with_tags: + label: Cu etichetele + filters: + label: Afișează doar postările/subiectele ... + likes: pe care le-am apreciat + posted: în care am postat + watching: pe care le urmăresc activ + tracking: le urmăresc + private: sunt în mesajele mele + bookmarks: le-am adăugat la semne de carte + first: sunt chiar pe primul loc în listă + pinned: sunt fixate + unpinned: nu sunt fixate + wiki: sunt wiki + statuses: + label: Unde subiectele + open: sunt deschise + closed: sunt închise + archived: sunt arhivate + noreplies: nu au nici un răspuns + single_user: au un singur utilizator + post: + count: + label: Număr minim de postări + time: + label: Postat(e) + before: înainte + after: după + hamburger_menu: "Du-te la o altă categorie saulistă de subiecte" new_item: "nou" go_back: 'înapoi' - not_logged_in_user: 'pagina utilizatorului cu sumarul activităților și preferințelor' - current_user: 'mergi la pagina proprie de utilizator' + not_logged_in_user: 'pagina utilizatorului cu rezumatul activităților și preferințelor' + current_user: 'mergi la pagina ta de utilizator' topics: + new_messages_marker: "ultima vizită" bulk: - reset_read: "resetează citirea" + select_all: "Selectează tot" + clear_all: "Deselectează tot" + unlist_topics: "Elimină subiecte din listă" + reset_read: "Resetează citite" delete: "Șterge subiectele" + dismiss: "Abandonează" + dismiss_read: "Abandonează toate necitite" + dismiss_button: "Abandonează..." + dismiss_tooltip: "Abandonează numai postările noi sau oprește urmărirea subiectelor" + also_dismiss_topics: "Încetează urmărirea subiectelor astfel încât să nu mai îmi apară niciodată ca necitite" dismiss_new: "Anulează cele noi" - toggle: "activează selecția în masă pentru discuții" - actions: "Acțiuni în masă" + toggle: "activează selecția multiplă a subiectelor" + actions: "Acțiuni multiple" change_category: "Schimbă categoria" - close_topics: "Închide discuțiile" + close_topics: "Închide subiectele" archive_topics: "Arhivează subiectele" notification_level: "Schimbă nivelul de notificări" - choose_new_category: "Alege o nouă categorie pentru această discuţie" + choose_new_category: "Alege o nouă categorie pentru acest subiect" selected: one: "Ai selectat un subiect." few: "Ai selectat {{count}} subiecte." other: "Ai selectat {{count}} de subiecte." + change_tags: "Schimbă etichete" + choose_new_tags: "Alege etichete noi pentru aceste subiecte:" + changed_tags: "Etichetele pentru aceste subiecte au fost schimbate." none: - unread: "Nu sunt discuții necitite." - new: "Nu sunt discuții noi." - read: "Nu ai citit nicio discuție încă." - posted: "Nu ai postat în nicio discuție încă." - latest: "Nu există nicio discuție nouă." - hot: "Nu există nicio discuție importantă." - bookmarks: "Nu aveţi nici un semn de carte încă." - category: "Nu există nicio discuție din categoria {{category}}." - top: "Nu exită nicio discuție de top." - search: "Nu sunt rezulate la căutare." + unread: "Nu sunt subiecte necitite." + new: "Nu sunt subiecte noi." + read: "Nu ai citit încă niciun subiect." + posted: "Nu ai postat încă în niciun subiect." + latest: "Nu există niciun subiect recent. Asta-i trist." + hot: "Nu există niciun subiect fierbinte." + bookmarks: "Nu ai nici un semn de carte încă." + category: "Nu există niciun subiect din categoria {{category}}." + top: "Nu exită niciun subiect de top." + search: "Nu sunt rezultate." + educate: + new: '
Subiectele noi vor apărea aici.
Implicit, subiectele vor fi considerate noi și vor afișa un indicator că suntnoi dacă au fost create în ultimele 2 zile.
Mergi la preferințe pentru a schimba această setare.
' + unread: '
Subiectele necitite vor apărea aici
Implicit, subiectele sunt considerate necitite și se va afișa numărul celor necitite 1dacă ai:
Sau dacă ai setat în mod explicit subiectul pe Urmărire sau Urmărire activă prin intermediul contorului de notificare de la sfârșitul fiecărui subiect.
Mergi la preferințe pentru a schimba această setare.
'
bottom:
- latest: "Nu există nicio ultimă discuție."
- hot: "Nu mai există discuții importante."
- posted: "Nu mai există discuții postate."
- read: "Nu mai există discuții citite."
- new: "Nu mai există discuții noi."
- unread: "Nu mai există discuții necitite."
- category: "Nu mai există discuții din categoria {{category}}."
- top: "Nu mai există discuții de top."
+ latest: "Nu mai există niciun subiect recent."
+ hot: "Nu mai există subiecte importante."
+ posted: "Nu mai există subiecte postate."
+ read: "Nu mai există subiecte citite."
+ new: "Nu mai există subiecte noi."
+ unread: "Nu mai există subiecte necitite."
+ category: "Nu mai există subiecte din categoria {{category}}."
+ top: "Nu mai există subiecte de top."
bookmarks: "Nu mai sunt semne de carte."
search: "Nu mai sunt rezultate."
topic:
unsubscribe:
stop_notifications: "Vei primi mai puține notificări pentru {{title}}"
- filter_to: "{{post_count}} postări în discuție"
- create: 'Discuție Nouă'
- create_long: 'Creează discuție nouă'
+ change_notification_state: "Starea actuală a notificărilor tale este"
+ filter_to:
+ one: "O postare în subiect"
+ few: "{{count}} postări în subiect"
+ other: "{{count}} de postări în subiect"
+ create: 'Subiect nou'
+ create_long: 'Creează un subiect nou'
private_message: 'Scrie un mesaj.'
archive_message:
help: 'Mută mesajul în arhivă'
title: 'Arhivează'
move_to_inbox:
- title: 'Mută în Inbox'
- help: 'Mută mesajul în Inbox'
- list: 'Discuții'
- new: 'discuție nouă'
- unread: 'necitită'
+ title: 'Mută în Primite'
+ help: 'Mută mesajul în Primite'
+ list: 'Subiecte'
+ new: 'subiect nou'
+ unread: 'necitit'
new_topics:
one: 'Un subiect nou'
few: '{{count}} subiecte noi'
@@ -1061,17 +1323,17 @@ ro:
one: 'Un subiect necitit'
few: '{{count}} subiecte necitite'
other: '{{count}} de subiecte necitite'
- title: 'Discuție'
+ title: 'Subiect'
invalid_access:
title: "Discuția este privată"
- description: "Ne pare rău nu ai acces la acea discuție!"
- login_required: "Trebuie să fii autentificat să poți vedea discuția."
+ description: "Ne pare rău, nu ai acces la acest subiect!"
+ login_required: "Trebuie să fii autentificat pentru a vedea subiectul ăsta."
server_error:
- title: "Discuția nu s-a putut încărca"
- description: "Ne pare rău, nu am putut încărca discuția, posibil din cauza unei probleme de conexiune. Încercați din nou. Dacă problema persistă, anunță-ne."
+ title: "Nu s-a putut încărca subiectul"
+ description: "Ne pare rău, nu am putut încărca subiectul, posibil din cauza unei probleme de conexiune. Încearcă din nou. Dacă problema persistă, anunță-ne."
not_found:
- title: "Discuție negăsită"
- description: "Ne pare rău, Nu am putut găsii discuția. Poate a fost ștearsă de un moderator?"
+ title: "Subiectul nu a fost găsit"
+ description: "Ne pare rău, Nu am putut găsi subiectul. Poate a fost șters de un moderator?"
total_unread_posts:
one: "ai un mesaj necitit în această discuţie."
few: "ai {{count}} mesaje necitite în această discuţie."
@@ -1088,55 +1350,68 @@ ro:
one: "există o apreciere pentru această discuţie"
few: "sunt {{count}} aprecieri pentru această discuţie"
other: "sunt {{count}} de aprecieri pentru această discuţie"
- back_to_list: "Înapoi la lista de discuții"
- options: "Opțiunile discuției"
- show_links: "arată link-urile din această discuție"
- toggle_information: "activează detaliile discuției"
- read_more_in_category: "Vreți să citiți mai mult? Priviți alte discuții din {{catLink}} sau {{latestLink}}."
- read_more: "Vreți să citiți mai mult? {{catLink}} sau {{latestLink}}."
- browse_all_categories: Priviți toate categoriile
- view_latest_topics: arată ultimele discuții
- suggest_create_topic: De ce să nu creați o discuție?
+ back_to_list: "Înapoi la lista de subiecte"
+ options: "Opțiuni pentru subiect"
+ show_links: "arată link-urile din acest subiect"
+ toggle_information: "comută între detaliile subiectului"
+ read_more_in_category: "Vrei să citești mai mult? Răsfoiește alte subiecte din {{catLink}} sau {{latestLink}}."
+ read_more: "Vrei să citești mai multe subiecte? {{catLink}} sau {{latestLink}}."
+ read_more_MF: "{ UNREAD, plural, =0 {} one { Există un subiect necitit } other { Sunt # subiecte necitite } } { NEW, plural, =0 {} one { {BOTH, select, true{și } false {există } other{}} un subiect nou} other { {BOTH, select, true{și } false {sunt } other{}} # subiecte noi} } rămase, sau {CATEGORY, select, true {răsfoiți alte subiecte în {catLink}} false {{latestLink}} other {}}"
+ browse_all_categories: Răsfoiți prin toate categoriile
+ view_latest_topics: arată ultimele subiecte
+ suggest_create_topic: Ce ar fi să creezi un subiect?
jump_reply_up: sări la un răspuns mai vechi
jump_reply_down: sări la un răspuns mai nou
- deleted: "Discuția a fost ștearsă"
- auto_close_notice: "Această discuție va fi inchisă în %{timeLeft}."
- auto_close_notice_based_on_last_post: "Această discuţie se va închide %{duration} după ultimul răspuns."
- auto_close_title: 'Setările de auto-închidere'
+ deleted: "Subiectul a fost șters"
+ auto_close_notice: "Acest subiect va fi automat închis în %{timeLeft}."
+ auto_close_notice_based_on_last_post: "Acest subiect va fi automat închis după %{duration} de la ultimul răspuns."
+ auto_close_title: 'Setări de închidere automată'
auto_close_save: "Salvează"
- auto_close_remove: "nu închide automat această discuție"
+ auto_close_remove: "Nu închide automat acest subiect"
+ auto_close_immediate:
+ one: "Ultima postare din subiect este deja veche de o oră, așa că subiectul va fi închis imediat."
+ few: "Ultima postare din subiect este deja veche de %{count} ore, așa că subiectul va fi închis imediat."
+ other: "Ultima postare din subiect este deja veche de %{count} de ore, așa că subiectul va fi închis imediat."
+ timeline:
+ back: "Înapoi"
+ back_description: "Întoarce-te la ultima ta postare necitită"
+ replies_short: "%{current} / %{total}"
progress:
- title: Progresul Discuției
+ title: Evoluția subiectului
go_top: "început"
go_bottom: "sfârșit"
go: "mergi"
- jump_bottom: "sări la ultimul mesaj"
- jump_bottom_with_number: "sări la mesajul %{post_number}"
+ jump_bottom: "sari la ultimul mesaj"
+ jump_prompt: "sari la postarea"
+ jump_prompt_long: "La ce postare dorești să sari?"
+ jump_bottom_with_number: "sari la mesajul %{post_number}"
total: toate postările
current: Postarea curentă
- position: "postarea %{current} din %{total}"
notifications:
+ title: schimbă frecvența cu care vei fi notificat despre acest subiect
reasons:
+ mailing_list_mode: "Ai modul mailing list activat, așa că nu vei fi notificat prin email cu privire la răspunsurile la acest subiect."
+ '3_10': 'Vei primi notificări pentru ca urmărești o etichetă de la acest subiect.'
'3_6': 'Vei primi notificări deoarece urmărești activ această categorie.'
- '3_5': 'Vei primi notificări deoarece ai început să urmărești activ această discuție automat.'
- '3_2': 'Vei primi notificări deoarece urmărești activ această discuție.'
- '3_1': 'Vei primi notificări deoarece ați creat această discuție.'
- '3': 'Vei primi notificări deoarece urmărești activ această discuție.'
+ '3_5': 'Vei primi notificări deoarece ai început să urmărești activ acest subiect, în mod automat.'
+ '3_2': 'Vei primi notificări deoarece urmărești activ acest subiect.'
+ '3_1': 'Vei primi notificări deoarece ai creat acest subiect.'
+ '3': 'Vei primi notificări deoarece urmărești activ acest subiect.'
'2_8': 'Vei primi notificări deoarece urmărești această categorie.'
- '2_4': 'Vei primi notificări deoarece ai postat un răspuns în această discuție.'
- '2_2': 'Vei primi notificări fiindcă urmărești această discuție.'
- '2': 'Vei primi notificări fiindcă citești această discuție.'
+ '2_4': 'Vei primi notificări deoarece ai postat un răspuns în acest subiect.'
+ '2_2': 'Vei primi notificări fiindcă urmărești acest subiect.'
+ '2': 'Vei primi notificări fiindcă citești acest subiect.'
'1_2': 'Vei fi notificat dacă cineva îți menționează @numele sau îți scrie un răspuns.'
'1': 'Vei fi notificat dacă cineva îți menționează @numele sau îți scrie un răspuns.'
'0_7': 'Ignori toate notificările din această categorie.'
- '0_2': 'Ignori toate notificările din această discuție.'
- '0': 'Ignori toate notificările din această discuție.'
+ '0_2': 'În acest moment ignori toate notificările de la acest subiect.'
+ '0': 'În acest moment ignori toate notificările de la acest subiect.'
watching_pm:
- title: "Urmărit Activ"
+ title: "Urmărind activ"
description: "Numărul postărilor noi va fi arătat pentru acest mesaj și vei fi notificat pentru orice răspuns scris."
watching:
- title: "Urmărit Activ"
- description: "Numărul postărilor noi va fi arătat pentru această discuție și vei fi notificat pentru orice răspuns scris."
+ title: "Urmărind activ"
+ description: "Vei fi notificat la fiecare nou răspuns pe acest subiect și numărul de mesaje noi va fi afișat."
tracking_pm:
title: "Urmărit"
description: "Numărul postărilor noi va fi arătat pentru acest mesaj. Vei fi notificat dacă cineva îți menționează @numele sau îți scrie un răspuns."
@@ -1154,120 +1429,151 @@ ro:
description: "Nu vei fi niciodată notificat despre acest mesaj."
muted:
title: "Silențios"
- description: "Nu vei fi notificat de răspunsurile noi din această discuție și nu vor apărea în tabul necitite."
+ description: "Nu vei fi notificat niciodată despre nimic legat de acest subiect și acesta nu va fi afișat la subiecte recente."
actions:
- recover: "Restaurează discuția"
- delete: "Șterge Discuție"
- open: "Redeschide discuția"
- close: "Închide discuția"
- multi_select: "Selectează discuţiile ..."
- auto_close: "Închide automat"
- pin: "Promovează discuţia pe pagină..."
- unpin: "Anulează promovarea discuției"
- unarchive: "Dezarhivează discuția"
- archive: "Arhivează discuția"
+ recover: "Restaurează subiect"
+ delete: "Șterge subiect"
+ open: "Deschide subiect"
+ close: "Închide subiect"
+ multi_select: "Selectează subiectele ..."
+ auto_close: "Închidere automată..."
+ pin: "Fixează subiect..."
+ unpin: "Anulează subiect fixat..."
+ unarchive: "Dezarhivează subiect"
+ archive: "Arhivează subiect"
invisible: "Fă invizibil"
visible: "Fă vizibil"
- reset_read: "Resetează informația citită"
+ reset_read: "Resetează datele despre subiecte citite"
+ make_public: "Transformă în subiect public"
+ make_private: "Transformă în mesaj privat"
feature:
- pin: "Promovează discuţia pe pagină..."
- unpin: "Anulează promovarea discuției"
- pin_globally: "Promovează discuţia pe site..."
- make_banner: "Marchează discuție"
- remove_banner: "Demarchează discuție"
+ pin: "Fixează subiectul"
+ unpin: "Anulează subiect fixat"
+ pin_globally: "Promovează discuţia global"
+ make_banner: "Adaugă statutul de banner"
+ remove_banner: "Șterge statutul de banner"
reply:
title: 'Răspunde'
- help: 'începe să compui un răspuns pentru această discuție'
+ help: 'începe să scrii un răspuns la acest subiect'
clear_pin:
- title: "Înlătură promovarea"
- help: "Înlătură promovarea acestei discuții pentru a nu mai apărea la începutul listei de discuții"
+ title: "Anulează subiect fixat"
+ help: "Elimină subiectul fixat pentru a nu mai apărea la începutul listei de subiecte."
share:
title: 'Distribuie'
- help: 'distribuie o adresă acestei discuții'
+ help: 'distribuie un link cu acest subiect'
+ print:
+ title: 'Tipărire'
+ help: 'Deschide o versiune pentru imprimare a acestui subiect'
flag_topic:
- title: 'Marcheză'
- help: 'marchează privat această discuție pentru atenție sau trimite o notificare privată despre ea'
- success_message: 'Ai marcat cu succes această discuție.'
+ title: 'Marcaje'
+ help: 'marchează acest subiect pentru a atrage atenția adminilor sau a le trimite o notificare privată despre el'
+ success_message: 'Ai marcat cu succes acest subiect.'
feature_topic:
- title: "Promovează această discuţie"
- confirm_pin: "Ai deja {{count}} discuţii promovate. Prea multe discuţii promovate pot fi deveni o problemă pentru utilizatorii noi sau anonimi. Ești sigur că vrei să promovezi o altă discuţie în această categorie?"
- unpin: "Îndepărtează aceast mesaje din top-ul categoriei {{categoryLink}}"
- pin_note: "Utilizatorii pot anula promovarea unui subiect individual pentru ei înșiși."
- pin_validation: "Este nevoie de o dată pentru a putea promova această discuție."
- not_pinned: "Nu sunt discuții promovate în {{categoryLink}}."
- confirm_pin_globally: "Sunt {{count}} discuţii promovate la nivel global. Prea multe discuţii promovate pot fi deveni o problemă pentru utilizatorii noi sau anonimi. Ești sigur că vrei să promovezi o altă discuţie la nivel global?"
- unpin_globally: "Eliminați acest subiect din partea de sus a tuturor listelor de discuţii."
- global_pin_note: "Utilizatorii pot anula promovarea unui subiect individual pentru ei înșiși."
- not_pinned_globally: "Nu există subiecte promovate global."
+ title: "Promovează acest subiect"
+ pin: "Pune acest subiect în vârful categoriei {{categoryLink}} până"
+ confirm_pin: "Ai deja {{count}} subiecte fixate. Prea multe subiecte fixate pot deveni o problemă pentru utilizatorii noi sau anonimi. Ești sigur că vrei să fixezi un alt subiect în această categorie?"
+ unpin: "Elimină aceste mesaje din vârful categoriei {{categoryLink}}."
+ unpin_until: "Elimină acest subiect din vârful categoriei {{categoryLink}} sau așteaptă până %{until}."
+ pin_note: "Utilizatorii pot anula un subiect fixat doar de ei pentru ei înșiși."
+ pin_validation: "Este necesară o dată pentru a putea fixa acest subiect."
+ not_pinned: "Nu sunt subiecte fixate în {{categoryLink}}."
+ already_pinned:
+ one: "Număr de subiecte momentan fixate în {{categoryLink}}: {{count}}"
+ few: "Număr de subiecte momentan fixate în {{categoryLink}}: {{count}}"
+ other: "Număr de subiecte momentan fixate în {{categoryLink}}: {{count}}"
+ pin_globally: "Pune acest subiect în vârful listei tuturor subiectelor până"
+ confirm_pin_globally: "Sunt {{count}} subiecte fixate la nivel global. Prea multe subiecte fixate pot fi deveni o problemă pentru utilizatorii noi sau anonimi. Ești sigur că vrei să fixezi un nou subiect la nivel global?"
+ unpin_globally: "Elimină acest subiect din partea de sus a tuturor listelor de discuţii."
+ unpin_globally_until: "Scoate acest subiect din vârful listei tuturor subiectelor și așteaptă până %{until}."
+ global_pin_note: "Utilizatorii pot anula un subiect fixat doar de ei pentru ei înșiși."
+ not_pinned_globally: "Nu există subiecte fixate global."
+ already_pinned_globally:
+ one: "Număr de subiecte fixate la nivel global: {{count}}"
+ few: "Număr de subiecte fixate la nivel global: {{count}}"
+ other: "Număr de subiecte fixate la nivel global: {{count}}"
make_banner: "Transformă acest subiect într-un banner care apare în partea de sus a tuturor paginilor."
- remove_banner: "Îndepărtaţi mesajul banner care apare în partea de sus a fiecărei pagini."
- banner_note: "Utilizatorii pot îndepărta baner-ul închizându-l. Doar un singur mesaj poate fi folosit că baner într-un moment dat."
- inviting: "Invită..."
+ remove_banner: "Elimină mesajul banner care apare în partea de sus a fiecărei pagini."
+ banner_note: "Utilizatorii pot îndepărta baner-ul închizându-l. Doar un singur mesaj poate fi folosit ca baner într-un moment dat."
+ no_banner_exists: "Nu există nici un subiect banner."
+ banner_exists: "Există un subiect banner."
+ inviting: "Se trimit invitații..."
+ automatically_add_to_groups: "Această invitație include accesul la următoarele grupuri:"
invite_private:
title: 'Invită la mesaj privat'
- email_or_username: "adresa de Email sau numele de utilizator al invitatului"
+ email_or_username: "adresa de email sau numele de utilizator al invitatului"
email_or_username_placeholder: "adresa de email sau numele utilizatorului"
action: "Invită"
success: "Am invitat acest utilizator să participe la acest mesaj."
- error: "Ne pare rău, a apărut o eroare la trimiterea invitației către acel utilizator."
+ success_group: "Am invitat acest grup să participe la acest mesaj."
+ error: "Ne pare rău, a apărut o eroare la trimiterea invitației către respectivul utilizator."
group_name: "numele grupului"
+ controls: "Controale pentru subiect"
invite_reply:
title: 'Invitație'
username_placeholder: "nume utilizator"
action: 'Trimite o invitație'
help: 'invită alţi utilizatori la această discuţie via email sau notificare'
- to_forum: "Vom trimite un email scurt permițând prietenilor tăisă participe făcând click pe o adesă fără a necesita autentificare."
- sso_enabled: "Introdu numele de utilizator al persoanei pe care dorești să o inviți la acesta discuţie."
- to_topic_blank: "Introdu numele de utilizator sau adresa de email a persoanei pe care dorești să o inviți la acesta discuţie."
- to_topic_email: "Ai introdus o adresa de e-mail. Vom trimite un email cu o invitaţie ce va permite prietenului tău să răspundă imediat la această discuţie."
- email_placeholder: 'exemplu@nume.com'
- success_email: "Am trimis o invitaţie către {{emailOrUsername}}.. Te vom anunţă când invitaţia este folosită. Verifică tab-ul invitaţii pe pagină ta de utilizator pentru a monitoriza invitaţiile. "
+ to_forum: "Vom trimite un email scurt prietenilor tăi ca să participe făcând click pe o adresă, fără a fi nevoie de autentificare."
+ sso_enabled: "Introdu numele de utilizator al persoanei pe care dorești să o inviți la acest subiect."
+ to_topic_blank: "Introdu numele de utilizator sau adresa de email a persoanei pe care dorești să o inviți la acest subiect."
+ to_topic_email: "Ai introdus o adresă de email. Vom trimite către ea un email cu o invitație ce îi va permite prietenului tău să răspundă imediat la acest subiect."
+ to_topic_username: "Ai introdus un nume utilizator. Îi vom trimite o notificare cu link pentru a-l invita la acest subiect."
+ to_username: "Introdu numele de utilizator al persoanei pe care dorești să o inviți. Îi vom trimite o notificare cu link pentru a o invita la acest subiect."
+ email_placeholder: 'nume@exemplu.com'
+ success_email: "Am trimis o invitație către {{emailOrUsername}}.. Te vom anunţa când invitația este folosită. Verifică tab-ul de invitații pe pagina ta de utilizator pentru a monitoriza invitațiile. "
success_username: "Am invitat acest utilizator să participe la această discuţie."
- error: "Ne pare rău, nu am putut invită persoană indicată. Poate că a fost deja invitată? (Invitaţiile sunt limitate)"
+ error: "Ne pare rău, nu am putut invita persoana indicată. Poate că a fost deja invitată? (Invitaţiile sunt limitate)"
login_reply: 'Autentifică-te pentru a răspunde.'
filters:
n_posts:
- one: "O Postare"
+ one: "O postare"
few: "{{count}} postări"
other: "{{count}} de postări"
- cancel: "Arată din nou toate postările din această discuție."
+ cancel: "Șterge filtre"
split_topic:
- title: "Mutare în discuție nouă "
- action: "mută în discuție nouă"
- topic_name: "Numele noii discuții"
- error: "S-a semnalat o eroare la mutarea postărilor către discuția nouă."
+ title: "Mutare în subiect nou."
+ action: "mută în subiect nou"
+ topic_name: "Numele subiectului nou"
+ error: "A apărut o eroare la mutarea postărilor în subiectul nou."
instructions:
one: "Vei crea o nouă discuţie care va fi populată cu postarea selectată."
few: "Vei crea o nouă discuţie care va fi populată cu cele {{count}} postări selectate."
other: "Vei crea o nouă discuţie care va fi populată cu cele {{count}} de postări selectate."
merge_topic:
- title: "Mută în discuție existentă"
- action: "mută în discuție existentă"
- error: "S-a semnalat o eroare la mutarea postărilor în acea discuție."
+ title: "Mută în subiect deja existent"
+ action: "mută în subiect deja existent"
+ error: "A apărut o eroare la mutarea postărilor în acel subiect."
instructions:
- one: "Vă rugăm să alegeţi discuţia unde doriţi să mutaţi acest mesaj."
- few: "Vă rugăm să alegeţi discuţia unde doriţi să mutaţi aceste {{count}} mesaje."
- other: "Vă rugăm să alegeţi discuţia unde doriţi să mutaţi aceste {{count}} de mesaje."
+ one: "Te rugăm să alegi subiectul unde dorești să muți acest mesaj."
+ few: "Te rugăm să alegi subiectul unde dorești să muți aceste {{count}} mesaje."
+ other: "Te rugăm să alegi subiectul unde dorești să muți aceste {{count}} de mesaje."
+ merge_posts:
+ title: "Comasează postările selectate"
+ action: "comasează postările selectate"
+ error: "A apărut o eroare la comasarea postărilor selectate."
change_owner:
- title: "Schimbă deținătorul postărilor"
- action: "Schimbă apartenența"
- error: "S-a semnalat o eroare la schimbarea apartenenței postărilor."
- label: "Noul deținător al postărilor"
- placeholder: "numele de utilizator al deținătorului"
+ title: "Schimbă autorul postărilor"
+ action: "Schimbă autorul"
+ error: "A apărut o eroare la schimbarea autorului postărilor."
+ label: "Noul autor al postărilor"
+ placeholder: "numele de utilizator al autorului"
instructions:
- one: "Va rugăm să alegeţi noul propietar pentru mesajul postat de {{old_user}}."
- few: "Va rugăm să alegeţi noul propietar pentru cele {{count}} mesajele postate de {{old_user}}."
- other: "Va rugăm să alegeţi noul propietar pentru cele {{count}} de mesajele postate de {{old_user}}."
+ one: "Alege noul autor pentru mesajul postat de {{old_user}}."
+ few: "Alege noul autor pentru cele {{count}} mesaje postate de {{old_user}}."
+ other: "Alege noul autor pentru cele {{count}} de mesaje postate de {{old_user}}."
instructions_warn: "NB: nicio notificare ce privește această postare nu va fi transferabilă retroactiv către noul utilizator.
+
Avertisment: Acum, nicio informație ce depinde de postare nu va fi transferată noului utilizator. Folosește cu atenție."
change_timestamp:
title: "Schimbă data publicării"
action: "schimbă data publicării"
+ invalid_timestamp: "Marcajul de timp nu poate fi în viitor."
+ error: "A apărut o eroare la schimbarea marcajului de timp în subiect."
+ instructions: "Te rugăm să selectezi noul marcaj de timp pentru subiect. Postările din acest subiect vor fi actualizate pentru a menține aceeași diferență de timp."
multi_select:
select: 'selectează'
selected: 'selectate ({{count}})'
select_replies: 'selectează +răspunsuri'
delete: șterge selecția
- cancel: anularea selecției
+ cancel: anulare selecție
select_all: selectează tot
deselect_all: deselectează tot
description:
@@ -1277,153 +1583,157 @@ ro:
post:
reply: " {{replyAvatar}} {{usernameLink}}"
reply_topic: " {{link}}"
- quote_reply: "răspunde prin citat"
+ quote_reply: "Citează"
edit: "Editează {{link}} {{replyAvatar}} {{username}}"
- edit_reason: "Motivul: "
+ edit_reason: "Motivul edit[rii: "
post_number: "postarea {{number}}"
last_edited_on: "postare editată ultima oară la"
- reply_as_new_topic: "Răspunde cu o discuție nouă"
- continue_discussion: "În continuarea discuției {{postLink}}:"
+ reply_as_new_topic: "Răspunde cu link către subiect"
+ continue_discussion: "În continuarea discuției de la {{postLink}}:"
follow_quote: "mergi la postarea citată"
show_full: "Arată postarea în întregime"
show_hidden: 'Arată conținut ascuns.'
deleted_by_author:
- one: "(post retras de autor, va fi şters automat în %{count} ore, cu excepţia cazului în care mesajul este marcat)"
+ one: "(post retras de autor, va fi şters automat într-o oră, cu excepţia cazului în care mesajul este marcat)"
few: "(postări retrase de autor, vor fi şterse automat în %{count} ore, cu excepţia cazului în care mesajele sunt marcate)"
- other: "(postări retrase de autor, vor fi şterse automat în %{count} ore, cu excepţia cazului în care mesajele sunt marcate)"
- expand_collapse: "expandează/restrânge"
+ other: "(postări retrase de autor, vor fi şterse automat în %{count} de ore, cu excepţia cazului în care mesajele sunt marcate)"
+ expand_collapse: "extinde/restrânge"
gap:
one: "vezi un răspuns ascuns"
few: "vezi {{count}} răspunsuri ascunse"
other: "vezi {{count}} de răspunsuri ascunse"
- more_links: "{{count}} mai multe..."
unread: "postarea nu a fost citită"
has_replies:
one: "Un răspuns"
few: "{{count}} răspunsuri"
other: "{{count}} de răspunsuri"
has_likes:
- one: "O Apreciere"
- few: "{{count}} Aprecieri"
- other: "{{count}} de Aprecieri"
+ one: "O apreciere"
+ few: "{{count}} aprecieri"
+ other: "{{count}} de aprecieri"
has_likes_title:
- one: "O persoană a apreciat acest post."
- few: "{{count}} persoane au apreciat acest post."
- other: "{{count}} de persoane au apreciat acest post."
- has_likes_title_only_you: "Ai apreciat acest post"
+ one: "O persoană a apreciat această postare."
+ few: "{{count}} persoane au apreciat această postare."
+ other: "{{count}} de persoane au apreciat această postare."
+ has_likes_title_only_you: "Ai apreciat această postare."
has_likes_title_you:
- one: "Ai apreciat acest post împreună cu un alt utilizator."
- few: "Ai apreciat acest post împreună cu alți {{count}} utilizatori."
- other: "Ai apreciat acest post împreună cu alți {{count}} de utilizatori."
+ one: "Ai apreciat această postare împreună cu un alt utilizator."
+ few: "Ai apreciat această postare împreună cu alți {{count}} utilizatori."
+ other: "Ai apreciat această postare împreună cu alți {{count}} de utilizatori."
errors:
- create: "Ne pare rău, a apărut o eroare în creerea postării. Te rugăm să încerci iar."
- edit: "Ne pare rău, a apărut o eroare în editarea postării. Te rugăm să încerci iar."
- upload: "Ne pare rău, a apărut o eroare în încărcarea acelui fișier. Te rugăm să încerci iar."
- too_many_uploads: "Ne pare rău, poți încarca doar câte un fișier."
- upload_not_authorized: "Ne pare rău, fișierul pe care-l încarci nu este autorizat (extensia pentru autorizare: {{authorized_extensions}})."
- image_upload_not_allowed_for_new_user: "Ne pare rău, un utilizator nou nu poate încarca imagini."
- attachment_upload_not_allowed_for_new_user: "Ne pare rău, un utilizator nou nu poate încarca atașamnete."
- attachment_download_requires_login: "Ne pare rău, dar trebuie să fii autentificat pentru a descarca ataşamente."
+ create: "Ne pare rău, a apărut o eroare la creerea postării. Te rugăm să încerci iar."
+ edit: "Ne pare rău, a apărut o eroare la editarea postării. Te rugăm să încerci iar."
+ upload: "Ne pare rău, a apărut o eroare la încărcarea fișierului. Te rugăm să încerci iar."
+ file_too_large: "Ne pare rău, fișierul este prea mare (mărimea maximă este {{max_size_kb}}kb). De ce nu încarci acest fișier mare pe un serviciu de distribuție prin cloud și apoi să îi partajezi link-ul?"
+ too_many_uploads: "Ne pare rău, poți încărca doar câte un fișier."
+ too_many_dragged_and_dropped_files: "Ne pare rău, poți încărca doar 10 fișiere simultan."
+ upload_not_authorized: "Ne pare rău, fișierul pe care-l încarci nu este permis (extensii permise: {{authorized_extensions}})."
+ image_upload_not_allowed_for_new_user: "Ne pare rău, un utilizator nou nu poate încărca imagini."
+ attachment_upload_not_allowed_for_new_user: "Ne pare rău, un utilizator nou nu poate încărca atașamente."
+ attachment_download_requires_login: "Ne pare rău, dar trebuie să fii autentificat pentru a descărca ataşamente."
abandon:
confirm: "Ești sigur că dorești să abandonezi postarea?"
- no_value: "Nu, pastrează"
+ no_value: "Nu, păstrează"
yes_value: "Da, abandonează"
- via_email: "acest post a sosit via email"
+ via_email: "această postare a sosit via email"
+ via_auto_generated_email: "Această postare a sosit prin intermediul unui email auto-generat"
+ whisper: "această postare este doar pentru moderatori (modul discret)"
+ wiki:
+ about: "această postare este un wiki"
archetypes:
save: 'Opțiuni de salvare'
+ few_likes_left: "Îți mulțumim că împărtășești aprecierea! Mai ai doar câteva aprecieri pentru azi."
controls:
- reply: "începe compunerea unui răspuns pentru această postare"
- like: "apreciează acestă postăre"
+ reply: "începe să scrii un răspuns pentru această postare"
+ like: "apreciează acestă postare"
has_liked: "ai apreciat acest răspuns"
- undo_like: "anuleazaă aprecierea"
+ undo_like: "anulează aprecierea"
edit: "editează această postare"
- edit_anonymous: "Ne pare rău, dar trebuie să fii autentificat pentru a edita acest post."
- flag: "marchează privat această postare pentru atenție sau trimite o notificare privată despre aceasta"
+ edit_anonymous: "Ne pare rău, dar trebuie să fii autentificat pentru a edita această postare."
+ flag: "marchează această postare ca mesaj privat sau trimite o notificare privată despre ea către un admin/moderator"
delete: "șterge această postare"
- undelete: "rescrie această postare"
- share: "distribuie adresa către această postare"
+ undelete: "restaurează această postare"
+ share: "distribuie un link către această postare"
more: "Mai mult"
delete_replies:
confirm:
- one: "Dorești să ștergi răspunsul direct la acest mesaj?"
- few: "Dorești să ștergi cele {{count}} răspunsuri directe la acest mesaj?"
- other: "Dorești să ștergi cele {{count}} de răspunsuri directe la acest mesaj?"
+ one: "Vrei să ștergi răspunsul direct la acest mesaj?"
+ few: "Vrei să ștergi cele {{count}} răspunsuri directe la acest mesaj?"
+ other: "Vrei să ștergi cele {{count}} de răspunsuri directe la acest mesaj?"
yes_value: "Da, șterge și răspunsurile"
no_value: "Nu, doar postarea"
- admin: "acțiuni administrative de postare"
+ admin: "acțiuni administrative pentru postare"
wiki: "Fă postarea Wiki"
- unwiki: "Anulează stadiul de wiki al postării"
- convert_to_moderator: "Adaugă culoarea personalului"
- revert_to_regular: "Sterge culoarea personalului"
+ unwiki: "Nu mai fă Wiki din postare"
+ convert_to_moderator: "Adaugă culoare pentru membrii echipei"
+ revert_to_regular: "Șterge culoarea pentru membrii echipei"
rebake: "Reconstruieşte HTML"
unhide: "Arată"
+ change_owner: "Schimbă proprietarul"
actions:
- flag: 'Semnal'
+ flag: 'Marchează cu marcaj de avertizare'
defer_flags:
- one: "Marcat pentru amânare."
- few: "Marcate pentru amânare."
- other: "Marcate pentru amânare."
- it_too:
- off_topic: "Semnalează și tu"
- spam: "Semnalează și tu"
- inappropriate: "Semnalează și tu"
- custom_flag: "Semnalează și tu"
- bookmark: "Adaugă-l și tu la favorite"
- like: "Apreciază și tu"
- vote: "Votează și tu"
+ one: "Amână marcarea"
+ few: "Amână marcările"
+ other: "Amână marcările"
undo:
- off_topic: "Retrage semnalare"
- spam: "Retrage semnalare"
- inappropriate: "Retrage semnalare"
- bookmark: "Retrage marcare"
+ off_topic: "Retrage marcaj de avertizare"
+ spam: "Retrage marcaj de avertizare"
+ inappropriate: "Retrage marcaj de avertizare"
+ bookmark: "Șterge semn de carte"
like: "Retrage apreciere"
vote: "Retrage vot"
people:
- off_topic: "semnalat ca offtopic"
- spam: "somnalat ca spam"
- inappropriate: "semnalat ca nepotrivit"
+ off_topic: "marcat cu marcaj de avertizare \"în afara subiectului\""
+ spam: "marcat cu marcaj de avertizare \"spam\""
+ inappropriate: "marcat cu marcaj de avertizare \"inadecvat\""
+ notify_moderators: "moderatori notificați"
+ notify_user: "a trimis un mesaj"
+ bookmark: "a pus semn de carte la asta"
+ like: "a apreciat asta"
+ vote: "a votat la asta"
by_you:
- off_topic: "Ați marcat ca fiind în afara discuției"
- spam: "Ați marcat ca fiind spam"
- inappropriate: "Ați marcat ca nepotrivit"
- notify_moderators: "Ați marcat pentru a fi moderată"
- notify_user: "Aţi trimis un mesaj către acest utilizator"
- bookmark: "Ați marcat ca semn de carte această postare"
- like: "Ați apreciat"
- vote: "Ați votat aceasta postare"
+ off_topic: "Ai marcat asta cu mesaj de avertizare, ca fiind în afara subiectului"
+ spam: "Ai marcat asta cu mesaj de avertizare, ca fiind spam"
+ inappropriate: "Ai marcat asta cu mesaj de avertizare, ca fiind inadecvat"
+ notify_moderators: "Ai marcat asta cu mesaj de avertizare, pentru moderare"
+ notify_user: "Ai trimis un mesaj către acest utilizator"
+ bookmark: "Ai marcat ca semn de carte această postare"
+ like: "Ai apreciat"
+ vote: "Ai votat aceasta postare"
by_you_and_others:
off_topic:
- one: "Dvs. şi încă o persoană aţi marcat acest mesaj ca fiind în afară discuţiei."
- few: "Dvs. şi alte {{count}} persoane aţi marcat acest mesaj ca fiind în afară discuţiei."
- other: "Dvs. şi alte {{count}} de persoane aţi marcat acest mesaj ca fiind în afară discuţiei."
+ one: "Tu şi încă o persoană aţi marcat acest mesaj ca fiind în afară subiectului"
+ few: "Tu şi alte {{count}} persoane aţi marcat acest mesaj ca fiind în afara subiectului."
+ other: "Tu şi alte {{count}} de persoane aţi marcat acest mesaj ca fiind în afara subiectului."
spam:
- one: "Dvs. şi încă o persoană aţi marcat acest mesaj ca spam. "
- few: "Dvs. şi alte {{count}} persoane aţi marcat acest mesaj ca spam. "
- other: "Dvs. şi alte {{count}} de persoane aţi marcat acest mesaj ca spam. "
+ one: "Tu şi încă o persoană aţi marcat acest mesaj ca spam. "
+ few: "Tu şi alte {{count}} persoane aţi marcat acest mesaj ca spam. "
+ other: "Tu şi alte {{count}} de persoane aţi marcat acest mesaj ca spam. "
inappropriate:
- one: "Dvs. şi încă o persoană aţi marcat acest mesaj ca inadecvat. "
- few: "Dvs. şi alte {{count}} persoane aţi marcat acest mesaj ca inadecvat. "
- other: "Dvs. şi alte {{count}} de persoane aţi marcat acest mesaj ca inadecvat. "
+ one: "Tu şi încă o persoană aţi marcat acest mesaj ca inadecvat. "
+ few: "Tu şi alte {{count}} persoane aţi marcat acest mesaj ca inadecvat. "
+ other: "Tu şi alte {{count}} de persoane aţi marcat acest mesaj ca inadecvat. "
notify_moderators:
- one: "Dvs. şi încă o persoană aţi marcat acest mesaj pentru moderare."
- few: "Dvs. şi alte {{count}} persoane aţi marcat acest mesaj pentru moderare."
- other: "Dvs. şi alte {{count}} de persoane aţi marcat acest mesaj pentru moderare."
+ one: "Tu şi încă o persoană aţi marcat acest mesaj pentru moderare."
+ few: "Tu şi alte {{count}} persoane aţi marcat acest mesaj pentru moderare."
+ other: "Tu şi alte {{count}} de persoane aţi marcat acest mesaj pentru moderare."
notify_user:
- one: "Dvs. şi încă o persoană aţi trimis un mesaj către acest utilizator."
- few: "Dvs. şi alte {{count}} persoane aţi trimis un mesaj către acest utilizator."
- other: "Dvs. şi alte {{count}} de persoane aţi trimis un mesaj către acest utilizator."
+ one: "Tu şi încă o persoană aţi trimis un mesaj către acest utilizator."
+ few: "Tu şi alte {{count}} persoane aţi trimis un mesaj către acest utilizator."
+ other: "Tu şi alte {{count}} de persoane aţi trimis un mesaj către acest utilizator."
bookmark:
- one: "Dvs. şi încă o persoană aţi pus un semn de carte pentru această postare."
- few: "Dvs. şi alte {{count}} persoane aţi pus un semn de carte pentru această postare."
- other: "Dvs. şi alte {{count}} de persoane aţi pus un semn de carte pentru această postare."
+ one: "Tu şi încă o persoană aţi pus un semn de carte pentru această postare."
+ few: "Tu şi alte {{count}} persoane aţi pus un semn de carte pentru această postare."
+ other: "Tu şi alte {{count}} de persoane aţi pus un semn de carte pentru această postare."
like:
- one: "Dvs. şi încă o persoană aţi apreciat aceasta."
- few: "Dvs. şi alte {{count}} persoane aţi apreciat aceasta."
- other: "Dvs. şi alte {{count}} de persoane aţi apreciat aceasta."
+ one: "Tu şi încă o persoană aţi apreciat aceasta."
+ few: "Tu şi alte {{count}} persoane aţi apreciat asta."
+ other: "Tu şi alte {{count}} de persoane aţi apreciat asta."
vote:
- one: "Dvs. şi încă o persoană aţi votat pentru această postare."
- few: "Dvs. şi alte {{count}} persoane aţi votat pentru această postare."
- other: "Dvs. şi alte {{count}} de persoane aţi votat pentru această postare."
+ one: "Tu şi încă o persoană aţi votat la această postare."
+ few: "Tu şi alte {{count}} persoane aţi votat la această postare."
+ other: "Tu şi alte {{count}} de persoane aţi votat la această postare."
by_others:
off_topic:
one: "O persoană a marcat acesta ca fiind în afară discuţiei"
@@ -1440,7 +1750,7 @@ ro:
notify_moderators:
one: "O persoană a marcat acest mesaj pentru moderare"
few: "{{count}} persoane au marcat acest mesaj pentru moderare"
- other: "{{count}} persoane au marcat acest mesaj pentru moderare"
+ other: "{{count}} de persoane au marcat acest mesaj pentru moderare"
notify_user:
one: "o persoană a trimis un mesaj către acest utilizator"
few: "{{count}} persoane au trimis un mesaj către acest utilizator"
@@ -1459,27 +1769,33 @@ ro:
other: "{{count}} de persoane au votat pentru acest mesaj"
delete:
confirm:
- one: "Sunteți sigur că vreți să ștergeți acest mesaj?"
- few: "Sunteți sigur că vreți să ștergeți toate aceste mesaje?"
- other: "Sunteți sigur că vreți să ștergeți toate aceste mesaje?"
+ one: "Ești sigur că vrei să ștergi acest mesaj?"
+ few: "Ești sigur că vrei să ștergi toate aceste mesaje?"
+ other: "Ești sigur că vrei să ștergi toate aceste mesaje?"
+ merge:
+ confirm:
+ one: "Ești sigur că vrei să aduni laolaltă această postare?"
+ few: "Ești sigur că vrei să comasezi aceste {{count}} postări?"
+ other: "Ești sigur că vrei să comasezi aceste {{count}} de postări?"
revisions:
controls:
first: "Prima revizie"
previous: "Revizie precedentă"
- next: "Urmatoarea revizie"
+ next: "Următoarea revizie"
last: "Ultima revizie"
hide: "Ascunde revizia"
show: "Afișează revizia"
+ revert: "Restaurează această revizie"
comparing_previous_to_current_out_of_total: "{{previous}} {{current}} / {{total}}"
displays:
inline:
- title: "Arată rezultatul randării cu adăugări și proprietăți"
+ title: "Arată output-ul randat, cu adăugiri și ștergeri intercalate"
button: ' HTML'
side_by_side:
- title: "Arată proprietățile rezultatului randării una lângă alta"
+ title: "Arată una lângă alta diferențele din output-ul randat"
button: ' HTML'
side_by_side_markdown:
- title: "Arată sursa de marcare a proprietăților una lângă alta"
+ title: "Arată una lângă alta diferențele din sursa brută"
button: ' Markdown'
category:
can: 'can… '
@@ -1488,138 +1804,192 @@ ro:
choose: 'Selectează o categorie…'
edit: 'editează'
edit_long: "Editează"
- view: 'Arată discuțiile în categorie'
+ view: 'Arată subiectele din categorie'
general: 'General'
settings: 'Setări'
+ topic_template: "Șablon subiect"
+ tags: "Etichete"
+ tags_allowed_tags: "În această categorie se pot folosi numai etichetele:"
+ tags_allowed_tag_groups: "În această categorie se pot folosi numai grupurile de etichete:"
+ tags_placeholder: "(Opțional) lista etichetelor permise"
+ tag_groups_placeholder: "(Opțional) lista grupurilor de etichete permise"
+ topic_featured_link_allowed: "Permite link-uri promovate în această categorie."
delete: 'Șterge categorie'
- create: 'Creează categorie'
- save: 'Salvează categorie'
- slug: 'Slug Categorie'
+ create: 'Categorie nouă'
+ create_long: 'Creează o categorie nouă'
+ save: 'Salvare categorie'
+ slug: 'Categorii propuse'
slug_placeholder: '(Opțional) cuvinte-punctate pentru url'
- creation_error: S-a semnalat o eroare în timpul creării categoriei.
- save_error: S-a semnalat o eroare in timpul salvării categoriei.
+ creation_error: A apărut o eroare în timpul creării categoriei.
+ save_error: A apărut o eroare in timpul salvării categoriei.
name: "Numele categoriei"
description: "Descriere"
- topic: "Topicul categoriei"
- logo: "Imaginea Logo a categoriei"
+ topic: "Subiectul categoriei"
+ logo: " Logo pentru categorie"
background_image: "Imaginea de fundal a categoriei"
- badge_colors: "Culorile insignei"
- background_color: "Culoarea de fundal"
- foreground_color: "Culoarea de prim-plan"
- name_placeholder: "Unul sau doua cuvinte maximum"
- color_placeholder: "Orice culoare"
- delete_confirm: "Sigur doriți să ștergeți această categorie?"
- delete_error: "S-a semnalat o eroare la ștergerea acestei categorii."
- list: "Lista categorii"
- no_description: "Va rugăm adăugați o descriere acestei categorii."
+ badge_colors: "Culori de ecuson"
+ background_color: "Culoare de fundal"
+ foreground_color: "Culoare de prim-plan"
+ name_placeholder: "Unul sau două cuvinte maximum"
+ color_placeholder: "Orice culoare web"
+ delete_confirm: "Sigur dorești să ștergi această categorie?"
+ delete_error: "A apărut o eroare la ștergerea acestei categorii."
+ list: "Afișare categoriile"
+ no_description: "Adaugă o descriere acestei categorii."
change_in_category_topic: "Editează descrierea"
already_used: 'Această culoare este folosită la o altă categorie'
security: "Securitate"
+ special_warning: "Atenție: Această categorie este pre-instalată și setările de securitate nu pot fi editate. Dacă nu dorești să folosești această categorie, va trebui să o ștergi în loc să-i schimbi destinația."
images: "Imagini"
- auto_close_label: "Auto-inchide discuțiile după:"
+ auto_close_label: "Închide automat subiectele după:"
auto_close_units: "ore"
email_in: "Adresa email de primire preferențială:"
- email_in_allow_strangers: "Acceptă emailuri de la utilizatori anonimi fară cont"
- email_in_disabled: "Postarea discuțiilor noi prin email este dezactivată din setările siteului. Pentru a activa postarea discuțiilor noi prin email,"
- email_in_disabled_click: 'activarea setării "primire email ".'
- allow_badges_label: "Permite acordarea de insigne în această categorie"
- edit_permissions: "Editează Permisiuni"
- add_permission: "Adaugă Permisiune"
+ email_in_allow_strangers: "Acceptă emailuri de la utilizatori anonimi fără cont"
+ email_in_disabled: "Postarea subiectelor noi prin email este dezactivată din setările siteului. Pentru a activa postarea subiectelor noi prin email,"
+ email_in_disabled_click: 'activează opțiunea "primire email ".'
+ suppress_from_homepage: "Elimină această categorie de pe pagina principală."
+ all_topics_wiki: "Transformă subiectele noi în wiki-uri, implicit."
+ sort_order: "Sortare implicită:"
+ allow_badges_label: "Permite acordarea de ecusoane în această categorie"
+ edit_permissions: "Editează permisiuni"
+ add_permission: "Adaugă permisiune"
this_year: "anul acesta"
position: "poziție"
default_position: "Poziție inițială"
- position_disabled: "Categoriile vor fi afișate în ordinea activitații. Pentru a controla ordinea categoriilor în listă, "
- position_disabled_click: 'activeaza setarea "poziția fixa a categoriei".'
- parent: "Categoria parinte"
+ position_disabled: "Categoriile vor fi afișate în ordinea activității. Pentru a controla ordinea categoriilor în listă, "
+ position_disabled_click: 'activează setarea "poziția fixă a categoriei".'
+ parent: "Categorie părinte"
notifications:
watching:
- title: "Vizualizare"
+ title: "Urmărind activ"
+ description: "Vei urmări automat toate subiectele din aceste categorii. Vei fi notificat cu privire la fiecare nouă postare din fiecare subiect, și va fi afișat un contor al noilor răspunsuri."
+ watching_first_post:
+ title: "Urmărind activ prima postare"
+ description: "Vei fi notificat doar cu privire la primele postări din fiecare nou subiect din aceste categorii."
tracking:
title: "Urmărire"
+ description: "Vei urmări automat toate subiectele din aceste categorii. Vei fi notificat dacă cineva îți menționează @numele sau îți răspunde, și va fi afișat un contor al noilor răspunsuri."
regular:
title: "Normal"
- description: "Veți fi notificat dacă cineva vă menționează @numele sau vă scrie un reply."
+ description: "Vei fi notificat dacă cineva îți menționează @numele sau îți răspunde."
muted:
- title: "Silențios"
+ title: "Setat pe silențios"
+ description: "Nu vei fi niciodată notificat cu privire la nimic legat de noile subiecte din aceste categorii și ele nu vor apărea în listă."
+ sort_options:
+ default: "implicit"
+ likes: "Aprecieri"
+ op_likes: "Aprecieri la postarea originală"
+ views: "Vizualizări"
+ posts: "Postări"
+ activity: "Activitate"
+ posters: "Autori"
+ category: "Categorie"
+ created: "Creat"
+ sort_ascending: 'Crescător'
+ sort_descending: 'Descrescător'
flagging:
- title: 'Mulțumim că ne ajuți să păstrăm o comunitate civilizată!'
+ title: 'Îți mulțumim că ne ajuți să păstrăm o comunitate civilizată!'
action: 'Marcare'
- take_action: "Actionează"
+ take_action: "Acționează"
notify_action: 'Mesaj'
- official_warning: 'Avertismen Oficial'
+ official_warning: 'Avertizare oficială'
delete_spammer: "Șterge spammer"
- delete_confirm: "Sunteți pe punctul de a șterge postarea %{posts} și postările %{topics} ale acestui uitilizator, de a-i anula contul, de a-i bloca autentificarea de la adresa IP %{ip_address}, adresa de email %{email} și de a bloca listarea permanent. Sunteți sigur ca acest utilizator este un spammer?"
- yes_delete_spammer: "Da, Șterge spammer"
+ delete_confirm_MF: "Ești pe cale să ștergi {POSTS, plural, one {1 postare} other {# postări}} și {TOPICS, plural, one {1 subiect} other {# subiecte}} de la acest utilizator, și să îi ștergi contul, blochezi înscrierile de pe IP-ul lui {ip_address}, și să îi adăugi adresa de email {email} pe lista celor blocate permanent. Ești sigur că acest utilizator este spammer?"
+ yes_delete_spammer: "Da, șterge spammer"
ip_address_missing: "(N/A)"
hidden_email_address: "(ascuns)"
- submit_tooltip: "Acceptă marcarea privată"
- take_action_tooltip: "Accesati permisiunea marcarii imediat, nu mai asteptati alte marcaje comune"
- cant: "Ne pare rău nu puteți marca această postare deocamdată."
- notify_staff: 'Notifică un moderator în privat'
+ submit_tooltip: "Trimite marcaj de avertizare privat"
+ take_action_tooltip: "Se trimite marcajul de avertizare imediat, în loc să se aștepte și alte marcaje de avertizare ale comunității"
+ cant: "Ne pare rău, deocamdată nu poți marca această postare cu marcaj de avertizare."
+ notify_staff: 'Notifică în privat un moderator '
formatted_name:
- off_topic: "În afară discuției"
- inappropriate: "Inadecvat"
- spam: "Este Spam"
- custom_placeholder_notify_user: "De ce această postare necesită comunicarea cu utilizatorul directă sau privată? Fiți specific, constructiv și intotdeauna amabil."
- custom_placeholder_notify_moderators: "De ce această postare necesită atenția moderatorului? Spuneți-ne exact ceea ce vă nelamurește, și oferiți adrese relevante de câte ori e posibil."
+ off_topic: "În afara subiectului"
+ inappropriate: "E inadecvat"
+ spam: "E spam"
+ custom_placeholder_notify_user: "Fii specific, constructiv și întotdeauna amabil."
+ custom_placeholder_notify_moderators: "Spune-ne exact ceea ce te preocupă, și dă-ne și link-uri relevante de câte ori e posibil."
custom_message:
- at_least: "introduce-ți cel puțin {{n}} de caractere"
- more: "încă...{{n}} caractere"
- left: "au mai rămas {{n}} caractere"
+ at_least:
+ one: "introdu cel puțin un caracter"
+ few: "introdu cel puțin {{count}} caractere"
+ other: "introdu cel puțin {{count}} de caractere"
+ more:
+ one: "încă {{count}} ..."
+ few: "încă {{count}} ..."
+ other: "încă {{count}} ..."
+ left:
+ one: "a mai rămas {{count}} ..."
+ few: "au mai rămas {{count}} ..."
+ other: "au mai rămas {{count}} ..."
flagging_topic:
- title: "De ce marcați privat această discuție?"
- action: "Marchează discuție"
+ title: "Îți mulțumim că ne ajuți să păstrăm o comunitate civilizată!"
+ action: "Marchează subiectul cu marcaj de avertizare"
notify_action: "Mesaj"
topic_map:
- title: "Sumarul discuției"
- participants_title: "Posteri Frecvenţi"
- links_title: "Legături Populare"
+ title: "Rezumatul subiectului"
+ participants_title: "Postaci frecvenţi"
+ links_title: "Legături populare"
+ links_shown: "arată mai multe link-uri..."
clicks:
one: "1 click"
few: "%{count} click-uri"
- other: "%{count} click-uri"
+ other: "%{count} de click-uri"
+ post_links:
+ about: "afișează mai multe link-uri din această postare"
+ title:
+ one: "mai e %{count}"
+ few: "mai sunt %{count}"
+ other: "mai sunt %{count}"
topic_statuses:
warning:
help: "Aceasta este o avertizare oficială."
bookmarked:
- help: "Aţi pus un semn de carte pentru această discuţie"
+ help: "Ai pus un semn de carte pentru această discuţie"
locked:
- help: "Această discuție este închisă; nu mai acceptă răspunsuri noi"
+ help: "Acest subiect este închis; nu mai acceptă răspunsuri noi"
archived:
- help: "Această discuție a fost arhivată; Este închetată și nu poate fi editată"
+ help: "Acest subiect a fost arhivat; Este înghețat și nu poate fi schimbat"
+ locked_and_archived:
+ help: "Acest subiect este închis și arhivat; nu mai acceptă răspunsuri noi și nu mai poate fi schimbat."
unpinned:
- title: "Desprinde"
- help: "Această discuţie va fi afişată în ordinea iniţială, nici un mesaj nu este promovat la inceputul listei."
+ title: "Ne-fixate"
+ help: "Această subiect este ne-fixat, acum va fi afișat în ordine normală."
pinned_globally:
- title: "Promovat Global"
+ title: "Fixat la nivel global"
+ help: "Acest subiect este fixat la nivel global; va fi afișat în vârful celor mai recente din categoria sa"
pinned:
- title: "Promovat"
- help: "Aceast mesaj va fi promovat. Va fi afişat la începutul discuţiei."
+ title: "Fixat"
+ help: "Acest subiect este fixat. Va fi afișat la începutul categoriei din care face parte."
invisible:
- help: "Această discuție este invizibilă; nu va fi afișată în listele de discuții și va fi accesată numai prin adresa directă"
+ help: "Acest subiect este invizibil; nu va fi afișat în listele de subiecte și va putea fi accesat numai prin link direct"
posts: "Postări"
- posts_lowercase: "postări"
- posts_long: "sunt {{number}} de postări în această discuție"
- original_post: "Postări originale"
+ posts_long: "sunt {{number}} (de) postări în acest subiect"
+ posts_likes_MF: |
+ Acest subiect are {count, plural, one {1 răspuns} other {# răspunsuri}} {ratio, select,
+ jos {cu o rată înaltă de aprecieri pe postare}
+ med {cu o foarte înaltă rată de aprecieri pe postare}
+ înalt {cu o rată extrem de înaltă de aprecieri pe postare}
+ other {}}
+ original_post: "Postare inițială"
views: "Vizualizări"
views_lowercase:
one: "vizualizare"
few: "vizualizări"
- other: "vizualizări"
+ other: "de vizualizări"
replies: "Răspunsuri"
- views_long: "această discuție a fost vizualizată de {{number}} de ori"
+ views_long: "acest subiect a fost vizualizat de {{number}} (de) ori"
activity: "Activitate"
likes: "Aprecieri"
likes_lowercase:
one: "apreciere"
few: "aprecieri"
other: "aprecieri"
- likes_long: "sunt {{number}} aprecieri în această discuție"
+ likes_long: "sunt {{number}} (de) aprecieri în acest subiect"
users: "Utilizatori"
users_lowercase:
one: "utilizator"
few: "utilizatori"
- other: "utilizatori"
+ other: "de utilizatori"
category_title: "Categorie"
history: "Istoric"
changed_by: "de {{author}}"
@@ -1628,54 +1998,67 @@ ro:
not_available: "Indisponibil!"
categories_list: "Listă categorii"
filters:
- with_topics: "%{filter} Discuții"
- with_category: "%{filter} %{category} discuții"
+ with_topics: "%{filter} subiecte"
+ with_category: "%{filter} %{category} subiecte"
latest:
- title: "Ultimele"
+ title: "Cele mai recente"
title_with_count:
- one: "Ultimele (1)"
- few: "Ultimele ({{count}})"
- other: "Ultimele ({{count}})"
- help: "Discuții cu postări recente"
+ one: "Cel mai recent (1)"
+ few: "Cele mai recente ({{count}})"
+ other: "Cele mai recente ({{count}})"
+ help: "subiecte cu postări recente"
hot:
title: "Interesant"
- help: "o selecție a discuțiilor interesante"
+ help: "o selecție a celor mai interesante subiecte"
read:
title: "Citite"
- help: "Discuții citite, în ordinea cronologică a citirii"
+ help: "Subiecte citite, în ordinea cronologică a citirii"
search:
title: "Caută"
- help: "caută în toate discuțiile"
+ help: "caută în toate subiectele"
categories:
title: "Categorii"
title_in: "Categoria - {{categoryName}}"
- help: "toate discuțiile grupate pe categorii"
+ help: "toate subiectele grupate pe categorii"
unread:
title: "Necitite"
title_with_count:
one: "Necitit (1)"
few: "Necitite ({{count}})"
other: "Necitite ({{count}})"
- help: "discuțiile pe care le vizualizați sau urmariți momentan ce includ postări necitite"
+ help: "subiecte pe care le urmărești activ sau cele pe care le urmărești și care includ postări necitite"
+ lower_title_with_count:
+ one: "{{count}} necitit"
+ few: "{{count}} necitite"
+ other: "{{count}} necitite"
new:
+ lower_title_with_count:
+ one: "{{count}} nou"
+ few: "{{count}} noi"
+ other: "{{count}} noi"
lower_title: "nou"
title: "Noi"
title_with_count:
one: "Nou (1)"
few: "Noi ({{count}})"
other: "Noi ({{count}})"
- help: "discuții create în ultimele zile"
+ help: "subiecte create în ultimele zile"
posted:
title: "Postările mele"
- help: "discuții în care ați postat"
+ help: "subiecte în care ai postat"
bookmarks:
title: "Semne de carte"
- help: "discuții cu semne de carte"
+ help: "subiecte cu semne de carte"
category:
- help: "discuțiile recente din categoria {{categoryName}}"
+ title: "{{categoryName}}"
+ title_with_count:
+ one: "{{categoryName}} (1)"
+ few: "{{categoryName}} ({{count}})"
+ other: "{{categoryName}} ({{count}})"
+ help: "subiecte recente din categoria {{categoryName}}"
top:
title: "Top"
- help: "o selecție a celor mai bune discuții din ultimul an, lună sau zi"
+ help: "o selecție a celor mai bune subiecte din ultimul an, ultima lună sau zi"
all:
title: "Dintotdeauna"
yearly:
@@ -1692,124 +2075,297 @@ ro:
this_year: "An"
this_quarter: "Trimestru"
this_month: "Lună"
- this_week: "Săptămană"
+ this_week: "Săptămână"
today: "Astăzi"
other_periods: "vezi topul"
- browser_update: 'Din nefericire, browserul dumneavoastră este prea vechi pentru a funcționa pe acest forum . Va rugăm reânoiți browserul.'
+ browser_update: 'Din nefericire, browserul tău este prea vechi pentru a funcționa pe acest forum . Te rugăm actualizează browserul.'
permission_types:
full: "Creează / Răspunde / Vizualizează"
- create_post: "Răspunde / Vizualizaează"
- readonly: "Vizualizaează"
+ create_post: "Răspunde / Vizualizează"
+ readonly: "Doar citire"
+ lightbox:
+ download: "descărcare"
+ keyboard_shortcuts_help:
+ title: 'Scurtături de tastatură'
+ jump_to:
+ title: 'Sari la'
+ home: 'g, h Acasă'
+ latest: 'g, l Cele mai recente'
+ new: 'g, n Noi'
+ unread: 'g, u Necitite'
+ categories: 'g, c Categorii'
+ top: 'g, t Top'
+ bookmarks: 'g, b Semne de carte'
+ profile: 'g, p Profil'
+ messages: 'g, m Mesaje'
+ navigation:
+ title: 'Navigare'
+ jump: '# Mergi la postarea #'
+ back: 'u Înapoi'
+ up_down: 'k/j Mută selecția ↑ ↓'
+ open: 'o or Intră Deschide subiectul selectat'
+ next_prev: 'shift+j/shift+k Secțiunea următoare/anterioară'
+ application:
+ title: 'Aplicație'
+ create: 'Creează subiect nou'
+ notifications: 'n Deschide notificări'
+ hamburger_menu: '= Deschide meniu hamburger'
+ user_profile_menu: 'p Deschide meniu utilizator'
+ show_incoming_updated_topics: '. Arată subiectele actualizate'
+ search: '/ Caută'
+ help: '? Deschide ajutor tastatură'
+ dismiss_new_posts: 'x, r Abandonează postări noi'
+ dismiss_topics: 'x, t Abandonează subiecte'
+ log_out: 'shift+z shift+z Ieșire'
+ actions:
+ title: 'Acțiuni'
+ bookmark_topic: 'f Comută semnul de carte pentru subiect'
+ pin_unpin_topic: 'shift+p Fixează/Desprinde subiect'
+ share_topic: 'shift+s Distribuie subiect'
+ share_post: 's distribuie postare'
+ reply_as_new_topic: 't Răspunde ca subiect link-uit'
+ reply_topic: 'shift+r Răspunde la subiect'
+ reply_post: 'r Răspunde la postare'
+ quote_post: 'q Citează postare'
+ like: 'l Apreciază postare'
+ flag: '! Marchează postare cu marcaj de avertizare'
+ bookmark: 'b Marchează postare cu semn de carte'
+ edit: 'e Editează postare'
+ delete: 'd Șterge postare'
+ mark_muted: 'm, m Setează subiect pe silențios'
+ mark_regular: 'm, r Subiect obișnuit (implicit)'
+ mark_tracking: 'm, t Urmărește subiect'
+ mark_watching: 'm, w Urmărește activ subiect'
+ print: 'ctrl+p Tipărire subiect'
badges:
+ earned_n_times:
+ one: "A primit acest ecuson o dată"
+ few: "A primit acest ecuson de %{count} ori"
+ other: "A primit acest ecuson de %{count} de ori"
+ granted_on: "Acordat acum %{date}"
+ others_count: "Numărul celorlalți care au acest ecuson (%{count})"
+ title: Ecusoane
+ allow_title: "titlu disponibil"
+ multiple_grant: "acordat de mai multe ori"
+ badge_count:
+ one: "%{count} ecuson"
+ few: "%{count} ecusoane"
+ other: "%{count} de ecusoane"
more_badges:
one: "Încă una"
few: " Alte %{count}"
other: " Alte %{count}"
+ granted:
+ one: "%{count} acordat"
+ few: "%{count} acordate"
+ other: "%{count} acordate"
+ select_badge_for_title: Selectați un ecuson pentru a-l folosi ca titlu
+ none: "Caută cu Google
+
+ tagging:
+ all_tags: "Toate etichetele"
+ selector_all_tags: "toate etichetele"
+ selector_no_tags: "fără etichete"
+ changed: "etichete schimbate:"
+ tags: "Etichete"
+ choose_for_topic: "alege etichetele opționale pentru acest subiect"
+ delete_tag: "Șterge etichetă"
+ delete_confirm: "Ești sigur că vrei să ștergi această etichetă?"
+ rename_tag: "Redenumire etichetă"
+ rename_instructions: "Alege un nume nou pentru etichetă:"
+ sort_by: "Sortat după:"
+ sort_by_count: "contor"
+ sort_by_name: "nume"
+ manage_groups: "Gestionare grupuri de etichete"
+ manage_groups_description: "Definește grupuri pentru a organiza etichetele"
+ filters:
+ without_category: "%{filter} %{tag} subiecte"
+ with_category: "%{filter} %{tag} subiecte în %{category}"
+ untagged_without_category: "%{filter} subiecte fără etichetă"
+ untagged_with_category: "%{filter} subiecte fără etichetă în %{category}"
+ notifications:
+ watching:
+ title: "Urmărind activ"
+ description: "Vei urmări activ în mod automat toate subiectele cu această etichetă. Vei fi notificat cu privire la toate noile postări și subiecte, și în plus, un contor al postărilor noi și al celor necitite va apărea în dreptul subiectului."
+ watching_first_post:
+ title: "Urmărind activ prima postare"
+ description: "Vei fi notificat doar cu privire la prima postare din fiecare nou subiect cu această etichetă."
+ tracking:
+ title: "Urmărind"
+ description: "Vei urmări automat toate subiectele cu această etichetă. Un contor cu postările necitite și cu cele noi va apărea lingă subiect."
+ regular:
+ title: "Utilizator frecvent"
+ description: "Vei fi notificat dacă cineva îți menționează @numele sau răspunde la postare."
+ muted:
+ title: "Silențios"
+ description: "Nu vei fi notificat cu privire la nimic legat de noile subiecte cu această etichetă și ele nu vor apărea în tab-ul cu subiecte necitite."
+ groups:
+ title: "Grupuri de etichete"
+ about: "Adaugă etichete la grupuri pentru a le gestiona mai ușor."
+ new: "Grup nou"
+ tags_label: "Etichete din acest grup:"
+ parent_tag_label: "Etichetă părinte:"
+ parent_tag_placeholder: "Opțional"
+ parent_tag_description: "Etichetele din acest grup nu pot fi folosite dacă eticheta părinte nu este prezentă."
+ one_per_topic_label: "Limitare la o singură etichetă pe subiect din acest grup"
+ new_name: "Grup nou de etichete"
+ save: "Salvează"
+ delete: "Șterge"
+ confirm_delete: "Ești sigur că vrei să ștergi acest grup de etichete?"
+ topics:
+ none:
+ unread: "Nu ai niciun subiect necitit."
+ new: "Nu ai niciun subiect nou."
+ read: "Nu ai citit nici un subiect până acum."
+ posted: "Nu ai postat încă la nici un subiect."
+ latest: "Nu există subiecte recente."
+ hot: "Nu există subiecte interesante."
+ bookmarks: "Nu există încă subiecte cu semn de carte."
+ top: "Nu există încă subiecte de top."
+ search: "Nu există rezultate pentru căutare."
+ bottom:
+ latest: "Nu mai există alte subiecte recente."
+ hot: "Nu mai există alte subiecte interesante."
+ posted: "Nu mai există alte subiecte postate."
+ read: "Nu mai exisă subiecte citite."
+ new: "Nu mai există alte subiecte noi."
+ unread: "Nu mai există subiecte necitite."
+ top: "Nu mai există subiecte de top."
+ bookmarks: "Nu mai există subiecte cu semn de carte."
+ search: "Nu mai există alte rezultate pentru căutare."
+ invite:
+ custom_message: "Dă un aer un pic mai personal invitației tale scriind un"
+ custom_message_link: "mesaj personalizat"
+ custom_message_placeholder: "Introdu mesajul tău personalizat"
+ custom_message_template_forum: "Salutare! Ar trebui să te alături acestui forum!"
+ custom_message_template_topic: "Salutare! Cred că o să îți placă acest subiect!"
+ safe_mode:
+ enabled: "Modul sigur este activat, pentru a ieși din modul sigur închide această fereastră de browser"
admin_js:
type_to_filter: "tastează pentru a filtra..."
admin:
- title: 'Discurs Admin'
+ title: 'Admin Discourse'
moderator: 'Moderator'
dashboard:
- title: "Spațiu de lucru"
- last_updated: "Actualizările spațiului de lucru:"
+ title: "Panou de control"
+ last_updated: "Panou de control actualizat ultima dată:"
version: "Versiune"
- up_to_date: "Sunteți la zi!"
- critical_available: "O actualizare importantă este valabilă."
- updates_available: "Actualizări sunt disponibile."
- please_upgrade: "Vă rugăm upgradați!"
- no_check_performed: "O căutare a actualizărilor nu a fost făcută. Asigurați-vă că sidekiq este pornit."
- stale_data: "O căutare a actualizărilor nu a fost făcută în ultimul timp. Asigurați-vă că sidekiq este pornit."
- version_check_pending: "Se pare că ați actualizat recent. Fantastic!"
- installed_version: "Instalat"
+ up_to_date: "Ești la zi!"
+ critical_available: "O actualizare importantă este disponibilă."
+ updates_available: "Sunt disponibile actualizări."
+ please_upgrade: "Te rugăm actualizează!"
+ no_check_performed: "Nu s-au căutat actualizări. Verifică dacă sidekiq este pornit."
+ stale_data: "Nu s-au căutat actualizări în ultimul timp. Verifică dacă că sidekiq este pornit."
+ version_check_pending: "Se pare că ai actualizat recent. Fantastic!"
+ installed_version: "Instalată"
latest_version: "Ultima"
- problems_found: "Ceva probleme s-au întâmpinat la instalarea discursului:"
- last_checked: "Ultima dată verificat"
+ problems_found: "Au fost niște probleme la instalarea Discourse:"
+ last_checked: "Ultima verificare"
refresh_problems: "Reîmprospătează"
- no_problems: "Nicio problemă semnalată."
+ no_problems: "Nu a apărut nicio problemă."
moderators: 'Moderatori:'
admins: 'Admini:'
blocked: 'Blocați:'
suspended: 'Suspendați:'
- private_messages_short: "Msgs"
+ private_messages_short: "Mesje"
private_messages_title: "Mesaje"
mobile_title: "Mobil"
space_free: "{{size}} liber"
uploads: "încărcări"
- backups: "backups"
- traffic_short: "trafic"
+ backups: "back-up"
+ traffic_short: "Trafic"
traffic: "Cereri web"
page_views: "Cereri API"
page_views_short: "Cereri API"
- show_traffic_report: "Arată Raportul de Trafic detaliat"
+ show_traffic_report: "Arată raportul detaliat cu privire la trafic"
reports:
- today: "astăzi"
+ today: "Astăzi"
yesterday: "Ieri"
- last_7_days: "din ultimele 7 zile"
- last_30_days: "din ultimele 30 de zile"
- all_time: "Din totdeauna"
+ last_7_days: "Din ultimele 7 zile"
+ last_30_days: "Din ultimele 30 de zile"
+ all_time: "Dintotdeauna"
7_days_ago: "Acum 7 zile"
30_days_ago: "Acum 30 de zile"
all: "Toate"
- view_table: "Arată ca tabel"
- refresh_report: "Reactualizează Raportul"
+ view_table: "tabel"
+ view_graph: "grafic"
+ refresh_report: "Reactualizează raportul"
start_date: "Data de început "
end_date: "Data de sfârşit"
groups: "Toate grupurile"
commits:
- latest_changes: "Ultimele schimbări: Vă rugăm reactualizați des!"
+ latest_changes: "Cele mai recente schimbări: te rugăm actualizează frecvent!"
by: "de către"
flags:
- title: "Marcaje"
+ title: "Marcaje de avertizare"
old: "Vechi"
active: "Active"
agree: "De acord"
agree_title: "Confirmă acest marcaj ca valid și corect"
agree_flag_modal_title: "De acord și..."
agree_flag_hide_post: "De acord (ascunde postarea + trimite MP)"
- agree_flag_hide_post_title: "Ascunde acest post şi trimite un mesaj urgent utilizatorului să îl editeze."
- agree_flag_restore_post: "De acord (restaurare post)"
- agree_flag_restore_post_title: "Restaurează acest post"
- agree_flag: "De acord cu marcarea"
- agree_flag_title: "De acord cu marcarea și menține postarea neschimbată"
+ agree_flag_hide_post_title: "Ascunde această postare și trimite automat un mesaj utilizatorului, cerându-i insistent să îl editeze."
+ agree_flag_restore_post: "De acord (restaurare postare)"
+ agree_flag_restore_post_title: "Restaurează această postare"
+ agree_flag: "De acord cu marcajul de avertizare"
+ agree_flag_title: "De acord cu marcajul de avertizare și menține postarea neschimbată"
defer_flag: "Amânare"
- defer_flag_title: "Scoate marcajul; Nu necesită o acțiune deocamdată."
- delete: "Ștergere"
- delete_title: "Șterge postarea la care face referința marcajul."
- delete_post_defer_flag: "Șterge postarea și renunță la marcaj"
- delete_post_defer_flag_title: "Șterge postarea; dacă este prima, șterge discuția"
- delete_post_agree_flag: "Șterge postarea și aprobă marcajul"
- delete_post_agree_flag_title: "Șterge postarea; dacă este prima, sterge discuția"
- delete_flag_modal_title: "Ștergere și..."
- delete_spammer: "Ștergere Spammer"
- delete_spammer_title: "Șterge utilizatorul , postările și discuțiile acestuia."
+ defer_flag_title: "Scoate marcajul de avertizare; Nu necesită nicio acțiune deocamdată."
+ delete: "Șterge"
+ delete_title: "Șterge postarea la care se referă marcajul de avertizare."
+ delete_post_defer_flag: "Șterge postarea și amână decizia privind marcajul de avertizare"
+ delete_post_defer_flag_title: "Șterge postarea; dacă este prima, șterge subiectul"
+ delete_post_agree_flag: "Șterge postarea și aprobă marcajul de avertizare"
+ delete_post_agree_flag_title: "Șterge postarea; dacă este prima, șterge subiectul"
+ delete_flag_modal_title: "Șterge și..."
+ delete_spammer: "Șterge spammer"
+ delete_spammer_title: "Șterge utilizatorul, postările și subiectele acestuia."
disagree_flag_unhide_post: "Nu sunt de acord (arată postarea)"
- disagree_flag_unhide_post_title: "Înlătură orice marcaj din postare și fă postarea din nou vizibilă"
+ disagree_flag_unhide_post_title: "Elimină orice marcaj de avertizare din postare și fă din nou vizibilă postarea"
disagree_flag: "Nu sunt de acord"
- disagree_flag_title: "Refuză marcaj, acesta fiind invalid sau incorect"
+ disagree_flag_title: "Refuză marcaj ca fiind invalid sau incorect"
clear_topic_flags: "Terminat"
- clear_topic_flags_title: "Discuția a fost analizată iar problema rezolvată. Face-ți click pe Terminat pentru a înlătura marcajul."
- more: "(detalii...)"
+ clear_topic_flags_title: "Subiectul a fost analizat iar problema rezolvată. Fă click pe Terminat pentru a înlătura marcajele."
+ more: "(mai multe răspunsuri...)"
dispositions:
- agreed: "de acord"
- disagreed: "Nu sunt de acord"
- deferred: "amânat"
+ agreed: "aprobate"
+ disagreed: "respinse"
+ deferred: "amânate"
flagged_by: "Marcat de către"
- resolved_by: "Resolvat de către"
+ resolved_by: "Rezolvat de "
took_action: "A luat măsuri"
system: "Sistem"
- error: "Ceva a nu a funcționat"
+ error: "Ceva nu a funcționat"
reply_message: "Răspunde"
no_results: "Nu există marcaje."
- topic_flagged: "Această discuție a fost marcată."
- visit_topic: "Vizualizați discuția pentru a acționa."
- was_edited: "Mesajul a fost editat după primul semn"
- previous_flags_count: "Acest mesaj a fost deja marcat de {{count}} ori."
+ topic_flagged: "Aceast subiect a fost marcat cu marcaj de avertizare."
+ visit_topic: "Vizualizează subiectul pentru a acționa."
+ was_edited: "Mesajul a fost editat după primul marcaj"
+ previous_flags_count: "Acest mesaj a fost deja marcat de {{count}} (de) ori."
summary:
action_type_3:
- one: "în afară discuţiei"
- few: "în afară discuţiei x{{count}}"
- other: "în afară discuţiei x{{count}}"
+ one: "în afara subiectului"
+ few: "în afara subiectului x{{count}}"
+ other: "în afara subiectului x{{count}}"
action_type_4:
one: "inadecvat"
few: "inadecvat x{{count}}"
@@ -1830,48 +2386,118 @@ ro:
primary: "Grup primar"
no_primary: "(nu există grup primar)"
title: "Grupuri"
- edit: "Editează Grupuri"
+ edit: "Editează grupuri"
refresh: "Reîmprospătează"
new: "Noi"
- selector_placeholder: "adaugă utilizatori"
- name_placeholder: "Numele grupului, fără spații, asemenea regulii de utilizator"
- about: "Editează aici apartentența la grupuri și numele"
+ selector_placeholder: "introdu nume de utilizator"
+ about: "Editează aici numele și apartenența la grupuri"
group_members: "Membrii grupului"
- delete: "Ștergere"
- delete_confirm: "Șterg acest grup?"
+ delete: "Șterge"
+ delete_confirm: "Ștergi acest grup?"
delete_failed: "Imposibil de șters grupul. Dacă este unul automat, nu se poate șterge."
- delete_member_confirm: "Şterge '%{username}' din grupul '%{group}'?"
delete_owner_confirm: "Revocă dreptul de proprietar pentru '%{username}'?"
- name: "Nume"
add: "Adaugă"
add_members: "Adaugă membri"
custom: "Personalizat"
bulk_complete: "Utilizatorii au fost adăugați în grup."
- bulk: "Adaugă în grup la grămadă"
- bulk_paste: "Lipiți o listă de utilizatori sau email-uri, unul pe linie:"
- bulk_select: "(selectați un grup)"
+ bulk: "Adaugă în grup mai mulți utilizatori odată"
+ bulk_paste: "Lipește o listă de utilizatori sau email-uri, câte unul pe linie:"
+ bulk_select: "(selectează un grup)"
automatic: "Automat"
- automatic_membership_email_domains: "Utilizatorii care se înregistrează cu un domeniu de email care se potriveşte cu unul din lista va fi adăugat automat în aces grup:"
- automatic_membership_retroactive: "Aplicaţi aceeaşi regulă pentru domeniul de email pentru a adaugă utilizatorii existenţi"
- default_title: "Titlu automat pentru toţi utilizatorii din acest grup"
- primary_group: "Setează automat că grup primar"
+ automatic_membership_email_domains: "Utilizatorii care se înregistrează cu un domeniu de email identic cu unul din lista asta vor fi adăugați automat în acest grup:"
+ automatic_membership_retroactive: "Aplică aceeaşi regulă pentru domeniul de email pentru a adauga utilizatorii existenţi"
+ default_title: "Titlu implicit pentru toți utilizatorii din acest grup"
+ primary_group: "Setează automat ca grup principal"
group_owners: Proprietari
add_owners: Adaugă proprietari
- incoming_email_placeholder: "introduceți adresa de email"
+ incoming_email: "Adresă de primire emailuri personalizată"
+ incoming_email_placeholder: "introducere adresă de email"
api:
generate_master: "Generează cheie API principală"
none: "Nu sunt chei API principale active deocamdată."
user: "Utilizator"
title: "API"
key: "Cheie API"
- generate: "Generează"
- regenerate: "Regenerează"
- revoke: "Revocare"
- confirm_regen: "Sunteți sigur ca doriți să înlocuiți această cheie API cu una nouă?"
- confirm_revoke: "Sunteți sigur ca doriți să revocați acea cheie?"
- info_html: "Cheia dumneavoastră API vă permite să creați și să actualizați discuții folosind sintaxa JSON."
+ generate: "Generare"
+ regenerate: "Regenerare"
+ revoke: "Revocă"
+ confirm_regen: "Ești sigur că dorești să înlocuiești această cheie API cu una nouă?"
+ confirm_revoke: "Ești sigur că dorești să revoci această cheie?"
+ info_html: "Cheia ta API îți permite să creezi și să actualizezi subiecte folosind sintaxa JSON."
all_users: "Toți utilizatorii"
- note_html: "Păstrează această cheie secretă, toți utilizatorii ce o detin pot crea postări arbitrare pe forum ca oricare alt utilizator."
+ note_html: "Păstrează această cheie secretă, toți utilizatorii ce o dețin pot crea postări arbitrare pe forum dându-se drept oricare alt utilizator."
+ web_hooks:
+ title: "Webhooks"
+ none: "Momentan nu există nici un webhook"
+ instruction: "Webhooks permit Discourse să notifice servicii externe atunci când anumite evenimente se petrec pe site. Când un webhook este declanșat, o interogare POST va fi trimisă la URL-urile menționate."
+ detailed_instruction: "O interogare POST va fi trimisă catre URL-ul menționat atunci când se produc evenimentele alese."
+ new: "Nou webhook"
+ create: "Creează"
+ save: "Salvează"
+ destroy: "Șterge"
+ description: "Descriere"
+ controls: "Controale"
+ go_back: "Înapoi la listă"
+ payload_url: "URL-ul încărcăturii "
+ payload_url_placeholder: "https://example.com/postreceive"
+ warn_local_payload_url: "Se pare că dorești să setezi un webhook pentru un url local. Un eveniment livrat către o adresă locală ar putea avea efecte secundare și genera comportamente neașteptate. Continuă?"
+ secret_invalid: "Secretul nu trebuie să aibă nici un caracter spațiu-gol."
+ secret_too_short: "Secretul trebuie sa conțină cel puțin 12 caractere."
+ secret_placeholder: "Un șir opțional, folosit la generarea semnăturii"
+ event_type_missing: "Va trebui să setezi cel puțin un tip de evenimente."
+ content_type: "Tip conținut"
+ secret: "Secret"
+ event_chooser: "Ce evenimente vrei să declanșeze acest webhook?"
+ wildcard_event: "Trimite-mi orice."
+ individual_event: "Selectează evenimente individuale."
+ verify_certificate: "Verifică certificatul TSL al URL-ului încărcăturii"
+ active: "Active"
+ active_notice: "Vom livra detaliile evenimentului atunci când acesta se va produce."
+ categories_filter_instructions: "Webhook-urile relevante se vor declanșa numai dacă evenimentul este legat de categoriile specificate. Lasă liber pentru a declanșa webhooks pentru toate categoriile."
+ categories_filter: "Categorii declanșate"
+ groups_filter_instructions: "Webhook-urile relevante vor fi declanșate dacă evenimentul este legat de grupuri specificate. Lasă liber pentru a declanșa webhooks pentru toate grupurile."
+ groups_filter: "Grupuri declanșate"
+ delete_confirm: "Șterge acest webhook?"
+ topic_event:
+ name: "Eveniment subiect"
+ details: "Atunci când există un subiect nou, revizuit, schimbat sau șters."
+ post_event:
+ name: "Eveniment postare"
+ details: "Atunci când exista un răspuns nou, editat, șters sau recuperat."
+ user_event:
+ name: "Eveniment utilizator"
+ details: "Când un utilizator este creat, aprobat sau actualizat."
+ delivery_status:
+ title: "Starea livrării"
+ inactive: "Inactivă"
+ failed: "Eșuată"
+ successful: "Cu succes"
+ events:
+ none: "Nu există evenimente înrudite."
+ redeliver: "Livrează din nou"
+ incoming:
+ one: "Există un nou eveniment "
+ few: "Există {{count}} noi evenimente."
+ other: "Există {{count}} de noi evenimente."
+ completed_in:
+ one: "Terminat într-o secundă."
+ few: "Terminat în {{count}} secunde."
+ other: "Terminat în {{count}} de secunde."
+ request: "Cerere"
+ response: "Răspuns"
+ redeliver_confirm: "Ești sigur ca vrei să livrezi din nou aceeași încărcătură?"
+ headers: "Antete"
+ payload: "Încărcătură"
+ body: "Corp"
+ go_list: "Mergi la listă"
+ go_details: "Editează webhook"
+ go_events: "Mergi la evenimente"
+ ping: "Ping"
+ status: "Cod de stare"
+ event_id: "ID"
+ timestamp: "Creat"
+ completion: "Timp finalizare"
+ actions: "Acțiuni"
plugins:
title: "Plugin-uri"
installed: "Plugin-uri instalate"
@@ -1881,15 +2507,23 @@ ro:
enabled: "Activat?"
is_enabled: "D"
not_enabled: "N"
- change_settings: "Schimbă Setările"
+ change_settings: "Schimbă setările"
change_settings_short: "Setări"
howto: "Cum instalez un plugin?"
backups:
- title: "Backups"
+ title: "Backup-uri"
menu:
- backups: "Backups"
+ backups: "Backup-uri"
logs: "Rapoarte"
- none: "Nicio rezervare valabilă."
+ none: "Niciun backup disponibil."
+ read_only:
+ enable:
+ title: "Activează modul exclusiv-citire"
+ label: "Activează exclusiv-citire"
+ confirm: "Ești sigur că vrei să activezi modul exclusiv-citire?"
+ disable:
+ title: "Dezactivează modul exclusiv-citire"
+ label: "Dezactivează exclusiv-citire"
logs:
none: "Nu există rapoarte..."
columns:
@@ -1897,58 +2531,58 @@ ro:
size: "Mărime"
upload:
label: "Încarcă"
- title: "Încarcă o copie de siguranţă în această instanţa."
- uploading: "ÎNCARCĂ"
+ title: "Încarcă un backup în această instanță."
+ uploading: "Se încarcă..."
success: "fișierul '{{filename}}' a fost încărcat cu succes."
- error: "S-a semnalat o eroare la încărcarea fișierului '{{filename}}': {{message}}"
+ error: "A apărut o eroare la încărcarea fișierului '{{filename}}': {{message}}"
operations:
is_running: "O altă operație este în desfășurare..."
- failed: "operația {{operation}} nu s-a finalizat. Vă rugăm verificați rapoartele."
+ failed: "operația {{operation}} nu s-a finalizat. Te rugăm verifică rapoartele."
cancel:
- label: "Anulează"
+ label: "Anulare"
title: "Anulează operația curentă"
- confirm: "Sunteți sigur că doriți să anulați operația curentă?"
+ confirm: "Ești sigur că dorești să anulezi operația curentă?"
backup:
- label: "Salvare de siguranţă"
- title: "Creați o rezervă"
- confirm: "Sunteți sigur că doriți să creați o nouă rezervă?"
+ label: "Backup"
+ title: "Creează un backup"
+ confirm: "Ești sigur că vei să începi o nouă operațiune de backup?"
without_uploads: "Da (nu include fişierele)"
download:
- label: "Descarcă"
- title: "Downloadează brezervă"
+ label: "Descărcare"
+ title: "Descarcă backup-ul"
destroy:
- title: "Sterge rezervă"
- confirm: "Sunteți sigur că doriți să distrugeți această rezervă ?"
+ title: "Șterge backup-ul"
+ confirm: "Ești sigur că vrei să ștergi acest backup?"
restore:
- is_disabled: "Restabilirea este dezactivată din setările siteului."
- label: "Restaurează"
- title: "Restabilește rezervă"
+ is_disabled: "Restabilirea este dezactivată din setările site-ului."
+ label: "Restabilire"
+ title: "Restabilire din backup"
+ confirm: "Ești sigur că vrei să restaurezi acest backup?"
rollback:
- label: "Revenire la situaţia anterioară"
- title: "Restabilește baza de date în stadiul anterior"
+ label: "Revenire la stadiul anterior"
+ title: "Restabilește baza de date la stadiul funcțional anterior"
+ confirm: "Ești sigur că vrei să restaurezi baza de date la starea funcțională anterioară?"
export_csv:
- user_archive_confirm: "Sunteţi sigur că doriţi să descărcaţi mesajele dvs.?"
- success: "Exportul a fost iniţiat. Veţi primi un mesaj de notificare când procesul se va termina."
- failed: "Exportul a eşuat. Va rugăm verificaţi jurnalul."
- rate_limit_error: "Postările pot fi descărcate doar o singură dată pe zi. Va rugăm încercaţi mâine."
+ success: "Exportul a fost inițiat. Vei primi un mesaj de notificare când procesul se va termina."
+ failed: "Exportul a eşuat. Verifică raportul de erori."
button_text: "Exportă"
button_title:
- user: "Exportă lista totală a utilizatorilor în formatul CSV."
- staff_action: "Exportă jurnalul de acțiuni a conducerii în formatul CSV."
- screened_email: "Exportă lista totală a adreselor de email verificate în format CSV."
- screened_ip: "Exportă lista totală a adreselor de IP verificate în format CSV."
- screened_url: "Exportă lista totală a adreselor URL verificate în format CSV."
+ user: "Exportă lista totală a utilizatorilor, în format CSV."
+ staff_action: "Exportă jurnalul de acțiuni al echipei, în format CSV."
+ screened_email: "Exportă lista totală a adreselor de email verificate, în format CSV."
+ screened_ip: "Exportă lista totală a adreselor de IP verificate, în format CSV."
+ screened_url: "Exportă lista totală a adreselor URL verificate, în format CSV."
export_json:
- button_text: "Exportă"
+ button_text: "Exportă "
invite:
- button_text: "Trimite o invitație"
- button_title: "Trimite o invitație"
+ button_text: "Trimite invitații"
+ button_title: "Trimite invitații"
customize:
- title: "Modifică"
- long_title: "Modificarea Site-ului"
- css: "Foaie de stil"
- header: "Titlu"
- top: "Top"
+ title: "Personalizare"
+ long_title: "Personalizările site-ului"
+ css: "CSS"
+ header: "Antet"
+ top: "Sus"
footer: "Subsol"
embedded_css: "Embedded CSS"
head_tag:
@@ -1959,45 +2593,45 @@ ro:
title: "HTML care va fi inserat înaintea de tag-ul "
override_default: "Nu include foaia de stil standard"
enabled: "Activat?"
- preview: "previzualizează"
+ preview: "previzualizare"
undo_preview: "șterge previzualizarea"
- rescue_preview: "stil predefinit"
- explain_preview: "Vizualizează site-ul cu foaia de stil predefinită"
- explain_undo_preview: "Înapoi la foaia de stil preferentială activată momentan"
- explain_rescue_preview: "Vizualizeaza site-ul cu foaia de stil predefinită"
- save: "Salvează"
+ rescue_preview: "stil implicit"
+ explain_preview: "Vizualizează site-ul cu această foaie de stil personalizată"
+ explain_undo_preview: "Înapoi la foaia de stil personalizată activă acum"
+ explain_rescue_preview: "Vizualizează site-ul cu foaia de stil implicită"
+ save: "Salvare"
new: "Nou"
new_style: "Stil nou"
import: "Importă"
- import_title: "Selectați un fișier sau lipiți un text"
+ import_title: "Selectează un fișier sau lipește un text"
delete: "Șterge"
- delete_confirm: "Șterge aceste preferințe?"
- about: "Modifică foaia de stil CSS și capetele HTML Modify CSS din site. Adaugă o preferința pentru a începe."
+ delete_confirm: "Șterge această personalizare?"
+ about: "Modifică foaia de stil CSS și header-ele HTML din site. Adaugă o personalizare pentru a începe."
color: "Culoare"
opacity: "Opacitate"
copy: "Copiază"
email_templates:
- title: "Sabloane"
+ title: "Șabloane de emailuri"
subject: "Subiect"
multiple_subjects: "Acest șablon are mai multe subiecte"
body: "Body"
- none_selected: "Selectați un șablon pentru a începe editarea"
- revert: "Revocați schimbările"
- revert_confirm: "Ești sigur că vreți să revocați schimbările?"
+ none_selected: "Selectează un șablon pentru a începe editarea"
+ revert: "Revocă schimbările"
+ revert_confirm: "Ești sigur că vrei să revoci schimbările?"
css_html:
title: "CSS/HTML"
- long_title: "Customizarile CSS and HTML"
+ long_title: "Personalizări CSS și HTML"
colors:
title: "Culori"
- long_title: "Tabel culori"
- about: "Modifică culorile folosite în site fară a scrie CSS. Adaugă un nou aranjament pentru a începe."
- new_name: "O un nou aranjament pentru culori"
- copy_name_prefix: "Copiază"
- delete_confirm: "Șterge acest aranjament de culori?"
- undo: "rescrie"
- undo_title: "Rescrie schimbările acestei culori de ultima oară când a fost salvată."
- revert: "refacere"
- revert_title: "Resetează culoarea la stadiul aranjamentului predefinit ."
+ long_title: "Scheme de culori"
+ about: "Modifică culorile folosite pe site fără a scrie CSS. Pentru a începe, adăugă o nouă schemă."
+ new_name: "Nouă schemă de culori"
+ copy_name_prefix: "Copie a"
+ delete_confirm: "Ștergi această schemă de culori?"
+ undo: "revenire"
+ undo_title: "Revino asupra schimbărilor aduse acestei culori, de ultima oară când a fost salvată și până acum."
+ revert: "revenire"
+ revert_title: "Resetează această culoare la schema de culori implicită din Discourse."
primary:
name: 'primar'
description: 'Majoritatea textului, iconițe și margini.'
@@ -2006,66 +2640,80 @@ ro:
description: 'Culoarea principală de fundal și culoarea textului anumitor butoane.'
tertiary:
name: 'terțiar'
- description: 'Adrese, cateva butoane, notificări, și culoarea de accent.'
+ description: 'Link-uri, câteva butoane, notificări, și culoare de accent.'
quaternary:
- name: "quaternar"
- description: "Adrese de navigare."
+ name: "cuaternar"
+ description: "Linkuri de navigare."
header_background:
- name: "fundalul Header-ului"
+ name: "fundalul header-ului"
description: "Culoarea de fundal a header-ului din site."
header_primary:
name: "header-ul primar"
description: "Textul și inconițele din header-ul site-ului."
highlight:
- name: 'Iluminare'
- description: 'Culoarea de fundal a elementelor iluminate din pagina, cum ar fi postări și discuții.'
+ name: 'punere în evidență'
+ description: 'Culoarea de fundal a elementelor puse în evidență din pagină, cum ar fi postări și discuții.'
danger:
name: 'Pericol'
- description: 'Ilumineazș culoarea pentru acțiuni ca ștergerea postărilor și a discuțiilor.'
+ description: 'Evidențiază culoarea pentru acțiuni de tipul ștergerii postărilor și al subiectelor.'
success:
name: 'succes'
- description: 'Indică starea de succes a unei operațiuni.'
+ description: 'Arată că acțiunea s-a terminat cu succes.'
love:
- name: 'Iubire'
+ name: 'apreciere'
description: "Culoarea butonului de apreciere."
email:
- title: "Emails"
+ title: "Email"
settings: "Opțiuni"
templates: "Șabloane"
- preview_digest: "Previzualizează rezumat"
- sending_test: "Trimite email de test..."
+ preview_digest: "Rezumat previzualizare"
+ sending_test: "Se trimite email de test..."
error: "EROARE - %{server_error}"
- test_error: "S-a semnalat o problemă la trimtirerea email-ului. Vă rugăm verificați setările mailului, Verificați ca gazda sa nu bocheze conexiunile de email și reâncercați."
+ test_error: "A apărut o problemă la trimiterea email-ului. Te rugăm verifică setările mailului, Verifică dacă gazda nu blochează conexiunile de email și încearcă din nou."
sent: "Trimise"
skipped: "Omise"
+ bounced: "Ricoșate"
received: "Primite"
rejected: "Respinse"
sent_at: "Trimise la"
time: "Timp"
user: "Utilizator"
- email_type: "Tipul de Email"
+ email_type: "Tipul de email"
to_address: "La adresa"
test_email_address: "Adresă email de test"
- send_test: "Trimite Email de test"
+ send_test: "Trimite email de test"
sent_test: "trimis!"
delivery_method: "Metoda de livrare"
+ preview_digest_desc: "Previzualizează conținutul emailurilor-rezumat trimise către utilizatori inactivi."
refresh: "Reîmprospătează"
+ send_digest_label: "Trimite acest rezultat către:"
+ send_digest: "Trimite"
+ sending_email: "Trimitere email..."
format: "Format"
html: "html"
text: "text"
last_seen_user: "Ultimul utilizator văzut:"
+ no_result: "Nu s-au găsit rezultate pentru rezumatul-email."
reply_key: "Cheie de răspuns"
- skipped_reason: "Motiv omiterii"
+ skipped_reason: "Motivul omiterii"
incoming_emails:
from_address: "De la"
to_addresses: "Către"
cc_addresses: "Cc"
subject: "Subiect"
error: "Eroare"
+ none: "Nu s-au găsit emailuri primite."
+ modal:
+ title: "Detaliile emailului primit"
+ error: "Eroare"
+ headers: "Antete"
+ subject: "Subiect"
+ body: "Corp"
+ rejection_message: "Mail respingere"
filters:
- from_placeholder: "from@example.com"
- to_placeholder: "to@example.com"
- cc_placeholder: "cc@example.com"
+ from_placeholder: "de_la@exemplu.com"
+ to_placeholder: "către@exemplu.com"
+ cc_placeholder: "cc@exemplu.com"
subject_placeholder: "Subiect..."
error_placeholder: "Eroare"
logs:
@@ -2083,8 +2731,8 @@ ro:
created_at: "Creat"
last_match_at: "Ultima potrivire"
match_count: "Potriviri"
- ip_address: "Adresa IP"
- topic_id: "ID Discuție"
+ ip_address: "Adresă IP"
+ topic_id: "ID Subiect"
post_id: "ID Mesaj"
category_id: "ID categorie"
delete: 'Șterge'
@@ -2094,14 +2742,14 @@ ro:
block: "blochează"
do_nothing: "nu acționa"
staff_actions:
- title: "Acțiunile membrilor din staff"
- instructions: "Clic pe numele utilizatorului şi acţiuni pentru a filtra lista. Clic pe poză profilului pentru a vizita pagina utilizatorului."
+ title: "Acțiunile membrilor echipei"
+ instructions: "Clic pe numele utilizatorului şi acţiuni pentru a filtra lista. Clic pe poza profilului pentru a vizita pagina utilizatorului."
clear_filters: "Arată tot"
- staff_user: "Utilizatorul din staff"
+ staff_user: "Utilizator-membru al echipei"
target_user: "Utilizator țintă"
subject: "Subiect"
when: "Când"
- context: "Contextul"
+ context: "Context"
details: "Detalii"
previous_value: "Precedent"
new_value: "Nou"
@@ -2118,15 +2766,16 @@ ro:
change_site_customization: "schimbă preferințele site-ului"
delete_site_customization: "șterge preferințele site-ului"
change_site_text: "schimbă textul site-ului"
- suspend_user: "suspendă utilizator"
+ suspend_user: "suspendă utilizatorul"
unsuspend_user: "reactivează utilizator"
- grant_badge: "acordă insignă"
- revoke_badge: "revocă insignă"
- check_email: "Verifică emailul"
- delete_topic: "şterge discuția"
- delete_post: "şterge mesajul"
- impersonate: "joacă rolul"
- anonymize_user: "fă userul anonim"
+ grant_badge: "acordă ecuson"
+ revoke_badge: "revocă ecuson"
+ check_email: "verifică emailul"
+ delete_topic: "șterge subiectul"
+ delete_post: "șterge postarea"
+ impersonate: "joacă rolul utilizatorului"
+ anonymize_user: "transformă în utilizator anonim"
+ roll_up: "consolidează blocurile de IP"
change_category_settings: "schimbă setările categoriei"
delete_category: "șterge categorie"
create_category: "creează categorie"
@@ -2136,56 +2785,64 @@ ro:
revoke_admin: "Revocă titlul de Admin"
grant_moderation: "Acordă titlul de Moderator"
revoke_moderation: "Revocă titlul de Moderator"
+ backup_operation: "operație de backup"
+ deleted_tag: "etichetă ștearsă"
+ renamed_tag: "etichetă redenumită"
+ revoke_email: "revoca email"
screened_emails:
title: "Email-uri filtrate"
- description: "Când cineva încearcă să creeze un nou cont, următorul email va fi verificat iar înregistrarea va fi blocată, sau o altă acțiune va fi inițiată."
+ description: "Când cineva încearcă să creeze un cont nou, următorul email va fi verificat iar înregistrarea va fi blocată, sau o altă acțiune va fi inițiată."
email: "Adresa email"
actions:
allow: "Permite"
screened_urls:
title: "URL-uri filtrate"
- description: "URL-urile listate aici au fost folosite în postări de către utilizatorii ce sunt identificați ca spammeri."
+ description: "URL-urile listate aici au fost folosite în postări de către utilizatorii considerați spammeri."
url: "URL"
domain: "Domeniu"
screened_ips:
title: "IP-uri filtrate"
- description: 'adresele de IP sunt supravegheate. Folosește "permite" să golești lista de IP-uri.'
+ description: 'adrese IP supravegheate. Folosește "permite" să marchezi IP-urile ca permise'
delete_confirm: "Ești sigur că vrei să anulezi regula pentru %{ip_address}?"
+ roll_up_confirm: "Ești sigur că vrei să consolidezi adresele IP monitorizate în mod obișnuit în subrețele?"
+ rolled_up_some_subnets: "S-au consolidat cu succes înregistrările de IP-uri blocate pe următoarele subrețele: %{subnets}."
+ rolled_up_no_subnet: "Nu e nimic de consolidat"
actions:
block: "Blochează"
do_nothing: "Permite"
- allow_admin: "Permite Admin"
+ allow_admin: "Permite admin"
form:
label: "Noi:"
ip_address: "Adresă IP"
add: "Adaugă"
filter: "Caută"
roll_up:
- text: "Roll up"
+ text: "Consolidează"
+ title: "Crează noi înregistrari cu subrețele blocate dacă există cel puțin 'min_ban_entries_for_roll_up' înregistrări."
logster:
- title: "Jurnal de erori"
+ title: "Raport de erori"
impersonate:
- title: "Imită Utilizator"
- help: "Folosește această unealtă pentru a imita un cont de utilizator în scopul de debugging."
+ title: "Joacă rolul utilizatorului"
+ help: "Folosește această unealtă pentru a imita un cont de utilizator pentru depanare. Va trebui să te deconectezi după ce termini."
not_found: "Utilizatorul nu poate fi găsit."
- invalid: "Ne pare rău, dar nu puteţi prelua rolul acelui utilizator."
+ invalid: "Ne pare rău, nu poți prelua acest rol."
users:
title: 'Utilizatori'
- create: 'Adaugă Utilizator cu titlul de Admin'
- last_emailed: "Ultimul Email trimis"
+ create: 'Adaugă utilizator cu titlul de admin'
+ last_emailed: "Ultimul email trimis"
not_found: "Ne pare rău, acest nume de utilizator nu există în sistem."
- id_not_found: "Ne pare rău, dar acest utilizator nu există în sistemul nostru."
- active: "Activ"
- show_emails: "Arată Mail-urile"
+ id_not_found: "Ne pare rău, dar acest utilizator nu există în sistem."
+ active: "Activi"
+ show_emails: "Arată email"
nav:
- new: "Nou"
- active: "Activ"
+ new: "Noi"
+ active: "Activi"
pending: "În așteptare"
- staff: 'Personalul'
- suspended: 'Suspendate'
- blocked: 'Blocate'
- suspect: 'Suspect'
- approved: "Aprobate?"
+ staff: 'Membrii echipei'
+ suspended: 'Suspendați'
+ blocked: 'Blocați'
+ suspect: 'Suspecți'
+ approved: "Aprobați?"
approved_selected:
one: "aprobă utilizatorul"
few: "aprobă utilizatorii ({{count}})"
@@ -2197,159 +2854,174 @@ ro:
titles:
active: 'Utilizatori activi'
new: 'Utilizatori noi'
- pending: 'Utilizatori în așteptare de previzualizare'
- newuser: 'Utilizatori la nielul de încredere 0 (utilizator nou)'
- basic: 'Utilizatori la nivel de încredere 1 (utilizator de baza)'
- member: 'Utilizatori la nivel de încredere 2 (Membri)'
- regular: 'Utilizatori la nivel de încredere 3 (Utilizator activ)'
- leader: 'Utilizatori la nivel de încredere 4 (Lider)'
- staff: "Personalul"
+ pending: 'Utilizatori în așteptare pentru aprobare'
+ newuser: 'Utilizatori la nivelul de încredere 0 (Utilizator nou)'
+ basic: 'Utilizatori la nivel de încredere 1 (Utilizator simplu)'
+ member: 'Utilizatori la nivel de încredere 2 (Utilizator membru)'
+ regular: 'Utilizatori la nivel de încredere 3 (Utilizator frecvent)'
+ leader: 'Utilizatori la nivel de încredere 4 (Utilizator lider)'
+ staff: "Echipa"
admins: 'Administratori'
moderators: 'Moderatori'
blocked: 'Utilizatori blocați'
suspended: 'Utilizatori suspendați'
- suspect: 'Utilizatori Suspecţi'
+ suspect: 'Utilizatori suspecţi'
reject_successful:
- one: "1 utilizator a fost rejectat cu success."
- few: "%{count} utilizatori au fost rejectaţi cu success."
- other: "%{count} utilizatori au fost rejectaţi cu success."
+ one: "1 utilizator a fost respins cu succes."
+ few: "%{count} utilizatori au fost respinși cu succes."
+ other: "%{count} de utilizatori au fost respinși cu succes."
reject_failures:
- one: "Rejectarea a 1 utilizator a eşuat."
- few: "Rejectarea a %{count} utilizatori a eşuat."
- other: "Rejectarea a %{count} utilizatori a eşuat."
+ one: "Un utilizator nu a putut fi respins."
+ few: " %{count} utilizatori nu au putut fi respinși."
+ other: "%{count} de utilizatori nu au putut fi respinși."
not_verified: "Neverificat"
check_email:
title: "Arată adresa de email a acestui utilizator"
text: "Arată"
user:
- suspend_failed: "Ceva nu a funcționat în suspendarea acestui utilizator {{error}}"
- unsuspend_failed: "Ceva nu a funcționat în activarea acestui utilizator {{error}}"
+ suspend_failed: "Ceva nu a funcționat la suspendarea acestui utilizator {{error}}"
+ unsuspend_failed: "Ceva nu a funcționat la activarea acestui utilizator {{error}}"
suspend_duration: "Pentru cât timp va fi suspendat utilizatorul?"
suspend_duration_units: "(zile)"
- suspend_reason_label: "De ce suspendați? Acest text va fi vizibil oricui pe pagina de profil a utilizatorului, și va fi arătat utilizatorului când încearca autentificara. încercați să fiți succint."
+ suspend_reason_label: "Motivul suspendării? Acest text va fi vizibil pe pagina de profil a utilizatorului, și va fi arătat utilizatorului atunci când încearcă să se autentifice. Încearcă să fii succint."
suspend_reason: "Motiv"
suspended_by: "Suspendat de"
delete_all_posts: "Șterge toate postările"
- delete_all_posts_confirm: "Sunteți pe cale să ștergeți %{posts} de postări și %{topics} de discuții. Sunteți sigur?"
- suspend: "Suspendat"
- unsuspend: "Activat"
+ delete_all_posts_confirm_MF: "Ești pe cale să ștergi {POSTS, plural, one {1 postare} other {# postări}} și {TOPICS, plural, one {1 subiect} other {# subiecte}}. Ești sigur?"
+ suspend: "Suspendă"
+ unsuspend: "Reactivează"
suspended: "Suspendat?"
moderator: "Moderator?"
admin: "Admin?"
blocked: "Blocat?"
+ staged: "În așteptare?"
show_admin_profile: "Admin"
- edit_title: "Editează Titlu"
- save_title: "Salvează Titlu"
- refresh_browsers: "Fortează reîmprospătarea browserului"
- refresh_browsers_message: "Mesajul a fost trimis către toţi clienţii. "
+ edit_title: "Editează titlu"
+ save_title: "Salvează titlu"
+ refresh_browsers: "Forțează reîmprospătarea browserului"
+ refresh_browsers_message: "Mesajul a fost trimis către toţi. "
show_public_profile: "Arată profilul public"
- impersonate: 'Imită'
- ip_lookup: "Cautare IP"
+ impersonate: 'Joacă rolul utilizatorului'
+ ip_lookup: "Căutare IP"
log_out: "Ieșire"
logged_out: "Acest utilizator a ieșit de pe toate dispozitivele"
- revoke_admin: 'Revocă tirlu Admin'
- grant_admin: 'Acordă titlu Admin'
- revoke_moderation: 'Revocă titlu moderator'
- grant_moderation: 'Acordă titlu moderator'
+ revoke_admin: 'Revocă titlu de admin'
+ grant_admin: 'Acordă titlu de admin'
+ revoke_moderation: 'Revocă titlu de moderator'
+ grant_moderation: 'Acordă titlu de moderator'
unblock: 'Deblochează'
block: 'Blochează'
reputation: Reputație
permissions: Permisiuni
activity: Activitate
- like_count: Aprecieri primite
+ like_count: Aprecieri acordate / primite
last_100_days: 'în ultimele 100 zile'
- private_topics_count: Discuții private
+ private_topics_count: Subiecte private
posts_read_count: Postări citite
- post_count: Postări Create
- topics_entered: Discuții Văzute
- flags_given_count: Marcaje acordate
- flags_received_count: Marcaje primite
- warnings_received_count: Avertizări Primite
- flags_given_received_count: 'Marcaje Acordate / Primite'
+ post_count: Postări create
+ topics_entered: Subiecte văzute
+ flags_given_count: Marcaje de avertizare acordate
+ flags_received_count: Marcaje de avertizare primite
+ warnings_received_count: Avertismente primite
+ flags_given_received_count: 'Marcaje de avertizare acordate/primite'
approve: 'Aprobare'
approved_by: "aprobat de"
- approve_success: "Utilizator aprobat , email trimis cu instrucțiuni de activare."
- approve_bulk_success: "Succes! Toți utilizatorii selectați au fost aprobați și notificați."
+ approve_success: "Utilizator aprobat, email trimis cu instrucțiuni de activare."
+ approve_bulk_success: "Succes! Toți utilizatorii selectați au fost aprobați și anunțați."
time_read: "Timp de citire"
- anonymize: "Fă userul anonim"
- anonymize_confirm: "Sunteţi SIGUR că vreţi să transformaţi acest cont într-un cont anonim? Operaţiunea va schimba numele utilizatorului şi adresa de email şi va reseta toate informaţiile din profil."
- anonymize_yes: "Da, fă acest user anonim"
- anonymize_failed: "A apărut o problema în timpul transformării contului în cont anonim."
- delete: "Ștergere Utilizator"
+ anonymize: "Transformă în utilizator anonim"
+ anonymize_confirm: "Ești SIGUR că vrei să transformi acest cont într-un cont anonim? Operaţiunea va schimba numele utilizatorului şi adresa de email şi va reseta toate informaţiile din profil."
+ anonymize_yes: "Da, transformă acest cont în cont anonim"
+ anonymize_failed: "A apărut o problemă în timpul transformării contului în cont anonim."
+ delete: "Ștergere utilizator"
delete_forbidden_because_staff: "Adminii și moderatorii nu pot fi sterși."
- delete_posts_forbidden_because_staff: "Nu puteți șterge toate mesajele administratorilor și moderatorilor."
+ delete_posts_forbidden_because_staff: "Nu poți șterge mesajele administratorilor și moderatorilor."
delete_forbidden:
- one: "Utilizatorii nu pot fi şterşi dacă au postări. Ştergeţi toate postările înainte de a încerca ştergerea unui utilizator. (Postările mai vechi de %{count} zile nu pot fi şterse)"
- few: "Utilizatorii nu pot fi şterşi dacă au postări. Ştergeţi toate postările înainte de a încerca ştergerea unui utilizator. (Postările mai vechi de %{count} zile nu pot fi şterse)"
- other: "Utilizatorii nu pot fi şterşi dacă au postări. Ştergeţi toate postările înainte de a încerca ştergerea unui utilizator. (Postările mai vechi de %{count} zile nu pot fi şterse)"
+ one: "Utilizatorii nu pot fi șterși dacă au postări. Șterge toate postările înainte de a încerca ștergerea unui utilizator. (Postările mai vechi de 1 zi nu pot fi șterse)"
+ few: "Utilizatorii nu pot fi șterși dacă au postări. Şterge toate postările înainte de a încerca ștergerea unui utilizator. (Postările mai vechi de %{count} zile nu pot fi șterse)"
+ other: "Utilizatorii nu pot fi șterși dacă au postări. Șterge toate postările înainte de a încerca ștergerea unui utilizator. (Postările mai vechi de %{count} de zile nu pot fi șterse)"
cant_delete_all_posts:
- one: "Nu pot fi şterse toate postările. Unele postări sunt mai vechi de %{count} zile. (Setarea delete_user_max_post_age)"
+ one: "Nu pot fi şterse toate postările. Unele postări sunt mai vechi de 1 zi. (Setarea delete_user_max_post_age)"
few: "Nu pot fi şterse toate postările. Unele postări sunt mai vechi de %{count} zile. (Setarea delete_user_max_post_age)"
- other: "Nu pot fi şterse toate postările. Unele postări sunt mai vechi de %{count} zile. (Setarea delete_user_max_post_age)"
+ other: "Nu pot fi șterse toate postările. Unele postări sunt mai vechi de %{count} de zile. (Setarea delete_user_max_post_age)"
cant_delete_all_too_many_posts:
one: "Nu pot fi şterse toate postările deoarece utilizatorul are mai mult de 1 postare. (Setarea delete_all_posts_max)"
few: "Nu pot fi şterse toate postările deoarece utilizatorul are mai mult de %{count} postări. (Setarea delete_all_posts_max)"
- other: "Nu pot fi şterse toate postările deoarece utilizatorul are mai mult de %{count} postări. (Setarea delete_all_posts_max)"
- delete_confirm: "Sunteți sigur că doriți ștergerea acestui utilizator? Acțiunea este permanentă!"
- delete_and_block: "Da, și block viitoarele autentificări pe acest email și adresă IP"
- delete_dont_block: "Da, șterge decât utilizatorul"
+ other: "Nu pot fi şterse toate postările deoarece utilizatorul are mai mult de %{count} de postări. (Setarea delete_all_posts_max)"
+ delete_confirm: "Ești SIGUR că vrei ștergerea acestui utilizator? Acțiunea este ireversibilă!"
+ delete_and_block: "Da, și blochează viitoarele autentificări cu acest email și această adresă IP"
+ delete_dont_block: "Da, șterge doar utilizatorul"
deleted: "Utilizatorul a fost șters."
- delete_failed: "S-a semnalat o eroare la ștergerea utilizatorului. Asigurați-vă că toate postările sunt șterse înainte de a încerca ștergerea utilizatorului."
+ delete_failed: "A apărut o eroare la ștergerea utilizatorului. Asigură-te că toate postările sunt șterse înainte de a încerca ștergerea utilizatorului."
send_activation_email: "Trimite email de activare"
- activation_email_sent: "Um email de activare a fost trimis."
- send_activation_email_failed: "S-a semnalat o eroare la trimiterea altui email de activare. %{error}"
- activate: "Activarea contului"
- activate_failed: "S-a semnalat o problemă la activarea utilizatorului."
+ activation_email_sent: "A fost trimis un email de activare"
+ send_activation_email_failed: "A apărut o eroare la trimiterea altui email de activare. %{error}"
+ activate: "Activare cont"
+ activate_failed: "A apărut o problemă la activarea utilizatorului."
deactivate_account: "Dezactivează cont"
- deactivate_failed: "S-a semnalat o problemă la dezactivarea utilizatoprului."
- unblock_failed: 'S-a semnalat o problemă la deblocarea utlizatorului.'
- block_failed: 'S-a semnalat o problemă la blocarea utilizatorului.'
+ deactivate_failed: "A apărut o problemă la dezactivarea contului."
+ unblock_failed: 'A apărut o problemă la deblocarea contului.'
+ block_failed: 'A apărut o problemă la blocarea contului.'
+ block_confirm: 'Ești sigur că vrei să blochezi acest utilizator? Nu va mai putea să creeze niciun subiect sau postare.'
block_accept: 'Blochează utilizatorul'
+ bounce_score: "Rata de ricoșeu"
+ reset_bounce_score:
+ label: "Resetează"
+ title: "Resetează rata de ricoșeu înapoi la 0"
deactivate_explanation: "Un utilizator dezactivat va trebui să-și revalideze email-ul."
suspended_explanation: "Un utilizator suspendat nu se poate autentifica"
- block_explanation: "Un utilizator blocat nu poate posta sau porni o discuție."
- trust_level_change_failed: "S-a semnalat o problemă la schimbarea nivelului de încredere al utilizatorului."
+ block_explanation: "Un utilizator blocat nu poate posta sau scrie un subiect."
+ staged_explanation: "Un utilizator în așteptare poate posta numai prin email la subiectele specifice."
+ bounce_score_explanation:
+ none: "În ultimul timp nu au fost primite ricoșeuri de acest email."
+ some: "În ultimul timp au fost primite unele ricoșeuri de la acest email."
+ threshold_reached: "Au fost primite prea multe ricoșeuri de la acest email."
+ trust_level_change_failed: "A apărut o problemă la schimbarea nivelului de încredere al utilizatorului."
suspend_modal_title: "Suspendă utilizator"
trust_level_2_users: "utilizatori de nivel de încredere 2 "
trust_level_3_requirements: "Cerințe pentru nivelul 3 de încredere"
- trust_level_locked_tip: "Nivelul de Încredere este blocat, sistemul nu va promova sau retrograda utilizatorii"
- trust_level_unlocked_tip: "Nivelul de Încredere este deblocat, sistemul poate promova sau retrograda utilizatorii"
- lock_trust_level: "Blochează Nivelul de Încredere"
- unlock_trust_level: "Deblochează Nivelul de Încredere"
+ trust_level_locked_tip: "Nivelul de încredere este blocat, sistemul nu va promova sau retrograda utilizatorii"
+ trust_level_unlocked_tip: "Nivelul de încredere este deblocat, sistemul poate promova sau retrograda utilizatorii"
+ lock_trust_level: "Blochează nivelul de încredere"
+ unlock_trust_level: "Deblochează nivelul de încredere"
tl3_requirements:
title: "Cerințe pentru nivelul 3 de încredere"
- value_heading: "Valoarea"
- requirement_heading: "Cerințe"
+ table_title:
+ one: "În ultima zi:"
+ few: "În ultimele %{count} zile:"
+ other: "În ultimele %{count} de zile:"
+ value_heading: "Valoare"
+ requirement_heading: "Cerință"
visits: "Vizite"
- days: "zile"
- topics_replied_to: "Discuții la care s-a răspuns"
- topics_viewed: "Discuții văzute"
- topics_viewed_all_time: "Discuții văzute (din totdeauna)"
+ days: "Zile"
+ topics_replied_to: "Subiecte la care s-a răspuns"
+ topics_viewed: "Subiecte vizualizate"
+ topics_viewed_all_time: "Subiecte vizualizate (dintotdeauna)"
posts_read: "Postări citite"
- posts_read_all_time: "Postări citite (din totdeauna)"
- flagged_posts: "Postări marcate"
- flagged_by_users: "Utilizatori ce au marcat"
- likes_given: "Aprecieri Oferite"
- likes_received: "Aprecieri Primite"
- likes_received_days: "Aprecieri Primite: zile unice"
- likes_received_users: "Aprecieri Primite: utilizatori unici"
- qualifies: "Calificări pentru nivelul 3 de încredere."
+ posts_read_all_time: "Postări citite (dintotdeauna)"
+ flagged_posts: "Postări marcate cu marcaje de avertizare"
+ flagged_by_users: "Utilizatori ce au marcat cu marcaje de avertizare"
+ likes_given: "Aprecieri oferite"
+ likes_received: "Aprecieri primite"
+ likes_received_days: "Aprecieri primite: zile unice"
+ likes_received_users: "Aprecieri primite: utilizatori unici"
+ qualifies: "Se califică pentru nivelul 3 de încredere."
does_not_qualify: "Nu se califică pentru nivelul 3 de încredere."
- will_be_promoted: "Vor fi promovați în 24 de ore."
+ will_be_promoted: "Va fi promovați în curând."
will_be_demoted: "Va fi retrogradat în curând."
- on_grace_period: "În prezent, în perioada de grație de promovare, nu va fi retrogradat."
- locked_will_not_be_promoted: "Nivelul de Încredere blocat. Nu va fi niciodata promovat."
- locked_will_not_be_demoted: "Nivelul de Încredere blocat. Nu va fi niciodata retrogradat."
+ on_grace_period: "În prezent, în perioada de grație a promovării, nu va fi retrogradat."
+ locked_will_not_be_promoted: "Nivelul de încredere blocat. Nu va fi niciodată promovat."
+ locked_will_not_be_demoted: "Nivelul de încredere blocat. Nu va fi niciodată retrogradat."
sso:
- title: "Single Sign On"
+ title: "Autentificare unică"
external_id: "ID Extern"
- external_username: "Nume Utilizator"
+ external_username: "Nume utilizator"
external_name: "Nume"
external_email: "Email"
external_avatar_url: "URL poză de profil"
user_fields:
title: "Câmpuri utilizator"
- help: "Adăugaţi câmpuri pe care utilizatorii le pot completa."
+ help: "Adaugă câmpuri pe care utilizatorii le pot completa."
create: "Creează un câmp utilizator"
untitled: "Fără titlu"
name: "Nume câmp"
@@ -2359,8 +3031,8 @@ ro:
edit: "Editează"
delete: "Șterge"
cancel: "Anulează"
- delete_confirm: "Sunteți sigur că stergeți acest câmp utilizator?"
- options: "Optiuni"
+ delete_confirm: "Ești sigur că vrei să ștergi acest câmp utilizator?"
+ options: "Opțiuni"
required:
title: "Necesar la înscriere?"
enabled: "necesar"
@@ -2370,34 +3042,42 @@ ro:
enabled: "editabil"
disabled: "nu este editabil"
show_on_profile:
- title: "Arată în profilul public"
- enabled: "arată în profil"
- disabled: "nu arată în profil"
+ title: "Arată în profilul public?"
+ enabled: "se afișează în profil"
+ disabled: "nu se afișează în profil"
+ show_on_user_card:
+ title: "Afișează pe pagina cu date personale utilizatorului?"
+ enabled: "se afișează"
+ disabled: "nu se afișează"
field_types:
- text: 'Câmp Text'
+ text: 'Câmp text'
confirm: 'Confirmare'
- dropdown: "Select"
+ dropdown: "Meniu derulant"
site_text:
- title: 'Conținut'
- edit: 'editează'
+ description: "Poți personaliza orice text pe forum. Te rugăm să începi prin a căuta mai jos:"
+ search: "Caută textul pe care vrei să îl editezi"
+ title: 'Conținut text'
+ edit: 'Editează'
revert: "Revocați schimbările"
- revert_confirm: "Ești sigur că vreți să revocați schimbările?"
+ revert_confirm: "Ești sigur că vrei să revoci schimbările?"
go_back: "Înapoi la căutare"
- show_overriden: 'Arată doar rescrierile'
+ recommended: "Îți recomandăm să personalizezi următorul text pentru a se adapta nevoilor tale:"
+ show_overriden: 'Arată doar ignorate'
site_settings:
- show_overriden: 'Arată doar rescrierile'
+ show_overriden: 'Arată doar pe cele ignorate'
title: 'Setări'
- reset: 'resetează'
- none: 'nimic'
+ reset: 'Resetează'
+ none: 'Nimic'
no_results: "Nu s-au găsit rezultate."
- clear_filter: "Golește"
+ clear_filter: "Șterge"
add_url: "adaugă URL"
+ add_host: "adaugă gazdă"
categories:
all_results: 'Toate'
- required: 'Cerute'
+ required: 'Necesare'
basic: 'Setări de bază'
users: 'Utilizatori'
- posting: 'Mesaje'
+ posting: 'Postări'
email: 'Email'
files: 'Fișiere'
trust: 'Niveluri de încredere'
@@ -2405,71 +3085,82 @@ ro:
onebox: "Onebox"
seo: 'SEO'
spam: 'Spam'
- rate_limits: 'Limita rată'
- developer: 'Developer'
- embedding: "Includere"
+ rate_limits: 'Limite'
+ developer: 'Dezvoltator'
+ embedding: "Embedding"
legal: "Legal"
+ user_api: 'API Utilizator'
uncategorized: 'Altele'
- backups: "Rezervări"
+ backups: "Back-up"
login: "Autentificare"
plugins: "Plugin-uri"
user_preferences: "Preferințe"
+ tags: "Etichete"
+ search: "Căutare"
badges:
- title: Insigne
- new_badge: Insignă nouă
+ title: Ecusoane
+ new_badge: Ecuson nou
new: Nou
name: Nume
- badge: Insignă
- display_name: Afițeaza numele
- description: Descrierea
- badge_type: Tipul insignei
+ badge: Ecuson
+ display_name: Afișează numele
+ description: Descriere
+ long_description: Descriere lungă
+ badge_type: Tipul ecusonului
badge_grouping: Grup
badge_groupings:
- modal_title: Insigne de grup
+ modal_title: Grupuri ecusoane
granted_by: Acordat de
granted_at: Acordat la
- reason_help: (O legătură către un mesaj sau o discuţie)
+ reason_help: (O legătură către o postare sau un subiect)
save: Salvează
delete: Șterge
- delete_confirm: Sunteți sigur că stergeți insigna?
+ delete_confirm: Ești sigur că vrei să ștergi acest ecuson?
revoke: Revocă
reason: Motiv
expand: Extinde …
- revoke_confirm: Sunteți sigur ca revocați insigna?
- edit_badges: Editează insigne
- grant_badge: Acordă insignă
- granted_badges: Insigne acordate
+ revoke_confirm: Ești sigur că vrei să revoci ecusonul?
+ edit_badges: Editează ecusoane
+ grant_badge: Acordă ecuson
+ granted_badges: Ecusoane acordate
grant: Acordă
- no_user_badges: "%{name} nu i-a fost acordată nicio insignă."
- no_badges: Nu există nicio insignă ce poate fi acordată.
- none_selected: "Selectaţi o insignă pentru a începe"
- allow_title: Permite insigna sa fie folosită ca titlu
- multiple_grant: Poate sa fie acordată de mai multe ori
- listable: Arată insignă pe pagina publică a insignelor
- enabled: Activează insignă
- icon: Iconită
+ no_user_badges: "Lui %{name} nu i-a fost acordat niciun ecuson."
+ no_badges: Nu există niciun ecuson care poate fi acordat.
+ none_selected: "Selectaţi un ecuson pentru a începe"
+ allow_title: Permite ca ecusonul să fie folosit ca titlu
+ multiple_grant: Poate fi acordat de mai multe ori
+ listable: Arată ecuson pe pagina publică a ecusoanelor
+ enabled: Activează ecuson
+ icon: Pictogramă
image: Imagine
- icon_help: "Folosiţi o clasă Font Awesome sau un URL pentru imagine"
- query: Verificare insignă (SQL)
- target_posts: Interogarea mesajelor ţintă
- auto_revoke: Pornește verificarea de revocare î fiecare zi
- show_posts: Arata mesaje ce acordă insigne pe pagina de insigne
+ icon_help: "Folosiţi o clasă de fonturi Font Awesome sau un URL pentru imagine"
+ query: Interogare ecusoane (SQL)
+ target_posts: Interogarea mesajelor utilizatorilor-ţintă
+ auto_revoke: Pornește verificarea de revocare în fiecare zi
+ show_posts: Arata mesaje ce acordă ecusoane pe pagina de ecusoane
trigger: Declanșator
trigger_type:
- none: "reinprospatează zilnic"
+ none: "Actualizare zilnică"
post_action: "Când un utilizator reacționează la un mesaj"
post_revision: "Când un utlizator creează sau editează un mesaj"
trust_level_change: "Când un utilizator schimbă nivelul de încredere"
user_change: "Când un utilizator este editat sau creat"
+ post_processed: "După ce o postare este procesată"
preview:
- link_text: "Vedeţi insignele acordate"
- plan_text: "Vedeţi cu plan de execuţie"
- modal_title: "Interogare Previzualizare Insignă"
+ link_text: "Previzualizare ecusoane acordate"
+ plan_text: "Previzualizare cu interogare"
+ modal_title: "Previzualizare interogari ecusoane"
sql_error_header: "A apărut o eroare la executarea interogării."
- error_help: "Vezi legăturile următoare pentru ajutor referitor la interogări pentru insigne."
+ error_help: "Vezi legăturile următoare pentru ajutor cu privire la interogări pentru ecusoane."
bad_count_warning:
header: "ATENȚIE!"
- sample: "Specimen:"
+ text: "Unele șabloane lipsesc. Asta se întâmplă atunci când o interogare de ecusoane returnează user IDs sau post IDs care nu există. Asta ar putea da naștere la rezultate neașteptate mai târziu - te rugăm să verifici din nou interogarea."
+ no_grant_count: "Nu există ecusoane pentru atribuire."
+ grant_count:
+ one: "Un ecuson pentru atribuire."
+ few: "%{count} ecusoane pentru atribuire."
+ other: "%{count} de ecusoane pentru atribuire."
+ sample: "Exemplu:"
grant:
with: %{username}
with_post: %{username} pentru mesajul în %{link}
@@ -2478,24 +3169,38 @@ ro:
emoji:
title: "Emoji"
help: "Adaugă un nou \"emoji\" care va fi disponibil pentru toţi. (PROTIP: trage şi adaugă mai multe fişiere odată)"
- add: "Adaugă un Nou Emoji"
+ add: "Adaugă un emoji nou"
name: "Nume"
image: "Imagine"
- delete_confirm: "Sunteţi sigur că doriţi să ștergeți :%{name}: emoji?"
+ delete_confirm: "Ești sigur că vrei să ștergi emoji-ul :%{name}:?"
embedding:
- confirm_delete: "Sunteți sigur că vreți să ștergeți acest host?"
- sample: "Folosiți următorul cod HTML în site-ul dvs. pentru a crea și pentru a embed-ui topic-uri discourse. Înlocuiți REPLACE_ME cu URL-ul canonic al paginii pe care doriți să o embed-uiți."
+ get_started: "Dacă dorești să încorporezi Discourse pe un alt website, începe prin a-i adăuga gazda."
+ confirm_delete: "Ești sigur că vrei să ștergi acest host?"
+ sample: "Folosește următorul cod HTML în site-ul tău pentru a crea și pentru a încorpora subiecte Discourse. Înlocuiește ÎNLOCUIEȘTE_MĂ cu URL-ul canonic al paginii pe care dorești să o încorporezi."
title: "Embedding"
host: "Host-uri permise"
+ path_whitelist: "Cale permise"
edit: "editează"
category: "Postează în categoria"
add_host: "Adaugă host"
settings: "Setări pentru embeding"
- feed_settings: "Setări Feed"
+ feed_settings: "Setări feed"
+ feed_description: "Furnizând un feed RSS/ATOM pentru site-ul tau, poți să îmbunătățești capacitatea Discourse de a-ți importa conținutul."
+ crawling_settings: "Setări roboți de căutare"
+ crawling_description: "Când Discourse creează subiecte pentru postările tale, dacă nu este prezent nici un feed RSS/ATOM, va încerca să extragă conținutul din codul HTML. Uneori pot apărea probleme la extragerea conținutului, așa că îți dăm posibilitatea să specifici regulile CSS pentru a ușura extracția."
+ embed_by_username: "Nume utilizator pentru creare subiect"
embed_post_limit: "Numărul maxim de postări de încorporat."
+ embed_username_key_from_feed: "Tastă pentru a retrage nume utilizator discourse din feed"
+ embed_title_scrubber: "Expresie obișnuită pentru a curăța titlurile postărilor"
+ embed_truncate: "Scurtează postările embedded."
+ embed_whitelist_selector: "Selector CSS pentru elemente care nu sunt permise în embeds."
+ embed_blacklist_selector: "Selector CSS pentru elemente care sunt șterse din emebds."
+ embed_classname_whitelist: "Nume de clase CSS permise"
+ feed_polling_enabled: "Importă postări via RSS/ATOM"
+ feed_polling_url: "URL-ul feed-ului RSS/ATOM pentru indexare"
save: "Salvați setările pentru embeding"
permalink:
- title: "Link-uri"
+ title: "Adrese permanente"
url: "URL"
topic_id: "ID discuție"
topic_title: "Discuție"
@@ -2504,8 +3209,28 @@ ro:
category_id: "ID categorie"
category_title: "Categorie"
external_url: "URL extern"
- delete_confirm: Sigur doriți să ștergeți acest link ?
+ delete_confirm: Ești sigur că vrei să ștergi această adresă permanentă?
form:
label: "Nou:"
- add: "Adăugați"
+ add: "Adaugă"
filter: "Căutare (URL sau URL extern)"
+ wizard_js:
+ wizard:
+ done: "Terminat"
+ back: "Înapoi"
+ next: "Următorul"
+ step: "%{current} din %{total}"
+ upload: "Încărcare"
+ uploading: "Se încarcă..."
+ quit: "Poate mai târziu"
+ staff_count:
+ one: "Comunitatea ta are un membru al echipei."
+ few: "Comunitatea ta are %{count} membri ai echipei."
+ other: "Comunitatea ta are %{count} de membri ai echipei."
+ invites:
+ add_user: "adaugă"
+ none_added: "Nu ați invitat nici un membru al echipei. Ești sigur că vrei să continui?"
+ roles:
+ admin: "Administrator"
+ moderator: "Moderator"
+ regular: "Utilizator frecvent"
diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml
index d5492e95d38..c11d606bde4 100644
--- a/config/locales/client.ru.yml
+++ b/config/locales/client.ru.yml
@@ -29,17 +29,19 @@ ru:
millions: "{{number}} млн."
dates:
time: "HH:mm"
+ timeline_date: "MMM YYYY"
long_no_year: "D MMM HH:mm"
long_no_year_no_time: "D MMM"
- full_no_year_no_time: "MMMM Do"
+ full_no_year_no_time: "D MMM"
long_with_year: "D MMM YYYY, HH:mm"
long_with_year_no_time: "D MMM, YYYY"
- full_with_year_no_time: "MMMM Do, YYYY"
+ full_with_year_no_time: "LL"
long_date_with_year: "D MMM YY, LT"
long_date_without_year: "D MMM, LT"
long_date_with_year_without_time: "D MMM YYYY"
long_date_without_year_with_linebreak: "D MMM
LT"
long_date_with_year_with_linebreak: "D MMM YYYY
LT"
+ wrap_ago: "%{date} назад"
tiny:
half_a_minute: "< 1мин"
less_than_x_seconds:
@@ -52,16 +54,11 @@ ru:
few: "%{count}с"
many: "%{count}с"
other: "%{count}с"
- less_than_x_minutes:
- one: "< 1мин"
- few: "< %{count}мин"
- many: "< %{count}мин"
- other: "< %{count}мин"
x_minutes:
one: "1мин"
- few: "< %{count}мин"
- many: "< %{count}мин"
- other: "< %{count}мин"
+ few: "%{count}мин"
+ many: "%{count}мин"
+ other: "%{count}мин"
about_x_hours:
one: "1ч"
few: "%{count}ч"
@@ -149,11 +146,13 @@ ru:
google+: 'Поделиться ссылкой через Google+'
email: 'Поделиться ссылкой по электронной почте'
action_codes:
- public_topic: "сделать тему публичной %{when}"
- private_topic: "сделать тему приватной %{when}"
+ public_topic: "Сделал эту тему публичной %{when}"
+ private_topic: "Сделал эту тему приватной %{when}"
split_topic: "Разделил эту тему %{when}"
invited_user: "Пригласил %{who} %{when}"
+ invited_group: "Пригласил %{who} %{when}"
removed_user: "Исключил %{who} %{when}"
+ removed_group: "Исключил %{who} %{when}"
autoclosed:
enabled: 'Закрыл тему %{when}'
disabled: 'Открыл тему %{when}'
@@ -173,8 +172,10 @@ ru:
enabled: 'Включил в списки %{when}'
disabled: 'Исключил из списков %{when}'
topic_admin_menu: "действия администратора над темой"
+ wizard_required: "Пришло время для настройки вашего форума!Запустить Мастер Установки!"
emails_are_disabled: "Все исходящие письма были глобально отключены администратором. Уведомления любого вида не будут отправляться на почту."
- bootstrap_mode_disabled: "Bootstrap режим будет отключен в течение 24 часов."
+ bootstrap_mode_enabled: "Чтобы облегчить развитие вашего нового сайта в самом начале, был включен режим запуска. В этом режиме, всем новым пользователям будет автоматически присвоен 1й уровень доверия при регистрации и включена ежедневная почтовая рассылка сводки новостей. Режим запуска будет выключен автоматически, как только количество зарегистрированных пользователей достигнет %{min_users}."
+ bootstrap_mode_disabled: "Режим запуска будет отключен в течение 24 часов."
s3:
regions:
us_east_1: "US East (N. Virginia)"
@@ -185,9 +186,11 @@ ru:
eu_central_1: "EU (Frankfurt)"
ap_southeast_1: "Asia Pacific (Singapore)"
ap_southeast_2: "Asia Pacific (Sydney)"
+ ap_south_1: "Asia Pacific (Mumbai)"
ap_northeast_1: "Asia Pacific (Tokyo)"
ap_northeast_2: "Asia Pacific (Seoul)"
sa_east_1: "South America (Sao Paulo)"
+ cn_north_1: "China (Beijing)"
edit: 'отредактировать название и раздел темы'
not_implemented: "Извините, эта функция еще не реализована!"
no_value: "Нет"
@@ -297,6 +300,8 @@ ru:
undo: "Отменить"
revert: "Вернуть"
failed: "Проблема"
+ switch_to_anon: "Войти в Анонимный режим"
+ switch_from_anon: "Выйти из Анонимного режима"
banner:
close: "Больше не показывать это объявление."
edit: "Редактировать это объявление >>"
@@ -368,12 +373,6 @@ ru:
many: "%{count} пользователей"
other: "%{count} пользователей"
groups:
- empty:
- posts: "Участники этой группы не отправили ни одного сообщения"
- members: "В этой группе нет участников"
- mentions: "Упоминаний этой группы нет"
- messages: "Для этой группы нет сообщений"
- topics: "Участниками этой группы не создано ни одной темы"
add: "Добавить"
selector_placeholder: "Добавить участников"
owner: "владелец"
@@ -400,10 +399,14 @@ ru:
none: "(Нет)"
notifications:
watching:
- title: "Отслеживание"
+ title: "Наблюдать"
description: "Уведомлять по каждому ответу на это сообщение и показывать счетчик новых непрочитанных ответов."
+ watching_first_post:
+ title: "Просмотр Первого сообщения"
+ description: "Уведомлять только о первом сообщении в каждой новой теме в этой группе."
tracking:
title: "Следить"
+ description: "Вы будете уведомлены если кто-то упомянет ваше @name или ответит вам. А так же вам будет показано общее количество новых ответов"
regular:
title: "Уведомлять"
description: "Вам придёт уведомление, если кто-нибудь упомянет ваш @псевдоним или ответит вам."
@@ -443,18 +446,16 @@ ru:
latest_by: "последние по"
toggle_ordering: "изменить сортировку"
subcategories: "Подразделы"
- topic_stats: "Количество новых тем."
+ topic_sentence:
+ one: "1 тема"
+ few: "%{count} тем"
+ many: "%{count} тем"
+ other: "%{count} тем"
topic_stat_sentence:
one: "%{count} новая тема за предыдущий %{unit}."
few: "%{count} новые темы за предыдущий %{unit}."
many: "%{count} новых тем за предыдущий %{unit}."
other: "%{count} новых тем за предыдущий %{unit}."
- post_stats: "Количество новых сообщений."
- post_stat_sentence:
- one: "%{count} новое сообщение за предыдущий %{unit}."
- few: "%{count} новых сообщения за предыдущий %{unit}."
- many: "%{count} новых сообщений за предыдущий %{unit}."
- other: "%{count} новых сообщений за предыдущий %{unit}."
ip_lookup:
title: Поиск IP адреса
hostname: Название хоста
@@ -477,9 +478,8 @@ ru:
profile: "Профиль"
mute: "Отключить"
edit: "Настройки"
- download_archive: "Скачать архив сообщений"
new_private_message: "Новое сообщение"
- private_message: "Сообщение"
+ private_message: "Личное сообщение"
private_messages: "Личные сообщения"
activity_stream: "Активность"
preferences: "Настройки"
@@ -499,9 +499,10 @@ ru:
disable: "Отключить оповещения"
enable: "Включить оповещения"
each_browser_note: "Примечание: эта настройка устанавливается в каждом браузере индивидуально."
+ dismiss_notifications: "Отложить все"
dismiss_notifications_tooltip: "Пометить все непрочитанные уведомления прочитанными"
disable_jump_reply: "Не переходить к вашему новому сообщению после ответа"
- dynamic_favicon: "Показывать колличество новых / обновленных тем на иконке сообщений"
+ dynamic_favicon: "Показывать количество новых / обновленных тем на иконке сообщений"
external_links_in_new_tab: "Открывать все внешние ссылки в новой вкладке"
enable_quoting: "Позволить отвечать с цитированием выделенного текста"
change: "изменить"
@@ -513,11 +514,33 @@ ru:
suspended_notice: "Пользователь заморожен до {{date}}."
suspended_reason: "Причина:"
github_profile: "Github"
+ email_activity_summary: "Сводка Активности"
mailing_list_mode:
- daily: "Отправить ежедневные обновления"
- individual: "Отправлять письмо каждый раз, когда появляется новое сообщение."
+ label: "Режим почтовой рассылки"
+ enabled: "Включить почтовую рассылку"
+ instructions: |
+ Настройки почтовой рассылки перекрывают настройки сводки активности.
+ Темы и разделы с выключенными уведомлениями не будут включены в письма рассылки.
+ daily: "Присылать ежедневные обновления"
+ individual: "Присылать письмо для каждого нового сообщения"
+ individual_no_echo: "Присылать письмо для каждого нового сообщения, кроме тех случаев когда пост явлается моим"
+ many_per_day: "Присылать письмо для каждого нового сообщения (примерно {{dailyEmailEstimate}} в день)"
+ few_per_day: "Присылать письмо для каждого нового сообщения (примерно 2 в день)"
+ tag_settings: "Теги"
+ watched_tags: "Наблюдение"
+ watched_tags_instructions: "Вы будете автоматически отслеживать все новые темы в этих тэгах. Вам будут приходить уведомления о новых сообщениях и темах, а также количество непрочитанных и новых сообщений будет показано рядом с названиями тем. "
+ tracked_tags: "Отслеживаемая"
+ tracked_tags_instructions: "Вы будете автоматически отслеживать новые темы в этих разделах. Рядом со списком тем будет отображено количество непрочитанных и новых сообщений."
+ muted_tags: "Выключено"
+ muted_tags_instructions: "Вы не будете получать уведомления о новых темах в этих разделах. Также, они не будут показываться во вкладке Непрочитанное."
watched_categories: "Наблюдение"
+ watched_categories_instructions: "Вы будете автоматически отслеживать новые темы в этих разделах. Вам будут приходить уведомления о новых сообщениях и темах, а также рядом со списком тем будет отображено количество новых сообщений."
tracked_categories: "Отслеживаемые разделы"
+ tracked_categories_instructions: "Вы будете получать уведомления о каждом новом сообщении в этой теме. Рядом со списком тем также будет показано количество новых сообщений."
+ watched_first_post_categories: "Просмотр Первого сообщения"
+ watched_first_post_categories_instructions: "Уведомлять только о первом сообщении в каждой новой теме в этих разделах."
+ watched_first_post_tags: "Просмотр Первого сообщения"
+ watched_first_post_tags_instructions: "Уведомлять только о первом сообщении в каждой новой теме с этими тегами."
muted_categories: "Выключенные разделы"
muted_categories_instructions: "Не уведомлять меня о новых темах в этих разделах и не показывать новые темы на странице «Непрочитанные»."
delete_account: "Удалить мою учётную запись"
@@ -530,7 +553,12 @@ ru:
muted_users: "Выключено"
muted_users_instructions: "Не отображать уведомления от этих пользователей."
muted_topics_link: "Показать темы \"Без уведомлений\""
+ watched_topics_link: "Показать наблюдаемые темы"
automatically_unpin_topics: "Автоматически откреплять топики после прочтения."
+ apps: "Приложения"
+ revoke_access: "Лишить прав доступа"
+ undo_revoke_access: "Отменить Лишение прав доступа"
+ api_approved: "Подтверждено"
staff_counters:
flags_given: "полезные жалобы"
flagged_posts: "сообщения с жалобами"
@@ -559,6 +587,7 @@ ru:
error: "При изменении значения произошла ошибка."
change_username:
title: "Изменить псевдоним"
+ confirm: "Если вы измените имя пользователя, то все предыдущие цитирования и обращения по @name станут неработоспособными. Вы уверены, что вы хотите это сделать?"
taken: "Этот псевдоним уже занят."
error: "При изменении псевдонима произошла ошибка."
invalid: "Псевдоним должен состоять только из цифр и латинских букв"
@@ -619,6 +648,7 @@ ru:
title: "Язык интерфейса"
instructions: "Язык сайта. Необходимо перезагрузить страницу, чтобы изменения вступили в силу."
default: "(по умолчанию)"
+ any: "любой"
password_confirmation:
title: "Пароль еще раз"
last_posted: "Последнее сообщение"
@@ -634,17 +664,24 @@ ru:
like_notification_frequency:
title: "Уведомлять при получении симпатии"
always: "Всегда"
+ first_time_and_daily: "Для первой симпатии, и далее не чаще раза в день"
+ first_time: "Только для первой симпатии"
never: "Никогда"
email_previous_replies:
+ title: "Добавить предыдущие ответы к концу электронных писем"
+ unless_emailed: "если ранее не отправляли"
always: "всегда"
never: "никогда"
email_digests:
+ title: "В случае моего отсутствия на форуме, присылайте мне сводку популярных новостей"
every_30_minutes: "каждые 30 минут"
every_hour: "каждый час"
daily: "ежедневно"
every_three_days: "каждые 3 дня"
weekly: "еженедельно"
every_two_weeks: "каждые 2 недели"
+ include_tl0_in_digests: "Включить контент от новых пользователей в сводки, отправляемые по электронной почте"
+ email_in_reply_to: "Добавить предыдущие ответы к концу электронных писем"
email_direct: "Присылать почтовое уведомление, когда кто-то цитирует меня, отвечает на мой пост, упоминает мой @псевдоним или приглашает меня в тему"
email_private_messages: "Присылать почтовое уведомление, когда кто-то оставляет мне сообщение"
email_always: "Присылать почтовое уведомление, даже если я присутствую на сайте"
@@ -669,6 +706,7 @@ ru:
after_4_minutes: "более 4х минут"
after_5_minutes: "более 5 минут"
after_10_minutes: "более 10 минут"
+ notification_level_when_replying: "Когда я пишу в теме, установить эту тему для"
invited:
search: "Введите текст для поиска по приглашениям..."
title: "Приглашения"
@@ -677,7 +715,7 @@ ru:
none: "Приглашения, ожидающие одобрения, отсутствуют."
truncated:
one: "Первое приглашение"
- few: "Первые {{count}} приглашений"
+ few: "Первые {{count}} приглашения"
many: "Первые {{count}} приглашений"
other: "Первые {{count}} приглашений"
redeemed: "Принятые приглашения"
@@ -693,19 +731,17 @@ ru:
rescind: "Отозвать"
rescinded: "Приглашение отозвано"
reinvite: "Повторить приглашение"
+ reinvite_all: "Повторить все приглашения"
reinvited: "Приглашение выслано повторно"
+ reinvited_all: "Все приглашения высланы повторно!"
time_read: "Времени читал"
days_visited: "Дней посещал"
account_age_days: "Дней с момента регистрации"
create: "Отправить приглашение"
generate_link: "Скопировать ссылку для приглашений"
- generated_link_message: '
Пригласительная ссылка сгенерирована!
Эта ссылка действует только для следующего e-mail:%{invitedEmail}
' bulk_invite: - none: "Вы еще никого не приглашали на этот форум. Можно отправить индивидуальные приглашения по одному, или же пригласить сразу несколько людей из файла." text: "Пригласить всех из файла" - uploading: "Загрузка..." success: "Файл успешно загружен, вы получите сообщение, когда процесс будет завершен." - error: "В процессе загрузки файла '{{filename}}' произошла ошибка: {{message}}" password: title: "Пароль" too_short: "Пароль слишком короткий." @@ -728,6 +764,16 @@ ru: few: "сообщения написал" many: "сообщений написал" other: "сообщений написал" + likes_given: + one: " поставил" + few: " given" + many: " given" + other: " given" + likes_received: + one: " получил" + few: " получил" + many: " получил" + other: " получил" days_visited: one: "день заходил" few: "дня заходил" @@ -740,9 +786,9 @@ ru: other: "сообщений прочел" bookmark_count: one: "закладка" - few: "закладок" - many: "закладки" - other: "закладки" + few: "закладки" + many: "закладок" + other: "закладок" top_replies: "Лучшие сообщения" no_replies: "Пока не написал ни одного сообщения." more_replies: "... другие сообщения" @@ -752,10 +798,11 @@ ru: top_badges: "Самые престижные награды" no_badges: "Еще не получил ни одной награды." more_badges: "... другие награды" - top_links: "Лучшие темы" - no_links: "Пока нет ссылок" - most_liked_by: "Больше всего симпатий от" - most_liked_users: "Больше всего симпатий" + top_links: "Лучшие ссылки" + no_links: "Пока нет ссылок." + most_liked_by: "Поклонники" + most_liked_users: "Фавориты" + most_replied_to_users: "Самые активные собеседники" no_likes: "Пока ни одной симпатии." associated_accounts: "Связанные аккаунты" ip_address: @@ -799,11 +846,21 @@ ru: logout: "Вы вышли." refresh: "Обновить" read_only_mode: + enabled: "Сайт работает в режиме \"только для чтения\". Сейчас вы можете продолжать просматривать сайт, но другие действия будут недоступны. " login_disabled: "Вход отключён, пока сайт в режиме «только для чтения»" + logout_disabled: "Выход отключён, пока сайт в режиме «только для чтения»" too_few_topics_and_posts_notice: "Давайте приступим к обсуждению! Сейчас %{currentTopics} / %{requiredTopics} тем и %{currentPosts} / %{requiredPosts} сообщений. Новым пользователям будет интереснее тут, если появится больше тем для обсуждений." too_few_topics_notice: "Давайте приступим к обсуждению! Сейчас %{currentTopics} / %{requiredTopics} тем. Новым пользователям будет интереснее тут, если появится больше тем для обсуждений." too_few_posts_notice: "Давайте приступим к обсуждению! Сейчас %{currentPosts} / %{requiredPosts} сообщений. Новым пользователям будет интереснее тут, если появится больше сообщений для обсуждения." + logs_error_rate_notice: + rate: + one: "1 ошибка/%{duration}" + few: "%{count} ошибок/%{duration}" + many: "%{count} ошибок/%{duration}" + other: "%{count} ошибок/%{duration}" learn_more: "подробнее..." + all_time: 'всего' + all_time_desc: 'всего создано тем' year: 'год' year_desc: 'темы, созданные за последние 365 дней' month: 'месяц' @@ -842,6 +899,7 @@ ru: title: "Сообщение" invite: "Пригласить других..." remove_allowed_user: "Вы действительно хотите удалить {{name}} из данного сообщения?" + remove_allowed_group: "Вы действительно хотите удалить {{name}} из данного сообщения?" email: 'Email' username: 'Псевдоним' last_seen: 'Был' @@ -908,6 +966,16 @@ ru: github: title: "С помощью GitHub" message: "Вход с помощью учетной записи GitHub (убедитесь, что блокировщик всплывающих окон отключен)" + emoji_set: + apple_international: "Apple/International" + google: "Google" + twitter: "Twitter" + emoji_one: "Emoji One" + win10: "Win10" + category_page_style: + categories_only: "Только разделы" + categories_with_featured_topics: "Разделы и их лучшие темы" + categories_and_latest_topics: "Разделы и список последних тем форума" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' @@ -917,14 +985,22 @@ ru: more_emoji: "еще..." options: "Дополнительные опции" whisper: "внутреннее сообщение" + unlist: "исключена из списков тем" add_warning: "Это официальное предупреждение." toggle_whisper: "Внутреннее сообщение" + toggle_unlisted: "Спрятать из списков тем" posting_not_on_topic: "В какой теме вы хотите ответить?" saving_draft_tip: "Сохранение..." saved_draft_tip: "Сохранено" saved_local_draft_tip: "Сохранено локально" similar_topics: "Ваша тема похожа на..." drafts_offline: "Черновики, сохраненные в офлайн" + group_mentioned: + one: "Упоминая группу {{group}}, вы тем самым отправите уведомление 1му пользователю – вы уверены?" + few: "Упоминая группу {{group}}, вы тем самым отправите уведомление {{count}} пользователям – вы уверены?" + many: "Упоминая группу {{group}}, вы тем самым отправите уведомление {{count}} пользователям – вы уверены?" + other: "Упоминая группу {{group}}, вы тем самым отправите уведомление {{count}} пользователям – вы уверены?" + duplicate_link: "Эту же самую ссылку на {{domain}} уже писал @{{username}} в своем ответе {{ago}} – вы уверены, что хотите повторить ссылку снова?" error: title_missing: "Требуется название темы" title_too_short: "Название темы должно быть не короче {{min}} символов" @@ -939,7 +1015,7 @@ ru: reply: "Ответить" cancel: "Отмена" create_topic: "Создать тему" - create_pm: "Личное сообщение" + create_pm: "Отправить личное сообщение" title: "Или нажмите Ctrl+Enter" users_placeholder: "Добавить пользователя" title_placeholder: "Название: суть темы коротким предложением" @@ -954,33 +1030,40 @@ ru: show_preview: 'показать предпросмотр »' hide_preview: '« скрыть предпросмотр' quote_post_title: "Процитировать сообщение целиком" + bold_label: "Ж" bold_title: "Жирный" - bold_text: "текст, выделенный жирным" + bold_text: "вставьте сюда текст, которный нужно выделить жирным" + italic_label: "К" italic_title: "Курсив" - italic_text: "текст, выделенный курсивом" + italic_text: "вставьте сюда текст, который нужно выделить курсивом" link_title: "Ссылка" link_description: "введите описание ссылки" link_dialog_title: "Вставить ссылку" - link_optional_text: "текст ссылки" + link_optional_text: "кликабельный текст ссылки" link_url_placeholder: "http://example.com" quote_title: "Цитата" - quote_text: "Впишите текст цитаты сюда" + quote_text: "Впишите сюда текст цитаты" code_title: "Текст \"как есть\" (без применения форматирования)" - code_text: "впишите текст сюда; также, отключить форматирование текста можно, начав строку с четырех пробелов" - upload_title: "Загрузить" - upload_description: "введите описание загружаемого объекта" + code_text: "Впишите сюда текст; также, отключить форматирование текста можно, начав строку с 4х пробелов" + paste_code_text: "Напечатайте или вставьте сюда код" + upload_title: "Вставить картинку или прикрепить файл" + upload_description: "Впишите сюда описание файла" olist_title: "Нумерованный список" ulist_title: "Ненумерованный список" list_item: "Пункт первый" + heading_label: "А" heading_title: "Заголовок" heading_text: "Заголовок" hr_title: "Горизонтальный разделитель" help: "Справка по форматированию (Markdown)" - toggler: "скрыть / показать панель редактирования" + toggler: "Закрыть / открыть панель редактирования" modal_ok: "OK" modal_cancel: "Отмена" cant_send_pm: "К сожалению, вы не можете отправлять сообщения пользователю %{username}." - admin_options_title: "Дополнительные настройки темы" + yourself_confirm: + title: "Забыли указать получателей?" + body: "В списке получателей сейчас только вы сами!" + admin_options_title: "Дополнительные настройки темы для персонала" auto_close: label: "Закрыть тему через:" error: "Пожалуйста, введите корректное значение." @@ -993,6 +1076,7 @@ ru: notifications: title: "уведомления об упоминании @псевдонима, ответах на ваши посты и темы, сообщения и т.д." none: "Уведомления не могут быть загружены." + empty: "Уведомления не найдены." more: "посмотреть более ранние уведомления" total_flagged: "всего сообщений с жалобами" mentioned: "
{{username}} {{description}}
" @@ -1019,6 +1103,8 @@ ru: edited: "Изменил ваше сообщение" liked: "Понравилось ваше сообщение" private_message: "Личное сообщение от" + invited_to_private_message: "Приглашение в личную беседе от" + invited_to_topic: "Приглашение в тему от" invitee_accepted: "Приглашение принято" moved_post: "Ваша тема перенесена участником " linked: "Ссылка на ваше сообщение" @@ -1053,6 +1139,7 @@ ru: most_liked: "Больше всего симпатий" select_all: "Выбрать все" clear_all: "Сбросить все" + too_short: "Слишком короткое слово для поиска." result_count: one: "Найдено 1: \"{{term}}\"" few: "Найдено {{count}}: \"{{term}}\"" @@ -1061,21 +1148,61 @@ ru: title: "Поиск по темам, сообщениям, псевдонимам и разделам" no_results: "Ничего не найдено." no_more_results: "Больше ничего не найдено." - search_help: Справка по поиску searching: "Поиск ..." post_format: "#{{post_number}} от {{username}}" context: user: "Искать сообщения от @{{username}}" - category: "Искать в разделе \"{{category}}\"" + category: "Искать в разделе #{{category}}" topic: "Искать в этой теме" private_messages: "Искать в личных сообщениях" + advanced: + title: Расширенный поиск + posted_by: + label: Автор + in_category: + label: Раздел + in_group: + label: Группа + with_badge: + label: С наградами + with_tags: + label: С тегами + filters: + label: Ограничить поиск только тем и сообщений... + likes: Мне понравились + posted: В которых я писал + watching: За которыми я наблюдаю + tracking: За которыми я слежу + private: В моих личных сообщениях + bookmarks: В моих закладках + first: Только первые сообщения в темах + pinned: Закреплены + unpinned: Не закреплены + wiki: Являются вики + statuses: + label: Характеристика темы + open: Открыта + closed: Закрыта + archived: Заархивирована + noreplies: Без ответов + single_user: Писал только один пользователь + post: + count: + label: Минимум сообщений в теме + time: + label: Дата + before: До (включая) + after: Начиная с hamburger_menu: "перейти к другому списку тем или другому разделу" new_item: "новый" go_back: 'вернуться' not_logged_in_user: 'страница пользователя с историей его последней активности и настроек' current_user: 'перейти на вашу страницу пользователя' topics: + new_messages_marker: "последний визит" bulk: + select_all: "Выбрать все" + clear_all: "Очистить все" unlist_topics: "Исключить из списков" reset_read: "Сбросить прочтённые" delete: "Удалить темы" @@ -1099,6 +1226,7 @@ ru: other: "Вы выбрали {{count}} тем." change_tags: "Изменить тэги" choose_new_tags: "Выбрать новые тэги для выбранных тем:" + changed_tags: "Теги этой темы были изменены." none: unread: "У вас нет непрочитанных тем." new: "У вас нет новых тем." @@ -1127,10 +1255,14 @@ ru: topic: unsubscribe: change_notification_state: "Ваше текущее состояние уведомлений" - filter_to: "{{post_count}} сообщений в теме" + filter_to: + one: "1 сообщение в теме" + few: "{{post_count}} сообщений в теме" + many: "{{post_count}} сообщений в теме" + other: "{{post_count}} сообщений в теме" create: 'Создать Тему' create_long: 'Создать новую тему' - private_message: 'Написать сообщение' + private_message: 'Новое личное соощение' archive_message: help: 'Переместить сообщение в архив' title: 'Архив' @@ -1199,18 +1331,25 @@ ru: auto_close_title: 'Настройки закрытия темы' auto_close_save: "Сохранить" auto_close_remove: "Не закрывать тему автоматически" + timeline: + back: "Вернуться" + back_description: "Перейти к последнему непрочитанному сообщению" + replies_short: "%{current} / %{total}" progress: title: текущее местоположение в теме go_top: "перейти наверх" go_bottom: "перейти вниз" go: "=>" jump_bottom: "перейти к последнему сообщению" + jump_prompt: "перейти к сообщению" + jump_prompt_long: "К какому сообщению вы хотите перейти?" jump_bottom_with_number: "перейти к сообщению %{post_number}" total: всего сообщений current: текущее сообщение - position: "%{current} сообщение из %{total}" notifications: + title: изменить частоту уведомлений об этой теме reasons: + '3_10': 'Вы будете получать уведомления, т.к. наблюдаете за тэгом этой темы.' '3_6': 'Вы будете получать уведомления, т.к. наблюдаете за этим разделом.' '3_5': 'Вы будете получать уведомления, т.к. наблюдение темы началось автоматически.' '3_2': 'Вы будете получать уведомления, т.к. наблюдаете за этой темой.' @@ -1263,6 +1402,8 @@ ru: invisible: "Исключить из списков" visible: "Включить в списки" reset_read: "Сбросить счетчики" + make_public: "Сделать тему публичной" + make_private: "Сделать тему приватной" feature: pin: "Закрепить тему" unpin: "Открепить тему" @@ -1278,27 +1419,45 @@ ru: share: title: 'Поделиться' help: 'Поделиться ссылкой на тему' + print: + title: 'Печать' + help: 'Открыть версию для печати' flag_topic: title: 'Жалоба' help: 'пожаловаться на сообщение' success_message: 'Вы пожаловались на тему.' feature_topic: - title: "Выделить эту тему" - confirm_pin: "У вас уже есть {{count}} закрепленных тем. Слишком большое количество закрепленных тем может стать препятствием для новых и анонимных пользователей. Вы уверены, что хотите закрепить еще одну тему в этом разделе?" - unpin: "Убрать эту тему из верха раздела {{categoryLink}}." - pin_note: "Пользователи могут открепить тему для себя." - pin_validation: "Дата необходима, чтобы прикрепить эту тему" + title: "Закрепить эту тему" + pin: "Закрепить эту тему вверху раздела {{categoryLink}} до" + confirm_pin: "У вас уже есть закрепленные темы в разделе ({{count}}). Перебор таких тем может оказаться неприятным неудобством для новичков и анонимных читателей. Вы уверены, что хотите закрепить еще одну тему в этом разделе?" + unpin: "Отменить закрепление этой темы вверху раздела {{categoryLink}}." + unpin_until: "Отменить закрепление этой темы вверху раздела {{categoryLink}} (произойдет автоматически %{until})." + pin_note: "Пользователи могут открепить тему, каждый сам для себя." + pin_validation: "Чтобы закрепить эту тему, требуется дата." not_pinned: "В разделе {{categoryLink}} нет закрепленных тем." - confirm_pin_globally: "У вас уже есть {{count}} глобально закрепленных тем. Слишком большое количество закрепленных тем может стать препятствием для новых и анонимных пользователей. Вы уверены, что хотите глобально закрепить еще одну тему?" - unpin_globally: "Убарть эту тему из верха всех списков тем." - unpin_globally_until: "Убарть эту тему из верха всех списков тем." - global_pin_note: "Пользователи могут открепить тему для себя." + already_pinned: + one: "Глобально закрепленных тем в разделе {{categoryLink}}: 1" + few: "Глобально закрепленных тем в разделе {{categoryLink}}: {{count}}" + many: "Глобально закрепленных тем в разделе {{categoryLink}}: {{count}}" + other: "Глобально закрепленных тем в разделе {{categoryLink}}: {{count}}" + pin_globally: "Закрепить эту тему вверху всех разделов и списков тем до" + confirm_pin_globally: "У вас уже есть глобально закрепленные темы ({{count}}). Перебор таких тем может оказаться неприятным неудобством для новичков и анонимных читателей. Вы уверены, что хотите глобально закрепить еще одну тему?" + unpin_globally: "Отменить прикрепление этой темы вверху всех разделов и списков тем." + unpin_globally_until: "Отменить прикрепление этой темы вверху всех разделов и списков тем (произойдет автоматически %{until})." + global_pin_note: "Пользователи могут открепить тему, каждый сам для себя." not_pinned_globally: "Нет глобально закрепленных тем." + already_pinned_globally: + one: "Глобально закрепленных тем: 1" + few: "Глобально закрепленных тем: {{count}}" + many: "Глобально закрепленных тем: {{count}}" + other: "Глобально закрепленных тем: {{count}}" make_banner: "Превратить эту тему в объявление, которое будет отображаться вверху всех страниц." - remove_banner: "Убрать объявление, которое отображается вверху всех страниц." - banner_note: "Пользователи могут отклонить объявление, закрыв его. Только одну тему можно сделать текущим объявлением." - no_banner_exists: "Нет текущих объявлений." + remove_banner: "Убрать тему-объявление, которое отображается вверху всех страниц." + banner_note: "Пользователи могут закрывать объявление, каждый сам для себя, после чего оно больше не будет для них покываться. Только одна тема может быть сделана активным объявлением в любой момент времени." + no_banner_exists: "Нет текущих тем-объявлений." + banner_exists: "На данный момент уже есть тема-объявление." inviting: "Высылаю приглашение..." + automatically_add_to_groups: "Это приглашение предоставит доступ к следующим группам:" invite_private: title: 'Пригласить в беседу' email_or_username: "Адрес электронной почты или псевдоним того, кого вы хотите пригласить" @@ -1350,6 +1509,10 @@ ru: few: "Пожалуйста, выберите тему, в которую вы хотели бы переместить эти {{count}} сообщения." many: "Пожалуйста, выберите тему, в которую вы хотели бы переместить эти {{count}} сообщений." other: "Пожалуйста, выберите тему, в которую вы хотели бы переместить эти {{count}} сообщений." + merge_posts: + title: "Соединить выделенные сообщения" + action: "Соединить выделенные сообщения" + error: "Произошла ошибка во время соединения выделенных сообщений." change_owner: title: "Изменить владельца сообщений" action: "изменить владельца" @@ -1384,7 +1547,7 @@ ru: post: reply: " {{replyAvatar}} {{usernameLink}}" reply_topic: " {{link}}" - quote_reply: "ответить цитированием" + quote_reply: "Цитата" edit: "Изменить {{link}} {{replyAvatar}} {{username}}" edit_reason: "Причина:" post_number: "сообщение {{number}}" @@ -1405,7 +1568,6 @@ ru: few: "просмотреть {{count}} скрытых ответов" many: "просмотреть {{count}} скрытых ответов" other: "просмотреть {{count}} скрытых ответов" - more_links: "еще {{count}}..." unread: "Сообщение не прочитано" has_replies: one: "{{count}} Ответ" @@ -1423,11 +1585,17 @@ ru: many: "Это сообщение понравилось {{count}} людям" other: "Это сообщение понравилось {{count}} людям" has_likes_title_only_you: "Вам понравилось это сообщение" + has_likes_title_you: + one: "Вам и еще 1 человеку понравилось это сообщение" + few: "Вам и еще {{count}} людям понравилось это сообщение" + many: "Вам и еще {{count}} людям понравилось это сообщение" + other: "Вам и еще {{count}} людям понравилось это сообщение" errors: create: "К сожалению, не удалось создать сообщение из-за ошибки. Попробуйте еще раз." edit: "К сожалению, не удалось изменить сообщение. Попробуйте еще раз." upload: "К сожалению, не удалось загрузить файл. Попробуйте еще раз." too_many_uploads: "К сожалению, за один раз можно загрузить только одно изображение." + too_many_dragged_and_dropped_files: "К сожалению, за один раз можно загрузить только 10 файлов." upload_not_authorized: "К сожалению, вы не можете загрузить файл данного типа (список разрешенных типов файлов: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "К сожалению, загрузка изображений недоступна новым пользователям." attachment_upload_not_allowed_for_new_user: "К сожалению, загрузка файлов недоступна новым пользователям." @@ -1438,6 +1606,8 @@ ru: yes_value: "Да, отказаться" via_email: "это сообщение пришло с почты" whisper: "Это внутреннее сообщение, т.е. оно видно только модераторам" + wiki: + about: "это вики-сообщение" archetypes: save: 'Параметры сохранения' controls: @@ -1475,14 +1645,6 @@ ru: few: "Отложить жалобы" many: "Отложить жалобы" other: "Отложить жалобы" - it_too: - off_topic: "Пожаловаться" - spam: "Пожаловаться" - inappropriate: "Пожаловаться" - custom_flag: "Пожаловаться" - bookmark: "Добавить в закладки" - like: "Мне тоже нравится" - vote: "Проголосовать" undo: off_topic: "Отозвать жалобу" spam: "Отозвать жалобу" @@ -1491,10 +1653,12 @@ ru: like: "Больше не нравится" vote: "Отозвать голос" people: + off_topic: "отметили это как \"не по теме\"" spam: "отмечено как спам" inappropriate: "отмеченно как неуместное" notify_moderators: "уведомлёные модераторы" notify_user: "отправил сообщение" + bookmark: "добавить закладку" like: "понравилось это" vote: "проголосовал за это" by_you: @@ -1592,6 +1756,12 @@ ru: few: "Вы уверены, что хотите удалить все эти сообщения?" many: "Вы уверены, что хотите удалить все эти сообщения?" other: "Вы уверены, что хотите удалить все эти сообщения?" + merge: + confirm: + one: "Вы уверены, что хотите объединить эти сообщения?" + few: "Вы уверены, что хотите объединить эти {{count}} сообщений?" + many: "Вы уверены, что хотите объединить эти {{count}} сообщений?" + other: "Вы уверены, что хотите объединить эти {{count}} сообщений?" revisions: controls: first: "Начальная версия" @@ -1623,6 +1793,11 @@ ru: general: 'Общие' settings: 'Настройки' topic_template: "Шаблон темы" + tags: "Тэги" + tags_allowed_tags: "Теги, которые могут быть использованы только в этом разделе:" + tags_allowed_tag_groups: "Группы тегов, которые могут быть использованы только в этом разделе:" + tags_placeholder: "(Необязательно) список доступных тегов" + tag_groups_placeholder: "(Необязательно) список доступных групп тегов" delete: 'Удалить раздел' create: 'Создать Раздел' create_long: 'Создать новый раздел' @@ -1656,6 +1831,8 @@ ru: email_in_allow_strangers: "Принимать письма от анонимных пользователей без учетных записей" email_in_disabled: "Создание новых тем через электронную почту отключено в настройках сайта. Чтобы разрешить создание новых тем через электронную почту," email_in_disabled_click: 'активируйте настройку "email in".' + suppress_from_homepage: "Не отображать этот раздел на главной странице." + sort_order: "Порядок сортировки:" allow_badges_label: "Разрешить вручение наград в этом разделе" edit_permissions: "Изменить права доступа" add_permission: "Добавить права" @@ -1668,50 +1845,83 @@ ru: notifications: watching: title: "Наблюдать" + description: "Наблюдать за всеми темами этого раздела. Уведомлять о каждом новом сообщении в любой из тем и показывать счетчик новых ответов." + watching_first_post: + title: "Наблюдать за первым сообщением" + description: "Вы будете уведомлены только о первом сообщении в каждой новой теме этого раздела." tracking: title: "Следить" + description: "Отслеживать все темы этого раздела. Уведомлять если кто-то упомянет ваше @name или ответит вам, показывать счетчик новых ответов." regular: title: "Уведомлять" description: "Уведомлять, если кто-нибудь упомянет мой @псевдоним или ответит на мое сообщение." muted: title: "Без уведомлений" description: "Не уведомлять о новых темах в этом разделе и скрыть их из последних." + sort_options: + default: "По умолчанию" + likes: "Количество симпатий" + op_likes: "Количество симпатий у первого сообщения" + views: "Количество просмотров" + posts: "Количество сообщений" + activity: "Последняя активность" + posters: "Количество участников" + category: "Раздел" + created: "Дата создания" + sort_ascending: 'По возрастанию' + sort_descending: 'По убыванию' flagging: title: 'Спасибо за вашу помощь в поддержании порядка!' - action: 'Пожаловаться' + action: 'Пожаловаться на сообщение' take_action: "Принять меры" notify_action: 'Сообщение' + official_warning: 'Официальное предупреждение' delete_spammer: "Удалить спамера" - delete_confirm: "Вы собираетесь удалить %{posts} сообщений и %{topics} тем этого пользователя, а так же удалить его учетную запись, добавить его IP адрес %{ip_address} и его почтовый адрес %{email} в черный список. Вы действительно уверены, что ваши помыслы чисты и действия не продиктованы гневом?" yes_delete_spammer: "Да, удалить спамера" ip_address_missing: "(не доступно)" hidden_email_address: "(скрыто)" - submit_tooltip: "Отправить приватную отметку" - take_action_tooltip: "Достигнуть порога жалоб не дожидаясь большего количества жалоб от сообщества" - cant: "Извините, но вы не можете сейчас послать жалобу." + submit_tooltip: "Отправить приватную жалобу" + take_action_tooltip: "Симитировать достижение порога количества жалоб, не дожидаясь их от сообщества" + cant: "Вы не можете отправить жалобу на это сообщение сейчас." + notify_staff: 'Сообщить персоналу приватно' formatted_name: off_topic: "Это не по теме" inappropriate: "Это неприемлемо" spam: "Это спам" - custom_placeholder_notify_user: "Будьте точны, конструктивны и всегда доброжелательны." - custom_placeholder_notify_moderators: "Сообщите нам, чем конкретно вы обеспокоены и предоставьте соответствующие ссылки, если это возможно." + custom_placeholder_notify_user: "Будьте точны, конструктивны и доброжелательны." + custom_placeholder_notify_moderators: "Поясните суть проблемы: на что нам следует обратить внимание. Предоставьте соответствующие ссылки, если это возможно." custom_message: - at_least: "введите как минимум {{n}} символов" - more: "Нужно ещё {{n}} cимволов..." - left: "Осталось {{n}} символов" + at_least: + one: "Введите хотя бы 1 символ" + few: "Введите хотя бы {{count}} символа" + many: "Введите хотя бы {{count}} символов" + other: "Введите хотя бы {{count}} символов" + more: + one: "Еще 1 символ..." + few: "Еще хотя бы {{count}} символа..." + many: "Еще хотя бы {{count}} символов..." + other: "Еще хотя бы {{count}} символов..." + left: + one: "Осталось не более 1 символа" + few: "Осталось не более {{count}} символов" + many: "Осталось не более {{count}} символов" + other: "Осталось не более {{count}} символов" flagging_topic: - title: "Спасибо за вашу помощь!" - action: "Пометить тему" + title: "Спасибо за помощь в поддержании порядка!" + action: "Пожаловаться на тему" notify_action: "Сообщение" topic_map: title: "Сводка по теме" participants_title: "Частые авторы" links_title: "Популярные ссылки" + links_shown: "показать больше ссылок..." clicks: one: "1 клик" few: "%{count} клика" many: "%{count} кликов" other: "%{count} кликов" + post_links: + about: "gjrfpf" topic_statuses: warning: help: "Это официальное предупреждение." @@ -1735,7 +1945,6 @@ ru: invisible: help: "Тема исключена из всех списков тем и доступна только по прямой ссылке" posts: "Сообщ." - posts_lowercase: "сообщения" posts_long: "{{number}} сообщений в теме" posts_likes_MF: | В этой теме {count, plural, one {1 сообщение} other {# сообщений}} {ratio, select, @@ -1862,6 +2071,170 @@ ru: full: "Создавать / Отвечать / Просматривать" create_post: "Отвечать / Просматривать" readonly: "Просматривать" + lightbox: + download: "скачать" + keyboard_shortcuts_help: + title: 'Сочетания клавиш' + jump_to: + title: 'Быстрый переход' + home: 'g, h Главная' + latest: 'g, l Последние' + new: 'g, n Новые' + unread: 'g, u Непрочитанные' + categories: 'g, c Разделы' + top: 'g, t Обсуждаемые' + bookmarks: 'g, b Закладки' + profile: 'g, p Профиль' + messages: 'g, m Личные сообщения' + navigation: + title: 'Навигация' + jump: '# Перейти к сообщению №' + back: 'u Назад' + up_down: 'k/j Двигать курсор выделения темы ↑ ↓' + open: 'o или Enter Открыть выделенную курсором тему' + next_prev: 'shift+j/shift+k Следующая/предыдущая секция' + application: + title: 'Форум' + create: 'c Создать тему' + notifications: 'n Открыть уведомления' + hamburger_menu: '= Открыть меню гамбургер' + user_profile_menu: 'p Открыть меню профиля' + show_incoming_updated_topics: '. Показать обновленные темы' + search: '/ Поиск' + help: '? Показать сочетания клавиш' + dismiss_new_posts: 'x, r Отложить новые сообщения' + dismiss_topics: 'x, t Отложить темы' + log_out: 'shift+z shift+z Выйти' + actions: + title: 'Темы' + bookmark_topic: ' f Добавить / удалить из заклодок' + pin_unpin_topic: 'shift+p Закрепить / Открепить тему' + share_topic: 'shift+s Поделиться темой' + share_post: 's Поделиться сообщением' + reply_as_new_topic: 't Ответить в новой связанной теме' + reply_topic: 'shift+r Ответить в теме' + reply_post: 'r Ответить на сообщение' + quote_post: 'q Процитировать сообщение' + like: 'l Выразить симпатию за сообщение' + flag: '! Анонимная жалоба' + bookmark: 'b Добавить сообщение в закладки' + edit: 'e Редактировать сообщение' + delete: 'd Удалить сообщение' + mark_muted: 'm, m Откл. уведомления в теме' + mark_regular: 'm, r Стандартные уведомления в теме (по-умолчанию)' + mark_tracking: 'm, t Следить за темой' + mark_watching: 'm, w Наблюдать за темой' + print: 'ctrl+p Печатать тему' + badges: + granted_on: "Выдана %{date}" + others_count: "Другие с этой наградой (%{count})" + title: Награды + badge_count: + one: "1 награда" + few: "%{count} наград" + many: "%{count} наград" + other: "%{count} наград" + more_badges: + one: "еще +1" + few: "+ еще %{count}" + many: "+ еще %{count}" + other: "+ еще %{count}" + none: "<отсутствует>" + badge_grouping: + getting_started: + name: Начало работы + community: + name: Сообщество + trust_level: + name: Уровень доверия + other: + name: Прочее + google_search: | +
+
+
+
+ tagging:
+ all_tags: "Все теги"
+ selector_all_tags: "Все теги"
+ selector_no_tags: "Нет тегов"
+ changed: "Теги изменены:"
+ tags: "Теги"
+ choose_for_topic: "Выберите теги для этой темы (опционально)"
+ delete_tag: "Удалить тег"
+ delete_confirm: "Вы уверены, что хотите удалить этот тег?"
+ rename_tag: "Редактировать тег"
+ rename_instructions: "Выберите новое название тега:"
+ sort_by: "Сортировка:"
+ sort_by_count: "Количество"
+ sort_by_name: "Название"
+ manage_groups: "Управление группами тегов"
+ manage_groups_description: "Организуйте теги в группы"
+ filters:
+ without_category: "%{filter} темы с тегом %{tag}"
+ with_category: "%{filter} темы с тегом %{tag} в разделе %{category}"
+ untagged_without_category: "%{filter} темы без тегов"
+ untagged_with_category: "%{filter} темы в разделе %{category} без тегов"
+ notifications:
+ watching:
+ title: "Наблюдать"
+ description: "Автоматически наблюдать за всеми темами с этим тегом. Уведомлять о всех новых темах и сообщениях, а также показывать количество непрочитанных и новых сообщений рядом с названиями тем."
+ watching_first_post:
+ title: "Наблюдать создание тем"
+ description: "Уведомлять только о первом сообщении в каждой новой теме с этим тегом."
+ tracking:
+ title: "Следить"
+ description: "Автоматически следить за всеми темами с этим тегом. Показывать количество непрочитанных и новых сообщений рядом с названиями тем."
+ regular:
+ title: "Стандартные уведомления"
+ description: "Уведомлять, только если кто-то упомянет меня по @псевдониму, или ответит на мое сообщение."
+ muted:
+ title: "Без уведомлений"
+ description: "Не уведомлять об обновлениях в новых темах с этим тегом и не показывать на странице «Непрочитанные»."
+ groups:
+ title: "Группы тегов"
+ about: "Для простоты управления тегами, распределите их по группам"
+ new: "Новая группа"
+ tags_label: "Теги в этой группе:"
+ parent_tag_label: "Родительский тег:"
+ parent_tag_placeholder: "Опционально"
+ parent_tag_description: "Теги из этой группы будут доступны только после добавления к теме родительского тега."
+ one_per_topic_label: "Разрешить не более одного тега из этой группы в одной теме"
+ new_name: "Назание новой группы"
+ save: "Сохранить"
+ delete: "Удалить"
+ confirm_delete: "Вы уверены, что хотите удалить эту группу тегов?"
+ topics:
+ none:
+ unread: "Нет непрочитанных тем."
+ new: "Нет новых тем."
+ read: "Вы еще не прочитали ни одной темы."
+ posted: "Вы еще не принимали участие ни в одной теме."
+ latest: "Нет последних тем."
+ hot: "Нет популярных тем."
+ bookmarks: "У вас пока нет тем в закладках."
+ top: "Нет обсуждаемых тем."
+ search: "Поиск не дал результатов."
+ bottom:
+ latest: "Больше нет последних тем."
+ hot: "Больше нет популярных тем."
+ posted: "Больше нет тем с сообщениями."
+ read: "Больше нет прочитанных тем."
+ new: "Больше нет новых тем."
+ unread: "Больше нет непрочитанных тем."
+ top: "Больше нет обсуждаемых тем."
+ bookmarks: "Больше нет тем в закладках."
+ search: "Больше нет результатов поиска."
+ invite:
+ custom_message: "Сделайте приглашение более дружелюбным, добавив в него"
+ custom_message_link: "личное сообщение от себя"
+ custom_message_placeholder: "Напишите сюда ваше личное сообщение"
+ custom_message_template_forum: "Привет. Подумал, что тебе будет интересно зарегистрироваться на этом форуме!"
+ custom_message_template_topic: "Привет! Подумал, что тебя может заинтересовать эта тема!"
admin_js:
type_to_filter: "Введите текст для фильтрации..."
admin:
@@ -1909,6 +2282,7 @@ ru:
30_days_ago: "30 дней назад"
all: "Всего"
view_table: "Таблица"
+ view_graph: "График"
refresh_report: "Обновить отчет"
start_date: "Дата от"
end_date: "Дата до"
@@ -1996,15 +2370,12 @@ ru:
refresh: "Обновить"
new: "Добавить новую"
selector_placeholder: "введите псевдоним"
- name_placeholder: "Название группы, без пробелов, по тем же правилам, что и для псевдонимов."
about: "Здесь можно редактировать группы и имена групп"
group_members: "Участники группы"
delete: "Удалить"
delete_confirm: "Удалить эту группу?"
delete_failed: "Невозможно удалить группу. Если группа была создана автоматически, то она не может быть удалена."
- delete_member_confirm: "Удалить пользователя '%{username}' из группы '%{group}'?"
delete_owner_confirm: "Отозвать права владельца у пользователя '%{username}'?"
- name: "Название"
add: "Добавить"
add_members: "Добавить участников"
custom: "Настраиваемые"
@@ -2035,6 +2406,47 @@ ru:
info_html: "Ваш API ключ позволит вам создавать и обновлять темы, используя JSON calls."
all_users: "Все пользователи"
note_html: "Никому не сообщайте этот ключ. Тот, у кого он есть, сможет создавать сообщения, выдавая себя за любого пользователя форума."
+ web_hooks:
+ title: "Webhooks"
+ instruction: "Webhooks позволяют Discourse уведомлять внешние службы, когда определенное событие происходит на вашем сайте. При срабатывании webhook, на соответствующий URL будет отправлен POST-запрос."
+ detailed_instruction: "При наступлении выбранного события, на соответствующий URL будет отправлен POST-запрос."
+ new: "Добавить Webhook"
+ create: "Создать"
+ save: "Сохранить"
+ destroy: "Удалить"
+ description: "Описание"
+ go_back: "Вернуться к списку"
+ payload_url_placeholder: "https://example.com/postreceive"
+ secret_placeholder: "Необязательная строка, используется для генерации подписи"
+ event_type_missing: "Вам необходимо настроить по крайней мере один тип событий."
+ delete_confirm: "Удалить Webhook?"
+ topic_event:
+ name: "Событие темы"
+ details: "Происходит, когда тема создается, пересматривается, изменяется или удаляется."
+ post_event:
+ name: "Событие сообщения"
+ details: "Происходит, когда сообщение создается, редактируется, удаляется или восстанавливается."
+ user_event:
+ name: "Событие пользователя"
+ delivery_status:
+ title: "Статус передачи"
+ inactive: "Неактивна"
+ failed: "Проблема"
+ successful: "Успех"
+ events:
+ none: "Нет связанных событий."
+ redeliver: "Возврат"
+ request: "Запрос"
+ response: "Ответ"
+ headers: "Заголовки"
+ body: "Тело"
+ go_list: "Перейти к списку"
+ go_details: "Редактировать webhook"
+ go_events: "Перейти к событию"
+ ping: "Ping"
+ event_id: "Идентификатор (ID)"
+ timestamp: "Создано"
+ actions: "Действия"
plugins:
title: "Плагины"
installed: "Установленные плагины"
@@ -2053,6 +2465,14 @@ ru:
backups: "Резервные копии"
logs: "Журнал событий"
none: "Нет доступных резервных копий"
+ read_only:
+ enable:
+ title: "Включить режим \"только для чтения\""
+ label: "Включить режим \"только для чтения\""
+ confirm: "Вы уверены, что хотите включить режим \"только для чтения\"?"
+ disable:
+ title: "Выключить режим \"только для чтения\""
+ label: "Выключить режим \"только для чтения\""
logs:
none: "Пока нет сообщений в журнале регистрации..."
columns:
@@ -2092,10 +2512,8 @@ ru:
title: "Откатить базу данных к предыдущему рабочему состоянию"
confirm: "Вы уверены, что хотите откатить базу данных до предыдущего рабочего состояния?"
export_csv:
- user_archive_confirm: "Вы уверены, то хотите скачать все ваши сообщения?"
success: "Процедура экспорта начата, мы отправим вам сообщение, когда процесс будет завершен."
failed: "Экспорт не удался. Пожалуйста, проверьте логи."
- rate_limit_error: "Записи могут быть загружены один раз в день, пожалуйста, попробуйте еще раз завтра."
button_text: "Экспорт"
button_title:
user: "Экспортировать список пользователей в CSV файл."
@@ -2115,6 +2533,7 @@ ru:
header: "Заголовок"
top: "Топ"
footer: "нижний колонтитул"
+ embedded_css: "Встроенные CSS"
head_tag:
text: ""
title: "HTML код, который будет добавлен перед тегом ."
@@ -2141,6 +2560,7 @@ ru:
opacity: "Прозрачность"
copy: "Копировать"
email_templates:
+ title: "Шаблоны писем"
subject: "Тема"
body: "Текст сообщения"
none_selected: "Выберите шаблон письма, чтобы начать редактирование."
@@ -2190,57 +2610,66 @@ ru:
name: 'любовь'
description: "Цвет кнопки «Мне нравится»."
email:
+ title: "Почта"
settings: "Настройки"
templates: "Шаблоны"
- preview_digest: "Просмотр сводки"
+ preview_digest: "Сводка новостей"
sending_test: "Отправка тестового письма..."
error: "ОШИБКА - %{server_error}"
- test_error: "При отправке тестового письма произошла ошибка. Пожалуйста, внимательно проверьте ваши почтовые настройки, проверьте, что ваш сервер не блокирует почтовые соединения, и попытайтесь снова."
+ test_error: "При отправке тестового письма произошла ошибка. Проверьте почтовые настройки, убедитесь, что ваш почтовый провайдер не блокирует почтовые соединения, и попробуйте снова."
sent: "Отправлено"
- skipped: "Пропущенные"
+ skipped: "Пропущено"
+ bounced: "Возвращено"
received: "Принято"
rejected: "Отклонено"
- sent_at: "Отправлено"
+ sent_at: "Дата"
time: "Время"
user: "Пользователь"
- email_type: "Тип e-mail"
- to_address: "Адрес"
- test_email_address: "Электронный адрес для проверки"
+ email_type: "Тип письма"
+ to_address: "Адресат"
+ test_email_address: "E-mail для тестового письма"
send_test: "Отправить тестовое письмо"
- sent_test: "отправлено!"
+ sent_test: "Отправлено!"
delivery_method: "Метод отправки"
+ preview_digest_desc: "Предпросмотр сводки новостей на отправку неактивным пользователям."
refresh: "Обновить"
+ send_digest: "Отправить"
+ sending_email: "Отправка письма..."
format: "Формат"
html: "html"
text: "текст"
- last_seen_user: "Последнее посещение:"
+ last_seen_user: "Последний раз был:"
reply_key: "Ключ ответа"
skipped_reason: "Причина пропуска"
incoming_emails:
from_address: "От"
to_addresses: "Кому"
- cc_addresses: "Скрытая копия"
- subject: "Тема"
+ cc_addresses: "Кому копия (CC)"
+ subject: "Заголовок"
error: "Ошибка"
- none: "Входящих сообщений нет"
+ none: "Письма не найдены."
modal:
- title: "Подробности Входящего Email"
+ title: "Подробности входящего письма"
error: "Ошибка"
- subject: "Тема"
+ headers: "Заголовки"
+ subject: "Заголовок"
+ body: "Тело"
+ rejection_message: "Письмо отклонения"
filters:
- from_placeholder: "from@example.com"
- to_placeholder: "to@example.com"
- cc_placeholder: "cc@example.com"
+ from_placeholder: "e-mail отравителя"
+ to_placeholder: "e-mail получателя"
+ cc_placeholder: "e-mail копии"
+ subject_placeholder: "Заголовок..."
error_placeholder: "Ошибка"
logs:
- none: "Записи в журнале регистрации не найдены."
+ none: "Записи в журнале не найдены."
filters:
title: "Фильтр"
- user_placeholder: "псевдоним"
- address_placeholder: "name@example.com"
+ user_placeholder: "Псевдоним"
+ address_placeholder: "e-mail адрес"
type_placeholder: "дайджест, подписка..."
- reply_key_placeholder: "ключ ответа"
- skipped_reason_placeholder: "причина"
+ reply_key_placeholder: "Ключ ответа"
+ skipped_reason_placeholder: "Причина"
logs:
title: "Логи"
action: "Действие"
@@ -2301,6 +2730,8 @@ ru:
revoke_admin: "отозваны права администратора"
grant_moderation: "выданы права модератора"
revoke_moderation: "отозваны права модератора"
+ backup_operation: "операции резервного копирования"
+ deleted_tag: "удаленный тег"
screened_emails:
title: "Почтовые адреса"
description: "Когда кто-то создает новую учетную запись, проверяется данный почтовый адрес и регистрация блокируется или производятся другие дополнительные действия."
@@ -2403,7 +2834,6 @@ ru:
suspend_reason: "Причина"
suspended_by: "Заморожен"
delete_all_posts: "Удалить все сообщения"
- delete_all_posts_confirm: "Вы собираетесь удалить %{posts} сообщений и %{topics} тем. Вы уверены?"
suspend: "Заморозить"
unsuspend: "Разморозить"
suspended: "Заморожен?"
@@ -2482,6 +2912,8 @@ ru:
block_failed: 'Не удалось заблокировать пользователя.'
block_confirm: 'Вы уверены что хотите заблокировать этого пользователя? Он больше не сможет создавать темы и отправлять сообщения.'
block_accept: 'Подтвердить блокировку'
+ reset_bounce_score:
+ label: "Сбросить"
deactivate_explanation: "Дезактивированные пользователи должны заново подтвердить свой e-mail."
suspended_explanation: "Замороженный пользователь не может войти."
block_explanation: "Заблокированный не может отвечать и создавать новые темы."
@@ -2600,6 +3032,7 @@ ru:
plugins: "Плагины"
user_preferences: "Пользовательские настройки"
tags: "Тэги"
+ search: "Поиск"
badges:
title: Награды
new_badge: Новая награда
@@ -2678,7 +3111,9 @@ ru:
image: "Изображение"
delete_confirm: "Вы уверены, что хотите удалить иконку :%{name}:?"
embedding:
+ get_started: "Для встраивания на другой сайт необходимо добавить соответствующий хост."
confirm_delete: "Вы уверены, что хотите удалить это поле?"
+ sample: "Используйте следующий HTML-код на своем сайте, для возможности создания связанных тем. Замените REPLACE_ME канонической ссылкой страницы, куда производится встраивание."
title: "Встраивание"
host: "Разрешённые Хосты"
edit: "изменить"
@@ -2686,13 +3121,19 @@ ru:
add_host: "Добавить хост"
settings: "Настройки встраивания"
feed_settings: "Настройки Фида"
+ feed_description: "Поддержка RSS/ATOM вашим сайтом может улучшить возможности импорта данных."
+ crawling_settings: "Настройки определения"
+ crawling_description: "Если RSS/ATOM не поддерживается, то при создании тем Discourse попытается разобрать содержимое из HTML. В некоторых случаях извлечение содержимого оказывается сложным, поэтому мы предоставляем возможность задавать правила CSS, чтобы сделать извлечение проще."
+ embed_by_username: "Имя пользователя, которое будет использоваться для создания темы"
embed_post_limit: "Максимальное количество вложенных сообщений"
embed_username_key_from_feed: "Ключ для извлечения пользователя из ленты"
+ embed_title_scrubber: "Регулярное выражение, используемое для очистки заголовка сообщений"
embed_truncate: "Обрезать встроенные сообщения."
embed_whitelist_selector: "Селекторы CSS которые разрешены для использования."
embed_blacklist_selector: "Селекторы CSS которые запрещены для использования."
embed_classname_whitelist: "Разрешённые CSS-классы"
feed_polling_enabled: "Импорт сообщений через RSS/ATOM"
+ feed_polling_url: "Ссылка на RSS/ATOM"
save: "Сохранить настройки встраивания"
permalink:
title: "Постоянные ссылки"
@@ -2709,3 +3150,17 @@ ru:
label: "Новая постоянная ссылка:"
add: "Добавить"
filter: "Поиск по ссылке или внешней ссылке (URL)"
+ wizard_js:
+ wizard:
+ done: "Готово"
+ back: "Назад"
+ next: "Далее"
+ step: "%{current} из %{total}"
+ upload: "Загрузить"
+ uploading: "Загрузка..."
+ quit: "Может быть позже"
+ invites:
+ add_user: "добавить"
+ roles:
+ admin: "Администратор"
+ moderator: "Модератор"
diff --git a/config/locales/client.sk.yml b/config/locales/client.sk.yml
index a9a547c5c25..689dea6cf44 100644
--- a/config/locales/client.sk.yml
+++ b/config/locales/client.sk.yml
@@ -28,6 +28,7 @@ sk:
millions: "{{number}}mil"
dates:
time: "h:mm a"
+ timeline_date: "MMM YYYY"
long_no_year: "MMM D h:mm a"
long_no_year_no_time: "MMM D"
full_no_year_no_time: "MMMM Do"
@@ -39,6 +40,7 @@ sk:
long_date_with_year_without_time: "MMM D, 'YY"
long_date_without_year_with_linebreak: "MMM D
LT"
long_date_with_year_with_linebreak: "MMM D, 'YY
LT"
+ wrap_ago: "pred %{date}"
tiny:
half_a_minute: "< 1m"
less_than_x_seconds:
@@ -49,10 +51,6 @@ sk:
one: "1s"
few: "1s"
other: "%{count}s"
- less_than_x_minutes:
- one: "< 1m"
- few: "< 1m"
- other: "< %{count}m"
x_minutes:
one: "1m"
few: "%{count}m"
@@ -153,6 +151,8 @@ sk:
disabled: 'stiahnuté %{when}'
topic_admin_menu: "akcie administrátora témy"
emails_are_disabled: "Odosielanie emailov bolo globálne vypnuté administrátorom. Žiadne emailové notifikácie nebudú odoslané."
+ bootstrap_mode_enabled: "Pre zjednodušenie spustenia Vašej novej stránky sa nachádzate v zavádzacom režime. Všetci noví používatelia budú mať pridelený stupeň dôvery 1 a budú mať zapnutý denný emailový výber aktualít. Toto bude automaticky vypnuté keď celkový počet používateľov presiahne %{min_users}."
+ bootstrap_mode_disabled: "Zavádzací režim bude zrušený v priebehu nasledujúcich 24 hodín."
s3:
regions:
us_east_1: "USA Východ (S. Virginia)"
@@ -166,11 +166,12 @@ sk:
ap_northeast_1: "Ázia Tichomorie (Tokio)"
ap_northeast_2: "Asia Pacific (Soul)"
sa_east_1: "Južná Amerika (Sao Paulo)"
+ cn_north_1: "Čína (Peking)"
edit: 'upraviť názov a kategóriu témy'
- not_implemented: "Táto funkcia ešte bohužiaľ nie je implementovaná."
+ not_implemented: "Ľutujeme, táto funkcia ešte nie je implementovaná."
no_value: "Nie"
yes_value: "Áno"
- generic_error: "Bohužiaľ nastala chyba."
+ generic_error: "Ľutujeme, nastala chyba."
generic_error_with_reason: "Nastala chyba: %{error}"
sign_up: "Registrácia"
log_in: "Prihlásenie"
@@ -238,7 +239,7 @@ sk:
bookmark: "Kliknutím vložíte záložku na prvý príspevok tejto témy"
unbookmark: "Kliknutím odstánite všetky záložky v tejto téme"
bookmarks:
- not_logged_in: "pre pridanie záložky sa musíte prihlásiť"
+ not_logged_in: "ľutujeme, pre pridanie záložky sa musíte prihlásiť"
created: "záložka bola pridaná"
not_bookmarked: "príspevok je prečítaný, kliknite pre pridanie záložky"
last_read: "toto je posledný prečítaný príspevok, kliknite pre pridanie záložky"
@@ -271,6 +272,8 @@ sk:
undo: "Späť"
revert: "Vrátiť zmeny"
failed: "Nepodarilo sa"
+ switch_to_anon: "Vstúpiť do anonymného režimu"
+ switch_from_anon: "Opustiť anonymný režim"
banner:
close: "Zamietnuť tento banner."
edit: "Upraviť tento banner >>"
@@ -294,7 +297,7 @@ sk:
few: "Téma má {{count}} príspevky čakajúce na schválenie"
other: "Téma má {{count}} príspevkov čakajúcich na schválenie"
confirm: "Uložiť zmeny"
- delete_prompt: "Táto akcia zmaže všetky príspevky, zablokuje e-mail a IP adresu užívateľa %{username}. Ste si istý, že chcete zmazať tohto užívateľa? "
+ delete_prompt: "Táto akcia zmaže všetky príspevky, zablokuje e-mail a IP adresu používateľa %{username}. Ste si istý, že chcete zmazať tohto používateľa? "
approval:
title: "Príspevok vyžaduje schválenie"
description: "Váš príspevok sme obdžali, ale skôr než bude zverejnený musí byť schválený moderátorom. Prosíme o trpezlivosť."
@@ -310,9 +313,9 @@ sk:
you_replied_to_post: "Vy ste odpovedali na {{post_number}}"
user_replied_to_topic: "{{user}} odpovedal na tému"
you_replied_to_topic: "Vy ste odpovedali natému"
- user_mentioned_user: "{{user}} spomenul {{another_user}}"
- user_mentioned_you: "{{user}} spomenul Vás"
- you_mentioned_user: "Vy ste spomenuli {{another_user}}"
+ user_mentioned_user: "{{user}} zmienil {{another_user}}"
+ user_mentioned_you: "{{user}} zmienil Vás"
+ you_mentioned_user: "Vy ste zmienili {{another_user}}"
posted_by_user: "Príspevok od {{user}}"
posted_by_you: "Príspevok od Vás"
sent_by_user: "Poslané od {{user}}"
@@ -322,6 +325,8 @@ sk:
title: "Používatelia"
likes_given: "Rozdané"
likes_received: "Prijaté"
+ topics_entered: "Zobrazených"
+ topics_entered_long: "Zobrazených tém"
time_read: "Čas strávený čítaním"
topic_count: "Témy"
topic_count_long: "Vytvorených tém"
@@ -333,16 +338,10 @@ sk:
posts_read: "Prečítané"
posts_read_long: "Prečítaných príspevkov"
total_rows:
- one: "1 užívateľ"
- few: "%{count} užívatelia"
- other: "%{count} užívateľov"
+ one: "1 používateľ"
+ few: "%{count} používatelia"
+ other: "%{count} používateľov"
groups:
- empty:
- posts: "Neexistuje žiadny príspevok od člena tejto skupiny."
- members: "Táto skupina neobsahuje žiadnych členov."
- mentions: "Táto skupina nieje nikde spomenutá."
- messages: "Neexistujú žiadne správy pre túto skupinu."
- topics: "Neexistuje žiadna téma od členov tejto skupiny."
add: "Pridať"
selector_placeholder: "Pridať členov"
owner: "vlastník"
@@ -352,27 +351,33 @@ sk:
few: "skupiny"
other: "skupiny"
members: "Členovia"
+ topics: "Témy"
posts: "Príspevky"
+ mentions: "Zmienky"
+ messages: "Správy"
alias_levels:
- title: "Kto môže poslať správu a @uváadzať túto skupinu?"
+ title: "Kto môže poslať správu a @zmieniť túto skupinu?"
nobody: "Nikto"
only_admins: "Iba administrátori"
mods_and_admins: "Iba moderátori a administrátori"
members_mods_and_admins: "Iba členovia skupiny, moderátori a administrátori"
everyone: "Každý"
trust_levels:
- title: "Stupeň dôvery automaticky pridelený členom po ich pridaní:"
+ title: "Stupeň dôvery automaticky udelený členom po ich pridaní:"
none: "Žiadny"
notifications:
watching:
title: "Pozerať"
description: "Budete upozornený na každý nový príspevok vo všetkých správach a zobrazí sa počet nových odpovedí."
+ watching_first_post:
+ title: "Pozerať prvý príspevok"
+ description: "Budete upozornený iba na prvý príspevok v každej téme v tejto skupine."
tracking:
title: "Sledovať"
- description: "Budete upozornený ak niekto spomenie Vaše @meno alebo Vám odpovie a zobrazí sa počet nových odpovedí."
+ description: "Budete upozornený ak niekto zmieni Vaše @meno alebo Vám odpovie a zobrazí sa počet nových odpovedí."
regular:
title: "Bežný"
- description: "Budete upozornený ak niekto spomenie Vaše @meno alebo Vám odpovie."
+ description: "Budete upozornený ak niekto zmieni Vaše @meno alebo Vám odpovie."
muted:
title: "Ignorovaný"
description: "Nikdy nebudete upozornení na nič ohľadom nových tém v tejto skupine."
@@ -409,16 +414,14 @@ sk:
latest_by: "najnovšie podľa"
toggle_ordering: "zmeniť radenie"
subcategories: "Podkategórie"
- topic_stats: "Počet nových tém."
+ topic_sentence:
+ one: "1 téma"
+ few: "%{count} témy"
+ other: "%{count} tém"
topic_stat_sentence:
one: "%{count} nová téma za posledných %{unit}."
few: "%{count} nové témy za posledných %{unit}."
other: "%{count} nových tém za posledných %{unit}."
- post_stats: "Počet nových príspevkov."
- post_stat_sentence:
- one: "%{count} nový príspevok za posledných %{unit}."
- few: "%{count} nové príspevky za posledných %{unit}."
- other: "%{count} nových príspevkov za posledných %{unit}."
ip_lookup:
title: Vyhľadávanie podľa IP adresy
hostname: Hostname
@@ -441,7 +444,6 @@ sk:
profile: "Profil"
mute: "Ignorovať"
edit: "Upraviť nastavenia"
- download_archive: "Stiahnutie mojich prípevkov"
new_private_message: "Nová správa"
private_message: "Správa"
private_messages: "Správy"
@@ -456,17 +458,18 @@ sk:
statistics: "Štatistiky"
desktop_notifications:
label: "Upozornenia na pracovnej ploche"
- not_supported: "Tento prehliadač nepodporuje upozornenia. Prepáčte."
+ not_supported: "Ľutujeme, tento prehliadač nepodporuje upozornenia."
perm_default: "Zapnúť upozornenia"
perm_denied_btn: "Prístup zamietnutý"
perm_denied_expl: "Povolenie pre zobrazenie notifikácií ste zakázali. Notifikácie povolíte v nastaveniach vášho prehliadača."
disable: "Zakázať upozornenia"
enable: "Povoliť upozornenia"
each_browser_note: "Poznámka: Toto nastavenie musíte zmeniť v každom používanom prehliadači."
+ dismiss_notifications: "Zahodiť všetko"
dismiss_notifications_tooltip: "Označiť všetky neprečítané upozornenia ako prečítané"
disable_jump_reply: "Neskočiť na môj príspevok po odpovedi"
dynamic_favicon: "Zobraziť počet nových/upravených tém na ikone prehliadača"
- external_links_in_new_tab: "Otvoriť všekty externé odkazy v novej záložke"
+ external_links_in_new_tab: "Otvárať všekty externé odkazy na novej karte"
enable_quoting: "Umožniť odpoveď s citáciou z označeného textu"
change: "zmeniť"
moderator: "{{user}} je moderátor"
@@ -477,8 +480,26 @@ sk:
suspended_notice: "Tento používateľ je suspendovaný do {{date}}"
suspended_reason: "Dôvod:"
github_profile: "Github"
- watched_categories: "Sledované"
+ email_activity_summary: "Zhrnutie aktivít"
+ mailing_list_mode:
+ label: "Režim mailing listu"
+ enabled: "Zapnúť režim mailing listu"
+ daily: "Posielať denné aktualizácie"
+ individual: "Pošli email pri každom novom príspevku"
+ many_per_day: "Pošli mi email pri každom novom príspevku (cca {{dailyEmailEstimate}} denne)"
+ few_per_day: "Pošli mi email pri každom novom príspevku (cca 2 denne)"
+ tag_settings: "Štítky"
+ watched_tags: "Pozerané"
+ watched_tags_instructions: "Budete automaticky pozerať všetky témy s týmito štítkami. Budete upozornený na všetky nové príspevky a témy, a zároveň bude vedľa témy zobrazený počet nových príspevkov."
+ tracked_tags: "Sledované"
+ tracked_tags_instructions: "Budete automaticky sledovať všetky témy s týmito štítkami. Počet nových príspevkov sa bude zobrazovať vedľa témy."
+ muted_tags: "Stíšené"
+ watched_categories: "Pozerané"
+ watched_categories_instructions: "Budete automaticky pozerať všetky témy v týchto kategóriách. Budete upozornený na všetky nové príspevky a témy, a zároveň bude vedľa témy zobrazený počet nových príspevkov."
tracked_categories: "Sledované"
+ tracked_categories_instructions: "Budete automaticky sledovať všetky témy v tejto kategórii. Počet nových príspevkov sa bude zobrazovať vedľa témy."
+ watched_first_post_categories: "Pozerať prvý príspevok"
+ watched_first_post_tags: "Pozerať prvý príspevok"
muted_categories: "Ignorovaný"
muted_categories_instructions: "Nebudete informovaní o udalostiach v nových témach týchto kategórií. Tieto témy sa zároveň nebudú zobrazovať v zozname posledných udalostí."
delete_account: "Vymazať môj účet"
@@ -489,8 +510,13 @@ sk:
admin_delete: "Vymazať"
users: "Používatelia"
muted_users: "Ignorovaný"
- muted_users_instructions: "Pozastaviť všetky notifikácie od týchto užívateľov."
+ muted_users_instructions: "Pozastaviť všetky notifikácie od týchto používateľov."
muted_topics_link: "Zobraziť umlčané témy"
+ watched_topics_link: "Zobraziť pozerané témy"
+ apps: "Appky"
+ revoke_access: "Odvolať prístup"
+ undo_revoke_access: "Zrušiť odvolanie prístupu"
+ api_approved: "Schválený:"
staff_counters:
flags_given: "nápomocné značky"
flagged_posts: "označkované príspevky"
@@ -516,14 +542,16 @@ sk:
set_password: "Nastaviť heslo"
change_about:
title: "Upraviť O mne"
+ error: "Nastala chyba pri zmene tejto hodnoty."
change_username:
- title: "Zmeniť užívateľské meno"
- taken: "Sorry, toto užívateľské meno je obsadené."
- error: "Pri zmene užívateľského mena prišlo k chybe."
- invalid: "Toto užívateľské meno nie je platné. Musí obsahovať iba znaky a čísla."
+ title: "Zmeniť používateľské meno"
+ confirm: "Ak zmeníte svoje používateľské meno, všetky predchádzajúce citácie Vašich príspevkov a všetky @zmienky búdú porušené. Ste si absolútne istý, že to chcete?"
+ taken: "Ľutujeme, toto používateľské meno je obsadené."
+ error: "Pri zmene používateľského mena prišlo k chybe."
+ invalid: "Toto používateľské meno nie je platné. Musí obsahovať iba znaky a čísla."
change_email:
title: "Zmeniť email"
- taken: "Prepáčte, tento email je už obsadený."
+ taken: "Ľutujeme, tento email nie je k dispozícii."
error: "Pri zmene emailu nastala chyba. Je možné, že je email už použitý?"
success: "Na email sme odoslali správu. Nasledujte prosím inštrukcie pre potvrdenie."
change_avatar:
@@ -562,18 +590,18 @@ sk:
too_short: "Vaše meno je prikrátke"
ok: "Vaše meno je v poriadku"
username:
- title: "Užívateľské meno"
+ title: "Používateľské meno"
instructions: "Unikátne, bez medzier, krátke"
- short_instructions: "Ostatní vás môžu označiť ako @{{username}}"
- available: "Vaše užívateľské meno je voľné"
- global_match: "Email zodpovedá registrovanému užívateľskému menu"
+ short_instructions: "Ostatní vás môžu zmieniť ako @{{username}}"
+ available: "Vaše používateľské meno je voľné"
+ global_match: "Email zodpovedá registrovanému používateľskému menu"
global_mismatch: "Už zaregistrované. Skúste {{suggestion}}?"
not_available: "Nie je k dispozícii. Skúste {{suggestion}}?"
- too_short: "Vaše užívateľské meno je prikrátke"
- too_long: "Vaše užívateľské meno je pridlhé"
- checking: "Kontrolujeme dostupnosť užívateľského meno"
- enter_email: 'Užívateľské meno nájdené, zadajte zodpovedajúci email'
- prefilled: "Email zodpovedá tomuto registrovanému užívateľskému menu"
+ too_short: "Vaše používateľské meno je prikrátke"
+ too_long: "Vaše používateľské meno je pridlhé"
+ checking: "Kontrolujeme dostupnosť používateľského meno"
+ enter_email: 'Používateľské meno nájdené, zadajte zodpovedajúci email'
+ prefilled: "Email zodpovedá tomuto registrovanému používateľskému menu"
locale:
title: "Jazyk rozhrania"
instructions: "Jazyk úžívateľského rozhrania. Zmení sa po obnovení stránky."
@@ -587,7 +615,7 @@ sk:
log_out: "Odhlásiť sa"
location: "Poloha"
card_badge:
- title: "Odznak karty užívateľa"
+ title: "Odznak karty používateľa"
website: "Webová stránka"
email_settings: "Email"
like_notification_frequency:
@@ -604,7 +632,7 @@ sk:
every_three_days: "každé tri dni"
weekly: "týždenne"
every_two_weeks: "každé dva týždne"
- email_direct: "Pošlite mi email ak ma niekto cituje, odpovie na môj príspevok, spomenie moje @užívateľské meno alebo ma pozve do témy."
+ email_direct: "Pošlite mi email ak ma niekto cituje, odpovie na môj príspevok, zmieni moje @meno alebo ma pozve do témy."
email_private_messages: "Pošlite mi email keď mi niekto pošle správu"
email_always: "Pošlite mi emailovú notifikáciu aj keď som aktívny na stránke"
other_settings: "Ostatné"
@@ -631,7 +659,7 @@ sk:
invited:
search: "začni písať pre hľadanie pozvánok"
title: "Pozvánky"
- user: "Pozvaný užívateľ"
+ user: "Pozvaný používateľ"
sent: "Odoslané"
none: "Nemáte žiadne čakajúce pozvánky."
truncated:
@@ -651,19 +679,17 @@ sk:
rescind: "Odstrániť"
rescinded: "Pozvánka odstránená"
reinvite: "Poslať pozvánku znovu"
+ reinvite_all: "Poslať všetky pozvánky znovu"
reinvited: "Poslať pozvánku znovu"
+ reinvited_all: "Všetky pozvánky boli znovu poslané!"
time_read: "Doba čítania"
days_visited: "Dní na stránke"
account_age_days: "Vek účtu v dňoch"
create: "Poslať Pozvánku"
generate_link: "Kopírovať Odkaz Pozvánky"
- generated_link_message: '
Odkaz pre pozvánku bol úspešne vytvorený!
Odkaz je platný iba pre túto adresu: %{invitedEmail}
' bulk_invite: - none: "Zatiaľ ste tu nikoho nepozvali. Môžete odosielať pozvánky individuálne alebo pozvať skupinu ľudí naraz pomocou nahratia súboru." text: "Hromadná pozvánka zo súboru" - uploading: "Prebieha nahrávanie..." success: "Súbor bol úspešne odoslaný. Keď sa nahrávanie dokončí, budete na to upozornený cez správu." - error: "Pri nahrávaní '{{filename}}' sa vyskytla chyba: {{message}}" password: title: "Heslo" too_short: "Vaše heslo je príliš krátke." @@ -673,14 +699,52 @@ sk: ok: "Vaše heslo je v poriadku." instructions: "Minimálne %{count} znakov." summary: - title: "Sumarizácia" + title: "Zhrnutie" stats: "Štatistiky" + time_read: "doba čítania" + topic_count: + one: "vytvorená téma" + few: "vytvorené témy" + other: "vytvorených tém" + post_count: + one: "vytvorený príspevok" + few: "vytvorené príspevky" + other: "vytvorených príspevkov" + likes_given: + one: " rozdaný" + few: " rozdané" + other: " rozdaných" + likes_received: + one: " získaný" + few: " získané" + other: " získaných" + days_visited: + one: "deň na stránke" + few: "dni na stránke" + other: "dní na stránke" + posts_read: + one: "prečítaný príspevok" + few: "prečítané príspevky" + other: "prečítaných príspevkov" + bookmark_count: + one: "záložka" + few: "záložky" + other: "záložiek" top_replies: "Najvýznamnejšie odpovede" + no_replies: "Zatiaľ žiadne odpovede." more_replies: "Viac odpovedí" top_topics: "Najvýznamnejšie témy" + no_topics: "Zatiaľ žiadne témy." more_topics: "Viac tém" top_badges: "Najvýznamnejšie odznaky" + no_badges: "Zatiaľ žiadne odznaky." more_badges: "Viac odznakov" + top_links: "Najvýznamnejšie odkazy" + no_links: "Zatiaľ žiadne odkazy." + most_liked_by: "Najviac lajkov od" + most_liked_users: "Najviac lajkované" + most_replied_to_users: "Najviac reakcií na" + no_likes: "Zatiaľ žiadne lajky." associated_accounts: "Prihlásenia" ip_address: title: "Posledná IP adresa" @@ -730,6 +794,8 @@ sk: too_few_topics_notice: "Začnime diskusiu! Je tu %{currentTopics} / %{requiredTopics} tém. Noví návštevníci potrebujú mať témy, ktoré môžu čítať a na ktoré budú reagovať." too_few_posts_notice: "Začnime diskusiu! Je tu %{currentPosts} / %{requiredPosts} príspevkov. Noví návštevníci potrebujú mať témy, ktoré môžu čítať a na ktoré budú reagovať." learn_more: "zistiť viac..." + all_time: 'celkovo' + all_time_desc: 'celkovo vytvorených tém' year: 'rok' year_desc: 'témy vytvorené za posledných 365 dní' month: 'mesiac' @@ -755,6 +821,8 @@ sk: value_prop: "Keď si vytvoríte účet, zapamätáme si čo ste čítali, takže sa môžete vrátiť presne tam, kde ste prestali. Okrem toho dostanete upozornenie tu, aj na váš e-mail, vždy keď pribudnú nové príspevky. A môžete označiť príspevky ktoré sa vám páčia. :heartbeat:" summary: enabled_description: "Pozeráte sa na zhrnutie tejto témy: najzaujímavejšie príspevky podľa výberu komunity." + description: "{{replyCount}} odpovedí." + description_time: "{{replyCount}} odpovedí s odhadovaným časom čítania {{readingTime}} minút." enable: 'Zhrnutie tejto témy' disable: 'Zobraziť všetky príspevky' deleted_filter: @@ -802,7 +870,7 @@ sk: authenticating: "Prebieha overovanie..." awaiting_confirmation: "Váš účet čaká na aktiváciu. Ak chcete zaslať aktivačný e-mail znova, použite odkaz pre zabudnuté heslo." awaiting_approval: "Váš účet zatiaľ nebol schválený členom tímu. Keď bude schválený, dostanete e-mail." - requires_invite: "Prepáčte, ale prístup k tomuto fóru majú iba pozvaní používatelia." + requires_invite: "Ľutujeme, ale prístup k tomuto fóru majú iba pozvaní používatelia." not_activated: "Systém vás nemôže prihlásiť. Na emailovú adresu {{sentTo}} sme vám poslali aktivačný email. Prosím, postupujte podľa inštrukcií na aktiváciu účtu, ktoré sú uvedené v tomto emaile." not_allowed_from_ip_address: "Nie je možné prihlásenie z tejto IP adresy." admin_not_allowed_from_ip_address: "Nie je možné prihlásenie ako admin z tejto IP adresy." @@ -832,6 +900,15 @@ sk: github: title: "pomocou GitHub" message: "Prihlásenie pomocou GitHub účtu (prosím uistite sa, že vyskakovacie okná sú povolené)" + emoji_set: + apple_international: "Apple/Medzinárodné" + google: "Google" + twitter: "Twitter" + emoji_one: "Emoji One" + win10: "Win10" + category_page_style: + categories_only: "Iba kategórie" + categories_and_latest_topics: "Kategórie a najnovšie témy" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' @@ -849,6 +926,10 @@ sk: saved_local_draft_tip: "uložené lokálne" similar_topics: "Vaša téma je podobná..." drafts_offline: "offline koncepty" + group_mentioned: + one: "Zmienením {{group}}, upozorníte 1 človeka – ste si istý?" + few: "Zmienením {{group}}, upozorníte {{count}} ľudí – ste si istý?" + other: "Zmienením {{group}}, upozorníte {{count}} ľudí – ste si istý?" error: title_missing: "Názov je povinný" title_too_short: "Názov musí mať minimálne {{min}} znakov" @@ -878,23 +959,28 @@ sk: show_preview: 'zobraziť náhľad »' hide_preview: '» skryť náhľad' quote_post_title: "Citovať celý príspevok" + bold_label: "B" bold_title: "Výrazne" bold_text: "výrazný text" + italic_label: "I" italic_title: "Zdôraznene" italic_text: "zdôraznený text" link_title: "Hyperlink" link_description: "tu zadaj popis odkazu" link_dialog_title: "Vložte hyperlink" link_optional_text: "nepovinný názov" + link_url_placeholder: "http://example.com" quote_title: "Úvodzovky" quote_text: "Úvodzovky" code_title: "Preformátovaný text" code_text: "Odsaďte preformátovaný text 4 medzerami" + paste_code_text: "sem zadajte alebo vložte kód" upload_title: "Upload" upload_description: "tu zadajte popis uploadu" olist_title: "Číslované odrážky" ulist_title: "Odrážky" list_item: "Položka zoznamu" + heading_label: "H" heading_title: "Nadpis" heading_text: "Nadpis" hr_title: "Horizonálny oddeľovač" @@ -902,7 +988,7 @@ sk: toggler: "skryť alebo zobraziť panel úprav" modal_ok: "OK" modal_cancel: "Zrušiť" - cant_send_pm: "Ľutujeme, nemôžete poslať správu pre %{username}." + cant_send_pm: "Ľutujeme, nemôžete poslať správu používateľovi %{username}." admin_options_title: "Nepovinné zamestnanecké nastavenia pre túto tému" auto_close: label: "Čas na automatické uzavretie témy:" @@ -914,12 +1000,13 @@ sk: units: "(# hodín)" examples: 'Zadajte počet hodín (24).' notifications: - title: "oznámenia o zmienkach pomocou @name, odpovede na vaše príspevky a témy, správy atď." + title: "oznámenia o zmienkach pomocou @meno, odpovede na Vaše príspevky a témy, správy, atď." none: "Notifikácie sa nepodarilo načítať" + empty: "Žiadne upozornenia sa nenašli." more: "zobraziť staršie upozornenia" total_flagged: "označených príspevkov celkom" - mentioned: "
{{username}} {{description}}
" - group_mentioned: "
{{username}} {{description}}
" + mentioned: "
{{username}} {{description}}
" + group_mentioned: "
{{username}} {{description}}
" quoted: "
{{username}} {{description}}
" replied: "
{{username}} {{description}}
" edited: "
{{username}} {{description}}
" @@ -929,13 +1016,13 @@ sk: invited_to_topic: "
{{username}} {{description}}
" invitee_accepted: "
{{username}} prijal Vaše pozvanie
" moved_post: "
{{username}} presunul {{description}}
" - granted_badge: "
Získal '{{description}}'
" + granted_badge: "
Získal '{{description}}'
" group_message_summary: one: "
{{count}} správa vo vašej {{group_name}} schránke
" few: "
{{count}} správy vo vašej {{group_name}} schránke
" other: "
{{count}} správ vo vašej {{group_name}} schránke
" alt: - mentioned: "Spomenutý od" + mentioned: "Zmienený od" quoted: "Citovaný od" replied: "Odpovedané" posted: "Príspevok od" @@ -947,11 +1034,11 @@ sk: invitee_accepted: "Pozvánka akceptovaná " moved_post: "Váš príspevok bol presunutý " linked: "Odkaz na váš príspevok" - granted_badge: "Priznaný odznak" + granted_badge: "Udelený odznak" group_message_summary: "Správy v skupinovej schránke" popup: - mentioned: '{{username}} vás spomenul v "{{topic}}" - {{site_title}}' - group_mentioned: '{{username}} vás spomenul v "{{topic}}" - {{site_title}}' + mentioned: '{{username}} Vás zmienil v "{{topic}}" - {{site_title}}' + group_mentioned: '{{username}} Vás zmienil v "{{topic}}" - {{site_title}}' quoted: '{{username}} vás citoval v "{{topic}}" - {{site_title}}' replied: '{{username}} vám odpovedal v "{{topic}}" - {{site_title}}' posted: '{{username}} prispel v "{{topic}}" - {{site_title}}' @@ -979,25 +1066,26 @@ sk: most_liked: "Najviac sa páčia" select_all: "Označ všetky" clear_all: "Odznač všetky" + too_short: "Vyhladávací termín je príliš krátky." result_count: one: "1 výsledok pre \"{{term}}\"" few: "{{count}} výsledky pre \"{{term}}\"" other: "{{count}} výsledkov pre \"{{term}}\"" - title: "hľadaj témy, príspevky, užívateľov, alebo kategórie" + title: "hľadaj témy, príspevky, používateľov, alebo kategórie" no_results: "Žiadne výsledky" no_more_results: "Nenašlo sa viac výsledkov" - search_help: Pomoc pri vyhľadávaní searching: "Vyhľadávam....." post_format: "#{{post_number}} podľa {{username}}" context: user: "Vyhľadávanie podľa @{{username}}" + category: "Vyhľadať kategóriu #{{category}}" topic: "Hľadaj v tejto téme" private_messages: "Hľadaj správy" hamburger_menu: "prejsť na iné témy, alebo kategórie" new_item: "nový" go_back: 'späť' - not_logged_in_user: 'užívateľská stránka so súhrnom aktivít a nastavení' - current_user: 'prejsť na Vašu uťívateľskú stránku' + not_logged_in_user: 'používateľská stránka so súhrnom aktivít a nastavení' + current_user: 'prejsť na Vašu používateľskú stránku' topics: bulk: unlist_topics: "Dôverné témy" @@ -1020,6 +1108,9 @@ sk: one: "Označíli ste 1 tému." few: "Označíli ste {{count}} tém.y" other: "Označíli ste {{count}} tém." + change_tags: "Zmeniť štítky" + choose_new_tags: "Vyberte pre tému nové štítky:" + changed_tags: "Štítky tém boli zmenené." none: unread: "Nemáte neprečítanú tému" new: "Nemáte žiadnu novú tému" @@ -1031,6 +1122,9 @@ sk: category: "V kategórii {{category}} nie je žiadna téma" top: "Nie sú žiadne populárne témy." search: "Nenašli sa žiadne výsledky" + educate: + new: '
Tu sa zobrazia Vaše nové témy.
V predvolenom nastavení sú témy považované za nové a zobrazí indikátor nové ak boli vytvorené za posledné 2 dni.
Môžete to zmeniť vo Vašichnastaveniach.
' + unread: '
Tu sa zobrazia Vaše neprečítané témy.
V predvolenom nastavení sú témy považované za neprečítané a zobrazí sa počet neprečítaných 1 ak ste:
Alebo ste explicitne nastavili sledovanie alebo pozeranie témy prostredníctvom ovládania upozornení na konci každej témy.
Môžte to zmeniť vo Vašich nastaveniach.
'
bottom:
latest: "Nie je už viac najnovšich tém."
hot: "Nie je už viac horúcich tém"
@@ -1046,7 +1140,10 @@ sk:
unsubscribe:
stop_notifications: "Teraz budete dostávať menej upozornení na {{title}}"
change_notification_state: "Váš súčasný stav upozornení je"
- filter_to: "{{post_count}} príspevkov k téme"
+ filter_to:
+ one: "1 príspevok k téme"
+ few: "{{count}} príspevky k téme"
+ other: "{{count}} príspevkov k téme"
create: 'Nová téma'
create_long: 'Vytvoriť novú tému'
private_message: 'Vytvoríť správu'
@@ -1070,14 +1167,14 @@ sk:
title: 'Témy'
invalid_access:
title: "Téma je súkromná"
- description: "Prepáčte, nemáte prístup k tejto téme!"
+ description: "Ľutujeme, nemáte prístup k tejto téme!"
login_required: "Musíte sa prihlásiť, aby ste videli túto tému."
server_error:
title: "Tému sa nepodarilo načítať"
- description: "Prepáčte, nepodarllo sa nám načítať túto tému, možno je problém s Vaším pripojením. Prosim skúste znova. Ak problém pretrváva, dajte nám vedieť"
+ description: "Ľutujeme, nepodarllo sa nám načítať túto tému, možno je problém s Vaším pripojením. Prosím, skúste to znova. Ak problém pretrváva, dajte nám vedieť."
not_found:
title: "Téma sa nenašla"
- description: "Prepáčte, hľadaná téma nebola nájdená. Nebola odstránená moderátorom?"
+ description: "Ľutujeme, hľadaná téma nebola nájdená. Možno bola odstránená moderátorom?"
total_unread_posts:
one: "máte 1 neprečítaný príspevok k tejto téme"
few: "máte {{count}} neprečítanépríspevky k tejto téme"
@@ -1112,51 +1209,57 @@ sk:
auto_close_title: 'Nastavenia automatického zatvárania'
auto_close_save: "Uložiť"
auto_close_remove: "Neuzatvárať túto tému automaticky"
- auto_close_immediate: "Posledný príspevok k téme je starý už %{hours} hodín, takže téma bude okamžite uzavretá. "
+ auto_close_immediate:
+ one: "Posledný príspevok k téme je starý už 1 hodinu, takže téma bude okamžite uzavretá. "
+ few: "Posledný príspevok k téme je starý už %{hours} hodiny, takže téma bude okamžite uzavretá. "
+ other: "Posledný príspevok k téme je starý už %{hours} hodín, takže téma bude okamžite uzavretá. "
+ timeline:
+ back: "Späť"
progress:
title: pozícia v téme
go_top: "na začiatok"
go_bottom: "na spodok"
go: "Choď"
jump_bottom: "choď na posledný príspevok"
+ jump_prompt: "choď na príspevok"
jump_bottom_with_number: "choď na príspevok číslo %{post_number}"
total: Všetkých príspevkov
current: tento príspevok
- position: "%{current} príspevok z %{total}"
notifications:
reasons:
- '3_6': 'Budete dostávať upozornenia, pretože sa pozeráte na túto kategóriu.'
- '3_5': 'Budete automaticky dostávať upozornenie pretože ste začali pozorovať túto tému.'
- '3_2': 'Budete dostávať upozornenia, pretože sa pozeráte na túto tému.'
+ '3_10': 'Budete dostávať upozornenia, pretože pozeráte štítok na tejto téme.'
+ '3_6': 'Budete dostávať upozornenia, pretože pozeráte túto kategóriu.'
+ '3_5': 'Budete automaticky dostávať upozornenie pretože ste začali pozerať túto tému.'
+ '3_2': 'Budete dostávať upozornenia, pretože pozeráte túto tému.'
'3_1': 'Budete dostávať upozornenia, pretože ste vytvorili túto tému.'
- '3': 'Budete dostávať upozornenia, pretože sa pozeráte na túto tému.'
+ '3': 'Budete dostávať upozornenia, pretože pozeráte túto tému.'
'2_8': 'Budete dostávať upozornenia, pretože sledujete túto kategóriu.'
'2_4': 'Budete dostávať upozornenia, pretože ste zaslali odpoveď na túto tému.'
'2_2': 'Budete dostávať upozornenia, pretože sledujete túto tému.'
'2': 'Budete dostávať upozornenia, pretože ste čítali túto tému.'
- '1_2': 'Budete upozornený ak niekto spomenie Vaše @meno alebo Vám odpovie.'
- '1': 'Budete upozornený ak niekto spomenie Vaše @meno alebo Vám odpovie.'
+ '1_2': 'Budete upozornený ak niekto zmieni Vaše @meno alebo Vám odpovie.'
+ '1': 'Budete upozornený ak niekto zmieni Vaše @meno alebo Vám odpovie.'
'0_7': 'Ignorujete všetky upozornenia v tejto kategórii.'
'0_2': 'Ignorujete všetky upozornenia k tejto téme.'
'0': 'Ignorujete všetky upozornenia k tejto téme.'
watching_pm:
title: "Pozerať"
- description: "Budete upozornený na každú novu dopoveť na túto správu, a zobrazí sa počet nových odpovedí"
+ description: "Budete upozornený na každú novú odpoveď na túto správu a zobrazí sa počet nových odpovedí."
watching:
title: "Pozerať"
- description: "Budete upozornený na každú novu dopoveť na túto tému, a zobrazí sa počet nových odpovedí"
+ description: "Budete upozornený na každú novu odpoveď na túto tému a zobrazí sa počet nových odpovedí."
tracking_pm:
title: "Sledovať"
- description: "Zobrazí počet nových odpovedí na túto správu. Budete upozornený ak niekto spomenie Vaše @meno alebo Vám odpovie."
+ description: "Zobrazí počet nových odpovedí na túto správu. Budete upozornený ak niekto zmieni Vaše @meno alebo Vám odpovie."
tracking:
title: "Sledovať"
- description: "Zobrazí počet nových odpovedí na túto tému. Budete upozornený ak niekto spomenie Vaše @meno alebo Vám odpovie."
+ description: "Zobrazí počet nových odpovedí na túto tému. Budete upozornený ak niekto zmieni Vaše @meno alebo Vám odpovie."
regular:
title: "Bežný"
- description: "Budete upozornený ak niekto spomenie Vaše @meno alebo Vám odpovie."
+ description: "Budete upozornený ak niekto zmieni Vaše @meno alebo Vám odpovie."
regular_pm:
title: "Bežný"
- description: "Budete upozornený ak niekto spomenie Vaše @meno alebo Vám odpovie."
+ description: "Budete upozornený ak niekto zmieni Vaše @meno alebo Vám odpovie."
muted_pm:
title: "Stíšené"
description: "Nikdy nebudete upozornení na nič ohľadom tejto správy"
@@ -1177,6 +1280,8 @@ sk:
invisible: "Skyť"
visible: "Zobraziť"
reset_read: "Zrušiť načítané údaje"
+ make_public: "Spraviť verejnou témou"
+ make_private: "Spraviť súkromnou správou"
feature:
pin: "Pripni tému"
unpin: "Odopni tému"
@@ -1199,7 +1304,7 @@ sk:
feature_topic:
title: "Vyzdvihni túto tému"
pin: "Zobrazuj túto tému na vrchu {{categoryLink}} kategórie do"
- confirm_pin: "Máte už {{count}} pripnutých tém. Príliš veľa pripnutých tém môže byť na príťaž pre nových a anonymných užívateľov. Ste si istý že chcete pripnúť ďalšiu tému v tejto kategórii?"
+ confirm_pin: "Máte už {{count}} pripnutých tém. Príliš veľa pripnutých tém môže byť na príťaž pre nových a anonymných používateľov. Ste si istý že chcete pripnúť ďalšiu tému v tejto kategórii?"
unpin: "Zruš túto tému z vrcholu kategórie {{categoryLink}} . "
unpin_until: "Zruš túto tému z vrcholu kategórie {{categoryLink}} , alebo počkaj do %{until}."
pin_note: "Užívatelia si môžu sami odopnúť tému "
@@ -1210,7 +1315,7 @@ sk:
few: "Témy pripnuté ku {{categoryLink}}: {{count}}"
other: "Tém pripnutých k {{categoryLink}}: {{count}}"
pin_globally: "Zobrazuj túto tému na vrchu všetkých zoznamov tém do"
- confirm_pin_globally: "Máte už {{count}} globálne pripnutých tém. Príliš veľa pripnutých tém môže byť na príťaž pre nových a anonymných užívateľov. Ste si istý že chcete pripnúť ďalšiu globálnu tému?"
+ confirm_pin_globally: "Máte už {{count}} globálne pripnutých tém. Príliš veľa pripnutých tém môže byť na príťaž pre nových a anonymných používateľov. Ste si istý že chcete pripnúť ďalšiu globálnu tému?"
unpin_globally: "Zruš túto tému z vrcholu všetkých zoznamov tém. "
unpin_globally_until: "Zruš túto tému z vrcholu všetkých zoznamov tém, alebo počkaj do %{until}."
global_pin_note: "Užívatelia si môžu sami odopnúť tému."
@@ -1227,11 +1332,11 @@ sk:
inviting: "Pozývam..."
invite_private:
title: 'Pozvať do konverzácie'
- email_or_username: "Email, alebo užívateľské meno pozvaného"
- email_or_username_placeholder: "emailova adresa alebo uťívateľské meno"
+ email_or_username: "Email, alebo používateľské meno pozvaného"
+ email_or_username_placeholder: "emailova adresa alebo používateľské meno"
action: "Pozvi"
- success: "Pozvali sme tohoto uťívateľa aby sa podieľal na tejto správe"
- error: "Prepáčte, pri pozývaní tohto užívateľa nastala chyba."
+ success: "Pozvali sme tohoto používateľa aby sa podieľal na tejto správe"
+ error: "Ľutujeme, pri pozývaní tohto používateľa nastala chyba."
group_name: "názov skupiny"
controls: "Ovládacie prvky Témy"
invite_reply:
@@ -1240,15 +1345,15 @@ sk:
action: 'Pošli pozvánku'
help: 'pozvite ostatných k tejto téme prostredníctvom emailu, alebo upozornení'
to_forum: "Pošleme krátký email dovoľujúci Vášmu priateľovi okamžité pripojenie kliknutím na odkaz bez potreby prihlasovania"
- sso_enabled: "Zadajte uťívateľské meno osoby, ktorú by ste radi pozvali k tejto téme"
- to_topic_blank: "Zadajte uťívateľské meno alebo email osoby, ktorú by ste radi pozvali k tejto téme"
+ sso_enabled: "Zadajte používateľské meno osoby, ktorú by ste radi pozvali k tejto téme"
+ to_topic_blank: "Zadajte používateľské meno alebo email osoby, ktorú by ste radi pozvali k tejto téme"
to_topic_email: "Zadali ste emailovú adresu. Pošleme pozvánku ktorá umožní Vášmu priateľovi okamžitú odpoveď k tejto téme."
- to_topic_username: "Zadali ste užívateľské meno. Pošleme mu pozvánku s odkazom na túto tému."
- to_username: "Zadajte užívateľské meno osoby, ktorú chcete pozvať. Pošleme mu pozvánku s odkazom na túto tému."
+ to_topic_username: "Zadali ste používateľské meno. Pošleme mu pozvánku s odkazom na túto tému."
+ to_username: "Zadajte používateľské meno osoby, ktorú chcete pozvať. Pošleme mu pozvánku s odkazom na túto tému."
email_placeholder: 'name@example.com'
- success_email: "Poslali sme email s pozvánkou na {{emailOrUsername}}. Upozorníme vas keď bude pozvánka použítá. Svoje pozvánky môžte sledovať v tabuľke pozvánok vo svojom užívateľskom profile."
- success_username: "Pozvali sme tohoto uťívateľa aby sa podieľal na tejto téme."
- error: "Prepáčte, Nepodarilo sa nám pozvať túto osobu. Nebola už náhodou pozvaná ? (Počet opakovaných pozvánok je obmedzený)"
+ success_email: "Poslali sme email s pozvánkou na {{emailOrUsername}}. Upozorníme vas keď bude pozvánka použítá. Svoje pozvánky môžete sledovať na karte pozvánok vo svojom používateľskom profile."
+ success_username: "Pozvali sme tohoto používateľa aby sa podieľal na tejto téme."
+ error: "Ľutujeme, nepodarilo sa nám pozvať túto osobu. Nebola už náhodou pozvaná? (Počet opakovaných pozvánok je obmedzený)"
login_reply: 'Príhláste sa ak chcete odpovedať'
filters:
n_posts:
@@ -1273,17 +1378,20 @@ sk:
one: "Prosím vyberte tému do ktorej chcete presunúť tento príspevok."
few: "Prosím vyberte tému do ktorej chcete presunúť tieto {{count}} príspevky."
other: "Prosím vyberte tému do ktorej chcete presunúť týchto {{count}} príspevkov."
+ merge_posts:
+ title: "Spojiť označené príspevky"
+ action: "spojiť označené príspevky"
change_owner:
title: "Zmeň vlástníka príspevkov"
action: "zmeň vlastníka"
error: "Nastala chyba pri zmene vlastníka príspevkov."
label: "Príspevky nového vlastníka"
- placeholder: "užívateľske meno nového vlastnika"
+ placeholder: "používateľske meno nového vlastnika"
instructions:
one: "Prosím vyberte nového vlastníka príspevku vytvoreného {{old_user}}."
few: "Prosím vyberte nového vlastníka {{count}} príspevkov vytvorených {{old_user}}."
other: "Prosím vyberte nového vlastníka {{count}} príspevkov vytvorených {{old_user}}."
- instructions_warn: "Poznámka: Žiadne upozornenie o tomto príspevku nebude spätne zaslané novým užívateľom
Upozornenie: Momentálne nie sú prenášané žiadne dáta vťahujúce sa k príspevku na nových užívateľov. Používajte opatrne."
+ instructions_warn: "Poznámka: Žiadne upozornenie o tomto príspevku nebude spätne zaslané novým používateľom
Upozornenie: Momentálne nie sú prenášané žiadne dáta vťahujúce sa k príspevku na nových užívateľov. Používajte opatrne."
change_timestamp:
title: "Nastavte časovú značku"
action: "nastavte časovú značku"
@@ -1305,7 +1413,6 @@ sk:
post:
reply: " {{replyAvatar}} {{usernameLink}}"
reply_topic: " {{link}}"
- quote_reply: "citovať odpoveď"
edit: "Upravujete {{link}} {{replyAvatar}} {{username}}"
edit_reason: "Dôvod:"
post_number: "príspevok {{number}}"
@@ -1324,7 +1431,6 @@ sk:
one: "zobraziť skrytú odpoveď"
few: "zobraziť {{count}} skryté odpovede"
other: "zobraziť {{count}} skrytých odpovedí"
- more_links: "ešte {{count}} "
unread: "Príspevok je neprečítaný."
has_replies:
one: "{{count}} Odpoveď"
@@ -1347,7 +1453,9 @@ sk:
create: "Ľutujeme, pri vytváraní príspevku nastala chyba. Prosím, skúste znovu."
edit: "Ľutujeme, pri úprave príspevku nastala chyba. Prosím, skúste znovu."
upload: "Ľutujeme, pri nahrávaní súboru nastala chyba. Prosím, skúste znovu."
- too_many_uploads: "Ľutujeme, ale naraz je možné nahrať len jeden súbor."
+ file_too_large: "Ľutujeme, daný súbor je príliš veľký (maximálna veľkosť je {{max_size_kb}}kB). Čo takto nahrať ten súbor na zdielané cloudové úložisko a nazdielať odkaz?"
+ too_many_uploads: "Ľutujeme, ale naraz je možné nahrať iba jeden súbor."
+ too_many_dragged_and_dropped_files: "Ľutujeme, ale naraz je možné nahrať iba 10 súborov."
upload_not_authorized: "Ľutujeme, súbor, ktorý sa pokúšate nahrať nemá povolenú príponu (povolené prípony sú: {{authorized_extensions}})."
image_upload_not_allowed_for_new_user: "Ľutujeme, noví použivatelia nemôžu nahrávať obrázky."
attachment_upload_not_allowed_for_new_user: "Ľutujeme, noví používatelia nemôžu nahrávať prílohy."
@@ -1395,14 +1503,6 @@ sk:
one: "Zrušiť označenie"
few: "Zrušiť označenia"
other: "Zrušiť označenia"
- it_too:
- off_topic: "Tiež označ"
- spam: "Tiež označ"
- inappropriate: "Tiež označ"
- custom_flag: "Tiež označ"
- bookmark: "Tiež vytvoriť záložku"
- like: "Tiež sa mi páči"
- vote: "Tiež hlasujem za"
undo:
off_topic: "Zruš označenie"
spam: "Zruš označenie"
@@ -1417,7 +1517,7 @@ sk:
spam: "Označíli ste to ako spam"
inappropriate: "Označíli ste to ako nevhodné"
notify_moderators: "Označíli ste to pre moderátora"
- notify_user: "Poslali ste správu užívateľovi "
+ notify_user: "Poslali ste správu používateľovi "
bookmark: "Vytvorili ste si záložku na tento príspevok"
like: "Páči sa Vám to"
vote: "Hlasoval ste za tento príspevok"
@@ -1441,7 +1541,7 @@ sk:
notify_user:
one: "Vy a jedna ďalšia osoba poslala správu tomuto užívateľovi"
few: "Vy a ďalšie {{count}} osoby poslali správu tomuto užívateľovi"
- other: "Vy a ďalších {{count}} osôb poslalo správu tomuto užívateľovi"
+ other: "Vy a ďalších {{count}} osôb poslalo správu tomuto používateľovi"
bookmark:
one: "Vy a jedna ďalšia osoba si vytvorilo záložku na tento príspevok"
few: "Vy a ďalšie {{count}} osoby si vytvorili záložku na tento príspevok"
@@ -1472,9 +1572,9 @@ sk:
few: "{{count}} osoby to označili na moderovanie"
other: "{{count}} osôb to označilo na moderovanie"
notify_user:
- one: "1 osoba poslala správu tomuto užívateľovi"
- few: "{{count}} osoby poslali správu tomuto užívateľovi"
- other: "{{count}} osôb poslalo správu tomuto užívateľovi"
+ one: "1 osoba poslala správu tomuto používateľovi"
+ few: "{{count}} osoby poslali správu tomuto používateľovi"
+ other: "{{count}} osôb poslalo správu tomuto používateľovi"
bookmark:
one: "1 osoba si vytvorila záložku na tento príspevok"
few: "{{count}} osoby si vytvorili záložku na tento príspevok"
@@ -1522,6 +1622,11 @@ sk:
general: 'Všeobecné'
settings: 'Nastavenia'
topic_template: "Formulár témy"
+ tags: "Štítky"
+ tags_allowed_tags: "Štítky, ktoré môžu byť použité iba v tejto kategórii:"
+ tags_allowed_tag_groups: "Skupiny štítkov, ktoré môžu byť použité iba v tejto kategórii:"
+ tags_placeholder: "(Voliteľné) zoznam povolených štítkov"
+ tag_groups_placeholder: "(Voliteľné) zoznam povolených skupín štítkov"
delete: 'Odstrániť kategóriu'
create: 'Nová kategória'
create_long: 'Vytvoriť novú kategóriu'
@@ -1552,7 +1657,7 @@ sk:
auto_close_label: "Automaticky uzavrieť tému po:"
auto_close_units: "hodinách"
email_in: "Vlastná e-mailová adresa pre príchodziu poštu:"
- email_in_allow_strangers: "Prijímať emaily od anonymných užívateľov bez účtu"
+ email_in_allow_strangers: "Prijímať emaily od anonymných používateľov bez účtu"
email_in_disabled: "Vkladanie nových tém cez email je zablokované v Nastaveniach stránky. Ak chcete povoliť vkladanie nových téme cez email,"
email_in_disabled_click: 'povoľte nastavenie "email in"'
suppress_from_homepage: "Pozastaviť kategóriu z domovskej stránky."
@@ -1568,11 +1673,15 @@ sk:
notifications:
watching:
title: "Pozerať"
+ description: "Budete automaticky pozerať všetky témy v týchto kategóriách. Budete upozornený na každý nový príspevok v každej téme. Zároveň bude zobrazený počet nových odpovedí."
+ watching_first_post:
+ title: "Pozerať prvý príspevok"
tracking:
title: "Sledovať"
+ description: "Budete automaticky sledovať všetky témy v týchto kategóriách. Budete upozornený ak niekto zmieni Vaše @meno alebo Vám odpovie. Zároveň bude zobrazený počet nových odpovedí."
regular:
title: "Bežný"
- description: "Budete upozornený ak niekto spomenie Vaše @meno alebo Vám odpovie."
+ description: "Budete upozornený ak niekto zmieni Vaše @meno alebo Vám odpovie."
muted:
title: "Stíšené"
description: "Nikdy nebudete informovaní o udalostiach v nových témach týchto kategórií. Tieto témy sa zároveň nebudú zobrazovať v zozname posledných udalostí."
@@ -1581,14 +1690,15 @@ sk:
action: 'Označ príspevok'
take_action: "Vykonať akciu"
notify_action: 'Správa'
+ official_warning: 'Oficiálne varovanie'
delete_spammer: "Zmazať spammera"
- delete_confirm: "Idete vymazať %{posts} príspevky a %{topics} témy tohto užívateľa, zmazať jeho účet, zakázať prihlásenia z jeho IP adresy %{ip_address}, a pridať jeho email %{email} na zoznam trvalo zakázaných. Ste si istý, že tento užívateľ je skutočne spamer?"
yes_delete_spammer: "Áno, zmazať spammera"
ip_address_missing: "(nedostupné)"
hidden_email_address: "(skryté)"
submit_tooltip: "Odoslať súkromné označenie"
take_action_tooltip: "Dosiahnuť okamžite limit označení, namiesto čakania na ďalšie označenia od komunity"
cant: "Ľutujeme, ale tento príspevok sa teraz nedá označiť ."
+ notify_staff: 'Súkromne upozorniť zamestnancov'
formatted_name:
off_topic: "Je to mimo témy"
inappropriate: "Je to nevhodné"
@@ -1596,9 +1706,14 @@ sk:
custom_placeholder_notify_user: "Buďte konkrétny, buďte konštruktívny a buďte vždy milý."
custom_placeholder_notify_moderators: "Dajte nám vedieť, z čoho konkrétne máte obavy, a priložte príslušné odkazy a príklady, ak je to možné."
custom_message:
- at_least: "zadajte aspoň {{n}} znakov"
- more: "zostáva ešte {{n}} ..."
- left: "{{n}} zostáva"
+ more:
+ one: "ešte 1 ..."
+ few: "ešte {{count}} ..."
+ other: "ešte {{count}} ..."
+ left:
+ one: "1 zostáva"
+ few: "{{count}} zostávajú"
+ other: "{{count}} zostáva"
flagging_topic:
title: "Ďakujeme, že pomáhate udržiavať slušnosť v našej komunite!"
action: "Označ príspevok"
@@ -1607,10 +1722,16 @@ sk:
title: "Zhrnutie článku"
participants_title: "Častí prispievatelia"
links_title: "Populárne odkazy"
+ links_shown: "zobraz viac odkazov..."
clicks:
one: "%{count} kilk"
few: "%{count} kliky"
other: "%{count} klikov"
+ post_links:
+ title:
+ one: "1 ďalší"
+ few: "%{count} ďalšie"
+ other: "%{count} ďalších"
topic_statuses:
warning:
help: "Toto je oficiálne varovanie."
@@ -1634,7 +1755,6 @@ sk:
invisible:
help: "Táto téma je skrytá. Nebude zobrazená v zozname tém a prístup k nej bude možný len prostrednictvom priameho odkazu na ňu"
posts: "Príspevky"
- posts_lowercase: "príspevky"
posts_long: "v tejto téme je {{number}} príspevkov"
posts_likes_MF: |
Táto téma obsahuje {count, plural, one {1 odpoveď} other {# odpovedí}} {ratio, select,
@@ -1659,9 +1779,9 @@ sk:
likes_long: "v tejto téme je {{number}} \"Páči sa\""
users: "Používatelia"
users_lowercase:
- one: "užívateľ"
- few: "užívatelia"
- other: "užívatelia"
+ one: "používateľ"
+ few: "používatelia"
+ other: "používateľov"
category_title: "Kategória"
history: "História"
changed_by: "od {{author}}"
@@ -1709,7 +1829,7 @@ sk:
few: "{{count}} nové"
other: "{{count}} nových"
lower_title: "nový"
- title: "Nový"
+ title: "Nové"
title_with_count:
one: "Nová (1)"
few: "Nové ({{count}})"
@@ -1729,7 +1849,7 @@ sk:
other: "{{categoryName}} ({{count}})"
help: "najnovšie témy v kategórii {{categoryName}}"
top:
- title: "Vrch"
+ title: "Najvýznamnejšie"
help: "najaktívnejšie témy za posledný rok, mesiac, týždeň, alebo deň"
all:
title: "Za celú dobu"
@@ -1755,6 +1875,153 @@ sk:
full: "Vytvor / Odpovedz / Zobraz"
create_post: "Odpovedz / Zobraz"
readonly: "Zobraz"
+ lightbox:
+ download: "stiahnuť"
+ keyboard_shortcuts_help:
+ title: 'Klávesové skratky'
+ jump_to:
+ title: 'Choď na'
+ home: 'g, h Domov'
+ latest: 'g, l Najnovšie'
+ new: 'g, n Nové'
+ unread: 'g, u Neprečítané'
+ categories: 'g, c Kategórie'
+ top: 'g, t Najvýznamnejšie'
+ bookmarks: 'g, b Záložky'
+ profile: 'g, p Profil'
+ messages: 'g, m Správy'
+ navigation:
+ title: 'Navigácia'
+ jump: '# Choď na príspevok #'
+ back: 'u Späť'
+ up_down: 'k/j Presuň označené ↑ ↓'
+ open: 'o or EnterOtvoriť zvolenú tému'
+ next_prev: 'shift+j/shift+k Nasledujúca/predchádzajúca sekcia'
+ application:
+ title: 'Aplikácia'
+ create: 'c Vytvoriť novú tému'
+ notifications: 'n Otvor upozornenia'
+ hamburger_menu: '= Otvoriť hamburger menu'
+ user_profile_menu: 'p Otvor užívateľské menu'
+ show_incoming_updated_topics: '. Zobraz aktualizované témy'
+ search: '/ Hľadať'
+ help: '? Pomoc s klávesovými skratkami'
+ dismiss_new_posts: 'x, r Zahodiť Nové/Príspevky'
+ dismiss_topics: 'x, t Zahodiť témy'
+ log_out: 'shift+z shift+z Odhlásiť sa'
+ actions:
+ title: 'Akcie'
+ bookmark_topic: 'f Prepnúť zazáložkovanie témy'
+ pin_unpin_topic: 'shift+p Pripnúť/Odopnúť tému'
+ share_topic: 'shift+s Zdielať tému'
+ share_post: 's Zdielať príspevok'
+ reply_as_new_topic: 't Odpovedať formou prepojenej témy'
+ reply_topic: 'shift+r Odpovedať na tému'
+ reply_post: 'r Odpovedať na príspevok'
+ quote_post: 'q Citovať príspevok'
+ like: 'l Označiť príspevok "Páči sa"'
+ flag: '! Nahlásiť príspevok '
+ bookmark: 'b Pridať príspevok do záložiek'
+ edit: 'e Upraviť príspevok'
+ delete: 'd Zmazať príspevok'
+ mark_muted: 'm, m Umlčať tému'
+ mark_regular: 'm, r Obyčajná (preddefinovaná) téma'
+ mark_tracking: 'm, t Sledovať tému'
+ mark_watching: 'm, w Pozerať tému'
+ badges:
+ earned_n_times:
+ one: "Získal tento odkaz 1-krát"
+ few: "Získal tento odkaz %{count}-krát"
+ other: "Získal tento odkaz %{count}-krát"
+ granted_on: "Udelený dňa %{date}"
+ others_count: "Ostatní s týmto odznakom (%{count})"
+ title: Odznaky
+ allow_title: "dostupný názov"
+ granted:
+ one: "1 udelený"
+ few: "%{count} udelené"
+ other: "%{count} udelených"
+ none: "<žiadne>"
+ badge_grouping:
+ getting_started:
+ name: Začíname
+ community:
+ name: Komunita
+ trust_level:
+ name: Stupeň dôvery
+ other:
+ name: Ostatné
+ posting:
+ name: Prispievanie
+ tagging:
+ all_tags: "Všetky štítky"
+ selector_all_tags: "všetky štítky"
+ selector_no_tags: "žiadne štítky"
+ changed: "zmenené štítky:"
+ tags: "Štítky"
+ choose_for_topic: "Zvoľte voliteľné štítky pre túto tému"
+ delete_tag: "Zmazať štítok"
+ delete_confirm: "Ste si istý, že chcete zmazať tento štítok?"
+ rename_tag: "Premenovať štítok"
+ rename_instructions: "Vyberte nové meno pre štítok:"
+ sort_by: "Zoradiť podľa:"
+ sort_by_count: "počtu"
+ sort_by_name: "mena"
+ manage_groups: "Spravovať skupinu štítkov"
+ manage_groups_description: "Zadefinujte skupiny pre usporiadanie štítkov"
+ notifications:
+ watching:
+ title: "Pozerať"
+ description: "Budete automaticky pozerať všetky témy s týmto štítkom. Budete upozornený na všetky nové príspevky a témy, navyše počet neprečítaných a nových príspevok bude zobrazený pri téme."
+ watching_first_post:
+ title: "Pozerať prvý príspevok"
+ description: "Budete upozornený iba na prvý príspevok v každej téme s týmto štítkom."
+ tracking:
+ title: "Sledovať"
+ description: "Budete automaticky sledovať všetky témy s týmto štítkom. Počet neprečítaných a nových príspevkov sa bude zobrazovať vedľa témy."
+ regular:
+ title: "Bežné"
+ description: "Budete upozornený ak niekto zmieni Vaše @meno alebo odpovie na Váš príspevok."
+ muted:
+ title: "Stíšené"
+ description: "Nebudete upozornený ohľadom nových tém s týmto štítkom a nebudú sa zobrazovať na vašej karte s neprečítanými."
+ groups:
+ title: "Skupiny štítkov"
+ about: "Pridajte štítky do skupín, aby sa ľahšie spravovali."
+ new: "Nová skupina"
+ tags_label: "Štítky v tejto skupine:"
+ parent_tag_label: "Nadradený štítok"
+ parent_tag_placeholder: "Voliteľné"
+ parent_tag_description: "Štítky z tejto skupiny nemôžu byť použité pokiaľ nie je použitý nadradený štítok."
+ one_per_topic_label: "Obmedziť na jeden štítok na tému z tejto skupiny"
+ new_name: "Nová skupina štítkov"
+ save: "Uložiť"
+ delete: "Vymazať"
+ confirm_delete: "Ste si istý, že chcete zmazať túto skupinu štítkov?"
+ topics:
+ none:
+ unread: "Nemáte žiadnu neprečítanú tému"
+ new: "Nemáte žiadnu novú tému"
+ read: "Neprečítali ste ešte žiadnu tému."
+ posted: "Neprispeli ste ešte do žiadnej témy."
+ latest: "Nie sú žiadne najnovšie témy."
+ hot: "Nie sú žiadne horúce témy."
+ bookmarks: "Nemáte ešte žiadne zazáložkované témy."
+ top: "Nie sú žiadne najvýznamnejšie témy."
+ search: "Nenašli sa žiadne výsledky"
+ bottom:
+ latest: "Žiadne ďalšie najnovšie témy."
+ hot: "Žiadne ďalšie horúce témy."
+ posted: "Žiadne ďalšie témy na čítanie."
+ read: "Žiadne ďalšie prečítané témy."
+ new: "Žiadne ďalšie nové témy."
+ unread: "Žiadne ďalšie neprečítané témy."
+ top: "Žiadne ďalšie navýznamnejšie témy."
+ bookmarks: "Žiadne ďalšie zazáložkované témy."
+ search: "Žiadne ďalšie výsledky vyhľadávania."
+ invite:
+ custom_message_link: "vlastná správa"
+ custom_message_placeholder: "Zadajte Vašu vlastnú správu"
admin_js:
type_to_filter: "zadajte, čo chcete filtrovať ..."
admin:
@@ -1802,6 +2069,7 @@ sk:
30_days_ago: "Pred 30 dňami"
all: "Všetky"
view_table: "tabuľka"
+ view_graph: "graf"
refresh_report: "Obnoviť report"
start_date: "Od"
end_date: "Do"
@@ -1832,7 +2100,7 @@ sk:
delete_post_agree_flag_title: "Zmazať prípspevok; ak ide o prvý príspevok, zmazať aj tému"
delete_flag_modal_title: "Zmazať a..."
delete_spammer: "Zmazať spammera"
- delete_spammer_title: "Zmazať užívateľa aj všetky príspevky a témy ktoré vytvoril."
+ delete_spammer_title: "Zmazať používateľa aj všetky príspevky a témy ktoré vytvoril."
disagree_flag_unhide_post: "Nesúhlasiť (odkryť príspevok)"
disagree_flag_unhide_post_title: "Zrušíť všetky označenia z príspevku a znova odkryť príspevok"
disagree_flag: "Nesúhlasiť"
@@ -1884,15 +2152,12 @@ sk:
refresh: "Obnoviť"
new: "Nový"
selector_placeholder: "zadať používateľské meno"
- name_placeholder: "Názov skupiny, bez medzier, rovnaké pravidlá ako pre uťívateľa"
about: "Tu upravíte Vaše členstvo v skupinách a mená"
group_members: "Členovia skupiny"
delete: "Odstrániť"
delete_confirm: "Zmazať túto skupinu?"
delete_failed: "Nepodarilo sa zmazať skupinu. Pokiaľ je skupina automatická, nemôže byť zrušená."
- delete_member_confirm: "Odstrániť '%{username}' zo skupiny '%{group}'?"
delete_owner_confirm: "Odobrať vlastnícke práva %{username}'?"
- name: "Meno"
add: "Pridať"
add_members: "Pridať členov"
custom: "Vlastné"
@@ -1902,7 +2167,7 @@ sk:
bulk_select: "(vyberte skupinu)"
automatic: "Automaticky"
automatic_membership_email_domains: "Užívatelia, ktorí sa zaregistrovali s emailovou doménou uvedenou v zozname budú automaticky pridaní do tejto skupiny. "
- automatic_membership_retroactive: "Použi pravidlo rovnakej emailovej domény pre pridanie registrovaných užívateľov"
+ automatic_membership_retroactive: "Použi pravidlo rovnakej emailovej domény pre pridanie registrovaných používateľov"
default_title: "Štandardné označenie pre všetkých používateľov v tejto skupine"
primary_group: "Automaticky nastav ako hlavnú skupinu"
group_owners: Vlastníci
@@ -1922,7 +2187,7 @@ sk:
confirm_revoke: "Ste si istý, že chcete obnoviť tento kľúč?"
info_html: "Váš API kľúč Vám umožní vytváranie a aktualizovanie tém prostredníctvom volaní JSON."
all_users: "Všetci používatelia"
- note_html: "Držte tento kľúč v tajnosti, všetci užívatelia ktorí ho vlastnia môžu vytvárať ľubovoľné príspevky pod ľubovoľným užívateľským menom. "
+ note_html: "Držte tento kľúč v tajnosti, všetci užívatelia ktorí ho vlastnia môžu vytvárať ľubovoľné príspevky pod ľubovoľným používateľským menom. "
plugins:
title: "Pluginy"
installed: "Nainštalované pluginy"
@@ -1941,6 +2206,14 @@ sk:
backups: "Zálohy"
logs: "Logy"
none: "Nie je dostupná žiadna záloha."
+ read_only:
+ enable:
+ title: "Zapnúť režim len na čítanie"
+ label: "Zapnúť len čítanie"
+ confirm: "Ste si istý, že chcete zapnúť režim len na čítanie?"
+ disable:
+ title: "Vypnúť režim len na čítanie"
+ label: "Vypnúť len čítanie"
logs:
none: "Zatiaľ žiadne logy..."
columns:
@@ -1974,14 +2247,13 @@ sk:
is_disabled: "Obnovenie je vypnuté na Nastaveniach stránky."
label: "Obnoviť"
title: "Obnoviť zálohu"
+ confirm: "Ste si istý, že chcete obnoviť túto zálohu?"
rollback:
label: "Vrátiť späť"
title: "Vrátiť databázu do predchádzajúceho funkčného stavu"
export_csv:
- user_archive_confirm: "Ste si istý, že si chcete stiahnut svoje príspevky?"
success: "Export bol spustený, o jeho skončení budete informovaný správou."
failed: "Export zlyhal. Skontrolujte prosím logy."
- rate_limit_error: "Príspevky možu byť stiahnuté len raz za deň. Skúste opäť zajtra."
button_text: "Export"
button_title:
user: "Exportovať celý zoznam používateľov v CSV formáte."
@@ -2100,12 +2372,12 @@ sk:
send_test: "Odoslať testovací email"
sent_test: "odoslané!"
delivery_method: "Spôsob doručenia"
- preview_digest_desc: "Náhľad obsahu súhrnných emailov zaslaných neaktívnym užívateľom."
+ preview_digest_desc: "Náhľad obsahu súhrnných emailov zaslaných neaktívnym používateľom."
refresh: "Obnoviť"
format: "Formát"
html: "html"
text: "text"
- last_seen_user: "Posledný videný užívateľ"
+ last_seen_user: "Posledný videný používateľ"
reply_key: "Tlačidlo odpovedať"
skipped_reason: "Preskočiť zdôvodnenie"
incoming_emails:
@@ -2117,6 +2389,8 @@ sk:
none: "Nenájdené žiadne ďalšie emaily."
modal:
error: "Chyba"
+ headers: "Hlavičky"
+ subject: "Predmet"
filters:
from_placeholder: "from@example.com"
to_placeholder: "to@example.com"
@@ -2150,7 +2424,7 @@ sk:
do_nothing: "nerob nič"
staff_actions:
title: "Akcie personálu"
- instructions: "Vyberte uťívateľské meno a akcie na filtrovanie zoznamu. Kliknite na profilovú fotku pre navigáciu na užívateľské stránky."
+ instructions: "Vyberte používateľské meno a akcie na filtrovanie zoznamu. Kliknite na profilovú fotku pre navigáciu na užívateľské stránky."
clear_filters: "Ukázať všetko"
staff_user: "Člen redakcie"
target_user: "Cieľový používateľ"
@@ -2173,8 +2447,8 @@ sk:
change_site_customization: "zmeniť úpravy webu"
delete_site_customization: "zmazať úpravy webu"
change_site_text: "zmeniť text stránky"
- suspend_user: "zruš práva užívateľovi"
- unsuspend_user: "obnov práva užívateľovi"
+ suspend_user: "zruš práva používateľovi"
+ unsuspend_user: "obnov práva používateľovi"
grant_badge: "udeliť odznak"
revoke_badge: "odobrať odznak"
check_email: "skontrolovať email"
@@ -2188,10 +2462,12 @@ sk:
create_category: "vytvoriť kategóriu"
block_user: "blokovať používateľa"
unblock_user: "odblokovať používateľa"
- grant_admin: "udeliť admin"
+ grant_admin: "udeliť administrátorské práva"
revoke_admin: "odobrať admin"
- grant_moderation: "udeliť moderovanie"
+ grant_moderation: "udeliť moderátorské práva"
revoke_moderation: "odvolať moderovanie"
+ deleted_tag: "zmazaný štítok"
+ renamed_tag: "premenovaný štítok"
screened_emails:
title: "Kontrolované emaily"
description: "Keď niekto skúsi vytvoriť nový účet, nasledujúce emailove adresy budú preverené a registrácia bude zablokovaná, alebo bude vykonaná nejaka iná akcia. "
@@ -2200,7 +2476,7 @@ sk:
allow: "Povoliť"
screened_urls:
title: "Kontrolované URL adresy"
- description: "URL adresy v tomto zozname boli použité v príspevkoch užívateľov, ktorí boli identifikovaní ako spameri."
+ description: "URL adresy v tomto zozname boli použité v príspevkoch používateľov, ktorí boli identifikovaní ako spameri."
url: "URL"
domain: "Doména"
screened_ips:
@@ -2226,15 +2502,15 @@ sk:
title: "Chybové Logy"
impersonate:
title: "Privlastniť"
- help: "Použite tento nástroj na privlastnenie si užívateľského účtu na účely debugovania. Po skončení sa budete musieť odhlásiť."
+ help: "Použite tento nástroj na privlastnenie si používateľského účtu na účely debugovania. Po skončení sa budete musieť odhlásiť."
not_found: "Tento používateľ sa nenašiel."
- invalid: "Ľutujeme, nesmiete si privlatniť tohto užívateľa."
+ invalid: "Ľutujeme, nesmiete si privlatniť tohto používateľa."
users:
title: 'Používatelia'
create: 'Pridať admin používateľa'
last_emailed: "Posledný odemailovaný"
- not_found: "Prepáčte, toto užívateľské meno sa nenachádza v našom systéme."
- id_not_found: "Prepáčte, toto užívateľské id sa nenachádza v našom systéme."
+ not_found: "Prepáčte, toto používateľské meno sa nenachádza v našom systéme."
+ id_not_found: "Prepáčte, toto používateľské id sa nenachádza v našom systéme."
active: "Aktívny"
show_emails: "Ukázať Emaily"
nav:
@@ -2247,22 +2523,22 @@ sk:
suspect: 'Podozrivý'
approved: "Schválený?"
approved_selected:
- one: "schváliť užívateľa"
- few: "schváliť ({{count}}) užívateľov "
- other: "schváliť ({{count}}) užívateľov "
+ one: "schváliť používateľa"
+ few: "schváliť ({{count}}) používateľov "
+ other: "schváliť ({{count}}) používateľov "
reject_selected:
- one: "zamietnuť užívateľa"
- few: "zamietnuť ({{count}}) užívateľov "
- other: "zamietnuť ({{count}}) užívateľov "
+ one: "zamietnuť používateľa"
+ few: "zamietnuť ({{count}}) používateľov "
+ other: "zamietnuť ({{count}}) používateľov "
titles:
active: 'Aktívni používatelia'
new: 'Noví používatelia'
pending: 'Užívatelia čakajúci na kontrolu'
- newuser: 'Užívatelia na Stupni dôvery 0 (Noví užívatelia)'
- basic: 'Užívatelia na Stupni dôvery 1 (Bežný užívateľ)'
- member: 'Užívatelia na Stupni dôvery 2 (Člen)'
- regular: 'Užívatelia na Stupni dôvery 3 (Stály člen)'
- leader: 'Užívatelia na Stupni dôvery 4 (Vodca)'
+ newuser: 'Používatelia na stupni dôvery 0 (Nový používateľ)'
+ basic: 'Používatelia na stupni dôvery 1 (Bežný používateľ)'
+ member: 'Používatelia na stupni dôvery 2 (Člen)'
+ regular: 'Používatelia na stupni dôvery 3 (Stály člen)'
+ leader: 'Používatelia na stupni dôvery 4 (Vodca)'
staff: "Zamestnanci"
admins: 'Admin používatelia'
moderators: 'Moderátori'
@@ -2270,27 +2546,26 @@ sk:
suspended: 'Užívatelia s odobratými právami'
suspect: 'Podozriví užívatelia'
reject_successful:
- one: "Úspešne zamietnutý užívateľ"
- few: "Úspešne zamietnutí %{count} užívatelia"
- other: "Úspešne zamietnutých %{count} užívateľov"
+ one: "Úspešne zamietnutý používateľ"
+ few: "Úspešne zamietnutí %{count} používatelia"
+ other: "Úspešne zamietnutých %{count} používateľov"
reject_failures:
- one: "Nepodarilo sa zamietnuť 1 užívateľa"
- few: "Nepodarilo sa zamietnuť %{count} užívateľov"
- other: "Nepodarilo sa zamietnuť %{count} užívateľov"
+ one: "Nepodarilo sa zamietnuť 1 používateľa"
+ few: "Nepodarilo sa zamietnuť %{count} používateľov"
+ other: "Nepodarilo sa zamietnuť %{count} používateľov"
not_verified: "Neoverený"
check_email:
title: "Odhaliť emailovú adresu tohto používateľa"
text: "Zobraziť"
user:
- suspend_failed: "Niečo sa pokazilo pri odoberaní práv tomuto užívateľovi {{error}}"
- unsuspend_failed: "Niečo sa pokazilo pri obnovovaní práv tomuto užívateľovi {{error}}"
- suspend_duration: "Ako dlho budú užívateľovi odobrate práva?"
+ suspend_failed: "Niečo sa pokazilo pri odoberaní práv tomuto používateľovi {{error}}"
+ unsuspend_failed: "Niečo sa pokazilo pri obnovovaní práv tomuto používateľovi {{error}}"
+ suspend_duration: "Ako dlho budú používateľovi odobrate práva?"
suspend_duration_units: "(dni)"
- suspend_reason_label: "Prečo mu odoberáte práva? Tento text sa zobrazí každému na stránke profilu užívateľa a bude zobrazený užívateľovi pri pokuse o prihlásenie. Buďte strucný."
+ suspend_reason_label: "Prečo mu odoberáte práva? Tento text sa zobrazí každému na stránke profilu používateľa a bude zobrazený užívateľovi pri pokuse o prihlásenie. Buďte strucný."
suspend_reason: "Dôvod"
suspended_by: "Práva odobraté"
delete_all_posts: "Zmazať všetky príspevky"
- delete_all_posts_confirm: "Chystáte sa zmazať %{posts} príspevkov a %{topics} tém. Ste si istý?"
suspend: "Odobrať"
unsuspend: "Obnoviť"
suspended: "Odobrate práva?"
@@ -2307,7 +2582,7 @@ sk:
impersonate: 'Privlastniť'
ip_lookup: "Vyhľadávanie IP"
log_out: "Odhlásiť sa"
- logged_out: "Užívateľ bol odhlásený na všetkých zariadeniach"
+ logged_out: "Používateľ bol odhlásený na všetkých zariadeniach"
revoke_admin: 'Odobrať admin'
grant_admin: 'Udeliť admin'
revoke_moderation: 'Odobrať moderovanie'
@@ -2329,11 +2604,11 @@ sk:
flags_given_received_count: 'Rozdané a prijaté označenia'
approve: 'Schváliť'
approved_by: "schválený"
- approve_success: "Uťívateľ schválený a bol zaslaný email s aktivačnými inštrukciami"
- approve_bulk_success: "Úspech! Všetci vybraní uťívateľia boli schválení a oboznáamení."
+ approve_success: "Poožívateľ schválený a bol zaslaný email s aktivačnými inštrukciami"
+ approve_bulk_success: "Úspech! Všetci vybraní používatelia boli schválení a oboznámení."
time_read: "Doba Čítania"
anonymize: "Anonymizovať používateľa"
- anonymize_confirm: "Ste si istý že chcete zmeniť tento účet na anonymný? Zmeni to užívateľské meno, email a zmažú sa všetky informácie z profilu. "
+ anonymize_confirm: "Ste si istý že chcete zmeniť tento účet na anonymný? Zmeni to používateľské meno, email a zmažú sa všetky informácie z profilu. "
anonymize_yes: "Áno, zmeň tento účet na anonymný"
anonymize_failed: "Nastala chyba pri anonymizovaní účtu."
delete: "Odstrániť používateľa"
@@ -2342,16 +2617,16 @@ sk:
delete_forbidden:
one: "Užívatelia nemôžu byť vymazaní ak majú príspevky. Najprv zmažte príspevky až potom užívateľa. (Príspevky staršie ako %{count} deň nemožno zmazať)"
few: "Užívatelia nemôžu byť vymazaní ak majú príspevky. Najprv zmažte príspevky až potom užívateľa. (Príspevky staršie ako %{count} dni nemožno zmazať)"
- other: "Užívatelia nemôžu byť vymazaní ak majú príspevky. Najprv zmažte príspevky až potom užívateľa. (Príspevky staršie ako %{count} dní nemožno zmazať)"
+ other: "Užívatelia nemôžu byť vymazaní ak majú príspevky. Najprv zmažte príspevky až potom používateľa. (Príspevky staršie ako %{count} dní nemožno zmazať)"
cant_delete_all_posts:
one: "Nepodarilo sa zmazať všetky príspevky. Niektoré príspevky sú staršie ako %{count} deň. (Nastavenie delete_user_max_post_age )"
few: "Nepodarilo sa zmazať všetky príspevky. Niektoré príspevky sú staršie ako %{count} dni. (Nastavenie delete_user_max_post_age )"
other: "Nepodarilo sa zmazať všetky príspevky. Niektoré príspevky sú staršie ako %{count} dní. (Nastavenie delete_user_max_post_age )"
cant_delete_all_too_many_posts:
- one: "Nedá sa zmazať všetky píspevky, pretože užívateľ má viac ako 1 príspevok. (delete_all_posts_max)"
- few: "Nedá sa zmazať všetky píspevky, pretože užívateľ má viac ako %{count} príspevky. (delete_all_posts_max)"
- other: "Nedá sa zmazať všetky píspevky, pretože užívateľ má viac ako %{count} príspevkov. (delete_all_posts_max)"
- delete_confirm: "Ste si ISTÝ, že chcete zmazať tohoto užívateľa? Už sa to nedá obnoviť!"
+ one: "Nedá sa zmazať všetky píspevky, pretože používateľ má viac ako 1 príspevok. (delete_all_posts_max)"
+ few: "Nedá sa zmazať všetky píspevky, pretože používateľ má viac ako %{count} príspevky. (delete_all_posts_max)"
+ other: "Nedá sa zmazať všetky píspevky, pretože používateľ má viac ako %{count} príspevkov. (delete_all_posts_max)"
+ delete_confirm: "Ste si ISTÝ, že chcete zmazať tohoto používateľa? Už sa to nedá obnoviť!"
delete_and_block: "Zazať a zablokovať tento email a IP adresu"
delete_dont_block: "Iba vymazať"
deleted: "Používateľ bol vymazaný."
@@ -2363,24 +2638,24 @@ sk:
activate_failed: "Počas aktivácie používateľa nastala chyba."
deactivate_account: "Deaktivovať účet"
deactivate_failed: "Počas deaktivácie používateľa nastala chyba."
- unblock_failed: 'Nastala chyba pri odblokovaní užívateľa.'
- block_failed: 'Nastala chyba pri zablokovaní užívateľa.'
+ unblock_failed: 'Nastala chyba pri odblokovaní používateľa.'
+ block_failed: 'Nastala chyba pri zablokovaní používateľa.'
block_confirm: 'Ste si istý tým, že chcete zablokovať tohoto používateľa? Nebude môcť vytvárať žiadne nové témy alebo príspevky.'
block_accept: 'Ano, zablokovať používateľa'
- deactivate_explanation: "Deaktivovaý užívateľ musí znovu overiť svoj email"
+ deactivate_explanation: "Deaktivovaý používateľ musí znovu overiť svoj email"
suspended_explanation: "Suspendovaní užívatelia sa nemôžu prihlasovať."
- block_explanation: "Zablokovaní uťívatelia nemôžu zakladať témy ani pridávať príspevky."
- trust_level_change_failed: "Nastala chyba pri zmene úrovne dôveryhodnosti užívateľa."
- suspend_modal_title: "Zruš práva užívateľovi"
- trust_level_2_users: "Užívatelia na 2 Stupni dôvery"
- trust_level_3_requirements: "Požiadavky pre 3 stupeň"
- trust_level_locked_tip: "stupeň dôvery je zamknutý, systém užívateľovi stupeň nezvýši ani nezníži "
- trust_level_unlocked_tip: "stupeň dôvery je odomknutý, systém môže užívateľovi stupeň zvýšiť alebo znížiť"
+ block_explanation: "Zablokovaní používatelia nemôžu zakladať témy ani pridávať príspevky."
+ staged_explanation: "Dočasný používateľ môže iba prispievať emailom do vybraných tém."
+ trust_level_change_failed: "Nastala chyba pri zmene stupňa dôvery používateľa."
+ suspend_modal_title: "Zruš práva používateľovi"
+ trust_level_2_users: "Používatelia na stupni dôvery 2"
+ trust_level_3_requirements: "Požiadavky pre 3 stupeň dôvery"
+ trust_level_locked_tip: "stupeň dôvery je zamknutý, systém používateľovi stupeň nezvýši ani nezníži "
+ trust_level_unlocked_tip: "stupeň dôvery je odomknutý, systém môže používateľovi stupeň zvýšiť alebo znížiť"
lock_trust_level: "Zamknúť stupeň dôvery"
unlock_trust_level: "Odomknúť stupeň dôvery"
tl3_requirements:
title: "Požiadavky pre stupeň dôvery 3"
- table_title: "Za posledných %{time_period} dní:"
value_heading: "Hodnota"
requirement_heading: "Požiadavka"
visits: "Návštev"
@@ -2395,14 +2670,14 @@ sk:
likes_given: "Rozdaných 'páči sa mi'"
likes_received: "Obdržaných 'páči sa mi'"
likes_received_days: "Obdržaných 'páči sa mi' na jednotlivé dni"
- likes_received_users: "Obdržaných 'páči sa mi' na jednotlivých užívateľov"
+ likes_received_users: "Obdržaných 'páči sa mi' na jednotlivých používateľov"
qualifies: "Spĺňa požiadavky pre stupeň dôvery 3"
does_not_qualify: "Nespĺňa požiadavky pre stupeň dôvery 3"
will_be_promoted: "Bude čoskoro povýšený"
will_be_demoted: "Čoskoro bude degradovaný"
on_grace_period: "V súčastnosti je v povyšovacej skúšobnej dobe, nebude degradovaný."
locked_will_not_be_promoted: "Stupeň dôvery je zamknutý. Nikdy nebude povýšený."
- locked_will_not_be_demoted: "Stupeň dôvery je zamknutý. Nikdy nebude degradovaný"
+ locked_will_not_be_demoted: "Stupeň dôvery je zamknutý. Nikdy nebude degradovaný."
sso:
title: "Jednotné prihlásenie"
external_id: "Externé ID"
@@ -2411,9 +2686,9 @@ sk:
external_email: "Email"
external_avatar_url: "URL profilovej fotky"
user_fields:
- title: "Užívateľské polia"
+ title: "Používateľské polia"
help: "Pridaj polia, ktoré môžu užívatelia vyplniť"
- create: "Vytvor užívateľske pole"
+ create: "Vytvor používateľske pole"
untitled: "Bez názvu"
name: "Názov poľa"
type: "Typ poľa"
@@ -2422,7 +2697,7 @@ sk:
edit: "Upraviť"
delete: "Odstrániť"
cancel: "Zrušiť"
- delete_confirm: "Ste si istý, že chcete zmazať toto užívateľské pole?"
+ delete_confirm: "Ste si istý, že chcete zmazať toto používateľské pole?"
options: "Možnosti"
required:
title: "Požadované pri registrácii?"
@@ -2480,7 +2755,8 @@ sk:
backups: "Zálohy"
login: "Prihlásenie"
plugins: "Pluginy"
- user_preferences: "Užívateľské Nastavenia"
+ user_preferences: "Používateľské Nastavenia"
+ tags: "Štítky"
badges:
title: Odznaky
new_badge: Nový odznak
@@ -2493,8 +2769,8 @@ sk:
badge_grouping: Skupina
badge_groupings:
modal_title: Zoskupovanie odznakov
- granted_by: Pridelené užívateľom
- granted_at: Pridelené na
+ granted_by: Udelené používateľom
+ granted_at: Udelené dňa
reason_help: (Odkaze na príspevok, alebo tému)
save: Uložiť
delete: Odstrániť
@@ -2504,14 +2780,14 @@ sk:
expand: Rozbaliť …
revoke_confirm: Ste si istý, že chcete obnoviť tento odznak?
edit_badges: Upraviť odznaky
- grant_badge: Prideliť odznaky
- granted_badges: Pridelené odznaky
- grant: Prideliť
- no_user_badges: "%{name} nebol pridelený žiaden odznak."
- no_badges: Nie sú žiadne odznaky, ktoré môžu byť pridelené.
+ grant_badge: Udeliť odznak
+ granted_badges: Udelené odznaky
+ grant: Udeliť
+ no_user_badges: "Používateľovi %{name} nebol udelený žiaden odznak."
+ no_badges: Nie sú žiadne odznaky, ktoré môžu byť udelené.
none_selected: "Vyberte odznak, aby ste mohli začať"
allow_title: Povoliť použitie odznaku namiesto názvu
- multiple_grant: Môže byť pridelené viacnásobne
+ multiple_grant: Môže byť udelené viacnásobne
listable: Zobraziť odznak na stránke verejných odznakov
enabled: Povoliť odznak
icon: Ikona
@@ -2520,16 +2796,16 @@ sk:
query: Požiadavka na Odznak (SQL)
target_posts: Požiadavka cieli príspevky
auto_revoke: Spúšťať stornovaciu požiadavku denne
- show_posts: Zobraziť príspevok o pridelení odznaku na stránke odznakov
+ show_posts: Zobraziť príspevok o udelení odznaku na stránke odznakov
trigger: Spúšťač
trigger_type:
none: "Obnovovať denne"
- post_action: "Keď užívateľ zareaguje na príspevok"
- post_revision: "Keď užívateľ vytvorí príspevok"
- trust_level_change: "Keď užívateľ zmení stupeň dôvery"
- user_change: "Keď je užívateľ vytvorený, alebo upravený"
+ post_action: "Keď používateľ zareaguje na príspevok"
+ post_revision: "Keď používateľ vytvorí príspevok"
+ trust_level_change: "Keď používateľ zmení stupeň dôvery"
+ user_change: "Keď je používateľ vytvorený, alebo upravený"
preview:
- link_text: "Prezerať pridelené odznaky"
+ link_text: "Prehliadnuť udelené odznaky"
plan_text: "Náhľad na plán požiadaviek"
modal_title: "Požiadavka na Odznak Prezeranie"
sql_error_header: "Nastala chyba s požiadavkou."
@@ -2565,23 +2841,23 @@ sk:
category: "Prispievať do kategórií"
add_host: "Pridať hostiteľa"
settings: "Nastavenia vkladania"
- feed_settings: "Nastavenie zdrojov"
- feed_description: "Zadaním RSS/ATOM kanálu Vašich stránok zlepší schopnosť Discourse vladať Váš obsah."
+ feed_settings: "Nastavenie kanálov"
+ feed_description: "Zadaním RSS/ATOM kanála Vašich stránok zlepší schopnosť Discourse vladať Váš obsah."
crawling_settings: "Nastavenia vyhľadávača"
crawling_description: "Ak Discourse vytvorí tému pre Váš príspevok a neexistuje žiadny RSS/ATOM kanál tak sa pokúsime získať Váš obsah z HTML. Získanie obsahu môže byt niekedy výzva a preto poskytujeme možnosť špecifikovať CSS pravidlá na uľahčenie získania obsahu."
- embed_by_username: "Užívateľské meno pre vytváranie tém"
+ embed_by_username: "Používateľské meno pre vytváranie tém"
embed_post_limit: "Maximálny počet vložených príspevkov"
- embed_username_key_from_feed: "Kľúč na získanie užívateľského mena discourse zo zdroja"
+ embed_username_key_from_feed: "Kľúč na získanie používateľského mena discourse z kanála"
embed_truncate: "Skrátiť vložené príspevky"
embed_whitelist_selector: "CSS selector pre elementy ktoré je možné vkladať"
embed_blacklist_selector: "CSS selector pre elementy ktoré nie je možné vkladať"
feed_polling_enabled: "importovať príspevky cez RSS/ATOM"
- feed_polling_url: "URL adresa zdroja RSS/ATOM na preskúmanie"
+ feed_polling_url: "URL adresa RSS/ATOM kanála na preskúmanie"
save: "Uložiť Nastavenia vkladania"
permalink:
title: "Trvalé odkazy"
url: "URL"
- topic_id: "IT témy"
+ topic_id: "ID témy"
topic_title: "Témy"
post_id: "ID príspevku"
post_title: "Príspevok"
diff --git a/config/locales/client.sq.yml b/config/locales/client.sq.yml
index 04eec1217b1..f34427fbd32 100644
--- a/config/locales/client.sq.yml
+++ b/config/locales/client.sq.yml
@@ -48,9 +48,6 @@ sq:
x_seconds:
one: "1s"
other: "%{count}s"
- less_than_x_minutes:
- one: "< 1m"
- other: "< %{count}m"
x_minutes:
one: "1m"
other: "%{count}m"
@@ -69,7 +66,7 @@ sq:
almost_x_years:
one: "1v"
other: "%{count}v"
- date_month: "MMM D"
+ date_month: "D MMM"
date_year: "MMM 'YY"
medium:
x_minutes:
@@ -109,7 +106,7 @@ sq:
post: 'postim #%{postNumber}'
close: 'mbylle'
twitter: 'shpërndaje këtë lidhje në Twitter'
- facebook: 'shpërndaje këtë lidhje ne Facebook'
+ facebook: 'postojeni këtë lidhje në Facebook'
google+: 'shpërndaje këtë lidhje në Google+'
email: 'dërgoje këtë lidhje me email'
action_codes:
@@ -130,14 +127,14 @@ sq:
enabled: 'arkivoi %{when}'
disabled: 'paarkivuar %{when}'
pinned:
- enabled: 'mbërthyer %{when}'
- disabled: 'zbërthyer %{when}'
+ enabled: 'ngjitur %{when}'
+ disabled: 'çngjitur %{when}'
pinned_globally:
- enabled: 'mbërthyer globalisht %{when}'
- disabled: 'ç''mbërthyer %{when}'
+ enabled: 'ngjitur globalisht %{when}'
+ disabled: 'çngjitur %{when}'
visible:
enabled: 'listuar %{when}'
- disabled: 'ç''listuar %{when}'
+ disabled: 'çlistuar %{when}'
topic_admin_menu: "veprimet administrative mbi temën"
emails_are_disabled: "Emailat janë çaktivizuar globalisht nga administratori i faqes. Asnjë njoftim me email nuk do të dërgohet. "
bootstrap_mode_enabled: "Për të thjeshtuar nisjen e komunitetit, jeni në formatin \"bootstrap\". Të gjithë anëtarët e rinj do të kenë nivelin e besimit 1 dhe emailat e përditshëm të aktivizuar. Këto opsione do të çaktivizohen automatikisht kur numri total i anëtarëve të kalojë numrin %{min_users}."
@@ -169,7 +166,7 @@ sq:
admin_title: "Admin"
flags_title: "Sinjalizimet"
show_more: "trego më shumë"
- show_help: "opsione"
+ show_help: "ndihmë dhe kërko me Google"
links: "Lidhjet"
links_lowercase:
one: "lidhje"
@@ -203,7 +200,7 @@ sq:
title: "Temat e sugjeruara"
pm_title: "Mesazhet e sugjeruara"
about:
- simple_title: "Rreth"
+ simple_title: "Rreth Faqes"
title: "Rreth %{title}"
stats: "Statistikat e faqjes"
our_admins: "Administratorët tanë"
@@ -215,8 +212,8 @@ sq:
like_count: "Pëlqime"
topic_count: "Tema"
post_count: "Postime"
- user_count: "Anëtarët e rinj"
- active_user_count: "Anëtarët aktivë"
+ user_count: "Përdorues të Rinj"
+ active_user_count: "Përdorues Aktivë"
contact: "Na kontaktoni"
contact_info: "Në rast të një problemi madhor ose të një çështjeje urgjente që prek faqen, ju lutemi të kontaktoni %{contact_info}."
bookmarked:
@@ -246,7 +243,7 @@ sq:
cancel: "anulo"
save: "Ruaj ndryshimet"
saving: "Duke e ruajtur..."
- saved: "U ruajt!"
+ saved: "U ruajtën!"
upload: "Ngarko"
uploading: "Duke ngarkuar..."
uploading_filename: "Duke ngarkuar {{filename}}..."
@@ -257,7 +254,7 @@ sq:
revert: "Rikthe"
failed: "Dështoi"
switch_to_anon: "Filloni sesionin anonim"
- switch_from_anon: "Dilni nga sesioni anonim"
+ switch_from_anon: "Shkëputu nga sesioni anonim"
banner:
close: "Hiq këtë banderolë."
edit: "Modifiko këtë banderolë >>"
@@ -271,7 +268,7 @@ sq:
approve: 'Aprovo'
reject: 'Refuzo'
delete_user: 'Fshij Anëtarin'
- title: "Kërkon aprovim"
+ title: "Tema që kërkojnë aprovim"
none: "Nuk ka postime për të redaktuar."
edit: "Redakto"
cancel: "Anulo"
@@ -280,7 +277,7 @@ sq:
one: "This topic has 1 post awaiting approval"
other: "Kjo temë ka {{count}} postime që presin aprovimin"
confirm: "Ruaj ndryshimet"
- delete_prompt: "A jeni te sigurtë që doni të fshini %{username}? Ky veprim do të fshijë çdo shkrim të tyre dhe do bllokojë e-mailin dhe IP e tyre."
+ delete_prompt: "Vertet doni ta fshini %{username}? Ky veprim do të fshijë çdo postim të tyrin dhe do të bllokojë email-in dhe adresën e tyre IP."
approval:
title: "Postimi ka nevojë për aprovim"
description: "Postimi juaj u morr, por duhet të aprovohet nga një moderator para se të shfaqet në faqe. Kini pak durim. "
@@ -323,20 +320,13 @@ sq:
one: "1 anëtar"
other: "%{count} anëtarë"
groups:
- empty:
- posts: "Nuk ka postim nga anëtarët e këtij grupi."
- members: "Nuk ka asnjë anëtar në këtë grup."
- mentions: "Nuk ka përmendje për këtë grup."
- messages: "Nuk ka mesazhe për këtë grup."
- topics: "Nuk ka asnjë temë nga anëtarët e këtij grupi."
add: "Shto"
selector_placeholder: "Shto anëtarë"
owner: "autori"
visible: "Grupi është i dukshëm për të gjithë përdoruesit"
- index: "Grupet"
title:
- one: "grupë"
- other: "grupet"
+ one: "grup"
+ other: "grupe"
members: "Anëtarë"
topics: "Tema"
posts: "Postime"
@@ -398,16 +388,14 @@ sq:
posts: "Postime"
topics: "Tema"
latest: "Të fundit"
- latest_by: "të fundit sipas"
+ latest_by: "e fundit nga"
subcategories: "Nënkategori"
- topic_stats: "Numri i temave të reja."
+ topic_sentence:
+ one: "1 temë"
+ other: "%{count} tema"
topic_stat_sentence:
one: "%{count} temë e re gjatë %{unit} të fundit."
other: "%{count} tema të reja gjatë %{unit} të fundit."
- post_stats: "Numri i postimeve të reja."
- post_stat_sentence:
- one: "%{count} postim i ri këto %{unit}."
- other: "%{count} postime të reja këto %{unit}."
ip_lookup:
title: Shiko adresën IP
hostname: Hostname
@@ -420,7 +408,7 @@ sq:
username: "emri i përdoruesit"
trust_level: "TL"
read_time: "koha e leximit"
- topics_entered: "topics entered"
+ topics_entered: "temat e shikuara"
post_count: "# postimeve"
confirm_delete_other_accounts: "A jeni të sigurtë që doni të fshini këto llogari?"
user_fields:
@@ -430,7 +418,6 @@ sq:
profile: "Profili"
mute: "Hesht"
edit: "Ndrysho preferencat"
- download_archive: "Shkarko postimet e mia"
new_private_message: "Mesazh i ri"
private_message: "Mesazh"
private_messages: "Mesazhet"
@@ -454,6 +441,7 @@ sq:
each_browser_note: "Shënim: Duhet të ndryshoni këtë rregullim (setting) në çdo shfletues që përdorni. "
dismiss_notifications: "Hiqini të gjitha"
dismiss_notifications_tooltip: "Shëno njoftimet e palexuara si të lexuara"
+ disable_jump_reply: "Mos shko tek postimi im pasi përgjigjem"
dynamic_favicon: "Tregoni numrin e temave të reja e azhornuara në ikonën e shfletuesit"
external_links_in_new_tab: "Hap të gjitha lidhjet e jashtme në një tab të ri"
enable_quoting: "Aktivizo citimin në përgjigje për tekstin e përzgjedhur"
@@ -477,6 +465,7 @@ sq:
watched_tags_instructions: "Ju do të vëzhgoni automatikisht të gjitha temat nën këtë etiketë. Do të njoftoheni për çdo postim e temë të re, dhe numri i postimeve të reja të palexuara do të afishohet ngjitur me titullin e temës përgjatë listave të faqes. "
tracked_tags: "Gjurmuar"
tracked_tags_instructions: "Ju do të gjurmoni automatikisht të gjitha temat nën këtë etiketë. Numri i përgjigjeve të palexuara do të afishohet ngjitur me titullin e temës. "
+ muted_tags: "Të heshtur"
muted_tags_instructions: "Ju nuk do të njoftoheni për asgjë nga temat e reja të këtyre etiketave, dhe këto tema nuk do të afishohen në faqen \"Më të fundit\" për ju. "
watched_categories: "Shikuar"
watched_categories_instructions: "Ju do të vëzhgoni automatikisht të gjitha temat nën këtë kategori. Do të njoftoheni për çdo postim e temë të re, dhe numri i postimeve të reja të palexuara do të afishohet ngjitur me titullin e temës. "
@@ -487,8 +476,11 @@ sq:
watched_first_post_tags: "Postimi i parë nën vëzhgim"
watched_first_post_tags_instructions: "Ju do të njoftoheni vetëm për postimin e parë të çdo teme nën këto etiketa."
muted_categories: "Pa njoftime"
+ muted_categories_instructions: "Ju nuk do të njoftoheni për asgjë nga temat e reja të këtyre kategorive, dhe këto tema nuk do të afishohen në faqen \"Më të fundit\" për ju. "
delete_account: "Fshi llogarinë time"
+ delete_account_confirm: "Jeni i sigurtë që dëshironi ta mbyllni përgjithmonë llogarinë tuaj? Ky veprim nuk mund të zhbëhet!"
deleted_yourself: "Llogaria juaj u fshi me sukses."
+ delete_yourself_not_allowed: "Nuk mund t'a fshini llogarinë tuaj tani. Kontaktoni një admin për të fshirë llogarinë. "
unread_message_count: "Mesazhet"
admin_delete: "Fshi"
users: "Anëtarët"
@@ -496,9 +488,14 @@ sq:
muted_users_instructions: "Çaktivizo të gjitha njoftimet nga këta anëtarë."
muted_topics_link: "Trego temat e heshtura"
watched_topics_link: "Trego temat e vëzhguara"
+ automatically_unpin_topics: "Çngjiti temat automatikisht kur arrij fundin e faqes."
+ apps: "Aplikimet"
+ revoke_access: "Hiqi aksesin"
+ undo_revoke_access: "Anullo heqjen e aksesit"
+ api_approved: "Aprovuar më:"
staff_counters:
flags_given: "sinjalizime të dobishme"
- flagged_posts: "postimet e raportuara"
+ flagged_posts: "postimet e sinjalizuara"
deleted_posts: "postimet e fshira"
suspensions: "pezullimet"
warnings_received: "paralajmërimet"
@@ -557,6 +554,7 @@ sq:
ok: "Do ju nisim emailin e konfirmimit"
invalid: "Ju lutemi të vendosni një email të vlefshëm"
authenticated: "Emaili juaj është verifikuar nga {{provider}}"
+ frequency_immediately: "Do t'ju dërgojmë një email menjëherë nëse nuk e keni lexuar temën për të cilën po ju dërgojmë email."
frequency:
one: "Do t'ju dërgojmë një email vetëm nëse nuk të kemi parë në faqe në minutën e fundit."
other: "Do t'ju dërgojmë një email vetëm nëse nuk të kemi parë në faqe në {{count}} minutat e fundit."
@@ -571,23 +569,25 @@ sq:
instructions: "Unik, pa hapësira, i shkurtër"
short_instructions: "Anëtarët e tjerë mund t'ju përmendin si @{{username}}"
available: "Emri është i disponueshëm"
+ global_match: "Email gjendet në emrin e përdoruesit të regjistruar"
global_mismatch: "Jeni regjistruar më parë. Provoni {{suggestion}}?"
not_available: "Nuk është i disponueshëm. Provoni {{suggestion}}?"
too_short: "Emri juaj është shumë i shkurtër"
too_long: "Emri juaj është shumë i gjatë"
checking: "Duke verifikuar disponibilitetin e emrit të përdoruesit...."
enter_email: 'Emri i përdoruesit u gjet; vendosni emailin përkatës'
+ prefilled: "Emaili u gjet në këtë përdorues të regjistruar"
locale:
title: "Gjuha e faqes"
- instructions: "Gjuha e faqes për përdoruesin. Do tue ndryshoj pasi të rifreskoni faqen. "
+ instructions: "Gjuha e faqes për përdoruesin. Do të ndryshojë pasi të rifreskoni faqen. "
default: "(paracaktuar)"
password_confirmation:
title: "Rishkruani fjalëkalimin"
last_posted: "Postimi i fundit"
- last_emailed: "Emaili i fundit"
+ last_emailed: "Emaili i Fundit"
last_seen: "Parë"
created: "Regjistruar"
- log_out: "Dilni"
+ log_out: "Shkëputu"
location: "Vendndodhja"
card_badge:
title: "Karta e anëtarit"
@@ -600,6 +600,7 @@ sq:
first_time: "Herën e parë që një postim pëlqehet"
never: "Asnjëherë"
email_previous_replies:
+ title: "Përfshi përgjigje të shkuara në njoftimet me email"
unless_emailed: "nëse ishin dërguar më parë"
always: "gjithmonë"
never: "asnjëherë"
@@ -614,6 +615,8 @@ sq:
include_tl0_in_digests: "Përfshini dhe postime nga anëtarët e rinj"
email_in_reply_to: "Përfshi një copëz të përgjigjeve ndaj postimit në email"
email_direct: "Më dërgo një email kur dikush më citon, i përgjigjet një postimi tim, më përmend me @username, ose më fton në një temë"
+ email_private_messages: "Më dërgo një email kur dikush më dërgon një mesazh"
+ email_always: "Më dërgo njoftim me email edhe kur jam aktiv në faqe"
other_settings: "Tjetër"
categories_settings: "Kategoritë"
new_topic_duration:
@@ -644,7 +647,10 @@ sq:
truncated:
one: "Po afishohet ftesa e parë."
other: "Po afishohen {{count}} ftesat e para."
- redeemed: "Ridërgo ftesat"
+ redeemed: "Ftesa të Shlyera"
+ redeemed_tab: "Shlyer"
+ redeemed_tab_with_count: "Shlyer ({{count}})"
+ redeemed_at: "Shlyer"
pending: "Ftesat në pritje"
pending_tab: "Në pritje"
pending_tab_with_count: "Në pritje ({{count}})"
@@ -658,14 +664,13 @@ sq:
reinvited: "Ftesa u ri-dërgua"
reinvited_all: "Tê gjitha ftesat u dërguan sërish!"
time_read: "Koha e leximit"
+ days_visited: "Ditë vizituar"
account_age_days: "Jetëgjatësia e llogarisë (ditë)"
create: "Dërgo një ftesë"
generate_link: "Kopjo lidhjen e ftesës"
- generated_link_message: '
Lidhja e ftesës u krijua!
Kjo ftesë është e vlefshme veto për adresën email: %{invitedEmail}
' bulk_invite: - none: "Ju nuk keni ftuar askënd deri tani. Mund të dërgoni ftesa individuale ose mund të ftoni një grup personash duke ngarkuar skedarin." text: "Skedari për ftesat në grup" - uploading: "Duke ngarkuar..." + success: "Skedari u ngarkua, do njoftoheni me mesazh kur procesi të mbarojë. " password: title: "Fjalëkalimi" too_short: "Fjalëkalimi është shumë i shkurër." @@ -705,7 +710,10 @@ sq: top_topics: "Temat popullore" no_topics: "Nuk ka ende tema." more_topics: "Më shumë tema" - top_links: "Lidhjet Top" + top_badges: "Stemat popullore" + no_badges: "Ende asnjë stemë." + more_badges: "Më shumë stema" + top_links: "Lidhjet Kryesore" no_links: "Nuk ka ende lidhje." most_liked_by: "Pëlqyer më shumë nga" most_liked_users: "Më të pëlqyer" @@ -730,7 +738,7 @@ sq: the_topic: "tema" loading: "Duke ngarkuar..." errors: - prev_page: "duku u munduar të ngarkohet" + prev_page: "duke u munduar të ngarkohet" reasons: network: "Gabim në rrjet" server: "Gabim në server" @@ -754,11 +762,18 @@ sq: refresh: "Rifresko" read_only_mode: enabled: "Faqja lejon vetëm leximet per momentin. Mund të vazhdoni të shfletoni, por përgjigjet, pëlqimet dhe veprime të tjera janë të çaktivizuara përkohësisht." + login_disabled: "Nuk mund të hyni në faqe sepse faqja është përkohësisht në formatin vetëm-lexim." + logout_disabled: "Nuk mund të shkëputeni nga faqja sepse faqja është përkohësisht në formatin vetëm-lexim." + too_few_topics_and_posts_notice: "Hajt ta nisim mbarë diskutimin! Keni krijuar %{currentTopics} / %{requiredTopics} tema dhe %{currentPosts} / %{requiredPosts} postime në faqe. Vizitorët e rinj të faqes kanë nevojë për diskutime në faqe. " + too_few_topics_notice: "Hajt ta nisim mbarë diskutimin! Keni krijuar %{currentTopics} / %{requiredTopics} tema. Vizitorët e rinj të faqes kanë nevojë për diskutime në faqe. " + too_few_posts_notice: "Hajt ta nisim mbarë diskutimin! Keni krijuar %{currentPosts} / %{requiredPosts} postime në faqe. Vizitorët e rinj të faqes kanë nevojë për diskutime në faqe. " logs_error_rate_notice: rate: one: "1 gabim/%{duration}" other: "%{count} gabime/%{duration}" learn_more: "mëso më shumë..." + all_time: 'total' + all_time_desc: 'totali i temave të krijuara' year: 'vit' year_desc: 'temat e krijuara në 365 ditët e fundit' month: 'muaj' @@ -767,6 +782,8 @@ sq: week_desc: 'temat e krijuara në 7 ditët e fundit' day: 'ditë' first_post: Postimi i parë + mute: Hesht + unmute: Çaktivizo heshtjen last_post: Postimi i fundit last_reply_lowercase: përgjigja e fundit replies_lowercase: @@ -776,23 +793,24 @@ sq: sign_up: "Regjistrohu" hide_session: "Më rikujto nesër" hide_forever: "jo faleminderit" - hidden_for_session: "OK, do t'ju rikujtojmë nesër. Sidoqoftë, ju mund të përdorni butonin \"Identifikohu\" për të hapur një llogari. " + hidden_for_session: "OK, do t'ju rikujtojmë nesër. Sidoqoftë, ju mund të përdorni butonin 'Identifikohu' për të hapur një llogari. " intro: "Njatjeta! :heart_eyes: Sikur po ju pëlqen diskutimi... po s'jeni anëtarësuar akoma në faqe. " value_prop: "Kur krijoni një llogari në faqe, sistemi mban mend se çfarë keni lexuar, që të mund të riktheheni aty ku e latë. Ju ofrojmë gjithashtu njoftime në shfletues ose me email, sa herë që ka postime të reja. :heartbeat:" summary: enabled_description: "Po lexoni një përmbledhje të kësaj teme: postimet më interesante sipas vlerësimit të komunitetit." description: "Ka {{replyCount}} përgjigje." description_time: "Ka {{replyCount}} përgjigje, do ju duhen rreth {{readingTime}} minuta për t'i lexuar." - enable: 'Përmbidhë këtë temë' + enable: 'Përmblidhe këtë Temë' disable: 'Shfaq të gjithë postimet' deleted_filter: enabled_description: "Kjo temë përmban postime të fshira, që tani janë fshehur." disabled_description: "Postimet e fshira në këtë temë janë të dukshme." enable: "Fshehi postimet e fshira" - disable: "Trego postimet e fshira" + disable: "Shfaq postimet e fshira" private_message_info: title: "Mesazh" invite: "Fto të tjerë..." + remove_allowed_user: "A doni vërtet të hiqni {{name}} nga ky mesazh?" remove_allowed_group: "Doni me të vërtetë të hiqni {{name}} nga ky mesazh? " email: 'Email' username: 'Emri i përdoruesit' @@ -807,7 +825,14 @@ sq: forgot_password: title: "Rivendos fjalëkalimin" action: "Kam harruar fjalëkalimin" + invite: "Shkruani emrin e përdoruesit ose adresen email dhe ne do t'ju nisim një email për të rivendosur një fjalëkalim të ri." reset: "Rivendos fjalëkalimin" + complete_username: "Nëse në faqe ka një llogari me emër përdoruesi %{username} ju do të merrni një email me udhëzimet sesi mund të rikuperoni fjalëkalimin." + complete_email: "Në në faqe ka një llogari me adresë emaili %{email} ju do të merrni një email me udhëzimet mbi rivendosjen e fjalëkalimit." + complete_username_found: "Gjetëm një llogari që i përket emrit të përdoruesit %{email}, një email me udhëzime sesi të rivendosni fjalëkalimin duhet t'ju vijë së shpejti." + complete_email_found: "Gjetëm një llogari që i përket %{email}, një email me udhëzime sesi të rivendosni fjalëkalimin duhet t'ju vijë së shpejti." + complete_username_not_found: "Nuk ka llogari me emër përdoruesi %{username}" + complete_email_not_found: "Nuk ka llogari për %{email}" login: title: "Identifikohu" username: "Anëtari" @@ -824,26 +849,45 @@ sq: awaiting_confirmation: "Llogaria juaj është në pritje të aktivizimit, përdorni butonin e fjalëkalimit të humbur që të merrni një email të ri me kodin e aktivizimit." awaiting_approval: "Llogaria juaj nuk është aprovuar ende nga një admin. Do t'ju dërgojmë një email kur të aprovohet. " requires_invite: "Na vjen keq, ky forum është vetëm për anëtarë të ftuar. " - to_continue: "Ju lutemi, identifikohuni" + not_activated: "Nuk mund të identifikoheni akoma. Ju kemi dërguar një email aktivizimi tek {{sentTo}}. Ndiqni udhëzimet në atë email për të aktivizuar llogarinë tuaj. " + not_allowed_from_ip_address: "Nuk lejohet identifikimi nga kjo adresë IP." + admin_not_allowed_from_ip_address: "Nuk futesh dot si admin nga kjo adresë IP." + resend_activation_email: "Klikoni këtu për të dërguar sërish email-in e aktivizimit." + sent_activation_email_again: "Ju dërguam një email aktivizimi të ri tek adresa {{currentEmail}}. Emaili mund të vonohet disa minuta, verifikoni edhe dosjen \"spam\". " + to_continue: "Ju lutemi, Identifikohuni" + preferences: "Duhet të identifikoheni për të ndryshuar preferencat e profilit." forgot: "Nuk i mbaj mend detajet e llogarisë" google: title: "me Google" + message: "Duke u identifikuar me Google (bllokuesit e popup-eve duhet të jenë të çaktivizuar)" google_oauth2: title: "me Google" + message: "Duke u identifikuar me Google (bllokuesit e popup-eve duhet të jenë të çaktivizuar)" twitter: title: "me Twitter" + message: "Duke u identifikuar me Twitter (çaktivizoni bllokuesit e popupeve, nëse i përdorni)" + instagram: + title: "me Instagram" + message: "Duke u identifikuar me Instagram (bllokuesit e popup-eve duhet të jenë të çaktivizuar)" facebook: title: "me Facebook" + message: "Duke u identifikuar me Facebook (çaktivizoni bllokuesit e popupeve, nëse i përdorni)" yahoo: title: "me Yahoo" + message: "Duke u identifikuar me Yahoo (bllokuesit e popup-eve duhet të jenë të çaktivizuar)" github: title: "me GitHub" + message: "Duke u identifikuar me Github (bllokuesit e popup-eve duhet të jenë të çaktivizuar)" emoji_set: apple_international: "Apple/International" google: "Google" twitter: "Twitter" emoji_one: "Emoji One" win10: "Win10" + category_page_style: + categories_only: "Vetëm kategoritë" + categories_with_featured_topics: "Kategoritë dhe temat e zgjedhura" + categories_and_latest_topics: "Kategoritë dhe temat e fundit" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' @@ -853,15 +897,19 @@ sq: more_emoji: "më shumë..." options: "Opsione" whisper: "pëshpëritje" + unlist: "çlistuar" add_warning: "Ky është një paralajmërim zyrtar." toggle_whisper: "Hiq pëshpëritjet" + toggle_unlisted: "Toggle Unlisted" posting_not_on_topic: "Cilës temë doni t'i përgjigjeni?" saving_draft_tip: "duke e ruajtur..." saved_draft_tip: "ruajtur" saved_local_draft_tip: "ruajtur lokalisht" similar_topics: "Tema juaj është e ngjashme me..." drafts_offline: "draftet offline" - group_mentioned: "Ju përmendët grupin {{group}}, që do të thotë se do të njoftoni {{count}} persona – a jeni të sigurtë?" + group_mentioned: + one: "By mentioning {{group}}, you are about to notify 1 person – are you sure?" + other: "By mentioning {{group}}, you are about to notify {{count}} people – are you sure?" duplicate_link: "Lidhja drejt {{domain}} duket sikur u postua më par¨´nga @{{username}} në këtë përgjigje {{ago}} – a doni ta postoni sërish?" error: title_missing: "Titulli është i nevojshëm" @@ -892,8 +940,10 @@ sq: show_preview: 'tregoni panelin e parashikimit »' hide_preview: '« fshiheni panelin e parashikimit' quote_post_title: "Citoni të gjithë postimin" - bold_title: "Theksuar" + bold_label: "B" + bold_title: "Trashë" bold_text: "tekst i trashë" + italic_label: "I" italic_title: "Theksuar" italic_text: "tekst i theksuar" link_title: "Lidhje" @@ -911,6 +961,7 @@ sq: olist_title: "Listë e numëruar" ulist_title: "Listë me pika" list_item: "Element liste" + heading_label: "T" heading_title: "Titull" heading_text: "Titull" hr_title: "Vizë ndarëse horizontale" @@ -919,6 +970,9 @@ sq: modal_ok: "OK" modal_cancel: "Anulo" cant_send_pm: "Na vjen keq, nuk mund t'i dërgoni mesazh privat anëtarit %{username}." + yourself_confirm: + title: "Mos harruat të shtonit marrësit?" + body: "Për momentin ky mesazh po ju dërgohet vetëm juve!" admin_options_title: "Rregullime opsionale të stafit për këtë temë" auto_close: label: "Data e mbylljes automatike të temës:" @@ -952,6 +1006,7 @@ sq: invitee_accepted: "
{{username}} pranoi ftesën tuaj
" moved_post: "
{{username}} transferoi {{description}}
" linked: "
{{username}} {{description}}
" + granted_badge: "
Fituat '{{description}}'
" watching_first_post: "
Temë e re {{description}}
" group_message_summary: one: "
{{count}} message in your {{group_name}} inbox
" @@ -969,6 +1024,7 @@ sq: invitee_accepted: "Ftesa u pranua nga" moved_post: "Postimi juaj u transferua nga" linked: "Lidhja drejt postimit tuaj" + granted_badge: "Stema u atribua" group_message_summary: "Mesazhet në inboxin e grupit" popup: mentioned: '{{username}} ju përmendi në "{{topic}}" - {{site_title}}' @@ -984,31 +1040,63 @@ sq: from_my_computer: "Nga kompiuteri im" from_the_web: "Nga Interneti" remote_tip: "lidhje tek imazhi" + remote_tip_with_attachments: "lidhja për imazhin ose skedarin {{authorized_extensions}}" + local_tip: "zgjidh imazhet nga aparati" + local_tip_with_attachments: "zgjidh imazhet apo skedarët nga aparati {{authorized_extensions}}" + hint: "(mundet edhe t'i tërhiqni e lëshoni mbi fushën përmbajtjes për t'i hedhur në faqe)" + hint_for_supported_browsers: "ju mund të tërhiqni e lëshoni imazhet në editorin e tekstit" uploading: "Duke ngarkuar" + select_file: "Zgjdhni një Skedar" + image_link: "linku për imazhin" search: sort_by: "Rendit sipas" + relevance: "Rëndësia" + latest_post: "Postimi i fundit" + most_viewed: "Më të shikuarat" most_liked: "Më të pëlqyer" + select_all: "Zgjidhni Gjithçka" + clear_all: "Pastro kriteret" + too_short: "Fraza e kërkuar është shumë e shkurtër. " result_count: one: "1 rezultat për \"{{term}}\"" other: "{{count}} rezultate për \"{{term}}\"" title: "kërko në faqe" no_results: "Nuk u gjet asnjë rezultat." + no_more_results: "Nuk gjetëm rezultate të tjera. " searching: "Duke kërkuar..." + post_format: "#{{post_number}} nga {{username}}" context: user: "Kërko postime nga @{{username}}" category: "Kërkoni kategorinë #{{category}}" topic: "Kërko tek kjo temë" + private_messages: "Kërko mesazhet" + hamburger_menu: "shko tek një kategori ose një listë e re temash" new_item: "e re" go_back: 'kthehu mbrapa' + not_logged_in_user: 'faqja e përdoruesit me një përmbledhje të aktivitetit dhe preferencave' + current_user: 'shko tek profili yt' topics: + new_messages_marker: "vizita e fundit" bulk: - reset_read: "Reseto leximet" + unlist_topics: "Hiq temat nga lista" + reset_read: "Rivendos leximet" delete: "Fshi temat" + dismiss: "Hiqe" + dismiss_read: "Hiq të gjitha temat e palexuara" + dismiss_button: "Hiqe..." + dismiss_tooltip: "Hiq veç postimet e reja ose ndalo së ndjekuri temat" + also_dismiss_topics: "Mos i gjurmo më këto tema që të mos afishohen më si të palexuara për mua" + dismiss_new: "Hiq të Rejat" + toggle: "toggle bulk selection of topics" actions: "Veprime në masë" change_category: "Ndrysho kategori" close_topics: "Mbyll temat" archive_topics: "Arkivo temat" notification_level: "Ndrysho nivelin e njoftimeve" + choose_new_category: "Zgjidhni kategorinë e re për temat: " + selected: + one: "Keni zgjedhur 1 temë." + other: "Keni zgjedhur {{count}} tema." change_tags: "Ndrysho etiketat" choose_new_tags: "Zgjidh etiketa të reja për këto tema:" changed_tags: "Etiketat e temave u ndryshuan. " @@ -1022,8 +1110,10 @@ sq: bookmarks: "Nuk keni ende tema të preferuara. " category: "Nuk ka tema në: {{category}}." top: "Nuk ka tema popullore." + search: "Nuk ka rezultate nga kërkimi. " educate: new: '
Temat e reja shfaqen këtu.
Automatikisht, temat cilësohen si të reja dhe kanë një shënim i ri nëse janë krijuar gjatë dy ditëve të fundit.
Vizitoni preferencat për t''a ndryshuar këtë parametër.
' + unread: '
Temat e palexuara shfaqen këtu.
Automatikisht, temat klasifikohen si të palexuara dhe kanë etiketa me numër 1 nëse ju:
Ose nëse keni zgjedhur të Gjurmoni ose Vëzhgoni temën duke klikuar në butonin përkatës në fund të çdo teme.
Vizitoni preferencat tuaja për të bërë ndryshime.
'
bottom:
latest: "Nuk ka më tema të reja."
hot: "Nuk ka më tema të nxehta."
@@ -1034,13 +1124,26 @@ sq:
category: "Nuk ka më tema nga {{category}}."
top: "Nuk ka më tema popullore."
bookmarks: "Nuk ka më tema të preferuara."
+ search: "Nuk ka më rezultate nga kërkimi. "
topic:
unsubscribe:
stop_notifications: "Tani ju do të merrni më pak njoftime për {{title}}"
+ change_notification_state: "Statusi juaj i njoftimeve tani është"
+ filter_to:
+ one: "1 postim në temë"
+ other: "{{count}} postime në temë"
create: 'Temë e re'
create_long: 'Hap një temë të re'
+ private_message: 'Fillo një mesazh'
+ archive_message:
+ help: 'Zhvendoseni mesazhin në arkivën tuaj'
+ title: 'Arkivoni'
+ move_to_inbox:
+ title: 'Lëviz në Inbox'
+ help: 'Riktheje mesazhin në inbox'
list: 'Temat'
new: 'temë e re'
+ unread: 'palexuar'
new_topics:
one: '1 temë e re'
other: '{{count}} tema të reja'
@@ -1050,8 +1153,20 @@ sq:
title: 'Tema'
invalid_access:
title: "Tema është private"
+ description: "Na vjen keq, por nuk keni akses tek kjo temë. "
+ login_required: "Duhet të identifikoheni për të parë këtë temë. "
+ server_error:
+ title: "Temën nuk e hapëm dot"
+ description: "Na vjen keq, nuk arritëm t'a ngarkojmue këtë temë, problem serveri. Provoni përsëri më vonë. Nëse problemi vazhdon, ju lutemi të na njoftoni. "
not_found:
title: "Tema nuk u gjet"
+ description: "Na vjen keq, nuk e gjetëm dot temën. Mund të jetë fshirë nga një moderator... "
+ total_unread_posts:
+ one: "ju keni 1 postim të palexuar në këtë temë"
+ other: "ju keni {{count}} postime të palexuara në këtë temë"
+ unread_posts:
+ one: "ju keni 1 postim të vjetër të palexuar në këtë temë"
+ other: "ju keni {{count}} postime të vjetra të palexuara në këtë temë"
new_posts:
one: "ka 1 postim të ri në këtë temë që nga hera e fundit që ishit këtu"
other: "ka {{count}} postime të reja në këtë temë që nga hera e fundit që ishit këtu"
@@ -1060,32 +1175,40 @@ sq:
other: "ka {{count}} pëlqime në këtë temë"
back_to_list: "Kthehu tek lista e temave"
options: "Opsionet e temës"
+ show_links: "trego lidhjet në këtë temë"
toggle_information: "më shumë mbi temën"
read_more_in_category: "Dëshironi të lexoni më shumë? Shfleto temat në {{catLink}} ose {{latestLink}}."
read_more: "Dëshironi të lexoni më shumë? {{catLink}} ose {{latestLink}}."
browse_all_categories: Shfleto kategoritë
view_latest_topics: shiko temat më të fundit
suggest_create_topic: Pse nuk hapni një temë të re?
+ jump_reply_up: hidhe tek përgjigja paraardhëse
+ jump_reply_down: hidhu tek përgjigja pasardhëse
+ deleted: "Tema është fshirë"
+ auto_close_notice: "Kjo temë do të mbyllet automatikisht %{timeLeft}."
+ auto_close_notice_based_on_last_post: "Kjo temë do të mbyllet %{duration} pas përgjigjes së fundit. "
+ auto_close_title: 'Rregullimet e Mbylljes Automatike'
auto_close_save: "Ruaj"
+ auto_close_remove: "Mos e Mbyll Automatikisht Këtë Temë"
timeline:
back: "Kthehu mbrapa"
back_description: "Kthehu mbrapa tek postimi i fundit i palexuar"
- replies: "%{current} / %{total} përgjigje"
replies_short: "%{current} / %{total}"
progress:
title: progresi i temës
go_top: "sipër"
go_bottom: "poshtë"
go: "shko"
+ jump_bottom: "hidhu tek përgjigja e fundit"
jump_prompt: "hidhu tek tema"
jump_prompt_long: "Tek cila temë doni të shkoni?"
+ jump_bottom_with_number: "shko tek përgjigja %{post_number}"
total: totali i postimeve
current: postimi aktual
- position: "tema %{current} nga %{total}"
notifications:
title: ndryshoni sa shpesh njoftoheni mbi këtë temë
reasons:
- '3_10': 'Ju do të njoftoheni duke qënë se jeni duke vëzhguar etiketën e kësaj teme. '
+ '3_10': 'Do të merrni njoftime sepse po vëzhgoni një etiketë në këtë temë. '
'3_6': 'Ju do të merrni njoftime sepse jeni duke vëzhguar këtë kategori. '
'3_5': 'Ju do të njoftoheni duke qënë se jeni duke gjurmuar këtë temë automatikisht. '
'3_2': 'Ju do të njoftoheni duke qënë se jeni duke vëzhguar këtë temë. '
@@ -1125,75 +1248,159 @@ sq:
title: "Pa njoftime"
description: "Ju nuk do të njoftoheni për asgjë mbi këtë temë, dhe tema nuk do të shfaqet në listën e temave më të fundit. "
actions:
+ recover: "Rivendos temën"
delete: "Fshi temën"
open: "Hap temën"
close: "Mbyll temën"
+ multi_select: "Përzgjidhni Postimet..."
+ auto_close: "Mbylle Automatikisht..."
+ pin: "Ngjite temën..."
+ unpin: "Çngjite temën..."
+ unarchive: "Çarkivoje temën"
+ archive: "Arkivoje temën"
+ invisible: "Hiqeni nga Listat"
+ visible: "Listojeni"
make_public: "Bëje temën publike"
make_private: "Bëje mesazh privat"
+ feature:
+ pin: "Ngjite temën"
+ unpin: "Çngjite temën"
+ pin_globally: "Ngjite temën globalisht"
+ make_banner: "Temë banderolë"
+ remove_banner: "Çaktivizo temën banderolë"
reply:
title: 'Përgjigju'
help: 'shkruaj një përgjigje tek kjo temë'
+ clear_pin:
+ title: "Clear pin"
+ help: "Hiqeni statusin \"e ngjitur\" të kësaj teme që të mos afishohet më në majë të listës së temave"
share:
title: 'Shpërndaje'
help: 'shpërndani një lidhje mbi temën'
flag_topic:
title: 'Sinjalizo'
help: 'sinjalizo privatisht këtë temë ose dërgo një njoftim privat'
+ success_message: 'Sinjalizimi juaj i kësaj teme u krye me sukses. '
+ feature_topic:
+ title: "Temë në plan të parë"
+ pin: "Shfaqe këtë temë në krye të kategorisë {{categoryLink}} deri më"
+ confirm_pin: "Ju tashmë keni {{count}} tema të përzgjedhura. Shumë tema të përzgjedhura mund të bëhen barrë për përdorues të rinj dhe anonimë. A jeni i sigurtë që dëshironi ta përzgjidhni një temë tjetër në këtë kategori?"
+ unpin: "Remove this topic from the top of the {{categoryLink}} category."
+ unpin_until: "Remove this topic from the top of the {{categoryLink}} category or wait until %{until}."
+ pin_note: "Përdoruesit mund ta çngjitin këtë temë veçan sipas dëshirës."
+ pin_validation: "Kërkohet data për ta ngjitur këtë temë në krye."
+ not_pinned: "Nuk ka tema të përzgjedhura në {{categoryLink}}."
+ already_pinned:
+ one: "Temat kryesore të momentit në {{categoryLink}}: 1"
+ other: "Temat kryesore të momentit në {{categoryLink}}: {{count}}"
+ pin_globally: "Shfaqe këtë temë në krye të listës së të gjitha temave deri më"
+ confirm_pin_globally: "Ju tashmë keni {{count}} tema të përzgjedhura. Shumë tema të përzgjedhura mund të bëhen barrë për përdorues të rinj dhe anonimë. A jeni i sigurtë që dëshironi ta përzgjidhni një temë tjetër të gjithanëshme?"
+ global_pin_note: "Përdoruesit mund ta çngjitin këtë temë veçan sipas dëshirës."
+ not_pinned_globally: "Nuk ka tema të përzgjedhura kudo."
+ already_pinned_globally:
+ one: "Të gjitha temat kryesore të momentit: 1"
+ other: "Të gjitha temat kryesore të momentit: {{count}}"
+ make_banner: "Ktheje këtë temë në një temë parrullë që shfaqet në krye të të gjitha faqeve."
+ banner_note: "Përdoruesit mund ta heqin temën parrullë duke e mbyllur atë. Vetëm një temë mund të kthehet në parrullë në një moment të caktuar."
+ no_banner_exists: "Nuk ka temë parrullë."
+ banner_exists: "Për momentin ka një temë parrullë."
+ automatically_add_to_groups: "Kjo ftesë përfshin edhe akses për këto grupe:"
invite_private:
title: 'Ftoje në këtë mesazh'
email_or_username: "Emaili ose emri i përdoruesit të të ftuarit"
+ email_or_username_placeholder: "adresa email ose emri i përdoruesit"
action: "Ftoni"
success: "Anëtari u ftua të marrë pjesë në këtë mesazh. "
- group_name: "emri grupit"
+ group_name: "emri i grupit"
+ controls: "Veprimet e temës"
invite_reply:
title: 'Ftoni'
username_placeholder: "emri i përdoruesit"
action: 'Dërgoni ftesën'
help: 'ftoni të tjerë në këtë temë nëpërmjet emailit ose njoftimeve'
+ to_forum: "Do të dërgojmë një email të shkurtër që do ta lejojë mikun tuaj të regjistrohet menjëherë duke klikuar një lidhje, pa kërkuar hyrjen në sistem."
sso_enabled: "Vendosni emrin e përdoruesit që dëshironi të ftoni në këtë temë"
to_topic_blank: "Vendosni emrin e përdoruesit ose adresën email të personit që dëshironi të ftoni në këtë temë"
+ to_topic_email: "Ju keni shtuar një adresë email. Ne do t'i dërgojmë një ftesë në email që do ta lejojë mikun tuaj t'i përgjigjet menjëherë kësaj teme."
+ to_topic_username: "Ju shtuat një emër përdoruesi. Ne do t'i dërgojmë një njoftim me një lidhje duke i ftuar ata në këtë temë."
to_username: "Vendosni emrin e përdoruesit që dëshironi të ftoni. Sistemi do i dërgojë një njoftim me një lidhje drejt kësaj teme. "
email_placeholder: 'emri@adresa.com'
success_email: "Sistemi dërgoi një ftesë për {{emailOrUsername}}. Do t'ju njoftojmë kur ftesa të jetë pranuar. Shikoni edhe faqen Ftesat nën profilin tuaj të anëtarit për të parë statusin e ftesave. "
success_username: "Ky anëtar u ftua të marrë pjesë në këtë temë. "
error: "Nuk e ftuam dot këtë person. A ka mundësi që të jetë ftuar më parë?"
- login_reply: 'Identifikohu për t''u përgjigjur'
+ login_reply: 'Identifikohu për t''u Përgjigjur'
filters:
n_posts:
one: "1 postim"
other: "{{count}} postime"
cancel: "Hiq filtrin"
+ split_topic:
+ title: "Ktheje në një temë të re"
+ action: "ktheje në një temë të re"
+ topic_name: "Titulli i temës së re"
+ error: "Pati një gabim gjatë transfertës drejt një teme të re."
+ instructions:
+ one: "Jeni duke krijuar një temë të re dhe duke e populluar atë me postimin që keni përzgjedhur."
+ other: "Jeni duke krijuar një temë të re dhe duke e populluar atë me {{count}} postimet që keni përzgjedhur."
+ merge_topic:
+ title: "Transfero tek një Temë tjetër"
+ action: "transfero tek një temë tjetër"
+ error: "Pati një gabim gjatë transfertës drejt një teme tjetër."
+ instructions:
+ one: "Ju lutem zgjidhni një temë ku do dëshironit ta zhvendosni këtë postim."
+ other: "Ju lutem, zgjidhni një temë ku do të dëshironit të zhvendosni këto {{count}} postime."
+ merge_posts:
+ title: "Bashkoni Postimet e Përzgjedhura"
+ action: "bashkoni postimet e përzgjedhura"
+ error: "Ndodhi një gabim ndërsa po bashkoheshin postimet e përzgjedhura."
change_owner:
+ title: "Ndrysho autorin e postimeve"
action: "ndrysho zotëruesin"
+ error: "Pati një gabim gjatë ndryshimit të autorit të postimeve."
+ label: "Autori i ri i postimeve"
+ placeholder: "emri i përdoruesit të autorit"
+ change_timestamp:
+ title: "Ndrysho Datën"
+ action: "ndrysho datën"
+ invalid_timestamp: "Data nuk mund të jetë në të ardhmen."
+ error: "Hasëm në një gabim gjatë ndryshimit të datës së temës. "
+ instructions: "Ju lutem zgjidhni një datë postimi për temën. Postimet në temë do të përditësohen për të patur të njëjtën diferencë kohore."
multi_select:
select: 'zgjidh'
+ selected: 'të zgjedhura ({{count}})'
delete: fshij të përzgjedhurat
cancel: anulo përzgjedhjen
select_all: përzgjidhi të gjitha
+ deselect_all: pastro zgjedhjen
+ description:
+ one: Keni përzgjedhur 1 postim.
+ other: Keni përzgjedhur {{count}} postime.
post:
- quote_reply: "cito përgjigjen"
+ reply: " {{replyAvatar}} {{usernameLink}}"
+ reply_topic: " {{link}}"
edit: "Duke modifikuar {{link}} {{replyAvatar}} {{username}}"
edit_reason: "Arsyeja:"
post_number: "postimi {{number}}"
last_edited_on: "redaktimi i fundit u krye më"
reply_as_new_topic: "Përgjigju në një temë të re të ndërlidhur"
continue_discussion: "Vazhdim i diskutimit nga tema {{postLink}}:"
+ follow_quote: "shko tek tema e cituar"
show_full: "Shfaq postimin e plotë"
show_hidden: 'Shfaq materialin e fshehur.'
deleted_by_author:
one: "(post withdrawn by author, will be automatically deleted in %{count} hour unless flagged)"
other: "(postim i tërhequr nga autori, do të fshihet automatikisht në %{count} orë nëse nuk sinjalizohet)"
+ expand_collapse: "zgjero/shkurto"
gap:
one: "shiko 1 përgjigje të fshehur"
other: "shiko {{count}} përgjigje të fshehura"
- more_links: "{{count}} më shumë..."
unread: "Postimi është i palexuar"
has_replies:
one: "{{count}} Përgjigje"
other: "{{count}} përgjigje"
has_likes:
one: "{{count}} Pëlqim"
- other: "{{count}} pëlqime"
+ other: "{{count}} Pëlqime"
has_likes_title:
one: "1 person pëlqeu këtë postim"
other: "{{count}} vetë pëlqyen këtë postim"
@@ -1204,13 +1411,23 @@ sq:
errors:
create: "Na vjen keq, por ndodhi një gabim gjatë hapjes së temës. Provojeni përsëri."
edit: "Na vjen keq, ndodhi një gabim gjatë redaktimit të temës. Provojeni përsëri."
+ upload: "Na vjen keq, pati një gabim gjatë ngarkimit të skedarit. Provo përsëri. "
file_too_large: "Na vjen keq, skedari është shumë i madh (maksimumi i lejuar është {{max_size_kb}}kb). Mund t'a vendosni këtë skedar të madh në një faqe tjetër dhe të vendosni këtu vetëm lidhjen."
too_many_uploads: "Na vjen keq, por duhet t'i ngarkoni skedarët një nga një."
+ too_many_dragged_and_dropped_files: "Na vjen keq, po ju mund të ngarkoni vetëm 10 skedarë njëkohësisht. "
+ upload_not_authorized: "Na vjen keq, skedari që po ngarkoni nuk është i autorizuar (tipet e skedarëve të lejuar: {{authorized_extensions}})."
+ image_upload_not_allowed_for_new_user: "Na vjen keq, anëtarët e rinj nuk mund të ngarkojnë skedarë. "
+ attachment_upload_not_allowed_for_new_user: "Na vjen keq, anëtarët e rinj nuk mund të ngarkojnë skedarë. "
+ attachment_download_requires_login: "Na vjen keq, duhet të identifikoheni për të shkarkuar një dokument. "
abandon:
+ confirm: "A jeni të sigurtë se do të braktisni postimin?"
no_value: "Jo, mbaji"
yes_value: "Po, braktise"
via_email: "ky postim u dërgua me email"
via_auto_generated_email: "ky postim u krijua nga një email automatik"
+ whisper: "ky postim është një pëshpëritje private për moderatorët"
+ wiki:
+ about: "kjo temë është wiki"
archetypes:
save: 'Ruaj opsionet'
few_likes_left: "Ju falenderojmë! Ju kanë ngelur edhe disa pëlqime për sot."
@@ -1238,61 +1455,171 @@ sq:
convert_to_moderator: "Shto ngjyrë stafi"
revert_to_regular: "Hiq ngjyrën e stafit"
rebake: "Rindërtoni HTML"
+ unhide: "Çfshi"
change_owner: "Ndrysho zotëruesin"
actions:
flag: 'Sinjalizoni'
- it_too:
- bookmark: "Shtoje edhe tek Të preferuarat"
- like: "E pëlqejnë"
+ defer_flags:
+ one: "Shty sinjalizimin"
+ other: "Shty sinjalizimet"
undo:
+ off_topic: "Anulo sinjalizimin"
+ spam: "Anulo sinjalizimin"
+ inappropriate: "Anulo sinjalizimin"
bookmark: "Hiqe nga të preferuarat"
like: "Anulo pëlqimin"
vote: "Rikthe votën"
people:
- like: "pëlqyen këtë"
+ off_topic: "sinjalizoi këtë postim si jashtë teme"
+ spam: "sinjalizoi këtë postim si spam"
+ inappropriate: "sinjalizoi këtë postim si të papërshtatshëm"
+ notify_moderators: "njoftoi moderatorët"
+ notify_user: "dërgoi një mesazh"
+ bookmark: "e shtoi këtë tek të preferuarat"
+ like: "pëlqeu këtë"
+ vote: "votoi për këtë"
by_you:
+ off_topic: "Ti sinjalizove këtë postim si jashtë teme"
+ spam: "Ti sinjalizove këtë postim si spam"
+ inappropriate: "Ti sinjalizove këtë postim si të papërshtatshëm"
+ notify_moderators: "Ti sinjalizove këtë postim për moderim"
+ notify_user: "Ju i dërguat një mesazh këtij përdoruesi"
+ bookmark: "E ruajte këtë temë tek të preferuarat e tua"
like: "Ju e pëlqyet këtë"
+ vote: "Votove për këtë postim"
by_you_and_others:
+ off_topic:
+ one: "Ti dhe 1 anëtar tjetër sinjalizuat këtë postim si jashtë teme"
+ other: "Ti dhe {{count}} anëtarë të tjerë sinjalizuat këtë postim si jashtë teme"
+ spam:
+ one: "Ti dhe 1 anëtar tjetër sinjalizuat këtë postim si spam"
+ other: "Ti dhe {{count}} anëtarë të tjerë sinjalizuat këtë postim si spam"
+ inappropriate:
+ one: "Ti dhe 1 anëtar tjetër sinjalizuat këtë postim si të papërshtatshëm"
+ other: "Ti dhe {{count}} anëtarë të tjerë sinjalizuat këtë postim si të papërshtatshëm"
+ notify_moderators:
+ one: "Ti dhe 1 anëtar tjetër sinjalizuat këtë postim për moderim"
+ other: "Ti dhe {{count}} anëtarë të tjerë sinjalizuat këtë postim për moderim"
+ notify_user:
+ one: "Ju dhe 1 person tjetër i dërguat një mesazh këtij përdoruesi."
+ other: "Ju dhe {{count}} persona të tjerë i dërguat një mesazh këtij përdoruesi."
+ bookmark:
+ one: "Ti dhe 1 anëtar tjetër shtuat këtë postim tek të preferuarat tuaja"
+ other: "Ti dhe {{count}} anëtarë të tjerë shtuat këtë postim tek të preferuarat tuaja"
like:
one: "Ju dhe 1 person tjetër pëlqyet këtë "
other: "Ju dhe {{count}} të tjerë pëlqyen këtë postim"
+ vote:
+ one: "Ti dhe 1 anëtar tjetër votuat për këtë postim"
+ other: "Ti dhe {{count}} anëtarë të tjerë votuat për këtë postim"
by_others:
+ off_topic:
+ one: "1 anëtar sinjalizoi këtë postim si jashtë teme"
+ other: "{{count}} anëtarë sinjalizuan këtë postim si jashtë teme"
+ spam:
+ one: "1 anëtar sinjalizoi këtë postim si spam"
+ other: "{{count}} anëtarë sinjalizuan këtë postim si spam"
+ inappropriate:
+ one: "1 anëtar sinjalizoi këtë postim si të papërshtatshëm"
+ other: "{{count}} anëtarë sinjalizuan këtë postim si të papërshtatshëm"
+ notify_moderators:
+ one: "1 anëtar sinjalizoi këtë postim për moderim"
+ other: "{{count}} anëtarë sinjalizuan këtë postim për moderim"
+ notify_user:
+ one: "1 person i dërgoi një mesazh këtij përdoruesi"
+ other: "{{count}} i dërguan një mesazh këtij përdoruesi"
+ bookmark:
+ one: "1 anëtar shtoi këtë postim tek të preferuarat"
+ other: "{{count}} anëtarë shtuan këtë postim tek të preferuarat"
like:
one: "1 person pëlqeu këtë postim"
other: "{{count}} vetë pëlqyen këtë postim"
+ vote:
+ one: "1 anëtar votoi për këtë postim"
+ other: "{{count}} anëtarë votuan për këtë postim"
+ merge:
+ confirm:
+ one: "Jeni i sigurtë që dëshironi t'i bashkoni këto postime?"
+ other: "Jeni i sigurtë që dëshironi t'i bashkoni këto {{count}} postime?"
revisions:
controls:
+ first: "Revizioni i parë"
+ previous: "Revizioni i shkuar"
+ next: "Revizioni i ardhshëm"
+ last: "Revizioni i fundit"
+ hide: "Fshihe revizionin"
+ show: "Trego revizionin"
+ revert: "Rikthe këtë version"
comparing_previous_to_current_out_of_total: "{{previous}} {{current}} / {{total}}"
displays:
inline:
+ title: "Show the rendered output with additions and removals inline"
button: ' HTML'
side_by_side:
+ title: "Show the rendered output diffs side-by-side"
button: ' HTML'
+ side_by_side_markdown:
+ title: "Show the raw source diffs side-by-side"
+ button: ' Raw'
category:
+ can: 'mund… '
none: '(pa kategori)'
all: 'Të gjitha kategoritë'
+ choose: 'Zgjidhni një kategori…'
edit: 'redakto'
edit_long: "Redakto"
- general: 'I përgjithshëm'
+ view: 'Shiko temat në kategorinë'
+ general: 'Karakteristika të përgjithshme'
settings: 'Rregullimet'
+ topic_template: "Shabllon i Temës"
tags: "Etiketat"
+ tags_allowed_tags: "Etiketat që mund të përdoren vetëm në këtë kategori"
+ tags_allowed_tag_groups: "Grupet e etiketave që mund të përdoren vetëm në këtë kategori:"
+ tags_placeholder: "(Opsionale) lista e etiketave të lejuara"
+ tag_groups_placeholder: "(Opsionale) lista e grupeve të etiketave"
delete: 'Fshini kategorinë'
- create: 'Kategori e re'
+ create: 'Krijo kategorinë e re'
create_long: 'Krijo një kategori të re'
save: 'Ruaj kategorinë'
+ slug: 'Slug i kategorisë'
+ slug_placeholder: '(Optional) dashed-words for url'
+ creation_error: Pati një gabim gjatë krijimit të kategorisë
+ save_error: Pati një gabim gjatë ruajtjes së kategorisë
name: "Emri i kategorisë"
description: "Përshkrimi"
+ topic: "category topic"
+ logo: "Logo e kategorisë"
+ background_image: "Imazhi i sfondit për kategorinë"
+ badge_colors: "Ngjyrat e stemës"
background_color: " Ngjyra e sfondit"
+ foreground_color: "Foreground color"
+ name_placeholder: "Maksimumi një ose dy fjalë"
color_placeholder: "Çdo ngjyrë web"
+ delete_confirm: "Jeni i sigurtë që dëshironi ta fshini këtë kategori?"
+ delete_error: "Pati një gabim gjatë fshirjes së kategorisë."
list: "Shfaq kategoritë"
+ no_description: "Shto një përshkrim për këtë kategori."
change_in_category_topic: "Redakto përshkrimin"
+ already_used: 'Kjo ngjyrë është përdorur nga një kategori tjetër'
security: "Siguria"
+ special_warning: "Warning: This category is a pre-seeded category and the security settings cannot be edited. If you do not wish to use this category, delete it instead of repurposing it."
images: "Imazhet"
+ auto_close_label: "Mbylle automatikisht temën pas:"
auto_close_units: "orë"
+ email_in: "Custom incoming email address:"
+ email_in_allow_strangers: "Prano emaila nga anëtarë anonimë pa llogari në faqe"
+ email_in_disabled: "Postimi i temave të reja me email është çaktivizuar në Rregullimet e faqes. Për të aktivizuar postimet e temave të reja me email,"
+ email_in_disabled_click: 'aktivizo rregullimin "email in".'
+ suppress_from_homepage: "Hiqe këtë kategori nga faqja e parë."
+ allow_badges_label: "Lejo të jepen stemat në këtë kategori"
edit_permissions: "Ndryshoni autorizimet"
add_permission: "Shtoni autorizim"
this_year: "këtë vit"
position: "pozicion"
+ default_position: "Default Position"
+ position_disabled: "Kategoritue do të renditen sipas aktivitetit. Për të kontrolluar renditjen e kategorive nëpër lista, "
+ position_disabled_click: 'aktivizoni rregullimin "pozicione fikse për kategoritë".'
+ parent: "Kategoria prind"
notifications:
watching:
title: "Në vëzhgim"
@@ -1314,7 +1641,6 @@ sq:
notify_action: 'Mesazh'
official_warning: 'Paralajmërim zyrtar'
delete_spammer: "Elimino Spammer"
- delete_confirm: "Jeni duke fshirë %{posts} postime dhe %{topics} tema nga ky anëtar. Gjithashtu, po fshini llogarinë e tij/saj, po bllokoni regjistrime të reja nga adresa IP %{ip_address}, dhe po shtoni adresën email %{email} në një listë adresash të bllokuara. A jeni të sigurtë që ky anëtar është spammer?"
yes_delete_spammer: "Po, Elimino Spammer"
ip_address_missing: "(N/A)"
hidden_email_address: "(fshehur)"
@@ -1329,41 +1655,71 @@ sq:
custom_placeholder_notify_user: "Jini specifikë, konstruktiv dhe gjithmonë të sjellshëm."
custom_placeholder_notify_moderators: "Na thoni specifikisht se çfarë ju shqetëson dhe na jepni lidhje dhe shembuj konkretë brenda mundësive. "
custom_message:
- at_least: "shkruaj të pakën {{n}} karaktere "
- more: "{{n}} shko tek..."
- left: "mund të shkruani edhe {{n}} shkronja"
+ at_least:
+ one: "futni së paku 1 gërmë"
+ other: "futni së paku {{count}} gërma"
+ more:
+ one: "edhe 1 për të vazhduar..."
+ other: "edhe {{count}} për të vazhduar..."
+ left:
+ one: "edhe 1 gërmë"
+ other: "edhe {{count}} gërma"
flagging_topic:
title: "Faleminderit për ndihmën që i jepni këtij komuniteti!"
action: "Raporto Temën"
notify_action: "Message"
topic_map:
title: "Përmbledhja e Temës"
+ participants_title: "Postues të Shpeshtë"
+ links_title: "Lidhje Aktive"
links_shown: "trego më shumë lidhje..."
clicks:
one: "1 klik"
other: "%{count} klikime"
post_links:
+ about: "trego më shumë lidhje për këtë postim"
title:
one: "edhe 1"
other: "edhe %{count}"
topic_statuses:
warning:
help: "Ky është një paralajmërim zyrtar."
+ locked:
+ help: "Kjo temë është mbyllur; nuk pranon më përgjigje"
+ archived:
+ help: "Kjo temë është arkivuar; nuk mund të bëhen ndryshime "
+ locked_and_archived:
+ help: "Kjo temë është mbyllur dhe arkivuar; nuk pranohen përgjigje apo ndryshime"
+ unpinned:
+ title: "Jo e përzgjedhur"
+ help: "Kjo temë është e çngjitur për ju; do të paraqitet në renditje normale"
+ pinned_globally:
+ title: "E përzgjedhur Kudo"
+ help: "Kjo temë është e ngjitur globalisht; do të paraqitet në majë të postimeve të reja dhe të kategorisë përkatëse"
+ pinned:
+ title: "E përzgjedhur"
+ help: "Kjo temë është e ngjitur për ju; do të paraqitet në majë të kategorisë përkatëse"
+ invisible:
+ help: "Kjo temë nuk është e listuar, pra nuk do të paraqitet nue listat e temave të faqes dhe mund të shikohet vetëm me lidhje direkte"
posts: "Postime"
- posts_lowercase: "postime"
+ posts_long: "ka {{number}} postime në temë"
original_post: "Postimi Origjinal"
views: "Shikimet"
+ views_lowercase:
+ one: "shikim"
+ other: "shikime"
replies: "Përgjigjet"
+ views_long: "kjo temë është parë {{number}} herë"
activity: "Aktiviteti"
likes: "Pëlqimet"
likes_lowercase:
- one: "like"
+ one: "pëlqim"
other: "pëlqime"
likes_long: "ka {{number}} pëlqime në këtë temë"
- users: "Anëtarët"
+ users: "Përdoruesit"
users_lowercase:
- one: "anëtar"
- other: "anëtarët"
+ one: "përdorues"
+ other: "përdorues"
category_title: "Kategoria"
history: "Historia"
changed_by: "nga {{author}}"
@@ -1371,6 +1727,8 @@ sq:
title: "Raw Email"
categories_list: "Lista Kategorive"
filters:
+ with_topics: "Temat nga %{filter}"
+ with_category: "Temat nga: %{filter}, %{category}"
latest:
title: "Më të fundit"
title_with_count:
@@ -1410,7 +1768,7 @@ sq:
other: "Të reja ({{count}})"
help: "temat e krijuar gjatë ditëve të fundit"
posted:
- title: "Postimet e Mia"
+ title: "Postimet e mia"
help: "temat ku keni dërguar pêrgjigje"
bookmarks:
title: "Të preferuarat"
@@ -1422,22 +1780,27 @@ sq:
other: "{{categoryName}} ({{count}})"
help: "temat e fundit në kategorinë {{categoryName}}"
top:
- title: "Top"
+ title: "Popullore"
help: "temat më aktive të vitit, muajit, javës apo ditës së shkuar"
all:
title: "Gjithë Kohës"
yearly:
title: "Vjetore"
+ quarterly:
+ title: "Tremujorsh"
monthly:
title: "Mujore"
weekly:
title: "Javore"
daily:
title: "Ditore"
- all_time: "Gjithë Kohës"
- this_year: "Vit"
- this_week: "javë"
+ all_time: "Gjithë kohës"
+ this_year: "Këtë vit"
+ this_quarter: "Këtë tremujor"
+ this_month: "Këtë muaj"
+ this_week: "Këtë javë"
today: "Sot"
+ other_periods: "shiko më populloret"
browser_update: 'Fatkeqësisht, shfletuesi juaj është shumë i vjetër për këtë faqe. Ju lutemi, azhornoni shfletuesin.'
permission_types:
full: "Krijo / Përgjigju / Shiko"
@@ -1445,8 +1808,6 @@ sq:
readonly: "Shiko"
lightbox:
download: "shkarko"
- search_help:
- title: 'Kërko faqet e ndihmës'
keyboard_shortcuts_help:
title: 'Shkurtimet e tastierës '
jump_to:
@@ -1465,13 +1826,76 @@ sq:
jump: '# Shko tek postimi #'
back: 'u Mbrapa'
application:
+ title: 'Aplikimi'
create: 'c Hap një temë të re'
+ notifications: 'n Hap njoftimet'
+ hamburger_menu: '= Hap menunë hamburger'
+ user_profile_menu: 'p Hap menunë e përdoruesit'
+ show_incoming_updated_topics: '. Shiko temat e përditësuara'
+ search: '/ Kërko'
+ help: '? Trego shkurtimet e tastierës'
+ dismiss_new_posts: 'x, r Hiq Të Rejat/Postimet'
+ dismiss_topics: 'x, t Hiq temat'
+ log_out: 'shift+z shift+z Shkëputu'
+ actions:
+ title: 'Veprimet'
+ bookmark_topic: 'f Shto/hiq temën nga të preferuarat'
+ pin_unpin_topic: 'shift+p Ngjit/çngjit temën'
+ share_topic: 'shift+s Shpërndaje temën'
+ share_post: 's Shpërnda postimin'
+ reply_as_new_topic: 't Përgjigju në një temë të lidhur'
+ reply_topic: 'shift+r Përgjigju temës'
+ reply_post: 'r Përgjigju postimit'
+ quote_post: 'q Cito postimin'
+ like: 'l Pëlqeje postimin'
+ flag: '! Sinjalizo postimin'
+ bookmark: 'b Shto postimin tek të preferuarat'
+ edit: 'e Redakto postimin'
+ delete: 'd Fshi postimin'
+ mark_muted: 'm, m Bëje temë të heshtur'
+ mark_regular: 'm, r Shënoje temën si të zakonshme'
+ mark_tracking: 'm, t Ndiqe temën'
+ mark_watching: 'm, w Vëzhgoje temën'
badges:
+ earned_n_times:
+ one: "Kjo stemë është fituar 1 herë"
+ other: "Kjo stemë është fituar %{count} herë"
+ granted_on: "Atribuar më %{date}"
+ others_count: "Të tjerë me këtë stemë (%{count})"
+ title: Stemat
+ allow_title: "titulli i disponueshëm"
+ multiple_grant: "akorduar disa herë"
+ badge_count:
+ one: "1 stemë"
+ other: "%{count} stema"
+ more_badges:
+ one: "+1 tjetër"
+ other: "+%{count} të tjera"
+ granted:
+ one: "1 e akorduar"
+ other: "%{count} të akorduara"
+ select_badge_for_title: Zgjidhni një stemë për ta përdorur si titullin tuaj
+ none: "
+ Kërko me Google
+
tagging: all_tags: "Të gjitha etiketat" selector_all_tags: "të gjitha etiketat" @@ -1517,6 +1941,7 @@ sq: one_per_topic_label: "Vetëm 1 etiketë për temë nga ky grup" new_name: "Grup i ri etiketash" save: "Ruaj" + delete: "Fshije" confirm_delete: "Jeni të sigurtë që doni të fshini këtë grup etiketash?" topics: none: @@ -1552,14 +1977,19 @@ sq: moderator: 'Moderator' dashboard: title: "Paneli i kontrollit" + last_updated: "Rinovimi i fundit:" version: "Versioni" up_to_date: "Jeni të azhurnuar!" critical_available: "Përditësim i rëndësishëm." updates_available: "Ka përditësime." please_upgrade: "Ju lutem, azhornoje!" + no_check_performed: "Verifikimi i updejteve nuk është kryer. Sigurohuni që sidekiq punon. " + stale_data: "Verifikimi i updejteve nuk është kryer këto kohët e fundit. Sigurohuni që sidekiq punon. " version_check_pending: "Me sa shohim keni rinovuar faqen se fundmi. Fantastike!" installed_version: "Instaluar" latest_version: "Të fundit" + problems_found: "Gjetëm ca probleme me instalimin tuaj të sistemit Discourse." + last_checked: "Verifikimi i fundit" refresh_problems: "Rifresko" no_problems: "Nuk u gjet asnjë gabim." moderators: 'Moderatorët:' @@ -1571,7 +2001,12 @@ sq: mobile_title: "Mobile" space_free: "{{size}} lirë" uploads: "ngarkime" + backups: "backupe" traffic_short: "Trafik" + traffic: "Kërkesat web të aplikimit" + page_views: "Kërkesat në API" + page_views_short: "Kërkesat në API" + show_traffic_report: "Trego raportin e detajuar të trafikut" reports: today: "Sot" yesterday: "Dje" @@ -1583,85 +2018,152 @@ sq: all: "Të Gjithë" view_table: "tabelë" view_graph: "grafik" + refresh_report: "Rifresko raportin" + start_date: "Dita e fillimit" + end_date: "Dita e fundit" + groups: "Të gjitha grupet" commits: by: "nga" flags: - old: "Të Vjetër" + title: "Sinjalizimet" + old: "Të Vjetra" active: "Aktive" agree: "Pranoj" + agree_title: "Konfirmo këtë sinjalizim si të vlefshëm do korrekt" agree_flag_modal_title: "Prano dhe..." + agree_flag_hide_post: "Dakord (fshi postimin + ço MP)" + agree_flag_hide_post_title: "Fshihe këtë postim automatikisht dhe çoi postuesit një mesazh që t'a redaktojë postimin" + agree_flag_restore_post: "Dakord (rikthe postimin)" agree_flag_restore_post_title: "Rikthe këtë postim" + agree_flag: "Bi dakord me sinjalizimin" agree_flag_title: "Dakord me sinjalizimin dhe lini postimin të pandryshuar" + defer_flag: "Shty" + defer_flag_title: "Hiqe këtë sinjalizim; nuk ka nevojë për veprime në këtë moment. " delete: "Fshij" delete_title: "Fshini postimin e sinjalizuar." delete_post_defer_flag: "Fshini postimin dhe shtyni për më vonë sinjalizimin" + delete_post_defer_flag_title: "Fshini postimin; në qoftë postim i parë, fshihet tema" delete_post_agree_flag: "Fshini postimin dhe bini dakord me sinjalizimin" + delete_post_agree_flag_title: "Fshini postimin; në qoftë postim i parë, fshihet tema" + delete_flag_modal_title: "Fshi dhe..." delete_spammer: "Elimino Spammer" + delete_spammer_title: "Fshijeni përdoruesin dhe të gjitha temat e postimet nga ky përdorues." + disagree_flag_unhide_post: "Jo dakord (anullo fshehjen e postimit)" disagree_flag_unhide_post_title: "Hiqni të gjitha sinjalizimet mbi këtë postim dhe ripublikojeni postimin" - clear_topic_flags: "U krye" + disagree_flag: "Jo dakord" + disagree_flag_title: "Refuzo sinjalizimin (është i pavlefshëm ose i pasaktë)" + clear_topic_flags: "Përfundo" + clear_topic_flags_title: "Kjo temë është shqyrtuar dhe problemet janë zgjidhur. Kliko Përfundo për të hequr sinjalizimet. " more: "(më shumë përgjigje...)" dispositions: agreed: "dakort" + disagreed: "nuk ishte dakord" + deferred: "shtyu" + flagged_by: "Sinjalizuar nga" resolved_by: "Zgjidhur nga" + took_action: "Mori veprimin" system: "Sistemi" + error: "Pati një gabim" reply_message: "Përgjigju" no_results: "Nuk ka sinjalizime." + topic_flagged: "Kjo temë është sinjalizuar." + visit_topic: "Vizito temën për të vepruar" was_edited: "Postimi është redaktuar pas sinjalizimit të parë" previous_flags_count: "Ky postim është sinjalizuar {{count}} herë." summary: + action_type_3: + one: "jashtë teme" + other: "jashtë teme x{{count}}" + action_type_4: + one: "e papërshtatshme" + other: "e papërshtatshme x{{count}}" + action_type_6: + one: "tjetër" + other: "tjetër x{{count}}" + action_type_7: + one: "tjetër" + other: "tjetër x{{count}}" action_type_8: one: "spam" other: "spam x{{count}}" groups: primary: "Grupi Parësor" + no_primary: "(asnjë grup parësor)" title: "Grupet" edit: "Redakto Grup" refresh: "Rifresko" new: "I Ri" - group_members: "Anëtarët e grupit" + selector_placeholder: "vendos emrin e përdoruesit" + about: "Modifiko anëtarët e grupit dhe emrin këtu" + group_members: "Përdorues grupi" delete: "Fshij" - name: "Emri" + delete_confirm: "Fshije këtë grup?" + delete_failed: "Nuk e fshimë dot grupin. Nëse ky është një grup automatik, nuk fshihet dot. " + delete_owner_confirm: "Hiqe privilegjin e pronarit për '%{username}'?" add: "Shto" add_members: "Shto Anëtar" + custom: "Grupet e krijuara" + bulk_complete: "Përdoruesit iu shtuan grupit." + bulk: "Shto në masë tek grupi" + bulk_paste: "Ngjit një listë përdoruesisht ose adresash email, 1 për çdo rresht:" + bulk_select: "(zgjidhni një grup)" automatic: "Automatik" + group_owners: Pronarët + add_owners: Shto pronarë api: generate_master: "Gjenero Master API Key" - user: "Anëtarë" + none: "Për momentin, nuk ka çelësa API aktivë." + user: "Përdorues" title: "API" key: "API Key" generate: "Gjenero" regenerate: "Rigjenero" revoke: "Revoko" - all_users: "Gjithë Anëtarët" + info_html: "Çelësi juaj API ju lejon të krijoni dhe updejtoni tema nëpërmjet thirrjeve JSON." + all_users: "Gjithë Përdoruesit" + note_html: "Mbaje këtë çelës sekret, të gjithë përdoruesit që e kanë mund të krijojnë postime me të. " + web_hooks: + title: "Webhooks" plugins: - title: "Shtojca" - installed: "Shtojcat e Instaluara" + title: "Pluginet" + installed: "Pluginet e instaluar" name: "Emri" + none_installed: "Nuk keni instaluar asnjë plugin. " version: "Versioni" enabled: "Aktivizuar?" is_enabled: "Y" not_enabled: "N" change_settings: "Ndrysho Rregullimet" change_settings_short: "Rregullimet" + howto: "Si mund të instaloj një plugin?" backups: - title: "Backups" + title: "Rezervat" menu: - backups: "Backups" + backups: "Rezervat" logs: "Logs" + none: "Nuk ka asnjë kopje." + read_only: + enable: + title: "Aktivizo mënyrën vetëm-lexo" columns: filename: "Filename" upload: + label: "Ngarko" uploading: "Duke ngarkuar..." operations: cancel: label: "Anulo" backup: label: "Backup" + title: "Krijo një kopje" confirm: "Do you want to start a new backup?" download: label: "Shkarko" + title: "Shkarko kopjen" restore: label: "Rikthe" + rollback: + label: "Rikthe mbrapa" export_csv: failed: "Eksporti dështoi. Kontrolloni log-et. " button_text: "Eksporto" @@ -1678,50 +2180,117 @@ sq: button_title: "Dërgo ftesa" customize: title: "Personalizo" + long_title: "Personalizimet" css: "CSS" + header: "Ballina" + top: "Popullore" + footer: "Fundi i faqes" + embedded_css: "CSS e ngjitur" head_tag: text: "" + title: "HTML që do të vendoset para mbylles së tagut
" body_tag: text: "" + title: "HTML që do të vendoset para mbylljes së tagut
" title: " etiketinden önce eklenecek HTML" - override_default: "Standart stil sayfasını eklemeyin" - enabled: "Etkinleştirildi mi?" + override_default: "Standart biçim sayfasını eklemeyin" + enabled: "Etkin mi?" preview: "önizleme" undo_preview: "önizlemeyi kaldır" - rescue_preview: "varsayılan stil" - explain_preview: "Websitesine bu özelleştirilmiş stil sayfası ile bak" - explain_undo_preview: "Şu an etkin olan özelleştirilmiş stil sayfasına geri dön" - explain_rescue_preview: "Websitesine varsayılan stil sayfası ile bak" + rescue_preview: "öntanımlı biçim" + explain_preview: "Websitesine bu özelleştirilmiş biçim sayfası ile bak" + explain_undo_preview: "Şu an etkin olan özelleştirilmiş biçim sayfasına geri dön" + explain_rescue_preview: "Websitesine varsayılan biçim sayfası ile bak" save: "Kaydet" new: "Yeni" - new_style: "Yeni Stil" + new_style: "Yeni Biçim" import: "İçeri Aktar" import_title: "Bir dosya seçin ya da kopyalayıp yapıştırın" delete: "Sil" delete_confirm: "Bu özelleştirmeyi sil?" - about: "Websitesindeki CSS stil sayfalarını ve HTML başlıklarını değiştir. Özelleştirme ekleyerek başla." + about: "Sitedeki CSS biçim sayfalarını ve HTML başlıklarını değiştir. Özelleştirme ekleyerek başla." color: "Renk" opacity: "Opaklık" copy: "Kopyala" @@ -2145,16 +2312,16 @@ tr_TR: subject: "Konu" multiple_subjects: "Bu e-posta şablonunda birden fazla konu mevcut." body: "İçerik" - none_selected: "Düzenlemeye başlamak için içerik tipi seçin. " - revert: "Değişiklikleri Sıfırla" - revert_confirm: "Değişiklikleri sıfırlamak istediğinize emin misiniz?" + none_selected: "Düzenlemeye başlamak için bir e-posta şablonu seçin. " + revert: "Değişiklikleri Geri Al" + revert_confirm: "Değişikliklerinizi geri almak istediğinize emin misiniz?" css_html: title: "CSS/HTML" long_title: "CSS ve HTML Özelleştirmeleri" colors: title: "Renkler" long_title: "Renk Düzenleri" - about: "Websitesindeki renkleri CSS yazmadan değiştir. Renk düzeni ekleyerek başla." + about: "Sitede kullanılan renkleri CSS yazmadan değiştir. Renk düzeni ekleyerek başla." new_name: "Yeni Renk Düzeni" copy_name_prefix: "Kopyası" delete_confirm: "Bu renk düzenini sil?" @@ -2167,10 +2334,10 @@ tr_TR: description: 'Çoğu yazı, ikon ve kenarların rengi.' secondary: name: 'ikincil' - description: 'Ana arkaplan ve bazı butonların yazı rengi.' + description: 'Ana arkaplan ve bazı düğmelerinin yazı rengi.' tertiary: name: 'üçüncül' - description: 'Bağlantı, bazı buton, bildiri ve vurguların rengi.' + description: 'Bağlantı, bazı düğmeler, bildirimler ve vurguların rengi.' quaternary: name: "dördüncül" description: "Navigasyon bağlantıları." @@ -2185,13 +2352,13 @@ tr_TR: description: 'Sayfada vurgulanmış ögelerin, gönderi ve konu gibi, arkaplan rengi.' danger: name: 'tehlike' - description: 'Gönderi ve konu silme gibi aksiyonlar için vurgulama rengi.' + description: 'Gönderi ve konu silme gibi eylemler için vurgulama rengi.' success: name: 'başarı' - description: 'Seçeneğin başarılı olduğunu göstermek için kullanılır.' + description: 'Eylemin başarılı olduğunu göstermek için kullanılır.' love: name: 'sevgi' - description: "Beğen butonunun rengi." + description: "Beğen düğmesinin rengi." email: title: "E-postalar" settings: "Ayarlar" @@ -2199,9 +2366,10 @@ tr_TR: preview_digest: "Özeti Önizle" sending_test: "Test e-postası gönderiliyor..." error: "HATA - %{server_error}" - test_error: "Test e-postasının gönderilmesinde sorun yaşandı. Lütfen e-posta ayarlarınızı tekrar kontrol edin, yer sağlayıcınızın e-posta bağlantılarını bloke etmediğinden emin olun, ve tekrar deneyin." + test_error: "Test e-postasının gönderilmesinde sorun yaşandı. Lütfen e-posta ayarlarınızı tekrar kontrol edin, yer sağlayıcınızın e-posta bağlantılarını engellemediğinden emin olun, ve tekrar deneyin." sent: "Gönderildi" skipped: "Atlandı" + bounced: "Geri Sekenler" received: "Alındı" rejected: "Reddedildi" sent_at: "Gönderildiği Zaman" @@ -2215,7 +2383,10 @@ tr_TR: delivery_method: "Gönderme Metodu" preview_digest_desc: "Durgun kullanıcılara gönderilen özet e-postaların içeriğini önizle." refresh: "Yenile" - format: "Format" + send_digest_label: "Bu sonucu şuna gönder:" + send_digest: "Gönder" + sending_email: "E-posta gönderiliyor..." + format: "Biçim" html: "html" text: "yazı" last_seen_user: "Son Görülen Kullanıcı:" @@ -2229,30 +2400,30 @@ tr_TR: error: "Hata" none: "Gelen e-posta yok." modal: - title: "Gelen E-posta Detayları" + title: "Gelen E-posta Ayrıntıları" error: "Hata" headers: "Başlıklar" subject: "Konu" body: "İçerik" rejection_message: "Ret E-postası" filters: - from_placeholder: "from@example.com" - to_placeholder: "to@example.com" - cc_placeholder: "cc@example.com" + from_placeholder: "bundan@ornek.com" + to_placeholder: "suna@ornek.com" + cc_placeholder: "cc@ornek.com" subject_placeholder: "Konu..." error_placeholder: "Hata" logs: none: "Hiç bir kayıt bulunamadı." filters: - title: "Filtre" + title: "Süzgeç" user_placeholder: "kullanıcıadı" address_placeholder: "isim@örnek.com" - type_placeholder: "özet, üye olma..." + type_placeholder: "özet, kayıt olma..." reply_key_placeholder: "cevapla tuşu" skipped_reason_placeholder: "neden" logs: title: "Kayıtlar" - action: "İşlem" + action: "Eylem" created_at: "Oluşturuldu" last_match_at: "En Son Eşlenen" match_count: "Eşleşmeler" @@ -2267,27 +2438,27 @@ tr_TR: block: "engelle" do_nothing: "hiçbir şey yapma" staff_actions: - title: "Görevli Seçenekleri" - instructions: "Kullanıcı adları ve aksiyonlara tıklayarak listeyi filtrele. Profil resimlerine tıklayarak kullanıcı sayfalarına git." + title: "Görevli Eylemleri" + instructions: "Kullanıcı adları ve eylemlere tıklayarak listeyi süz. Profil resimlerine tıklayarak kullanıcı sayfalarına git." clear_filters: "Hepsini Göster" staff_user: "Görevli Kullanıcı" target_user: "Hedef Kullanıcı" subject: "Konu" when: "Ne zaman" context: "Durum" - details: "Detaylar" + details: "Ayrıntılar" previous_value: "Önceki" new_value: "Yeni" diff: "Diff" show: "Göster" - modal_title: "Detaylar" + modal_title: "Ayrıntılar" no_previous: "Bir önceki değer yok." deleted: "Yeni değer yok. Kayıt silindi." actions: delete_user: "kullanıcıyı sil" change_trust_level: "güven seviyesini değiştir" change_username: "kullanıcı adını değiştir" - change_site_setting: "websitesi ayarlarını değiştir" + change_site_setting: "site ayarlarını değiştir" change_site_customization: "websitesinin özelleştirmesini değiştir" delete_site_customization: "websitesinin özelleştirmesini sil" change_site_text: "site metnini değiştir" @@ -2304,19 +2475,19 @@ tr_TR: change_category_settings: "kategori ayarlarını değiştir" delete_category: "kategoriyi sil" create_category: "kategori oluştur" - block_user: "kullanıcıyı blokla" + block_user: "kullanıcıyı engelle" unblock_user: "kullanıcı engelini kaldır" grant_admin: "yönetici yetkisi ver" revoke_admin: "yönetici yetkisini kaldır" grant_moderation: "moderasyon yetkisi ver" revoke_moderation: "moderasyon yetkisini kaldır" - backup_operation: "yedek operasyonu" + backup_operation: "yedekleme operasyonu" deleted_tag: "silinmiş etiket" renamed_tag: "yeniden adlandırılmış etiket" - revoke_email: "e-posta kaldır" + revoke_email: "e-postayı kaldır" screened_emails: title: "Taranmış E-postalar" - description: "Biri yeni bir hesap oluşturmaya çalıştığında, aşağıdaki e-posta adresleri kontrol edilecek ve kayıt önlenecek veya başka bir aksiyon alınacak." + description: "Biri yeni bir hesap oluşturmaya çalıştığında, aşağıdaki e-posta adresleri kontrol edilecek ve kayıt önlenecek veya başka bir eylem gerçekleşecek." email: "E-posta Adresi" actions: allow: "İzin Ver" @@ -2327,7 +2498,7 @@ tr_TR: domain: "Alan Adı" screened_ips: title: "Taranmış IPler" - description: 'İzlenen IP adresleri. IP adreslerini beyaz listeye aktarmak için "İzin ver"i kullan.' + description: 'Gözlenen IP adresleri. IP adreslerini beyaz listeye aktarmak için "İzin ver"i kullan.' delete_confirm: "%{ip_address} için konulan kuralı kaldırmak istediğinize emin misiniz?" roll_up_confirm: "Tüm ortaklaşa taranmış IP adreslerini subnetlere toplamak istediğinize emin misiniz?" rolled_up_some_subnets: "Bu subnetlere başarıyla toplanmış tüm engellenen IP girişleri: %{subnets}." @@ -2404,18 +2575,19 @@ tr_TR: suspend_reason: "Neden" suspended_by: "Uzaklaştıran" delete_all_posts: "Tüm gönderileri sil" - delete_all_posts_confirm: "%{posts} gönderi ve %{topics} konu silmek üzeresiniz. Emin misiniz?" + delete_all_posts_confirm_MF: "{POSTS, plural, one {1 gönderi} other {# gönderi}} ve {TOPICS, plural, one {1 konu} other {# konu}} silmek üzeresiniz. Emin misiniz?" suspend: "Uzaklaştır" unsuspend: "Uzaklaştırmayı geri al" suspended: "Uzaklaştırıldı mı?" moderator: "Moderatör mü?" admin: "Yönetici mi?" blocked: "Engellendi mi?" + staged: "Aşamalı?" show_admin_profile: "Yönetici" edit_title: "Başlığı Düzenle" save_title: "Başlığı Kaydet" refresh_browsers: "Tarayıcıyı sayfa yenilemesine zorla" - refresh_browsers_message: "Mesaj tüm kullanıcılara gönderildi!" + refresh_browsers_message: "İleti tüm kullanıcılara gönderildi!" show_public_profile: "Herkese Açık Profili Görüntüle" impersonate: 'Rolüne gir' ip_lookup: "IP Arama" @@ -2429,17 +2601,17 @@ tr_TR: block: 'Engelle' reputation: İtibar permissions: İzinler - activity: Aktivite - like_count: Beğenileri / Beğendikleri + activity: Etkinlik + like_count: Verilen / Alınan Beğeniler last_100_days: 'son 100 günde' private_topics_count: Özel Konular posts_read_count: Okuduğu Gönderiler post_count: Oluşturduğu Gönderiler topics_entered: Görüntülediği Konular - flags_given_count: Verilen Bayraklar - flags_received_count: Alınan Bayraklar + flags_given_count: Yapılan Bildirimler + flags_received_count: Alınan Bildirimler warnings_received_count: Uyarılar Alındı - flags_given_received_count: 'Alınan / Verilen Bayraklar' + flags_given_received_count: 'Yapılan / Alınan Bildirimler' approve: 'Onayla' approved_by: "onaylayan" approve_success: "Kullanıcı onaylandı ve etkinleştirme bilgilerini içeren bir e-posta yollandı." @@ -2447,7 +2619,7 @@ tr_TR: time_read: "Okunma Süresi" anonymize: "Kullanıcıyı Anonimleştir" anonymize_confirm: "Bu hesabı anonimleştirmek istediğinize EMİN misiniz? Kullanıcı adı ve e-posta değiştirilecek, ve tüm profil bilgileri sıfırlanacak." - anonymize_yes: "Evet, bu hesap anonimleştir" + anonymize_yes: "Evet, bu hesabı anonimleştir" anonymize_failed: "Hesap anonimleştirilirken bir hata oluştu." delete: "Kullanıcıyı Sil" delete_forbidden_because_staff: "Yöneticiler ve moderatörler silinemez." @@ -2466,19 +2638,26 @@ tr_TR: send_activation_email: "Etkinleştirme E-postası Gönder" activation_email_sent: "Etkinleştirme e-postası gönderildi." send_activation_email_failed: "Tekrar etkinleştirme e-postası gönderilirken bir sorun yaşandı. %{error}" - activate: "Hesabı aktifleştir" + activate: "Hesabı etkinleştir" activate_failed: "Kullanıcı etkinleştirilirken bir sorun yaşandı." deactivate_account: "Hesabı Pasifleştir" deactivate_failed: "Kullanıcı deaktive edilirken bir sorun yaşandı." unblock_failed: 'Kullanıcının engeli kaldırılırken bir sorun yaşandı.' block_failed: 'Kullanıcı engellenirken bir sorun yaşandı.' - block_confirm: 'Bu kullanıcıyı bloklamak istediğinize emin misiniz? Bunu yaparsanız yeni başlık ya da gönderi oluşturamayacak.' - block_accept: 'Evet, bu kullanıcıyı blokla' + block_confirm: 'Bu kullanıcıyı engellemek istediğinize emin misiniz? Bunu yaparsanız yeni başlık ya da gönderi oluşturamayacak.' + block_accept: 'Evet, bu kullanıcıyı engelle' + bounce_score: "Geri Sekme Skoru" reset_bounce_score: - label: "Yenile" + label: "Sıfırla" + title: "Geri sekme skorunu 0'a çek" deactivate_explanation: "Deaktive edilmiş bir kullanıcı e-postasını tekrar doğrulamalı." suspended_explanation: "Uzaklaştırılmış kullanıcılar sistemde oturum açamaz." block_explanation: "Engellenmiş bir kullanıcı gönderi oluşturamaz veya konu başlatamaz." + staged_explanation: "Aşamalı bir kullanıcı sadece belirli konularda e-posta ile gönderide bulunabilir." + bounce_score_explanation: + none: "Bu e-posta adresinden yakın zamanda hiç geri sekme alınmadı." + some: "Bu e-posta adresinden yakın zamanda bazı geri sekmeler alındı. " + threshold_reached: "Bu e-posta adresinden birçok geri sekme alındı. " trust_level_change_failed: "Kullanıcının güven seviyesi değiştirilirken bir sorun yaşandı." suspend_modal_title: "Kullanıcıyı Uzaklaştır" trust_level_2_users: "Güven Seviyesi 2 Olan Kullanıcılar" @@ -2489,7 +2668,8 @@ tr_TR: unlock_trust_level: "Güvenlik Seviyesi Kilidini Aç" tl3_requirements: title: "Güven Seviyesi 3 için Gerekenler" - table_title: "Son %{time_period} günde" + table_title: + other: "Son %{count} günde:" value_heading: "Değer" requirement_heading: "Gereksinim" visits: "Ziyaretler" @@ -2499,8 +2679,8 @@ tr_TR: topics_viewed_all_time: "Görüntülenmiş Konular (Tüm zamanlar)" posts_read: "Okunmuş Gönderiler" posts_read_all_time: "Okunmuş Gönderiler (Tüm zamanlarda)" - flagged_posts: "Bayraklanan Gönderiler" - flagged_by_users: "Bayraklayan Kullanıcılar" + flagged_posts: "Bildirilen Gönderiler" + flagged_by_users: "Bildiren Kullanıcılar" likes_given: "Verilen Beğeniler" likes_received: "Alınan Beğeniler" likes_received_days: "Alınan beğeniler: tekil günlük" @@ -2538,7 +2718,7 @@ tr_TR: enabled: "gerekli" disabled: "isteğe bağlı" editable: - title: "Üyelik sonrası düzenlenebilir mi?" + title: "Kayıt sonrası düzenlenebilir mi?" enabled: "düzenlenebilir" disabled: "düzenlenemez" show_on_profile: @@ -2547,8 +2727,8 @@ tr_TR: disabled: "profilde gösterilmiyor" show_on_user_card: title: "Kullanıcı profilinde gösterilsin mi?" - enabled: "Kullanıcı profilinde göster" - disabled: "Kullanıcı profilinde gösterme" + enabled: "kullanıcı profilinde gösterildi" + disabled: "kullanıcı kartında gösterilmiyor" field_types: text: 'Yazı Alanı' confirm: 'Onay' @@ -2558,10 +2738,10 @@ tr_TR: search: "Düzenlemek istediğiniz metni arayın" title: 'Yazı İçeriği' edit: 'düzenle' - revert: "Değişiklikleri Sıfırla" - revert_confirm: "Değişiklikleri sıfırlamak istediğinize emin misiniz?" + revert: "Değişiklikleri Geri Al" + revert_confirm: "Değişikliklerinizi geri almak istediğinize emin misiniz?" go_back: "Aramaya geri dön" - recommended: "İzleyen metni ihtiyaçlarınıza uygun şekilde özelleştimenizi öneririz:" + recommended: "İzleyen metni ihtiyaçlarınıza uygun şekilde özelleştirmenizi öneririz:" show_overriden: 'Sadece değiştirdiklerimi göster' site_settings: show_overriden: 'Sadece değiştirdiklerimi göster' @@ -2582,19 +2762,21 @@ tr_TR: files: 'Dosyalar' trust: 'Güven Seviyeleri' security: 'Güvenlik' - onebox: "Tek Kutu" + onebox: "Kutulama" seo: 'SEO' - spam: 'Spam' + spam: 'İstenmeyen ' rate_limits: 'Oran Sınırları' developer: 'Geliştirici' embedding: "Yerleştirme" legal: "Yasal" + user_api: 'Kullanıcı APIsi' uncategorized: 'Diğer' backups: "Yedekler" login: "Oturum Açma" plugins: "Eklentiler" user_preferences: "Kullanıcı Tercihleri" tags: "Etiketler" + search: "Arama" badges: title: Rozetler new_badge: Yeni Rozet @@ -2610,7 +2792,7 @@ tr_TR: modal_title: Rozet Gruplamaları granted_by: Tarafından Verildi granted_at: Tarihinde Verildi - reason_help: (Bir mesaj ya da konuya bağlantı) + reason_help: (Bir gönderi ya da konuya bağlantı) save: Kaydet delete: Sil delete_confirm: Bu rozeti silmek istediğinize emin misiniz? @@ -2643,7 +2825,7 @@ tr_TR: post_revision: "Bir kullanıcı bir gönderiyi düzenlediğinde veya yeni bir gönderi oluşturduğunda" trust_level_change: "Bir kullanıcı güven seviyesini değiştirdiğinde" user_change: "Bir kullanıcı düzenlendiğinde veya oluşturduğunda" - post_processed: "Gönderi işlendikten sonra" + post_processed: "Bir gönderi işlendikten sonra" preview: link_text: "Verilen rozetleri önizle" plan_text: "Sorgu planıyla önizle" @@ -2670,26 +2852,28 @@ tr_TR: image: "Görsel" delete_confirm: ":%{name}: emojisini silmek istediğinize emin misiniz?" embedding: - get_started: "Eğer Discourse'u bir başka web sitesine gömmek istiyorsanız, bu sitenin hostunu ekleyerek başlayın." - confirm_delete: "Bu hostu silmek istediğinize emin misiniz?" + get_started: "Eğer Discourse'u bir başka web sitesine gömmek istiyorsanız, bu sitenin sunucusunu ekleyerek başlayın." + confirm_delete: "Bu sunucuyu silmek istediğinize emin misiniz?" sample: "Discourse konuları oluşturmak ve gömmek için aşağıdaki HTML kodunu sitenizde kullanın. REPLACE_ME'yi Discourse'u gömdüğünüz sayfanın tam URL'i ile değiştirin." title: "Gömme" - host: "İzin Verilen Hostlar" + host: "İzin Verilen Sunucular" + path_whitelist: "Kabul edilen yol listesi" edit: "düzenle" category: "Kategoriye Gönder" - add_host: "Host Ekle" + add_host: "Sunucu Ekle" settings: "Ayarları Gömmek" - feed_settings: "Ayarları Besle" + feed_settings: "RSS Ayarları" feed_description: "Siteniz için bir RSS/ATOM beslemesi sağlamanız Discourse'un içeriğinizi içe aktarma yeteneğini geliştirebilir." crawling_settings: "Böcek Ayarları" crawling_description: "Discourse gönderileriniz için konular oluşturduğu zaman, eğer bir RSS/ATOM beslemesi yoksa içeriğinizi HTML'inizden ayrıştırmaya çalışacaktır. Bazen içeriğinizi çıkartmak çok zor olabilir, bu yüzden ayrıştırmayı kolaylaştırmak için CSS kuralları belirtme yeteneği sağlıyoruz." embed_by_username: "Konu oluşturmak için kullanıcı adı" embed_post_limit: "Gömmek için en büyük gönderi sayısı" embed_username_key_from_feed: "Discourse kullanıcı adını beslemeden çekmek için anahtar" + embed_title_scrubber: "Gönderilerin başlığını temizlemek için kullanılan düzenli ifade" embed_truncate: "Gömülü gönderileri buda" embed_whitelist_selector: "Gömülüler içinde izin verilen elementler için CSS seçici" embed_blacklist_selector: "Gömülülerden kaldırılan elementler için CSS seçici" - embed_classname_whitelist: "CSS Sınıf isimlerine izin verildi" + embed_classname_whitelist: "İzin verilen CSS sınıf isimleri" feed_polling_enabled: "Konuları RSS/ATOM aracılığıyla içe aktar" feed_polling_url: "İstila etmek için RSS/ATOM beslemesi URL'i" save: "Gömme Ayarlarını Kaydet" @@ -2708,3 +2892,21 @@ tr_TR: label: "Yeni:" add: "Ekle" filter: "Ara (Bağlantı veya Harici Bağlantı)" + wizard_js: + wizard: + done: "Tamamlandı" + back: "Geri" + next: "İleri" + step: "%{current} / %{total}" + upload: "Yükle" + uploading: "Yükleniyor..." + quit: "Belki Sonra" + staff_count: + other: "Topluluğunuzda %{count} görevli üye var." + invites: + add_user: "ekle" + none_added: "Herhangi bir görevli davet etmediniz. Devam etmek istediğinize emin misiniz?" + roles: + admin: "Yönetici" + moderator: "Moderatör" + regular: "Müdavim Kullanıcı" diff --git a/config/locales/client.uk.yml b/config/locales/client.uk.yml index 70d691b1f3d..8ce95ff0917 100644 --- a/config/locales/client.uk.yml +++ b/config/locales/client.uk.yml @@ -53,6 +53,8 @@ uk: one: "1 день тому" few: "днів тому: %{count}" other: "%{count} днів тому" + previous_month: 'Попередній місяць' + next_month: 'Наступний місяць' share: topic: 'поширити посилання на цю тему' post: 'допис #%{postNumber}' @@ -63,6 +65,18 @@ uk: email: 'надіслати це посилання електронною поштою' topic_admin_menu: "керування темою" emails_are_disabled: "Надсилання повідомлень електронною поштою було глобально вимкнено адміністратором. Жодне сповіщення електронною поштою не буде надіслано." + s3: + regions: + us_west_2: "США Захід (Орегон)" + eu_west_1: "ЄС (Ірландія)" + eu_central_1: "ЄС (Франкфурт)" + ap_southeast_1: "Азія (Сингапур)" + ap_southeast_2: "Азія (Сідней)" + ap_south_1: "Азія (Мумбай)" + ap_northeast_1: "Азія (Токіо)" + ap_northeast_2: "Азія (Сеул)" + sa_east_1: "Південна Америка (Сан Паоло)" + cn_north_1: "Китай (Пекін)" edit: 'редагувати назву та категорію цієї теми' not_implemented: "Цей функціонал ще не реалізовано, даруйте!" no_value: "Ні" @@ -76,7 +90,12 @@ uk: admin_title: "Адмін" flags_title: "Скарги" show_more: "показати більше" + show_help: "налаштування" links: "Посилання" + links_lowercase: + one: "посилання" + few: "посилань" + other: "посилання" faq: "Часті запитання" guidelines: "Інструкції" privacy_policy: "Політика конфіденційності" @@ -91,6 +110,8 @@ uk: more: "Більше" less: "Менше" never: "ніколи" + every_30_minutes: "кожні 30 хвилин" + every_hour: "щогодини" daily: "щодня" weekly: "щотижня" every_two_weeks: "кожні два тижні" @@ -153,6 +174,7 @@ uk: saved: "Збережено!" upload: "Завантажити" uploading: "Завантаження..." + uploading_filename: "Вивантаження {{ім'я файлу}}..." uploaded: "Завантажено!" enable: "Включити" disable: "Відключити" @@ -161,6 +183,7 @@ uk: failed: "Помилка" banner: close: "Сховати" + edit: "Редагувати цей банер >>" choose_topic: none_found: "Не знайдено тем." title: @@ -193,29 +216,63 @@ uk: sent_by_user: "Надіслано користувачем {{user}}" sent_by_you: "Надіслано Вами" directory: + filter_name: "фільтрувати за іменем користувача" title: "Користувачі" + likes_received: "Отримано" + topics_entered: "Переглянуто" + topics_entered_long: "Тем переглянуто" topic_count: "Теми" topic_count_long: "Тем створено" post_count: "Відповіді" no_results: "Нічого не знайдено." + days_visited: "Відвідини" + days_visited_long: "Днів відвідано" + posts_read: "Прочитані" + posts_read_long: "Повідомлень Прочитано" total_rows: one: "%{count} користувач" few: "%{count} користувачі" other: "%{count} користувачів" + group_histories: + actions: + change_group_setting: "Змінити налаштування групи" + add_user_to_group: "Добавити користувача" + remove_user_from_group: "Видалити користувача" groups: + logs: + subject: "Тема" + details: "Деталі" + from: "Від" + to: "До" + edit: + title: 'Редагувати Групу' + full_name: 'Повне Ім''я' + add_members: "Добавити учасників" + delete_member_confirm: "Видалити '%{username}' з групи '%{group}'?" + add: "Додати" + closed_group: Закрита Група + selector_placeholder: "Додати учасників" visible: "Група видна всім користувачам" title: one: "група" few: "групи" other: "групи" members: "Учасники" + topics: "Теми" posts: "Дописи" + mentions: "Згадки" + messages: "Повідомлення" alias_levels: nobody: "Ніхто" only_admins: "Лише адміністратори" mods_and_admins: "Лише модератори та адміністратори" members_mods_and_admins: "Лише участики групи, модератори та адміністратори" everyone: "Усі" + notifications: + watching: + title: "Слідкувати" + tracking: + title: "Стежити" user_action_groups: '1': "Вподобані" '2': "Отримані вподобання" @@ -227,19 +284,21 @@ uk: '11': "Редагування" '12': "Надіслані" '13': "Вхідні" + '14': "Очікують" categories: all: "всі категорії" all_subcategories: "все" no_subcategory: "немає" category: "Категорія" + reorder: + apply_all: "Застосувати" + position: "Позиція" posts: "Повідомлення" topics: "Теми" latest: "Останні" latest_by: "Останні від" toggle_ordering: "показати/сховати елемент керування для впорядкування" subcategories: "Підкатегорії" - topic_stats: "Кількість нових тем." - post_stats: "Кількість нових дописів." ip_lookup: title: Пошук IP адреси hostname: Ім'я хоста @@ -259,7 +318,8 @@ uk: profile: "Профіль" mute: "Mute" edit: "Редагувати налаштування" - download_archive: "Завантажити мої дописи" + download_archive: + button_text: "Завантажити мої дописи" new_private_message: "Нове повідомлення" private_message: "Повідомлення" private_messages: "Повідомлення" @@ -270,7 +330,9 @@ uk: invited_by: "Запрошений(а)" trust_level: "Рівень довіри" notifications: "Сповіщення" + statistics: "Статистика" desktop_notifications: + label: "Сповіщення" perm_default: "Ввімкнути сповіщення" perm_denied_btn: "Немає доступу" disable: "Вимкнути сповіщення" @@ -288,15 +350,22 @@ uk: suspended_notice: "Цього користувача призупинено до {{date}}." suspended_reason: "Причина: " github_profile: "Github" + mailing_list_mode: + daily: "Надсилати щоденні оновлення" + individual: "Надсилати всі нові дописи мені електронною поштою" + watched_tags: "Відслідковувані" + tracked_tags: "Відстежувані" watched_categories: "Відслідковувані" tracked_categories: "Відстежувані" muted_categories: "Ігноровані" - delete_account: "Delete My Account" + delete_account: "Видалити обліковий запис" delete_account_confirm: "Are you sure you want to permanently delete your account? This action cannot be undone!" deleted_yourself: "Your account has been deleted successfully." delete_yourself_not_allowed: "You cannot delete your account right now. Contact an admin to do delete your account for you." unread_message_count: "Повідомлення" admin_delete: "Видалити" + users: "Користувачі" + api_approved: "Схвалено:" staff_counters: flags_given: "корисні позначки" flagged_posts: "Позначені дописи" @@ -305,6 +374,14 @@ uk: warnings_received: "попередження" messages: all: "Всі" + inbox: "Вхідні" + sent: "Надіслано" + archive: "Архів" + groups: "Мої Групи" + bulk_select: "Вибрати повідомлення" + move_to_inbox: "Перемістити у Вхідні" + move_to_archive: "Архів" + select_all: "Обрати все" change_password: success: "(лист надіслано)" in_progress: "(надсилання листа)" @@ -347,6 +424,7 @@ uk: ok: "Ваше ім’я виглядає добре" username: title: "Ім'я користувача" + available: "Ваше ім'я доступне" global_mismatch: "Вже зареєстровано. Спробуєте {{suggestion}}?" not_available: "Не доступно. Спробуєте {{suggestion}}?" too_short: "Ваше ім'я закоротке" @@ -355,6 +433,7 @@ uk: locale: title: "Interface language" default: "(default)" + any: "будь-який" password_confirmation: title: "Пароль ще раз" last_posted: "Останній допис" @@ -367,7 +446,15 @@ uk: title: "Візитка користувача" website: "Вебсайт" email_settings: "Електронна пошта" + like_notification_frequency: + always: "Завжди" + never: "Ніколи" + email_previous_replies: + always: "завжди" + never: "ніколи" email_digests: + every_30_minutes: "кожні 30 хвилин" + every_hour: "щогодини" daily: "щодня" every_three_days: "кожні 3 дні" weekly: "щотижня" @@ -380,13 +467,23 @@ uk: auto_track_topics: "Автоматично слідкувати за темами, що я відвідав" auto_track_options: never: "ніколи" + immediately: "негайно" + after_30_seconds: "після 30 секунд" + after_1_minute: "після 1 хвилини" + after_2_minutes: "після 2 хвилин" + after_3_minutes: "після 3 хвилин" + after_4_minutes: "після 4 хвилин" + after_5_minutes: "після 5 хвилин" + after_10_minutes: "після 10 хвилин" invited: search: "шукати запрошення..." title: "Запрошення" user: "Запрошений користувач" + sent: "Надіслано" redeemed: "Прийняті запрошення" redeemed_at: "Прийнято" pending: "Запрошення, що очікують" + pending_tab: "Очікують" topics_entered: "Тем переглянуто" posts_read_count: "Прочитано дописів" expired: "Термін дії цього запрошення сплив." @@ -398,7 +495,6 @@ uk: create: "Надіслати Запрошення" bulk_invite: text: "Масове Запрошення з Файлу" - error: "Під час завантаження '{{filename}}' сталася помилка: {{message}}" password: title: "Пароль" too_short: "Ваш пароль надто короткий." @@ -406,6 +502,11 @@ uk: same_as_username: "Ваш пароль ідентичний імені користувача" same_as_email: "Ваш пароль ідентичний Вашому email" ok: "Ваш пароль добрий." + summary: + title: "Підсумок" + stats: "Статистика" + time_read: "час читання" + more_topics: "Більше тем" ip_address: title: "Остання IP-адреса" registration_ip_address: @@ -419,6 +520,7 @@ uk: stream: posted_by: "Опубліковано" sent_by: "Надіслано" + private_message: "повідомлення" the_topic: "тема" loading: "Завантаження..." errors: @@ -452,6 +554,10 @@ uk: mute: Mute unmute: Unmute last_post: Останній допис + signup_cta: + sign_up: "Зареєструватись" + hide_session: "Нагадати мені завтра" + hide_forever: "ні дякую" summary: enable: 'Підсумувати цю тему' disable: 'Показати всі дописи' @@ -461,6 +567,7 @@ uk: enable: "Сховати Видалені Дописи" disable: "Показати видалені дописи" private_message_info: + title: "Повідомлення" invite: "Запросити інших..." remove_allowed_user: "Ви впевнені, що хочете видалити {{name}} з цього повідомлення?" email: 'Електронна пошта' @@ -469,10 +576,12 @@ uk: created: 'Створено' created_lowercase: 'створено' trust_level: 'Рівень довіри' + search_hint: 'ім''я користувача, email або IP-адреса' create_account: title: "Створити Новий Обліковий Запис" failed: "Щось пішло не так; скоріше за все, цю електронну пошту вже зареєстровано, спробуйте посилання Забув пароль" forgot_password: + title: "Скидання пароля" action: "Я забув(ла) свій пароль" invite: "Введіть своє ім'я користувача або адресу електронної скриньки, і ми надішлемо Вам лист для скинення пароля." reset: "Скинути пароль" @@ -485,6 +594,7 @@ uk: caps_lock_warning: "Caps Lock увімкнено" error: "Невідома помилка" reset_password: 'Скинути пароль' + logging_in: "Вхід..." or: "Або" authenticating: "Автентифікуємося..." awaiting_confirmation: "Ваш обліковий запис очікує на активацію. Для отримання ще одного активаційного листа використайте посилання Забув пароль." @@ -493,6 +603,7 @@ uk: not_activated: "Ви ще не можете увійти. Ми вже надіслали Вам листа для активації на скриньку {{sentTo}}. Будь ласка, виконайте інструкції в цьому листі, щоб активувати обліковий запис." resend_activation_email: "Натисніть тут, щоб отримати ще один лист з активацією." sent_activation_email_again: "Ми надіслали на Вашу скриньку {{currentEmail}} ще один лист для активації облікового запису. Протягом кількох хвилин він має з'явитися у Вашій скриньці. Не забувайте також перевіряти теку зі спамом." + to_continue: "Будь ласка Увійдіть" google: title: "через Google" message: "Автентифікація через Google (перевірте, щоб блокувальники спливних вікон були вимкнені)" @@ -501,6 +612,8 @@ uk: twitter: title: "через Twitter" message: "Автентифікація через Twitter (перевірте, щоб блокувальники спливних вікон були вимкнені)" + instagram: + title: "через Instagram" facebook: title: "через Facebook" message: "Автентифікація через Facebook (перевірте, щоб блокувальники спливних вікон були вимкнені)" @@ -510,8 +623,19 @@ uk: github: title: "через GitHub" message: "Автентифікація через GitHub (перевірте, щоб блокувальники спливних вікон були вимкнені)" + emoji_set: + google: "Google" + twitter: "Twitter" + win10: "Win10" + shortcut_modifier_key: + shift: 'Shift' + ctrl: 'Ctrl' + alt: 'Alt' composer: + more_emoji: "ще..." + options: "Налаштування" posting_not_on_topic: "На яку тему Ви хочете відповісти?" + saving_draft_tip: "збереження..." saved_draft_tip: "збережено" saved_local_draft_tip: "збережено локально" similar_topics: "Ваша тема схожа на..." @@ -528,12 +652,15 @@ uk: reply_here: "Відповісти тут" reply: "Відповісти" cancel: "Скасувати" + create_topic: "Створити тему" + create_pm: "Повідомлення" title: "Or press Ctrl+Enter" users_placeholder: "Додати користувача" title_placeholder: "Про що це обговорення, у одному короткому реченні?" edit_reason_placeholder: "чому Ви редагуєте допис?" show_edit_reason: "(додати причину редагування)" view_new_post: "Перегляньте свій новий допис." + saving: "Збереження" saved: "Збережено!" uploading: "Завантаження..." show_preview: 'попередній перегляд »' @@ -547,6 +674,7 @@ uk: link_description: "введіть опис посилання" link_dialog_title: "Вставити гіперпосилання" link_optional_text: "необов'язкова назва" + link_url_placeholder: "http://example.com" quote_title: "Цитата" quote_text: "Цитата" code_title: "Попередньо форматований текст" @@ -560,12 +688,19 @@ uk: hr_title: "Горизонтальна лінія" help: "Markdown Editing Help" toggler: "показати або сховати панель редагування" + modal_ok: "OK" + modal_cancel: "Скасувати" admin_options_title: "Необов'язкові налаштування персоналу для цієї теми" + auto_close: + limited: + units: "(# годин)" notifications: more: "переглянути старіші сповіщення" total_flagged: "всього дописів, на які поскаржилися" quoted: "
{{username}} {{description}}
" replied: "
{{username}} {{description}}
"
+ alt:
+ posted: "Опубліковано"
upload_selector:
title: "Додати зображення"
title_with_attachments: "Додати зображення або файл"
@@ -573,16 +708,36 @@ uk:
from_the_web: "З інтернету"
hint: "(Ви також можете перетягувати зображення в редактор, щоб їх завантажити)"
uploading: "Завантаження"
+ select_file: "Обрати файл"
search:
+ sort_by: "Сортувати за"
+ latest_post: "Останній допис"
+ select_all: "Обрати все"
no_results: "Нічого не знайдено."
searching: "Пошук ..."
context:
topic: "Пошук в цій темі"
+ private_messages: "Шукати повідомлення"
+ advanced:
+ title: Розширений пошук
+ posted_by:
+ label: Опубліковано
+ in_category:
+ label: У категорії
+ in_group:
+ label: У групі
+ post:
+ time:
+ before: перед
+ after: після
+ new_item: "новий"
go_back: 'повернутися назад'
not_logged_in_user: 'сторінка користувача з підсумком поточної діяльності та налаштуваннями'
current_user: 'перейти до Вашої сторінки користувача'
topics:
+ new_messages_marker: "останнє відвідування"
bulk:
+ select_all: "Обрати все"
reset_read: "Reset Read"
delete: "Видалити теми"
dismiss_new: "Dismiss New"
@@ -610,11 +765,11 @@ uk:
category: "Більше немає тем в категорії {{category}}."
top: "There are no more top topics."
topic:
- filter_to: "Показати {{post_count}} дописів в темі"
create: 'Нова тема'
create_long: 'Створити нову тему'
list: 'Теми'
new: 'нова тема'
+ unread: 'непрочитані'
title: 'Тема'
invalid_access:
title: "Тема є приватною."
@@ -641,13 +796,16 @@ uk:
auto_close_title: 'Налаштування автоматичного закриття'
auto_close_save: "Зберегти"
auto_close_remove: "Не закривати цю тему автоматично"
+ timeline:
+ back: "Назад"
progress:
title: просування по темі
go_bottom: "Кнопка"
+ jump_bottom: "перейти до останнього допису"
+ jump_prompt: "перейти до допису"
jump_bottom_with_number: "перейти до допису %{post_number}"
total: всього дописів
current: поточний допис
- position: "допис %{current} із %{total}"
notifications:
reasons:
'3_6': 'Ви будете отримувати сповіщення, бо Ви слідкуєте за цією категорією.'
@@ -690,6 +848,8 @@ uk:
share:
title: 'Поширити'
help: 'Поширити посилання на цю тему'
+ print:
+ title: 'Друк'
flag_topic:
title: 'Flag'
help: 'privately flag this topic for attention or send a private notification about it'
@@ -700,9 +860,13 @@ uk:
email_or_username_placeholder: "електронна скринька або ім'я користувача"
action: "Запросити"
error: "Даруйте, під час запрошення цього користувача сталася помилка."
+ group_name: "назва групи"
invite_reply:
title: 'Запрошення'
+ username_placeholder: "ім'я користувача"
email_placeholder: 'електронна скринька'
+ filters:
+ cancel: "Прибрати фільтр"
split_topic:
title: "Перенесення до нової теми"
action: "перенести до нової теми"
@@ -736,7 +900,6 @@ uk:
few: 'Ви обрали дописів: {{count}}.'
other: 'Ви обрали дописів: {{count}}.'
post:
- quote_reply: "відповісти на цитату"
edit_reason: "Причина: "
post_number: "допис {{number}}"
last_edited_on: "допис востаннє редаговано"
@@ -745,7 +908,6 @@ uk:
show_full: "Показати Увесь Допис"
show_hidden: 'Показати схований зміст.'
expand_collapse: "розгорнути/згорнути"
- more_links: "{{count}} ще..."
unread: "Допис не прочитаний"
errors:
create: "Даруйте, під час створення допису трапилася помилка. Будь ласка, спробуйте ще раз."
@@ -775,16 +937,9 @@ uk:
delete_replies:
yes_value: "Так, відповіді також видалити"
no_value: "Ні, тільки цей допис"
+ rebake: "Перебудувати HTML"
actions:
flag: 'Поскаржитися'
- it_too:
- off_topic: "Також поскаржитися"
- spam: "Також поскаржитися"
- inappropriate: "Також поскаржитися"
- custom_flag: "Також поскаржитися"
- bookmark: "Також лишити закладку"
- like: "Також вподобати"
- vote: "Також проголосувати за"
undo:
off_topic: "Відкликати скаргу"
spam: "Відкликати скаргу"
@@ -792,6 +947,8 @@ uk:
bookmark: "Скасувати закладку"
like: "Скасувати вподобання"
vote: "Відкликати голос"
+ people:
+ notify_user: "надіслати повідомлення"
by_you:
off_topic: "Ви поскаржилися на це як на недотичне до теми"
spam: "Ви поскаржилися на це як на спам"
@@ -811,6 +968,8 @@ uk:
previous: "Попередня версія"
next: "Наступна версія"
last: "Остання версія"
+ hide: "Приховати версію"
+ show: "Показати версію"
displays:
inline:
title: "Показати результат виведення зі змінами на місці"
@@ -821,6 +980,7 @@ uk:
category:
can: 'може… '
none: '(без категорії)'
+ all: 'Всі категорії'
choose: 'Select a category…'
edit: 'редагувати'
edit_long: "Редагувати"
@@ -828,6 +988,8 @@ uk:
general: 'Основне'
settings: 'Налаштування'
delete: 'Видалити категорію'
+ create: 'Нова категорія'
+ create_long: 'Створити категорію'
save: 'Зберегти категорію'
creation_error: Під час створення категорії трапилася помилка.
save_error: Під час збереження категорії трапилася помилка.
@@ -849,6 +1011,7 @@ uk:
auto_close_label: "Автоматично закривати теми після:"
auto_close_units: "годин"
email_in: "Custom incoming email address:"
+ sort_order: "Типове сортування:"
allow_badges_label: "Дозволити нагороджувати значками у цій категорії"
edit_permissions: "Редагувати дозволи"
add_permission: "Додати дозвіл"
@@ -863,19 +1026,25 @@ uk:
title: "Стежити"
muted:
title: "Ігноровані"
+ sort_options:
+ default: "типово"
+ likes: "Вподобання"
+ views: "Перегляди"
+ posts: "Дописи"
+ activity: "Активність"
+ category: "Категорія"
+ created: "Створено"
flagging:
action: 'Поскаржитися на допис'
take_action: "Вжити заходів"
+ notify_action: 'Повідомлення'
delete_spammer: "Видалити спамера"
- delete_confirm: "Ви збираєтеся видалити %{posts} дописів і %{topics} тем цього користувача, видалити його обліковий запис, заблокувати реєстрації з його IP-адреси %{ip_address} та додати його електронну скриньку %{email} до чорного списку заблокованих адрес. Ви впевнені, що цей користувач дійсно спамер?"
yes_delete_spammer: "Так, видалити спамера"
+ hidden_email_address: "(приховано)"
cant: "Даруйте, зараз Ви не можете поскаржитися на цей допис."
- custom_message:
- at_least: "введіть принаймні {{n}} символів"
- more: "ще {{n}}..."
- left: "залишилось {{n}}"
flagging_topic:
action: "Flag Topic"
+ notify_action: "Повідомлення"
topic_map:
title: "Підсумок теми"
topic_statuses:
@@ -888,7 +1057,6 @@ uk:
pinned:
title: "Закріплені"
posts: "Дописи"
- posts_lowercase: "дописи"
posts_long: "тема містить {{number}} дописів"
original_post: "Перший допис"
views: "Перегляди"
@@ -904,6 +1072,7 @@ uk:
categories_list: "Список категорій"
filters:
latest:
+ title: "Останні"
help: "теми з найсвіжішими дописами"
hot:
title: "Гарячі"
@@ -911,12 +1080,17 @@ uk:
read:
title: "Прочитані"
help: "теми, які Ви прочитали, у порядку, в якому Ви їх читали востаннє"
+ search:
+ title: "Пошук"
categories:
title: "Категорії"
title_in: "Категорія - {{categoryName}}"
help: "всі теми, згруповані за категоріями"
+ unread:
+ title: "Непрочитані"
new:
lower_title: "new"
+ title: "Новий"
posted:
title: "Мої дописи"
help: "теми, в які Ви дописували"
@@ -926,11 +1100,58 @@ uk:
help: "Останні теми в категорії {{categoryName}}"
top:
title: "Top"
+ all:
+ title: "Весь час"
+ yearly:
+ title: "Щорічно"
+ quarterly:
+ title: "Щоквартала"
+ monthly:
+ title: "Щомісяця"
+ weekly:
+ title: "Щотижня"
+ daily:
+ title: "Щодня"
+ all_time: "Весь час"
+ this_year: "Рік"
+ this_quarter: "Квартал"
+ this_month: "Місяць"
+ this_week: "Тиждень"
today: "Today"
permission_types:
full: "Створювати / Відповідати / Бачити"
create_post: "Відповідати / Бачити"
readonly: "Бачити"
+ lightbox:
+ download: "завантажити"
+ keyboard_shortcuts_help:
+ title: 'Поєднання клавіш'
+ jump_to:
+ title: 'Перейти до'
+ navigation:
+ title: 'Навігація'
+ application:
+ title: 'Застосунок'
+ actions:
+ title: 'Дії'
+ badges:
+ badge_grouping:
+ community:
+ name: Спільнота
+ other:
+ name: Інше
+ tagging:
+ sort_by: "Сортувати за:"
+ sort_by_name: "ім'я"
+ notifications:
+ watching:
+ title: "Слідкувати"
+ tracking:
+ title: "Стежити"
+ groups:
+ new: "Нова група"
+ save: "Зберегти"
+ delete: "Видалити"
admin_js:
type_to_filter: "введіть, щоб фільтрувати..."
admin:
@@ -957,7 +1178,9 @@ uk:
admins: 'Адміни:'
blocked: 'Заблоковані:'
suspended: 'Призупинені:'
+ private_messages_short: "Пвдмл"
private_messages_title: "Повідомлення"
+ traffic_short: "Трафік"
reports:
today: "Сьогодні"
yesterday: "Вчора"
@@ -967,6 +1190,8 @@ uk:
7_days_ago: "7 днів тому"
30_days_ago: "30 днів тому"
all: "Все"
+ start_date: "Дата початку"
+ end_date: "Дата завершення"
commits:
latest_changes: "Останні зміни: оновлюйте Вашу копію часто!"
by: "від"
@@ -1007,7 +1232,7 @@ uk:
edit: "Редагувати групи"
refresh: "Оновити"
new: "Новий"
- name_placeholder: "Group name, no spaces, same as username rule"
+ selector_placeholder: "введіть ім'я користувача"
about: "Edit your group membership and names here"
group_members: "Учасники групи"
delete: "Видалити"
@@ -1015,6 +1240,7 @@ uk:
delete_failed: "Не вдалося видалити групу. Якщо це - автоматична група, її неможливо знищити."
add: "Додати"
add_members: "Додати учасників"
+ bulk_select: "(обрати групу)"
api:
generate_master: "Згенерувати Головний ключ API"
none: "Наразі немає жодного активного ключа API."
@@ -1028,29 +1254,73 @@ uk:
confirm_revoke: "Are you sure you want to revoke that key?"
info_html: "Your API key will allow you to create and update topics using JSON calls."
all_users: "All Users"
+ web_hooks:
+ create: "Створити"
+ save: "Зберегти"
+ destroy: "Видалити"
+ description: "Опис"
+ go_back: "Повернутися до списку"
+ secret: "Секрет"
+ active: "Активний"
+ delivery_status:
+ title: "Стан доставки"
+ failed: "Помилка"
+ successful: "Успішно"
+ events:
+ request: "Запит"
+ headers: "Заголовки"
+ body: "Тіло"
+ go_list: "Перейти до списку"
+ go_details: " "
+ go_events: "Перейти до подій"
+ ping: "Пінг"
+ event_id: "ID"
+ timestamp: "Створено"
+ actions: "Дії"
+ plugins:
+ name: "Ім'я"
+ version: "Версія"
+ enabled: "Включено?"
+ is_enabled: "Т"
+ not_enabled: "Н"
+ change_settings: "Зміна налаштувань"
+ change_settings_short: "Налаштування"
backups:
title: "Backups"
menu:
backups: "Backups"
logs: "Logs"
none: "No backup available."
+ read_only:
+ enable:
+ title: "Включити режим Тільки для читання"
+ label: "Включити Тільки для читання"
+ confirm: "Ви впевнені, що хочете включити режим Тільки для читання?"
+ disable:
+ title: "Відключити режим Тільки для читання"
+ label: "Відключити Тільки для читання"
logs:
none: "No logs yet..."
columns:
filename: "Filename"
size: "Size"
upload:
+ label: "Вивантажити"
+ uploading: "Вивантаження..."
success: "'{{filename}}' has successfully been uploaded."
error: "There has been an error while uploading '{{filename}}': {{message}}"
operations:
is_running: "An operation is currently running..."
failed: "The {{operation}} failed. Please check the logs."
cancel:
+ label: "Скасувати"
title: "Cancel the current operation"
confirm: "Are you sure you want to cancel the current operation?"
backup:
title: "Create a backup"
+ without_uploads: "Так (не включати файли)"
download:
+ label: "Завантажити"
title: "Download the backup"
destroy:
title: "Remove the backup"
@@ -1060,6 +1330,10 @@ uk:
title: "Restore the backup"
rollback:
title: "Rollback the database to previous working state"
+ export_csv:
+ button_text: "Експорт"
+ export_json:
+ button_text: "Експорт"
customize:
title: "Customize"
long_title: "Site Customizations"
@@ -1072,11 +1346,18 @@ uk:
save: "Save"
new: "New"
new_style: "New Style"
+ import: "Імпорт"
delete: "Delete"
delete_confirm: "Delete this customization?"
color: "Колір"
opacity: "Непрозорість"
copy: "Копіювати"
+ email_templates:
+ title: "Шаблони листів"
+ subject: "Тема"
+ body: "Тіло"
+ revert: "Повернути зміни"
+ revert_confirm: "Чи впевнені ви, що хочете повернути ваші зміни?"
css_html:
title: "CSS/HTML"
long_title: "Налаштування CSS та HTML"
@@ -1085,6 +1366,10 @@ uk:
long_title: "Схеми Кольорів"
about: "Змінюйте кольори, що використовуються на сайті без написання CSS. Додати схему, щоб почати. "
new_name: "Нова Схема Кольорів"
+ copy_name_prefix: "Копіювати з"
+ delete_confirm: "Видалити цю кольорову схему?"
+ undo: "скасувати"
+ undo_title: "Скасувати ваші зміни цього кольору з часу останнього збереження."
primary:
name: 'основний'
secondary:
@@ -1099,13 +1384,20 @@ uk:
description: "Текст та іконки в заголовку сайту."
highlight:
name: 'висвітлення'
+ success:
+ name: 'успіх'
love:
description: "Колір кнопки \"Подобається\"."
email:
+ title: "Листів"
settings: "Налаштування"
+ templates: "Шаблони"
preview_digest: "Стислий виклад новин"
+ sending_test: "Надсилання тестового листа..."
sent: "Sent"
skipped: "Skipped"
+ received: "Отримано"
+ rejected: "Відхилено"
sent_at: "Надіслано"
time: "Time"
user: "Користувач"
@@ -1116,17 +1408,36 @@ uk:
sent_test: "надіслано!"
delivery_method: "Спосіб доставки"
refresh: "Оновити"
+ send_digest: "Надіслати"
+ sending_email: "Надсилання листа..."
format: "Формат"
html: "html"
text: "текст"
last_seen_user: "Востаннє помічено користувача:"
reply_key: "Ключ відповіді"
skipped_reason: "Skip Reason"
+ incoming_emails:
+ from_address: "Від"
+ to_addresses: "До"
+ subject: "Тема"
+ error: "Помилка"
+ modal:
+ error: "Помилка"
+ headers: "Заголовки"
+ subject: "Тема"
+ body: "Тіло"
+ filters:
+ from_placeholder: "from@example.com"
+ to_placeholder: "to@example.com"
+ cc_placeholder: "cc@example.com"
+ subject_placeholder: "Тема..."
+ error_placeholder: "Помилка"
logs:
none: "No logs found."
filters:
title: "Filter"
user_placeholder: "username"
+ address_placeholder: "name@example.com"
type_placeholder: "digest, signup..."
skipped_reason_placeholder: "reason"
logs:
@@ -1136,6 +1447,9 @@ uk:
last_match_at: "Остання відповідність"
match_count: "Відповідності"
ip_address: "IP"
+ topic_id: "ID теми"
+ post_id: "ID допису"
+ category_id: "ID категорії"
delete: 'Видалити'
edit: 'Редагувати'
save: 'Зберегти'
@@ -1161,13 +1475,28 @@ uk:
actions:
delete_user: "видалення користувача"
change_trust_level: "зміна рівня довіри"
+ change_username: "зміна імені користувача"
change_site_setting: "зміна налаштування сайта"
change_site_customization: "change site customization"
delete_site_customization: "delete site customization"
+ change_site_text: "змінити текст сайту"
suspend_user: "призупинення користувача"
unsuspend_user: "скасування призупинення"
grant_badge: "надати значок"
revoke_badge: "скасувати значок"
+ check_email: "Перевірити електронну пошту"
+ delete_topic: "видалити тему"
+ delete_post: "видалити допис"
+ anonymize_user: "анонімний користувач"
+ change_category_settings: "змінити налаштування категорії"
+ delete_category: "видалити категорію"
+ create_category: "створити категорію"
+ block_user: "заблокувати користувача"
+ unblock_user: "розблокувати користувача"
+ grant_admin: "зробити адміністратором"
+ revoke_admin: "відкликати адміністраторство"
+ grant_moderation: "зробити модератором"
+ revoke_moderation: "відкликати модераторство"
screened_emails:
title: "Screened Emails"
description: "Коли хтось намагатиметься створити новий обліковий запис, наступні електронні скриньки буде перевірено, і реєстрацію заблоковано, або вжито якихось інших дій."
@@ -1190,16 +1519,21 @@ uk:
label: "Нова:"
ip_address: "IP-адреса"
add: "Додати"
+ filter: "Пошук"
+ impersonate:
+ not_found: "Цього користувача не вдалося знайти."
users:
title: 'Користувачі'
create: 'Додати адміністратора'
last_emailed: "Останній ел. лист"
not_found: "Даруйте, такого імені користувача немає в нашій системі."
active: "Активний(а)"
+ show_emails: "Показати електронну пошту"
nav:
new: "Нові"
active: "Активні"
pending: "Очікують"
+ staff: 'Персонал'
suspended: 'Призупинені'
blocked: 'Заблоковані'
approved: "Схвалено?"
@@ -1209,10 +1543,13 @@ uk:
pending: 'Користувачі, що очікують на перевірку'
newuser: 'Користувачі з Рівнем довіри 0 (Новий користувач)'
basic: 'Користувачі з Рівнем довіри 1 (Базовий користувач)'
+ staff: "Персонал"
admins: 'Адміністратори'
moderators: 'Модератори'
blocked: 'Заблоковані користувачі'
suspended: 'Призупинені користувачі'
+ check_email:
+ text: "Показати"
user:
suspend_failed: "Щось трапилося під час призупинення цього користувача: {{error}}"
unsuspend_failed: "Щось трапилося під час скасування призупинення цього користувача: {{error}}"
@@ -1222,7 +1559,6 @@ uk:
suspend_reason: "Причина"
suspended_by: "Призупинено"
delete_all_posts: "Видалити всі дописи"
- delete_all_posts_confirm: "Ви збираєтеся видалити %{posts} дописів і %{topics} тем. Ви впевнені?"
suspend: "Призупинити"
unsuspend: "Скасувати призупинення"
suspended: "Призупинено?"
@@ -1233,9 +1569,11 @@ uk:
edit_title: "Редагувати назву"
save_title: "Зберегти назву"
refresh_browsers: "Примусово оновити оглядач"
+ refresh_browsers_message: "Повідомлення надіслано всім клієнтам!"
show_public_profile: "Показати публічний профіль"
impersonate: 'Втілитися'
ip_lookup: "Пошук IP"
+ log_out: "Вийти"
logged_out: "Користувач вийшов зі системи на усіх пристроях"
revoke_admin: 'Відкликати адміністраторство'
grant_admin: 'Зробити адміністратором'
@@ -1246,19 +1584,24 @@ uk:
reputation: Репутація
permissions: Дозволи
activity: Активність
+ last_100_days: 'протягом останніх 100 днів'
private_topics_count: Приватних тем
posts_read_count: Дописів прочитано
post_count: Дописів створено
topics_entered: Тем переглянуто
flags_given_count: Скарг подано
flags_received_count: Скарг отримано
+ warnings_received_count: Отримано попереджень
approve: 'Схвалити'
approved_by: "схвалено"
approve_success: "Користувача схвалено і йому надіслано лист з інструкціями для активації."
approve_bulk_success: "Успіх! Всіх обраних користувачів було схвалено та сповіщено про це."
time_read: "Час читання"
+ anonymize: "Анонімний користувач"
+ anonymize_yes: "Так, приховати цей обліковий запис"
delete: "Видалити користувача"
delete_forbidden_because_staff: "Адмінів та модераторів видаляти не можна."
+ delete_dont_block: "Лише видалення"
deleted: "Користувача було видалено."
delete_failed: "Під час видалення цього користувача трапилася помилка. Переконайтеся, що всі дописи користувача видалено перед тим, як видаляти самого користувача."
send_activation_email: "Надіслати листа для активації"
@@ -1270,6 +1613,10 @@ uk:
deactivate_failed: "Під час деактивації користувача сталася помилка."
unblock_failed: 'Під час розблокування користувача сталася помилка.'
block_failed: 'Під час блокування користувача сталася помилка.'
+ block_confirm: 'Ви впевнені, що хочете заблокувати цього користувача? Вони не зможуть створювати будь-які нові теми або дописи.'
+ block_accept: 'Так, заблокувати цього користувача'
+ reset_bounce_score:
+ label: "Скинути"
deactivate_explanation: "Деактивований користувач має повторно підтвердити свою електронну скриньку."
suspended_explanation: "Призупинений користувач не може увійти."
block_explanation: "Заблокований користувач не може дописувати і розпочинати теми."
@@ -1289,17 +1636,36 @@ uk:
posts_read: "Прочитано Дописів"
posts_read_all_time: "Прочитано дописів (весь час)"
flagged_posts: "Оскаржені дописи"
+ sso:
+ external_id: "Зовнішній ID"
+ external_username: "Ім'я користувача"
+ external_name: "Ім'я"
+ external_email: "Електронна пошта"
user_fields:
+ untitled: "Без заголовку"
+ type: "Тип поля"
+ description: "Поле опису"
save: "Зберегти"
edit: "Редагувати"
delete: "Видалити"
cancel: "Скасувати"
+ options: "Налаштування"
+ field_types:
+ text: 'Текстове поле'
+ confirm: 'Підтвердження'
+ site_text:
+ edit: 'редагувати'
+ go_back: "Повернутись до пошуку"
+ show_overriden: 'Показувати тільки перевизначені'
site_settings:
show_overriden: 'Показувати тільки перевизначені'
title: 'Налаштування'
+ reset: 'скинути'
none: 'none'
no_results: "Не знайдено результатів."
clear_filter: "Очистити"
+ add_url: "додати URL"
+ add_host: "додати хост"
categories:
all_results: 'Всі'
required: 'Обов''язкові'
@@ -1316,12 +1682,24 @@ uk:
developer: 'Для розробників'
embedding: "Взаємодія"
legal: "Legal"
+ uncategorized: 'Інше'
backups: "Backups"
+ login: "Вхід"
+ user_preferences: "Налаштування"
+ search: "Пошук"
badges:
+ new: Новий
+ name: Ім'я
badge: Значок
+ display_name: Ім'я, що відображається
+ description: Опис
+ long_description: Розширений опис
+ badge_grouping: Група
save: Зберегти
delete: Видалити
+ delete_confirm: Ви впевнені, що хочете видалити цю відзнаку?
revoke: Відкликати
+ reason: Причина
edit_badges: Редагувати Значки
grant_badge: Надати Значок
granted_badges: Надані Значки
@@ -1330,14 +1708,31 @@ uk:
no_badges: Тут немає значків, які можуть бути надані.
allow_title: Дозволити використання значків як звань
multiple_grant: Можуть бути надані декілька разів
+ enabled: Включити відзнаки
+ icon: Іконка
image: Зображення
trigger_type:
+ none: "Щоденні оновлення"
post_action: "Коли користувач щось робить у допису"
post_revision: "Коли користувач редагує або створює допис"
trust_level_change: "Коли користувач змінює рівень довіри"
user_change: "Коли користувач змінений або створений"
preview:
+ bad_count_warning:
+ header: "УВАГА!"
sample: "Зразок:"
+ emoji:
+ name: "Ім'я"
+ image: "Зображення"
+ embedding:
+ confirm_delete: "Ви впевнені, що хочете видалити цей хост?"
+ host: "Дозволені Хости"
+ edit: "редагувати"
+ category: "Допис у Категорію"
+ add_host: "Додати Хост"
+ embed_post_limit: "Максимальна кількість дописів для вставки"
+ embed_classname_whitelist: "Дозволені імена класів CSS"
+ feed_polling_enabled: "Імпортувати дописи через RSS/ATOM"
permalink:
title: "Постійні посилання"
url: "Посилання"
@@ -1350,4 +1745,21 @@ uk:
external_url: "Зовнішнє посилання"
delete_confirm: Ви впевнені, що хочете видалити це постійне посилання?
form:
+ label: "Новий:"
add: "Додати"
+ filter: "Пошук (URL або зовнішній URL)"
+ wizard_js:
+ wizard:
+ done: "Виконано"
+ back: "Назад"
+ next: "Далі"
+ step: "%{поточних} з %{загальних}"
+ upload: "Вивантажити"
+ uploading: "Вивантаження..."
+ quit: "Можливо пізніше"
+ invites:
+ add_user: "додати"
+ roles:
+ admin: "Адмін"
+ moderator: "Модератор"
+ regular: "Звичайний користувач"
diff --git a/config/locales/client.ur.yml b/config/locales/client.ur.yml
new file mode 100644
index 00000000000..6b20cfbffb8
--- /dev/null
+++ b/config/locales/client.ur.yml
@@ -0,0 +1,50 @@
+# encoding: utf-8
+#
+# Never edit this file. It will be overwritten when translations are pulled from Transifex.
+#
+# To work with us on translations, join this project:
+# https://www.transifex.com/projects/p/discourse-org/
+
+ur:
+ js:
+ number:
+ format:
+ separator: "."
+ delimiter: "،"
+ human:
+ storage_units:
+ units:
+ gb: جی بی
+ kb: کے بی
+ mb: ایم بی
+ tb: ٹی بی
+ dates:
+ medium_with_ago:
+ x_minutes:
+ one: "1 منٹ قبل"
+ other: "%{count} منٹ قبل"
+ x_hours:
+ one: "1 گھنٹہ قبل "
+ other: " %{count} گھنٹے قبل "
+ no_value: "نہیں "
+ yes_value: "ہاں "
+ age: "عمر "
+ show_more: "مزید "
+ you: "آپ "
+ or: "یا "
+ now: "ابھی "
+ read_more: 'مزید پڑھیں '
+ more: "مزید "
+ less: "کم "
+ never: "کبھی نہیں "
+ daily: "روزانہ "
+ weekly: "ہفتہ وار "
+ user:
+ desktop_notifications:
+ each_browser_note: "نوٹ: آپ کو ہر براؤزر پر اس سیٹنگ کو تبدیل کرنا ہوگا."
+ admin_js:
+ admin:
+ export_json:
+ button_text: "برآمد"
+ badges:
+ name: نام
diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml
index 2313e298a6d..f7c25e3762d 100644
--- a/config/locales/client.vi.yml
+++ b/config/locales/client.vi.yml
@@ -16,7 +16,7 @@ vi:
format: '%n %u'
units:
byte:
- other: Byte
+ other: Bytes
gb: GB
kb: KB
mb: MB
@@ -26,6 +26,7 @@ vi:
millions: "{{number}}M"
dates:
time: "h:mm a"
+ timeline_date: "MMM YYYY"
long_no_year: "MMM D h:mm a"
long_no_year_no_time: "MMM D"
full_no_year_no_time: "MMMM Do"
@@ -37,14 +38,13 @@ vi:
long_date_with_year_without_time: "MMM D, 'YY"
long_date_without_year_with_linebreak: "MMM D
LT"
long_date_with_year_with_linebreak: "MMM D, 'YY
LT"
+ wrap_ago: "%{date} ngày trước"
tiny:
- half_a_minute: "< 1m"
+ half_a_minute: "< 1 phút"
less_than_x_seconds:
other: "< %{count}s"
x_seconds:
other: "%{count}s"
- less_than_x_minutes:
- other: "< %{count}m"
x_minutes:
other: "%{count}m"
about_x_hours:
@@ -84,17 +84,21 @@ vi:
previous_month: 'Tháng Trước'
next_month: 'Tháng Sau'
share:
- topic: 'chia sẽ chủ đề này'
+ topic: 'chia sẻ chủ đề này'
post: 'đăng #%{Bài đăng số}'
close: 'đóng lại'
- twitter: 'chia sẽ lên Twitter'
- facebook: 'chia sẽ lên Facebook'
- google+: 'chia sẽ lên Google+'
+ twitter: 'chia sẻ lên Twitter'
+ facebook: 'chia sẻ lên Facebook'
+ google+: 'chia sẻ lên Google+'
email: 'Gửi liên kết này qua thư điện tử'
action_codes:
+ public_topic: "Hiển thị chủ đề này lúc %{when}"
+ private_topic: "Ẩn chủ đề này lúc %{when}"
split_topic: "chìa chủ đề này lúc %{when}"
invited_user: "đã mời bởi %{who} %{when}"
+ invited_group: "Được mời bởi %{who} vào lúc %{when}"
removed_user: "loại bỏ bởi %{who} %{when}"
+ removed_group: "Bị loại bỏ bởi %{who} vào lúc %{when}"
autoclosed:
enabled: 'đóng lúc %{when}'
disabled: 'mở lúc %{when}'
@@ -223,6 +227,8 @@ vi:
undo: "Hoàn tác"
revert: "Phục hồi"
failed: "Thất bại"
+ switch_to_anon: "Vào chế độ Ẩn danh"
+ switch_from_anon: "Thoát chế độ Ẩn danh"
banner:
close: "Xóa biểu ngữ này."
edit: "Sửa banner này >>"
@@ -270,6 +276,8 @@ vi:
title: "Thành viên"
likes_given: "Đưa ra"
likes_received: "Đã nhận"
+ topics_entered: "Đã xem"
+ topics_entered_long: "Chủ đề đã xem"
time_read: "Thời gian đọc"
topic_count: "Chủ đề"
topic_count_long: "Chủ đề đã được tạo"
@@ -283,12 +291,6 @@ vi:
total_rows:
other: "%{count} người dùng"
groups:
- empty:
- posts: "Không có chủ đề của các thành viên trong nhóm"
- members: "Không có thành viên nào trong nhóm"
- mentions: "Không có thành viên nào trong nhóm"
- messages: "Không có tin nhắn nào trong nhóm"
- topics: "Không có chủ đề của các thành viên trong nhóm"
add: "Thêm"
selector_placeholder: "Thêm thành viên"
owner: "chủ"
@@ -314,6 +316,9 @@ vi:
watching:
title: "Đang xem"
description: "Bạn sẽ được thông báo khi có bài viết mới trong mỗi tin nhắn, và số lượng trả lời mới sẽ được hiển thị"
+ watching_first_post:
+ title: "Theo dõi chủ đề đầu tiên"
+ description: "Bạn sẽ được thông báo về bài viết đầu tiên của mỗi chủ đề mới trong nhóm này"
tracking:
title: "Đang theo dõi"
description: "Bạn sẽ được thông báo nếu ai đó đề cập đến @tên bạn hoặc trả lời bạn, và số lượng trả lời mới sẽ được hiển thị"
@@ -356,12 +361,10 @@ vi:
latest_by: "mới nhất bởi"
toggle_ordering: "chuyển lệnh kiểm soát"
subcategories: "Phân loại phụ"
- topic_stats: "Số lượng chủ đề mới"
+ topic_sentence:
+ other: "%{count} chủ đề"
topic_stat_sentence:
other: "%{count} số lượng chủ đề mới tỏng quá khứ %{unit}."
- post_stats: "Số lượng bài viết mới"
- post_stat_sentence:
- other: "%{count} số lượng bài viết mới trong quá khứ %{unit}."
ip_lookup:
title: Tìm kiếm địa chỉ IP
hostname: Hostname
@@ -384,7 +387,6 @@ vi:
profile: "Tiểu sử"
mute: "Im lặng"
edit: "Tùy chỉnh"
- download_archive: "Tải bài viết về"
new_private_message: "Tin nhắn mới"
private_message: "Tin nhắn"
private_messages: "Các tin nhắn"
@@ -406,6 +408,7 @@ vi:
disable: "Khóa Notification"
enable: "Cho phép Notification"
each_browser_note: "Lưu ý: Bạn phải thay đổi trong cấu hình mỗi trình duyệt bạn sử dụng."
+ dismiss_notifications: "Bỏ qua tất cả"
dismiss_notifications_tooltip: "Đánh dấu đã đọc cho tất cả các thông báo chưa đọc"
disable_jump_reply: "Đừng tới bài viết của tôi sau khi tôi trả lời"
dynamic_favicon: "Hiện số chủ đề mới / cập nhật vào biểu tượng trình duyệt"
@@ -420,6 +423,12 @@ vi:
suspended_notice: "Thành viên này bị đình chỉ cho đến ngày {{date}}. "
suspended_reason: "Lý do: "
github_profile: "Github"
+ email_activity_summary: "Tóm tắt hoạt động"
+ mailing_list_mode:
+ label: "Chế độ mailing list"
+ enabled: "Bật chế độ mailing list"
+ daily: "Gửi cập nhật hàng ngày"
+ individual: "Gửi email cho mỗi bài viết mới."
watched_categories: "Xem"
tracked_categories: "Theo dõi"
muted_categories: "Im lặng"
@@ -603,13 +612,9 @@ vi:
account_age_days: "Thời gian của tài khoản theo ngày"
create: "Gửi một lời mời"
generate_link: "Chép liên kết Mời"
- generated_link_message: '
Liên kết thư mời được tạo thành công!
Liên kết thư mời chỉ hợp lệ cho email này: %{invitedEmail}
'
bulk_invite:
- none: "Bạn đã mời ai ở đây chưa. Bạn có thể mời một hoặc một nhóm bằng tải lên hàng loạt file mời."
text: "Mời hàng loạt bằng file"
- uploading: "Uploading..."
success: "Tải lên thành công, bạn sẽ được thông báo qua tin nhắn khi quá trình hoàn tất."
- error: "Có lỗi xảy ra khi upload '{{filename}}': {{message}}"
password:
title: "Mật khẩu"
too_short: "Mật khẩu của bạn quá ngắn."
@@ -948,7 +953,6 @@ vi:
title: "tìm kiếm chủ đề, bài viết, tài khoản hoặc các danh mục"
no_results: "Không tìm thấy kết quả."
no_more_results: "Không tìm thấy kết quả"
- search_help: Giúp đỡ tìm kiếm
searching: "Đang tìm ..."
post_format: "#{{post_number}} bởi {{username}}"
context:
@@ -1009,7 +1013,6 @@ vi:
unsubscribe:
stop_notifications: "Từ bây giờ bạn sẽ không nhận thông báo từ {{title}}"
change_notification_state: "Tình trạn thông báo của bạn là"
- filter_to: "{{post_count}} bài đăng trong chủ đề"
create: 'Chủ đề Mới'
create_long: 'Tạo một Chủ đề mới'
private_message: 'Bắt đầu một thông điệp'
@@ -1063,7 +1066,6 @@ vi:
auto_close_title: 'Tự động-Đóng các Cài đặt'
auto_close_save: "Lưu"
auto_close_remove: "Đừng Tự Động-Đóng Chủ Đề Này"
- auto_close_immediate: "Bài viết cuối cùng trong chủ đề đã xảy ra %{hours} giờ qua, vì vậy chủ đề sẽ tự động đóng."
progress:
title: tiến trình của chủ đề
go_top: "trên cùng"
@@ -1073,7 +1075,6 @@ vi:
jump_bottom_with_number: "nhảy tới bài viết %{post_number}"
total: tổng số bài viết
current: bài viết hiện tại
- position: "bài viết %{current} trong %{total}"
notifications:
reasons:
'3_6': 'Bạn sẽ nhận được các thông báo bởi vì bạn đang xem chuyên mục nàyotification'
@@ -1242,7 +1243,6 @@ vi:
post:
reply: " {{replyAvatar}} {{usernameLink}}"
reply_topic: " {{link}}"
- quote_reply: "trả lời trích dẫn"
edit: "Đang sửa {{link}} {{replyAvatar}} {{username}}"
edit_reason: "Lý do: "
post_number: "bài viết {{number}}"
@@ -1257,7 +1257,6 @@ vi:
expand_collapse: "mở/đóng"
gap:
other: "xem {{count}} trả lời bị ẩn"
- more_links: "hơn {{count}}..."
unread: "Bài viết chưa đọc"
has_replies:
other: "{{count}} Trả lời"
@@ -1317,14 +1316,6 @@ vi:
flag: 'Gắn cờ'
defer_flags:
other: "Đánh dấu hoãn"
- it_too:
- off_topic: "Gắn cờ nó"
- spam: "Gắn cờ nó"
- inappropriate: "Gắn cờ nó"
- custom_flag: "Gắn cờ nó"
- bookmark: "Đánh dấu nó"
- like: "Thích nó"
- vote: "Bịnh chọn nó"
undo:
off_topic: "Hủy gắn cờ"
spam: "Hủy gắn cờ"
@@ -1478,7 +1469,6 @@ vi:
take_action: "Thực hiện"
notify_action: 'Tin nhắn'
delete_spammer: "Xóa người Spam"
- delete_confirm: "Bạn đang định xóa %{posts} bài đăng và %{topics} chủ đề từ người dùng này, loại tài khoản, ngăn đăng ký từ địa chỉ IP %{ip_address} của họ, và thêm địa chỉ email %{email} vào danh sách chặn vĩnh viễn. Bạn có chắc người dùng này thật sự là một spammer?"
yes_delete_spammer: "Có, xóa người spam"
ip_address_missing: "(N/A)"
hidden_email_address: "(ẩn)"
@@ -1492,10 +1482,6 @@ vi:
spam: "Nó là rác"
custom_placeholder_notify_user: "Phải hảo tâm và mang tính xây dựng."
custom_placeholder_notify_moderators: "Hãy cho chúng tôi biết cụ thể những gì bạn quan tâm, và cung cấp các liên kết hoặc ví dụ liên quan nếu có thể."
- custom_message:
- at_least: "điền ít nhất {{n}} ký tự"
- more: "còn {{n}}"
- left: "{{n}} còn lại"
flagging_topic:
title: "Cám ơn bạn đã giúp phát triển cộng đồng!"
action: "Gắn cờ Chủ đề"
@@ -1529,7 +1515,6 @@ vi:
invisible:
help: "Chủ đề này ẩn, nó sẽ không hiển thị trong danh sách chủ đề, và chỉ có thể truy cập thông qua liên kết trực tiếp"
posts: "Bài viết"
- posts_lowercase: "bài viết"
posts_long: "Có {{number}} bài đăng trong chủ đề này"
posts_likes_MF: |
Chủ đề này có {count, plural, one {1 reply} other {# replies}} {ratio, select,
@@ -1751,15 +1736,12 @@ vi:
refresh: "Làm mới"
new: "Mới"
selector_placeholder: "nhập tên tài khoản"
- name_placeholder: "Tên nhóm, không khoản trắng, cùng luật với tên tài khoản"
about: "Chỉnh sửa nhóm thành viên và tên của bạn ở đây"
group_members: "Nhóm thành viên"
delete: "Xóa"
delete_confirm: "Xóa nhóm này?"
delete_failed: "Không thể xóa nhóm. Nếu đây là một nhóm tự động, nó không thể hủy bỏ."
- delete_member_confirm: "Loại bỏ '%{username}' khỏi nhóm '%{group}'?"
delete_owner_confirm: "Loại bỏ quyền sở hữu của '%{username}'?"
- name: "Tên"
add: "Thêm"
add_members: "Thêm thành viên"
custom: "Tùy biến"
@@ -1855,10 +1837,8 @@ vi:
title: "Đưa csdl về trạng thái làm việc trước"
confirm: "Bạn có chắc chắn muốn phục hồi csdl về trạng thái làm việc trước?"
export_csv:
- user_archive_confirm: "Bạn có chắc chắn muốn download các bài viết của mình?"
success: "Export đang được khởi tạo, bạn sẽ nhận được tin nhắn thông báo khi quá trình hoàn tất."
failed: "Xuất lỗi. Vui lòng kiểm tra log."
- rate_limit_error: "Bài viết có thể tải về 1 lần mỗi này, vui lòng thử lại vào ngày mai."
button_text: "Xuất"
button_title:
user: "Xuất danh sách người dùng đầy đủ với định dạng CSV."
@@ -2165,7 +2145,6 @@ vi:
suspend_reason: "Lý do"
suspended_by: "Tạm khóa bởi"
delete_all_posts: "Xóa tất cả bài viết"
- delete_all_posts_confirm: "Bạn có chắc chắn muốn xóa %{posts} bài viết và %{topics} chủ đề?"
suspend: "Tạm khóa"
unsuspend: "Đã mở khóa"
suspended: "Đã tạm khóa?"
@@ -2181,7 +2160,7 @@ vi:
show_public_profile: "Hiển thị hồ sơ công khai"
impersonate: 'Mạo danh'
ip_lookup: "Tìm kiếm địa chỉ IP"
- log_out: "Đăng suất"
+ log_out: "Đăng xuất"
logged_out: "Thành viên đã đăng xuất trên tất cả thiết bị"
revoke_admin: 'Thu hồi quản trị'
grant_admin: 'Cấp quản trị'
@@ -2249,7 +2228,6 @@ vi:
unlock_trust_level: "Mở khóa độ tin cậy"
tl3_requirements:
title: "Yêu cầu Cấp độ tin tưởng 3"
- table_title: "Trong %{time_period} ngày qua:"
value_heading: "Giá trị"
requirement_heading: "Yêu cầu"
visits: "Lượt xem"
diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml
index 23937823f89..24340c53e2d 100644
--- a/config/locales/client.zh_CN.yml
+++ b/config/locales/client.zh_CN.yml
@@ -38,15 +38,13 @@ zh_CN:
long_date_with_year_without_time: "YY年MMMDo"
long_date_without_year_with_linebreak: "MMMDo
LT"
long_date_with_year_with_linebreak: "YY年MMMDo
LT"
- wrap_ago: "%{date}前"
+ wrap_ago: "%{date}"
tiny:
half_a_minute: "1分钟内"
less_than_x_seconds:
other: "%{count}秒内"
x_seconds:
other: "%{count}秒前"
- less_than_x_minutes:
- other: "%{count}分钟内"
x_minutes:
other: "%{count}分钟前"
about_x_hours:
@@ -86,13 +84,13 @@ zh_CN:
previous_month: '上个月'
next_month: '下个月'
share:
- topic: '分享内容链接'
+ topic: '分享指向这个主题的链接'
post: '#%{postNumber} 楼'
close: '关闭'
twitter: '分享至 Twitter'
facebook: '分享至 Facebook'
google+: '分享至 Google+'
- email: '通过邮件分享内容'
+ email: '在电子邮件里发送该链接'
action_codes:
public_topic: "于%{when}设置为公共主题"
private_topic: "于%{when}设置为私密主题"
@@ -102,11 +100,11 @@ zh_CN:
removed_user: "于%{when}移除了%{who}"
removed_group: "于%{when}移除了%{who}"
autoclosed:
- enabled: '于%{when}锁定'
- disabled: '于%{when}解除锁定'
+ enabled: '于%{when}关闭'
+ disabled: '于%{when}打开'
closed:
- enabled: '于%{when}锁定'
- disabled: '于%{when}解除锁定'
+ enabled: '于%{when}关闭'
+ disabled: '于%{when}打开'
archived:
enabled: '于%{when}存档'
disabled: '于%{when}解除存档'
@@ -117,9 +115,10 @@ zh_CN:
enabled: '于%{when}全站置顶'
disabled: '于%{when}解除全站置顶'
visible:
- enabled: '于%{when}解除隐藏'
+ enabled: '%{when}列出'
disabled: '于%{when}隐藏'
topic_admin_menu: "管理主题"
+ wizard_required: "是时候配置你的论坛啦!点击开始设置向导!"
emails_are_disabled: "出站邮件已经被管理员全局禁用。将不发送任何邮件提醒。"
bootstrap_mode_enabled: "为方便站点准备发布,其正处于初始化模式中。所有新用户将被授予信任等级1,并为他们设置接受每日邮件摘要。初始化模式会在用户数超过 %{min_users} 个时关闭。"
bootstrap_mode_disabled: "初始化模式将会在24小时后关闭。"
@@ -213,11 +212,11 @@ zh_CN:
remove: "取消收藏"
confirm_clear: "你确定要清除该主题的所有收藏吗?"
topic_count_latest:
- other: "{{count}} 个近期的主题或更新的主题。"
+ other: "{{count}} 新主题或更新的主题。"
topic_count_unread:
other: "{{count}} 未读主题。"
topic_count_new:
- other: "近期有 {{count}} 个主题。"
+ other: " {{count}} 个近期主题。"
click_to_show: "点击加载"
preview: "预览"
cancel: "取消"
@@ -249,7 +248,7 @@ zh_CN:
reject: '否决'
delete_user: '删除用户'
title: "需要审核"
- none: "没有帖子可以审核。"
+ none: "没有帖子需要审核。"
edit: "编辑"
cancel: "取消"
view_pending: "查看待审核帖子"
@@ -280,15 +279,15 @@ zh_CN:
directory:
filter_name: "按用户名检索"
title: "用户"
- likes_given: "给赞"
- likes_received: "获赞"
+ likes_given: "送出赞"
+ likes_received: "获得赞"
topics_entered: "浏览"
- topics_entered_long: "浏览过的主题"
+ topics_entered_long: "浏览主题"
time_read: "阅读时长"
topic_count: "主题"
- topic_count_long: "发布的主题"
+ topic_count_long: "创建主题"
post_count: "回复"
- post_count_long: "回复数"
+ post_count_long: "回帖数"
no_results: "没有找到结果。"
days_visited: "访问"
days_visited_long: "访问天数"
@@ -296,27 +295,69 @@ zh_CN:
posts_read_long: "阅读帖子"
total_rows:
other: "%{count} 位用户"
+ group_histories:
+ actions:
+ change_group_setting: "更改小组设置"
+ add_user_to_group: "增加用户"
+ remove_user_from_group: "移除用户"
+ make_user_group_owner: "设为所有者"
+ remove_user_as_group_owner: "撤销所有者"
groups:
+ logs:
+ title: "日志"
+ when: "时间"
+ action: "操作"
+ acting_user: "操作用户"
+ target_user: "目标用户"
+ subject: "主题"
+ details: "详情"
+ from: "来自"
+ to: "发至"
+ edit:
+ title: '编辑群组'
+ full_name: '名字'
+ add_members: "增加组员"
+ delete_member_confirm: "从“%{group}”群组中移除用户“%{username}'?"
+ request_membership_pm:
+ title: "成员申请"
+ body: "我想申请 @%{groupName} 的成员资格。"
+ name_placeholder: "群组名,没有空格,和用户名一样的规则"
+ public: "允许用户自由加入/离开群组(需要群组是可见)"
empty:
- posts: "小组的成员从未发表帖子。"
- members: "小组没有成员。"
- mentions: "小组从未被提及过。"
- messages: "小组从未发送过消息。"
- topics: "小组的成员从未发表主题。"
+ posts: "群组成员没有发布帖子。"
+ members: "群组没有成员。"
+ mentions: "群组从未被提及过。"
+ messages: "群组从未发送过消息。"
+ topics: "群组的成员从未发表主题。"
+ logs: "没有关于群组的日志。"
add: "添加"
+ join: "加入群组"
+ leave: "离开群组"
+ request: "请求加入群组"
+ automatic_group: 自动群组
+ closed_group: 封闭群组
+ is_group_user: "你是该群组的一个成员"
+ allow_membership_requests: "允许用户向群组拥有者发送加入小组请求(群组需要能让所有人提及)"
+ membership: "成员"
+ name: "名字"
+ user_count: "成员数量"
+ bio: "关于群组"
selector_placeholder: "添加成员"
owner: "所有者"
- visible: "小组对所有用户可见"
- index: "小组"
+ visible: "群组对所有用户可见"
+ index:
+ title: "群组"
+ empty: "没有可见的群组。"
title:
- other: "小组"
+ other: "群组"
+ activity: "活动"
members: "成员"
topics: "主题"
posts: "帖子"
mentions: "提及"
messages: "消息"
alias_levels:
- title: "谁能@该小组和发送消息?"
+ title: "谁能@该群组和发送消息?"
nobody: "没有人"
only_admins: "管理员"
mods_and_admins: "版主与管理员"
@@ -333,22 +374,31 @@ zh_CN:
title: "跟踪"
description: "你只会收到此组中每个新主题的第一帖的通知。"
tracking:
- title: "关注"
+ title: "跟踪"
description: "你会在别人@你或回复你时收到通知,并且新帖数量也将在这些主题后显示。"
regular:
title: "常规"
- description: "如果某人@你或者回复你,你将收到通知。"
+ description: "如果有人@你或回复你,将通知你。"
muted:
- title: "屏蔽"
+ title: "静音"
description: "你不会收到组内关于新主题中的任何通知。"
+ flair_url: "头像图片"
+ flair_url_placeholder: "(可选)图片 URL 或 Font Awesome class"
+ flair_bg_color: "头像背景颜色"
+ flair_bg_color_placeholder: "(可选)十六进制色彩值"
+ flair_color: "头像颜色"
+ flair_color_placeholder: "(可选)十六进制色彩值"
+ flair_preview_icon: "预览图标"
+ flair_preview_image: "预览图片"
+ flair_note: "注意:标示将只在用户的主要群组显示"
user_action_groups:
- '1': "送出的赞"
- '2': "收到的赞"
+ '1': "送出赞"
+ '2': "获得赞"
'3': "收藏"
'4': "主题"
'5': "回复"
'6': "回应"
- '7': "提到"
+ '7': "@我的"
'9': "引用"
'11': "编辑"
'12': "发送"
@@ -374,12 +424,10 @@ zh_CN:
latest_by: "最新发表:"
toggle_ordering: "排序控制"
subcategories: "子分类"
- topic_stats: "近期主题的数量。"
+ topic_sentence:
+ other: "%{count} 主题"
topic_stat_sentence:
other: "在过去一%{unit}中有 %{count} 个新主题。"
- post_stats: "新帖子的数量。"
- post_stat_sentence:
- other: "在过去一%{unit}中有 %{count} 个新帖子。"
ip_lookup:
title: IP 地址查询
hostname: 主机名
@@ -402,15 +450,19 @@ zh_CN:
profile: "个人资料"
mute: "防打扰"
edit: "修改设置"
- download_archive: "下载我的帖子"
- new_private_message: "新消息"
- private_message: "消息"
- private_messages: "消息"
+ download_archive:
+ button_text: "下载我的帖子"
+ confirm: "你确定要下载你的帖子吗?"
+ success: "下载开始,完成后将有消息通知你。"
+ rate_limit_error: "帖子只能每天下载一次,请明天再重试。"
+ new_private_message: "发新私信"
+ private_message: "私信"
+ private_messages: "私信"
activity_stream: "活动"
preferences: "设置"
expand_profile: "展开"
bookmarks: "收藏"
- bio: "个人简介"
+ bio: "个人信息"
invited_by: "邀请人"
trust_level: "信任等级"
notifications: "通知"
@@ -426,6 +478,7 @@ zh_CN:
each_browser_note: "注意:你必须在你使用的所用浏览器中更改这项设置。"
dismiss_notifications: "忽略所有"
dismiss_notifications_tooltip: "标记所有未读通知为已读"
+ first_notification: "你的头一个通知!选中它开始。"
disable_jump_reply: "回复后不跳转至新帖子"
dynamic_favicon: "在浏览器图标中显示主题更新数量"
external_links_in_new_tab: "在新标签页打开外部链接"
@@ -445,28 +498,29 @@ zh_CN:
enabled: "启用邮件列表模式"
instructions: |
此设置将覆盖活动摘要。
- 屏蔽的主题和分类不包含在这些邮件中。
+ 静音主题和分类不包含在这些邮件中。
daily: "发送每日更新"
individual: "为每个新帖发送一封邮件通知"
+ individual_no_echo: "为每个除了我发表的新帖发送一封邮件通知"
many_per_day: "为每个新帖给我发送邮件 (大约每天 {{dailyEmailEstimate}} 封)"
few_per_day: "为每个新帖给我发送邮件 (大约每天 2 封 )"
tag_settings: "标签"
- watched_tags: "关注"
- watched_tags_instructions: "自动关注有这些标签的主题,有新内容时提醒我,并在列表中显示新帖数量。"
- tracked_tags: "跟随"
- tracked_tags_instructions: "自动跟随有这些标签的主题,并在列表中显示新帖数量。"
- muted_tags: "屏蔽"
- muted_tags_instructions: "不会收到有这些标签的主题的提醒,并且他们将不会出现在最新主题中。"
- watched_categories: "关注"
- watched_categories_instructions: "自动关注这些分类中的所有主题,有新内容时提醒我,并在列表中显示新帖数量。"
- tracked_categories: "跟随"
- tracked_categories_instructions: "自动跟随这些分类中的所有主题,并在列表中显示新帖数量。"
- watched_first_post_categories: "关注首贴"
- watched_first_post_categories_instructions: "在这些分类中,新主题发表时提醒我。"
- watched_first_post_tags: "关注首贴"
- watched_first_post_tags_instructions: "有这些标签的新主题发表时提醒我。"
- muted_categories: "屏蔽"
- muted_categories_instructions: "不会收到这些分类中新主题提醒,并且他们将不会出现在最新主题中。"
+ watched_tags: "监看"
+ watched_tags_instructions: "你将自动监看有这些标签的所有主题。所有新帖子和新主题会通知你,新帖数量也会显示在主题旁边。"
+ tracked_tags: "跟踪"
+ tracked_tags_instructions: "你将自动跟踪这些标签的所有主题,新帖数量将会显示在主题旁边。"
+ muted_tags: "静音"
+ muted_tags_instructions: "你将不会收到有这些标签的新主题任何通知,它们也不会出现在“最新”主题列表。"
+ watched_categories: "监看"
+ watched_categories_instructions: "你将自动监看这些分类中的所有主题。所有新帖子和新主题会通知你,新帖数量也将显示在主题旁边。"
+ tracked_categories: "跟踪"
+ tracked_categories_instructions: "你将自动跟踪这些分类中的所有主题。新帖数量将会显示在主题旁边。"
+ watched_first_post_categories: "监看头一帖"
+ watched_first_post_categories_instructions: "在这些分类里面,每一个新主题的第一帖会通知你。"
+ watched_first_post_tags: "监看头一帖"
+ watched_first_post_tags_instructions: "在有了这些标签的每一个新主题,第一帖会通知你。"
+ muted_categories: "静音"
+ muted_categories_instructions: "在这些分类里面,你将不会收到新主题任何通知,它们也不会出现在“最新”主题列表。"
delete_account: "删除我的帐号"
delete_account_confirm: "你真的要永久删除自己的账号吗?删除之后无法恢复!"
deleted_yourself: "你的帐号已被删除。"
@@ -474,11 +528,15 @@ zh_CN:
unread_message_count: "消息"
admin_delete: "删除"
users: "用户"
- muted_users: "屏蔽"
- muted_users_instructions: "屏蔽任何关于这些用户的通知。"
- muted_topics_link: "显示已屏蔽的主题"
- watched_topics_link: "显示已关注的主题"
+ muted_users: "静音"
+ muted_users_instructions: "抑制来自这些用户的所有通知。"
+ muted_topics_link: "显示已静音的主题"
+ watched_topics_link: "显示已监看的主题"
automatically_unpin_topics: "当我完整阅读了主题时自动解除置顶。"
+ apps: "应用"
+ revoke_access: "撤销许可"
+ undo_revoke_access: "解除撤销许可"
+ api_approved: "已批准:"
staff_counters:
flags_given: "采纳标记"
flagged_posts: "被标记"
@@ -490,7 +548,7 @@ zh_CN:
inbox: "收件箱"
sent: "已发送"
archive: "存档"
- groups: "我的小组"
+ groups: "我的群组"
bulk_select: "选择消息"
move_to_inbox: "移动到收件箱"
move_to_archive: "存档"
@@ -503,7 +561,7 @@ zh_CN:
action: "发送密码重置邮件"
set_password: "设置密码"
change_about:
- title: "更改个人简介"
+ title: "更改个人信息"
error: "提交修改时出错了"
change_username:
title: "更换用户名"
@@ -532,7 +590,7 @@ zh_CN:
title: "个人资料背景"
instructions: "显示在个人资料页面中,上传的图片将被居中且默认宽度为 850px。"
change_card_background:
- title: "用户资料背景"
+ title: "用户卡片背景"
instructions: "显示在用户卡片中,上传的图片将被居中且默认宽度为 590px。"
email:
title: "邮箱"
@@ -566,6 +624,7 @@ zh_CN:
title: "界面语言"
instructions: "用户界面语言。将在你刷新页面后改变。"
default: "默认"
+ any: "任意"
password_confirmation:
title: "请再次输入密码"
last_posted: "最后发帖"
@@ -573,7 +632,7 @@ zh_CN:
last_seen: "最后活动"
created: "加入时间"
log_out: "登出"
- location: "地址"
+ location: "地点"
card_badge:
title: "用户卡片徽章"
website: "网站"
@@ -612,7 +671,7 @@ zh_CN:
after_2_days: "两天内发布"
after_1_week: "一周内发布"
after_2_weeks: "两周内发布"
- auto_track_topics: "自动关注我浏览的主题"
+ auto_track_topics: "自动跟踪我浏览的主题"
auto_track_options:
never: "从不"
immediately: "立即"
@@ -623,6 +682,7 @@ zh_CN:
after_4_minutes: "4分钟后"
after_5_minutes: "5分钟后"
after_10_minutes: "10分钟后"
+ notification_level_when_replying: "当我在主题中回复后,将主题设置至"
invited:
search: "输入以搜索邀请..."
title: "邀请"
@@ -652,13 +712,12 @@ zh_CN:
account_age_days: "账号建立天数"
create: "发送邀请"
generate_link: "复制邀请链接"
- generated_link_message: '
邀请链接成功生成!
邀请链接仅对下列邮件地址有效:%{invitedEmail}
' + link_generated: "邀请链接生成成功!" + valid_for: "邀请链接只对这个邮件地址有效:%{email}" bulk_invite: - none: "你从未邀请过他人。你可以发送单个邀请,或者上传批量邀请文件一次邀请多人。" + none: "你还没有邀请过任何人。你可以邀请一个人,或者上传 CSV 文件邀请一批人。" text: "通过文件批量邀请" - uploading: "上传中..." success: "文件上传成功,当操作完成时将通过消息通知你。" - error: "在上传 '{{filename}}' 时出现错误:{{message}}" password: title: "密码" too_short: "密码过短" @@ -672,13 +731,13 @@ zh_CN: stats: "统计" time_read: "阅读时间" topic_count: - other: "创建的主题" + other: "创建主题" post_count: - other: "发表的帖子" + other: "发表帖子" likes_given: - other: " 给赞" + other: " 送出赞" likes_received: - other: " 获赞" + other: " 获得赞" days_visited: other: "访问天数" posts_read: @@ -715,7 +774,7 @@ zh_CN: stream: posted_by: "发送人" sent_by: "发送时间" - private_message: "消息" + private_message: "私信" the_topic: "本主题" loading: "载入中..." errors: @@ -749,11 +808,13 @@ zh_CN: too_few_topics_notice: "让我们开始讨论!目前有 %{currentTopics} / %{requiredTopics} 个主题。新访客需要能够阅读和回复一些讨论。" too_few_posts_notice: "让我们开始讨论!目前有 %{currentPosts} / %{requiredPosts} 个帖子。新访客需要能够阅读和回复一些讨论。" logs_error_rate_notice: - reached: "[%{relativeAge}] 目前的错误率 %{rate} 已达到了站点设置中的 %{siteSettingRate}。" + reached: "%{relativeAge} – %{rate} 达到了站点设置中的 %{siteSettingRate}。" exceeded: "[%{relativeAge}] 目前的错误率 %{rate} 已超出了站点设置中的 %{siteSettingRate}。" rate: other: "%{count} 错误/%{duration}" learn_more: "了解更多..." + all_time: '总量' + all_time_desc: '创建的主题总量' year: '年' year_desc: '365 天内创建的主题' month: '月' @@ -761,10 +822,10 @@ zh_CN: week: '周' week_desc: '7 天内创建的主题' day: '天' - first_post: 首次发帖 - mute: 屏蔽 - unmute: 解除屏蔽 - last_post: 最后发帖 + first_post: 最早帖子 + mute: 静音 + unmute: 取消静音 + last_post: 最后帖子 last_reply_lowercase: 最后回复 replies_lowercase: other: 回复 @@ -787,8 +848,8 @@ zh_CN: enable: "隐藏已删除的帖子" disable: "显示已删除的帖子" private_message_info: - title: "消息" - invite: "邀请其他..." + title: "私信" + invite: "邀请其他人..." remove_allowed_user: "确定将 {{name}} 从本条消息中移除?" remove_allowed_group: "确定将 {{name}} 从本条消息中移除?" email: '邮箱' @@ -799,7 +860,8 @@ zh_CN: trust_level: '用户级别' search_hint: '用户名、电子邮件或 IP 地址' create_account: - title: "创建用户" + disclaimer: "注册即表示你同意隐私策略和服务条款。" + title: "创建新帐号" failed: "出问题了,有可能这个邮箱已经被注册了。试试忘记密码链接?" forgot_password: title: "重置密码" @@ -816,7 +878,7 @@ zh_CN: title: "登录" username: "用户" password: "密码" - email_placeholder: "邮箱地址或用户名" + email_placeholder: "电子邮件或者用户名" caps_lock_warning: "大写锁定开启" error: "出错了" rate_limit: "请请稍后再重试" @@ -863,6 +925,10 @@ zh_CN: twitter: "Twitter" emoji_one: "Emoji One" win10: "Win10" + category_page_style: + categories_only: "仅分类" + categories_with_featured_topics: "有推荐主题的分类" + categories_and_latest_topics: "分类和最新主题" shortcut_modifier_key: shift: 'Shift' ctrl: 'Ctrl' @@ -872,15 +938,21 @@ zh_CN: more_emoji: "更多…" options: "选项" whisper: "密语" + unlist: "隐藏" add_warning: "正式警告" toggle_whisper: "折叠或展开密语" + toggle_unlisted: "未列表切换" posting_not_on_topic: "你想回复哪一个主题?" saving_draft_tip: "保存中..." saved_draft_tip: "已保存" saved_local_draft_tip: "已本地保存" similar_topics: "你的主题有点类似于..." drafts_offline: "离线草稿" - group_mentioned: "提及 {{group}} 时,你将通知 {{count}} 人 - 确定吗?" + group_mentioned: + other: "提及 {{group}} 时,你将通知 {{count}} 人 - 确定吗?" + cannot_see_mention: + category: "你提到了{{userrname}},然而他们不能访问该分类,所以他们不会被通知。你需要把他们加入到能访问该分类的群组中。" + private: "你提到了{{userrname}},然而他们不能访问该私信,所以他们不会被通知。你需要邀请他们至私信中。" duplicate_link: "似乎你的链接 {{domain}} 在{{ago}}已经由@{{username}}回复了 - 确定再次提交吗?" error: title_missing: "标题为空" @@ -896,13 +968,15 @@ zh_CN: reply: "回复" cancel: "取消" create_topic: "创建主题" - create_pm: "消息" + create_pm: "私信" title: "或 Ctrl + 回车" users_placeholder: "添加用户" - title_placeholder: "一句话阐述要说什么..." + title_placeholder: "一句话告诉讨论什么..." + title_or_link_placeholder: "键入标题,或粘贴一个链接在这里" edit_reason_placeholder: "编辑理由" show_edit_reason: "添加理由" - reply_placeholder: "支持直接拖拽或粘贴图片,使用 Markdown/BBCode/HTML 语法。" + topic_featured_link_placeholder: "在标题里输入链接" + reply_placeholder: "在此键入。使用Markdown,BBCode,或HTML格式。可拖拽或粘贴图片。" view_new_post: "浏览新帖。" saving: "保存中" saved: "已保存!" @@ -911,8 +985,10 @@ zh_CN: show_preview: '显示预览 »' hide_preview: '« 隐藏预览' quote_post_title: "引用整个帖子" + bold_label: "B" bold_title: "加粗" bold_text: "加粗示例" + italic_label: "I" italic_title: "斜体" italic_text: "斜体示例" link_title: "链接" @@ -930,6 +1006,7 @@ zh_CN: olist_title: "数字列表" ulist_title: "符号列表" list_item: "列表条目" + heading_label: "H" heading_title: "标题" heading_text: "标题头" hr_title: "分割线" @@ -937,10 +1014,13 @@ zh_CN: toggler: "隐藏或显示编辑面板" modal_ok: "确认" modal_cancel: "取消" - cant_send_pm: "抱歉,你不能向 %{username} 发送私信。" + cant_send_pm: "抱歉,你不能向 %{username} 发送消息。" + yourself_confirm: + title: "你忘记添加收信人了吗?" + body: "目前该私信只发给了你自己!" admin_options_title: "本主题可选设置" auto_close: - label: "自动关闭主题:" + label: "自动关闭主题时间:" error: "请输入一个有效值。" based_on_last_post: "以最后回复的时间开始计时" all: @@ -952,10 +1032,10 @@ zh_CN: title: "使用@提到你,回复你的内容、消息以及其他的通知" none: "现在无法载入通知" empty: "未发现通知" - more: "历史通知" + more: "看历史通知" total_flagged: "被标记帖子的总数" mentioned: "
{{username}} {{description}}
" - group_mentioned: "
{{username}} {{description}}
" + group_mentioned: "
{{username}} {{description}}
" quoted: "
{{username}} {{description}}
" replied: "
{{username}} {{description}}
" posted: "
{{username}} {{description}}
" @@ -971,9 +1051,9 @@ zh_CN: moved_post: "
{{username}}移动了{{description}}
" linked: "
{{username}}{{description}}
" granted_badge: "
获得“{{description}}”
" - watching_first_post: "
新主题{{description}}
" + watching_first_post: "
近期主题{{description}}
" group_message_summary: - other: "
{{count}} 条消息在{{group_name}}组的收件箱中
" + other: "
{{count}} 条消息在{{group_name}}组的收件箱中
"
alt:
mentioned: "被提及"
quoted: "被引用"
@@ -988,14 +1068,14 @@ zh_CN:
moved_post: "你的帖子被移动自"
linked: "链接至你的帖子"
granted_badge: "勋章授予"
- group_message_summary: "在小组收件箱中的消息"
+ group_message_summary: "在群组收件箱中的消息"
popup:
mentioned: '{{username}}在“{{topic}}”提到了你 - {{site_title}}'
group_mentioned: '{{username}}在“{{topic}}”提到了你 - {{site_title}}'
quoted: '{{username}}在“{{topic}}”引用了你的帖子 - {{site_title}}'
replied: '{{username}}在“{{topic}}”回复了你 - {{site_title}}'
posted: '{{username}}在“{{topic}}”中发布了帖子 - {{site_title}}'
- private_message: '{{username}}在“{{topic}}”中给你发送了一个消息 - {{site_title}}'
+ private_message: '{{username}}在“{{topic}}”中给你发送了一个私信 - {{site_title}}'
linked: '{{username}}在“{{topic}}”中链接了你的帖子 - {{site_title}}'
upload_selector:
title: "插入图片"
@@ -1014,31 +1094,72 @@ zh_CN:
search:
sort_by: "排序"
relevance: "最相关"
- latest_post: "最后发帖"
+ latest_post: "最新发帖"
most_viewed: "最多阅读"
most_liked: "最多赞"
select_all: "全选"
clear_all: "清除所有"
+ too_short: "你的搜索词太短。"
result_count:
other: "搜索“{{term}}”有 {{count}} 条相关结果"
title: "搜索主题、帖子、用户或分类"
no_results: "没有找到结果。"
no_more_results: "没有找到更多结果。"
- search_help: 搜索帮助
searching: "搜索中..."
post_format: "#{{post_number}} 来自于 {{username}}"
context:
user: "搜索 @{{username}} 的帖子"
category: "搜索 #{{category}} 分类"
- topic: "只搜索本主题"
+ topic: "搜索本主题"
private_messages: "搜索消息"
- hamburger_menu: "转到另一列表或分类"
+ advanced:
+ title: 高级搜索
+ posted_by:
+ label: 发帖人
+ in_category:
+ label: 在该分类中
+ in_group:
+ label: 在该群组中
+ with_badge:
+ label: 有该徽章
+ with_tags:
+ label: 有该标签
+ filters:
+ label: 只返回主题/帖子符合...
+ likes: 我给了赞的
+ posted: 我参与发帖
+ watching: 我正在监看
+ tracking: 我正在追踪
+ private: 在我的私信中
+ bookmarks: 我已经收藏了
+ first: 是第一帖
+ pinned: 是置顶的
+ unpinned: 不是置顶的
+ wiki: 公共编辑
+ statuses:
+ label: 当主题
+ open: 是开放的
+ closed: 是关闭的
+ archived: 已经存档的
+ noreplies: 没有回复
+ single_user: 只有一个用户参与
+ post:
+ count:
+ label: 最小帖子数
+ time:
+ label: 发表于
+ before: 之前
+ after: 之后
+ hamburger_menu: "转到另一个主题列表或分类"
new_item: "新"
go_back: '返回'
not_logged_in_user: '显示当前活动和设置的用户页面'
current_user: '转到用户页面'
topics:
+ new_messages_marker: "上次访问"
bulk:
+ select_all: "选择全部"
+ clear_all: "清除全部"
unlist_topics: "未在列表的主题"
reset_read: "设为未读"
delete: "删除主题"
@@ -1051,7 +1172,7 @@ zh_CN:
toggle: "切换至批量选择"
actions: "批量操作"
change_category: "更改分类"
- close_topics: "锁定主题"
+ close_topics: "关闭主题"
archive_topics: "存档主题"
notification_level: "更改通知等级"
choose_new_category: "选择新分类:"
@@ -1062,7 +1183,7 @@ zh_CN:
changed_tags: "主题的标签被修改"
none:
unread: "你没有未读主题。"
- new: "你没有新主题可读。"
+ new: "你没有近期主题可读。"
read: "你尚未阅读任何主题。"
posted: "你尚未在任何主题中发帖。"
latest: "没有新的主题。"
@@ -1079,7 +1200,7 @@ zh_CN:
hot: "没有更多热门主题可看了。"
posted: "没有更多已发布主题可看了。"
read: "没有更多已阅主题可看了。"
- new: "没有更多新主题可看了。"
+ new: "没有更多的近期主题。"
unread: "没有更多未读主题了。"
category: "没有更多{{category}}分类的主题了。"
top: "没有更多最佳主题了。"
@@ -1089,10 +1210,11 @@ zh_CN:
unsubscribe:
stop_notifications: "你将收到更少的关于{{title}}的通知"
change_notification_state: "你现在的通知状态是"
- filter_to: "本主题中的 {{post_count}} 帖"
- create: '新主题'
- create_long: '创建主题'
- private_message: '发送消息'
+ filter_to:
+ other: "本主题中的 {{count}} 帖"
+ create: '发新主题'
+ create_long: '创建新的主题'
+ private_message: '开始发私信'
archive_message:
help: '移动消息到存档'
title: '存档'
@@ -1100,10 +1222,10 @@ zh_CN:
title: '移动到收件箱'
help: '移动消息到收件箱'
list: '主题'
- new: '新主题'
+ new: '近期主题'
unread: '未读'
new_topics:
- other: '{{count}} 新主题'
+ other: '{{count}} 近期主题'
unread_topics:
other: '{{count}} 未读主题'
title: '主题'
@@ -1129,11 +1251,11 @@ zh_CN:
options: "主题选项"
show_links: "显示此主题中的链接"
toggle_information: "切换主题详情"
- read_more_in_category: "想阅读更多内容?浏览{{catLink}}或{{latestLink}}里的其它主题。"
- read_more: "想阅读更多内容?{{catLink}} 或 {{latestLink}}。"
- read_more_MF: "还有 { UNREAD, plural, =0 {} one { 1 个未读主题} other { # 个未读主题 } } { NEW, plural, =0 {} one { {BOTH, select, true{和 } false {} other{}} 1 个新主题} other { {BOTH, select, true{和 } false {} other{}} # 个新主题} }可以阅读,或者{CATEGORY, select, true {浏览{catLink}中的其他主题} false {{latestLink}} other {}}"
- browse_all_categories: 查看所有分类
- view_latest_topics: 浏览最新主题
+ read_more_in_category: "想阅读更多?浏览{{catLink}}的其他主题 或 {{latestLink}}。"
+ read_more: "想阅读更多?{{catLink}} 或 {{latestLink}}。"
+ read_more_MF: "还有 { UNREAD, plural, =0 {} one { 1 个未读主题} other { # 个未读主题 } } { NEW, plural, =0 {} one { {BOTH, select, true{和 } false {} other{}} 1 个新主题} other { {BOTH, select, true{和 } false {} other{}} # 个近期主题} }可以阅读,或者{CATEGORY, select, true {浏览{catLink}中的其他主题} false {{latestLink}} other {}}"
+ browse_all_categories: 浏览所有分类
+ view_latest_topics: 查阅最新主题
suggest_create_topic: 创建一个新的主题吧!
jump_reply_up: 转到更早的回复
jump_reply_down: 转到更新的回复
@@ -1143,11 +1265,11 @@ zh_CN:
auto_close_title: '自动关闭设置'
auto_close_save: "保存"
auto_close_remove: "不要自动关闭该主题"
- auto_close_immediate: "主题中的上个帖子是 %{hours} 小时前发出的,所以主题将会立即关闭。"
+ auto_close_immediate:
+ other: "主题中的最后一帖是 %{hours} 小时前发出的,所以主题将会立即关闭。"
timeline:
back: "返回"
back_description: "回到最后一个未读帖子"
- replies: "%{current} / %{total} 回复"
replies_short: "%{current} / %{total}"
progress:
title: 主题进度
@@ -1155,60 +1277,60 @@ zh_CN:
go_bottom: "底部"
go: "前往"
jump_bottom: "跳至最后一个帖子"
- jump_prompt: "跳至帖子"
+ jump_prompt: "跳到..."
+ jump_prompt_of: "%{count} 帖子"
jump_prompt_long: "你想跳转至哪一贴?"
jump_bottom_with_number: "跳至第 %{post_number} 帖"
total: 全部帖子
current: 当前帖子
- position: "%{current} / %{total}"
notifications:
- title: 改变你收到本主题通知的频率
+ title: 改变你收到该主题通知的频率
reasons:
mailing_list_mode: "邮件列表模式已启用,将以邮件通知你关于该主题的回复。"
- '3_10': '因为你关注该主题上的标签,所以你将收到相关通知。'
- '3_6': '因为你关注该分类,所以你将收到相关通知。'
- '3_5': '因为你自动关注了该主题,所以你将收到相关通知。'
- '3_2': '因为你在关注该主题,所以你将收到相关通知。'
- '3_1': '因为你创建了该主题,所以你将收到相关通知。'
- '3': '因为你在关注该主题,所以你将收到相关通知。'
- '2_8': '因为你在跟随该分类,所以你将收到相关通知。'
- '2_4': '因为你在该主题内发表了回复,所以你将收到相关通知。'
- '2_2': '因为你在跟随该主题,所以你将收到相关通知。'
- '2': '因为你阅读了该主题,所以你将收到相关通知。'
- '1_2': '如果某人@你或者回复你,你将收到通知。'
- '1': '如果某人@你或者回复你,你将收到通知。'
+ '3_10': '因为你正监看该主题上的标签,你将会收到通知。'
+ '3_6': '因为你正在监看该分类,你将会收到通知。'
+ '3_5': '因为你开始自动监看该主题,你将会收到通知。'
+ '3_2': '因为你正在监看该主题,你将会收到通知。'
+ '3_1': '因为你创建了这个主题,你将会收到通知。'
+ '3': '因为你正在监看该主题,你将会收到通知。'
+ '2_8': '因为你正在跟踪该分类,你将收到通知。'
+ '2_4': '因为你发布了对该主题的回复,你将会收到通知。'
+ '2_2': '因为你正在跟踪该主题,你将收到通知。'
+ '2': '因为你阅读了该主题,你将会收到通知。'
+ '1_2': '如果有人@你或回复你,将通知你。'
+ '1': '如果有人@你或回复你,将通知你。'
'0_7': '你将忽略关于该分类的所有通知。'
'0_2': '你将忽略关于该主题的所有通知。'
'0': '你将忽略关于该主题的所有通知。'
watching_pm:
- title: "关注"
+ title: "监看"
description: "消息有新回复时提醒我,并显示新回复数量。"
watching:
- title: "关注"
- description: "主题有新回复时提醒我,并显示新回复数量。"
+ title: "监看"
+ description: "在此主题里,每一个新回复将通知你,还将显示新回复的数量。"
tracking_pm:
- title: "跟随"
+ title: "跟踪"
description: "在消息标题后显示新回复数量。你只会在别人@你或回复你的帖子时才会收到通知。"
tracking:
- title: "跟随"
- description: "在主题标题后显示新回复数量。你只会在别人@你或回复你的帖子时才会收到通知。"
+ title: "跟踪"
+ description: "将为该主题显示新回复的数量。如果有人@你或回复你,将通知你。"
regular:
title: "普通"
- description: "如果某人@你或者回复你,你将收到通知。"
+ description: "如果有人@你或回复你,将通知你。"
regular_pm:
title: "普通"
- description: "如果某人@你或者回复你,你将收到通知。"
+ description: "如果有人@你或回复你,将通知你。"
muted_pm:
- title: "屏蔽"
+ title: "静音"
description: "不会收到该消息的任何通知。"
muted:
- title: "屏蔽"
- description: "不会收到该主题的任何通知,也不会出现在最新主题中。"
+ title: "静音"
+ description: "你不会收到此主题的任何通知,它也不会出现在“最新”主题列表。"
actions:
recover: "撤销删除主题"
delete: "删除主题"
- open: "解除锁定主题"
- close: "锁定主题"
+ open: "打开主题"
+ close: "关闭主题"
multi_select: "选择帖子..."
auto_close: "自动关闭..."
pin: "置顶主题..."
@@ -1228,16 +1350,19 @@ zh_CN:
remove_banner: "取消横幅主题"
reply:
title: '回复'
- help: '开始给本主题撰写回复'
+ help: '开始为该主题撰写回复'
clear_pin:
title: "取消置顶"
help: "取消本主题的置顶状态,将不再固定显示在主题列表顶部。"
share:
title: '分享'
- help: '分享内容的链接'
+ help: '分享指向这个主题的链接'
+ print:
+ title: '打印'
+ help: '打开该主题对打印友好的版本'
flag_topic:
title: '标记'
- help: '私下标记本帖以引起管理员注意或者发送匿名通知'
+ help: '背地里标记该帖以示警示,或发送关于它的私下通知'
success_message: '你已经成功标记该主题。'
feature_topic:
title: "置顶主题"
@@ -1264,25 +1389,25 @@ zh_CN:
no_banner_exists: "没有横幅主题。"
banner_exists: "当前设置了横幅主题。"
inviting: "邀请中..."
- automatically_add_to_groups: "邀请将把用户加入小组:"
+ automatically_add_to_groups: "邀请将把用户加入群组:"
invite_private:
title: '邀请至消息'
email_or_username: "受邀人的邮箱或用户名"
- email_or_username_placeholder: "邮箱地址或用户名"
+ email_or_username_placeholder: "电子邮件地址或者用户名"
action: "邀请"
success: "成功邀请了用户至该消息。"
- success_group: "成功邀请了小组至该消息。"
+ success_group: "成功邀请了群组至该消息。"
error: "抱歉,邀请时出了点小问题。"
- group_name: "小组名"
- controls: "主题控制操作"
+ group_name: "群组名"
+ controls: "主题控件"
invite_reply:
title: '邀请'
username_placeholder: "用户名"
action: '发送邀请'
- help: '邮件或通知邀请其他人至主题'
+ help: '通过电子邮件或通知邀请其他人到该主题'
to_forum: "将发送一封简洁的邮件,让你的朋友无需注册即可用链接参与讨论。"
- sso_enabled: "输入你想邀请的人的用户名,以邀请他至该主题。"
- to_topic_blank: "输入你想邀请的人的用户名或邮件,以邀请他至该主题。"
+ sso_enabled: "输入其用户名,邀请其人到本主题。"
+ to_topic_blank: "输入其用户名或者 Email 地址,邀请其人到本主题。"
to_topic_email: "你输入了邮箱地址。我们将发送一封邮件邀请,让你的朋友可直接回复该主题。"
to_topic_username: "你输入了用户名。我们将发送一个至该主题链接的邀请通知。"
to_username: "输入你想邀请的人的用户名。我们将发送一个至该主题链接的邀请通知。"
@@ -1355,7 +1480,6 @@ zh_CN:
expand_collapse: "展开/折叠"
gap:
other: "查看 {{count}} 个隐藏回复"
- more_links: "{{count}} 更多..."
unread: "未读帖子"
has_replies:
other: "{{count}} 回复"
@@ -1373,7 +1497,7 @@ zh_CN:
file_too_large: "文件过大(最大 {{max_size_kb}}KB)。为什么不就大文件上传至云存储服务后再分享链接呢?"
too_many_uploads: "抱歉,一次只能上传一张图片。"
too_many_dragged_and_dropped_files: "抱歉,一次只能上传 10 个文件。"
- upload_not_authorized: "抱歉,你不能上传此类型文件(可上传的文件类型有:{{authorized_extensions}})。"
+ upload_not_authorized: "抱歉,你没有上传文件的权限 (验证扩展:{{authorized_extensions}})。"
image_upload_not_allowed_for_new_user: "抱歉,新用户无法上传图片。"
attachment_upload_not_allowed_for_new_user: "抱歉,新用户无法上传附件。"
attachment_download_requires_login: "抱歉,你需要登录后才能下载附件。"
@@ -1385,7 +1509,7 @@ zh_CN:
via_auto_generated_email: "通过自动生成邮件发表的帖子"
whisper: "设置帖子为密语,只对版主可见"
wiki:
- about: "这个帖子是可多人协作的帖子"
+ about: "此帖允许被公共编辑"
archetypes:
save: '保存选项'
few_likes_left: "谢谢你的热情!你今天的赞快用完了。"
@@ -1396,10 +1520,10 @@ zh_CN:
undo_like: "取消赞"
edit: "编辑本帖"
edit_anonymous: "抱歉,需要登录后才能编辑该贴。"
- flag: "私下标记本帖以提醒管理人员关注或发送私信"
+ flag: "背地里标记该帖以示警示,或发送关于它的私下通知"
delete: "删除本帖"
undelete: "恢复本帖"
- share: "分享本帖的链接"
+ share: "分享指向这个帖子的链接"
more: "更多"
delete_replies:
confirm:
@@ -1407,8 +1531,8 @@ zh_CN:
yes_value: "是,一并删除相关回复"
no_value: "否,仅删除该帖"
admin: "帖子管理"
- wiki: "开启多人协作"
- unwiki: "关闭多人协作"
+ wiki: "公共编辑"
+ unwiki: "限制公共编辑"
convert_to_moderator: "添加管理人员颜色标识"
revert_to_regular: "移除管理人员颜色标识"
rebake: "重建 HTML"
@@ -1418,14 +1542,6 @@ zh_CN:
flag: '标记'
defer_flags:
other: "推迟处理标记"
- it_too:
- off_topic: "同时标记"
- spam: "同时标记"
- inappropriate: "同时标记"
- custom_flag: "同时标记"
- bookmark: "同时收藏"
- like: "同时赞"
- vote: "同时投票"
undo:
off_topic: "撤回标记"
spam: "撤回标记"
@@ -1438,7 +1554,7 @@ zh_CN:
spam: "标记为垃圾信息"
inappropriate: "不恰当的言辞"
notify_moderators: "通知版主"
- notify_user: "发送消息"
+ notify_user: "发送私信"
bookmark: "收藏"
like: "赞了它"
vote: "已投票"
@@ -1527,6 +1643,7 @@ zh_CN:
tags_allowed_tag_groups: "仅在该分类内可以使用的标签组"
tags_placeholder: "(可选)允许使用的标签列表"
tag_groups_placeholder: "(可选)允许使用的标签组列表"
+ topic_featured_link_allowed: "运行在该分类中发布特色链接"
delete: '删除分类'
create: '新分类'
create_long: '创建新的分类'
@@ -1561,6 +1678,8 @@ zh_CN:
email_in_disabled: "站点设置中已经禁用通过邮件发表新主题。欲启用通过邮件发表新主题,"
email_in_disabled_click: '启用“邮件发表”设置。'
suppress_from_homepage: "不在主页中显示这个分类。"
+ all_topics_wiki: "默认将新主题设为维基主题"
+ sort_order: "默认排序:"
allow_badges_label: "允许在这个分类中授予徽章"
edit_permissions: "编辑权限"
add_permission: "添加权限"
@@ -1572,20 +1691,32 @@ zh_CN:
parent: "上级分类"
notifications:
watching:
- title: "关注"
- description: "自动关注这些分类中的主题,有新内容时提醒我,并在列表中显示新帖数量。"
+ title: "监看"
+ description: "你将自动监看这些分类中的所有主题。每一个主题的每一个新帖,将通知你,还将显示新回复的数量。"
watching_first_post:
- title: "关注首贴"
- description: "在这些分类中,新主题发表时提醒我。"
+ title: "监看头一帖"
+ description: "在这些分类里面,只是每一个新主题的第一帖,才会通知你。"
tracking:
- title: "跟随"
- description: "自动跟随这些分类中的所有主题,并在列表中显示新帖数量。如果某人@你或者回复你,你将收到通知。"
+ title: "跟踪"
+ description: "你将自动跟踪这些分类中的所有主题。如果有人@你或回复你,将通知你,还将显示新回复的数量。"
regular:
title: "普通"
- description: "如果某人@你或者回复你,你将收到通知。"
+ description: "如果有人@你或回复你,将通知你。"
muted:
- title: "屏蔽"
- description: "不会收到这些分类中的主题的提醒,并且他们将不会出现在最新主题中。"
+ title: "静音"
+ description: "在这些分类里面,你将不会收到新主题任何通知,它们也不会出现在“最新”主题列表。 "
+ sort_options:
+ default: "默认"
+ likes: "赞"
+ op_likes: "原始帖子赞"
+ views: "浏览"
+ posts: "帖子"
+ activity: "活动"
+ posters: "发表人"
+ category: "分类"
+ created: "创建"
+ sort_ascending: '升序'
+ sort_descending: '降序'
flagging:
title: '感谢你帮助我们建设文明社群!'
action: '标记帖子'
@@ -1593,7 +1724,7 @@ zh_CN:
notify_action: '消息'
official_warning: '正式警告'
delete_spammer: "删除垃圾发布者"
- delete_confirm: "你将删除该用户的 %{posts} 个帖子和 %{topics} 个主题,删除该账户,阻止其IP地址 %{ip_address} 再次注册,并将其邮件地址 %{email} 加入黑名单。确定吗?"
+ delete_confirm_MF: "你将删除该用户的{POSTS, plural, one {1个帖子} other {#个帖子}} and {TOPICS, plural, one {1个主题} other {#个主题}}、该账户,并阻止其IP地址 %{ip_address} 再次注册,并将其邮件地址 %{email} 加入黑名单。你确定这用户是广告散布者吗?"
yes_delete_spammer: "确定"
ip_address_missing: "(N/A)"
hidden_email_address: "(隐藏)"
@@ -1608,9 +1739,12 @@ zh_CN:
custom_placeholder_notify_user: "请具体说明,有建设性的,再友好一些。"
custom_placeholder_notify_moderators: "让我们知道你关心地是什么,并尽可能地提供相关链接和例子。"
custom_message:
- at_least: "输入至少 {{n}} 个字符"
- more: "还差 {{n}} 个..."
- left: "还剩下 {{n}}"
+ at_least:
+ other: "输入至少 {{count}} 个字符"
+ more:
+ other: "还差 {{count}} 个..."
+ left:
+ other: "剩余 {{count}}"
flagging_topic:
title: "感谢你帮助我们建设文明社群!"
action: "标记帖子"
@@ -1632,11 +1766,11 @@ zh_CN:
bookmarked:
help: "你已经收藏了此主题"
locked:
- help: "本主题已关闭;不再接受新的回复"
+ help: "这个主题被关闭;不再允许新的回复"
archived:
help: "本主题已归档;即已经冻结,无法修改"
locked_and_archived:
- help: "本主题已经关闭并且存档;不再接受新回复且无法修改"
+ help: "这个主题被关闭并存档;不再允许新的回复,并不能改变"
unpinned:
title: "解除置顶"
help: "主题已经解除置顶;它将以默认顺序显示"
@@ -1649,7 +1783,6 @@ zh_CN:
invisible:
help: "本主题被设置为不显示在主题列表中,并且只能通过直达链接来访问"
posts: "帖子"
- posts_lowercase: "帖子"
posts_long: "本主题有 {{number}} 个帖子"
posts_likes_MF: |
这个主题有 {count, plural, other {# 个帖子}}{ratio, select,
@@ -1685,7 +1818,7 @@ zh_CN:
title: "最新"
title_with_count:
other: "最新({{count}})"
- help: "最新发布的帖子"
+ help: "有了新帖的活动主题"
hot:
title: "热门"
help: "最近最受欢迎的主题"
@@ -1698,22 +1831,22 @@ zh_CN:
categories:
title: "分类"
title_in: "分类 - {{categoryName}}"
- help: "归属于不同分类的所有主题"
+ help: "归入各种类别的所有主题"
unread:
title: "未读"
title_with_count:
other: "未读({{count}})"
- help: "你正在关注或跟随的主题中有未阅帖子的主题"
+ help: "你目前监看或跟踪有了未读帖子的主题"
lower_title_with_count:
- other: "{{count}} 条未读"
+ other: "{{count}} 未读"
new:
lower_title_with_count:
other: "{{count}} 近期"
lower_title: "近期"
title: "近期"
title_with_count:
- other: "近期({{count}})"
- help: "最近几天创建的主题"
+ other: "近期 ({{count}})"
+ help: "最近几天里创建的主题"
posted:
title: "我的帖子"
help: "你发表过帖子的主题"
@@ -1727,7 +1860,7 @@ zh_CN:
help: "{{categoryName}}分类中热门的主题"
top:
title: "热门"
- help: "最近一年、一月、一周或一天的最活跃主题"
+ help: "在最近的一年,一月,一周或一天最活跃的主题"
all:
title: "不限时间"
yearly:
@@ -1746,7 +1879,7 @@ zh_CN:
this_month: "月"
this_week: "周"
today: "今天"
- other_periods: "跳转到顶部"
+ other_periods: "跳至顶部"
browser_update: '抱歉,你的浏览器版本太低,无法正常访问该站点。。请升级你的浏览器。'
permission_types:
full: "创建 / 回复 / 阅读"
@@ -1754,8 +1887,6 @@ zh_CN:
readonly: "阅读"
lightbox:
download: "下载"
- search_help:
- title: '搜索帮助'
keyboard_shortcuts_help:
title: '键盘快捷键'
jump_to:
@@ -1768,7 +1899,7 @@ zh_CN:
top: 'g, t 热门'
bookmarks: 'g, b 书签'
profile: 'g 然后 p 个人页面'
- messages: 'g, m 消息'
+ messages: 'g, m 私信'
navigation:
title: '导航'
jump: '# 前往帖子 #'
@@ -1807,6 +1938,7 @@ zh_CN:
mark_regular: 'm, r 常规 (默认) 主题'
mark_tracking: 'm, t 追踪主题'
mark_watching: 'm, w 看主题'
+ print: 'ctrl+p 打印主题'
badges:
earned_n_times:
other: "授予徽章 %{count} 次"
@@ -1829,7 +1961,7 @@ zh_CN:
community:
name: 社区
trust_level:
- name: Trust Level
+ name: 信任等级
other:
name: 其它
posting:
@@ -1849,7 +1981,7 @@ zh_CN:
selector_no_tags: "无标签"
changed: "标签被修改:"
tags: "标签"
- choose_for_topic: "为本主题选择可选标签"
+ choose_for_topic: "为此主题选择可选标签"
delete_tag: "删除标签"
delete_confirm: "确定要删除这个标签吗?"
rename_tag: "重命名标签"
@@ -1858,28 +1990,28 @@ zh_CN:
sort_by_count: "总数"
sort_by_name: "名称"
manage_groups: "管理标签组"
- manage_groups_description: "管理标签的小组"
+ manage_groups_description: "管理标签的群组"
filters:
- without_category: "%{filter} %{tag} 主题"
- with_category: "%{filter} %{tag} 主题 在 %{category}"
+ without_category: "%{tag}的%{filter}主题"
+ with_category: "%{filter} %{tag}主题在%{category}"
untagged_without_category: "无标签的%{filter}主题"
untagged_with_category: "%{category}无标签的%{filter}主题"
notifications:
watching:
- title: "关注"
- description: "自动关注有该标签的主题,有新内容时提醒我,并在列表中显示未读和新帖数量。"
+ title: "监看"
+ description: "你将自动监看该标签中的所有主题。新帖子和新主题会通知你,再者未读和新帖的数量也将显示在主题旁边。"
watching_first_post:
- title: "关注首贴"
- description: "有该标签的新主题发表时提醒我。"
+ title: "监看头一帖"
+ description: "在这个标签中,只是每一个新主题的第一帖,才会通知你。"
tracking:
- title: "跟随"
- description: "自动跟随有该标签的所有主题,并在列表中显示新帖数量。"
+ title: "跟踪"
+ description: "你将自动跟踪这个标签里的所有主题。未读和新帖的数量将显示在主题旁边。"
regular:
title: "普通"
- description: "当有人@你或者回复你的帖子时,你才会收到通知。"
+ description: "如果有人@你或回复你的帖子,将通知你。"
muted:
- title: "屏蔽"
- description: "不会收到有该标签的主题的提醒,并且他们将不会出现在未读主题中。"
+ title: "静音"
+ description: "在这个标签中,你将不会收到新主题任何通知,它们也不会出现在你的未读列表上面。"
groups:
title: "标签组"
about: "将标签分组以便管理。"
@@ -1887,7 +2019,7 @@ zh_CN:
tags_label: "标签组内标签:"
parent_tag_label: "上级标签:"
parent_tag_placeholder: "可选"
- parent_tag_description: "未设置上级标签前小组内标签无法使用。"
+ parent_tag_description: "未设置上级标签前群组内标签无法使用。"
one_per_topic_label: "只可给主题设置一个该组内的标签"
new_name: "新标签组名"
save: "保存"
@@ -1909,7 +2041,7 @@ zh_CN:
hot: "没有更多的热门话题。"
posted: "没有更多的发布主题。"
read: "没有更多已阅主题可看了。"
- new: "没有更多近期主题可看了。"
+ new: "没有更多的近期主题。"
unread: "没有更多未读主题了。"
top: "没有更多最佳主题了。"
bookmarks: "没有更多收藏的主题了。"
@@ -1920,6 +2052,8 @@ zh_CN:
custom_message_placeholder: "输入留言"
custom_message_template_forum: "你好,你应该来我们这个论坛!"
custom_message_template_topic: "你好,我觉得你可能会喜欢这个主题!"
+ safe_mode:
+ enabled: "安全模式已经开启,关闭该浏览器窗口以退出安全模式"
admin_js:
type_to_filter: "输入过滤条件..."
admin:
@@ -1946,8 +2080,8 @@ zh_CN:
admins: '管理员:'
blocked: '禁止参与讨论:'
suspended: '禁止登录'
- private_messages_short: "消息"
- private_messages_title: "消息"
+ private_messages_short: "私信"
+ private_messages_title: "私信"
mobile_title: "移动"
space_free: "{{size}} 空闲"
uploads: "上传"
@@ -1971,7 +2105,7 @@ zh_CN:
refresh_report: "刷新报告"
start_date: "开始日期"
end_date: "结束日期"
- groups: "所有小组"
+ groups: "所有群组"
commits:
latest_changes: "最近的更新:请经常升级!"
by: "来自"
@@ -2033,34 +2167,31 @@ zh_CN:
action_type_8:
other: "广告 x{{count}}"
groups:
- primary: "主要小组"
- no_primary: "(无主要小组)"
- title: "小组"
- edit: "编辑小组"
+ primary: "主要群组"
+ no_primary: "(无主要群组)"
+ title: "群组"
+ edit: "编辑群组"
refresh: "刷新"
- new: "新小组"
+ new: "新群组"
selector_placeholder: "输入用户名"
- name_placeholder: "小组名,不能含有空格,与用户名规则一致"
- about: "在这里编辑小组的名字和成员"
- group_members: "小组成员"
+ about: "在这里编辑群组的名字和成员"
+ group_members: "群组成员"
delete: "删除"
- delete_confirm: "删除这个小组吗?"
- delete_failed: "无法删除小组。如果该小组是自动生成的,则不可删除。"
- delete_member_confirm: "从小组“%{group}”中移除“%{username}”?"
+ delete_confirm: "删除这个群组吗?"
+ delete_failed: "无法删除群组。如果该群组是自动生成的,则不可删除。"
delete_owner_confirm: "移除“%{username}”的权限?"
- name: "名字"
add: "添加"
add_members: "添加成员"
custom: "定制"
- bulk_complete: "用户已被添加到小组。"
- bulk: "批量添加到小组"
+ bulk_complete: "用户已被添加到群组。"
+ bulk: "批量添加到群组"
bulk_paste: "粘贴用户名邮件列表,一行一个:"
- bulk_select: "(选择一个小组)"
+ bulk_select: "( 选择一个群组 )"
automatic: "自动"
- automatic_membership_email_domains: "用户注册时邮箱域名若与列表完全匹配则自动添加至这个小组:"
+ automatic_membership_email_domains: "用户注册时邮箱域名若与列表完全匹配则自动添加至这个群组:"
automatic_membership_retroactive: "应用同样的邮件域名规则添加已经注册的用户"
- default_title: "小组内所有用户的默认头衔"
- primary_group: "自动设置为主要小组"
+ default_title: "群组内所有用户的默认头衔"
+ primary_group: "自动设置为主要群组"
group_owners: 所有者
add_owners: 添加所有者
incoming_email: "自定义进站电子邮件地址"
@@ -2079,6 +2210,74 @@ zh_CN:
info_html: "API 密钥可以用来通过 JSON 调用创建和更新主题。"
all_users: "所有用户"
note_html: "请安全地保管密钥,任何拥有该密钥的用户可以使用它以论坛任何用户的名义发帖。"
+ web_hooks:
+ title: "Webhooks"
+ none: "当前没有 Webhooks。"
+ instruction: "Webhooks 让 Discourse 可以在特定事件发生时通知外部服务。当 webhook 事件触发时,一个 POST 请求将发向指定地址。"
+ detailed_instruction: "一个 POST 请求将在选定事件发生时发至指定 URL。"
+ new: "新建 Webhook"
+ create: "创建"
+ save: "保存"
+ destroy: "删除"
+ description: "描述"
+ controls: "控制"
+ go_back: "返回列表"
+ payload_url: "Payload URL"
+ payload_url_placeholder: "https://example.com/postreceive"
+ warn_local_payload_url: "你好像将 webhook 指向了一个本地地址。把相关事件发送到本地可能产生副作用或未预期的行为。继续吗?"
+ secret_invalid: "密钥不能包含空白字符。"
+ secret_too_short: "密钥必须至少有 12 个字符。"
+ secret_placeholder: "可选字符串,用于生成签名"
+ event_type_missing: "你必须设置一个事件类型。"
+ content_type: "内容格式"
+ secret: "密钥"
+ event_chooser: "你想要 webhook 发送哪些事件?"
+ wildcard_event: "发送任何事件。"
+ individual_event: "选择各个事件。"
+ verify_certificate: "检查 Payload URL 的 TLS 证书"
+ active: "启用"
+ active_notice: "我们将在事件发生时分发事件详情。"
+ categories_filter_instructions: "相关 Webhook 事件将在满足特定分类的情况下才发送。留空忽略分类限制。"
+ categories_filter: "触发的分类"
+ groups_filter_instructions: "相关 Webhook 事件将在满足特定群组的情况下才发送。留空忽略群组限制。"
+ groups_filter: "触发的群组"
+ delete_confirm: "删除这个 webhook?"
+ topic_event:
+ name: "主题事件"
+ details: "当有新主题、主题被修订、修改或者删除时。"
+ post_event:
+ name: "帖子事件"
+ details: "当有新回复、编辑、帖子被删除或者恢复时。"
+ user_event:
+ name: "用户事件"
+ details: "当用户被创建、审核通过或更新时。"
+ delivery_status:
+ title: "分发状态"
+ inactive: "不活跃"
+ failed: "失败"
+ successful: "成功"
+ events:
+ none: "没有相关事件。"
+ redeliver: "重新发送"
+ incoming:
+ other: "有 {{count}} 个新事件。"
+ completed_in:
+ other: "在 {{count}} 秒内完成。"
+ request: "请求"
+ response: "回应"
+ redeliver_confirm: "你确定要再次发送一样的内容吗?"
+ headers: "头部"
+ payload: "内容"
+ body: "内容"
+ go_list: "前往列表"
+ go_details: "编辑 Webhook"
+ go_events: "前往事件列表"
+ ping: "Ping"
+ status: "状态码"
+ event_id: "ID"
+ timestamp: "创建时间"
+ completion: "完成时间"
+ actions: "操作"
plugins:
title: "插件"
installed: "安装的插件"
@@ -2144,10 +2343,8 @@ zh_CN:
title: "将数据库回滚到之前的工作状态"
confirm: "你确定要将数据库回滚到之前的工作状态吗?"
export_csv:
- user_archive_confirm: "你确定要下载你的帖子吗?"
success: "导出开始,完成后你将被通过消息通知。"
failed: "导出失败。请检查日志。"
- rate_limit_error: "帖子只能每天下载一次,请明天再重试。"
button_text: "导出"
button_title:
user: "以CSV格式导出所有用户列表"
@@ -2269,10 +2466,14 @@ zh_CN:
delivery_method: "发送方式"
preview_digest_desc: "预览发送给不活跃用户的摘要邮件内容。"
refresh: "刷新"
+ send_digest_label: "发送结果至:"
+ send_digest: "发送"
+ sending_email: "发送邮件..."
format: "格式"
html: "html"
text: "text"
last_seen_user: "用户最后登录时间:"
+ no_result: "没有找到摘要信息。"
reply_key: "回复关键字"
skipped_reason: "跳过理由"
incoming_emails:
@@ -2458,7 +2659,7 @@ zh_CN:
suspend_reason: "封禁的理由"
suspended_by: "封禁操作者:"
delete_all_posts: "删除所有帖子"
- delete_all_posts_confirm: "你将删除 %{posts} 个帖子和 %{topics} 个主题,确认吗?"
+ delete_all_posts_confirm_MF: "你将要删除 {POSTS, plural, one {1 个帖子} other {# 个帖子}}和 {TOPICS, plural, one {1 个主题} other {# 个主题}}。确定吗?"
suspend: "禁止"
unsuspend: "解禁"
suspended: "已禁止?"
@@ -2485,7 +2686,7 @@ zh_CN:
reputation: 声誉
permissions: 权限
activity: 活动
- like_count: 送出的赞 / 收到的赞
+ like_count: 送出赞 / 获得赞
last_100_days: '在最近 100 天'
private_topics_count: 私有主题数量
posts_read_count: 已阅帖子数量
@@ -2551,7 +2752,8 @@ zh_CN:
unlock_trust_level: "解锁信任等级"
tl3_requirements:
title: "信任等级3的要求"
- table_title: "在最近%{time_period}天:"
+ table_title:
+ other: "这最近 %{count} 天:"
value_heading: "当前"
requirement_heading: "要求"
visits: "访问"
@@ -2563,10 +2765,10 @@ zh_CN:
posts_read_all_time: "已读的帖子 (全部)"
flagged_posts: "被标记的帖子"
flagged_by_users: "标记其的用户"
- likes_given: "送出的赞"
- likes_received: "收到的赞"
- likes_received_days: "收到的赞:独立天数"
- likes_received_users: "收到的赞:每用户"
+ likes_given: "送出赞"
+ likes_received: "获得赞"
+ likes_received_days: "获得赞:独立天数"
+ likes_received_users: "获得赞:每用户"
qualifies: "符合信任等级3要求"
does_not_qualify: "不符合信任等级3要求"
will_be_promoted: "将在近期被提升。"
@@ -2651,12 +2853,15 @@ zh_CN:
developer: '开发者'
embedding: "嵌入"
legal: "法律信息"
+ user_api: '用户 API'
uncategorized: '未分类'
backups: "备份"
login: "登录"
plugins: "插件"
user_preferences: "用户设置"
tags: "标签"
+ search: "搜索"
+ groups: "群组"
badges:
title: 徽章
new_badge: 新徽章
@@ -2667,7 +2872,7 @@ zh_CN:
description: 描述
long_description: 详情
badge_type: 徽章分类
- badge_grouping: 小组
+ badge_grouping: 群组
badge_groupings:
modal_title: 徽章组
granted_by: 授予由
@@ -2737,6 +2942,7 @@ zh_CN:
sample: "使用下列 HTML 代码至你的站点创建和嵌入 Discourse 主题。把REPLACE_ME 替换成你将嵌入至的网址。"
title: "嵌入"
host: "允许的主机"
+ path_whitelist: "路径白名单"
edit: "编辑"
category: "发布到分类"
add_host: "增加主机"
@@ -2748,6 +2954,7 @@ zh_CN:
embed_by_username: "主题创建者的用户名"
embed_post_limit: "嵌入的最大帖子数量。"
embed_username_key_from_feed: "从流中拉取 Discourse 用户名的 Key "
+ embed_title_scrubber: "从帖子中提取标题的正则表达式"
embed_truncate: "截断嵌入的帖子"
embed_whitelist_selector: "使用 CSS 选择器选择允许的嵌入元素"
embed_blacklist_selector: "使用 CSS 选择器移除嵌入元素"
@@ -2770,3 +2977,21 @@ zh_CN:
label: "新:"
add: "添加"
filter: "搜索(URL 或外部 URL)"
+ wizard_js:
+ wizard:
+ done: "完成"
+ back: "上一步"
+ next: "下一步"
+ step: "%{current} / %{total}"
+ upload: "上传"
+ uploading: "上传中..."
+ quit: "以后再说"
+ staff_count:
+ other: "你的社群中有 %{count} 位工作人员。"
+ invites:
+ add_user: "添加"
+ none_added: "你还没有邀请任何工作人员。你确定要继续吗?"
+ roles:
+ admin: "管理员"
+ moderator: "版主"
+ regular: "普通用户"
diff --git a/config/locales/client.zh_TW.yml b/config/locales/client.zh_TW.yml
index e1074c2d2c2..40af1e5d610 100644
--- a/config/locales/client.zh_TW.yml
+++ b/config/locales/client.zh_TW.yml
@@ -26,6 +26,7 @@ zh_TW:
millions: "{{number}} 百萬"
dates:
time: "h:mm"
+ timeline_date: "MMM YYYY"
long_no_year: "MMM D h:mm a"
long_no_year_no_time: "MMM D"
full_no_year_no_time: "MMMM Do"
@@ -37,14 +38,13 @@ zh_TW:
long_date_with_year_without_time: "'YY MMM D"
long_date_without_year_with_linebreak: "MMM D
LT"
long_date_with_year_with_linebreak: "'YY MMM D
LT"
+ wrap_ago: "%{date}以前"
tiny:
half_a_minute: "< 1 分鐘"
less_than_x_seconds:
other: "< %{count} 秒"
x_seconds:
other: "%{count} 秒"
- less_than_x_minutes:
- other: "< %{count} 分鐘"
x_minutes:
other: "%{count} 分鐘"
about_x_hours:
@@ -92,9 +92,13 @@ zh_TW:
google+: '在 Google+ 分享此連結'
email: '以電子郵件分享此連結'
action_codes:
+ public_topic: "%{when}時讓大家看到這個主題"
+ private_topic: "%{when}時讓其他人看不到這個主題"
split_topic: "於 %{when} 切分此討論話題"
invited_user: "邀請 %{who} 於 %{when} "
+ invited_group: "邀請 %{who} %{when}"
removed_user: "移除 %{who} 於 %{when} "
+ removed_group: "刪除 %{who} %{when}"
autoclosed:
enabled: '於 %{when} 關閉'
disabled: '於 %{when} 開啟'
@@ -114,7 +118,10 @@ zh_TW:
enabled: '於 %{when} 列出'
disabled: '於 %{when} 除名'
topic_admin_menu: "討論話題管理員操作"
+ wizard_required: "是時候配置你的論壇啦!點擊開始設置嚮導!"
emails_are_disabled: "管理員已經停用了所有外寄郵件功能。通知信件都不會寄出。"
+ bootstrap_mode_enabled: "為方便站點準備發佈,其正處於初始化模式中。所有新用戶將被授予信任等級1,併為他們設置接受每日郵件摘要。初始化模式會在用戶數超過 %{min_users} 個時關閉。"
+ bootstrap_mode_disabled: "初始化模式將會在24小時後關閉。"
s3:
regions:
us_east_1: "美國東部 (北維珍尼亞州)"
@@ -125,9 +132,11 @@ zh_TW:
eu_central_1: "歐洲 (法蘭克福)"
ap_southeast_1: "亞太地區 (新加坡)"
ap_southeast_2: "亞太地區 (悉尼)"
+ ap_south_1: "亞太地區 (孟買)"
ap_northeast_1: "亞太地區 (東京)"
ap_northeast_2: "亞太地區 (首爾)"
sa_east_1: "南美洲 (聖保羅)"
+ cn_north_1: "中國 (北京)"
edit: '編輯此討論話題的標題與分類'
not_implemented: "抱歉,此功能尚未開放。"
no_value: "否"
@@ -223,6 +232,8 @@ zh_TW:
undo: "復原"
revert: "回復"
failed: "失敗"
+ switch_to_anon: "進入匿名模式"
+ switch_from_anon: "退出匿名模式"
banner:
close: "關閉此橫幅"
edit: "編輯此橫幅 >>"
@@ -270,6 +281,8 @@ zh_TW:
title: "用戶"
likes_given: "送出的"
likes_received: "收到的"
+ topics_entered: "已觀看"
+ topics_entered_long: "參與的討論話題"
time_read: "閱讀多少次"
topic_count: "話題"
topic_count_long: "討論話題已建立"
@@ -282,16 +295,66 @@ zh_TW:
posts_read_long: "讀過的文章"
total_rows:
other: "%{count} 用戶"
+ group_histories:
+ actions:
+ change_group_setting: "更改群組設定"
+ add_user_to_group: "增加用戶"
+ remove_user_from_group: "移除用戶"
+ make_user_group_owner: "設為所有者"
+ remove_user_as_group_owner: "撤銷管理員"
groups:
+ logs:
+ title: "紀錄"
+ when: "什麼時候"
+ action: "動作"
+ acting_user: "啟用中的用戶"
+ target_user: "目的用戶"
+ subject: "主旨"
+ details: "詳情"
+ from: "從"
+ to: "至"
+ edit:
+ title: '編輯群組'
+ full_name: '全名'
+ add_members: "增加成員"
+ delete_member_confirm: "從 '%{group}' 群組刪除 '%{username}' ?"
+ request_membership_pm:
+ title: "請求會員資格"
+ body: "我想申請 @%{groupName} 的成員資格。"
+ name_placeholder: "群組名,沒有空格,和用戶名一樣的規則"
+ public: "允許用戶自由加入/離開群組(需要群組是可見)"
+ empty:
+ posts: "群組成員沒有發佈帖子。"
+ members: "這個團隊裡面沒有成員"
+ mentions: "群組從未被提及過。"
+ messages: "群組從未發送過消息。"
+ topics: "群組的成員從未發表主題。"
+ logs: "這個團隊裡面沒有日誌"
add: "新增"
+ join: "加入團隊"
+ leave: "離開團隊"
+ request: "請求加入團隊"
+ automatic_group: 自動群組
+ closed_group: 關閉群組
+ is_group_user: "你是團隊裡面的成員"
+ allow_membership_requests: "允許用戶向群組擁有者發送加入小組請求(群組需要能讓所有人提及)"
+ membership: "會員資格"
+ name: "名字"
+ user_count: "成員數量"
+ bio: "關於群組"
selector_placeholder: "新增成員"
owner: "擁有者"
visible: "群組可被所有用戶看到"
+ index:
+ title: "群組"
+ empty: "沒有可看見的群組。"
title:
other: "群組"
+ activity: "活動"
members: "成員"
topics: "主題"
posts: "文章"
+ mentions: "提及"
messages: "訊息"
alias_levels:
title: "誰可以在這個群組發送訊息和使用@提到"
@@ -306,8 +369,28 @@ zh_TW:
notifications:
watching:
title: "關注"
+ description: "你將會在該消息中的每個新帖子發佈後收到通知,並且會顯示新回覆數量。"
+ watching_first_post:
+ title: "關注第一則帖子"
+ description: "你只會收到此組中每個新主題的第一帖的通知。"
+ tracking:
+ title: "追蹤"
+ description: "只有當有人@您或者回覆您的文章時,您才會收到通知,並且會顯示新回覆的次數。"
regular:
title: "一般"
+ description: "只有當有人@您或者回覆您的文章時,您才會收到通知。"
+ muted:
+ title: "靜音"
+ description: "你將不會再收到任何關於此群組的新通知。"
+ flair_url: "頭像圖片"
+ flair_url_placeholder: "(可選)圖片 URL 或 Font Awesome class"
+ flair_bg_color: "頭像背景顏色"
+ flair_bg_color_placeholder: "(可選)十六進制色彩值"
+ flair_color: "頭像顏色"
+ flair_color_placeholder: "(可選)十六進制色彩值"
+ flair_preview_icon: "預覽圖示"
+ flair_preview_image: "預覽圖片"
+ flair_note: "注意:標示將只在用戶的主要群組顯示"
user_action_groups:
'1': "已按讚"
'2': "已收到的讚"
@@ -326,12 +409,14 @@ zh_TW:
all_subcategories: "所有"
no_subcategory: "無"
category: "分類"
+ category_list: "顯示分類列表"
reorder:
title: "重新排序分類"
title_long: "重新排序分類列表"
fix_order: "固定位置"
fix_order_tooltip: "並非所有的分類皆有唯一的位置參數, 可能會有出乎意料之外的結果."
save: "儲存順序"
+ apply_all: "申請"
position: "位置"
posts: "貼文"
topics: "標題"
@@ -339,12 +424,10 @@ zh_TW:
latest_by: "最近由"
toggle_ordering: "顯示/隱藏排序控制"
subcategories: "次分類"
- topic_stats: "新討論話題的數目。"
+ topic_sentence:
+ other: "%{count} 話題"
topic_stat_sentence:
other: "在過去一%{unit}內有 %{count} 個新討論話題。"
- post_stats: "新文章的數目。"
- post_stat_sentence:
- other: "在過去一%{unit}內有 %{count} 篇新文章。"
ip_lookup:
title: 最近的 IP 位址
hostname: 伺服器名稱
@@ -367,7 +450,11 @@ zh_TW:
profile: "基本資料"
mute: "靜音"
edit: "編輯喜好設定"
- download_archive: "下載我的文章"
+ download_archive:
+ button_text: "下載我的文章"
+ confirm: "你確定要下載你的文章嗎?"
+ success: "開始下載,處理完畢後將以私人訊息通知你。"
+ rate_limit_error: "帖子只能每天下載一次,請明天再重試。"
new_private_message: "新訊息"
private_message: "訊息"
private_messages: "訊息"
@@ -379,14 +466,19 @@ zh_TW:
invited_by: "邀請人"
trust_level: "信任等級"
notifications: "通知"
+ statistics: "統計"
desktop_notifications:
label: "桌面通知"
not_supported: "非常遺憾,你的瀏覽器不支持桌面通知。"
perm_default: "啟用桌面通知"
perm_denied_btn: "權限被拒絕"
+ perm_denied_expl: "你拒絶了通知提醒的權限。設置瀏覽器以啟用通知提醒。"
disable: "停用通知"
enable: "啟用通知"
+ each_browser_note: "注意:你必須在你使用的所用瀏覽器中更改這項設置。"
+ dismiss_notifications: "設定全部為已讀"
dismiss_notifications_tooltip: "標記所有未讀通知為已讀"
+ first_notification: "你的頭一個通知!選中它開始。"
disable_jump_reply: "不要在回覆之後直接跳到我的文章"
dynamic_favicon: "在瀏覽器小圖示上顯示新主題/更新的主題數"
external_links_in_new_tab: "以新分頁開啟所有外部連結"
@@ -400,9 +492,35 @@ zh_TW:
suspended_notice: "此用戶已被停權至 {{date}}。"
suspended_reason: "原因: "
github_profile: "Github"
+ email_activity_summary: "活動摘要"
+ mailing_list_mode:
+ label: "郵件列表模式"
+ enabled: "啟用郵件列表模式"
+ instructions: |
+ 此設置將覆蓋活動摘要。
+ 靜音主題和分類不包含在這些郵件中。
+ daily: "發送每日更新"
+ individual: "每當有新文章時,寄給我郵件通知"
+ individual_no_echo: "每當有新文章時,寄給我郵件通知(除了我自己的文章)"
+ many_per_day: "每當有新文章時,寄給我郵件通知(每天約有 {{dailyEmailEstimate}} 封)。"
+ few_per_day: "每當有新文章時,寄給我郵件通知(每天約有 2 封)。"
+ tag_settings: "添加"
+ watched_tags: "已觀看"
+ watched_tags_instructions: "您將會自動監視所有這些添加的主題。您會收到新文章或新主題的通知,新文章數量將出現在每個主題後。"
+ tracked_tags: "已追蹤"
+ tracked_tags_instructions: "您將會自動監視所有這些添加的主題。新文章數量將出現在每個主題後。"
+ muted_tags: "靜音"
+ muted_tags_instructions: "你將不會收到有這些標籤的新主題任何通知,它們也不會出現在“最新”主題列表。"
watched_categories: "關注"
+ watched_categories_instructions: "你將自動監看這些分類中的所有主題。所有新帖子和新主題會通知你,新帖數量也將顯示在主題旁邊。"
tracked_categories: "追蹤"
+ tracked_categories_instructions: "你將自動跟蹤這些分類中的所有主題。新帖數量將會顯示在主題旁邊。"
+ watched_first_post_categories: "關注第一則帖子"
+ watched_first_post_categories_instructions: "在這些分類裡面,每一個新主題的第一帖會通知你。"
+ watched_first_post_tags: "關注第一則帖子"
+ watched_first_post_tags_instructions: "在有了這些標籤的每一個新主題,第一帖會通知你。"
muted_categories: "靜音"
+ muted_categories_instructions: "在這些分類裡面,你將不會收到新主題任何通知,它們也不會出現在“最新”主題列表。"
delete_account: "刪除我的帳號"
delete_account_confirm: "你真的要刪除帳號嗎?此動作不能被還原!"
deleted_yourself: "你的帳號已成功刪除"
@@ -412,6 +530,13 @@ zh_TW:
users: "用戶"
muted_users: "靜音"
muted_users_instructions: "禁止來自這些用戶的所有通知。"
+ muted_topics_link: "顯示已靜音的主題"
+ watched_topics_link: "顯示已觀看的討論話題"
+ automatically_unpin_topics: "當我完整閲讀了主題時自動解除置頂。"
+ apps: "應用"
+ revoke_access: "撤銷許可"
+ undo_revoke_access: "解除撤銷許可"
+ api_approved: "已批准:"
staff_counters:
flags_given: "有幫助的投訴"
flagged_posts: "已投訴的文章"
@@ -420,9 +545,15 @@ zh_TW:
warnings_received: "警告"
messages:
all: "全部"
+ inbox: "收件匣"
+ sent: "送出"
archive: "封存"
groups: "我的群組"
+ bulk_select: "選擇訊息"
+ move_to_inbox: "移動到收件匣"
move_to_archive: "封存"
+ failed_to_move: "移動到所選郵件失敗(也許你的網絡沒有開啟)"
+ select_all: "選擇全部"
change_password:
success: "( 寄出的郵件 )"
in_progress: "( 正在傳送郵件 )"
@@ -431,8 +562,10 @@ zh_TW:
set_password: "設定密碼"
change_about:
title: "修改關於我"
+ error: "修改設定值時發生錯誤"
change_username:
title: "修改用戶名稱"
+ confirm: "確定更換用戶名?你的帖子和@提及你的引用將失效。"
taken: "抱歉,此用戶名稱已經有人使用。"
error: "修改你的用戶名稱時發生錯誤。"
invalid: "此用戶名稱無效,只能使用數字與英文字母。"
@@ -452,6 +585,7 @@ zh_TW:
upload_title: "上傳你的圖片"
upload_picture: "上傳圖片"
image_is_not_a_square: "警告:我們裁切了你的圖片,因為該圖片不是正方形的。"
+ cache_notice: "更改了頭像成功,但是鑒於瀏覽器緩存可能需要一段時間後才會生效。"
change_profile_background:
title: "基本資料背景圖案"
instructions: "個人資料背景會被置中,且默認寬度為850px。"
@@ -464,6 +598,9 @@ zh_TW:
ok: "我們將寄一封確認郵件給您。"
invalid: "請輸入有效的電子郵件地址。"
authenticated: "你的 Email 已由 {{provider}} 驗證完成。"
+ frequency_immediately: "如果您沒有閱讀過重要通知,我們會立即發送電子郵件給您。"
+ frequency:
+ other: "我們只會在您 {{count}} 分鐘內沒有活動時,才會寄送電郵通知給您。"
name:
title: "名稱"
instructions: "您的全名 (選填)。"
@@ -487,6 +624,7 @@ zh_TW:
title: "界面語言"
instructions: "使用者介面的語言,當頁面重新整理的時候會更換成你的設定。"
default: "(default)"
+ any: "任何"
password_confirmation:
title: "再次輸入密碼"
last_posted: "最近發表"
@@ -499,13 +637,30 @@ zh_TW:
title: "用戶卡徽章"
website: "網站"
email_settings: "電子郵件"
+ like_notification_frequency:
+ title: "用戶被贊時通知提醒"
+ always: "總是"
+ first_time_and_daily: "每天首個被贊"
+ first_time: "歷史首個被贊"
+ never: "永不"
+ email_previous_replies:
+ title: "郵件底部包含歷史回覆"
+ unless_emailed: "首次"
+ always: "總是"
+ never: "永不"
email_digests:
+ title: "長期未訪問時發送熱門主題和回覆的摘要郵件"
+ every_30_minutes: "每 30 分鐘"
+ every_hour: "每小時"
daily: "每天"
every_three_days: "每三天"
weekly: "每週"
every_two_weeks: "每兩星期"
+ include_tl0_in_digests: "摘要郵件中包含新用戶的內容"
+ email_in_reply_to: "郵件中包含回覆你的內容節選"
email_direct: "當有人引用、回覆我的發文,或以 @用戶名稱 提到我時,請以電子郵件通知我。"
email_private_messages: "當有人寄給我私人訊息時,以電子郵件通知我。"
+ email_always: "即使我在論壇中活躍時也發送郵件提醒"
other_settings: "其它"
categories_settings: "分類"
new_topic_duration:
@@ -527,32 +682,42 @@ zh_TW:
after_4_minutes: "四分鐘後"
after_5_minutes: "五分鐘後"
after_10_minutes: "十分鐘後"
+ notification_level_when_replying: "當我在主題中回覆後,將主題設置至"
invited:
search: "輸入要搜尋邀請的文字..."
title: "邀請"
user: "受邀請的用戶"
sent: "送出"
+ none: "沒有未接受狀態的邀請。"
+ truncated:
+ other: "只顯示前 {{count}} 個邀請。"
redeemed: "已接受的邀請"
+ redeemed_tab: "接受日期"
+ redeemed_tab_with_count: "接受日期 ({{count}})"
redeemed_at: "接受日期"
pending: "尚未接受的邀請"
+ pending_tab: "等待中"
+ pending_tab_with_count: "等待中 ({{count}})"
topics_entered: "參與的討論話題"
posts_read_count: "已讀的文章"
expired: "此邀請已過期"
rescind: "移除"
rescinded: "邀請已刪除"
reinvite: "重送邀請"
+ reinvite_all: "重送所有邀請"
reinvited: "邀請已經重送"
+ reinvited_all: "所有邀請已經重送"
time_read: "閱讀時間"
days_visited: "到訪天數"
account_age_days: "帳號已建立 (天)"
create: "送出邀請"
generate_link: "拷貝邀請連結"
+ link_generated: "邀請連結生成成功!"
+ valid_for: "邀請連結只對這個郵件地址有效:%{email}"
bulk_invite:
- none: "你尚未邀請任何人。你可以發送個別邀請,或者透過上傳邀請名單一次邀請一群人。"
+ none: "你還沒有邀請過任何人。你可以邀請一個人,或者上傳 CSV 檔案邀請一批人。"
text: "從檔案大量邀請"
- uploading: "正在上傳..."
success: "檔案已上傳成功,處理完畢後將以私人訊息通知你。"
- error: "上傳 '{{filename}}' 時發生問題:{{message}}"
password:
title: "密碼"
too_short: "你的密碼太短。"
@@ -561,6 +726,39 @@ zh_TW:
same_as_email: "你的密碼與電郵相同。"
ok: "你的密碼符合要求。"
instructions: "至少 %{count} 個字。"
+ summary:
+ title: "摘要"
+ stats: "統計"
+ time_read: "閱讀時間"
+ topic_count:
+ other: "討論話題已建立"
+ post_count:
+ other: "帖子已建立"
+ likes_given:
+ other: " 送出的"
+ likes_received:
+ other: " 收到的"
+ days_visited:
+ other: "到訪天數"
+ posts_read:
+ other: "讀過的文章"
+ bookmark_count:
+ other: "書籤"
+ top_replies: "最佳回覆"
+ no_replies: "暫無回覆。"
+ more_replies: "更多回覆"
+ top_topics: "熱門話題"
+ no_topics: "暫無主題。"
+ more_topics: "更多主題"
+ top_badges: "熱門徽章"
+ no_badges: "還沒有徽章。"
+ more_badges: "更多徽章"
+ top_links: "最佳連結"
+ no_links: "暫無連結"
+ most_liked_by: "誰贊最多"
+ most_liked_users: "贊誰最多"
+ most_replied_to_users: "最多回覆至"
+ no_likes: "暫無贊"
associated_accounts: "登入"
ip_address:
title: "最近的 IP 位址"
@@ -568,6 +766,7 @@ zh_TW:
title: "註冊之 IP 位址"
avatar:
title: "個人資料圖片"
+ header_title: "個人頁面、消息、書籤和設置"
title:
title: "標題"
filters:
@@ -591,6 +790,7 @@ zh_TW:
network_fixed: "似乎沒有問題了"
server: "錯誤代碼:{{status}}"
forbidden: "你不允許瀏覽此處。"
+ not_found: "沒有這個頁面"
unknown: "發生錯誤。"
buttons:
back: "返回"
@@ -601,8 +801,20 @@ zh_TW:
logout: "已登出"
refresh: "重新整理"
read_only_mode:
+ enabled: "站點正處於只讀模式。你可以繼續瀏覽,但是回覆、贊和其他操作暫時被禁用。"
login_disabled: "在唯讀模式下不能登入"
+ logout_disabled: "站點在只讀模式下無法登出。"
+ too_few_topics_and_posts_notice: "讓我們開始討論!目前有 %{currentTopics} / %{requiredTopics} 個主題和 %{currentPosts} / %{requiredPosts} 個帖子。新訪客需要能夠閲讀和回覆一些討論。"
+ too_few_topics_notice: "讓我們開始討論!目前有 %{currentTopics} / %{requiredTopics} 個主題。新訪客需要能夠閲讀和回覆一些討論。"
+ too_few_posts_notice: "讓我們開始討論!目前有 %{currentPosts} / %{requiredPosts} 個帖子。新訪客需要能夠閲讀和回覆一些討論。"
+ logs_error_rate_notice:
+ reached: "%{relativeAge} – %{rate} 達到了站點設置中的 %{siteSettingRate}。"
+ exceeded: "[%{relativeAge}] 目前的錯誤率 %{rate} 已超出了站點設置中的 %{siteSettingRate}。"
+ rate:
+ other: "%{count} 錯誤/%{duration}"
learn_more: "進一步了解..."
+ all_time: '總數'
+ all_time_desc: '創建的主題總量'
year: '年'
year_desc: '最近 365 天內建立的討論話題'
month: '月'
@@ -619,8 +831,15 @@ zh_TW:
other: 回覆
signup_cta:
sign_up: "註冊"
+ hide_session: "明天提醒我"
+ hide_forever: "不了"
+ hidden_for_session: "好的,我會在明天提醒你。不過你隨時都可以使用“登錄”來創建賬戶。"
+ intro: "你好!:heart_eyes: 看起來你挺喜歡這樣的討論,可是你還沒有註冊賬戶。"
+ value_prop: "當你創建賬戶後,我們可以準確地記錄你的閲讀進度,這樣你能夠在下一次訪問時回到你上次閲讀到的地方。你也可以選擇接受新帖子的網頁和郵件通知。並且你可以贊任何帖子來分享你的感謝。:heartbeat:"
summary:
enabled_description: "你正在檢視此討論話題的摘要:在這個社群裡最熱門的文章。"
+ description: "有 {{replyCount}} 個回覆。"
+ description_time: "有 {{replyCount}} 個回覆,大約要花 {{readingTime}} 分鐘閲讀。"
enable: '以摘要檢視此討論話題'
disable: '顯示所有文章'
deleted_filter:
@@ -631,6 +850,8 @@ zh_TW:
private_message_info:
title: "訊息"
invite: "邀請其他人..."
+ remove_allowed_user: "確定將 {{name}} 從本條消息中移除?"
+ remove_allowed_group: "確定將 {{name}} 從本條消息中移除?"
email: '電子郵件'
username: '用戶名稱'
last_seen: '出現時間'
@@ -639,6 +860,7 @@ zh_TW:
trust_level: '信任等級'
search_hint: '使用者名稱、電子郵件、或是IP位址'
create_account:
+ disclaimer: "註冊即表示你同意隱私策略和服務條款。"
title: "建立新帳號"
failed: "發生了某些錯誤,可能此電子郵件地址已經註冊過,請試試看忘記密碼連結"
forgot_password:
@@ -674,6 +896,8 @@ zh_TW:
resend_activation_email: "按這裡重新寄出啟用帳號的電子郵件。"
sent_activation_email_again: "我們已經將啟用帳號的電子郵件寄至 {{currentEmail}},你可能幾分鐘後才會收到,如果一直沒收到,請檢查垃圾郵件資料夾。"
to_continue: "請登入"
+ preferences: "需要登入後更改設置"
+ forgot: "我記不清賬號詳情了"
google:
title: "使用 Google 帳號"
message: "使用 Google 帳號認証 (請確定你的網頁瀏覽器未阻擋彈出視窗)"
@@ -683,6 +907,9 @@ zh_TW:
twitter:
title: "使用 Twitter"
message: "使用 Twitter 認証 (請確定你的網頁瀏覽器未阻擋彈出視窗)"
+ instagram:
+ title: "用 Instagram 登錄"
+ message: "正在通過 Instagram 帳號驗證登錄(請確保瀏覽器沒有禁止彈出窗口)"
facebook:
title: "使用 Facebook"
message: "使用 Facebook 認証 (請確定你的網頁瀏覽器未阻擋彈出視窗)"
@@ -692,28 +919,48 @@ zh_TW:
github:
title: "使用 GitHub"
message: "使用 GitHub 認証 (請確定你的網頁瀏覽器未阻擋彈出視窗)"
+ emoji_set:
+ apple_international: "Apple/國際化"
+ google: "Google"
+ twitter: "Twitter"
+ emoji_one: " Emoji One "
+ win10: "Win10"
+ category_page_style:
+ categories_only: "僅分類"
+ categories_with_featured_topics: "有推薦主題的分類"
+ categories_and_latest_topics: "分類和最新主題"
shortcut_modifier_key:
shift: 'Shift'
ctrl: 'Ctrl'
alt: 'Alt'
composer:
+ emoji: "表情符號 :)"
more_emoji: "更多..."
options: "選項"
whisper: "密談"
+ unlist: "不公開"
add_warning: "這是正式警告。"
toggle_whisper: "切換密談"
+ toggle_unlisted: "切換 不公開"
posting_not_on_topic: "你想要回覆哪個討論話題?"
saving_draft_tip: "正在儲存..."
saved_draft_tip: "儲存完畢"
saved_local_draft_tip: "本地儲存完畢"
similar_topics: "與你的討論話題類似的討論..."
drafts_offline: "離線草稿"
+ group_mentioned:
+ other: "提及 {{group}} 時,你將通知 {{count}} 人 - 確定嗎?"
+ cannot_see_mention:
+ category: "你提到了{{userrname}},然而他們不能訪問該分類,所以他們不會被通知。你需要把他們加入到能訪問該分類的群組中。"
+ private: "你提到了{{userrname}},然而他們不能訪問該私信,所以他們不會被通知。你需要邀請他們至私信中。"
+ duplicate_link: "似乎你的連結 {{domain}} 在{{ago}}已經由@{{username}}回覆了 - 確定再次提交嗎?"
error:
title_missing: "標題為必填欄位"
title_too_short: "標題必須至少 {{min}} 個字"
title_too_long: "標題不能超過 {{max}} 個字"
post_missing: "文章不可空白"
post_length: "文章必須至少 {{min}} 個字。"
+ try_like: '試試 按鈕?'
category_missing: "你必須選擇一個分類。"
save_edit: "儲存編輯"
reply_original: "回覆至原始的討論話題"
@@ -725,8 +972,11 @@ zh_TW:
title: "或者按 Ctrl+Enter"
users_placeholder: "新增用戶"
title_placeholder: "用一個簡短的句子來描述想討論的內容。"
+ title_or_link_placeholder: "鍵入標題,或粘貼一個連結在這裡"
edit_reason_placeholder: "你為什麼做編輯?"
show_edit_reason: "(請加入編輯原因)"
+ topic_featured_link_placeholder: "在標題裡輸入連結"
+ reply_placeholder: "在這裡輸入內文,可以使用 Markdown, BBCode 或 HTML 來格式化文字,也可以拖曳或貼上圖片。"
view_new_post: "檢視你的新文章。"
saving: "正在儲存"
saved: "儲存完畢!"
@@ -735,23 +985,28 @@ zh_TW:
show_preview: '顯示預覽 »'
hide_preview: '« 隱藏預覽'
quote_post_title: "引用完整文章"
+ bold_label: "B"
bold_title: "粗體"
bold_text: "粗體字"
+ italic_label: "I"
italic_title: "斜體"
italic_text: "斜體字"
link_title: "超連結"
link_description: "在此輸入超連結的描述"
link_dialog_title: "插入超連結"
link_optional_text: "標題 (可選填)"
+ link_url_placeholder: "http://example.com"
quote_title: "引用"
quote_text: "引用"
code_title: "預先格式化文字"
code_text: "以 4 格空白將預先格式的化文字縮排"
+ paste_code_text: "輸入或粘貼代碼"
upload_title: "上傳"
upload_description: "在此輸入上傳的描述"
olist_title: "編號清單"
ulist_title: "符號清單"
list_item: "清單項目"
+ heading_label: "H"
heading_title: "標頭"
heading_text: "標頭"
hr_title: "分隔線"
@@ -760,6 +1015,9 @@ zh_TW:
modal_ok: "確定"
modal_cancel: "取消"
cant_send_pm: "抱歉,你不能向 %{username} 發送訊息。"
+ yourself_confirm:
+ title: "你忘記添加收信人了嗎?"
+ body: "目前該私信只發給了你自己!"
admin_options_title: "此討論話題可選用之工作人員設定選項"
auto_close:
label: "自動關閉主題時間:"
@@ -773,52 +1031,143 @@ zh_TW:
notifications:
title: "當有人以「@用戶名稱」提及您、回覆您的貼文、或是傳送訊息給您的時候通知您的設定。"
none: "目前無法載入通知訊息。"
+ empty: "未找到任何通知。"
more: "檢視較舊的通知"
total_flagged: "所有被投訴的文章"
mentioned: "
{{username}} {{description}}
" + group_mentioned: "
{{username}} {{description}}
" quoted: "
{{username}} {{description}}
" replied: "
{{username}} {{description}}
" + posted: "
{{username}} {{description}}
" edited: "
{{username}} {{description}}
" liked: "
{{username}} {{description}}
" + liked_2: "
{{username}}、{{username2}} {{description}}
" + liked_many: + other: "
{{username}}、{{username2}}和其他 {{count}} 人{{description}}
" private_message: "
{{username}} {{description}}
" invited_to_private_message: "
{{username}} {{description}}
" + invited_to_topic: "
{{username}}{{description}}
" invitee_accepted: "
{{username}}已接受你的邀請
" moved_post: "
{{username}} 移動了 {{description}}
" + linked: "
{{username}}{{description}}
" granted_badge: "
獲得徽章「{{description}}」
" + watching_first_post: "
近期主題{{description}}
" + group_message_summary: + other: "
{{count}} 條消息在{{group_name}}組的收件箱中
" alt: + mentioned: "被提及" + quoted: "引用者" + replied: "回覆" + posted: "發自" + edited: "編輯你的帖子" + liked: "讚了你的帖子" + private_message: "私信來自" + invited_to_private_message: "私信邀請自" + invited_to_topic: "主題邀請自" + invitee_accepted: "介紹邀請自" + moved_post: "你的帖子被移動自" linked: "連結到你的討論" + granted_badge: "勛章授予" + group_message_summary: "在群組收件箱中的消息" + popup: + mentioned: '{{username}}在“{{topic}}”提到了你 - {{site_title}}' + group_mentioned: '{{username}}在“{{topic}}”提到了你 - {{site_title}}' + quoted: '{{username}}在“{{topic}}”引用了你的帖子 - {{site_title}}' + replied: '{{username}}在“{{topic}}”回覆了你 - {{site_title}}' + posted: '{{username}}在“{{topic}}”中發佈了帖子 - {{site_title}}' + private_message: '{{username}}在“{{topic}}”中給你發送了一個私信 - {{site_title}}' + linked: '{{username}}在“{{topic}}”中連結了你的帖子 - {{site_title}}' upload_selector: title: "加入一張圖片" title_with_attachments: "加入一張圖片或一個檔案" from_my_computer: "從我的電腦" from_the_web: "從網站" remote_tip: "圖片連結" + remote_tip_with_attachments: "連結到圖片或檔案 {{authorized_extensions}}" + local_tip: "從你的設備中選擇圖片" + local_tip_with_attachments: "從裝置選取圖片或檔案: ({{authorized_extensions}})" hint: "(你也可以將檔案拖放至編輯器直接上傳)" + hint_for_supported_browsers: "可以拖放或複製粘帖至編輯器以上傳" uploading: "正在上傳" select_file: "選取檔案" image_link: "連結你的圖片將指向" search: sort_by: "排序" + relevance: "最相關" + latest_post: "最新發帖" + most_viewed: "最多閲讀" + most_liked: "最多贊" select_all: "選擇全部" clear_all: "清除全部" + too_short: "你的搜索詞太短。" + result_count: + other: "搜索“{{term}}”有 {{count}} 條相關結果" title: "搜尋討論話題、文章、用戶或分類" no_results: "未找到任何結果。" no_more_results: "沒有找到更多的結果。" - search_help: 搜尋幫助 searching: "正在搜尋..." post_format: "#{{post_number}} {{username}}" context: user: "搜尋 @{{username}} 的文章" + category: "搜索 #{{category}} 分類" topic: "搜尋此討論話題" private_messages: "搜尋訊息" + advanced: + title: 高級搜索 + posted_by: + label: 發帖人 + in_category: + label: 在該分類中 + in_group: + label: 在該群組中 + with_badge: + label: 有該徽章 + with_tags: + label: 有該標籤 + filters: + label: 只返回主題/帖子符合... + likes: 我給了讚的 + posted: 我參與發帖 + watching: 我正在監看 + tracking: 我正在追蹤 + private: 在我的私信中 + bookmarks: 我已經收藏了 + first: 是第一帖 + pinned: 是置頂的 + unpinned: 不是置頂的 + wiki: 公共編輯 + statuses: + label: 當主題 + open: 是開放的 + closed: 是關閉的 + archived: 已經存檔的 + noreplies: 沒有回覆 + single_user: 只有一個用戶參與 + post: + count: + label: 最小帖子數 + time: + label: 發表於 + before: 之前 + after: 之後 + hamburger_menu: "轉到另一個主題列表或分類" new_item: "新增" go_back: '返回' not_logged_in_user: '用戶頁面包含目前活動及喜好的總結' current_user: '到你的用戶頁面' topics: + new_messages_marker: "上次訪問" bulk: + select_all: "選擇全部" + clear_all: "清除全部" + unlist_topics: "未在列表的主題" reset_read: "重設閱讀" delete: "刪除討論話題" + dismiss: "忽略" + dismiss_read: "忽略所有未讀主題" + dismiss_button: "忽略..." + dismiss_tooltip: "僅忽略新帖子或停止跟蹤主題" + also_dismiss_topics: "停止追蹤這些主題,這樣這些主題就不再顯示為未讀了" dismiss_new: "設定新文章為已讀" toggle: "批量切換選擇討論話題" actions: "批量操作" @@ -829,6 +1178,9 @@ zh_TW: choose_new_category: "為主題選擇新類別:" selected: other: "你已選擇了 {{count}} 個討論話題。" + change_tags: "修改標籤" + choose_new_tags: "為主題選擇新標籤" + changed_tags: "主題的標籤被修改" none: unread: "沒有未讀的討論話題。" new: "沒有新的討論話題。" @@ -839,6 +1191,10 @@ zh_TW: bookmarks: "您目前沒有加入書籤的討論話題。" category: "沒有 {{category}} 的討論話題。" top: "沒有精選討論話題。" + search: "沒有搜索結果。" + educate: + new: '
這裡顯示了近期主題列表。
預設情況下,以下主題將顯示在近期列表。如果是最近 2 天內創建的,還會顯示一個近期標誌。
你可以在用戶設置中更改要顯示哪些內容。
' + unread: '
這裡顯示你的未讀主題。
預設情況下,下述主題會被放在未讀中。並且會在旁邊顯示未讀的數量1。如果你:
或者你在主題底部的通知控制中選擇了跟隨或關注。
你可以在用戶設置中修改未讀設置。
'
bottom:
latest: "已經沒有其它最近的討論話題了。"
hot: "已經沒有其它熱門的討論話題了。"
@@ -849,13 +1205,22 @@ zh_TW:
category: "{{category}} 分類已經沒有其它討論話題了。"
top: "沒有更多精選討論話題。"
bookmarks: "書籤裡沒有更多的討論話題了。"
+ search: "沒有更多搜索結果了。"
topic:
- filter_to: "在討論話題裡顯示 {{post_count}} 文章"
+ unsubscribe:
+ stop_notifications: "你將收到更少的關於{{title}}的通知"
+ change_notification_state: "你現在的通知狀態是"
+ filter_to:
+ other: "本主題中的 {{count}} 帖"
create: '新討論話題'
create_long: '建立新討論話題'
private_message: '發送訊息'
archive_message:
+ help: '移動消息到存檔'
title: '封存'
+ move_to_inbox:
+ title: '移動到收件箱'
+ help: '移動消息到收件箱'
list: '討論話題'
new: '新討論話題'
unread: '未讀'
@@ -888,6 +1253,7 @@ zh_TW:
toggle_information: "切換討論話題詳情"
read_more_in_category: "要閱讀更多文章嗎? 瀏覽 {{catLink}} 裡的討論話題或 {{latestLink}}。"
read_more: "要閱讀更多文章嗎? 請按 {{catLink}} 或 {{latestLink}}。"
+ read_more_MF: "還有 { UNREAD, plural, =0 {} one { 1 個未讀的討論話題} other { # 個未讀的討論話題 } } { NEW, plural, =0 {} one { {BOTH, select, true{和 } false {} other{}} 1 個新的討論話題} other { {BOTH, select, true{和 } false {} other{}} # 個最近的討論話題} }可以閱讀,或者{CATEGORY, select, true {瀏覽{catLink}中的其他討論話題} false {{latestLink}} other {}}"
browse_all_categories: 瀏覽所有分類
view_latest_topics: 檢視最近的文章
suggest_create_topic: 建立一個新討論話題吧?
@@ -899,18 +1265,29 @@ zh_TW:
auto_close_title: '自動關閉設定'
auto_close_save: "儲存"
auto_close_remove: "不要自動關閉此討論話題"
+ auto_close_immediate:
+ other: "主題中的最後一帖是 %{hours} 小時前發出的,所以主題將會立即關閉。"
+ timeline:
+ back: "返回"
+ back_description: "回到最後一個未讀帖子"
+ replies_short: "%{current} / %{total}"
progress:
title: topic progress
go_top: "頂部"
go_bottom: "底部"
go: "前往"
jump_bottom: "跳至最後一則帖子"
+ jump_prompt: "跳到..."
+ jump_prompt_of: "%{count} 帖子"
+ jump_prompt_long: "你想跳轉至哪一貼?"
jump_bottom_with_number: "跳至第 %{post_number} 篇文章"
total: 所有文章
current: 目前的文章
- position: "第 %{current}/%{total} 篇文章"
notifications:
+ title: 改變你收到該主題通知的頻率
reasons:
+ mailing_list_mode: "郵件列表模式已啟用,將以郵件通知你關於該主題的回覆。"
+ '3_10': '因為你正監看該主題上的標籤,你將會收到通知。'
'3_6': '你將會收到通知,因為你正在關注此分類。'
'3_5': '你將會收到通知,因為你在觀看此討論話題。'
'3_2': '你將收到關於此討論話題的通知,因為你正在關注此討論話題。'
@@ -920,26 +1297,35 @@ zh_TW:
'2_4': '你將收到關於此討論話題的通知,因為你回覆了此討論話題。'
'2_2': '你將收到關於此討論話題的通知,因為你正在追蹤此討論話題。'
'2': '你將收到關於此討論話題的通知,因為你看過此討論話題。'
+ '1_2': '如果有人@你或回覆你,將通知你。'
+ '1': '如果有人@你或回覆你,將通知你。'
'0_7': '你正忽略此分類中的所有通知。'
'0_2': '你正忽略此討論話題的所有通知。'
'0': '你正忽略此討論話題的所有通知。'
watching_pm:
title: "關注中"
+ description: "消息有新回覆時提醒我,並顯示新回覆數量。"
watching:
title: "關注"
+ description: "在此主題裡,每一個新回覆將通知你,還將顯示新回覆的數量。"
tracking_pm:
title: "追蹤"
+ description: "在消息標題後顯示新回覆數量。你只會在別人@你或回覆你的帖子時才會收到通知。"
tracking:
title: "追蹤"
+ description: "將為該主題顯示新回覆的數量。如果有人@你或回覆你,將通知你。"
regular:
title: "一般"
+ description: "如果有人@你或回覆你,將通知你。"
regular_pm:
title: "一般"
+ description: "如果有人@你或回覆你,將通知你。"
muted_pm:
title: "靜音"
description: "你將不會再收到關於此訊息的通知。"
muted:
title: "靜音"
+ description: "你不會收到此主題的任何通知,它也不會出現在“最新”主題列表。"
actions:
recover: "復原已刪除的討論話題"
delete: "刪除討論話題"
@@ -954,6 +1340,8 @@ zh_TW:
invisible: "不出現在列表上"
visible: "出現在列表上"
reset_read: "重置讀取資料"
+ make_public: "設置為公共主題"
+ make_private: "設置為私信"
feature:
pin: "置頂主題"
unpin: "取消置頂主題"
@@ -969,30 +1357,64 @@ zh_TW:
share:
title: '分享'
help: '分享此討論話題的連結'
+ print:
+ title: '打印'
+ help: '打開該主題對打印友好的版本'
flag_topic:
title: '投訴'
help: '投訴此討論話題,或以私訊通知管理員'
success_message: '已投訴此討論話題。'
feature_topic:
title: "擁有這個話題"
+ pin: "將該主題置於{{categoryLink}}分類最上方至"
+ confirm_pin: "已有{{count}}個置頂主題。太多的置頂主題可能會困擾新用戶和訪客。確定想在該分類再置頂一個主題?"
unpin: "取消此主題在{{categoryLink}}類別的置頂狀態"
+ unpin_until: "從{{categoryLink}}分類最上方移除主題或者移除於%{until}。"
+ pin_note: "允許用戶取消置頂。"
+ pin_validation: "置頂該主題需要一個日期。"
not_pinned: "沒有主題被釘選在 {{categoryLink}} ."
+ already_pinned:
+ other: "{{categoryLink}}分類的置頂主題數:{{count}}"
+ pin_globally: "將主題置於所有主題列表最上方至"
+ confirm_pin_globally: "已有{{count}}個全局置頂主題。太多的置頂主題可能會困擾新用戶和訪客。確定想再全局置頂一個主題?"
+ unpin_globally: "將主題從所有主題列表的最上方移除。"
+ unpin_globally_until: "從所有主題列表最上方移除主題或者移除於%{until}。"
+ global_pin_note: "允許用戶取消全局置頂。"
+ not_pinned_globally: "沒有全局置頂的主題。"
+ already_pinned_globally:
+ other: "全局置頂的主題數:{{count}}"
+ make_banner: "將主題設置為出現在所有頁面頂端的橫幅主題。"
+ remove_banner: "移除所有頁面頂端的橫幅主題。"
+ banner_note: "用戶能點擊關閉隱藏橫幅。且只能設置一個橫幅主題。"
+ no_banner_exists: "沒有橫幅主題。"
+ banner_exists: "當前設置了橫幅主題。"
inviting: "正在邀請..."
+ automatically_add_to_groups: "邀請將把用戶加入群組:"
invite_private:
title: '邀請訊息交流'
email_or_username: "受邀請者的電子郵件地址或用戶名稱"
email_or_username_placeholder: "電子郵件地址或用戶名稱"
action: "邀請"
+ success: "成功邀請了用戶至該消息。"
+ success_group: "成功邀請了群組至該消息。"
error: "抱歉,向此用戶發出邀請時發生錯誤。"
group_name: "群組名稱"
+ controls: "主題控件"
invite_reply:
title: '邀請'
username_placeholder: "用戶名稱"
action: '送出邀請'
+ help: '通過電子郵件或通知邀請其他人到該主題'
to_forum: "我們將向你的朋友發出一封電子郵件,他不必登入,他只要按電子郵件裡的連結就可以加入此論壇。"
+ sso_enabled: "輸入其用戶名,邀請其人到本主題。"
to_topic_blank: "輸入你想邀請的用戶的用戶名稱或電子郵件地址到該討論主題"
+ to_topic_email: "你輸入了郵箱地址。我們將發送一封郵件邀請,讓你的朋友可直接回覆該主題。"
+ to_topic_username: "你輸入了用戶名。我們將發送一個至該主題連結的邀請通知。"
+ to_username: "輸入你想邀請的人的用戶名。我們將發送一個至該主題連結的邀請通知。"
email_placeholder: '電子郵件地址'
+ success_email: "我們發了一封郵件邀請{{emailOrUsername}}。邀請被接受後你會收到通知。檢查用戶頁中的邀請標籤頁來追蹤你的邀請。"
success_username: "我們已經邀請該使用者加入此主題討論"
+ error: "抱歉,我們不能邀請這個人。可能他已經被邀請了?(邀請有頻率限制)"
login_reply: '登入以發表回應'
filters:
n_posts:
@@ -1011,6 +1433,10 @@ zh_TW:
error: "將討論話題移至已存在的討論話題時發生錯誤。"
instructions:
other: "請選擇你想將那 {{count}} 篇文章移至哪一個討論話題。"
+ merge_posts:
+ title: "合併選擇的帖子"
+ action: "合併選擇的帖子"
+ error: "合併選擇的帖子試出錯。"
change_owner:
title: "更改文章的擁有者"
action: "變更擁有者"
@@ -1024,6 +1450,8 @@ zh_TW:
title: "變更時間戳記"
action: "變更時間戳記"
invalid_timestamp: "時間戳記不能為將來的時刻。"
+ error: "更改主題時間時發生錯誤。"
+ instructions: "請為主題選擇新的時間。主題中的所有帖子將按照相同的時間差更新。"
multi_select:
select: '選取'
selected: '選取了 ({{count}})'
@@ -1035,7 +1463,9 @@ zh_TW:
description:
other: 你已選擇了 {{count}} 篇文章。
post:
- quote_reply: "引用回覆"
+ reply: " {{replyAvatar}} {{usernameLink}}"
+ reply_topic: " {{link}}"
+ quote_reply: "引用"
edit: "編輯 {{replyAvatar}} {{username}} 發表的 {{link}}"
edit_reason: "原因: "
post_number: "文章 {{number}}"
@@ -1050,7 +1480,6 @@ zh_TW:
expand_collapse: "展開/收合"
gap:
other: "檢視 {{count}} 則隱藏回應"
- more_links: "{{count}} 更多..."
unread: "文章未讀"
has_replies:
other: "{{count}} 個回覆"
@@ -1059,12 +1488,16 @@ zh_TW:
has_likes_title:
other: "{{count}} 個使用者對此文章讚好"
has_likes_title_only_you: "你已按讚"
+ has_likes_title_you:
+ other: "你和其他 {{count}} 人讚了該貼"
errors:
create: "抱歉,建立你的文章時發生錯誤,請再試一次。"
edit: "抱歉,編輯你的文章時發生錯誤,請再試一次。"
upload: "抱歉,上傳你的檔案時發生錯誤,請再試一次。"
+ file_too_large: "檔案過大(最大 {{max_size_kb}}KB)。為什麼不就大檔案上傳至雲存儲服務後再分享連結呢?"
too_many_uploads: "抱歉,一次只能上傳一個檔案。"
- upload_not_authorized: "抱歉,你想上傳的是不允許的檔案 (允許的副檔名: {{authorized_extensions}})."
+ too_many_dragged_and_dropped_files: "抱歉,一次只能上傳 10 個檔案。"
+ upload_not_authorized: "抱歉,你沒有上傳檔案的權限 (驗證擴展:{{authorized_extensions}})。"
image_upload_not_allowed_for_new_user: "抱歉,新用戶不可上傳圖片。"
attachment_upload_not_allowed_for_new_user: "抱歉,新用戶不可上傳附件。"
attachment_download_requires_login: "抱歉,您必須登入以下載附件。"
@@ -1073,9 +1506,13 @@ zh_TW:
no_value: "否"
yes_value: "是"
via_email: "本文章透過電子郵件送達"
+ via_auto_generated_email: "通過自動生成郵件發表的帖子"
whisper: "這文章是版主私人密談"
+ wiki:
+ about: "此帖允許被公共編輯"
archetypes:
save: '儲存選項'
+ few_likes_left: "謝謝你的熱情!你今天的贊快用完了。"
controls:
reply: "開始編寫對此文章的回覆"
like: "給此文章按讚"
@@ -1100,18 +1537,11 @@ zh_TW:
revert_to_regular: "移除工作人員顏色"
rebake: "重建 HTML"
unhide: "取消隱藏"
+ change_owner: "更改作者"
actions:
flag: '投訴'
defer_flags:
other: "暫緩投訴"
- it_too:
- off_topic: "一起投訴"
- spam: "一起投訴"
- inappropriate: "一起投訴"
- custom_flag: "一起投訴"
- bookmark: "一起加上書籤"
- like: "一起按讚"
- vote: "一起投票支持"
undo:
off_topic: "撤回投訴"
spam: "撤回投訴"
@@ -1125,6 +1555,9 @@ zh_TW:
inappropriate: "投訴為不當內容"
notify_moderators: "已通知的版主"
notify_user: "已送出一則訊息"
+ bookmark: "收藏"
+ like: "讚了它"
+ vote: "已投票"
by_you:
off_topic: "你已投訴此文章偏離討論話題"
spam: "你已投訴此文章為垃圾"
@@ -1171,6 +1604,9 @@ zh_TW:
delete:
confirm:
other: "你確定要刪除這些文章?"
+ merge:
+ confirm:
+ other: "確定要合併這 {{count}} 個帖子嗎?"
revisions:
controls:
first: "第一版"
@@ -1179,6 +1615,7 @@ zh_TW:
last: "最新版"
hide: "隱藏修訂紀錄"
show: "顯示修訂紀錄"
+ revert: "還原至該版本"
comparing_previous_to_current_out_of_total: "{{previous}} {{current}} / {{total}}"
displays:
inline:
@@ -1201,6 +1638,12 @@ zh_TW:
general: '一般'
settings: '設定'
topic_template: "主題範本"
+ tags: "標籤"
+ tags_allowed_tags: "僅在該分類內可以使用的標籤"
+ tags_allowed_tag_groups: "僅在該分類內可以使用的標籤組"
+ tags_placeholder: "(可選)允許使用的標籤列表"
+ tag_groups_placeholder: "(可選)允許使用的標籤組列表"
+ topic_featured_link_allowed: "運行在該分類中發佈特色連結"
delete: '刪除分類'
create: '新分類'
create_long: '建立新的分類'
@@ -1226,6 +1669,7 @@ zh_TW:
change_in_category_topic: "編輯描述"
already_used: '此顏色已經用於其它分類'
security: "安全性"
+ special_warning: "警告:這個分類是已經自動建立好的分類,它的安全設置不能被更改。如果你不想要使用這個分類,直接刪除它,而不是另作他用。"
images: "圖片"
auto_close_label: "自動關閉討論話題的期限:"
auto_close_units: "小時"
@@ -1234,6 +1678,8 @@ zh_TW:
email_in_disabled: "\"用電子郵件張貼新的討論話題\"功能已被關閉。若要使用此功能,"
email_in_disabled_click: '請啟用"email in"功能'
suppress_from_homepage: "不在首頁上顯示此分類。"
+ all_topics_wiki: "新的主題預設為共筆。"
+ sort_order: "預設排序:"
allow_badges_label: "允許授予本分類的徽章"
edit_permissions: "編輯權限"
add_permission: "新增權限"
@@ -1246,25 +1692,46 @@ zh_TW:
notifications:
watching:
title: "關注"
+ description: "你將自動監看這些分類中的所有主題。每一個主題的每一個新帖,將通知你,還將顯示新回覆的數量。"
+ watching_first_post:
+ title: "監看頭一帖"
+ description: "在這些分類裡面,只是每一個新主題的第一帖,才會通知你。"
tracking:
title: "追蹤"
+ description: "你將自動跟蹤這些分類中的所有主題。如果有人@你或回覆你,將通知你,還將顯示新回覆的數量。"
regular:
title: "一般"
+ description: "如果有人@你或回覆你,將通知你。"
muted:
title: "靜音"
+ description: "在這些分類裡面,你將不會收到新主題任何通知,它們也不會出現在“最新”主題列表。 "
+ sort_options:
+ default: "預設"
+ likes: "贊"
+ op_likes: "原始帖子贊"
+ views: "瀏覽"
+ posts: "帖子"
+ activity: "活動"
+ posters: "發表人"
+ category: "分類"
+ created: "創建"
+ sort_ascending: '升序'
+ sort_descending: '降序'
flagging:
title: '感謝幫助社群遠離邪惡!'
action: '投訴文章'
take_action: "執行動作"
notify_action: '訊息'
+ official_warning: '正式警告'
delete_spammer: "刪除垃圾文章發送者"
- delete_confirm: "您將刪除此用戶的 %{posts} 則文章與 %{topics} 個討論話題、移除他的帳號、封鎖從他使用的 IP %{ip_address} 登入、將他的電子郵件地址 %{email} 加入永久封鎖名稱,你確定此人真的發送垃圾文章嗎?"
+ delete_confirm_MF: "你將刪除該用戶的{POSTS, plural, one {1個帖子} other {#個帖子}} and {TOPICS, plural, one {1個主題} other {#個主題}}、該賬戶,並阻止其IP地址 %{ip_address} 再次註冊,並將其郵件地址 %{email} 加入黑名單。你確定這用戶是廣告散佈者嗎?"
yes_delete_spammer: "是的,刪除垃圾文章發送者"
ip_address_missing: "(N/A)"
hidden_email_address: "( 隱藏) "
submit_tooltip: "送出私人投訴"
take_action_tooltip: "使其立刻達到投訴門檻,不用等待更多社群投訴"
cant: "抱歉,你目前無法投訴此文章。"
+ notify_staff: '私下通知管理人員'
formatted_name:
off_topic: "離題內容"
inappropriate: "不當內容"
@@ -1272,9 +1739,12 @@ zh_TW:
custom_placeholder_notify_user: "請具體說明出有建設性且溫和的意見。"
custom_placeholder_notify_moderators: "讓我們知道您的意見,並請盡可能地提供相關連結和例子。"
custom_message:
- at_least: "請至少輸入 {{n}} 個字"
- more: "還需要 {{n}} 個字..."
- left: "還剩下 {{n}} 個字"
+ at_least:
+ other: "輸入至少 {{count}} 個字元"
+ more:
+ other: "還差 {{count}} 個..."
+ left:
+ other: "剩餘 {{count}}"
flagging_topic:
title: "感謝幫助社群遠離邪惡!"
action: "投訴討論話題"
@@ -1283,8 +1753,13 @@ zh_TW:
title: "討論話題摘要"
participants_title: "頻繁發文者"
links_title: "熱門連結"
+ links_shown: "顯示更多連結..."
clicks:
other: "%{count} 點擊"
+ post_links:
+ about: "為本帖展開更多連結"
+ title:
+ other: "%{count} 更多"
topic_statuses:
warning:
help: "這是正式警告。"
@@ -1294,18 +1769,20 @@ zh_TW:
help: "此討論話題已關閉,不再接受回覆"
archived:
help: "此討論話題已封存,已被凍結無法再修改"
+ locked_and_archived:
+ help: "這個主題被關閉並存檔;不再允許新的回覆,並不能改變"
unpinned:
title: "取消釘選"
help: "此討論話題已取消置頂,將會以預設順序顯示。"
pinned_globally:
title: "全區置頂"
+ help: "本主題已全局置頂;它始終會在最新列表以及它所屬的分類中置頂"
pinned:
title: "已釘選"
help: "此討論話題已置頂,將顯示在它所屬分類話題列表的最上方"
invisible:
help: "此討論話題已隱藏,將不會出現在討論話題列表,只能以直接連結開啟。"
posts: "文章"
- posts_lowercase: "文章"
posts_long: "此討論話題有 {{number}} 篇文章"
posts_likes_MF: |
This topic has {count, plural, one {1 reply} other {# replies}} {ratio, select,
@@ -1363,7 +1840,12 @@ zh_TW:
lower_title_with_count:
other: "{{count}} 個未讀"
new:
+ lower_title_with_count:
+ other: "{{count}} 近期"
lower_title: "新話題"
+ title: "新的"
+ title_with_count:
+ other: "近期 ({{count}})"
help: "最近幾天建立的主題"
posted:
title: "我的文章"
@@ -1403,6 +1885,175 @@ zh_TW:
full: "建立 / 回覆 / 觀看"
create_post: "回覆 / 觀看"
readonly: "觀看"
+ lightbox:
+ download: "下載"
+ keyboard_shortcuts_help:
+ title: '快捷鍵'
+ jump_to:
+ title: '轉至'
+ home: 'g, h 首頁'
+ latest: 'g, l 最新'
+ new: 'g, n 近期'
+ unread: 'g, u 未讀'
+ categories: 'g, c 分類'
+ top: 'g, t 熱門'
+ bookmarks: 'g, b 書籤'
+ profile: 'g 然後 p 個人頁面'
+ messages: 'g, m 私信'
+ navigation:
+ title: '導航'
+ jump: '# 前往帖子 #'
+ back: 'u 返回'
+ up_down: 'k 或 j 移動選擇焦點 ↑ ↓'
+ open: 'o 然後 回車 打開選擇的主題'
+ next_prev: 'shift+j 或 shift+k 下一個/前一個段落'
+ application:
+ title: '應用'
+ create: 'c 創建新主題'
+ notifications: 'n Open notifications'
+ hamburger_menu: '= 打開漢堡菜單'
+ user_profile_menu: 'p 打開用戶菜單'
+ show_incoming_updated_topics: '. 顯示更新主題'
+ search: '/ 搜索'
+ help: ' ? 打開按鍵說明'
+ dismiss_new_posts: 'x 然後 r 解除新/帖子提示'
+ dismiss_topics: 'x 然後 t 解除主題提示'
+ log_out: 'shift+z shift+z 退出'
+ actions:
+ title: '動作'
+ bookmark_topic: 'f 切換主題收藏狀態'
+ pin_unpin_topic: 'shift+p 置頂/截至置頂主題'
+ share_topic: 'shift+s 分享主題'
+ share_post: 's 分享帖子'
+ reply_as_new_topic: 't 回覆為聯結主題'
+ reply_topic: 'shift+r 回覆主題'
+ reply_post: 'r 回覆帖子'
+ quote_post: 'q 引用帖子'
+ like: 'l 贊帖子'
+ flag: '! 標記帖子'
+ bookmark: 'b 收藏帖子'
+ edit: 'e 編輯帖子'
+ delete: 'd 刪除帖子'
+ mark_muted: 'm, m 忽略主題'
+ mark_regular: 'm, r 常規 (預設) 主題'
+ mark_tracking: 'm, t 追蹤主題'
+ mark_watching: 'm, w 看主題'
+ print: 'ctrl+p 打印主題'
+ badges:
+ earned_n_times:
+ other: "授予徽章 %{count} 次"
+ granted_on: "授予於%{date}"
+ others_count: "其他有該徽章的人(%{count})"
+ title: 徽章
+ allow_title: "能用作頭銜"
+ multiple_grant: "能被授予多次"
+ badge_count:
+ other: "%{count} 徽章"
+ more_badges:
+ other: "+%{count} 更多"
+ granted:
+ other: "%{count} 授予"
+ select_badge_for_title: 選擇一個徽章作為你的頭銜使用
+ none: "
+ 用 Google 搜索
+
+ tagging: + all_tags: "所有標籤" + selector_all_tags: "所有標籤" + selector_no_tags: "無標籤" + changed: "標籤被修改:" + tags: "標籤" + choose_for_topic: "為此主題選擇可選標籤" + delete_tag: "刪除標籤" + delete_confirm: "確定要刪除這個標籤嗎?" + rename_tag: "重命名標籤" + rename_instructions: "標籤的新名稱:" + sort_by: "排序方式:" + sort_by_count: "總數" + sort_by_name: "名稱" + manage_groups: "管理標籤組" + manage_groups_description: "管理標籤的群組" + filters: + without_category: "%{tag}的%{filter}主題" + with_category: "%{filter} %{tag}主題在%{category}" + untagged_without_category: "無標籤的%{filter}主題" + untagged_with_category: "%{category}無標籤的%{filter}主題" + notifications: + watching: + title: "監看" + description: "你將自動監看該標籤中的所有主題。新帖子和新主題會通知你,再者未讀和新帖的數量也將顯示在主題旁邊。" + watching_first_post: + title: "監看頭一帖" + description: "在這個標籤中,只是每一個新主題的第一帖,才會通知你。" + tracking: + title: "跟蹤" + description: "你將自動跟蹤這個標籤裡的所有主題。未讀和新帖的數量將顯示在主題旁邊。" + regular: + title: "普通" + description: "如果有人@你或回覆你的帖子,將通知你。" + muted: + title: "靜音" + description: "在這個標籤中,你將不會收到新主題任何通知,它們也不會出現在你的未讀列表上面。" + groups: + title: "標籤組" + about: "將標籤分組以便管理。" + new: "新標籤組" + tags_label: "標籤組內標籤:" + parent_tag_label: "上級標籤:" + parent_tag_placeholder: "可選" + parent_tag_description: "未設置上級標籤前群組內標籤無法使用。" + one_per_topic_label: "只可給主題設置一個該組內的標籤" + new_name: "新標籤組名" + save: "保存" + delete: "刪除" + confirm_delete: "確定要刪除此標籤組嗎?" + topics: + none: + unread: "你沒有未讀主題。" + new: "你沒有新的討論話題。" + read: "你尚未閲讀任何主題。" + posted: "你尚未在任何主題中發帖。" + latest: "沒有最新主題。" + hot: "沒有熱門主題。" + bookmarks: "你還沒有收藏主題。" + top: "沒有最佳主題。" + search: "沒有搜索結果。" + bottom: + latest: "沒有更多的最新主題。" + hot: "沒有更多的熱門話題。" + posted: "沒有更多的發佈主題。" + read: "沒有更多已閲主題可看了。" + new: "已經沒有其他新討論話題了。" + unread: "沒有更多未讀主題了。" + top: "沒有更多最佳主題了。" + bookmarks: "沒有更多收藏的主題了。" + search: "沒有更多搜索結果了。" + invite: + custom_message: "讓你的邀請稍稍個人化一些吧,寫個" + custom_message_link: "留言" + custom_message_placeholder: "輸入留言" + custom_message_template_forum: "你好,你應該來我們這個論壇!" + custom_message_template_topic: "你好,我覺得你可能會喜歡這個主題!" + safe_mode: + enabled: "安全模式已經開啟,關閉該瀏覽器窗口以退出安全模式" admin_js: type_to_filter: "輸入要搜尋的文字..." admin: @@ -1450,9 +2101,11 @@ zh_TW: 30_days_ago: "30 天前" all: "全部" view_table: "表格" + view_graph: "圖表" refresh_report: "重新整理報告" start_date: "開始日期" end_date: "結束日期" + groups: "所有群組" commits: latest_changes: "最近的變更:請經常更新!" by: "由" @@ -1521,22 +2174,28 @@ zh_TW: refresh: "重新整理" new: "建立" selector_placeholder: "輸入用戶名稱" - name_placeholder: "群組名稱,不可含有空白字元,使用戶名稱的規則相同" about: "請在此編輯你的群組成員與名稱" group_members: "群組成員" delete: "刪除" delete_confirm: "刪除此群組?" delete_failed: "無法刪除群組,自動建立的群組無法刪除。" - delete_member_confirm: "從 '%{group}' 群組刪除 '%{username}' ?" - name: "名稱" + delete_owner_confirm: "移除“%{username}”的權限?" add: "加入" add_members: "新增成員" custom: "客製" + bulk_complete: "用戶已被添加到群組。" + bulk: "批量添加到群組" + bulk_paste: "粘貼用戶名郵件列表,一行一個:" + bulk_select: "( 選擇一個群組 )" automatic: "自動建立" automatic_membership_email_domains: "註冊的用戶的電子郵件地址網域,完全符合列表裡某項時,會自動加進這個群組裡:" automatic_membership_retroactive: "套用相同的電子郵件網域規則到已經註冊的用戶上:" default_title: "群組內所有成員的預設頭銜" primary_group: "自動設定為主要群組" + group_owners: 所有者 + add_owners: 添加所有者 + incoming_email: "自定義進站電子郵件地址" + incoming_email_placeholder: "輸入郵箱地址" api: generate_master: "產生主 API 金鑰" none: "目前沒有啟用中的 API 金鑰。" @@ -1551,6 +2210,74 @@ zh_TW: info_html: "你可以使用 API 金鑰呼叫 JSON 建立與更新討論話題。" all_users: "所有用戶" note_html: "請安全地保管密鑰,任何擁有該密鑰的使用者,都可以使用它以任何的使用者的名義發文。" + web_hooks: + title: "Webhooks" + none: "當前沒有 Webhooks。" + instruction: "Webhooks 讓 Discourse 可以在特定事件發生時通知外部服務。當 webhook 事件觸發時,一個 POST 請求將發向指定地址。" + detailed_instruction: "一個 POST 請求將在選定事件發生時發至指定 URL。" + new: "新建 Webhook" + create: "創建" + save: "保存" + destroy: "刪除" + description: "描述" + controls: "控制" + go_back: "返回列表" + payload_url: "Payload URL" + payload_url_placeholder: "https://example.com/postreceive" + warn_local_payload_url: "你好像將 webhook 指向了一個本地地址。把相關事件發送到本地可能產生副作用或未預期的行為。繼續嗎?" + secret_invalid: "密鑰不能包含空白字元。" + secret_too_short: "密鑰必須至少有 12 個字元。" + secret_placeholder: "可選字元串,用於生成簽名" + event_type_missing: "你必須設置一個事件類型。" + content_type: "內容格式" + secret: "密鑰" + event_chooser: "你想要 webhook 發送哪些事件?" + wildcard_event: "發送任何事件。" + individual_event: "選擇各個事件。" + verify_certificate: "檢查 Payload URL 的 TLS 證書" + active: "啟用" + active_notice: "我們將在事件發生時分發事件詳情。" + categories_filter_instructions: "相關 Webhook 事件將在滿足特定分類的情況下才發送。留空忽略分類限制。" + categories_filter: "觸發的分類" + groups_filter_instructions: "相關 Webhook 事件將在滿足特定群組的情況下才發送。留空忽略群組限制。" + groups_filter: "觸發的群組" + delete_confirm: "刪除這個 webhook?" + topic_event: + name: "主題事件" + details: "當有新主題、主題被修訂、修改或者刪除時。" + post_event: + name: "帖子事件" + details: "當有新回覆、編輯、帖子被刪除或者恢復時。" + user_event: + name: "用戶事件" + details: "當用戶被創建、審核通過或更新時。" + delivery_status: + title: "分髮狀態" + inactive: "不活躍" + failed: "失敗" + successful: "成功" + events: + none: "沒有相關事件。" + redeliver: "重新發送" + incoming: + other: "有 {{count}} 個新事件。" + completed_in: + other: "在 {{count}} 秒內完成。" + request: "請求" + response: "回應" + redeliver_confirm: "你確定要再次發送一樣的內容嗎?" + headers: "頭部" + payload: "內容" + body: "內容" + go_list: "前往列表" + go_details: "編輯 Webhook" + go_events: "前往事件列表" + ping: "Ping" + status: "狀態碼" + event_id: "ID" + timestamp: "創建時間" + completion: "完成時間" + actions: "操作" plugins: title: "外掛" installed: "已安裝外掛" @@ -1569,6 +2296,14 @@ zh_TW: backups: "備份" logs: "紀錄" none: "沒有可用的備份。" + read_only: + enable: + title: "開啟只讀模式" + label: "開啟只讀模式" + confirm: "你確定要開啟只讀模式麼?" + disable: + title: "關閉只讀模式" + label: "關閉只讀模式" logs: none: "尚無紀錄..." columns: @@ -1602,14 +2337,14 @@ zh_TW: is_disabled: "此站設定已關閉復原" label: "還原" title: "復原備份" + confirm: "你確定要從該備份中恢復嗎?" rollback: label: "回溯" title: "回溯資料庫到以前的工作階段" + confirm: "你確定要將資料庫回滾到之前的工作狀態嗎?" export_csv: - user_archive_confirm: "你確定要下載你的文章嗎?" success: "開始匯出,處理完畢後將以私人訊息通知你。" failed: "匯出失敗。請觀看紀錄。" - rate_limit_error: "文章每天只能下載一次,請明天再試。" button_text: "匯出" button_title: user: "以 CSV 格式匯出用戶清單" @@ -1710,12 +2445,16 @@ zh_TW: email: title: "電子郵件" settings: "設定" + templates: "模板" preview_digest: "預覽文摘" sending_test: "傳送測試郵件" error: "錯誤 - %{server_error}" test_error: "發送測試電子郵件時遇到錯誤。請檢查你輸入的電子郵件地址,並確認網路提供者沒有封鎖郵件的發送,然後再試一次。" sent: "送出" skipped: "跳過" + bounced: "退回" + received: "收到" + rejected: "拒絶" sent_at: "送出時間" time: "時間" user: "用戶" @@ -1725,18 +2464,37 @@ zh_TW: send_test: "送出測試Email" sent_test: "已送出!" delivery_method: "傳送方式" + preview_digest_desc: "預覽發送給不活躍用戶的摘要郵件內容。" refresh: "重新整理" + send_digest_label: "發送結果至:" + send_digest: "發送" + sending_email: "發送郵件..." format: "格式" html: "html" text: "純文字" last_seen_user: "最近出現的用戶:" + no_result: "沒有找到摘要信息。" reply_key: "回覆金鑰" skipped_reason: "跳過原因" incoming_emails: + from_address: "來自" + to_addresses: "發至" + cc_addresses: "抄送" + subject: "主題" error: "錯誤" + none: "沒有找到進站郵件。" modal: + title: "進站郵件詳情" error: "錯誤" + headers: "頭部" + subject: "主題" + body: "內容" + rejection_message: "拒絶郵件" filters: + from_placeholder: "from@example.com" + to_placeholder: "to@example.com" + cc_placeholder: "cc@example.com" + subject_placeholder: "主題..." error_placeholder: "錯誤" logs: none: "找不到記錄。" @@ -1787,6 +2545,7 @@ zh_TW: change_site_setting: "修改網站設定" change_site_customization: "修改網站客製化" delete_site_customization: "刪除網站客製化" + change_site_text: "更改站點文字" suspend_user: "將用戶停權" unsuspend_user: "恢復用戶權限" grant_badge: "升級徽章" @@ -1796,6 +2555,7 @@ zh_TW: delete_post: "刪除文章" impersonate: "檢視" anonymize_user: "匿名用戶" + roll_up: "回退 IP 封禁" change_category_settings: "變更分類設定" delete_category: "刪除分類" create_category: "建立分類" @@ -1805,6 +2565,10 @@ zh_TW: revoke_admin: "撤銷管理員權限" grant_moderation: "授予板主權限" revoke_moderation: "撤銷板主權限" + backup_operation: "備份操作" + deleted_tag: "刪除的標籤" + renamed_tag: "重命名的標籤" + revoke_email: "撤銷郵件" screened_emails: title: "過濾的電子郵件地址" description: "以下的電子郵件地址將無法用來建立新用戶。" @@ -1841,6 +2605,7 @@ zh_TW: title: "檢視角度" help: "使用此工具以用戶的檢視角度進行除錯。完成後將需登出。" not_found: "找不到那位使用者。" + invalid: "抱歉,你不能以此用戶角度檢視。" users: title: '用戶' create: '新增管理員' @@ -1868,6 +2633,9 @@ zh_TW: pending: '等待審核的用戶' newuser: '信任等級 0 的用戶 ( 新用戶 )' basic: '信任等級 1 的用戶 ( 初級用戶 )' + member: '信任等級為2的用戶(成員)' + regular: '信任等級為3的用戶(活躍)' + leader: '信任等級為4的用戶(資深)' staff: "管理員" admins: '管理員' moderators: '板主' @@ -1891,13 +2659,14 @@ zh_TW: suspend_reason: "原因" suspended_by: "將其停權者" delete_all_posts: "刪除所有文章" - delete_all_posts_confirm: "你確定要刪除 %{posts} 篇文章與 %{topics} 個討論話題嗎?" + delete_all_posts_confirm_MF: "你將要刪除 {POSTS, plural, one {1 個帖子} other {# 個帖子}}和 {TOPICS, plural, one {1 個主題} other {# 個主題}}。確定嗎?" suspend: "停權" unsuspend: "恢復權限" suspended: "已停權?" moderator: "板主?" admin: "管理員?" blocked: "已封鎖?" + staged: "暫存?" show_admin_profile: "管理員" edit_title: "編輯標題" save_title: "儲存標題" @@ -1959,9 +2728,20 @@ zh_TW: deactivate_failed: "取消此帳號的啟用狀態時發生錯誤。" unblock_failed: '解除此用戶的封鎖狀態時發生錯誤。' block_failed: '封鎖此用戶時發生錯誤。' + block_confirm: '你確定要封禁用戶嗎?他們將沒有辦法創建任何主題或者帖子。' + block_accept: '是的,封禁用戶' + bounce_score: "累計退信分值" + reset_bounce_score: + label: "重置" + title: "重置累計退信分值為 0" deactivate_explanation: "帳號的啟用狀態被取消的用戶必需重新啟用帳號。" suspended_explanation: "被停權的用戶無法登入。" block_explanation: "被封鎖的用戶無法發表文章或建立討論話題。" + staged_explanation: "暫存用戶只能通過郵件回覆指定主題。" + bounce_score_explanation: + none: "近期該郵箱沒有退信。" + some: "近期該郵箱有少量退信。" + threshold_reached: "近期該郵箱有過多退信。" trust_level_change_failed: "修改用戶的信任等級時發生錯誤。" suspend_modal_title: "將用戶停權" trust_level_2_users: "信任等級 2 用戶" @@ -1972,6 +2752,8 @@ zh_TW: unlock_trust_level: "解鎖信任等級" tl3_requirements: title: "信任等級 3 之條件" + table_title: + other: "這最近 %{count} 天:" value_heading: "價值" requirement_heading: "要求" visits: "訪問" @@ -2027,16 +2809,23 @@ zh_TW: title: "顯示在公開的基本資料裡?" enabled: "在基本資料裡顯示" disabled: "不在基本資料裡顯示" + show_on_user_card: + title: "在用戶卡片上顯示?" + enabled: "在用戶卡片上顯示" + disabled: "在用戶卡片上隱藏" field_types: text: '文字區域' confirm: '確認' dropdown: "下拉" site_text: + description: "你可以自定義論壇的任意文本。請按以下搜索:" + search: "搜索你想要編輯的文本" title: '文字內容' edit: '編輯' revert: "恢復變更" revert_confirm: "你確定要撤回這個改動?" go_back: "回到搜尋" + recommended: "我們建議自定義以下文本以符合你的需求:" show_overriden: '只顯示修改過的項目' site_settings: show_overriden: '只顯示修改過的項目' @@ -2064,11 +2853,15 @@ zh_TW: developer: '開發人員' embedding: "嵌入" legal: "法律" + user_api: '用戶 API' uncategorized: '其他' backups: "備份" login: "登入" plugins: "延伸套件" user_preferences: "偏好設定" + tags: "標籤" + search: "搜索" + groups: "群組" badges: title: 徽章 new_badge: 新徽章 @@ -2077,6 +2870,7 @@ zh_TW: badge: 徽章 display_name: 顯示名稱 description: 簡述 + long_description: 詳情 badge_type: 徽章類型 badge_grouping: 群組 badge_groupings: @@ -2116,6 +2910,7 @@ zh_TW: post_revision: "當用戶新增或是編輯一個文章" trust_level_change: "當用戶信任等級有改變" user_change: "當用戶被新增或是編輯" + post_processed: "在帖子被處理之後" preview: link_text: "預覽獲得的徽章" plan_text: "預覽 SQL 查詢語法" @@ -2125,6 +2920,9 @@ zh_TW: bad_count_warning: header: "警告 !" text: "查詢結果沒有授予徽章的樣本;當查詢結果回傳的使用者 ID 或文章 ID 不存在時此問題有可能發生。如此可能會發生未預期的結果 ―― 請再次檢查您的 SQL 語法。" + no_grant_count: "沒有指定徽章。" + grant_count: + other: "指定了 %{count} 個徽章。" sample: "樣本:" grant: with: %{username} @@ -2139,15 +2937,30 @@ zh_TW: image: "圖片" delete_confirm: "你確定要刪除 :%{name}: emoji ?" embedding: + get_started: "如果你想要將 Discourse 嵌入至其他網站,添加他們的主機地址。" confirm_delete: "你確定要刪除此主機?" + sample: "使用下列 HTML 代碼至你的站點創建和嵌入 Discourse 主題。把REPLACE_ME 替換成你將嵌入至的網址。" title: "嵌入" host: "允許的主機" + path_whitelist: "路徑白名單" edit: "編輯" category: "張貼到分類" add_host: "新增主機" settings: "嵌入設定" + feed_settings: "源設置" + feed_description: "為你的站點提供一份 RSS/ATOM 源能改善 Discourse 導入你的內容的能力" crawling_settings: "爬蟲設定" + crawling_description: "當 Discourse 為你的帖子創建了主題時,如果沒有 RSS/ATOM 流存在,它將嘗試從 HTML 中解析內容。有時分離其中的內容時可能是很有挑戰性的,所以我們提供了指定 CSS 規則的能力來幫助分離過程。" + embed_by_username: "主題創建者的用戶名" + embed_post_limit: "嵌入的最大帖子數量。" + embed_username_key_from_feed: "從流中拉取 Discourse 用戶名的 Key " + embed_title_scrubber: "從帖子中提取標題的正則表達式" + embed_truncate: "截斷嵌入的帖子" + embed_whitelist_selector: "使用 CSS 選擇器選擇允許的嵌入元素" + embed_blacklist_selector: "使用 CSS 選擇器移除嵌入元素" + embed_classname_whitelist: "允許 CSS class 名稱" feed_polling_enabled: "匯入帖子藉由 RSS/ATOM" + feed_polling_url: "用於抓取的 RSS/ATOM 流的 URL" save: "儲存崁入設定" permalink: title: "固定連結" @@ -2164,3 +2977,21 @@ zh_TW: label: "新增:" add: "新增" filter: "搜尋 (網址或外部網址)" + wizard_js: + wizard: + done: "完成" + back: "上一步" + next: "下一步" + step: "%{current} / %{total}" + upload: "上傳" + uploading: "上傳中..." + quit: "以後再說" + staff_count: + other: "你的社群中有 %{count} 位工作人員。" + invites: + add_user: "添加" + none_added: "你還沒有邀請任何工作人員。你確定要繼續嗎?" + roles: + admin: "管理員" + moderator: "版主" + regular: "普通用戶" diff --git a/config/locales/names.yml b/config/locales/names.yml new file mode 100644 index 00000000000..60e9925014a --- /dev/null +++ b/config/locales/names.yml @@ -0,0 +1,559 @@ +--- +aa: + name: Afar + nativeName: Afaraf +ab: + name: Abkhaz + nativeName: аҧсуа бызшәа +ae: + name: Avestan + nativeName: avesta +af: + name: Afrikaans + nativeName: Afrikaans +ak: + name: Akan + nativeName: Akan +am: + name: Amharic + nativeName: አማርኛ +an: + name: Aragonese + nativeName: aragonés +ar: + name: Arabic + nativeName: اللغة العربية +as: + name: Assamese + nativeName: অসমীয়া +av: + name: Avaric + nativeName: авар мацӀ +ay: + name: Aymara + nativeName: aymar aru +az: + name: Azerbaijani + nativeName: azərbaycan dili +ba: + name: Bashkir + nativeName: башҡорт теле +be: + name: Belarusian + nativeName: беларуская мова +bg: + name: Bulgarian + nativeName: български език +bh: + name: Bihari + nativeName: भोजपुरी +bi: + name: Bislama + nativeName: Bislama +bm: + name: Bambara + nativeName: bamanankan +bn: + name: Bengali + nativeName: বাংলা +bo: + name: Tibetan Standard + nativeName: བོད་ཡིག +br: + name: Breton + nativeName: brezhoneg +bs: + name: Bosnian + nativeName: bosanski jezik +ca: + name: Catalan + nativeName: català +ce: + name: Chechen + nativeName: нохчийн мотт +ch: + name: Chamorro + nativeName: Chamoru +co: + name: Corsican + nativeName: corsu +cr: + name: Cree + nativeName: ᓀᐦᐃᔭᐍᐏᐣ +cs: + name: Czech + nativeName: čeština +cu: + name: Old Church Slavonic + nativeName: ѩзыкъ словѣньскъ +cv: + name: Chuvash + nativeName: чӑваш чӗлхи +cy: + name: Welsh + nativeName: Cymraeg +da: + name: Danish + nativeName: dansk +de: + name: German + nativeName: Deutsch +dv: + name: Divehi + nativeName: Dhivehi +dz: + name: Dzongkha + nativeName: རྫོང་ཁ +ee: + name: Ewe + nativeName: Eʋegbe +el: + name: Greek + nativeName: ελληνικά +en: + name: English + nativeName: English +eo: + name: Esperanto + nativeName: Esperanto +es: + name: Spanish + nativeName: Español +et: + name: Estonian + nativeName: eesti +eu: + name: Basque + nativeName: euskara +fa: + name: Persian + nativeName: فارسی +ff: + name: Fula + nativeName: Fulfulde +fi: + name: Finnish + nativeName: suomi +fj: + name: Fijian + nativeName: Vakaviti +fo: + name: Faroese + nativeName: føroyskt +fr: + name: French + nativeName: Français +fy: + name: Western Frisian + nativeName: Frysk +ga: + name: Irish + nativeName: Gaeilge +gd: + name: Scottish Gaelic + nativeName: Gàidhlig +gl: + name: Galician + nativeName: galego +gn: + name: Guaraní + nativeName: Avañe'ẽ +gu: + name: Gujarati + nativeName: ગુજરાતી +gv: + name: Manx + nativeName: Gaelg +ha: + name: Hausa + nativeName: هَوُسَ +he: + name: Hebrew + nativeName: עברית +hi: + name: Hindi + nativeName: हिन्दी +ho: + name: Hiri Motu + nativeName: Hiri Motu +hr: + name: Croatian + nativeName: hrvatski jezik +ht: + name: Haitian + nativeName: Kreyòl ayisyen +hu: + name: Hungarian + nativeName: magyar +hy: + name: Armenian + nativeName: Հայերեն +hz: + name: Herero + nativeName: Otjiherero +ia: + name: Interlingua + nativeName: Interlingua +id: + name: Indonesian + nativeName: Indonesian +ie: + name: Interlingue + nativeName: Interlingue +ig: + name: Igbo + nativeName: Asụsụ Igbo +ii: + name: Nuosu + nativeName: ꆈꌠ꒿ Nuosuhxop +ik: + name: Inupiaq + nativeName: Iñupiaq +io: + name: Ido + nativeName: Ido +is: + name: Icelandic + nativeName: Íslenska +it: + name: Italian + nativeName: Italiano +iu: + name: Inuktitut + nativeName: ᐃᓄᒃᑎᑐᑦ +ja: + name: Japanese + nativeName: 日本語 +jv: + name: Javanese + nativeName: basa Jawa +ka: + name: Georgian + nativeName: ქართული +kg: + name: Kongo + nativeName: Kikongo +ki: + name: Kikuyu + nativeName: Gĩkũyũ +kj: + name: Kwanyama + nativeName: Kuanyama +kk: + name: Kazakh + nativeName: қазақ тілі +kl: + name: Kalaallisut + nativeName: kalaallisut +km: + name: Khmer + nativeName: ខេមរភាសា +kn: + name: Kannada + nativeName: ಕನ್ನಡ +ko: + name: Korean + nativeName: 한국어 +kr: + name: Kanuri + nativeName: Kanuri +ks: + name: Kashmiri + nativeName: कश्मीरी +ku: + name: Kurdish + nativeName: Kurdî +kv: + name: Komi + nativeName: коми кыв +kw: + name: Cornish + nativeName: Kernewek +ky: + name: Kyrgyz + nativeName: Кыргызча +la: + name: Latin + nativeName: latine +lb: + name: Luxembourgish + nativeName: Lëtzebuergesch +lg: + name: Ganda + nativeName: Luganda +li: + name: Limburgish + nativeName: Limburgs +ln: + name: Lingala + nativeName: Lingála +lo: + name: Lao + nativeName: ພາສາ +lt: + name: Lithuanian + nativeName: lietuvių kalba +lu: + name: Luba-Katanga + nativeName: Tshiluba +lv: + name: Latvian + nativeName: latviešu valoda +mg: + name: Malagasy + nativeName: fiteny malagasy +mh: + name: Marshallese + nativeName: Kajin M̧ajeļ +mi: + name: Māori + nativeName: te reo Māori +mk: + name: Macedonian + nativeName: македонски јазик +ml: + name: Malayalam + nativeName: മലയാളം +mn: + name: Mongolian + nativeName: Монгол хэл +mr: + name: Marathi + nativeName: मराठी +ms: + name: Malay + nativeName: هاس ملايو +mt: + name: Maltese + nativeName: Malti +my: + name: Burmese + nativeName: ဗမာစာ +na: + name: Nauru + nativeName: Ekakairũ Naoero +nb: + name: Norwegian Bokmål + nativeName: Norsk bokmål +nd: + name: Northern Ndebele + nativeName: isiNdebele +ne: + name: Nepali + nativeName: नेपाली +ng: + name: Ndonga + nativeName: Owambo +nl: + name: Dutch + nativeName: Nederlands +nn: + name: Norwegian Nynorsk + nativeName: Norsk nynorsk +'no': + name: Norwegian + nativeName: Norsk +nr: + name: Southern Ndebele + nativeName: isiNdebele +nv: + name: Navajo + nativeName: Diné bizaad +ny: + name: Chichewa + nativeName: chiCheŵa +oc: + name: Occitan + nativeName: occitan +oj: + name: Ojibwe + nativeName: ᐊᓂᔑᓈᐯᒧᐎᓐ +om: + name: Oromo + nativeName: Afaan Oromoo +or: + name: Oriya + nativeName: ଓଡ଼ିଆ +os: + name: Ossetian + nativeName: ирон æвзаг +pa: + name: Panjabi + nativeName: ਪੰਜਾਬੀ +pi: + name: Pāli + nativeName: पाऴि +pl: + name: Polish + nativeName: język polski +ps: + name: Pashto + nativeName: پښتو +pt: + name: Portuguese + nativeName: Português +pt_BR: + name: Portuguese + nativeName: Português (BR) +qu: + name: Quechua + nativeName: Runa Simi +rm: + name: Romansh + nativeName: rumantsch grischun +rn: + name: Kirundi + nativeName: Ikirundi +ro: + name: Romanian + nativeName: limba română +ru: + name: Russian + nativeName: Русский +rw: + name: Kinyarwanda + nativeName: Ikinyarwanda +sa: + name: Sanskrit + nativeName: संस्कृतम् +sc: + name: Sardinian + nativeName: sardu +sd: + name: Sindhi + nativeName: सिन्धी +se: + name: Northern Sami + nativeName: Davvisámegiella +sg: + name: Sango + nativeName: yângâ tî sängö +si: + name: Sinhala + nativeName: සිංහල +sk: + name: Slovak + nativeName: slovenčina +sl: + name: Slovene + nativeName: slovenski jezik +sm: + name: Samoan + nativeName: gagana fa'a Samoa +sn: + name: Shona + nativeName: chiShona +so: + name: Somali + nativeName: Soomaaliga +sq: + name: Albanian + nativeName: Shqip +sr: + name: Serbian + nativeName: српски језик +ss: + name: Swati + nativeName: SiSwati +st: + name: Southern Sotho + nativeName: Sesotho +su: + name: Sundanese + nativeName: Basa Sunda +sv: + name: Swedish + nativeName: svenska +sw: + name: Swahili + nativeName: Kiswahili +ta: + name: Tamil + nativeName: தமிழ் +te: + name: Telugu + nativeName: తెలుగు +tg: + name: Tajik + nativeName: тоҷикӣ +th: + name: Thai + nativeName: ไทย +ti: + name: Tigrinya + nativeName: ትግርኛ +tk: + name: Turkmen + nativeName: Türkmen +tl: + name: Tagalog + nativeName: Wikang Tagalog +tn: + name: Tswana + nativeName: Setswana +to: + name: Tonga + nativeName: faka Tonga +tr: + name: Turkish + nativeName: Türkçe +ts: + name: Tsonga + nativeName: Xitsonga +tt: + name: Tatar + nativeName: татар теле +tw: + name: Twi + nativeName: Twi +ty: + name: Tahitian + nativeName: Reo Tahiti +ug: + name: Uyghur + nativeName: ئۇيغۇرچە +uk: + name: Ukrainian + nativeName: українська мова +ur: + name: Urdu + nativeName: اردو +uz: + name: Uzbek + nativeName: Ўзбек +ve: + name: Venda + nativeName: Tshivenḓa +vi: + name: Vietnamese + nativeName: Việt Nam +vo: + name: Volapük + nativeName: Volapük +wa: + name: Walloon + nativeName: walon +wo: + name: Wolof + nativeName: Wollof +xh: + name: Xhosa + nativeName: isiXhosa +yi: + name: Yiddish + nativeName: ייִדיש +yo: + name: Yoruba + nativeName: Yorùbá +za: + name: Zhuang + nativeName: Saɯ cueŋƅ +zh: + name: Chinese + nativeName: 中文 +zh_TW: + name: Chinese + nativeName: 中文 (TW) +zu: + name: Zulu + nativeName: isiZulu diff --git a/config/locales/plurals.rb b/config/locales/plurals.rb index 6ab9d3dc5a4..9e6ea0b56e9 100644 --- a/config/locales/plurals.rb +++ b/config/locales/plurals.rb @@ -103,7 +103,8 @@ :tl => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, :to => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, :tr_TR => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, - :uk => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + # TODO put this back when translations are correct: :uk => { :i18n => { :plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other } } } }, + :uk => { :i18n => { :plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :other : :other } } } }, :ur => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other } } } }, :vi => { :i18n => { :plural => { :keys => [:other], :rule => lambda { |n| :other } } } }, :wa => { :i18n => { :plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other } } } }, diff --git a/config/locales/server.ar.yml b/config/locales/server.ar.yml index 442180817ab..7b72d2fe20e 100644 --- a/config/locales/server.ar.yml +++ b/config/locales/server.ar.yml @@ -17,7 +17,7 @@ ar: date_only: "%-d %B %Y" long: "%-d %B %Y، %l:%M%P" date: - month_names: [null, كانون الثاني, شباط, آذار, نيسان, آيار, حزيران, تموز, أب, أيلول, تشرين الأول, تشرين الثاني, كانون الأول] + month_names: [null, يناير, فبراير, مارس, أبريل, مايو, يونيو, يوليو, أغسطس, سبتمبر, أكتوبر, نوفمبر, ديسمبر] <<: *datetime_formats time: am: "ص" @@ -28,7 +28,7 @@ ar: posts: "منشورات." loading: "يحمّل" powered_by_html: 'تدعمه دسكورس ، يفضّل عرضه وجافاسكربت مفعّل' - log_in: "تسجيل الدخول" + log_in: "لِج" purge_reason: "تم حذفه تلقائيا كحساب مهمل وغير مُفعل" disable_remote_images_download_reason: "عُطّل تنزيل الصور عن بعد بسبب نفاذ مساحة القرص الحرّة." anonymous: "مجهول" @@ -36,6 +36,7 @@ ar: incoming: default_subject: "رسالة ورادة من %{email}" show_trimmed_content: "اظهر محتوى أقل" + maximum_staged_user_per_email_reached: "أقصى عدد للدعوات التي يمكن للعضو إرسالها باليوم بالبريد الالكتروني." errors: empty_email_error: "يحدث عندما يكون البريد المستلم فارغ" no_message_id_error: "يحدث عندما لا يحتوي البريد على 'Message-Id' في العنوان" @@ -46,8 +47,9 @@ ar: strangers_not_allowed_error: "يحدث عندما يحاول المستخدم انشاء موضوع جديد في قسم هو ليس عضواً فيه" insufficient_trust_level_error: "يحدث عندما يحاول مستخدم انشاء موضوع جديد في قسم و تكون درجه ثقه المستخدم اقل من القسم المطلوب " reply_user_not_matching_error: "يحدث عندما ياتي الرد من عنوان بريد ألكتروني مختلف من الذي أرسل اليه ألاشعار " - topic_not_found_error: "يحدث عندما يصل رد لموضوع تم حذفه" + topic_not_found_error: "يحدث عندما يصل رد لموضوع قد حُذف." topic_closed_error: "يحدث عندما يصل رد لموضوع تم اغلاقه " + bounced_email_error: "هذا البريد الالكتروني هو تقرير ترويجي بالبريد الالكتروني" screened_email_error: "وحدث هذا عندما تم حجب عنوان البريد الالكتروني للمرسل" errors: &errors format: '%{attribute} %{message}' @@ -68,7 +70,7 @@ ar: has_already_been_used: "مستخدم بالفعل " inclusion: غير متضمن في القائمة invalid: غير صالح - is_invalid: "غير صالح ، حاول ان تضع وصف اكثر" + is_invalid: "تبدو غير واضحة، هل هذه الجملة كاملة؟" less_than: يجب أن يكون أقل من %{count} less_than_or_equal_to: يجب أن تكون أقل من أو تساوي %{count} not_a_number: ليس عدد @@ -118,12 +120,11 @@ ar: max_username_length_range: "لا يمكن أن تكون القيمة العليا أصغر من الدنيا." default_categories_already_selected: "لا يمكنك تحديد فئة تستخدم في قائمة أخرى." s3_upload_bucket_is_required: "لا يمكنك تفعيل الرفع إلى S3 حتّى توفّر 's3_upload_bucket'." - bulk_invite: - file_should_be_csv: "على نسق الملف الملف المرفوع أن يكون إمّا csv أو txt." backup: operation_already_running: "ثمّة عملية تجري حاليا. لا يمكنك بدء مهمة جديدة الآن." backup_file_should_be_tar_gz: "على الملف الاحتياطي أن يكون أرشيف \".tar.gz\"." not_enough_space_on_disk: "ليس ثمّة مساحة كافية على القرص لرفع النسخة الاحتياطية هذه." + invalid_filename: "اسم ملف النسخة الاحتياطية يحتوي على حروف غير صالحة. الحروف الصالحة هي a-z 0-9 .-_." not_logged_in: "عليك تسجيل الدخول لفعل ذلك." not_found: "تعذر العثور على رابط العنوان المطلوب" invalid_access: "لا تمتلك صلاحيات لعرض المطلوب " @@ -203,7 +204,7 @@ ar: topic_not_found: "حدث خطب ما. قد يكون الموضوع أُغلق أو حُذف وأنت تشاهده؟" just_posted_that: "هذا مماثل لما شاركته مؤخرا" invalid_characters: "يحتوي احرف غير صالحة " - is_invalid: "غير صالح حاول ان تضع وصف اكثر" + is_invalid: "تبدو غير واضحة، هل هذه عبارة كاملة؟" next_page: "الصفحة التالية ←" prev_page: "→ الصفحة السابقة " page_num: "الصفحة %{num}" @@ -222,6 +223,11 @@ ar: top: "أفضل المواضيع" posts: "اخر المشاركات " private_posts: "الرسائل الخاصة الآخيرة" + group_posts: "احدث المشاركات من %{group_name} " + group_mentions: "احدث التذكيرات من %{group_name} " + user_posts: "احدث المشاركات من %{group_name} " + user_topics: " آخر المواضيع بواسطة @%{username}" + tag: "مواضيع معلمة " too_late_to_edit: "أُنشئ المنشور منذ فترة طويلة جدا، لذا تعديله أو حذفه لم يعد ممكنا." revert_version_same: "ألاصدار الحالي يتطابق مع نفس ألاصدار الذي تحاول استرجاعه ." excerpt_image: "صورة" @@ -312,6 +318,8 @@ ar: attributes: category: name: "اسم الفئة" + topic: + title: 'عنوان' post: raw: "متن النص" user_profile: @@ -331,12 +339,20 @@ ar: common: "هي واحدة من أكثر 10000 كلمة مرور شائعة. من فضلك استخدم كلمة مرور آمنة أكثر." same_as_username: "هي نفس اسم المستخدم. من فضلك استخدم كلمة مرور آمنة أكثر." same_as_email: "هي نفس بريدك الإلكتروني. من فضلك استخدم كلمة مرور آمنة أكثر." + same_as_current: "هي نفس كلمة السر الحاليةالخاصة بك" ip_address: signup_not_allowed: "التسجيل غير مسموح من هذا الحساب." color_scheme_color: attributes: hex: invalid: "ليس لونا صالحا" + post_reply: + base: + different_topic: "المشاركة والرد لابد ان يكونا في نفس الموضوع" + web_hook: + attributes: + payload_url: + invalid: "رابط غير صالح. يجب أن يحتوي الرابط على http:// او https://. المساحة الفارغة غير مسموح بها." <<: *errors user_profile: no_info_me: "
" @@ -350,7 +366,7 @@ ar: assets_topic_body: "هذا الموضوع مشاهد بشكل دائم للأعضاء فقط . ولحفظ الصورة والملف استخدم موقع التصميم. لا تقوم بحذفها\n\n\nكيف يكون العمل هنا.\n\n1. الرد على الموضوع.\n\n2. رفع كل الصور التي تود أن تستخدمها في الشعار." lounge_welcome: title: "مرحبا بك في الاستراحة" - body: | + body: |2 تهانينا! :confetti_ball: @@ -377,7 +393,7 @@ ar: post_template: "%{replace_paragraph}\n\nإستخدم الفقرات الآتية لوضع وصف أطول ، أو لإنشاء تعليمات أو قوانيناً لفئة جديدة :\n\n- لماذا يجب على الأعضاء والزوار استخدام هذه الفئة ؟ ولم انشئت ؟\n\n- ما هو الاختلاف بين هذه الفئة والفئات الأخرى الموجودة في الموقع ؟\n\n- ما هي النقاط الأساسية والعامة التي يجب أن تحتويه المواضيع في هذه الفئة ؟\n\n- هل نحتاج حقا إلى هذه الفئة ؟ وهل نستطيع دمجها مع فئة رئيسية أو فئة فرعية أخرى ؟\n" errors: uncategorized_parent: "غير مصنف لا يمكن أن يكون فئة الأم" - self_parent: "الفئة الفرعية لا يمكن ان تكون كالفئة الرئيسية." + self_parent: "لا يمكن أن يكون أب الفئة الفرعية ذات الفئة" depth: "لا يمكنك تضمين فئة فرعية تحت فئة فرعية اخرى" invalid_email_in: "'%{email_in}' ليس عنوان بريد الكتروني صالح ." email_already_used_in_group: "'%{email}' مستخدم من قبل المجموعه '%{group_name}'. " @@ -420,6 +436,9 @@ ar: create_like: "لقد وصلت للعدد الأقصى للإعجابات اليوم. رجاء انتظر %{time_left} قبل المحاولة مجددا." create_bookmark: "لقد وصلت للعدد الأقصى للتفضيلات اليوم. رجاء انتظر %{time_left} قبل المحاولة مجددا." edit_post: "لقد وصلت للعدد الأقصى للتعديلات اليوم. رجاء انتظر %{time_left} قبل المحاولة مجددا." + live_post_counts: "أنت تطلب تعداد حى للمنشورات بسرعه عاليه . الرجاء الانتظار %{time_left} قبل المحاوله مجدداً" + unsubscribe_via_email: "لقد وصلت للحد الأقصى من الغاء الاشتراكات عبر البريد الالكترونى اليوم. رجاء الانتظار %{time_left} قبل المحاولة مجددا." + topic_invitations_per_day: "لقد وصلت للحد الأقصى للدعوة للمواضيع اليوم. رجاء الانتظار %{time_left} قبل المحاولة مجددا." hours: zero: "أقل من ساعة" one: "ساعة واحدة" @@ -487,19 +506,19 @@ ar: many: "أيام كثيرة" other: "%{count} أيام" about_x_months: - zero: "لا يوجد شهور" - one: "شهر فقط" + zero: "لا أشهر" + one: "شهر واحد" two: "شهران" - few: "شهور قليلة" - many: "شهور كثيرة" - other: "%{count}شهر" + few: "%{count} أشهر" + many: "%{count} شهرا" + other: "%{count} شهر" x_months: - zero: "1 شهر" - one: "1 شهر" - two: "شهرين{count}%" - few: "شهور{count}%" - many: "شهور{count}%" - other: "شهور{count}%" + zero: "لا أشهر" + one: "شهر واحد" + two: "شهران" + few: "%{count} أشهر" + many: "%{count} شهرا" + other: "%{count} شهر" about_x_years: zero: "1 س" one: "1 س" @@ -614,6 +633,7 @@ ar: confirmed: "حُدّث بريدك الإلكتروني." please_continue: "تابع إلى %{site_name}" error: "حدث خطأ في تغيير عنوان بريدك الإلكتروني. لربما يكون العنوان مستخدما بالفعل." + error_staged: "حدث خطأ في تغيير عنوان بريدك الإلكتروني. العنوان الذى ادخلته مستخدم من قبل مشترك عبر البريد الالكترونى." already_done: "نأسف عنوان التاكيد هدا لم يعد صالحا بعد الان. ربما تم تغيير بريدك بالفعل؟" authorizing_old: title: "شكرا لك لتاكيدك عنوان بريدك الحالي." @@ -625,6 +645,7 @@ ar: continue_button: "تابع إلى %{site_name}" welcome_to: "مرحبا بك في %{site_name}!" approval_required: "يجب على المشرف أن يقبل حسابك الجديد قبل أن تستطيع الدخول لهذا المنتدى. سوف تتلقى بريد إلكتروني عندما يتم قبول حسابك." + missing_session: "لا نستظيع تحديد اذا كان حسابك قد أنشئ. رجاء التأكد من أن (الكوكيز) بالمتصفح الذى تستخدمة منشطة." post_action_types: off_topic: title: 'خارج الموضوع' @@ -690,6 +711,32 @@ ar: message: make: "هذا الموضوع معلّم الآن. سوف يظهر في أعلى كل صفحة حتى يرفض من قبل المستخدم." remove: "هذا الموضوع لم يعد معلّم. لن يظهر في أعلى كل صفحة." + unsubscribed: + title: "غير مشترك " + description: "لقد تم الغاء اشتراكك. لتغير اختيارات بريدك الالكترونى زور اختياراتك الشخصية" + topic_description: "لإعادة الاشتراك لل %{link}، استخدم ادارة التنبيهات في أسفل او يمين الموضوع." + unsubscribe: + title: "إلغاء الإشتراك" + stop_watching_topic: "توقف عن مراقبة هذا الموضوع، %{link}" + mute_topic: "الغاء جميع التنبيهات لهذا الموضوع، %{link}" + unwatch_category: "توقف عن مراقبة جميع المواضيع فى %{category}" + mailing_list_mode: "الغاء وضعية قائمة المراسلات" + disable_digest_emails: "توقف عن ارسال الملخصات بالبريد الالكترونى" + all: "لا ترسل لى أي بريد الكترونى من %{sitename}" + different_user_description: "أنت حالياً سجلت دخولك كمستخدم مختلف عن الذي كان يُرسله له الملخص. الرجاء تسجيل الخروج ثم الدخول مرة أخرى والمحاولة مجدداً." + not_found_description: "نأسف ، لم نستطيع أن نلغي اشتراكك . من الممكن أن الرابط المرسل إليك قد انتهت مدته . " + log_out: "تسجيل خروج" + user_api_key: + title: "منح الصلاحية لدخول التطبيق" + authorize: "منح الصلاحية" + read: "قراءة" + read_write: "قراءة/كتابة" + no_trust_level: "عذرا، ليس لديك درجة الموثوقية الكافية لدخول واجهة برمجة التطبيق الخاصة بالمستخدم." + scopes: + message_bus: "تحديثات فورية" + notifications: "قراءة و مسح التنبيهات" + read: "قراءة الكل" + write: "كتابة الكل" reports: visits: title: "زيارات العضو" @@ -773,19 +820,27 @@ ar: page_view_anon_reqs: title: "مجهولون" xaxis: "يوم" + yaxis: "عدد قراءات الصفحات للمجهولين" page_view_logged_in_reqs: title: "مسجل دخول" xaxis: "يوم" + yaxis: "عدد قراءات الصفحات للمسجلين دخول" page_view_crawler_reqs: title: "عناكب اﻹنترنت" xaxis: "يوم" + yaxis: "عدد قراءات الصفحات لزواحف الانترنت" page_view_total_reqs: title: "مجموع" xaxis: "يوم" + yaxis: "عدد قراءات الصفحات الكلى" page_view_logged_in_mobile_reqs: + title: "عدد قراءات الصفحات للمسجلين دخول" xaxis: "يوم" + yaxis: "عدد قراءات الصفحات للمسجلين دخول عن طريق المحمول" page_view_anon_mobile_reqs: + title: "عدد قراءات الصفحات للمجهولين" xaxis: "اليوم" + yaxis: "عدد قراءات الصفحات للمجهولين عن طريق المحمول" http_background_reqs: title: "خلفية" xaxis: "اليوم" @@ -837,20 +892,14 @@ ar: s3_backup_config_warning: 'تم تهيئة الخادم لرفع نسخة احتياطية إلى s3، لكن واحدة على الأقل من الإعدادات التالية لم تضبط: s3_access_key_id, s3_secret_access_key or s3_backup_bucket. أذهب إلى إعدادات الموقع وتحديث الإعدادات. انظر "كيف ترفع الصور المرفوعة إلى S3؟" لتعلم المزيد.' image_magick_warning: 'تم تهيئة الخادم لإنشاء صور مصغرة للصور الكبيرة، لكن ImageMagick لم يثبت. ثبته باستخدام مدير الحزم المفضل لك أو حمل أحدث نسخة.' failing_emails_warning: 'يوجد %{num_failed_jobs} مهام بريد إلكتروني فشلت. تحقق من app.yml الخاص بك وتأكد من إعدادات خادم البريد أنها صحيحة. أنظر للمهام الفاشلة في Sidekiq.' - default_logo_warning: "ضع الشعارات الرسومية لموقعك. حدث logo_url, logo_small_url, و favicon_url in إعدادات الموقع." - contact_email_missing: "أدخل عنوان البريد الإلكتروني لجهة اتصال الموقع لتكون على وصول بالأمور العاجلة حول موقعك. حدثه في إعدادات الموقع." - contact_email_invalid: "البريد الالكتروني للموقع معطل. حدّثه Site Settings." - title_nag: "أدخل اسم موقعك. حدث العنوان في الاعدادات Site Settings." - site_description_missing: "أدخل جملة وصفية واحدة لموقعك والتي ستظهر في نتائج البحث. حدّث وصف_الموقع في اعدادات الموقع Site Settings." - consumer_email_warning: "موقعك مهيئ لاستخدام Gmail (أو مستهلك خدمة بريد إلكتروني أخر) لإرسال بريد إلكتروني. حدود Gmail كمية رسائل البريد الإلكتروني التي يمكنك إرسالها. فكر باستخدام مزود خدمة بريد إلكتروني مثل mandrill.com لضمان أهداف البريد الإلكتروني." - site_contact_username_warning: "أدخل اسم حسابات الأعضاء العاملين الودودين لإرسال رسالة مهمة آليا من تحديث site_contact_username في إعدادات الموقع." - notification_email_warning: "رسائل التنبية البريدية لم تكن مرسلة من عنوان بريدي صالح على مجالك؛ توصيل البريد سيكون غير منتظم ولايمكن الاعتماد عليها. الرجاء وضع رسائل التنبية في عنوان بريدي صالح في إعدادات الموقع Site Settings." subfolder_ends_in_slash: "إعدادات المجلدات الداخلية خاطئ;ال DISCOURSE_RELATIVE_URL_ROOT يجب ان تنتهي ب سلاش." + missing_mailgun_api_key: "هذا الموقع معد لارسال البريد الالكترونى عن طريق خدمة mailgun لكنكم لم تزودونا بمفتاح API الخاص بكم لتعريف رسائلكم للخدمة." site_settings: censored_words: "الكلمات التي ستستبدل تلقائيا مع ■■■■" delete_old_hidden_posts: "سيتم حذف الوظائف المخفية تلقائيًا إذا زادت مدة الإخفاء أكثر من 30 يومًا" default_locale: "اللغة الإفتراضية لهذا الديسكورس نموذج (ISO 639-1 Code)" allow_user_locale: "السماح للمستخدمين باختيار واجهة تفضيل لغة خاصة بهم." + set_locale_from_accept_language_header: "اختيار لغة الواجه للمستخدمين المجهولين طبقا للغة المختارة بمطصحف الشبكة. (اعداد تجريبى، لا يعمل مع ذاكرة المطصفح)" min_post_length: "الحد الأدنى المسموح به لطول مشاركة في الأحرف" min_first_post_length: "الحد الأدنى المسموح به لطول أول المشاركة (مقدمة العنوان) بالأحرف" min_private_message_post_length: "الحد الأدنى المسموح به لطول مشاركة في الأحرف" @@ -859,6 +908,7 @@ ar: max_topic_title_length: "الحد الأعلى المسموح به لطول عنوان موضوع في الأحرف" min_private_message_title_length: "الحد الأدنى المسموح به لطول عنوان لرسالة في الأحرف" min_search_term_length: "الحد الأدنى الصالح لطول مصطلح في الأحرف" + search_tokenize_chinese_japanese_korean: "ارغام الباحث على تجميع احرف اللغات الصينية واليابانية والكورية حتى على المواقع الغير معدة لتلك اللغات." allow_uncategorized_topics: "اسمح بتصميم النقاشات من غير فئات. تحذير: اذا كان هناك نقاشات غير مصنفه، يجب عليك تصنيفها قبل اغلاق هذا " allow_duplicate_topic_titles: "اسمح بالمواضيع المماثلة والعناوين المكررة." unique_posts_mins: "كمية الدقائق التي يمكن للعضو قبلها إنشاء مشاركة مع نفس المحتوى مجددا" @@ -871,6 +921,7 @@ ar: crawl_images: "جلب الصور من الروابط لادراج الأبعاد الصحيحة." download_remote_images_to_local: "تحويل الصور البعيدة إلى صور محلية بواسطة تحميلها؛ بإستثناء الصور التالفة" download_remote_images_threshold: "ادني مساحه للقرص ضروربه لتحميل الصور البعيده محليا ( في المئه) " + download_remote_images_max_days_old: "لا تقم بتحميل الصور من مواقع اخرى للمشاركات اﻷقدم من عدد س من اﻷيام." disabled_image_download_domains: "الصور البعيدة لن يتم تنزيلها من هذا المجال. قائمة Pipe-delimited." editing_grace_period: "خلال (n) ثواني بعد نشر المشاركة ، التعديل لن يقوم بانشاء نسخة جديدة في السجل الخاص بالتعديل ." post_edit_time_limit: "الكاتب يتستطيع تعديل و مسح مشاركته لعده (n) دقائق بعد النشر. اضبطه للعدد0 للابد" @@ -885,9 +936,11 @@ ar: add_rel_nofollow_to_user_content: "أضف rel nofollow لجميع محتوى المستخدم المتقدم، باستثناء الروابط الداخلية (بما في ذلك المجالات الأصل). إذا غيرت هذا، يجب عليك عمل rebake لكل المشاركات بـ: \"rake posts:rebake\"" exclude_rel_nofollow_domains: "قائمه النطاقات حيت لا اتباع لا يجب ان تضاف للروابط. tld.com سوف يقوم تلقائيا بالسماح sub.tld.com كذلك مثل الاصغر , يجب عليك اضافه النطاق الاعلى مستوي الخاص بالموقع لمساعده زحف الويب ليجاد جميع المحتويات.اذا كان باقي اجزاء موقعك في نطاقات اخرى , اضفهم ايضا" post_excerpt_maxlength: "الحد الأقصى لطول وظيفة مقتطف / ملخص." + show_pinned_excerpt_mobile: "اظهر مقتطفات من المواضيع المثبتة فى منظر المحمول." + show_pinned_excerpt_desktop: "اظهر مقتطفات من المواضيع المثبتة فى منظر سطح المكتب." post_onebox_maxlength: "الحد الأقصى لطول مشاركة oneboxed Discourse بالأحرف." - onebox_domains_whitelist: "قائمة بالمجالات للسماح روابط تفصيلي؛ وينبغي دعم هذه المجالات OpenGraph أو oEmbed. اختبار لهم في http://iframely.com/debug" logo_url: "صورة الشعار في الجزء العلوي الأيسر من موقع الويب الخاص بك، يجب أن تكون على شكل مستطيل واسع. إذا ترك الحقل فارغا فسيتم استخدام اسم الموقع." + digest_logo_url: "صورة الشعار البديل المستخدم في الجزء العلوي لملخص البريد الالكترونى، يجب أن تكون على شكل مستطيل واسع. لا يجب أن تكون الصورة من نوع SVG. إذا ترك الحقل فارغا فسيتم استخدام `logo_url`." logo_small_url: "صورة الشعار صغيرة في الجزء العلوي الأيسر من موقع الويب الخاص بك، يجب أن تكون على شكل مربع، وينظر عند التمرير لأسفل. وإذا ترك فارغا أن أظهرت الصورة الرمزية المنزل." favicon_url: "الأيقونة الخاصة بموقعك, شاهد http://en.wikipedia.org/wiki/Favicon, لتعمل بشكل صحيح ضمن CDN يجب ان تكون بصيغة png." mobile_logo_url: "صورة الشعار الثابتة ستظهر في الجزء العلوي الأيسر في نسخة الجوال من موقعك. يجب أن تكون مربعة. إذا تُركت فارغة، سيتم استخدام الـ `logo_url`. على سبيل المثال: http://example.com/uploads/default/logo.png" @@ -895,6 +948,7 @@ ar: notification_email: "لمن: يستخدم عنوان البريد الالكتروني عند إرسال كل رسائل النظام الأساسي. المجال الخاص هنا يجب أن يكون SPF, DKIM وسجلات PTR عكسي تضبط بشكل صحيح لوصول البريد الالكتروني." email_custom_headers: "قائمة قناة محددة لرؤوس بريد إلكتروني مخصص." email_subject: "لتخصيص تنسيق عناوين رسائل البريد الالكتروني القياسية. انظر https://meta.discourse.org/t/customize-subject-format-for-standard-emails/20801" + force_https: "ارغام الموقع على استخدام HTTPS فقط. تحذير: لا تفعل هذا الاختيار الا بعد التأكد أن HTTPS مفعلة وتعمل بالكامل فى جميع أنحاء الموقع! هل اختبرت جميع الخوادم CDN، جميع تسجيلات الدخول من شبكات التواصل الاجتماعى، أية صور أو تبعيات خارجية للتأكد من أنها كلها متوافقه مع HTTPS؟" summary_score_threshold: "الحد الأدنى للنقاط المطلوبة لتضمين مشاركة في \"تلخيص هذا الموضوع\"" summary_posts_required: "الحد الأدنى للمشاركات في الموضوع قبل \"تلخيص هذا الموضوع\" مفعل." summary_likes_required: "الحد الأدنى للإعجابات في الموضوع قبل \"تلخيص هذا الموضوع\" مفعل." @@ -906,10 +960,17 @@ ar: polling_interval: "عندما لا يكون التصويت طويلا، عدد المرات التي يجب تسجيل عملاء التصويت فيها بالملي ثانية." anon_polling_interval: "المرات التي يجب الاستعلام فيها عن العملاء المجهولين بالملي ثانية." background_polling_interval: "كم ينبغي أن يكون عدد مرات الاستعلام عن العملاء في المللي ثانية ( عندما يكون الاطار في الخلفية )" + flags_required_to_hide_post: "عدد العلامات التى تؤدى الى خفى مشاركة تلقائيا وارسال رسالة الى المستخدم ( 0 تعنى عدم الخفى أو الارسال)" cooldown_minutes_after_hiding_posts: "عدد الدقائق يجب على المستخدم الانتظار قبل أن يتمكنوا من تعديل موضوع مخفي عن طريق رفع الأعلام المجتمع" + max_topics_in_first_day: "أقصى عدد للمواضيع المسموح للمستخدم بانشائها خلال 24 ساعة من نشر أول مشاركة." + max_replies_in_first_day: "أقصى عدد للردود المسموح للمستخدم بنشرها حتى مرور 24 ساعة على نشر أول مشاركة" tl2_additional_likes_per_day_multiplier: "زيادة حد الإعجابات باليوم لـ لـمستوى الثقة 2 (عضو) بالضرب بهذا الرقم" tl3_additional_likes_per_day_multiplier: "زيادة حد الإعجابات باليوم لـ لـمستوى الثقة 3 (منتظم) بالضرب بهذا الرقم" tl4_additional_likes_per_day_multiplier: "زيادة حد الإعجابات باليوم لـمستوى الثقة 4 (قائد) بالضرب بهذا الرقم" + num_spam_flags_to_block_new_user: "اذا كانت مشاركات المستخدم الجديد حصلت علي هذا الكم من اعلامات البريد الغير مرغوب من num_users_to_block_new_user مع اختلاف المستخدمين، اخفي جميع مشاركتهم و امنع جميع المشاركات المستقبليه.0 تعنى الالغاء." + num_users_to_block_new_user: "اذا كانت مشاركات المستخدم الجديد حصلت علي num_spam_flags_to_block_new_user من هذا العدد من المستخدمين المختلفين، اخفي جميع مشاركتهم و امنع جميع المشاركات المستقبليه.0 تعنى الالغاء." + num_tl3_flags_to_block_new_user: "اذا كانت مشاركات المستخدم الجديد حصلت علي هذا العدد من علامات num_tl3_users_to_block_new_user من مستخدمين مختلفين من مستوى الثقة 3، اخفي جميع مشاركتهم و امنع جميع المشاركات المستقبليه.0 تعنى الالغاء." + num_tl3_users_to_block_new_user: "اذا كانت مشاركات المستخدم الجديد حصلت علي هذا العدد من علامات num_tl3_flags_to_block_new_user من مستخدمين مختلفين من مستوى الثقة 3، اخفي جميع مشاركتهم و امنع جميع المشاركات المستقبليه.0 تعنى الالغاء." notify_mods_when_user_blocked: "إذا تم حظر المستخدم تلقائيا، وإرسال رسالة الى جميع المشرفين." flag_sockpuppets: "إذا رد أحد المستخدمين جديد إلى موضوع من عنوان IP نفسه باسم المستخدم الجديد الذي بدأ هذا الموضوع، علم كل من مناصبهم كدعاية المحتملين." traditional_markdown_linebreaks: "استعمل السطور التالفه التقليديه في Markdown, التي تتطلب مساحتين بيضاوين للسطور التالفه" @@ -917,8 +978,11 @@ ar: post_undo_action_window_mins: "عدد الدقائق التي يسمح فيها للأعضاء بالتراجع عن آخر إجراءاتهم على المنشور (إعجاب، اشارة، إلخ...)" must_approve_users: "يجب أن الموظفين يوافق على جميع حسابات المستخدم الجديدة قبل أن يتم السماح لهم للوصول إلى الموقع. تحذير: تمكين هذا لموقع الحية إلغاء وصول المستخدمين الحاليين غير الموظفين!" pending_users_reminder_delay: "نبه المشرفين إذا وجد اعضاء ينتظرون الموافقة لمدة اطول من الساعات ، قم بوضع الخيار -1 لايقاف التنبيهات ." + maximum_session_age: "سيظل المستخدم مسجل دخول لهذا العدد من الساعات منذ زيارته اﻷخيرة." ga_universal_tracking_code: "تحليلات Google العالمية (analytics.js) تتعقب رمز الشيفرة، مثال: UA-12345678-9; انظر http://google.com/analytics" ga_universal_domain_name: "تحليلات Google العالمية (analytics.js) تتعقب اسم المجال، مثال: mysite.com; انظر http://google.com/analytics" + gtm_container_id: "هاوية حاوية ادارة العلامات الخاصة بجوجل. على سبيل المثال: GTM-ABCDEF" + enable_escaped_fragments: "اللجوء الى استخدام Ajax-Crawling API حالة اكتشاف تواجد زاحف الشبكة. للمزيد: https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" enable_noscript_support: "فعل دعم محرك بحث webcrawler عبر علامة غير نصية." allow_moderators_to_create_categories: "السماح للمشرفين إنشاء قسم جديد" cors_origins: "اسمح بالأصول للطلبات عبر المنشأ (CORS). كل أصل يجب أن يتضمن http:// أو https://. متغير env لـ DISCOURSE_ENABLE_CORS يجب أن يعين إلى true ليعمل CORS." @@ -940,12 +1004,11 @@ ar: top_page_default_timeframe: "الوقت المثبت علي الصفحة الأكثر مشاهدة." show_email_on_profile: "إظهار بريدك المستخدم على صفحته الشخصية (مرئية فقط لأنفسهم والموظفين)" email_token_valid_hours: "نسيت كلمه السر/ تنشيط رموز الحساب صالحه ل(n) ساعات" - email_token_grace_period_hours: "نسيت كلمه السر/ تنشيط رموز الحساب لا تزال صالحة لفترة سماح بالـ(n) ساعات بعد استبدالها." enable_badges: "تفعيل نظام الأوسمة." - enable_whispers: "السماح للموظفين الخصوصين التواصل ضمن موضوع.(تجريبي)" allow_index_in_robots_txt: "تحديد في ملف robots.txt أن يسمح هذا الموقع ليتم فهرستها من قبل محركات البحث على شبكة الإنترنت." email_domains_blacklist: "قائمة pipe-delimited المجالات البريد الإلكتروني الذي لا يسمح للمستخدمين تسجيل حسابات مع. مثال: mailinator.com | trashmail.net" email_domains_whitelist: "قائمة pipe-delimited من مجالات البريد الإلكتروني التي يجب على المستخدمين تسجيل حسابات مع. تحذير: لن يسمح للمستخدمين مع مجالات البريد الإلكتروني الأخرى غير المذكورة هنا!" + forgot_password_strict: "عدم اعلام المستخدم بوجود حساب عند استخدامهم استمارة \"نسيت كلمة السر\"" log_out_strict: "عند تسجيل الخروج، تسجيل الخروج ALL جلسات للمستخدم على جميع الأجهزة" version_checks: "Ping ديسكورس مركزا لتحديثات الإصدار وإظهار الرسائل النسخة الجديدة على لوحة القيادة / مسؤول" new_version_emails: "إرسال بريد إلكتروني إلى عنوان contact_email عندما نسخة جديدة من ديسكورس هو متاح." @@ -962,8 +1025,10 @@ ar: min_admin_password_length: "أقل طول مسموح به للكلمه مرور بالنسبه لاداري" block_common_passwords: "لا تسمح لكلمات المرور المسجلة في قائمة كلمات المرور الشائعةز" enable_sso: " اسمح تسجيل دخول واحد عبر موقع خارجي(تحذير :عنوان بريد المستخدم *يجب* ان يتم التحقق من صحته عبر الموقع الخارجي)" + verbose_sso_logging: "سجل باسهاب التشخيصات المرتبطة بتسجيل الدخول اﻷحادى (SSO) الى logs/" enable_sso_provider: "تنفيذ مزود بروتوكول Discourse SSO على نقطة نهاية /session/sso_provider, يتطلب sso_secret لتعينها" sso_secret: "السلسلة السرية استخدمت لتشفير مصادقة معلومات SSO, كن متأكداً أنها 10 حروف أو أكثر" + sso_overrides_bio: "تجاوز السيرة الزاتية بملف التعريف الخاص بالمستخدم ومنعه من تغيره. " sso_overrides_email: "يتجاوز البريد الاكتوني المحلي مع بريد موقع خارجي من حمولة SSO عند كل تسجيل دخول, ويمنع التتغيرات المحلية. (تحذير: ممكن يحدث تعارض بسبب الاختلاف طول اسم المستخدم/المتطلبات)" sso_overrides_username: "يتجاوز \"اسم المستخدم المحلي\" مع \"اسم مستخدم موقع خارجي\" من حمولة SSO عند كل تسجيل دخول, ويمنع التغيرات المحلية. (تحذير: ممكن يحدث تعارض بسبب الاختلاف طول اسم المستخدم/المتطلبات)" sso_overrides_name: "يتجاوز الاسم المحلي مع اسم موقع خارجي من حمولة SSO عند كل تسجيل دخول, ويمنع التغيرات المحلية. " @@ -988,6 +1053,7 @@ ar: enable_github_logins: "تمكين مصادقة جيثب، يتطلب github_client_id وgithub_client_secret" github_client_id: "هوية العميل للمصادقة جيثب، مسجلة في https://github.com/settings/applications" github_client_secret: "هوية العميل للمصادقة جيثب، مسجلة في https://github.com/settings/applications" + readonly_mode_during_backup: "تمكين وضع القراءة فقط في حين أخذ نسخة احتياطية" allow_restore: "تسمح استعادة، والتي يمكن أن تحل محل ALL بيانات الموقع! ترك كاذبة إلا إذا كنت تخطط لاستعادة نسخة احتياطية" maximum_backups: "أكبر قدر ممكن من النسخ الاحتياطي للحفاظ على القرص. يتم حذف النسخ الاحتياطية القديمة تلقائيا" automatic_backups_enabled: "فعل النسخ الإحتياطي التلقائي بشكل متكرر كما هو محدد." @@ -1012,6 +1078,7 @@ ar: max_private_messages_per_day: "أقصى عدد لرسائل الأعضاء التي يمكن إنشائها باليوم." max_invites_per_day: "أقصى عدد للدعوات التي يمكن للعضو إرسالها باليوم." max_topic_invitations_per_day: "أقصى عدد لدعوات الموضوع التي يمكن للعضو إرسالها باليوم." + alert_admins_if_errors_per_minute: "عدد الأخطاء في الدقيقة الواحدة لكى يرسل تنبيه للمدير. قيمة 0 تعطل هذه الميزة. ملاحظة: تتطلب إعادة تشغيل." suggested_topics: "عدد المواضيع المواضيع المقترحة يظهر في أسفل الموضوع." limit_suggested_to_category: "أظهر فقط المواضيع من الفئات الحالية في المواضيع المقترحة." clean_up_uploads: " يتيم أزالة تحديث غير مرجعية لمنع استضافة غير المشروعة. تحذير: قد تحتاج لعمل نسخة احتياطية من الدليل / تحميل قبل تمكين هذا الإعداد." @@ -1113,6 +1180,10 @@ ar: display_name_on_email_from: "أعرض الاسماء كاملة في البريد الالكتروني من المجال." unsubscribe_via_email: "أسمح للمستخدمين بالغاء الاشتراك لرسائل البريد الالكتروني عن طريق أرسال بريد الكتروني يحتوي على 'unsubscribe' في العنوان او محتوى البريد" delete_email_logs_after_days: "حذف سجل البريد بعد (ن) يوم. 0 لحفظ السجل للابد" + max_emails_per_day_per_user: "العدد الأقصى لعدد الرسائل التي يتم إرسالها للأعضاء في اليوم. ضع 0 لإلغاء الحد." + block_auto_generated_emails: "منع رسائل البريد الإلكتروني الواردة التي تم تحديدها على أنها يتم إنشاؤها تلقائيا." + ignore_by_title: "تجاهل رسائل البريد الإلكتروني الواردة على أساس اللقب." + manual_polling_enabled: "دفع رسائل البريد الإلكتروني باستخدام API لردود البريد الإلكتروني." pop3_polling_enabled: "تصويت عبرPOP3 لردود البريد الإلكتروني." pop3_polling_ssl: "أستخدم SSL عند الأتصال بمخدم POP3.(مُستحسن)" pop3_polling_period_mins: "الفترة دقائق بين التحقق من حساب POP3 للبريد الإلكتروني. ملاحظة : تتطلب إعادة تشغيل." @@ -1136,6 +1207,7 @@ ar: allow_animated_thumbnails: "يولد الصور المصغرة المتحركة للرسوم المتحركة. " default_avatars: "سيتم استخدام عناوين URL للصور الرمزية بشكل افتراضيًا للأعضاء الجدد حتى يغيروا صورهم." automatically_download_gravatars: "تحميل Gravatars للأعضاء عند تغيرهم البريد الإلكتروني الخاص بهم أو عند إنشائهم لحساب آخر." + disable_digest_emails: "تعطيل رسائل الملخص لجميع الأعضاء." detect_custom_avatars: "سواء او لا تفقد اذا كان المستخدم قام بتحميل صور شخصيه مخصصه" max_daily_gravatar_crawls: "العدد الاقصي من مرات Dicourse سوف يتفقد Gravatar لصور رمزيه مخصصه في اليوم" public_user_custom_fields: "حقول قائمه بيضاء مخصصه للمستدم يمكن رويتها علنا" @@ -1174,7 +1246,6 @@ ar: embed_whitelist_selector: "منتقي CSS للعناصر التي تسمح في التضمينات." embed_blacklist_selector: "منتقي CSS للعناصر التي حذفت من التضمينات." notify_about_flags_after: "اذا كانت هناك علامه انه لم يتم تاتعامل معه بعد هذه الساعات, ارسال رساله الي جهه الاتصال_بريده الالكتروني. اضبط 0 للتعطيل" - enable_cdn_js_debugging: "السماح/logs لعرض أخطاء المناسبة عن طريق إضافة تتضمن تحليل عرض كل شبيبة." show_create_topics_notice: "إذا كان الموقع يحتوي على أقل من 5 مواضيع عامة , إظهار إشعار مطالبة المسؤولين إنشاء بعض المواضيع." delete_drafts_older_than_n_days: حذف المسودات مضى عليها أكثر من (ن) يوما. prevent_anons_from_downloading_files: "امنع المستخدمين المجهولين من تحميل المرفقات. تحذير:سوف تمنع اي شخص ليس لديه صوره موقع اصول نشره كمرفقات من العمل." @@ -1447,30 +1518,12 @@ ar: [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "اكتملت عملية النسخ الإحتياطي بنجاح" - text_body_template: "تم النسخ الاحتياطي بنجاح .\nزيارة [admin > backup section](%{base_url}/admin/backups) لتحميل النسخةالاحتياطية الجديدة." backup_failed: subject_template: "فشل النسخ الإحتياطي" - text_body_template: | - فشل النسخ الاحتياطي. - - هنا السجل: - - ``` - %{logs} - ``` restore_succeeded: subject_template: "أكتملت الإستعادة بنجاح" - text_body_template: "الاستعادة نجحت" restore_failed: subject_template: "فشل استعادة" - text_body_template: | - فشل عملية الاستعادة. - - هذا السجل: - - ``` - %{logs} - ``` bulk_invite_succeeded: subject_template: "دعوة العضو الجماعية تمت بنجاح" text_body_template: "ملف دعوة العضو الجماعية الخاص بك تمت معالجته، %{sent} دعوات مرسلة." @@ -1506,7 +1559,6 @@ ar: إذا حصل أنك لم تُشمِل الرد، حاول مرة أخرى مع التنسيق البسيط. email_reject_parsing: - subject_template: "[%{site_name}] بريد الكتروني -- محتواه غير معروف" text_body_template: | نحن آسفون ، ولكن رسالة البريد الإلكتروني إلى %{destination} (titled %{former_title}) لا تعمل. @@ -1574,13 +1626,7 @@ ar: subject_template: "%{optional_re}%{topic_title}" digest: why: "ملخص المؤجز من %{site_link} منذ زيارتك الاخيره في %{last_seen_at}" - new_activity: "يوجد نشاط جديد في المواضيع والمشاركات الخاصة بك:" - top_topics: "اشهر المشاركات " - other_new_topics: "اشهر المواضيع " click_here: "أنقر هنا" - read_more: "قراءة المزيد" - more_topics: "هناك %{new_topics_since_seen} مواضيع جديدة أخرى." - more_topics_category: "أكثر المواضيع الجديدة:" forgot_password: subject_template: "[%{site_name}] إعادة ضبط كلمة المرور" text_body_template: | @@ -1677,7 +1723,7 @@ ar: anonymous_user: "المستخدم مجهول" suspended_not_pm: "عضو موقوف، ليست رسالة" seen_recently: "تم رؤية هذا المستخدم مسبقاً" - post_not_found: "لا يمكن إيجاد مشاركة مع معرف %{post_id}" + post_not_found: "تعذر إيجاد المشاركة ذات المعرف %{post_id}" notification_already_read: "تم قراءة هذه الاشعارات " topic_nil: "مشاركة.موضوع صفر" post_deleted: "تم حذف الموضوع من قبل كاتبه " @@ -2051,6 +2097,12 @@ ar: name: أول إبلاغ promoter: description: عضو غير صحيح + first_share: + name: أول مشاركة + first_link: + name: أول رابط + first_quote: + name: أول إقتباس read_guidelines: name: إقرأ القواعد العامة reader: diff --git a/config/locales/server.bs_BA.yml b/config/locales/server.bs_BA.yml index 8b4531a0299..2f8009c83bc 100644 --- a/config/locales/server.bs_BA.yml +++ b/config/locales/server.bs_BA.yml @@ -10,13 +10,32 @@ bs_BA: short_date_no_year: "D MMM" short_date: "D MMM, YYYY" long_date: "MMMM D, YYYY h:mma" + datetime_formats: &datetime_formats + formats: + short: "%d.%m.%Y." + short_no_year: "%B %-d" + date_only: "%B %-d, %Y" + long: "%B %-d, %Y, %l:%M%P" + date: + month_names: [null, Januar, Februar, Mart, April, Maj, Juni, Juli, August, Septembar, Oktobar, Novembar, Decembar] + <<: *datetime_formats + time: + am: "am" + pm: "pm" + <<: *datetime_formats title: "Discourse" topics: "Topics" posts: "posts" loading: "Loading" powered_by_html: 'Powered by Discourse, best viewed with JavaScript enabled' log_in: "Log In" + purge_reason: "Automatski obrisan kao napušten, deaktiviran račun" disable_remote_images_download_reason: "Remote images download was disabled because there wasn't enough disk space available." + anonymous: "Anoniman" + emails: + incoming: + default_subject: "Dolazna poruka pošte %{email}" + show_trimmed_content: "Prikaži skraćeni sadržaj" errors: &errors messages: too_long_validation: "is limited to %{max} characters; you entered %{length}." @@ -24,8 +43,6 @@ bs_BA: taken: "has already been taken" embed: load_from_remote: "There was an error loading that post." - bulk_invite: - file_should_be_csv: "The uploaded file should be of csv or txt format." backup: operation_already_running: "An operation is currently running. Can't start a new job right now." backup_file_should_be_tar_gz: "The backup file should be a .tar.gz archive." @@ -43,7 +60,6 @@ bs_BA: user_is_suspended: "Suspended users are not allowed to post." just_posted_that: "is too similar to what you recently posted" invalid_characters: "contains invalid characters" - is_invalid: "is invalid; try to be a little more descriptive" next_page: "next page →" prev_page: "← previous page" page_num: "Page %{num}" @@ -152,7 +168,7 @@ bs_BA: assets_topic_body: "This is a permanent topic, visible only to staff, for storing images and files used in the site design. Don't delete it!\n\n\nHere's how:\n\n\n1. Reply to this topic.\n2. Upload all the images you wish to use for logos, favicons, and so forth here. (Use the upload toolbar icon in the post editor, or drag-and-drop or paste images.)\n3. Submit your reply to post it.\n4. Right click the images in your new post to get the path to the uploaded images, or click the edit icon to edit your post and retrieve the path to the images. Copy the image paths.\n5. Paste those image paths into [basic settings](/admin/site_settings/category/required).\n\n\nIf you need to enable different file type uploads, edit `authorized_extensions` in the [file settings](/admin/site_settings/category/files)." lounge_welcome: title: "Welcome to the Lounge" - body: | + body: |2 Congratulations! :confetti_ball: @@ -191,11 +207,19 @@ bs_BA: change_failed_explanation: "You attempted to demote %{user_name} to '%{new_trust_level}'. However their trust level is already '%{current_trust_level}'. %{user_name} will remain at '%{current_trust_level}' - if you wish to demote user lock trust level first" rate_limiter: too_many_requests: "We have a daily limit on how many times that action can be taken. Please wait %{time_left} before trying again." + hours: + one: "1 sat" + few: "Par sati" + other: "%{count} sati" datetime: distance_in_words: half_a_minute: "< 1m" distance_in_words_verbose: half_a_minute: "just now" + about_x_hours: + one: "Pred 1 sat" + few: "Pred par sati" + other: "Pred %{count} sata" password_reset: choose_new: "Odaberite novu šifru" choose: "Molimo vas odaberite šifru" @@ -204,7 +228,7 @@ bs_BA: title: 'Resetuj Šifru' success: "Uspješno ste promjenili šifru i sada se možete ulogovati." success_unapproved: "Uspješno ste promjenili šifru." - continue: "Idi na Revolucionar.com" + continue: "Idi na %{site_name}" change_email: confirmed: "Your email has been updated." please_continue: "Continue to %{site_name}" @@ -212,7 +236,7 @@ bs_BA: activation: already_done: "Link za konfirmaciju nije validan. Možda ste već aktivirani?" please_continue: "Vaš novi nalog je verifikovan, i možete se ulogovati." - continue_button: "Idi na Revolucionar.com" + continue_button: "Nastavi na %{site_name}" welcome_to: "Dobrodošli na %{site_name}!" approval_required: "A moderator must manually approve your new account before you can access this forum. You'll get an email when your account is approved!" post_action_types: @@ -226,7 +250,7 @@ bs_BA: long_form: 'opomeni kao spam' inappropriate: title: 'Neprikladno' - description: 'Ovaj post sadrži tekst koji je uvredljiv i pogrdan. I kao takav kosi se sa našim pravilima korišćenja.' + description: 'Ovaj post sadrži tekst koji bi razumna osoba smatrala uvredljivim, pogrdnim i neprikladan prema pravilima naše zajednice.' long_form: 'opomeni kao neprikladno' notify_user: long_form: 'korisnik obavješten' @@ -254,7 +278,7 @@ bs_BA: long_form: 'opomenuo kao spam' inappropriate: title: 'Inappropriate' - description: 'Ova tema sadrži tekst koji je uvredljiv i pogrdan. I kao takav kosi se sa našim pravilima korišćenja.' + description: 'Ova tema sadrži tekst koji bi razumna osoba smatrala uvredljivim, pogrdnim i neprikladan prema pravilima naše zajednice.' long_form: 'opomenuto kao neprikladno' notify_moderators: title: "Obavijesti Moderatore" @@ -347,6 +371,8 @@ bs_BA: title: "Top Referred Topics" xaxis: "Topic" num_clicks: "Clicks" + time_to_first_response: + yaxis: "Prosječno vrijeme (hours)" dashboard: rails_env_warning: "Your server is running in %{env} mode." host_names_warning: "Your config/database.yml file is using the default localhost hostname. Update it to use your site's hostname." @@ -360,14 +386,6 @@ bs_BA: s3_config_warning: 'The server is configured to upload files to s3, but at least one the following setting is not set: s3_access_key_id, s3_secret_access_key or s3_upload_bucket. Go to the Site Settings and update the settings. See "How to set up image uploads to S3?" to learn more.' s3_backup_config_warning: 'The server is configured to upload backups to s3, but at least one the following setting is not set: s3_access_key_id, s3_secret_access_key or s3_backup_bucket. Go to the Site Settings and update the settings. See "How to set up image uploads to S3?" to learn more.' image_magick_warning: 'The server is configured to create thumbnails of large images, but ImageMagick is not installed. Install ImageMagick using your favorite package manager or download the latest release.' - default_logo_warning: "You haven't customized the logo images for your site. Update logo_url, logo_small_url, and favicon_url in the Site Settings." - contact_email_missing: "You haven't provided a contact email for your site. Please update contact_email in the Site Settings." - contact_email_invalid: "The site contact email is invalid. Please update contact_email in the Site Settings." - title_nag: "The title Site Setting is still set to the default value. Please update it with your site's title in the Site Settings." - site_description_missing: "The site_description setting is blank. Write a brief description of this forum in the Site Settings." - consumer_email_warning: "Your site is configured to use Gmail (or another consumer email service) to send email. Gmail limits how many emails you can send. Consider using an email service provider like mandrill.com to ensure email deliverability." - site_contact_username_warning: "The site_contact_username setting is blank. Please update it in the Site Settings. Set it to the username of an admin user who should be the sender of system messages." - notification_email_warning: "The notification_email setting is blank. Please update it in the Site Settings." site_settings: censored_words: "Words that will be automatically replaced with ■■■■" delete_old_hidden_posts: "Auto-delete any hidden posts that stay hidden for more than 30 days." @@ -402,7 +420,6 @@ bs_BA: add_rel_nofollow_to_user_content: "Add rel nofollow to all submitted user content, except for internal links (including parent domains). If you change this, you must rebake all posts with: \"rake posts:rebake\"" post_excerpt_maxlength: "Maximum length of a post excerpt / summary." post_onebox_maxlength: "Maximum length of a oneboxed Discourse post in characters." - onebox_domains_whitelist: "A list of domains to allow oneboxing for; these domains should support OpenGraph or oEmbed. Test them at http://iframely.com/debug" apple_touch_icon_url: "Icon used for Apple touch devices. Recommended size is 144px by 144px." notification_email: "The from: email address used when sending all essential system emails. The domain specified here must have SPF, DKIM and reverse PTR records set correctly for email to arrive." email_custom_headers: "A pipe-delimited list of custom email headers" @@ -441,7 +458,6 @@ bs_BA: redirect_users_to_top_page: "Automatically redirect new and long absent users to the top page." show_email_on_profile: "Show a user's email on their profile (only visible to themselves and staff)" email_token_valid_hours: "Forgot password / activate account tokens are valid for (n) hours." - email_token_grace_period_hours: "Forgot password / activate account tokens are still valid for a grace period of (n) hours after being redeemed." enable_badges: "Enable the badge system" allow_index_in_robots_txt: "Specify in robots.txt that this site is allowed to be indexed by web search engines." email_domains_blacklist: "A list of email domains that users are not allowed to register accounts with. Example: mailinator.com trashmail.net" @@ -603,7 +619,6 @@ bs_BA: embed_whitelist_selector: "CSS selector for elements that are allowed in embeds." embed_blacklist_selector: "CSS selector for elements that are removed from embeds." notify_about_flags_after: "If there are flags that haven't been handled after this many hours, send an email to the contact_email. Set to 0 to disable." - enable_cdn_js_debugging: "Allow /logs to display proper errors by adding crossorigin permissions on all js includes." show_create_topics_notice: "If the site has fewer than 5 public topics, show a notice asking admins to create some topics." prevent_anons_from_downloading_files: "Prevent anonymous users from downloading files. WARNING: this will prevent any site assets posted as attachments from working." errors: @@ -629,7 +644,7 @@ bs_BA: most_recent_poster: "Posljednji Autor" frequent_poster: "Čest Autor" redirected_to_top_reasons: - new_user: "Dobrodošli na Revolucionar! Ovo su najnovije popularne teme." + new_user: "Dobrodošli u našu zajednicu! Ovo su najnovije popularne teme." not_seen_in_a_month: "Dobrodošli nazad! Nismo vas odavno vidjeli. Ovo su najnovije popularne teme od vaše zadnje posjete." change_owner: post_revision_text: "Ownership transferred from %{old_user} to %{new_user}" @@ -683,7 +698,7 @@ bs_BA: > > %{topic_excerpt} - na Revolucionar.com + na > %{site_title} -- %{site_description} @@ -691,9 +706,9 @@ bs_BA: %{invite_link} - Ova pozivnica dolazi od člana koji je zaslužio povjerenje na našem sajtu te smo mu/joj omogućili opciju slanja pozivnica. Što vama kao zvanici daje mogućnost da odgovorite na diskusiju bez registracije. + Ova pozivnica dolazi od člana koji je zaslužio povjerenje na našem sajtu, što vama kao zvanici daje mogućnost da odmah odgovorite na diskusiju. invite_forum_mailer: - subject_template: "%{invitee_name} vas poziva na novu socijalnu mrežu Revolucionar.com" + subject_template: "%{invitee_name} vas poziva da se pridružite %{site_domain_name}" invite_password_instructions: subject_template: "Set password for your %{site_name} account" test_mailer: @@ -715,17 +730,19 @@ bs_BA: deferred_and_deleted: "Thanks for letting us know. We've removed the post." system_messages: welcome_user: - subject_template: "Dobrodošli na Revolucionar.com!" + subject_template: "Dobrodošli na %{site_name}!" text_body_template: | - Hvala što ste se pridružili Revolucionaru, dobrodošli! + Hvala što ste se pridružili %{site_name}, dobrodošli! %{new_user_tips} Mi vjerujemo u [civilizovanu diskusiju](%{base_url}/guidelines) na svakom nivou u svako doba. Uživajte! + + (Ako trebate razgovarati s nekim od [članova osoblja](%{base_url}/about) kao novi korisnik, samo odgovorite na ovu poruku.) welcome_invite: - subject_template: "Dobrodošli na Revolucionar.com!" + subject_template: "Dobrodošli na %{site_name}!" text_body_template: | Hvala vam što ste primili pozivnicu na %{site_name} -- dobrodošli! @@ -748,27 +765,10 @@ bs_BA: subject_template: "Backup completed successfully" backup_failed: subject_template: "Backup failed" - text_body_template: | - The backup has failed. - - Here's the log: - - ``` - %{logs} - ``` restore_succeeded: subject_template: "Restore completed successfully" - text_body_template: "The restore was successful." restore_failed: subject_template: "Restore failed" - text_body_template: | - The restore has failed. - - Here's the log: - - ``` - %{logs} - ``` bulk_invite_succeeded: subject_template: "Bulk user invite processed successfully" text_body_template: "Your bulk user invite file was processed, %{sent} invites mailed." @@ -797,8 +797,6 @@ bs_BA: subject_template: "Email issue -- No Account" email_reject_empty: subject_template: "Email issue -- No Content" - email_reject_parsing: - subject_template: "Email issue -- Content unrecognized" email_reject_reply_key: subject_template: "Email issue -- Bad Reply Key" email_error_notification: @@ -835,13 +833,7 @@ bs_BA: subject_template: "[%{site_name}] [PM] %{topic_title}" digest: why: "Ukratko šta se dešavalo na %{site_link} od vaše zadnje posjete %{last_seen_at}." - new_activity: "Nove aktivnosti ba vašim temama i postovima:" - top_topics: "Popularni postovi" - other_new_topics: "Popularne teme" click_here: "klikni ovdje" - read_more: "Pročitaj Više" - more_topics: "Postoji %{new_topics_since_seen} drugih novih tema otkako ste nas zadnji put posjetili %{last_seen_at}." - more_topics_category: "Postoji %{new_topics_since_seen} drugih novih tema u ovim kategorijama otkako ste nas zadnji put posjetili %{last_seen_at}:" forgot_password: subject_template: "[%{site_name}] Obnova Šifre" text_body_template: | @@ -896,7 +888,7 @@ bs_BA: popular_topics: "Popularne" recent_topics: "Nove" see_more: "Više" - search_title: "Pretraži Revolucionar" + search_title: "Pretraži stranicu" search_google: "Google" login_required: welcome_message: | diff --git a/config/locales/server.cs.yml b/config/locales/server.cs.yml index dcc81ec1065..e441ff8c96e 100644 --- a/config/locales/server.cs.yml +++ b/config/locales/server.cs.yml @@ -15,9 +15,14 @@ cs: short: "%-d. %-m. %Y" short_no_year: "%-d. %B" date_only: "%-d %B %Y" + long: "%B %-d, %Y, %l:%M%P" date: month_names: [null, ledna, února, března, dubna, května, června, července, srpna, září, října, listopadu, prosince] <<: *datetime_formats + time: + am: "am" + pm: "pm" + <<: *datetime_formats title: "Discourse" topics: "Témata" posts: "příspěvky" @@ -26,6 +31,9 @@ cs: log_in: "Přihlásit se" disable_remote_images_download_reason: "Stahování obrázků z cizích serverů bylo vypnuto protože na disku není dostatek místa." anonymous: "Anonymní" + emails: + incoming: + default_subject: "Příchozí email z %{email}" errors: &errors format: '%{attribute} %{message}' messages: @@ -45,7 +53,6 @@ cs: has_already_been_used: "již byl použit" inclusion: není zahrnutý v seznamu invalid: je neplatný - is_invalid: "je neplatný; zkus být trochu více popisný" less_than: musí být menší než %{count} less_than_or_equal_to: musí být menší nebo roven %{count} not_a_number: není číslo @@ -82,8 +89,6 @@ cs: max_username_length_exists: "Nemůžeš nastavit délku maximální uživatelského jména kratší než je nejdelší uživatelské jméno. " max_username_length_range: "Nemůžeš nastavit maximum pod minimum." default_categories_already_selected: "Nemůžeš vybrat kategorii používanou v jiném seznamu." - bulk_invite: - file_should_be_csv: "Nahraný soubrou by měl být ve formátu csv nebo txt." backup: operation_already_running: "Právě probíhá operace %{operation}. V tuto chvíli nelze zahájit novou operaci %{operation}." backup_file_should_be_tar_gz: "Záloha by měla být archiv s příponou .tar.gz." @@ -91,6 +96,8 @@ cs: not_logged_in: "Na tuto akci musíte být přihlášení." not_found: "Žádaná URL adresa nebo zdroj nelze najít." read_only_mode_enabled: "Tato stránka je v režimu jen pro čtení. Interakce jsou zakázány." + reading_time: "Čas čtení" + likes: "Líbí se" too_many_replies: one: "Je nám líto, ale noví uživatelé jsou dočasně omezeni na 1 odpověď v tématu." few: "Je nám líto, ale noví uživatelé jsou dočasně omezeni na %{count} odpovědi v tématu." @@ -110,11 +117,12 @@ cs: one: "1 reakce" few: "%{count} reakce" other: "%{count} reakcí" + no_mentions_allowed: "Bohužel, nemůžete zmiňovat ostatní uživatele." + no_mentions_allowed_newuser: "Bohužel, noví uživatelé nemohou zmiňovat ostatní uživatele." spamming_host: "Bohužel, na tento server nemůžete odkazovat." user_is_suspended: "Vyloučení uživatelé nemohou přidávat příspěvky." just_posted_that: "je příliš podobný vašemu příspěvku z poslední doby" invalid_characters: "obsahuje neplatné znaky" - is_invalid: "je neplatné; zkuste se vyjádřit více popisně" next_page: "další strana →" prev_page: "← předchozí strana" page_num: "Strana %{num}" @@ -554,8 +562,6 @@ cs: github_config_warning: 'Server je nakonfigurován, aby povoloval registraci a přihlášení přes GitHub (enable_github_logins), ale nejsou nastaveny hodnoty "client id" a "secret". Navštivte nastevení webu a opravte nastavení. Pro více informací si přečtěte tento návod.' s3_config_warning: 'Server je nakonfigurován, aby nahrával soubory na S3, ale chybí nastavení: s3_access_key_id, s3_secret_access_key nebo s3_upload_bucket. Navštivte nastavení webu a opravte nastavení. Přečtěte si "How to set up image uploads to S3?" pro více informací.' image_magick_warning: 'Server je nakonfigurován, aby vytvářel náhledy velkých obrázků, ale není nainstalován ImageMagick. Nainstalujte ImageMagick pomocí vašeho oblíbeného balíčkovače, nebo navštivte web ImageMagick pro stažení aktuální verze.' - contact_email_invalid: "Kontaktní email je neplatný. Prosím, aktualizujte položku contact_email v Nastavení webu." - consumer_email_warning: "Váš web je nastaven, aby používal Gmail (nebo jinou uživatelskou emailovou službu) k odesílání emailů. Gmail limituje počet emailů, které můžete odeslat. Zvažte použití jiného emailového poskytovatele, jako je třeba mandrill.com k zajištění doručitelnosti emailů." site_settings: default_locale: "Výchozí jazyk této Discourse instance (kód ve formátu ISO 639-1)" allow_user_locale: "Povolit uživatelům nastavit si jazyk fóra" @@ -703,12 +709,7 @@ cs: user_posted_pm: subject_template: "[%{site_name}] [PM] %{topic_title}" digest: - new_activity: "Nová aktivita ve vašich tématech a příspěvcích:" - top_topics: "Populární příspěvky" - other_new_topics: "Populární témata" click_here: "klikněte zde" - read_more: "Číst dále" - more_topics_category: "Více nových témat:" forgot_password: subject_template: "[%{site_name}] Obnovení hesla" text_body_template: | @@ -782,12 +783,56 @@ cs: title: "Podmínky používání" privacy_topic: title: "Ochrana soukromí" + badges: + admired: + name: Obdivovaný admin_login: success: "E-mail odeslán" error: "Chyba!" submit_button: "Odeslat e-mail" - time: - <<: *datetime_formats + wizard: + step: + privacy: + title: "Přístup" + corporate: + fields: + company_short_name: + label: "Název společnosti (krátký)" + placeholder: "Initech" + company_full_name: + label: "Název společnosti (plný)" + placeholder: "Initech, s.r.o." + company_domain: + placeholder: "initech.cz" + colors: + title: "Téma" + logos: + title: "Loga" + fields: + logo_url: + label: "Primární loga" + icons: + title: "Ikony" + fields: + favicon_url: + label: "Malá ikona" + apple_touch_icon_url: + label: "Velká ikona" + homepage: + title: "Domovská stránka" + fields: + homepage_style: + choices: + latest: + label: "Nejnovější témata" + categories: + label: "Kategorie" + emoji: + title: "Smajlíky :)" + invites: + title: "Pozvi redakci" + finished: + title: "Váš Discourse je připraven!" activemodel: errors: <<: *errors diff --git a/config/locales/server.da.yml b/config/locales/server.da.yml index 445d0a50642..433bc8bc38d 100644 --- a/config/locales/server.da.yml +++ b/config/locales/server.da.yml @@ -18,14 +18,38 @@ da: date: month_names: [null, Januar, Februar, Marts, April, Maj, Juni, Juli, August, September, Oktober, November, December] <<: *datetime_formats + time: + am: "am" + pm: "pm" + <<: *datetime_formats title: "Discourse" topics: "Emner" posts: "indlæg" loading: "Indlæser" powered_by_html: 'Siden er lavet med Discourse, opleves bedst med JavaScript slået til' log_in: "Log ind" + purge_reason: "Automatisk slettet som forladt, deaktiveret konto" disable_remote_images_download_reason: "Fjerndownload af billeder deaktiveret grundet utilstrækkelig diskplads" anonymous: "Anonym" + emails: + incoming: + default_subject: "Indgående email fra %{email}" + show_trimmed_content: "Vis trimmet indhold" + maximum_staged_user_per_email_reached: "Maksimalt antal af brugere oprettet pr. email." + errors: + empty_email_error: "Dette sker når den rå email der modtages er tom." + no_message_id_error: "Dette sker når emailen ikke har nogen 'Message-Id' header." + no_body_detected_error: "Dette sker når vi ikke kunne trække noget indhold ud og der heller ikke var nogen vedhæftninger." + inactive_user_error: "Dette sker når afsenderen ikke er aktiv." + blocked_user_error: "Dette sker når afsenderen er blevet blokeret." + bad_destination_address: "Dette sker når ingen af email adresserne i To/Cc/Bcc felterne matcher en opsat indgående email adresse." + strangers_not_allowed_error: "Dette sker når en bruger prøver at oprette et nyt emne i en kategori som de ikke er medlem af." + insufficient_trust_level_error: "Dette sker når en bruger prøvede at oprette et nyt emne i en kategori som de ikke har den krævne \"trust level\" til." + reply_user_not_matching_error: "Dette sker når et svar kom fra en anden email adresse end den notifikationen blev sendt til." + topic_not_found_error: "Dette sker når et svar er kommet, men det relaterede emne er blevet slettet." + topic_closed_error: "Dette sker når et svar er kommet, men det relaterede emne er blevet lukket." + bounced_email_error: "Emailen er en \"bounced email\" rapport" + screened_email_error: "Dette sker når afsenderens email adresse allerede er screenet." errors: &errors format: '%{attribute} %{message}' messages: @@ -45,7 +69,6 @@ da: has_already_been_used: "er allerede blevet brugt" inclusion: er ikke inkluderet i listen invalid: er ikke gyldig - is_invalid: "er ugyldig; prøv at være mere beskrivende" less_than: skal være mindre end %{count} less_than_or_equal_to: skal være mindre end eller lig med %{count} not_a_number: er ikke et nummer @@ -79,8 +102,6 @@ da: 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: operation_already_running: "Der kører allerede en %{operation}. Kan ikke starte et nyt %{operation} job lige nu." backup_file_should_be_tar_gz: "Backup filen skal være et .tar.gz arkiv." @@ -89,6 +110,8 @@ da: not_found: "Den anmodede URL eller ressource kunne ikke findes." invalid_access: "Du har ikke tilladelse til at se den anmodede ressource." read_only_mode_enabled: "Forummet er i \"kun læsning\" tilstand. Interaktioner er deaktiverede." + reading_time: "Læsetid" + likes: "Synes godt om" too_many_replies: one: "Beklager, men nye brugere kan kun skrive 1 svar i hvert emne til at starte med." other: "Beklager, men nye brugere kan kun skrive %{count} svar i hvert emne til at starte med." @@ -105,12 +128,31 @@ da: replies: one: "1 svar" other: "%{count} svar" + no_mentions_allowed: "Beklager, du kan ikke nævne andre brugere." + too_many_mentions: + one: "Beklager, men du kan kun nævne %{count} brugere i et indlæg." + other: "Beklager, men du kan kun nævne %{count} brugere i et indlæg." + no_mentions_allowed_newuser: "Beklager, nye brugere kan ikke nævne andre brugere." + too_many_mentions_newuser: + one: "Beklager, nye brugere kan kun nævne en bruger i et indlæg." + other: "Beklager, nye brugere kan kun nævne %{count} brugere i et indlæg." + no_images_allowed: "Beklager, nye brugere kan ikke postere billeder i indlæg." + too_many_images: + one: "Beklager, nye brugere kan kun anvende et billede i et indlæg." + other: "Beklager, nye brugere kan kun anvende %{count} billeder i et indlæg." + no_attachments_allowed: "Beklager, nye brugere kan ikke vedhæfte filer i et indlæg." + too_many_attachments: + one: "Beklager, nye brugere kan kun vedhæfte en fil i et indlæg." + other: "Beklager, nye brugere kan kun vedhæfte %{count} filer i et indlæg." + no_links_allowed: "Beklager, nye brugere kan ikke bruge links i indlæg." + too_many_links: + one: "Beklager, nye brugere kan kun indsætte et link i et indlæg." + other: "Beklager, nye brugere kan kun indsætte %{count} links i et indlæg." spamming_host: "Beklager, du kan ikke indsætte et link til det pågældende domæne." user_is_suspended: "Suspenderede brugere tilllades ikke at oprette indlæg." topic_not_found: "Der er gået noget galt. Måske er emnet blevet lukket eller slettet mens du kiggede på det?" just_posted_that: "ligner et andet indlæg, som du har skrevet for nyligt, for meget" invalid_characters: "indeholder ugyldige tegn" - is_invalid: "er ugyldig; prøv at være mere beskrivende" next_page: "næste side →" prev_page: "← forrige side" page_num: "Side %{num}" @@ -126,14 +168,27 @@ da: rss_description: latest: "Seneste emner" hot: "Populære emner" + top: "Populære emner" posts: "Seneste indlæg" + private_posts: "Seneste private beskeder" + group_posts: "Seneste indlæg fra %{group_name}" + group_mentions: "Seneste nævnelser fra %{group_name}" + user_posts: "Seneste indlæg af @%{username}" + user_topics: "Sidste emner af @%{username}" + tag: "Markerede emner" too_late_to_edit: "Dette indlæg er gammelt og kan ikke længere redigeres eller slettes." + revert_version_same: "Den nuværende udgave er den samme udgave/version som den du prøver at vende tilbage til." 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" member_already_exist: "'%{username}' er allerede medlem af denne gruppe." + invalid_domain: "'%{domain}' er ikke et gyldigt domæne." + invalid_incoming_email: "'%{email}' er ikke en gyldig email adresse." + email_already_used_in_group: "'%{email}' er allerede brugt af en bruger i gruppen '%{group_name}'." + email_already_used_in_category: "'%{email}' er allerede brugt af en bruger i kategorien '%{category_name}'." default_names: everyone: "Alle" admins: "admins" @@ -148,6 +203,14 @@ da: until_posts: one: "indlæg" other: "%{count} indlæg" + new-topic: | + Velkommen til %{site_name} — **Tak fordi du starter en ny samtale!** + + - Lyder title interessant hvis du læser den højt? Er det et godt resumé? + - Hvem ville være interesseret i dette? Hvorfor er det vigtigt? Hvilken type svar ønsker du? + - Inkludér relevante ord i dit emne så andre kan *finde* det. For at gruppere dit emne med relaterede emner, så vælg en kategori. + + For mere info, [se vores retningslinjer](/guidelines). Dette panel vil kun vises første gang for %{education_posts_text}. new-reply: | Velkommen til %{site_name} — **tak for at du deltager i samtalen!** @@ -168,6 +231,14 @@ da: 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! + sequential_replies: | + ### Overvej at svare på flere indlæg på en gang + + Istedet for at lave mange små individuelle kommentarer, overvej at lave et enkelt svar som inkluderer "citater" fra tidligere indlæg eller ved at nævne andre brugere med et @. + + Benyt et citat fra et tidligere svar ved at markere den ønskede tekst og herefter vælge opret citat knappen som vises. + + Det er nemmere for alle at læse om emner som har færre svar som går i dybden, end mange små individuelle svar. dominating_topic: | ### Lad andre deltage i samtalen @@ -190,6 +261,8 @@ da: attributes: category: name: "Kategorinavn" + topic: + title: 'Titel' post: raw: "Brødtekst" user_profile: @@ -215,6 +288,9 @@ da: attributes: hex: invalid: "er ikke en gyldig fave" + post_reply: + base: + different_topic: "Indlæg og svar skal tilhøre samme emne." <<: *errors user_profile: no_info_me: "
" @@ -225,14 +301,41 @@ da: meta_category_description: "Diskussion om dette site, hvordan det er indrettet, hvordan det virker og hvordan vi kan forbedre det." staff_category_name: "Staff" staff_category_description: "Privat gruppe for staff diskussioner. Emner er kun synlige for administratorer og moderatorer." + assets_topic_body: "Dette er et permanent emne, kun synlig for Staff, til at gemme billeder og filer som bruges til Site designet. Slet ikke dette emne!\n\n\nSådan virker det:\n\n\n1. Svar dette emne.\n2. Upload alle billeder som du ønsker at bruge til logoer, favicons etc her. (Brug upload ikonet i værktøjslinjen eller drag n drop billederne.)\n3. Send dit svar for at indsende det.\n4. Højreklik på billederne i dit svar for at se stien til de uploadede billeder, eller klik på ikonet for at redigere dit indlæg og find stierne til billederne der. Kopier billedestierne.\n5. Indsæt disse billedestier i [basic settings](/admin/site_settings/category/required).\n\n\nHvis du har brug for at tillade flere filtyper, så kan du redigere `authorized_extensions` i [file settings](/admin/site_settings/category/files)." lounge_welcome: title: "Velkommen i loungen" + body: |2 + + Tillykke! :confetti_ball: + + Hvis du kan se dette er du nu vlevet opgraderet som **regular** (trust level 3) bruger. + + Nu kan du … + + * Rediger enhver emne titel + * Ændre alle kategorier og emner + * Følge alle links ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) ier fjernet) + * Få adgang til en privat lounge kategori kun synlig for brugere med Trust LEvel 3, eller højere + * Gemme spam - med et enkelt flag + + Her er [current list of fellow regulars](/badges/3/regular). Sving forbi og hils på! + + Tak fordi du er en vigtig del af dette fællesskab! + + (Formere information om Trust Levels [see this topic][trust]. Bemærk venligst at kun brugere der vedbliver at leve op til Trust Level betingelserne, vil have fortsat adgang) + + [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "Kategoridefinition for %{category}" + replace_paragraph: "(Beskriv din nye kategori her. Beskriv ramme og formål med kategori således at det er tydeligt for andre. Forsøg at holde beskrivelsen på max 200 tegn. **Kategorien vil ikke fremgå på kategori listen, før du har redigeret beskrivelsen, eller oprettet emner)." + post_template: "%{replace_paragraph}\n\nBrug de følgende afsnit for en længere beskrivelse, eller introducere kategorien:\n\n- Hvorfor skal man anvende denne kategori? Hvad er formålet?\n\n- Hvordan er kategorien anderledes end de eksisterende kategorier?\n\n- Hvad skal emner i denne kategori indeholde?\n\n- Behøver vi denne kategori? Kan vi ikke flette indholdet ind i en eksisterende kategori, eller subkategori?\n" errors: uncategorized_parent: "Ukategoriserede kan ikke have en overordnede kategori" self_parent: "En underkategori kan ikke være sin egen overordnede kategori." depth: "Du kan ikke indlejre en underkategori i en anden underkategori." + invalid_email_in: "'%{email}' er ikke en gyldig email adresse." + email_already_used_in_group: "'%{email}' anvendes allerede af gruppen '%{group_name}'." + email_already_used_in_category: "'%{email}' bruges allerede af kategorien '%{category_name}'." cannot_delete: uncategorized: "Kan ikke slette Ukategoriseret" has_subcategories: "Kan ikke slette denne kategori, fordi den har under kategorier." @@ -240,17 +343,36 @@ da: one: "Kan ikke slette denne kategori, da den indeholder et emne. Ældste emne er %{topic_link}" other: "Kan ikke slette denne kategori, da den indeholder %{count} emner. Ældste emne er %{topic_link}" topic_exists_no_oldest: "Kan ikke slette denne kategori fordi antallet af emner er %{count}" + uncategorized_description: "Emner der ikke behøver kategori, eller ikke passer i eksisterende kategori." trust_levels: newuser: title: "ny bruger" basic: title: "basis-bruger" + member: + title: "bruger" + regular: + title: "Trofast" + leader: + title: "Veteran" + change_failed_explanation: "Du har forsøgt at degradere %{user_name} til '%{new_trust_level}'. Imidlertid er deres niveau af tillid allerede '%{current_trust_level}'. %{user_name} vil forblive'%{current_trust_level}' - hvis du ønsker at degradere brugeren, skal du først låse brugerens tillids niveau / Trust Level" rate_limiter: slow_down: "Du har udført denne handling for mange gange, prøv igen senere" too_many_requests: "Vi har en daglig grænse for hvor mange gange den pågældende handling kan udføres. Vent venligst %{time_left} før du prøver igen." by_type: + first_day_replies_per_day: "Du har nået det maksimalt antal tilladte svar, en ny bruger kan lave på deres første dag. Vent venligst %{time_left} før du fortsætter med at besvare tanker og indlæg." + first_day_topics_per_day: "Du har nået det maksimalt antal af tilladte emner, en ny bruger kan lave på første dag.\nVent venligst %{time_left} før du prøver igen." create_topic: "Du opretter emner for hurtigt. Vent venligst %{time_left} før du prøver igen." create_post: "Du svarer for hurtigt. Vent venligst %{time_left} før du prøver igen." + delete_post: "Du sletter emner for hurtigt. Vent venligst %{time_left}før du prøver igen." + topics_per_day: "Du har nået det maksimalt antal tilladte nye emner i dag. Venligst vent %{time_left} før du prøver igen." + pms_per_day: "Du har nu nået det maksimalt antal tilladte beskeder. Vent venligst %{time_left} før du prøver igen." + create_like: "Du har nået grænsen for antal tilladte 'likes' for i dag. Vent venligst %{time_left} før du prøver igen." + create_bookmark: "Du har nået det maksimalt antal tilladte bogmærker i dag. Vent venligst %{time_left} før du prøver igen. " + edit_post: "Du har nået det maksimalt antal tilladte redigeringer i dag. Vent venligst %{time_left} før du prøver igen." + live_post_counts: "Du efterspørger udgivede emner for hurtigt. Vent venligst %{time_left} før du prøver igen." + unsubscribe_via_email: "Du har nået det maksimalt antal tilladte afmeldinger via email i dag. Vent venligst%{time_left} før du prøver igen." + topic_invitations_per_day: "Du har nået det maksimalt antal tilladte emne invitationer i dag. Vent venligst %{time_left} før du prøver igen." hours: one: "1 time" other: "%{count} timer" @@ -345,6 +467,11 @@ da: confirmed: "Din e-mail-adresse er opdateret." please_continue: "Fortsæt til %{site_name}" error: "Der opstod en fejl under opdateringen af din e-mail-adresse. Måske er adressen allerede i brug?" + error_staged: "Der opstod en fejl under opdateringen af din e-mail-adresse. Måske er adressen allerede i brug?" + already_done: "Beklager, linket er ikke længere gyldigt - har du ændret din emal adresse?" + authorizing_old: + title: "Tak fordi du bekræftede din email adresse!" + description: "Vi sender nu en ny email der skal verificeres." activation: action: "Klik her for at aktivere din konto" already_done: "Beklager, dette bekræftelses-link er ikke længere gyldigt. Måske er din konto allerede aktiv?" @@ -352,6 +479,7 @@ da: continue_button: "Fortsæt til %{site_name}" welcome_to: "Velkommen til %{site_name}!" approval_required: "En moderator skal godkende din nye konto før du kan tilgå forummet. Du får en e-mail, når din konto er godkendt!" + missing_session: "Vi kan ikke se om din konto blev oprettet, venligst tjek at cookies er accepteret." post_action_types: off_topic: title: 'Uden for emnet' @@ -368,11 +496,16 @@ da: description: 'Dette indlæg har indhold som en rimelig person ville opfatte som stødende, udtryk for misbrug eller som et brud på vores sammenholds retningslinjer.' long_form: 'markerede dette som stødende' notify_user: + title: 'Send @{{username}} en besked' + description: 'Jeg ønsker at tale med denne person direkte om vedkommendes indlæg' long_form: 'sendt besked til brugeren' email_title: 'Dit indlæg i "%{title}"' email_body: "%{link}\n\n%{message}" notify_moderators: title: "Noget andet" + description: 'Dette indlæg kræver moderatorernes opmærksomhed baseret på Den Gode Tone, Brugerbetingelser eller en anden grund, som ikke er nævnt ovenfor.' + long_form: 'Har flagged dette overfor administrator' + email_title: 'Et indlæg i "%{title}" afkræver stillingtagen hos administrator' email_body: "%{link}\n\n%{message}" bookmark: title: 'Bogmærk' @@ -393,9 +526,11 @@ da: long_form: 'markerede dette som spam' inappropriate: title: 'Upassende' + description: 'Dette emne har indlæg som en fornuftig person finder stødende, krænkende, eller som er i modstrid med Den Gode Tone.' long_form: 'markeret upassende' notify_moderators: title: "Noget andet" + description: 'Dette emne kræver moderatorernes opmærksomhed baseret på Den Gode Tone, Brugerbetingelser eller en anden grund, som ikke er nævnt ovenfor.' long_form: 'markerede dette til gennemsyn' email_title: 'Emnet "%{title}" kræver moderator-opmærksomhed' email_body: "%{link}\n\n%{message}" @@ -410,6 +545,28 @@ da: 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." + unsubscribed: + title: "Frameldt!" + description: "Du er blevet frameldt. For at ændre i dine email settings besøg din profil." + topic_description: "For at følge %{link}, brug notifikationsindstillinger i bunden, eller til højre for emnet." + unsubscribe: + title: "Frameld" + stop_watching_topic: "Følg ikke længere dette emne, %{link}" + mute_topic: "Nulstil alle notifikationer for dette emne/indlæg, %{link}" + unwatch_category: "Følg ikke længere disse emner i %{category}" + mailing_list_mode: "Sluk mailing list modus" + disable_digest_emails: "Send mig ikke længere opsummerende emails" + all: "Send ikke email fra %{sitename} til mig" + different_user_description: "Du er i øjeblikket logget ind som en anden bruger, end den vi har emailet. Venligst log ud, eller gå i anonym modus, og prøv igen" + not_found_description: "Beklager, men vi kunne ikke finde denne afmeldelse. Er det muligt at linket i emailen er udløbet?" + log_out: "Log ud" + user_api_key: + title: "Autoriser venligst at applikationen kan få adgang" + authorize: "Autoriser" + read: "læst" + read_write: "læs/skriv" + no_trust_level: "Beklager, du har ikke adgang til brugerens API" + generic_error: "Beklager, vi er ikke i stand til at give dig API nøgler, denne funktionalitet er muligvis bestemt af sitets administrator" reports: visits: title: "Brugerbesøg" @@ -493,35 +650,55 @@ da: page_view_anon_reqs: title: "Anonym" xaxis: "Dag" + yaxis: "Anonyme Sidevisninger" page_view_logged_in_reqs: title: "Logget ind" xaxis: "Dag" + yaxis: "Logged in Sidevisninger" page_view_crawler_reqs: title: "Web Crawlers" xaxis: "Dag" + yaxis: "Web Crawler Sidevisninger" page_view_total_reqs: title: "Total" xaxis: "Dag" + yaxis: "Totalt antal Sidevisninger" page_view_logged_in_mobile_reqs: + title: "Logged in Sidevisninger" xaxis: "Dag" + yaxis: "Sidevisninger fra mobile enheder" page_view_anon_mobile_reqs: + title: "Anonyme Sidevisninger" xaxis: "Dag" + yaxis: "anonyme mobile sidevisninger" http_background_reqs: title: "Baggrund" xaxis: "Dag" + yaxis: "Brugte anmodninger for live opdateringer og tracking" http_2xx_reqs: + title: "Status 2xx (OK)" xaxis: "Dag" + yaxis: "Succesfulde anmodninger (Status 2xx)" http_3xx_reqs: + title: "HTTP 3xx (Redirect)" xaxis: "Dag" + yaxis: "Redirect anmodninger (Status 3xx)" http_4xx_reqs: + title: "HTTP 4xx (Client Error)" xaxis: "Dag" + yaxis: "Client Errors (Status 4xx)" http_5xx_reqs: + title: "HTTP 5xx (Server Error)" xaxis: "Dag" + yaxis: "Server Fejl (Status 5xx)" http_total_reqs: title: "Total" xaxis: "Dag" + yaxis: "Total antal anmodninger" time_to_first_response: + title: "Time to first response" xaxis: "Dag" + yaxis: "Gennemsnitlig tid (timer)" topics_with_no_response: title: "Emner uden svar" xaxis: "Dag" @@ -535,45 +712,156 @@ da: host_names_warning: "Filen config/database.yml bruger localhost som værtsnavn. Opdatér den med sitets værtsnavn." gc_warning: 'Din server bruger Rubys standard garbage collection, hvilket ikke giver dig den bedste performance. Læs dette emne om performance-tuning: Tuning Ruby and Rails for Discourse.' sidekiq_warning: 'Sidekiq kører ikke. Mange opgaver, som f.eks. udsendelse af e-mail, afvikles asynkront af sidekiq. Du skal sikre dig at der kører mindst én sidekiq-proces. Læs mere om Sidekiq her.' + queue_size_warning: 'Antallet af job i kø er %{queue_size}, hvilket er højt. Dette kunne indikere at der er et problem med Sidekiq processerne, eller du behøver at tilføre flere Sidekiq resurser.' memory_warning: 'Din server kører med mindre end 1 GB samlet hukommelse. Det anbefales at have mindst 1 GB hukommelse.' + google_oauth2_config_warning: 'Serveren er konfigureret til at tillade signup med Google OAuth2 (enable_google_oauth2_logins),men klient id og klientens skjulte værdier er ikke indstillet. Gå tilthe Site Settings og opdater! Se denne guide for at lære mere.' facebook_config_warning: 'Serveren er konfigureret til at tillade tilmelding og login med Facebook (enable_facebook_logins), men app id og app secret værdierne er ikke angivet. Gå til indstillinger og opdatér indstillingerne. Se denne vejledning for mere information.' twitter_config_warning: 'Serveren er konfigureret til at tillade tilmelding og login med Twitter (enable_twitter_logins), men key og secret værdierne er ikke angivet. Gå til indstillinger og opdatér indstillingerne. Se denne vejledning for mere information.' github_config_warning: 'Serveren er konfigureret til at tillade tilmelding og login med GitHub (enable_github_logins), men client id og secret værdierne er ikke angivet. Gå til indstillinger og opdatér indstillingerne. Se denne vejledning for mere information.' s3_config_warning: 'Serveren er konfigureret til at uploade filer til s3, men mindst én af følgende indstillinger er ikke angivet: s3_access_key_id, s3_secret_access_key eller s3_upload_bucket. Gå til indstillinger og opdatér indstillingerne. Se "How to set up image uploads to S3?" for mere information.' image_magick_warning: 'Serveren er konfigureret til at lave thumbnails af store billeder, men ImageMagick er ikke installeret. Installér ImageMagick med din foretrukne package manager eller download den seneste udgave.' - consumer_email_warning: "Dit site er konfigureret til at bruge Gmail (eller en anden offentlig e-mail-tjeneste) til at sende e-mail. Gmail har en grænse for, hvor mange mails du kan sende. Overvej at bruge en e-mail-udbyder som mandrill.com for at sikre at din mail bliver leveret." + failing_emails_warning: 'Der er %{num_failed_jobs} email operationer der mislykkede. Tjek din app.yml for at sikre at din mail server indstillinger er korrekte. Se mislykkede operationer i Sidekiq.' + subfolder_ends_in_slash: "Din undermappe er ikke opsat korrekt; DISCOURSE_RELATIVE_URL_ROOT ender med en slash." + email_polling_errored_recently: + one: "Email afstemning har afstedkommet en fejl i de seneste 24 timer. Venligst se the logs for detaljer." + other: "Email afstemning har afstedkommet %{count} fejl i de seneste 24 timer. Se venligst the logs for detaljer." + missing_mailgun_api_key: "Serveren er konfigureret til at sende emails via Mailgun, men der er ikke indtastet en API nøgle som bruges til at verificere webhook beskederne." + bad_favicon_url: "Favicon kan ikke loades. Tjek dine favicon_url indstilling i Site Settings" + poll_pop3_timeout: "Forbindelsen til til POP3 serveren er udløbet. Indkomne mail kunne ikke hentes. Venligst tjek POP3 settings og udbyderen." + poll_pop3_auth_error: "Forbindelsen til POP3 serveren melder fejl. Venligst tjek POP3 settings." site_settings: + censored_words: "Ord der automatisk vil blive erstattet med ■■■■" + delete_old_hidden_posts: "Slet automatisk skjulte indlæg der forbliver skjulte i mere end 30 dage." default_locale: "Standardsproget for denne Discourse-instans (ISO 639-1 kode)." + allow_user_locale: "Tillad brugere at vælge egne sprog præferencer på site" + set_locale_from_accept_language_header: "set interface language for anonymous users from their web browser's language headers. (EXPERIMENTAL, does not work with anonymous cache)" min_post_length: "Minimumlængde tilladt for indlæg i tegn" + min_first_post_length: "Minimum tilladte antal tegn (i emne felt) i første indlæg" + min_private_message_post_length: "Minimumlængde tilladt for indlæg i tegn" max_post_length: "Maksimal længde af indlæg i tegn" min_topic_title_length: "Minimumslængde af emnetitel i tegn." max_topic_title_length: "Maksimumslængde af emnetitel i tegn." + min_private_message_title_length: "Minimumslængde af emnetitel i tegn." + min_search_term_length: "Antal tegn i søgefeltet skal have et minimum" + search_tokenize_chinese_japanese_korean: "Tving søg til at \"tokenize\" Chinese/Japanese/Korean selv på sites som ikke er CJK" + search_prefer_recent_posts: "Såfremt søgning på forum er langsomt, kan denne option indeksere og vise nyeste indlæg først" + search_recent_posts_size: "Hvor mange nye indlæg skal der gemmes i index" + allow_uncategorized_topics: "Tillad at emner kan oprettes uden et kategori. ADVARSEL: Hvis der er nogen ikke-kategoriserede emner, skal du først kategorisere dem inden du deaktiverer dette." + allow_duplicate_topic_titles: "Tillad emner med identiske titler ." unique_posts_mins: "Hvor mange minutter der skal gå før en bruger kan skrive et indlæg med det samme indhold igen." + educate_until_posts: "When the user starts typing their first (n) new posts, show the pop-up new user education panel in the composer." + title: "Sitets navn, som anvendt i tittel." + site_description: "Beskriv denne side i én sætning, som anvendt i meta beskrivelsen." + contact_email: "Email adresse på ansvarlig kontaktperson for denne side. Anvendes til kritiske notifikationer som ubehandlede flag, og hastende sager." + contact_url: "Kontakt URL for denne side. Anvendt på kontakt admin, i tilfælde af hastesager." queue_jobs: "KUN FOR UDVIKLERE! ADVARSEL! Brug sidekiq som jobkø. Hvis dette slås fra går dit site i stykker." + crawl_images: "Hent billeder fra eksterne URLs for at indsætte de korrekte bredde og højde dimensioner." + download_remote_images_to_local: "Konverter eksterne billeder til lokale billeder ved at downloade dem; dette forebygger at billeder ikke forsvinder." + download_remote_images_threshold: "Minimum hukommelse påkrævet på drev for at downloade billeder lokalt (i procent)" + download_remote_images_max_days_old: "Undlade at downloade billeder til indlæg der er mere end n dage gamle." + disabled_image_download_domains: "Eksterne billeder vil ikke blive hentet fra disse domæner. Afgrænset liste." + editing_grace_period: "For (n) sekunder efter postering, vil redigering ikke skabe et nyt indlæg." + post_edit_time_limit: "The author can edit or delete their post for (n) minutes after posting. Set to 0 for forever." + edit_history_visible_to_public: "Tillad alle at se tidligere versioner af et redigeret indlæg. Når slået fra, kan kun administrator se dette." + delete_removed_posts_after: "Indlæg, fjernet af forfatteren, vil blive automatisk slettet efter (n) hours. Såfremt værdien sat til 0 vil indlæg blive fjernet straks." + max_image_width: "Maximum thumbnail width of images in a post" + max_image_height: "Maksimum miniaturebillede højde for billeder i et indlæg" category_featured_topics: "Antallet af emner der vises pr. kategori på /categories-siden. Efter ændring af denne værdi kan det tage op til 15 minutter før kategorisiden opdateres." + show_subcategory_list: "Vis subkategori liste i stedet for emneliste, når man åbner en ny kategori." + fixed_category_positions: "Hvis krydset af, vil du være i stand til at arrangere ordnet visning af kategorier. Hvis ikke afkrydset vil de være listet i en rækkefølge baseret på aktivitet." + fixed_category_positions_on_create: "Hvis afkrydset vil kategori visning blive vedligeholdt baseret på emne (kræver manuelt valgt visning af kategorier)." + exclude_rel_nofollow_domains: "En liste af domæner hvor 'nofollow' skal tilføjes til links. tid.com vil desuden automatisk tillade sub.tid Som minimum bør du tilføje top level domænet til sitet, for at hjælpe webcrawlere finde alt indhold. Såfremt andre dele af jeres site er på andre domæner, så tilføj også disse." + post_excerpt_maxlength: "Max længde på uddrag af indlæg / opsummering." + show_pinned_excerpt_mobile: "Vis uddrag af fastgjorte emner på mobilen." + show_pinned_excerpt_desktop: "Vis uddrag af fastgjorte emner i desktop visning" + post_onebox_maxlength: "Max længde af Discourse indlæg i tegn" + logo_url: "Logoet på jeres site, øverst til venstre, burde være en bred rektangel. Hvis denne efterlades blank, vil sidens titel tekst blive vist." + digest_logo_url: "Det alternative logo billede der anvendes øverst på jeres sides email opsummering, burde være en bred rektangel. Skal ikke være et SVG billede. Hvis denne efterlades blank, vil 'logo_url' blive anvendt." + logo_small_url: "Det lille logo øverst til venstre på siden burde være firkantet når der bladres ned. Såfremt denne efterlades blank. vil home 'glyph' blive vist." + favicon_url: "Favoritikonet for jeres side, se http://en.wikipedia.org/wiki/Favicon, bør være en png, for at det fungere korrekt over CDN." + mobile_logo_url: "Jeres site logo, øverst til venstre på siden, skulle være firkantet. Såfremt det efterlades blankt, vil `logo_url` blive anvendt. F.eks: http://example.com/uploads/default/logo.png" apple_touch_icon_url: "Ikon til Apple touch-enheder. Den anbefalede størrelse er 144px gange 144px." + notification_email: "Afsender email adresse, anvendt når der sendes esentielle system emails. Domænet her skal have korrekt opsatte SPF, DKIM og 'PTR records', for succesfuld afskibning af mails." email_custom_headers: "En liste af brugerdefinerede e-mail-headers adskilt af |-tegn." + force_https: "Tving din side til kun at anvende HTTPS. Slå ikke denne funktion til før det er sat helt op og virker overalt! Har du tjekket dit CDN, alle social logins, og eksterne logos og afhængigheder og sikret at de også er HTTPS kompatible?" + summary_score_threshold: "Påkrævet minimum score for et indlæg til at blive inkluderet i 'opsummering af emne'" + summary_posts_required: "Minimum antal indlæg i et emne, før 'opsummer dette emne' er aktiveret" + summary_likes_required: "Minimum antal likes på et emne før 'opsummer dette emne' er aktiveret" + summary_percent_filter: "Når en bruger kllikker 'Opsummer dette Emne' vises top % af indlæg" + summary_max_results: "Max antal indlæg indeholdt i 'Opsummer dette Emne'" + enable_private_messages: "Tillad Trust Level 1 (kan konfigureres minimum trust level til at sende beskeder), brugere til at sende og svare på beskeder. Bemærk at moderatorer beskeder, uanset hvad." enable_long_polling: "Message bus til underretninger kan bruge long polling" + long_polling_base_url: "URL anvendt for afsteminger (når CDN leverer dynamisk indhold, så sæt dette til oprindelig / orginal) f.eks: http://origin.site.com" + long_polling_interval: "Mængde tid før serveren bør vente før den svarer klienter når der ikke er ny data at sende (kun for brugere der er logget ind)" + polling_interval: "Når der ikke hentes data langsomt, hvor tit skal en klient der er logget på hente ny data i millisekunder" anon_polling_interval: "Hvor ofte skal anonyme brugere polle, i millisekunder." + background_polling_interval: "Hvor tit skal klienter hente data i millisekunder (når vinduet er i baggrunden)" + flags_required_to_hide_post: "Antal flag der forårsager at et indlæg automatisk skjules, og en bresked sendt til brugeren (0 for never)" + cooldown_minutes_after_hiding_posts: "Antal minutter en bruger må vente indtil de kan redigere et indlæg der er blevet gemt via et flag" + max_topics_in_first_day: "Det maksimale antal af emner en bruger må lave i en 24 timers periode efter at have skrevet det første indlæg" + max_replies_in_first_day: "Det maksimale antal af svar en bruger må foretage i 24 timers perioden efter at have skrevet deres første indlæg" + tl2_additional_likes_per_day_multiplier: "Øg antallet af likes pr dag for tl2 (member) ved at gange med dette tal" + tl3_additional_likes_per_day_multiplier: "Øg antallet af likes pr. dag for tl3 (regular) ved at gange med dette tal" + tl4_additional_likes_per_day_multiplier: "Øg antallet af likes pr. dag for tl4 (leader) ved at gange med dette tal" + num_spam_flags_to_block_new_user: "Hvis indlæg fra en ny bruger får så mange spam flag fra forskellige brugere num_users_to_block_new_user gem da deres indlæg og forhindre at vedkommende kan udgive flere indlæg. 0 for at slå fra." + num_users_to_block_new_user: "Hvis en ny bruger får num_spam_flags_to_block_new_user spam flag fra dette antal forskellige brugere, gem da alle indlæg og forhindr yderligere posteringer 0 for at slå fra." + num_tl3_flags_to_block_new_user: "Hvis en ny brugers indlæg får dette antal flag fra num_tl3_users_to_block_new_user fra Trust Level 3 brugere, gem da alle deres indlæg og bloker yderligere posteringer. 0 for at slå fra." + num_tl3_users_to_block_new_user: "Hvis en brugers indlæg får num_tl3_flags_to_block_new_user flag fra mange forskellige \"trust level 3\" brugere, så gem alle deres indlæg og fjern muligheden for nye indlæg. Skriv 0 for at deaktivere." notify_mods_when_user_blocked: "Send en besked til alle moderatorer hvis en bruger blokeres automatisk" + flag_sockpuppets: "Hvis en ny bruger svarer på et emne fra den samme IP adresse som den der startede emnet, så rapporter begge at deres indlæg potentielt er spam." + traditional_markdown_linebreaks: "Brug traditionelle linjeskift i Markdown, som kræver 2 mellemrum i slutningen af sætningen." + allow_html_tables: "Tillad tabeller at blive oprettet i Markdown med brug af HTML tags. TABLE, THEAD, TD, TR, TH vil blive tilladt (kræver en fuld re-indeksering af gamle indlæg som benytter tabeller) " + post_undo_action_window_mins: "Antal minutter som brugere er tilladt at fortryde handlinger på et indlæg (like, flag, etc)." + must_approve_users: "Personale skal godkende alle nye bruger konti inden de kan tilgå sitet. ADVARSEL: aktivering af dette for et live site vil medføre en ophævning af adgang for eksisterende ikke-personale brugere." + pending_users_reminder_delay: "Underret moderatorer hvis nye brugere har ventet på godkendelse i længere end så mange timer. Skriv -1 for at deaktivere notifikationer." + maximum_session_age: "Bruger vil forblive logget in for n hours siden sidste besøg" + ga_tracking_code: "OBSOLETE: Google analytics (ga.js) tracking code code, eg: UA-12345678-9; see http://google.com/analytics" + ga_domain_name: "OBSOLETE: Google analytics (ga.js) domain name, eg: mysite.com; see http://google.com/analytics" + ga_universal_tracking_code: "Google Universal Analytics (analytics.js) tracking code code, eg: UA-12345678-9; see http://google.com/analytics" + ga_universal_domain_name: "Google Universal Analytics (analytics.js) domain name, eg: mysite.com; see http://google.com/analytics" + gtm_container_id: "Google Tag Manager container id. eg: GTM-ABCDEF" enable_noscript_support: "Aktivér standard webcrawler søgemaskineunderstøttelse vha. noscript-tagget" + allow_moderators_to_create_categories: "Tillad moderatorer at skabe nye kategorier" + use_admin_ip_whitelist: "Admins kan kun logge ind hvis de logger på fra en prædefineret IP liste: (Admin > Logs > Screened Ips)." + top_menu: "Afklar hvilke ting fremgår af sidens navigations bar, og i hvilken rækkefølge. Eksempel: latest|new|unread|categories|top|read|posted|bookmarks" post_menu: "Angiv hvilke elementer der skal vises i indlægsmenuen, og i hvilken rækkefølge. Eksempel: like|edit|flag|delete|share|bookmark|reply." + post_menu_hidden_items: "Menuen vil automatisk gemme disse elementer i indlægs menuen, med mindre en udvidelse er tilvalgt." share_links: "Angiv hvilke elementer der skal vises i “del“-dialogboksen og i hvilken rækkefølge." track_external_right_clicks: "Spor højreklik på eksterne links (f.eks.: åbn i ny tab); deaktiveret som standard fordi den omskriver URLer" + send_welcome_message: "Send alle nye brugere en velkomstbesked, med en hurtig start guide." + topics_per_period_in_top_summary: "Antallet af top emner der vises som standard i top emner" + topics_per_period_in_top_page: "Antallet af top emner der vises når 'Vis Mere' er aktiveret." + show_email_on_profile: "Vis en brugers email på deres profil (kun synligt for brugerne selv - samt admin)" + email_token_valid_hours: "Glemte password / konto aktiverings muligheder er gyldige i (n) timer." + enable_badges: "Aktiver badge systemet" + log_out_strict: "Når brugeren logger af, log da ud af alle sessioner, på alle enheder" + new_version_emails: "Send en email til contact_email adressen når der er en ny version af Discourse tilgængelig." port: "KUN FOR UDVIKLERE! ADVARSEL! Brug denne HTTP-port i stedet for standarden, som er port 80. Lad feltet stå tomt for at bruge standardværdien." force_hostname: "KUN FOR UDVIKLERE! ADVARSEL! Angiv et host-navn i URLen. Lad feltet stå tomt for at bruge standardværdien." invite_expiry_days: "Hvor længe brugerinvitationsnøgler er gyldige, i dage." + invite_passthrough_hours: "Hvor længe kan en bruger benytte en tidligere benyttet invitation til at logge ind, i timer." + invite_only: "Offentlig registrering er deaktiveret, alle nye brugere skal inviteres af andre medlemmer eller Staff." + login_required: "Kræv godkendelse til at læse indhold på dette site, og tillad ikke anonym adgang." + min_username_length: "Minimumslængde på et brugernavn i antal karakterer." + max_username_length: "Maksimal længde af et brugernavn i antal karakterer." + reserved_usernames: "Brugernavne for hvem oprettelse ikke er mulig." min_password_length: "Mindste adgangskodelængde." + min_admin_password_length: "Minimumslængde for Admin adgangskoder." + block_common_passwords: "Tillad ikke adgangskoder som findes i de 10.000 mest benyttede adgangskoder." enable_yahoo_logins: "Aktivér Yahoo-login" + google_oauth2_client_id: "Client ID of your Google application." + google_oauth2_client_secret: "Client secret of your Google application." enable_twitter_logins: "Aktivér Twitter-login, kræver twitter_consumer_key og twitter_consumer_secret" twitter_consumer_key: "Consumer key til Twitter-login, oprettes på http://dev.twitter.com." twitter_consumer_secret: "Consumer secret til Twitter-login, oprettes på http://dev.twitter.com." + enable_instagram_logins: "Aktivér Instagram-login, kræver instagram_consumer_key og instagram_consumer_secret" enable_facebook_logins: "Aktivér Facebook-login, kræver facebook_app_id og facebook_app_secret" facebook_app_id: "App id til Facebook-login, oprettes på https://developers.facebook.com/apps" facebook_app_secret: "App secret til Facebook-login, oprettes på https://developers.facebook.com/apps" enable_github_logins: "Aktivér Github-login, kræver github_client_id og github_client_secret" github_client_id: "Client id til Github-login, oprettes på https://github.com/settings/applications." github_client_secret: "Client secret til Github-login, oprettes på at https://github.com/settings/applications." + readonly_mode_during_backup: "Slå \"read-only\" tilstand til mens der foretages backup" 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." @@ -589,13 +877,32 @@ da: 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." + auto_block_fast_typers_on_first_post: "Blokér automatisk brugere som ikke opfylder min_first_post_typing_time" + auto_block_fast_typers_max_trust_level: "Maksimal trust level for at blokere \"fast typers\"" + reply_by_email_enabled: "Aktivér muligheden for at svare til emner via email." reply_by_email_address: "Skabelon for e-mail-adressen i formularen, for eksempel: %{reply_key}@reply.myforum.com." + incoming_email_prefer_html: "Brug HTML istedet for tekst til indgående emails. Der kan opstå uventede formateringsproblemer!" + disable_emails: "Stop Discourse i at sende nogen form for emails" + strip_images_from_short_emails: "Undlad at inkludere billeder fra emails som fylder mindre end 2800 Bytes" + short_email_length: "Kort email i Bytes" + display_name_on_email_from: "Vis fulde navne på emails fra felter" + unsubscribe_via_email: "Tillad brugere at afmelde sig fra emails ved at sende en email med \"unsubscribe\" i emne eller indholdsfeltet" + ignore_by_title: "Ignorér indgående emails baseret på deres titel." + mailgun_api_key: "Mailgun Secret API key used to verify webhook messages." delete_all_posts_max: "Det maksimale antal indlæg der kan slettes på én gang med “Slet alle indlæg”-knappen. Hvis en bruger har mere end dette antal indlæg, kan indlæggene ikke slettes på én gang og brugeren kan ikke slettes." username_change_period: "Antal dage efter oprettelsen hvor brugere kan ændre deres brugernavn (0 for ikke at tillade skift af brugernavn)." email_editable: "Lad brugerne skifte deres e-mail-adresse efter oprettelsen." + enable_user_directory: "Gør det muligt at gennemse et indeks af brugere " + allow_anonymous_posting: "Tillad brugere at skifte til en anonym tilstand" + allow_profile_backgrounds: "Tillad brugere at uploade en profil baggrund." enable_mobile_theme: "Mobile enheder bruger et mobilvenligt tema, med mulighed for at skifte til det fulde site. Deaktivér dette hvis du ønsker at anvende et brugerdefineret stylesheet som er fuldstændigt responsivt." + disable_avatar_education_message: "Deaktivér hjælpetekst for at skifte sin avatar." + full_name_required: "Fuldt navn er et påkrævet felt på en brugerprofil." + invites_per_page: "Standard invitationer vist på en brugers side." short_progress_text_threshold: "Når antallet af indlæg overstiger dette tal viser statuslinjen kun det aktuelle indlægsnummer. Hvis du ændrer bredden af statuslinjen kan det være nødvendigt at opdatere denne værdi." default_code_lang: "Standard syntax highlighting som bruges i GitHub kodeblokke (lang-auto, ruby, python etc.)." + enable_emoji: "Aktivér emojis" + emoji_set: "Hvordan kunne du tænke dig dit emotikon?" default_email_private_messages: "Send som standard en email når nogen sender brugeren en besked." default_email_direct: "Send som standard en email når nogen citerer/svarer/nævner/inviterer brugeren." default_email_mailing_list_mode: "Send som standard en email for hvert nyt indlæg." @@ -609,6 +916,16 @@ da: default_categories_watching: "Liste over kategorier der som standard overvåges." default_categories_tracking: "Liste over kategorier der som standard følges." default_categories_muted: "Liste over kategorier der som standard ignoreres." + errors: + invalid_integer_min: "Værdien skal være %{min} eller højere." + invalid_integer_max: "Værdien kan ikke være højere end %{max}." + invalid_integer: "Værdien skal være et heltal." + regex_mismatch: "Værdien passer ikke til det påkrævede format." + must_include_latest: "Topmenuen skal inkludere \"Latest\" fanen." + invalid_string: "Ugyldig værdi." + invalid_string_min_max: "Skal være mellem %{min} og %{max} karakterer." + invalid_string_min: "Skal være mindst %{min} karakterer." + invalid_string_max: "Må ikke være mere end %{max} karakterer." search: types: category: 'Kategorier' @@ -620,12 +937,15 @@ da: frequent_poster: "Hyppig forfatter" redirected_to_top_reasons: new_user: "Velkommen til fællesskabet! Dette er de seneste mest populære emner." + change_owner: + deleted_user: "en slettet bruger" topic_statuses: archived_enabled: "Dette emne er nu arkiveret. Det er frosset fast og kan ikke ændres på nogen måde." archived_disabled: "Dette emne er nu ikke længere arkiveret. Det er ikke længere frosset fast, og kan ændres." closed_enabled: "Dette emne er nu lukket. Nye indlæg tillades ikke." closed_disabled: "Dette emne er nu åbent. Nye indlæg tillades." autoclosed_disabled: "Dette emne er nu åbnet. Nye svar er tilladt." + autoclosed_disabled_lastpost: "Dette emne er nu åbent. Nye svar er tilladt." pinned_enabled: "Dette emne er nu fastgjort. Det vil stå i toppen af dets kategori indtil det bliver frigjort af \"staff\" for alle eller af hver bruger individuelt for dem selv." pinned_disabled: "Dette emne er nu frigjort. Det optræder ikke længere i toppen af dets kategori." login: @@ -640,16 +960,33 @@ da: not_available: "Ikke ledigt. Prøv %{suggestion}?" something_already_taken: "Noget gik galt, måske er brugernavnet eller e-mail-adressen allerede registreret. Prøv “Glemt adgangskode“-linket." omniauth_error_unknown: "Noget gik galt ved behandlingen af dit login, prøv venligst igen." + password_too_long: "Adgangskoder er begrænset til 200 karakterer." + reserved_username: "Dette brugernavn er ikke tilladt." + missing_user_field: "Du har ikke udfyldt alle felterne" + close_window: "Godkendelsen er færdig. Luk dette vindue for at fortsætte." user: + no_accounts_associated: "Ingen konti tilknyttet" username: short: "skal være på mindst %{{min}} tegn." long: "skal være kortere end %{max} tegn" characters: "må kun indeholde bogstaver og tal" unique: "skal være unik" blank: "skal udfyldes" + must_begin_with_alphanumeric_or_underscore: "skal begynde med et bogstav, et nummer eller en underscore" + must_end_with_alphanumeric: "skal slutte med et bogstav eller et nummer" + must_not_contain_two_special_chars_in_seq: "må ikke indeholde en sekvens af 2 eller flere specielle karakterer (.-_)" + must_not_end_with_confusing_suffix: "må ikke ende med en forvirrende endelse som f.eks. .json eller .png etc." email: not_allowed: "er ikke tilladt fra den e-mail-udbyder. Brug venligst en anden e-mail-adresse." blocked: "er ikke tilladt." + ip_address: + blocked: "Nye registreringer er ikke tilladt fra din IP adresse." + flags_reminder: + subject_template: + one: "1 flag venter på at blive håndteret" + other: "%{count} flag venter på at blive håndteret" + unsubscribe_mailer: + subject_template: "Bekræft at du ikke længere ønsker at modtage email opdateringer fra %{site_title}" test_mailer: subject_template: "[%{site_name}] test af e-mail-udsendelse" new_version_mailer_with_notes: @@ -659,6 +996,8 @@ da: subject_template: "Velkommen til %{site_name}!" welcome_invite: subject_template: "Velkommen til %{site_name}!" + email_reject_strangers_not_allowed: + subject_template: "[%{site_name}] Email problem -- ugyldig adgang" pending_users_reminder: subject_template: one: "1 bruger afventer godkendelse" @@ -670,12 +1009,19 @@ da: 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." + unsubscribe_link: | + [Klik her](%{unsubscribe_url}) hvis du ikke længere vil modtage disse emails. + unsubscribe_link_and_mail: | + [Klik her](%{unsubscribe_url}) hvis du ikke længere vil modtage disse emails. subject_re: "Re:" user_notifications: previous_discussion: "Forrige svar" + in_reply_to: "Som svar på" unsubscribe: title: "Frameld" description: "Ønsker du ikke at modtage disse e-mails? Intet problem! Klik herunder for at framelde med det samme:" + reply_by_email: "[Besøg emnet](%{base_url}%{url}) eller svar på denne email for at svare." + reply_by_email_pm: "[Gå til besked](%{base_url}%{url}) eller svar på denne email for at svare." posted_by: "Oprettet af %{username} den %{post_date}" user_replied: subject_template: "[%{site_name}] %{username} svarede på dit indlæg i emnet '%{topic_title}'" @@ -688,13 +1034,20 @@ da: user_posted_pm: subject_template: "[%{site_name}] [PM] %{topic_title}" digest: - why: "Et kort resume af %{site_link} siden dit sidste besøg %{last_seen_at}" - new_activity: "Ny aktivitet på dine emner og indlæg:" - top_topics: "Populære emner" - other_new_topics: "Populære emner" + why: "Et kort resumé af %{site_link} siden dit sidste besøg %{last_seen_at}" + since_last_visit: "Siden dit sidste besøg" + unread_messages: "Ulæste beskeder" + new_posts: "Nye indlæg" + popular_topics: "Populære emner" + join_the_discussion: "Læs mere" + more_new: "Nyt i emner og kategorier, som du følger" + subject_template: "[%{site_name}] Resumé" + unsubscribe: "Dette resumé sendes fra %{site_link} når vi ikke har set dig i et stykke tid. For at afmelde %{unsubscribe_link}." click_here: "klik her" - read_more: "Læs mere" - more_topics_category: "Flere nye emner: " + from: "%{site_name} resumé" + preheader: "Et kort resume siden de sidste besøg %{last_seen_at}" + mailing_list: + subject_template: "[%{site_name}] Resumé for %{date}" forgot_password: subject_template: "[%{site_name}] Nulstil kodeord" text_body_template: | @@ -716,6 +1069,12 @@ da: %{base_url}/users/password-reset/%{email_token} account_created: subject_template: "[%{site_name}] Din nye konto" + confirm_new_email: + subject_template: "[%{site_name}] Bekræft din nye email adresse" + confirm_old_email: + subject_template: "[%{site_name}] Bekræft din nuværende email adresse" + notify_old_email: + subject_template: "[%{site_name}] Din email adresse er blevet ændret" signup_after_approval: subject_template: "Du er blevet godkendt på %{site_name}!" signup: @@ -728,6 +1087,7 @@ da: Hvis linket ikke virker, så prøv at kopiere hele linket ind i adressefeltet på din web browser. page_not_found: + title: "Ups! Den side eksisterer ikke eller også er den privat." popular_topics: "Populære" recent_topics: "Nye" see_more: "Flere" @@ -747,17 +1107,25 @@ da: 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?" email_log: + post_user_deleted: "Brugeren af dette svar er blevet slettet." + no_user: "Kan ikke finde brugeren med id %{user_id}" anonymous_user: "Brugeren er anonym" + suspended_not_pm: "Brugeren er suspenderet, ikke en besked" 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" + topic_nil: "post.topic er nul" post_deleted: "indlægget er blevet slettet af forfatteren" user_suspended: "brugeren blev suspenderet" already_read: "brugeren har allerede læst dette indlæg" + exceeded_emails_limit: "Overskredet max_emails_per_day_per_user" + exceeded_bounces_limit: "Overskredet bounce_score_threshold" 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" + color_schemes: + base_theme_name: "Base" about: "Om" guidelines: "Retningslinjer" privacy: "Privatliv" @@ -812,13 +1180,30 @@ da: empathetic: name: Empatisk description: Har 500 likede indlæg og givet 1000 likes + first_mention: + description: Nævnte en bruger i et indlæg + first_reply_by_email: + name: Første svar via email + description: Svarede på et indlæg via email + long_description: | + Dette emblem gives første gang du svarer til et indlæg via email :e-mail:. admin_login: success: "Email sendt" error: "Fejl!" email_input: "Admin email" submit_button: "Send email" - time: - <<: *datetime_formats + discourse_hub: + access_token_problem: "Fortæl en admin: Venligst opdater indstillingerne så de inkluderer den korrekte discourse_org_access_key." + performance_report: + initial_post_raw: Dette emne inkluderer daglige præstationsrapporter for dit site. + initial_topic_title: Website præstationsrapport + topic_invite: + user_exists: "Beklager, men brugeren er allerede inviteret. Du kan kun invitere en bruger til et emne én gang." + tags: + title: "Tags" + staff_tag_disallowed: "Tagget \"%{tag}\" kan kun tildeles af personalet." + staff_tag_remove_disallowed: "Tagget \"%{tag}\" kan kun fjernes af personalet." + rss_by_tag: "Emner tagget %{tag}" activemodel: errors: <<: *errors diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index c2463f75105..a810b90a585 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -71,7 +71,7 @@ de: has_already_been_used: "wird bereits verwendet" inclusion: ist nicht in der Liste enthalten invalid: ist ungültig - is_invalid: "ist ungültig; bitte sei ein wenig deutlicher" + is_invalid: "scheint unklar, ist das ein ganzer Satz?" less_than: muss weniger als %{count} sein less_than_or_equal_to: muss weniger oder gleich %{count} sein not_a_number: ist keine Zahl @@ -106,23 +106,30 @@ de: default_categories_already_selected: "Du kannst keine Kategorie auswählen, welche bereits in einer anderen Liste benutzt wird. " 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." + file_should_be_csv: "Die hochzuladende Datei sollte im CSV-Format vorliegen." + error: "Es gab einen Fehler beim Hochladen dieser Datei. Bitte versuche es später noch einmal." backup: operation_already_running: "Eine Arbeitsschritt wird momentan bearbeitet. Im Moment kann kein neuer Vorgang gestartet werden." backup_file_should_be_tar_gz: "Die Sicherungsdatei sollte ein .tar.gz-Archiv sein." not_enough_space_on_disk: "Es gibt nicht genügend freien Festplattenspeicher, um dieses Backup hochzuladen." + invalid_filename: "Der Dateiname für das Backup enthält ungültige Zeichen. Gültig sind: a-z 0-9 . - _." not_logged_in: "Dazu musst du angemeldet sein." not_found: "Die angeforderte URL oder Ressource konnte nicht gefunden werden." invalid_access: "Du hast nicht die Erlaubnis, die angeforderte Ressource zu betrachten." read_only_mode_enabled: "Die Seite befindet sich im Nur-Lesen Modus. Änderungen sind deaktiviert." reading_time: "Lesezeit" - likes: "„Gefällt mir“-Angaben" + likes: "Likes" too_many_replies: one: "Entschuldigung, aber neue Benutzer sind vorübergehend auf eine Antwort pro Thema beschränkt." other: "Entschuldigung, aber neue Benutzer sind vorübergehend auf %{count} Antworten pro Thema beschränkt." embed: start_discussion: "Diskussion beginnen" continue: "Diskussion fortsetzen" + error: "Fehler bei der Einbettung" + referer: "Referrer:" + mismatch: "Der Referrer entsprach keiner der folgenden Hostnamen:" + no_hosts: "Es wurden keine Hostnamen für die Einbettung konfiguriert." + configure: "Einbettung konfigurieren" more_replies: one: "1 weitere Antwort" other: "%{count} weitere Antworten" @@ -156,9 +163,10 @@ de: spamming_host: "Entschuldigung, du kannst keine Links zu diesem Webserver posten." user_is_suspended: "Gesperrte Benutzer dürfen keine Beiträge schreiben." topic_not_found: "Etwas ist schief gelaufen. Wurde das Thema eventuell geschlossen oder gelöscht, während du es angeschaut hast?" + not_accepting_pms: "Entschuldige, %{username} akzeptiert gerade keine Nachrichten." just_posted_that: "ist einer einer vor Kurzem von dir geschriebenen Nachricht zu ähnlich" invalid_characters: "enthält ungültige Zeichen" - is_invalid: "ist ungültig; bitte sei ein wenig deutlicher" + is_invalid: "scheint unklar, ist das ein ganzer Satz?" next_page: "nächste Seite →" prev_page: "← vorherige Seite" page_num: "Seite %{num}" @@ -199,7 +207,7 @@ de: everyone: "jeder" admins: "admins" moderators: "moderatoren" - staff: "mitarbeiter" + staff: "team" trust_level_0: "vertrauensstufe_0" trust_level_1: "vertrauensstufe_1" trust_level_2: "vertrauensstufe_2" @@ -228,7 +236,7 @@ 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. + Beachte bitte auch [unsere Richtlinien](/guidelines). Dieser Hilfetext wird nur bei deinen ersten %{education_posts_text} angezeigt. avatar: | ### Wie wäre es mit einem Bild für Deinen Account? @@ -269,6 +277,7 @@ de: name: "Name der Kategorie" topic: title: 'Titel' + featured_link: 'Hervorgehobener Link' post: raw: "Hauptteil" user_profile: @@ -282,12 +291,16 @@ de: too_many_users: "Du kannst eine Warnung nur an einen Benutzer zugleich anhängen." cant_send_pm: "Entschuldigung, du kannst diesem Benutzer keine Direktnachricht schicken." no_user_selected: "Du musst einen gültigen Benutzer auswählen." + featured_link: + invalid: "ist ungültig. URL sollte http:// oder https:// enthalten." + invalid_category: "kann in dieser Kategorie nicht bearbeitet werden." user: attributes: password: common: "ist eines der 10000 meist verwendeten Passwörter. Bitte verwende ein sichereres Passwort." same_as_username: "ist mit deinem Benutzernamen identisch. Bitte verwende ein sichereres Passwort." same_as_email: "ist mit deiner E-Mail-Adresse identisch. Bitte verwende ein sichereres Passwort." + same_as_current: "entspricht deinem aktuellen Passwort." ip_address: signup_not_allowed: "Eine Registrierung ist von diesem Konto nicht erlaubt." color_scheme_color: @@ -297,6 +310,10 @@ de: post_reply: base: different_topic: "Beitrag und Antwort müssen zum gleichen Thema gehören." + web_hook: + attributes: + payload_url: + invalid: "URL ist ungültig. URL sollte http:// oder https:// enthalten, Leerzeichen sind nicht erlaubt." <<: *errors user_profile: no_info_me: "
"
@@ -305,12 +322,29 @@ de:
vip_category_description: "Eine Kategorie exklusiv für Mitglieder mit Vertrauensstufe 3 oder höher."
meta_category_name: "Feedback"
meta_category_description: "Diskussionen über dieses Forum, seine Organisation, wie es funktioniert und wie wir es verbessern können."
- staff_category_name: "Mitarbeiter"
- staff_category_description: "Geschützte Kategorie für Mitarbeiter. Themen sind nur für Administratoren und Moderatoren sichtbar."
- assets_topic_body: "Dies ist ein fester Beitrag, der nur für Mitarbeiter sichtbar ist, um Bilder und Dateien, die im Forum benutzt werden zu speichern. Lösche diese nicht!\n\n\nAnleitung:\n\n\n1. Antworte auf dieses Thema.\n2. Lade alle Bilder, die du für Logos, Favicons und usw. nutzen willst, hier hoch. (Nutze dazu das Symbol für Lade-Symbolleiste im Beitrags-Editor oder ziehe und lasse die Bilder hier fallen oder füge sie eins.)\n3. Sende deine Antwort. \n4. Klicke mit der rechten Maustaste auf die Bilder in deinem neuen Beitrag, um die den Pfad zu bekommen oder klicke das Editier-Symbol, um deinen Beitrag zu editieren und dadurch den Pfad zu den Bildern zu bekommen. Kopiere die Bild-Pfade.\n5. Füge die Bild-Pfade in [basic settings](/admin/site_settings/category/required) ein.\n\n\nWenn du andere Dateityp-Uploads aktivieren willst, editiere `authorized_extensions` in [file settings](/admin/site_settings/category/files)."
+ staff_category_name: "Team"
+ staff_category_description: "Geschützte Kategorie für das Team-Diskussionen. Themen sind nur für Administratoren und Moderatoren sichtbar."
+ assets_topic_title: "Mediendateien für das Seitendesign"
+ assets_topic_body: "Dies ist ein fester Beitrag, der nur für das Team sichtbar ist, um Bilder und Dateien, die im Forum benutzt werden zu speichern. Lösche diese nicht!\n\n\nAnleitung:\n\n\n1. Antworte auf dieses Thema.\n2. Lade alle Bilder, die du für Logos, Favicons und usw. nutzen willst, hier hoch. (Nutze dazu das Symbol für Lade-Symbolleiste im Beitrags-Editor oder ziehe und lasse die Bilder hier fallen oder füge sie eins.)\n3. Sende deine Antwort. \n4. Klicke mit der rechten Maustaste auf die Bilder in deinem neuen Beitrag, um die den Pfad zu bekommen oder klicke das Editier-Symbol, um deinen Beitrag zu editieren und dadurch den Pfad zu den Bildern zu bekommen. Kopiere die Bild-Pfade.\n5. Füge die Bild-Pfade in [basic settings](/admin/site_settings/category/required) ein.\n\n\nWenn du andere Dateityp-Uploads aktivieren willst, editiere `authorized_extensions` in [file settings](/admin/site_settings/category/files)."
+ discourse_welcome_topic:
+ title: "Willkommen bei Discourse"
+ body: |2
+
+ Der erste Absatz dieses angehefteten Themas wird allen neuen Besuchern deiner Webseite als Willkommensnachricht angezeigt. Er ist wichtig!
+
+ **Bearbeite dies** und erstelle eine kurze Beschreibung deiner Community:
+
+ - Für wen ist sie?
+ - Was findet man hier?
+ - Warum sollte man hier vorbeischauen?
+ - Wo kann man mehr erfahren (Links, Dokumente, usw.)?
+
+
+
+ Du solltest dieses Thema eventuell schließen über die Administration :wrench: (oben rechts oder unten), damit sich an einer Ankündigung wie dieser nicht die Antworten aufstapeln.
lounge_welcome:
title: "Willkommen in der Lounge"
- body: |
+ body: |2
Gratuliere! :confetti_ball:
@@ -322,6 +356,7 @@ de:
* Themen in andere Kategorien verschieben
* Links veröffentlichen, die von Suchmaschinen weiterverfolgt werden (das automatische [nofollow](http://de.wikipedia.org/wiki/Nofollow) wird entfernt)
* auf die private Lounge-Kategorie zugreifen, die für Benutzer mit Vertrauensstufe 3 oder höher sichtbar ist
+ * Spam durch eine einzige Meldung ausblenden
Hier ist die [aktuelle Liste aller Stammgäste](/badges/3/regular). Vergiss nicht, hallo zu sagen!
@@ -370,9 +405,10 @@ de:
create_topic: "Du erstellst zu schnell zu viele Themen hintereinander. Bitte warte %{time_left}, bis Du es wieder versuchst."
create_post: "Du antwortest zu schnell. Bitte warte %{time_left}, bis Du es wieder versuchst."
delete_post: "Du löschst zu schnell Beiträge. Bitte warte %{time_left}, bis Du es wieder versuchst."
+ public_group_membership: "Du wechselst die Gruppenzugehörigkeit zu häufig. Bitte warte %{time_left}, bevor du es erneut versuchst."
topics_per_day: "Du hast die maximale Anzahl an neuen Themen für heute erreicht. Bitte warte %{time_left}, bis Du es wieder versuchst."
pms_per_day: "Du hast die maximale Anzahl an Nachrichten für heute erreicht. Bitte warte %{time_left}, bis Du es wieder versuchst."
- create_like: "Du hast die maximale Anzahl „Gefällt mir“ für heute erreicht. Bitte warte %{time_left}, bis Du es wieder versuchst."
+ create_like: "Du hast die maximale Anzahl an Likes für heute erreicht. Bitte warte %{time_left}, bevor du es wieder versuchst."
create_bookmark: "Du hast die maximale Anzahl an Lesezeichen für heute erreicht. Bitte warte %{time_left}, bis Du es wieder versuchst."
edit_post: "Du hast die maximale Anzahl an Änderungen für heute erreicht. Bitte warte %{time_left}, bis Du es wieder versuchst."
live_post_counts: "Du forderst die Live-Anzahl der Antworten zu schnell neu an. Bitte warte %{time_left}, bis du es wieder versuchst."
@@ -524,6 +560,13 @@ de:
title: 'Abstimmung'
description: 'Stimme für diesen Beitrag'
long_form: 'für diesen Beitrag gestimmt'
+ user_activity:
+ no_bookmarks:
+ self: "Du hast keine Beiträge mit Lesezeichen, Lesezeichen ermöglichen es dir, diese später einfach zu finden."
+ others: "Keine Lesezeichen."
+ no_likes_given:
+ self: "Du hast noch keine Beiträge mit einem „Like“ markiert."
+ others: "Keine Beiträge mit „Like“."
topic_flag_types:
spam:
title: 'Spam'
@@ -535,7 +578,7 @@ de:
long_form: 'als unangemessen gemeldet'
notify_moderators:
title: "Irgendetwas anderes"
- description: 'Dieser Beitrag muss von einem Mitarbeiter begutachtet werden, da er entweder nicht mit den Richtlinien oder den Nutzungsbedingungen in Einklang zu bringen ist, oder aus sonstigen oben nicht genannten Gründen.'
+ description: 'Dieser Beitrag erfordert die allgemeine Aufmerksamkeit des Teams, da er entweder nicht mit den Richtlinien oder den Nutzungsbedingungen in Einklang zu bringen ist, oder aus anderen Gründen.'
long_form: ' hast dies den Moderatoren gemeldet'
email_title: 'Das Thema "%{title}" benötigt die Aufmerksamkeit eines Moderators'
email_body: "%{link}\n\n%{message}"
@@ -565,6 +608,21 @@ de:
different_user_description: "Du bist gerade als ein anderer Benutzer angemeldet als der, an den die Zusammenfassung gesendet wurde. Bitte melde dich ab oder beginne den anonymen Modus und versuche es erneut."
not_found_description: "Entschuldige, wir konnten dein Abo nicht abbestellen. Kann es sein, dass der Link aus deiner E-Mail abgelaufen ist?"
log_out: "Abmelden"
+ user_api_key:
+ title: "Genehmige Zugriff für Anwendung"
+ authorize: "Genehmigen"
+ read: "Lesen"
+ read_write: "Lesen/Schreiben"
+ description: "\"%{application_name}\" fordert den folgenden Zugriff auf dein Konto:"
+ no_trust_level: "Entschuldige, du hast nicht die erforderliche Vertrauensstufe, um die Benutzer API zu nutzen."
+ generic_error: "Entschuldige, wir können keinen Benutzer API Schlüssel erstellen. Dieses Feature ist möglicherweise vom Site Administrator deaktiviert worden."
+ scopes:
+ message_bus: "Live-Aktualisierungen"
+ notifications: "Benachrichtigungen lesen und leeren"
+ push: "Push-Benachrichtigungen an externe Dienste"
+ session_info: "Informationen zur Benutzersitzung lesen"
+ read: "Alles lesen"
+ write: "Alles schreiben"
reports:
visits:
title: "Nutzerbesuche"
@@ -587,9 +645,9 @@ de:
xaxis: "Tag"
yaxis: "Anzahl neuer Beiträge"
likes:
- title: "„Gefällt mir“"
+ title: "Likes"
xaxis: "Tag"
- yaxis: "Anzahl neuer „Gefällt mir“"
+ yaxis: "Anzahl neuer Likes"
flags:
title: "Meldungen"
xaxis: "Tag"
@@ -720,14 +778,6 @@ de:
s3_backup_config_warning: 'Der Server ist so konfiguriert, dass Datensicherungen auf S3 geladen werden, aber mindestens eine der folgenden Einstellungen: s3_access_key_id, s3_secret_access_key oder s3_backup_bucket ist nicht festgelegt. Gehe zu den Siteneinstellungen und aktualisiere die Einstellungen. Um mehr darüber zu erfahren siehe "Wie konfiguriere ich das Hochladen von Bildern zu S3?" (en).'
image_magick_warning: 'Der Server wurde konfiguriert um Vorschaubilder von grossen Bildern zu erstellen, aber ImageMagick ist nicht installiertd. Installiere ImageMagick mit deinem bevorzugten Packetmanager oder besuche um das aktuelle Paket herunterzuladen.'
failing_emails_warning: "%{num_failed_jobs} E-Mails konnten nicht versendet werden. Überprüfe deine app.yml und stelle sicher, dass die E-Mail Servereinstellungen korrekt gesetzt sind. \nSieh dir hier die nicht versendeten E-Mails an."
- default_logo_warning: "Richte das Logo für deine Site ein. Konfiguriere dafür logo_url, logo_small_url und favicon_url unter Website-Einstellungen."
- contact_email_missing: "Gib eine Kontakt-E-Mail-Adresse an, damit du dringende Meldungen bezüglich deiner Site erhalten kannst. Trage sie in den Einstellungen ein."
- contact_email_invalid: "Die Site-Kontakt E-Mail-Adresse ist ungültig. Ändere sie in den Einstellungen."
- title_nag: "Gib einen Namen für deine Website ein. Aktualisiere dazu den „title“ in den Einstellungen."
- site_description_missing: "Gib eine kurze Beschreibung deiner Website ein, die in Suchergebnissen angezeigt werden soll. Aktualisiere dazu die „site_description“ in den Einstellungen."
- consumer_email_warning: "Deine Site verwendet Gmail (oder einen anderen für Endkunden gedachten E-Mailserver) um E-Mails zu versenden. Gmail hat einen Grenzwert bezüglich des Sendens von E-Mails. Um die E-Mail-Zustellung zu gewährleisten, solltest du die Verwendung eines anderen E-Mail-Dienstes in Erwägung ziehen."
- site_contact_username_warning: "Gib den Namen des Benutzerkontos eines freundlichen Mitarbeiters an, der als Absender für wichtige automatische Nachrichten verwendet wird. Aktualisiere site_contact_username in den Website-Einstellungen."
- notification_email_warning: "Benachrichtigungs-E-Mails werden nicht von einer gültigen, zu deiner Domain gehörenden E-Mail-Adresse versandt; der E-Mail-Versand wird unberechenbar und unzuverlässig sein. Bitte trage in den Einstellungen unter notification_email eine gültige lokale E-Mail-Adresse ein."
subfolder_ends_in_slash: "Deine Installation in einem Pfad ist nicht korrekt, DISCOURSE_RELATIVE_URL_ROOT endet mit einem Schrägstrich."
email_polling_errored_recently:
one: "Beim Abrufen von E-Mails ist in den letzten 24 Stunden ein Fehler aufgetreten. Weitere Informationen findest du im Fehlerprotokoll."
@@ -738,19 +788,24 @@ de:
poll_pop3_auth_error: "Die Verbindung zum POP3-Server schlägt mit einem Authentisierungsfehler fehl. Überprüfe deine POP3-Einstellungen."
site_settings:
censored_words: "Wörter, die automatisch durch ■■■■ ersetzt werden"
+ censored_pattern: "Regex-Muster das automatisch ersetzt wird mit ■■■■"
delete_old_hidden_posts: "Automatisch alle Beiträge löschen, die länger als 30 Tage versteckt bleiben."
default_locale: "Die Standardsprache dieser Discourse-Instanz (kodiert in ISO 639-1)."
- allow_user_locale: "Erlaube Benutzern, ihre eigene Interfacesprache zu wählen"
+ allow_user_locale: "Erlaube Benutzern, ihre eigene Oberflächensprache zu wählen"
set_locale_from_accept_language_header: "Sprache der Benutzeroberfläche für anonyme Benutzer an Hand der Spracheinstellung ihres Browsers wählen (EXPERIMENTELL, funktioniert nicht mit Caches für anonyme Benutzer)"
min_post_length: "Minimal zulässige Beitragslänge in Zeichen."
min_first_post_length: "Minimal zulässige Länge des ersten Beitrags (eines Themas) in Zeichen"
min_private_message_post_length: "Minimale zulässige Beitragslänge in Zeichen für Nachrichten"
max_post_length: "Maximale zulässige Beitragslänge in Zeichen."
+ topic_featured_link_enabled: "Beitrag mit Link zu hervorgehobenen Themen erlauben"
+ show_topic_featured_link_in_digest: "Zeige den Hervorgehobene Themen Link in der E-Mail-Zusammenfassung."
min_topic_title_length: "Minimale zulässige Titellänge von Themen in Zeichen."
max_topic_title_length: "Maximale zulässige Titellänge von Themen in Zeichen."
min_private_message_title_length: "Minimale zulässige Titellänge von Nachrichten in Zeichen."
min_search_term_length: "Minimale zulässige Länge der Suche in Zeichen."
search_tokenize_chinese_japanese_korean: "Zwinge die Suche Chinesisch, Japanisch und Koreanisch zu erkennen, auch wenn die Site keine dieser Sprachen nutzt"
+ search_prefer_recent_posts: "Wenn das Durchsuchen deines großen Forums langsam ist, dann versucht diese Option zuerst einen Index der letzten Beiträge."
+ search_recent_posts_size: "Wie viele letzte Beiträge im Index halten"
allow_uncategorized_topics: "Erlaube Themen ohne Kategorie zu erstellen. ACHTUNG: Falls es unkategorisierte Themen gibt, musst du sie neu kategorisieren, bevor du diese Option abschaltest."
allow_duplicate_topic_titles: "Erlaube Themen mit identischen und doppelten Titeln."
unique_posts_mins: "Minuten, nach denen ein Benutzer denselben Inhalt noch einmal schreiben kann."
@@ -767,37 +822,38 @@ de:
disabled_image_download_domains: "Liste von Domänen, von denen verlinkte Bilder niemals heruntergeladen werden sollen."
editing_grace_period: "Für (n) Sekunden wird nach dem Bearbeiten keine neue Revision im Beitragsverlauf angelegt."
post_edit_time_limit: "Der Verfasser eines Beitrags kann diesen nur für (n) Minuten nach Absenden des Beitrags bearbeiten. 0 deaktiviert diese Beschränkung."
- edit_history_visible_to_public: "Erlaube jedem, vorherige Versionen eines bearbeiteten Beitrags zu sehen. Wenn deaktiviert sind diese nur für Mitarbeiter sichtbar."
+ edit_history_visible_to_public: "Erlaube jedem, vorherige Versionen eines bearbeiteten Beitrags zu sehen. Wenn deaktiviert sind diese nur für Team-Mitglieder sichtbar."
delete_removed_posts_after: "Beiträge, die deren Verfasser selbst entfernt hat, werden nach (n) Stunden automatisch gelöscht. Die Beiträge werden sofort gelöscht, wenn dieser Wert auf 0 gesetzt wird."
max_image_width: "Maximale Breite von Thumbnails von Bildern in einem Beitrag."
max_image_height: "Maximale Höhe von Vorschaubildern in einer Nachricht"
- category_featured_topics: "Anzahl der angezeigten Themen je Kategorie auf der Kategorieseite /categories. Nachdem dieser Wert geändert wurde, dauert es bis zu 15 Minuten bis die Kategorieseite aktualisiert ist."
+ category_featured_topics: "Anzahl der angezeigten Themen je Kategorie auf der /categories Seite. Nachdem dieser Wert geändert wurde, dauert es bis zu 15 Minuten bis die Kategorieseite aktualisiert ist."
show_subcategory_list: "Zeige Liste von Unterkategorien statt einer Liste von Themen wenn eine Kategorie ausgewählt wird."
fixed_category_positions: "Falls aktiviert können Kategorien in einer fest vorgegebenen Reihenfolge angeordnet werden. Andernfalls werden Kategorien nach Aktivität sortiert aufgelistet."
fixed_category_positions_on_create: "Wenn aktiviert wird die Kategoriezuordnung beim Erstellen eines Themas erhalten (benötigt fixed_category_positions)."
add_rel_nofollow_to_user_content: "Füge mit Ausnahme interner Links (schließt übergeordnete Domains ein) allen benutzergenerierten Inhalten 'rel nofollow' hinzu. Die Änderung dieser Einstellung erfordert, dass du sämtliche Markdown-Beiträge aktualisierst: \"rake posts:rebake\""
exclude_rel_nofollow_domains: "Eine Liste von Domains auf welchen das Attribut nofollow nicht auf Links gesetzt werden sollte (tld.com erlaubt auch sub.tld.com). Du solltest mindestens die Top-Level Domain dieser Site hinzufügen, damit die Crawler der Suchmaschinen all deinen Content indexieren können. Wenn weitere Teile deiner Website unter anderen Domains zu finden sind, kannst du diese hier ebenfalls hinzufügen."
post_excerpt_maxlength: "Maximale Länge eines Beitrags-Auszuges bzw. -Zusammfassung."
- show_pinned_excerpt_mobile: "Zeige einen Auszug hervorgehobener Beiträge in der mobilen Ansicht."
- show_pinned_excerpt_desktop: "Zeige einen Auszug hervorgehobener Beiträge in der Desktop-Ansicht."
+ show_pinned_excerpt_mobile: "Zeige einen Auszug angehefteter Themen in der mobilen Ansicht."
+ show_pinned_excerpt_desktop: "Zeige einen Auszug angehefteter Themen in der Desktop-Ansicht."
post_onebox_maxlength: "Maximale Länge eines Onebox-Discourse-Beitrags in Zeichen."
- onebox_domains_whitelist: "Liste von Domains, deren Inhalte für Oneboxen erlaubt sind; diese Domains sollten OpenGraph oder oEmbed unterstützen. Teste ihre Kompatibilität unter http://iframely.com/debug"
+ onebox_domains_blacklist: "Eine Liste von Domains, die nie in eine Onebox umgewandelt wird."
+ max_oneboxes_per_post: "Maximale Anzahl von Oneboxes in einem Beitrag."
logo_url: "Das Logo oben links auf deiner Site sollte eine breite, rechteckige Form haben. Wenn du kein Logo auswählst, wird stattdessen `title` angezeigt."
- digest_logo_url: "Das alternative Logo oben in den E-Mail-Zusammenfassungen deiner Webseite. Sollte eine breite, rechteckige Form haben. Sollte kein SVG-Bild sein. Wenn leer, wird `logo_url` verwendet."
- logo_small_url: "Dein Logo in klein für die obere linke Seite deiner Website, in Form eines rechteckigen Quadrates. Es wird angezeigt, wenn der Benutzer scrollt. Wenn du dieses Feld frei lässt, wird stattdessen ein Haus-Symbol angezeigt."
+ digest_logo_url: "Das alternative Logo oben in den E-Mail-Zusammenfassungen deiner Site. Sollte eine breite, rechteckige Form haben. Sollte kein SVG-Bild sein. Wenn leer, wird `logo_url` verwendet."
+ logo_small_url: "Dein Logo in klein für die obere linke Seite deiner Site, in Form eines rechteckigen Quadrates. Es wird angezeigt, wenn der Benutzer scrollt. Wenn du dieses Feld frei lässt, wird stattdessen ein Haus-Symbol angezeigt."
favicon_url: "Das Favicon deiner Site. Besuche http://de.wikipedia.org/wiki/Favicon um weitere Informationen zu erhalten. Damit das Favicon korrekt über einen CDN-Service funktioniert, muss es eine .png Datei sein."
mobile_logo_url: "Das fixierte Logo in der oberen linken Hälfte der mobilen Siteversion. Es sollte eine quadratische Form haben. Wenn du dieses Feld frei lässt, wird `logo_url` benutzt. Z.B. http://example.com/uploads/default/logo.png"
apple_touch_icon_url: "Icon für berührungsempfindliche Apple-Geräte. Empfohlene Grösse ist 144px auf 144px."
notification_email: "Die E-Mail-Adresse die als \"From:\" Absender aller wichtiger System-E-Mails benutzt wird. Die benutzte Domain sollte über korrekte SPF, DKIM und PTR Einträge verfügen, damit E-Mails sicher zugestellt werden können."
email_custom_headers: "Eine durch senkrechte Striche getrennte Liste von eigenen E-Mail Headerzeilen"
email_subject: "Format der Betreffzeile in Standard-E-Mails. Siehe https://meta.discourse.org/t/customize-subject-format-for-standard-emails/20801"
- force_https: "Erzwinge HTTPS für deine Seite. ACHTUNG: aktiviere dies nicht, bevor HTTPS nicht vollständig eingerichtet ist und auf jeden Fall überall funktioniert! Hast du alle CDN-Netzwerke, alle Logins über Soziale Netzwerke, alle externe Logos / Abhängigkeiten geprüft, um sicherzustellen, dass sie auch alle HTTPS-kompatibel sind?"
+ force_https: "Erzwinge HTTPS für deine Site. ACHTUNG: Aktiviere dies nicht, bevor HTTPS nicht vollständig eingerichtet ist und auf jeden Fall überall funktioniert! Hast du alle CDN-Netzwerke, alle Logins über Soziale Netzwerke, alle externe Logos / Abhängigkeiten geprüft, um sicherzustellen, dass sie auch alle HTTPS-kompatibel sind?"
summary_score_threshold: "Mindestpunktzahl, die ein Beitrag benötigt, um in der \"Thema zusammenfassen\"-Ansicht zu erscheinen."
summary_posts_required: "Mindestanzahl an Beiträgen in einem Thema, bevor die \"Thema zusammenfassen\"-Funktion aktiviert wird."
- summary_likes_required: "Mindestanzahl an \"Gefällt mir\" Wertungen in einem Thema, bevor die \"Thema zusammenfassen\" Funktion aktiviert wird."
+ summary_likes_required: "Mindestanzahl an Likes in einem Thema, bevor die \"Thema zusammenfassen\" Funktion aktiviert wird."
summary_percent_filter: "Zeige die besten (n)% der Beiträge eines Themas in der \"Thema zusammenfassen\"-Ansicht."
summary_max_results: "Maximale Anzahl der sichtbaren Beiträge beim Zusammenfassen von Themen"
- enable_private_messages: "Erlaube Benutzer mit der Vertrauensstufe 1 (konfigurierbar über die minimale Vertrauensstufe zum Senden von Nachrichten), Nachrichten zu erstellen und auf Nachrichten zu antworten. Beachte, dass Mitarbeiter immer Nachrichten und Antworten senden können."
+ enable_private_messages: "Erlaube Benutzer mit der Vertrauensstufe 1 (konfigurierbar über die minimale Vertrauensstufe zum Senden von Nachrichten), Nachrichten zu erstellen und auf Nachrichten zu antworten. Beachte, dass das Team immer Nachrichten und Antworten senden können."
enable_long_polling: "Nachrichtenbus für Benachrichtigungen kann Long-Polling nutzen."
long_polling_base_url: "Basis-URL für Long Polling (wenn zum Ausliefern von dynamischen Inhalten ein CDN verwendet wird, setze es auf Origin Pull), z. B. http://origin.site.com"
long_polling_interval: "Wartezeit, bevor der Server auf Clients reagiert, wenn keine Daten gesendet werden müssen (nur für angemeldete Benutzer)"
@@ -820,7 +876,7 @@ de:
traditional_markdown_linebreaks: "Traditionelle Zeilenumbrüche in Markdown, die zwei nachfolgende Leerzeichen für einen Zeilenumbruch benötigen."
allow_html_tables: "Erlaube es, Tabellen in Markdown mit HTML-Tags einzugeben. TABLE, THEAD, TD, TR, TH werden erlaubt (alle Beiträge mit Tabellen müssen ihr HTML erneuern)"
post_undo_action_window_mins: "Minuten, die ein Benutzer hat, um Aktionen auf einen Beitrag rückgängig zu machen (Gefällt mir, Meldung, usw.)."
- must_approve_users: "Mitarbeiter müssen alle neuen Benutzerkonten freischalten, bevor diese Zugriff auf die Website erhalten. ACHTUNG: Das Aktivieren dieser Option für eine Live-Site entfernt den Zugriff auch für alle existierenden Benutzer ausser Mitarbeiter!"
+ must_approve_users: "Team-Mitglieder müssen alle neuen Benutzerkonten freischalten, bevor diese Zugriff auf die Website erhalten. ACHTUNG: Das Aktivieren dieser Option für eine Live-Site entfernt den Zugriff auch für alle existierenden Benutzer außer für Team-Mitglieder!"
pending_users_reminder_delay: "Benachrichtige die Moderatoren, falls neue Benutzer mehr als so viele Stunden auf ihre Genehmigung gewartet haben. Stelle -1 ein, um diese Benachrichtigungen zu deaktivieren."
maximum_session_age: "Benutzer bleiben (n) Stunden nach ihrem letzten Besuch angemeldet"
ga_tracking_code: "VERALTET: Google Analytics (analytics.js) tracking code code, z.B.: UA-12345678-9; siehe http://google.com/analytics"
@@ -828,18 +884,17 @@ de:
ga_universal_tracking_code: "Google Universal Analytics (analytics.js) tracking code code, beispielsweise: UA-12345678-9; Siehe http://google.com/analytics"
ga_universal_domain_name: "Google Universal Analytics (analytics.js) domain name, eg: mysite.com; Siehe http://google.com/analytics"
gtm_container_id: "Google Tag Manager Container-ID, z.B.: GTM-ABCDEF"
- gtm_ua_domain_name: "Universal Analytics per Google Tag Manager Domain-Name. 'auto' wird empfohlen."
enable_escaped_fragments: "Als Fallback die Ajax-Crawling-API von Google verwenden, wenn keine Suchmaschine deaktiviert wurde. Siehe https://developers.google.com/webmasters/ajax-crawling/docs/learn-more"
enable_noscript_support: "Aktiviere Standard-Suchmaschinen-Webcrawler-Unterstützung durch den noscript-Tag"
allow_moderators_to_create_categories: "Erlaube Moderatoren neue Kategorien zu erstellen"
cors_origins: "Erlaubte Adressen für Cross-Origin-Requests (CORS). Jede Adresse muss http:// oder https:// enthalten. Die Umgebungsvariable DISCOURSE_ENABLE_CORS muss gesetzt sein, um CORS zu aktivieren."
use_admin_ip_whitelist: "Administratoren können sich nur anmelden, wenn sie von einer IP-Adresse aus zugreifen, welcher unter den vertrauenswürden IP-Adressen gelistet ist (Admin > Logs > Screened Ips)."
- top_menu: "Legt fest, welche Elemente in der Navigationsleiste der Homepage auftauchen sollen, und in welcher Reihenfolge. Beispiel: latest|new|unread|categories|top|read|posted|bookmarks"
+ top_menu: "Legt fest, welche Elemente in der Navigationsleiste der Startseite auftauchen sollen, und in welcher Reihenfolge. Beispiel: latest|new|unread|categories|top|read|posted|bookmarks"
post_menu: "Legt fest, welche Funktionen in welcher Reihenfolge im Beitragsmenü auftauchen. Beispiel: like|edit|flag|delete|share|bookmark|reply"
post_menu_hidden_items: "Die Einträge im Menü eines Beitrags, die standardmäßig hinter einer erweiterbaren Ellipse versteckt werden sollen."
share_links: "Legt fest, welche Dienste in welcher Reihenfolge im Teilen-Dialog auftauchen."
track_external_right_clicks: "Verfolge, welche externen Links per Rechtsklick geöffnet werden (zum Beispiel in einem neuen Browser-Tab). Standardmäßig deaktiviert, da dies URL-Rewrites erfordert."
- site_contact_username: "Gültiger Benutzername eines Mitarbeiters, in dessen Name alle automatisch erzeugten Direktnachrichten versendet werden sollen. Falls leer wird das Standardkonto \"system\" verwendet."
+ site_contact_username: "Gültiger Benutzername eines Team-Mitglieds, in dessen Name alle automatisch erzeugten Direktnachrichten versendet werden sollen. Falls leer wird das Standardkonto \"system\" verwendet."
send_welcome_message: "Sende allen neuen Benutzern eine Willkommensnachricht mit Hinweisen zur Benutzung des Forums."
suppress_reply_directly_below: "Zeige die erweiterbare Anzahl der Antworten auf einen Beitrag nicht, falls die einzige Antwort direkt darunter folgt."
suppress_reply_directly_above: "Verstecke das erweiterbare „Antwort auf“-Feld in einem Beitrag, wenn der beantwortete Beitrag direkt darüber angezeigt wird."
@@ -849,12 +904,11 @@ de:
topics_per_period_in_top_page: "Anzahl der Themen, die in der mit \"Mehr zeigen\" erweiterten Top-Themenübersicht angezeigt werden."
redirect_users_to_top_page: "Verweise neue und länger abwesende Benutzer automatisch zur Angesagt-Seite"
top_page_default_timeframe: "Standardzeitfenster für die oberste, angezeigte Seite."
- show_email_on_profile: "Im Profil die E-Mail-Adresse des Benutzers anzeigen (ist nur für den Benutzer selbst und Mitarbeiter sichtbar)."
+ show_email_on_profile: "Im Profil die E-Mail-Adresse des Benutzers anzeigen (ist nur für den Benutzer selbst und das Team sichtbar)."
prioritize_username_in_ux: "Zeige den Benutzernamen auf der Benutzerseite, der Benutzerkarte und in Beiträgen an erster Stelle (wenn deaktiviert, wird der Name an erster Stelle angezeigt)"
email_token_valid_hours: "Tokens zur Passwort-Wiederherstellung / Aktivierung eines Kontos sind für (n) Stunden gültig."
- email_token_grace_period_hours: "Tokens zur Passwort-Wiederherstellung / Aktivierung eines Kontos sind auch nach ihrer Verwendung noch für eine Frist von (n) Stunden gültig."
enable_badges: "Abzeichen aktivieren"
- enable_whispers: "Erlaube Moderatoren und Administratoren in Beiträgen privat zu kommunizieren (experimentell)"
+ enable_whispers: "Erlaube dem Team private Kommunikation innerhalb von Themen."
allow_index_in_robots_txt: "Suchmaschinen mittels der robots.txt Datei erlauben, die Site zu indizieren."
email_domains_blacklist: "Eine durch senkrechte Striche getrennte Liste von E-Mail-Domains, die für die Registrierung neuer Konten nicht verwendet werden dürfen. Beispiel: mailinator.com|trashmail.net"
email_domains_whitelist: "Eine durch senkrechte Striche getrennte Liste von E-Mail-Domains, die für die Registrierung neuer Konten verwendet werden können. ACHTUNG: Benutzer mit E-Mail-Adressen anderer Domains werden nicht zugelassen!"
@@ -866,7 +920,7 @@ de:
force_hostname: "NUR FÜR ENTWICKLER! ACHTUNG! Spezifiziere einen Hostnamen in der URL. Dieses Feld leer lassen heißt 'keinen'. Dient hauptsächlich Entwicklungszwecken."
invite_expiry_days: "Tage, die Benutzereinladungen gültig bleiben."
invite_passthrough_hours: "Wie viele Stunden ein Benutzer einen bereits eingelösten Einladungsschlüssel zum Anmelden verwenden kann"
- invite_only: "Deaktiviere die öffentliche Registrierung, neue Benutzer können nur durch eine Einladung von existierenden Mitgliedern oder Mitarbeitern beitreten."
+ invite_only: "Deaktiviere die öffentliche Registrierung, neue Benutzer können nur durch eine Einladung von anderen Mitgliedern oder dem Team beitreten."
login_required: "Nur angemeldete Benutzer dürfen Inhalte der Site lesen, anonyme Zugriffe sind verboten."
min_username_length: "Minimale Benutzernamenlänge in Zeichen."
max_username_length: "Maximale Benutzernamenlänge in Zeichen."
@@ -879,11 +933,13 @@ de:
enable_sso_provider: "Aktiviere das Discourse SSO Anbieter Protokoll unter /session/sso_provider; benötigt sso_secret."
sso_url: "URL des Single Sign-On-Endpunkts (muss http:// oder https:// enthalten)"
sso_secret: "Geheimer Schlüssel für die Authentifizierung von SSO-Informationen. Sollte unbedingt 10 Zeichen oder länger sein."
+ sso_overrides_bio: "Überschreibt \"Über mich\" im Benutzerprofil und verhindert Änderungen durch den Benutzer"
sso_overrides_email: "Überschreibt lokale E-Mail mit E-Mail der externen Site aus dem SSO-Payload (WARNUNG: Diskrepanzen können aufgrund der Normalisierung lokaler E-Mail-Adressen auftreten.)"
sso_overrides_username: "Überschreibt lokalen Benutzernamen mit dem Benutzernamen der externen Site aus dem SSO-Payload (WARNUNG: Diskrepanzen können aufgrund von Normalisierung von lokalen Benutzernamen auftreten)"
sso_overrides_name: "Überschreibt den vollen Namen des Benutzers mit den Daten von der externen Site aus dem SSO-Payload bei jedem Login. Außerdem werden lokale Änderungen verhindert."
sso_overrides_avatar: "Überschreibt das Profilbild des Benutzers mit dem Profilbild aus dem SSO-Payload. Wenn aktiv, dann sollte allow_uploaded_avatars deaktiviert werden."
sso_not_approved_url: "Nicht genehmigte SSO-Konten zu dieser URL weiterleiten"
+ sso_allows_all_return_paths: "Beschränke die Domain für SSO-Return-Paths (standardmäßig muss der Return Path auf der aktuellen Seite sein)"
enable_local_logins: "Aktiviere Login mit lokal gespeicherten Benutzernamen und Passwörtern. (Anmerkung: muss aktiviert sein, damit Einladungen funktionieren)"
allow_new_registrations: "Erlaube das Registrieren neuer Benutzerkonten. Wird dies deaktiviert, so kann niemand mehr ein neues Konto erstellen."
enable_signup_cta: "Zeige wiederkehrenden Gästen einen Hinweis, dass diese sich Anmelden oder Registrieren sollen."
@@ -900,6 +956,7 @@ de:
enable_facebook_logins: "Aktiviere Facebook-Authentifizierung (benötigt facebook_app_id und facebook_app_secret)."
facebook_app_id: "App-ID für Facebook-Authentifizierung, registriert auf https://developers.facebook.com/apps"
facebook_app_secret: "App Secret für Facebook-Authentifizierung, registriert auf https://developers.facebook.com/apps"
+ facebook_request_extra_profile_details: "Anfrage zu \"über mich\", Standort und Website von Facebook. (erfordert, dass Deine auth-Anwendung von Facebook genehmigt wurde)"
enable_github_logins: "Aktiviere GitHub-Authentifizierung (benötigt github_client_id und github_client_secret)."
github_client_id: "Client-ID für GitHub-uthentifizierung, registriert auf https://github.com/settings/applications"
github_client_secret: "Client Secret für GitHub-Authentifizierung, registriert auf https://github.com/settings/applications"
@@ -919,11 +976,12 @@ de:
top_topics_formula_log_views_multiplier: "Wert von Log Ansichten Multiplikator (n) in Top Themen Formel: `log(views_count) * (n) + op_likes_count * 0.5 + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`"
top_topics_formula_first_post_likes_multiplier: "Wert für den Multiplikator (n) für die ersten „Gefällt mir“-Angaben pro Beitrag in der Formel für die besten Beiträge: `log(views_count) * 2 + op_likes_count * (n) + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`"
top_topics_formula_least_likes_per_post_multiplier: "Wert für den Multiplikator (n) für die wenigsten „Gefällt mir“-Angaben pro Beitrag in der Formel für die besten Beiträge: `log(views_count) * 2 + op_likes_count * 0.5 + LEAST(likes_count / posts_count, (n)) + 10 + log(posts_count)`"
+ rebake_old_posts_count: "Anzahl alter Beiträge, die im 15 Minuten-Intervall neu generiert werden sollen"
rate_limit_create_topic: "Nach Erstellen eines Themas muss ein Benutzer (n) Sekunden warten, bevor ein weiteres Thema erstellt werden kann."
rate_limit_create_post: "Nach Schreiben eines Beitrags muss ein Benutzer (n) Sekunden warten, bevor ein weiterer Beitrag erstellt werden kann."
rate_limit_new_user_create_topic: "Nach Erstellen eines Themas muss ein neuer Benutzer (n) Sekunden warten, bevor ein weiteres Thema erstellt werden kann."
rate_limit_new_user_create_post: "Nach Schreiben eines Beitrags muss ein neuer Benutzer (n) Sekunden warten, bevor ein weiterer Beitrag erstellt werden kann."
- max_likes_per_day: "Maximale Anzahl der „Gefällt mir“-Angaben pro Benutzer und Tag."
+ max_likes_per_day: "Maximale Anzahl der Likes pro Benutzer und Tag."
max_flags_per_day: "Maximale Anzahl der Meldungen pro Benutzer und Tag."
max_bookmarks_per_day: "Maximale Anzahl der Lesezeichen pro Benutzer und Tag."
max_edits_per_day: "Maximale Anzahl der Bearbeitungen pro Benutzer und Tag."
@@ -933,6 +991,7 @@ de:
max_topic_invitations_per_day: "Maximale Zahl an Thema-Einladungen, die ein Benutzer pro Tag verschicken kann."
alert_admins_if_errors_per_minute: "Anzahl der Fehler pro Minute, bei der ein Administrator benachrichtigt werden soll. Ein Wert von 0 deaktiviert diese Funktion. Achtung: Benötigt einen Neustart."
alert_admins_if_errors_per_hour: "Anzahl der Fehler pro Stunde, bei der ein Administrator benachrichtigt werden soll. Ein Wert von 0 deaktiviert diese Funktion. Achtung: Benötigt einen Neustart."
+ categories_topics: "Anzahl der Themen auf der /categories Seite"
suggested_topics: "Anzahl der empfohlenen Themen am Ende eines Themas."
limit_suggested_to_category: "Zeige nur Themen der aktuellen Kategorie in vorgeschlagenen Themen."
suggested_topics_max_days_old: "Vorgeschlagene Themen sollten nicht älter als (n) Tage alt sein."
@@ -951,12 +1010,14 @@ de:
external_system_avatars_enabled: "Benutze einen externen Avatar Service"
external_system_avatars_url: "URL des externen Profilbild-Dienstes. Erlaubte Platzhalter sind {username} {first_letter} {color} {size}"
default_opengraph_image_url: "URL des standardmäßigen Open-Graph-Bildes."
+ twitter_summary_large_image_url: "URL des Bildes, das standardmäßig in Twitter-Cards angezeigt wird (sollte mindestens 280 Pixel breit und 150 Pixel hoch sein)."
allow_all_attachments_for_group_messages: "Erlaube alle E-Mail-Anhänge für Gruppen-Nachrichten."
convert_pasted_images_to_hq_jpg: "Konvertiert eingefügte Bilder in JPG-Dateien mit hoher Qualität."
+ convert_pasted_images_quality: "Qualität der umgewandelten JPG Datei (1 ist die niedrigste, 100 die beste Qualität)."
enable_flash_video_onebox: "Aktiviere das Einbinden von swf und flv (Adobe Flash) Links in einer Onebox. ACHTUNG: Kann ein Sicherheitsrisiko sein."
default_invitee_trust_level: "Standardwert für die Vertrauensstufe eines eingeladenen Benutzers (0-4)."
default_trust_level: "Standardwert für die Vertrauensstufe (0-4) für alle neuen Benutzer. ACHTUNG! Diesen Wert anzuheben kann zu erhöhtem Spam-Aufkommen führen!"
- tl1_requires_topics_entered: "Die Anzahl der Themen, die ein neuer Benutzer erstellen muss, bevor er in die Vertrauensstufe 1 befördert wird."
+ tl1_requires_topics_entered: "Die Anzahl der Themen, die ein neuer Benutzer betrachten muss, bevor er in die Vertrauensstufe 1 befördert wird."
tl1_requires_read_posts: "Die Anzahl der Beiträge, die ein neuer Benutzer lesen muss, bevor er in die Vertrauensstufe 1 befördert wird."
tl1_requires_time_spent_mins: "Die Anzahl der Minuten, die ein neuer Benutzer mit dem Lesen von Beiträgen verbringen muss, bevor er in die Vertrauensstufe 1 befördert wird."
tl2_requires_topics_entered: "Die Anzahl der Themen, die ein Benutzer betrachten muss, bevor er in die Vertrauensstufe 2 befördert wird."
@@ -977,11 +1038,12 @@ de:
tl3_requires_posts_read_all_time: "Mindestanzahl Beiträge, die ein Benutzer gelesen haben muss, um die Vertrauensstufe Anführer (3) erreichen zu können."
tl3_requires_max_flagged: "Um die Vertrauensstufe 3 erhalten zu können, dürfen in den letzten (tl3 time period) Tagen höchstens X Beiträge eines Benutzer von X verschiedenen anderen Benutzer gemeldet worden sein, wobei X diesem Wert entspricht. (0 oder mehr)"
tl3_promotion_min_duration: "Mindestanzahl an Tagen, die ein Benutzer auf Vertrauensstufe 3 beförderter Benutzer auf dieser Stufe verbleibt, bevor er automatisch wieder auf Vertrauensstufe 2 heruntergestuft werden kann."
- tl3_requires_likes_given: "Mindestanzahl an „Gefällt mir“-Angaben, die ein Benutzer innerhalb der letzten (tl3 time period) gegeben haben muss, um Vertrauensstufe 3 erreichen zu können."
- tl3_requires_likes_received: "Mindestanzahl an „Gefällt mir“-Angaben die ein Benutzer innerhalb der letzten (tl3 time period) bekommen haben muss, um Vertrauensstufe 3 erreichen zu können."
+ tl3_requires_likes_given: "Mindestanzahl an Likes, die ein Benutzer innerhalb der letzten (tl3 time period) gegeben haben muss, um Vertrauensstufe 3 erreichen zu können."
+ tl3_requires_likes_received: "Mindestanzahl an Likes die ein Benutzer innerhalb der letzten (tl3 time period) bekommen haben muss, um Vertrauensstufe 3 erreichen zu können."
tl3_links_no_follow: "rel=nofollow nicht von Links entfernen, die von Benutzern mit Vertrauensstufe 3 erstellt wurden."
min_trust_to_create_topic: "Die minimale Vertrauensstufe wird benötigt um eine neues Thema zu erstellen."
min_trust_to_edit_wiki_post: "Die minimal benötigte Vertrauensstufe, um als Wiki markierte Beiträge bearbeiten zu können."
+ min_trust_to_edit_post: "Die minimal benötigte Vertrauensstufe, um Beiträge bearbeiten zu können."
min_trust_to_allow_self_wiki: "Die minimale Vertrauensstufe, die ein Benutzer haben muss, um einen eigenen Wiki Eintrag zu erstellen."
min_trust_to_send_messages: "Benötigte Vertrauensstufe um neue private Nachrichten erstellen zu dürfen."
newuser_max_links: "Maximale Anzahl der Links, die neue Benutzer Beiträgen hinzufügen dürfen."
@@ -1003,6 +1065,7 @@ de:
title_fancy_entities: "Konvertiere HTML-Entitys in Thementiteln."
min_title_similar_length: "Minimale Länge eines Titels, bevor nach ähnlichen Titeln gesucht wird."
min_body_similar_length: "Minimale Länge eines Beitragstextes, bevor nach ähnlichen Themen gesucht wird."
+ desktop_category_page_style: "Visueller Stil für die /categories Seite"
category_colors: "Liste hexadezimaler Farbwerte, die als Kategoriefarben erlaubt sind."
category_style: "Visueller Stil für Kategorie-Abzeichen."
max_image_size_kb: "Maximale Größe eines hochgeladenen Bilds in kB. Dieser Wert muss auch in Nginx (client_max_body_size), Apache oder anderen Proxies entsprechend konfiguriert werden."
@@ -1019,19 +1082,19 @@ de:
history_hours_low: "Bearbeitungs-Symbol leicht hervorheben, wenn der Beitrag innerhalb so vieler Stunden nach Erstellen bearbeitet wird."
history_hours_medium: "Bearbeitungs-Symbol mäßig hervorheben, wenn der Beitrag innerhalb so vieler Stunden nach Erstellen bearbeitet wird."
history_hours_high: "Bearbeitungs-Symbol stark hervorheben, wenn der Beitrag innerhalb so vieler Stunden nach Erstellen bearbeitet wird."
- topic_post_like_heat_low: "Feld für Anzahl der Antworten leicht hervorheben, wenn das Verhältnis von „Gefällt mir“-Angaben zu Antworten diesen Wert übersteigt."
- topic_post_like_heat_medium: "Feld für Anzahl der Antworten mäßig hervorheben, wenn das Verhältnis von „Gefällt mir“-Angaben zu Antworten diesen Wert übersteigt."
- topic_post_like_heat_high: "Feld für Anzahl der Antworten stark hervorheben, wenn das Verhältnis von „Gefällt mir“-Angaben zu Antworten diesen Wert übersteigt."
+ topic_post_like_heat_low: "Feld für Anzahl der Antworten leicht hervorheben, wenn das Verhältnis von Likes zu Antworten diesen Wert übersteigt."
+ topic_post_like_heat_medium: "Feld für Anzahl der Antworten mäßig hervorheben, wenn das Verhältnis von Likes zu Antworten diesen Wert übersteigt."
+ topic_post_like_heat_high: "Feld für Anzahl der Antworten stark hervorheben, wenn das Verhältnis von Likes zu Antworten diesen Wert übersteigt."
faq_url: "Vollständige URL zu einer externen FAQ, welche du gerne verwenden möchtest."
tos_url: "Die vollständige URL zu deinen extern gehosteten Nutzungsbedingungen, sofern vorhanden."
privacy_policy_url: "Die vollständige URL zu deinen extern gehosteten Datenschutzrichtlinien, sofern vorhanden."
newuser_spam_host_threshold: "Wie häufig kann ein neuer Benutzer Links der gleichen Domain innerhalb ihrer `newuser_spam_host_threshold` Beiträge schreiben, ohne als Spam eingeordnet zu werden."
white_listed_spam_host_domains: "Liste von Domänen, die keinem Spam-Host Test unterzogen werden. Neue Benutzer werden niemals daran gehindert, Beiträge mit Links zu diesen Domains zu erstellen."
- staff_like_weight: "Zusätzlicher Gewichtungsfaktor für \"Gefällt mir\" Wertungen von Mitarbeitern."
+ staff_like_weight: "Zusätzlicher Gewichtungsfaktor für Likes vom Team."
topic_view_duration_hours: "Alle (n) Stunden einen neuen Themenaufruf pro IP/Benutzer zählen."
user_profile_view_duration_hours: "Alle (n) Stunden einen neuen Profilaufruf pro IP/Benutzer zählen."
levenshtein_distance_spammer_emails: "E-Mail-Adressen, die sich um so viele Zeichen unterscheiden, werden beim Abgleich mit Adressen der Spammer dennoch als identisch betrachtet."
- max_new_accounts_per_registration_ip: "Keine neuen Registrierungen von einer IP-Adresse annehmen, zu der bereits (n) Benutzerkonten mit Vertrauensstufe 0 (und keine davon sind Mitarbeiter oder mit Vertrauensstufe 2 oder höher) gehören."
+ max_new_accounts_per_registration_ip: "Keine neuen Registrierungen von einer IP-Adresse annehmen, wenn bereits (n) Benutzerkonten mit Vertrauensstufe 0 zugeordnet sind (und keines davon ein Team-Mitglied ist oder eine Vertrauensstufe 2 oder höher hat)."
min_ban_entries_for_roll_up: "Ein Klick auf den \"Zusammenfassen\" Knopf führt (N) oder mehr Sperren zu einer einzelnen Subnetz-Sperre zusammen."
max_age_unmatched_emails: "Gefilterte E-Mail-Adressen nach (N) Tagen ohne Treffer löschen."
max_age_unmatched_ips: "Gefilterte IP-Adressen nach (N) Tagen ohne Treffer löschen."
@@ -1044,7 +1107,7 @@ de:
auto_block_first_post_regex: "Regulärer Ausdruck der dafür sorgt dass passende erste Beiträge von Benutzern genehmigt werden müssen. Groß- und Kleinschreibung wird nicht beachtet.\nBeispiel: raging|a[bc]a blockiert alle ersten Beiträge, die raging, aba oder aca beinhalten. Wird nur auf den ersten Beitrag angewendet."
reply_by_email_enabled: "Aktviere das Antworten auf Themen via E-Mail."
reply_by_email_address: "Vorlage für die Antwort einer per E-Mail eingehender E-Mail-Adresse, zum Beispiel: %{reply_key}@reply.example.com oder replies+%{reply_key}@example.com"
- alternative_reply_by_email_addresses: "Liste alternativer Vorlagen für eingehende E-Mail-Adressen für das Antworten per E-Mail"
+ alternative_reply_by_email_addresses: "Liste alternativer Vorlagen für eingehende E-Mail-Adressen für das Antworten per E-Mail. Beispiel: %{reply_key}@antwort.example.com|antworten+%{reply_key}@example.com"
incoming_email_prefer_html: "Verwende die HTML-Version statt der Text-Version für eingehende E-Mails. Kann unerwartete Formatierungsprobleme verursachen!"
disable_emails: "Discourse daran hindern jegliche E-Mails zu verschicken"
strip_images_from_short_emails: "Entferne Bilder aus E-Mails kleiner als 2800 Bytes."
@@ -1056,18 +1119,23 @@ de:
max_emails_per_day_per_user: "Maximale Zahl an E-Mails, die Benutzern gesendet werden. 0 zum Deaktivieren der Grenze."
enable_staged_users: "Erstelle automatisch vorbereitete Benutzer, wenn eingehende E-Mails verarbeitet werden."
maximum_staged_users_per_email: "Maximale Anzahl vorbereiteter Benutzer, wenn eine eingehende E-Mail bearbeitet wird."
- auto_generated_whitelist: "Liste von E-Mail-Adressen, die nicht auf automatisch generierte Inhalte überprüft werden."
+ auto_generated_whitelist: "Liste von E-Mail-Adressen, die nicht auf automatisch generierte Inhalte überprüft werden. Beispiel: foo@bar.com|discourse@example.com"
block_auto_generated_emails: "Eingehende E-Mails blockieren, die als automatisch generiert erkannt werden."
ignore_by_title: "Ignoriere eingehende E-Mails basierend auf ihrem Betreff."
mailgun_api_key: "Geheimer Mailgun-API-Schlüssel, um Webhook-Nachrichten zu überprüfen"
- soft_bounce_score: "Bounce-Score, der einem Benutzer hinzugefügt wird, wenn eine E-Mail vorübergehend nicht zugestellt werden kann."
- hard_bounce_score: "Bounce-Score, der einem Benutzer hinzugefügt werden, wenn eine E-Mail dauerhaft nicht zugestellt werden konnte."
+ soft_bounce_score: "Der Bounce-Score des Benutzers wird um diesen Wert erhöht, wenn eine E-Mail vorübergehend nicht zugestellt werden kann."
+ hard_bounce_score: "Der Bounce-Score des Benutzers wird um diesen Wert erhöht, wenn eine E-Mail dauerhaft nicht zugestellt werden konnte."
bounce_score_threshold: "Bounce-Score, ab dem wir einem Benutzer keine E-Mails mehr senden."
bounce_score_threshold_deactivate: "Bounce-Score, ab dem wir einen Benutzer deaktivieren."
reset_bounce_score_after_days: "Bounce-Score automatisch nach X Tagen zurücksetzen."
+ attachment_content_type_blacklist: "Liste der Schlüsselwörter für die Ablehnung von Anhängen basierend auf Inhaltstypen."
+ attachment_filename_blacklist: "Liste der Schlüsselwörter für die Ablehnung von Anhängen basierend auf dem Dateinamen."
+ enable_forwarded_emails: "[Beta] Erlaube Benutzern, ein Thema zu erstellen, indem sie eine E-Mail weiterleiten."
+ always_show_trimmed_content: "Immer den gekürzten Teil von eingehenden E-Mails anzeigen. WARNUNG: lässt möglicherweise E-Mail-Adressen erkennen."
manual_polling_enabled: "Eingehende E-Mails über die API für E-Mail-Antworten annehmen."
pop3_polling_enabled: "E-Mail-Antworten über POP3 abholen."
pop3_polling_ssl: "SSL für die Verbindung zum POP3-Server verwenden. (Empfohlen)"
+ pop3_polling_openssl_verify: "Überprüfe TLS-Server-Zertifikat (Standard: aktiviert)"
pop3_polling_period_mins: "Intervall in Minuten zum Abholen neuer E-Mails vom POP3-Konto. HINWEIS: benötigt Neustart."
pop3_polling_port: "Port für die POP3-Abfrage."
pop3_polling_host: "Hostname für die POP3-Abfrage."
@@ -1090,20 +1158,27 @@ de:
allow_animated_thumbnails: "Generiert animierte Vorschaubilder aus animierten GIFs."
default_avatars: "URLs zu Bildern, die als Standard-Profilbilder verwendet werden sollen, bis neue Benutzer ihr Profilbild geändert haben."
automatically_download_gravatars: "Profilbilder von Gravatar herunterladen, wenn ein Benutzer sich registriert oder seine E-Mail-Adresse ändert."
- digest_topics: "Maximale Anzahl von Themen, die in der E-Mail-Zusammenfassung angezeigt werden."
+ digest_topics: "Die maximale Anzahl von Top-Beiträgen, die in der E-Mail-Zusammenfassung angezeigt werden sollen."
+ digest_posts: "Die maximale Anzahl von beliebten Beiträgen, die in der E-Mail-Zusammenfassung angezeigt werden sollen."
+ digest_other_topics: "Die maximale Anzahl von Themen, die in dem Bereich 'Neues in Themen und Kategorien, denen du folgst' in der E-Mail-Zusammenfassung angezeigt werden sollen."
digest_min_excerpt_length: "Minimale Zeichenlänge für Auszüge von Beiträgen in der E-Mail-Zusammenfassung."
- delete_digest_email_after_days: "Unterdrücke E-Mail-Zusammenfassungen für Benutzer, die länger als (n) Tage nicht auf der Seite gesehen wurden."
+ delete_digest_email_after_days: "Unterdrücke E-Mail-Zusammenfassungen für Benutzer, die länger als (n) Tage nicht auf der Site gesehen wurden."
digest_suppress_categories: "Unterdrücke diese Kategorien in E-Mail-Zusammenfassungen."
disable_digest_emails: "Deaktiviere E-Mail-Zusammenfassungen für alle Benutzer."
+ email_accent_bg_color: "Die Hervorhebungsfarbe, die als Hintergrund mancher Elemente in HTML-E-Mails verwendet wird. Gib’ einen Namen ('red') oder einen Hex-Wert ('#FF000') der Farbe an."
+ email_accent_fg_color: "Gib’ einen Namen ('white') oder einen Hex-Wert ('#FFFFFF') der Farbe an."
+ email_link_color: "Die Farbe von Links in HTML-Mails. Gib’ einen Namen ('blue') oder einen Hex-Wert ('#0000FF') der Farbe an."
detect_custom_avatars: "Aktiviere diese Option, um zu überprüfen, ob Benutzer eigene Profilbilder hochgeladen haben."
max_daily_gravatar_crawls: "Wie oft pro Tag Discourse höchstens auf Gravatar nach benuterdefinierten Avataren suchen soll."
public_user_custom_fields: "Liste selbst definierter Profil-Felder, die öffentlich angezeigt werden dürfen."
- staff_user_custom_fields: "Liste selbst definierter Profil-Felder, die Mitarbeitern angezeigt werden dürfen."
+ staff_user_custom_fields: "Eine Liste von benutzerdefinierten Benutzerfeldern, die vom Team eingesehen werden können."
enable_user_directory: "Aktiviert ein durchsuchbares Benutzerverzeichnis"
+ enable_group_directory: "Aktiviert ein durchsuchbares Gruppenverzeichnis"
allow_anonymous_posting: "Benutzern erlauben, in den anonymen Modus zu wechseln"
anonymous_posting_min_trust_level: "Vertrauensstufe, ab der das Schreiben anonymer Beiträge erlaubt ist"
anonymous_account_duration_minutes: "Erzeuge alle (n) Minuten ein neues anonymes Konto je Benutzer, um die Anonymität der virtuellen anonymen Benutzer zu gewährleisten. Beispiel: Ein Wert von 600 sorgt dafür, dass ein neues anonymes Konto erzeugt wird, wenn ein Benutzer in den anonymen Modus wechselt UND mindestens 600 Minuten seit der letzten anonymen Nachricht dieses Benutzers vergangen sind."
hide_user_profiles_from_public: "Deaktiviert Benutzerkarten, Benutzerprofile und das Benutzerverzeichnis für anonyme Benutzer."
+ user_website_domains_whitelist: "Benutzer-Webseiten werden mit diesen Domains abgeglichen. Mehrere Domains können mit einem Pipe-Symbol „|“ getrennt angegeben werden."
allow_profile_backgrounds: "Erlaubt es Benutzern, Profilhintergründe hochzuladen."
sequential_replies_threshold: "Anzahl an Beiträgen die ein Benutzer machen muss, um benachrichtigt zu werden, dass er zu viele aufeinanderfolgende Antworten schreibt."
enable_mobile_theme: "Mobilgeräte verwenden eine mobile Darstellung mit der Möglichkeit zur vollständigen Site zu wechseln. Deaktiviere diese Option, wenn du ein eigenes Full-Responsive-Stylesheet verwenden möchtest."
@@ -1116,6 +1191,8 @@ de:
automatically_unpin_topics: "Themen automatisch loslösen, wenn ein Benutzer das Ende erreicht."
read_time_word_count: "Wörter pro Minute für die Berechnung der geschätzten Lesezeit."
topic_page_title_includes_category: "Name des Themas enthält den Namen der Kategorie."
+ native_app_install_banner: "Wiederkehrende Benutzer dazu einladen, die native Discourse-App herunterzuladen."
+ max_prints_per_hour_per_user: "Maximale Anzahl von Aufrufen der Druckansicht pro Nutzer pro Stunde (0 zum deaktivieren)"
full_name_required: "Der voller Name wird für das Benutzerprofil benötigt."
enable_names: "Zeigt den vollen Namen eines Benutzers auf dem Profil, der Benutzerkarte und in E-Mails an. Wenn deaktiviert wird der volle Name überall ausgeblendet."
display_name_on_posts: "Zeige zusätzlich zum @Benutzernamen auch den vollen Namen des Benutzers bei seinen Beiträgen."
@@ -1130,16 +1207,17 @@ de:
feed_polling_url: "NUR WENN EINGEBETTET: URL des einzubettenden RSS-/ATOM-Feeds."
embed_by_username: "Discourse-Benutzername des Benutzers, der die eingebetteten Themen erstellt."
embed_username_key_from_feed: "Schlüssel, um Discourse-Benutzernamen aus Feed zu ermitteln."
+ embed_title_scrubber: "Regulärer Ausdruck (Regex) um eingebettete Titel zu bereinigen"
embed_truncate: "Kürze die eingebetteten Beiträge"
+ allowed_href_schemes: "URI-Schemas, die in Links zusätzlich zu http und https erlaubt sind."
embed_post_limit: "Maximale Anzahl der Beiträge die eingebettet werden."
embed_username_required: "Der Benutzername ist für die Themenerstellung notwendig"
embed_whitelist_selector: "CSS-Selektor für Elemente, die in Einbettungen erlaubt sind."
embed_blacklist_selector: "CSS-Selektor für Elemente, die in Einbettungen entfernt werden."
notify_about_flags_after: "Wenn es Meldungen gibt, die nicht nach dieser Anzahl von Stunden behandelt wurden, sende eine E-Mail an contact_email. Setze dies auf 0 um es zu deaktivieren."
- enable_cdn_js_debugging: "Ermöglicht die Anzeige vollständiger Fehler auf /logs, indem alle eingebetteten JavaScripts Cross-Origin Zugriffsberechtigungen erhalten."
show_create_topics_notice: "Administratoren eine Warnmeldung anzeigen, wenn im Forum weniger als 5 öffentlich sichtbare Themen existieren."
delete_drafts_older_than_n_days: Lösche Entwürfe, die mehr als (n) Tage alt sind.
- bootstrap_mode_min_users: "Erforderliche Benutzeranzahl, um den Bootstrapping-Modus zu deaktivieren (0 = ausgeschaltet)"
+ bootstrap_mode_min_users: "Erforderliche Benutzeranzahl, um den Starthilfe-Modus zu deaktivieren (0 = ausgeschaltet)"
vacuum_db_days: "Führe VACUUM ANALYZE aus, um Datenbankspeicher nach Migrationen zurückzuerhalten (0 um zu deaktivieren)"
prevent_anons_from_downloading_files: "Nichtangemeldeten Benutzern das Herunterladen von Anhängen verbieten. WARNUNG: dies verhindert auch das Herunterladen jeglicher Ressourcen für Website-Anpassungen, die als Anhänge gespeichert wurden."
slug_generation_method: "Gib eine Methode an, wie Kürzel in URLs generiert werden sollen. 'encoded' verwendet einen Prozent-Encodierten String, bei 'none' wird kein Kürzel verwendet."
@@ -1148,6 +1226,7 @@ de:
enforce_square_emoji: "Emojis immer mit quadratischem Seitenverhältnis darstellen."
approve_post_count: "Anzahl der Beiträge eines neuen Benutzer oder Anwärters, die genehmigt werden müssen"
approve_unless_trust_level: "Beiträge von Benutzer unterhalb dieser Vertrauensstufe müssen genehmigt werden"
+ approve_new_topics_unless_trust_level: "Beiträge von Benutzer unterhalb dieser Vertrauensstufe müssen genehmigt werden"
notify_about_queued_posts_after: "Wenn es Beiträge gibt, die länger als diese Anzahl von Stunden auf ihre Überprüfung gewartet haben, sende eine E-Mail an contact_email. Setze sie auf 0, um diese E-Mails zu deaktivieren."
auto_close_messages_post_count: "Maximale Anzahl von Beiträgen, die in einer Nachricht erlaubt sind, bevor sie automatisch geschlossen wird (0 = ausgeschaltet)"
auto_close_topics_post_count: "Maximale Anzahl von Beiträgen, die in einem Thema erlaubt sind, bevor es automatisch geschlossen wird (0 = ausgeschaltet)"
@@ -1164,15 +1243,25 @@ de:
default_email_in_reply_to: "Standardmäßig einen Anriss des Beitrags, auf den geantwortet wurde, in E-Mails einfügen."
default_other_new_topic_duration_minutes: "Zeit wie lange ein Thema als \"Neu\" markiert werden soll. "
default_other_auto_track_topics_after_msecs: "Zeit bevor ein Thema automatisch verfolg wird. "
+ default_other_notification_level_when_replying: "Globales Standard-Benachrichtigungslevel, wenn ein Benutzer auf ein Thema antwortet."
default_other_external_links_in_new_tab: "Öffne externe Links standardmäßig in einem neuen Tab."
default_other_enable_quoting: "Aktiviere standardmäßig die Zitat-Antwort Funktion für hervorgehobenen Text."
default_other_dynamic_favicon: "Zeige standardmäßig die Anzahl von neuen und geänderten Beiträgen im Browser-Symbol an."
default_other_disable_jump_reply: "Springe standardmäßig nicht zum neusten Beitrag des Users, wenn dieser geantwortet hat."
- default_other_like_notification_frequency: "Benutzer standardmäßig bei „Gefällt mir“-Angaben benachrichtigen."
+ default_other_like_notification_frequency: "Benutzer standardmäßig bei erhaltenen Likes benachrichtigen."
default_topics_automatic_unpin: "Standardmäßig Themen automatisch loslösen, wenn ein Benutzer das Ende erreicht."
default_categories_watching: "Liste der standardmäßig beobachteten Kategorien."
default_categories_tracking: "Liste der standardmäßig gefolgten Kategorien."
default_categories_muted: "Liste der standardmäßig stummgeschalteten Kategorien."
+ default_categories_watching_first_post: "Liste von Kategorien, in denen der erste Beiträge in jedem neuen Thema automatisch beobachtet wird."
+ max_user_api_reqs_per_day: "Maximale Zahl der Benutzer API Anfragen pro Schlüssel pro Tag"
+ max_user_api_reqs_per_minute: "Maximale Zahl der Benutzer API Anfragen pro Schlüssel pro Minute"
+ allow_user_api_keys: "Erlaube das Generieren von Benutzer-API-Schlüsseln"
+ allow_user_api_key_scopes: "Liste erlaubter Scopes für Benutzer-API-Schlüssel"
+ max_api_keys_per_user: "Maximale Zahl der Benutzer API Anfragen pro Benutzer"
+ min_trust_level_for_user_api_key: "Erforderliche Vertrauensstufe für die Generierung von Benutzer API Schlüsseln"
+ allowed_user_api_auth_redirects: "Erlaubte URL für die Authentifizierungs-Umleitung von Benutzer API Schlüsseln"
+ allowed_user_api_push_urls: "Erlaubte URL für Server-Push zur Benutzer API"
tagging_enabled: "Schlagwörter für Themen aktivieren"
min_trust_to_create_tag: "Minimale Vertrauensstufe, um ein Schlagwort zu erstellen."
max_tags_per_topic: "Maximale Anzahl an Schlagwörtern, die einem Thema hinzugefügt werden können."
@@ -1182,10 +1271,13 @@ de:
max_tags_in_filter_list: "Maximale Anzahl von Schlagwörtern, die in einer Dropdown-Liste angezeigt werden. Es werden die am häufigsten verwendeten Schlagwörter angezeigt."
tags_sort_alphabetically: "Zeige Schlagwörter in alphabetischer Reihenfolge. Standardmäßig werden sie nach Beliebtheit sortiert."
tag_style: "Visueller Stil für Schlagwort-Abzeichen."
- staff_tags: "Eine Liste von Schlagwörtern, die nur von Mitarbeitern angewendet werden können."
+ staff_tags: "Eine Liste von Schlagwörtern, die nur von Team-Mitgliedern angewendet werden können."
min_trust_level_to_tag_topics: "Minimale Vertrauensstufe, um Schlagwörter zu Themen hinzuzufügen."
- suppress_overlapping_tags_in_list: "Schlagwörter in Listen verstecken, wenn sie mit dem Titel überlappen."
- remove_muted_tags_from_latest: "Zeige in der Liste der neusten Beiträge keine Themen mit stummgeschalteten Schlagwörtern."
+ suppress_overlapping_tags_in_list: "Schlagwort nicht zeigen, wenn es genau so im Thementitel vorkommt"
+ remove_muted_tags_from_latest: "Zeige in der Liste der neuesten Beiträge keine Themen mit stummgeschalteten Schlagwörtern."
+ company_short_name: "Firmenname (kurz)"
+ company_full_name: "Firmenname (komplett)"
+ company_domain: "Firmendomain"
errors:
invalid_email: "Ungültige E-Mail-Adresse"
invalid_username: "Es gibt keinen Benutzer mit diesem Benutzernamen."
@@ -1208,6 +1300,7 @@ de:
reply_by_email_address_is_empty: "Du musst 'reply by email address' definieren, bevor per E-Mail antworten aktiviert wird"
email_polling_disabled: "Du musst entweder manuelles oder POP3 polling aktivieren, bevor per E-Mail antworten aktiviert wird"
user_locale_not_enabled: "Du musst zuerst 'allow user locale' aktivieren bevor du dies aktivierst"
+ invalid_regex: "Regulärer Ausdruck ist ungültig oder nicht erlaubt."
search:
within_post: "#%{post_number} von %{username}"
types:
@@ -1278,10 +1371,10 @@ de:
other: "Dieses Thema wurde automatisch %{count} Minuten nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt."
autoclosed_disabled: "Dieses Thema ist nun offen. Neue Beiträge werden angenommen."
autoclosed_disabled_lastpost: "Dieses Thema ist jetzt geöffnet. Neue Antworten sind erlaubt."
- pinned_enabled: "Dieses Thema ist nun angepinnt. In seiner Kategorie wird es nun oben aufgelistet, solange der Pin nicht von einem Mitarbeiter gelöst wird, oder nicht jeder Benutzer selbst den Pin löst."
- pinned_disabled: "Dieses Thema ist nun nicht mehr angepinnt. In seiner Kategorie wird es nicht länger oben aufgelistet."
- pinned_globally_enabled: "Dieses Thema ist nun global angepinnt. Es wird sowohl in seiner Kategorie als auch in allen anderen Themenlisten oben aufgelistet, solange der Pin nicht von einem Mitarbeiter gelöst wird, oder nicht jeder Benutzer selbst den Pin löst."
- pinned_globally_disabled: "Dieses Thema ist nun nicht mehr angepinnt. In seiner Kategorie wird es nicht länger oben aufgelistet."
+ pinned_enabled: "Dieses Thema ist nun angeheftet. In seiner Kategorie wird es nun oben erscheinen, bis es vom Team oder von einzelnen Benutzer losgelöst wird."
+ pinned_disabled: "Dieses Thema ist nun nicht mehr angeheftet. In seiner Kategorie erscheint es nicht länger oben."
+ pinned_globally_enabled: "Dieses Thema ist nun global angeheftet. Es wird in seiner Kategorie und in allen Themenlisten oben erscheinen, bis es vom Team oder von einzelnen Benutzer losgelöst wird."
+ pinned_globally_disabled: "Dieses Thema ist nicht mehr angeheftet. In seiner Kategorie wird es nicht länger oben erscheinen."
visible_enabled: "Das Thema ist jetzt gelistet. Es wird in der Themenliste angezeigt."
visible_disabled: "Das Thema ist jetzt ungelistet. Es wird nicht mehr in der Themenliste angezeigt. Dieses Thema kann nur mit einem direkten Link erreicht werden."
login:
@@ -1300,6 +1393,7 @@ de:
something_already_taken: "Etwas ist schief gelaufen. Möglicherweise ist der Benutzername bereits registriert. Probiere den 'Passwort vergessen'-Link."
omniauth_error: "Entschuldigung, bei der Autorisierung deines Kontos ist ein Fehler aufgetreten. Hast du die Autorisierung möglicherweise abgelehnt?"
omniauth_error_unknown: "Während des Anmeldens ist etwas schief gelaufen, bitte versuche es noch einmal."
+ authenticator_error_no_valid_email: "E-Mail-Adressen mit %{account} sind nicht erlaubt. Du musst möglicherweise dein Konto mit einer anderen E-Mail-Adresse einrichten."
new_registrations_disabled: "Leider können derzeit keine neuen Konten registriert werden."
password_too_long: "Passwörter sind beschränkt auf 200 Zeichen."
email_too_long: "Die von dir eingegebene E-Mail-Adresse ist zu lang. Der Teil vor dem @ darf maximal 254 Zeichen lang sein und Domain-Namen maximal 253 Zeichen."
@@ -1327,6 +1421,8 @@ de:
ip_address:
blocked: "Neue Registrierungen sind von deiner IP-Adresse aus nicht erlaubt."
max_new_accounts_per_registration_ip: "Weitere Registrierungen sind von deiner IP-Adresse aus nicht gestattet (limit erreicht). Kontaktiere einen Administrator mit dem Problem damit er dir helfen kann."
+ website:
+ domain_not_allowed: "Webseite ist ungültig. Erlaubte Domains sind: %{domains}"
flags_reminder:
flags_were_submitted:
one: "Vor über einer Stunde wurden Meldungen gesendet. Bitte überprüfe sie."
@@ -1478,7 +1574,7 @@ de:
- Schaue dir im [GitHub-Changelog](https://github.com/discourse/discourse/commits/master) an, was neu ist
- - Besuche [meta.discourse.org](http://meta.discourse.org) ffür Neuigkeiten, Diskussionen und Support für Discourse
+ - Besuche [meta.discourse.org](https://meta.discourse.org) für Neuigkeiten, Diskussionen und Support für Discourse
new_version_mailer_with_notes:
subject_template: "[%{site_name}] Update verfügbar"
text_body_template: |
@@ -1491,7 +1587,7 @@ de:
- Schaue dir im [GitHub-Changelog](https://github.com/discourse/discourse/commits/master) an, was neu ist
- - Besuche [meta.discourse.org](http://meta.discourse.org) ffür Neuigkeiten, Diskussionen und Support für Discourse
+ - Besuche [meta.discourse.org](https://meta.discourse.org) für Neuigkeiten, Diskussionen und Support für Discourse
### Versionshinweise
@@ -1530,102 +1626,14 @@ de:
Mehrere Community-Mitglieder haben diesen Beitrag gemeldet, bevor er ausgeblendet wurde, daher prüfe bitte, wie du deinen Beitrag möglicherweise anpassen kannst, um ihr Feedback zu berücksichtigen. **Du kannst deinen Beitrag nach %{edit_delay} Minuten bearbeiten und er wird automatisch wieder sichtbar.**
- Wenn der Beitrag jedoch von der Community erneut ausgeblendet wurde, wird er ausgeblendet bleiben, bis sich ein Mitarbeiter darum kümmert – und möglicherweise gibt es weitere Maßnahmen, einschließlich einer möglichen Sperrung deines Kontos.
+ Wenn der Beitrag jedoch von der Community erneut ausgeblendet wurde, wird er ausgeblendet bleiben, bis sich das Team darum kümmert – und möglicherweise gibt es weitere Maßnahmen, einschließlich einer möglichen Sperrung deines Kontos.
Weitre Hinweise findest du in unseren [Community-Richtlinien](%{base_url}/guidelines).
usage_tips:
text_body_template: |
- Hier sind ein paar Tipps für deine ersten Schritt:
+ Ein paar Tipps für die ersten Schritte als neuer Benutzer [findest du in diesem Blog-Eintrag](http://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/).
- ## Lesen
-
- Um mehr zu lesen, **scrolle einfach immer weiter nach unten!**
-
- Wenn neue Beiträge oder neue Themen eintreffen, erscheinen sie automatisch – ein Neuladen der Seite ist dazu nicht nötig.
-
- ## Navigation
-
- - Für die Suche, dein Benutzerprofil, oder das ☰-Menü, verwende die **Icon-Schaltflächen oben rechts**.
-
- - Ein Klick auf den Titel eines Themas wird dich immer zum **nächsten ungelesenen Beitrag** im Thema bringen. Um stattdessen am Anfang oder am Ende einzusteigen, klicke auf die Anzahl an Antworten oder das Datum der letzten Aktivität.
-
-
-
- - Während du ein Thema liest, kannst du den Zeitstrahl auf der rechten Seite verwenden, um zum Anfang, zum Ende oder zu deiner letzten Leseposition zu springen. Auf kleineren Bildschirmen klicke auf den Fortschrittsbalken unten rechts, um ihn zu erweitern:
-
-
-
- Du kannst auch ? auf deiner Tastatur drücken für eine Liste super-schneller Tastaturkombinationen.
-
- ## Antworten
-
- Um ein Zitat einzufügen, markiere den Text, den du zitieren möchtest und klicke auf eine
Antworten-Schaltfläche, um den Editor zu öffnen. Wiederhole diese Schritte für mehrere Zitate.
-
-
-
- Du kannst immer weiter lesen, während du deine Antwort verfasst, und wir werden automatisch Entwürfe speichern, während du schreibst.
-
- Um jemanden über deine Antwort zu benachrichtigen, erwähne seinen Namen. Tippe `@`, um mit der Auswahl eines Benutzernamens zu beginnen.
-
-
-
- Um einen [Standard-Emoji](http://www.emoji.codes/) zu verwenden, tippe einfach `:` zur Suche nach Name oder verwende klassische Smileys `;)`
-
-
-
- Um eine Zusammenfassung für einen Link zu generieren, füge in auf einer eigenen Zeile ein:
-
-
-
- Deine Antwort kannst du mit einfachem HTML, BBCode oder [Markdown](http://commonmark.org/help/) formatieren:
-
- Das ist **fett**.
- Das ist fett.
- Das ist [b]fett[/b].
-
- Für weitere Formatierungstipps, [probiere unser 10-minütiges, interaktives Tutorial!](http://commonmark.org/help/tutorial/)
-
- ## Aktionen
-
- Es gibt Aktionsschaltflächen am Ende jedes Beitrags:
-
-
-
- - Um jemanden wissen zu lassen, dass du seinen/ihren Beitrag genossen und geschätzt hast, verwende die **Gefällt mir**-Schaltfläche. Teile etwas Liebe!
-
- - Schnapp’ dir einen kopierbaren Link zu einem beliebigen Beitrag oder Thema über die **Link**-Schaltfläche.
-
- - Verwende die … „Mehr anzeigen“-Schaltfläche, um weitere Aktionen anzuzeigen. **Melde**, um den Verfasser oder [unsere Mitarbeiter](%{base_url}/about) vertraulich über ein Problem zu informieren. Setze ein **Lesezeichen**, um den Beitrag später auf deinem Benutzerprofil wiederzufinden.
-
- ## Benachrichtigungen
-
- Wenn dir jemand antwortet, deinen Beitrag zitiert, deinen `@Benutzername` erwähnt oder auch auf deinen Beitrag verlinkt, wird oben rechts auf der Seite automatisch eine Zahl erscheinen. Klicke auf sie, um auf deine **Benachrichtigungen** zuzugreifen.
-
-
-
- Mach’ dir keine Sorgen, dass du einen Beitrag übersiehst – du wirst Benachrichtigungen per E-Mail erhalten, wenn du einmal weg bist.
-
- ## Einstellungen
-
- - Themen, die weniger als **zwei Tage alt** sind, werden als neu eingestuft.
-
- - Jedes Thema, an dem du dich **aktiv beteiligt** hast (indem du es erstellst, darin antwortest oder lange genug liest) wird automatisch in deinem Namen verfolgt.
-
- Du wirst bei diesen Themen die Anzahl neuer und ungelesener Beiträge sehen:
-
-
-
- Du kannst deine Benachrichtigungen zu jedem Thema über die Benachrichtigungseinstellungen am Ende und auf der rechten Seite jedes Themas verwalten.
-
-
-
- Du kannst auch Benachrichtigungen pro Kategorie einstellen, wenn du jedes Thema einer Kategorie beobachten oder stummschalten möchtest.
-
- Um eine dieser Einstellungen zu ändern, gehe zu [deinen Benutzereinstellungen](%{base_url}/my/preferences).
-
- ## Vertrauen in die Community
-
- Es ist großartig, dich zu treffen! Während du dich hier beteiligst, werden wir dich besser kennenlernen und deine vorübergehenden Beschränkungen für neue Benutzer werden aufgehoben. Beteilige dich weiter und im Laufe der Zeit wirst du neue [Vertrauensstufen](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) erhalten, die spezielle Fähigkeiten umfassen, die Community gemeinsam zu verwalten.
+ Während du hier teilnimmst, werden wir dich kennenlernen und die vorübergehenden Einschränkungen für neue Benutzer werden aufgehoben. Über die Zeit, erreichst du [Vertrauensstufen](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924), die spezielle Fähigkeiten beinhalten, um die Community gemeinsam zu verwalten.
welcome_user:
subject_template: "Willkommen bei %{site_name}!"
text_body_template: |
@@ -1637,7 +1645,7 @@ de:
Viel Spaß!
- (Wenn du als neuer Benutzer unter vier Augen mit einem unserer [Mitarbeiter](%{base_url}/about) reden möchtest, antworte einfach auf diese Nachricht.)
+ (Wenn du als neuer Benutzer unter vier Augen mit einem unserer [Team-Mitglieder](%{base_url}/about) reden möchtest, antworte einfach auf diese Nachricht.)
welcome_invite:
subject_template: "Willkommen bei %{site_name}!"
text_body_template: |
@@ -1657,12 +1665,21 @@ de:
Viel Spaß!
- (Wenn du als neuer Benutzer unter vier Augen mit einem unserer [Mitarbeiter](%{base_url}/about) reden möchtest, antworte einfach auf diese Nachricht.)
+ (Wenn du als neuer Benutzer unter vier Augen mit einem unserer [Team-Mitgileder](%{base_url}/about) reden möchtest, antworte einfach auf diese Nachricht.)
[prefs]: %{user_preferences_url}
backup_succeeded:
subject_template: "Sicherung erfolgreich abgeschlossen"
- text_body_template: "Backup erfolgreich erstellt.\nBesuche [admin > backup section](%{base_url}/admin/backups) um das neue Backup herunterzuladen."
+ text_body_template: |
+ Backup erfolgreich erstellt.
+
+ Besuche [admin > backup section](%{base_url}/admin/backups) um das neue Backup herunterzuladen.
+
+ Hier ist das Protokoll:
+
+ ```text
+ %{logs}
+ ```
backup_failed:
subject_template: "Sicherung fehlgeschlagen"
text_body_template: |
@@ -1670,12 +1687,19 @@ de:
Hier ist das Protokoll:
- ```
+ ```text
%{logs}
```
restore_succeeded:
subject_template: "Wiederherstellung erfolgreich abgeschlossen"
- text_body_template: "Die Wiederherstellung war erfolgreich."
+ text_body_template: |
+ Die Wiederherstellung war erfolgreich.
+
+ Hier ist das Protokoll:
+
+ ```text
+ %{logs}
+ ```
restore_failed:
subject_template: "Wiederherstellung fehlgeschlagen"
text_body_template: |
@@ -1683,7 +1707,7 @@ de:
Hier ist das Protokoll:
- ```
+ ```text
%{logs}
```
bulk_invite_succeeded:
@@ -1709,25 +1733,25 @@ de:
Dieser Download-Link ist für die nächsten 48 Stunden gültig.
csv_export_failed:
subject_template: "Datenexport fehlgeschlagen"
- text_body_template: "Entschuldigung, beim Exportieren deiner Daten trat ein Fehler auf. Bitte kontaktiere einen Mitarbeiter oder sieh in die Logs."
+ text_body_template: "Entschuldigung, beim Exportieren deiner Daten trat ein Fehler auf. Bitte kontaktiere ein Team-Mitglied oder überprüfe die Logdateien."
email_reject_insufficient_trust_level:
subject_template: "[%{site_name}] E-Mail-Problem -- Unzureichende Vertrauensstufe"
text_body_template: |
- Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (Titel: %{former_title}) hat nicht funktioniert.
+ Entschuldige, aber deine E-Mail-Nachricht an %{destination} (Titel: %{former_title}) konnte nicht zugestellt werden.
- Du hast nicht die notwendige Vertrauensstufe, um neue Themen über diese E-Mail-Adresse zu erstellen. Wenn du glaubst, dass das ein Irrtum ist, dann kontaktiere einen Mitarbeiter.
+ Du hast nicht die notwendige Vertrauensstufe, um neue Themen über diese E-Mail-Adresse zu erstellen. Wenn du glaubst, dass das ein Irrtum ist, dann kontaktiere ein Team-Mitglied.
email_reject_user_not_found:
subject_template: "[%{site_name}] E-Mail-Problem -- Benutzer nicht gefunden"
text_body_template: |
- Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert.
+ Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden.
- Deine Antwort wurde von einer unbekannten E-Mail-Adresse gesendet. Probiere eine andere Absende-Adresse oder wende dich an einen Mitarbeiter.
+ Deine Antwort wurde von einer unbekannten E-Mail-Adresse gesendet. Probiere eine andere Absende-Adresse oder wende dich an ein Team-Mitglied.
email_reject_screened_email:
subject_template: "[%{site_name}] E-Mail-Problem -- Blockiertee E-Mail-Adresse"
text_body_template: |
- Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert.
+ Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden.
- Deine Antwort wurde von einer blockierten E-Mail-Adresse gesendet. Probiere eine andere Absende-Adresse oder wende dich an einen Mitarbeiter.
+ Deine Antwort wurde von einer blockierten E-Mail-Adresse gesendet. Probiere eine andere Absende-Adresse oder wende dich an ein Team-Mitglied.
email_reject_inactive_user:
subject_template: "[%{site_name}] E-Mail-Problem -- Inaktiver Benutzer"
text_body_template: |
@@ -1741,17 +1765,17 @@ de:
Dein mit dieser E-Mail-Adresse verbundenes Konto wurde blockiert.
email_reject_reply_user_not_matching:
- subject_template: "[%{site_name}] E-Mail-Problem -- Antwortender Benutzer stimmt nicht überein"
+ subject_template: "[%{site_name}] E-Mail-Problem -- Unerwartete Antwort-Adresse"
text_body_template: |
- Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert.
+ Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden.
- Deine Antwort wurde von einer anderen E-Mail-Adresse versandt als wir erwartet haben, weshalb wir nicht sicher wissen ob das die gleiche Person ist. Probiere eine andere Absende-Adresse oder wende dich an einen Mitarbeiter.
+ Deine Antwort wurde von einer anderen E-Mail-Adresse versandt als wir erwartet haben, weshalb wir nicht sicher wissen ob das die gleiche Person ist. Probiere eine andere Absende-Adresse oder wende dich an ein Team-Mitglied.
email_reject_no_account:
subject_template: "[%{site_name}] E-Mail-Problem -- Unbekanntes Konto"
text_body_template: |
- Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert.
+ Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden.
- Wir konnten kein Konto finden, das zu deiner E-Mail-Adresse passt. Probiere eine andere Absende-Adresse oder wende dich an einen Mitarbeiter.
+ Wir konnten kein Konto finden, das zu deiner E-Mail-Adresse passt. Probiere eine andere Absende-Adresse oder wende dich an ein Team-Mitglied.
email_reject_empty:
subject_template: "[%{site_name}] E-Mail-Problem -- Kein Inhalt"
text_body_template: |
@@ -1769,15 +1793,15 @@ de:
email_reject_invalid_access:
subject_template: "[%{site_name}] E-Mail-Problem -- Nicht erlaubt"
text_body_template: |
- Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert.
+ Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden.
- Du hast nicht die notwendigen Zugriffsrechte, um neue Themen in dieser Kategorie zu erstellen. Wenn du glaubst, dass das ein Irrtum ist, dann kontaktiere einen Mitarbeiter.
+ Du hast nicht die notwendigen Zugriffsrechte, um neue Themen in dieser Kategorie zu erstellen. Wenn du glaubst, dass das ein Irrtum ist, dann kontaktiere ein Team-Mitglied.
email_reject_strangers_not_allowed:
subject_template: "[%{site_name}] E-Mail-Problem -- Zugriff nicht erlaubt"
text_body_template: |
- Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (Titel: %{former_title}) hat nicht funktioniert.
+ Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden.
- Die Kategorie, an die du die E-Mail geschickt hast, erlaubt nur Antworten von Benutzern mit gültigem Konto und von bekannten E-Mail-Adressen. Wenn du glaubst, dass das ein Irrtum ist, dann kontaktiere einen Mitarbeiter.
+ Die Kategorie, an die du die E-Mail geschickt hast, erlaubt nur Antworten von Benutzern mit gültigem Konto und von bekannten E-Mail-Adressen. Wenn du glaubst, dass das ein Irrtum ist, dann kontaktiere ein Team-Mitglied.
email_reject_invalid_post:
subject_template: "[%{site_name}] E-Mail-Problem -- Ungültiger Beitrag"
text_body_template: |
@@ -1794,12 +1818,6 @@ de:
%{post_error}
Bitte versuch es erneut, wenn du das Problem beheben kannst.
- email_reject_rate_limit_specified:
- subject_template: "[%{site_name}] E-Mail-Problem -- Begrenzung"
- text_body_template: |
- Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert.
-
- Grund: %{rate_limit_description}
email_reject_invalid_post_action:
subject_template: "[%{site_name}] E-Mail-Problem -- Fehlerhafte Beitragsaktion"
text_body_template: |
@@ -1809,33 +1827,33 @@ de:
email_reject_reply_key:
subject_template: "[%{site_name}] E-Mail-Problem -- Unbekannter Antwort-Schlüssel"
text_body_template: |
- Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert.
+ Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden.
- Der angegebene Antwort-Schlüssel ist ungültig oder unbekannt. Wir wissen daher nicht auf welchen Beitrag diese E-Mail antwortet. Bitte kontaktiere einen Mitarbeiter.
+ Der angegebene Antwort-Schlüssel ist ungültig oder unbekannt. Wir wissen daher nicht auf welchen Beitrag diese E-Mail antwortet. Bitte kontaktiere ein Team-Mitglied.
email_reject_bad_destination_address:
subject_template: "[%{site_name}] E-Mail Problem -- Unbekannte An:-Adresse"
text_body_template: |
- Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert.
+ Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden.
- Keine der Ziel-E-Mail-Adressen wurde erkannt. Bitte stell sicher, dass du die E-Mail an die richtige Adresse schickst, die dir von unseren Mitarbeitern genannt wurde.
+ Keine der Ziel-E-Mail-Adressen wurde erkannt. Bitte stelle sicher, dass du die E-Mail an die richtige Adresse schickst, die dir von unserem Team genannt wurde.
email_reject_topic_not_found:
subject_template: "[%{site_name}] E-Mail-Problem -- Thema nicht gefunden"
text_body_template: |
- Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert.
+ Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden.
- Das Thema, auf das du geantwortet hast, existiert nicht mehr -- vielleicht wurde es gelöscht? Wenn du glaubst, dass dies ein Irrtum ist, nimm Bitte Kontakt mit einem Mitarbeiter auf.
+ Das Thema, auf das du geantwortet hast, existiert nicht mehr -- vielleicht wurde es gelöscht? Wenn du glaubst, dass dies ein Irrtum ist, nimm Bitte Kontakt mit einem Team-Mitglied auf.
email_reject_topic_closed:
subject_template: "[%{site_name}] E-Mail-Problem -- Thema geschlossen"
text_body_template: |
- Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert.
+ Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden.
- Das Thema, auf das du geantwortet hast, ist derzeit geschlossen und akzeptiert keine Antworten mehr. Wenn du glaubst, dass dies ein Irrtum ist, nimm bitte Kontakt mit einem Mitarbeiter auf.
+ Das Thema, auf das du geantwortet hast, ist derzeit geschlossen und akzeptiert keine Antworten mehr. Wenn du glaubst, dass dies ein Irrtum ist, nimm bitte Kontakt mit einem Team-Mitglied auf.
email_reject_auto_generated:
subject_template: "[%{site_name}] E-Mail-Problem -- Automatisch erzeugte Antwort"
text_body_template: |
- Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) hat nicht funktioniert.
+ Entschuldige, aber deine E-Mail-Nachricht an %{destination} (betitelt mit %{former_title}) konnte nicht zugestellt werden.
- Deine E-Mail wurde als „automatisch generiert“ markiert, was bedeutet, dass sie automatisch von einem Computer erstellt wurde statt von einem Menschen getippt; wir können diese Arten von E-Mails nicht akzeptieren. Wenn du glaubst, dass dies ein Irrtum ist, nimm bitte Kontakt mit einem Mitarbeiter auf.
+ Deine E-Mail wurde als „automatisch generiert“ markiert, was bedeutet, dass sie automatisch von einem Computer erstellt wurde statt von einem Menschen getippt; wir können diese Arten von E-Mails nicht akzeptieren. Wenn du glaubst, dass dies ein Irrtum ist, nimm bitte Kontakt mit einem Team-Mitglied auf.
email_error_notification:
subject_template: "[%{site_name}] E-Mail-Problem -- POP-Authentifizierungsfehler"
text_body_template: |
@@ -1851,7 +1869,7 @@ de:
dies ist eine automatisch erzeugte Nachricht von %{site_name}, um dich darüber zu informieren, dass deine Beitrage vorübergehend ausgeblendet wurden, weil sie von der Community gemeldet wurden.
- Als Vorsichtsmaßnahme wurde dein neues Konto für das Erstellen neuer Antworten und Themen gesperrt, bis ein Mitarbeiter dein Konto überprüfen kann. Wir bitten um Entschuldigung für die Unannehmlichkeiten.
+ Als Vorsichtsmaßnahme wurde dein neues Konto für das Erstellen neuer Antworten und Themen gesperrt, bis ein Team-Mitglied dein Konto überprüfen kann. Wir bitten um Entschuldigung für die Unannehmlichkeiten.
Weitere Hinweise findest du in unseren [Community-Richtlinien](%{base_url}/guidelines).
too_many_tl3_flags:
@@ -1861,7 +1879,7 @@ de:
dies ist eine automatisch erzeugte Nachricht von %{site_name}, um dich darüber zu informieren, dass dein Konto aufgrund einer großen Anzahl von Community-Meldungen vorübergehend gesperrt wurde.
- Als Vorsichtsmaßnahme wurde dein neues Konto für das Erstellen neuer Antworten und Themen gesperrt, bis ein Mitarbeiter dein Konto überprüfen kann. Wir bitten um Entschuldigung für die Unannehmlichkeiten.
+ Als Vorsichtsmaßnahme wurde dein neues Konto für das Erstellen neuer Antworten und Themen gesperrt, bis ein Team-Mitglied dein Konto überprüfen kann. Wir bitten um Entschuldigung für die Unannehmlichkeiten.
Weitere Hinweise findest du in unseren [Community-Richtlinien](%{base_url}/guidelines).
blocked_by_staff:
@@ -1871,7 +1889,7 @@ de:
dies ist eine automatisch erzeugte Nachricht von %{site_name}, um dich darüber zu informieren, dass als Vorsichtsmaßnahme vorübergehend gesperrt wurde.
- Bitte schaue dir weiter Inhalte an, aber du kannst zunächst keine Antworten oder Themen erstellen, [Mitarbeiter](%{base_url}/about) deine aktuellesten Beiträge überprüft hat. Wir bitten um Entschuldigung für die Unannemlichkeiten.
+ Bitte schaue dir weiter Inhalte an, aber du kannst zunächst keine Antworten oder Themen erstellen, bis ein [Team-Mitglied](%{base_url}/about) deine aktuellesten Beiträge überprüft hat. Wir bitten um Entschuldigung für die Unannemlichkeiten.
Weitere Hinweise findest du in unseren [Community-Richtlinien](%{base_url}/guidelines).
user_automatically_blocked:
@@ -1899,7 +1917,7 @@ de:
text_body_template: |
Hallo,
- dies ist eine automatische Nachricht von %{site_name}, um dich darüber zu informieren, dass dein Benutzerkonto nach der Überprüfung durch einen Mitarbeiter nicht mehr länger gesperrt ist.
+ dies ist eine automatische Nachricht von %{site_name}, um dich darüber zu informieren, dass dein Benutzerkonto nach der Überprüfung durch ein Team-Mitglied nicht mehr länger gesperrt ist.
Du kannst nun wieder neue Antworten und Themen erstellen. Vielen Dank für deine Geduld.
pending_users_reminder:
@@ -1928,7 +1946,7 @@ de:
Um diese E-Mails abzubestellen, [klicke hier](%{unsubscribe_url}).
subject_re: "Re: "
- subject_pm: "[PN]"
+ subject_pm: "[PN] "
user_notifications:
previous_discussion: "Vorangehende Antworten"
reached_limit:
@@ -2080,21 +2098,29 @@ de:
%{respond_instructions}
user_posted_pm_staged:
subject_template: "%{optional_re}%{topic_title}"
- text_body_template: |
+ text_body_template: |2
%{message}
digest:
why: "Eine kurze Zusammenfassung von %{site_link} seit deinem letzten Besuch am %{last_seen_at}"
+ since_last_visit: "Seit deinem letzten Besuch"
+ new_topics: "Neue Themen"
+ unread_messages: "Ungelesene Nachrichten"
+ unread_notifications: "Ungelesene Benachrichtigungen"
+ liked_received: "Erhaltene Likes"
+ new_posts: "Neue Beiträge"
+ new_users: "Neue Benutzer"
+ popular_topics: "Beliebte Themen"
+ follow_topic: "Diesem Thema folgen"
+ join_the_discussion: "Mehr lesen"
+ popular_posts: "Beliebte Beiträge"
+ from_topic_label: "Von"
+ more_new: "Neu für dich"
subject_template: "Zusammenfassung für [%{site_name}]"
- new_activity: "Neues in deinen Themen und Beiträgen:"
- top_topics: "Beliebte Beiträge"
- other_new_topics: "Beliebte Themen"
unsubscribe: "Diese Zusammenfassung wird von %{site_link} gesendet, wenn wir dich einige Zeit lang nicht gesehen haben. Abbestellen unter %{unsubscribe_link}."
click_here: "klicke hier"
from: "Zusammenfassung für %{site_name}"
- read_more: "Weiterlesen"
- more_topics: "Es gab %{new_topics_since_seen} andere neue Themen."
- more_topics_category: "Weitere neue Themen:"
+ preheader: "Eine kurze Zusammenfassung seit deinem letzten Besuch am %{last_seen_at}"
mailing_list:
why: "Alle Aktivitäten auf %{site_link} am %{date}"
subject_template: "[%{site_name}] Zusammenfassung für den %{date}"
@@ -2155,7 +2181,7 @@ de:
notify_old_email:
subject_template: "[%{site_name}] Deine E-Mail-Adresse wurde geändert"
text_body_template: |
- Dies ist eine automatisierte Nachricht, um eine Änderung deiner E-Mail-Adresse für %{site_name} mitzuteilen. Bitte kontaktiere einen Mitarbeiter, wenn du von einem Fehler ausgehst.
+ Dies ist eine automatisierte Nachricht, um eine Änderung deiner E-Mail-Adresse für %{site_name} mitzuteilen. Bitte kontaktiere ein Team-Mitglied, wenn du von einem Fehler ausgehst.
Deine E-Mail-Adresse wurde geändert zu:
@@ -2165,7 +2191,7 @@ de:
text_body_template: |
Willkommen bei %{site_name}!
- Einer unserer Mitarbeiter hat dein Benutzerkonto bei %{site_name} genehmigt.
+ Einer unserer Team-Mitglieder hat dein Benutzerkonto bei %{site_name} genehmigt.
Klicke auf den folgenden Link, um dein neues Konto zu bestätigen und zu aktivieren:
%{base_url}/users/activate-account/%{email_token}
@@ -2178,7 +2204,7 @@ de:
Viel Spaß!
- (Wenn du als neuer Benutzer unter vier Augen mit einem unserer [Mitarbeiter](%{base_url}/about) reden möchtest, antworte einfach auf diese Nachricht.)
+ (Wenn du als neuer Benutzer unter vier Augen mit einem unserer [Team-Mitglieder](%{base_url}/about) reden möchtest, antworte einfach auf diese Nachricht.)
signup:
subject_template: "[%{site_name}] Bestätige deinen neuen Account"
text_body_template: |
@@ -2237,6 +2263,7 @@ de:
message_to_blank: "message.to ist leer"
text_part_body_blank: "text_part.body ist leer"
body_blank: "body ist leer"
+ no_echo_mailing_list_mode: "Mailinglisten-Benachrichtigung für eigene Beiträge deaktivieren"
color_schemes:
base_theme_name: "Basis"
about: "Über uns"
@@ -2255,7 +2282,7 @@ de:
## [Dies ist ein zivilisierter Platz für öffentliche Diskussionen](#civilized)
- Bitte behandle dieses Diskussionsforum mit dem gleichen Respekt wie einen öffentlichen Park. Auch wir sind eine gemeinsame Community-Ressource — ein Platz, um Fähigkeiten, Wissen und Interessen durch eine fortlaufenden Dialog zu teilen.
+ Bitte behandle dieses Diskussionsforum mit dem gleichen Respekt wie einen öffentlichen Park. Auch wir sind eine gemeinsame Community-Ressource — ein Platz, um Fähigkeiten, Wissen und Interessen durch einen fortlaufenden Dialog zu teilen.
Dies sind keine harten oder schnelle Regeln, sondern vielmehr Hilfen für die menschliche Einschätzung unserer Community. Folge diesen Richtlinien, damit dies ein sauberer, gut beleuchteter Platz für zivilisierten, öffentlichen Diskurs bleibt.
@@ -2263,11 +2290,11 @@ de:
## [Verbessere die Diskussion](#improve)
- Hilf uns, dies zu einem großartiger Platz für Diskussionen zu machen, indem du stets daran arbeitest, die Diskussion in irgendeiner, noch so geringen Art zu verbessern. Wenn du dir nicht sicher bist, ob dein Beitrag zum Dialog beiträgt, denke darüber nach, was du sagen möchtest und probiere es später noch einmal.
+ Hilf uns, dies zu einem großartigen Platz für Diskussionen zu machen, indem du stets daran arbeitest, die Diskussion in irgendeiner Art zu verbessern, egal wie geringfügig. Wenn du dir nicht sicher bist, ob dein Beitrag zum Dialog beiträgt, denke darüber nach, was du sagen möchtest und probiere es später noch einmal.
- Die Themen, die hier diskutiert werden, sind uns wichtig, und wir möchten, dass du dich so verhältst, als wären sie auch genauso für dich wichtig. Respektiere die Themen und die Personen, die diese diskutieren, auch wenn du mit etwas, was gesagt wird, nicht einverstanden bist.
+ Die hier diskutierten Themen sind uns wichtig und wir möchten, dass du dich so verhältst, als wären sie auch genauso wichtig für dich. Respektiere die Themen und die Personen, die diese diskutieren, auch wenn du mit dem was gesagt wird, nicht einverstanden bist.
- Ein Weg, die Diskussion zu verbessern, besteht darin zu entdecken, was schon passiert ist. Bitte verbringe etwas Zeit damit, die Themen hier zu durchsuchen, bevor du antwortest oder deine eigenen startest, und du wirst eine bessere Chance haben, andere zu treffen, die deine Interessen teilen.
+ Ein Weg, die Diskussion zu verbessern, besteht darin zu entdecken, was schon passiert ist. Bitte verbringe etwas Zeit damit, die Themen hier zu durchsuchen, bevor du antwortest oder deine eigenen startest, und du wirst eine bessere Chance haben andere zu treffen, die deine Interessen teilen.
@@ -2275,20 +2302,20 @@ de:
Du magst auf etwas antworten möchten, indem du widersprichst. Das ist in Ordnung. Aber denke daran, _Ideen zu kritisieren, nicht Personen_. Bitte vermeide:
- * Beschimpfungen.
- * Persönliche Angriffe.
- * Antworten auf den Tonfall einen Beitrag statt auf dessen Inhalt.
+ * Beschimpfungen
+ * Persönliche Angriffe
+ * Antworten auf den Tonfall eines Beitrags statt auf dessen Inhalt
* Reflexartiges Widersprechen
- Biete stattdessen vernünftige Gegenargument, die den Dialog verbessern.
+ Biete stattdessen vernünftige Gegenargumente, die den Dialog verbessern.
## [Deine Beteiligung zählt](#participate)
- Die Dialoge, die wir führen, geben den Ton für alle an. Hilf uns dabei, die Zukunft dieser Community zu beeinflussen, indem wir uns bewusst für Dialoge entscheiden, die dieses Forum zu einem interessanten Aufenthaltsraum zu machen — und jene vermeiden, die das nicht tun
+ Die hier geführten Dialoge geben den Ton für alle an. Hilf uns dabei, die Zukunft dieser Community zu beeinflussen, indem wir uns bewusst für Dialoge entscheiden, die dieses Forum zu einem interessanten Aufenthaltsraum machen — und jene vermeiden, die das nicht tun.
- Discourse bietet Werkzeuge, die der Community ermöglichen, gemeinsam die besten (und schlechtesten) Beiträge zu identifzieren: Favoriten, Lesezeichen, „Gefällt mir“-Angaben, Meldungen, Antworten, Bearbeitungen, und so weiter. Benutze diese Werkzeuge, um deine eigene Erfahrung zu verbessern, und die von allen anderen ebenso.
+ Discourse bietet Werkzeuge, die der Community ermöglichen, gemeinsam die besten (und schlechtesten) Beiträge zu identifizieren: Favoriten, Lesezeichen, „Gefällt mir“-Angaben, Meldungen, Antworten, Bearbeitungen, und so weiter. Benutze diese Werkzeuge, um deine eigene Erfahrung zu verbessern, und die von allen anderen ebenso.
Lass uns versuchen, den Park besser zu verlassen als wir ihn vorgefunden haben.
@@ -2300,7 +2327,7 @@ de:
Wenn du schlechtes Verhalten siehst, antworte nicht. Schlechtes Verhalten wird gefördert, indem es anerkannt wird, es verbraucht deine Energie und verbraucht die Zeit von allen. _Melde es einfach_. Wenn genügend Meldungen zusammenkommen, werden Maßnahmen eingeleitet, entweder automatisch oder durch das Eingreifen eines Moderators.
- Um unsere Community aufrechtzuerhalten, behalten sich Moderatoren das Recht vor, jeden Inhalten und jedes Benutzerkonto jederzeit aus irgendeinem Grund zu entfernen. Moderatoren sehen neue Beiträge in keiner Weise früher; die Moderatoren und die Seitenbetreiber übernehmen keine Verantwortung für jeglichen Inhalt, der in der Community geschrieben wird.
+ Um unsere Community aufrechtzuerhalten, behalten sich Moderatoren das Recht vor, jeden Inhalten und jedes Benutzerkonto jederzeit aus irgendeinem Grund zu entfernen. Moderatoren sehen neue Beiträge in keiner Weise früher; die Moderatoren und die Sitebetreiber übernehmen keine Verantwortung für jeglichen Inhalt, der in der Community geschrieben wird.
@@ -2308,26 +2335,26 @@ de:
Nichts sabotiert einen gesunden Dialog so sehr wie Unhöflichkeit.
- * Sei höflich. Schreibe nicht, das eine vernünftige Person als anstößig, beleidigend oder, als Hasstirade auffassen würde.
- * Halte den Platz sauber. Schreibe nichts, was obszön oder sexuell expizit ist.
+ * Sei höflich. Schreibe nichts, was eine vernünftige Person als anstößig, beleidigend oder als Hasstirade auffassen würde.
+ * Halte den Platz sauber. Schreibe nichts, was obszön oder sexuell explizit ist.
* Lasst uns gegenseitig respektieren. Belästige niemanden, füge niemandem Kummer zu, gib dich nicht als jemand anderes aus und veröffentliche niemandes persönliche Informationen.
* Respektiere unser Forum. Schreibe keinen Spam und beschädige das Forum auch sonst in keiner Weise.
Dies sind keine konkreten Bedingungen mit präzisen Definitionen — vermeide sogar den _Anschein_ von jedem dieser Dinge. Wenn du dir nicht sicher bist, frage dich selbst, wie du dich fühlen würdest, wenn dein Beitrag auf der Titelseite der Frankfurter Allgemeinen Zeitung erscheinen würde.
- Dies ist ein öffentliches Forum, und Suchmaschinen indizieren diese Diskussionen. Halte die Sprache, Links und Bilder sicher für Familie und Freunde.
+ Dies ist ein öffentliches Forum und Suchmaschinen indizieren diese Diskussionen. Halte die Sprache, Links und Bilder sicher für Familie und Freunde.
## [Halte den Platz sauber](#keep-tidy)
- Betreibe die nötigen Anstrengungen, um Dinge an der richtigen Stelle zu platzieren, damit wir mehr Zeit mit Diskussionen und weniger mit Aufräumen verbringen kann. Daher:
+ Betreibe die nötigen Anstrengungen, um Dinge an der richtigen Stelle zu platzieren, damit wir mehr Zeit mit Diskussionen und weniger mit Aufräumen verbringen können. Daher:
- * Erstelle keine Themen in der falschen Kategorie.
- * Schreibe Beiträge nicht gleichzeitig in mehreren Themen.
- * Schreibe keine leeren Antworten.
- * Lenke nicht vom Thema ab, indem du es mitten drin änderst.
- * Signiere deine Beiträge nicht — jedem Beitrag sind deine Profilinformationen beigefügt.
+ * Erstelle keine Themen in der falschen Kategorie
+ * Schreibe Beiträge nicht gleichzeitig in mehreren Themen
+ * Schreibe keine leeren Antworten
+ * Lenke nicht vom Thema ab, indem du es mitten drin änderst
+ * Signiere deine Beiträge nicht — jedem Beitrag sind deine Profilinformationen beigefügt
Verwende die „Gefällt mir“-Schaltfläche statt „+1“ oder „Einverstanden“ zu schreiben. Statt ein bestehendes Thema in eine völlig andere Richtung zu lenken, verwende die Funktion „Mit verknüpftem Thema antworten“.
@@ -2335,19 +2362,19 @@ de:
## [Poste nur deine eigenen Sachen](#stealing)
- Du darfst nichts ohne Erlaubnis nichts posten, was jemand anderem gehört. Du darfst keine Beschreibungen, Links oder Methoden schreiben, die geistiges Eigentum verletzen oder gegen geltendes Gesetz verstoßen.
+ Du darfst ohne Erlaubnis nichts schreiben, was jemand anderem gehört. Du darfst keine Beschreibungen von, Links zu oder Methoden beschreiben, die geistiges Eigentum verletzen (Software, Video, Audio, Bilder) oder gegen geltendes Gesetz verstoßen.
## [Betrieben von Euch](#power)
- Diese Seite wird von euren [freundlichen Mitarbeitern](/about) und *euch* betrieben, der Community. Wenn du irgendwelche weiteren Fragen dazu hast, wie Dinge hier funktionieren sollten, öffne ein neues Thema in der Kategorie [Feedback zur Seite](/c/site-feedback) und lass es uns diskutieren! Wenn es ein kritisches oder dringendes Problem gibt, dass nicht mit einem Meta-Thema oder einer Meldung behandelt werden, kontaktiere uns über die [Mitarbeiter-Seite](/about).
+ Diese Site wird von eurem [freundlichen Team](/about) und *euch* betrieben, der Community. Wenn du irgendwelche weiteren Fragen dazu hast, wie Dinge hier funktionieren sollten, öffne ein neues Thema in der Kategorie [Feedback zur Site](/c/site-feedback) und lass es uns diskutieren! Wenn es ein kritisches oder dringendes Problem gibt, dass nicht mit einem Meta-Thema oder einer Meldung behandelt werden kann, kontaktiere uns über die [Team-Seite](/about).
## [Nutzungsbedingungen](#tos)
- Ja, die rechtliche Seite ist langweilig, aber wir müssen uns selbst schützen – und im erweiterten Sinne auch dich und deine Daten – vor unfreundlichen Leuten. Wir haben [Nutzungsbedinugngen](/tos), die deines (und unser) Verhalten und unsere Rechte bezüglich des Inhalts, der Privatsphäre und den Gesetzen beschreiben. Um diesen Dienst zu nutzen, musst du dich mit unseren [Nutzungsbedingungen](/tos) einverstanden erklären.
+ Ja, die rechtliche Seite ist langweilig, aber wir müssen uns selbst schützen – und im erweiterten Sinne auch dich und deine Daten – vor unfreundlichen Leuten. Wir haben [Nutzungsbedingungen](/tos), die deines (und unser) Verhalten und unsere Rechte bezüglich des Inhalts, der Privatsphäre und den Gesetzen beschreiben. Um diesen Dienst zu nutzen, musst du dich mit unseren [Nutzungsbedingungen](/tos) einverstanden erklären.
tos_topic:
title: "Nutzungsbedingungen"
body: |
@@ -2476,7 +2503,7 @@ de:
## [17. Schadloshaltung](#17)
- Du stimmst zu, %{company_name}, Vertragspartnern und Lizenznehmern, und jeweiligen Vorstandsmitglieder, Amtsträger, Mitarbeiter und Vertreter gegen jegliche Haftungsfälle, Ansprüche und Ausgaben schadlos zu halten, einschließlich angemessener Anwaltskosten, die den schadlos gehaltenen Parteien im Zusammenhang mit jeglichen Ansprüchen entstehen, die sich aus jeglicher Verletzung dieser Vereinbarung ergeben.
+ Du stimmst zu, %{company_name}, Vertragspartnern und Lizenznehmern, und jeweiligen Vorstandsmitglieder, Amtsträger, Team-Mitglieder und Vertreter gegen jegliche Haftungsfälle, Ansprüche und Ausgaben schadlos zu halten, einschließlich angemessener Anwaltskosten, die den schadlos gehaltenen Parteien im Zusammenhang mit jeglichen Ansprüchen entstehen, die sich aus jeglicher Verletzung dieser Vereinbarung ergeben.
@@ -2571,35 +2598,6 @@ de:
Wenn wir uns dazu entscheiden, unsere Datenschutzbestimmungen zu ändern, werden wir diese Änderungen auf dieser Seite veröffentlichen.
Dieses Dokument ist als CC-BY-SA lizensiert. Es wurde zuletzt aktualisiert am am 31. Mai 2013.
- static:
- search_help: |
-
-
-
-
-
-
-
order:views | order:latest | order:likes | @username | user:foo |
status:open | status:closed | status:archived | status:noreplies | status:single_user |
#category-slug | category:foo | group:foo | badge:foo | |
in:likes | in:posted | in:watching | in:tracking | in:private |
in:bookmarks | in:first | in:pinned | in:unpinned | in:wiki |
posts_count:num | before:days or date | after:days or date | tags:one,two |
-
-
-
-
Regenbogen #Parks
sucht nach Themen in der Kategorie "Parks", die das Wort "Regenbogen" enthalten.Regenbogen category:parks status:open order:latest
sucht nach Themen in der Kategorie "Parks", die das Wort "Regenbogen" enthalten und die nicht geschlossen oder archiviert sind; die Treffer werden nach dem Datum des letzten Beitrags sortiert.Regenbogen category:"Parks und Gärten" in:bookmarks
sucht nach Themen, die das Wort "Regenbogen" in der Kategorie "Parks und Gärten" erhalten und von dir mit einem Lesezeichen markiert sind.-
badges: editor: name: Bearbeiter @@ -2613,24 +2611,24 @@ de: Das Abzeichen wird verliehen, wenn du Vertrauensstufe 1 erreichst. Danke, dass du eine Weile dageblieben bist und ein paar Themen gelesen hast um zu lernen, worum es in unserer Community geht. Für dich gelten die Einschränkungen für neue Nutzer nicht mehr und du hast nun Zugriff auf alle wichtigen Funktionen, beispielsweise persönliche Nachrichten, die Melden-Funktion, das Bearbeiten von Wiki-Beiträgen und die Fähigkeit, mehrere Bilder und Links in Beiträgen zu verwenden. member: name: Mitglied - description: Ermöglicht das Versenden von Einladungen, Gruppen-Nachrichten, mehr „Gefällt mir“-Angaben + description: Ermöglicht das Versenden von Einladungen, Gruppen-Nachrichten, mehr Likes long_description: | - Das Abzeichen wird verliehen, wenn du Vertrauensstufe 2 erreichst. Danke, dass du einige Wochen mitgemacht hast, um unserer Community richtig beizutreten. Du kannst nun von deiner Benutzerseite und einzelnen Themen-Seiten aus Einladungen versenden, Gruppennachrichten erstellen und ein paar mehr „Gefällt mir“-Angaben pro Tag vergeben. + Das Abzeichen wird verliehen, wenn du Vertrauensstufe 2 erreichst. Danke, dass du einige Wochen mitgemacht hast, um unserer Community richtig beizutreten. Du kannst nun von deiner Benutzerseite und einzelnen Themen-Seiten aus Einladungen versenden, Gruppennachrichten erstellen und ein paar mehr Likes pro Tag vergeben. regular: name: Stammgast - description: Ermöglicht verschieben und umbenennen von Themen, veröffentlichen verfolgbarer Links, Aktivierung der Wiki-Funktion, mehr „Gefällt mir“-Angaben + description: Ermöglicht verschieben und umbenennen von Themen, veröffentlichen verfolgbarer Links, Aktivierung der Wiki-Funktion, mehr Likes long_description: | - Das Abzeichen wird verliehen, wenn du Vertrauensstufe 3 erreichst. Danke, dass du in unserer Community über mehrere Monate ein Stammgast gewesen bist. Du bist nun einer unserer aktivsten Leser und ein zuverlässiges Mitglied, das diese Community großartig macht. Du kannst nun Themen neu kategorisieren und umbenennen, mächtigere Spam-Meldungen nutzen, eine private Lounge nutzen und kannst viel mehr „Gefällt mir“-Angaben pro Tag erhalten. + Das Abzeichen wird verliehen, wenn du Vertrauensstufe 3 erreichst. Danke, dass du in unserer Community über mehrere Monate ein Stammgast gewesen bist. Du bist nun einer unserer aktivsten Leser und ein zuverlässiges Mitglied, das diese Community großartig macht. Du kannst nun Themen neu kategorisieren und umbenennen, mächtigere Spam-Meldungen nutzen, eine private Lounge nutzen und kannst viel mehr Likes pro Tag erhalten. leader: name: Anführer - description: Ermöglicht bearbeiten aller Beiträge, anheften, schließen, archivieren, aufteilen und zusammenfügen von Themen, mehr „Gefällt mir“-Angaben + description: Ermöglicht bearbeiten aller Beiträge, anheften, schließen, archivieren, aufteilen und zusammenfügen von Themen, mehr Likes long_description: | - Das Abzeichen wird verliehen, wenn du Vertrauensstufe 4 erreichst. Du bist ein von den Mitarbeitern ausgezeichneter Anführer und hast durch deine Aktivität und Worte ein positives Beispiel für die übrige Community abgegeben. Du kannst alle Beiträge bearbeiten, Moderator-Aktionen wie das Anpinnen, Schließen, Unsichtbar machen, Archivieren, Teilen und Zusammenführen von Themen durchführen und viel mehr „Gefällt mir“-Angaben pro Tag vergeben. + Das Abzeichen wird verliehen, wenn du Vertrauensstufe 4 erreichst. Du bist ein vom Team ausgezeichneter Anführer und hast durch deine Aktivität und Worte ein positives Beispiel für die übrige Community abgegeben. Du kannst alle Beiträge bearbeiten, Moderator-Aktionen wie das Anheften, Schließen, Unsichtbar machen, Archivieren, Teilen und Zusammenführen von Themen durchführen und viel mehr Likes pro Tag vergeben. welcome: name: Willkommen - description: Hat eine „Gefällt mir“-Angabe erhalten + description: Hat ein Like erhalten long_description: | - Das Abzeichen wird verliehen, wenn du die erster „Gefällt mir“-Angabe auf einen Beitrag erhältst. Glückwunsch, du hast einen Beitrag geschrieben, den deine Mitbenutzer interessant, cool oder nützlich finden! + Das Abzeichen wird verliehen, wenn du den ersten Like auf einen Beitrag erhältst. Glückwunsch, du hast einen Beitrag geschrieben, den deine Mitbenutzer interessant, cool oder nützlich finden! autobiographer: name: Autobiograf description: Hat Benutzerprofil ausgefüllt @@ -2643,34 +2641,34 @@ de: Das Abzeichen wird verliehen, wenn du ein Jahr lang Mitglied warst und in diesem Jahr mindestens einen Beitrag geschrieben hast. Danke, dass du hier geblieben bist und zu unserer Community beiträgst. Ohne dich könnten wir dies nicht tun. nice_post: name: Schöne Antwort - description: Hat 10 „Gefällt mir“-Angaben für eine Antwort erhalten + description: Hat 10 Likes für eine Antwort erhalten long_description: | - Das Abzeichen wird verliehen, wenn eine deiner Antworten 10 „Gefällt mir“-Angaben erhält. Deine Antwort hat die Community wirklich beeindruckt und dabei geholfen, den Dialog voranzubringen! + Das Abzeichen wird verliehen, wenn eine deiner Antworten 10 Likes erhält. Deine Antwort hat die Community wirklich beeindruckt und dabei geholfen, den Dialog voranzubringen! good_post: name: Gute Antwort - description: Hat 25 „Gefällt mir“-Angaben für eine Antwort erhalten + description: Hat 25 Likes für eine Antwort erhalten long_description: | - Das Abzeichen wird verliehen, wenn eine deiner Antworten 25 „Gefällt mir“-Angaben erhält. Deine Antwort war außergewöhnlich und hat den Dialog sehr viel besser für alle gemacht! + Das Abzeichen wird verliehen, wenn eine deiner Antworten 25 Likes erhält. Deine Antwort war außergewöhnlich und hat den Dialog sehr viel besser für alle gemacht! great_post: name: Großartige Antwort - description: Hat 50 „Gefällt mir“-Angaben für eine Antwort erhalten + description: Hat 50 Likes für eine Antwort erhalten long_description: | - Das Abzeichen wird verliehen, wenn eine deiner Antworten 50 „Gefällt mir“-Angaben erhält. Wow! Deine Antwort war inspierend, faszinierend, wahnsinnig komisch oder aufschlussreich und die Community hat sie geliebt. + Das Abzeichen wird verliehen, wenn eine deiner Antworten 50 Likes erhält. Wow! Deine Antwort war inspirierend, faszinierend, wahnsinnig komisch oder aufschlussreich und die Community hat sie geliebt. nice_topic: name: Schönes Thema - description: Hat 10 „Gefällt mir“-Angaben für ein Thema erhalten + description: Hat 10 Likes für ein Thema erhalten long_description: | - Das Abzeichen wird verliehen, wenn eines deiner Themen 10 „Gefällt mir“-Angaben erhält. Hey, du hast einen interessanten Dialog begonnen, den die Community genossen hat! + Das Abzeichen wird verliehen, wenn eines deiner Themen 10 Likes erhält. Hey, du hast einen interessanten Dialog begonnen, den die Community genossen hat! good_topic: name: Gutes Thema - description: Hat 25 „Gefällt mir“-Angaben für ein Thema erhalten + description: Hat 25 Likes für ein Thema erhalten long_description: | - Das Abzeichen wird verliehen, wenn eines deiner Themen 25 „Gefällt mir“-Angaben erhält. Du hast einen lebendigen Dialog gestartet, die die Community versammelt hat und von dieser geliebt wurde! + Das Abzeichen wird verliehen, wenn eines deiner Themen 25 Likes erhält. Du hast einen lebendigen Dialog gestartet, die die Community versammelt hat und von dieser geliebt wurde! great_topic: name: Großartiges Thema - description: Hat 50 „Gefällt mir“-Angaben für ein Thema erhalten + description: Hat 50 Likes für ein Thema erhalten long_description: | - Das Abzeichen wird verliehen, wenn eines deiner Themen 50 „Gefällt mir“-angaben erhält. Du hast einen faszinierenden Dialog losgetreten und die Community hat die daraus enstandene, dynamische Diskussion genossen! + Das Abzeichen wird verliehen, wenn eines deiner Themen 50 Likes erhält. Du hast einen faszinierenden Dialog losgetreten und die Community hat die daraus entstandene, dynamische Diskussion genossen! nice_share: name: Schön geteilt description: Hat einen Beitrag mit 25 Besuchern geteilt @@ -2687,7 +2685,7 @@ de: long_description: | Das Abzeichen wird verliehen, wenn du einen Link teilst, der von 1000 Besuchern angeklickt wurde. Wow! Du hast eine interessante Diskussion einer riesigen Leserschaft näher gebracht und unserer Community sehr geholfen zu wachsen! first_like: - name: Erste „Gefällt mir“-Angabe + name: Erster Like description: Hat einen Beitrag mit „Gefällt mir“ markiert long_description: | Das Abzeichen wird verliehen, wenn du das erste Mal auf die :heart:-Schaltfläche unter einem Beitrag klickst. Beiträge mit „Gefällt mir“ zu markieren, ist eine tolle Art, den Community-Kollegen wissen zu lassen, dass sein Beitrag interessant, nützlich, cool oder witzig war. Teile die Liebe! @@ -2705,12 +2703,12 @@ de: name: Aktivist description: Hat 3 Anwärter (Vertrauensstufe 1) eingeladen long_description: | - Das Abzeichen wird verliehen, wenn du 3 Leute eingeladen hast, die daraufhin genug Zeit auf der Seite verbracht haben, um Anwärter zu werden. Eine lebendige Community benötigt eine regelmäßige Infusion mit Neulingen, die sich regelmäßig beteiligen und neue Stimmen zum Dialog ergänzen. + Das Abzeichen wird verliehen, wenn du 3 Leute eingeladen hast, die daraufhin genug Zeit auf der Site verbracht haben, um Anwärter zu werden. Eine lebendige Community benötigt eine regelmäßige Infusion mit Neulingen, die sich regelmäßig beteiligen und neue Stimmen zum Dialog ergänzen. champion: name: Verfechter description: Hat 5 Mitglieder (Vertrauensstufe 2) eingeladen long_description: | - Das Abzeichen wird verliehen, wenn du 5 Leute eingeladen hast, die daraufhin genug Zeit auf der Seite verbracht haben, um vollwertige Mitglieder zu werden. Wow! Danke dafür, dass du die Vielfalt unserer Community mit neuen Mitgliedern erweiterst! + Das Abzeichen wird verliehen, wenn du 5 Leute eingeladen hast, die daraufhin genug Zeit auf der Site verbracht haben, um vollwertige Mitglieder zu werden. Wow! Danke dafür, dass du die Vielfalt unserer Community mit neuen Mitgliedern erweiterst! first_share: name: Erste Weitergabe description: Hat einen Beitrag geteilt @@ -2753,49 +2751,49 @@ de: Das Abzeichen wird verliehen, wenn ein von dir geteilter Link 1000 Klicks erhält. Wow! Du hast einen Link geteilt, der den Dialog signifikant verbessert hat, indem es ein wesentliches Detail, Kontext und Information geliefert hat. Großartige Arbeit! appreciated: name: Geschätzt - description: Hat je eine „Gefällt mir“-Angabe auf 20 Beiträge erhalten. + description: Hat je ein Like auf 20 Beiträge erhalten long_description: | - Das Abzeichen wird verliehen, wenn du mindestens eine „Gefällt mir“-Angabe an 20 verschiedenen Beiträgen erhältst. Die Community genießt deine Beiträge zu den Dialogen! + Das Abzeichen wird verliehen, wenn du mindestens ein Like auf 20 verschiedenen Beiträgen erhältst. Die Community genießt deine Beiträge zu den Dialogen! respected: name: Respektiert - description: Hat je zwei „Gefällt mir“-Angaben auf 100 Beiträge erhalten. + description: Hat je zwei Likes auf 100 Beiträge erhalten long_description: | - Das Abzeichen wird verliehen, wenn 100 deiner Beiträge mindestens 2 „Gefällt mir“-Angaben erhalten. Die Community wächst und respektiert deine zahlreichen Beiträge zu den Dialogen! + Das Abzeichen wird verliehen, wenn 100 deiner Beiträge mindestens 2 Likes erhalten. Die Community wächst und respektiert deine zahlreichen Beiträge zu den Dialogen! admired: name: Bewundert - description: Hat je fünf „Gefällt mir“-Angaben auf 300 Beiträge erhalten. + description: Hat je fünf Likes auf 300 Beiträge erhalten long_description: | - Das Abzeichen wird verliehen, wenn 300 deiner Beiträge mindestens 5 „Gefällt mir“-Angaben erhalten. Wow! Die Community bewundert deine regelmäßigen, hochwertigen Beiträge zu den Dialogen! + Das Abzeichen wird verliehen, wenn 300 deiner Beiträge mindestens 5 Likes erhalten. Wow! Die Community bewundert deine regelmäßigen, hochwertigen Beiträge zu den Dialogen! out_of_love: - name: Aus Liebe - description: Hat 50 „Gefällt mir“-Angaben an einem Tag vergeben + name: Out of Love + description: Hat 50 Likes an einem Tag vergeben long_description: | - Das Abzeichen wird verliehen, wenn du alle deiner 50 täglichen „Gefällt mir“-Angaben nutzt. Daran zu denken, sich einen Moment zu nehmen und die Beiträge mit „Gefällt mir“ zu markieren, die du genießt und schätzt, ermuntert deine Community-Kollegen, in der Zukunft noch großartigere Diskussionen zu erstellen. + Das Abzeichen wird verliehen, wenn du alle deiner 50 täglichen Likes nutzt. Daran zu denken, sich einen Moment zu nehmen und die Beiträge mit „Gefällt mir“ zu markieren, die du genießt und schätzt, ermuntert deine Community-Kollegen, in der Zukunft noch großartigere Diskussionen zu erstellen. higher_love: - name: Mehr als Liebe - description: Hat fünfmal je 50 „Gefällt mir“-Angaben an einem Tag vergeben + name: Higher Love + description: Hat fünfmal je 50 Likes an einem Tag vergeben long_description: | - Das Abzeichen wird verliehen, wenn du fünf Tage lang alle deiner 50 täglichen „Gefällt mir“-Angaben nutzt. Danke, dass du dir die Zeit nimmst, die besten Dialoge täglich zu fördern! + Das Abzeichen wird verliehen, wenn du fünf Tage lang alle deiner 50 täglichen Likes nutzt. Danke, dass du dir die Zeit nimmst, die besten Dialoge täglich zu fördern! crazy_in_love: - name: Total verliebt - description: Hat 20-mal je 50 „Gefällt mir“-Angaben an einem Tag vergeben + name: Crazy in Love + description: Hat 20-mal je 50 Likes an einem Tag vergeben long_description: | - Das Abzeichen wird verliehen, wenn du 20 Tage lang alle deiner 50 täglichen „Gefällt mir“-Angaben nutzt. Wow! Du bist ein Vorbild für die regelmäßige Ermunterung deiner Community-Kollegen! + Das Abzeichen wird verliehen, wenn du 20 Tage lang alle deiner 50 täglichen Likes nutzt. Wow! Du bist ein Vorbild für die regelmäßige Ermunterung deiner Community-Kollegen! thank_you: name: Dankeschön - description: Hat 20 „Gefällt mir“-Angaben für Beiträge erhalten und 10 „Gefällt mir“-Angaben vergeben + description: Hat 20 Likes für Beiträge erhalten und 10 Likes vergeben long_description: | - Das Abzeichen wird verliehen, wenn du 20 Beiträge mit „Gefällt mir“-Angaben hast und im Gegenzug mindestens 10 „Gefällt mir“-Angaben vergeben hast. Wenn jemand deine Beiträge mit „Gefällt mir“ markiert, findest du auch die Zeit, mit „Gefällt mir“ zu markieren, was andere schreiben. + Das Abzeichen wird verliehen, wenn du 20 Beiträge mit Likes hast und im Gegenzug mindestens 10 Likes vergeben hast. Wenn jemand deine Beiträge mit „Gefällt mir“ markiert, findest du auch die Zeit, mit „Gefällt mir“ zu markieren, was andere schreiben. gives_back: name: Geben & Nehmen - description: Hat 100 „Gefällt mir“-Angaben für Beiträge erhalten und 100 „Gefällt mir“-Angaben vergeben + description: Hat 100 Likes für Beiträge erhalten und 100 Likes vergeben long_description: | - Das Abzeichen wird verliehen, wenn du 100 Beiträge mit „Gefällt mir“-Angaben hast und im Gegenzug mindestens 100 „Gefällt mir“-Angaben vergeben hast. Danke, dass du vorab bezahlst! + Das Abzeichen wird verliehen, wenn du bei 100 Beiträgen Likes erhalten und im Gegenzug mindestens 100 Likes vergeben hast. Danke, dass du vorab bezahlst! empathetic: name: Empathisch - description: Hat 500 „Gefällt mir“-Angaben für Beiträge erhalten und 1000 „Gefällt mir“-Angaben vergeben + description: Hat 500 Likes für Beiträge erhalten und 1000 Likes vergeben long_description: | - Das Abzeichen wird verliehen, wenn du 500 Beiträge mit „Gefällt mir“-Angaben hast und im Gegenzug mindestens 1000 „Gefällt mir“-Angaben vergeben hast. Wow! Du bist ein Vorbild von Großzügigkeit und gegenseitige Wertschätzung :two_hearts:. + Das Abzeichen wird verliehen, wenn du bei 500 Beiträgen Likes erhalten und im Gegenzug mindestens 1000 Likes vergeben hast. Wow! Du bist ein Vorbild von Großzügigkeit und gegenseitige Wertschätzung :two_hearts:. first_emoji: name: Erstes Emoji description: Hat ein Emoji in einem Beitrag verwendet @@ -2804,7 +2802,7 @@ de: first_mention: name: Erste Erwähnung description: Hat einen Benutzer in einem Beitrag erwähnt - long_description: Das Abzeichen wird verliehen, wenn du das erste Mal den @Benutzernamen von jemandem in deinem Beitrag erwähnst. Jede Erwähnung erzeugt eine Benachrichtigung an die Person, sodass sie über deinen Beitrag informiert wird. Gib einfach ein @ (At-Zeichien) ein und erwähne einen beliebigen Benutzer oder, sofern erlaubt, eine Gruppe – es ist ein komfortabler Weg, die Aufmerksamkeit von jemandem auf etwas zu lenken. + long_description: Das Abzeichen wird verliehen, wenn du das erste Mal den @Benutzernamen von jemandem in deinem Beitrag erwähnst. Jede Erwähnung erzeugt eine Benachrichtigung an die Person, sodass sie über deinen Beitrag informiert wird. Gib einfach ein @ (At-Zeichen) ein und erwähne einen beliebigen Benutzer oder, sofern erlaubt, eine Gruppe – es ist ein komfortabler Weg, die Aufmerksamkeit von jemandem auf etwas zu lenken. first_onebox: name: Erste Onebox description: Hat einen Link geteilt, der in eine Onebox umgewandelt wurde @@ -2828,9 +2826,142 @@ de: user_exists: "Entschuldige, dieser Benutzer ist bereits eingeladen worden. Du kannst einen Benutzer nur einmal zu einem Thema einladen." tags: title: "Schlagwörter" - staff_tag_disallowed: "Das Schlagwort \"%{tag}\" kann nur von Mitarbeitern angewendet werden." - staff_tag_remove_disallowed: "Das Schlagwort \"%{tag}\" kann nur von Mitarbeitern entfernt werden." + staff_tag_disallowed: "Das Schlagwort \"%{tag}\" darf nur vom Team verwendet werden." + staff_tag_remove_disallowed: "Das Schlagwort \"%{tag}\" darf nur vom Team entfernt werden." rss_by_tag: "Themen mit dem Schlagwort %{tag}" + finish_installation: + congratulations: "Glückwunsch, du hast Discourse installiert!" + register: + button: "Registrieren" + title: "Administrator-Konto registrieren" + help: "registriere ein neues Konto, um loszulegen" + no_emails: "Leider wurden bei der Einrichtung keine Administrator-Mails festgelegt, sodass es schwer sein dürfte, die Konfiguration abzuschließen." + confirm_email: + title: "Bestätige deine E-Mail-Adresse" + message: "
Wir haben eine Aktivierungsmail an %{email} gesendet. Bitte folge den Anweisungen in der E-Mail, um dein Konto zu aktivieren.
Wenn diese nicht ankommst, stelle sicher, dass du E-Mail für dein Discourse richtig eingestellt hast und prüfe deinen Spamordner.
" + resend_email: + title: "Aktivierungsmail erneut senden" + message: "
Wir haben die Aktivierungsmail noch einmal an %{email} gesendet" + safe_mode: + title: "Abgesicherten Modus betreten" + description: "Der abgesicherte Modus ermöglicht es dir, deine Seite zu testen, ohne Plugins oder Seiten-Anpassungen zu laden." + no_customizations: "Alle Seiten-Anpassungen deaktivieren" + only_official: "Inoffizielle Plugins deaktivieren" + no_plugins: "Alle Plugins deaktivieren" + enter: "Abgesicherten Modus betreten" + wizard: + title: "Discourse einrichten" + step: + locale: + title: "Willkommen zu Discourse!" + fields: + default_locale: + description: "Was ist die Standardsprache für deine Community?" + forum_title: + title: "Name" + description: "Der Name ist ein Zeichen, das aus der Ferne sichtbar ist, wahrscheinlich die erste Sache, die mögliche Besucher über deine Community bemerken werden Was sagt dein Name und Titel über deine Community aus?" + fields: + title: + label: "Name deiner Community" + placeholder: "Erikas Stammtisch" + site_description: + label: "Beschreibe deine Community in einem kurzen Satz" + placeholder: "Ein Ort für Erika und ihre Bekannten, um coole Sachen zu besprechen" + introduction: + title: "Einführung" + fields: + welcome: + label: "Willkommen-Thema" + description: "
Wie würdest du deine Community einem Fremden im Fahrstuhl in ungefähr 1 Minute beschreiben?
Dein Willkommensthema ist die erste Sache, die neue Besucher sehen werden. Betrachte es als dein 'Fahrstuhl-Vorstellungsgespräch' oder als 'Leitbild'.
" + one_paragraph: "Bitte begrenze deine Willkommensnachricht auf einen Absatz." + privacy: + title: "Zugriff" + description: "
Ist deine Community offen für alle oder beschränkt durch Mitgliedschaft, Einladung oder Genehmigung? Wenn du dies bevorzugst, kannst du alles zunächst privat einrichten und dann später auf öffentlich umschalten.
Bitte denke daran, dass du Einladungen auch immer aus Themen oder von deiner Benutzerprofilseite aus schicken kannst.
" + fields: + privacy: + choices: + open: + label: "Öffentlich" + description: "Jeder kann auf diese Community zugreifen, der ein Konto registriert." + restricted: + label: "Privat" + description: "Nur Personen, die ich eingeladen oder genehmigt habe, können auf diese Community zugreifen." + contact: + title: "Kontakt" + fields: + contact_email: + label: "Mail" + placeholder: "name@example.com" + description: "E-Mail-Adresse der verantwortlichen Person oder Gruppe für diese Community. Wird verwendet für kritische Benachrichtigungen wie unbehandelte Meldungen, Sicherheitsaktualisierungen sowie auf eurer „Über uns“-Seite für dringenden Community-Kontakt." + contact_url: + label: "Webseite" + placeholder: "http://www.example.com/kontaktiere-uns" + description: "Allgemeines Kontaktformular für euch oder eure Organisation. Wird angezeigt auf eurer „Über uns“-Seite." + site_contact: + label: "Automatische Nachrichten" + description: "Alle automatischen, persönlichen Discourse-Nachrichten werden von diesem Benutzer versandt. Insbesondere wird dieser Benutzer der ausgewiesene Absender jeder Willkommensnachricht sein, die automatisch an neue Benutzer geschickt werden." + corporate: + title: "Organisation" + description: "Diese Namen werden in eure Datenschutzerklärung und Nutzungsbedingungen eingefügt, die du jederzeit in der Team-Kategorie ändern kannst Wenn du keine Firma hast, kannst du diesen Schritt auch überspringen." + fields: + company_short_name: + label: "Firmenname (kurz)" + placeholder: "Musterfirma" + company_full_name: + label: "Firmenname (komplett)" + placeholder: "Musterfirma GmbH" + company_domain: + label: "Firmen-Domainname" + placeholder: "musterfirma.com" + colors: + title: "Design" + fields: + theme_id: + description: "Bevorzugst du ein helles oder dunkles Farbschema? Du kannst das Erscheinungsbild deiner Seite jederzeit weiter anpassen unter Administration, Anpassen." + choices: + default: + label: "Simple Light (Hell)" + dark: + label: "Simple Dark (Dunkel)" + logos: + title: "Logos" + fields: + logo_url: + label: "Hauptlogo" + description: "Das Logobild für den linken, oberen Bereich deiner Seite. Verwende eine weite, rechteckige Form." + logo_small_url: + label: "Kompaktes Logo" + description: "Eine kompakte Version deines Logos, das auf deiner Seite oben links angezeigt wird, wenn man herunterscollt. Verwende eine quadratische Form." + icons: + title: "Icons" + fields: + favicon_url: + label: "Kleines Icon" + description: "Icon-Bild, das in Webbrowsern mit kleineren Dimensionen gut aussieht. Die empfohlene Größe beträgt 32x32 Pixel." + apple_touch_icon_url: + label: "Großes Icon" + description: "Icon-Bild, das auf modernen Geräten mit größeren Dimensionen gut aussieht. Die empfohlene Größe beträgt mindestens 144x144 Pixel." + homepage: + description: "Wir empfehlen, die aktuellen Themen auf deiner Startseite anzuzeigen, aber du kannst dich auch dafür entscheiden, Kategorien (Gruppen von Themen) auf der Startseite anzuzeigen, wenn dir das lieber ist." + title: "Homepage" + fields: + homepage_style: + choices: + latest: + label: "Neueste Beiträge" + categories: + label: "Kategorien" + emoji: + title: "Emoji" + description: "Welches Emoji-Design bevorzugst du für deine Community? Du kannst später jederzeit mehr benutzerdefinierte Emoji einfügen unter Administration, Anpassen, Emoji." + invites: + title: "Team einladen" + description: "Du hast es fast geschafft! Lass uns ein paar Team-Mitglieder einladen, um eure Diskussionen in Gang zu bringen mit interessanten Themen und Antworten und deine Community zu beginnen." + finished: + title: "Dein Discourse ist bereit!" + description: | +
Wenn du diese Einstellungen jemals ändern möchtest, besuche deinen Administrationsbereich; finde ihn neben dem Schraubenschüssel-Symbol im Seitenmenü..
+
Viel Spaß, und viel Glück beim Aufbauen deiner neuen Community!
activemodel: errors: <<: *errors diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index ec495b4d408..312cc18c97b 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -94,7 +94,7 @@ en: has_already_been_used: "has already been used" inclusion: is not included in the list invalid: is invalid - is_invalid: "is invalid; try to be a little more descriptive" + is_invalid: "seems unclear, is it a complete sentence?" less_than: must be less than %{count} less_than_or_equal_to: must be less than or equal to %{count} not_a_number: is not a number @@ -134,7 +134,8 @@ en: <<: *errors bulk_invite: - file_should_be_csv: "The uploaded file should be of csv or txt format." + file_should_be_csv: "The uploaded file should be of csv format." + error: "There was an error uploading that file. Please try again later." backup: operation_already_running: "An operation is currently running. Can't start a new job right now." @@ -157,6 +158,11 @@ en: embed: start_discussion: "Start Discussion" continue: "Continue Discussion" + error: "Error Embedding" + referer: "Referer:" + mismatch: "The referer did not match any of the following hosts:" + no_hosts: "No hosts were set up for embedding." + configure: "Configure Embedding" more_replies: one: "1 more reply" other: "%{count} more replies" @@ -193,10 +199,11 @@ en: spamming_host: "Sorry you cannot post a link to that host." user_is_suspended: "Suspended users are not allowed to post." topic_not_found: "Something has gone wrong. Perhaps this topic was closed or deleted while you were looking at it?" + not_accepting_pms: "Sorry, %{username} is not accepting messages at the moment." just_posted_that: "is too similar to what you recently posted" invalid_characters: "contains invalid characters" - is_invalid: "is invalid; try to be a little more descriptive" + is_invalid: "seems unclear, is it a complete sentence?" next_page: "next page →" prev_page: "← previous page" page_num: "Page %{num}" @@ -319,6 +326,7 @@ en: name: "Category Name" topic: title: 'Title' + featured_link: 'Featured Link' post: raw: "Body" user_profile: @@ -335,12 +343,16 @@ en: too_many_users: "You can only send warnings to one user at a time." cant_send_pm: "Sorry, you cannot send a private message to that user." no_user_selected: "You must select a valid user." + featured_link: + invalid: "is invalid. URL should include http:// or https://." + invalid_category: "can't be edited in this category." user: attributes: password: common: "is one of the 10000 most common passwords. Please use a more secure password." same_as_username: "is the same as your username. Please use a more secure password." same_as_email: "is the same as your email. Please use a more secure password." + same_as_current: "is the same as your current password." ip_address: signup_not_allowed: "Signup is not allowed from this account." color_scheme_color: @@ -350,7 +362,10 @@ en: post_reply: base: different_topic: "Post and reply must belong to the same topic." - + web_hook: + attributes: + payload_url: + invalid: "URL is invalid. URL should includes http:// or https://. And no blank is allowed." user_profile: no_info_me: "
"
@@ -365,8 +380,27 @@ en:
staff_category_name: "Staff"
staff_category_description: "Private category for staff discussions. Topics are only visible to admins and moderators."
+ assets_topic_title: "Assets for the site design"
assets_topic_body: "This is a permanent topic, visible only to staff, for storing images and files used in the site design. Don't delete it!\n\n\nHere's how:\n\n\n1. Reply to this topic.\n2. Upload all the images you wish to use for logos, favicons, and so forth here. (Use the upload toolbar icon in the post editor, or drag-and-drop or paste images.)\n3. Submit your reply to post it.\n4. Right click the images in your new post to get the path to the uploaded images, or click the edit icon to edit your post and retrieve the path to the images. Copy the image paths.\n5. Paste those image paths into [basic settings](/admin/site_settings/category/required).\n\n\nIf you need to enable different file type uploads, edit `authorized_extensions` in the [file settings](/admin/site_settings/category/files)."
+ discourse_welcome_topic:
+ title: "Welcome to Discourse"
+ body: |
+
+ The first paragraph of this pinned topic will be visible as a welcome message to all new visitors on your homepage. It's important!
+
+ **Edit this** into a brief description of your community:
+
+ - Who is it for?
+ - What can they find here?
+ - Why should they come here?
+ - Where can they read more (links, resources, etc)?
+
+
+
+ You may want to close this topic via the admin :wrench: (at the upper right and bottom), so that replies don't pile up on an announcement.
+
+
lounge_welcome:
title: "Welcome to the Lounge"
body: |
@@ -434,6 +468,7 @@ en:
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."
delete_post: "You're deleting posts too quickly. Please wait %{time_left} before trying again."
+ public_group_membership: "You're joining/leaving groups too frequently. 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."
@@ -595,6 +630,14 @@ en:
description: 'Vote for this post'
long_form: 'voted for this post'
+ user_activity:
+ no_bookmarks:
+ self: "You have no bookmarked posts, bookmarking posts allows you to easily access them later on."
+ others: "No bookmarks."
+ no_likes_given:
+ self: "You have not liked any posts."
+ others: "No liked posts."
+
topic_flag_types:
spam:
title: 'Spam'
@@ -641,6 +684,22 @@ en:
not_found_description: "Sorry, we couldn't find this unsubscribe. It's possible the link in your email has expired?"
log_out: "Log Out"
+ user_api_key:
+ title: "Authorize application access"
+ authorize: "Authorize"
+ read: "read"
+ read_write: "read/write"
+ description: "\"%{application_name}\" is requesting the following access to your account:"
+ no_trust_level: "Sorry, you do not have the required trust level to access the user API"
+ generic_error: "Sorry, we are unable to issue user API keys, this feature may be disabled by the site admin"
+ scopes:
+ message_bus: "Live updates"
+ notifications: "Read and clear notifications"
+ push: "Push notifications to external services"
+ session_info: "Read user session info"
+ read: "Read all"
+ write: "Write all"
+
reports:
visits:
title: "User Visits"
@@ -797,14 +856,6 @@ en:
s3_backup_config_warning: 'The server is configured to upload backups to s3, but at least one the following setting is not set: s3_access_key_id, s3_secret_access_key or s3_backup_bucket. Go to the Site Settings and update the settings. See "How to set up image uploads to S3?" to learn more.'
image_magick_warning: 'The server is configured to create thumbnails of large images, but ImageMagick is not installed. Install ImageMagick using your favorite package manager or download the latest release.'
failing_emails_warning: 'There are %{num_failed_jobs} email jobs that failed. Check your app.yml and ensure that the mail server settings are correct. See the failed jobs in Sidekiq.'
- default_logo_warning: "Set the graphic logos for your site. Update logo_url, logo_small_url, and favicon_url in Site Settings."
- contact_email_missing: "Enter a site contact email address so you can be reached for urgent matters regarding your site. Update it in Site Settings."
- contact_email_invalid: "The site contact email is invalid. Update it in Site Settings."
- title_nag: "Enter the name of your site. Update title in Site Settings."
- site_description_missing: "Enter a one sentence description of your site that will appear in search results. Update site_description in Site Settings."
- consumer_email_warning: "Your site is configured to use Gmail (or another consumer email service) to send email. Gmail limits how many emails you can send. Consider using an email service provider like mandrill.com to ensure email deliverability."
- site_contact_username_warning: "Enter the name of a friendly staff user account to send important automated messages from. Update site_contact_username in Site Settings."
- notification_email_warning: "Notification emails are not being sent from a valid email address on your domain; email delivery will be erratic and unreliable. Please set notification_email to a valid local email address in Site Settings."
subfolder_ends_in_slash: "Your subfolder setup is incorrect; the DISCOURSE_RELATIVE_URL_ROOT ends in a slash."
email_polling_errored_recently:
one: "Email polling has generated an error in the past 24 hours. Look at the logs for more details."
@@ -816,6 +867,7 @@ en:
site_settings:
censored_words: "Words that will be automatically replaced with ■■■■"
+ censored_pattern: "Regex pattern that will be automatically replaced with ■■■■"
delete_old_hidden_posts: "Auto-delete any hidden posts that stay hidden for more than 30 days."
default_locale: "The default language of this Discourse instance (ISO 639-1 Code)"
allow_user_locale: "Allow users to choose their own language interface preference"
@@ -824,11 +876,15 @@ en:
min_first_post_length: "Minimum allowed first post (topic body) length in characters"
min_private_message_post_length: "Minimum allowed post length in characters for messages"
max_post_length: "Maximum allowed post length in characters"
+ topic_featured_link_enabled: "Enable posting a link with topics."
+ show_topic_featured_link_in_digest: "Show the topic featured link in the digest email."
min_topic_title_length: "Minimum allowed topic title length in characters"
max_topic_title_length: "Maximum allowed topic title length in characters"
min_private_message_title_length: "Minimum allowed title length for a message in characters"
min_search_term_length: "Minimum valid search term length in characters"
search_tokenize_chinese_japanese_korean: "Force search to tokenize Chinese/Japanese/Korean even on non CJK sites"
+ search_prefer_recent_posts: "If searching your large forum is slow, this option tries an index of more recent posts first"
+ search_recent_posts_size: "How many recent posts to keep in the index"
allow_uncategorized_topics: "Allow topics to be created without a category. WARNING: If there are any uncategorized topics, you must recategorize them before turning this off."
allow_duplicate_topic_titles: "Allow topics with identical, duplicate titles."
unique_posts_mins: "How many minutes before a user can make a post with the same content again"
@@ -860,7 +916,8 @@ en:
show_pinned_excerpt_mobile: "Show excerpt on pinned topics in mobile view."
show_pinned_excerpt_desktop: "Show excerpt on pinned topics in desktop view."
post_onebox_maxlength: "Maximum length of a oneboxed Discourse post in characters."
- onebox_domains_whitelist: "A list of domains to allow oneboxing for; these domains should support OpenGraph or oEmbed. Test them at http://iframely.com/debug"
+ onebox_domains_blacklist: "A list of domains that will never be oneboxed."
+ max_oneboxes_per_post: "Maximum number of oneboxes in a post."
logo_url: "The logo image at the top left of your site, should be a wide rectangle shape. If left blank site title text will be shown."
digest_logo_url: "The alternate logo image used at the top of your site's email summary. Should be a wide rectangle shape. Should not be an SVG image. If left blank `logo_url` will be used."
@@ -940,10 +997,9 @@ en:
prioritize_username_in_ux: "Show username first on user page, user card and posts (when disabled name is shown first)"
email_token_valid_hours: "Forgot password / activate account tokens are valid for (n) hours."
- email_token_grace_period_hours: "Forgot password / activate account tokens are still valid for a grace period of (n) hours after being redeemed."
enable_badges: "Enable the badge system"
- enable_whispers: "Allow staff private communication within topic. (experimental)"
+ enable_whispers: "Allow staff private communication within topics."
allow_index_in_robots_txt: "Specify in robots.txt that this site is allowed to be indexed by web search engines."
email_domains_blacklist: "A pipe-delimited list of email domains that users are not allowed to register accounts with. Example: mailinator.com|trashmail.net"
@@ -983,6 +1039,7 @@ en:
sso_overrides_name: "Overrides local full name with external site full name from SSO payload on every login, and prevent local changes."
sso_overrides_avatar: "Overrides user avatar with external site avatar from SSO payload. If enabled, disabling allow_uploaded_avatars is highly recommended"
sso_not_approved_url: "Redirect unapproved SSO accounts to this URL"
+ sso_allows_all_return_paths: "Do not restrict the domain for return_paths provided by SSO (by default return path must be on current site)"
enable_local_logins: "Enable local username and password login based accounts. (Note: this must be enabled for invites to work)"
allow_new_registrations: "Allow new user registrations. Uncheck this to prevent anyone from creating a new account."
@@ -1004,6 +1061,7 @@ en:
enable_facebook_logins: "Enable Facebook authentication, requires facebook_app_id and facebook_app_secret"
facebook_app_id: "App id for Facebook authentication, registered at https://developers.facebook.com/apps"
facebook_app_secret: "App secret for Facebook authentication, registered at https://developers.facebook.com/apps"
+ facebook_request_extra_profile_details: "Request about me, location and website from facebook. (requires that your auth application be approved by facebook)"
enable_github_logins: "Enable Github authentication, requires github_client_id and github_client_secret"
github_client_id: "Client id for Github authentication, registered at https://github.com/settings/applications"
@@ -1028,6 +1086,8 @@ en:
top_topics_formula_first_post_likes_multiplier: "value of first post likes multiplier (n) in top topics formula: `log(views_count) * 2 + op_likes_count * (n) + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`"
top_topics_formula_least_likes_per_post_multiplier: "value of least likes per post multiplier (n) in top topics formula: `log(views_count) * 2 + op_likes_count * 0.5 + LEAST(likes_count / posts_count, (n)) + 10 + log(posts_count)`"
+ rebake_old_posts_count: "Number of old posts to be rebaked every 15 minutes."
+
rate_limit_create_topic: "After creating a topic, users must wait (n) seconds before creating another topic."
rate_limit_create_post: "After posting, users must wait (n) seconds before creating another post."
rate_limit_new_user_create_topic: "After creating a topic, new users must wait (n) seconds before creating another topic."
@@ -1045,6 +1105,7 @@ en:
alert_admins_if_errors_per_minute: "Number of errors per minute in order to trigger an admin alert. A value of 0 disables this feature. NOTE: requires restart."
alert_admins_if_errors_per_hour: "Number of errors per hour in order to trigger an admin alert. A value of 0 disables this feature. NOTE: requires restart."
+ categories_topics: "Number of topics to show in /categories page."
suggested_topics: "Number of suggested topics shown at the bottom of a topic."
limit_suggested_to_category: "Only show topics from the current category in suggested topics."
suggested_topics_max_days_old: "Suggested topics should not be more than n days old."
@@ -1067,6 +1128,7 @@ en:
external_system_avatars_url: "URL of the external system avatars service. Allowed substitutions are {username} {first_letter} {color} {size}"
default_opengraph_image_url: "URL of the default opengraph image."
+ twitter_summary_large_image_url: "URL of the default Twitter summary card image (should be at least 280px in width, and at least 150px in height)."
allow_all_attachments_for_group_messages: "Allow all email attachments for group messages."
@@ -1109,6 +1171,8 @@ en:
min_trust_to_edit_wiki_post: "The minimum trust level required to edit post marked as wiki."
+ min_trust_to_edit_post: "The minimum trust level required to edit posts."
+
min_trust_to_allow_self_wiki: "The minimum trust level required to make user's own post wiki."
min_trust_to_send_messages: "The minimum trust level required to create new private messages."
@@ -1137,6 +1201,7 @@ en:
min_title_similar_length: "The minimum length of a title before it will be checked for similar topics."
min_body_similar_length: "The minimum length of a post's body before it will be checked for similar topics."
+ desktop_category_page_style: "Visual style for the /categories page."
category_colors: "A list of hexadecimal color values allowed for categories."
category_style: "Visual style for category badges."
@@ -1223,9 +1288,13 @@ en:
attachment_content_type_blacklist: "List of keywords used to blacklist attachments based on the content type."
attachment_filename_blacklist: "List of keywords used to blacklist attachments based on the filename."
+ enable_forwarded_emails: "[BETA] Allow users to create a topic by forwarding an email in."
+ always_show_trimmed_content: "Always show trimmed part of incoming emails. WARNING: might reveal email addresses."
+
manual_polling_enabled: "Push emails using the API for email replies."
pop3_polling_enabled: "Poll via POP3 for email replies."
pop3_polling_ssl: "Use SSL while connecting to the POP3 server. (Recommended)"
+ pop3_polling_openssl_verify: "Verify TLS server certificate (Default: enabled)"
pop3_polling_period_mins: "The period in minutes between checking the POP3 account for email. NOTE: requires restart."
pop3_polling_port: "The port to poll a POP3 account on."
pop3_polling_host: "The host to poll for email via POP3."
@@ -1251,23 +1320,31 @@ en:
allow_animated_thumbnails: "Generates animated thumbnails of animated gifs."
default_avatars: "URLs to avatars that will be used by default for new users until they change them."
automatically_download_gravatars: "Download Gravatars for users upon account creation or email change."
- digest_topics: "The maximum number of topics to display in the email summary."
+ digest_topics: "The maximum number of popular topics to display in the email summary."
+ digest_posts: "The maximum number of popular posts to display in the email summary."
+ digest_other_topics: "The maximum number of topics to show in the 'New in topics and categories you follow' section of the email summary."
digest_min_excerpt_length: "Minimum post excerpt in the email summary, in characters."
delete_digest_email_after_days: "Suppress summary emails for users not seen on the site for more than (n) days."
digest_suppress_categories: "Suppress these categories from summary emails."
disable_digest_emails: "Disable summary emails for all users."
+ email_accent_bg_color: "The accent color to be used as the background of some elements in HTML emails. Enter a color name ('red') or hex value ('#FF000')."
+ email_accent_fg_color: "The color of text rendered on the email bg color in HTML emails. Enter a color name ('white') or hex value ('#FFFFFF')."
+ email_link_color: "The color of links in HTML emails. Enter a color name ('blue') or hex value ('#0000FF')."
detect_custom_avatars: "Whether or not to check that users have uploaded custom profile pictures."
max_daily_gravatar_crawls: "Maximum number of times Discourse will check Gravatar for custom avatars in a day"
public_user_custom_fields: "A whitelist of custom fields for a user that can be shown publicly."
staff_user_custom_fields: "A whitelist of custom fields for a user that can be shown to staff."
enable_user_directory: "Provide a directory of users for browsing"
+ enable_group_directory: "Provide a directory of groups for browsing"
allow_anonymous_posting: "Allow users to switch to anonymous mode"
anonymous_posting_min_trust_level: "Minimum trust level required to enable anonymous posting"
anonymous_account_duration_minutes: "To protect anonymity create a new anonymous account every N minutes for each user. Example: if set to 600, as soon as 600 minutes elapse from last post AND user switches to anon, a new anonymous account is created."
hide_user_profiles_from_public: "Disable user cards, user profiles and user directory for anonymous users."
+ user_website_domains_whitelist: "User website will be verified against these domains. Pipe-delimited list."
+
allow_profile_backgrounds: "Allow users to upload profile backgrounds."
sequential_replies_threshold: "Number of posts a user has to make in a row in a topic before being reminded about too many sequential replies."
@@ -1292,6 +1369,10 @@ en:
topic_page_title_includes_category: "Topic page title includes the category name."
+ native_app_install_banner: "Asks recurring visitors to install Discourse native app."
+
+ max_prints_per_hour_per_user: "Maximum number of /print page impressions (set to 0 to disable)"
+
full_name_required: "Full name is a required field of a user's profile."
enable_names: "Show the user's full name on their profile, user card, and emails. Disable to hide full name everywhere."
display_name_on_posts: "Show a user's full name on their posts in addition to their @username."
@@ -1307,13 +1388,14 @@ en:
feed_polling_url: "EMBEDDING ONLY: URL of RSS/ATOM feed to embed."
embed_by_username: "Discourse username of the user who creates the embedded topics."
embed_username_key_from_feed: "Key to pull discourse username from feed."
+ embed_title_scrubber: "Regular expression for scrubbing embeddable titles."
embed_truncate: "Truncate the embedded posts."
+ allowed_href_schemes: "Schemes allowed in links in addition to http and https."
embed_post_limit: "Maximum number of posts to embed."
embed_username_required: "The username for topic creation is required."
embed_whitelist_selector: "CSS selector for elements that are allowed in embeds."
embed_blacklist_selector: "CSS selector for elements that are removed from embeds."
notify_about_flags_after: "If there are flags that haven't been handled after this many hours, send an email to the contact_email. Set to 0 to disable."
- enable_cdn_js_debugging: "Allow /logs to display proper errors by adding crossorigin permissions on all js includes."
show_create_topics_notice: "If the site has fewer than 5 public topics, show a notice asking admins to create some topics."
delete_drafts_older_than_n_days: Delete drafts older than (n) days.
@@ -1332,6 +1414,7 @@ en:
approve_post_count: "The amount of posts from a new or basic user that must be approved"
approve_unless_trust_level: "Posts for users below this trust level must be approved"
+ approve_new_topics_unless_trust_level: "New topics for users below this trust level must be approved"
notify_about_queued_posts_after: "If there are posts that have been waiting to be reviewed for more than this many hours, an email will be sent to the contact_email. Set to 0 to disable these emails."
auto_close_messages_post_count: "Maximum number of posts allowed in a message before it is automatically closed (0 to disable)"
auto_close_topics_post_count: "Maximum number of posts allowed in a topic before it is automatically closed (0 to disable)"
@@ -1352,6 +1435,7 @@ en:
default_other_new_topic_duration_minutes: "Global default condition for which a topic is considered new."
default_other_auto_track_topics_after_msecs: "Global default time before a topic is automatically tracked."
+ default_other_notification_level_when_replying: "Global default notification level when the user replies to a topic."
default_other_external_links_in_new_tab: "Open external links in a new tab by default."
default_other_enable_quoting: "Enable quote reply for highlighted text by default."
default_other_dynamic_favicon: "Show new/updated topic count on browser icon by default."
@@ -1364,6 +1448,16 @@ en:
default_categories_watching: "List of categories that are watched by default."
default_categories_tracking: "List of categories that are tracked by default."
default_categories_muted: "List of categories that are muted by default."
+ default_categories_watching_first_post: "List of categories in which first post in each new topic will be watched by default."
+
+ max_user_api_reqs_per_day: "Maximum number of user API requests per key per day"
+ max_user_api_reqs_per_minute: "Maximum number of user API requests per key per minute"
+ allow_user_api_keys: "Allow generation of user API keys"
+ allow_user_api_key_scopes: "List of scopes allowed for user API keys"
+ max_api_keys_per_user: "Maximum number of user API keys per user"
+ min_trust_level_for_user_api_key: "Trust level required for generation of user API keys"
+ allowed_user_api_auth_redirects: "Allowed URL for authentication redirect for user API keys"
+ allowed_user_api_push_urls: "Allowed URLs for server push to user API"
tagging_enabled: "Enable tags on topics?"
min_trust_to_create_tag: "The minimum trust level required to create a tag."
@@ -1376,9 +1470,13 @@ en:
tag_style: "Visual style for tag badges."
staff_tags: "A list of tags that can only be applied by staff members"
min_trust_level_to_tag_topics: "Minimum trust level required to tag topics"
- suppress_overlapping_tags_in_list: "Hide tags from list views, if they overlap with title"
+ suppress_overlapping_tags_in_list: "If tags match exact words in topic titles, don't show the tag"
remove_muted_tags_from_latest: "Don't show topics tagged with muted tags in the latest topic list."
+ company_short_name: "Company Name (short)"
+ company_full_name: "Company Name (full)"
+ company_domain: "Company Domain"
+
errors:
invalid_email: "Invalid email address."
invalid_username: "There's no user with that username."
@@ -1401,6 +1499,7 @@ en:
reply_by_email_address_is_empty: "You must set a 'reply by email address' before enabling reply by email."
email_polling_disabled: "You must enable either manual or POP3 polling before enabling reply by email."
user_locale_not_enabled: "You must first enable 'allow user locale' before enabling this setting."
+ invalid_regex: "Regex is invalid or not allowed."
search:
within_post: "#%{post_number} by %{username}"
@@ -1503,6 +1602,7 @@ en:
something_already_taken: "Something went wrong, perhaps the username or email is already registered. Try the forgot password link."
omniauth_error: "Sorry, there was an error authorizing your account. Perhaps you did not approve authorization?"
omniauth_error_unknown: "Something went wrong processing your log in, please try again."
+ authenticator_error_no_valid_email: "No email addresses associated with %{account} are allowed. You may need to configure your account with a different email address."
new_registrations_disabled: "New account registrations are not allowed at this time."
password_too_long: "Passwords are limited to 200 characters."
email_too_long: "The email you provided is too long. Mailbox names must be no more than 254 characters, and domain names must be no more than 253 characters."
@@ -1531,6 +1631,8 @@ en:
ip_address:
blocked: "New registrations are not allowed from your IP address."
max_new_accounts_per_registration_ip: "New registrations are not allowed from your IP address (maximum limit reached). Contact a staff member."
+ website:
+ domain_not_allowed: "Website is invalid. Allowed domains are: %{domains}"
flags_reminder:
flags_were_submitted:
@@ -1541,6 +1643,7 @@ en:
other: "%{count} flags waiting to be handled"
unsubscribe_mailer:
+ title: "Unsubscribe Mailer"
subject_template: "Confirm you no longer want to receive email updates from %{site_title}"
text_body_template: |
Someone (possibly you?) requested to no longer send email updates from %{site_domain_name} to this address.
@@ -1552,6 +1655,7 @@ en:
If you want to continue receiving email updates, you may ignore this email.
invite_mailer:
+ title: "Invite Mailer"
subject_template: "%{invitee_name} invited you to '%{topic_title}' on %{site_domain_name}"
text_body_template: |
%{invitee_name} invited you to a discussion
@@ -1571,6 +1675,7 @@ en:
This invitation is from a trusted user, so you can reply to the discussion immediately.
custom_invite_mailer:
+ title: "Custom Invite Mailer"
subject_template: "%{invitee_name} invited you to '%{topic_title}' on %{site_domain_name}"
text_body_template: |
%{invitee_name} invited you to a discussion
@@ -1594,6 +1699,7 @@ en:
This invitation is from a trusted user, so you can reply to the discussion immediately.
invite_forum_mailer:
+ title: "Invite Forum Mailer"
subject_template: "%{invitee_name} invited you to join %{site_domain_name}"
text_body_template: |
%{invitee_name} invited you to join
@@ -1606,9 +1712,10 @@ en:
%{invite_link}
- This invitation is from a trusted user, so an account will be created for you automatically.
+ This invitation is from a trusted user, so an account will be created for you automatically using this email address.
custom_invite_forum_mailer:
+ title: "Invite Forum Mailer"
subject_template: "%{invitee_name} invited you to join %{site_domain_name}"
text_body_template: |
%{invitee_name} invited you to join
@@ -1625,9 +1732,10 @@ en:
%{invite_link}
- This invitation is from a trusted user, so an account will be created for you automatically.
+ This invitation is from a trusted user, so an account will be created for you automatically using this email address.
invite_password_instructions:
+ title: "Invite Password Instructions"
subject_template: "Set password for your %{site_name} account"
text_body_template: |
Thanks for accepting your invitation to %{site_name} -- welcome!
@@ -1638,6 +1746,7 @@ en:
(If the link above has expired, choose "I forgot my password" when logging in with your email address.)
test_mailer:
+ title: "Test Mailer"
subject_template: "[%{site_name}] Email Deliverability Test"
text_body_template: |
This is a test email from
@@ -1682,6 +1791,7 @@ en:
[mt]: http://www.mail-tester.com/
new_version_mailer:
+ title: "New Version Mailer"
subject_template: "[%{site_name}] New Discourse version, update available"
text_body_template: |
Hooray, a new version of [Discourse](http://www.discourse.org) is available!
@@ -1696,6 +1806,7 @@ en:
- Visit [meta.discourse.org](https://meta.discourse.org) for news, discussion, and support for Discourse
new_version_mailer_with_notes:
+ title: "New Version Mailer with Notes"
subject_template: "[%{site_name}] update available"
text_body_template: |
Hooray, a new version of [Discourse](http://www.discourse.org) is available!
@@ -1714,6 +1825,7 @@ en:
%{notes}
queued_posts_reminder:
+ title: "Queued Posts Reminder"
subject_template:
one: "[%{site_name}] 1 post waiting to be reviewed"
other: "[%{site_name}] %{count} posts waiting to be reviewed"
@@ -1739,6 +1851,7 @@ en:
system_messages:
post_hidden:
+ title: "Post Hidden"
subject_template: "Post hidden by community flags"
text_body_template: |
Hello,
@@ -1757,99 +1870,12 @@ en:
usage_tips:
text_body_template: |
- Here are a few quick tips to get you started:
+ For a few quick tips on getting started as a new user, [check out this blog post](http://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/).
- ## Reading
-
- To read more, **just keep scrolling down!**
-
- As new replies or new topics arrive, they will appear automatically – no need to refresh the page.
-
- ## Navigation
-
- - For search, your user page, or the ☰ menu, use the **icon buttons at upper right**.
-
- - Selecting a topic title will always take you to your **next unread reply** in the topic. To enter at the top or bottom instead, select the reply count or last reply date.
-
-
-
- - While reading a topic, use the timeline on the right to jump to the top, bottom, or your last read position. On smaller screens, select the progress bar at bottom right to expand it:
-
-
-
- You can also press ? on your keyboard for a list of super-speedy keyboard shortcuts.
-
- ## Replying
-
- To insert a quote, select the text you wish to quote, then press any
Reply button to open the editor. Repeat for multiple quotes.
-
-
-
- You can always continue reading while you compose your reply, and we automatically save drafts as you write.
-
- To notify someone about your reply, mention their name. Type `@` to begin selecting a username.
-
-
-
- To use [standard Emoji](http://www.emoji.codes/), just type `:` to match by name, or use the traditional smileys `;)`
-
-
-
- To generate a summary for a link, paste it on a line by itself:
-
-
-
- Your reply can be formatted using simple HTML, BBCode, or [Markdown](http://commonmark.org/help/):
-
- This is **bold**.
- This is bold.
- This is [b]bold[/b].
-
- For more formatting tips, [try our fun 10 minute interactive tutorial!](http://commonmark.org/help/tutorial/)
-
- ## Actions
-
- There are action buttons at the bottom of each post:
-
-
-
- - To let someone know that you enjoyed and appreciated their post, use the **like** button. Share the love!
-
- - Grab a copy-pasteable link to any reply or topic via the **link** button.
-
- - Use the … show more button to reveal more actions. **Flag** to privately let the author, or [our staff](%{base_url}/about), know about a problem. **Bookmark** to find this post later on your profile page.
-
- ## Notifications
-
- When someone replies to you, quotes your post, mentions your `@username`, or even links to your post, a number will immediately appear at the top right of the page. Select it to access your **notifications**.
-
-
-
- Don't worry about missing a reply – you'll be emailed any notifications that arrive when you are away.
-
- ## Preferences
-
- - All topics less than **two days old** are considered new.
-
- - Any topic you've **actively participated in** (by creating it, replying to it, or reading it for an extended period) will be automatically tracked on your behalf.
-
- You will see the new and unread number indicators next to these topics:
-
-
-
- You can change your notifications for any topic via the notification control at the bottom, and right hand side, of each topic.
-
-
-
- You can also set notification state per category, if you want to watch or mute every new topic in a specific category.
-
- To change any of these settings, see [your user preferences](%{base_url}/my/preferences).
-
- ## Community Trust
-
- It's great to meet you! As you participate here, over time we'll get to know you, and your temporary new user limitations will be lifted. Keep participating, and over time you'll gain new [trust levels](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) that include special abilities to help us manage our community together.
+ As you participate here, we’ll get to know you, and temporary new user limitations will be lifted. Over time you’ll gain [trust levels](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) that include special abilities to help us manage our community together.
welcome_user:
+ title: "Welcome User"
subject_template: "Welcome to %{site_name}!"
text_body_template: |
Thanks for joining %{site_name}, and welcome!
@@ -1863,17 +1889,14 @@ en:
(If you need to communicate with [staff members](%{base_url}/about) as a new user, just reply to this message.)
welcome_invite:
+ title: "Welcome Invite"
subject_template: "Welcome to %{site_name}!"
text_body_template: |
Thanks for accepting your invitation to %{site_name} -- welcome!
- We've created a new account **%{username}** for you, and you are logged in. You can change your name by visiting [your user profile][prefs].
+ - We've created this new account **%{username}** for you. Change your name or password by visiting [your user profile][prefs].
- To log in again later:
-
- 1. Always **use the same email address from your original invitation** when logging in. Otherwise we won't be able to tell it's you!
-
- 2. Create a unique password for [your user profile][prefs], and use it to log in.
+ - When you log in, please **use the same email address from your original invitation** — otherwise we won't be able to tell it's you!
%{new_user_tips}
@@ -1886,11 +1909,12 @@ en:
[prefs]: %{user_preferences_url}
backup_succeeded:
+ title: "Backup Succeeded"
subject_template: "Backup completed successfully"
text_body_template: |
The backup was successful.
- Visit the [admin > backup section](%{base_url}/admin/backups) to download your new backup."
+ Visit the [admin > backup section](%{base_url}/admin/backups) to download your new backup.
Here's the log:
@@ -1899,6 +1923,7 @@ en:
```
backup_failed:
+ title: "Backup Failed"
subject_template: "Backup failed"
text_body_template: |
The backup has failed.
@@ -1910,6 +1935,7 @@ en:
```
restore_succeeded:
+ title: "Restore Succeeded"
subject_template: "Restore completed successfully"
text_body_template: |
The restore was successful.
@@ -1921,6 +1947,7 @@ en:
```
restore_failed:
+ title: "Restore Failed"
subject_template: "Restore failed"
text_body_template: |
The restore has failed.
@@ -1932,10 +1959,12 @@ en:
```
bulk_invite_succeeded:
+ title: "Bulk Invite Succeeded"
subject_template: "Bulk user invite processed successfully"
text_body_template: "Your bulk user invite file was processed, %{sent} invites mailed."
bulk_invite_failed:
+ title: "Bulk Invite Failed"
subject_template: "Bulk user invite processed with errors"
text_body_template: |
Your bulk user invite file was processed, %{sent} invites mailed with %{failed} error(s).
@@ -1947,6 +1976,7 @@ en:
```
csv_export_succeeded:
+ title: "CSV Export Succeeded"
subject_template: "Data export complete"
text_body_template: |
Your data export was successful! :dvd:
@@ -1956,10 +1986,12 @@ en:
The above download link will be valid for 48 hours.
csv_export_failed:
+ title: "CSV Export Failed"
subject_template: "Data export failed"
text_body_template: "We're sorry, but your data export failed. Please check the logs or contact a staff member."
email_reject_insufficient_trust_level:
+ title: "Email Reject insufficient Trust Level"
subject_template: "[%{site_name}] Email issue -- Insufficient Trust Level"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -1967,6 +1999,7 @@ en:
Your account does not have the required trust level to post new topics to this email address. If you believe this is an error, contact a staff member.
email_reject_user_not_found:
+ title: "Email Reject User Not Found"
subject_template: "[%{site_name}] Email issue -- User Not Found"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -1974,6 +2007,7 @@ en:
Your reply was sent from an unknown email address. Try sending from another email address, or contact a staff member.
email_reject_screened_email:
+ title: "Email Reject Screened Email"
subject_template: "[%{site_name}] Email issue -- Blocked Email"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -1981,6 +2015,7 @@ en:
Your reply was sent from a blocked email address. Try sending from another email address, or contact a staff member.
email_reject_inactive_user:
+ title: "Email Reject Inactive User"
subject_template: "[%{site_name}] Email issue -- Inactive User"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -1988,6 +2023,7 @@ en:
Your account associated with this email address is not activated. Please activate your account before sending emails in.
email_reject_blocked_user:
+ title: "Email Reject Blocked User"
subject_template: "[%{site_name}] Email issue -- Blocked User"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -1995,13 +2031,15 @@ en:
Your account associated with this email address has been blocked.
email_reject_reply_user_not_matching:
- subject_template: "[%{site_name}] Email issue -- Reply User Not Matching"
+ title: "Email Reject User Not Matching"
+ subject_template: "[%{site_name}] Email issue -- Unexpected Reply Address"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
Your reply was sent from a different email address than the one we expected, so we're not sure if this is the same person. Try sending from another email address, or contact a staff member.
email_reject_no_account:
+ title: "Email Reject No Account"
subject_template: "[%{site_name}] Email issue -- Unknown Account"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -2009,6 +2047,7 @@ en:
We can't find any accounts that match your email address. Try sending from a different email address, or contact a staff member.
email_reject_empty:
+ title: "Email Reject Empty"
subject_template: "[%{site_name}] Email issue -- No Content"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -2018,13 +2057,15 @@ en:
If you're getting this and you _did_ include a reply, try again with simpler formatting.
email_reject_parsing:
- subject_template: "[%{site_name}] Email issue -- Content unrecognized"
+ title: "Email Reject Parsing"
+ subject_template: "[%{site_name}] Email issue -- Content Unrecognized"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
We couldn't find your reply in the email. **Make sure your reply is at the top of the email** -- we can't process inline replies.
email_reject_invalid_access:
+ title: "Email Reject Invalid Access"
subject_template: "[%{site_name}] Email issue -- Invalid Access"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -2032,6 +2073,7 @@ en:
Your account does not have the privileges to post new topics in that category. If you believe this is an error, contact a staff member.
email_reject_strangers_not_allowed:
+ title: "Email Reject Strangers Not Allowed"
subject_template: "[%{site_name}] Email issue -- Invalid Access"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -2039,6 +2081,7 @@ en:
The category you sent this email to only allows replies from users with valid accounts and known email addresses. If you believe this is an error, contact a staff member.
email_reject_invalid_post:
+ title: "Email Reject Invalid Post"
subject_template: "[%{site_name}] Email issue -- Posting error"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -2046,6 +2089,7 @@ en:
Some possible causes are: complex formatting, message too large, message too small. Please try again, or post via the website if this continues.
email_reject_invalid_post_specified:
+ title: "Email Reject Invalid Post Specified"
subject_template: "[%{site_name}] Email issue -- Posting error"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -2056,14 +2100,8 @@ en:
If you can correct the problem, please try again.
- email_reject_rate_limit_specified:
- subject_template: "[%{site_name}] Email issue -- Rate limited"
- text_body_template: |
- We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
-
- Reason: %{rate_limit_description}
-
email_reject_invalid_post_action:
+ title: "Email Reject Invalid Post Action"
subject_template: "[%{site_name}] Email issue -- Invalid Post Action"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -2072,6 +2110,7 @@ en:
email_reject_reply_key:
+ title: "Email Reject Reply Key"
subject_template: "[%{site_name}] Email issue -- Unknown Reply Key"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -2079,6 +2118,7 @@ en:
The reply key in the email is invalid or unknown, so we can't figure out what this email is in reply to. Contact a staff member.
email_reject_bad_destination_address:
+ title: "Email Reject Bad Destination Address"
subject_template: "[%{site_name}] Email issue -- Unknown To: Address"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -2086,6 +2126,7 @@ en:
None of the destination email addresses are recognized. Please make sure that you are sending to the correct email address provided by staff.
email_reject_topic_not_found:
+ title: "Email Reject Topic Not Found"
subject_template: "[%{site_name}] Email issue -- Topic Not Found"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -2093,6 +2134,7 @@ en:
The topic you are replying to no longer exists -- perhaps it was deleted? If you believe this is an error, contact a staff member.
email_reject_topic_closed:
+ title: "Email Reject Topic Closed"
subject_template: "[%{site_name}] Email issue -- Topic Closed"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -2100,6 +2142,7 @@ en:
The topic you are replying to is currently closed and no longer accepting replies. If you believe this is an error, contact a staff member.
email_reject_auto_generated:
+ title: "Email Reject Auto Generated"
subject_template: "[%{site_name}] Email issue -- Auto Generated Reply"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
@@ -2107,6 +2150,7 @@ en:
Your email was marked as "auto generated", which means it was automatically created by a computer instead of being typed by a human; we can't accept those kinds of emails. If you believe this is an error, contact a staff member.
email_error_notification:
+ title: "Email Error Notification"
subject_template: "[%{site_name}] Email issue -- POP authentication error"
text_body_template: |
Unfortunately, there was an authentication error while polling mails from the POP server.
@@ -2115,6 +2159,7 @@ en:
If there is a web UI for the POP email account, you may need to log in on the web and check your settings there.
too_many_spam_flags:
+ title: "Too Many Spam Flags"
subject_template: "New account on hold"
text_body_template: |
Hello,
@@ -2125,6 +2170,7 @@ en:
For additional guidance, please refer to our [community guidelines](%{base_url}/guidelines).
too_many_tl3_flags:
+ title: "Too Many TL3 Flags"
subject_template: "New account on hold"
text_body_template: |
Hello,
@@ -2135,6 +2181,7 @@ en:
For additional guidance, please refer to our [community guidelines](%{base_url}/guidelines).
blocked_by_staff:
+ title: "Blocked by Staff"
subject_template: "Account temporarily on hold"
text_body_template: |
Hello,
@@ -2146,6 +2193,7 @@ en:
For additional guidance, refer to our [community guidelines](%{base_url}/guidelines).
user_automatically_blocked:
+ title: "User Automatically Blocked"
subject_template: "New user %{username} blocked by community flags"
text_body_template: |
This is an automated message.
@@ -2157,6 +2205,7 @@ en:
This threshold can be changed via the `block_new_user` site settings.
spam_post_blocked:
+ title: "Spam Post Blocked"
subject_template: "New user %{username} posts blocked due to repeated links"
text_body_template: |
This is an automated message.
@@ -2168,6 +2217,7 @@ en:
This can be modified via the `newuser_spam_host_threshold` and `white_listed_spam_host_domains` site settings.
unblocked:
+ title: "Unblocked"
subject_template: "Account no longer on hold"
text_body_template: |
Hello,
@@ -2177,6 +2227,7 @@ en:
You can now create new replies and topics again. Thank you for your patience.
pending_users_reminder:
+ title: "Pending Users Reminder"
subject_template:
one: "1 user waiting for approval"
other: "%{count} users waiting for approval"
@@ -2186,10 +2237,12 @@ en:
[Please review them in the admin section](%{base_url}/admin/users/list/pending).
download_remote_images_disabled:
+ title: "Download Remote Images Disabled"
subject_template: "Downloading remote images disabled"
text_body_template: "The `download_remote_images_to_local` setting was disabled because the disk space limit at `download_remote_images_threshold` was reached."
dashboard_problems:
+ title: "Dashboard Problems"
subject_template: "Problems have been found"
text_body_template: |
Some problems are being reported on your admin dashboard.
@@ -2252,6 +2305,7 @@ en:
> %{site_title} -- %{site_description}
user_invited_to_private_message_pm:
+ title: "User Invited to PM"
subject_template: "[%{site_name}] %{username} invited you to a message '%{topic_title}'"
text_body_template: |
%{header_instructions}
@@ -2261,6 +2315,7 @@ en:
%{respond_instructions}
user_invited_to_private_message_pm_staged:
+ title: "User Invited to PM Staged"
subject_template: "[%{site_name}] %{username} invited you to a message '%{topic_title}'"
text_body_template: |
%{header_instructions}
@@ -2270,6 +2325,7 @@ en:
%{respond_instructions}
user_invited_to_topic:
+ title: "User Invited to Topic"
subject_template: "[%{site_name}] %{username} invited you to '%{topic_title}'"
text_body_template: |
%{header_instructions}
@@ -2279,6 +2335,7 @@ en:
%{respond_instructions}
user_replied:
+ title: "User Replied"
subject_template: "[%{site_name}] %{topic_title}"
text_body_template: |
%{header_instructions}
@@ -2290,6 +2347,7 @@ en:
%{respond_instructions}
user_replied_pm:
+ title: "User Replied PM"
subject_template: "[%{site_name}] [PM] %{topic_title}"
text_body_template: |
%{header_instructions}
@@ -2301,6 +2359,7 @@ en:
%{respond_instructions}
user_quoted:
+ title: "User Quoted"
subject_template: "[%{site_name}] %{topic_title}"
text_body_template: |
%{header_instructions}
@@ -2312,6 +2371,7 @@ en:
%{respond_instructions}
user_linked:
+ title: "User Linked"
subject_template: "[%{site_name}] %{topic_title}"
text_body_template: |
%{header_instructions}
@@ -2323,6 +2383,7 @@ en:
%{respond_instructions}
user_mentioned:
+ title: "User Mentioned"
subject_template: "[%{site_name}] %{topic_title}"
text_body_template: |
%{header_instructions}
@@ -2334,6 +2395,7 @@ en:
%{respond_instructions}
user_group_mentioned:
+ title: "User Group Mentioned"
subject_template: "[%{site_name}] %{topic_title}"
text_body_template: |
%{header_instructions}
@@ -2345,6 +2407,7 @@ en:
%{respond_instructions}
user_posted:
+ title: "User Posted"
subject_template: "[%{site_name}] %{topic_title}"
text_body_template: |
%{header_instructions}
@@ -2356,6 +2419,7 @@ en:
%{respond_instructions}
user_watching_first_post:
+ title: "User Watching First Post"
subject_template: "[%{site_name}] %{topic_title}"
text_body_template: |
%{header_instructions}
@@ -2367,6 +2431,7 @@ en:
%{respond_instructions}
user_posted_pm:
+ title: "User Posted PM"
subject_template: "[%{site_name}] [PM] %{topic_title}"
text_body_template: |
%{header_instructions}
@@ -2378,6 +2443,7 @@ en:
%{respond_instructions}
user_posted_pm_staged:
+ title: "User Posted PM Staged"
subject_template: "%{optional_re}%{topic_title}"
text_body_template: |
@@ -2385,16 +2451,46 @@ en:
digest:
why: "A brief summary of %{site_link} since your last visit on %{last_seen_at}"
+ since_last_visit: "Since your last visit"
+ new_topics: "New Topics"
+ unread_messages: "Unread Messages"
+ unread_notifications: "Unread Notifications"
+ liked_received: "Likes Received"
+ new_posts: "New Posts"
+ new_users: "New Users"
+ popular_topics: "Popular Topics"
+ follow_topic: "Follow this topic"
+ join_the_discussion: "Read More"
+ popular_posts: "Popular Posts"
+ from_topic_label: "From"
+ more_new: "New for you"
subject_template: "[%{site_name}] Summary"
- new_activity: "New activity on your topics and posts:"
- top_topics: "Popular posts"
- other_new_topics: "Popular topics"
unsubscribe: "This summary is sent from %{site_link} when we haven't seen you in a while. To unsubscribe %{unsubscribe_link}."
click_here: "click here"
from: "%{site_name} summary"
- read_more: "Read More"
- more_topics: "There were %{new_topics_since_seen} other new topics."
- more_topics_category: "More new topics:"
+ preheader: "A brief summary since your last visit on %{last_seen_at}"
+ custom:
+ html:
+ header: ''
+ below_post_1: ''
+ below_post_2: ''
+ below_post_3: ''
+ below_post_4: ''
+ below_post_5: ''
+ above_popular_topics: ''
+ below_popular_topics: ''
+ above_footer: ''
+ below_footer: ''
+ text:
+ below_post_1: ''
+ below_post_2: ''
+ below_post_3: ''
+ below_post_4: ''
+ below_post_5: ''
+ above_popular_topics: ''
+ below_popular_topics: ''
+ above_footer: ''
+ below_footer: ''
mailing_list:
why: "All activity on %{site_link} for %{date}"
@@ -2406,6 +2502,7 @@ en:
view_this_topic: "View this topic"
back_to_top: "Back to top"
forgot_password:
+ title: "Forgot Password"
subject_template: "[%{site_name}] Password reset"
text_body_template: |
Somebody asked to reset your password on [%{site_name}](%{base_url}).
@@ -2416,6 +2513,7 @@ en:
%{base_url}/users/password-reset/%{email_token}
set_password:
+ title: "Set Password"
subject_template: "[%{site_name}] Set Password"
text_body_template: |
Somebody asked to add a password to your account on [%{site_name}](%{base_url}). Alternatively, you can log in using any supported online service (Google, Facebook, etc) that is associated with this validated email address.
@@ -2426,6 +2524,7 @@ en:
%{base_url}/users/password-reset/%{email_token}
admin_login:
+ title: "Admin Login"
subject_template: "[%{site_name}] Login"
text_body_template: |
Somebody asked to login to your account on [%{site_name}](%{base_url}).
@@ -2436,6 +2535,7 @@ en:
%{base_url}/users/admin-login/%{email_token}
account_created:
+ title: "Account Created"
subject_template: "[%{site_name}] Your New Account"
text_body_template: |
A new account was created for you at %{site_name}
@@ -2444,6 +2544,7 @@ en:
%{base_url}/users/password-reset/%{email_token}
confirm_new_email:
+ title: "Confirm New Email"
subject_template: "[%{site_name}] Confirm your new email address"
text_body_template: |
Confirm your new email address for %{site_name} by clicking on the following link:
@@ -2451,6 +2552,7 @@ en:
%{base_url}/users/authorize-email/%{email_token}
confirm_old_email:
+ title: "Confirm Old Email"
subject_template: "[%{site_name}] Confirm your current email address"
text_body_template: |
Before we can change your email address, we need you to confirm that you control
@@ -2462,6 +2564,7 @@ en:
%{base_url}/users/authorize-email/%{email_token}
notify_old_email:
+ title: "Notify Old Email"
subject_template: "[%{site_name}] Your email address has been changed"
text_body_template: |
This is an automated message to let you know that your email address for
@@ -2473,6 +2576,7 @@ en:
%{new_email}
signup_after_approval:
+ title: "Signup After Approval"
subject_template: "You've been approved on %{site_name}!"
text_body_template: |
Welcome to %{site_name}!
@@ -2493,6 +2597,7 @@ en:
(If you need to communicate with [staff members](%{base_url}/about) as a new user, just reply to this message.)
signup:
+ title: "Signup"
subject_template: "[%{site_name}] Confirm your new account"
text_body_template: |
Welcome to %{site_name}!
@@ -2558,6 +2663,7 @@ en:
message_to_blank: "message.to is blank"
text_part_body_blank: "text_part.body is blank"
body_blank: "body is blank"
+ no_echo_mailing_list_mode: "Mailing list notifications disabled for user's own posts"
color_schemes:
base_theme_name: "Base"
@@ -2900,36 +3006,6 @@ en:
This document is CC-BY-SA. It was last updated May 31, 2013.
- static:
- search_help: |
-
-
-
-
-
-
-
order:views | order:latest | order:likes | @username | user:foo |
status:open | status:closed | status:archived | status:noreplies | status:single_user |
#category-slug | category:foo | group:foo | badge:foo | |
in:likes | in:posted | in:watching | in:tracking | in:private |
in:bookmarks | in:first | in:pinned | in:unpinned | in:wiki |
posts_count:num | before:days or date | after:days or date | tags:one,two |
-
-
-
-
rainbows #parks
will search for topics containing the word "rainbows" in the category "parks".rainbows category:parks status:open order:latest
will search for topics containing the word "rainbows" in the category "parks" that are not closed or archived, ordered by date of last post.rainbows category:"parks and gardens" in:bookmarks
will search for topics containing the word "rainbows" in the category "parks and gardens" that are bookmarked by you.-
- badges: editor: name: Editor @@ -3166,3 +3242,162 @@ en: staff_tag_disallowed: "The tag \"%{tag}\" may only be applied by staff." staff_tag_remove_disallowed: "The tag \"%{tag}\" may only be removed by staff." rss_by_tag: "Topics tagged %{tag}" + + finish_installation: + congratulations: "Congratulations, you installed Discourse!" + register: + button: "Register" + title: "Register Admin Account" + help: "register a new account to get started" + no_emails: "Unfortunately, no administrator emails were defined during setup, so finalizing the configuration may be difficult." + confirm_email: + title: "Confirm your Email" + message: "
We sent an activation mail to %{email}. Please follow the instructions in the email to activate your account.
If it doesn't arrive, ensure you have set up email correctly for your Discourse and check your spam folder.
" + resend_email: + title: "Resend Activation Email" + message: "
We've re-sent the activation email to %{email}" + + safe_mode: + title: "Enter safe mode" + description: "Safe mode allows you to test your site without loading plugins or site customizations." + no_customizations: "Disable all site customizations" + only_official: "Disable unofficial plugins" + no_plugins: "Disable all plugins" + enter: "Enter Safe Mode" + wizard: + title: "Discourse Setup" + step: + locale: + title: "Welcome to your Discourse!" + fields: + default_locale: + description: "What’s the default language for your community?" + + forum_title: + title: "Name" + description: "Your name is a sign visible in the distance, the first thing potential visitors will notice about your community. What does your name and title say about your community?" + + fields: + title: + label: "Your community’s name" + placeholder: "Jane’s Hangout" + site_description: + label: "Describe your community in one short sentence" + placeholder: "A place for Jane and her friends to discuss cool stuff" + + introduction: + title: "Introduction" + + fields: + welcome: + label: "Welcome Topic" + description: "
How would you describe your community to a stranger on an elevator in about 1 minute?
+
+
Your welcome topic is the first thing new arrivals will read. Think of it as your one paragraph 'elevator pitch' or 'mission statement'.
" + one_paragraph: "Please restrict your welcome message to one paragraph." + + privacy: + title: "Access" + description: "
Is your community open to everyone, or is it restricted by membership, invitation, or approval? If you prefer, you can set things up privately, then switch over to public later.
+
You can always send invites from topics, or from your user profile page, too.
" + + fields: + privacy: + choices: + open: + label: "Public" + description: "Anyone can access this community and sign up for an account" + restricted: + label: "Private" + description: "Only people I have invited or approved can access this community" + + contact: + title: "Contact" + fields: + contact_email: + label: "Mail" + placeholder: "name@example.com" + description: "Email address for the person or group responsible for this community. Used for critical notifications such as unhandled flags, security updates, and on your about page for urgent community contact." + contact_url: + label: "Web Page" + placeholder: "http://www.example.com/contact-us" + description: "General contact web page for you or your organization. Will be displayed on your about page." + site_contact: + label: "Automated Messages" + description: "All automated Discourse personal messages will be sent from this user. Most importantly, this user will be the designated sender of every welcome message automatically sent to new users." + + corporate: + title: "Organization" + description: "These names will be entered in your Privacy Policy and Terms of Service, which are topics you can edit in the Staff category. If you don’t have a company, feel free to skip this step for now." + + fields: + company_short_name: + label: "Company Name (short)" + placeholder: "Initech" + company_full_name: + label: "Company Name (full)" + placeholder: "Initech, Inc." + company_domain: + label: "Company Domain Name" + placeholder: "initech.com" + + colors: + title: "Theme" + fields: + theme_id: + description: "Do you prefer a light or dark color scheme to start with? You can further customize the look and feel of your site via Admin, Customize." + choices: + default: + label: "Simple Light" + dark: + label: "Simple Dark" + + logos: + title: "Logos" + fields: + logo_url: + label: "Primary Logo" + description: "The logo image at the top left of your site. Use a wide rectangle shape." + logo_small_url: + label: "Compact Logo" + description: "A compact version of your logo, shown at the top left of your site when scrolling down. Use a square shape." + + icons: + title: "Icons" + fields: + favicon_url: + label: "Small Icon" + description: "Icon image used to represent your site in web browsers that looks good at small sizes such as 32px by 32px." + apple_touch_icon_url: + label: "Large Icon" + description: "Icon image used to represent your site on modern devices that looks good at larger sizes. Recommended size is at least 144px by 144px." + + homepage: + description: "We recommend showing the latest topics on your homepage, but you can also show categories (groups of topics) on the homepage if you prefer." + title: "Homepage" + + fields: + homepage_style: + choices: + latest: + label: "Latest Topics" + categories: + label: "Categories" + + emoji: + title: "Emoji" + description: "Which Emoji style do you prefer for your community? You can add more custom Emoji later via Admin, Customize, Emoji." + + invites: + title: "Invite Staff" + description: "You’re almost done! Let’s invite some staff members to help seed your discussions with interesting topics and replies to get your community started." + + finished: + title: "Your Discourse is Ready!" + description: | +
If you ever feel like changing these settings, visit your admin section; find it next to the wrench icon in the site menu.
+
Have fun, and good luck building your new community!
diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml index 70e87d101fb..c2b92650c63 100644 --- a/config/locales/server.es.yml +++ b/config/locales/server.es.yml @@ -71,7 +71,7 @@ es: has_already_been_used: "ya se está utilizando" inclusion: no está incluido en la lista invalid: no es válido - is_invalid: "no es válido; intenta ser más descriptivo" + is_invalid: "parece poco claro, es una oración completa?" less_than: debe ser menor que %{count} less_than_or_equal_to: debe ser menor o igual que %{count} not_a_number: no es un número @@ -106,11 +106,13 @@ es: default_categories_already_selected: "No se puede seleccionar una categoría ya utilizada en otra lista." s3_upload_bucket_is_required: "No se pueden activar las subidas a S3 a menos que se haya proporcionado un valor a 's3_upload_bucket'." bulk_invite: - file_should_be_csv: "El archivo a subir debe tener formato csv o txt." + file_should_be_csv: "El archivo subido debería ser de formato csv." + error: "Ha ocurrido un error al subir ese archivo. Por favor, inténtalo más tarde de nuevo." backup: operation_already_running: "Actualmente se está ejecutando una operación. No se puede iniciar un nuevo trabajo en este momento." backup_file_should_be_tar_gz: "El archivo de la copia de seguridad debería ser del tipo .tar.gz" not_enough_space_on_disk: "No hay espacio suficiente en el disco para subir esta copia de seguridad." + invalid_filename: "El nombre de archivo del backup contiene caracteres no válidos. Los válidos son a-z 0-9 . - _." not_logged_in: "Tienes que iniciar sesión para hacer eso." not_found: "No se ha podido encontrar la URL o recurso solicitado." invalid_access: "No tienes permiso para ver el recurso solicitado." @@ -123,6 +125,11 @@ es: embed: start_discussion: "Empezar discusión" continue: "Continuar discusión" + error: "Error al insertar" + referer: "Referente:" + mismatch: "El referente no ha coincidido con ninguno de los siguientes hosts:" + no_hosts: "No se han definido hosts para el insertado" + configure: "Configurar insertado" more_replies: one: "otra respuesta" other: "otras %{count} respuestas" @@ -156,9 +163,10 @@ es: spamming_host: "Lo sentimos, no puedes publicar un enlace a esa web." user_is_suspended: "A los usuarios suspendidos no se les permite publicar." topic_not_found: "Algo ha salido mal. ¿Tal vez este tema ha sido cerrado o eliminado mientras estabas lo estabas mirando?" + not_accepting_pms: "Lo sentimos, %{username} no acepta mensajes en este momento." just_posted_that: "es demasiado parecido a lo que has publicado recientemente" invalid_characters: "contiene caracteres no válidos" - is_invalid: "no es válido, intenta ser un poco más descriptivo" + is_invalid: "parece poco claro, es una oración completa?" next_page: "siguiente página →" prev_page: "← página anterior" page_num: "Página %{num}" @@ -269,6 +277,7 @@ es: name: "Nombre de la categoría" topic: title: 'Título' + featured_link: 'Enlace destacado' post: raw: "Body" user_profile: @@ -282,12 +291,16 @@ es: too_many_users: "Solamente puedes enviar advertencias a un usuario a la vez." cant_send_pm: "Lo sentimos, no puedes enviar un mensaje privado a este usuario." no_user_selected: "Debes seleccionar un usuario válido." + featured_link: + invalid: "es inválido. La dirección debería incluir http:// o https://." + invalid_category: "no puede ser editado en esta categoría." user: attributes: password: common: "es una de las 10000 contraseñas más comunes. Por favor usa una contraseña más segura" same_as_username: "es la misma que tu nombre de usuario. Por favor, escoge una contraseña más segura." same_as_email: "es el mismo que tu email. Por favor, utiliza una contraseña más segura." + same_as_current: "es la misma que tu contraseña actual." ip_address: signup_not_allowed: "El registro no está permitido para esta cuenta." color_scheme_color: @@ -297,6 +310,10 @@ es: post_reply: base: different_topic: "El post y la respuesta deben pertenecer al mismo tema." + web_hook: + attributes: + payload_url: + invalid: "La URL no es válida. Debería incluir http:// or https://. Y no está permitido ningún espacio en blanco." <<: *errors user_profile: no_info_me: "
"
@@ -307,10 +324,27 @@ es:
meta_category_description: "Debate sobre este sitio, su gestión, cómo funciona y cómo podríamos mejorarlo."
staff_category_name: "Staff"
staff_category_description: "Categoría privada para debates entre moderadores y administradores. Los temas solo serán visibles para miembros del staff."
+ assets_topic_title: "Recursos para el diseño del sitio"
assets_topic_body: "Este es un tema permanente, visible únicamente para miembros del staff, con el fin de almacenar las imágenes y archivos utilizados en el diseño del sitio. ¡No lo elimines!\n\n\nCómo hacerlo:\n\n\n1. Responde a este tema.\n2. Sube todas las imágenes que desees para los logos, favicons y demás aquí. (Usa el icono de la barra de herramientas en el editor o arrastra y suelta las imágenes o pégalas). \n3. Publica tu respuesta.\n4. Haz clic con el botón derecho en las imágenes de tu nuevo post para obtener la ruta donde están subidas, o haz clic en el icono de editar para ver estas rutas en el panel de edición. Copia las rutas.\n5. Pega las rutas a las imágenes en [ajustes básicos](/admin/site_settings/category/required).\n\n\nSi necesitas habilitar la subida de diferentes tipos de archivo, edita `authorized_extensions` en las opciones de [archivos](/admin/site_settings/category/files)."
+ discourse_welcome_topic:
+ title: "Bienvenido a Discourse"
+ body: |2
+
+ El primer párrafo de este tema destacado (tema fijo) será visible para todos los usuarios como mensaje de bienvenida en tu página principal. Es importante!
+
+ **Estia esto** con un resumen de lo que es tu comunidad:
+
+ - ¿Para quiénes es?
+ - ¿Qué pueden encontrar aquí?
+ - ¿Por qué deben venir aquí?
+ - ¿Dónde pueden leer más sobre la comunidad (enlaces, recursos, etc)?
+
+
+
+ Quizás quieras "cerrar" este tema :wrench: (en la parte superior derecha o en la parte de abajo), para que las nuevas respuestas no se sumen en el anuncio.
lounge_welcome:
title: "Bienvenido a la Sala VIP"
- body: |
+ body: |2
¡Enhorabuena! :confetti_ball:
@@ -371,6 +405,7 @@ es:
create_topic: "Estás creando temas demasiado rápido. Por favor, espera %{time_left} antes de intentarlo de nuevo."
create_post: "Estás respondiendo demasiado rápido. Por favor, espera %{time_left} antes de intentarlo de nuevo."
delete_post: "Estás eliminando posts demasiado rápido. Por favor espera %{time_left} antes de intentarlo de nuevo."
+ public_group_membership: "Estás uniéndote o saliendo de grupos con mucha frecuencia. Por favor, espera %{time_left} antes de volver a intentarlo."
topics_per_day: "Has llegado al límite de nuevos temas de hoy. Por favor, espera %{time_left} antes de intentarlo de nuevo."
pms_per_day: "Has llegado al límite de mensajes de hoy. Por favor, espera %{time_left} antes de intentarlo de nuevo."
create_like: "Has llegado al límite de Me gusta de hoy. Por favor, espera %{time_left} antes de intentarlo de nuevo."
@@ -525,6 +560,13 @@ es:
title: 'Vota'
description: 'Vota por este post'
long_form: 'Votado para este post'
+ user_activity:
+ no_bookmarks:
+ self: "No tienes temas en marcadores, añadir temas a marcadores te permite acceder a ellos más tarde fácilmente."
+ others: "Sin marcadores."
+ no_likes_given:
+ self: "No le has dado a \"Me gusta\" en ningún tema."
+ others: "No te gusta ningún tema."
topic_flag_types:
spam:
title: 'Spam'
@@ -566,6 +608,21 @@ es:
different_user_description: "Actualmente has iniciado sesión con un usuario diferente al que te hemos enviado el correo. Por favor, cierra sesión o entra al modo anónimo, e inténtalo de nuevo."
not_found_description: "Lo sentimos, no pudimos encontrar esta cancelación de suscripción. ¿Es posible que el enlace de tu email haya caducado?"
log_out: "Cerrar sesión"
+ user_api_key:
+ title: "Autorizar acceso de aplicación"
+ authorize: "Autorizar"
+ read: "lectura"
+ read_write: "lectura/escritura"
+ description: "\"%{application_name}\" está solicitando el siguiente acceso a tu cuenta:"
+ no_trust_level: "Lo sentimos, no tienes el nivel de confianza requerido para acceder a la API de usuario"
+ generic_error: "Lo sentimos, no pudimos emitir claves API de usuario, esta funcionalidad puede estar desactivada por el administrador del sitio"
+ scopes:
+ message_bus: "Actualizaciones en tiempo real"
+ notifications: "Leer y despejar notificaciones"
+ push: "Notificaciones push a servicios externos"
+ session_info: "Leer información de la sesión del usuario"
+ read: "Leer todo"
+ write: "Escribir todo"
reports:
visits:
title: "Visitas de usuario"
@@ -721,14 +778,6 @@ es:
s3_backup_config_warning: 'El servidor está configurado para permitir subir las copias de seguridad a s3, pero al menos una de las siguientes configuraciones no está realizada: s3_access_key_id, s3_secret_access_key o s3_backup_bucket. Ve a la Configuración del Sitio y actualiza la configuración. Revisa "How to set up image uploads to S3?" para aprender más.'
image_magick_warning: 'El servidor está configurado para permitir miniaturas de imágenes grandes, pero ImageMagick no está instalado. Instala ImageMagick usando tu administrador de paquetes favorito o descárgate la última versión.'
failing_emails_warning: 'Hay %{num_failed_jobs} jobs de email que fallaron. Revisa tu app.yml y asegúrate que la configuración del servidor de mail es correcta. Mira los jobs fallados en Sidekiq.'
- default_logo_warning: "Establece los imágenes del logo para tu sitio. Actualiza logo_url, logo_small_url, y favicon_url en la Configuración del Sitio."
- contact_email_missing: "Introduce una dirección de correo electrónico de contacto para que puedan llegar mensajes urgentes sobre tu sitio. Actualízalo en Ajustes del sitio."
- contact_email_invalid: "La dirección email de contacto es inválida. Actualízala en la Configuración del Sitio."
- title_nag: "Introduce un nombre de tu sitio. Actualiza el nombre en Configuración del Sitio."
- site_description_missing: "Introduce una breve descripción sobre tu sitio que aparecerá en los resultados de búsqueda. Actualiza site_description en Ajustes del sitio."
- consumer_email_warning: "Tu sitio está configurado para Utilizar Gmail (u otro servicio de email de consumidor) para enviar email. Gmail limita la cantidad de emails que puedes enviar. Considera usar un proveedor de servicio email como mandrill.com para asegurarte la entrega de los emails."
- site_contact_username_warning: "Introduce el nombre de un administrador o moderador simpático desde el cual se enviarán mensajes automáticos importantes. Actualiza site_contact_username en Ajustes del sitio."
- notification_email_warning: "Las notificaciones por email no están siendo enviadas desde una dirección de correo electrónico válida en tu dominio; la entrega de emails será errática y poco fiable. Por favor, establece para notification_email una dirección de correo electrónico local válida en Ajustes del sitio."
subfolder_ends_in_slash: "La configuación del subdirectorio no es correcta; el campo DISCOURSE_RELATIVE_URL_ROOT termina con una barra."
email_polling_errored_recently:
one: "El email polling ha generado un error en las pasadas 24 horas. Mira en los logs para más detalles."
@@ -739,6 +788,7 @@ es:
poll_pop3_auth_error: "La conexión al servidor POP3 está fallando debido a un error de autenticación. Por favor revisa los ajustes POP3."
site_settings:
censored_words: "Las palabras serán reemplazadas con ■■■■"
+ censored_pattern: "Patrones de Regex serán automáticamente reemplazados con ■■■■"
delete_old_hidden_posts: "Auto-borrar cualquier post que se quede oculto por mas de 30 días."
default_locale: "El idioma por defecto de Discourse (ISO 639-1 Code)"
allow_user_locale: "Permitir que los usuarios escojan su propio idioma para la interfaz"
@@ -747,11 +797,15 @@ es:
min_first_post_length: "Extensión mínima permitida en el primer mensaje (cuerpo del tema) en caracteres"
min_private_message_post_length: "Extensión mínima de los posts en los mensajes, en número de caracteres"
max_post_length: "Extensión máxima de los posts, en número de caracteres"
+ topic_featured_link_enabled: "Activar publicar temas a partir de un enlace."
+ show_topic_featured_link_in_digest: "Mostrar el enlace destacado por el tema en el email de resumen."
min_topic_title_length: "Extensión mínima del título de los temas, en número de caracteres"
max_topic_title_length: "Extensión máxima del título de los temas, en número de caracteres"
min_private_message_title_length: "Extensión mínima del título de los temas en mensajes, en número de caracteres"
min_search_term_length: "Extensión mínima de una búsqueda válida, en número de caracteres"
search_tokenize_chinese_japanese_korean: "Forzar la búsqueda a tokenizar Chino/Japonés/Coreano incluso en sitios que no basados en esos idiomas"
+ search_prefer_recent_posts: "Si la búsqueda en tu foro gigante es lenta, esta opción prueba primero un índice de posts más recientes"
+ search_recent_posts_size: "Cuántos posts recientes mantener en el índice"
allow_uncategorized_topics: "Permitir la creación de temas sin categoría. AVISO: Si ya hay algún tema sin categoría, debes recategorizarlo antes de activar esta opción."
allow_duplicate_topic_titles: "Permitir temas con títulos idénticos, duplicados."
unique_posts_mins: "¿Cuántos minutos deben pasar antes de que un usuario pueda publicar el mismo contenido de nuevo?"
@@ -782,7 +836,8 @@ es:
show_pinned_excerpt_mobile: "Mostrar extracto de temas destacados en la vista móvil."
show_pinned_excerpt_desktop: "Mostrar extracto de temas destacados en la vista de escritorio."
post_onebox_maxlength: "Extensión máxima en caracteres de un post de Discourse en formato Onebox."
- onebox_domains_whitelist: "Una lista de dominios a los que permitir el formato Onebox; estos dominios deberán soportar OpenGraph u oEmbed. Pruébalos en http://iframely.com/debug"
+ onebox_domains_blacklist: "Una lista de dominios que nunca se mostrarán en un obenox."
+ max_oneboxes_per_post: "Número máximo de oneboxes en un tema."
logo_url: "El logo situado en la esquina superior izquierda de tu sitio, debería encajar en las dimensiones de un rectángulo. Si se deja en blanco, se mostrará un texto con el título del sitio."
digest_logo_url: "La imagen de logo alterno utilizado en la parte superior del resumen del sitio enviado por email. Debería encajar en las dimensiones de un rectángulo. No debería ser una imagen SVG. Si se deja en blanco, se utilizará `logo_url`."
logo_small_url: "El logo pequeño situado en la esquina superior izquierda del sitio, debería encajar en las dimensiones de un cuadrado y se muestra cuando se hace scroll hacia abajo. Si se deja en blanco, se mostrará un glifo de una casita."
@@ -813,7 +868,9 @@ es:
tl3_additional_likes_per_day_multiplier: "Incrementar el límite de likes por día para el nivel de confianza 3 (habitual) multiplicando por este número"
tl4_additional_likes_per_day_multiplier: "Incrementar el límite de likes por día para el nivel de confianza 4 (líder) multiplicando por este número"
num_spam_flags_to_block_new_user: "Si los posts de un nuevo usuario obtienen este número de reportes por spam de num_users_to_block_new_user diferentes usuarios, se ocultarán todos sus posts y no podrá publicar más en un futuro. Pon 0 para deshabilitar esto."
+ num_users_to_block_new_user: "Si los posts de un nuevo usuario son reportados como spam por num_spam_flags_to_block_new_user usuarios diferentes, ocultar todos sus posts y evitar que publique en el futuro. Poner 0 para desactivar."
num_tl3_flags_to_block_new_user: "Si los posts de un nuevo usuario obtienen este número de reportes por spam de num_users_to_block_new_user diferentes usuarios, se ocultarán todos sus posts y no podrá publicar más en un futuro. Pon 0 para deshabilitar esto."
+ num_tl3_users_to_block_new_user: "Si los posts de un nuevo usuario reciben num_tl3_flags_to_block_new_user reportes de este número de usuarios de nivel 3 de confianza, ocultar todos sus posts y prevenir futuras publicaciones. 0 para desactivar esta opción."
notify_mods_when_user_blocked: "Si un usuario es bloqueado automáticamente, enviar un mensaje a todos los moderadores."
flag_sockpuppets: "Si un nuevo usuario responde a un tema desde la misma dirección de IP que el nuevo usuario que inició el tema, reportar los posts de los dos como spam en potencia."
traditional_markdown_linebreaks: "Utiliza saltos de línea tradicionales en Markdown, que requieren dos espacios al final para un salto de línea."
@@ -821,8 +878,12 @@ es:
post_undo_action_window_mins: "Número de minutos durante los cuales los usuarios pueden deshacer sus acciones recientes en un post (me gusta, reportes, etc)."
must_approve_users: "Los miembros administración deben aprobar todas las nuevas cuentas antes de que se les permita el acceso al sitio. AVISO: ¡habilitar esta opción en un sitio activo revocará el acceso a los usuarios que no sean moderadores o admin!"
pending_users_reminder_delay: "Notificar a los moderadores si hay nuevos usuarios que hayan estado esperando aprbación durante más estas horas. Usa -1 para desactivar estas notificaciones."
+ maximum_session_age: "El usuario permanecerá n horas con su sesión iniciada desde su última visita"
+ ga_tracking_code: "El código \"Google analytics (ga.js)\", por ejemplo: UA-12345678-9 es OBSOLETO; leer http://google.com/analytics"
+ ga_domain_name: "El nombre del dominio para \"Google analytics (ga.js)\" es OBSOLETO, ejemplo: mysite.com; ver http://google.com/analytics"
ga_universal_tracking_code: "Código de seguimiento de Google Universal Analytics (analytics.js), ejemplo: UA-12345678-9; visita http://google.com/analytics"
ga_universal_domain_name: "Nombre del dominio establecido en Google Universal Analytics (analytics.js), ejemplo: misitio.com; visita http://google.com/analytics"
+ gtm_container_id: "Google Tag Manager container id. ejempo: GTM-ABCDEF"
enable_escaped_fragments: "Ir a la API Ajax-Crawling de Google si no se detecta ningún webcrawler. Mira https://developers.google.com/webmasters/ajax-crawling/docs/learn-more"
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"
@@ -844,13 +905,14 @@ es:
redirect_users_to_top_page: "Redirigir automáticamente a los nuevos usuarios y a los ausentes de larga duración a la página de mejores temas."
top_page_default_timeframe: "Período de tiempo por defecto para la página de temas top"
show_email_on_profile: "Mostrar el e-mail los usuarios en su perfil (solamente visibles para ellos mismos y el staff)"
+ prioritize_username_in_ux: "Mostrar username primero en la página de usuario, tarjeta de usuario y mensajes (cuando el nombre ha sido desactivado se muestra primero)"
email_token_valid_hours: "Los tokens para restablecer contraseña olvidada / activar cuenta son válidos durante (n) horas."
- email_token_grace_period_hours: "Los tokens para restablecer contraseña olvidada / activar cuenta son válidos durante (n) horas de periodo de gracia, después de ser redimidos."
enable_badges: "Activar el sistema de distintivos"
- enable_whispers: "Permitir al staff comunicarse privadamente en los temas. (experimental)"
+ enable_whispers: "Permitir a los miembros del staff comunicarse privadamente entre ellos en temas públicos."
allow_index_in_robots_txt: "Especificar en robots.txt que este sitio puede ser indexado por los motores de búsqueda web."
email_domains_blacklist: "Una lista de dominios de correo electrónico con los que los usuarios no se podrán registrar. Ejemplo: mailinator.com|trashmail.net"
email_domains_whitelist: "Una lista de dominios de email con los que los usuarios DEBERÁN registrar sus cuentas. AVISO: ¡los usuarios con un email con diferente dominio a los listados no estarán permitidos!"
+ forgot_password_strict: "No informar a los usuarios de la existencia de una cuenta cuando utilicen el diálogo de pérdida de contraseña."
log_out_strict: "Al cerrar sesión, cierra TODAS las sesiones del usuario en todos los dispositivos"
version_checks: "Ping el 'Discourse Hub' para actualizaciones de versión y mostrar mensajes del número de versión en el dashboard /admin"
new_version_emails: "Enviar un email a la dirección contact_email cuando esté disponible una nueva versión de Discourse."
@@ -871,11 +933,13 @@ es:
enable_sso_provider: "Implementar el protocolo del proveedor de SSO de Discourse en el endpoint /session/sso_provider requiere establecer un sso_secret"
sso_url: "URL del endpoint para el single sign on (debe incluir http:// o https://)"
sso_secret: "Cadena secreta utilizada para autenticar criptográficamente la información del SSO, asegúrate de que es de 10 caracteres o más"
+ sso_overrides_bio: "Sobreescribe la bio del usuario en su perfil y deshabilita que pueda cambiarla"
sso_overrides_email: "Sobreescribe el email local con el email que provea sitio externo desde el payload del SSO en cada registro, y previene cambios locales. (AVISO: pueden ocasionarse discrepancias debido a la normalización de los emails locales)"
sso_overrides_username: "Sobreescribe el usuario local con el usuario que provea el payload del SSO en cada registro, y previene cambios locales. (AVISO: pueden ocasionarse discrepancias debido a las diferencias en los requirimientos/longitud del usuario)"
sso_overrides_name: "Sobreescribe el nombre completo con el que provee el payload del SSO en cada registro, y previene cambios locales."
sso_overrides_avatar: "Sustituye el avatar de usuario con el avatar proveniente del sitio externo configurado para el SSO. Si se activa esta opción, se recomienda encarecidamente deshabilitar allow_uploaded_avatars"
sso_not_approved_url: "Redireccionar cuentas SSO sin aprobar a esta URL"
+ sso_allows_all_return_paths: "No restringe el dominio para return_paths provisto por SSO (por defecto, el return_paths debe ser sobre el sitio actual)."
enable_local_logins: "Habilitar las cuentas con nombre de usuario y contraseña de forma local. (Nota: esto debe estar habilitado para que funcionen las invitaciones)"
allow_new_registrations: "Permitir el registro de nuevos usuarios. Desactiva esta opción para prevenir que nadie pueda crear una nueva cuenta."
enable_signup_cta: "Mostrar un aviso a los usuarios anónimos que vuelvan a visitar el sitio animándoles a registrarse."
@@ -892,9 +956,11 @@ es:
enable_facebook_logins: "Activar autenticación por Facebook, requiere una facebook_app_id y un facebook_app_secret"
facebook_app_id: "App id para la autenticación por Facebook, registrado en https://developers.facebook.com/apps"
facebook_app_secret: "App secret para autenticación por Facebook, registrado en https://developers.facebook.com/apps"
+ facebook_request_extra_profile_details: "Solicitar sobre mí, localización y sitio web desde facebook. (requiere que tu aplicación de autenticación esté aprobada por facebook)"
enable_github_logins: "Activar autenticación por Github, requiere una github_client_id y un github_client_secret"
github_client_id: "Client id para la autenticación por Github, registrado en https://github.com/settings/applications"
github_client_secret: "Client secret para la autenticación por Github, registrado en https://github.com/settings/applications"
+ readonly_mode_during_backup: "Habilitar el modo de 'solo-lectura' mientras se hace el backup"
allow_restore: "Permitir restauración, la cual puede sobreescribir TODOS los datos del sitio! Dejela en falso a menos que tenga planeado recuperar sus datos desde una copia de respaldo. "
maximum_backups: "La cantidad máxima de copias de seguridad a tener en el disco. Las copias de seguridad más antiguas se eliminan automáticamente"
automatic_backups_enabled: "Ejecutar backups automáticos definidos por la opción de frecuencia de backups"
@@ -910,6 +976,7 @@ es:
top_topics_formula_log_views_multiplier: "valor del multiplicador de visitas (n) en la fórmula de temas top: `log(views_count) * (n) + op_likes_count * 0.5 + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`"
top_topics_formula_first_post_likes_multiplier: "valor del multiplicador de me gusta en el primer post (n) en la fórmula de temas top:: `log(views_count) * 2 + op_likes_count * (n) + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`"
top_topics_formula_least_likes_per_post_multiplier: "valor del multiplicador de me gusta por post (n) en la fórmula de temas top: `log(views_count) * 2 + op_likes_count * 0.5 + LEAST(likes_count / posts_count, (n)) + 10 + log(posts_count)`"
+ rebake_old_posts_count: "Número de publicaciones antiguas objeto de rebake cada 15 minutos."
rate_limit_create_topic: "Después de crear un tema, los usuarios deben esperar (n) segundos antes de crear otro tema."
rate_limit_create_post: "Después de publicar un post, los usuarios deben esperar (n) segundos antes de crear otro post."
rate_limit_new_user_create_topic: "Después de crear un tema, los nuevos usuarios deben esperar (n) segundos antes de crear otro tema."
@@ -924,8 +991,10 @@ es:
max_topic_invitations_per_day: "Máximo número de invitaciones a un tema que un usuario puede enviar por día."
alert_admins_if_errors_per_minute: "Número de errores por minuto que activa la alerta a administración. Un valor de 0 desactiva esta funcionalidad. NOTA: requiere reiniciar la instancia."
alert_admins_if_errors_per_hour: "Número de errores por hora que activa la alerta a administración. Un valor de 0 desactiva esta funcionalidad. NOTA: requiere reiniciar la instancia."
+ categories_topics: "Número de temas a mostrar en la página de /categorías."
suggested_topics: "Número de temas sugeridos mostrados al pie del tema."
limit_suggested_to_category: "Solo mostrar temas de la categoría actual en los temas sugeridos."
+ suggested_topics_max_days_old: "Los temas sugeridos no deben ser más antiguos de n días."
clean_up_uploads: "Eliminar subidas huérfanas sin referencia para prevenir hosting ilegal. AVISO: antes de habilitar esta opción quizá quieres hacer un backup de tu directorio de /uploads"
clean_orphan_uploads_grace_period_hours: "Período de gracia (en horas) antes de que una subida huérfana sea eliminada."
purge_deleted_uploads_grace_period_days: "Período de gracia (en días) antes de que una subida eliminada sea borrada totalmente."
@@ -939,8 +1008,12 @@ es:
s3_cdn_url: "URL de un CDN a utilizar para todos los activos s3 (por ejemplo: https://cdn.somewhere.com). AVISO: después de cambiar esta opción debes hacer un rebake de todos los posts antiguos."
avatar_sizes: "Lista de tamaños de avatar generados automáticamente."
external_system_avatars_enabled: "Usar un servicio externo para los avatares."
+ external_system_avatars_url: "Dirección URL del servicio externo para los avatares. Sustituciones permitidas: {username} {first_letter} {color} {size}"
default_opengraph_image_url: "URL de la imagen opengraph por defecto."
+ twitter_summary_large_image_url: "URL de la imagen por defecto para la tarjeta resumen de Twitter (debería ser al menos de 280px de ancho y 150 px de alto)."
allow_all_attachments_for_group_messages: "Permitir todos los archivos adjuntos de email para los mensajes a grupos."
+ convert_pasted_images_to_hq_jpg: "Convertir imágenes pegadas en archivos JPG de alta calidad."
+ convert_pasted_images_quality: "Calidad del archivo JPG convertido (1 es calidad mínima, 100 es máxima calidad)."
enable_flash_video_onebox: "Habilitar el embebido de enlaces swf y flv (Adobe Flash) en formato Onebox. AVISO: podría introducir riesgos de seguridad."
default_invitee_trust_level: "Nivel de confianza por defecto (0-4) para usuarios invitados."
default_trust_level: "Nivel de confianza por defecto (0-4) para los nuevos usuarios. ¡AVISO! Cambiar esto puede resultar en riesgo por spam."
@@ -958,7 +1031,9 @@ es:
tl3_requires_days_visited: "Mínimo número de días que un usuario necesita haber visitado el sitio en los últimos (tl3 time period) días para poder ser promocionado a nivel de confianza 3. Establece un valor superior para desactivar la posibilidad de subir a nivel de confianza 3. (0 o más)"
tl3_requires_topics_replied_to: "Mínimo número de temas que un usuario necesita haber respondido en los últimos (tl3 time period) días para poder ser promocionado a nivel de confianza 3. (0 o más)"
tl3_requires_topics_viewed: "Porcentaje de temas creados en los últimos (tl3 time period) días para que un usuario sea tenido en cuenta para promocionar a nivel de confianza 3. (0 a 100)"
+ tl3_requires_topics_viewed_cap: "El número máximo requerido de temas vistos en los últimos días (tener en cuenta el periodo que usan los usuarios de nivel de confianza 3)."
tl3_requires_posts_read: "El porcentaje de posts creados en los últimos (tl3 time period) días para que un usuario sea tenido en cuenta para promocionar a nivel de confianza 3. (0 a 100)"
+ tl3_requires_posts_read_cap: "El número máximo requerido de mensajes leídos en los últimos días (tener en cuenta el periodo que usan los usuarios de nivel de confianza 3)."
tl3_requires_topics_viewed_all_time: "El número total mínimo de temas que un usuario debió de haber visto para calificar a promoción de nivel de confianza 3."
tl3_requires_posts_read_all_time: "El número mínimo total de posts que un usuario debió de haber leído para calificar a nivel de confianza 3."
tl3_requires_max_flagged: "El usuario no debe haber tenido más de x posts reportados por x diferentes usuarios en los últimos (tl3 time period) días para poder ser promocionado a nivel de confianza 3, donde x es el valor de esta opción. (0 o más)"
@@ -968,6 +1043,7 @@ es:
tl3_links_no_follow: "No remover rel=nofollow de los enlaces publicados por usuarios con nivel de confianza 3."
min_trust_to_create_topic: "El mínimo nivel de confianza requerido para crear un nuevo tema."
min_trust_to_edit_wiki_post: "El mínimo nivel de confianza requerido para editar un post marcado como wiki."
+ min_trust_to_edit_post: "El mínimo nivel de confianza requerido para editar posts."
min_trust_to_allow_self_wiki: "El mínimo nivel de confianza requerido para que un usuario convierta sus propios posts a wiki."
min_trust_to_send_messages: "Mínimo nivel de confianza requerido para crear nuevos mensajes directos."
newuser_max_links: "Cuántos enlaces puede un nuevo usuario añadir a un post."
@@ -976,6 +1052,7 @@ es:
newuser_max_mentions_per_post: "Máximo número de menciones a @usuarios que un nuevo usuario puede usar en un post."
newuser_max_replies_per_topic: "Máximo número de respuestas que un nuevo usuario puede realizar en el mismo tema antes de que alguien responda a su vez a alguna de ellas."
max_mentions_per_post: "Máximo número de menciones a @usuarios que alguien puede usar en un post."
+ max_users_notified_per_group_mention: "Número de usuarios máximos que serán notificados si un grupo es mencionado (si se llega al límite no se mandarán las notificaciones)"
create_thumbnails: "Crear miniaturas de imágenes y lightbox cuando estas son demasiado grandes para encajar en un post."
email_time_window_mins: "Esperar (n) minutos antes de enviar cualquier email de notificación, para dar a los usuarios margen con el que editar y finalizar sus posts."
private_email_time_window_seconds: "Espera (n) segundos antes de enviar cualquier email de notificación, para dar a los usuarios margen con el que editar y finalizar sus mensajes."
@@ -988,6 +1065,7 @@ es:
title_fancy_entities: "Convertir caracteres ASCII comunes en entidades HTML de adorno en el título de los temas, como SmartyPants http://daringfireball.net/projects/smartypants/"
min_title_similar_length: "La extensión mínima que un título debe tener antes de revisar temas similares."
min_body_similar_length: "La extensión mínima que el cuerpo de un post debe tener antes de revisar temas similares."
+ desktop_category_page_style: "Estilo visual de la página de /categorías."
category_colors: "Una lista de valores en hexadecimal de los colores para las categorías."
category_style: "Estilo visual de las etiquetas de categoría."
max_image_size_kb: "El tamaño máximo, en kB, para subir imágenes. Debe ser configurado también en nginx (client_max_body_size) / apache o proxy."
@@ -1029,22 +1107,35 @@ es:
auto_block_first_post_regex: "Expresión regular que no distingue mayúsculas y minúsculas que si es detectada hará que el primer post de un usuario sea bloqueado y enviado a la cola de aprobacion. Ejemplo: raging|a[bc]a hará que todos los posts que contengan gaging, aba o aca sean bloqueados. Sólo tiene efecto en el primer mensaje de un usuario."
reply_by_email_enabled: "Habilitar la respuesta a temas por email."
reply_by_email_address: "Plantilla para la dirección de email que aparecerá al recibir correos con la función de respuesta por email: %{reply_key}@respuesta.ejemplo.com o respuestas+%{reply_key}@ejemplo.com"
+ alternative_reply_by_email_addresses: "Lista de plantillas alternativa para las direcciones de respuesta por email. Ejemplo: %{reply_key}@reply.example.com|replies+%{reply_key}@example.com"
+ incoming_email_prefer_html: "Usar el HTML en vez del texto del email entrante. ¡Podría causar errores de formato inesperados!"
disable_emails: "Impedir que Discourse envié cualquier tipo de e-mail."
strip_images_from_short_emails: "Remover imágenes de e-mails que tengan un tamaño menor a 2800 Bytes"
short_email_length: "e-mail corto longitud en Bytes"
display_name_on_email_from: "Mostrar nombres completos en los campos de remitente de emails"
unsubscribe_via_email: "Permitir a los usuarios darse de baja de los emails respondiendo con el texto 'unsubscribe' en el asunto o el cuerpo del mensaje"
+ unsubscribe_via_email_footer: "Adjuntar un enlace para darse de baja al pie de los emails enviados"
delete_email_logs_after_days: "Eliminar logs de email después de (N) días. Si es 0 permanecerán de forma indefinida."
max_emails_per_day_per_user: "Máximo número de emails a enviar a los usuarios por día. Establece 0 para desactivar el límite"
enable_staged_users: "Crear cuentas provisionales automáticamente al procesar emails entrantes."
maximum_staged_users_per_email: "Máximo número de usuarios provisionales creados al procesar un email entrante."
- auto_generated_whitelist: "Lista de direcciones de email que no serán revisadas para contenido auto-generado."
+ auto_generated_whitelist: "Lista de direcciones de email que no se revisarán para el contenido auto-generado. Ejemplo: foro@bar.com|discourse@bar.com"
block_auto_generated_emails: "Bloquear emails entrantes identificadas como auto generados."
ignore_by_title: "Ignorar emails entrantes por su título."
mailgun_api_key: "Mailgun Secret API key utilizada para verificar mensajes vía webhook."
+ soft_bounce_score: "Puntuación de rebote añadida al usuario cuando cuando se produce un rebote temporal."
+ hard_bounce_score: "Puntuación de rebote añadida al usuario cuando se produce un rebote permanente."
+ bounce_score_threshold: "Máxima puntuación de rebote a partir de la cual se detiene el envío de correos al usuario."
+ bounce_score_threshold_deactivate: "Máxima puntuación de rebote a partir de la cual se desactiva el usuario."
+ reset_bounce_score_after_days: "Restablecer la puntuación de reobte automáticamente pasados X días."
+ attachment_content_type_blacklist: "Lista de palabras clave utilizadas para bloquear adjuntos basados en el tipo de contenido."
+ attachment_filename_blacklist: "Lista de palabras clave utilizadas para bloquear adjuntos basados en el nombre de archivo."
+ enable_forwarded_emails: "[BETA] Permitir a los usuarios crear temas enviándolos por email."
+ always_show_trimmed_content: "Mostrar siempre la parte recortada de los emails entrantes. AVISO: podría revelar direcciones de correo."
manual_polling_enabled: "Lanza emails usando la API para las respuestas por email."
pop3_polling_enabled: "Poll vía POP3 para respuestas de e-mail."
pop3_polling_ssl: "Usar SSL mientras se conecta al servidor POP3. (Recomendado)"
+ pop3_polling_openssl_verify: "Verificar certificado TLS sel servidor (activado por defecto)"
pop3_polling_period_mins: "El período en minutos entre revisiones de correo de la cuenta POP3. NOTA: requiere reiniciar."
pop3_polling_port: "El puerto utilizado para hacer polling a la cuenta POP3."
pop3_polling_host: "El host utilizado para hacer polling de e-mails vía POP3."
@@ -1061,25 +1152,33 @@ es:
delete_all_posts_max: "El máximo número de posts que pueden ser eliminados a la vez con el botón \"Eliminar todos los posts\". Si un usuario tiene un mayor número de posts que este valor, éstos no podrán ser eliminados de una vez y el usuario no podrá ser eliminado."
username_change_period: "El número de días después de registrarse entre los cuales una cuenta puede cambiar su nombre de usuario (0 para deshabilitar esta opción)"
email_editable: "Permitir a los usuarios cambiar su dirección de email después de registrarse."
+ logout_redirect: "Destino hacia donde redirigir el navegador después de cerrar sesión (ej: http://sitio.com/salida)"
allow_uploaded_avatars: "Permitir a los usuarios subir imágenes de perfil personalizadas."
allow_animated_avatars: "Permitir a los usuarios utilizar imágenes de perfil animadas en gif. AVISO: ejecuta la tarea rake avatars:refresh después de cambiar esta opción."
allow_animated_thumbnails: "Generar miniaturas en movimiento de los gifs animados."
default_avatars: "URLs de avatares que se utilizarán por defecto para nuevos usuarios."
automatically_download_gravatars: "Descargar Gravatars para usuarios cuando se creen una cuenta o cambien el email."
- digest_topics: "Máximo número de temas mostrados en el resumen por email."
+ digest_topics: "El número máximo de temas populares que se muestran en el email de resumen."
+ digest_posts: "El número máximo de temas populares que se mostrarán en el email de resumen."
+ digest_other_topics: "El número máximo de temas que se mostrarán en la sección del email de resumen 'Nuevo en temas y categorías'."
digest_min_excerpt_length: "Mínimo de caracteres del extracto de posts en el resumen por email."
delete_digest_email_after_days: "Suprimir los emails de resumen para aquellos usuarios que no han visto el sitio desde más de (n) días."
digest_suppress_categories: "Suprimir estas categorías de los emails de resumen."
disable_digest_emails: "Desactivar emails de resumen para todos los usuarios."
+ email_accent_bg_color: "El color de realce utilizado como fondo en algunos elementos del HTML en los emails. Introduce un nombre de color ('red') o un valor hexadecimal ('#FF000')."
+ email_accent_fg_color: "El color de texto renderizado que irá con el color de fondo en el HTML de los emails. Introduce un nombre de color ('white') o un valor hexadecimal ('#FFFFFF')."
+ email_link_color: "El color de los enlaces en el HTML de los emails. Introduce un nombre de color ('blue') o un valor hexadecimal ('#0000FF')."
detect_custom_avatars: "Verificar o no que los usuarios han subido una imagen de perfil."
max_daily_gravatar_crawls: "Máximo número de veces que Discourse comprobará Gravatar en busca de avatares personalizados en un día"
public_user_custom_fields: "Una lista con campos personalizados para el usuario que pueden ser mostrados públicamente."
staff_user_custom_fields: "Una lista con campos personalizados para el usuario que pueden ser mostrados a los moderadores o admin."
enable_user_directory: "Proporcionar un directorio de usuarios"
+ enable_group_directory: "Activa un directorio de grupos para explorar"
allow_anonymous_posting: "Permitir a los usuarios cambiar a modo anónimo"
anonymous_posting_min_trust_level: "Nivel de confianza mínimo requerido para activar el modo anónimo"
anonymous_account_duration_minutes: "Para proteger el anonimato, crear una nueva cuenta anónima cada N minutos para cada usuario. Ejemplo: si se establece en 600, tan pronto como pasen 600 minutos desde el último post Y el usuario cambie a anónimo, se creará una nueva cuenta anónima."
hide_user_profiles_from_public: "Desactiva las tarjetas de usuario, los perfiles y el directorio de usuarios para usuarios anónimos."
+ user_website_domains_whitelist: "El sitio web del usuario será automáticamente verificado con estos dominios. Lista delimitada por barras |"
allow_profile_backgrounds: "Permitir a los usuarios subir sus propios fondos de perfil personalizados."
sequential_replies_threshold: "Número de mensajes que un usuario tiene que publicar seguidos antes de que se le recuerde sobre demasiadas respuestas consecutivas."
enable_mobile_theme: "Los dispositivos móviles utilizan un tema adaptado, con la habilidad de cambiar al estilo de sitio completo. Deshabilita esta opción si quieres utilizar una plantilla personalizada que sea completamente adaptable."
@@ -1092,6 +1191,8 @@ es:
automatically_unpin_topics: "Quitar destacado automáticamente cuando el usuario llega al final del tema."
read_time_word_count: "Número de palabras por minuto para calcular el tiempo de lectura estimado."
topic_page_title_includes_category: "El título de la página del tema incluye el nombre de la categoría."
+ native_app_install_banner: "Preguntar a visitantes recurrentes si quieren instalar la app nativa de Discourse"
+ max_prints_per_hour_per_user: "Número máximo de impresiones de página /print (pon un 0 para desactivar esta opción)"
full_name_required: "El nombre completo es un campo obligatorio del perfil de usuario."
enable_names: "Mostrar el nombre completo del usuario en su perfil, tarjeta de usuario y emails. Desactiva esta opción para ocultar el nombre completo en todas partes."
display_name_on_posts: "Mostrar el nombre completo de un usuario en sus posts, además de su @usuario."
@@ -1101,17 +1202,19 @@ es:
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 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: "Reglas de resaltado de sintaxis incluidas. (Aviso: incluir demasiados lenguajes puede afectar al rendimiento) mira: https://highlightjs.org/static/demo/ para ver una demo"
feed_polling_enabled: "SOLO PARA EMBEBER: embeber feeds RSS/ATOM como posts."
feed_polling_url: "SOLO PARA EMBEBER: URL de los feeds RSS/ATOM a embeber."
embed_by_username: "Nombre de usuario en Discourse del que crea los temas embebidos."
embed_username_key_from_feed: "Clave para extraer el nombre de usuario en Discourse desde el feed."
+ embed_title_scrubber: "Expresión regular para depurar títulos embebibles."
embed_truncate: "Truncar los posts embebidos."
+ allowed_href_schemes: "Esquemas permitidos en enlaces además de http y https."
embed_post_limit: "Número máximo de posts a embeber."
embed_username_required: "Se requiere el nombre de usuario para la creación de temas."
embed_whitelist_selector: "Selector CSS para los elementos que están permitidos en los embebidos."
embed_blacklist_selector: "Selector CSS para los elementos que están eliminados desde los embebidos."
notify_about_flags_after: "Si hay reportes que no han sido revisados después de este número de horas, enviar un correo electrónico al contact_email. Deshabilita esta opción introduciendo el valor 0."
- 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.
bootstrap_mode_min_users: "Mínimo número de usuarios requerido para desactivar el modo bootstrap (pon 0 para desactivar esta opción)"
@@ -1123,9 +1226,13 @@ es:
enforce_square_emoji: "Forzar una relación de aspecto cuadrada para todos los emojis."
approve_post_count: "La cantidad de posts que deben ser aprobados de usuarios nuevos o de nivel básico"
approve_unless_trust_level: "Los posts de usuarios con un nivel de confianza inferior a este deberán ser aprobados"
+ approve_new_topics_unless_trust_level: "Los nuevos temas de usuarios por debajo de este nivel de confianza deben ser aprobados"
notify_about_queued_posts_after: "Si hay publicaciones que han estado esperando para ser revisadas por más de este número de horas, se enviará un email a la dirección de contacto del sitio. Pon 0 para desactivar estos emails."
auto_close_messages_post_count: "Máximo número de publicaciones permitidas en un mensaje antes de que sea cerrado automáticamente (0 para desactivar)"
auto_close_topics_post_count: "Máximo número de publicaciones permitidas en un tema antes de que sea cerrado automáticamente (0 para desactivar)"
+ code_formatting_style: "El botón de código en el editor se establecerá por defecto a este estilo de formato de código"
+ default_email_digest_frequency: "Cuán a menudo recibirán los usuarios emails de resumen por defecto."
+ default_include_tl0_in_digests: "Incluir temas de usuarios nuevos en los emails de resumen por defecto. Los usuarios pueden cambiar esto en sus preferencias."
default_email_private_messages: "Enviar un email cuando alguien envíe un mensaje al usuario por defecto."
default_email_direct: "Enviar un email cuando alguien cite/responda/mencione o invite al usuario por defecto."
default_email_mailing_list_mode: "Enviar un email por cada nuevo post por defecto."
@@ -1136,6 +1243,7 @@ es:
default_email_in_reply_to: "Incluir por defecto un extracto del post al que se ha respondido en los emails."
default_other_new_topic_duration_minutes: "Condición por defecto para que un tema sea considerado nuevo"
default_other_auto_track_topics_after_msecs: "Tiempo por defecto hasta que un tema sea seguido automáticamente."
+ default_other_notification_level_when_replying: "Nivel global de notificación cuando el usuario responde a un tema."
default_other_external_links_in_new_tab: "Abrir enlaces externos en una nueva pestaña por defecto."
default_other_enable_quoting: "Activar respuesta citando texto seleccionado por defecto."
default_other_dynamic_favicon: "Mostrar temas nuevos/actualizados en el icono del navegador por defecto"
@@ -1145,18 +1253,28 @@ es:
default_categories_watching: "Lista de categorías que están vigiladas por defecto."
default_categories_tracking: "Lista de categorías que están seguidas por defecto"
default_categories_muted: "Lista de categorías que están silenciadas por defecto."
+ default_categories_watching_first_post: "Lista de categorías en las que el mensaje de cada nuevo tema será vigilado por defecto."
+ max_user_api_reqs_per_day: "Número máximo de peticiones de API de usuario por clave y por día"
+ max_user_api_reqs_per_minute: "Número máximo de peticiones de API de usuario por clave y por minuto"
+ allow_user_api_keys: "Permitir que se generen claves de API de usuario"
+ max_api_keys_per_user: "Número máximo de claves de usuario por usuario"
+ min_trust_level_for_user_api_key: "Nivel de confianza necesario para generar claves de API de usuario"
tagging_enabled: "¿Activar etiquetas para los temas?"
min_trust_to_create_tag: "El mínimo nivel de confianza requerido para crear una etiqueta."
max_tags_per_topic: "El máximo número de etiquetas que se pueden añadir a un tema."
max_tag_length: "Máximo número de caracteres que puede tener una etiqueta."
+ max_tag_search_results: "Al buscar etiquetas, el número máximo de resultados que mostrar."
show_filter_by_tag: "Mostrar un desplegable para filtrar una lista de temas por etiqueta."
max_tags_in_filter_list: "Máximo número de etiquetas en el desplegable. Se mostrarán primero aquellas más utilizadas."
tags_sort_alphabetically: "Mostrar etiquetas en orden alfabético. Por defecto se mostrarán por popularidad."
tag_style: "Estilo visual de las etiquetas."
staff_tags: "Una lista de etiquetas que sólo pueden ser aplicadas por administradores o moderadores"
min_trust_level_to_tag_topics: "Nivel mínimo requerido para etiquetar temas"
- suppress_overlapping_tags_in_list: "Ocultar etiquetas de la vista de lista si se solapan con el título"
+ suppress_overlapping_tags_in_list: "Si alguna etiqueta coinciden con palabras en el título de los temas, ocultarla."
remove_muted_tags_from_latest: "No mostrar temas con etiquetas silenciadas en la lista de temas recientes."
+ company_short_name: "Nombre de la empresa (corto)"
+ company_full_name: "Nombre de la empresa (largo)"
+ company_domain: "Dominio de la empresa"
errors:
invalid_email: "Dirección de correo electrónico inválida. "
invalid_username: "No existe ningún usuario con ese nombre de usuario. "
@@ -1171,6 +1289,7 @@ es:
invalid_string_min: "Debe contener como mínimo %{min} caracteres. "
invalid_string_max: "No debe exceder los %{max} caracteres. "
invalid_reply_by_email_address: "El valor debe contener '%{reply_key}' y debe ser diferente del email de notificación."
+ invalid_alternative_reply_by_email_addresses: "Todas los valores deben contener '%{reply_key}' y deben ser diferentes del email de notificación."
pop3_polling_host_is_empty: "Debes establecer un host de 'pop3 polling' antes de activar el polling POP3."
pop3_polling_username_is_empty: "Debes establecer un usuario de 'pop3 polling' antes de activar el polling POP3."
pop3_polling_password_is_empty: "Debes establecer una contraseña de 'pop3 polling' antes de activar el polling POP3."
@@ -1178,6 +1297,7 @@ es:
reply_by_email_address_is_empty: "Debes establecer el campo 'reply by email address' antes de activar respuesta por email."
email_polling_disabled: "Debes activar el polling POP3 o bien el manual antes de activar la respuesta por email."
user_locale_not_enabled: "Debes activar primero 'allow user locale' antes de activar esta opción."
+ invalid_regex: "El código Regex es inválido o no está permitido."
search:
within_post: "#%{post_number} por %{username}"
types:
@@ -1196,6 +1316,13 @@ es:
redirected_to_top_reasons:
new_user: "¡Bienvenido a nuestra comunidad! Estos son los temas recientes mas populares."
not_seen_in_a_month: "¡Bienvenido de vuelta! No te habíamos visto en un tiempo. Estos son los temas mas populares desde que no has estado."
+ merge_posts:
+ edit_reason:
+ one: "Un tema fue juntado por %{username}"
+ other: "%{count} mensaje fueron juntados por %{username}"
+ errors:
+ different_topics: "Mensajes que pertenecen a temas diferentes no pueden ser juntados."
+ different_users: "Mensajes que pertenecen a diferentes usuarios no pueden ser juntados."
move_posts:
new_topic_moderator_post:
one: "un post fue trasladado a un nuevo tema: %{topic_link}"
@@ -1263,6 +1390,7 @@ es:
something_already_taken: "Algo ha salido mal, quizá el nombre de usuario o el email ya han sido registrados. Prueba con el enlace de olvidé mi contraseña."
omniauth_error: "Lo sentimos, hubo un error al autorizar tu cuenta. ¿Quizás no has aprobado la autorización?"
omniauth_error_unknown: "Algo ha salido mal procesando tu inicio de sesión, por favor, vuelve a intentarlo."
+ authenticator_error_no_valid_email: "Ninguna dirección de email asociada con %{account} está permitida. Puede que necesites configurar tu cuenta con una dirección de email diferente."
new_registrations_disabled: "El registro de nuevas cuentas no está permitido en este momento."
password_too_long: "Las contraseñas están limitadas a 200 caracteres"
email_too_long: "El email que has proporcionado es demasiado largo. Las direcciones de correo no deben tener más de 254 caracteres y los nombres de dominio no más de 253."
@@ -1272,6 +1400,7 @@ es:
already_logged_in: "Ups, parece que estás intentando aceptar una invitación dirigida a otro usuariol. Si no eres %{current_user}, por favor cierra sesión e inténtalo de nuevo."
user:
no_accounts_associated: "No hay cuentas relacionadas."
+ deactivated: "Ha sido desactivado a causa de muchos rebotes al email '%{email}'."
username:
short: "debe contener al menos %{min} caracteres"
long: "debe contener no más de %{max} caracteres"
@@ -1285,9 +1414,12 @@ es:
email:
not_allowed: "este proveedor de email no está permitido. Por favor, utiliza otra dirección de email."
blocked: "no está permitido."
+ revoked: "No se enviarán más emails a '%{email}' hasta %{date}."
ip_address:
blocked: "No se permiten nuevos registros desde tu dirección IP."
max_new_accounts_per_registration_ip: "No se permiten nuevos registros desde tu dirección IP (alcanzado el límite máximo). Contacta un miembro del staff."
+ website:
+ domain_not_allowed: "El sitio web no es válido. Los dominios permitidos son: %{domains}"
flags_reminder:
flags_were_submitted:
one: "Hay reportes enviados hace 1 hora. Por favor, revísalos."
@@ -1323,8 +1455,60 @@ es:
%{invite_link}
Esta invitación proviene de un usuario de confianza, por lo que puedes comentar en el tema inmediatamente.
+ custom_invite_mailer:
+ subject_template: "%{invitee_name} te ha invitado a '%{topic_title}' en %{site_domain_name}"
+ text_body_template: |
+ %{invitee_name} te ha invitado a un debate
+
+ > **%{topic_title}**
+ >
+ > %{topic_excerpt}
+
+ en
+
+ > %{site_title} -- %{site_description}
+
+ Mensaje de %{invitee_name}:
+
+ %{user_custom_message}
+
+ Si estás interesado en participar, haz clic en el enlace debajo:
+
+ %{invite_link}
+
+ Esta invitación viene de un usuario en el que confiamos, por lo que podrás responder inmediatamente.
invite_forum_mailer:
subject_template: "%{invitee_name} te invitó a unirte a %{site_domain_name}"
+ text_body_template: |
+ %{invitee_name} te ha invitado a unirte a
+
+ > **%{site_title}**
+ >
+ > %{site_description}
+
+ Si estás interesado, haz clic en el botón debajo:
+
+ %{invite_link}
+
+ Esta invitación viene de un usuario en el que confiamos, por lo que se te creará una cuenta automáticamente.
+ custom_invite_forum_mailer:
+ subject_template: "%{invitee_name} te ha invitado a %{site_domain_name}"
+ text_body_template: |
+ %{invitee_name} te ha invitado a
+
+ > **%{site_title}**
+ >
+ > %{site_description}
+
+ Mensaje de %{invitee_name}:
+
+ %{user_custom_message}
+
+ Si estás interesado en unirte, haz clic en el enlace debajo:
+
+ %{invite_link}
+
+ Esta invitación viene de un usuario en el que confiamos, por lo que se te creará una cuenta automáticamente.
invite_password_instructions:
subject_template: "Asigna una contraseña para tu cuenta en %{site_name}"
text_body_template: |
@@ -1338,12 +1522,43 @@ es:
subject_template: "[%{site_name}] Prueba de envío de email"
new_version_mailer:
subject_template: "[%{site_name}] Nueva versión de Discourse, actualización disponible"
+ text_body_template: |
+ ¡Genial, una nueva versión de [Discourse](http://www.discourse.org) está disponible!
+
+ Tu versión: %{installed_version}
+ Nueva versión: **%{new_version}**
+
+ - Actualiza usando nuestro sencillo **[sistema de un clic para actualizar](%{base_url}/admin/upgrade)**
+
+ - Echa un vistazo a los cambios en el [changelog de GitHub](https://github.com/discourse/discourse/commits/master)
+
+ - Visita [meta.discourse.org](https://meta.discourse.org) para noticias, debates y ayuda para Discourse.
new_version_mailer_with_notes:
subject_template: "[%{site_name}] actualización disponible"
+ text_body_template: |+
+ ¡Genial, una nueva versión de [Discourse](http://www.discourse.org) está disponible!
+
+ Tu versión: %{installed_version}
+ Nueva versión: **%{new_version}**
+
+ - Actualiza usando nuestro sencillo **[sistema de un clic para actualizar](%{base_url}/admin/upgrade)**
+
+ - Echa un vistazo a los cambios en el [changelog de GitHub](https://github.com/discourse/discourse/commits/master)
+
+ - Visita [meta.discourse.org](https://meta.discourse.org) para noticias, debates y ayuda para Discourse.
+
+ ### Detalles de la versión
+
+ %{notes}
+
queued_posts_reminder:
subject_template:
one: "[%{site_name}] 1 post esperando ser revisado"
other: "[%{site_name}] %{count} posts esperando ser revisados"
+ text_body_template: |
+ Hola,
+
+ Algunos mensajes de usuarios nuevos han sido retenidos para moderar y están esperando ser revisados. [Apruébalos o recházalos aquí](%{base_url}/queued-posts).
flag_reasons:
off_topic: "Tu post fue reportado como **off-topic**: la comunidad piensa que no se ajusta debidamente al tema, definido por el título o el primer post."
inappropriate: "Tu post fue reportado como **inapropiado**: la comunidad piensa que es ofensivo, abusivo o que vulnera alguna de [nuestros consejos de uso](/guidelines)."
@@ -1357,99 +1572,22 @@ es:
deferred_and_deleted: "Gracias por hacérnoslo saber. Hemos eliminado el post."
temporarily_closed_due_to_flags: "Este tema está temporalmente cerrado debido a un gran número de reportes de la comunidad."
system_messages:
- usage_tips:
+ post_hidden:
+ subject_template: "Mensaje ocultado debido a varios reportes de la comnuidad"
text_body_template: |
- Aquí tienes unos breves consejos para empezar:
+ Hola,
- ## Lectura
+ Esto es un mensaje automático de %{site_name} para hacerte saber que tu mensaje ha sido ocultado.
- Para leer más, **¡tan solo tienes que hacer scroll!**
+ %{base_url}%{url}
- Tan pronto como se publiquen nuevos temas o respuestas, aparecerán automáticamente – sin necesidad de actualizar la página.
+ %{flag_reason}
- ## Navegación
+ Varios miembros de la comunidad han reportado el mensaje antes de que fuera ocultado, por lo que te recomendamos que revises tu mensaje para reflejar su opinión. **Puedes editar tu mensaje en %{edit_delay} minutos, y será automáticamente mostrado de nuevo.**
- - Para realizar una búsqueda, ver tu perfil de usuario, o el menú ☰, usa los **botones de la esquina superior derecha**.
+ Sin embargo, si el mensaje es ocultado por la comunidad una segunda vez, seguirá ocultado hasta que el staff lo revise – y se podrían tomar medidas incluida la posible suspensión de tu cuenta.
- - Entrar a un tema desde su título te llevará a la **última respuesta sin leer** del hilo. Para ir al primer o al último post, haz clic en el contador de respuestas o en la fecha de última respuesta.
-
-
-
- - Mientras lees un tema, usa la línea del tiempo a la derecha para ir al primer post, al último, o donde te habías quedado leyendo. En pantallas pequeñas, selecciona la barra de progreso en la esquina inferior para expandir sus controles:
-
-
-
- También puedes pulsar ? en tu teclado para ver una lista de atajos rápidos.
-
- ## Participación
-
- Para insertar una cita, selecciona el texto que quieres citar, después pulsa cualquier
botón Responder para abrir el editor. Repite el proceso para múltiples citas.
-
-
-
- Siempre puedes continuar leyendo mientras estás redactando una publicación y automáticamnte guardaremos borradores al tiempo que escribes.
-
- Para notificar a alguien en tu post, menciónale escribiendo una `@` y a continuación empieza a escribir y selecciona su nombre de usuario.
-
-
-
- Para usar [Emoji](http://www.emoji.codes/), tan solo empieza a escriboir `:` para elegir por nombre, o utiliza los smileys tradicionales `;)`
-
-
-
- Para generar una vista previa de un enlace, pégalo en una línea aparte:
-
-
-
- Tu publicación puede estar en varios formatos usando HTML simple, BBCode o [Markdown](http://commonmark.org/help/):
-
- Esto es **negrita**.
- Esto es negrita.
- Esto es [b]negrita[/b].
-
- Para más consejos sobre formato, [¡prueba nuestro divertido tutorial interactivo en 10 minutos!](http://commonmark.org/help/tutorial/)
-
- ## Acciones
-
- Hay algunos botones de acción al final de cada post:
-
-
-
- - Para hacerle saber a alguien que aprecias su post, utiliza el botón **me gusta**. ¡Compartir es amor!
-
- - Copia un enlace de cualquier post o tema a través del botón **enlace**.
-
- - Utiliza el botón … mostrar más para desplegar más acciones. **Reportar** de forma privada le notificarán al autor o a nuestros [moderadores](%{base_url}/about), sobre algún problema. **Guarda en marcadores** para encontrar ese post más tarde en tu perfil.
-
- ## Notificaciones
-
- Cuando alguien te responde, cita tu post, menciona tu `@usuario` o incluso cuando enlaza a tu post, aparecerá un número en la esquina superior derecha de la página. Selecciónala para acceder a tus **notificaciones**.
-
-
-
- No te preocupes si te pierdes alguna respueta – te enviaremos un email con las notificaciones que lleguen cuando estés fuera.
-
- ## Preferencias
-
- - Todos los temas creados hace menos de **dos días** se consideran nuevos.
-
- - Aquellos temas en los que hayas **participado activamente** (porque los hayas creado, respondido o leído durante un período razonable) serán seguidos por tu usuario automáticamente.
-
- Verás los indicadores de posts nuevos y no leídos al lado de estos temas:
-
-
-
- Puedes cambiar tus notifiaciones para cualquier tema a través del control de notificaciones al final o en el lado derecho de cada tema.
-
-
-
- También puedes establecer tu nivel de notificación para cada categoría, si quieres vigilar o silenciar los temas en una categoría específica.
-
- Para cambiar cualquiera de estas opciones, ve a [tus preferencias](%{base_url}/my/preferences).
-
- ## Confianza y comunidad
-
- ¡Es genial saber de ti! Al participar aquí, nos iremos conociendo con el tiempo y las limitaciones temporales por nuevo usuario se retirarán. Sigue participando y ganarás [niveles de confianza](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) que incluyen habilidades especiales para ayudarnos a gestionar nuestra comunidad juntos.
+ Para más información sobre lo que consideramos adecuado, lee las [directrices de la comunidad](%{base_url}/guidelines).
welcome_user:
subject_template: "¡Bienvenido a %{site_name}!"
text_body_template: |
@@ -1486,28 +1624,45 @@ es:
[prefs]: %{user_preferences_url}
backup_succeeded:
subject_template: "La copia de seguridad se completo exitosamente"
- text_body_template: "La copia de seguridad se completó con éxito.\nVisita la sección [admin > backup](%{base_url}/admin/backups) para descargar una nueva copia de seguridad."
+ text_body_template: |+
+ Copia de seguridad realizada con éxito.
+
+ Visita la sección [admin > copias de seguridad](%{base_url}/admin/backups) para descargarla.
+
+ Aquí está el registro:
+
+ ```text
+ %{logs}
+ ```
+
backup_failed:
subject_template: "La copia de seguridad falló"
text_body_template: |
La copia de seguridad ha fallado.
- Aquí esta el log:
+ Aquí está el registro:
- ```
+ ```text
%{logs}
```
restore_succeeded:
subject_template: "Restauración completada exitosamente."
- text_body_template: "La restauración fue exitosa."
+ text_body_template: |
+ La restauración se ha completado con éxito.
+
+ Aquí está el registro:
+
+ ```text
+ %{logs}
+ ```
restore_failed:
subject_template: "La restauración falló."
text_body_template: |
La restauración ha fallado.
- Aquí esta el log:
+ Aquí está el registro:
- ```
+ ```text
%{logs}
```
bulk_invite_succeeded:
@@ -1536,14 +1691,32 @@ es:
text_body_template: "Lo sentimos, pero la exportación de datos falló. Por favor, verifica los registros o contacta a un miembro del staff."
email_reject_insufficient_trust_level:
subject_template: "[%{site_name}] Problema relacionado con el email -- Insuficiente nivel de confianza"
+ text_body_template: |
+ Lo sentimos, pero tu mensaje de email a %{destination} (con título %{former_title}) no ha funcionado.
+
+ Tu cuenta no tiene el nivel de confianza necesario para publicar nuevos temas a esta dirección de email. Si crees que se trata de un error, contacta a un miembro del staff.
+ email_reject_user_not_found:
+ subject_template: "[%{site_name}] Problema de email -- Usuario no encontrado"
+ email_reject_screened_email:
+ subject_template: "[%{site_name}] Problema con el correo electrónico -- Correo bloqueado"
+ text_body_template: |
+ Lo sentimos, pero tu email para %{destination} (titulado %{former_title}) se ha rechazado.
+
+ No hay una cuenta asociada con esta dirección de email. Intenta enviarlo con otra dirección de email o contacta con algún miembro del Staff.
email_reject_inactive_user:
subject_template: "[%{site_name}] Problema relacionado con el email -- Usuario inactivo"
text_body_template: |
Lo sentimos, pero tu email para %{destination} (titulado %{former_title}) no se entregó.
La cuenta asociada a esta dirección de email no ha sido activada. Por favor activa tu cuenta antes de enviar emails.
+ email_reject_blocked_user:
+ subject_template: "[%{site_name}] Problema con el correo electrónico -- Usuario bloqueado"
+ text_body_template: |
+ Lo sentimos, pero tu email para %{destination} (titulado %{former_title}) no se entregó.
+
+ La cuenta asociada a esta dirección de email ha sido bloqueada.
email_reject_reply_user_not_matching:
- subject_template: "[%{site_name}] Problema relacionado con el email -- No coincide el usuario de la respuesta"
+ subject_template: "[%{site_name}] Problema con el correo electrónico -- Email de respuesta no esperado"
email_reject_no_account:
subject_template: "[%{site_name}] Problema con el correo electrónico -- Cuenta Desconocida"
email_reject_empty:
@@ -1555,13 +1728,15 @@ es:
Si estás teniendo este problema y _sí_ incluiste contenido, inténtalo de nuevo con un formato más simple.
email_reject_parsing:
- subject_template: "[%{site_name}] Problema con el correo electrónico -- Contenido desconocido"
+ subject_template: "[%{site_name}] Problema con el correo electrónico -- Contenido erróneo"
text_body_template: |
Lo sentimos, pero tu email para %{destination} (titulado %{former_title}) no funcionó.
No hemos encontrado tu respuesta en el email. **Asegúrate de escribir tu entera respuesta al principio del email** - no podemos analizar respuestas entre líneas.
email_reject_invalid_access:
subject_template: "[%{site_name}] Error de email -- Acceso no válido"
+ email_reject_strangers_not_allowed:
+ subject_template: "[%{site_name}] Error de email -- Acceso no válido"
email_reject_reply_key:
subject_template: "[%{site_name}] Problema con el correo electrónico -- Clave de Respuesta Desconocida"
email_reject_topic_not_found:
@@ -1572,7 +1747,39 @@ es:
subject_template: "[%{site_name}] Problema con el correo electrónico -- Respuesta Auto Generada"
email_error_notification:
subject_template: "[%{site_name}] Problema con el correo electrónico -- Error de autenticación POP"
+ too_many_spam_flags:
+ subject_template: "Nueva cuenta retenida"
+ text_body_template: |
+ Hola,
+
+ Esto es un mensaje automático de %{site_name} para hacerte saber que tus mensajes han sido ocultados temporalmente porque han sido reportados por la comunidad.
+
+ Como medida cautelar, tu cuenta nueva ha sido bloqueada y no puede crear nuevas respuestas o temas hasta que un miembro del staff la revise. Sentimos las molestias ocasionadas.
+
+ Para más información sobre lo que consideramos adecuado, lee las [directrices de la comunidad](%{base_url}/guidelines).
+ too_many_tl3_flags:
+ subject_template: "Nueva cuenta retenida"
+ text_body_template: |
+ Hola,
+
+ Esto es un mensaje automático de %{site_name} para hacerte saber que tus mensajes han sido ocultados temporalmente porque han sido reportados muchas veces por la comunidad.
+
+ Como medida cautelar, tu cuenta nueva ha sido bloqueada y no puede crear nuevas respuestas o temas hasta que un miembro del staff la revise. Sentimos las molestias ocasionadas.
+
+ Para más información sobre lo que consideramos adecuado, lee las [directrices de la comunidad](%{base_url}/guidelines).
+ blocked_by_staff:
+ subject_template: "Cuenta temporalmente retenida"
+ text_body_template: |
+ Hola,
+
+ Esto es un mensaje automático de %{site_name} para hacerte saber que tu cuenta ha sido temporalmente retenida como medida cautelar.
+
+ Por favor, sigue leyendo, pero no podrás responder o crear temas hasta que un [miembro del staff](%{base_url}/about) revise tus últimos temas. Sentimos las molestias ocasionadas.
+
+
+ Para más información sobre lo que consideramos adecuado, lee las [directrices de la comunidad](%{base_url}/guidelines).
user_automatically_blocked:
+ subject_template: "Nuevo usuario %{username} bloqueado por las \"banderas\" de la comunidad."
text_body_template: |
Este es un mensaje automático.
@@ -1591,6 +1798,14 @@ es:
Por favor, [echa un vistazo al usuario](%{user_url}).
Esto puede ser modificado con los ajustes`newuser_spam_host_threshold` y`white_listed_spam_host_domains`.
+ unblocked:
+ subject_template: "Cuenta no retenida"
+ text_body_template: |
+ Hola,
+
+ Este es un mensaje automático desde %{site_name} para informarte que tu cuenta no se encuentra retenida debido a la revisión de miembros del staff.
+
+ Ahora puedes crear temas, y responder a otros usuarios. Gracias por tu paciencia.
pending_users_reminder:
subject_template:
one: "1 usuario esperando aprobación"
@@ -1602,14 +1817,27 @@ es:
download_remote_images_disabled:
subject_template: "Inhabilitar la descarga de imágenes remotas"
text_body_template: "La opción `download_remote_images_to_local` ha sido inhabilitada porque se ha llegado al límite de espacio en disco configurado en `download_remote_images_threshold`."
+ dashboard_problems:
+ subject_template: "Se han encontrado problemas"
+ text_body_template: |
+ Algunos problemas han sido reportados en el panel de administración.
+
+ [Por favor revisar y corregir](%{base_url}/admin).
unsubscribe_link: |
Para darte de baja de estos emails, [haz clic aquí](%{unsubscribe_url}).
unsubscribe_link_and_mail: |
Para darte de baja de estos emails, [haz clic aquí](%{unsubscribe_url}).
+ unsubscribe_mailing_list: |
+ Estás recibiendo esto porque has activado el modo listado de emails.
+
+ Para cancelar estos emails, [clic aquí](%{unsubscribe_url}).
subject_re: "Re:"
subject_pm: "[MP]"
user_notifications:
previous_discussion: "Respuestas anteriores"
+ reached_limit:
+ one: "ADVERTENCIA: has superado el límite diario de emails. Las próximas notificaciones de emails serán suprimidas."
+ other: "ADVERTENCIA: has superado el límite de %{count} emails diarios. Las próximas notificaciones de emails serán suprimidas."
in_reply_to: "En respuesta a"
unsubscribe:
title: "Darse de baja"
@@ -1733,6 +1961,16 @@ es:
%{context}
+ %{respond_instructions}
+ user_watching_first_post:
+ subject_template: "[%{site_name}] %{topic_title}"
+ text_body_template: |
+ %{header_instructions}
+
+ %{message}
+
+ %{context}
+
%{respond_instructions}
user_posted_pm:
subject_template: "[%{site_name}] [MP] %{topic_title}"
@@ -1746,21 +1984,29 @@ es:
%{respond_instructions}
user_posted_pm_staged:
subject_template: "%{optional_re}%{topic_title}"
- text_body_template: |
+ text_body_template: |2
%{message}
digest:
why: "Un breve resumen de %{site_link} desde tu última visita el %{last_seen_at}"
+ since_last_visit: "Desde tu última visita"
+ new_topics: "Temas nuevos"
+ unread_messages: "Mensajes no leídos"
+ unread_notifications: "Notificaciones no leídas"
+ liked_received: "Me gusta recibidos"
+ new_posts: "Nuevos temas"
+ new_users: "Nuevos usuarios"
+ popular_topics: "Temas populares"
+ follow_topic: "Seguir este tema"
+ join_the_discussion: "Leer más"
+ popular_posts: "Temas populares"
+ from_topic_label: "Formulario"
+ more_new: "Nuevos temas en las categorías que sigues"
subject_template: "Resumen de [%{site_name}]"
- new_activity: "Actividad nueva en tus temas y posts:"
- top_topics: "Posts populares"
- other_new_topics: "Temas populares"
unsubscribe: "Este resumen se envía desde %{site_link} cuando pasa un tiempo desde tu última visita. Para cancelar tu suscripción %{unsubscribe_link}."
click_here: "clic aquí"
from: "resumen de %{site_name}"
- read_more: "Leer más"
- more_topics: "Se han publicado otros %{new_topics_since_seen} nuevos temas."
- more_topics_category: "Más temas nuevos:"
+ preheader: "Un corto resumen desde tu última visita el %{last_seen_at}"
mailing_list:
why: "Actividad en %{site_link} a %{date}"
subject_template: "[%{site_name}] Resumen del %{date}"
@@ -1812,8 +2058,20 @@ es:
%{base_url}/users/authorize-email/%{email_token}
confirm_old_email:
subject_template: "[%{site_name}] Confirma tu dirección actual de email"
+ text_body_template: |
+ Antes de cambiar tu dirección de correo electrónico, necesitamos que confirmes que tienes acceso a dicho email. Después de completar este paso, podrás confirmar la nueva dirección de correo electrónico.
+
+ Confirma tu actual correo electrónico para %{site_name} haciendo clic en el siguiente enlace:
+
+ %{base_url}/users/authorize-email/%{email_token}
notify_old_email:
subject_template: "[%{site_name}] Tu dirección de email ha sido cambiada"
+ text_body_template: |
+ Este es un mensaje automático que se ha generado para comunicarte que tu email para el sitio %{site_name} ha sido modificado. Si ha habido un error, por favor contacta al administrador.
+
+ Tu email ha sido modificado por:
+
+ %{new_email}
signup_after_approval:
subject_template: "¡Tu solicitud ha sido aprobada en %{site_name}!"
text_body_template: |
@@ -1870,6 +2128,9 @@ es:
size_not_found: "Lo sentimos, pero no hemos podido determinar el tamaño de la imagen. ¿Quizás el archivo está corrupto?"
avatar:
missing: "Lo sentimos, no hemos encontrado un avatar asociado a esa dirección de email. ¿Puedes intentar subirlo de nuevo?"
+ flag_reason:
+ sockpuppet: "Un nuevo usuario ha creado un tema, y otro nuevo usuario con la misma dirección IP (%{ip_address}) le ha respondido. Mira la opción \"flag_sockpuppets\" en la configuración del sitio."
+ spam_hosts: "Un nuevo usuario intentó crear varios temas con enlaces al mismo dominio (%{domain}). Mira la opción \"newuser_spam_host_threshold\" en la configuración del sitio."
email_log:
post_user_deleted: "El autor de la publicación ha sido eliminado."
no_user: "No se puede encontrar al usuario con id %{user_id}"
@@ -1888,6 +2149,7 @@ es:
message_to_blank: "message.to está en blanco"
text_part_body_blank: "text_part.body está en blanco"
body_blank: "el cuerpo está en blanco"
+ no_echo_mailing_list_mode: "Modo lista de correo desactivado para los post del usuario"
color_schemes:
base_theme_name: "Base"
about: "Acerca de"
@@ -2224,35 +2486,6 @@ es:
Si decidimos cambiar nuestra política de privacidad, publicaremos los cambios en esta misma página.
Este documento tiene una licencia "CC-BY-SA". Última actualización: 31 de mayo del 2013.
- static:
- search_help: |
-
-
-
-
-
-
-
order:views | order:latest | order:likes | @username | user:foo |
status:open | status:closed | status:archived | status:noreplies | status:single_user |
#category-slug | category:foo | group:foo | badge:foo | |
in:likes | in:posted | in:watching | in:tracking | in:private |
in:bookmarks | in:first | in:pinned | in:unpinned | in:wiki |
posts_count:num | before:days or date | after:days or date | tags:one,two |
-
-
-
-
arcoiris #parques
buscará temas que contengan la palabra "arcoiris" en la categoría "parques".arcoiris category:parques status:open order:latest
buscará temas que contengan la palabra "arcoiris" en la categoría "parques" que no estén cerrados o archivados, ordenados por la fecha del último post.arcoiris category:"parques" in:bookmarks
buscará temas que contengan la palabra "arcoiris" en la categoría "parques" que hayas guardado en marcadores.-
badges: editor: name: Editor @@ -2484,6 +2717,137 @@ es: staff_tag_disallowed: "La etiqueta \"%{tag}\" solo puede ser insertada por moderadores." staff_tag_remove_disallowed: "La etiqueta \"%{tag}\" solo puede ser eliminada por moderadores." rss_by_tag: "Temas con la etiqueta %{tag}" + finish_installation: + congratulations: "Enhorabuena, ¡has instalado Discourse!" + register: + button: "Registrarse" + title: "Registrar cuenta de administrador" + help: "registra una nueva cuenta para empezar" + no_emails: "Desgraciadamente, no se han definido emails de administrador durante la instalación, por lo que finalizar la configuración podría ser difícil." + confirm_email: + title: "Confirmar tu email" + message: "
Hemos enviado un email de activación a %{email}. Por favor, sigue las intrucciones en el email para activar tu cuenta.
Si no llega, asegúrate que el email esté configurado correctamente en Discourse y comprueba tu carpeta de spam
" + resend_email: + title: "Volver a enviar email de activación" + message: "
Hemos reenviado el correo de activación a %{email}" + safe_mode: + title: "Activar modo seguro" + description: "El modo seguro permite probar tu página sin cargar plugins o customizaciones." + no_customizations: "Desactivar todas las customizaciones" + only_official: "Desactivar plugins no oficiale" + no_plugins: "Desactivar todos los plugins" + enter: "Activar modo seguro" + wizard: + title: "Instalación de Discourse" + step: + locale: + title: "¡Bienvenido a tu foro de discourse!" + fields: + default_locale: + description: "¿Cuál es el idioma por defecto para tu comunidad?" + forum_title: + title: "Nombre" + description: "El nombre es un cartel que se vé desde lejos, la primera cosa que los visitantes en potencia verán sobre tu comunidad. ¿Qué dice el nombre de yu comunidad?" + fields: + title: + label: "El nombre de la comunidad" + site_description: + label: "Describe tu comunidad en una frase corta" + introduction: + title: "Introducción" + fields: + welcome: + label: "Tema de bienvenida" + description: "
¿Cómo le describirías tu comunidad a un desconocido en alrededor de 1 minuto?
Tu tema de bienvenida es la primera cosa que los nuevos visitantes verán. Piensa que es el
párrafo
que define tu comunidad." + one_paragraph: "El mensaje de bienvenida no debería ser más de un párrafo." + privacy: + title: "Acceso" + description: "¿Es tu comunidad abierta a todo el mundo o está restringida a ciertos miembros, ya sea por invitación o aprobación? Si lo prefieres, puedes hacer que sea privada, y hacerla pública más tarde.
Recuerda que siempre puedes enviar invitaciones desde temas, o desde tu página de perfil.
" + fields: + privacy: + choices: + open: + label: "Pública" + description: "Todo el mundo puede acceder a la comunidad y registrar una cuenta" + restricted: + label: "Privada" + description: "Solo gente invitada o con aprobación tiene acceso a esta comunidad" + contact: + title: "Contacto" + fields: + contact_email: + label: "Correo" + placeholder: "nombre@ejemplo.com" + description: "Dirección de email de la persona o grupo responsable de esta comunidad. Usado para notificaciones críticas como reportes sin atender, actualizaciones de seguridad y estará en la página Acerca de para cosas urgentes." + contact_url: + label: "Página web" + placeholder: "http://ejemplo.com/contacto" + description: "Tu página de contacto o la de tu organización. Será mostrada en la página de acerca de." + site_contact: + label: "Mensajes automáticos" + description: "Todos los mensajes privados automáticos de Discourse serán mandados desde este usuarios. Más importante, este usuario será el que envíe el mensaje de bienvenida que se manda automáticamente a todos los usuarios." + corporate: + title: "Organización" + description: "Estos nombres se usarán en tu Política de privacidad y Términos y condiciones, que podrás editar en todo momento en la categoría Staff. Si no tienes una empresa, puedes saltarte este paso por ahora." + fields: + company_short_name: + label: "Nombre de la empresa (corto)" + placeholder: "Initech" + company_full_name: + label: "Nombre de la empresa (completo)" + placeholder: "Initech S.L." + company_domain: + label: "Dominio de la empresa " + placeholder: "initech.com" + colors: + title: "Tema" + fields: + theme_id: + description: "¿Prefieres un tema oscuro o claro para empezar? Siempre lo puedes personalizar a través del panel del Administrador." + choices: + default: + label: "Simple y claro" + dark: + label: "Simple y oscuro" + logos: + title: "Logos" + fields: + logo_url: + label: "Logo principal" + description: "La imágen que estará arriba a la izquierda en tu página. Usar un rectángulo ancho." + logo_small_url: + label: "Logo compacto" + description: "Una versión compacta del logo que estará arriba a la izquierda cuando los usuarios bajen. Usar un cuadrado." + icons: + title: "Iconos" + fields: + favicon_url: + label: "Icono pequeño" + description: "Imagen usada para representar tu página en los navegadores que se vea bien en tamaños pequelos como 32px por 32px." + apple_touch_icon_url: + label: "Icono grande" + description: "Icono usado para representar tu página en dispositivos modernos y que se ve bien para tamaños grandes. El tamaño recomendado es al menos de 144px por 144px." + homepage: + description: "Recomendamos mostrar los últimos temas en tu página principal, pero siempre puedes mostrar categorías (grupos de temas) en la página principal si prefieres." + title: "Página de inicio" + fields: + homepage_style: + choices: + latest: + label: "Temas recientes" + categories: + label: "Categorías" + emoji: + title: "Emoji" + description: "¿Qué estilo de Emoji prefieres para tu comunidad? Siempre puedes añadir más Emojis personalizados a trvés de Admin, Personalizar, Emoji." + invites: + title: "Invitar staff" + description: "¡Ya casi está! Invita algunos miembros del staff para ayudar a iniciar conversaciones con temas interesantes y respuestas para dar tu comunidad por empezadas." + finished: + title: "Tu foro de Discourse está listo!" + description: | +Si alguna vez quieres cambiar alguno de estos ajustes, visita tu sección de administrador; la puedes encontrar el lado del icono de una llave inglesa en el menú de la página..
+Diviértete, y ¡buena suerte construyendo tu nueva comunidad!
activemodel: errors: <<: *errors diff --git a/config/locales/server.et.yml b/config/locales/server.et.yml index b9517f19fa5..748c2d4e1e4 100644 --- a/config/locales/server.et.yml +++ b/config/locales/server.et.yml @@ -71,7 +71,7 @@ et: has_already_been_used: "on juba kasutusel" inclusion: puudub nimekirjas invalid: pole korrektne - is_invalid: "pole korrektne; katsu olla pisut täpsem" + is_invalid: "tundub segane. kas see on terve lause?" less_than: peab olema väiksem kui %{count} less_than_or_equal_to: peab olema väiksem või võrdne kui %{count} not_a_number: ei ole number @@ -106,11 +106,13 @@ et: default_categories_already_selected: "Sa ei saa valida teises nimekirjas valitud liiki." s3_upload_bucket_is_required: "Ei saa aktiveerida S3 üleslaadimist, kui 's3_upload_bucket' ei ole määratud." bulk_invite: - file_should_be_csv: "Üles laetud fail peab olema kas csv või txt formaadis." + file_should_be_csv: "Üles laetav fail peab olema CSV vormingus." + error: "Selle faili üleslaadimisel tekkis viga. Palun proovi hiljem uuesti." backup: operation_already_running: "Praegu on üks protsess pooleli. Uut tegevust ei saa hetkel käivitada." backup_file_should_be_tar_gz: "Varukoopia peab olema .tar.gz arhiivifail." not_enough_space_on_disk: "Varukoopia üleslaadimiseks pole piisavalt kettaruumi." + invalid_filename: "Varundusfaili nimi sisaldab keelatud sümboleid. Lubatud sümbolid on a-z 0-9 . - _." not_logged_in: "Selleks peate olema sisse logitud." not_found: "Päritud URLi või ressurssi ei leitud." invalid_access: "Päritud ressursi vaatamiseks puuduvad õigused." @@ -123,6 +125,11 @@ et: embed: start_discussion: "Alusta vestlust" continue: "Jätka arutelu" + error: "Sängitamine ebaõnnestus" + referer: "Sissetulev link:" + mismatch: "Sissetulev link ei kattu ühegagi järgmistest hostidest:" + no_hosts: "Sängitamiseks pole ühtegi hosti seadistatud." + configure: "Sängitamise seadistamine" more_replies: one: "veel 1 vastus" other: "veel %{count} vastust" @@ -156,9 +163,10 @@ et: spamming_host: "Vabandust, sa ei tohi sellele domeenile viidata." user_is_suspended: "Peatatud kasutajatel pole lubatud postitada." topic_not_found: "Midagi on valesti. Kas on võimalik, et antud teema suleti või kustutati samal ajal, kui te seda vaatasite?" + not_accepting_pms: "Kahjuks ei aktsepteeri %{username} hetkel sõnumeid." just_posted_that: "on liiga sarnane sellele, mida sa hiljuti postitasid" invalid_characters: "sisaldab ebasobivaid tähemärke" - is_invalid: "pole korrektne, püüa kirjeldada täpsemalt" + is_invalid: "tundub segane. kas see on terve lause?" next_page: "järgmine leht →" prev_page: "← eelmine leht" page_num: "Leht %{num}" @@ -251,12 +259,25 @@ et: See teema on Sulle kindlasti väga tähtis – enam kui %{percent}% vastustest siin on Sinu postitatud. Kas oled kindel, et jätad ka teistele piisavalt aega ja võimalust oma arvamuse avaldamiseks? + too_many_replies: | + ### Oled selle teema vastuste limiidi saavutanud + + Vabandame, kuid uutele kasutajatele on ajutiselt seatud limiit %{newuser_max_replies_per_topic} vastust teema kohta. + + Uue vastuse lisamise asemel kaalu oma varasema vastuse muutmist või teiste teemade külastust. + reviving_old_topic: | + ### Vana teema taaselustamine? + + Viimane vastus sellele teemale on rohkem kui %{days} päeva vana. Sinu vastus tõstab selle teema nimekirja ette ning teavitab kõiki, kes selle teemaga seotud olid. + + Oled sa kindel, et soovid seda vana arutelu jätkata? activerecord: attributes: category: name: "Liigi nimetus" topic: title: 'Pealkiri' + featured_link: 'Põhiloo viide' post: raw: "Sisu" user_profile: @@ -270,12 +291,16 @@ et: too_many_users: "Saad hoiatusi saata vaid ühele kasutajale korraga." cant_send_pm: "Vabanda, sa ei saa sellele kasutajale privaatsõnumit saata." no_user_selected: "Pead valima sobiva kasutaja." + featured_link: + invalid: "on vigane. URL peab sisaldama http:// või https://." + invalid_category: "ei saa selles foorumis redigeerida." user: attributes: password: common: "on üks 10000 enim kasutatud salasõnast. Palun kasuta turvalisemat parooli." same_as_username: "on sama mis su kasutajanimi. Palun kasuta turvalisemat parooli." same_as_email: "on sama mis su meiliaadress. Palun kasuta turvalisemat parooli." + same_as_current: "ühtib sinu hetkel kehtiva parooliga." ip_address: signup_not_allowed: "Sellelt kontolt pole liitumine lubatud." color_scheme_color: @@ -285,6 +310,10 @@ et: post_reply: base: different_topic: "Postitus ja vastus peavad kuuluma samasse teemasse." + web_hook: + attributes: + payload_url: + invalid: "URL on vigane. URL peab sisaldama http:// või https://. Ning tühikud ei ole lubatud." <<: *errors user_profile: no_info_me: "-
-
order:views | order:latest | order:likes | @username | user:foo |
status:open | status:closed | status:archived | status:noreplies | status:single_user |
#category-slug | category:foo | group:foo | badge:foo | |
in:likes | in:posted | in:watching | in:tracking | in:private |
in:bookmarks | in:first | in:pinned | in:unpinned | in:wiki |
posts_count:num | before:days or date | after:days or date | tags:one,two |
-
rainbows #parks
hakee alueelta "parks" ketjuja, joissa esiintyy sana "rainbows".rainbows category:parks status:open order:latest
etsii alueelta "parks" ketjuja, joissa esiintyy sana "rainbows" ja joita ei suljettu tai arkistoitu, ja esittää ylimmäisinä ne ketjut, joihin on viimeksi kirjoitettu.rainbows category:"parks and gardens" in:bookmarks
etsii alueelta "parks and gardens" kirjanmerkkeihin lisäämiäsi ketjuja, joissa esiintyy sana "rainbows".Lähetimme vahvistusviestin osoitteeseen %{email}. Ota tili käyttöön seuraamalla viestin ohjeita.
Jos viesti ei saavu, varmista että näppäilit sähköpostin oikein Discourseen ja tarkista roskapostikansiosi.
" + resend_email: + title: "Lähetä vahvistusviesti uudelleen" + message: "Lähetimme uuden vahvistusviestin osoitteeseen %{email}" + safe_mode: + title: "Siirry vikasietotilaan" + description: "Vikasietotilassa voit testata sivustoasi ilman lisäosia ja sivuston mukautuksia." + no_customizations: "Poista käytöstä sivuston mukautukset" + only_official: "Poista käytöstä epäviralliset lisäosat" + no_plugins: "Poista käytöstä kaikki lisäosat" + enter: "Siirry vikasietotilaan" + wizard: + title: "Discoursen asennus" + step: + locale: + title: "Tervetuloa Discourseesi!" + fields: + default_locale: + description: "Mikä on yhteisösi oletuskieli?" + forum_title: + title: "Nimi" + description: "Nimi on merkiitävä asia, sillä se on ensimmäinenasia jonka potentiaalinen vierailija saa tietää yhteisöstäsi. Mitä valitsemasi nimi kertoo yhteisöstä?" + fields: + title: + label: "Yhteisösi nimi" + placeholder: "Jennin mesta" + site_description: + label: "Kuvaile yhteisöä yhdellä lyhyellä lauseella" + placeholder: "Paikka, jossa Jenni ja hänen ystävänsä voivat keskustella kivoista jutuista" + introduction: + title: "Johdanto" + fields: + welcome: + label: "Tervetuloa-ketju" + description: "Kuinka kuvailisit yhteisöä hississä ventovieraalle, jos sinulla olisi minuutti aikaa?
Tervetuloa-ketju on ensimmäinen asia, jonka palstalle saapunut näkee. Ajattele sitä yhden kappaleen mittaisena \"hissipuheena\" tai \"perimmäisenä tavoitteena\".
" + one_paragraph: "Pidä tervetuloviesti yhden kappaleen mittaisena." + privacy: + title: "Käyttöoikeudet" + description: "Onko yhteisö avoin kaikille vai onko pääsy riippuvainen jäsenyydestä, kutsusta tai hyväksynnästä? Jos haluat, voit laittaa kaiken alulle yksityisesti ja muuttaa foorumin julkiseksi myöhemmin.
Muista, että voit aina lähettää kutsuja ketjujen alalaidasta kuin myös omalta käyttäjäsivultasikin.
" + fields: + privacy: + choices: + open: + label: "Julkinen" + description: "Kenellä tahansa on pääsy yhteisöön ja mahdollisuus käyttäjätunnuksen luomiseen" + restricted: + label: "Yksityinen" + description: "Vain kutsutuilla ja hyväksytyillä on pääsy yhteisöön" + contact: + title: "Yhteystiedot" + fields: + contact_email: + label: "Sähköposti" + placeholder: "name@example.com" + description: "Sähköpostiosoite, josta tavoittaa henkilön tai ryhmän, joka vastaa palstan ylläpidosta. Siihen lähetetään kriittisiä huomautuksia käsittelemättömistä liputuksista ja turvallisuuspäivityksistä, ja se näkyy Tietoja-sivulla yhteysosoitteena kiireellisiä yhteydenottoja varten." + contact_url: + label: "Internet-sivu" + placeholder: "http://www.example.com/contact-us" + description: "Sinun tai organisaatiosi yleinen yhteydenottosivu. Näytetään Tietoja-sivulla." + site_contact: + label: "Automaattiset viestit" + description: "Tämän käyttäjän nimissä Discourse lähettää kaikki automaattiset yksityisviestit käyttäjälle. Tärkeimpänä, käyttäjä on uudelle käyttäjälle lähetettävän tervetuloviestin lähettäjä." + corporate: + title: "Organisaatio" + description: "Nämä nimet näkyvät rekisteriselosteen and käyttöehtojen yhteydessä, joita voit milloin vain muokata henkilökunta-alueella. Jos taustalla ei ole yritystä, voit hypätä tämän vaiheen yli toistaiseksi." + fields: + company_short_name: + label: "Yrityksen nimi (lyhyesti)" + placeholder: "Initech" + company_full_name: + label: "Yrityksen nimi (kokonaan)" + placeholder: "Initech, Inc." + company_domain: + label: "Yrityksen verkkotunnuksen nimi" + placeholder: "initech.com" + colors: + title: "Värimaailma" + fields: + theme_id: + description: "Haluatko tumman vai vaalean värimaailman? Voit milloin vain muokata sivustosi ulkoasua navigoimalla Ylläpito --> Mukauta" + choices: + default: + label: "Yksinkertainen vaalea" + dark: + label: "Yksinkertainen tumma" + logos: + title: "Logot" + fields: + logo_url: + label: "Ensisijainen logo" + description: "Logo, joka näkyy sivustosi vasemmassa yläkulmassa. Tee siitä suorakulmion muotoinen." + logo_small_url: + label: "Tiivis logo" + description: "Tiivis versio sivustosi logosta, joka näkyy sivustosi vasemmassa yläkulmassa, kun vierittää alaspäin. Tee siitä neliön muotoinen." + icons: + title: "Ikonit" + fields: + favicon_url: + label: "Pieni ikoni" + description: "Ikoni, joka edustaa sivustoasi selaimissa ja joka näyttää hyvältä pienessäkin koossa kuten 32 px kertaa 32 px." + apple_touch_icon_url: + label: "Suuri ikoni" + description: "Ikoni, joka edustaa sivustoasi nykyaikaisemmilla laitteilla ja joka näyttää hyvältä isommassakin koossa. Suositeltu koko on vähintään 144 px kertaa 144 px." + homepage: + description: "Suosittelemme, että kotisivusi on Tuoreimmat-näkymä, mutta voit valita Keskustelualueet-näkymän (ketjut ryhmitelty aihepiirin mukaan) kotisivuksi, jos haluat." + title: "Kotisivu" + fields: + homepage_style: + choices: + latest: + label: "Tuoreimmat ketjut" + categories: + label: "Keskustelualueet" + emoji: + title: "Emojit" + description: "Minkä emojityylin haluat yhteisöösi? Voit milloin vain lisätä mukautettuja emojeita navigoimalla Ylläpito --> Mukauta --> Emoji." + invites: + title: "Kutsu henkiökuntaa" + description: "Melkein valmista! Kutsutaan muutama henkilökuntalainen auttamaan pohjustamaan keskusteluita kiintoisilla ketjunavauksilla ja vastauksilla, jotta yhteisö pääsee alkuun." + finished: + title: "Discoursesi on valmis!" + description: | +Jos milloin tahansa haluat muuttaa asetuksia, käy ylläpito-osiossa; löydät sen jakoavainkuvakkeen vierestä sivuston valikosta.
+Onnea ja menestystä uuden yhteisön rakentamiseen!
activemodel: errors: <<: *errors diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml index e9743109224..f954b05f480 100644 --- a/config/locales/server.fr.yml +++ b/config/locales/server.fr.yml @@ -29,7 +29,7 @@ fr: loading: "Chargement" powered_by_html: 'Propulsé par Discourse, le rendu est meilleur avec le JavaScript activé' log_in: "Se connecter" - purge_reason: "Supprimé automatiquement comme compte abandonné et désactivé" + purge_reason: "Supprimé automatiquement comme compte abandonné et non activé" disable_remote_images_download_reason: "Le téléchargement des images externes a été désactivé faute de place suffisante sur le disque." anonymous: "Anonyme" emails: @@ -40,7 +40,7 @@ fr: errors: empty_email_error: "Se produit quand le courriel reçu était vide." no_message_id_error: "Se produit quand le courriel n'a pas d'entête \"Message-Id\"." - auto_generated_email_error: "Se produit quand le header 'precedence' est : list, junk, bulk ou auto-reply, ou lorsque n'importe quel autre header contient : auto-submitted, auto-replied ou auto-generated." + auto_generated_email_error: "Se produit quand l'entête « precedence » est : list, junk, bulk ou auto-reply, ou lorsque n'importe quel autre entête contient : auto-submitted, auto-replied ou auto-generated." no_body_detected_error: "Se produit quand il est impossible d'extraire le corps du message et qu'il n'y a pas de pièces-jointes." inactive_user_error: "Se produit quand l'expéditeur n'est pas actif." blocked_user_error: "Se produit quand l'expéditeur a été bloqué." @@ -71,7 +71,7 @@ fr: has_already_been_used: "a déjà été utilisée" inclusion: n'est pas inclus dans la liste invalid: est invalide - is_invalid: "n'est pas valide ; merci d'être un peu plus descriptif" + is_invalid: "ne semble pas clair, est-ce une phrase complète ?" less_than: doit être inférieure à %{count} less_than_or_equal_to: doit être inférieur ou égal à %{count} not_a_number: n'est pas un nombre @@ -106,11 +106,13 @@ fr: default_categories_already_selected: "Vous ne pouvez pas séléctionner une catégorie qui est utilisée dans une autre liste." s3_upload_bucket_is_required: "Vous ne pouvez pas activer l'upload sur S3 avant d'avoir renseigné le 's3_upload_bucket'." bulk_invite: - file_should_be_csv: "Le fichier envoyé doit être au format csv ou txt." + file_should_be_csv: "Le fichier envoyé doit être au format CSV." + error: "Il y a eu une erreur en envoyant ce fichier. Merci de réessayer plus tard." backup: operation_already_running: "Une opération est en cours d'exécution. Vous ne pouvez pas démarrer un nouveau processus pour l'instant." backup_file_should_be_tar_gz: "Le fichier de sauvegarde doit être une archive .tar.gz." not_enough_space_on_disk: "Il n'y a pas assez d'espace sur le disque pour charger cette sauvegarde." + invalid_filename: "Le nom du fichier de sauvegarde contient des caractères invalides. Sont autorisés : a-z 0-9 . - _." not_logged_in: "Vous devez être connecté pour faire cela." not_found: "L'URL ou ressource demandée n'a pas été retrouvé." invalid_access: "Vous n'avez pas la permission de voir cette ressource." @@ -123,10 +125,15 @@ fr: embed: start_discussion: "Démarrer la discussion" continue: "Continuer la discussion" + error: "Erreur d'intégration" + referer: "Référent :" + mismatch: "Le référent ne correspondait à aucun des hôtes suivants :" + no_hosts: "Aucun hôte n'a été configuré pour l'intégration." + configure: "Configurer l'intégration" more_replies: one: "1 réponse supplémentaire" other: "%{count} réponses supplémentaires" - loading: "Chargement de la discussion..." + loading: "Chargement de la discussion…" permalink: "Lien permanent" imported_from: "Il s'agit d'un sujet en provenance de l'article %{link}" in_reply_to: "▶ %{username}" @@ -156,16 +163,17 @@ fr: spamming_host: "Désolé, vous ne pouvez pas insérer de lien vers ce domaine." user_is_suspended: "Les utilisateurs suspendus ne sont pas autorisés à poster de messages." topic_not_found: "Une erreur est survenue. Peut-être que ce sujet a été fermé ou supprimé pendant que vous le regardiez ?" + not_accepting_pms: "Désolé, %{username} n'accepte pas de messages pour le moment." just_posted_that: "est trop similaire à ce que vous avez récemment posté" invalid_characters: "contient des caractères invalides" - is_invalid: "est invalide ; essayez d'être plus précis" + is_invalid: "ne semble pas clair, est-ce une phrase complète ?" next_page: "page suivante →" prev_page: "← page précédente" page_num: "Page %{num}" home_title: "Accueil" - topics_in_category: "Sujets dans la catégorie '%{category}'" - rss_posts_in_topic: "Flux RSS de '%{topic}'" - rss_topics_in_category: "Flux RSS des sujets dans la catégorie '%{category}'" + topics_in_category: "Sujets dans la catégorie « %{category} »" + rss_posts_in_topic: "Flux RSS de « %{topic} »" + rss_topics_in_category: "Flux RSS des sujets dans la catégorie « %{category} »" author_wrote: "%{author} a écrit :" num_posts: "Messages :" num_participants: "Participants :" @@ -190,11 +198,11 @@ fr: groups: errors: can_not_modify_automatic: "Vous ne pouvez pas modifier un groupe automatique" - member_already_exist: "'%{username}' est déjà membre de ce groupe." + member_already_exist: "« %{username} » est déjà membre de ce groupe." invalid_domain: "'%{domain}' n'est pas un domaine valide." - invalid_incoming_email: "'%{email}' n'est pas une adresse de courriel valide." - email_already_used_in_group: "'%{email}' est déjà utilisé par le groupe '%{group_name}'." - email_already_used_in_category: "'%{email}' est déjà utilisé par la catégorie '%{category_name}'." + invalid_incoming_email: "« %{email} » n'est pas une adresse de courriel valide." + email_already_used_in_group: "« %{email} » est déjà utilisé par le groupe « %{group_name} »." + email_already_used_in_category: "« %{email} » est déjà utilisé par la catégorie « %{category_name} »." default_names: everyone: "tous" admins: "administrateurs" @@ -269,6 +277,7 @@ fr: name: "Nom de la catégorie" topic: title: 'Titre' + featured_link: 'Lien associé' post: raw: "Corps" user_profile: @@ -282,12 +291,16 @@ fr: too_many_users: "Vous ne pouvez envoyer des avertissements qu'à un utilisateur à la fois." cant_send_pm: "Désolé, vous ne pouvez pas envoyer de message privé à cet utilisateur." no_user_selected: "Vous devez choisir un utilisateur valide." + featured_link: + invalid: "est invalide. L'URL doit inclure http:// ou https://." + invalid_category: "ne peut pas être modifié dans cette catégorie." user: attributes: password: common: "fait partie des 10000 mots de passe les plus utilisés. Veuillez utiliser un mot de passe plus sécurisé." same_as_username: "est aussi votre pseudo. Veuillez utiliser un mot de passe plus sécurisé." same_as_email: "est aussi votre adresse courriel. Veuillez utiliser un mot de passe plus sécurisé." + same_as_current: "est le même que votre mot de passe actuel." ip_address: signup_not_allowed: "L'inscription n'est pas autorisée à partir de ce compte." color_scheme_color: @@ -297,6 +310,10 @@ fr: post_reply: base: different_topic: "Message et réponse doivent appartenir au même sujet." + web_hook: + attributes: + payload_url: + invalid: "L'URL est invalide. Elle devrait inclure http:// ou https:// et aucun espace n'est autorisé." <<: *errors user_profile: no_info_me: "Votre message a été signalé par la communauté. Veuillez regarder vos messages directs.
' @@ -566,9 +608,24 @@ fr: different_user_description: "Vous êtes actuellement connecté avec un utilisateur différent de celui à qui le courriel est adressé. Veuillez vous déconnecter, ou utiliser le mode anonyme, et essayer à nouveau." not_found_description: "Désolé, nous ne pouvons pas vous désabonner. Il est possible que le lien de votre courriel soit expiré." log_out: "Déconnexion" + user_api_key: + title: "Autoriser l'accès d'application" + authorize: "Autoriser" + read: "lecture" + read_write: "lecture/écriture" + description: "« %{application_name} » demande l'accès suivant à votre compte :" + no_trust_level: "Désolé, vous n'avez pas le niveau de confiance requis pour accéder à l'API utilisateur" + generic_error: "Désolé, nous n'avons pu générer de clés pour l'API utilisateur, cette fonctionnalité peut être désactivée par l'administrateur" + scopes: + message_bus: "Mises à jour en temps réel" + notifications: "Lire et supprimer les notifications" + push: "Envoyer des notifications à des services externes" + session_info: "Lire les informations de la session utilisateur" + read: "Tout lire" + write: "Tout écrire" reports: visits: - title: "Visites utilisateur" + title: "Visites d'utilisateurs" xaxis: "Jour" yaxis: "Nombre de visites" signups: @@ -576,7 +633,7 @@ fr: xaxis: "Jour" yaxis: "Nombre de nouveaux utilisateurs" profile_views: - title: "Vues du profil utilisateur" + title: "Vues des profils d'utilisateurs" xaxis: "Jour" yaxis: "Nombre de profils utilisateurs consultés" topics: @@ -612,7 +669,7 @@ fr: xaxis: "Jour" yaxis: "Nombre de courriels" user_to_user_private_messages: - title: "Utilisateur à Utilisateur" + title: "Utilisateur à utilisateur" xaxis: "Jour" yaxis: "Nombre de messages" system_private_messages: @@ -671,9 +728,9 @@ fr: xaxis: "Jour" yaxis: "Nombre de vues par les utilisateurs non connectés sur mobile" http_background_reqs: - title: "Arrière plan" + title: "Arrière-plan" xaxis: "Jour" - yaxis: "Requêtes de mise à jour en temps réel ou de suivi" + yaxis: "Requêtes utilisées pour la mise à jour et le suivi en temps réel" http_2xx_reqs: title: "Statut 2xx (OK)" xaxis: "Jour" @@ -703,7 +760,7 @@ fr: xaxis: "Jour" yaxis: "Total" mobile_visits: - title: "Visites utilisateurs" + title: "Visites d'utilisateurs" xaxis: "Jour" yaxis: "Nombre de visites" dashboard: @@ -718,17 +775,9 @@ fr: twitter_config_warning: 'Le serveur est configuré pour permettre l''authentification par Twitter (enable_twitter_logins), mais les paramètres key et secret ne sont pas renseignés. Allez dans les Paramétres et mettez les à jour. Voir le guide pour en savoir plus.' github_config_warning: 'Le serveur est configuré pour permettre l''authentification par GitHub (enable_github_logins), mais les paramètres github_client_id et github_client_secret ne sont pas renseignés. Allez dans les Paramètres et mettez les à jour. Voir le guide pour en savoir plus.' s3_config_warning: 'Le serveur est configuré pour charger les fichiers vers s3, mais au moins un de ces paramètre n''est pas configuré : s3_access_key_id, s3_secret_access_key or s3_upload_bucket. Allez dans les Paramètres pour les renseignés. Voir le guide "Comment charger les images sur S3 ?" pour en savoir plus' - s3_backup_config_warning: 'Le serveur est configuré pour envoyer les sauvegardes sur S3, mais l''un des paramètres suivants n''est pas renseigné: s3_access_key_id, s3_secret_access_key or s3_backup_bucket. Allez dans les Paramètres et mettez les à jour. Voir "Comment mettre en place une sauvegarde sur S3?" pour en savoir plus.' + s3_backup_config_warning: 'Le serveur est configuré pour envoyer les sauvegardes sur S3, mais l''un des paramètres suivants n''est pas renseigné : s3_access_key_id, s3_secret_access_key ou s3_backup_bucket. Allez dans les Paramètres et mettez les à jour. Voir « Comment mettre en place une sauvegarde sur S3 ? » pour en savoir plus.' image_magick_warning: 'Le serveur est configuré pour créer des aperçus des grandes images, mais ImageMagick n''est pas installé. Installez ImageMagick en utilisant votre gestionnaire de paquets favori ou bien allez ici pour télécharger la dernière version.' failing_emails_warning: 'Il y a %{num_failed_jobs} tâches d''envois de courriel en erreur. Vérifiez votre fichier app.yml et assurez-vous de la conformité des paramètres du serveur de courriel. Voir aussi les processus en échec dans Sidekiq.' - default_logo_warning: "Modifier le logo de votre site. Mettez à jour les paramètres du site suivant : logo_url, logo_small_url et favicon_url." - contact_email_missing: "Saisissez l'adresse courriel de contact pour votre site web afin qu'on puisse vous contacter pour des problèmes urgents sur votre site. Mettez-le à jour dans les Paramètres du site." - contact_email_invalid: "L'adresse courriel de contact du site est invalide. Mettez-le à jour dans les paramètre du site." - title_nag: "Saisissez le nom de votre site. Modifier le titre sous Paramètres du site." - site_description_missing: "Saisissez une phrase courte décrivant votre site et qui apparaîtra dans les moteurs de recherche. Mettez site_description à jour dans les Paramètres du site." - consumer_email_warning: "Votre site est configuré pour envoyer les courriels en utilisant Gmail (ou un autre site de courriels pour utilisateur standard). Gmail limite le nombre d'emails que vous pouvez envoyer. Nous vous conseillons d'utiliser un autre service d'envoi de courriels afin d'assurer une meilleure délivrabilité." - site_contact_username_warning: "Saisissez le pseudo d'un responsable sympathique à partir duquel sera envoyé les messages importants. Mettez à jour site_contact_username dans les Paramètres du site." - notification_email_warning: "Les courriels de notification ne serot pas envoyés depuis une adresse de courriel valide sur votre domaine ; l'envoie des courriels sera aléatoire et peu fiable. Veuillez saisir une adresse de courriel locale dans notification_email dans les Paramètres du site." subfolder_ends_in_slash: "Votre configuration de sous-répertoire est erronée; DISCOURSE_RELATIVE_URL_ROOT se termine avec une barre oblique ." email_polling_errored_recently: one: "La vérification des courriels a généré une erreur au cours des 24 dernières heures. Vérifiez le journal pour plus de détails." @@ -739,19 +788,24 @@ fr: poll_pop3_auth_error: "La connexion vers le serveur POP3 échoue avec une erreur d'authentification. Veuillez vérifier les paramètres POP3." site_settings: censored_words: "Mots qui seront automatiquement remplacés par ■■■■" + censored_pattern: "Expressions régulières qui seront automatiquement remplacées par ■■■■" delete_old_hidden_posts: "Supprimer automatiquement les messages cachés plus de 30 jours." default_locale: "La langue par défaut de cette instance de Discourse (code ISO 639-1)" allow_user_locale: "Autoriser les utilisateurs à choisir la langue de l'interface dans leurs préférences" - set_locale_from_accept_language_header: "configurer la langue de l'interface pour les utilisateurs anonymes à partir des entêtes de langue de leur navigateur. (EXPÉRIMENTAL, ne fonctionne pas avec le cache anonyme)" + set_locale_from_accept_language_header: "configurer la langue de l'interface pour les visiteurs à partir des entêtes de langue de leur navigateur. (EXPÉRIMENTAL, ne fonctionne pas avec le cache anonyme)" min_post_length: "Longueur minimale autorisée des messages en nombre de caractères" min_first_post_length: "Longueur minimale d'un premier message (corps de sujet) en nombre de caractères" min_private_message_post_length: "Longueur minimale des messages en nombre de caractères" max_post_length: "Longueur maximale autorisée des messages en nombres de caractères" + topic_featured_link_enabled: "Activer la création de sujets avec lien" + show_topic_featured_link_in_digest: "Afficher les sujets avec lien dans le résumé par courriel." min_topic_title_length: "Longueur minimale autorisée des titres de sujet en nombre de caractères" max_topic_title_length: "Longueur maximale autorisée des titres de sujet en nombre de caractères" min_private_message_title_length: "Longueur minimale pour un titre de message en nombre de caractères" min_search_term_length: "Longueur minimale autorisée du texte saisie avant de lancer une recherche en nombre de caractères" search_tokenize_chinese_japanese_korean: "Forcer la tokenisation dans la recherche chinois/japonais/koréen, même sur des sites non-CJK." + search_prefer_recent_posts: "Si la recherche dans votre forum est lente, cette option tente l'indéxation des messages les plus récents en premier" + search_recent_posts_size: "Combien de messages récents à garder dans l'index" allow_uncategorized_topics: "Autorise la création de sujets sans catégorie. ATTENTION : S'il existe des sujets non-catégorisés, vous devez les catégoriser avant de désactiver cette fonction." allow_duplicate_topic_titles: "Autoriser la création de sujet avec le même titre." unique_posts_mins: "Combien de temps avant qu'un utilisateur puisse poster le même contenu à nouveau" @@ -759,14 +813,14 @@ fr: title: "Le nom du site, utilisé dans la balise title." site_description: "Décrivez ce site en une seule phrase, utilisée dans le tag meta description." contact_email: "Adresse de courriel du contact clé pour ce site. Utilisée pour des notifications critiques telles que des signalements en attente ou des faits urgents en provenance du formulaire de contact de la page À propos." - contact_url: "Adresse de contact pour ce site. Utilisée sur la formulaire de contact sur la page 'a propos' pour les notifications critiques." + contact_url: "Adresse de contact pour ce site. Utilisée sur la formulaire de contact sur la page À propos pour les notifications critiques." queue_jobs: "SEULEMENT POUR LES DÉVELOPPEURS ! ATTENTION ! Par défaut, empiler les travaux dans sidekiq. Si désactivé, votre site sera cassé." crawl_images: "Récupérer les images provenant de sources tierces pour y insérer les dimensions correctes (hauteur et largeur)." download_remote_images_to_local: "Transformer les images distantes en images locales en les téléchargeant ; cela permet d'éviter les liens morts." download_remote_images_threshold: "Quantité minimum d'espace disque requise pour télécharger localement des images distantes (en pourcentage)" download_remote_images_max_days_old: "Ne pas télécharger les images distantes pour les messages plus anciens que n jours." disabled_image_download_domains: "Les images distantes de ces domaines ne seront jamais téléchargées. Liste délimitée par des pipes (|)." - editing_grace_period: "Pendant (n) secondes après la publication d'un message, l'édition de ce dernier ne provoquera pas d'historisation." + editing_grace_period: "Pendant (n) secondes après la publication d'un message, la modification de ce dernier ne provoquera pas d'historisation." post_edit_time_limit: "L'auteur peut modifier ou supprimer ses messages pendant (n) minutes après leur publication. Mettre à 0 pour l'autoriser sans limite de temps." edit_history_visible_to_public: "Autoriser tout le monde à voir les versions précédentes d'un message modifié. Quand désactivé, seuls les responsables peuvent voir l'historique." delete_removed_posts_after: "Les messages retirés par leur auteur seront automatiquement supprimés après (n) heures. Pour une valeur renseignée à 0, les messages seront supprimés immédiatement." @@ -782,7 +836,8 @@ fr: show_pinned_excerpt_mobile: "Afficher les extraits des sujets épinglés en vue mobile." show_pinned_excerpt_desktop: "Afficher les extraits des sujets épinglés en vue bureau." post_onebox_maxlength: "Longueur maximale d'un message emboîté en nombre de caractères." - onebox_domains_whitelist: "Liste des noms de domaines autorisés pour les 'onebox'. Ces domaines doivent supporter OpenGraph or oEmbed. Testez les sur http://iframely.com/debug" + onebox_domains_blacklist: "Une liste de domaines que ne seront jamais transformés en Onebox." + max_oneboxes_per_post: "Nombre maximum de Onebox dans un message." logo_url: "L'image de votre logo situé en haut à gauche de votre site doit être de forme rectangulaire large. Si vous laissez ce champ vide, le nom de votre site apparaitra." digest_logo_url: "L'image alternative de votre logo utilisée en haut du résumé par courriel de votre site. Elle devrait idéalement être en forme de large rectangle et ne pas être une image SVG. Si vide, `logo_url` sera utilisé." logo_small_url: "Le petit logo situé en haut à gauche de votre site doit être de forme carré. Si vous laissez ce champ vide, un logo de maison apparaîtra." @@ -796,14 +851,14 @@ fr: summary_score_threshold: "Le score minimum requis pour qu'un message soit inclus dans le 'Résumé de ce sujet'" summary_posts_required: "Nombre minimum de messages dans un sujet avant que le 'Résumé du sujet' soit activé" summary_likes_required: "Nombre de J'aime minimum dans un sujet avant que le 'Résumé du sujet' soit activé" - summary_percent_filter: "Quand un utilisateur clique sur 'Résumé du sujet', montrer le top % des messages" - summary_max_results: "Nombre maximum de messages retournés par 'Résumé de ce sujet'" + summary_percent_filter: "Quand un utilisateur clique sur « Résumer ce sujet », montrer le top % des messages" + summary_max_results: "Nombre maximum de messages retournés par « Résumer ce sujet »" enable_private_messages: "Autoriser les utilisateurs de niveau de confiance 1 à créer des messages et à répondre (configurable via le niveau de confiance minimum pour envoyer des messages). Notez que les responsables peuvent toujours envoyer des messages." enable_long_polling: "Utiliser les requêtes longues pour le flux de notifications." - long_polling_base_url: "Racine de l'url utilisée pour les requêtes longues (dans le cas de l'utilisation d'un CDN pour fournir du contenu dynamique, pensez à le configurer en mode \"origin pull\") par exemple: http://origin.site.com" + long_polling_base_url: "Racine de l'URL utilisée pour les requêtes longues (dans le cas de l'utilisation d'un CDN pour fournir du contenu dynamique, pensez à le configurer en mode \"origin pull\") par exemple : http://origin.site.com" long_polling_interval: "Délai d'attente du serveur avant de répondre aux clients lorsqu'il n'y a pas de données à envoyer\n(réservé aux utilisateurs connectés)" polling_interval: "À quelle fréquence les clients connectés devraient-ils requêter le serveur, en millisecondes (sans utiliser les requêtes longues)" - anon_polling_interval: "À quelle fréquence les clients anonymes doivent-ils requêter le serveur, en millisecondes" + anon_polling_interval: "À quelle fréquence en millisecondes les clients anonymes doivent requêter le serveur" background_polling_interval: "À quelle fréquence les clients devraient-ils requêter le serveur, en millisecondes (lorsque la fenêtre est en arrière-plan)" flags_required_to_hide_post: "Les messages seront automatiquement cachés lorsque le compteur de signalements atteint cette limite (0 pour jamais) et un avertissement sera envoyé à l'utilisateur" cooldown_minutes_after_hiding_posts: "Nombre de minutes qu'un utilisateur doit attendre avant de pouvoir modifier un message masqué suite à un signalement de la communauté" @@ -820,7 +875,7 @@ fr: flag_sockpuppets: "Si un nouvel utilisateur répond à un sujet avec la même adresse IP que le nouvel utilisateur qui a commencé le sujet, alors leurs messages seront automatiquement marqués comme spam." traditional_markdown_linebreaks: "Utiliser le retour à la ligne traditionnel dans Markdown, qui nécessite deux espaces pour un saut de ligne." allow_html_tables: "Autoriser la saisie des tableaux dans le Markdown en utilisant les tags HTML : TABLE, THEAD, TD, TR, TH sont autorisés (nécessite un rebake de tous les anciens messages contenant des tableaux)" - post_undo_action_window_mins: "Nombre de minutes pendant lesquelles un utilisateur peut annuler une action sur un message (j'aime, signaler, etc.)" + post_undo_action_window_mins: "Nombre de minutes pendant lesquelles un utilisateur peut annuler une action sur un message (J'aime, signaler, etc.)" must_approve_users: "Les responsables doivent approuver les nouveaux utilisateurs afin qu'ils puissent accéder au site. ATTENTION : activer cette option sur un site en production suspendra l'accès des utilisateurs existants qui ne sont pas des responsables !" pending_users_reminder_delay: "Avertir les modérateurs si des nouveaux utilisateurs sont en attente d'approbation depuis x heures. Mettre -1 pour désactiver les notifications." maximum_session_age: "L'utilisateur restera connecté pour n heures après la dernière visite" @@ -829,12 +884,11 @@ fr: ga_universal_tracking_code: "Code de suivi Google Universal Analytics (analytics.js), par exemple : UA-12345678-9 ; voir http://google.com/analytics" ga_universal_domain_name: "Nom de domaine Google Universal Analytics (analytics.js), par exemple : monsite.com ; voir http://google.com/analytics" gtm_container_id: "ID du conteneur Google Tag Manager, par exemple : GTM-ABCDEF" - gtm_ua_domain_name: "Nom de domaine Universal Analytics via Google Tag Manager. La valeur 'auto' est recommandée." enable_escaped_fragments: "Utiliser l'API Ajax-Crawling de Google si aucun robot n'est détecté. Voir https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" enable_noscript_support: "Activer le support des moteurs de recherches standards via le tag noscript" allow_moderators_to_create_categories: "Autoriser les modérateurs à créer de nouvelles catégories" cors_origins: "Requêtes cross-origin (CORS) autorisées. Chaque origine doit inclure http:// ou https://. la variable d'environnement DISCOURSE_ENABLE_CORS doit être renseignée à true pour activer CORS." - use_admin_ip_whitelist: "Les administrateurs ne peuvent se connecter que s'ils sont à une adresse IP définie dans la liste 'IP surveillés' (Admin > Journaux > IP surveillés)." + use_admin_ip_whitelist: "Les administrateurs ne peuvent se connecter que s'ils sont à une adresse IP définie dans la liste des IP surveillées (Admin > Journaux > IP surveillés)." top_menu: "Déterminer les éléments qui apparaissent dans la navigation de la page d'accueil, et dans quel ordre. Exemple latest|new|unread|categories|top|read|posted|bookmarks" post_menu: "L'ordre des éléments dans le menu de rédaction. Exemple like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "Les éléments du menu qui seront cachés par défaut jusqu’à extension du menu." @@ -853,11 +907,10 @@ fr: show_email_on_profile: "Afficher l'adresse du courriel de l'utilisateur sur leur page utilisateur (seulement visible pour l'utilisateur et les équipes techniques)" prioritize_username_in_ux: "Afficher le pseudonyme en premier sur la page d'un utilisateur, sa carte et ses messages (si désactivé, le nom est affiché en premier)" email_token_valid_hours: "Les jetons (tokens) de Mot de passe oublié / Activation de comptes sont valides (n) jours." - email_token_grace_period_hours: "Les jetons (tokens) de Mot de passe oublié / Activation de comptes sont encore valides pour une période de grâce de (n) heures après leur expiration." enable_badges: "Activer le système de badges" - enable_whispers: "Permettre communication privée entre responsables au sein du sujet (expérimental)." - allow_index_in_robots_txt: "Spécifier dans robots.txt que le site est autorisé à être indexer par les robots des moteurs de recherche." - email_domains_blacklist: "Liste des domaines de courriel qui ne sont pas autorisé lors de la création de compte, délimités par un pipe. Exemple: mailinator.com|trashmail.net" + enable_whispers: "Autoriser les communications privées entre responsables au sein d'un sujet." + allow_index_in_robots_txt: "Préciser dans robots.txt que le site est autorisé à être indexé par les robots des moteurs de recherche." + email_domains_blacklist: "Liste des domaines de courriel qui ne sont pas autorisés lors de la création de compte, délimitée par des pipes. Exemple : mailinator.com|trashmail.net" email_domains_whitelist: "Liste des domaines de courriel avec lesquelles les utilisateurs DOIVENT s'enregistrer, délimités par un pipe. ATTENTION : les utilisateurs ayant une adresse de courriel sur un autre domaine ne pourront pas s'enregistrer." forgot_password_strict: "Ne pas mentionner l'existence d'un compte utilisateur quand un utilisateur utilise le formulaire d'oubli de mot de passe." log_out_strict: "Lors de la déconnexion, déconnecter TOUTES les sessions pour l'utilisateur sur tous les appareils" @@ -874,33 +927,36 @@ fr: reserved_usernames: "Pseudos pour lesquels l'inscription n'est pas autorisée." min_password_length: "Longueur minimale du mot de passe." min_admin_password_length: "Longueur minimale du mot de passe pour l'administrateur." - block_common_passwords: "Ne pas autoriser les mots de passe qui font parti des 10 000 les plus utilisés." - enable_sso: "Activer l'authentification unique via un site externe (ATTENTION: LES ADRESSES EMAIL *DOIVENT* ÊTRE VALIDÉES PAR LE SITE EXTERNE !)" + block_common_passwords: "Ne pas autoriser les mots de passe qui font partie des 10 000 les plus utilisés." + enable_sso: "Activer l'authentification unique via un site externe (ATTENTION : LES ADRESSES COURRIEL *DOIVENT* ÊTRE VALIDÉES PAR LE SITE EXTERNE !)" verbose_sso_logging: "Conserver les diagnostics liés au SSO dans /logs" enable_sso_provider: "Implémenter le procotole Discourse de provider SSO à /session/sso_provider, requiert sso_secret" sso_url: "URL de l'authentification unique SSO (doit inclure http:// ou http://)" sso_secret: "Chaîne de caractères secrète utilisée pour authentifier les informations SSO par cryptographie, assurez-vous qu'elle est de 10 caractères ou plus" + sso_overrides_bio: "Écrase la biographie du profil utilisateur et empêche son changement" sso_overrides_email: "Surcharger les emails locaux avec les emails externes d'un SSO à chaque connexion, et prévenir les modifications locales. (ATTENTION : Des écarts peuvent se produire dus aux règles locales sur les emails)" - sso_overrides_username: "Surcharger les pseudos locaux avec les pseudos externes d'un SSO à chaque connexion, et prévenir les modifications locales. (ATTENTION: Des écarts peuvent se produire dus aux différences de longueur et d'exigences sur les pseudos)" + sso_overrides_username: "Surcharger les pseudos locaux avec les pseudos externes d'un SSO à chaque connexion, et prévenir les modifications locales. (ATTENTION : des écarts peuvent se produire dûes aux différences de longueur et d'exigences sur les pseudos)" sso_overrides_name: "Surcharger les noms complets locaux avec les noms complets externes d'un SSO à chaque connexion, et prévenir les modifications locales." sso_overrides_avatar: "Surcharge les avatars des utilisateurs avec les avatars d'un SSO. Si activé, il est fortement recommandé de désactiver allow_uploaded_avatars." sso_not_approved_url: "Rediriger les comptes SSO non validés vers cette URL" - enable_local_logins: "Activer l'authentification traditionnelle, avec pseudo local et mot de passe. (Note: Doit être activé pour que les invitations fonctionnent)" + sso_allows_all_return_paths: "Ne pas restreindre le domaine pour les return_paths fournis par le SSO (par défaut, le chemin de retour doit être sur le site actuel)" + enable_local_logins: "Activer les comptes locaux avec pseudo et mot de passe. (Note : ceci doit être activé pour que les invitations fonctionnent)" allow_new_registrations: "Autorise l'inscription des nouveaux utilisateurs. Décocher pour prévenir la création de nouveau compte." - enable_signup_cta: "Afficher un rappel aux utilisateurs anonymes pour les encourager à créer un compte." + enable_signup_cta: "Afficher un rappel aux visiteurs pour les encourager à créer un compte." enable_yahoo_logins: "Activer l'authentification Yahoo" enable_google_oauth2_logins: "Activer l'authentification Google Oauth2. C'est la méthode d'authentification que Google supporte désormais. Nécessite une clé et une phrase secrète." - google_oauth2_client_id: "Client ID de votre application Google." - google_oauth2_client_secret: "Client secret de votre application Google." + google_oauth2_client_id: "Identifiante du client de votre application Google." + google_oauth2_client_secret: "Clé secrète du client de votre application Google." enable_twitter_logins: "Activer l'authentification Twitter, nécessite twitter_consumer_key et twitter_consumer_secret" twitter_consumer_key: "Clé utilisateur pour l'authentification Twitter, enregistrée sur http://dev.twitter.com" twitter_consumer_secret: "Secret utilisateur pour l'authentification Twitter, enregistré sur http://dev.twitter.com" enable_instagram_logins: "Activer l'authentification Instagram, nécessite instagram_consumer_key et instagram_consumer_secret" - instagram_consumer_key: "\"Consumer key\" pour l'identification Instagram" - instagram_consumer_secret: "\"Consumer secret\" pour l'identification Instagram" + instagram_consumer_key: "« Consumer key » pour l'identification Instagram" + instagram_consumer_secret: "« Consumer secret » pour l'identification Instagram" enable_facebook_logins: "Activer l'authentification Facebook, nécessite facebook_app_id et facebook_app_secret" facebook_app_id: "App id pour l'authentification Facebook, enregistré sur https://developers.facebook.com/apps" facebook_app_secret: "App secret pour l'authentification Facebook, enregistré sur https://developers.facebook.com/apps" + facebook_request_extra_profile_details: "Remplir les champs À propos de moi, Localisation et Site internet depuis Facebook (nécessite que votre application soit autorisée par Facebook)." enable_github_logins: "Activer l'authentification GitHub, nécessite github_client_id et github_client_secret" github_client_id: "Id client pour l'authentification Github, enregistré sur https://github.com/settings/applications" github_client_secret: "Secret client pour l'authentification Github, enregistré sur https://github.com/settings/applications" @@ -909,17 +965,18 @@ fr: maximum_backups: "Nombre maximum de sauvegardes à conserver sur le disque. Les anciennes sauvegardes seront automatiquement supprimées" automatic_backups_enabled: "Activer les sauvegardes automatiques tels que définis dans les fréquences de sauvegarde" backup_frequency: "Fréquence de création des sauvegardes du site, en jours." - enable_s3_backups: "Envoyer vos sauvegardes à S3 lorsqu'elles sont terminées. IMPORTANT: Vous devez avoir renseigné vos identifiants S3 dans les paramètres de fichiers." + enable_s3_backups: "Envoyer vos sauvegardes à S3 lorsqu'elles sont terminées. IMPORTANT : Vous devez avoir renseigné vos identifiants S3 dans les paramètres de fichiers." s3_backup_bucket: "Bucket distant qui contiendra les sauvegardes. ATTENTION: Vérifiez que c'est un bucket privé" s3_disable_cleanup: "Désactiver la suppression des sauvegardes de S3 lors de leur suppression locale." - backup_time_of_day: "Heure de la sauvegarde, au format UTC." - backup_with_uploads: "Inclure les téléchargements dans les archivages. Si désactivé, seul la base de données sera archivée." + backup_time_of_day: "Heure (UTC) de planification de la sauvegarde." + backup_with_uploads: "Inclure les fichiers envoyés dans les sauvegardes. Si désactivé, seule la base de données sera sauvegardée." active_user_rate_limit_secs: "A quelle fréquence mettre à jour le champ 'last_seen_at' (Dernière vu à), en secondes." verbose_localization: "Afficher des informations de debug sur l'interface à coté des textes traduits." - previous_visit_timeout_hours: "Combien de temps pour qu'une visite soit considérer comme la visite 'précédente', en heures." + previous_visit_timeout_hours: "Combien d'heures pour qu'une visite soit considérée comme la visite « précédente »." top_topics_formula_log_views_multiplier: "formule pour la valeur de multiplicateur de vues de journal (n) dans les sujets tendance : `log(views_count) * (n) + op_likes_count * 0.5 + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" top_topics_formula_first_post_likes_multiplier: "formule pour la valeur de multiplicateur de premiers J'aime (n) dans les sujets tendance: `log(views_count) * 2 + op_likes_count * (n) + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" top_topics_formula_least_likes_per_post_multiplier: "formule pour la valeur de multiplicateur de moins de J'aime par message (n) dans les sujets tendance: `log(views_count) * 2 + op_likes_count * 0.5 + LEAST(likes_count / posts_count, (n)) + 10 + log(posts_count)`" + rebake_old_posts_count: "Nombre d'anciens messages à être régénéré toutes les 15 minutes." rate_limit_create_topic: "Après la création d'un sujet, les utilisateurs doivent attendre (n) secondes avant de pouvoir en créer un nouveau." rate_limit_create_post: "Après avoir posté un message, les utilisateurs doivent attendre (n) secondes avant de pouvoir en poster un nouveau." rate_limit_new_user_create_topic: "Après la création d'un sujet, les nouveaux utilisateurs doivent attendre (n) secondes avant de pouvoir en créer un nouveau." @@ -932,8 +989,9 @@ fr: max_private_messages_per_day: "Nombre maximum de messages que les utilisateurs peuvent créer chaque jour." max_invites_per_day: "Nombre maximum d'invitations qu'un utilisateur peut envoyer par jour." max_topic_invitations_per_day: "Nombre maximum d'invitations à un sujet qu'un utilisateur peut envoyer par jour." - alert_admins_if_errors_per_minute: "Nombre d'erreurs par minute nécessaires pour déclencher une alerte administrateur. Une valeur de 0 désactive cette fonctionnalité. NB : nécessite un redémarrage." - alert_admins_if_errors_per_hour: "Nombre d'erreurs par heure nécessaires pour déclencher une alerte administrateur. Une valeur de 0 désactive cette fonctionnalité. NB : Nécessite un redémarrage." + alert_admins_if_errors_per_minute: "Nombre d'erreurs par minute nécessaires pour déclencher une alerte administrateur. Une valeur de 0 désactive cette fonctionnalité. N. B. : nécessite un redémarrage." + alert_admins_if_errors_per_hour: "Nombre d'erreurs par heure nécessaires pour déclencher une alerte administrateur. Une valeur de 0 désactive cette fonctionnalité. N. B. : nécessite un redémarrage." + categories_topics: "Nombre de sujets à afficher dans la page /categories." suggested_topics: "Nombre de sujets suggérés affichés en bas d'un sujet." limit_suggested_to_category: "Afficher uniquement les sujets de la catégorie courante dans les sujets similaires." suggested_topics_max_days_old: "Les sujets suggérés ne devraient pas être plus anciens que n jours." @@ -952,21 +1010,23 @@ fr: external_system_avatars_enabled: "Utilisez un service d'avatars externe." external_system_avatars_url: "URL du service d'avatars externe. Les remplacements autorisés sont {username} {first_letter} {color} {size}" default_opengraph_image_url: "URL de l'image par défaut pour les balises Open Graph." + twitter_summary_large_image_url: "URL de l'image par défaut de la carte de résumé Twitter (devrait au moins mesurer 280px en largeur et 150px en hauteur). " allow_all_attachments_for_group_messages: "Autorise toutes les pièces-jointes pour les messages de groupes." convert_pasted_images_to_hq_jpg: "Convertir les images copiées en fichier JPEG haute qualité." + convert_pasted_images_quality: "Qualité du fichier JPEG converti (1 est la plus faible, 100 est la meilleure)." enable_flash_video_onebox: "Activer l'utilisation de swf et flv (Adobe Flash) dans les boites imbriquées. ATTENTION : cela pourrait introduire un risque de sécurité." default_invitee_trust_level: "Niveau de confiance par défaut (0-4) pour les invités." default_trust_level: "Niveau de confiance par défaut (entre 0 et 4) pour tous les nouveaux utilisateurs. ATTENTION ! Changer ce paramètre peut vous exposer à des spams." - tl1_requires_topics_entered: "A combien de sujet un nouvel utilisateur doit avoir participé pour être promu au niveau de confiance 1." - tl1_requires_read_posts: "Combien de message un nouvel utilisateur doit avoir lu pour être promu au niveau de confiance 1." + tl1_requires_topics_entered: "À combien de sujets un nouvel utilisateur doit avoir participé pour être promu au niveau de confiance 1." + tl1_requires_read_posts: "Combien de messages un nouvel utilisateur doit avoir lu pour être promu au niveau de confiance 1." tl1_requires_time_spent_mins: "Combien de minutes un nouvel utilisateur doit avoir passées à lire des messages pour être promu au niveau de confiance 1." - tl2_requires_topics_entered: "A combien de sujet un utilisateur doit avoir participé pour être promu au niveau de confiance 2." + tl2_requires_topics_entered: "À combien de sujets un utilisateur doit avoir participé pour être promu au niveau de confiance 2." tl2_requires_read_posts: "Combien de message un utilisateur doit avoir lu pour être promu au niveau de confiance 2." tl2_requires_time_spent_mins: "Combien de minutes un utilisateur doit avoir passées à lire des messages pour être promu au niveau de confiance 2." tl2_requires_days_visited: "Combien de jours un utilisateur doit visiter le site pour être promu au niveau de confiance 2." tl2_requires_likes_received: "Combien de J'aime un utilisateur doit recevoir pour être promu au niveau de confiance 2." tl2_requires_likes_given: "Combien de J'aime un utilisateur doit donner pour être promu au niveau de confiance 2." - tl2_requires_topic_reply_count: "A combien de sujet un utilisateur doit avoir participé pour être promu au niveau de confiance 2." + tl2_requires_topic_reply_count: "À combien de sujets un utilisateur doit avoir participé pour être promu au niveau de confiance 2." tl3_time_period: "Période de temps requise pour accéder au niveau de confiance 3 (en jours)" tl3_requires_days_visited: "Nombre minimum de jours qu'un utilisateur doit avoir passé sur le site dans les (tl3 time period) derniers jours pour être éligible au niveau de confiance 3. Fixer à plus que la période pour désactiver les promotions. (0 ou plus)" tl3_requires_topics_replied_to: "Nombre minimum de sujets auquel un utilisateur doit avoir répondu dans les (tl3 time period) derniers jours pour être éligible au niveau de confiance 3. (0 ou plus)" @@ -983,6 +1043,7 @@ fr: tl3_links_no_follow: "Ne pas retirer rel=nofollow sur les liens des messages par les utilisateurs de niveau de confiance 3." min_trust_to_create_topic: "Le niveau de confiance minimum pour créer un nouveau sujet." min_trust_to_edit_wiki_post: "Le niveau de confiance minimum requis pour modifier les messages de type wiki." + min_trust_to_edit_post: "Le niveau de confiance minimum requis pour modifier des messages." min_trust_to_allow_self_wiki: "Le niveau de confiance minimum requis pour transformer ses propres messages en type wiki." min_trust_to_send_messages: "Le niveau de confiance minimum pour être autorisé à créer des nouveaux messages privés." newuser_max_links: "Combien de liens un nouvel utilisateur peut-il ajouter à un message." @@ -996,7 +1057,7 @@ fr: email_time_window_mins: "Attendre (n) minutes avant l'envoi des courriels de notification, afin de laisser une chance aux utilisateurs de modifier ou finaliser leurs messages." private_email_time_window_seconds: "Attendre (n) secondes avant d'envoyer des courriels de notification privés, afin de donner aux utilisateurs la chance d'éditer et de finaliser leurs messages." email_posts_context: "Combien de réponses précédentes doit-on inclure dans les courriels de notifications pour situer le contexte." - flush_timings_secs: "A quelle fréquence les données de timing doivent être vider, en secondes." + flush_timings_secs: "À quelle fréquence les données de timing doivent être vider, en secondes." title_max_word_length: "Le nombre maximum de caractères dans le titre d'un sujet." title_min_entropy: "L'entropie minimale (caractères unique, les caractères en langues étrangères compte pour plus) requise pour le titre d'un sujet." body_min_entropy: "L'entropie minimale (caractères unique, les caractères en langues étrangères compte pour plus) requise pour le corps d'un message." @@ -1004,11 +1065,12 @@ fr: title_fancy_entities: "Convertir les caractères ASCII commun en jolies entitées HTML dans les titres des sujets, comme SmartyPants http://daringfireball.net/projects/smartypants/" min_title_similar_length: "La taille minimale d'un titre avant que l'on vérifie l'existence de sujets identiques." min_body_similar_length: "La taille minimale d'un message avant que l'on vérifie l'existence de sujets identiques." + desktop_category_page_style: "Style visuel de la page /categories." category_colors: "Une liste de couleurs en hexadécimale autorisées pour les catégories." category_style: "Style visuel pour les badges de catégorie." max_image_size_kb: "La taille maximale des images en Ko. Doit être configuré dans nginx (client_max_body_size) / apache ou proxy aussi." max_attachment_size_kb: "La taille maximale des fichiers envoyés en Ko. Doit être configurer dans nginx (client_max_body_size) / apache ou proxy aussi." - authorized_extensions: "Une liste d'extensions de fichier autorisés pour les envois sur le serveur (mettre '*' pour autoriser tout les types)" + authorized_extensions: "Une liste d'extensions de fichier autorisées pour les envois sur le serveur (mettre '*' pour autoriser tous les types)" max_similar_results: "Combien de sujets similaires sont afficher lorsqu'un utilisateur est en train de créer un nouveau sujet. La comparaison se base sur le titre et le contenu." title_prettify: "Corrige les coquilles les plus communes dans les titres (intégralité du titre en majuscule, première lettre en minuscule, de multiples ! et ?, un . inutile à la fin, etc.)" topic_views_heat_low: "Après ce nombre de vues, le champ Vues sera légèrement mis en évidence." @@ -1020,14 +1082,14 @@ fr: history_hours_low: "Un message modifié durant ce nombre d'heures aura l'indicateur de modification légèrement mis en évidence" history_hours_medium: "Un message modifié durant ce nombre d'heures aura l'indicateur de modification modérément mis en évidence." history_hours_high: "Un message modifié durant ce nombre d'heures aura l'indicateur de modification fortement mis en évidence." - topic_post_like_heat_low: "Après le dépassement de ce ratio j'aime:message, le champ Messages de la liste des sujets sera légèrement mis en évidence." - topic_post_like_heat_medium: "Après le dépassement de ce ratio j'aime:message, le champ Messages de la liste des sujets sera modérément mis en évidence." - topic_post_like_heat_high: "Après le dépassement de ce ratio j'aime:message, le champ Messages de la liste des sujets sera fortement mis en évidence." + topic_post_like_heat_low: "Après le dépassement de ce ratio J'aime/message, le compteur de messages est légèrement mis en évidence." + topic_post_like_heat_medium: "Après le dépassement de ce ratio J'aime/message, le compteur de messages est modérément mis en évidence." + topic_post_like_heat_high: "Après le dépassement de ce ratio J'aime/message, le compteur de messages est fortement mis en évidence." faq_url: "Si vous disposez déjà d'une FAQ/Règles de la communauté, hébergée ailleurs, que vous souhaitez utiliser, vous pouvez renseigner l'URL complète ici." - tos_url: "Si vous disposez déjà de CGU, hébergées ailleurs, que vous souhaitez utiliser, vous pouvez renseigner leur URL complète ici." - privacy_policy_url: "Si vous disposez déjà d'une Politique de Confidentialité, hébergée ailleurs, que vous voulez utiliser, vous pouvez renseigner son URL complète ici." + tos_url: "Si vous disposez déjà de conditions générales d'utilisation hébergées ailleurs que vous souhaitez utiliser, vous pouvez renseigner leur URL complète ici." + privacy_policy_url: "Si vous disposez déjà d'une politique de confidentialité hébergée ailleurs que vous voulez utiliser, vous pouvez renseigner son URL complète ici." newuser_spam_host_threshold: "Combien de fois un nouvel utilisateur peut publier un lien vers le même hôte dans la limite de leur `newuser_spam_host_threshold` messages avant d'être considérés comme du spam." - white_listed_spam_host_domains: "Une liste des domaines exclus des hôtes testés comme spam. Les nouveaux utilisateurs ne seront jamais restreint dans la création de message contenant des liens vers ses domaines. " + white_listed_spam_host_domains: "Une liste des domaines exclus des hôtes testés comme spam. Les nouveaux utilisateurs ne seront jamais empêchés de créer des messages contenant des liens vers ces domaines. " staff_like_weight: "Quel poids supplémentaire donner aux J'aime de l'équipe." topic_view_duration_hours: "Compte la vue d'un sujet une seule fois par IP ou par utilisateur toutes les N heures" user_profile_view_duration_hours: "Compte la vue d'un profil d'utilisateur une seule fois par IP ou par utilisateur qui visite toutes les N heures" @@ -1038,14 +1100,14 @@ fr: max_age_unmatched_ips: "Effacer les adresses IP sous surveillenace sans correspondance après (N) jours" num_flaggers_to_close_topic: "Nombre minimum de signalements uniques requis pour automatiquement suspendre un sujet pour intervention" num_flags_to_close_topic: "Nombre minimum de signalements uniques requis pour automatiquement suspendre un sujet pour intervention" - auto_respond_to_flag_actions: "Activer réponse automatique lors du traitement d'un signalement." + auto_respond_to_flag_actions: "Activer la réponse automatique lors du traitement d'un signalement." min_first_post_typing_time: "Minimum de temps en millisecondes qu'un utilisateur doit passer à la saisie de son premier commentaire, si le seuil n'est pas atteint, il rejoindra automatiquement la file des commentaires en cours d'approbation. Mettre à 0 pour désactiver (non recommandé)" auto_block_fast_typers_on_first_post: "Bloque automatiquement les utilisateurs qui n'ont pas respecté min_first_post_typing_time" auto_block_fast_typers_max_trust_level: "Niveau de confiance maximum pour bloquer automatiquement les 'dactylo rapides'" auto_block_first_post_regex: "Regex non sensible à la casse qui, si elle est déclenchée, bloquera le premier message de l'utilisateur et l'enverra dans la file d'attente d'approbation.\nExemple: rageux|a[bc]a bloquera les premiers messages contenant rageux ou aba ou aca." reply_by_email_enabled: "Activer les réponses aux sujets via courriel." reply_by_email_address: "Modèle pour la réponse par courriel entrant; exemple : %{reply_key}@reply.example.com ou replies+%{reply_key}@example.com" - alternative_reply_by_email_addresses: "Liste des templates alternatifs pour les adresses des courriels entrants de la réponse par courriel." + alternative_reply_by_email_addresses: "Liste des templates alternatifs pour les adresses des courriels entrants de la réponse par courriel. Exemple : %{reply_key}@reply.example.com|replies+%{reply_key}@example.com" incoming_email_prefer_html: "Utiliser le HTML au lieu du texte pour les courriels entrants. Peut causer des problèmes de formatage inattendus !" disable_emails: "Désactiver l'envoi de les courriels depuis Discourse." strip_images_from_short_emails: "Retirer les images des courriels dont la taille est inférieur à 2800 Octets" @@ -1057,18 +1119,23 @@ fr: max_emails_per_day_per_user: "Nombre maximum de courriels à envoyer aux utilisateurs par jour. 0 pour désactiver la limite" enable_staged_users: "Créer automatiquement les utilisateurs en attente lors du traitement des courriels entrants." maximum_staged_users_per_email: "Nombre maximum d'utilisateurs créés lors du traitement d'un courriel entrant." - auto_generated_whitelist: "Liste des adresses courriel qui ne seront pas vérifiées pour du contenu généré automatiquement." + auto_generated_whitelist: "Liste des adresses courriel qui ne seront pas vérifiées pour du contenu généré automatiquement. Exemple : foo@bar.com|discourse@bar.com" block_auto_generated_emails: "Bloquer les courriels entrants identifiés comme générés automatiquement." ignore_by_title: "Ignorer les courriels entrants selon leur titre." mailgun_api_key: "Clé API secrète de Mailgun utilisée pour vérifier les messages du webhook." - soft_bounce_score: "Score ajouté à l'utilisateur lorsqu'un rejet temporaire se produit." - hard_bounce_score: "Score ajouté à l'utilisateur lorsqu'un rejet permanent se produit." - bounce_score_threshold: "Score maximum à partir duquel nous allons arrêter d'envoyer des courriel à un utilisateur." - bounce_score_threshold_deactivate: "Score maximum à partir duquel nous allons désactiver un utilisateur." + soft_bounce_score: "Score de rejet ajouté à l'utilisateur lorsqu'un rejet temporaire se produit." + hard_bounce_score: "Score de rejet ajouté à l'utilisateur lorsqu'un rejet permanent se produit." + bounce_score_threshold: "Score de rejet maximum à partir duquel nous allons arrêter d'envoyer des courriels à un utilisateur." + bounce_score_threshold_deactivate: "Score de rejet maximum à partir duquel nous allons désactiver un utilisateur." reset_bounce_score_after_days: "Rétablir automatiquement le score de rejet après X jours." + attachment_content_type_blacklist: "Liste des mots-clés utilisés pour filtrer les pièces jointes en fonction du type de contenu." + attachment_filename_blacklist: "Liste des mots-clés utilisés pour filtrer les pièces jointes en fonction du nom de fichier." + enable_forwarded_emails: "[BÊTA] Autoriser les utilisateurs de créer des sujets en transferant un courriel." + always_show_trimmed_content: "Toujours montrer la partie réduite des courriels entrants. ATTENTION : cela peut révéler les adresses courriels." manual_polling_enabled: "Envoyer les courriels en utilisant l'API des réponses par courriel." pop3_polling_enabled: "Utiliser POP3 pour les réponses via courriel." pop3_polling_ssl: "Utiliser SSL pour les connections au serveur POP3. (Recommandé)" + pop3_polling_openssl_verify: "Vérifier le certificat TLS du serveur (activé par défaut)" pop3_polling_period_mins: "La période en minute entre chaque vérification du compte POP3 des courriels.\nNote: nécessite un redémarrage de la machine." pop3_polling_port: "Le port pour le pooling des courriels via POP3." pop3_polling_host: "L'hôte pour le pooling des courriels via POP3." @@ -1091,20 +1158,27 @@ fr: allow_animated_thumbnails: "Créer des aperçus animés pour les gifs animés." default_avatars: "URLs des avatars qui seront utilisés par défaut pour les nouveaux utilisateurs jusqu'à ce qu'ils les modifient." automatically_download_gravatars: "Télécharger les gravatars pour les utilisateurs lors de la création de compte ou de la modification de courriel." - digest_topics: "Le nombre maximum de sujets à afficher dans le résumé par courriel." + digest_topics: "Le nombre maximum de sujets populaires à afficher dans le résumé par courriel." + digest_posts: "Le nombre maximum de messages populaires à afficher dans le résumé par courriel." + digest_other_topics: "Le nombre maximum de sujets à afficher dans la section « Nouveautés dans les sujets et catégories que vous suivez » du résumé par courriel." digest_min_excerpt_length: "Longueur minimale (en caractères) de l'extrait des messages dans le résumé par courriel." delete_digest_email_after_days: "Ne pas envoyer de résumés par courriel aux utilisateurs qui n'ont pas visité le site depuis plus de (n) jours." digest_suppress_categories: "Ne pas inclure ces catégories dans les résumés par courriel." disable_digest_emails: "Désactiver les résumés par courriel pour tous les utilisateurs." + email_accent_bg_color: "La couleur d'accentuation utilisée comme arrière-plan de certains éléments des courriels HTML. Entrez un nom de couleur (« red ») ou une valeur hexadécimale (« #FF0000 »)." + email_accent_fg_color: "La couleur des textes rendus sur la couleur d'arrière-plan des courriels HTML. Entrez un nom de couleur (« white ») ou une valeur hexadécimale (« #FFFFFF »)." + email_link_color: "La couleur des liens dans les courriels HTML. Entrez un nom de couleur (« blue ») ou une valeur hexadécimale (« #0000FF »)." detect_custom_avatars: "Vérifier ou non si les utilisateurs ont envoyé une photo de profil personnalisée." max_daily_gravatar_crawls: "Nombre maximum de fois que Discourse vérifiera Gravatar pour des avatars personnalisés en une journée." public_user_custom_fields: "Une liste blanche des champs personnalisés pour un utilisateur qui peuvent être affichés publiquement." staff_user_custom_fields: "Une liste blanche des champs personnalisés pour un utilisateur qui peuvent être vus par l'équipe." enable_user_directory: "Fournir un répertoire des utilisateurs" + enable_group_directory: "Proposer un répertoire pour parcourir les groupes" allow_anonymous_posting: "Permettre aux utilisateurs de passer en mode anonyme" anonymous_posting_min_trust_level: "Le niveau de confiance minimum pour passer en mode anonyme." anonymous_account_duration_minutes: "Pour protéger l'anonymat, créer un nouveau compte anonyme tous les N minutes pour chaque utilisateur. Exemple: si 600 est choisi, dès 600 minutes après le dernier message ET que l'utilisateur passe en mode anonyme, un nouveau compte anonyme lui sera crée." - hide_user_profiles_from_public: "Désactive les cartes utilisateurs, les profils utilisateurs et les répertoires utilisateurs pour les utilisateurs anonymes." + hide_user_profiles_from_public: "Cacher les cartes, les profils et le répertoire d'utilisateurs aux visiteurs." + user_website_domains_whitelist: "Les sites Web des utilisateurs vont être vérifiés contre ces domaines. Liste délimitée par des pipes (|)." allow_profile_backgrounds: "Autoriser les utilisateurs à envoyer des arrières-plans de profil." sequential_replies_threshold: "Nombre de messages successifs qu'un utilisateur peut poster dans un sujet avant d'être averti d'avoir posté un nombre excessif de réponses qui se suivent." enable_mobile_theme: "Les appareils mobiles utilisent un thème adapté aux mobiles, avec la possibilité de passer à la totalité du site. Désactivez cette option si vous voulez utiliser une feuille de style personnalisée qui répond à tous les types de client." @@ -1117,6 +1191,8 @@ fr: automatically_unpin_topics: "Désépingler automatiquement le sujet lorsque l'utilisateur atteint la fin." read_time_word_count: "Nombre de mots par minute servant de base de calcul à l'estimation du temps de lecture." topic_page_title_includes_category: "Le titre de la page du sujet inclut le nom de la catégorie." + native_app_install_banner: "Propose aux visiteurs réguliers d'installer l'application Discourse native." + max_prints_per_hour_per_user: "Nombre maximum d'accès à la page /print (mettre à 0 pour désactiver)" full_name_required: "Le nom complet est requis dans le profil utilisateur." enable_names: "Autoriser l'affichage des noms complets des utilisateurs dans leur profil, sur leur carte d'utilisateur et dans les courriels. Décocher pour cacher les noms complets partout." display_name_on_posts: "Afficher le nom complet de l'utilisateur dans ses messages en plus de son @pseudo." @@ -1131,24 +1207,26 @@ fr: feed_polling_url: "EMBARQUER UNIQUEMENT: Url du flux RSS/ATOM à embarqué." embed_by_username: "Pseudo de l'utilisateur Discourse qui crée les sujets embarqués." embed_username_key_from_feed: "Clé pour extraire le pseudo du flux." + embed_title_scrubber: "Expression régulière pour nettoyer les titres intégrables." embed_truncate: "Tronquer les messages embarqués." + allowed_href_schemes: "Préfixes autorisés dans les liens en plus de http et https." embed_post_limit: "Nombre maximum de messages à embarquer." embed_username_required: "Un pseudo d'utilisateur pour la création du sujet est nécessaire." embed_whitelist_selector: "Sélecteur CSS pour les éléments qui seront autorisés dans les contenus embarqués." embed_blacklist_selector: "Sélecteur CSS pour les éléments qui seront interdits dans les contenus embarqués." - notify_about_flags_after: "Si il y a des signalements qui n'ont pas été traités après ce nombre d'heure, envoyer un courriel à contact_email. Désactiver la fonctionnalité en indiquant: 0." - enable_cdn_js_debugging: "Autoriser /logs à afficher correctement les erreurs en ajoutant des permissions de crossorigin sur toutes les inclusions de js." + notify_about_flags_after: "Si il y a des signalements qui n'ont pas été traités après ce nombre d'heure, envoyer un courriel à contact_email. Désactiver la fonctionnalité en indiquan 0." show_create_topics_notice: "Si le site contient moins de 5 sujets publics, afficher un message pour demander aux administrateurs de créer d'autres sujets." delete_drafts_older_than_n_days: Supprimer les brouillons plus vieux que (n) jours. bootstrap_mode_min_users: "Nombre minimum d'utilisateurs nécessaire pour désactiver le mode de démarrage (mettre à 0 pour désactiver)" vacuum_db_days: "Exécuter VACUUM ANALYZE pour récupérer de l'espace dans la base de données après une migration (mettre à 0 pour désactiver)" - prevent_anons_from_downloading_files: "Refuser le téléchargement de pièces jointes aux utilisateurs anonymes. ATTENTION: cela empêchera de fonctionner les ressources envoyées en pièce jointe qui ne sont pas des images." + prevent_anons_from_downloading_files: "Refuser le téléchargement de pièces jointes aux visiteurs. ATTENTION : cela empêchera de fonctionner les ressources envoyées en pièce jointe qui ne sont pas des images." slug_generation_method: "Choisissez une méthode de génération d'identifiant. \"encodé\" générera des chaines de caractères encodées avec des pourcentages. \"aucune\" désactivera complètement les identifiants." enable_emoji: "Activer les emojis" emoji_set: "Comment aimeriez-vous vos emoji ?" - enforce_square_emoji: "Forcer tous les emojiis à être carrés." + enforce_square_emoji: "Forcer tous les Emojis à être carrés." approve_post_count: "Le nombre de messages d'un utilisateur nouveau ou basique devant être approuvés" approve_unless_trust_level: "Les messages des utilisateurs qui n'ont pas atteint ce niveau de confiance doivent être approuvés" + approve_new_topics_unless_trust_level: "Les nouveaux sujets des utilisateurs en dessous de ce niveau de confiance doivent être approuvés" notify_about_queued_posts_after: "Si des messages sont en attente de modération depuis ce nombre d'heures, un courriel sera envoyé à l'email de contact. Mettre 0 pour désactiver ces courriels." auto_close_messages_post_count: "Nombre maximum de messages dans un message privé avant qu'il ne soit automatiquement fermé (0 pour désactiver)" auto_close_topics_post_count: "Nombre maximum de messages dans un sujet avant qu'il ne soit automatiquement fermé (0 pour désactiver)" @@ -1165,15 +1243,25 @@ fr: default_email_in_reply_to: "Inclure par défaut l'extrait du message auquel se fait la réponse dans les courriels." default_other_new_topic_duration_minutes: "Paramètre global de temps pendant lequel un sujet est considéré comme nouveau." default_other_auto_track_topics_after_msecs: "Paramètre global fixant le temps par défaut au bout duquel un sujet est suivi automatiquement." + default_other_notification_level_when_replying: "Niveau de notification global par défaut quand un utilisateur répond à un sujet." default_other_external_links_in_new_tab: "Par défaut, ouvrir tous les liens externes dans un nouvel onglet" default_other_enable_quoting: "Par défaut, proposer la citation du texte surligné." default_other_dynamic_favicon: "Par défaut, faire apparaître le nombre de sujets récemment créés ou mis à jour sur l'icône navigateur." default_other_disable_jump_reply: "Par défaut, ne pas se déplacer au nouveau message après avoir répondu." - default_other_like_notification_frequency: "Notifier lors d'un J'aime par défaut" + default_other_like_notification_frequency: "Par défaut, notifier les utilisateurs d'un J'aime" default_topics_automatic_unpin: "Par défaut, désépingler automatiquement le sujet lorsque l'utilisateur atteint la fin." default_categories_watching: "Liste de catégories surveillées par défaut." default_categories_tracking: "Liste de catégories suivies par défaut." default_categories_muted: "Liste de catégories silencées par défaut." + default_categories_watching_first_post: "Liste des catégories dont le premier message de chaque nouveau sujet sera surveillé par défaut." + max_user_api_reqs_per_day: "Nombre maximum de requêtes de l'API utilisateur par clé et par jour" + max_user_api_reqs_per_minute: "Nombre maximum de requêtes de l'API utilisateur par clé et par minute" + allow_user_api_keys: "Autoriser la génération des clés de l'API utilisateur" + allow_user_api_key_scopes: "Liste des champs d'action autorisés pour les clés de l'API utilisateur" + max_api_keys_per_user: "Nombre maximum de clés de l'API utilisateur par utilisateur" + min_trust_level_for_user_api_key: "Niveau de confiance requis pour générer des clés pour l'API utilisateur" + allowed_user_api_auth_redirects: "URL autorisées pour la redirection d'authentification pour les clés de l'API utilisateur" + allowed_user_api_push_urls: "URL autorisées pour le service push du serveur vers l'API utilisateur" tagging_enabled: "Activer les tags sur les sujets ?" min_trust_to_create_tag: "Le niveau de confiance minimum requis pour créer un tag." max_tags_per_topic: "Le nombre maximum de tags pouvant être ajoutés à un sujet." @@ -1185,8 +1273,11 @@ fr: tag_style: "Style visuel pour tag badges." staff_tags: "Une liste de tags qui ne peuvent être appliqués que par des responsables." min_trust_level_to_tag_topics: "Niveau de confiance minimum requis pour taguer des sujets" - suppress_overlapping_tags_in_list: "Cacher les tags de la liste s'ils recouvrent le titre" + suppress_overlapping_tags_in_list: "Si des tags correspondent exactement à des mots du titre d'un sujet, ne pas afficher ces tags" remove_muted_tags_from_latest: "Ne pas afficher les sujets avec des tags silencieux dans la liste des sujets récents." + company_short_name: "Nom de société (court)" + company_full_name: "Nom de société (complet)" + company_domain: "Domaine de la société" errors: invalid_email: "Adresse de courriel invalide." invalid_username: "Il n'y a pas d'utilisateur ayant ce pseudo." @@ -1200,15 +1291,16 @@ fr: invalid_string_min_max: "Doit être compris(e) entre %{min} et %{max} caractères." invalid_string_min: "Doit être d'au moins %{count} caractères." invalid_string_max: "Ne doit pas être supérieur à %{max} caractères." - invalid_reply_by_email_address: "La valeur doit contenir '%{reply_key}' et être différente de la notification email." - invalid_alternative_reply_by_email_addresses: "Toutes les valeurs doivent contenir '%{reply_key}' et être différentes de l'adresse courriel de notification." - pop3_polling_host_is_empty: "Vous devez indiquer le \"nom d'un serveur pop3\" avant d'activer le relevé via POP3." - pop3_polling_username_is_empty: "Vous devez indiquer le \"login utilisateur pop3\" avant d'activer le relevé via POP3." - pop3_polling_password_is_empty: "Vous devez indiquer le \"mot de passe pop3\" avant d'activer le relevé via POP3." + invalid_reply_by_email_address: "La valeur doit contenir « %{reply_key} » et être différente du courriel de notification." + invalid_alternative_reply_by_email_addresses: "Toutes les valeurs doivent contenir « %{reply_key} » et être différentes du courriel de notification." + pop3_polling_host_is_empty: "Vous devez définir « pop3 polling host » avant d'activer le relevé via POP3." + pop3_polling_username_is_empty: "Vous devez définir « pop3 polling username » avant d'activer le relevé via POP3." + pop3_polling_password_is_empty: "Vous devez définir « pop3 polling password » avant d'activer le relevé via POP3." pop3_polling_authentication_failed: "Echec d'authentication POP3. Veuillez contrôler vos détails POP3." reply_by_email_address_is_empty: "Vous devez renseigner une 'adresse de réponse par courriel' avant d'activer la réponse par courriel." email_polling_disabled: "Vous devez activer le relevé manuel ou via POP3 avant d'activer les réponses par courriel." user_locale_not_enabled: "Vous devez d'abord activer 'allow user locale' avant d'activer ce paramètre." + invalid_regex: "L'expression régulière est invalide ou non autorisée." search: within_post: "#%{post_number} par %{username}" types: @@ -1225,8 +1317,8 @@ fr: most_recent_poster: "Auteur le plus récent" frequent_poster: "Auteur fréquent" redirected_to_top_reasons: - new_user: "Bienvenue dans notre communauté ! Retrouvez ici nos sujets les plus populaires." - not_seen_in_a_month: "Bienvenue à nouveau! Nous ne vous avons pas vu depuis un moment. Voici les meilleurs sujets de discussions depuis votre absence." + new_user: "Bienvenue dans notre communauté ! Voici les sujets récents les plus populaires." + not_seen_in_a_month: "Heureux de vous revoir parmi nous ! Nous ne vous avons pas vu depuis un moment. Voici les sujets les plus populaires depuis votre absence." merge_posts: edit_reason: one: "Un message a été fusionné par %{username}" @@ -1236,21 +1328,21 @@ fr: different_users: "Des messages appartenant à différents utilisateurs ne peuvent pas être fusionnés." move_posts: new_topic_moderator_post: - one: "Un message a été envoyé vers un nouveau sujet : %{topic_link}" - other: "%{count} messages ont été envoyés vers un nouveau sujet : %{topic_link}" + one: "Un message a été déplacé vers un nouveau sujet : %{topic_link}" + other: "%{count} messages ont été déplacés vers un nouveau sujet : %{topic_link}" existing_topic_moderator_post: one: "Un message a été intégré dans un sujet existant : %{topic_link}" other: "%{count} messages ont été intégrés dans un sujet existant : %{topic_link}" change_owner: - post_revision_text: "Auteur du message modifié de %{old_user} vers %{new_user}" + post_revision_text: "Auteur du message changé de %{old_user} vers %{new_user}" deleted_user: "un utilisateur supprimé" emoji: errors: - name_already_exists: "Désolé, le nom '%{name}' est déjà utilisé par un autre emoji." + name_already_exists: "Désolé, le nom « %{name} » est déjà utilisé par un autre emoji." error_while_storing_emoji: "Désolé, il y a eu une erreur lors de l'enregistrement de l'emoji." topic_statuses: archived_enabled: "Ce sujet est maintenant archivé. Il est gelé et ne peut plus être modifié d'aucune façon." - archived_disabled: "Ce sujet est maintenant dé-archivé. Il n'est plus gelé, et peut être modifié." + archived_disabled: "Ce sujet est maintenant désarchivé. Il n'est plus figé et peut être modifié." closed_enabled: "Ce sujet est maintenant fermé. Les nouvelles réponses ne sont plus autorisées." closed_disabled: "Ce sujet est maintenant ouvert. Les nouvelles réponses sont autorisées." autoclosed_message_max_posts: @@ -1295,12 +1387,13 @@ fr: not_allowed_from_ip_address: "Vous ne pouvez pas vous connecter en tant que %{username} depuis cette adresse IP." admin_not_allowed_from_ip_address: "Vous ne pouvez pas vous connecter depuis cette adresse IP." suspended: "Vous ne pouvez pas vous connecter jusqu'au %{date}." - suspended_with_reason: "Compte suspendu jusqu'à %{date}: %{reason}" + suspended_with_reason: "Compte suspendu jusqu'à %{date} : %{reason}" errors: "%{errors}" - not_available: "Pas disponible. Essayez %{suggestion} ?" + not_available: "Indisponible. Essayez %{suggestion} ?" something_already_taken: "Quelque chose c'est mal passé. Peut-être que votre pseudo ou votre adresse de courriel est déjà enregistré ? Essayez le lien : j'ai oublié mon mot de passe." omniauth_error: "Désolé, une erreur est survenue lors de l'autorisation de votre compte. Vous n'avez peut-être pas approuvé l'autorisation ?" omniauth_error_unknown: "Quelque chose s'est mal passé lors de votre connexion, merci de réessayer." + authenticator_error_no_valid_email: "Aucune adresse courriel associée à %{account] n'est autorisée. Vous devriez configurer votre compte avec une autre adresse." new_registrations_disabled: "La création de nouveau compte n'est pas autorisé pour le moment." password_too_long: "Les mots de passe sont limités à 200 caractères." email_too_long: "L'email renseigné est trop long. Les noms de boîte ne doivent pas dépasser 254 caractères, et les noms de domaines ne doivent pas dépasser 253 caractères." @@ -1317,17 +1410,19 @@ fr: characters: "doit inclure uniquement des chiffres, lettres et caractères de soulignement" unique: "doit être unique" blank: "doit être présent" - must_begin_with_alphanumeric_or_underscore: "doit commencer par une lettre, un chiffre ou un tiret du bas." + must_begin_with_alphanumeric_or_underscore: "doit commencer par une lettre, un chiffre ou un tiret bas" must_end_with_alphanumeric: "doit finir par une lettre ou un chiffre" must_not_contain_two_special_chars_in_seq: "ne doit pas contenir une séquence de 2 caractères spéciaux ou plus (.-_)" must_not_end_with_confusing_suffix: "ne doit pas se terminer avec un suffixe déroutant comme .json ou .png etc." email: not_allowed: "n'est pas autorisé pour ce fournisseur de courriels. Merci d'utiliser une autre adresse." blocked: "n'est pas autorisé." - revoked: "N'enverra plus de courriels à '%{email}' jusqu'à %{date}." + revoked: "N'enverra plus de courriels à « %{email} » jusqu'à %{date}." ip_address: blocked: "Les nouvelles inscriptions ne sont pas acceptées depuis votre adresse IP." max_new_accounts_per_registration_ip: "Les nouvelles inscriptions ne sont pas autorisées depuis votre adresse IP (limite atteinte). Contactez un responsable." + website: + domain_not_allowed: "Site Web invalide. Les domaines autorisés sont : %{domains}" flags_reminder: flags_were_submitted: one: "Un signalement a été soumis il y a plus d'une heure. Veuillez la passer en revue." @@ -1336,17 +1431,17 @@ fr: one: "un signalement en attente de traitement" other: "%{count} signalements en attente de traitement." unsubscribe_mailer: - subject_template: "Confirmez que vous ne souhaitez plus recevoir d'email de mise à jour de %{site_title}" + subject_template: "Confirmez que vous ne souhaitez plus recevoir de courriels de mises à jour de %{site_title}" text_body_template: | - Quelqu’un (est-ce vous?) a demandé à ne plus envoyer d'email de mise à jour de %{site_domain_name} a cette adresse. - Pour confirmer, merci de cliquer sur ce lien: + Quelqu’un (est-ce vous ?) a demandé à ne plus envoyer de courriels de mises à jour de %{site_domain_name} à cette adresse. + Pour confirmer, merci de cliquer sur ce lien : %{confirm_unsubscribe_link} - Si vous souhaitez continuer à recevoir les emails, vous pouvez ignorer cet email. + Si vous souhaitez continuer à recevoir ces courriels, vous pouvez ignorer ce message. invite_mailer: - subject_template: "%{invitee_name} vous a invité(e) à participer à '%{topic_title}' sur %{site_domain_name}" + subject_template: "%{invitee_name} vous a invité(e) à participer à « %{topic_title} » sur %{site_domain_name}" text_body_template: | %{invitee_name} vous a invité(e) dans une discussion @@ -1364,6 +1459,28 @@ fr: Cette invitation provient d'un utilisateur de confiance, vous pouvez donc répondre immédiatement. custom_invite_mailer: + subject_template: "%{invitee_name} vous a invité(e) à participer à « %{topic_title} » sur %{site_domain_name}" + text_body_template: | + %{invitee_name} vous a invité(e) dans une discussion + + > **%{topic_title}** + > + > %{topic_excerpt} + + sur + + > %{site_title} -- %{site_description} + + Message de %{invitee_name} : + + %{user_custom_message} + + Si cela vous intéresse, cliquez sur le lien ci-dessous : + + %{invite_link} + + Cette invitation provient d'un utilisateur de confiance, vous pouvez donc répondre immédiatement. + custom_invite_mailer: subject_template: "%{invitee_name} vous a invité(e) à participer à '%{topic_title}' sur %{site_domain_name}" text_body_template: | %{invitee_name} vous a invité(e) dans une discussion @@ -1471,7 +1588,7 @@ fr: [mt]: http://www.mail-tester.com/ new_version_mailer: subject_template: "[%{site_name}] Nouvelle version de Discourse, mise à jour disponible" - text_body_template: | + text_body_template: |+ Hourra, une nouvelle version de [Discourse](http://www.discourse.org) est disponible ! Votre version : %{installed_version} @@ -1481,7 +1598,8 @@ fr: - Consultez les nouveautés sur l'historique [GitHub](https://github.com/discourse/discourse/commits/master). - - Visitez [meta.discourse.org](http://meta.discourse.org) pour des nouvelles, des discussions, et de l'aide concernant Discourse. + - Visitez [meta.discourse.org](https://meta.discourse.org) pour des nouvelles, des discussions, et de l'aide concernant Discourse. + new_version_mailer_with_notes: subject_template: "[%{site_name}] mise à jour disponible" text_body_template: | @@ -1494,7 +1612,7 @@ fr: - Consultez les nouveautés sur l'historique [GitHub](https://github.com/discourse/discourse/commits/master). - - Visitez [meta.discourse.org](http://meta.discourse.org) pour des nouvelles, des discussions, et de l'aide concernant Discourse. + - Visitez [meta.discourse.org](https://meta.discourse.org) pour des nouvelles, des discussions, et de l'aide concernant Discourse. ### Notes de version @@ -1508,10 +1626,10 @@ fr: Des messages de nouveaux utilisateurs sont en attente de modération. [Approuvez ou rejetez-les ici](%{base_url}/queued-posts). flag_reasons: - off_topic: "Votre message a été signalé comme étant **hors sujet**: la communauté considère qu'il ne correspond au sujet en discussion, qui est fixé par son titre et son premier message." - inappropriate: "Votre message a été signalé comme étant **inapproprié**: la communauté considère que son contenu est offensif, abusif ou enfreint notre [charte](/guidelines)." - spam: "Votre message a été signalé comme étant du **spam**: la communauté considère qu'il s'agit d'une publicité, ou du contenu trop promotionnel au lieu d'être utile et à propos du sujet en discussion." - notify_moderators: "Votre message a été **signalé aux modérateurs**: la communauté considère que quelque chose requiert une intervention d'un des responsables." + off_topic: "Votre message a été signalé comme étant **hors sujet** : la communauté considère qu'il ne correspond au sujet en discussion qui est défini par son titre et son premier message." + inappropriate: "Votre message a été signalé comme étant **inapproprié** : la communauté considère que son contenu est offensif, abusif ou enfreint notre [charte](/guidelines)." + spam: "Votre message a été signalé comme étant du **spam** : la communauté considère qu'il s'agit d'une publicité, ou du contenu trop promotionnel au lieu d'être utile et pertinent au sujet." + notify_moderators: "Votre message a été **signalé aux modérateurs** : la communauté considère qu'il nécessite l'intervention d'un responsable." flags_dispositions: agreed: "Merci de nous en informer. Nous sommes en accord avec votre signalement et nous travaillons à sa résolution." agreed_and_deleted: "Merci de nous en informer. Nous sommes en accord avec votre signalement et avons supprimé le message." @@ -1537,99 +1655,6 @@ fr: Afin d'être guidé, merci de vous référer à notre [charte](%{base_url}/guidelines). - usage_tips: - text_body_template: | - Voici quelques astuces pour vous aider à démarrer : - - ## Lire - - Pour en lire plus, **faites défiler vers le bas !** - - Lorsque de nouveaux sujets ou de nouvelles réponses sont publiés, ils apparaissent automatiquement ; inutile de rafraîchir la page. - - ## Navigation - - - Pour effectuer une recherche, accéder à votre profil ou utiliser le menu ☰, cliquez sur les **icônes en haut à droite**. - - - Sélectionner le titre d'un sujet, vous dirigera toujours vers **la nouvelle réponse non lue** dans celui-ci. Pour aller au début ou à la fin, sélectionnez le compteur de réponses ou la date de la dernière réponse. - -Nous avons envoyé un courriel d’activation à %{email}. Veuillez suivre les instructions du courriel pour activer votre compte.
S'il n'est pas réceptionné, assurez-vous que l'adresse courriel est correctement configurée pour votre Discourse et vérifiez vos courriers indésirables.
" + resend_email: + title: "Renvoyer le courriel d'activation" + message: "Nous avons renvoyé le courriel d'activation à %{email}" + safe_mode: + title: "Activer le mode sans échec" + description: "Le mode sans échec vous permet de tester votre site sans charger les extensions ou personnalisations." + no_customizations: "Désactiver toutes les personnalisations" + only_official: "Désactiver les extensions non officielles" + no_plugins: "Désactiver toutes les extensions" + enter: "Activer le mode sans échec" + wizard: + title: "Configuration de Discourse" + step: + locale: + title: "Bienvenue sur votre Discourse !" + fields: + default_locale: + description: "Quelle est la langue par défaut de votre communauté ?" + forum_title: + title: "Nom" + description: "Votre nom est un signe visible au loin, la first première chose que les visiteurs remarqueront à propos de votre communauté. Que disent votre nom et titre à propos de votre communauté ?" + fields: + title: + label: "Nom de votre communauté" + placeholder: "Le repaire de Jeanne" + site_description: + label: "Dévrivez votre communauté en une courte phrase" + placeholder: "Un endroit de discussion pour Jeanne et ses amis" + introduction: + title: "Introduction" + fields: + welcome: + label: "Sujet de bienvenue" + description: "
Comment décririez-vous votre communauté à un inconnu en environ 1 minute ?
Votre sujet de bienvenue est la première chose que les nouveaux visiteurs vont voir. Voyez le comme votre unique paragraphe qui définit votre mission et différence.
" + one_paragraph: "Veuillez restreindre votre message de bienvenue à un paragraphe." + privacy: + title: "Accès" + description: "Votre communauté est-elle ouverte à tous ou restreinte par adhésion, invitation et approbation ? Si vous préférez, vous pouvez préparer le site en mode privé puis passer en public par la suite.
Rappelez-vous aussi que vous pouvez toujours envoyer des invitations depuis les sujets ou votre page de profil utilisateur.
" + fields: + privacy: + choices: + open: + label: "Public" + description: "Tout le monde peut accéder à cette communauté et créer un compte" + restricted: + label: "Privé" + description: "Uniquement les personnes que j'ai invitées ou approuvées peuvent accéder à cette communauté" + contact: + title: "Contact" + fields: + contact_email: + label: "Courriel" + placeholder: "nom@exemple.com" + description: "Adresse courriel de la personne ou groupe responsable de cette communauté. Utilisée pour des notifications critiques comme des signalements non réglés, des mises à jour de sécurité et sur la page À propos pour des contacts urgents. " + contact_url: + label: "Page Web" + placeholder: "http://www.exemple.com/contacter-nous" + description: "Page web pour vous contacter ou votre organisation. Sera affichée dans la page À propos." + site_contact: + label: "Messages automatiques" + description: "Tous les messages privés automatiques de Discourse seront envoyés par cet utilisateur. Plus important, cet utilisateur sera l'envoyeur désigné de tous les messages de bienvenue à destination des nouveaux utilisateurs." + corporate: + title: "Organisation" + description: "Ces noms seront renseignés dans les pages Politique de confidentialité et Conditions générales d'utilisation que vous pouvez modifier à tout moment depuis la catégorie Staff. Si vous n'avez pas de société, vous pouvez ignorer cette étape pour le moment." + fields: + company_short_name: + label: "Nom de société (court)" + placeholder: "Initech" + company_full_name: + label: "Nom de société (complet)" + placeholder: "Initech, Inc." + company_domain: + label: "Nom de domaine de la société" + placeholder: "initech.com" + colors: + title: "Thème" + fields: + theme_id: + description: "Préférez-vous une palette de couleurs claires ou sombres pour commencer ? Vous pouvez toujours personnaliser l'aspect du site dans Administration, Personaliser." + choices: + default: + label: "Clair" + dark: + label: "Sombre" + logos: + title: "Logos" + fields: + logo_url: + label: "Logo principal" + description: "L'image logo du coin supérieur gauche de votre site. Utilisez une forme rectangulaire large." + logo_small_url: + label: "Logo compact" + description: "Une version compacte de votre logo qui est affichée dans le coin supérieur gauche de votre site quand vous défilez la page vers le bas. Utilisez une forme carrée." + icons: + title: "Icônes" + fields: + favicon_url: + label: "Petite icône" + description: "Icône utilisée pour représenter le site dans les navigateurs Web et qui rend bien à de petites tailles comme 32px par 32px. " + apple_touch_icon_url: + label: "Grande icône" + description: "Icône utilisée pour représenter le site sur les appareils modernes et que rend bien à des tailles plus grandes. La taille minimale conseillée est de 144px par 144px." + homepage: + description: "Nous recommandons d'afficher les sujets récents sur votre page d'accueil mais vous pouvez choisir d'y afficher les catégories (groupes de sujets) si vous préférez." + title: "Page d'accueil" + fields: + homepage_style: + choices: + latest: + label: "Sujets récents" + categories: + label: "Catégories" + emoji: + title: "Emoji" + description: "Quel style d'Emoji préférez-vous pour votre communauté ? Vous pouvez toujours ajouter des Emoji supplémentaires dans Administration, Personnaliser, Emoji." + invites: + title: "Inviter des responsables" + description: "Vous avez presque fini ! Invitons quelques responsables pour aider à entamer les discussions avec des sujets et réponses intéressantes pour lancer la communauté." + finished: + title: "Votre Discourse est prêt !" + description: | +Si vous souhaitez modifier ces paramètres, rendez-vous dans la section Administration ; trouvez la dans le menu du site.
+Amusez-vous et bonne chance pour construire votre nouvelle communauté !
activemodel: errors: <<: *errors diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index cba46f30c76..ae3ac35cd01 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -17,7 +17,7 @@ he: date_only: "%B %-d, %Y" long: "%B %-d, %Y, %l:%M%P" date: - month_names: [null, ינואר, פברואר, מרס, אפריל, מאי, יוני, יוני, אוגוסט, ספטמבר, אוקטובר, נובמבר, דצמבר] + month_names: [null, ינואר, פברואר, מרץ, אפריל, מאי, יוני, יולי, אוגוסט, ספטמבר, אוקטובר, נובמבר, דצמבר] <<: *datetime_formats time: am: "am" @@ -25,21 +25,38 @@ he: <<: *datetime_formats title: "Discourse" topics: "נושאים" - posts: "הודעות" + posts: "פוסטים" loading: "טוען" - powered_by_html: 'מונע ע"י Discourse, פועל מיטבית עם Javascript' + powered_by_html: 'מונע ע"י Discourse, פועל מיטבית עם Javascript מאופשר' log_in: "התחברות" - purge_reason: "נחמק אוטומטית כחשבון נטוש ולא פעיל" - disable_remote_images_download_reason: "הורדת תמונות מרחוק נחסמה בשל היעדר מספיק שטח אכסון פנוי." + purge_reason: "נמחק אוטומטית כחשבון נטוש ולא פעיל" + disable_remote_images_download_reason: "הורדת תמונות מרחוק נחסמה בשל היעדר מספיק שטח אחסון פנוי." anonymous: "אנונימי" emails: incoming: default_subject: "התקבל מייל מ %{email}" + show_trimmed_content: "הצגת תוכן גזום" + maximum_staged_user_per_email_reached: "הגעתם למספר המירבי של משתמשים מועמדים למייל." + errors: + empty_email_error: "קורה כאשר המייל הגולמי שקיבלנו הוא ריק." + no_message_id_error: "קורה כאשר למייל אין 'Message-Id' בכותרת." + auto_generated_email_error: "קורה כאשר כותרת ה״קדימות״ מכוונת ל: רשימה, זבל, תפזורת או מענה-אוטומטי, או כאשר כותרת אחרת כוללת: נשלח-אוטומטית, מענה-אוטומטי או נוצר-אוטומטית." + no_body_detected_error: "קורה כאשר לא הצלחנו לחלץ גוף ולא היו קבצים מצורפים." + inactive_user_error: "קורה כאשר השולח אינו פעיל." + blocked_user_error: "קורה כאשר השולח נחסם." + bad_destination_address: "קורה כאשר אף אחת מהכתובות ב To/CC/Bcc לא מתאימה לאף כתובת מייל נכנסת." + strangers_not_allowed_error: "מתרחש כאשר משתמשים מנסים ליצור נושא חדש בקטגוריה בה הם אינם חברים." + insufficient_trust_level_error: "מתרחש כאשר משתמשים מנסים ליצור נושא חדש בקטגוריה בה אין להם את רמת האמון/הרשאה הנדרשת." + reply_user_not_matching_error: "מתרחש כאשר תגובה מגיעה מכתובת דוא\"ל אחרת מזו שההתראה נשלחה אליה." + topic_not_found_error: "קורה כאשר הגיעה תגובה אבל הנושא הקשור נמחק." + topic_closed_error: "קורה כאשר הגיעה תגובה אבל הנושא הקשור נסגר." + bounced_email_error: "המייל הוא דוח מיילים מוחזרים" + screened_email_error: "מתרחש כאשר כתובת הדוא\"ל של השולחים כבר סוננה." errors: &errors format: '%{attribute} %{message}' messages: - too_long_validation: "מוגבל לאורך של %{max} תוים: את/ה הקשת %{length}." - invalid_boolean: "בוליאני לא חוקי." + too_long_validation: "מוגבל לאורך של %{max} תוים: אתם הקשתם %{length}." + invalid_boolean: "בוליאני לא תקין." taken: "כבר תפוס" accepted: חייב להתקבל blank: לא ניתן להשאיר ריק @@ -54,21 +71,21 @@ he: has_already_been_used: "כבר בשימוש" inclusion: לא נכלל ברשימה invalid: לא תקין - is_invalid: "אינו קביל; נסה להיות מעט יותר מפורט" + is_invalid: "נראה לא ברור, האם זה משפט שלם?" less_than: חייב להיות פחות מ-%{count} less_than_or_equal_to: חייב להיות פחות או שווה ל-%{count} not_a_number: אינו מספר not_an_integer: חייב להיות מספר שלם - odd: חייב להיות א-זוגי + odd: חייב להיות אי-זוגי record_invalid: 'בדיקה נכשלה: %{errors}' restrict_dependent_destroy: - one: "לא ניתן למחוק בגלל קיומה של רשומה תלוייה %{record}" + one: "לא ניתן למחוק בגלל קיומה של רשומה תלויה %{record}" many: "לא ניתן למחוק רשומה בגלל קיומה של רשומה תלויה %{record}" too_long: - one: ארוף מידי (המקסימום האפשרי הוא תו אחד) + one: ארוך מידי (המקסימום האפשרי הוא תו אחד) other: ארוך מידי (המקסימום האפשרי הוא %{count} תוים) too_short: - one: קצר מידי (המינימום הנדרש הוא תו 1) + one: קצר מידי (המינימום הנדרש הוא תו אחד) other: קצר מידי (המינימום הנדרש הוא %{count} תוים) wrong_length: one: באורך שגוי (צריך להיות באורך תו אחד) @@ -80,109 +97,134 @@ he: one: שגיאה מנעה מ-%{model} להישמר. other: '%{count} שגיאות מנעו מ-%{model} להישמר.' embed: - load_from_remote: "ארעה שגיאה בטעינת ההודעה הזו." + load_from_remote: "ארעה שגיאה בטעינת הפוסט הזה." site_settings: - min_username_length_exists: "לא ניתן לקבוע את אורך שם המשתמש המינימלי לארוך יותר משם משתמש שקיים כבר. " - min_username_length_range: "לא ניתן לקבוע את המינימום מעל המקסימום" - max_username_length_exists: "לא ניתן לקבוע את אורך שם המשתמש המקסימלי לקצר יותר משם משתמש שקיים כבר. " + min_username_length_exists: "לא ניתן לקבוע את אורך שם המשתמש המינימלי להיות ארוך יותר משם משתמש שכבר קיים." + min_username_length_range: "לא ניתן לקבוע את המינימום מעל המקסימום." + max_username_length_exists: "לא ניתן לקבוע את אורך שם המשתמש המקסימלי לקצר יותר משם משתמש שכבר קיים." max_username_length_range: "לא ניתן לקבוע את המקסימום מתחת למינימום." - default_categories_already_selected: "לא ניתן לבחור קטגוריה שהשתמשו בה ברשימה אחרת" + default_categories_already_selected: "לא ניתן לבחור קטגוריה שהשתמשו בה ברשימה אחרת." s3_upload_bucket_is_required: "אינכם יכולים להעלות ל-S3 ללא 's3_upload_bucket'." bulk_invite: - file_should_be_csv: "הקובץ המועלה צריך להיות בפורמט csv או txt." + file_should_be_csv: "הקובץ שמועלה אמור להיות בפורמט csv." + error: "ארעה שגיאה בהעלת הקובץ. אנא נסו שוב מאוחר יותר." backup: operation_already_running: "פעולה רצה כרגע. לא יכול להתחיל עבודה חדשה עכשיו." - backup_file_should_be_tar_gz: "קובץ הגיוי צריך להיות .tar.gz." + backup_file_should_be_tar_gz: "קובץ הגיבוי צריך להיות .tar.gz." not_enough_space_on_disk: "אין מספיק מקום על הדיסק כדי להעלות את הגיבוי הזה." - not_logged_in: "אתה צריך להיות מחובר כדי לעשות את זה." - not_found: "המשאב או כתובת ה-URL המבוקשת לא נמצא/ה." + invalid_filename: "שם קובץ הגיבוי מכיל תווים שגויים. תווים תקינים הם a-z 0-9 . - _." + not_logged_in: "אתם צריכים להיות מחוברים כדי לעשות את זה." + not_found: "המשאב או כתובת ה-URL המבוקשת לא נמצאו." invalid_access: "אינכם מורשים לצפות במשאב שביקשתם." read_only_mode_enabled: "האתר הזה במצב קריאה בלבד. פעולות אין אפשריות." reading_time: "זמן קריאה" likes: "לייקים" too_many_replies: - one: "אנחנו מצטערים, אבל משתמשים חדשים מוגבלים זמנים לתגובה אחת לאותו הנושא." - other: "אנחנו מצטערים, אבל משתמשים חדשים מוגבלים זמנים ל-%{count} תגובות לאותו הנושא." + one: "אנחנו מצטערים, אבל משתמשים חדשים מוגבלים זמנית לתגובה אחת לאותו הנושא." + other: "אנחנו מצטערים, אבל משתמשים חדשים מוגבלים זמנית ל-%{count} תגובות לאותו הנושא." embed: start_discussion: "התחלת דיון" continue: "המשך דיון" + error: "תקלה בשילוב" + referer: "מפנה:" + mismatch: "המפנה לא התאים לאף אחד מהשרתים הבאים:" + no_hosts: "אף שרת לא הוגדר לשילוב." + configure: "הגדרת שילוב (Embedding)" more_replies: one: "עוד תגובה אחת" other: "עוד %{count} תגובות" loading: "טוען דיון..." permalink: "קישור" - imported_from: "זה דיון מלווה לערך המקורי ב- %{link}" + imported_from: "זה נושא דיון מלווה לערך המקורי ב- %{link}" in_reply_to: "◄ %{username}" replies: one: "תגובה אחת" other: "%{count} תגובות" - no_mentions_allowed: "מצטערים, אך אינכם יכולים לאזכר משתמשים אחרים" + no_mentions_allowed: "מצטערים, אך אינכם יכולים לאזכר משתמשים אחרים." too_many_mentions: one: "מצטערים, אתם יכולים לאזכר רק משתמש אחד בפוסט" - other: "מצטערים, אתם יכולים לאזכר רק %{count} משתמשים בהודעה" + other: "מצטערים, אתם יכולים לאזכר רק %{count} משתמשים בפוסט" no_mentions_allowed_newuser: "מצטערים, משתמשים חדשים לא יכולים להזכיר משתמשים אחרים." too_many_mentions_newuser: - one: "מצטערים, משתמשים חדשים יכולים לאזכר רק משתמש אחד בהודעה." - other: "מצטערים, משתמשים חדשים יכולים להזכיר רק %{count} משתמשים אחרים בהודעה. " - no_images_allowed: "מצטערים, משתמשים חדשים לא יכולים להוסיף תמונות להודעות." - no_attachments_allowed: "מצטערים, משתמשים חדשים לא יכולים להוסיף קבצים להודעות." - no_links_allowed: "מצטערים, משתמשים חדשים לא יכולים להוסיף קישורים להודעות. " + one: "מצטערים, משתמשים חדשים יכולים לאזכר רק משתמש אחד בפוסט." + other: "מצטערים, משתמשים חדשים יכולים להזכיר רק %{count} משתמשים אחרים בפוסט. " + no_images_allowed: "מצטערים, משתמשים חדשים לא יכולים להוסיף תמונות לפוסטים." + too_many_images: + one: "מצטערים, משתמשים חדשים יכולים להוסיף רק תמונה אחת לפוסט." + other: "מצטערים, משתמשים חדשים יכולים להוסיף רק %{count} תמונות לפוסט." + no_attachments_allowed: "מצטערים, משתמשים חדשים לא יכולים להוסיף קבצים לפוסטים." + too_many_attachments: + one: "מצטערים, משתמשים חדשים יכולים להוסיף רק צירוף אחד לפוסט." + other: "מצטערים, משתמשים חדשים יכולים להוסיף רק %{count} צירופים לפוסט." + no_links_allowed: "מצטערים, משתמשים חדשים לא יכולים להוסיף קישורים לפוסטים." + too_many_links: + one: "מצטערים, משתמשים חדשים יכולים להוסיף רק קישור אחד בפוסט." + other: "מצטערים, משתמשים חדשים יכולים להוסיף רק %{count} קישורים בפוסט." spamming_host: "סליחה אך אינכם יכולים להוסיף קישור לאתר זה." - user_is_suspended: "משתמשים מושעים אינפ מורשים לפרסם" - topic_not_found: "משהו השתבש אולי נושא זה נסגר או נמחק בזמן שקראת אותו?" - just_posted_that: "דומה מידי למה שפורסם לאחרונה" - invalid_characters: "מכיל תווים לא חוקיים" - is_invalid: "אינו תקין: נסה יותר פירוט" + user_is_suspended: "משתמשים מושעים אינם מורשים לפרסם." + topic_not_found: "משהו השתבש אולי נושא זה נסגר או נמחק בזמן שקראתם אותו?" + just_posted_that: "דומה מידי למה שפרסמתם לאחרונה" + invalid_characters: "מכיל תווים לא תקניים" + is_invalid: "נראה לא ברור, האם זה משפט שלם?" next_page: "עמוד הבא ←" prev_page: "→ עמוד קודם" page_num: "עמוד %{num}" home_title: "בית" topics_in_category: "נושאים בקטגוריה '%{category}'" - rss_posts_in_topic: "תזרים RSS '%{topic}'" + rss_posts_in_topic: "תזרים RSS של '%{topic}'" rss_topics_in_category: "תזרים RSS של נושאים בקטגוריה '%{category}'" - author_wrote: "%{author} כתב:" - num_posts: "הודעות:" + author_wrote: "%{author} כתב/ה:" + num_posts: "פוסטים:" num_participants: "משתתפים:" - read_full_topic: "קרא נושא מלא" + read_full_topic: "קראו נושא מלא" private_message_abbrev: "הודעה" rss_description: - latest: "נושאים מדוברים" + latest: "נושאים אחרונים" hot: "נושאים חמים" - top: "הנושאים המובילים" - posts: "פרסומים אחרונים" + top: "נושאים מובילים" + posts: "פוסטים אחרונים" private_posts: "הודעות פרטיות אחרונות" + group_posts: "פוסטים אחרונים מ %{group_name}" + group_mentions: "איזכורים אחרונים מ %{group_name}" + user_posts: "פוסטים אחרונים של @%{username}" + user_topics: "נושאים אחרונים של @%{username}" tag: "נושאים מתוייגים" - too_late_to_edit: "ההודעה הזו נוצרה לפני זמן רב מידי. לא ניתן יותר לערוך או למחוק אותה." + too_late_to_edit: "פוסט זה נוצר לפני זמן רב מידי. לא ניתן יותר לערוך או למחוק אותו." revert_version_same: "הגרסה הנוכחית זהה לגרסה אליה אתם מנסים לחזור." excerpt_image: "תמונה" queue: - delete_reason: "נמחק באמצעות בקרה על תור הפרסומים" + delete_reason: "נמחק באמצעות בקרה על תור הפוסטים" groups: errors: - member_already_exist: "'%{username}' הוא כבר חבר בקבוצה הזו." + can_not_modify_automatic: "אינכם יכולים לערוך קבוצה אוטומטית" + member_already_exist: "'%{username}' כבר חבר/ה בקבוצה זו." + invalid_domain: "'%{domain}' אינו שם מתחם תקף." + invalid_incoming_email: "'%{email}' אינה כתובת מייל תקפה." + email_already_used_in_group: "'%{email}' כבר בשימוש על ידי הקבוצה '%{group_name}'." + email_already_used_in_category: "'%{email}' כבר בשימוש על ידי הקטגוריה '%{category_name}'." default_names: everyone: "כולם" - admins: "מנהלים ראשיים" - moderators: "מנהלים" + admins: "מנהלים" + moderators: "מנחים" staff: "צוות" - trust_level_0: "רמת_אמון_0" + trust_level_0: "trust_level_0" trust_level_1: "trust_level_1" trust_level_2: "trust_level_2" trust_level_3: "trust_level_3" trust_level_4: "trust_level_4" education: until_posts: - one: "הודעה אחת" - other: "%{count} הודעות" + one: "פוסט אחד" + other: "%{count} פוסטים" new-topic: | - ברוכים באים ל%{site_name} — **תודה שהתחלת שיחה חדשה! ** - -הכותרת נשמעת מעניינת כשאת/ה קורא/ת אותה בקול רם? האם היא תקציר טוב? - -מי יתעניין בזה? איזה סוג של תגובות את/ה רוצה? - -השתמש/י במילים נפוצות בכותרת שלך כך שאחרים יוכלו למצוא אותה. כדי לשייך את הנושא שלך עם נושאים קשורים בחר קטגוריה. - -לעוד טיפים, [ראה את כללי התנהלות בקהילה] (/guidelines). - הפנל הזה יופיע רק עבור %{education_posts_text}. הראשונים. + ברוכים באים ל%{site_name} — **תודה שהתחלתם שיחה חדשה! ** + -הכותרת נשמעת מעניינת כשאתם קוראים אותה בקול רם? האם היא תקציר טוב? + -מי יתעניין בזה? איזה סוג של תגובות אתם רוצים? + -השתמשו במילים נפוצות בכותרת שלכם כך שאחרים יוכלו למצוא אותה. כדי לשייך את הנושאים שלכם עם נושאים קשורים בחרו קטגוריה. + -לעוד טיפים, [ראו את כללי התנהלות בקהילה] (/guidelines). + הפנל הזה יופיע רק עבור %{education_posts_text} הפוסטים הראשונים. new-reply: | - ברוכים באים ל %{site_name} — ** תודה על תרומתך! ** + ברוכים הבאים ל %{site_name} — ** תודה על תרומתך! ** - האם התגובה שלך משפרת את השיחה בדרך כלשהיא? @@ -190,13 +232,16 @@ he: - ביקורת מבנה היא רצויה, אבל אנא בקרו *רעיונות*, לא אנשים. - למידע נוסף [ראו את הכללים המנחים שלנו]/guidelines). פאנל זה יופיע רק ב-%{education_posts_text} תגובות הראשונות שלך. + למידע נוסף [ראו את הכללים המנחים שלנו](/guidelines). פאנל זה יופיע רק ב-%{education_posts_text} התגובות הראשונות שלך. avatar: | - ###מה דעתך להוסיף תמונה לחשבון שלך? - כבר פרסמת כמה נושאים ותגובות, אבל תמונת הפרופיל שלך לא מיוחדת- היא רק אות. - שקלת **[להכנס לפרופיל משתמש שלך ](%{profile_path})** ולהעלות תמונה שמייצגת אותך? + ### מה דעתך להוסיף תמונה לחשבון שלך? + + כבר פרסמת כמה נושאים ותגובות, אבל תמונת הפרופיל שלך לא מיוחדת - היא רק אות. + + שקלת **[להכנס לפרופיל המשתמש שלך](%{profile_path})** ולהעלות תמונה שמייצגת אותך? + יותר קל לעקוב אחרי שיחות ולמצוא אנשים מעניינים כשלכולם יש תמונת פרופיל יחודית! - sequential_replies: | + sequential_replies: |+ ### שקלו להשיב לכמה פרסומים בבת אחת במקום להשיב בתגובות עוקבות לנושא, שקלו בבקשה לפרסם תגובה אחת שכוללת ציטוטים מהפרסומים הקודמים או הפניות ל@שם_משתמש/ת. @@ -205,15 +250,15 @@ he: קל יותר לכולם לקרוא נושאים עם מספר נמוך יחסית תגובות מעמיקות מאשר הרבה תגובות קצרות ונפרדות. dominating_topic: | - ### אפשר לאחרים להצטרף לשיחה + ### אפשרו לאחרים להצטרף לשיחה - הנושא הזה בבירור חשוב לך – פרסמת יותר מ-%{percent}% מהתגובות כאן. + הנושא הזה בבירור חשוב לכם – פרסמתם יותר מ-%{percent}% מהתגובות כאן. - בטוח שאתה נותן מספיק זמן לאחרים כדי לחלוק את נקודת מבטם? + בטוח שאתם נותנים מספיק זמן לאחרים כדי לחלוק את נקודת מבטם? too_many_replies: | - ### הגעת למגבלת התגובות של הנושא הזה + ### הגעתם למגבלת התגובות של הנושא הזה - אנחנו מצטערים, אבל משתמשים חדשים מודבלים זמנית לפרסום %{newuser_max_replies_per_topic} תגובות באותו הנושא. + אנחנו מצטערים, אבל משתמשים חדשים מוגבלים זמנית לפרסום %{newuser_max_replies_per_topic} תגובות באותו הנושא. במקום להוסיף תגובה נוספת, ניתן לערוך תגובה קודמת, או לבקר בנושאים אחרים. reviving_old_topic: | @@ -221,13 +266,14 @@ he: התגובה האחרונה לנושא הזה היא כבר בת יותר מ-%{days} ימים. התגובה שלך תקפיץ את הנושא הזה לראש הרשימה שלו ותודיע לכל מי שהיה מעורב בשיחה בו. - אתה בטוח שברצונך להמשיך את הדיון הישן הזה? + אתם בטוחים שברצונכם להמשיך את הדיון הישן הזה? activerecord: attributes: category: name: "שם קטגוריה" topic: title: 'כותרת' + featured_link: 'קישור מומלץ' post: raw: "גוף" user_profile: @@ -237,93 +283,132 @@ he: topic: attributes: base: - warning_requires_pm: "את/ה יכולים להוסיף אזהרות רק למסרים פרטיים." - too_many_users: "את/ה יכולים לשלוח אזהרות רק למשתמש/ת אחד בכל פעם." + warning_requires_pm: "אתם יכולים להוסיף אזהרות רק למסרים פרטיים." + too_many_users: "אתם יכולים לשלוח אזהרות רק למשתמש/ת אחד בכל פעם." cant_send_pm: "מצטערים, אינכם יכולים לשלוח הודעה פרטית למשתמש זה." - no_user_selected: "עליכם לבחור משתמש/ת חוקיים." + no_user_selected: "עליכם לבחור משתמש/ת תקניים." + featured_link: + invalid: "אינו תקין. URL אמור לכלול http:// או https://." + invalid_category: "לא ניתן לעריכה בקטגוריה זו." user: attributes: password: - common: "אחת מתוך 10000 הסיסמאות הנפוצות. אנא השתמשו בסיסמא בטוחה יותר." - same_as_username: "זהה לשם המשתמש/ת שלך. אנא השתמש/י בסיסמה בטוחה יותר." - same_as_email: "זהה לכתובת הדוא\"ל שלך. אנא השתמש/י בסיסמה בטוחה יותר." + common: "אחת מתוך 10000 הסיסמאות הנפוצות. אנא השתמשו בסיסמה בטוחה יותר." + same_as_username: "זהה לשם המשתמש שלכם. אנא השתמשו בסיסמה בטוחה יותר." + same_as_email: "זהה לכתובת הדוא\"ל שלכם. אנא השתמשו בסיסמה בטוחה יותר." + same_as_current: "זהה לסיסמה הנוכחית שלכם." ip_address: - signup_not_allowed: " הרשמה אינו מורשית מהחשבון הזה." + signup_not_allowed: " הרשמה אינה מורשית מהחשבון הזה." color_scheme_color: attributes: hex: invalid: "זהו אינו צבע תקני" + post_reply: + base: + different_topic: "פוסט ותגובה חייבים להיות באותו הנושא." + web_hook: + attributes: + payload_url: + invalid: "ה URL שגוי. צריך להכיל http:// או https://. ותווי רווח אינם מותרים." <<: *errors user_profile: - no_info_me: "פרסום שלך סומן על ידי הקהילה. בבקשה בדקו את ההודעות.
' - user_must_edit: 'פרסום זה סומן על ידי הקהילה וכרגע מוסתר באופן זמני.
' + you_must_edit: 'פוסט שלכם סומן על ידי הקהילה. בבקשה בדקו את ההודעות.
' + user_must_edit: 'פוסט זה סומן על ידי הקהילה וכרגע מוסתר באופן זמני.
' archetypes: regular: title: "נושא רגיל" banner: - title: "נושא הבאנר" + title: "נושא באנר" message: - make: "נושא זה הוא כעת באנר. הוא יופיע בראש כל עמוד עד שישוחרר על ידי המשתמשים." + make: "נושא זה הוא כעת באנר. הוא יופיע בראש כל עמוד עד שיבוטל על ידי המשתמשים." remove: "נושא זה כבר אינו באנר. הוא לא יופיע יותר בראש כל עמוד." + unsubscribed: + title: "בוטל המנוי!" + description: "הוסרתם מהרשימות. כדי לשנות את אפשרויות המייל שלכם בקרו בהגדרות המשתמש שלכם." + topic_description: "כדי להרשם מחדש ל %{link}, השתמשו בהגדרות ההתראות בתחתית או משמאל לנושא." unsubscribe: + title: "בטלו את המנוי" + stop_watching_topic: "הפסיקו לצפות בנושא זה, %{link}" + mute_topic: "השתיקו את כל ההתראות של נושא זה, %{link}" + unwatch_category: "הפסיקו לצפות בכל הנושאים בקטגוריה %{category}" + mailing_list_mode: "כבו את מצב ״רשימת תפוצה״" + disable_digest_emails: "הפסיקו לשלוח לי סיכומים" + all: "אל תשלחו אלי יותר מיילים מ %{sitename}" + different_user_description: "אתם כרגע מחוברים כמשתמש אחר מאשר אליו שלחנו מייל. אנא התנתקו, או עיברו למצב אנונימי, ונסו שוב." + not_found_description: "מצטערים, לא מצאנו את ביטול המנוי הזה. ייתכן שהלינק במייל שלכם כבר לא בתוקף?" log_out: "התנתקות" + user_api_key: + title: "אישור גישת אפליקציה" + authorize: "אישור" + read: "קריאה" + read_write: "קריאה/כתיבה" + description: "\"%{application_name}\" מבקשת את הגישה הבאה לחשבון שלכם:" + no_trust_level: "מצטערים, אין לכם את רמת האמון הנדרשת כדי לגשת ל API של המשתמשים" + generic_error: "מצטערים, לא הצלחנו לייצר את מפתחות ה API של המשתמש, ייתכן שיכולת זו מנוטרלת על ידי מנהלי האתר" + scopes: + message_bus: "עדכונים חיים" + notifications: "קיראו ונקו התראות" + push: "דחיפת התראות לשירותים חיצוניים" + session_info: "קריאת מידע לגבי סשן של משתמש" + read: "קריאה להכל" + write: "כתיבה להכל" reports: visits: title: "ביקורי משתמש" @@ -503,33 +628,33 @@ he: xaxis: "יום" yaxis: "מספר משתמשים חדשים" profile_views: - title: "צפיות בפרופיל משתמש" + title: "צפיות בפרופילי משתמשים" xaxis: "יום" - yaxis: "מספר פרופילי משתמש שנצפו" + yaxis: "מספר פרופילי משתמשים שנצפו" topics: title: "נושאים" xaxis: "יום" yaxis: "מספר נושאים חדשים" posts: - title: "הודעות" + title: "פוסטים" xaxis: "יום" - yaxis: "מספר הודעות חדשות" + yaxis: "מספר פוסטים חדשים" likes: title: "לייקים" xaxis: "יום" yaxis: "מספר לייקים חדשים" flags: - title: "סימונים" + title: "דגלים" xaxis: "יום" yaxis: "מספר דגלים חדשים" bookmarks: - title: "מועדפים" + title: "סימניות" xaxis: "יום" - yaxis: "מספר מועדפים חדשים" + yaxis: "מספר סימניות חדשות" starred: title: "כוכב" xaxis: "יום" - yaxis: "מספר כוכבים חדשים" + yaxis: "מספר נושאים חדשים שכוכבו" users_by_trust_level: title: "משתמשים בכל רמת אמון" xaxis: "רמת אמון" @@ -547,7 +672,7 @@ he: xaxis: "יום" yaxis: "מספר ההודעות" moderator_warning_private_messages: - title: "אזהרות מנהל" + title: "אזהרות מנחים" xaxis: "יום" yaxis: "מספר ההודעות" notify_moderators_private_messages: @@ -555,7 +680,7 @@ he: xaxis: "יום" yaxis: "מספר ההודעות" notify_user_private_messages: - title: "התרע למשתמש" + title: "הודעה למשתמש/ת" xaxis: "יום" yaxis: "מספר ההודעות" top_referrers: @@ -576,19 +701,27 @@ he: page_view_anon_reqs: title: "אנונימי" xaxis: "יום" + yaxis: "צפיות אנונימיות" page_view_logged_in_reqs: title: "מחובר/ת" xaxis: "יום" + yaxis: "צפיות בדפים של מחוברים" page_view_crawler_reqs: title: "זחלן רשת" xaxis: "יום" + yaxis: "צפיות בדפים של זחלני רשת" page_view_total_reqs: title: "סה\"כ" xaxis: "יום" + yaxis: "צפיות כוללות" page_view_logged_in_mobile_reqs: + title: "צפיות של מחוברים" xaxis: "יום" + yaxis: "צפיות של מחוברים מניידים" page_view_anon_mobile_reqs: + title: "צפיות אנונימיות" xaxis: "יום" + yaxis: "צפיות אנונימיות מניידים" http_background_reqs: title: "רקע" xaxis: "יום" @@ -612,7 +745,7 @@ he: http_total_reqs: title: "סה\"כ" xaxis: "יום" - yaxis: "סה\"כ הבקשות" + yaxis: "סה\"כ בקשות" time_to_first_response: title: "זמן לתגובה הראשונה" xaxis: "יום" @@ -627,352 +760,518 @@ he: yaxis: "מספר ביקורים" dashboard: rails_env_warning: "השרת שלך רץ במצב %{env}." - host_names_warning: "Your config/database.yml file is using the default localhost hostname. Update it to use your site's hostname." - gc_warning: 'Your server is using default ruby garbage collection parameters, which will not give you the best performance. Read this topic on performance tuning: Tuning Ruby and Rails for Discourse.' - sidekiq_warning: 'Sidekiq is not running. Many tasks, like sending emails, are executed asynchronously by sidekiq. Please ensure at least one sidekiq process is running. Learn about Sidekiq here.' - queue_size_warning: 'The number of queued jobs is %{queue_size}, which is high. This could indicate a problem with the Sidekiq process(es), or you may need to add more Sidekiq workers.' - memory_warning: 'Your server is running with less than 1 GB of total memory. At least 1 GB of memory is recommended.' - google_oauth2_config_warning: 'השרת מכוון לאפשר הרשמות והתחברות עם OAuth2 של גוגל (enable_google_oauth2_logins), אבל ערכי זהות הלקוח (client id) וסיסאת הלקוח (client secret) אינם מוגדרים. לכו ל הגדרות האתר ועדכנו את הגדרות האתר. ראו מדריך זה כדי ללמוד עוד.' - facebook_config_warning: 'The server is configured to allow signup and log in with Facebook (enable_facebook_logins), but the app id and app secret values are not set. Go to the Site Settings and update the settings. See this guide to learn more.' - twitter_config_warning: 'The server is configured to allow signup and log in with Twitter (enable_twitter_logins), but the key and secret values are not set. Go to the Site Settings and update the settings. See this guide to learn more.' - github_config_warning: 'The server is configured to allow signup and log in with GitHub (enable_github_logins), but the client id and secret values are not set. Go to the Site Settings and update the settings. See this guide to learn more.' - s3_config_warning: 'The server is configured to upload files to s3, but at least one the following setting is not set: s3_access_key_id, s3_secret_access_key or s3_upload_bucket. Go to the Site Settings and update the settings. See "How to set up image uploads to S3?" to learn more.' - s3_backup_config_warning: 'The server is configured to upload backups to s3, but at least one the following setting is not set: s3_access_key_id, s3_secret_access_key or s3_backup_bucket. Go to the Site Settings and update the settings. See "How to set up image uploads to S3?" to learn more.' - image_magick_warning: 'The server is configured to create thumbnails of large images, but ImageMagick is not installed. Install ImageMagick using your favorite package manager or download the latest release.' - failing_emails_warning: 'There are %{num_failed_jobs} email jobs that failed. Check your app.yml and ensure that the mail server settings are correct. See the failed jobs in Sidekiq.' - default_logo_warning: "כוונו את הסמלילים הגרפיים לשימוש באתר שלך. עדכנו את כתובת ה-URL של הלוגו, כתובת ה-URL ללוגו המוקטן, וכתובת ה-URL של ה-favicon. " - contact_email_missing: "הזינו כתובת דוא\"ל ליצירת קשר, בה ניתן יהיה ליצור עמכם קשר בנושאים דחופים בנוגע לאתר שלכם. עדכנו אותה בהגדרות האתר." - contact_email_invalid: "כתובת הדוא\"ל ליצירת קשר של האתר אינה תקינה. עדכנו אותה ב הגדרות האתר." - title_nag: "הזינו את השם של האתר שלך. עדכנו את הכותרת בהגדרות האתר." - site_description_missing: "הזינו משפט אחד לתיאור האתר שלך אשר יופיע בתוצאות מנועי חיפוש. עדכנו את תיאור האתר בהגדרות האתר." - consumer_email_warning: "Your site is configured to use Gmail (or another consumer email service) to send email. Gmail limits how many emails you can send. Consider using an email service provider like mandrill.com to ensure email deliverability." - site_contact_username_warning: "הזינו שם חשבון ידידותי של אי/אשת צות ממנו ישלחו הודעות אוטומטיות חשובות. עדכנו את site_contact_username בהגדרות האתר." - notification_email_warning: "מיילים ליידוע אינם נשלחים מכתובת תקינה בדומיין שלכם; משלוח דוא\"ל יהיה בעייתי ולא אמין. אנא כוונו את כתובת המייל למשלוח התראות לכתובת מקומית תקינה בהגדרות האתר." + host_names_warning: "הקובץ config/database.yml אצלכם משתמש בכתובת ברירת המחדל - localhost. עדכנו אותה להשתמש בכתובת של השרת שלכם." + gc_warning: 'השרת שלכם משתמש בפרמטרי ברירת המחדל של garbage collection, שלא ייתנו לכם את הביצועים הטובים ביותר. קראו את הנושא הזה על כיוונון ביצועים: כיוונון Ruby on Rails בעבור Discourse.' + sidekiq_warning: 'Sidekiq לא רץ. משימות רבות, כמו שליחת מיילים, מבוצעות אסינכרונית באמצעות Sidekiq. אנא וודאו שלפחות תהליך אחד של Sidekiq רץ. לימדו על Sidekiq כאן.' + queue_size_warning: 'מספר העבודות בתור הוא %{queue_size}, שהוא גבוה. זה עלול להצביע על בעיה עם תהליך(י) Sidekiq, או שייתכן שאתם צריכים יותר Sidekiq workers.' + memory_warning: 'בשרת שלכם יש פחות מ 1 גיגה זיכרון בסך הכל. מומלץ לפחות 1 גיגה זיכרון.' + google_oauth2_config_warning: 'השרת מכוון לאפשר הרשמות והתחברות עם OAuth2 של גוגל (enable_google_oauth2_logins), אבל ערכי זהות הלקוח (client id) וסיסמת הלקוח (client secret) אינם מוגדרים. לכו ל הגדרות האתר ועדכנו את הגדרות האתר. ראו מדריך זה כדי ללמוד עוד.' + facebook_config_warning: 'השרת מכוון לאפשר הרשמה והתחברות עם פייסבוק (enable_facebook_logins), אבל ערכי מזהה האפליקציה וסוד האפליקציה אינם קבועים. לכו ל הגדרות האתר ועדכנו את ההגדרות האלו. ראו מדריך זה כדי ללמוד עוד.' + twitter_config_warning: 'השרת מכוון לאפשר הרשמה והתחברות עם טוויטר (enable_twitter_logins), אבל ערכי המפתח והסוד אינם קבועים. לכו ל הגדרות האתר ועדכנו את ההגדרות האלו. ראו מדריך זה כדי ללמוד עוד.' + github_config_warning: 'השרת מכוון לאפשר הרשמה והתחברות עם גיטהאב (enable_github_logins), אבל ערכי מזהה הלקוח והסוד אינם קבועים. לכו ל הגדרות האתר ועדכנו את ההגדרות האלו. ראו מדריך זה כדי ללמוד עוד.' + s3_config_warning: 'השרת מכוון להעלות קבצים ל s3, אבל לפחות אחת ההגדרות אינה קבועה: s3_access_key_id, s3_secret_access_key או s3_upload_bucket. לכו ל הגדרות האתר וקבעו את ההגדרות. ראו ״כיצד לכוון העלאות קבצים ל S3?״ כדי ללמוד עוד.' + s3_backup_config_warning: 'השרת מכוון להעלות גיבויים ל s3, אבל לפחות אחת מההגדרות הבאות לא נקבעה: s3_access_key_id, s3_secret_access_key או s3_backup_bucket. לכו ל הגדרות האתר ועדכנו את ההגדרות. ראו ״כיצד לקבוע העלאות קבצים ל S3?״ כדי ללמוד עוד.' + image_magick_warning: 'השרת מכוון ליצור צלמיות לתמונות גדולות, אבל ImageMagick לא מותקן. התקינו ImageMagick באמצעות מנהל החבילות האהוב עליכם או הורידו את הגרסה האחרונה.' + failing_emails_warning: 'יש %{num_failed_jobs} עבודות מייל שנכשלו. בידקו את app.yml שלכם כדי לוודא ששרת המייל מוגדר כיאות. ראו את העבודות שנכשלו ב Sidekiq.' + subfolder_ends_in_slash: "הגדרות תיקיית המשנה שלכם לא נכונות, הנתיב DISCOURSE_RELATIVE_URL_ROOT צריך להסתיים בלוכסן." + email_polling_errored_recently: + one: "ניסיונות שליחת מיילים יצרו תקלה ב 24 השעות האחרונות. צפו ביומנים לפרטים נוספים." + other: "ניסיונות שליחת מיילים יצרו %{count} תקלות ב 24 השעות האחרונות. צפו ביומנים לפרטים נוספים." + missing_mailgun_api_key: "השרת מכוון לשלוח מיילים באמצעות mailgun אבל לא סיפקתם מפתח API שמוודא את הודעות ה webhook." + bad_favicon_url: "ה favicon לא עולה. אנא בדקו את הגדרת ה favicon_url ב הגדרות האתר." + poll_pop3_timeout: "החיבור לשרת POP3 התנתק. דוא\"ל נכנס לא יכול להשלף ואינו מאוחזר. אנא בדקו את הגדרות ה-POP3 שלכם ואת ספק השירות." + poll_pop3_auth_error: "החיבור לשרת POP3 נכשל בשל שגיאת הזדהות. אנא בדקו את הגדרות ה-POP3 שלכם." site_settings: censored_words: "מלים שיוחלפו באופן אוטומטי ב- ■■■■" + censored_pattern: "ביטוי רגולרי שיוחלף אוטומטית עם ■■■■" delete_old_hidden_posts: "מחיקת אוטומטית של פרסומים מוסתרים שנותרים מוסתרים במשך יותר מ-30 יום." - default_locale: "The default language of this Discourse instance (ISO 639-1 Code)" - allow_user_locale: "Allow users to choose their own language interface preference" - min_post_length: "מספר התווים המותר כאורך מינימלי לפרסום הודעה" - min_first_post_length: "אורך מינימלי מותר לפרסום ראשון (בגוף הפרסום) בתווים " - min_private_message_post_length: "אורך הפרסום המינמלי המותר בתווים להודעות" - max_post_length: "מספר התווים המקסימלי כאורך הודעה." + default_locale: "שפת ברירת המחדל עבור אתר Discourse זה (קוד ISO 639-1)" + allow_user_locale: "אפשרו למשתמשים לבחור את הגדרות השפה שלהם בממשק המשתמש/ת" + set_locale_from_accept_language_header: "קבעו את שפת הממשק עבור משתמשים אנונימיים לפי השפה בדפדפן. (נ-י-ס-י-ו-נ-י, לא עובד עם cache אנונימי)" + min_post_length: "מספר התווים המותר כאורך מינימלי לפוסט" + min_first_post_length: "אורך מינימלי מותר לפוסט ראשון (בגוף הנושא) בתווים " + min_private_message_post_length: "אורך הפוסט המינימלי המותר בתווים להודעות" + max_post_length: "מספר התווים המקסימלי כאורך פוסט" + topic_featured_link_enabled: "איפשור של פרסום קישור עם נושאים." + show_topic_featured_link_in_digest: "הצגת קישור מומלץ של הנושא במייל התמצות." min_topic_title_length: "מספר התווים המינימלי הנדרש לכותרת נושא" max_topic_title_length: "מספר התווים המקסימלי המותר לכותרת נושא" min_private_message_title_length: "אורך הכותרת המנימילי המותר להודעה בתווים" min_search_term_length: "מספר התווים המינמלי התקין כאורך מונח לחיפוש" - allow_uncategorized_topics: "הרשה לפתוח נושאים ללא קטגוריה.\nאזהרה: אם יש נושאים ללא קטגוריה, יש לסדר אותם לפני שמבטלים את האופציה. " - allow_duplicate_topic_titles: "אשר/י נושאים עם כותרות זהות או משוכפלות." - unique_posts_mins: "How many minutes before a user can make a post with the same content again" - educate_until_posts: "כאשר המשתמש/ת מתחילים להקיש את (n) ההודעות הראשונות שלהם, הציגו פאנל הנחיה למשתמש באזור חיבור ההודעות." - title: "שם האתר הזה, כפי שהוא משתמש בתגית הכותרת." + search_tokenize_chinese_japanese_korean: "אלצו את החיפוש לנתח סינית/יפנית/קוריאנית גם באתרים שאינם בשפות אלו" + search_prefer_recent_posts: "אם חיפוש בפורום הגדול שלכם איטי, אופציה זו מנסה לאנדקס קודם כל את הפוסטים החדשים יותר" + search_recent_posts_size: "כמה פוסטים חדשים לשמור באינדקס" + allow_uncategorized_topics: "הרשה לפתוח נושאים ללא קטגוריה. אזהרה: אם יש נושאים ללא קטגוריה, יש לסדר אותם לפני שמבטלים את האופציה. " + allow_duplicate_topic_titles: "אשרו נושאים עם כותרות זהות או משוכפלות." + unique_posts_mins: "כמה דקות לפני שמשתמש יכול לפרסם את אותו תוכן שוב" + educate_until_posts: "כאשר המשתמש/ת מתחילים להקיש את (n) הפוסטים הראשונים שלהם, הציגו פאנל הנחיה למשתמש באזור חיבור הפוסטים." + title: "שם האתר הזה, כפי שהוא משמש בתגית הכותרת." site_description: "תארו את האתר הזה במשפט אחד, כפי שהוא מופיע במטא-תגית התיאור." - contact_email: "כתובת דוא\"ל של איש/אשת קשר האחראי לאתר זה. משמש להתראות חשובות, כמו סימונים שלא טופלו, כמו גם ליצירת קשר חירום בעמוד האודות." - contact_url: "כתובת URL ליצירת קשר לעמוד זה. משמשת בטופס ה-/אודות לעניינים דחופים." - queue_jobs: "DEVELOPER ONLY! WARNING! By default, queue jobs in sidekiq. If disabled, your site will be broken." + contact_email: "כתובת דוא\"ל של אנשי קשר האחראים לאתר זה. משמשת להתראות חשובות, כמו דגלים שלא טופלו, כמו גם ליצירת קשר בשעת חירום מעמוד האודות." + contact_url: "כתובת URL ליצירת קשר לעמוד זה. משמשת בטופס ה- /about לעניינים דחופים." + queue_jobs: "מפתחים בלבד! אזהרה! כברירת מחדל, שימו עבודות בתור sidekiq. אם מנוטרל, האתר שלכם ישבר." crawl_images: "אחזור תמונות מכתובת URL רחוקה כדי להכניס את מימדי האורך והרוחב הנכונים." download_remote_images_to_local: "המרת תמונות מרחוק לתמונות מקומיות באמצעות הורדות; למניעת שגיאות של תמונות חסרות" download_remote_images_threshold: "שטח האכסון המינימלי (באחוזים) הנדרש להורדת תמונות באופן מקומי" + download_remote_images_max_days_old: "לא להוריד תמונות מרוחקות עבור פוסטים בני יותר מ n ימים." disabled_image_download_domains: "תמונות מרחוק לעולם לא יורדו ממתחמים (domains) אלו. " - post_edit_time_limit: "העורכ/ת יכול לערות או למחקור את הפרסום שלהם במשך (0) דקות לאחר הפרסום. הזינו 0 כ\"תמיד\"." - edit_history_visible_to_public: "אפשרו לכולם לראות גרסאות קודמות של פרסום ערוך. כאשר אפשרות זו מנוטרלת, רק חברי צוות יכולים לצפות בהן." - delete_removed_posts_after: "פרסומים שהוסרו על ידי מחבריהם ימחקו באופן אוטומטי לאחר (n) שעות. אם הגדרה זו מכוונת ל-0, הפרסום ימחקו מיידית." - max_image_width: "הרוחב המקסימלי של תצוגת תמונה מוקטנת בפרסום" - max_image_height: "גובה מקסימלי של תצוגת תמונה מוקטנת בפרסום" - category_featured_topics: "Number of topics displayed per category on the /categories page. After changing this value, it takes up to 15 minutes for the categories page to update." + editing_grace_period: "ל (n) שניות לאחר פרסום, עריכה לא תיצור גרסה חדשה בהיסטוריית הפוסט." + post_edit_time_limit: "העורכים יכולים לערוך או למחוק את הפוסט שלהם במשך (n) דקות לאחר הפרסום. הזינו 0 כ\"תמיד\"." + edit_history_visible_to_public: "אפשרו לכולם לראות גרסאות קודמות של פוסט ערוך. כאשר אפשרות זו מנוטרלת, רק חברי צוות יכולים לצפות בהן." + delete_removed_posts_after: "פוסטים שהוסרו על ידי מחבריהם ימחקו באופן אוטומטי לאחר (n) שעות. אם הגדרה זו מכוונת ל-0, פוסטים ימחקו מיידית." + max_image_width: "הרוחב המקסימלי של תצוגת תמונה מוקטנת בפוסט" + max_image_height: "גובה מקסימלי של תצוגת תמונה מוקטנת בפוסט" + category_featured_topics: "מספר נושאים שמוצגים עבור כל קטגוריה בדף /categories. לאחר שינוי ערך זה, לוקח עד 15 דקות לדף הקטגוריות להתעדכן." show_subcategory_list: "הצגת רשימת תת-הקבוצות במקום רשימת הנושאים בעת הכניסה לקטגוריה." fixed_category_positions: "אם אפשרות זו מסומנת, תוכלו לארגן את הקטגוריות כך שיופיעו בסדר קבוע. אם האופציות אינן מסומנות, הקטגוריות יסודרו על פי סדר הפעילות שהתבצעה בהן." fixed_category_positions_on_create: "אם האפשרות תסומן, סדר הקטגוריות יוגדר בתפריט יצירת נושא (דורש fixed_category_positions)." - add_rel_nofollow_to_user_content: "הוספת התווית rel nofollow לכ תוכן ששודר על ידי המשתמש/ת, פרט לקישורים פנימיים (כולל דומיין הורה parent domains). אם תשנו אפשרות זו, עליכם \"לאפות מחדש\" את כל הפרסומים עם: \"rake posts:rebake\"" - exclude_rel_nofollow_domains: "A list of domains where nofollow should not be added to links. tld.com will automatically allow sub.tld.com as well. As a minimum, you should add the top-level domain of this site to help web crawlers find all content. If other parts of your website are at other domains, add those too." - post_excerpt_maxlength: "אורך מקסימלי של פרסום קטע / סיכום." - post_onebox_maxlength: "מספר תוים מקסימאלי מותר כאורך פרסום Discourse אחד בקופסא (oneboxed Discourse post)." - onebox_domains_whitelist: "רשימת מתחמים (דומיינים) מותרים לאריזה (oneboxing); על דומיינים אלה לתמוך ב-OpenGraph או ב-oEmbed. בדקו אותם ב-http://iframely.com/debug." - logo_url: "The logo image at the top left of your site, should be a wide rectangle shape. If left blank site title text will be shown." - logo_small_url: "The small logo image at the top left of your site, should be a square shape, seen when scrolling down. If left blank a home glyph will be shown." - favicon_url: "A favicon for your site, see http://en.wikipedia.org/wiki/Favicon, to work correctly over a CDN it must be a png" - mobile_logo_url: "The fixed position logo image used at the top left of your mobile site. Should be a square shape. If left blank, `logo_url` will be used. eg: http://example.com/uploads/default/logo.png" - apple_touch_icon_url: "Icon used for Apple touch devices. Recommended size is 144px by 144px." - notification_email: "הטופס: נעשה שימוש בכתובת הדוא\"ל כאשר שולחים את כל הודעות המערכת הנדרשות. כדי שהודעות הדוא\"ל יגיעו, המתחם (domain) המצויין כאן חייב לכלול SPF, DKIM ורשומות reverse PTR מוגדרים כהלכה." - email_custom_headers: "A pipe-delimited list of custom email headers" + add_rel_nofollow_to_user_content: "הוספת התווית rel nofollow לכל תוכן שפורסם על ידי המשתמש/ת, פרט לקישורים פנימיים (כולל מתחם הורה parent domains). אם תשנו אפשרות זו, עליכם לאפות מחדש את כל הפרסומים עם: \"rake posts:rebake\"" + exclude_rel_nofollow_domains: "רשימת דומיינים שלקישורים אליהם לא יתווסף nofollow. לדומיין tld.com אוטומטית יצטרף sub.tld.com גם כן. בתור מינימום, כדאי לכם להוסיף את הדומיין העליון של אתר זה, כדי להקל על זחלני רשת למצוא תוכן. אם חלקים אחרים של האתר שלכם נמצאים בדומיינים אחרים, הוסיפו אותם גם כן." + post_excerpt_maxlength: "אורך מקסימלי של קטע פוסט / סיכום." + show_pinned_excerpt_mobile: "הצגת קטע בנושאים נעוצים במבט ניידים." + show_pinned_excerpt_desktop: "הצגת קטע בנושאים נעוצים בתצוגת מחשב-שולחני." + post_onebox_maxlength: "מספר תוים מקסימאלי מותר כאורך פוסט Discourse אחד בקופסא (oneboxed Discourse post)." + onebox_domains_blacklist: "רשימת מתחמים (דומיינים) שלעולם לא יהיו Oneboxed." + max_oneboxes_per_post: "מספר מקסימלי של onebox-ים בפוסט." + logo_url: "תמונת הלוגו בפינה הימנית עליונה של המסך, אמורה להיות מלבנית רחבה. אם נשארת ריקה, תוצג כותרת האתר." + digest_logo_url: "תמונת הלוגו האלטרנטיבי שמשמשת בראש המיילים של הסיכום מאתרכם. אמורה להיות צורה מלבנית מוארכת. צריכה לא להיות תמונת SVG. אם נשאר ריק ייעשה שימוש ב `logo_url`." + logo_small_url: "תמונת לוגו קטנה בפינה הימנית עליונה של האתר, אמורה להיות ריבועית, נראית כאשר גוללים למטה. אם נשארת ריקה תוצג צלמית בית." + favicon_url: "צלמית favicon לאתר שלכם, ראו http://en.wikipedia.org/wiki/Favicon, כדי שתעבוד כמו שצריך עם CDN חייבת להיות png" + mobile_logo_url: "תמונת הלוגו הקבועה לצד ימין למעלה של האתר הנייד שלכם. אמורה להיות ריבועית. אם משאירים ריקה, ייעשה שימוש ב `logo_url`. למשל: http://example.com/uploads/default/logo.png" + apple_touch_icon_url: "אייקון שמשמש למכשירי טאץ׳ של אפל. גודל מומלץ 144 על 144 פיקסלים." + notification_email: "מאת: נעשה שימוש בכתובת מייל זו כאשר שולחים את כל הודעות המערכת הנדרשות. כדי שהודעות הדוא\"ל יגיעו, המתחם (domain) המצויין כאן חייב לכלול SPF, DKIM ורשומות reverse PTR מוגדרים כהלכה." + email_custom_headers: "רשימה מופרדת pipes (הסימון |) של כותרות מייל מותאמות אישית" email_subject: "התאמה עצמית של מבנה נושא למיילים סטנדרטיים. ראו:\nhttps://meta.discourse.org/t/customize-subject-format-for-standard-emails/20801" - summary_score_threshold: "הניקוד המינימלי הנדרש כדי שפרסום ייכלל ב\"סיכום נושא זה\"" - summary_posts_required: "מספר הפרסומים המנימאלי בנושא לפני שהאפשרות \"סיכום נושא זה\" תתאפשר" + force_https: "הכריחו את אתרכם להשתמש אך ורק ב HTTPS. אזהרה: אל תאפשרו זאת עד שתוודאו ש HTTPS מותקן ועובד ממש בכל המקרים! וידאתם את הגדרות ה CDN שלכם, כל שירותי ההתחברות, וכל הלוגואים / תלויות החיצוניים - כדי לוודא שכולם עובדים גם כן עם HTTPS?" + summary_score_threshold: "הניקוד המינימלי הנדרש כדי שפוסט ייכלל ב\"סיכום נושא זה\"" + summary_posts_required: "מספר הפוסטים המנימלי בנושא לפני שהאפשרות \"סיכום נושא זה\" תתאפשר" summary_likes_required: "מינימום הלייקים לנושא לפני שהאפשרות \"סיכום נושא זה\" תתאפשר" - summary_percent_filter: "כאשר משתמש/ת מקליקים על \"סיכום נושא זה\", הציגו את % o הפרסומים הראשונים" - summary_max_results: "מספר הפרסומים שיוחזרו באמצעות \"סיכום נושא זה\"" - enable_long_polling: "Message bus used for notification can use long polling" + summary_percent_filter: "כאשר משתמש/ת מקליקים על \"סיכום נושא זה\", הציגו את % הפוסטים הראשונים" + summary_max_results: "מספר הפוסטים שיוחזרו באמצעות \"סיכום נושא זה\"" + enable_private_messages: "הרשו למשתמשי רמת אמון 1 (ניתן להגדרה באמצעות רמת אמון מינימלית לשליחת הודעות) ליצור הודעות ולענות להודעות. שימו לב שהצוות תמיד יכול לשלוח הודעות, לא משנה מה." + enable_long_polling: "באס הודעות שמשמש להתראות יכול להשתמש בתשאול ארוך (long polling)" long_polling_base_url: "בסיס ה-URL שנמצא בשימוש עבור long polling (כאשר CDN מחזיר תוכן דינמי, זכרו להגדיר את ערך זה ל-Origin pull, דוגמת http://origin.site.com)" long_polling_interval: "כמות הזמן שהשרת צריך לחכות לפני שעונה ללקוחות, כאשר אין מידע לשליחה (משתמשים רשומים מחוברים למערכת בלבד)" polling_interval: "כאשר לא מבצעים תשאול ארוך (long polling), כל כמה זמן לקוחות מחוברים למערכת יבצעו poll, במילי-שניות" - anon_polling_interval: "How often should anonymous clients poll in milliseconds" + anon_polling_interval: "באיזו תכיפות לקוחות אנונימיים (anonymous clients) יבצעו תשאול (poll), במילי-שניות" background_polling_interval: "באיזו תכיפות צריכים לקוחות לבצע תשאול (poll) במילישניות (כאשר החלון נמצא ברקע)" - cooldown_minutes_after_hiding_posts: "מספר הדקות שמשתמש/ת חייבים לחכות לפני שהם יכולים לערוך פרסום מוסתר דרך סימון קהילתי" + flags_required_to_hide_post: "מספר דגלים שגורמים להסתרה אוטומטית של פוסט ולהודעה להשלח למשתמש (0 בשביל שלעולם לא יקרה)" + cooldown_minutes_after_hiding_posts: "מספר הדקות שמשתמשים חייבים לחכות לפני שהם יכולים לערוך פוסט שהוסתר בגלל דיגלול קהילתי" + max_topics_in_first_day: "הכמות המקסימלית של נושאים שמשתמשים מורשים ליצור ב 24 השעות הראשונות לאחר הפוסט הראשון שלהם" + max_replies_in_first_day: "הכמות המקסימלית של תגובות שמשתמשים מורשים ליצור ב 24 השעות הראשונות אחרי יצירת הפוסט הראשון שלהם" tl2_additional_likes_per_day_multiplier: "להגדיל את כמות הלייקים האפשרית ביום עבור tl2 (משתמש) באמצעות הכפלה במספר זה. " - tl3_additional_likes_per_day_multiplier: "להגדיל את כמות הלייקים האפשרית ביום עבור tl3 (רגיל) באמצעות הכפלה במספר זה. " + tl3_additional_likes_per_day_multiplier: "להגדיל את כמות הלייקים האפשרית ביום עבור רמת-אמון 3 (רגיל) באמצעות הכפלה במספר זה." tl4_additional_likes_per_day_multiplier: "להגדיל את כמות הלייקים האפשרית ביום עבור tl4 (מנהיג) באמצעות הכפלה במספר זה. " - notify_mods_when_user_blocked: "If a user is automatically blocked, send a message to all moderators." - flag_sockpuppets: "אם משתמש/ת חדשים מגיבים לנושא מכתובת IP זהה לזו של מי שהחל את הנושא, סמנו את הפרסומים של שניהם כספאם פוטנציאלי." + num_spam_flags_to_block_new_user: "אם פוסטים של משתמשים חדשים מקבלים כמות זו של דגלי ספאם מ num_users_to_block_new_user משתמשים אחרים, הסתירו את הפוסטים שלהם ומנעו מהם פרסומים בעתיד. 0 לניטרול." + num_users_to_block_new_user: "אם פוסטים של משתמשים חדשים מקבלים num_spam_flags_to_block_new_user דגלי ספאם מכמות זו של משתמשים שונים, הסתירו את הפוסטים שלהם ומנעו פרסומים עתידיים. 0 לניטרול." + num_tl3_flags_to_block_new_user: "אם פוסטים של משתמשים חדשים מקבלים כמות זו של דגלים מ num_tl3_users_to_block_new_user משתמשים שונים ברמת אמון 3, הסתירו את כל הפוסטים שלהם ומנעו פרסומים עתידיים. 0 לניטרול." + num_tl3_users_to_block_new_user: "אם פוסטים של משתמשים חדשים מקבלים num_tl3_flags_to_block_new_user דגלים מכמות זו של משתמשים ברמת אמון 3, הסתירו את הפוסטים שלהם ומנעו פרסומים עתידיים. 0 לניטרול." + notify_mods_when_user_blocked: "אם משתמש נחסם אוטומטית, שילחו הודעה לכל המנחים." + flag_sockpuppets: "אם משתמשים חדשים מגיבים לנושא מכתובת IP זהה לזו של מי שהחל את הנושא, סמנו את הפוסטים של שניהם כספאם פוטנציאלי." traditional_markdown_linebreaks: "שימוש בשבירת שורות מסורתית בסימון, מה שדורש שני רווחים עוקבים למעבר שורה." - post_undo_action_window_mins: "מספר הדקות בהן מתאפשר למשתמשים לבטל פעולות אחרות בפרסום (לייק, סימון, וכו')." + allow_html_tables: "אפשרו הכנסת טבלאות ב Markdown באמצעות תגיות HTML. התגיות TABLE, THEAD, TD, TR, TH יהיו ברשימה לבנה (מצריך אפייה מחדש של כל הפוסטים הישנים שכוללים טבלאות)" + post_undo_action_window_mins: "מספר הדקות בהן מתאפשר למשתמשים לבטל פעולות אחרות בפוסט (לייק, סימון, וכו')." must_approve_users: "על הצוות לאשר את כל המשתמשים החדשים לפני שהם מקבלים גישה לאתר. אזהרה: בחירה זו עבור אתר קיים תשלול גישה ממשתמשים קיימים שאינם מנהלים." - ga_universal_tracking_code: "Google Universal Analytics (analytics.js) tracking code code, eg: UA-12345678-9; see http://google.com/analytics" - ga_universal_domain_name: "Google Universal Analytics (analytics.js) domain name, eg: mysite.com; see http://google.com/analytics" - enable_noscript_support: "Enable standard webcrawler search engine support via the noscript tag" - allow_moderators_to_create_categories: "Allow moderators to create new categories" + pending_users_reminder_delay: "הודיעו למנחים אם משתמשים חדשים ממתינים לאישור למעלה מכמות זו של שעות. קבעו ל -1 כדי לנטרל התראות." + maximum_session_age: "משתמשים ישארו מחוברים ל n שעות מאז ביקורם האחרון" + ga_tracking_code: "מיושן: קוד גוגל אנליטיקס (ga.js) למעקב, כגון: UA-12345678-9ֿ; ראו http://google.com/analytics" + ga_domain_name: "מיושן: שם מתחם (דומיין) לגוגל אנליטיקס (ga.js), למשל: mysite.com; ראו http://google.com/analytics" + ga_universal_tracking_code: "קוד מעקב של (Google Universal Analytics (analytics.js, למשל: UA-12345678-9; ראו http://google.com/analytics" + ga_universal_domain_name: "שם המתחם של (Google Universal Analytics analytics.js), למשל: mysite.com; ראו http://google.com/analytics" + gtm_container_id: "מזהה קונטיינר של מנהל תגיות גוגל. למשל: GTM-ABCDEF" + enable_escaped_fragments: "נסיגה ל Ajax-Crawling API של גוגל אם לא מתגלה זחלן-רשת. ראו https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" + enable_noscript_support: "אפשרו תמיכה בזחלן רשת סטנדרטי של מנועי חיפוש באמצעות התג noscript" + allow_moderators_to_create_categories: "אפשרו למנחים ליצור קטגוריות חדשות" cors_origins: "מקורות שאפשר לבצע להם בקשות קרוס-דומיין (Cross origin requests). כל מקור צריך לכלול את התחילית http:// או https:// . משתנה הסביבה DISCOURCE_ENABLE_CORS חייב להיות true כדי לאפשר CORS." - top_menu: "החליטו אילו פריטים יופיעו בניווט עמוד הבית ובאיזה סדר לדוגמא |אחרונים|חדשים|קטגוריות|מובילים|נקראו|פורסמו|סימניות" - 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: "פריטי התפריט להסתרה כברירת מחדל בתפריט הפרסום, אלא אם כן נלחץ לחצן ההרחבה." - share_links: "החלט אילו פריטים יופיעו בתיבת השיתוף, ובאיזה סדר." - track_external_right_clicks: "Track external links that are right clicked (eg: open in new tab) disabled by default because it rewrites URLs" - site_contact_username: "שם משתמש/ת תקין ממנו ישלחו הודעות פרטיות. אם ישאר ריק חשבון ברירת המחדל של המערכת ישמש לכך." - send_welcome_message: "שלחו כל המשתמשים החדשים הודעת \"ברוכים הבאים\" פרטים עם הדרכה ראשונית כיצד להתחיל." - suppress_reply_directly_below: "אל תציגו את סך התגובות המצטבר בפרסום כאשר ישנה תגובה ישירה אחת לפרסום זה." - suppress_reply_directly_above: "אל תציגו את את אפשרות ההרחבה \"בתגובה ל..\" לפרסום כאשר יש רק תגובה אחת ישירה מעל לפרסום זה." - suppress_reply_when_quoting: "אל תציגו את הפרסום המקורי בפרסומים שמצטטים תגובות" + use_admin_ip_whitelist: "מנהלים יכולים להתחבר רק אם הכתובת שלהם מופיע ברשימת ה IPs המסוננים (ניהול > לוגים > כתובות IP מסוננות)." + top_menu: "החליטו אילו פריטים יופיעו בניווט עמוד הבית ובאיזה סדר לדוגמה |אחרונים|חדשים|קטגוריות|מובילים|נקראו|פורסמו|סימניות" + post_menu: "החליטו אילו פריטים מופיעים בתפריט הפוסט, ובאיזה סדר. למשל like|edit|flag|delete|share|bookmark|reply" + post_menu_hidden_items: "פריטי התפריט להסתרה כברירת מחדל בתפריט הפוסט, אלא אם כן נלחץ לחצן ההרחבה." + share_links: "החליטו אילו פריטים יופיעו בתיבת השיתוף, ובאיזה סדר." + track_external_right_clicks: "עקבו אחר קישורים חיצוניים שעליהם נלחץ הכפתור הימני (למשל: פתיחה בטאב חדש) מנוטרל כברירת מחדל כיוון שזה כותב מחדש URLs" + site_contact_username: "שם משתמש/ת תקין של איש צוות ממנו ישלחו כל ההודעות אוטומטיות. אם ישאר ריק חשבון ברירת המחדל של המערכת ישמש לכך." + send_welcome_message: "שלחו לכל המשתמשים החדשים הודעת \"ברוכים הבאים\" עם הדרכה ראשונית כיצד להתחיל." + suppress_reply_directly_below: "אל תציגו את סך התגובות המצטבר בפוסט כאשר ישנה תגובה ישירה אחת לפוסט זה." + suppress_reply_directly_above: "אל תציגו את את אפשרות ההרחבה \"בתגובה ל..\" לפוסט כאשר יש רק תגובה אחת ישירה מעל לפוסט זה." + suppress_reply_when_quoting: "אל תציגו את הפוסט המקורי בפרסומים שמצטטים תגובות" max_reply_history: "מספר התגובות המקסימלי להרחבה כאשר מרחיבים \"בתגובה ל\"" - topics_per_period_in_top_summary: "מספר הנושאים המוצגים בבריכת המחדל של סיכום הנושאים." + topics_per_period_in_top_summary: "מספר הנושאים המוצגים בברירת המחדל של סיכום הנושאים." topics_per_period_in_top_page: "מספר הנושאים הראשונים המוצגים בתצוגה המורחבת של \"הצג עוד\"." redirect_users_to_top_page: "כוון באופן אוטומטי משתמשים חדשים וכאלה שנעדרו במשך זמן לראש העמוד." - show_email_on_profile: "הצגת כתובת הדוא\"ל של המשתמש/ת בעמוד הפרופיל שלהם (גלוי רק להם ולצוות)" - email_token_valid_hours: "סיסמאות שכחת סיסמא / הפעלת חשבון תקפים במשך (n) שעות." - email_token_grace_period_hours: "סיסמאות שכחת סיסמא / הפעלת חשבון עדיין זמינים לזמן חסד של (n) שעות לאחר שהופקו." - enable_badges: "הפעלת מערכת התגים (badges)" - enable_whispers: "הודעות פרטיות בין חברי הצוות אפשריות בתוך הפוסט (בנסיון)." + top_page_default_timeframe: "ברירת מחדל של פרק זמן להצגה בדף המובילים." + show_email_on_profile: "הצגת כתובת הדוא\"ל של המשתמשים בעמוד הפרופיל שלהם (גלוי רק להם ולצוות)" + prioritize_username_in_ux: "הציגו שם-משתמש ראשון בדף המשתמש, כרטיס המשתמש ופוסטים (כשמנוטרל השם מופיע קודם)" + email_token_valid_hours: "סיסמאות שכחת סיסמה / הפעלת חשבון תקפים במשך (n) שעות." + enable_badges: "הפעלת מערכת העיטורים" + enable_whispers: "אפשרו לצוות לקיים תקשורת פרטית בתוך נושאים." allow_index_in_robots_txt: "פרטו ב-robots.txt שלאתר זה מותר להיות מאונדקס על ידי מנועי חיפוש." - email_domains_blacklist: "A pipe-delimited list of email domains that users are not allowed to register accounts with. Example: mailinator.com|trashmail.net" - email_domains_whitelist: "A pipe-delimited list of email domains that users MUST register accounts with. WARNING: Users with email domains other than those listed will not be allowed!" - log_out_strict: "בהתנתקות, נתקו את כל ההפעלות של המשתמ/ת בכל המכשירים" - version_checks: "שלחו פינג להאב של Discourse לעדכוני גרסה וכדי להציג מסרים אודות גרסאות בלוח התצוגה של האדמין" - new_version_emails: "שלחו דוא\"ל לכתובת של contact_email כשגרסא חדשה של Discourse זמינה." - port: "DEVELOPER ONLY! WARNING! Use this HTTP port rather than the default of port 80. Leave blank for default of 80." - force_hostname: "DEVELOPER ONLY! WARNING! Specify a hostname in the URL. Leave blank for default." - invite_expiry_days: "How long user invitation keys are valid, in days" - invite_passthrough_hours: "כמה זמן, בשעות, יכול/ה משתמשים לעשות שימוש בהזמנה שנשלחה כדי להתחבר " - invite_only: "הרשמה פתוחה מבוטלת, על כל המשתמשים החדשים להיות מוזמנים על ידי חבר/ת בצוות." + email_domains_blacklist: "רשימה מופרדת בצינור (pipe) של דומיינים של אימייל אשר מהם משתמשים לא מורשים לרשום חשבונות. למשל: mailinator.com|trashmail.net" + email_domains_whitelist: "רשימה מופרדת בצינור (pipe) אשר ר-ק ממנה משתמשים יכולים לרשום חשבונות. א-ז-ה-ר-ה: משתמשים עם אימיילים מדומיינים אחרים לא יורשו!" + forgot_password_strict: "אל תיידעו משתמשים בנוגע לקיום חשבון כשהם משתמשים באפשרות של ״שכחתי סיסמה״." + log_out_strict: "בהתנתקות, נתקו את כל ההפעלות של המשתמש/ת בכל המכשירים" + version_checks: "שלחו פינג להאב של Discourse לעדכוני גרסה וכדי להציג מסרים אודות גרסאות בלוח התצוגה ב /admin" + new_version_emails: "שלחו דוא\"ל לכתובת של contact_email כשגרסה חדשה של Discourse זמינה." + port: "מ-פ-ת-ח-י-ם ב-ל-ב-ד! א-ז-ה-ר-ה! התמשו בפורט זה ל HTTP במקום בפורט 80. השאירו ריק בשביל ברירת המחדל פורט 80." + force_hostname: "מ-פ-ת-ח-י-ם ב-ל-ב-ד! א-ז-ה-ר-ה! הגדירו שם שרת ב URL. השאירו ריק בשביל ברירת המחדל." + invite_expiry_days: "מה התוקף מפתחות הזמנת משתמשים, בימים" + invite_passthrough_hours: "כמה זמן, בשעות, יכולים משתמשים לעשות שימוש בהזמנה שנשלחה כדי להתחבר " + invite_only: "הרשמה פומבית מנוטרלת, כל המשתמשים החדשים חייבים להיות מוזמנים על ידי חברים אחרים באתר." login_required: "דרשו הזדהות לקריאת תוכן באתר זה, אל תאפשרו גישה אנונימית." - min_username_length: "אורך שם משתמש מינימילי בתווים. " + min_username_length: "אורך שם משתמש מינימילי בתווים." max_username_length: "אורך שם משתמש מקסימלי בתווים." - reserved_usernames: "שמות משתמש שלא ניתן להירשם איתם." - min_password_length: "Minimum password length." + reserved_usernames: "שמות משתמשים שלא ניתן להירשם איתם." + min_password_length: "אורך סיסמה מינימלי." + min_admin_password_length: "אורך סיסמה מינימלית לאדמיניסטרטור." block_common_passwords: "אל תאפשרו סיסמאות מתוך 10,000 הסיסמאות הנפוצות ביותר." - enable_sso: "Enable single sign on via an external site (WARNING: USERS' EMAIL ADDRESSES *MUST* BE VALIDATED BY THE EXTERNAL SITE!)" + enable_sso: "אפשרו התחברות יחידה (Single Sign On) באמצעות אתר חיצוני (א-ז-ה-ר-ה: כתובות המייל של משתמשים *חייבות* לעבור אימות על ידי אתר חיצוני!)" + verbose_sso_logging: "רישום יומנים מפורטים בנוגע לדיאגנוסטיקות SSO ל /logs" enable_sso_provider: "הטמיעו את פרוטוקול הספק Discourse SSO בנקודת הקצה /session/sso_provider, דורש כיוון של sso_secret" + sso_url: "URL of single sign on endpoint (must include http:// or https://)" sso_secret: "מחרוזת סודית המשמשית לאמת באופן קרפיטוגרפי מידע SSO, וודאו שהיא באורך 10 תווים ומעלה" - sso_overrides_email: "Overrides local email with external site email from SSO payload on every login, and prevent local changes. (WARNING: discrepancies can occur due to normalization of local emails)" - sso_overrides_username: "Overrides local username with external site username from SSO payload on every login, and prevent local changes. (WARNING: discrepancies can occur due to differences in username length/requirements)" - sso_overrides_name: "Overrides local full name with external site full name from SSO payload on every login, and prevent local changes." - sso_overrides_avatar: "מעקף אווטאר של משתמש בעזרת אווטר אתרחיצוני מ-SSO Payload. אם אפשרות זו מופעלת, מומלץ מאוד לבטל את האפשרות להעלאת אווטר." - sso_not_approved_url: "Redirect unapproved SSO accounts to this URL" - enable_local_logins: "אפשרו שם חשבונות מבוססים על שן משתמש מקומי וסיסמאת התחברות. (שימו לב: אפשרות זו חייבת להיות מותרת כדי שהזמנות להצטרפות יפעלו)" + sso_overrides_bio: "דורס ביוגרפיה של משתמשים בפרופיל המשתמש ומונע מהם מלשנות אותה" + sso_overrides_email: "דורס מייל מקומי עם אתר מייל חיצוני מתוכן SSO בכל התחברות, ומונע שינויים מקומיים. (אזהרה: אי-התאמות עלולות להתרחש בעקבות נורמליזציה של מיילים מקומיים)" + sso_overrides_username: "דורס שם משתמש מקומי עם שם משתמש של אתר חיצוני מתוכן SSO בכל התחברות, ומונע שינויים מקומיים. (אזהרה: אי-התאמות עלולות להתרחש בעקבות הבדלים בדרישות אורך לגבי שמות משתמשים)" + sso_overrides_name: "דורס שם מלא מקומי עם שם מלא מאתר חיצוני מתוכן SSO בכל התחברות, מונע שינויים מקומיים." + sso_overrides_avatar: "מעקף אווטאר של משתמש בעזרת אווטר אתר חיצוני מ-SSO Payload. אם אפשרות זו מופעלת, מומלץ מאוד לבטל את האפשרות להעלאת אווטר." + sso_not_approved_url: "SSO של חשבונות שלא אושרו יופנו ל URL זה" + sso_allows_all_return_paths: "אל תגבילו את שמות המתחם של נתיבי החזרה (return_paths) שניתנים על ידי ה-SSO (כברירת מחדל, נתיבי החזרה חייבים להיות באתר הנוכחי)" + enable_local_logins: "אפשרו התחברות שמבוססת על שמות משתמשים וסיסמאות מקומיים. (שימו לב: אפשרות זו חייבת להיות מותרת כדי שהזמנות להצטרפות יפעלו)" allow_new_registrations: "אפשרו הרשמות משתמשים חדשים. בטלו סימון זה כדי למנוע יצירת חשבונות חדשים." - enable_yahoo_logins: "Enable Yahoo authentication" - enable_google_oauth2_logins: "אפשרו הזדהות באמצעות Oauth2 של גוגל. זהו מנגנון ההזדהות שנתמך כרגע על ידי גוגל. דורש מפתח וסיסמא." + enable_signup_cta: "הציגו מודעה למשתמשים אנונימיים חוזרים שמציעה להם להרשם כדי לקבל חשבון." + enable_yahoo_logins: "איפשור אימות של Yahoo" + enable_google_oauth2_logins: "אפשרו הזדהות באמצעות Oauth2 של גוגל. זהו מנגנון ההזדהות שנתמך כרגע על ידי גוגל. דורש מפתח וסיסמה." google_oauth2_client_id: "זהות לקוח (Client ID) של אפליקציית ה-Google שלך." google_oauth2_client_secret: "קוד סודי של לקוח (client secret) של אפליקציית Google." - enable_twitter_logins: "Enable Twitter authentication, requires twitter_consumer_key and twitter_consumer_secret" - twitter_consumer_key: "Consumer key for Twitter authentication, registered at http://dev.twitter.com" - twitter_consumer_secret: "Consumer secret for Twitter authentication, registered at http://dev.twitter.com" - enable_facebook_logins: "Enable Facebook authentication, requires facebook_app_id and facebook_app_secret" - facebook_app_id: "App id for Facebook authentication, registered at https://developers.facebook.com/apps" - facebook_app_secret: "App secret for Facebook authentication, registered at https://developers.facebook.com/apps" - enable_github_logins: "Enable Github authentication, requires github_client_id and github_client_secret" - github_client_id: "Client id for Github authentication, registered at https://github.com/settings/applications" - github_client_secret: "Client secret for Github authentication, registered at https://github.com/settings/applications" - allow_restore: "אפשר שחזור, אשר יכול להחליף את כל(!) המידע באתר! הותירו על \"שלילי\"/false אלא אם כן אתם מתכננים לשחזר גיבוי." - maximum_backups: "The maximum amount of backups to keep on disk. Older backups are automatically deleted" + enable_twitter_logins: "אפשרו אימות Twitter, מצריך twitter_consumer_key ו twitter_consumer_secret" + twitter_consumer_key: "מפתח לשימוש באימות Twitter, רשום ב http://dev.twitter.com" + twitter_consumer_secret: "סוד לשימוש באימות Twitter, רשום ב http://dev.twitter.com" + enable_instagram_logins: "אפשרו אימות אינסטגרם, מצריך instagram_consumer_key ו instagram_consumer_secret" + instagram_consumer_key: "מפתח לאימות אינסטגרם" + instagram_consumer_secret: "סוד לאימות אינסטגרם" + enable_facebook_logins: "איפשור אימות פייסבוק, מצריך facebook_app_id ו facebook_app_secret" + facebook_app_id: "מזהה אפליקציה לאימות פייסבוק, רשום ב https://developers.facebook.com/apps" + facebook_app_secret: "סוד אפליקציה לאימות פייסבוק, רשום ב https://developers.facebook.com/apps" + facebook_request_extra_profile_details: "בקשת מידע לגבי \"אודות\", מיקום, ואתר אינטרנט מפייסבוק. (מצריך שאפליקציית האימות שלכם תאושר על ידי פייסבוק)" + enable_github_logins: "אפשור אימות Github, מצריך github_client_id ו github_client_secret" + github_client_id: "מזהה לקוח לאימות Github, רשום ב https://github.com/settings/applications" + github_client_secret: "סוד לקוח לאימות Github, רשום ב https://github.com/settings/applications" + readonly_mode_during_backup: "אפשרו מצב של קריאה בלבד בזמן גיבוי" + allow_restore: "אפשר שחזור, אשר יכול להחליף את כל(!) המידע באתר! הותירו על \"שלילי\" (false) אלא אם כן אתם מתכננים לשחזר גיבוי." + maximum_backups: "המספר המקסימלי של גיבויים לשמירה על הכונן. גיבויים ישנים יותר ימחקו אוטומטית" automatic_backups_enabled: "הרץ גיבויים אוטומטים כמו שמוגדר בתדירות הגיבויים" - backup_frequency: "How frequently we create a site backup, in days." + backup_frequency: "באיזו תכיפות אנחנו מגבים את האתר, בימים." enable_s3_backups: "העלאת גיבויים ל-S3 לאחר השלמתם. חשוב: דורש הזנת הרשאות S3 תקפות להגדרות הקבצים." - s3_backup_bucket: "The remote bucket to hold backups. WARNING: Make sure it is a private bucket." - backup_time_of_day: "הגדרת זמן לגיבוי בפורמט UTC." - active_user_rate_limit_secs: "How frequently we update the 'last_seen_at' field, in seconds" + s3_backup_bucket: "הדלי המרוחק שבו לשמור גיבויים. אזהרה: שימו לב שהוא דלי פרטי." + s3_disable_cleanup: "בטלו את ההסרה של גיבויים מ S3 כאשר הם מוסרים מקומית." + backup_time_of_day: "הגדרת זמן לגיבוי לפי UTC." + backup_with_uploads: "כללו העלאות בגיבויים התקופתיים. ביטול של אפשרות זו תגבה רק את בסיס הנתונים." + active_user_rate_limit_secs: "כל כמה זמן אנחנו מעדכנים את השדה 'last_seen_at', בשניות" verbose_localization: "הצגת טיפים מורחבים של לוקליזציה בממשק המשתמש." - previous_visit_timeout_hours: "How long a visit lasts before we consider it the 'previous' visit, in hours" + previous_visit_timeout_hours: "כמה זמן ביקור נארך לפני שהוא נחשב הביקור ה״קודם״, בשעות" + top_topics_formula_log_views_multiplier: "מכפיל של לוג כמות הצפיות (n) בנוסחת הנושאים המובילים: `log(views_count) * (n) + op_likes_count * 0.5 + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_first_post_likes_multiplier: "מכפיל של לייקים על הפוסט הראשון (n) בנוסת הנושאים המובילים: `log(views_count) * 2 + op_likes_count * (n) + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_least_likes_per_post_multiplier: "מכפיל של כמות לייקים מינימלית לפוסט (n) בנוסחת הנושאים המובילים: `log(views_count) * 2 + op_likes_count * 0.5 + LEAST(likes_count / posts_count, (n)) + 10 + log(posts_count)`" + rebake_old_posts_count: "מספר הפוסטים הישנים לאפייה מחדש בכל 15 דקות." rate_limit_create_topic: "לאחר יצירת נושא, על המשתמשים להמתין (n) שניות לפני יצירת נושא אחר." - rate_limit_create_post: "לאחר הפרסום על המשתמשים להמתין (n) שניות לפני יצירת פרסום חדש." + rate_limit_create_post: "לאחר הפרסום על המשתמשים להמתין (n) שניות לפני יצירת פוסט חדש." rate_limit_new_user_create_topic: "לאחר יצירת נושא, משתמשים חדשים יחוייבו לחכות (n) שניות לפני שיוכלו ליצור נושא אחר." - rate_limit_new_user_create_post: "לאחר פרסום, משתמשים חדשים יחוייבו לחכות (n) שניות לפני שיוכלו ליצור פרסום אחר." - max_likes_per_day: "מספר מקסימלי של likes למשתמש/ת ביום." - max_flags_per_day: "מספר מקסימלי של סימונים.מותרים למשתמש/ת ביום." - max_bookmarks_per_day: "מספר מקסימלי של סימניות למשתמש/ת ביום." - max_edits_per_day: "מספר עריכות מקסימלי מותר למשתמש ליום." - max_topics_per_day: "מספר מקסימלי של נושאים שמשתמש/ת יכולים ליצור ביום." - max_private_messages_per_day: "מספר מקסימלי של הודעות שמשתמש/ת יכולים ליצור ביום." - max_invites_per_day: "מספר מקסימלי של הזמנות שיכולים משתמש/ת לשלוח ביום." - max_topic_invitations_per_day: "מספר מירבי של הזמנות לנושא שמשתמש יכול לשלוח ביום. " + rate_limit_new_user_create_post: "לאחר פרסום, משתמשים חדשים יחוייבו לחכות (n) שניות לפני שיוכלו ליצור פוסט אחר." + max_likes_per_day: "מספר מקסימלי של לייקים למשתמש/ת ביום." + max_flags_per_day: "מספר מקסימלי של דגלים מותרים למשתמשים ביום." + max_bookmarks_per_day: "מספר מקסימלי של סימניות למשתמשים ביום." + max_edits_per_day: "מספר עריכות מקסימלי מותר למשתמשים ליום." + max_topics_per_day: "מספר מקסימלי של נושאים שמשתמשים יכולים ליצור ביום." + max_private_messages_per_day: "מספר מקסימלי של הודעות שמשתמשים יכולים ליצור ביום." + max_invites_per_day: "מספר מקסימלי של הזמנות שיכולים משתמשים לשלוח ביום." + max_topic_invitations_per_day: "מספר מירבי של הזמנות לנושא שמשתמשים יכולים לשלוח ביום. " + alert_admins_if_errors_per_minute: "מספר השגיאות בדקה לפני ששולחים התראה למנהל. ערך של 0 מנטרל אפשרות זו. שימו לב: מצריך הרצה מחדש." + alert_admins_if_errors_per_hour: "מספר השגיאות בשעה לפני ששולחים התראה למנהל. ערך של 0 מנטרל אפשרות זו. שימו לב: מצריך הרצה מחדש." + categories_topics: "מספר נושאים להצגה בדף /categories." suggested_topics: "מספר הנושאים המוצעים שיופיעו בתחתית הנושא המוצג." limit_suggested_to_category: "הצגת רק נושאים מהקטגוריה הנוכחית ברשימת הנושאים המומלצים." + suggested_topics_max_days_old: "נושאים מוצעים לא אמורים להיות בני יותר מ n ימים." clean_up_uploads: "הסירו העלאות יתומות וללא הפניה כדי למנוע אירוח בלתי חוקי של חומר. אזהרה: אתם עלולי לרצות לגבות את תיקיית ה-/uploads שלכם לפנו שתאפשרו הגדרה זו." - clean_orphan_uploads_grace_period_hours: "Grace period (in hours) before an orphan upload is removed." - purge_deleted_uploads_grace_period_days: "Grace period (in days) before a deleted upload is erased." - purge_unactivated_users_grace_period_days: "תקופת חסד (בימים) לפני שמשתמש/ת שלא הפעילו את חשבונם ימחקו." + clean_orphan_uploads_grace_period_hours: "תקופת חסד (בשעות) לפני שהעלאות יתומות מוסרות." + purge_deleted_uploads_grace_period_days: "תקופת חסד (בימים) לפני שהעלאה שהוסרה תמחק." + purge_unactivated_users_grace_period_days: "תקופת חסד (בימים) לפני שמשתמשים שלא הפעילו את חשבונם ימחקו." enable_s3_uploads: "אחסן העלאות (uploads) על תשתית של Amazon S3. חשוב: מצריך מפתח גישה + מפתח גישה סודי שיהיו חוקיים." s3_use_iam_profile: 'השתמש ב-AWS EC2 IAM role על מנת לאחזר מפתחות. שימו לב: איפשור של זה ידרוס את ההגדרות "S3 access key id" וכן את "s3 secret access key".' - s3_upload_bucket: "השם של Amazon S3 bucket אליו יועלו קבצים. אזהרה: שם זה חייב להיות באותיות קטנות, ללא נקודות וללא קווים תחתונים." + s3_upload_bucket: "שם של Amazon S3 bucket אליו יועלו קבצים. אזהרה: שם זה חייב להיות באותיות קטנות, ללא נקודות וללא קווים תחתונים." s3_access_key_id: "מפתח הגישה (access key id) של Amazon S3 שישמש להעלאת התמונות." s3_secret_access_key: "מפתח הגישה הסודי (secret access key) של Amazon S3 שישמש להעלאת תמונות." s3_region: "שם האזור (region name) של Amazon S3 שישמש להעלאת תמונות." - s3_cdn_url: "The CDN URL to use for all s3 assets (for example: https://cdn.somewhere.com). WARNING: after changing this setting you must rebake all old posts." - avatar_sizes: "רשימה של גדלי אווטרים שנוצרת אוטומטית. " - external_system_avatars_enabled: "Use external system avatars service." - default_opengraph_image_url: "כתובת של תמונת opengraph בברירת המחדל." - enable_flash_video_onebox: "אפשרו הטמעת קישורי swf ו-flv (פלאש של אדובי) בפרסומים. אזהרה: עלול להביא לבעיות בטיחות באתר." - default_invitee_trust_level: "ברירת מחדל של דרגת אמון (0-4) של משתמשים מוזמנים." - default_trust_level: "Default trust level (0-4) for all new users. WARNING! Changing this will put you at serious risk for spam." - tl1_requires_topics_entered: "כמה נושאים משתמש חדש צריך להתחיל למערכת עד שישודרג לרמת אמון 1." - tl1_requires_read_posts: "כמה פרסומים משתמש צריך לקרוא לפני שישודרג לרמת אמון 1." - tl1_requires_time_spent_mins: "כמה דקות משתמש חדש צריך לקרוא פרסומים לפני שישודרג לרמת אמון 1." - tl2_requires_topics_entered: "כמה נושאים משתמש חדש צריך להתחיל עד שישודרג לרמת אמון 2." - tl2_requires_read_posts: "כמה פרסומים משתמש צריך לקרוא לפני שישודרג לרמת אמון 2." - tl2_requires_time_spent_mins: "כמה דקות משתמש חדש צריך לקרוא פרסומים לפני שישודרג לרמת אמון 2." - tl2_requires_days_visited: "כמה ימים שונים משתמש צריך לבקר באתר לפני שישודרג לרמת אמון 2." - tl2_requires_likes_received: "כמה \"לייקים\" משתמש צריך לקבל לפני שישודרג לרמת אמון 2." - tl2_requires_likes_given: "כמה לייקים משתמש צריך לתת לפני שישודרג לרמת אמון 2." - tl2_requires_topic_reply_count: "בכמה נושאים משתמש צריך לענות לפני שישודרג לרמת אמון 2." - tl3_requires_topics_viewed_all_time: "מספר מינימלי של נושאים שמשתמש צריך לעיין בהם על מנת שיתאפשר לו להיות משודרג לרמת אמון 3." - tl3_requires_posts_read_all_time: "מספר מינימלי של פרסומים שמשתמש קרא על מנת שיוכל להיות משודרג לרמת אמון 3." - tl3_promotion_min_duration: "מספר הימים המינימלי ששדרוג לרמת אמון 3 תארך לפני שמשתמש יורד בדרגה לרמת אמון 2." + s3_cdn_url: "CDN URL לכל ה assets ב s3 (למשל: https://cdn.somewhere.com). א-ז-ה-ר-ה: לאחר שינוי של הגדרה זו עליכם לאפות מחדש את כל הפוסטים הישנים." + avatar_sizes: "רשימה של גדלי דמויות שנוצרת אוטומטית." + external_system_avatars_enabled: "שימוש בשירות של מערכת אווטארים חיצונית." + external_system_avatars_url: "כתובת של שירות דמויות חיצוני. החלפות מותרות הן {username} {first_letter} {color} {size}" + default_opengraph_image_url: "URL ברירת המחדל של תמונת opengraph." + twitter_summary_large_image_url: "URL של תמונה מסיכום ברירת המחדל מטוויטר (צריכה להיות ברוחב לפחות 280 פיקסלים ובגובה של לפחות 150 פיקסלים)." + allow_all_attachments_for_group_messages: "אפשרו צירוף קבצים להודעות לקבוצות." + convert_pasted_images_to_hq_jpg: "המירו תמונות מודבקות לקבצי JPG באיכות גבוהה." + convert_pasted_images_quality: "איכות של קובץ ה JPG המומר (1 זו האיכות הנמוכה ביותר, 100 הטובה ביותר)." + enable_flash_video_onebox: "אפשרו הטמעת קישורי swf ו-flv (פלאש של אדובי) ב Oneboxes. אזהרה: עלול להביא לבעיות אבטחה באתר." + default_invitee_trust_level: "ברירת מחדל של רמת אמון (0-4) של משתמשים מוזמנים." + default_trust_level: "רמת אמון (0-4) לכל המשתמשים החדשים. אזהרה! שינוי של משתנה זה שם אתכם בסיכון רציני לספאם." + tl1_requires_topics_entered: "כמה נושאים משתמשים חדשים צריכים להתחיל עד שישודרגו לרמת אמון 1." + tl1_requires_read_posts: "כמה פוסטים משתמשים צריכים לקרוא לפני שישודרגו לרמת אמון 1." + tl1_requires_time_spent_mins: "כמה דקות משתמשים חדשים צריכים לקרוא פוסטים לפני שישודרגו לרמת אמון 1." + tl2_requires_topics_entered: "כמה נושאים משתמשים חדשים צריכים להתחיל עד שישודרגו לרמת אמון 2." + tl2_requires_read_posts: "כמה פוסטים משתמשים צריכים לקרוא לפני שישודרגו לרמת אמון 2." + tl2_requires_time_spent_mins: "כמה דקות משתמשים חדשים צריכים לקרוא פוסטים לפני שישודרגו לרמת אמון 2." + tl2_requires_days_visited: "כמה ימים שונים משתמשים צריכים לבקר באתר לפני שישודרגו לרמת אמון 2." + tl2_requires_likes_received: "כמה \"לייקים\" משתמשים צריכים לקבל לפני שישודרגו לרמת אמון 2." + tl2_requires_likes_given: "כמה לייקים משתמשים צריכים לתת לפני שישודרגו לרמת אמון 2." + tl2_requires_topic_reply_count: "בכמה נושאים משתמשים צריכים לענות לפני שישודרגו לרמת אמון 2." + tl3_time_period: "דרישות פרק זמן של רמת אמון 3 (בימים)" + tl3_requires_days_visited: "מספר מינימלי של ימים שמשתמש צריך לבקר באתר ב (תקופת זמן רמת-אמון-3) הימים האחרונים כדי להיות מועמד לקידום לרמת אמון 3. קבעו ליותר מתקופת זמן של רמת-אמון-3 כדי לנטרל קידום ל רמת-אמון-3. (0 או יותר)." + tl3_requires_topics_replied_to: "מספר מינימלי של נושאים שמשתמש צריך להגיב עליהם ב (תקופת זמן רמת-אמון-3) הימים האחרונים כדי להיות מועמד לקידום לרמת אמון 3. (0 או יותר)" + tl3_requires_topics_viewed: "אחוז הנושאים שנוצרו במהלך (תקופת זמן רמת-אמון-3) הימים האחרונים שמשתמש צריך לצפות בהם כדי שיוכל להיות מועמד לקידום לרמת אמון 3. (0 עד 100)" + tl3_requires_topics_viewed_cap: "המספר המקסימלי הנדרש של נושאים לצפייה ב (תקופת זמן רמת-אמון-3) הימים האחרונים." + tl3_requires_posts_read: "אחוז הנושאים שנוצרו ב (תקופת זמן רמת-אמון-3) הימים האחרונים שעל משתמש לצפות בהם כדי להיות מועמד לרמת אמון 3. (0 עד 100)" + tl3_requires_posts_read_cap: "המספר המקסימלי הנדרש של פוסטים לקריאה ב (תקופת זמן רמת-אמון-3) הימים האחרונים." + tl3_requires_topics_viewed_all_time: "מספר מינימלי של נושאים שמשתמשים צריכים לעיין בהם על מנת שיתאפשר להם להיות משודרגים לרמת אמון 3." + tl3_requires_posts_read_all_time: "מספר מינימלי של פוסטים שמשתמשים קראו על מנת שיוכלו להיות משודרגים לרמת אמון 3." + tl3_requires_max_flagged: "אסור שלמשתמש ידוגלו למעלה מ x פוסטים על ידי x משתמשים שונים ב (תקופת זמן רמת-אמון-3) הימים האחרונים כדי להיות מועמד לקידום לרמת אמון 3, כאשר x הוא ערך ההגדרה. (0 או יותר)" + tl3_promotion_min_duration: "מספר הימים המינימלי ששדרוג לרמת אמון 3 אורך לפני שניתן להוריד משתמשים בדרגה בחזרה לרמת אמון 2." + tl3_requires_likes_given: "המספר המינימלי של לייקים שצריכים להנתן ב (תקופת זמן רמת-אמון-3) הימים האחרונים כדי להיות מועמד לקידום לרמת אמון 3." + tl3_requires_likes_received: "המספר המינימלי של לייקים שחייבים להתקבל ב (תקופת זמן רמת-אמון-3) הימים האחרונים כדי להיות מועמדים לקידום לרמת אמון 3." tl3_links_no_follow: "מניעת הסרת rel=nofollow מקישורים שמפורסמים על ידי משתמשים ברמת אמון 3." - min_trust_to_create_topic: "The minimum trust level required to create a new topic." - min_trust_to_edit_wiki_post: "דרגת האמון המינימלי הנדרשת כדי לערוך פרסום שמסומן כ-wiki." - newuser_max_links: "כמה קישורים יכול/ה משתמש/ת חדשים להוספים לפרסום." - newuser_max_images: "כמה תמונות יכול/ה משתמש/ת להוסיף לפרסום." - newuser_max_attachments: "כמה קבצים מצורפים יכולים משתמש/ת חדשים להוסיף לפרסום." - newuser_max_mentions_per_post: "מספר מקסימלי של התראות @שם_משתמש בהן יכולים להשתמש משתמש/ת חדשים בפרסום." - newuser_max_replies_per_topic: "מספר התגובות המקסימלי שיכולים משתמש/ת חדשים לפרסם לנושא בודד לפני שיקבלו תגובה ממשתמשים אחרים." - max_mentions_per_post: "מספר מקסימלי של התראות @שם_משתמש שיכול כל אחד/אחת להכליל בפרסום." - create_thumbnails: "יצירת תמונות מוקטנות והארת תמונות גדולות מידי מלהיכלל בפרסום." - email_time_window_mins: "המתינו (n) דקות לפני משלוח כל התראת מייל, כדי לאפשר למשתמשים הזדמנות לערוך ולוודא באופן סופי את הפרסומים שלהם." - email_posts_context: "כמה תגובות קודמות יש לכלול למתקן הקשר בהודעות דוא\"ל עם התראות." + min_trust_to_create_topic: "רמת האמון המינימלית הנדרשת כדי לייצר נושא חדש." + min_trust_to_edit_wiki_post: "רמת האמון המינימלי הנדרשת כדי לערוך פוסט שמסומן כ-wiki." + min_trust_to_edit_post: "רמת האמון המינימלית הנדרשת כדי לערוך פוסטים." + min_trust_to_allow_self_wiki: "רמת האמון המינימלית הנדרשת כדי שמשתמש יוכל להפוך פוסט של עצמו לויקי." + min_trust_to_send_messages: "רמת האמון המינימלית המדרשת כדי ליצור הודעות פרטיות חדשות." + newuser_max_links: "כמה קישורים יכולים משתמשים חדשים להוסיף לפוסט." + newuser_max_images: "כמה תמונות יכולים משתמשים להוסיף לפוסט." + newuser_max_attachments: "כמה קבצים מצורפים יכולים משתמשים חדשים להוסיף לפוסט." + newuser_max_mentions_per_post: "מספר מקסימלי של התראות @שם_משתמש בהן יכולים להשתמש משתמש/ת חדשים בפוסט." + newuser_max_replies_per_topic: "מספר התגובות המקסימלי שיכולים משתמשים חדשים לפרסם לנושא בודד לפני שיקבלו תגובה ממשתמשים אחרים." + max_mentions_per_post: "מספר מקסימלי של התראות @שם_משתמש שיכול כל אחד/אחת להכליל בפוסט." + max_users_notified_per_group_mention: "מספר מקסימלי של משתמשים שיכולים לקבל התראה אם מוזכרת קבוצה (אם מגיעים לסף זה לא תועלה התראה)" + create_thumbnails: "יצירת תמונות מוקטנות והארת תמונות גדולות מידי מלהיכלל בפוסט." + email_time_window_mins: "המתינו (n) דקות לפני משלוח כל התראת מייל, כדי לאפשר למשתמשים הזדמנות לערוך ולוודא באופן סופי את הפוסטים שלהם." + private_email_time_window_seconds: "המתינו (n) שניות לפני משלוח מיילים אישיים להתראה, על מנת לאפשר למשתמשים לערוך או לתקן את ההודעה." + email_posts_context: "כמה תגובות קודמות יש לכלול כהקשר במיילים עם התראות." flush_timings_secs: "באיזו תדירות אנחנו מזרימים מידע לשרת, בשניות." title_max_word_length: "האורך המקסימלי המותר למילה בכותרת נושא, בתווים. " title_min_entropy: "האנטרופיה (תווים ייחודים שאינם בשפת הכתיבה) המינימלית הנדרשת בכותרת נושא." - body_min_entropy: "האנטרופיה (תוים ייחודיים שאינם בשפת הכתיבה) המינימלית הנדרשת בגוף המסמך." - title_fancy_entities: "Convert common ASCII characters to fancy HTML entities in topic titles, ala SmartyPants http://daringfireball.net/projects/smartypants/" + body_min_entropy: "האנטרופיה (תוים ייחודיים, תווים שאינם באנגלית נחשבים יותר) המינימלית הנדרשת בגוף הפוסט." + allow_uppercase_posts: "אפשרו אותיות אנגליות גדולות (Capitalized) בכותרת נושא או בגוף פוסט." + title_fancy_entities: "המירו תווי ASCII ליישויות fancy HTML בכותרות נושאים, בסגנון SmartyPants http://daringfireball.net/projects/smartypants/" min_title_similar_length: "האורך המינימלי של כותרת לפני שהיא נבדקת עבור איתור נושאים דומים." - min_body_similar_length: "האורך המינימלי של גוף הפרסום לפני שהוא ייבדק לאיתור נושאים דומים." - category_colors: "רשימה של ערכי צבעים האקסדיצמלים מותרים לסימון קטגוריות." - category_style: "סגנון ויזואלי עבור תגי קטגוריות." - max_image_size_kb: "גודל קובץ מקסימלי להעלאה בקילו-בייטים (kB). ערך זה חייב להיות מוגדרת גם ב-nginx (client_max_body_size) / apache או בפרוקסי." - max_attachment_size_kb: "הגודל המקסימלי בקילובייטים (kBs) של קבצים להעלאה. הגדרה זו חייבת להיות מוגדרת ב-nginx (client_max_body_size) / apache או בפרוקסי." - authorized_extensions: "רשימה של הרחבות מותרות להעלאה (השתמשו ב '*' כדי לאפשר את כל סוגי הקבצים)" - max_similar_results: "כמה נושאים דומים להציג מעל לעורך כאשר מחברים נושא חדש. ההשוואה מבוססת על הכותרת וגוף הפרסום." - title_prettify: "Prevent common title typos and errors, including all caps, lowercase first character, multiple ! and ?, extra . at end, etc." - topic_views_heat_low: "לאחר כמות זו של צפיות,שדה הצפיות יהיה קצת יותר בהיר." + min_body_similar_length: "האורך המינימלי של גוף הפוסט לפני שהוא ייבדק לאיתור נושאים דומים." + desktop_category_page_style: "סגנון ויזואלי לדף /categories." + category_colors: "רשימה של ערכי צבעים הקסדצימליים מותרים לסימון קטגוריות." + category_style: "סגנון ויזואלי עבור עיטורי קטגוריות." + max_image_size_kb: "גודל קובץ מקסימלי להעלאה בקילו-בתים (kB). ערך זה חייב להיות מוגדר גם ב-nginx (client_max_body_size) / apache או בפרוקסי." + max_attachment_size_kb: "הגודל המקסימלי בקילו-בתים (kBs) של קבצים להעלאה. הגדרה זו חייבת להיות מוגדרת ב-nginx (client_max_body_size) / apache או בפרוקסי." + authorized_extensions: "רשימה של סיומות מותרות להעלאה (השתמשו ב '*' כדי לאפשר את כל סוגי הקבצים)" + max_similar_results: "כמה נושאים דומים להציג מעל לעורך כאשר מחברים נושא חדש. ההשוואה מבוססת על הכותרת וגוף הפוסט." + title_prettify: "מניעת טעויות נפוצות בכותרת, בכללן טעויות עם אותיות גדולות באנגלית, מספר ! ו ?, נקודה מיותרת בסוף, וכד׳" + topic_views_heat_low: "לאחר כמות זו של צפיות, שדה הצפיות יהיה קצת יותר בהיר." topic_views_heat_medium: "לאחר כמות צפיות זו, שדה הצפיות יודגש באופן בינוני." topic_views_heat_high: "לאחר כמות צפיות זו, שדה הצפיות יודגש באופן בולט." - cold_age_days_low: "לאחר מספר זה של ימי שיחה, תאריך הפעילות האחרונה מאופר." - cold_age_days_medium: "לאחר מספר זה של ימי שיחה, תאריך הפעילות האחרונה מואפר יותר." - cold_age_days_high: "לאחר מספר זה של ימי שיחה, תאריך הפעילות האחרונה מאופר ממש." - history_hours_low: "פרסום שנערך תוך כדי מספר שעות זה יופיע עם אינידקציית עריכה מודגשת קלות." - history_hours_medium: "פרסום שנערך תוך כדי מספר שעות זה יופיע עם אינידקציית עריכה מודגשת באופן בינוני." - history_hours_high: "פרסום שנערך תוך כדי מספר שעות זה יופיע עם אינידקציית עריכה מודגשת באופן חזק." - topic_post_like_heat_low: "לאחר שהיחס בין לייקים למספר הפרסומים גבוהה מערך זה, שדה ספירת הפרסומים מודגש קלות." - topic_post_like_heat_medium: "לאחר שהיחס בין לייקים למספר הפרסומים גבוהה מערך זה, שדה ספירת הפרסומים מודגש באופן בינוני." - topic_post_like_heat_high: "לאחר שהיחס בין לייקים למספר הפרסומים גבוהה מערך זה, שדה ספירת הפרסומים מודגש באופן חזק." - faq_url: "If you have a FAQ hosted elsewhere that you want to use, provide the full URL here." - tos_url: "If you have a Terms of Service document hosted elsewhere that you want to use, provide the full URL here." - privacy_policy_url: "If you have a Privacy Policy document hosted elsewhere that you want to use, provide the full URL here." - white_listed_spam_host_domains: "רשימה של מתחמים (domain) שיוחרגו מבדיקת הספאם. משתמשים חדשים לעולם לא יוגבלו ביצירת פרסומים חדשים עם קישורים למתחמים אלו." + cold_age_days_low: "לאחר מספר זה של ימי שיחה, תאריך הפעילות האחרונה מעט מוכהה." + cold_age_days_medium: "לאחר מספר זה של ימי שיחה, תאריך הפעילות האחרונה מוכהה יותר." + cold_age_days_high: "לאחר מספר זה של ימי שיחה, תאריך הפעילות האחרונה מוכהה מאוד." + history_hours_low: "פוסט שנערך תוך כדי מספר שעות זה יופיע עם אינידקציית עריכה מודגשת קלות." + history_hours_medium: "פוסט שנערך תוך כדי מספר שעות זה יופיע עם אינידקציית עריכה מודגשת באופן בינוני." + history_hours_high: "פוסט שנערך תוך כדי מספר שעות זה יופיע עם אינידקציית עריכה מודגשת באופן חזק." + topic_post_like_heat_low: "לאחר שהיחס בין לייקים למספר הפוסטים גבוה מערך זה, שדה ספירת הפוסטים מודגש קלות." + topic_post_like_heat_medium: "לאחר שהיחס בין לייקים למספר הפוסטים גבוה מערך זה, שדה ספירת הפוסטים מודגש באופן בינוני." + topic_post_like_heat_high: "לאחר שהיחס בין לייקים למספר הפוסטים גבוה מערך זה, שדה ספירת הפוסטים מודגש באופן חזק." + faq_url: "אם יש לכם שאלות ותשובות נפוצות שמאורחות במקום אחר ואתם רוצים להשתמש בהן, ספקו את ה URL המלא כאן." + tos_url: "אם יש לכם מסמך תנאי שימוש מאורח במקום אחר שהייתם רוצים להשתמש בו, ספקו את ה URL המלא כאן." + privacy_policy_url: "אם יש לכם מסמך הצהרת פרטיות שמאוחסן במקום אחר ובו אתם מעוניינים להשתמש, ספקו URL מלא כאן." + newuser_spam_host_threshold: "מספר הפעמים שמשתמשים חדשים יכולים לקשר לאותו מחשב במסגרת `newuser_spam_host_threshold` הפרסומים שלהם לפני שייחשבו ספאם." + white_listed_spam_host_domains: "רשימה של מתחמים (domains) שיוחרגו מבדיקת הספאם. משתמשים חדשים לעולם לא יוגבלו ביצירת פוסטים חדשים עם קישורים למתחמים אלו." staff_like_weight: "כמה משקל עודף יש להעניק ללייקים של הצוות." + topic_view_duration_hours: "ספרו צפיות חדשות בנושא פעם אחת לכל IP/משתמש לכל N שעות" + user_profile_view_duration_hours: "ספרו צפיות בפרופיל משתמש פעם אחת לכל IP/משתמש בכל N שעות" levenshtein_distance_spammer_emails: "כאשר מתאימים דוא\"ל של ספאמרים, מספר ההבדלים בתווים שעדיין מאפשרים התאמה מטושטשת." - max_new_accounts_per_registration_ip: "אם ישנם כבר (n) חשבונות עם רמת אמון 0 מכתובת IP זו (ואף אחד מהם אינו חבר צוות, או בעל/ת רמת אמון 2 ומעלה), הפסיקו קצת הרשמות מכתובת IP זו." - min_ban_entries_for_roll_up: "בעת לחיצה על לחצן הגלילה למעלה, ייוצר איסור כניסת משנה (subnet ben entry) חדשה אם יש לפחות (N) ערכים." + max_new_accounts_per_registration_ip: "אם ישנם כבר (n) חשבונות עם רמת אמון 0 מכתובת IP זו (ואף אחד מהם אינו חבר צוות, או בעל/ת רמת אמון 2 ומעלה), הפסיקו קבלת הרשמות מכתובת IP זו." + min_ban_entries_for_roll_up: "בעת לחיצה על לחצן הגלילה למעלה, ייוצר איסור כניסת משנה (subnet ban entry) חדשה אם יש לפחות (N) ערכים." max_age_unmatched_emails: "מחק ערכי דוא\"ל לא תואמים שמוצגים לאחר (N) ימים." max_age_unmatched_ips: "מחק ערכי IP לא תואמים שמוצגים לאחר (N) ימים." - num_flaggers_to_close_topic: "מספר מינימלי של מסמנים שונים שנדרש כדי להשהות באופן אוטומטי אפשות להתערב בנושא" - num_flags_to_close_topic: "מספר מינימלי של סימונים פעילים שנדרש כדי להשהות באופן אוטומטי את היכולת להתערב בנושא" - auto_respond_to_flag_actions: "אפשרו תגובה אוטמטית עם הסרת סימון." - min_first_post_typing_time: "Minimum amount of time in milliseconds a user must type during first post, if threshold is not met post will automatically enter the needs approval queue. Set to 0 to disable (not recommended)" - auto_block_fast_typers_on_first_post: "Automatically block users that do not meet min_first_post_typing_time" - auto_block_fast_typers_max_trust_level: "Maximum trust level to auto block fast typers" - auto_block_first_post_regex: "Case insensitive regex that if passed will cause first post by user to be blocked and sent to approval queue. Example: raging|a[bc]a , will cause all posts containing raging or aba or aca to be blocked on first. Only applies to first post." + num_flaggers_to_close_topic: "מספר מינימלי של דגלים שונים שנדרש כדי להשהות באופן אוטומטי אפשות להתערב בנושא" + num_flags_to_close_topic: "מספר מינימלי של דגלים פעילים שנדרש כדי להשהות באופן אוטומטי את היכולת להתערב בנושא" + auto_respond_to_flag_actions: "אפשרו תגובה אוטמטית עם הסרת דגל." + min_first_post_typing_time: "זמן מינימלי במילי-שניות שמשתמש חייב להקיש בזמן הפוסט הראשון, אם הסף לא נעבר הפוסט אוטומטית יכנס לתור של אלו שצריכים אישור. קיבעו 0 כדי לנטרל (לא מומלץ)" + auto_block_fast_typers_on_first_post: "חסימה אוטומטית של משתמשים שלא עונים על min_first_post_typing_time" + auto_block_fast_typers_max_trust_level: "רמת אמון מקסימלית שבה לחסום אוטומטית מקלידים מהירים" + auto_block_first_post_regex: "ביטוי רגולרי case insensitive שאם הוא מתקיים יגרום לפוסט הראשון מהמשתמש להחסם ולהשלח לתור האישורים. למשל raging|a[bc]a , יגרום לכל הפוסטים שמכילים raging או aba או aca קודם כל להחסם. רלוונטי רק לפוסט הראשון." reply_by_email_enabled: "אפשרו תגובה לנושאים באמצעות הדוא\"ל." - reply_by_email_address: "Template for reply by email incoming email address, for example: %{reply_key}@reply.example.com or replies+%{reply_key}@example.com" - disable_emails: "מנעו מ-Discourse ממשלו דוא\"ל כלשהו." - strip_images_from_short_emails: "הסרת תמונות מדוא\"ל בגודל של פחות מ-2800 בייטים" - short_email_length: "אורכו של דוא\"ל קצר בבייטים (Bytes)" + reply_by_email_address: "תבנית עבור כתובות מייל של מענה באמצעות אימייל, למשל: {reply_key}@reply.example.com או replies+%{reply_key}@example.com" + alternative_reply_by_email_addresses: "רשימה של כמה תבניות לתגובות במייל באמצעות כתובות מייל נכנסות. למשל: %{reply_key}@reply.example.com|replies+%{reply_key}@example.com" + incoming_email_prefer_html: "השתמשו ב HTML במקום בטקסט בשביל מייל נכנס. עלול ליצור בעיות עיצוב לא-צפויות!" + disable_emails: "מנעו מ-Discourse ממשלוח דוא\"ל כלשהו" + strip_images_from_short_emails: "הסרת תמונות מדוא\"ל בגודל של פחות מ-2800 בתים" + short_email_length: "אורכו של דוא\"ל קצר בבתים (Bytes)" + display_name_on_email_from: "הצגת שמות מלאים בשדה ה״מאת״ במיילים" + unsubscribe_via_email: "אפשרו למשתמשים לבטל מנוי אימייל באמצעות שליחת מייל עם המילה ״unsubscribe״ בנושא או גוף המייל" + unsubscribe_via_email_footer: "צירוף ״ביטול מנוי באמצעות קישור מייל mailto:״ בתחתית מיילים נשלחים" + delete_email_logs_after_days: "מחיקת יומני מיילים אחרי (N) ימים. 0 ישמור אותם ללא הגבלה" + max_emails_per_day_per_user: "מספר המיילים המקסימאלי שניתן לשלוח למשתמש/ת ביום. הקישו 0 למשלוח ללא הגבלה." + enable_staged_users: "יצירת משתמשים מועמדים באופן אוטומטי בזמן עיבוד מיילים נכנסים." + maximum_staged_users_per_email: "מספר מקסימלי של משתמשים מועמדים שנוצרים בזמן עיבוד מייל מכנס." + auto_generated_whitelist: "רשימת כתובות דואר מהן לא ייבדק אם התוכן נוצר-אוטומטית. למשל: foo@bar.com|discourse@bar.com" + block_auto_generated_emails: "חסימת מיילים נכנסים שמזוהים ככאלו שנוצרו אוטומטית." + ignore_by_title: "התעלמות ממיילים נכנסים לפי הכותרת שלהם." + mailgun_api_key: "מפתח API סודי של Mailgun לאימות של הודעות webhook." + soft_bounce_score: "ניקוד-החזר מתווסף למשתמש כאשר מתרחשת החזרה זמנית." + hard_bounce_score: "ניקוד-החזר מתווסף למשתמש כאשר מתרחשת החזרה קבועה." + bounce_score_threshold: "ניקוד-החזר מקסימלי לפני שנפסיק לשלוח מיילים למשתמש." + bounce_score_threshold_deactivate: "ניקוד-החזר מקסימלי לפני שאנחנו משביתים משתמש." + reset_bounce_score_after_days: "איפוס אוטומטי של ניקוד-החזר לאחר X ימים." + attachment_content_type_blacklist: "רשימת מילות מפתח שמשמשות להכנסת צירופים לרשימה שחורה על בסיס סוג התוכן." + attachment_filename_blacklist: "רשימת מילות מפתח לרשימה שחורה של שמות קבצים מצורפים." + enable_forwarded_emails: "[בטא] אפשרו למשתמשים ליצור נושא על ידי העברת מייל." + always_show_trimmed_content: "תמיד הציגו חלק מקוצר של מיילים נכנסים. אזהרה: עלול לחשוף כתובות מייל." + manual_polling_enabled: "דחיפת מיילים באמצעות ה API לתגובות מייל." pop3_polling_enabled: "משיכה דרך POP3 לתגובות דוא\"ל." pop3_polling_ssl: "שימוש ב-SSL בעת חיבור לשרת POP3. (מומלץ)" + pop3_polling_openssl_verify: "וידוא סרטיפיקט TLS של השרת (ברירת מחדל: מאופשר)" pop3_polling_period_mins: "משך הזמן בדקות בין בדיקת הדוא\"ל בחשבון ה-POP3. הערה: דורש אתחול." pop3_polling_port: "החיבור (Port) ממנו יש למשוך נתונים מחשבון POP3." pop3_polling_host: "השרת המארח (Host) למשיכת דוא\"ל דרך POP3." - pop3_polling_username: "שם המשתמש/ת לחשבון ה-POP3 למשיכת דוא\"ל." - pop3_polling_password: "הסיסא לחשבון ה-POP3 למשיכת הדוא\"ל." - log_mail_processing_failures: "Log all email processing failures to http://yoursitename.com/logs" - email_in: "אפשרו למשתמשים לפרסם נושאים חדשים באמצעות דוא\"ל (דורש משיכה באמצעוצ pop3). הגדירו את הכתובת בלשונית \"הגדרות\" עבור כל קטגוריה." - email_in_min_trust: "רמת האמון המינימלית הנדרשת למשתמש/ת כדי שיוכלו להעלות נושאים חדשים באמצעות הדוא\"ל." - email_prefix: "ה[תווית] שתשמש בנושא הודעות הדוא\"ל. אם לא יוגדר, ברירת המחדל תכוון ל'כותרת' אם לא יוגדר אחרת." + pop3_polling_username: "שם המשתמש/ת לחשבון ה-POP3 לתשאול דוא\"ל." + pop3_polling_password: "הסיסמה לחשבון ה-POP3 למשיכת הדוא\"ל." + log_mail_processing_failures: "רישום של כל בעיות העיבוד ל http://yoursitename.com/logs" + email_in: "אפשרו למשתמשים לפרסם נושאים חדשים באמצעות דוא\"ל (דורש תשאול באמצעות pop3). הגדירו את הכתובת בלשונית \"הגדרות\" עבור כל קטגוריה." + email_in_min_trust: "רמת האמון המינימלית הנדרשת למשתמשים כדי שיוכלו להעלות נושאים חדשים באמצעות הדוא\"ל." + email_prefix: "ה[תווית] שתשמש כנושא של מיילים. אם לא יוגדר, ברירת המחדל תכוון ל'כותרת' אם לא יוגדר אחרת." email_site_title: "הכותרת של האתר שתשמש כשם השולח של דוא\"ל מהאתר. במידה ולא יוגדר ערך, תכוון ברירת המחדל ל\"כותרת\". אם ה\"כותרת\" שלכם מכילה תוים שאינם מותרים לשימוש במחרוזות \"שם השולח\" בדוא\"ל, השתמשו בהגדרה זו." minimum_topics_similar: "כמה נושאים צריכים להתקיים לפני שנושאים דומים יוצגו בעת חיפוש נושא חדש." - relative_date_duration: "מספר הימים לאחר פרסום בהם תאריך הפרסום מופיע כתאריך יחסי (7 ימים) לעומת תאריך רגיל (20 בפברואר)." - delete_user_max_post_age: "אל תפאשרו מחיקת משתמשים שהפרסום הראשון שלהם הוא בן יותר מ-(x) ימים." - delete_all_posts_max: "The maximum number of posts that can be deleted at once with the Delete All Posts button. If a user has more than this many posts, the posts cannot all be deleted at once and the user can't be deleted." - username_change_period: "The number of days after registration that accounts can change their username (0 to disallow username change)." - email_editable: "Allow users to change their e-mail address after registration." - allow_uploaded_avatars: "Allow users to upload custom profile pictures." - allow_animated_avatars: "Allow users to use animated gif profile pictures. WARNING: run the avatars:refresh rake task after changing this setting." + relative_date_duration: "מספר הימים לאחר פרסום בהם תאריך הפוסט מופיע כתאריך יחסי (7 ימים) לעומת תאריך רגיל (20 בפברואר)." + delete_user_max_post_age: "אל תפאשרו מחיקת משתמשים שהפוסט הראשון שלהם הוא בן יותר מ-(x) ימים." + delete_all_posts_max: "מספר הפוסטים המקסימלי שניתן למחוק בבת אחת עם כפתור המחיקה של כל הפוסטים. אם למשתמש יש יותר מהמספר הזה של פוסטים, הפוסטים לא יכולים להמחק כולם ביחד והמשתמש לא יכול להמחק." + username_change_period: "מספר הימים לאחר הרישום שבהם חשבונות יכולים לשנות את שם המשתמש (0 כדי לא לאפשר שינוי שם משתמש)." + email_editable: "אפשרו למשתמשים לשנות את כתובת המייל שלהם לאחר ההרשמה." + logout_redirect: "כתובת להפנות אליה את הדפדפנים לאחר התנתקות (למשל: http://somesite.com/logout)" + allow_uploaded_avatars: "אפשרו למשתמשים להעלות תמונות פרופיל משלהם." + allow_animated_avatars: "אפשרו למשתמשים להשתמש באנימציית gif בתור תמונת פרופיל. אזהרה: הריצו משימת rake של avatars:refresh לאחר שינוי הגדרה זו." allow_animated_thumbnails: "יצירת תמונות אנימציה מוקטנות קטנות של קבצי אנימציית gif." default_avatars: "כתובות URL לאווטרים אשר ישמשו כברירת מחדל למשתמשים חדשים עד אשר ישנו אותם." automatically_download_gravatars: "הורדת גראווטרים למשתמשים בעת יצירת החשבון או שינוי כתובת הדוא\"ל." + digest_topics: "המספר המקסימלי של נושאים פופולאריים להצגה במייל הסיכום." + digest_posts: "המספר המקסימלי של פוסטים פופולאריים להצגה במייל סיכום." + digest_other_topics: "המספר המקסימלי של נושאים להצגה בקטע 'חדש בנושאים וקטגוריות שאתם עוקבים אחריהם' של מייל הסיכום." + digest_min_excerpt_length: "אורך קטע מינימלי מהפוסט למיילי הסיכום, בתווים." + delete_digest_email_after_days: "השתקת מיילי סיכום למשתמשים שלא ביקרו באתר למעלה מ (n) ימים." + digest_suppress_categories: "וותרו על קטגוריות אלו במיילים מסכמים." disable_digest_emails: "בטל סיכומי מיילים לכל המשתמשים." - detect_custom_avatars: "Whether or not to check that users have uploaded custom profile pictures." + email_accent_bg_color: "צבע האקסנט שיעשה בו שימוש כרקע לחלק מהאלמנטים של מיילים מסוג HTML. הכניסו שם צבע ('red') או ערך הקסדצימלי ('#FF000')." + email_accent_fg_color: "צבע הטקסט שמופיע על צבע הרקע של מיילים מסוג HTML. הכניסו שם צבע ('white') או ערך הקסדצימלי ('#FFFFFF')." + email_link_color: "צבע הקישורים במיילים מסוג HTML. הכניסו שם צבע ('blue') או ערך הקסדצימלי ('#0000FF')." + detect_custom_avatars: "האם לבדוק או לא לבדוק שמשתמשים העלו תמונות פרופיל אישיות." max_daily_gravatar_crawls: "מספר הפעמים המקסימלי ש-Discourse יבדוק אווטרים ב-Gravatar ביום" public_user_custom_fields: "רשימה לבנה (whitelist) של שדות מותאמים למשתמש שיכולים להיות מוצגים באופן פומבי." staff_user_custom_fields: "רשימה לבנה (whitelist) של שדות מותאמים למשתמש שיכולים להיות מוצגים לאנשי צוות." enable_user_directory: "ספקו ספריייה של משתמשים לגלישה" + enable_group_directory: "ספקו ספריה של קבוצות לסיור" allow_anonymous_posting: "אפשרו למשתמשים לעבור למצב אנונימי" anonymous_posting_min_trust_level: "רמת האמון המינמלית הנדרשת כדי לאפשר פרסום אנונימי" - anonymous_account_duration_minutes: "בכדי להגן על האנונימות צרו חשבון אנונימי כל N דקות לכ משתמש. לדוגמה: אם מכוון ל-600, כאשר יעברו 600 דקות מהפרסום האחרון והמשתמש/ת יחליפו לזהות אנונימית, חשבון אנונימי חדש יווצר." + anonymous_account_duration_minutes: "בכדי להגן על האנונימות צרו חשבון אנונימי כל N דקות לכל משתמש. לדוגמה: אם מכוון ל-600, כאשר יעברו 600 דקות מהפרסום האחרון והמשתמש/ת יחליפו לזהות אנונימית, חשבון אנונימי חדש יווצר." + hide_user_profiles_from_public: "נטרלו כרטיסי משתמשים, פרופילי משתמשים ומדריך משתמשים למשתמשים אנונימיים." + user_website_domains_whitelist: "אתרי משתמשים יאומתו עם מתחמים אלו. רשימה מופרדת על ידי קווים-אנכיים." allow_profile_backgrounds: "אפשרו למשתמשים להעלות רקעים לפרופיל." - enable_mobile_theme: "Mobile devices use a mobile-friendly theme, with the ability to switch to the full site. Disable this if you want to use a custom stylesheet that is fully responsive." - dominating_topic_minimum_percent: "איזה אחוז מהפרסומים משתמש צריך לייצר בנושא לפני שיקבל תזכורת לגבי שליטת/שתלטנות יתר על הנושא." - suppress_uncategorized_badge: "אל תציגו את התג (badge) לנושאים נטולי קטגוריה ברשימת הנושאים." + sequential_replies_threshold: "מספר הפוסטים שעל משתמש לפרסם אחד-לאחר-השני בנושא לפני שמזכירים לו שהוא משאיר יותר מידי תגובות ברצף." + enable_mobile_theme: "מכשירים ניידים משתמשים בתבנית ידידותית אליהם, עם היכולת להחליף אותה לאתר המלא. נטרלו זאת אם אתם מעוניינים ב stylesheet מותאם שהוא רספונסיבי לחלוטין." + dominating_topic_minimum_percent: "איזה אחוז מהפוסטים משתמש צריך לייצר בנושא לפני שיקבל תזכורת לגבי שתלטנות יתר על הנושא." + disable_avatar_education_message: "ניטרול הודעה שמלמדת על שינוי דמות." + suppress_uncategorized_badge: "אל תציגו את העיטור לנושאים נטולי קטגוריה ברשימת הנושאים." + permalink_normalizations: "החילו את הביטויים הרגולריים האלו לפני שמתאימים קישורים-קבועים, למשל: /(topic.*)\\?.*/\\1 יסיר מחרוזות שאילתה מנתיבי נושאים. הפורמט הוא regex+string משתמש ב \\1 וכד׳ כדי לגשת להתאמות" global_notice: "הציגו הודעת אזהרה דחופה כללית לכל המבקרים, החליפו לריק כדי להסתיר אותה (ניתן להשתמש ב-HTML)." disable_edit_notifications: "ביטול התראות עריכה על ידי משתמש המערכת כאשר 'download_remote_images_to_local' פעיל." + automatically_unpin_topics: "הסרת נעיצה אוטומטית של נושאים כאשר המשתמשים מגיעים לתחתית." + read_time_word_count: "מספר המילים לדקה כדי להעריך את זמן הקריאה." + topic_page_title_includes_category: "כותרת דף נושא כוללת את שם הקטגוריה." + max_prints_per_hour_per_user: "מספר מקסימלי של צפיות בדף /print (הדפסה) (קיבעו ל 0 כדי לנטרל)" full_name_required: "שם מלא הוא שדה נדרש לפרופיל משתמש/ת." - enable_names: "הצגת השם המלא של המשתמש/ת בעמודי הפרופיל שלהם, בכרטיסי המשתמ ובדוא\"ל שלהם. נטרול הסתרת השם המלא בכל מקום." - display_name_on_posts: "הצגת שמם המלא של משתמשים בפרסומיהם, בנוסף ל@שם_המשתמש שלהם." - show_time_gap_days: "If two posts are made this many days apart, display the time gap in the topic." - invites_per_page: "ברירת המחדל, הזמנות המוצגות בעמוד המשתמש." - short_progress_text_threshold: "After the number of posts in a topic goes above this number, the progress bar will only show the current post number. If you change the progress bar's width, you may need to change this value." - default_code_lang: "Default programming language syntax highlighting applied to GitHub code blocks (lang-auto, ruby, python etc.)" - warn_reviving_old_topic_age: "כאשר מישהו/מישהי מתחילים להגיב לנושא שבו התגובה האחרונה היא בת יותר מכמה ימים, אזהרה תוצג. בטלו אפשרות זו באמצעות הזנה של 0." + enable_names: "הצגת השם המלא של המשתמש/ת בעמודי הפרופיל שלהם, בכרטיסי המשתמש ובדוא\"ל שלהם. נטרלו להסתרת השם המלא בכל מקום." + display_name_on_posts: "הצגת שמם המלא של משתמשים בפוסטים שלהם, בנוסף ל@שם_המשתמש שלהם." + show_time_gap_days: "אם שני פוסטים נוצרים מספר זה של ימים אחד מהשני, הציגו את מרווח הזמן בנושא." + invites_per_page: "ברירת מחדל ההזמנות המוצגות בעמוד המשתמש." + short_progress_text_threshold: "לאחר שמספר הפוסטים בנושא עוברים את המספר הזה, מד ההתקדמות יציג רק את המספר של הפוסט הנוכחי. אם תשנו את רוחב מד ההתקדמות, ייתכן שתצטרכו לשנות ערך זה." + default_code_lang: "תחביר שפת תכנות שיסופק כברירת מחדל על קטעי קוד מגיטהאב (לאנג-אוטו, רובי, פיתון וכד׳)" + warn_reviving_old_topic_age: "כאשר מישהם מתחילים להגיב לנושא שבו התגובה האחרונה היא בת יותר מכמה ימים, אזהרה תוצג. נטרלו באמצעות הזנה של 0." autohighlight_all_code: "לחייב שימוש בקוד הדגשה לכל קוד מעוצב מראש (preformatted code blocks) אפילו אם הם אינם מציינים את השפה." - feed_polling_enabled: "הטמעה בלבד: האם לעמבד פידים של RSS/ATOM כפרסומים." + highlighted_languages: "כולל הדגשת כללי תחביר (syntax). (אזהרה: הכללת שפות רבות מידי עשויה להשפיע על הביצועים) ראו: https://highlightjs.org/static/demo/ להדגמה." + feed_polling_enabled: "הטמעה בלבד: האם להטמיע פידים של RSS/ATOM כפוסטים." feed_polling_url: "הטמעה בלבד: URL של פיד RSS/ATOM להטמעה." embed_by_username: "שם המשתמש של המשתמש/ת שיוצר את הנושאים המוטמעים." embed_username_key_from_feed: "מפתח למשיכת שם המשתמש ב-discourse מהפיד." - embed_truncate: "חיתוך הפרסומים המוטמעים." - embed_post_limit: "מספר מקסימלי של פרסומים להטמעה." - embed_username_required: "נדרש שם משתמש ליצירת הפוסט." + embed_title_scrubber: "ביטויים רגולריים כדי לנקות כותרות מוטמעות." + embed_truncate: "חיתוך הפוסטים המוטמעים." + allowed_href_schemes: "פרוטוקולים מותרים בלינקים בנוסף ל http ו https." + embed_post_limit: "מספר מקסימלי של פוסטים להטמעה." + embed_username_required: "נדרש שם משתמש ליצירת הנושא." embed_whitelist_selector: "בוררי CSS לאלמנטים שיותר להטמיע." embed_blacklist_selector: "בוררי CSS לאלמנטים שיוסרו מן ההטמעות." - notify_about_flags_after: "If there are flags that haven't been handled after this many hours, send an email to the contact_email. Set to 0 to disable." - enable_cdn_js_debugging: "אפשרו ל-/logs להציג שגיאות בצורה נכונה באמצעות הוספת הרשאות לגישה בין אתרים (crossorigin permissions) בכל ה-js הכלולים." - show_create_topics_notice: "אם לאתר פחות מ-5 נושאים פומביים, הציגו הודעה המבקשת מן המנהלים/מנהלות ליצור עוד נושאים." - delete_drafts_older_than_n_days: Delete drafts older than (n) days. + notify_about_flags_after: "אם יש דגלים שלא טופלו לאחר כמות זו של שעות, שילחו אימייל ל contact_email. קבעו 0 לניטרול." + show_create_topics_notice: "אם לאתר פחות מ-5 נושאים פומביים, הציגו מודעה המבקשת מן המנהלים ליצור עוד נושאים." + delete_drafts_older_than_n_days: מחקו טיוטות בנות יותר מ (n) ימים. + bootstrap_mode_min_users: "מספר משתמשים מינימלי שנדרש כדי לנטרל מצב איתחול (קבעו ל 0 כדי לנטרל)" + vacuum_db_days: "הריצו VACUUM ANALYZE כדי להשיב מקום בבסיס הנתונים לאחר המרות (קבעו ל 0 כדי לנטרל)" prevent_anons_from_downloading_files: "מונע ממשתמשים אנונימיים להוריד צרופות (attachments). אזהרה: דבר זה ימנע מכל משאב שאינו תמונה ופורסם כצרופה לעבוד." - slug_generation_method: "Choose a slug generation method. 'encoded' will generate percent encoding string. 'none' will disable slug at all." + slug_generation_method: "בחרו צורת ייצור slug. צורה של 'encoded' תגרום למחרוזות עם קידוד אחוזים. 'none' ינטרל slug לחלוטין." enable_emoji: "אפשרו emoji" emoji_set: "איך אתם אוהבים את ה-emoji שלכם?" - enforce_square_emoji: "חובת מימדי ריבועיים בכל ה-emojis." - approve_unless_trust_level: "Posts for users below this trust level must be approved" + enforce_square_emoji: "חובת מימדים ריבועיים בכל ה-emojis." + approve_post_count: "מספר הפוסטים ממשתמשים חדשים או בסיסיים שחייבים לאשר אותם" + approve_unless_trust_level: "פוסטים של משתמשים מתחת לרמת אמון זו חייבים לעבור אישור" + approve_new_topics_unless_trust_level: "נושאים חדשים עבור משתמשים מתחת לרמת אמון זו חייבים להיות מאושרים" + notify_about_queued_posts_after: "אם יש פוסטים שהמתינו לסקירה ליותר מכמות השעות הזו, יישלח מייל ל contact_email. קבעו 0 כדי לנטרל את המיילים האלו." + auto_close_messages_post_count: "מספר פוסטים מקסימלי בהודעה לפני שהיא נסגרת אוטומטית (0 לניטרול)" + auto_close_topics_post_count: "מספר מקסימלי של פוסטים בנושא לפני שהוא נסגר אוטומטית (0 לניטרול)" + code_formatting_style: "כפתור קוד בדפדפן יציע אוטומטית סגנון קידוד זה" + default_email_digest_frequency: "באיזו תדירות משתמשים יקבלו סיכומי מיילים כברירת מחדל." + default_include_tl0_in_digests: "כללו פוסטים ממשתמשים חדשים בדוא\"ל מסכם כברירת מחדל. משתמשים יוכלו לשנות זאת בהעדפות האישיות." default_email_private_messages: "שלח מייל כשמישהו שולח הודעה למשתמש, בתור ברירת מחדל." - default_email_direct: "שלח מייל כשמישהו מצטט/ מגיב ל/מזכיר או מזמין משתמש, בתור ברירת מחדל. " - default_email_mailing_list_mode: "שלח מייל עבור כל פרסום חדש בתור ברירת מחדל. " - default_email_always: "שלח התרעות למייל גם כאשר המשתמש פעיל, בתור ברירת מחדל." - default_other_new_topic_duration_minutes: "Global default condition for which a topic is considered new." - default_other_auto_track_topics_after_msecs: "Global default time before a topic is automatically tracked." - default_other_external_links_in_new_tab: "פתח קישורים חיצונים בטאב חדש, בתור ברירת מחדל. " - default_other_enable_quoting: "Enable quote reply for highlighted text by default." - default_other_dynamic_favicon: "Show new/updated topic count on browser icon by default." - default_other_disable_jump_reply: "Don't jump to user's post after they reply by default." - default_categories_watching: "List of categories that are watched by default." - default_categories_tracking: "List of categories that are tracked by default." - default_categories_muted: "List of categories that are muted by default." + default_email_direct: "שלח מייל כשמישהו מצטט/מגיב-ל/מזכיר או מזמין משתמש, בתור ברירת מחדל." + default_email_mailing_list_mode: "שלח מייל עבור כל פוסט חדש בתור ברירת מחדל. " + default_email_mailing_list_mode_frequency: "משתמשים שאיפשרו את מצב רשימת התפוצה יקבלו מיילים בתדירות זו כברירת מחדל." + disable_mailing_list_mode: "לא לאפשר למשתמשים לעבור למצב רשימת תפוצה." + default_email_always: "שלח התראות למייל גם כאשר המשתמש פעיל, בתור ברירת מחדל." + default_email_previous_replies: "כלילת תגובות קודמות במיילים כברירת מחדל." + default_email_in_reply_to: "הכללת קטע של פוסט עליו עונים במיילים כברירת מחדל." + default_other_new_topic_duration_minutes: "ברירת המחדל הגלובאלית עבור תנאי שבשבילו נושא ייחשב חדש." + default_other_auto_track_topics_after_msecs: "ברירת המחדל הגלובאלית עבור הזמן לפני שנושא נעקב אוטומטית" + default_other_notification_level_when_replying: "ברירת מחדל גלובלית של רמת התראה כאשר משתמשים מגיבים לנושא." + default_other_external_links_in_new_tab: "פתח קישורים חיצונים בטאב חדש, בתור ברירת מחדל." + default_other_enable_quoting: "איפשור תגובות עם ציטוט לטקסט מצוטט כברירת מחדל." + default_other_dynamic_favicon: "הציגו ספירה של נושאים חדשים/מעודכנים באייקון של הדפדפן כברירת מחדל." + default_other_disable_jump_reply: "כברירת מחדל לא לקפוץ לפוסטים של משתמשים לאחר שהם עונים." + default_other_like_notification_frequency: "הודיעו למשתמשים על לייקים כברירת מחדל" + default_topics_automatic_unpin: "ביטול אוטומטי של נעיצת נושאים כאשר משתמשים מגיעים לתחתית - כברירת מחדל." + default_categories_watching: "רשימת קטגוריות שנצפית כברירת מחדל." + default_categories_tracking: "רשימת קטגוריות שנעקבת כברירת מחדל." + default_categories_muted: "רשימת קטגוריות שמושתקות כברירת מחדל." + default_categories_watching_first_post: "רשימת קטגוריות שבה הפוסט הראשון בכל נושא ייצפה אוטומטית." + max_user_api_reqs_per_day: "המספר המקסימלי של בקשות API של משתמש ליום" + max_user_api_reqs_per_minute: "המספר המקסימלי של בקשות API של משתמש לדקה" + allow_user_api_keys: "איפשור יצירת מפתחות API למשתמשים" + allow_user_api_key_scopes: "רשימת אזורים מותרים למפתחות API של משתמשים" + max_api_keys_per_user: "מספר מקסימלי של מפתחות API של משתמש לכל משתמש" + min_trust_level_for_user_api_key: "רמת אמון נדרשת לייצור של מפתחות API של משתמש" + allowed_user_api_auth_redirects: "URL מורשה להפניה מחדש לאימות עבור מפתחות API של משתמש" + allowed_user_api_push_urls: "URLים מורשים לדחיפת שרת ל API של משתמשים." + tagging_enabled: "לאפשר תגיות על נושאים?" + min_trust_to_create_tag: "רמת האמון המינימלית שנדרשת כדי ליצור תג." + max_tags_per_topic: "מספר התגים המקסימלי שניתן להקצות לנושא." + max_tag_length: "אורך התג המקסימלי (מספר תווים)." + max_tag_search_results: "כאשר מחפשים תגים, המספר המקסימלי של תוצאות להצגה." + show_filter_by_tag: "הצגת תפריט נפתח כדי לסנן רשימת נושאים לפי תג." + max_tags_in_filter_list: "מספר מירבי של תגיות להצגה בתפריט הסינון הנפתח. יוצגו התגים שבשימוש הרב ביותר." + tags_sort_alphabetically: "הצגת תגים בסדר אלפביתי. ברירת המחדל היא להציג אותם על פי פופולאריות." + tag_style: "סגנון ויזואלי לתג עיטורים." + staff_tags: "רשימת תגים שניתנים להחלה רק על ידי אנשי צוות" + min_trust_level_to_tag_topics: "רמת אמון מינימלית שדרושה כדי לתייג נושאים" + suppress_overlapping_tags_in_list: "אם תגים תואמים בדיוק מילים בכותרות נושאים, אל תציגו את התגים" + remove_muted_tags_from_latest: "אל תציגו נושאים מתוייגים עם תגים מושתקים ברשימת הנושאים האחרונים." + company_short_name: "שם חברה (קצר)" + company_full_name: "שם חברה (מלא)" + company_domain: "שם מתחם (דומיין) חברה" errors: invalid_email: "כתובת דוא\"ל לא קיימת." invalid_username: "אין משתמש/ת עם שם משתמש כזה." @@ -981,62 +1280,89 @@ he: invalid_integer_max: "הערך חייב לא יכול להיות גדול מ- %{max}." invalid_integer: "הערך חייב להיות מספר שלם." regex_mismatch: "הערך אינו תואם את המבנה הנדרש." - must_include_latest: "Top menu must include the 'latest' tab." + must_include_latest: "התפריט העליון חייב להכיל את טאב ה״מובילים״." invalid_string: "ערך לא תקין." invalid_string_min_max: "חייב להיות בין %{min} ל- %{max} תווים." invalid_string_min: "חייב להיות לפחות %{min} תווים." invalid_string_max: "נדרשים לא יותר מ-%{max} תווים." - invalid_reply_by_email_address: "Value must contain '%{reply_key}' and be different from the notification email." + invalid_reply_by_email_address: "הערך חייב להכיל '%{reply_key}' ולהיות שונה ממייל ההתראה." + invalid_alternative_reply_by_email_addresses: "על הערכים חייבים לכלול '%{reply_key}' ולהיות שונים ממייל העדכון." + pop3_polling_host_is_empty: "עליכם לקבוע 'שרת תשאול pop3' לפני שתאפשרו תשאול POP3." + pop3_polling_username_is_empty: "עליכם לקבוע 'שם-משתמש לתשאול pop3' לפני שתאפשרו תשאול POP3." + pop3_polling_password_is_empty: "עליכם לקבוע 'סיסמת תשאול pop3' לפני שתאפשרו תשאול POP3." + pop3_polling_authentication_failed: "אימות POP3 נכשל. אנא וודאו את הרשאות ה pop3 שלכם." + reply_by_email_address_is_empty: "אתם חייבים להגדיר את 'מענה באמצעות כתובת מייל' לפני שאתם מאפשרים תגובה באמצעות מייל." + email_polling_disabled: "עליכם לאפשר ידני או תשאול POP3 לפני שתאפשרו מענה באמצעות מייל." + user_locale_not_enabled: "לפני שתוכלו להפעיל אפשרות זאת, יש לאפשר \"הגדרות מקומיות מותאמות משתמש/ת\"" + invalid_regex: "ביטוי רגולרי לא תקין או לא מותר." search: - within_post: "#%{post_number} פרסומים של %{username}" + within_post: "#%{post_number} פוסטים של %{username}" types: category: 'קטגוריות' topic: 'תוצאות' user: 'משתמשים' - original_poster: "מפרסם מקורים" - most_posts: "מירב ההודעות" - most_recent_poster: "המפרסם האחרון" - frequent_poster: "מפרסם מתמיד" + sso: + not_found: "לא מצאנו את החשבון שלכם. אנא צרו קשר עם מנהל האתר." + account_not_approved: "החשבון שלכם ממתין לאשור. תקבלו דוא\"ל עם עדכון כאשר הוא יאושר." + unknown_error: "יש בעיה עם החשבון שלכם. אנא צרו קשר עם מנהל האתר." + timeout_expired: "הכניסה לחשבון פקעה, אנא נסו להתחבר שוב." + original_poster: "מפרסמים מקוריים" + most_posts: "מירב הפוסטים" + most_recent_poster: "המפרסמים האחרונים" + frequent_poster: "מפרסמים מתמידים" redirected_to_top_reasons: new_user: "ברוכים הבאים לקהילה! אלה הנושאים הפופולריים האחרונים אצלנו." - not_seen_in_a_month: "ברוך שובך! לא ראינו אותך כבר כמה זמן, אה? הנה כמה נושאים פופולאריים שהתווספו מאז שהיית כאן." + not_seen_in_a_month: "ברוך שובכם! לא ראינו אתכם כבר כמה זמן, אה? הנה כמה נושאים פופולאריים שהתווספו מאז שהייתם כאן." + merge_posts: + edit_reason: + one: "פוסט מוזג על ידי %{username}" + other: "%{count} פוסטים מוזגו על ידי %{username}" + errors: + different_topics: "לא ניתן למזג פוסטים ששייכים לנושאים שונים." + different_users: "לא ניתן למזג פוסטים ששייכים למשתמשים שונים." move_posts: new_topic_moderator_post: one: "תגובה פוצלה לנושא חדש: %{topic_link}" other: "%{count} תגובות פוצלו לנושא חדש: %{topic_link}" existing_topic_moderator_post: one: "תגובה אוחדה לנושא קיים: %{topic_link}" - other: "%{count}תגובות אוחדו לנושא קיים: %{topic_link}" + other: "%{count} תגובות אוחדו לנושא קיים: %{topic_link}" change_owner: post_revision_text: "בעלות הועברה מהמשתמש %{old_user} אל %{new_user}" deleted_user: "משתמש שנמחק" emoji: errors: name_already_exists: "מצטערים, השם '%{name}' כבר תפוס על ידי emoji אחר." - error_while_storing_emoji: "מצטער, היתה שגיאה בזמן שמירת ה-emoji." + error_while_storing_emoji: "מצטערים, היתה שגיאה בזמן שמירת ה-emoji." topic_statuses: archived_enabled: "הנושא הזה נכנס לארכיון. הוא קפוא ולא ניתן לשינוי בכל דרך." archived_disabled: "הנושא הזה הוצא מהארכיון. הוא כבר לא קפוא, וניתן לשינוי." - closed_enabled: "הנושא הזה נעול. לא ניתן להגיב תגובות חדשות." + closed_enabled: "הנושא הזה סגור. לא ניתן להגיב תגובות חדשות." closed_disabled: "הנושא הזה פתוח. ניתן להגיב תגובות חדשות." + autoclosed_message_max_posts: + one: "הודעה זו נסגרה אוטומטית אחרי שהגיעה למספר המקסימלי של תגובות: 1 ." + other: "הודעה זו נסגרה אוטומטית אחרי שהגיעה למספר המקסימלי של תגובות: %{count} ." + autoclosed_topic_max_posts: + one: "נושא זה נסגר אוטומטית לאחר שהגיע למספר המקסימלי של תגובות: 1." + other: "נושא זה נסגר אוטומטית אחרי שהגיע למספר המקסימלי של תגובות: %{count} ." autoclosed_enabled_days: one: "הנושא הזה ננעל אוטומטית לאחר יום אחד. תגובות חדשות לא מתקבלות." - other: "נושא זה נסגר באופן אוטומטי לאחר %{count}. לא ניתן להוסיף תגובות חדשות." + other: "נושא זה נסגר באופן אוטומטי לאחר %{count} ימים. לא ניתן להוסיף תגובות חדשות." autoclosed_enabled_hours: one: "נושא זה ננעל לאחר שעה אחת. לא ניתן להוסיף תגובות חדשות." - other: "נושא זה נסגר אוטומטית לאחר %{count}. לא ניתן להוסיף תגובות חדשות." + other: "נושא זה נסגר אוטומטית לאחר %{count} שעות. לא ניתן להוסיף תגובות חדשות." autoclosed_enabled_minutes: one: "הנושא הזה ננעל אוטומטית לאחר דקה. תגובות חדשות לא מתקבלות." - other: "הנושא הזה ננעל אוטומטית לאחר %{count} דקות. תגובות חדשות לא מתקבלות." + other: "הנושא הזה נסגר אוטומטית לאחר %{count} דקות. תגובות חדשות לא מתקבלות." autoclosed_enabled_lastpost_days: one: "נושא זה ננעל אוטומטית לאחר יום אחד מהתגובה האחרונה. תגובות חדשות לא מתקבלות." - other: "נושא זה ננעל אוטומטית לאחר %{count} ימים מהתגובה האחרונה. תגובות חדשות לא מתקבלות." + other: "נושא זה נסגר אוטומטית לאחר %{count} ימים מהתגובה האחרונה. תגובות חדשות לא מתקבלות." autoclosed_enabled_lastpost_hours: one: "נושא זה נסגר שעה לאחר התגובה האחרונה. תגובות נוספות אינן מותרות יותר." other: "נושא זה נסגר אוטומטית %{count} שעות לאחר התגובה האחרונה. תגובות נוספות אינן מותרות יותר." autoclosed_enabled_lastpost_minutes: one: "נושא זה ננעל אוטומטית לאחר דקה מהתגובה האחרונה. תגובות חדשות לא מתקבלות." - other: "נושא זה ננעל אוטומטית לאחר %{count} דקות מהתגובה האחרונה. תגובות חדשות לא מתקבלות." + other: "נושא זה נסגר אוטומטית לאחר %{count} דקות מהתגובה האחרונה. תגובות חדשות לא מתקבלות." autoclosed_disabled: "הנושא הזה נפתח. ניתן להגיב תגובות חדשות." autoclosed_disabled_lastpost: "הנושא הזה נפתח. ניתן להגיב תגובות חדשות." pinned_enabled: "הנושא הזה ננעץ. הוא יופיע בראש הקטגוריה שלו עד שיוסר מנעיצה על ידי מנהל או שכפתור נקה נעיצות נלחץ." @@ -1050,42 +1376,64 @@ he: incorrect_username_email_or_password: "שם משתמש, דואר אלקטרוני או סיסמה לא נכונים" wait_approval: "תודה על שנרשמת. אנחנו ניידע אותך כשהחשבון שלך יאושר." active: "החשבון שלך הופעל ומוכן לשימוש." - activate_email: "כמעט סיימנו! שלחנו מייל אקטיבציה אל %{email}. אנא עקבו אחר ההנחיות במייל כדי להפעיל את חשבונך.
אם המייל לא יגיע, בדקו את תיקיית הספאם שלכם, או נסו להתחבר פעם נוספת כדי לשלוח מייל אקטיביזציה נוסף.
" - not_activated: "אינך יכול להתחבר עדיין. שלחנו לך הודעת דואר אלקטרוני לאישור. בבקשה עקוב אחר ההוראות בהודעה כדי להפעיל את חשבונך." - not_allowed_from_ip_address: "אינך יכול/ה להתחבר כ-%{username} מכתובת IP זו. " - admin_not_allowed_from_ip_address: "אינך יכול/ה להתחבר כמנהל מערכת מכתובת IP זו." + activate_email: "כמעט סיימנו! שלחנו מייל אקטיבציה אל %{email}. אנא עקבו אחר ההנחיות במייל כדי להפעיל את חשבונכם.
אם המייל לא יגיע, בדקו את תיקיית הספאם שלכם, או נסו להתחבר פעם נוספת כדי לשלוח מייל אקטיביזציה נוסף.
" + not_activated: "אינכם יכולים להתחבר עדיין. שלחנו לכם הודעת דואר אלקטרוני לאישור. בבקשה עיקבו אחר ההוראות במייל כדי להפעיל את חשבונכם." + not_allowed_from_ip_address: "אינכם יכולים להתחבר כ-%{username} מכתובת IP זו. " + admin_not_allowed_from_ip_address: "אינכם יכולים להתחבר כמנהלי מערכת מכתובת IP זו." suspended: "אינך יכול להתחבר עד %{date}." suspended_with_reason: "חשבון הושעה עד %{date}: %{reason}" errors: "%{errors}" - not_available: "לא זמין. נסה %{suggestion}?" - something_already_taken: "משהו השתבש, אולי שם המשתמש או כתובת הדאור האלקטרוני כבר בשימוש. נסה את קישור שכחתי סיסמה." - omniauth_error: "סליחה, הייתה שגיאה בוידוא חשבונך. אולי לא אישרת את הוידוא? " - omniauth_error_unknown: "משהו השתבש במהלך עיבוד ההתחברות שלך, אנא נסה שנית." + not_available: "לא זמין. נסו %{suggestion}?" + something_already_taken: "משהו השתבש, אולי שם המשתמש או כתובת הדואר האלקטרוני כבר בשימוש. נסו את קישור שכחתי סיסמה." + omniauth_error: "סליחה, הייתה שגיאה בוידוא חשבונך. אולי לא אישרת את הוידוא?" + omniauth_error_unknown: "משהו השתבש במהלך עיבוד ההתחברות שלך, אנא נסו שנית." + authenticator_error_no_valid_email: "אף אחת מכתובות המייל שמקושרות ל %{account} אינה מותרת. ייתכן ותצטרכו לכוונן את חשבונכם עם כתובת מייל אחרת." new_registrations_disabled: "הוספת חשבונות חדשים אינה מותרת בעת זו." password_too_long: "סיסמאות מוגבלות ל-200 תווים." email_too_long: "המייל שהזנת ארוך מדי. שמות מייל צריכים להכיל לכל היותר 254 תוים, ושמות דומיין צריכים להכיל לכל היותר 253 תוים." - reserved_username: "שם משתמש זה אסור. " + reserved_username: "שם משתמש זה אינו מורשה." missing_user_field: "לא מילאת את כל שדות המשתמש/ת" close_window: "האימות הושלם. סגרו חלון זה כדי להמשיך." + already_logged_in: "אופס, נראה שאתם מנסים לקבל הזמנה שנועדה למשתמש אחר. אם אתם לא %{current_user}, אנא התנתקו ונסו שוב." user: no_accounts_associated: "אין חשבונות מקושרים." + deactivated: "הושבת בעקבות מיילים רבים מידי שהוחזרו ל '%{email}'." username: short: "חייבים להיות לפחות %{min} תווים" long: "נדרשים לא יותר מ-%{max} תווים" characters: "חייב לכלול מספרים, אותיות ומקפים תחתונים בלבד." unique: "חייב להיות ייחודי" blank: "חייב להיות מלא" - must_not_contain_two_special_chars_in_seq: "לא יכול להכיל רצף של 2 או יותר תווים מיוחדים (.-_)" + must_begin_with_alphanumeric_or_underscore: "חייב להתחיל באות, מספר, או קו תחתון" + must_end_with_alphanumeric: "חייב להסתיים באות או מספר" + must_not_contain_two_special_chars_in_seq: "לא יכול להכיל רצף של 2 או יותר תווים מיוחדים (.-_)" + must_not_end_with_confusing_suffix: "אסור שיסתיים עם סיומות מבלבלות כמו .json או .png וכד׳." email: not_allowed: "לא מורשה מכתובת הדואר האלקטרוני הזו. בבקשה השתמש בכתובת אחרת." blocked: "לא מורשה." + revoked: "לא יישלחו מיילים ל '%{email}' עד %{date}." ip_address: - blocked: "הרשמות חדשות אסורות מכתובת ה-IP שלך. " - max_new_accounts_per_registration_ip: "הרשמות חדשות אסורות מכתובת ה-IP שלך. (עברת את הסף המותר) צרו קשר עם מנהל." + blocked: "הרשמות חדשות אסורות מכתובת ה-IP שלך." + max_new_accounts_per_registration_ip: "הרשמות חדשות אסורות מכתובת ה-IP שלך. (עברת את הסף המותר) צרו קשר עם איש צוות." + website: + domain_not_allowed: "אתר לא תקין. מתחמים מותרים: %{domains}" flags_reminder: + flags_were_submitted: + one: "דגלים נשלחו לפני למעלה משעה. אנא סיקרו אותם." + other: "דגלים נשלחו לפני יותר מ %{count} שעות. אנא סיקרו אותם." subject_template: - one: "סימון אחד ממתין לטיפול" - other: "%{count} סימונים ממתינים לטיפול" + one: "דגל אחד ממתין לטיפול" + other: "%{count} דגלים ממתינים לטיפול" + unsubscribe_mailer: + subject_template: "אשרו שאינכם מעוניינים יותר לקבל עדכוני דוא\"ל מ%{site_title}" + text_body_template: | + מישהו (כנראה אתם?) ביקש לא לקבל יותר עדכוני מייל מ %{site_domain_name} לכתובת זו. + אם אתם מעוניינים לאשר זאת, אנא לחצו על הקישור הזה: + + %{confirm_unsubscribe_link} + + + אם אתם מעוניינים להמשיך לקבל עדכונים במייל, אתם יכולים להתעלם ממייל זה. invite_mailer: subject_template: "הוזמנת על ידי %{invitee_name} ל '%{topic_title}' ב%{site_domain_name}" text_body_template: | @@ -1099,110 +1447,272 @@ he: > %{site_title} -- %{site_description} - אם את/ה מעוניינים להצטרף לדיון, הקישו על הקישור הבא: + אם אתם מעוניינים להצטרף לדיון, הקישו על הקישור הבא: %{invite_link} הזמנה זו נשלחה על ידי משתמש/ת מוכר/ת ולכן אתם יכולים להשיב לדיון הנ"ל באופן מיידי. - invite_forum_mailer: - subject_template: "%{invitee_name} הזמינ/ה אותך להצטרף ל%{site_domain_name}" - invite_password_instructions: - subject_template: "צרו סיסמא עבור חשבון ה-%{site_name} שלכם." + custom_invite_mailer: + subject_template: "%{invitee_name} הזמין/הזמינה אותך לדיון '%{topic_title}' באתר %{site_domain_name}" text_body_template: | - תודה שקיבלת את ההזמנה שלך ל %{site_name} -- ברוך הבא! - לחץ על הקישור בשביל לבחור סיסמא: %{base_url}/users/password-reset/%{email_token} - (אם הקישור פג תוקף, בחר ב"שכחתי אץ הסיסמא שלי" בהתחברות.) + %{invitee_name} הזמין/הזמינה אותך לדיון + + > **%{topic_title}** + > + > %{topic_excerpt} + + באתר + + > %{site_title} -- %{site_description} + + מסר מ%{invitee_name}: + + %{user_custom_message} + + אם את/ה מעוניינ/ת, לחצו על הקישור: + %{invite_link} + + הזמנה זו נשלחה על ידי משתמש מוכר, כך שתוכלו להגיב לדיון מיידית. + invite_forum_mailer: + subject_template: "%{invitee_name} הזמינ/ה אתכם להצטרף ל%{site_domain_name}" + text_body_template: | + %{invitee_name} הזמין/ה אתכם להצטרף ל + + > **%{site_title}** + > + > %{site_description} + + אם אתם מעוניינים, לחצו על הקישור הבא: + + %{invite_link} + + הזמנה זו נשלחה ממשתמש/ת מוכר/ת באתר. החשבון יווצר עבורכם באופן אוטומטי. + custom_invite_forum_mailer: + subject_template: "%{invitee_name} הזמין/ה אתכם להצטרף ל %{site_domain_name}" + text_body_template: | + %{invitee_name} הזמינו אתכם להצטרף ל + + > **%{site_title}** + > + > %{site_description} + + הודעה מ %{invitee_name}: + + %{user_custom_message} + + אם אתם מעוניינים, לחצו על הקישור הבא: + + %{invite_link} + + הזמנה זו נשלחה ממשתמשים מוכרים באתר, כך שהחשבון שלכם יווצר באופן אוטומטי. + invite_password_instructions: + subject_template: "צרו סיסמה עבור חשבון ה-%{site_name} שלכם." + text_body_template: | + תודה שקיבלתם את ההזמנה שלכם ל %{site_name} -- ברוכים הבאים! + לחצו על הקישור בשביל לבחור סיסמה: %{base_url}/users/password-reset/%{email_token} + (אם הקישור פג תוקף, בחרו ב"שכחתי את הסיסמה שלי" בהתחברות.) test_mailer: - subject_template: "[%{site_name}] Email Deliverability Test" + subject_template: "[%{site_name}] מייל בדיקת שליחתיות" + text_body_template: | + זהו מייל בדיקה מ + + [**%{base_url}**][0] + + הגעה של מיילים ליעד היא עיניין מסובך. הנה כמה דברים חשובים שאתם צריכים לבדוק קודם כל: + + - היו *בטוחים* שקבעתם כמו שצריך את כתובת ה from: של `מייל ההתראה` בהגדרות האתר. **הדומיין שקבוע בכתובת ה "from" של המיילים שאתם שולחים הוא הדומיין שמיילים יאומתו מולו**. + + - דעו איך להסתכל על המקור הגולמי של המיילים בתוכנת המיילים שלכם, כדי שתוכלו לבחון את כותרות המיילים לרמזים חשובים. בג׳ימייל, זו אופציית ״הצג מקור״ בתפריט הנפתח בכותרת של כל מייל. + + - חשוב: **האם אצל ספק האינטרנט שלכם רשומה רשומת DNS הפוכה כדי לקשר את שמות הדומיין וכתובות ה IP שאתם שולחים מהן מיילים? [בידקו את רשומת ה Reverse PTR שלכם] [2] כאן. אם ספק האינטרנט שלכם לא מכניס את המצביע לרשומת ה DNS ההפוכה הנכון, זה מאוד לא סביר שמיילים שלכם יגיעו ליעד. + + - האם [רשומת ה SPF][8] שלכם נכונה? [בידקו את רשומת ה SPF שלכם][1] כאן. שימו לב ש TXT זה סוג הרשומה הרשמי והנכון ל SPF. + + - האם [רשומת ה DKIM][3] שלכם נכונה? זה ישפר משמעותית את שליחת המיילים שלכם. [בידקו את רשומת ה DKIM שלכם][7] כאן. + + - אם אתם מריצים את שרת המייל של עצמכם, וודאו שכתובות ה IP של שרת המייל שלכם [לא נמצאות באף רשימה שחורה][4]. וודאו גם שהשרת בטוח שולח שם שרת מלא (fully-qualified hostname) שעושה resolve ל DNS בהודעת ה HELO שלו. אם לא, זה יגרום למיילים שלכם להדחות על ידי שירותי מייל רבים. + + - אנחנו ממליצים בחום ש**תשלחו מייל בדיקה ל[mail-tester.com][mt]** כדי לוודא שכל מה שמוזכר למעלה עובד כיאות. + + (הדרך *הקלה* היא ליצור חשבון חינמי ב [SendGrid][sg], [SparkPost][sp], [Mailgun][mg] או [Mailjet][mj], שיש להם תוכניות מיילים חינמיות נדיבות ויהיו בסדר לקהילות קטנות. עדיין תצטרכו להקים רשומות SPF ו DKIM בשירות ה DNS שלכם!) + + אנחנו מקווים שקיבלתם את מייל הבדיקה הזה בסדר! + + בהצלחה, + + חבריכם ב[Discourse](http://www.discourse.org) + + [0]: %{base_url} + [1]: http://www.kitterman.com/spf/validate.html + [2]: http://mxtoolbox.com/ReverseLookup.aspx + [3]: http://www.dkim.org/ + [4]: http://whatismyipaddress.com/blacklist-check + [7]: https://www.mail-tester.com/spf-dkim-check + [8]: http://www.openspf.org/SPF_Record_Syntax + [sg]: https://goo.gl/r1WMF6 + [sp]: https://www.sparkpost.com/ + [mg]: http://www.mailgun.com/ + [mj]: https://www.mailjet.com/pricing + [mt]: http://www.mail-tester.com/ new_version_mailer: subject_template: "[%{site_name}] גרסת Discourse חדשה, עדכון זמין." + text_body_template: | + יש! יצאה גרסה חדשה של [Discourse](http://www.discourse.org) + + הגרסה שלכם: %{installed_version} + הגרסה החדשה: **%{new_version}** + + - שדרגו באמצעות כפתור **[שדרוג בלחיצה-אחת בדפדפן](%{base_url}/admin/upgrade)** הפשוט שלנו + + - בידקו מה חדש ב[יומן השינויים בגיטהאב](https://github.com/discourse/discourse/commits/master) + + - בקרו את [meta.discourse.org](https://meta.discourse.org) לחדשות, דיונים, ותמיכה ב Discourse new_version_mailer_with_notes: - subject_template: "[%{site_name}] update available" + subject_template: "[%{site_name}] עדכון זמין" + text_body_template: | + יש! יצאה גרסה חדשה של [Discourse](http://www.discourse.org) + + הגרסה שלכם: %{installed_version} + הגרסה החדשה: **%{new_version}** + + - שדרגו באמצעות כפתור **[שדרוג בלחיצה-אחת בדפדפן](%{base_url}/admin/upgrade)** הפשוט שלנו + + - בידקו מה חדש ב[יומן השינויים בגיטהאב](https://github.com/discourse/discourse/commits/master) + + - בקרו ב-[meta.discourse.org](https://meta.discourse.org) לחדשות, דיונים, ותמיכה ב Discourse + + ### הערות בנוגע לגרסה + + %{notes} queued_posts_reminder: subject_template: - one: "[%{site_name}] תגובה אחת מחכה לבדיקה" - other: "[%{site_name}] %{count} תגובות ממתינים לבדיקה" + one: "[%{site_name}] פוסט 1 מחכה לסקירה" + other: "[%{site_name}] %{count} פוסטים ממתינים לסקירה" + text_body_template: | + שלום, + + פוסטים של משתמשים חדשים הושהו לצורך בדיקה והם כרגע ממתינים לסקירה. [אשרו או דחו אותם כאן](%{base_url}/queued-posts). flag_reasons: - off_topic: "הפרסום שלך סומן כ **מחוץ לנושא**: הקהילה מרגישה שהוא לא מתאים לנושא, כפי שמוגדר על ידי הכותרת והפרסום הראשון. " - inappropriate: "התגובה שלך סומנה כ**לא מתאימה**: הקהילה מרגישה שהוא פוגעני או הפרה של [our community guidelines](/guidelines)" - spam: "הפרסום שלך סומן כ**ספאם**: הקהילה מרגישה שזה פרסומת, דבר שהוא קידום מכירות באופיו במקום להיות שימושי או רלוונטי לנושא. " - notify_moderators: "הפרסום שלך סומן **לתשומת לב מנהל**: הקהילה מרגישה שמשהו בפרסום דורש התערבות ידנית של צוות האתר. " + off_topic: "הפוסט שלכם סומן כ **מחוץ לנושא**: הקהילה מרגישה שהוא לא מתאים לנושא, כפי שמוגדר על ידי הכותרת והפוסט הראשון. " + inappropriate: "התגובה שלך סומנה כ**לא מתאימה**: הקהילה מרגישה שהיא פוגענית או הפרה של [הנחיות הקהילה](/guidelines)" + spam: "הפוסט שלך סומן כ**ספאם**: הקהילה מרגישה שזה פרסומת, דבר שהוא קידום מכירות באופיו במקום להיות שימושי או רלוונטי לנושא. " + notify_moderators: "הפוסט שלך דוגל **לתשומת לב מנחה**: הקהילה מרגישה שמשהו בפוסט דורש התערבות ידנית של צוות האתר. " flags_dispositions: agreed: "תודה שעדכנת אותנו. אנחנו מסכימים שיש כאן בעיה ואנחנו מנסים לבדוק את העניין." - agreed_and_deleted: "תודה שעדכנת אותנו. אנחנו מסכימים שישנה בעיה והסרנו את הפרסום." + agreed_and_deleted: "תודה שעדכנת אותנו. אנחנו מסכימים שישנה בעיה והסרנו את הפוסט." disagreed: "תודה שעדכנת אותנו. אנחנו בודקים את זה." - deferred: "תודה שעדכנתםאותנו. אנחנו בודקים את העניין." - deferred_and_deleted: "תודה שעדכנתם אותנו. הסרנו את הפרסום." - temporarily_closed_due_to_flags: "נושא זה סגור באופן זמני בעקבות מספר רב של סימונים של הקהילה. " + deferred: "תודה שעדכנתם אותנו. אנחנו בודקים את העניין." + deferred_and_deleted: "תודה שעדכנתם אותנו. הסרנו את הפוסט." + temporarily_closed_due_to_flags: "נושא זה סגור באופן זמני בעקבות מספר רב של דגלים של הקהילה. " system_messages: + post_hidden: + subject_template: "פוסט הוסתר על ידי דגלים של הקהילה" + text_body_template: | + שלום, + + זוהי הודעה אוטומטית מ %{site_name} כדי ליידע אתכם שפוסט שלכם הוחבא. + + %{base_url}%{url} + + %{flag_reason} + + מספר חברי קהילה דיגלו פוסט זה לפני שהוא הוחבא, אז אנא שיקלו לערוך אותו כדי לענות על המשוב שלהם. **אתם יכולים לערוך את הפוסט שלכם לאחר %{edit_delay} דקות, והוא יוצג מחדש אוטומטית.** + + אך עם זאת, אם הפוסט יוחבא שוב על ידי הקהילה, הוא יישאר מוחבא עד לטיפול של חבר צוות - וייתכן ותנקט פעולה נוספת, כולל השהייה אפשרית של החשבון. + + להנחיות נוספות, אנא פנו ל[הנחיות הקהילה](%{base_url}/guidelines). + usage_tips: + text_body_template: | + כמה טיפים לגבי איך להתחיל כמשתמשים חדשים, [ראו את הפוסט הזה](http://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/). + + ככל שתשתתפו כאן, נכיר אתכם, ומגבלות זמניות על משתמשים חדשים יוסרו. במהלך הזמן תצבעו [דרגות אמון](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) שכוללות יכולות לסייע לנו לנהל את הקהילה שלנו ביחד. welcome_user: subject_template: "ברוכים הבאים ל %{site_name}!" text_body_template: | - תודה שהצטרפת ל %{site_name}! + תודה שהצטרפתם ל %{site_name}! %{new_user_tips} - אנו מאמינים ומאמינות ב [התנהגות קהילתית מתורבתת ](%{base_url}/guidelines) בכל זמן. + אנו מאמינים ב[התנהגות קהילתית מתורבתת](%{base_url}/guidelines) בכל זמן. תהנו! - (אם ברצונך לתקשר עם [מנהל אתר](%{base_url}/about) כמשתמשת חדשה, השיבי להודעה הזו. ) + (אם ברצונכם לתקשר עם [מנהל האתר](%{base_url}/about) כמשתמשים חדשים, השיבו להודעה הזו.) welcome_invite: - subject_template: "Welcome to %{site_name}!" + subject_template: "ברוכים הבאים ל %{site_name}!" text_body_template: | - תודה שקיבלת את ההזמנה שלך ל %{site_name} - ברוכים הבאים! + תודה שקיבלתם את ההזמנה שלכם ל %{site_name} - ברוכים הבאים! - יצרנו חשבון חדש **%{username}** בשבילך, ואת/ה מחובר/ת. תוכל/י תמיד לשנות את שמך באמצעות ביקור [ בפרופיל שלך ][prefs]. + יצרנו חשבון חדש **%{username}** בשבילכם, ואתם מחוברים. תוכלו תמיד לשנות את שמכם באמצעות ביקור [בפרופיל שלכם][prefs]. על מנת להתחבר שוב: - 1. השתמשו תמיד **באותו חשבון מייל מההזמנה המקורית** בעת ההתחברות. אחרת לא נוכל לדעת שזה את/ה! + 1. השתמשו תמיד **באותו חשבון מייל מההזמנה המקורית** בעת ההתחברות. אחרת לא נוכל לדעת שאלו אתם! - 2. צרו סיסמא יחודית עבור [ הפרופיל שלך] [prefs] והשתמשו בה בשביל להתחבר. + 2. צרו סיסמה ייחודית עבור [הפרופיל שלכם] [prefs] והשתמשו בה בשביל להתחבר. %{new_user_tips} - אנו מאמינים ומאמינות ב [התנהגות קהילתית מתורבתת] (%{base_url}/guidelines) בכל זמן. + אנו מאמינים ומאמינות ב[התנהגות קהילתית מתורבתת](%{base_url}/guidelines) בכל זמן. תהנו! - (אם ברצונך לתקשר עם [מנהלת אתר] (%{base_url}/about) כמשתמש/ת חדש/ה השיבי להודעה זו.) + (אם ברצונכם לתקשר עם [מנהלי האתר](%{base_url}/about) כמשתמשים חדשים, השיבו להודעה זו.) [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "הגיבוי הושלם בהצלחה." - text_body_template: "הגיבוי נוצר בהצלחה!\nבקר ב [admin > backup section](%{base_url}/admin/backups) על מנת להוריד את הגיבוי החדש שלך." + text_body_template: | + הגיבוי הצליח. + + בקרו ב [ניהול > גיבויים](%{base_url}/admin/backups) כדי להוריד את הגיבוי החדש שלכם. + + הנה היומן: + + ```טקסט + %{logs} + ``` backup_failed: subject_template: "הגיבוי נכשל." text_body_template: | הגיבוי נכשל. - הנה הלוג: + הנה היומן: + ```טקסט %{logs} + ``` restore_succeeded: subject_template: "השחזור הסתיים בהצלחה." - text_body_template: "השחזור הצליח." + text_body_template: | + השחזור הצליח. + + הנה היומן: + + ```טקסט + %{logs} + ``` restore_failed: subject_template: "השחזור נכשל" text_body_template: | - האחזור נכשל. - הנה רישום הפעולות: + השחזור נכשל. - ``` + הנה היומן: + + ```טקסט %{logs} ``` bulk_invite_succeeded: subject_template: "ההזמנה הקבוצתית עובדה בהצלחה" - text_body_template: "ההזמנה הקבוצתיתשלך עובדה, %{sent} הזמנות נשלחו." + text_body_template: "ההזמנה המרוכזת שלכם עובדה, %{sent} הזמנות נשלחו." bulk_invite_failed: - subject_template: "ההזמנה הקבותית עובדה עם שגיאות" + subject_template: "ההזמנה המרוכזת עובדה עם שגיאות" text_body_template: | ההזמנה הקבוצתית שלך עובדה, %{sent} הזמנות נשלחו עם %{failed} תקלה/ות. רישום המערכת: - Here's the log: + הנה היומן: ``` %{logs} @@ -1218,133 +1728,488 @@ he: csv_export_failed: subject_template: "ייצוא הנתונים נכשל" text_body_template: "צר לנו, אך ייצוא הנתונים שלכם נכשל. אנא בדקו את רישומי המערכת או צרו קשר עם איש/אשת צוות." + email_reject_insufficient_trust_level: + subject_template: "[%{site_name}] בעיית מייל -- רמת אמון לא מספיקה" + text_body_template: | + אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + לחשבון שלכם אין את רמת האמון הנדרשת כדי לפרסם נושאים חדשים לכתובת מייל זו. אם אתם חושבים שזו טעות, אנא פנו לחבר צוות. + email_reject_user_not_found: + subject_template: "[%{site_name}] בעיית מייל -- משתמש לא נמצא" + text_body_template: | + אנחנו מצטערים, אבל הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + התגובה שלכם נשלחה מכתובת מייל לא ידועה. נסו לשלוח מכתובת מייל אחרת, או ליצור קשר עם חבר צוות. + email_reject_screened_email: + subject_template: "[%{site_name}] בעיית מייל -- מייל חסום" + text_body_template: | + אנחנו מצטערים, אך הודעת המייל ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + התשובה שלכם נשלחה מכתובת מייל חסומה. נסו לשלוח מכתובת מייל אחרת, או צרו קשר עם חבר צוות. + email_reject_inactive_user: + subject_template: "[%{site_name}] בעיית מייל -- משתמש לא-פעיל" + text_body_template: | + אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + החשבון שלכם שמקושר לכתובת המייל הזו לא הופעל. אנא הפעילו את החשבון שלכם לפני שאתם שולחים מיילים למערכת. + email_reject_blocked_user: + subject_template: "[%{site_name}] בעיית מייל -- משתמש חסום" + text_body_template: | + אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + חשבונכם שקשור לכתובת מייל זו נחסם. + email_reject_reply_user_not_matching: + subject_template: "[%{site_name}] בעיית מייל -- נמען לא תואם" + text_body_template: | + אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + התשובה שלכם נשלחה מכתובת מייל שונה מזו שציפינו לה, אז אנחנו לא בטוחים אם זה אותו אדם. נסו לשלוח מכתובת מייל אחרת, או ליצור קשר עם חבר צוות. email_reject_no_account: subject_template: "[%{site_name}] בעיית מייל -- חשבון לא מזוהה" + text_body_template: | + אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + אנחנו לא מוצאים חשבונות שמתאימים לכתובת המייל שלכם. נסו לשלוח מכתובת מייל אחרת, או צרו קשר עם חבר צוות. email_reject_empty: subject_template: "[%{site_name}] בעיית מייל -- ללא תוכן" + text_body_template: | + אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + לא מצאנו תוכן תגובה במייל שלכם. + + אם אתם מקבלים את ההודעה הזו ו_כן_ כללתם תגובה, נסו שוב עם סיגנון פשוט יותר. email_reject_parsing: subject_template: "[%{site_name}] בעיית מייל -- תוכן לא זוהה." text_body_template: | - אנחנו מתנצלים, אבל הודעת המייל שלך ל- %{destination} (titled %{former_title}) לא עבדה. + אנחנו מצטערים, אך הודעת המייל שלכם ל- %{destination} (עם הכותרת %{former_title}) לא עבדה. - לא מצאנו תוכן במייל שלך. אנא ודא שהתגובה שלך בראש המייל, אנחנו לא יכולים לעבד תגובות בין השורות. + לא מצאנו תוכן במייל שלכם. **אנא ודאו שהתגובה שלכם בראש המייל** -- אנחנו לא יכולים לעבד תגובות בין השורות. email_reject_invalid_access: subject_template: "[%{site_name}] בעיית מייל -- גישה לא תקינה" + text_body_template: | + אנחנו מצטערים, אבל הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + לחשבון שלכם אין מספיק הרשאות כדי לפרסם נושאים חדשים בקטגוריה זו. אם אתם מאמינים שזו טעות, צרו קשר עם חבר צוות. + email_reject_strangers_not_allowed: + subject_template: "[%{site_name}] בעיית מייל -- גישה לא נכונה" + text_body_template: | + אנחנו מצטערים, אבל הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + הקטגוריה ששלחתם אליה את המייל הזה מאפשרת רק תגובות ממשתמשים עם חשבונות תקינים וכתובות מייל ידועות. אם אתם מאמינים שזו טעות, אנא פנו לחבר צוות. + email_reject_invalid_post: + subject_template: "[%{site_name}] בעיית מייל -- תקלה בפרסום" + text_body_template: | + אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + גורמים אפשריים: עיצוב מורכב, הודעה ארוכה מידי, הודעה קצרה מידי. אנא נסו שוב, או פרסמו דרך האתר אם התקלה חוזרת. + email_reject_invalid_post_specified: + subject_template: "[%{site_name}] בעיית מייל -- תקלה בפרסום" + text_body_template: | + אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + הסיבה: + + %{post_error} + + אם תוכלו לתקן את הבעיה, אנא נסו שוב. + email_reject_invalid_post_action: + subject_template: "[%{site_name}] בעיית מייל -- פעולה לא-תקנית" + text_body_template: | + אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + הפעולה לא זוהתה. אנא נסו שוב, או פרסמו דרך האתר אם התקלה נמשכת. email_reject_reply_key: subject_template: "[%{site_name}] בעיית מייל -- תו תגובה לא מוכר" + text_body_template: | + אנחנו מצטערים, אך הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + מפתח התגובה במייל לא תקין או לא ידוע, אז לא יכולנו להבין למה המייל הזה מגיב. אנא פנו לחבר צוות. + email_reject_bad_destination_address: + subject_template: "[%{site_name}] בעיית מייל -- כתובת To: לא ידועה" + text_body_template: | + אנחנו מצטערים, אבל הודעת המייל שלכם ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + אף אחד מייעדי המייל לא זוהה. אנא וודאו שאתם שולחים לכתובת המייל הנכונה שניתנה על-ידי הצוות. email_reject_topic_not_found: subject_template: "[%{site_name}] בעיית מייל -- לא נמצא נושא" + text_body_template: | + אנחנו מצטערים, אך הודעת המייל ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + הנושא שאתם מנסים להגיב אליו כבר לא קיים -- אולי הוא נמחק? אם אתם מאמינים שזו טעות, אנא פנו לחבר צוות. email_reject_topic_closed: subject_template: "[%{site_name}] בעיית מייל -- נושא נסגר" + text_body_template: | + אנחנו מצטערים, אך הודעת המייל ל %{destination} (עם הכותרת %{former_title}) לא עבדה. + + הנושא שאתם מגיבים אליו סגור כרגע ולא מקבל יותר תגובות. אם אתם מאמינים שזו טעות, אנא פנו לחבר צוות. email_reject_auto_generated: subject_template: "[%{site_name}] בעיית מייל -- תגובה נוצרה אוטומטית" + text_body_template: | + אנחנו מצטערים, אבל משהו לא עבד עם הודעת הדוא"ל שלך, שנשלחה אל %{destination} (titled %{former_title}). + + המייל ששלחת סומן כ"נכתב אוטומטית", מה שאומר שהוא נכתב על ידי מחשב ולא הוקלד על ידי אדם; איננו יכולים לקבל מיילים שכאלה. אם אתם מאמינים שזוהי תקלה, אנא צרו קשר עם איש/אשת צוות. email_error_notification: subject_template: "[%{site_name}] בעיית מייל -- בעיית אימות POP" + text_body_template: | + למרבה הצער, ארעה תקלה בזמן תשאול מיילים משרת ה POP. + + אנא וודאו שקבעתם נכון את הרשאות ה POP ב[הגדרות האתר](%{base_url}/admin/site_settings/category/email). + + אם יש ממשק ווב לחשבון ה POP, ייתכן ותצטרכו להתחבר לאתר וקבוע את ההגדרות שלכם שם. + too_many_spam_flags: + subject_template: "חשבון חדש בהשהיה" + text_body_template: | + שלום, + + זוהי הודעה אוטומטית מ %{site_name} כדי ליידע אתכם שהפוסטים שלכם מוחבאים זמנית כיוון שהם דוגלו על ידי הקהילה. + + כאמצעי זהירות, חשבונכם החדש נחסם מליצור תגובות או נושאים חדשים עד שחבר צוות יסקור את חשבונכם. אנחנו מצטערים על חוסר הנוחות. + + להנחיות נוספות, אנא פנו ל[הנחיות הקהילה](%{base_url}/guidelines). + too_many_tl3_flags: + subject_template: "חשבון חדש בהשהיה" + text_body_template: | + שלום, + + זוהי הודעה אוטומטית מ %{site_name} כדי ליידע אתכם שחשבונכם הושהה בגלל דגלים רבים מהקהילה. + + כאמצעי זהירות, חשבונכם החדש נחסם מליצור תגובות או נושאים חדשים עד שחבר צוות יוכל לסקור את חשבונכם. אנחנו מתנצלים על חוסר הנוחות. + + לפרטים נוספים, אנא פנו ל[הנחיות הקהילה](%{base_url}/guidelines). + blocked_by_staff: + subject_template: "חשבון זמנית בהשהיה" + text_body_template: | + שלום, + + זוהי הודעה אוטומטית מ %{site_name} כדי ליידע אתכם שהחשבון שלכם הושהה באופן זמני כאמצעי זהירות. + + אנא המשיכו לבקר, אך לא תוכלו לענות או ליצור נושאים עד ש[חבר צוות](%{base_url}/about) יסקור את הפוסטים האחרונים שלכם. אנחנו מתנצלים על אי הנוחות. + + להנחיות נוספות, אנא פנו ל[הנחיות הקהילה](%{base_url}/guidelines). + user_automatically_blocked: + subject_template: "המשתמש החדש %{username} נחסם על ידי דגלים של הקהילה" + text_body_template: | + זוהי הודעה אוטומטית. + + המשתמש החדש [%{username}](%{user_url}) נחסם אוטומטית כיוון שמספר משתמשים דיגלו פוסטים שלו. + + אנא [סיקרו את הדגלים](%{base_url}/admin/flags). אם %{username} נחסם בטעות מלפרסם, לחצו על כפתור שחרור הנעילה ב [דף הניהול למשתמש זה](%{user_url}). + + סף זה ניתן לשינוי באמצעות הגדרת האתר `block_new_user`. spam_post_blocked: - subject_template: "הודעות של המשתמש/ת החדש/ה %{username} נחסמו בשל קישורים חוזרים." + subject_template: "פוסים של המשתמש/ת החדש/ה %{username} נחסמו בשל קישורים חוזרים." + text_body_template: | + זוהי הודעה אוטומטית. + + המשתמש החדש [%{username}](%{user_url}) ניסה ליצור מספר פוסטים עם קישורים ל %{domains}, אבל הפוסטים האלו נחסמו כדי למנוע ספאם. המשתמש עדיין יכול ליצור פוסטים חדשים שלא מקשרים ל %{domains}. + + אנא [סיקרו את המשתמש](%{user_url}). + + ניתן לכוון זאת בהגדרות האתר `newuser_spam_host_threshold` ו`white_listed_spam_host_domains`. + unblocked: + subject_template: "החשבון כבר לא מושהה" + text_body_template: | + שלום, + + זוהי הודעה אוטומטית מ %{site_name} כדי ליידע אתכם שהחשבון שלכם כבר לא מושהה לאחר סקירה של הצוות. + + אתם יכולים עכשיו ליצור נושאים חדשים, ושוב להגיב לנושאים קיימים. תודה על הסבלנות. pending_users_reminder: subject_template: - one: "1 user waiting for approval" - other: "%{count} users waiting for approval" + one: "משתמש 1 ממתין לאישורכם" + other: "%{count} משתמשים ממתינים לאישורכם" text_body_template: | - There are new user signups waiting to be approved (or rejected) before they can access this forum. + ישנן הרשמות של משתמשים חדשים שממתינות לאישור (או דחייה) לפני שהם יוכלו לגשת לפורום זה. - [Please review them in the admin section](%{base_url}/admin/users/list/pending). + [אנא סיקרו אותם באזור הניהול](%{base_url}/admin/users/list/pending). download_remote_images_disabled: subject_template: "הורדת תמונות מרחוק מנוטרלת" text_body_template: "האפשרות \"הורדת תמונות מרוחקות\" נוטרלה בגלל שכל שטח האכסון שמוקצה ל\"תמונות שהורדו מרחוק\" נוצל." + dashboard_problems: + subject_template: "נמצאו בעיות" + text_body_template: | + כמה בעיות מדווחות ללוח המכוונים של האדמיניסטרטור. + + [אנא סיקרו וטפלו בהן](%{base_url}/admin). + unsubscribe_link: | + כדי להפסיק את המיילים האלו, [לחצו כאן](%{unsubscribe_url}). + unsubscribe_link_and_mail: | + כדי להפסיק את המיילים האלו, [לחצו כאן](%{unsubscribe_url}). + unsubscribe_mailing_list: | + אתם מקבלים את זה כיוון שאיפשרתם מצב רשימת תפוצה. + + כדי לבטל את המנוי על המיילים האלו, [לחצו כאן](%{unsubscribe_url}). subject_re: "תגובה: " subject_pm: "[PM] " user_notifications: - previous_discussion: "Previous Replies" + previous_discussion: "תגובות קודמות" + reached_limit: + one: "א-ז-ה-ר-ה: הגעתם לגבול של מיילים יומיים. הודעות מייל נוספות לא יישלחו." + other: "א-ז-ה-ר-ה: הגעתם לגבול של %{count} מיילים יומיים. הודעות מייל נוספות לא יישלחו." in_reply_to: "בתגובה ל" unsubscribe: - title: "Unsubscribe" - description: "Not interested in getting these emails? No problem! Click below to unsubscribe instantly:" + title: "ביטול מנוי" + description: "לא מעוניינים בקבלת המיילים האלו? אין בעיה! לחצו למטה כדי להסיר את עצמכם מהמנוי מיידית:" + reply_by_email: "[בקרו בנושא](%{base_url}%{url}) או ענו למייל זה כדי להגיב." + reply_by_email_pm: "[בקרו בהודעה](%{base_url}%{url}) או ענו למייל זה כדי להגיב." only_reply_by_email: "השיבו למייל זה כדי לענות." - posted_by: "Posted by %{username} on %{post_date}" + visit_link_to_respond: "[בקרו בנושא](%{base_url}%{url}) כדי לענות." + visit_link_to_respond_pm: "[בקרו בהודעה](%{base_url}%{url}) כדי לענות." + posted_by: "פורסם על ידי %{username} ב %{post_date}" + invited_to_private_message_body: | + %{username} הזמין אותך להודעה + + > **%{topic_title}** + > + > %{topic_excerpt} + + באתר + + > %{site_title} -- %{site_description} + invited_to_topic_body: | + %{username} הזמין/הזמינה אותך לדיון + + > **%{topic_title}** + > + > %{topic_excerpt} + + באתר + + > %{site_title} -- %{site_description} user_invited_to_private_message_pm: subject_template: "[%{site_name}] %{username} הזמין אותך להודעה '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_invited_to_private_message_pm_staged: + subject_template: "הוזמנת לדיון '%{topic_title}' על ידי [%{site_name}] %{username}" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_invited_to_topic: + subject_template: "הוזמנת לדיון שכותרתו '%{topic_title}' על ידי [%{site_name}] %{username}" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} user_replied: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_replied_pm: + subject_template: "[%{site_name}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_quoted: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_linked: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_mentioned: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_group_mentioned: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_posted: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_watching_first_post: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_posted_pm: subject_template: "[%{site_name}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_posted_pm_staged: + subject_template: "%{optional_re}%{topic_title}" + text_body_template: |2 + + %{message} digest: why: "סיכום קצר של %{site_link} מאז ביקורך האחרון ב-%{last_seen_at}" - new_activity: "New activity on your topics and posts:" - top_topics: "Recent posts the community enjoyed:" - other_new_topics: "Other New Topics:" - click_here: "click here" - read_more: "Read More" - more_topics: "ישנם %{new_topics_since_seen} נושאים חדשים נוספים." - more_topics_category: "עוד נושאים חדשים:" + since_last_visit: "מאז ביקורכם האחרון" + new_topics: "נושאים חדשים" + unread_messages: "הודעות שלא נקראו" + unread_notifications: "התראות שלא נקראו" + liked_received: "לייקים שהתקבלו" + new_posts: "פוסטים חדשים" + new_users: "משתמשים חדשים" + popular_topics: "נושאים פופולאריים" + follow_topic: "עיקבו אחרי נושא זה" + join_the_discussion: "קראו עוד" + popular_posts: "פוסטים פופולאריים" + from_topic_label: "מאת" + more_new: "חדש בנושאים וקרטגוריות שאתם עוקבים אחריהם" + subject_template: "[%{site_name}] סיכום" + unsubscribe: "סיכום זה נשלח מ %{site_link} כאשר אנחנו לא רואים אתכם לאורך זמן. כדי לבטל את המנוי %{unsubscribe_link}." + click_here: "לחצו כאן" + from: "סיכום %{site_name}" + preheader: "סיכום קצר מאז ביקורכם האחרון ב-%{last_seen_at}" + mailing_list: + why: "כל הפעילות ב-%{site_link} ל-%{date}" + subject_template: "[%{site_name}] סיכום ל %{date}" + unsubscribe: "סיכום זה נשלח מידי יום כיוון שמאופשר מצב של רשימת תפוצה. כדי לבטל את המנוי %{unsubscribe_link}." + from: "סיכום %{site_name} " + new_topics: "נושאים חדשים" + topic_updates: "עדכוני נושאים" + view_this_topic: "צפו בנושא זה" + back_to_top: "חזרה למעלה" forgot_password: - subject_template: "[%{site_name}] Password reset" + subject_template: "[%{site_name}] איפוס סיסמה" text_body_template: | - Somebody asked to reset your password on [%{site_name}](%{base_url}). + מישהו ביקש לאפס את הסיסמה שלכם ב [%{site_name}](%{base_url}). - If it was not you, you can safely ignore this email. + אם זה לא הייתם אתם, אתם יכולים להתעלם ממייל זה בביטחה. - Click the following link to choose a new password: + לחצו על הקישור הבא כדי לבחור סיסמה חדשה: %{base_url}/users/password-reset/%{email_token} set_password: - subject_template: "[%{site_name}] Set Password" + subject_template: "[%{site_name}] קביעת סיסמה" text_body_template: | - Somebody asked to add a password to your account on [%{site_name}](%{base_url}). Alternatively, you can log in using any supported online service (Google, Facebook, etc) that is associated with this validated email address. + מישהו ביקש להוסיף סיסמה לחשבון שלכם ב [%{site_name}](%{base_url}). לחילופין, תוכלו להתחבר באמצעות כל שירות נתמך (גוגל, פייסבוק, וכד׳) שמקושר לכתובת מייל תקינה. - If you did not make this request, you can safely ignore this email. + אם לא אתם ביקשתם זאת, תוכלו להתעלם ממייל זה ללא חשש. - Click the following link to choose a password: + לחצו על הלינק הבא כדי לבחור סיסמה: %{base_url}/users/password-reset/%{email_token} admin_login: subject_template: "[%{site_name}] התחברות" text_body_template: | - מישהו ביקש להתחבר לחשבונך ב [%{site_name}](%{base_url}). - אם לא ביקשת זאת, תוכל להתעלם מהמייל הזה. - לחץ על הקישור הבא להתחבר: + מישהו ביקש להתחבר לחשבונכם ב [%{site_name}](%{base_url}). + אם לא ביקשתם זאת, תוכלו להתעלם מהמייל הזה. + לחצו על הקישור הבא להתחבר: %{base_url}/users/admin-login/%{email_token} account_created: subject_template: "[%{site_name}] החשבון החדש שלך" text_body_template: | חשבון חדש נוצר עבורך ב%{site_name} - הקישו על הקישור המצורף כדי להגדיר סיסמא לחשבונך החדש: + הקישו על הקישור המצורף כדי להגדיר סיסמה לחשבונכם החדש: %{base_url}/users/password-reset/%{email_token} + confirm_new_email: + subject_template: "[%{site_name}] אשרו את כתובת המייל החדשה שלכם" + text_body_template: | + אשרו את כתובת המייל החדשה שלכם עבור %{site_name} על ידי לחיצה על הקישור הבא: + + %{base_url}/users/authorize-email/%{email_token} + confirm_old_email: + subject_template: "[%{site_name}] אשרו את כתובת המייל הנוכחית שלכם" + text_body_template: | + לפני שתוכלו להחליף את כתובת המייל שלכם, אנחנו צריכים שתאשרו שאתם שולטים + בכתובת המייל הנוכחית. אחרי שאתם משלימים את הצעד הזה, אנחנו נבקש שתאשרו + את כתובת המייל החדשה. + + אשרו את כתובת המייל הנוכחית שלכם עבור %{site_name} על ידי לחיצה על הקישור הבא: + + %{base_url}/users/authorize-email/%{email_token} + notify_old_email: + subject_template: "[%{site_name}] כתובת המייל שלכם שונתה" + text_body_template: | + זוהי הודעה אוטומטית כדי ליידע אתכם שכתובת המייל שלכם עבור %{site_name} שונתה. אם זה נעשה בטעות, אנא צרו קשר עם מנהל האתר. + + כתובת המייל שלכם שונתה ל: + + %{new_email} signup_after_approval: - subject_template: "You've been approved on %{site_name}!" + subject_template: "אושרתם באתר %{site_name}!" text_body_template: | ברוכים הבאים ל%{site_name}! - חבר צוות אישר את החשבון שלך ב %{site_name}. + חבר צוות אישר את החשבון שלכם ב %{site_name}. - לחץ על הקישור הבא לאשר והפעיל את החשבון החדש שלך: + לחצו על הקישור הבא לאשר והפעיל את החשבון החדש שלכם: %{base_url}/users/activate-account/%{email_token} - אם הלינק לא לחיץ, נסה להעתיק ולהדביק אותו לסרגל הכתובת בראש הדפדפן. + אם הלינק לא לחיץ, נסו להעתיק ולהדביק אותו לסרגל הכתובת בראש הדפדפן. %{new_user_tips} - אנו מאמינים ב [civilized community behavior](%{base_url}/guidelines) בכל זמן. + אנו מאמינים ב[התנהגות קהילתית מתורבתת](%{base_url}/guidelines) בכל זמן. - תהנה מהביקור! + תהנו מהביקור! - (אם אתה צריך ליצור קשר עם [staff members](%{base_url}/about) כחבר חדש, רק השב להודעה זאת. ) + (אם אתם צריכים ליצור קשר עם [חברי צוות](%{base_url}/about) כחברים חדשים, רק השיבו להודעה זאת.) signup: - subject_template: "[%{site_name}] אשר את חשבונך החדש" + subject_template: "[%{site_name}] אשרו את חשבונכם החדש" text_body_template: | - Welcome to %{site_name}! + ברוכים הבאים ל %{site_name}! - Click the following link to confirm and activate your new account: + לחצו על הקישור הבא כדי לאשר ולהפעיל את החשבון החדש שלכם: %{base_url}/users/activate-account/%{email_token} - If the above link is not clickable, try copying and pasting it into the address bar of your web browser. + אם הקישור למעלה אינו לחיץ, נסו להעתיק ולהדביק אותו לשורת הכתובת של הדפדפן שלכם. page_not_found: + title: "אופס! הדף לא קיים או שהוא פרטי." popular_topics: "פופלארי" recent_topics: "לאחרונה" see_more: "עוד" @@ -1356,34 +2221,43 @@ he: נדרש חשבון. אנא צרו חשבון או התחברו כדי להמשיך. terms_of_service: title: "תנאי השימוש" - signup_form_message: 'I have read and accept the Terms of Service.' - deleted: 'deleted' + signup_form_message: 'קראתי את ואני מסכים/מה עם תנאי השירות.' + deleted: 'נמחק' upload: - edit_reason: "We have downloaded copies of the remote images" - unauthorized: "Sorry, the file you are trying to upload is not authorized (authorized extensions: %{authorized_extensions})." - pasted_image_filename: "Pasted image" - store_failure: "Failed to store upload #%{upload_id} for user #%{user_id}." - file_missing: "סליחה, עליך לספק קובץ להעלות. " + edit_reason: "עותקים מקומיים של תמונות שהורדו" + unauthorized: "מצטערים, הקובץ שאתם מנסים להעלות לא מורשה (סיומות מורשות: %{authorized_extensions})." + pasted_image_filename: "תמונה שהודבקה" + store_failure: "נכשלה שמירת העלאה #%{upload_id} עבור משתמש #%{user_id}." + file_missing: "סליחה, עליך לספק קובץ להעלות." attachments: too_large: "מצטערים, הקובץ שאתם מנסים להעלות גדול מידי (הגודל המקסימלי המותר הוא %{max_size_kb}KB)." images: - too_large: "סליחה, אך התמונה שאתה מנסה להעלות גדולה מידי. (הגודל המקסימלי הוא %{max_size_kb}KB), אנא שנה את הגודל ונסה שנית." - size_not_found: "Sorry, but we couldn't determine the size of the image. Maybe your image is corrupted?" + too_large: "סליחה, אך התמונה שאתם מנסים להעלות גדולה מידי. (הגודל המקסימלי הוא %{max_size_kb}KB), אנא שנו את הגודל ונסו שנית." + size_not_found: "מצטערים, אבל לא יכולנו לקבוע את גודל התמונה. אולי יש בעיה טכנית בתמונה?" + avatar: + missing: "מצטערים, אנחנו לא יכולים למצוא אף דמות שמקושרת לכתובת מייל זו. תוכלו להעלות זאת שוב?" + flag_reason: + sockpuppet: "משתמש חדש יצר נושא, ומשתמש חדש אחר מאותה כתובת IP (%{ip_address}) ענו להם. ראו את הגדרת האתר `flag_sockpuppets`." + spam_hosts: "משתמש חדש זה ניסה ליצור מספר פוסטים עם קישורים לאותה הכתובת (%{domain}). ראו את הגדרת האתר `newuser_spam_host_threshold`." email_log: - no_user: "Can't find user with id %{user_id}" + post_user_deleted: "המשתמש של פוסט זה נמחק." + no_user: "לא נמצא משתמש/ת עם מזהה %{user_id}" anonymous_user: "המשתמש הוא אנונימי" suspended_not_pm: "המשתמש מושהה, לא הודעה" - seen_recently: "User was seen recently" - post_not_found: "Can't find a post with id %{post_id}" - notification_already_read: "The notification this email is about has already been read" - topic_nil: "post.topic is nil" - post_deleted: "post was deleted by the author" - user_suspended: "user was suspended" - already_read: "user has already read this post" - message_blank: "message is blank" - message_to_blank: "message.to is blank" - text_part_body_blank: "text_part.body is blank" - body_blank: "body is blank" + seen_recently: "המשתמש נראה לאחרונה" + post_not_found: "לא נמצא פוסט עם מזהה %{post_id}" + notification_already_read: "ההתראה שעבורה נשלח מייל זה כבר נקראה" + topic_nil: "post.topic הוא nil" + post_deleted: "הפוסט נמחק על ידי הכותב שלו" + user_suspended: "המשתמש הושעה" + already_read: "המשתמש כבר קרא פוסט זה" + exceeded_emails_limit: "נחצה max_emails_per_day_per_user" + exceeded_bounces_limit: "נחצה bounce_score_threshold" + message_blank: "ההודעה ריקה" + message_to_blank: "message.to ריק" + text_part_body_blank: "text_part.body ריק" + body_blank: "גוף ריק" + no_echo_mailing_list_mode: "התראות רשימת תפוצה ינוטרלו עבור הפוסטים של המשתמש עצמו" color_schemes: base_theme_name: "בסיס" about: "אודות" @@ -1394,40 +2268,549 @@ he: boolean_yes: "כן" boolean_no: "לא" static_topic_first_reply: | - ערכו את הפרסום הראשון בנושא זהכדי לשנות את התוכנים של העמוד %{page_name}. + ערכו את הפוסט הראשון בנושא זה כדי לשנות את התכנים של העמוד %{page_name}. guidelines_topic: - title: "שאלות נפוצות / כללים מנחים" + title: "שאלות נפוצות / הנחיות" + body: | + + + ## [זהו מקום מתורבת לדיונים פומביים](#civilized) + + אנא התייחסו לפורום זה באותה הצורה כפי שהייתם מתייחסים לפארק ציבורי. גם אנחנו משאב קהילתי משותף — מקום לחלוק בו יכולות, ידע ותחומי עיניין באמצעות שיחה. + + אלו אינם כללים נוקשים, אלא הנחיות לשיקול דעתה של הקהילה שלנו. השתמשו בהנחיות אלו כדי להשאיר את המקום הזה נקי, מואר, ונוח לדיון ציבורי. + + + + ## [שפרו את הדיון](#improve) + + עזרו לנו להפוך את הפורום הזה למקום נהדר לדיונים על ידי כך שתמיד נפעל לשיפור הדיון בצורה זו או אחרת, קטנה ככל שתהיה. אם אינכם בטוחים שהודעה שלכם מוסיפה לדיון, חישבו מה אתם מנסים לומר ונסו שוב מאוחר יותר. + + הנושאים שנידונים כאן חשובים לנו, ואנחנו רוצים שתנהגו בהתאם. כבדו את הנושאים ואת האנשים שדנים בהם, גם אם אינכם מסכימים עם חלק מהדברים שנאמרים. + + דרך אחת לשיפור הדיון היא על-ידי היכרות עם דיונים שכבר מתרחשים. אנא השקיעו קצת זמן בסיור בין הנושאים שכבר קיימים לפני שאתם מתחילים דיון חדש, וכך יגבר הסיכוי שתפגשו אנשים נוספים שחולקים איתכם תחומי עיניין. + + + + ## [אפשרו לאחרים להסכים איתכם, גם כשאינכם מסכימים](#agreeable) + + ייתכן ותרצו להגיב למשהו שאינכם מסכימים איתו. זה אחלה. אך, זיכרו לבקר רעיונות ולא אנשים. אנא המנעו מ: + + * קריאה בשמות. + * התקפות אד-הומינם (לגופו של אדם, ולא לגופו של עיניין). + * להגיב לנימה של הודעה ולא לתוכן שלה. + * Knee-jerk contradiction. + + במקום זאת, אנא ספקו נימוקים מושכלים שמשפרים את הדיון. + + + + ## [השתתפותכם משפיעה](#participate) + + הדיונים שאנחנו מקיימים כאן קובעים את הטון עבור כולם. עיזרו לנו להשפיע על עתיד הקהילה הזו על ידי בחירה להשתתף בדיונים שגורמים לפורום הזה להיות מקום מעניין - ולהמנע מדיונים שמרחיקים את הפורום משם. + + דיסקורס מספקת כלים שמאפשרים לקהילה לזהות ביחד את התרומות הכי טובות (וגרועות): פייבוריטים, סימניות, לייקים, דגלים, תגובות, עריכות, וכהנה וכהנה. השתמשו בכלים אלו כדי לשפר את החוויה שלכם, ושל כולם. + + בואו ננסה להשאיר את השטח נקי יותר מאיך שמצאנו אותו. + + + + ## [אם יש לכם בעיה, דווחו עליה](#flag-problems) + + לעורכים יש סמכות מיוחדת; הם אחראים על פורום זה. אך גם אתם. בעזרתכם, עורכים יכולים לאפשר לקהילה לפרוח, ולא רק להיות מנקים או שוטרים. + + כאשר אתם נתקלים בהתנהגות רעה, אל תגיבו. תגובות מעודדות התנהגויות רעות על-ידי קבלה שלהן, לוקחות לכם אנרגיה, ומבזבזות את הזמן של כולם. _אך ורק דגלו אותה_. אם מצטברים מספיק דגלים, תינקט פעולה אוטומטית או על ידי התערבות עורך. + + כדי לשמר את הקהילה שלנו, עורכים שומרים לעצמם את הזכות להסיר כל תוכן שהוא וכל חשבון משתמש מסיבה כלשהי ובכל זמן שהוא. עורכים לא קוראים מראש פוסטים חדשים בשום צורה; העורכים ומתפעלי האתר לא לוקחים שום אחריות על שום תוכן שפורסם על-ידי הקהילה. + + + + ## [Always Be Civil](#be-civil) + + אין דבר שפוגע יותר בדיון בריא מאשר גסות-רוח: + + * אזרחות טובה. אל תשאירו הודעות שאדם מהרחוב היה מחשיב כתוקפניות, נצלניות, או מסיתות. + * השאירו סביבה נקייה. אל תפרסמו דברים שעלולים להחשב פוגעניים או מטרידים מינית. + * כבדו את חבריכם. אל תטרידו, תתחזו, או תפרסמו מידע פרטי של אנשים אחרים. + * כבדו את הפורום שלנו. בבקשה לא להספים או לחבל בפורום. + + אלו אינם כללים מדוייקים — המנעו גם מ_מראית עין_ של כל אחד מהדברים האלו. אם אינכם בטוחים, שאלו את עצמכם כיצד תרגישו אם דבריכם היו מפורסמים בעמוד הראשון של Ynet. + + זהו פורום פומבי, ומנועי חיפוש מאנדקסים את הדיונים הללו. אנא שימרו על שפה, קישורים ותמונות כשרים למשפחה וחברים. + + + + ## [סדר וניקיון](#keep-tidy) + + עשו מאמץ לשים דברים במקום הנכון, כך שנוכל להשקיע יותר זמן בדיונים ופחות בניקיונות. כך: + + * אל תתחילו נושא בקטגוריה הלא-נכונה. + * אל תפרסמו את אותו התוכן בכמה נושאים. + * אל תפרסמו תגובות ללא תוכן. + * אל תסיטו את הדיון על ידי שינוי נושא באמצע. + * אל תחתמו — כל הודעה שלכם כבר מקושרת לפרופיל האישי שלכם. + + במקום לכתוב ״+1״ או ״מסכים״, אנא השתמשו בכפתור ה״Like״. במקום להסיט את הדיון לכיוון שונה, אנא השתמשו ב״תגובה בנושא קשור״. + + + + ## [פרסמו רק את החומרים של עצמכם](#stealing) + + אינכם רשאים לפרסם שום תוכן ששייך לאף אחד אחר ללא רשות. אינכם רשאים לפרסם תיאור על, קישורים ל, או שיטות לגניבה של קניין רוחני של מישהו אחר (תוכנה, וידאו, אודיאו, או תמונות), או להפרה של כל חוק שהוא. + + + + ## [מופעל על-ידיכם](#power) + + אתר זה מתופעל על ידי [הצוות](/about) ועל-ידיכם, הקהילה. אם יש לכם שאלות נוספות בנוגע לאיך דברים אמורים לעבוד כאן, פיתחו נושא חדש תחת [קטגוריית משוב לאתר](/c/site-feedback) ובואו נדבר! אם יש עיניינים קריטיים או דחופים שלא ניתן לטפל בהם על ידי מטא-נושא או סימון, פנו אלינו דרך [דף הצוות](/about). + + + + ## [תנאי שירות](#tos) + + כן, משפטנות היא משעממת, אך אנחנו מגינים על עצמנו – וכך גם עליכם, והמידע שלכם – מפני חברים לא נחמדים. יש לנו [תנאי שימוש](/tos) שמתארים את התנהגותכם (והתנהגותנו) וזכויות שנוגעות לתוכן, פרטיות, וחוקים. כדי להשתמש בשירות הזה, עליכם להסכים לציית ל[תנאי השירות](/tos). tos_topic: title: "תנאי השימוש" + body: | + התנאים והתניות שלהלן מסדירים את כל פרטי השימוש באתר %{company_domain} ובכל פריטי התוכן, השירותים והמוצרים הזמינים באתר או דרכו, כולל, בין השאר, את תוכנת הפורום של %{company_domain} (שיקראו ביחד ״האתר״ או ״אתר האינטרנט״). האתר שייך ומתופעל על-ידי %{company_full_name} (להלן ״%{company_name}״). אנו מציעים לכם את אתר האינטרנט, אך מתנים זאת בקבלת כל התנאים והתניות הכלולים כאן, ללא שינוי, וכל יתר כללי ההפעלה, העקרונות (כולל, ללא הגבלה, [מדיניות הפרטיות](/privacy) של %{company_name}, [הנחיות הקהילה](/faq) של %{company_name}) והנהלים ש%{company_name} עשויה לפרסם מעת לעת באתר האינטרנט (במקובץ, 'ההסכם'). + + יש לקרוא את ההסכם בעיון לפני הגישה לאתר או השימוש בו. הגישה לאתר או לחלק ממנו והשימוש בהם פירושם הסכמה מצדכם כי יחולו עליכם התנאים והתניות הכלולים בהסכם זה. הרשות לגשת אל אתר האינטרנט ולהשתמש בשירותים מותנית בהסכמתכם לכל התנאים והתניות שבהסכם. אם תנאים ותניות אלה נחשבים להצעה מטעם %{company_name}, קבלת התנאים מצדכם מוגבלת במפורש לתנאים אלה. + + האתר אינו מיועד למי שלא מלאו לו 13 שנים והשירות באתר מוצע אך ורק למשתמשים בני 13 ומעלה. משתמשים בני 13 ומטה מתבקשים לא להירשם לשימוש באתר. כל אדם שנרשם כמשתמש או מספק את פרטיו האישיים לאתר מצהיר בזאת כי הוא בן 13 ומעלה. + + + + ## [1. חשבונכם ב %{company_domain}](#1) + + אם אתם יוצרים חשבון באתר, אתם אחראים על שמירת האבטחה של חשבונכם ואתם אחראים לחלוטין על כל הפעילויות שמתרחשות בשמכם בחשבון. באחריותכם ליידע את %{company_name} מיידית על כל שימוש לא מורשה בחשבונכם ועל כל הפרה אחרת של האבטחה. לא תחול על %{company_name} חבות בגין מעשים או מחדלים מצידכם, לרבות נזק מכל סוג ומין שייגרם כתוצאה מאותם מעשים או מחדלים. + + + + ## [2. אחריות התורמים](#2) + + אם אתם מפרסמים חומרים באתר, קישורים באתר, או יוצרים (או מאפשרים לצד שלישי ליצור) חומרים שנעשים זמינים באמצעות האתר (כל חומר שהוא, להלן ״תוכן״), האחריות המלאה על התוכן הזה, כמו גם על כל נזק הנובע ממנו, תחול עליכם. האחריות חלה ללא תלות בסוג התוכן, לרבות, אך ללא הגבלה, טקסט, תמונה, סרטון וידאו, אודיו או קוד. כאשר אתם מנגישים תוכן, אתם מאשרים ש: + + * הורדה, העתקה ושימוש בתוכן לא יפרו זכויות קיניין, לרבות זכויות יוצרים, פטנטים, סימני מסחר או זכויות סודות מסחריים, של שום צד שלישי; + * אם למעסיק שלכם יש זכויות על קיניין רוחני שאתם יוצרים, או (i) שקיבלתם רשות מהמעסיק לפרסם או להפוך תוכן לנגיש, לרבות תוכנה, או (ii) שקיבלתם ויתור מהמעסיק לכל הזכויות על התוכן; + * אתם מתואמים לחלוטין עם כל רשיון צד שלישי שקשור לתוכן, ועשיתם את כל שנדרש כדי להעביר בהצלחה למשתמשי הקצה כל תנאי נדרש; + * התוכן אינו מכיל או מתקין שום וירוס, תולעת, רוגלה, סוס טרויאני או כל תוכן הרסני אחר; + * התוכן אינו ספאם, אינו מיוצר באקראי או על ידי מכונה, ואינו מכיל תוכן מסחרי שאינו אתי או בלתי רצוי שתוכנן כדי להזרים תנועה לאתרי צד שלישי או לשפר דירוגים של מנועי חיפוש של צדדים שלישיים, או כדי לקדם מעשים לא חוקיים (כגון פישינג) או להטעות נמענים בנוגע למקור של התוכן (כמו ספופינג); + * התוכן אינו פורנוגרפי, לא מכיל איומים או מסית לאלימות, ולא מפר את הפרטיות או זכויות הפרסום של שום צד שלישי; + * התוכן שלכם אינו מפורסם באמצעות הודעות אלקטרוניות בלתי רצויות כמו קישורי ספאם בקבוצות דיון, רשימות מיילים, בלוגים ואתרים, ודרכי קידום בלתי רצויות אחרות; + * לתוכן לא ניתן שם בצורה שמטעה את הקוראים שלכם וגורמת להם לחשוב שאתם אדם אחר או חברה אחרת; ו + * במקרה שהתוכן מכיל קוד מחשב, קיטלגתם במדוייק ו/או תיארתם את הסוג, אופי, שימושים והשפעות של החומרים שפרסמתם, בין שנתבקשתם לעשות זאת על ידי %{company_name} או שלא. + + + + ## [3. רשיון תוכן משתמשים](#3) + + תרומות תוכן של משתמשים הן תחת [רשיון קריאייטיב קומונס ייחוס-שימוש_לא_מסחרי-שיתוף_זהה 3.0 לא-מותאם](http://creativecommons.org/licenses/by-nc-sa/3.0/deed.he). מבלי להגביל אף אחת מהמצגים והערובות, ל%{company_name} יש את הזכות (אך לא את החובה), לפי שיקול דעתה הבלעדי (i) לסרב לקבל או להסיר כל תוכן שלפי דעתה הסבירה של %{company_name}, מפר איזשהי מהמדיניויות של %{company_name} או שהוא פוגעני או שהוא מעורר התנגדות, או (ii) לסגור או למנוע כניסה ו/או שימוש באתר לכל אדם או יישות מכל סיבה שהיא, לפי שיקול דעתה הבלעדי של %{company_name}. על %{company_name} לא תחול שום חובה להחזיר איזה מהסכומים ששולמו בעבר. + + + + ## [4. תשלומים וחידוש](#4) + + ### תנאים כלליים + + שירותים אופציונליים ושידרוגים יכולים להיות זמינים באתר. כאשר אתם משתמשים בשירות או שדרוג אופציונליים, אתם מסכימים לשלם ל%{company_name} את דמי המנוי החודשיים או שנתיים. תשלומים יגבו מראש ביום שתתחילו להשתמש בשירות או בשדרוג ויכסו את השימוש בשירות או בשדרוג למנוי תקופתי חודשי או שנתי כפי שמצויין. תשלומים אלו לא ניתנים להחזרה. + + ### חידוש אוטומטי + + אלא אם תודיעו ל%{company_name} לפני סיום תקופת המנוי הרלוונטית שאתם מעוניינים לבטל את השירות או השדרוג, המנוי שלכם יתחדש אוטומטית ואתם מאשרים לנו לגבות את דמי המנוי החודשיים השנתיים (וכן מיסים) באמצעות כרטיס אשראי או אמצעי תשלום אחר שברשותנו. ניתן לבטל מנויים בכל עת. + + + + ## [5. שירותים](#5) + + ### אירוח, שרותי תמיכה + + שירותי אירוח ותמיכה אופציונליים עלולים להיות מסופקים על ידי %{company_name} תחת התנאים וההתניות לכל אחד מהשירותים הללו. על ידי הרשמה לאירוח/תמיכה או חשבון שירותי תמיכה, אתם מסכימים לציית לכל התנאים וההתניות. + + + + ## [6. אחריות מבקרים](#6) + + %{company_name} לא סקרה, ולא יכולה לסקור, את כל החומר, כולל תוכנות מחשב, שפורסמו באתר, ולכן לא יכולה להיות אחראית לתכנים, שימושם או השפעתם. על ידי הפעלת האתר, %{company_name} לא מייצגת או רומזת שהיא תומכת בחומר שפורסם בו, או שהיא מאמינה שהחומר מדוייק, שימושי או לא-מזיק. אתם האחראים על נקיטת אמצעים לפי הצורך כדי להגן על עצמכם ועל מערכות המחשב שלכם בפני וירוסים, תולעים, סוסים טרויאנים, ותכנים מזיקים או הרסניים אחרים. האתר עלוללהכיל תכנים פוגעניים, לא-ראויים, או נתונים לביקורת בצורה אחרת, כמו גם מכילים אי-דיוקים טכניים, טעויות טיפוגרפיות, ואחרות. האתר עלול להכיל גם תכנים שמפרים את הפרטיות או זכויות הפרסום, או מפרים את זכויות הקניין וזכויות רכוש אחרות, של צדדים שלישיים, או הורדות, העתקות או שימוש שעליו חלים תנאים והתניות, מצויינים או שאינם מצויינים. %{company_name} לא לוקחת כל אחריות לכל נזק שייגרם מהשימוש על ידי מבקרים באתר, או מכל הורדה על ידי מבקרים שתכניהם מפורסמים. + + + + ## [7. תכנים שמפורסמים באתרים אחרים](#7) + + לא סקרנו, ואנחנו לא יכולים לסקור, את כל החומר, כולל תוכנות מחשב, שמוצעים דרך האתרים ודפי האינטרנט אליהם %{company_domain} מקשר, ואשר מקשרים אל %{company_domain}. ל%{company_name} אין שליטה על אתרים ודפים אלו שאינם %{company_domain} והיא אינה אחראית על התוכן והשימוש שלהם. על ידי קישור לאתר או דף שאינו חלק מ %{company_domain}, %{company_name} לא מייצגת או רומזת שהיא תומכת באתרים ודפים כאלו. אתם אחראים לנקוט באמצעי זהירות לפי הצורך כדי להגן על עצמכם ועל מערכות המחשוב שלכם מוירוסים, תולעים, סוסים טרוינים, ותכנים פוגעניים או הרסניים אחרים. %{company_name} פוטרת עצמה מכל אחריות לכל נזק שנגרם כתוצאה משימוש באתרים ודפים שאינם %{company_domain}. + + + + ## [8. הפרת זכויות יוצרים ומדיניות DMCA](#8) + + כשם ש%{company_name} מבקשת מאחרים לכבד את זכויות הקניין הרוחני שלה, היא מכבדת את זכויות הקניין הרוחני של אחרים. אם אתם מאמינים שחומר שנמצא ב או מקושר מ %{company_domain} מפר את זכויות היוצרים שלכם, ואם אתר זה שוכן בארה״ב, %{company_name} מעודדת אתכם להודיע לה בהתאם למדיניות [Digital Millennium Copyright Act](http://en.wikipedia.org/wiki/Digital_Millennium_Copyright_Act) ("DMCA") של %{company_name}. %{company_name} תגיב להודעות כאלו, כפי שנדרש או ראוי על ידי הסרה של תכנים מפרים או ביטול כל הקישורים לחומרים המפרים. %{company_name} תבטל גישה ותחסום שימוש באתר אם, תחת נסיבות מתאימות, המבקר נחוש להיות מפר סדרתי של זכויות יוצרים או זכויות קניין רוחני אחרות של %{company_name} או אחרים. במקרה של סיום התקשרות שכזה, ל%{company_name} לא תהיה שום מחוייבות לספק החזר של שום סכום ששולם לפני כן ל%{company_name}. + + + + ## [9. קיניין רוחני](#9) + + הסכם זה לא מעביר אליכם מ%{company_name} או מצד שלישי שום קניין רוחני, וכל זכות, קניין ועיניין בקניין זה יישאר (כפי שבין הצדדים) ב%{company_name} בלבד. %{company_name}, %{company_domain}, הלוגו של %{company_domain}, וכל שאר סימני המסחר, סימני השירות, גרפיקות ולוגואים שנעשה בהם שימוש בקשר ל %{company_domain}, או האתר הם סימני מסחר או סימנים רשומים של %{company_name} או זכייניה. סימני מסחר אחרים, סימני שירות, גרפיקות ולוגואים שנעשה בהם שימוש בהקשר של האתר יכולים להיות סימני מסחר של צדדים שלישיים אחרים. השימוש שלכם באתר לא מקנה לכם זכות או רישיון לייצר או להשתמש בשום סימני מסחר של %{company_name} או צד שלישי. + + + + ## [10. פרסום](#10) + + %{company_name} שומרת על זכותה להציג פרסומות על גבי התכנים שלך, אלא אם רכשת שדרוג 'ללא פרסומות' או שברשותך חשבון מיוחד. + + + + ## [11. ייחוס](#11) + + %{company_name} שומרת לעצמה את הזכות להציג קישורי ייחוס כמו ״מופעל על ידי %{company_domain}״, ייחוס לתמה, כותב וייחוס פונט בתחתית או בבאר הכלים של התכנים שלכם. קרדיטים בתחתית ובבאר הכלים של %{company_domain} לא מותרים להסרה בלי קשר לשדרוגים שנרכשו. + + + + ## [12. שינויים](#12) + + אנו מעדכנים את השירותים שלנו ללא הרף ופירוש הדבר, שלעתים אנו נדרשים לשנות את התנאים המשפטיים שבכפוף להם אנו מציעים את שירותינו. באחריותך לבדוק מפעם לפעם הסכם זה בנוגע לשינויים בו. המשך השימוש שלך ב-%{company_domain} יהיה בכפוף לתנאים החדשים ומשקף הסכמה אליהם. עם זאת, %{company_name} יכולה בהמשך להציע שירותים נוספים, עליהם יחול הסכם זה. + + + + ## [13. סיום](#13) + + %{company_name} רשאית להפסיק את הגישה שלך לאתר האינטרנט בכל עת, באופן מלא או חלקי, עם או בלי סיבה, עם או בלי התראה, ובתוקף מיידי. אם ברצונך לסיים את ההסכם או לסגור את חשבונך ב-%{company_domain} (אם קיים), עליך פשוט להפסיק את השימוש באתר האינטרנט. כל הוראות הסכם זה אשר מעצם טבען אמורות לשרוד סיום כאמור ישרדו אותו, כולל, ללא הגבלה, הוראות בדבר בעלות, תניות פטור וסעיפי הסתייגות מאחריות, סעיפי שיפוי וסעיפי הגבלת חבות. + + + + ## [14. הגבלת אחריות](#14) + + האתר מוגש ״כמו שהוא״. %{company_name} והספקים שלה והגורמים המעניקים לה רשיונות מתנערים מכל אחריות מכל סוג שהוא, מוצהרת או מרומזת, ובכללה, מבלי להגביל, אחריות מסחרית, התאמה למטרה כלשהי ואחריות לאי-הפרה. לא %{company_name} ולא הספקים או הגורמים המעניקים לה רשיונות, מתחייבים שבאתר לא יהיו שגיאות או שהגישה אליו תהיה רציפה וללא שיבושים. אם אתם באמת קוראים זאת, הנה [הפתעה](http://www.newyorker.com/online/blogs/shouts/2012/12/the-hundred-best-lists-of-all-time.html). אתם מבינים שאתם מורידים, או מקבלים תכנים או שירותים מהאתר על אחריותכם וסיכונכם בלבד. + + + + + ## [15. הגבלת חבות](#15) + + בשום מקרה %{company_name}, או הספקים שלה או בעלי הרשיון שלה, יהיו אחראים לכל דבר ועיניין שקשורים להסכם זה תחת כל חוזה, התרשלות, אחריות קפידה או דין אחר או תיאוריית יושר בעבור: (i) נזקים מיוחדים, מקריים או תוצאתיים; (ii) מחיר רכש של מוצרים תחליפיים או שירותים; (iii) בעבור הפרעה בשימוש או אבדן או השחתה של מידע; או (iv) כל סכום שעולה על המחיר ששילמתם ל%{company_name} תחת הסכם זה במהלך שנים עשר (12) החודשים שלפני סיבת הפעולה. ל%{company_name} לא תהיה אחריות לכל תקלה או איחור בעקבות עיניינים שמחוץ לשליטתה הסבירה. האמור לעיל לא תקף מעבר למה שנאסר בחוק. + + + + ## [16. ייצוג כללי ואחריות](#16) + + אתם מייצגים ומאשרים ש (i) שימושכם באתר יתאם בקפידה עם [מדיניות הפרטיות](/privacy) של %{company_name}, [הנחיות הקהילה](/guidelines), עם הסכם זה ועם כל החוקים והתקנות הרלוונטיים (כולל, מבלי להגביל, כל החוקים המקומיים או התקנות בארצכם, מדינתכם, עירכם, או אזור ממשלתי אחר, בנוגע להתנהלות מקוונת ותכנים קבילים, וכולל כל החוקים הרלוונטיים בנוגע למשלוח מידע טכני מהמדינה בה אתר זה נמצא או המדינה בה אתם נמצאים) ו (ii) שימושכם באתר לא מפר או מועל בזכויות קניין רוחני של כל צד שלישי. + + + + ## [17. שיפוי](#17) + + הסכמתכם נתונה לכך שתחול עליכם החובה לפצות ולשפות את %{company_name}, קבלניה והגורמים המעניקים לה רישיונות, ואת המנהלים, בעלי התפקידים, העובדים והסוכנים של כל אלה, מפני וכנגד כל תביעה והוצאה, כולל הוצאות הגנה משפטית כתוצאה מהשימוש שלכם באתר האינטרנט, כולל אך לא רק, הפרה מצדכם של האמור בהסכם זה. + + + + ## [18. שונות](#18) + + הסכם זה מהווה את כלל ההסכם בין %{company_name} לבינכם בנוגע לעיניין הנדון, והוא יכול להשתנות על ידי תיקון כתוב חתום על ידי מנהל מורשה של %{company_name}, או על ידי פרסום מטעם %{company_name} של גרסה מתוקנת. למעט במידה המותרת בחוק הרלוונטי, אם יש, הסכם זה, הגישה לאתר האינטרנט והשימוש בו יוסדרו על פי חוקי מדינת ישראל, והמקום לבירור מחלוקות שיתעוררו מתוך או בנוגע לכל אלה יהיה בתי המשפט המדינתיים שבתל אביב, ישראל. למעט תביעות לסעד באמצעות צו מניעה או מן הדין, או תביעות בנוגע לזכויות קניין רוחני (אשר מותר להגישן בכל בית משפט מוסמך ללא תשלום ערבות), כל מחלוקת שתיווצר כתוצאה מהסכם זה תיושב באופן סופי בהתאם לכללי הבוררות הנהוגים בישראל, באמצעות שלושה בוררים שימונו בהתאם לאותם כללים. הבוררות תתקיים בתל אביב, ישראל, בשפה העברית, ויהיה אפשר לאכוף את פסיקת הבוררות בכל בית משפט. הצד שייצא וידו על העליונה בכל תביעה או הליך לאכיפת הסכם זה יהא זכאי להחזר בגין עלויות ודמי הגנה משפטית. היה וייקבע כי חלק כלשהו בהסכם זה אינו תקף או בלתי אכיף, אותו חלק יפורש כך שישקף את הכוונה המקורית של הצדדים ויתר חלקי ההסכם ישמרו על מלוא תוקפם וחלותם. ויתור של צד מן הצדדים על תנאי או תניה הכלולים בהסכם זה או על הפרה של תנאי/תניה כאמור בהזדמנות נתונה, ייחשב לוויתור באותה הזדמנות בלבד ולא יחול על אף הפרה נוספת/עתידית. מותר לכם להסב את זכויותיכם במסגרת הסכם זה לזכות כל גורם שיסכים כי האמור בתנאים ובתניות שהוא כולל יחולו עליו. %{company_name} רשאית להסב את זכויותיה במסגרת הסכם ללא שום תנאי. הסכם זה יחייב את הצדדים וייזקף לזכות הצדדים, יורשיהם ונמחיהם המורשים. + + ## [19. תרגום](#19) + + תנאי שירות אלה נוסחו במקור בשפה האנגלית (ארה"ב). אפשר שנתרגם את התנאים לשפות אחרות. במקרה של סתירה בין גרסה מתורגמת של תנאי השירות לבין הגרסה באנגלית, תינתן עדיפות לגרסה בשפה האנגלית. + + מסמך זה הוא CC-BY-SA. הוא עודכן ב 2 באוקטובר, 2016. + + הותאם במקור מ[תנאי השירות של Wordpress](http://en.wordpress.com/tos/). privacy_topic: title: "מדיניות פרטיות" + body: | + + + ## [איזה מידע אנחנו אוספים?](#collect) + + אנחנו אוספים מכם מידע כאשר אתם נרשמים לאתר שלנו ואוספים מידע מכם כאשר אתם משתתפים בפורום על ידי קריאה, כתיבה, והערכת התוכן שמשותף כאן. + + כאשר אתם נרשמים לאתר שלנו, ייתכן ותיתבקשו להכניס את שמכם וכתובת המייל שלכם. יחד עם זאת אתם יכולים לבקר באתר שלנו מבלי להרשם. כתובת המייל שלכם תאומת באמצעות מייל שמכיל קישור ייחודי. אם הקישור הזה מבוקר, אנחנו יודעים שאתם שולטים בכתובת המייל. + + כאשר אתם רשומים ומפרסמים, אנחנו שומרים את כתובת ה IP ממנה פורסם הפוסט. אנחנו יכולים גם לשמור יומני שרת שכוללים את כתובת ה IP של כל קריאה לשרת שלנו. + + + + ## [למה אנחנו משתמשים במידע שלכם?](#use) + + כל מידע שאנחנו אוספים מכם יכול לשמש בכל אחת מהדרכים הבאות: + + * כדי להתאים אישית את החוויה שלכם — המידע שלכם עוזר לנו לענות טוב יותר על צרכיכם האישיים. + * כדי לשפר את האתר שלנו — אנחנו כל הזמן שואפים לשפר את מה שהאתר שלנו מציע בהתחשב במידע ובמשוב שאנחנו מקבלים מכם. + * כדי לשפר את שירות הלקוחות — המידע שלכם מסייע לנו להגיב בצורה אפקטיבית יותר לבקשות שירות הלקוחות שלכם וצרכי התמיכה. + * כדי לשלח מיילים תקופתיים — כתובת המייל שאתם מספקים יכולה לשמש כדי לשלוח לכם אינפורמציה, התראות שביקשתם לגבי שינויים בנושאים או בתגובה לשם המשתמש שלכם, לענות לשאלות, ו/או בקשות או שאלות אחרות. + + + + ## [כיצד אנחנו מגנים על האינפורמציה שלכם?](#protect) + + אנחנו נוקטים במגוון של אמצעי אבטחה כדי לשמור על הבטיחות של המידע הפרטי שלכם כאשר אתם נכנסים, שולחים, או ניגשים למידע הפרטי שלכם. + + + + ## [מה מדיניות שמירת המידע שלכם?](#data-retention) + + אנחנו נעשה מאמץ בתום לב: + + * לשמור יומנים שמכילים כתובות IP של כל הבקשות לשרת זה לא יותר מ 90 יום. + * לשמור על כתובות IP שמקושרות עם משתמשים רשומים ופוסטים שלהם לא יותר מ 5 שנים. + + + + ## [האם אנחנו משתמשים בעוגיות?](#cookies) + + כן. עוגיות הן קבצים קטנים שאתר או מספק השירות שלו מעביר לכונן הקשיח של מחשבכם דרך הדפדפן שלכם (אם אתם מרשים). עוגיות אלו מאפשרות לאתר להכיר את הדפדפן שלכם ו, אם יש לכם חשבון רשום, לקשר אותו עם חשבונכם הרשום. + + אנחנו משתמשים בעוגיות כדי להבין ולשמור את ההעדפות שלכם לביקורים עתידיים ולהכין נתונים מצרפיים בנוגע לתנועה באתר ואינטראקציה באתר כדי שנוכל להציע חוויית משתמש טובה יותר וכלים בעתיד. אנחנו יכולים לכרות חוזים עם מספקי שירות שהם צד-שלישי כדי לסייע לנו להבין טוב יותר את מבקרי האתר שלנו. נותני שרותים אלו לא מורשים להשתמש בנתונים שנאספים בשמנו למעט כדי לסייע לנו לקיים ולשפר את השירות שלנו. + + + + ## [האם אנחנו מוסרים אינפורמציה כלשהי לצדדים שלישיים?](#disclose) + + איננו מוכרים, סוחרים, או מעבירים בצורה אחרת לצדדים שלישיים מידע אישי מזוהה שלכם. זה אינו כולל צדדים שלישיים עליהם אנחנו סומכים שמסייעים לנו בתפעול האתר שלנו, לתפעל את העסק שלנו, או לשרת אתכם, כל עוד צדדים אלו מסכימים לשמור על מידע זה סודי. אנחנו יכולים גם לשחרר את המידע שלכם כאשר אנחנו מאמינים ששחרור שלו הולם כדי לעמוד בחוק, לקיים את מדיניות האתר שלנו, או כדי להגן על זכויות שלנו או של אחרים, לשמור על רכוש או בטיחות. עם זאת, מידע של מבקרים שאינו מזוהה אישית עלול להיות מסופק לצדדים אחרים לצורך שיווק, פרסום או שימושים אחרים. + + + + ## [קישורי צד שלישי](#third-party) + + לעיתים, לפי שיקול דעתנו, אנחנו יכולים לכלול או להציע מוצרים של צדדים שלישיים באתר שלנו. לאתרי צד שלישי אלו יש מדיניות פרטיות נפרדת ובלתי-תלויה. לכן אין לנו כל אחריות או התחייבות לתכנים או פעילויות של אתרים מקושרים אלו. יחד עם זאת אנחנו מבקשים לשמור על השלמות של האתר שלנו ומברכים כל משוב בנוגע לאתרים אלו. + + + + ## [תאימות ל Children's Online Privacy Protection Act](#coppa) + + האתר שלנו, המוצרים, והשירותים - כולם מוכוונים לאנשים מגיל 13 ומעלה. אם שרת זה נמצא בארה״ב, ואתם מתחת לגיל 13, לפי דרישות COPPA כאן - [Children's Online Privacy Protection Act](https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act), אל תשתמשו באתר זה. + + + + ## [מדיניות פרטיות מקוונת בלבד](#online) + + מדיניות פרטיות מקוונת זו חלה רק על מידע שנאסף באמצעות האתר שלנו ולא על מידע שנאסף בצורה בלתי-מקוונת. + + + + ## [הסכמתכם](#consent) + + על ידי שימוש באתר שלנו, אתם מסכימים למדיניות הפרטיות של האתר. + + + + ## [שינויים למדיניות הפרטיות](#changes) + + אם נחליט לשנות את מדיניות הפרטיות שלנו, נפרסם שינויים אלו בדף זה. + + מסמך זה הוא CC-BY-SA. הוא עודכן לאחרונה ב 25 לספטמבר 2016. badges: + editor: + name: עורכים + description: עריכת פוסט ראשונה + long_description: | + עיטור זה מוענק בפעם הראשונה שאתם עורכים את אחד הפוסטים שלכם. אמנם לא תוכלו לערוך את הפוסטים שלכם לעד, אבל עריכות זה רעיון טוב - אתם יכולים לשפר את הפוסטים שלכם, לתקן טעויות קטנות, או להוסיף כל דבר שפספסתם במקור. עירכו כדי להפוך את הפוסטים שלכם לטובים אפילו יותר! + basic_user: + name: בסיסיים + description: הוענקו להם כל אפשרויות הקהילה הבסיסיות + long_description: | + עיטור זה מוענק כשאתם מגיעים לרמת אמון 1. תודה שנשארתם וקראתם כמה נושאים כדי להבין במה הקהילה הזו עוסקת. הסרנו כמה מגבלות של משתמשים חדשים; הוענקו לכם כמה יכולות נחוצות לקהילה, כמו הודעות פרטיות, דגלים, עריכת ויקי, והיכולת להוסיף תמונות וקישורים מרובים. + member: + name: חברים + description: הוענקו לכם הזמנות, הודעות קבוצתיות, יותר לייקים + long_description: | + עיטור זה מוענק כאשר אתם מגיעים לרמת אמון 2. תודה על השתתפות במשך תקופה של שבועות כדי באמת להצטרף לקהילה שלנו. אתם יכולים כעת לשלוח הזמנות מחשבון המשתמש שלכם או מנושאים, ליצור הודעות אישיות לקבוצות, ולחלק קצת יותר לייקים בכל יום. regular: - name: רגיל + name: רגילים + description: הוענקו לכם הוקרה, שינוי שם, מעקב אחר לינקים, וויקי, ולייקים נוספים + long_description: | + עיטור זה מוענק כאשר אתם מגיעים לרמת אמון 3. תודה על נטילת חלק באופן קבוע בקהילה לאורך תקופה של חודשים. אתם כעת חלק מקבוצת הקוראים הפעילה ביותר, ומקור אמין שהופך את הקהילה שלנו למעולה. אתם כעת יכולים לקטלג ולשנות שמות לנושאים, להשתמש בדגלים חזקים יותר, לגשת לאזור הלאונג׳ הפרטי, ותקבלו גם הרבה יותר לייקים ליום. leader: - name: מוביל + name: מובילים + description: הוענקו לכם יכולות עריכה גלובאליות, נעיצה, סגירה, אירכוב, פיצול ומיזוג, לייקים נוספים + long_description: | + עיטור זה מוענק כאשר אתם מגיעים לרמת אמון 4. אתם מובילים בקהילה הזו כחברי צוות נבחרים, ואתם משמשים דוגמה חיובית לשאר הקהילה בפעולות ובמילים שלכם פה. יש לכם את היכולת לערוך את כל הפוסטים, ולהשתמש ביכולות ההנחייה הנפוצות כמו נעיצה, סגירה, הסרה מהרשימות, ארכוב, פיצול, ומיזוג, ויש לכם טונות של לייקים ביום. welcome: name: ברוכים הבאים + description: קיבלו לייק + long_description: | + עיטור זוה מוענק כאשר אתם מקבלים את הלייק הראשון שלכם על פוסט. מזל טוב, פרסמתם משהו שחבריכם לקהילה חשבו שהוא מעניין, מגניב, או שימושי! + autobiographer: + name: אוטוביוגרפים + description: מילאו מידע פרופיל + long_description: | + עיטור זה מוענק על מילוי מידע הפרופיל ובחירת תמונת פרופיל. שיתוף מידע עם הקהילה לגבי מי אתם ומהם תחומי העיניין שלכם - תורם לקהילה מחוברת יותר. הצטרפו אלינו! + anniversary: + name: יום השנה + description: חברים פעילים למשך שנה, פרסמו לפחות פעם אחת + long_description: | + עיטור זה מוענק אם הייתם חברים למשך שנה עם לפחות פוסט אחד בשנה זו. תודה על שנשארתם איתנו ועל תרומתכם לקהילה שלנו. לא יכולנו לעשות זאת בלעדיכם. nice_post: name: תשובה נחמדה + description: התקבלו 10 לייקים על תגובה + long_description: | + עיטור זה מוענק כאשר תגובה שלכם מקבלת 10 לייקים. התגובה שלכם ממש הרשימה את הקהילה שלנו וסייעה לקידום השיחה! good_post: name: תשובה טובה + description: התקבלו 25 לייקים על תגובה + long_description: | + עיטור זה מוענק כאשר תגובה שלכם מקבלת 25 לייקים. התגובה שלכם היתה יוצאת מן הכלל ושיפרה את השיחה עבור כולם! great_post: name: תשובה מעולה + description: התקבלו 50 לייקים על תגובה + long_description: |+ + עיטור זה מוענק כאשר תגובה שלכם מקבלת 50 לייקים. וואו! התגובה שלכם עוררה השראה, הקסימה, גלגלה מצחוק או הביאה זווית חדשה והקהילה אהבה את זה. + nice_topic: name: נושא נחמד + description: התקבלו 10 לייקים על נושא + long_description: | + עיטור זה מוענק כשהנושא שלכם מקבל 10 לייקים. היי, התחלתם שיחה מעניינת שהקהילה נהנתה ממנה! good_topic: name: נושא טוב + description: קיבלו 25 לייקים על נושא + long_description: | + עיטור זה מוענק כאשר נושא שלכם מקבל 25 לייקים. התחלתם שיחה תוססת שהקהילה התחברה אליה ואהבה אותה! great_topic: name: נושא מעולה + description: קיבלו 50 לייקים על נושא + long_description: | + עיטור זה מוענק כאשר הנושא שלכם מקבל 50 לייקים. התחלתם נושא שיחה מרתק והקהילה נהנתה מהדיון הדינמי שהתגלגל ממנו! nice_share: name: שיתוף נחמד + description: שיתפו פוסט עם 25 מבקרים שונים + long_description: | + עיטור זה מוענק עבור שיתוף של קישור ש-25 מבקרים חיצוניים לחצו עליו. תודה על הפצת השמועה בנוגע לדיונים שלנו, והקהילה הזו. good_share: name: שיתוף טוב + description: שיתפו פוסט עם 300 מבקרים ייחודיים + long_description: | + עיטור זה מוענק על שיתוף של קישור שהקליקו עליו 300 מבקרים חיצוניים. עבודה טובה! השווצתם בדיון מעולה לחבר׳ה ועזרתם לקהילה לגדול. great_share: - name: שיטוף מעולה + name: שיתוף מעולה + description: שיתפו פוסט עם למעלה מ 1000 מבקרים שונים + long_description: | + עיטור זה מוענק בעבור שיתוף של קישור שהקליקו עליו 1000 מבקרים חיצוניים. וואו! קידמתם דיון מעניין לקהל ענק, וסייעתם להגדיל את הקהילה בגדול! + first_like: + name: לייק ראשון + description: אהבו פוסט + long_description: | + עיטור זה מוענק בפעם הראשונה שאתם אוהבים פוסט באמצעות כפתור ה :heart:. לעשות לייק לפוסט זו דרך מעולה כדי ליידע את חבריכם לקהילה שמה שהם פרסמו היה מעניין, שימושי, מגניב, או כייפי. שתפו את האהבה! + first_flag: + name: דגל ראשון + description: דיגלו פוסט + long_description: | + עיטור זה מוענק בפעם הראשונה שאתם מדגלים פוסט. דיגול זו הדרך שאנחנו עוזרים לשמור על המקום הזה נקי ומואר בשביל כולם. אם אתם שמים לב שפוסט כלשהו מצריך תשומת לב מנחים מכל סיבה שהיא - אל תהססו להרים דגל. אתם יכולים גם לדגל כדי לשלוח הודעות אישיות לחבריכם המשתמשים אם אתם רואים בעייה בפוסט שלהם. אם אתם רואים בעיה, :flag_black: דגלו אותה! + promoter: + name: מקדמים + description: הזמינו משתמש + long_description: | + עיטור זה ניתן כאשר אתם מזמינים מישהו להצטרף לקהילה באמצעות כפתור ההזמנה בדף המשתמש שלכם, או בתחתיתו של נושא. הזמנת חברים שעלולים להתעניין בדיונים ספציפיים היא דרך מצויינת להכיר אנשים חדשים לקהילה שלנו, אז תודה! + campaigner: + name: קמפיינרים + description: הזמינו 3 משתמשים בסיסיים + long_description: | + עיטור זה מוענק כאשר הזמנתם 3 אנשים שבהמשך השקיעו מספיק זמן באתר כדי להפוך למשתמשים בסיסיים. קהילה תוססת צריכה שטף קבוע של אנשים חדשים שממשיכים להשתתף ולהוסיף קולות חדשים לדיונים. + champion: + name: אלופים + description: הזמינו 5 חברים + long_description: | + עיטור זה מוענק כאשר הזמנתם 5 אנשים שכתוצאה מכך בילו מספיק זמן באתר כדי להפוך לחברים מלאים. וואו! תודה שהגדלתם את מגוון הדעות בקהילה שלנו באמצעות חברים חדשים! + first_share: + name: שיתוף ראשון + description: שיתפו פוסט + long_description: | + עיטור זה מוענק בפעם הראשונה שאתם משתפים קישור לתגובה או נושא באמצעות כפתור השיתוף. שיתוף קישורים זו דרך נהדרת כדי להתפאר בדיונים מעניינים בפני שאר העולם ולהגדיל את הקהילה שלכם. + first_link: + name: קישור ראשון + description: הוסיפו קישור לנושא אחר + long_description: | + עיטור זה מוענק בפעם הראשונה שאתם מוסיפים קישור לנושא אחר. קישור בין נושאים עוזר לקוראים נוספים למצוא דיונים קשורים, על ידי הצגת החיבורים בין נושאים בשני הכיוונים. קשרו חופשי! + first_quote: + name: ציטוט ראשון + description: ציטטו פוסט + long_description: | + עיטור זה מוענק בפעם הראשונה שאתם מצטטים פוסט בתגובה שלכם. ציטוט חלקים רלוונטיים של פוסטים קודמים בתגובה שלכם עוזרת לדיונים להשאר מחוברים לנושא. הדרך הקלה ביותר לצטט היא להדגיש קטע בפוסט, וללחוץ על כפתור מענה כלשהו. צטטו בנדיבות! + read_guidelines: + name: קראו את ההנחיות + description: קראו את הנחיות הקהילה + long_description: | + עיטור זה מוענק בעבור קריאת הנחיות הקהילה. פעולה לפי הכללים ושיתוף שלהם יעזרו לבנות קהילה בטוחה, כיפית, ומקיימת לכולם. זכרו תמיד שיש אנשים אחרים, ממש כמוכם, בצד השני של המסך. תהיו נחמדים! + reader: + name: קוראים + description: קראו כל תגובה בנושא עם למעלה מ 100 תגובות + long_description: | + עיטור זה מוענק בפעם הראשונה שאתם קוראים נושא ארוך עם למעלה מ 100 תגובות. קריאת דיון מקרוב מסייעת לכם לעקוב אחר השיחה, להבין נקודות מבט שונות, ומובילה לדיונים מעניינים יותר. ככל שתקראו יותר, כך תשתפר השיחה. כמו שאנחנו אוהבים לומר, קריאה היא יסודית! :slight_smile: + popular_link: + name: קישור פופולארי + description: פרסמו קישור חיצוני עם 50 קליקים + long_description: | + עיטור זה מוענק כאשר קישור שאתם משתפים מקבל 50 קליקים. תודה שפרסמתם קישור שימושי שהוסיף הקשר מעניין לשיחה! + hot_link: + name: קישור חם + description: פרסמו קישור חיצוני עם 300 קליקים + long_description: | + עיטור זה מוענק כאשר קישור ששיתפתם מקבל 300 קליקים. תודה שפרסמתם קישור מרתק שהוביל את השיחה קדימה והאיר את הדיון! + famous_link: + name: קישור מפורסם + description: פרסמו קישור חיצוני עם למעלה מ 1000 קליקים + long_description: | + עיטור זה מוענק כאשר קישור ששיתפתם מקבל 1000 קליקים. וואו! פרסמתם קישור ששיפר משמעותית את השיחה על ידי הוספת פרט חיוני, הקשר, ואינפורמציה. עבודה טובה! + appreciated: + name: מוערכים + description: קיבלו לייק אחד על 20 פוסטים + long_description: | + עיטור זה מוענק אם אתם מקבלים לפחות לייק אחד על 20 פוסטים שונים. הקהילה נהנית מהתרומות שלכם לדיונים פה! + respected: + name: מכובדים + description: קיבלו 2 לייקים על 100 פוסטים + long_description: | + עיטור זה מוענק כאשר אתם מקבלים לפחות 2 לייקים על 100 פוסטים שונים. הקהילה מכירה בתרומות הרבות שלכם לשיחות כאן. + admired: + name: מוערצים + description: קיבלו 5 לייקים על 300 פוסטים + long_description: | + עיטור זה מוענק כאשר אתם מקבלים לפחות 5 לייקים על 300 פוסטים שונים. וואו! הקהילה מעריצה את תרומותיכם התכופות והאיכותיות לדיונים פה. + out_of_love: + name: באו מאהבה + description: השתמשו ב 50 לייקים ביום + long_description: | + עיטור זה מוענק כאשר אתם משתמשים בכל 50 הלייקים היומיים. לזכור לקחת את הזמן כדי לעשות לייק לפוסטים שאתם נהנים ומעריכים - מעודד את חבריכם לקהילה ליצור אפילו יותר דיונים טובים בעתיד. + higher_love: + name: אהבה עליונה + description: השתמשו ב 50 לייקים ליום 5 פעמים + long_description: | + עיטור זה מוענק כאשר אתם משתמשים בכל 50 הלייקים היומיים שלכם ב 5 ימים. תודה על שהשקעתם את הזמן בלעודד, אקטיבית, את השיחות הטובות ביותר בכל יום! + crazy_in_love: + name: מאוהבים בטירוף + description: השתמשו ב 50 לייקים ביום 20 פעם + long_description: | + עיטור זה מוענק כאשר אתם משתמשים בכל 50 הלייקים היומיים שלכם במשך 20 ימים. וואו! אתם מופת לעידוד מתמשך של חבריכם לקהילה! + thank_you: + name: תודה רבה + description: יש לכם 20 פוסטים שנאהבו ונתתם 10 לייקים + long_description: | + עיטור זה מוענק כאשר יש לכם 20 פוסטים שנאהבו ונתתם 10 לייקים נוספים בתמורה. כשמישהו אוהב פוסט שלכם, אתם מוצאים את הזמן לאהוב מה שאחרים מפרסמים גם כן. + gives_back: + name: נותנים בחזרה + description: יש להם 100 פוסטים שנאהבו וחילקו 100 לייקים + long_description: | + עיטור זה מוענק כאשר יש לכם 100 פוסטים שנאהבו ונתתם 100 או יותר לייקים בחזרה. תודה שאתם מעבירים את זה הלאה! + empathetic: + name: אמפתטים + description: יש להם 500 פוסטים עם לייקים וחילקו 1000 לייקים + long_description: | + עיטור זה מוענק כאשר יש לכם 500 פוסטים עם לייקים וכאשר חילקתם 1000 לייקים או יותר בחזרה. וואו! אתם מופת לנדיבות והערכה הדדית :two_hearts:. + first_emoji: + name: אמוג׳י ראשון + description: השתמשו באמוג׳י בפוסט + long_description: | + עיטור זה מוענק בפעם הראשונה שאתם מוסיפים אימוג׳י לפוסט שלכם :thumbsup:. אמוג׳יז מאפשרים לכם להעביר רגשות בפוסטים שלכם, משמחה :smiley: לעצב :anguished: לכעס :angry: וכל דבר שבינהם :sunglasses: . פשוט הקישו : (נקודותיים) או לחצו על כפתור האימוג׳י בארגז הכלים בעורך כדי לבחור מבין מאות אפשרויות :ok_hand: first_mention: name: אזכור ראשון + description: הזכירו משתמש בפוסט + long_description: עיטור זה מוענק בפעם הראשונה שאתם מזכירים את שם @המשתמש של מישהו בפוסט שלכם. כל איזכור מייצר התראה לאדם זה, כדי שידעו על הפוסט שלכם. פשוט התחילו בהקלדת @ (כרוכית) כדי לאזכר כל משתמש או, אם ניתן, קבוצה - זו דרך נוחה להביא דברים לתשומת ליבם. + first_onebox: + name: Onebox ראשון + description: פרסמו קישור שנעשה לו onebox + long_description: עיטור זה מוענק בפעם הראשונה שמפרסמים קישור בשורה נפרדת, מה שיגרום לו להתרחב לתיבת onebox עם תקציר של העמוד המקושר, כותרת ותמונה (כאשר ישנה תמונה בעמוד המקושר). + first_reply_by_email: + name: תגובה ראשונה במייל + description: השיבו לפוסט באמצעות מייל + long_description: | + עיטור זה מוענק בפעם הראשונה שאתם עונים לפוסט באמצעות מייל :e-mail:. admin_login: success: "דוא\"ל נשלח" error: "שגיאה!" @@ -1439,9 +2822,145 @@ he: initial_post_raw: 'נושא זה כולל דוחות פעילות יומיים עבור האתר שלך. ' initial_topic_title: דוחות פעילות לאתר topic_invite: - user_exists: "מצטערים, המשתמש/ת כבר הוזמנו. ניתן להזמין משתמשים לנושא רק פעם אחת." + user_exists: "מצטערים, המשתמשים כבר הוזמנו. ניתן להזמין משתמשים לנושא רק פעם אחת." tags: title: "תגיות" + staff_tag_disallowed: "התג \"%{tag}\" ניתן רק על ידי הצוות." + staff_tag_remove_disallowed: "התג \"%{tag}\" ניתן להסרה רק על ידי הצוות." + rss_by_tag: "נושאים מתוייגים %{tag}" + finish_installation: + congratulations: "ברכותינו, התקנתם את דיסקורס!" + register: + button: "הרשמה" + title: "הרשמת חשבון אדמיניסטרטור" + help: "רישמו חשבון חדש כדי להתחיל" + no_emails: "לצערנו, לא הוגדר מייל של אדמיניסטרטור במהלך ההתקנה, כך שהשלמת ההגדרות כנראה תהיה מאתגרת." + confirm_email: + title: "אשרו את המייל שלכם" + message: "שלחנו מייל אקטיבציה ל%{email}. אנא עיקבו אחר ההוראות במייל כדי להפעיל את החשבון שלכם.
אם הוא לא מגיע, וודאו שהגדרתם נכון את המייל עבור הדיסקורס שלכם ובידקו בתיקיית הספאם.
" + resend_email: + title: "שליחת מייל אקטיבציה מחדש" + message: "שלחנו מחדש את מייל האקטיבציה ל%{email}" + safe_mode: + title: "כנסו למצב בטוח" + description: "מצב בטוח מאפשר לכם לבחון את האתר שלכם מבלי לטעון תוספים או התאמות אתר." + no_customizations: "נטרלו את כל התאמות האתר" + only_official: "נטרלו תוספים לא רשמיים" + no_plugins: "נטרלו את כל התוספים" + enter: "כנסו למצב בטוח" + wizard: + title: "הקמת Discourse" + step: + locale: + title: "ברוכים הבאים ל Discourse!" + fields: + default_locale: + description: "מה השפה של הקהילה שלכם?" + forum_title: + title: "שם" + description: "השם שלכם נראה למרחוק, הדבר הראשון שמבקרים פוטנציאליים יבחינו בו בנוגע לקהילה שלכם. מה השם והכותרת שלכם אומרים על הקהילה?" + fields: + title: + label: "שם הקהילה שלכם" + placeholder: "המקום של ג׳יין" + site_description: + label: "תארו את הקהילה שלכם במשפט קצר אחד" + placeholder: "מקום לג׳יין וחבריה לשוחח על דברים מגניבים" + introduction: + title: "פתיחה" + fields: + welcome: + label: "נושא ברוכים-הבאים" + description: "
כיצד הייתם מתארים את הקהילה שלכם לאדם זר במעלית אם יש לכם רק דקה אחת?
נושא הברוכים-הבאים שלכם הוא הדבר הראשון שמבקרים חדשים יראו. חישבו עליו כפסקה אחת של ׳נאום המעלית׳ או ׳הצהרת הכוונות׳ שלכם.
" + one_paragraph: "אנא הגבילו את הודעת הברוכים-הבאים שלכם לפסקה אחת." + privacy: + title: "גישה" + description: "האם הקהילה שלכם פתוחה לכולם, או שהיא מוגבלת על ידי חברות, הזמנה, או אישור? אם תעדיפו, תוכלו להקים אותה כפרטית ובהמשך להפוך אותה לפומבית.
זיכרו שתמיד תוכלו לשלוח הזמנות גם מנושאים, ומפרופיל המשתמש שלכם.
" + fields: + privacy: + choices: + open: + label: "פומבי" + description: "כל אחד יכול לגשת לקהילה זו ולהרשם כדי לפתוח חשבון" + restricted: + label: "פרטי" + description: "רק אנשים שהזמנתי או אישרתי יכולים לגשת לקהילה זו" + contact: + title: "איש/אשת קשר" + fields: + contact_email: + label: "מייל" + placeholder: "name@example.com" + description: "כתובת מייל לאדם או קבוצה שאחראים על קהילה זו. משמשת להתראות קריטיות כמו דגלים שלא טופלו, עידכוני אבטחה, ובדף האודות שלכם ליצירת קשר דחופה עם איש הקשר של הקהילה." + contact_url: + label: "דף ווב" + placeholder: "http://www.example.com/contact-us" + description: "דף יצירת קשר כללי איתכם או עם הארגון שלכם. יוצג בדף האודות שלכם." + site_contact: + label: "הודעות אוטומטיות" + description: "כל ההודעות הפרטיות והאוטומטיות של Discourse יישלחו ממשתמש זה. הכי חשוב, משתמש זה יהיה השולח הנבחר של כל הודעת ברוכים הבאים שנשלחת אוטומטית למשתמשים חדשים." + corporate: + title: "ארגון" + description: "שמות אלו יוכנסו למדיניות הפרטיות שלכם ולתנאי השימוש, שתוכלו לערוך בכל זמן בקטגוריית הצוות. אם אין לכם חברה, הרגישו חופשי לדלג על שלב זה לעת עתה." + fields: + company_short_name: + label: "שם החברה (קצר)" + placeholder: "Initech" + company_full_name: + label: "שם החברה (מלא)" + placeholder: "Initech, Inc." + company_domain: + label: "שם המתחם (דומיין) של החברה" + placeholder: "initech.com" + colors: + title: "תמה" + fields: + theme_id: + description: "האם אתם מעדיפים להתחיל עם סכמת צבעים בהירה או כהה? תמיד תוכלו להמשיך ולהתאים את המראה של האתר שלכם באמצעות ״ניהול״ > ״התאמה-אישית״." + choices: + default: + label: "בהיר פשוט" + dark: + label: "כהה פשוט" + logos: + title: "לוגואים" + fields: + logo_url: + label: "לוגו ראשי" + description: "תמונת הלוגו בצד הימני העליון של האתר שלכם. השתמשו בצורה מלבנית רחבה." + logo_small_url: + label: "לוגו קומפקטי" + description: "גירסה קומפקטית של הלוגו שלכם, מוצגת בצד ימין למעלה של האתר שלכם כאשר גוללים למטה. השתמשו בצורה ריבועית." + icons: + title: "אייקונים" + fields: + favicon_url: + label: "אייקון קטן" + description: "תמונה שמשמשת לייצוג האתר שלכם בדפדפנים שנראית טוב בגדלים קטנים כמו 32 על 32 פיקסלים." + apple_touch_icon_url: + label: "אייקון גדול" + description: "תמונה שמשמשת לייצוג האתר שלכם במכשירים מודרניים ונראית טוב בגדלים גדולים יותר. הגודל המומלץ הוא לפחות 144 על 144 פיקסלים." + homepage: + description: "אנחנו ממליצים להציג את הנושאים האחרונים בדף הבית שלכם, אבל אתם יכולים לבחור להראות קטגוריות (קבוצות של נושאים) על דף הבית אם אתם מעדיפים." + title: "דף הבית" + fields: + homepage_style: + choices: + latest: + label: "נושאים אחרונים" + categories: + label: "קטגוריות" + emoji: + title: "אמוג׳י" + description: "איזה סגנון אמוג׳י אתם מעדיפים עבור הקהילה שלכם? תמיד תוכלו להוסיף עוד אמוג׳י בהמשך באמצעות ״ניהול״ > ״התאמה״ > ״אמוג׳י״." + invites: + title: "הזמינו צוות" + description: "כמעט סיימתם! בואו נזמין כמ חברי צוות כדי לסייע לזרוע את הדיונים עם נושאים מעניינים ותגובות שיניעו קדימה את הקהילה שלכם." + finished: + title: "ה Discourse שלכם מוכן!" + description: | +אם אתם אי פעם מרגישים שאתם צריכים לשנות הגדרות אלו, בקרו באזור הניהול שלכם; מיצאו אותו ליד האייקון של מפתח הברגים בתפריט האתר.
+תהנו, ובהצלחה בבניית הקהילה החדשה שלכם!
activemodel: errors: <<: *errors diff --git a/config/locales/server.id.yml b/config/locales/server.id.yml index 07fcb181bf7..8ebdc424e70 100644 --- a/config/locales/server.id.yml +++ b/config/locales/server.id.yml @@ -15,6 +15,10 @@ id: short: "%m-%d-%Y" short_no_year: "%B %-d" date_only: "%B %-d, %Y" + long: "%B %-d, %Y, %l:%M%P" + date: + month_names: [null, Januari, Februari, Maret, April, Mei, Juni, Juli, Agustus, September, Oktober, November, Desember] + <<: *datetime_formats title: "Discourse" topics: "Topik" posts: "post" @@ -49,7 +53,6 @@ id: has_already_been_used: "telah digunakan" inclusion: tidak dimasukkan kedalam daftar invalid: tidak benar - is_invalid: "tidak valid; cobalah untuk lebih deskriptif" less_than: harus kurang dari %{count} less_than_or_equal_to: harus sama dengan atau kurang dari %{count} not_a_number: bukan numerik @@ -120,7 +123,6 @@ id: topic_not_found: "Ada yang salah. Mungkin topik ini ditutup atau dihapus ketika Anda sedang menjelajahinya?" just_posted_that: "tingkat kemiripan dengan post sebelumnya sangat tinggi" invalid_characters: "memuat karakter yang tidak valid" - is_invalid: "tidak valid; cobalah dengan sesuatu yang lebih deskriptif" next_page: "halaman berikutnya →" prev_page: "← halaman sebelumnya" page_num: "Halaman %{num}" @@ -141,10 +143,16 @@ id: private_posts: "pesan pribadi terkini" group_posts: "Posting terkini dari %{group_name}" group_mentions: "Mention terkini dari %{group_name}" + user_topics: "Topik terakhir oleh @%{username}" excerpt_image: "gambar" groups: errors: + can_not_modify_automatic: "Anda tidak bisa mengubah grup otomatis." + member_already_exist: "'%{username}' telah menjadi anggota grup ini." + invalid_domain: "'%{domain}' bukan domain yang valid." invalid_incoming_email: "'%{email}' bukanlah alamat email yang valid." + email_already_used_in_group: "'%{email}' telah digunakan oleh grup '%{group_name}'." + email_already_used_in_category: "'%{email}' telah digunakan oleh kategori '%{category_name}'." default_names: everyone: "setiap orang" admins: "admin" @@ -162,11 +170,33 @@ id: attributes: category: name: "Nama Kategori" + topic: + title: 'Judul' post: raw: "Konten" user_profile: bio_raw: "Tentang Saya" errors: + models: + topic: + attributes: + base: + warning_requires_pm: "Anda hanya dapat melampirkan peringatan pada pesan pribadi." + cant_send_pm: "Mohon maaf, Anda tidak dapat mengirimkan pesan pribadi pada pengguna tersebut." + no_user_selected: "Anda harus memilih pengguna yang valid." + user: + attributes: + password: + common: "adalah satu dari 10000 kata sandi umum. Mohon gunakan kata sandi yang lebih aman." + same_as_username: "sama dengan username anda. Mohon gunakan kata sandi yang lebih aman." + same_as_email: "sama denan surel anda. Mohon gunakan kata sandi yang lebih aman." + same_as_current: "sama dengan kata sandi saat ini." + ip_address: + signup_not_allowed: "Pendaftaran tidak diperbolehkan dari akun ini." + color_scheme_color: + attributes: + hex: + invalid: "bukan warna yang valid." <<: *errors user_profile: no_info_me: "Ci siamo quasi! Abbiamo mandato una email di attivazione a %{email}. Per favore segui le istruzioni contenute nell'email per attivare il tuo account.
Se l'email non ti arriva, controlla la tua cartella spam o prova a collegarti ancora per inviare un'altra email di attivazione.
" not_activated: "Non puoi ancora collegarti. Ti abbiamo mandato un'email di attivazione. Per favore segui le istruzioni contenute nell'email per attivare il tuo account." + not_allowed_from_ip_address: "Non puoi collegarti come %{username} da quell'indirizzo IP." + admin_not_allowed_from_ip_address: "Non puoi collegarti come admin da quell'indirizzo IP." suspended: "Non puoi collegarti fino a %{date}." errors: "%{errors}" not_available: "Non disponibile. Prova %{suggestion}?" @@ -1094,6 +1138,10 @@ it: subject_template: "[%{site_name}] Nuova versione di Discourse, aggiornamento disponibile" new_version_mailer_with_notes: subject_template: "[%{site_name}] aggiornamento disponibile" + queued_posts_reminder: + subject_template: + one: "[%{site_name}] 1 messaggio in attesa di essere revisionato" + other: "[%{site_name}] %{count} messaggi in attesa di essere revisionati" flag_reasons: off_topic: "Il tuo messaggio è stato segnalato come **fuori tema**: la comunità pensa non riguardi l'argomento, come attualmente definito dal titolo e dal contenuto del primo messaggio." inappropriate: "Il tuo messaggio è stato segnalato come **inappropriato**: la comunità lo ritiene offensivo, ingiurioso o una violazione delle [linee guida della comunità](/guidelines)." @@ -1105,8 +1153,10 @@ it: disagreed: "Grazie per averci informato. Stiamo provvedendo." deferred: "Grazie per averci informato. Stiamo provvedendo." deferred_and_deleted: "Grazie per averci informato. Abbiamo rimosso il messaggio." + temporarily_closed_due_to_flags: "Questo argomento è temporaneamente chiuso a causa di numerose segnalazioni della comunità." system_messages: post_hidden: + subject_template: "Messaggio nascosto a causa di segnalazioni dalla comunità" text_body_template: | Salve, @@ -1137,25 +1187,24 @@ it: subject_template: "Backup completato correttamente" backup_failed: subject_template: "Backup fallito" - text_body_template: | - Il backup è fallito. - - Questo è il log: - - ``` - %{logs} - ``` restore_succeeded: subject_template: "Il ripristino è avvenuto con successo." - text_body_template: "Il ripristino è avvenuto con successo." + text_body_template: | + Il ripristino è avvenuto con successo. + + Ecco il rapporto: + + ```text + %{logs} + ``` restore_failed: subject_template: "Ripristino fallito" text_body_template: | Il ripristino è fallito. - Ecco il log: + Ecco il rapporto: - ``` + ```text %{logs} ``` bulk_invite_succeeded: @@ -1167,19 +1216,33 @@ it: subject_template: "Esportazione dati completa" csv_export_failed: subject_template: "Esportazione dati fallita" + email_reject_insufficient_trust_level: + subject_template: "[%{site_name}] Problema email -- Livello Esperienza Insufficiente" + email_reject_screened_email: + subject_template: "[%{site_name}] Problema email -- Email Bloccata" + text_body_template: | + Spiacenti, il tuo messaggio email a %{destination} (intitolato %{former_title}) non ha funzionato. + + La tua risposta è stata inviata da un indirizzo email bloccato. Prova a spedire da un altro indirizzo email, oppure contatta un membro dello staff. + email_reject_inactive_user: + subject_template: "[%{site_name}] Problema email -- Utente Inattivo" + email_reject_blocked_user: + subject_template: "[%{site_name}] Problema email -- Utente Bloccato" email_reject_no_account: subject_template: "[%{site_name}] Problema relativo all'email -- Account Sconosciuto" + text_body_template: | + Ci dispiace, ma il tuo messaggio email per %{destination} (intitolato %{former_title}) non ha funzionato. + + Non esiste un account con quell'indirizzo email. Prova ad inviarla a un altro indirizzo o contatta un membro dello staff. email_reject_empty: subject_template: "[%{site_name}] Problema relativo all'email -- Nessun Contenuto" - email_reject_parsing: - subject_template: "[%{site_name}] Problema relativo all'email -- Contenuto non riconosciuto" email_reject_invalid_access: subject_template: "[%{site_name}] Problema relativo all'email -- Accesso non valido" email_reject_reply_key: subject_template: "[%{site_name}] Problema relativo all'email -- Chiave di risposta sconosciuta" email_reject_bad_destination_address: subject_template: "[%{site_name}] Problema email -- Destinatario sconosciuto" - text_body_template: | + text_body_template: |+ Spiacenti, ma il tuo messaggio email a %{destination} (intitolato %{former_title}) non è stato inviato. Non è stato riconosciuto alcuno degli indirizzi email di destinazione. Assicurati di inviare a indirizzi email validi. @@ -1192,6 +1255,7 @@ it: email_error_notification: subject_template: "[%{site_name}] Problema relativo all'email -- Errore di autenticazione POP" too_many_spam_flags: + subject_template: "Nuovo account sospeso" text_body_template: | Salve, @@ -1200,8 +1264,16 @@ it: Come misura precauzionale, il tuo nuovo account non può creare altre risposte o argomenti finché il tuo account non verrà revisionato da un membro dello staff. Ci scusiamo per il disagio. Per ulteriori informazioni, ti rimandiamo alle [linee guida della comunità](%{base_url}/guidelines). + too_many_tl3_flags: + subject_template: "Nuovo account sospeso" + blocked_by_staff: + subject_template: "Account temporaneamente sospeso" + user_automatically_blocked: + subject_template: "Nuovo utente %{username} bloccato dalle segnalazioni della comunità" spam_post_blocked: subject_template: "Il messaggi del nuovo utente %{username} sono stati bloccati a causa dell'invio di ripetuti collegamenti." + unblocked: + subject_template: "Account non più sospeso" pending_users_reminder: subject_template: one: "1 utente in attesa di approvazione" @@ -1213,13 +1285,21 @@ it: download_remote_images_disabled: subject_template: "Lo scaricamento delle immagini remote è disabilitato" text_body_template: "L'impostazione `download_remote_images_to_local` è stata disabilitata perché è stato raggiunto il limite di spazio su disco definito in `download_remote_images_threshold`." + dashboard_problems: + subject_template: "Si sono riscontrati problemi" subject_re: "R:" subject_pm: "[MP]" user_notifications: previous_discussion: "Risposte Precedenti" + in_reply_to: "In Risposta A" unsubscribe: title: "Annulla iscrizione" description: "Non vuoi ricevere queste email? Nessun problema! Clicca qui sotto per annullare l'iscrizione:" + reply_by_email: "[Visita Argomento](%{base_url}%{url}) o rispondi a questa email per replicare." + reply_by_email_pm: "[Visita Messaggio](%{base_url}%{url}) o rispondi a questa email per replicare." + only_reply_by_email: "Rispondi a questa email per replicare." + visit_link_to_respond: "[Visita Argomento](%{base_url}%{url}) per replicare." + visit_link_to_respond_pm: "[Visita Messaggio](%{base_url}%{url}) per replicare." posted_by: "Pubblicato da %{username} il %{post_date}" user_invited_to_private_message_pm: subject_template: "[%{site_name}] %{username} ti invita al partecipare al messaggio '%{topic_title}'" @@ -1227,30 +1307,101 @@ it: subject_template: "[%{site_name}] %{topic_title}" user_replied_pm: subject_template: "[%{site_name}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_quoted: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_linked: subject_template: "[%{site_name}] %{topic_title} " + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_mentioned: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_group_mentioned: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_posted: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_watching_first_post: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_posted_pm: subject_template: "[%{site_name}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_posted_pm_staged: subject_template: "%{optional_re}%{topic_title}" + text_body_template: |2 + + %{message} digest: why: "Un breve sommario di %{site_link} dalla tua ultima visita il %{last_seen_at}" - new_activity: "Nuove attività nei tuoi argomenti e messaggi:" - top_topics: "Messaggi di successo" - other_new_topics: "Argomenti più attivi" + subject_template: "[%{site_name}] Riepilogo" unsubscribe: "Questo riepilogo viene inviato da %{site_link} se non ti si vede da un po'. Per annullare l'iscrizione %{unsubscribe_link}." click_here: "clicca qui" - read_more: "Leggi Altro" - more_topics: "Ci sono stati %{new_topics_since_seen} altri nuovi argomenti." - more_topics_category: "Ulteriori nuovi argomenti:" + from: "%{site_name} riepilogo" + mailing_list: + from: "%{site_name} riepilogo" + new_topics: "Nuovi argomenti" + topic_updates: "Aggiornamenti argomento" + view_this_topic: "Vedi questo argomento" + back_to_top: "Torna in cima" forgot_password: subject_template: "[%{site_name}] Reimposta password" text_body_template: | @@ -1270,7 +1421,14 @@ it: Clicca sul seguente collegamento per scegliere una password: %{base_url}/users/password-reset/%{email_token} admin_login: - subject_template: "[%{site_name}] Login" + subject_template: "Connessione [%{site_name}]" + text_body_template: | + Qualcuno ha richiesto di connettersi al tuo account su [%{site_name}](%{base_url}). + + Se non sei stato tu ad avviare questa richiesta, puoi tranquillamente ignorare questa email. + + Altrimenti, clicca sul seguente collegamento per connetterti: + %{base_url}/users/admin-login/%{email_token} account_created: subject_template: "[%{site_name}] Il Tuo Nuovo Account " text_body_template: | @@ -1316,7 +1474,7 @@ it: login_required: welcome_message: | #[Benvenuto su %{title}](#welcome) - E' richiesto un account. Per continuare, crea un nuovo account oppure collegati. + E' richiesto un account. Per continuare, crea un nuovo account oppure connettiti. terms_of_service: title: "Termini di Servizio" signup_form_message: 'Ho letto e accetto i Termini del Servizio.' @@ -1365,12 +1523,29 @@ it: privacy_topic: title: "Politica della Privacy" badges: + editor: + name: Redattore + description: Prima modifica ad un messaggio + long_description: | + Questo distintivo viene assegnato la prima volta che modifichi uno dei tuoi messaggi. Anche se non potrai modificare i tuoi messaggi indefinitamente, la modifica è sempre una buona idea — puoi migliorare i tuoi messaggi, correggere piccoli errori o aggiungere qualcosa che avevi tralasciato nel momento della prima stesura. Effettua modifiche per migliorare i tuoi messaggi! + basic_user: + name: Base + description: 'Assegnate tutte le funzionalità essenziali della comunità ' + long_description: | + Questo distintivo viene assegnato quando raggiungi il livello di esperienza 1. Grazie per essere stato nei paraggi per un po' a leggere qualche argomento e a imparare di cosa tratta la nostra comunità. Le restrizioni iniziali che avevi come nuovo utente sono state allentate; ti sono ora state assegnate tutte le capacità essenziali, come ad esempio i messaggi personali, le segnalazioni, la modifica delle wiki e la possibilità di inviare più immagini e collegamenti. member: name: Membro + description: Assegnati inviti, messaggi multipli, maggiori "Mi piace" + long_description: | + Questo distintivo viene assegnato quando raggiungi il livello di esperienza 2. Grazie per esserti unito e per aver partecipato per qualche settimana alla nostra comunità. Puoi inviare inviti dalla tua pagina utente o dai singoli argomenti, creare messaggi personali di gruppo, a mettere un numero maggiore di "Mi piace" al giorno. regular: name: Assiduo + description: Assegnato ricategorizza, rinomina, collegamenti seguiti, wiki, maggiori "Mi piace" + long_description: | + Questo distintivo viene assegnato quando raggiungi il livello di esperienza 3. Grazie per essere stato parte attiva della nostra comunità per qualche mese. Ora sei uno dei lettori più attivi e un collaboratore affidabile che rende grande la nostra comunità. Ora puoi ricategorizzare e rinominare gli argomenti, usare le segnalazioni spam più potenti, accedere a un'area Lounge privata, e puoi mettere un numero ancora maggiore di "Mi piace" al giorno. leader: name: Veterano + description: Assegnato modifica globale, puntare, chiudere, archiviare, suddividere e riunire, maggiori "Mi piace" welcome: name: Benvenuto description: Ha ricevuto un "Mi piace" @@ -1378,6 +1553,9 @@ it: name: Autobiografo anniversary: name: Compleanno + description: Membro attivo per un anno, ha scritto almeno una volta + long_description: | + Questo distintivo è assegnato a chi è membro da un anno con almeno un messaggio scritto durante quell'anno. Grazie per esserci e contribuire alla nostra comunità. Non potremmo farcela senza di te. great_topic: description: Ha ricevuto 50 "Mi piace" in un argomento first_like: diff --git a/config/locales/server.ja.yml b/config/locales/server.ja.yml index 86b9ddaebf2..a006a1b09b9 100644 --- a/config/locales/server.ja.yml +++ b/config/locales/server.ja.yml @@ -53,7 +53,6 @@ ja: has_already_been_used: "は既に使用されています" inclusion: は一覧にありません invalid: は正しくありません - is_invalid: "に問題があります。長さなど、不備が無いか確認してください。" less_than: は%{count}より小さい値にしてください less_than_or_equal_to: は%{count}以下の値にしてください not_a_number: は数値で入力してください @@ -78,8 +77,6 @@ ja: load_from_remote: "投稿の読み込みに失敗しました。" site_settings: min_username_length_range: "最小値を最大値より上にすることはできません。" - bulk_invite: - file_should_be_csv: "アップロードするファイルは、csv または txt 形式である必要があります。" backup: operation_already_running: "操作を実行しています。他の操作はできません。" backup_file_should_be_tar_gz: "バックアップファイルは .tar.gz形式である必要があります。" @@ -103,14 +100,13 @@ ja: in_reply_to: "▶ %{username}" replies: other: "%{count} 通の返信" - no_mentions_allowed: "あなたは他のユーザへメンションを送ることができません。" - no_images_allowed: "新規ユーザは投稿に画像を付ける事はできません。" + no_mentions_allowed: "あなたは他のユーザーへメンションを送ることができません。" + no_images_allowed: "新規ユーザーは投稿に画像を付ける事はできません。" spamming_host: "申し訳ありませんが、このホストへのリンクを貼ることはできません。" - user_is_suspended: "凍結中のユーザは投稿できません。" + user_is_suspended: "凍結中のユーザーは投稿できません。" topic_not_found: "問題が発生しました。トピックがクローズしたか、閲覧中に削除された可能性があります。" just_posted_that: "は最近の投稿と内容がほぼ一緒です" invalid_characters: "は不正な文字を含んでいます" - is_invalid: "に問題があります。長さなど、不備が無いか確認してください。" next_page: "次のページ →" prev_page: "← 前のページ" page_num: "%{num} ページ" @@ -153,20 +149,20 @@ ja: until_posts: other: "%{count} 投稿" new-topic: | - %{site_name} へようこそ!— ** 新たなトピックの作成ありがとうございます!** + %{site_name} へようこそ!— **新たなトピックの作成ありがとうございます!** - タイトルはトピックの内容を正しく説明していますか?他の人にとって興味深いタイトルになっていますか? - このトピックは何をカバーするものですか?このトピックに興味を示しそうなのは誰でしょう?なぜこのトピックは重要なのでしょうか?コミュニティよりどのような回答を期待していますか? - - トピックに適切な検索用ワードを含めると、他の人がトピックを *発見* しやすくなります。詳細は [コミュニティガイドライン](/guidelines) を参照してください。このパネルは最初から %{education_posts_text} 回目までの投稿のときにだけ表示されます。 + - トピックに適切な検索用ワードを含めると、他の人がトピックを *発見* しやすくなります。詳細は [コミュニティガイドライン](/guidelines) を参照してください。このメッセージは最初の %{education_posts_text} まで表示されます。 new-reply: | %{site_name} へようこそ — **コミュニティへの貢献ありがとうございます!** - あなたの回答は議論に何らかの形で貢献していますか? - - コミュニティメンバー同士のやりとりは礼儀正しく、マナーを保ちましょう。 - - 建設的な批判は歓迎します。ただし批判は「人」に対してではなく「アイデア」に対して行いましょう。 - 詳細は[コミュニティガイドライン](/guidelines)を参照してください。このパネルは最初の %{education_posts_text} のみに表示されます。 - sequential_replies: | + - 会話は礼儀正しく、マナーを守りましょう。 + - しっかりとした批判は良いかと思います。ただし「その人」に対してでは無く、「そのアイディア」に対してしましょう。 + 詳細は[コミュニティガイドライン](/guidelines)を参照してください。このメッセージは最初の %{education_posts_text} のみに表示されます。 + sequential_replies: |+ ### 一度に複数の投稿に返信する トピックにたくさん返信する代わりに、以前の投稿への @name メンションや引用などを活用して返信を一つの投稿にまとめましょう。 @@ -175,11 +171,11 @@ ja: こまごまと何度も返信するより、まとまって返信をすることで、より見やすく、より話しやすくなります。 dominating_topic: | - ### 他のユーザも議論に参加させてあげましょう + ### 他のユーザーも議論に参加させてあげましょう - このトピックはあなたにとても重要なもののようですね – ここの回答のうち %{percent}% 以上があなたによってなされています。 + このトピックはあなたにとても重要なもののようですね – ここへ %{percent}% 以上の返信をあなたが行っています。 - 他のユーザが回答するために十分な時間的猶予を与えているか、ちょっと振り返ってみませんか? + 他のユーザーも返信するためにも、ある程度時間を開けているか確認してみましょう。 too_many_replies: | ### このトピックに回答出来る制限を超えました @@ -207,14 +203,14 @@ ja: attributes: base: warning_requires_pm: "プライベートメッセージでのみ警告を送ることができます" - too_many_users: "1度に1ユーザにしか警告を送る事はできません" - cant_send_pm: "申し訳ありません。このユーザにはプライベートメッセージを送る事ができません" - no_user_selected: "有効なユーザを選択してください" + too_many_users: "一度に1ユーザーにしか警告を送る事はできません" + cant_send_pm: "申し訳ありません。このユーザーにはプライベートメッセージを送る事ができません" + no_user_selected: "有効なユーザーを選択してください" user: attributes: password: common: "は10000最も一般的なパスワードのいずれかである。より安全なパスワードを使用してください。" - same_as_username: "はあなたのユーザ名と同じです。より安全なパスワードを使用してください" + same_as_username: "はあなたのユーザー名と同じです。より安全なパスワードを使用してください" same_as_email: "はあなたのメールアドレスと同じです。より安全なパスワードを使用してください" ip_address: signup_not_allowed: "このアカウントからのサインアップできません。" @@ -235,7 +231,7 @@ ja: assets_topic_body: "これはパーマネントトピックです。スタッフのみが閲覧でき、サイトデザインに使用する画像とファイルを保存するために使用します。削除しないでください!\n\n利用方法:\n\n\n1. このトピックに回答\n2. ロゴやファビコンなどに使用する全ての画像をアップロード(エディタのアップロードアイコンか、ドラッグアンドドロップで画像を貼付ける)\n3. 回答を投稿\n4. 新しい投稿の画像を右クリックしてアップロード済み画像のパスを取得するか、編集アイコンをクリックして画像のパスを探し、画像パスをコピーする\n5. 画像パスを[基本設定](/admin/site_settings/category/required)に貼付ける\n\nもし、別のファイルタイプが必要な場合、[ファイル設定](/admin/site_settings/category/files)の`サポートするファイルの拡張` を編集してください" lounge_welcome: title: "ラウンジへようこそ" - body: | + body: |2 素晴らしい! :confetti_ball: @@ -269,12 +265,14 @@ ja: topic_exists_no_oldest: "%{count}個のトピックを持っているため、このカテゴリを削除できません。" trust_levels: newuser: - title: "新しいユーザ" + title: "新しいユーザー" basic: - title: "ベーシックユーザ" - change_failed_explanation: "%{user_name} を '%{new_trust_level}' に格下げしようとしましたが、既にトラストレベルが '%{current_trust_level}' です。%{user_name} は '%{current_trust_level}' のままになります - もしユーザーを降格させたい場合は、トラストレベルをロックしてください" + title: "ベーシックユーザー" + change_failed_explanation: "%{user_name} を '%{new_trust_level}' に下げようとしましたが、既にトラストレベルが '%{current_trust_level}' です。%{user_name} は '%{current_trust_level}' のままになります - もしユーザーを降格させたい場合は、トラストレベルをロックしてください" rate_limiter: too_many_requests: "このアクションを一日の間に実施可能な回数が決まっています。%{time_left}待ってから再度試してください。" + by_type: + public_group_membership: "グループへの参加/離脱が多すぎます。%{time_left}お待ち下さい。" hours: other: "%{count} 時間" minutes: @@ -368,7 +366,7 @@ ja: long_form: '不適切として通報する' notify_user: title: '@{{username}}へメッセージを送る' - long_form: 'メッセージが送られたユーザ' + long_form: 'メッセージが送られたユーザー' email_title: '「%{title}」にの投稿' email_body: "%{link}\n\n%{message}" notify_moderators: @@ -403,28 +401,33 @@ ja: email_title: 'トピック"%{title}" は不適切な可能性があるため、管理人による確認を必要とする。' email_body: "%{link}\n\n%{message}" flagging: - you_must_edit: '投稿が他のユーザから通報されました。投稿したメッセージを確認してください。
' - user_must_edit: 'この投稿は他のユーザから通報されたため、非表示にされています。
' + you_must_edit: '投稿が他のユーザーから通報されました。投稿したメッセージを確認してください。
' + user_must_edit: 'この投稿は他のユーザーから通報されたため、非表示にされています。
' archetypes: regular: title: "通常のトピック" banner: title: "バナートピック" message: - make: "このトピックはバナートピックに設定されています。ユーザが解除しない限り、ページ毎の一番上に表示されます" + make: "このトピックはバナートピックに設定されています。ユーザーが解除しない限り、ページ毎の一番上に表示されます" remove: "このトピックはバナーではなくなりました。トップページには表示されなくなります" + unsubscribe: + unwatch_category: "%{category}内の全トピックのウォッチを解除" + user_api_key: + title: "アプリケーションアクセスの認証" + description: "\"%{application_name}\" があなたのアカウントへのアクセスを要求しています: " reports: visits: - title: "訪問ユーザ" + title: "訪問ユーザー" xaxis: "日" yaxis: "訪問者数" signups: - title: "新規ユーザ" + title: "新規ユーザー" xaxis: "日" - yaxis: "新規ユーザ数" + yaxis: "新規ユーザー数" profile_views: xaxis: "日" - yaxis: "ユーザプロフィールの閲覧数" + yaxis: "ユーザープロフィールの閲覧数" topics: title: "トピック" xaxis: "日" @@ -452,13 +455,13 @@ ja: users_by_trust_level: title: "ユーザーごとのトラストレベル" xaxis: "トラストレベル" - yaxis: "ユーザ数" + yaxis: "ユーザー数" emails: title: "送信メール" xaxis: "日" yaxis: "メールの数" user_to_user_private_messages: - title: "ユーザ to ユーザ" + title: "ユーザーからユーザーへ" xaxis: "日" yaxis: "メッセージ数" system_private_messages: @@ -474,12 +477,12 @@ ja: xaxis: "日" yaxis: "メッセージ数" notify_user_private_messages: - title: "ユーザ通知" + title: "ユーザーの通知" xaxis: "日" yaxis: "メッセージ数" top_referrers: title: "トップリファラ" - xaxis: "ユーザ" + xaxis: "ユーザー" num_clicks: "クリック" num_topics: "トピック" top_traffic_sources: @@ -487,19 +490,19 @@ ja: xaxis: "ドメイン" num_clicks: "クリック" num_topics: "トピック" - num_users: "ユーザ" + num_users: "ユーザー" top_referred_topics: title: "トップ被参照トピック" xaxis: "トピック" num_clicks: "クリック" page_view_anon_reqs: - title: "匿名ユーザ" + title: "匿名ユーザー" xaxis: "日" - yaxis: "匿名ユーザからの閲覧数" + yaxis: "匿名ユーザーからの閲覧数" page_view_logged_in_reqs: title: "ログイン" xaxis: "日" - yaxis: "ログインユーザからの閲覧数" + yaxis: "ログインユーザーからの閲覧数" page_view_crawler_reqs: title: "クローラー" xaxis: "日" @@ -509,13 +512,13 @@ ja: xaxis: "日" yaxis: "合計閲覧数" page_view_logged_in_mobile_reqs: - title: "ログインユーザからの閲覧数" + title: "ログインユーザーからの閲覧数" xaxis: "日" - yaxis: "モバイルでログインしているユーザからの閲覧数" + yaxis: "モバイルでログインしているユーザーからの閲覧数" page_view_anon_mobile_reqs: - title: "匿名ユーザからの閲覧数" + title: "匿名ユーザーからの閲覧数" xaxis: "日" - yaxis: "モバイルで閲覧している匿名ユーザの閲覧数" + yaxis: "モバイルで閲覧している匿名ユーザーの閲覧数" http_background_reqs: title: "背景" xaxis: "日" @@ -549,7 +552,7 @@ ja: xaxis: "日" yaxis: "合計" mobile_visits: - title: "訪問ユーザ" + title: "訪問ユーザー" xaxis: "日" yaxis: "訪問者数" dashboard: @@ -566,19 +569,11 @@ ja: s3_config_warning: 'サーバが S3 にファイルをアップロードするように設定されていますが、次のうち少なくとも1つが設定されていません: s3_access_key_id, s3_secret_access_key or s3_upload_bucket。サイトの設定 にて設定を更新してください。詳しくは "How to set up image uploads to S3?" を参考にしてください。' s3_backup_config_warning: 'サーバが S3 にバックアップをアップロードするように設定されていますが、次のうち少なくとも1つが設定されていません: s3_access_key_id, s3_secret_access_key or s3_upload_bucket。サイトの設定 にて設定を更新してください。詳しくは "How to set up image uploads to S3?" を参考にしてください' image_magick_warning: 'サーバが大きな画像のサムネイルを作成する設定になっていますが、ImageMagick がインストールされていません。お好きなパッケージマネージャを使って ImageMagick をインストールするか、最新のリリースをダウンロードしてください。' - default_logo_warning: "あなたのサイトのロゴを設定しましょう。サイトの設定で logo_url, logo_small_url, favicon_url を更新してください。" - contact_email_missing: "サイトに関する緊急連絡が行えるように、連絡先メールアドレスを入力してください。サイトの設定で更新できます" - contact_email_invalid: "サイトの連絡先メールアドレスが正しくありません。サイトの設定で更新してください" - title_nag: "サイトの名前が正しくありません。サイトの設定で更新してください" - site_description_missing: "検索結果に表示される説明文を入力してください。サイトの設定で更新してください" - consumer_email_warning: "サイトはメール送信に Gmail (または他のカスタムメールサービス) を利用するように設定されています。Gmail で送信可能なメール数には制限があります。メールを確実に送信するために mandrill.com などのメールサービスプロバイダーの利用を検討してください。" - site_contact_username_warning: "重要なメッセージを送るために、スタッフユーザの名前を入力してください。サイト設定 のsite_contact_username を更新してください。" - notification_email_warning: "通知用メールがあなたのドメインで有効なメールアドレスから送信されていません。メール配信が不安定になり、信頼性が低くなります。\nサイトの設定で更新してください" site_settings: censored_words: "自動的に ■■■■ で置換されます" delete_old_hidden_posts: "30日以上非表示になっている投稿を自動で削除します" default_locale: "この Discourse インスタンスのデフォルト言語 (ISO 639-1 Code)" - allow_user_locale: "ユーザーが各自の言語設定を選択できるようにする" + allow_user_locale: "ユーザーが言語を選択できるようにする" min_post_length: "投稿を許可する最少の文字数" min_first_post_length: "最初の投稿(投稿本文)を許可する最少の文字数" min_private_message_post_length: "メッセージに投稿可能な最少の文字数" @@ -613,7 +608,6 @@ ja: exclude_rel_nofollow_domains: "nofollowを付与すべきではないドメインのリスト。tld.comは、sub.tld.com も許可します。最低でもクローラーが全てのコンテンツを見つけるために、このサイトのトップレベルドメインを追加する必要があります。このサイトの他の部分が別ドメインに存在している場合、それも追加します" post_excerpt_maxlength: "投稿の引用/サマリの最大文字数" post_onebox_maxlength: "Discourse OneBox投稿の最大文字数" - onebox_domains_whitelist: "OneBoxを許可するドメインのリスト。これらのドメインはOpenGraphかoEmbedをサポートしている必要があります。http://iframely.com/debug でテストできます" logo_url: "サイトの左上に表示されるロゴ画像です。横幅の大きい長方形にする必要があります。空欄の場合、サイトタイトルが表示されます" logo_small_url: "サイトの左上に表示される小さいロゴ画像です。正方形である必要があります。下にスクロールすると表示されます。空欄の場合、ホームアイコンが表示されます" mobile_logo_url: "モバイルサイトの左上に固定で表示されるロゴ画像です。正方形である必要があります。空欄の場合 `logo_url` が利用されます 例: http://example.com/uploads/default/logo.png" @@ -662,7 +656,6 @@ ja: redirect_users_to_top_page: "新規ユーザーと長く不在のユーザーをトップページに自動的にリダイレクトさせる" show_email_on_profile: "プロフィールのメールアドレスを表示(自分とスタッフのみ閲覧できます)" email_token_valid_hours: "パスワードリマインダ、アカウントアクティベート時のトークンを何時間有効にするか" - email_token_grace_period_hours: "パスワードリマインダ、アカウントアクティベート時のトークンを無効するときに、何時間猶予を与えるか" enable_badges: "バッジ機能を有効にする" allow_index_in_robots_txt: "サーチエンジンにインデックスを許可するようにrobots.txtを指定する" email_domains_blacklist: "ユーザーがアカウント登録をすることができない、パイプ区切りのドメイン名のリスト。 例 : mailinator.com|trashmail.net" @@ -794,8 +787,8 @@ ja: topic_post_like_heat_medium: "いいね数/ ポスト数の比率がこの比率を超えると、ポスト数のフィールドが適度に強調されます" topic_post_like_heat_high: "いいね数/ ポスト数の比率がこの比率を超えると、ポスト数のフィールドが強く強調されます" faq_url: "FAQが他のサイトにある場合、URLをここに指定します。" - tos_url: "他サイトに利用規約をホストしている場合は、フル URL をここに指定。" - privacy_policy_url: "他サイトにプライバシーポリシーをホストしている場合は、フル URL を個々に指定。" + tos_url: "他のサイトに利用規約を掲載している場合は、URLをここに指定してください。" + privacy_policy_url: "他のサイトにプライバシーポリシーを掲載している場合は、URLをここに指定してください。" white_listed_spam_host_domains: "スパムホスト検査から除外するドメインのリスト。新規ユーザはこれらのドメインでポスト内にリンクを作成することを制限されません" staff_like_weight: "スタッフにより「いいね!」された場合、どのくらい重み付けをするか" levenshtein_distance_spammer_emails: "スパマーのメールアドレスとマッチさせるとき、数文字違いの曖昧な一致でも許可する" @@ -870,7 +863,6 @@ ja: embed_whitelist_selector: "embedを許可するエレメントのCSS Selector" embed_blacklist_selector: "embedから削除するエレメントのCSS Selector" notify_about_flags_after: "この数時間後に処理されていない通報がある場合は、contact_emailにメールを送信する。0を設定すると無効になります" - enable_cdn_js_debugging: "全てのJSにcrossorigin権限を追加することで、/logsに適切なエラーを表示することを許可する" show_create_topics_notice: "サイトにpublicなトピックが5よりも少ない場合、トピックを作成するための通知が管理者に表示される" delete_drafts_older_than_n_days: (n) 日間経過したドラフトを削除 prevent_anons_from_downloading_files: "匿名ユーザーが添付ファイルをダウンロードするのを防止。警告: 画像ではなく、添付ファイルとして投稿された全てのファイルが対象です" @@ -1015,34 +1007,8 @@ ja: subject_template: "[%{site_name}] メール送信テスト" new_version_mailer: subject_template: "[%{site_name}] Discourseの新しいバージョンがあります。" - text_body_template: | - 最新版の[Discourse](http://www.discourse.org)が利用出来ます! - - 現在利用しているバージョン: %{installed_version} - 新しいバージョン: **%{new_version}** - - - 更新は**[ワンクリックブラウザ・アップグレード](%{base_url}/admin/upgrade)**から簡単にできます。 - - - 更新内容は[GitHubの更新履歴](https://github.com/discourse/discourse/commits/master)をご覧ください。 - - - [meta.discourse.org](http://meta.discourse.org)にて、Discourseに関するお知らせ、話し合い、サポートを行っています。 new_version_mailer_with_notes: subject_template: "[%{site_name}] アップデートがあります" - text_body_template: | - 最新版の[Discourse](http://www.discourse.org)が利用出来ます! - - 現在利用しているバージョン: %{installed_version} - 新しいバージョン: **%{new_version}** - - - 更新は**[ワンクリックブラウザ・アップグレード](%{base_url}/admin/upgrade)**から簡単にできます。 - - - 更新内容は[GitHubの更新履歴](https://github.com/discourse/discourse/commits/master)をご覧ください。 - - - [meta.discourse.org](http://meta.discourse.org)にて、Discourseに関するお知らせ、話し合い、サポートを行っています。 - - ### リリースノート - - %{notes} queued_posts_reminder: subject_template: other: "[%{site_name}] %{count} 件の投稿がレビュー待ちです" @@ -1062,61 +1028,45 @@ ja: welcome_user: subject_template: "%{site_name} へようこそ!" text_body_template: | - %{site_name}への参加ありがとうございます。ようこそ! + %{site_name}に参加していただきありがとうございます。 + そしてようこそ! %{new_user_tips} - 私たちは、[ガイドライン](%{base_url}/guidelines) を常に信じています + [ガイドライン](%{base_url}/guidelines) をよく読み、しっかり守りましょう。 - 楽しんでください! + それでは、楽しんでください! (もし[スタッフメンバー](%{base_url}/about) に新規ユーザーとして連絡する必要がある場合、このメッセージに返信してください) welcome_invite: subject_template: "%{site_name}へようこそ!" text_body_template: | - ようこそ%{site_name} へ! - あなたのアカウント**%{username}** を作成して、あなたはログインしています。 - 氏名の変更は [your user profile][prefs] より行ってください。 + %{site_name}へようこそ! + アカウント **%{username}** を作成し、ログインしています。 - 次回ログインするときは、 + 名前の変更は [自分のユーザプロフィール][prefs] より行ってください。 - 1. かならず招待をうけたメールアドレスを使ってログインしてください。 + 次回からログインする際は、 - 2.[your user profile][prefs]でパスワードを設定して、ログインのときはそれを使用してください。 + 1. 招待時に使用したメールアドレスを使用してください。 + + 2.[自分のユーザプロフィール][prefs]からパスワードを設定して、ログインのときは設定したパスワードを使用してください。 %{new_user_tips} [civilized community behavior](%{base_url}/guidelines)をお守りいただき、健全なコミュニティとなるよう皆様のご協力をお願いいたします。 それではお楽しみください! - (もし個人的に [staff members](%{base_url}/about) と連絡を取る必要がある場合、このメッセージに返信してください) + (もし、[スタッフ](%{base_url}/about) と連絡を取る必要がある場合はこのメッセージに返信してください) [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "バックアップは正常に完了しました" - text_body_template: "バックアップが成功しました。\n [admin > backup section](%{base_url}/admin/backups) から、バックアップをダウンロードしてください" backup_failed: subject_template: "バックアップ失敗" - text_body_template: | - バックアップが失敗しました - - ログ: - - ``` - %{logs} - ``` restore_succeeded: subject_template: "復元が正常に完了しました" - text_body_template: "復元が完了しました。" restore_failed: subject_template: "復元に失敗しました" - text_body_template: | - リストアが失敗しました - - ログ: - - ``` - %{logs} - ``` bulk_invite_succeeded: subject_template: "ユーザの一括招待に成功しました。" text_body_template: "ユーザの一括招待が処理され、%{sent}通の招待メールを送信しました" @@ -1146,7 +1096,6 @@ ja: email_reject_empty: subject_template: "[%{site_name}] Email issue -- 本文なし" email_reject_parsing: - subject_template: "[%{site_name}] Email issue -- 認識されていないコンテンツ" text_body_template: | 申し訳ありません,あなたの %{destination} へのメール(titled %{former_title}) は動きませんでした メールから回答を見つける事ができませんでした。返信はメールのトップにあることを確認してください。インライン回答を見つける事はできません。 @@ -1200,13 +1149,8 @@ ja: subject_template: "[%{site_name}] [プライベートメッセージ] %{topic_title}" digest: why: "あなたが最後にアクセスした %{last_seen_at} 以降の %{site_link} のまとめです" - new_activity: "あなたのトピックおよびポストにおけるアクティビティ:" - top_topics: "人気の投稿" - other_new_topics: "人気のトピック" + unsubscribe: "このお知らせは%{site_link}から送信されました。購読を解除したい場合は%{unsubscribe_link}してください。" click_here: "ここをクリック" - read_more: "もっと読む" - more_topics: " %{new_topics_since_seen}個の新しいトピックがありました" - more_topics_category: "もっと新しいトピック:" mailing_list: new_topics: "新着トピック" forgot_password: @@ -1244,6 +1188,23 @@ ja: %{base_url}/users/authorize-email/%{email_token} signup_after_approval: subject_template: "%{site_name} への参加承認完了!" + text_body_template: | + %{site_name}へようこそ! + + スタッフが%{site_name}でのアカウントを承認しました。 + + アカウントを有効にするには以下のリンクをクリックしてください: + %{base_url}/users/activate-account/%{email_token} + + 上記のURLがクリック出来ない場合は、コピーし、ウェブブラウザのアドレスバーに貼り付けてください。 + + %{new_user_tips} + + [ガイドライン](%{base_url}/guidelines)をよく読み、しっかり守りましょう。 + + それでは、お楽しみください! + + (もし[スタッフメンバー](%{base_url}/about) に新規ユーザーとして連絡する必要がある場合、このメッセージに返信してください) signup: subject_template: "[%{site_name}] アカウントの確認" text_body_template: | @@ -1310,10 +1271,91 @@ ja: title: "利用規約" privacy_topic: title: "プライバシーポリシー" + body: | + + + ## [どのような情報を収集するのですか?](#collect) + + あなたがこのサイトに登録すると、ここで共有された情報を読んだり、書いたり、評価したりして、フォーラムでの情報を集める事ができます。 + + このサイトに登録する際には、名前とメールアドレスの入力を求めることがあります。ただし、登録をすることなくこのサイトを利用することも可能です。あなたのメールアドレスは、固有のリンクを含んだメールで確認されます。そのリンクにアクセスした場合にメールアドレスを制御することとなります。 + + アカウントを登録し、投稿を行った際にはその投稿が行われたIPアドレスを記録します。また、このサーバーに対する全てのリクエストはIPアドレスを含むサーバーログとして保管されます。 + + + + ## [自分の情報を何に使うのですか?](#use) + + このサイトで収集された情報は、次のいくつかの方法で使用されます: + + * パーソナライズ・エクスペリエンス — あなたの情報は、あなたや他のユーザーのニーズに対応するために役立ちます。 + * サイトの改善・最適化 — このサービスはあなたから受け取った情報やフィードバックに基づいて提供されるサイトの改善を行いつづけます。 + * サービスの向上 — あなたの情報は、ユーザーからの要求やサポートへより効果的に対応するために役立ちます。 + * 定期メールの送信 — メールアドレスは、情報の送信、トピックの変更やユーザー名に関係するお知らせ、お問い合わせに関する返答、その他のリクエストや質問に関してお知らせするために使用されます。 + + + + ## [自分の情報はどのように保護されるのですか?](#protect) + + このサービスはあなたの個人情報の入力、送信、またはアクセスに際してあなたの個人情報の安全性を維持するために様々なセキュリティ手段をとっています + + + ## [どのようにデータは保存されますか?](#data-retention) + + このサービスは次のことを行います: + + * このサーバーへのすべての要求に対して、IPアドレスを含むサーバーログを90日以内に渡って保持します。 + * 登録されたユーザーとその投稿に関連付けされたIPアドレスを5年以内に渡って保持します。 + + + ## [クッキーを使用していますか?](#cookies) + + はい。クッキーはあなたがウェブブラウザ上で許可した場合にコンピュータのストレージに転送される小さなファイルです。 + これらのクッキーを使用すると、サイトでブラウザが識別され、登録済みのアカウントを持っている場合は登録済みのアカウントに関連付けがされます。 + + クッキーを使用して、今後再度閲覧された場合に前回のデータから設定を呼び出したり、今後の改善のためにサイトのトラフィックやサイトの相互作用に関する集計データを作成します。このサービスは、サイトを訪れた方との理解を深めるために、第三者のサービス提供者と契約することがあります。これらのサービス提供者というものは、このサービスでの業務を行ったり、改善するためにこのサービスの代わって収集された情報を使用することはできません。 + + + + ## [このサイトは外部に何らかの情報を開示していますか?](#disclose) + + 私たちは、個人を特定出来る情報を外部へ販売、取引、または他の方法で渡すことはありません。これには、このサイトを操作したり、業務を行ったり、サービスを提供するのに役立つ信頼できる第三者は含まれません。法令遵守、サイトポリシーの施行、このサービスや他の人の権利、財産または安全の保護のために適切であると判断した場合に、あなたの情報を公開する場合があります。ただし、マーケティングや広告、その他の目的で匿名での訪問者情報を他者へ提供することができます。 + + + + ## [サードパーティのリンク](#third-party) + + ときどき、このサービスの方針にもとづいてこのサイトや第三者のサービスを提供することがあります。これらの第三者のサイトには、個別の独立したプライバシーポリシーがあります。従って、これらのリンク先のサイトに関するコンテンツや活動にかんしては一切責任を負いません。ですが、サイトの完全性やこれらのサイトに関するフィードバックは非常に重要なものであると認識しております。 + + + + ## [子供のオンライン・プライバシー保護法](#coppa) + + このサイト、製品、サービスはすべて13歳以上の人を対象としております。このサーバーが米国にあり、13歳未満の場合はCOPPA ([Children's Online Privacy Protection Act](https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act))にもとづいてこのサイトを使用しないでください。 + + + + ## [オンライン限定のプライバシーポリシー](#online) + + このオンライン・プライバシーポリシーは、このサイトを通じて収集された情報のみに適用され、オフラインで収集される情報には適用されません。 + + + + ## [あなたの同意](#consent) + + このサービスを使用することにより、このサイトのプライバシーポリシーに同意するものとします。 + + + + ## [プライバシーポリシーの変更](#changes) + + プライバシーポリシーを変更する場合は、このページへ変更内容を掲載します。 + + この文章のライセンスはCC-BY-SAです。このページは2013年5月31日が最終更新です badges: editor: name: 編集者 - description: 最初の投稿を編集する + description: はじめて投稿を編集する autobiographer: name: あなたはだれ? description: プロフィールをすべて書く diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml index fa7ef2d6c1b..ae26f88e020 100644 --- a/config/locales/server.ko.yml +++ b/config/locales/server.ko.yml @@ -18,6 +18,10 @@ ko: date: month_names: [] <<: *datetime_formats + time: + am: "오전" + pm: "오후" + <<: *datetime_formats title: "Discourse" topics: "글타래" posts: "글" @@ -29,6 +33,7 @@ ko: emails: incoming: default_subject: "%{email} 으로부터 받은 이메일" + show_trimmed_content: "일부 내용만 보기" errors: &errors format: '%{attribute} %{message}' messages: @@ -48,7 +53,6 @@ ko: has_already_been_used: "이미 사용되었음" inclusion: 리스트에 없음 invalid: 올바르지 않음 - is_invalid: "유효하지 않음; 좀더 자세하게 서술해주세요" less_than: '%{count}보다 작아야 함' less_than_or_equal_to: '%{count}보다 작거나 같아야 함' not_a_number: 숫자가 아님 @@ -71,8 +75,6 @@ ko: other: '%{model} 저장 시에 %{count}개의 에러가 발생하여 진행을 못했습니다.' embed: load_from_remote: "글 로딩 중 오류가 발생하였습니다." - bulk_invite: - file_should_be_csv: "CSV 또는 TXT형식의 파일을 업로드해야 합니다." backup: operation_already_running: "현재 %{operation} 작업중입니다. %{operation} 작업을 지금 시작할 수 없습니다." backup_file_should_be_tar_gz: "백업 파일은 .tar.gz형식의 파일이어야 합니다." @@ -116,7 +118,6 @@ ko: topic_not_found: "뭔가 잘못됐네요. 아마 글 보려는 도중에 글타래가 닫혔거나 지워진 건 아닐까요?" just_posted_that: "당신이 이전에 게시한 것과 너무 비슷합니다." invalid_characters: "사용할 수 없는 문자를 포함하고 있습니다." - is_invalid: "사용할 수 없습니다. 조금더 자세하게 적어주세요." next_page: "다음 페이지 →" prev_page: "← 이전 페이지" page_num: "%{num}페이지 " @@ -244,7 +245,7 @@ ko: assets_topic_body: "이 글타래는 스태프에게만 보이는 영구적인 글타래입니다. 사이트 디자인을 위한 이미지를 저장할 수 있습니다. 지우지 마세요!\n\n다음처럼 하세요:\n\n1. 이 글타래에 답글을 작성하세요.\n2. 로고, 파비콘 등으로 사용하고 싶은 모든 이미지들을 업로드한다. (글 에디터 툴바의 업로드 아이콘을 사용하거나, 드래그 앤 드롭으로 이미지를 올려주세요.)\n3. 답글을 제출합니다.\n4. 답글의 업로드된 이미지를 우클릭하거나, 수정 버튼을 눌러 이미지의 경로를 확인하세요. 해당 이미지의 경로를 복사하세요.\n5. 복사한 이미지 경로를 [basic settings](/admin/site_settings/category/required)에 붙여넣으세요.\n\n\n다른 유형의 이미지를 사용해야한다면 [file settings](/admin/site_settings/category/files)의 `authorized_extensions` 를 수정하세요." lounge_welcome: title: "라운지에 오신 것을 환영합니다." - body: | + body: |2 축하합니다! :confetti_ball: 당신의 회원등급이 **지도자** (회원등급 3등급)로 올라갔기 때문에 이 글타래를 볼 수 있게 되었습니다. 이제부터 아래의 행동들을 할 수 있습니다 … * 글타래를 제목을 수정할 수 있습니다 * 글타래의 카테고리를 수정할 수 있습니다 * 링크가 follow로 처리됩니다 ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) 가 제거됩니다) * 회원등급 3 이상인 사용자가 접근할 수 있는 비공개 카테고리인 라운지에 접근할 수 있습니다 * 좋아요와 신고의 가중치가 높아집니다 [정규 멤버 목록](/badges/3/regular)을 확인할 수 있습니다. 인사하는 것을 잊지마세요. 이 커뮤니티의 중요한 역할을 해주신 것에 감사드립니다! (회원등급에 관한 더 자세한 정보를 보시려면, [이 글타래를 확인하세요][trust]. 기준에 맞는 사람만 정규 회원으로 자격이 유지됩니다.) [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: @@ -565,14 +566,6 @@ ko: s3_config_warning: '파일을 Amazon S3로 업로드 하도록 설정하였습니다. 하지만 아직 Access key id(s3_access_key_id), Secret access key(s3_secret_access_key) 혹은 S3 bucket(s3_upload_bucketat) 중 하나를 설정하지 않았습니다. 사이트 세팅에서 설정해주세요. 자세히 알아보기("How to set up image uploads to S3?").' s3_backup_config_warning: 's3를 이용한 서버 설정이 완료 되지 않았습니다: s3_access_key_id, s3_secret_access_key, s3_secret_access_key 또는 s3_upload_bucket. 사이트 설정 에 가셔서 업데이트 하세요. "How to set up image uploads to S3?" 읽어 보세요.' image_magick_warning: '큰 이미지의 섬네일 만드는 설정이 있지만, ImageMagick가 설치되지 않았습니다. 최신버전 받기.' - default_logo_warning: "사이트에 로고를 설정해 주세요. logo_url, logo_small_url, 와 favicon_url 를 사이트 설정 에서 설정하세요." - contact_email_missing: "사이트에 이메일을 설정해서 사이트와 관련된 긴급사항을 받아보세요. contact_email 을 사이트 설정 에서 설정해주세요." - contact_email_invalid: "이 사이트의 연락가능한 이메일이 부정확 합니다. 사이트 설정 에서 업데이트 해주세요." - title_nag: "사이트 이름을 설정하세요. 사이트 설정 에서 사이트 이름을 업데이트 해주세요." - site_description_missing: "검색 결과에 나올 한줄 설명을 적어주세요. 사이트 설정에서 site_description 업데이트하세요." - consumer_email_warning: "이메일 전송을 위해 Gmail(또는 다른 커스텀 이메일 서비스)을 사용하고 있습니다. Gmail의 이메일 전송 제한 을 읽어보세요. mandrill.com을 이메일 서비스로 설정하는 것을 고려해보세요." - site_contact_username_warning: "중요 자동 메세지를 보낼 스태프 사용자 계정의 이름을 적으세요. 사이트 설정에서 site_contact_username을 업데이트하세요." - notification_email_warning: "알람 메일이 올바른 이 사이트의 도메인 내 이메일 주소로 전송되지 않고 있습니다; 이메일 전송이 안정적이지 않을 것입니다. 사이트 설정에서 올바른 도메인의 이메일 주소로 정해주세요." site_settings: censored_words: "단어는 자동적으로 `■■■■` 로 대체 됩니다." delete_old_hidden_posts: "30일이 지난 숨겨진 글은 자동으로 삭제됩니다." @@ -612,7 +605,6 @@ ko: exclude_rel_nofollow_domains: "nofollow 도메인 리스트에 넣으면 링크에 추가가 안됩니다. tld.com은 자동으로 sub.tld.com도 포함합니다. 최소한, 이 사이트의 top-level 도메인은 허가해서 웹크롤러가 모든 자료를 검색할 수 있게 해야합니다. 다른 도메인으로도 이 사이트가 들어가진다면 그것도 추가해야 합니다." post_excerpt_maxlength: "글 인용에 허용되는 최대 글자수" post_onebox_maxlength: "onebox가 적용된 Discourse 글에 허용되는 최대 글자수" - onebox_domains_whitelist: "onebox 사용을 허가할 도메일 리스트; 이 도메인은 OpenGraph나 oEmbed를 지원하여야합니다. 테스트: http://iframely.com/debug" logo_url: "좌측 상단의 로고이미지는 직사각형 모양이어야 합니다. 설정하지 않을 경우 사이트 이름이 출력됩니다." apple_touch_icon_url: "애플 디바이스는 144px의 아이콘을 사용함. 144px X 144px 사이즈를 추천함" notification_email: "The from: 이 이메일 주소는 모든 기본 시스템 메일을 보내는데 사용됩니다. 여기에 명시된 도메인은 SPF, DKIM가 적용되어 있어야하며, reverse PTR 레코드가 제대로 설정되어 있어야 메일이 도착 할 수 있습니다." @@ -661,7 +653,6 @@ ko: redirect_users_to_top_page: "신규 사용자와 오랜만에 방문한 사용자를 인기글 페이지로 리다이렉트." show_email_on_profile: "사용자 프로필에서 자신의 이메일 주소 보기(본인과 관리자만 볼 수 있음)" email_token_valid_hours: "비밀번호 찾기, 계정 활성화에 사용되는 토큰의 유효 기간(시간)" - email_token_grace_period_hours: "비밀번호 찾기, 계정 활성화에 사용되는 토큰은 사용되어진 이후 유효한 기간(시간)" enable_badges: "배지 기능 사용" allow_index_in_robots_txt: "이 사이트가 검색엔진에 의해 인덱스되는 것을 허용합니다.(robots.txt 수정)" email_domains_blacklist: "가입 금지된 이메일 도메인 목록, 파이프 기호로 구분. 예: mailinator.com|trashmail.net" @@ -860,7 +851,6 @@ ko: embed_whitelist_selector: "embed에서 보여져야 할 DOM element 선택하는 CSS 셀렉터" embed_blacklist_selector: "embed에서 지워져야 할 DOM element 선택하는 CSS 셀렉터" notify_about_flags_after: "이 시간동안 처리되지 않은 신고가 들어와 있으면, contact_email 주소로 이메일을 보냅니다. 0으로 넣으면 비활성화됩니다." - enable_cdn_js_debugging: "/logs에서 적절한 모든 js를 포함해 crossorigin 권한 오류가 뜨도록 합니다." show_create_topics_notice: "이 사이트에 5개 이하의 공개 글타래가 있으면, 관리자에게 글타래 좀 만들라고 알려줍니다." delete_drafts_older_than_n_days: (n) 일지난 임시 보관글 삭제하기 prevent_anons_from_downloading_files: "익명 사용자가 다운로드를 받지 못하게 합니다. 경고: 이미지 파일 외 모든 첨부파일이 다운로드 받지 못하게 됩니다." @@ -1044,30 +1034,12 @@ ko: [사용자 정보 설정]: %{user_preferences_url} backup_succeeded: subject_template: "백업 성공" - text_body_template: "백업이 성공적으로 끝났습니다..\n[관리 > 백업](%{base_url}/admin/backups)에서 새 백업본을 다운로드 받으세요." backup_failed: subject_template: "백업에 실패했습니다." - text_body_template: | - 백업이 실패하였습니다. - - 로그: - - ``` - %{logs} - ``` restore_succeeded: subject_template: "복원 성공" - text_body_template: "복원에 성공했습니다." restore_failed: subject_template: "복원 실패" - text_body_template: | - 복구가 실패하였습니다. - - 로그: - - ``` - %{logs} - ``` bulk_invite_succeeded: subject_template: "대량 사용자 초대가 성공적으로 진행되었습니다." text_body_template: "대량 사용자 초대가 진행되어 %{sent}개의 초대장을 보냈습니다." @@ -1097,7 +1069,6 @@ ko: email_reject_empty: subject_template: "[%{site_name}] 이메일 문제 -- 내용 없음" email_reject_parsing: - subject_template: "[%{site_name}] 이메일 문제 -- 내용 인식 불가" text_body_template: | 죄송합니다, 이메일 메세지 %{destination} (titled %{former_title})가 안 됐습니다. @@ -1148,13 +1119,7 @@ ko: subject_template: "[%{site_name}] [PM] %{topic_title}" digest: why: "%{last_seen_at}부터 지금까지 %{site_link} 사이트 근황" - new_activity: "당신의 글타래과 글에 등록된 새로운 활동:" - top_topics: "인기 글" - other_new_topics: "인기 글타래" click_here: "클릭" - read_more: "더 읽기" - more_topics: "%{new_topics_since_seen}개의 글타래가 새로 올라왔어요." - more_topics_category: "더 많은 새글:" forgot_password: subject_template: "[%{site_name}] 패스워드 재설정" text_body_template: | @@ -1263,7 +1228,7 @@ ko: csv_export: boolean_yes: "네" boolean_no: "아니오" - static_topic_first_reply: | + static_topic_first_reply: |+ 이 글타래인 %{page_name} 페이지의 첫글 수정. guidelines_topic: @@ -1282,8 +1247,6 @@ ko: performance_report: initial_post_raw: 이 글타래는 웹사이트의 일일 성능 보고를 포함하고 있습니다. initial_topic_title: 웹사이트 성능 보고 - time: - <<: *datetime_formats activemodel: errors: <<: *errors diff --git a/config/locales/server.nb_NO.yml b/config/locales/server.nb_NO.yml index a8e3f9a89b9..b574de140f6 100644 --- a/config/locales/server.nb_NO.yml +++ b/config/locales/server.nb_NO.yml @@ -7,9 +7,22 @@ nb_NO: dates: - short_date_no_year: "D MMM" - short_date: "D MMM, YYYY" - long_date: "MMMM D, YYYY h:mma" + short_date_no_year: "D. MMM" + short_date: "D. MMM, YYYY" + long_date: "D. MMMM, YYYY h:mma" + datetime_formats: &datetime_formats + formats: + short: "%d-%m-%Y" + short_no_year: "%B %-d" + date_only: "%B %-d, %Y" + long: "%B %-d, %Y, %l:%M%P" + date: + month_names: [null, januar, februar, mars, april, mai, juni, juli, august, september, oktober, november, desember] + <<: *datetime_formats + time: + am: "am" + pm: "pm" + <<: *datetime_formats title: "Discourse" topics: "Emner" posts: "innlegg" @@ -18,6 +31,21 @@ nb_NO: log_in: "Logg inn" disable_remote_images_download_reason: "Nedlasting av bilder ble deaktivert grunnet mangel på tilgjengelig diskplass." anonymous: "Anonym" + emails: + incoming: + default_subject: "Innkommende e-post fra %{email}" + errors: + no_message_id_error: "Skjer når en e-post ikke har noen «Message-Id»-header." + auto_generated_email_error: "Skjer når «Precedence»-headeren er satt til list, junk, bulk eller auto_reply eller når en annen header innholder auto-submitted, auto-replied eller auto-generated." + no_body_detected_error: "Skjer når vi ikke kunne trekke ut meldingskroppen eller det ikke var noen vedlegg." + inactive_user_error: "Skjer når senderen ikke er aktiv." + blocked_user_error: "Skjer når avsenderen har blitt blokkert." + bad_destination_address: "Skjer når ingen av adressene i To-, Cc- eller Bcc-feltene passer med en konfigurert innkommende e-postadresse." + strangers_not_allowed_error: "Skjer når en bruker forsøket å opprette et nytt emne i en kategori som han eller hun ikke er medlem av." + insufficient_trust_level_error: "Skjer når en bruker forsøket å opprette et nytt emne i en kategori som han eller hun ikke har tillitsnivå for." + reply_user_not_matching_error: "Skjer når et innkommende svar kommer fra en annen e-postadresse enn varselet var sendt til." + topic_not_found_error: "Skjer når et svar blir mottatt, men det tilhørene emnet er slettet." + topic_closed_error: "Skjer når et svar blir mottatt, men det tilhørene emnet er stengt." errors: &errors format: '%{attribute} %{message}' messages: @@ -37,7 +65,7 @@ nb_NO: has_already_been_used: "har allerede blitt brukt" inclusion: er ikke inkludert i listen invalid: er ugyldig - is_invalid: "er ugyldig; prøv å være litt mer beskrivende" + is_invalid: "virker uklart, er det en komplett setning?" less_than: må være mindre enn %{count} less_than_or_equal_to: må være lik eller mindre enn %{count} not_a_number: er ikke et nummer @@ -66,8 +94,11 @@ nb_NO: load_from_remote: "Det oppstod et problem med innlastingen av innlegget." site_settings: min_username_length_range: "Du kan ikke sette minimum høyere enn maksimum." + max_username_length_range: "Du kan ikke sette maksimum under minimum." + default_categories_already_selected: "Du kan ikke velge en annen kategori brukt i en annen liste." bulk_invite: - file_should_be_csv: "Den opplastede filen må være i .csv eller .txt format." + file_should_be_csv: "Filen som lastes opp burde være i csv format." + error: "Det skjedde en feil når filen ble lastet opp. Prøv igjen senere. " backup: operation_already_running: "En prosess kjører allerede. Kan ikke starte en ny jobb akkurat nå." backup_file_should_be_tar_gz: "Backup-filen må være en .tar.gz arkiveringsfil." @@ -76,6 +107,7 @@ nb_NO: not_found: "Den etterspurte URL eller ressurs ble ikke funnet" invalid_access: "Du har ingen tilgang til denne resurssen." read_only_mode_enabled: "Siden er i skrivebeskyttet modus. Alle interaksjoner er utilgjengelige." + reading_time: "Lese tid" likes: "Likes" too_many_replies: one: "Vi beklager, men nye brukere er midlertidig begrenset til 1 svar i det samme emnet." @@ -83,6 +115,11 @@ nb_NO: embed: start_discussion: "Start Diskusjon" continue: "Fortsett Diskusjon" + error: "Feil ved innbygging" + referer: "Referer:" + mismatch: "Referer passet ikke med noen av de følgende vertsnavnene:" + no_hosts: "Vertsnavn for innbygging." + configure: "Sett opp innbygging" more_replies: one: "1 svar til" other: "%{count} svar til" @@ -93,12 +130,25 @@ nb_NO: replies: one: "1 svar" other: "%{count} svar" + no_mentions_allowed: "Beklager, du kan ikke nevne andre brukere." + too_many_mentions: + one: "Beklager, du kan bare nevne en bruker i et innlegg. " + other: "Beklager, du kan bare nevne %{count} brukere i et innlegg. " + no_mentions_allowed_newuser: "Beklager, nye brukere kan ikke nevne andre brukere." + no_images_allowed: "Beklager, nye brukere kan ikke legge til bilder i et innlegg." + too_many_images: + one: "Beklager, nye brukere kan bare legge til ett bilde i et innlegg." + other: "Beklager, nye brukere kan bare legge til %{count} bilder i et innlegg." + no_attachments_allowed: "Beklager, nye brukere kan ikke laste opp vedlegg til et innlegg." + too_many_attachments: + one: "Beklager, nye brukere kan bare laste opp ett vedlegg til et innlegg." + other: "Beklager, nye brukere kan bare laste opp %{count} vedlegg til et innlegg." + no_links_allowed: "Beklager, nye brukere kan ikke publisere innlegg med lenker." spamming_host: "Beklager, du kan ikke lenke til det domenet." user_is_suspended: "Utviste brukere kan ikke skrive innlegg." topic_not_found: "Noe gikk galt. Kanskje emnet har blitt lukket eller slettet samtidig som du har sett på det?" - just_posted_that: "er for likt det du nylig postet." + just_posted_that: "er for likt det du nylig publiserte." invalid_characters: "inneholder ugyldige tegn" - is_invalid: "er ugyldig; prøv å være litt mer beskrivende" next_page: "neste side →" prev_page: "← forrige side" page_num: "Side %{num}" @@ -114,7 +164,11 @@ nb_NO: rss_description: latest: "Siste emner" hot: "Populære emner" - posts: "Nyeste innnlegg" + top: "Mest Populære Emner" + posts: "Siste innlegg" + private_posts: "Siste private meldinger" + group_posts: "Siste innlegg fra %{group_name}" + tag: "Emner merket med stikkord" too_late_to_edit: "Det innlegget ble laget for lenge siden. Det kan ikke lenger bli redigert eller slettet." excerpt_image: "bilde" queue: @@ -137,25 +191,33 @@ nb_NO: one: "1 innlegg" other: "%{count} innlegg" new-topic: | - Velkommen til %{site_name} — **takk for at du startet et nytt innlegg!** + Velkommen til %{site_name}. **Takk for at du starter et nytt innlegg!** - - Høres tittelen på innlegget interessant ut hvis du leser det høyt? Er det en god oppsummering? + - Høres tittelen på innlegget interessant ut hvis du leser den høyt? Er den en god oppsummering? - - Hvem vil være interessert i dette? Hvorfor betyr det noe? Hva slags respons er du ute etter? + - Hvem vil være interessert i dette? Hvorfor har det noe å si? Hva slags respons er du ute etter? - - Bruk relevante begreper i emnet så andre kan *finne* det. Venligst velg en kategori for å gruppere emnet ditt med andre liknende emner. + - Bruk relevante begrep i emnet så andre kan *finne* det. Velg en kategori for å gruppere emnet ditt med andre lignende emner. - [Se våre retningslinjer](/guidelines) for mer informasjon. Denne meldingen vises kun for ditt første %{education_posts_text}. + [Se retningslinjene for dette nettstedet](/guidelines) for mer informasjon. Denne meldingen vises kun for ditt/dine første %{education_posts_text}. new-reply: | - Velkommen til %{site_name} — **takk for bidraget!** + Velkommen til %{site_name} — **takk for at du bidrar!** - Forbedrer innlegget ditt samtalen på noen måte? - - Vær snill med andre medlemmer + - Vær snill mot andre medlemmer. - - Konstruktiv kritikk ønskes velkommen, men husk å kritiser ideèr, ikke mennesker. + - Konstruktiv kritikk er velkommen, men husk å kritisere *idéer,* ikke mennesker. - For mer informasjon [see våre retningslinjer](/guidelines). Dette panelet vil kun vises for ditt første %{education_posts_text}. + For mer informasjon [se retningslinjene våre](/guidelines). Dette panelet vil kun vises for ditt/dine første %{education_posts_text}. + avatar: | + ### Hva med et bilde til kontoen din? + + Du har opprettet noen innlegg og svar, men profilbildet ditt er ikke så unikt som du er -- det er bare en bokstav. + + Har du tenkt på å **[gå til brukerprofilen din](%{profile_path})** og laste opp et bilde som representerer deg? + + Det er enklere å følge diskusjoner og finne interessante personer i samtaler når alle har et unikt profilbilde! sequential_replies: | ### Vurder å svare til flere innlegg på samme tid @@ -186,6 +248,8 @@ nb_NO: attributes: category: name: "Kategorinavn" + topic: + title: 'Tittel' post: raw: "Body" user_profile: @@ -211,20 +275,26 @@ nb_NO: attributes: hex: invalid: "er ikke en gyldig farge" + web_hook: + attributes: + payload_url: + invalid: "URL-adresse er ikke gyldig. Adressen skal starte med http:// eller https:// og ingen blanke tegn er tillatt." <<: *errors user_profile: no_info_me: "Nesten ferdig! Vi har sendt en e-post til %{email}. Vennligst trykk på lenken i e-posten for å aktivere kontoen din.
Hvis den ikke dukker opp, sjekk søppepostmappen din eller logg inn på nytt for å sende en ny-epost.
" + activate_email: "Nesten ferdig! Vi har sendt en e-post til %{email}. Vennligst trykk på lenken i e-posten for å aktivere kontoen din.
Hvis den ikke dukker opp, sjekk søppepostmappen din eller logg inn på nytt for å sende en ny-e-post.
" something_already_taken: "Noe gikk galt, kanskje brukernavn eller email er allerede i bruk? Prøv 'glemt passord' linken." omniauth_error_unknown: "Noe gikk galt under innloggingsprosessen, vennligst prøv igjen." password_too_long: "Passord er begrenset til 200 tegn." missing_user_field: "Du har ikke fylt ut alle brukerfeltene." + already_logged_in: "Oisann, ser ut som du prøver å akteptere en invitasjon for en en annen bruker. Hvis du ikke er %{current_user}, vennligst logg ut og prøv igjen." user: username: - short: "må være minst %{min} tegn" + short: "må være på minst %{min} tegn" long: "kan ikke være mer enn %{max} tegn" unique: "må være unik" blank: "Må være til stede" email: blocked: "er ikke tillatt." + ip_address: + blocked: "Nye registreringer er ikke tillatt fra IP-adressen din." + max_new_accounts_per_registration_ip: "Nye registreringer er ikke tillatt fra IP-adressen din (maksimalt antall nådd). Ta kontakt med et medlem av staben." flags_dispositions: agreed: "Takk for at du sier ifra. Vi er enig at det er et problem her og vi ser på saken." disagreed: "Takk for at du sier ifra. Vi skal se på det. " @@ -679,15 +799,34 @@ nb_NO: subject_template: "Velkommen til %{site_name}!" welcome_invite: subject_template: "Velkommen til %{site_name}!" + too_many_spam_flags: + subject_template: "Ny konto på vent" + too_many_tl3_flags: + subject_template: "Ny konto på vent" + unsubscribe_mailing_list: | + Du mottar dette fordi du har slått på e-postlistemodus. + + For å melde deg av disse e-postene [klikk her](%{unsubscribe_url}). user_notifications: digest: why: "Dette har skjedd på %{site_link} siden ditt forrige besøk %{last_seen_at}" - new_activity: "Ny aktivitet rundt dine emner og innlegg:" - top_topics: "Populære innlegg" - other_new_topics: "Populære emner" + new_topics: "Nye emner" + unread_notifications: "Uleste varslinger." + new_posts: "Nye innlegg" + new_users: "Nye brukere" + popular_topics: "Populære emner" + join_the_discussion: "Les mer" + more_new: "Nytt i emner og kategorier du følger" + subject_template: "[%{site_name}] Oppsummering" + unsubscribe: "Denne oppsummeringen blir sendt fra %{site_link} når vi ikke har sett deg på en stund. For å melde deg av %{unsubscribe_link}." click_here: "trykk her" - read_more: "Les Mer" - more_topics_category: "Flere nye emner:" + from: "%{site_name} oppsummering" + preheader: "En kort oppsummering siden ditt siste besøk på %{last_seen_at}" + mailing_list: + subject_template: "[%{site_name}] Oppsummering for %{date}" + unsubscribe: "Denne oppsummeringen sendes daglig fordi e-postlistemodus er aktivert. For å melde deg deg av %{unsubscribe_link}." + from: "%{site_name}-oppsummering" + new_topics: "Nye emner" account_created: subject_template: "[%{site_name}] Din Nye Konto" text_body_template: | @@ -695,6 +834,8 @@ nb_NO: Trykk på følgende link for å velge et passord for kontoen din: %{base_url}/users/password-reset/%{email_token} + confirm_new_email: + subject_template: "[%{site_name}] Bekreft e-postadressen din" signup: subject_template: "[%{site_name}] Bekreft din nye konto" text_body_template: | @@ -703,6 +844,7 @@ nb_NO: Trykk på denne lenken for å aktivere kontoen din: %{base_url}/users/activate-account/%{email_token} page_not_found: + title: "Oisann! Den siden finnes ikke eller er privat." recent_topics: "Nylig" see_more: "Mer" search_title: "Søk i denne siden" @@ -712,8 +854,8 @@ nb_NO: #[Velkommen til %{title}](#welcome) En bruker er påkrevd. Lag en bruker eller logg inn for å fortsette. terms_of_service: - title: "Betingelser" - signup_form_message: 'Jeg har lest og akseptert betingelsene.' + title: "Bruksvilkår" + signup_form_message: 'Jeg har lest og akseptert Bruksvilkårene.' deleted: 'slettet' upload: edit_reason: "Last ned lokal kopi av bilder" @@ -733,6 +875,241 @@ nb_NO: csv_export: boolean_yes: "Ja" boolean_no: "Nei" + guidelines_topic: + body: | + + + ## [Dette er et sivilisert sted for offentlig diskusjon](#sivilisert) + + Vær så snill og behandle denne diskusjonen med samme respekt du ville behandlet en offentlig park med. Også vi er en ressurs delt med fellesskapet – et sted hvor en kan dele ferdigheter, kunnskap og interesse gjennom en samtale som går sin gang. + + Dette er ikke definitive regler, bare hjelpemidler for fellesskapets menneskelige vurderingsevne. Bruk disse retningslinjene til å holde dette stedet rent og godt belyst for sivilisert offentlig samtale. + + + + ## [Forbedre diskusjonen](#forbedre) + + Hjelp oss å gjøre dette til et godt sted for diskusjon ved å alltid jobbe mot å gjøre diskusjonen bedre på en eller annen måte. Hvis du ikke er sikker på at innlegget ditt tilfører noe til diskusjonen, så tenk over hva det er du vil si og prøv igjen senere. + + Emnene som diskuteres her, betyr noe for oss, og vi vil at du skal oppføre deg som om de betyr noe for deg også. Vis respekt for dem og menneskene som diskuterer dem, selv om du er uenig med noe av det som blir sagt. + + En måte å forbedre diskusjonen på er å utforske dem som allerede foregår. Vær så snill og bruk litt tid til å streife gjennom emnene her før du svarer eller startet ditt eget, og du vil ha større sjanse for å møte noen som deler dine interesser. + + + + ## [Vær grei, også dersom du er uenig](#grei) + + Du ønsker kanskje å svare på noe du er uenig med. Det er greit. Men husk å _krisere idéer, ikke mennesker_. Vær så snill å unngå: + + * Utskjelling. + * Personangrep. + * Å svare på et innleggs tone i stedet for dets faktiske innhold + * Refleksartig motsigelse. + + Kom med begrunnede motargumenter i stedet som forbedrer samtalen. + + + + ## [Din deltakelse teller](#delta) + + Samtalene vi fører her, setter tonen for alle. Hjelp oss å påvirke fremtiden til dette fellesskapet ved å velge å ta del i diskusjoner som gjør dette forumet til et interessant sted å være – og ved å unngå dem som ikke gjør det. + + Discourse kommer med verktøy som gjør fellesskapeti stand til å sammen identifisere de beste (og dårligste) bidragene: favoritter, bokmerker, liker, rapportering, svar, redigering, osv. Bruk disse verktøyene til å forbedre din egen opplevelse, og alle andres. + + La oss prøve å forlate parken i bedre stand enn da vi kom. + + + + ## [Dersom du ser et problem, rapportér det](#rapporter-problemer) + + Moderatorer har en særmakt; de er ansvarlige for dette forumet. Men det er du også. Med din hjelp kan moderatorene være meglere, ikke bare vaktmestre eller politi. + + Når du ser dårlig oppførsel, ikke var. Det oppmuntrer den dårlige oppførselen ved å gi den oppmerksomhet, tærer på kreftene dine og kaster bort alles tid. _Bare rapportér den_. Dersom nok rapporteringer blir registrert, vil det bli handlet, enten automatisk eller ved at en moderator griper inn. + + For å opprettholde fellesskapet forbeholder moderatorene seg retten til å fjerne hvilket som helst innhold fra hvilken som helst bruker av hvilken som helst grunn når som helst. Moderatorer godkjenner ikke nye innlegg på noen som helst måte; moderatorene og sideoperatøren påtar seg intet ansvar for innhold publisert av fellesskapet. + + + + ## [Vær alltid sivilisert](#vaer-sivilisert) + + Ingenting saboterer en sunn samtale som frekkhet: + + * Vær sivilisert. Ikke publiser noe som et fornuftig menneske ville ansett som fornærmende, sårende eller hatefult. + * Hold det rent. Ikke publiser noe usømmelig eller pornografisk. + * Respektér hverandre. Ikke trakassér eller plag noen, utgi deg for å være for å være en annen eller prisgi andres fortrolighet. + * Respekt forumet vårt. Ikke publiser spam eller vandalisér forumet på annet vis. + + Dette er ikke håndfaste begrep med nøyaktige definisjoner – unngå til og med det som _ser ut_ til å være noe av disse tingene. Hvis du er usikker, spør deg selv hvordan det ville føles om innlegget ditt sto på forsiden av New York Times. + + Dette er et offentlig forum, og søkemotorer indekserer disse diskusjonene. Sørg for at språket, lenkene og bildene er trygt for familie og venner. + + + + ## [Hold det ryddig](#hold-det-ryddig) + + Anstreng deg for å sette ting på riktig plass slik at vi bruke mer tid på å diskutere og mindre på å rydde opp. Derfor: + + * Ikke start et emne i gal kategori. + * Ikke publiser samme ting i flere kategorier. + * Ikke publiser svar uten innhold. + * Ikke avled et emne ved å endre det midt i diskusjonen. + * Ikke signér innleggene dine – hvert innlegg har profilinformasjonen din tilknyttet. + + I stedet for å publisere «+1» eller «Enig» bruk liker-knappen. I stedet for å ta et eksisterende emne i en radikalt annerledes retning, bruk Svar med lenket emne. + + + + ## [Publisér dine egne ting](#tyveri) + + Du har ikke lov publisere noe digitalt som tilhører en annen, uten tillatelse. Du har ikke lov til å publisere beskrivelser av, lenker til eller metoder for å stjele andres åndsverk (programvare, film, lyd, bilde), eller for å bryte andre lover. + + + + ## [Drevet av deg](#drevet-av) + + Denne siden drives av ditt [vennlige personell](/about) og *deg*, en del av felleskapet. Dersom du har noen flere spørsmål om hvordan ting skal fungere her, opprett et nytt emne i [kategorien for tilbakemeldinger](/c/site-feedback) og la oss diskutere! Hvis det er et kritisk eller akutt problem som ikke kan bli håndtert med et meta-emne eller en rapportering, ta kontakt med oss via [personell-siden](/about). + + + + ## [Vilkår](#vilkaar) + + Ja, juridisk fagspråk er kjedelig, men vi må beskytte oss selv – og i utvidet betydning deg og dine data – mot uvennlige mennesker. Vi har [Vilkår](/tos) som beskriver din (og vår) oppførsel og rettigheter med tanke på innhold, personvern og lover. For å bruke denne tjenesten må du samtykke å overholde våre [Vilkår](/tos). + tos_topic: + title: "Bruksvilkår" + privacy_topic: + title: "Personvernerklæring" + body: | + + + ## [Hvilke opplysninger samler vi?](#samle) + + Vi samler opplysninger fra deg når du registrerer deg på nettstedet vårt, og vi samler data når du deltar på forumet ved å lese, skrive og evaluere innholdet som deles her. + + Når du registrerer deg på nettstedet vårt, kan du bli bedt om å oppgi navnet og e-postadressen din. Imidlertid kan du besøke nettstedet vårt uten å registrere deg. E-postadressen din vil bli bekreftet med en e-post som inneholder en unik lenke. Hvis siden den lenker til, blir besøkt, vet vi at du har kontroll over e-postadressen. + + Når du registrerer deg og skriver innlegg, registrerer vi IP-adressen som innlegget stammer fra. Vi kan også oppbevare logger som inkluderer IP-adressen til alle forespørslene sendt til tjeneren vår. + + + + ## [Hva bruker vi opplysningene dine til?](#bruk) + + Alle opplysningene vi samler fra deg, kan bli brukt på en av følgende måter: + + * For å gjøre opplevelsen din mer personlig. Opplysningene dine hjelper oss å svare bedre på dine individuelle behov. + * For å forbedre nettstedet vårt. Vi jobber konstant for å forbedre nettstedets tilbud basert på opplysningene og tilbakemeldingene vi mottar fra deg. + * For å forbedre vår kundeservice. Dine opplysninger hjelper oss å svare mer effektivt på dine forespørsler sendt til kundeservice eller behov om støtte. + * For å sende periodiske e-poster. E-postadressen du oppgir, kan bli brukt til å sende deg informasjon, påminnelser som du ber om ved endringer av emner eller ved svar til brukernavnet ditt, til henvendelser, og/eller andre forspørsler eller andre spørsmål. + + + + ## [Hvordan sikrer vi opplysningene?](#sikre) + + Vi gjennomfører flere sikkerhetstiltak for å holde personopplysningene dine sikre når du skriver inn, lagrer eller henter dem. + + + + ## [Hva er retningslinjene deres for lagring av data?](#datalagring) + + Vi vil forsøke i god tro å: + + * Ikke oppbevare tjener-logger som inneholder IP-adressen til alle forspørslene til denne tjeneren ikke lenger enn i 90 dager. + * Ikke oppbevare IP-adressene forbundet med registrerte brukere og deres innlegg lenger enn i 5 år. + + + + ## [Bruker vi informasjonskapsler?](#informasjonskapsler) + + Ja. Informasjonskapsler er små filer som et nettsted eller dets tjenesteleverandør overfører til harddisken på datamaskinen din gjennom nettleseren din (dersom du tillater det). Disse informasjonskapslene gjør det mulig for nettstedet å gjenkjenne nettleseren din og, dersom du har en konto, knytte nettleseren til den. + + Vi bruker informasjonskapsler for å forstå og lagre preferansene dine for fremtidige besøk og for å samle aggregatdata om trafikk på og samhandling med nettstedet slik at vi kan tilby bedre opplevelser og verktøy på nettstedet i fremtiden. Vi kan inngå avtaler med tredjeparts tjenesteleverandører for å bistå oss i å forstå besøkerne våres bedre. Disse tjenesteleverandørene har ikke lov til å bruke opplysningene samlet på våres vegne unntatt til å hjelpe oss å gjennomføre og forbedre anliggendet vårt. + + + + ## [Gir vi noen opplysninger videre til andre parter?](#gi-videre) + + Vi verken selger, handler med eller overfører på noen annen måte til andre parter dine identifiserbare personopplysninger. Dette inkluderer ikke tredjeparter som har vår tillit og bistår oss i å drive nettstedet, utføre våre anliggender eller yter tjenester til deg, så lenge disse partene samtykker til å behandle disse opplysningene fortrolig. Vi kan også frigi opplysningene dine dersom vi tror at å frigi dem er hensiktsmessig for å overholde loven, håndheve nettstedet retningslinjer eller beskytte våre og andres rettigheter. Imidlertid kan opplysninger som ikke er personlig identifiserbare, bli delt med andre parter for marketsføring, reklame eller annet bruk. + + + + ## [Tredjeparts lenker](#tredjepart) + + Av og til, etter skjønn, kan vil inkludere eller tilby tredjeparts produkter eller tjenester på nettstedet vårt. Disse tredjeparts nettstedene har separate og selvstendige personvernerklæringer. Vi bærer derfor intet ansvar eller forpliktelser for innholdet eller aktivitetene til disse nettstedene det lenkes til. Ikke mindre prøver vi å bevare vår eget nettsteds integritet og ønsker enhver tilbakemelding om disse nettstedene velkomne. + + + + ## [Overensstemmelse med Children's Online Privacy Protection Act](#coppa) + + Nettstedet, produktene og tjenestene våre er rettet mot folk som er minst 13 år gamle. Dersom denne tjeneren er i USA, og du er under 13 år i henhold til kravene i COPPA ([Children's Online Privacy Protection Act](https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act)), ikke bruk dette nettstedet. + + + + ## [Personvernerklæring bare for nettet](#nett) + + Denne nett-personvernerklæringen gjelder bare for informasjon samlet gjennom nettstedet vårt og ikke for opplysninger samlet når en er frakoblet. + + + + ## [Ditt samtykke](#samtykke) + + Vet å bruke nettstedet vårt samtykker du til nettstedets personvernerklæring. + + + + ## [Changes to our Privacy Policy](#endringer) + + Dersom vi beslutter å endre personvernerklæringen vår, vil vi publisere disse endringene på denne siden. + + Dette dokumentet er lisensiert under CC-BY-SA. De ble sist oppdatert 31. mai 2013. + badges: + first_onebox: + long_description: Dette merket tildeles den første gangen du publiserer et innlegg med en lenke på en egen linje, som deretter automatisk blir utvidet til en miniboks med en kort oppsummering av lenken, en tittel og (dersom tilgjengelig) et bilde. + finish_installation: + confirm_email: + title: "Bekreft din e-postadresse" + resend_email: + title: "Send aktivterings-epost på nytt" + message: "Vi har sendt aktiverings-eposten på nytt til %{email}" + safe_mode: + title: "Start sikkerhetsmodus" + description: "Sikkerhetsmodus lar deg teste nettstedet ditt uten at tillegg eller tilpasninger lastes." + wizard: + step: + contact: + fields: + contact_email: + label: "E-post" + placeholder: "navn@example.com" + corporate: + description: "Disse navnene vil bli satt inn i din Personvernerklæring og dine Bruksvilkår, som du kan endre når som helst i stab-kategorien. Hvis du ikke har et firma, kan du gjerne hoppe over dette steget." + logos: + title: "Logoer" + fields: + logo_url: + label: "Primær logo" + description: "Logoen som vises oppe til venstre på nettstedet. Bruk et bilde med en bred rektangelform." + logo_small_url: + label: "Kompakt logo" + description: "En kompakt versjon av logoen. Vises oppe til venstre npr du blar nedover. Bruk et bilde med kvadratisk form." + icons: + title: "Ikoner" + fields: + favicon_url: + label: "Lite ikon" + description: "Et ikon som representerer nettstedet ditt i nettlesere. Bør se bra ut i så liten størrelse som 32 ganger 32 piksler." + apple_touch_icon_url: + label: "Stort ikon" + description: "Et ikon som representerer nettstedet ditt på moderne enheter og ser bra ut i større størrelser. Anbefalt størrelse er minst 144 ganger 144 piksler." + homepage: + title: "Hjemmeside" + fields: + homepage_style: + choices: + latest: + label: "Siste emner" + categories: + label: "Kategorier" + emoji: + title: "Emoji" activemodel: errors: <<: *errors diff --git a/config/locales/server.nl.yml b/config/locales/server.nl.yml index 86e46dce699..cfefb9cfda3 100644 --- a/config/locales/server.nl.yml +++ b/config/locales/server.nl.yml @@ -34,12 +34,12 @@ nl: anonymous: "Anoniem" emails: incoming: - default_subject: "Inkomende email van %{email}" + default_subject: "Inkomende e-mail van %{email}" show_trimmed_content: "Toon getrimde inhoud" maximum_staged_user_per_email_reached: "Het maximum aantal staged gebruikers dat per e-mail kan worden aangemaakt is bereikt." errors: - empty_email_error: "Gebeurt wanneer de mail die wij ontvangen hebben leeg is." - no_message_id_error: "Gebeurt wanneer de mail geen 'Message-Id' header heeft." + empty_email_error: "Gebeurt wanneer de e-mail die wij ontvangen hebben leeg is." + no_message_id_error: "Gebeurt wanneer de e-mail geen 'Message-Id' header heeft." auto_generated_email_error: "Gebeurt wanneer de 'voorrang' header is ingesteld op: lijst, ongewenst, bulk of auto_reply, of wanneer een andere header het volgende bevat: auto-submitted, auto-replied of auto-generated." no_body_detected_error: "Gebeurt wanneer er geen body uit de mail gehaald kan worden, en er geen bijlagen gevonden worden." inactive_user_error: "Gebeurt wanneer de afzender niet actief is." @@ -71,7 +71,7 @@ nl: has_already_been_used: "is al gebruikt" inclusion: komt niet voor in de lijst invalid: is ongeldig - is_invalid: "is ongeldig; probeer een betere omschrijving" + is_invalid: "lijkt onduidelijk, is het een volledige zin?" less_than: moet minder zijn dan %{count} less_than_or_equal_to: moet minder zijn dan of gelijk zijn aan %{count} not_a_number: is niet een getal @@ -106,11 +106,13 @@ nl: default_categories_already_selected: "Je kan geen categorie selecteren die wordt gebruikt in een andere lijst." s3_upload_bucket_is_required: "U kunt niet de uploads van de S3 toestaan totdat u de 's3_upload_bucket' hebt verleend." bulk_invite: - file_should_be_csv: "Het bestand moet in csv- of txt-formaat zijn." + file_should_be_csv: "Het geüploade bestand moet in csv-formaat zijn." + error: "Er trad een fout op tijdens het uploaden van dat bestand. Probeer het later nog eens." backup: operation_already_running: "Er wordt al een opdracht uitgevoerd. Kan nu niet een nieuwe opdracht starten." backup_file_should_be_tar_gz: "Het backupbestand moet een .tar.gz archief zijn." not_enough_space_on_disk: "Er is niet voldoende ruimte op de schijf vrij om deze backup te uploaden." + invalid_filename: "De naam van het backup-bestand bevat ongeldige tekens. Geldige tekens zijn a-z 0-9 . - _." not_logged_in: "Om dat te kunnen doen moet je ingelogd zijn." not_found: "De opgevraagde URL of resource kan niet gevonden worden." invalid_access: "Je hebt geen permissie om de opgevraagde resource te bekijken." @@ -158,7 +160,7 @@ nl: topic_not_found: "Er is iets fout gegaan. Wellicht is het topic gesloten of verwijderd terwijl je er naar keek?" just_posted_that: "lijkt teveel op het bericht dat je net geschreven hebt" invalid_characters: "bevat ongeldige tekens" - is_invalid: "is niet geldig; probeer het iets beter te omschrijven" + is_invalid: "lijkt onduidelijk, is het een volledige zin?" next_page: "volgende pagina →" prev_page: "← vorige pagina" page_num: "Pagina %{num}" @@ -269,6 +271,7 @@ nl: name: "Naam categorie" topic: title: 'Titel' + featured_link: 'Uitgelichte link' post: raw: "Inhoud" user_profile: @@ -282,18 +285,29 @@ nl: too_many_users: "Je kunt een waarschuwing per keer slechts naar één ander lid sturen." cant_send_pm: "Sorry, je kan geen privébericht sturen naar deze persoon." no_user_selected: "Je moet een geldige gebruiker selecteren." + featured_link: + invalid: "is ongeldig. URL moet http:// of https:// bevatten." + invalid_category: "kan niet worden gewijzigd in deze categorie." user: attributes: password: common: "is een van de 10000 meest gebruikte wachtwoorden. Gebruik een veiliger wachtwoord." same_as_username: "is hetzelfde als je gebruikersnaam. Gebruik een veiliger wachtwoord." - same_as_email: "is hetzelfde als je email. Gebruik een veiliger wachtwoord." + same_as_email: "is hetzelfde als je e-mailadres. Gebruik een veiliger wachtwoord." + same_as_current: "is hetzelfde als je huidige wachtwoord." ip_address: signup_not_allowed: "Inschrijven vanaf dit account is niet toegestaan." color_scheme_color: attributes: hex: invalid: "is niet een geldige kleur" + post_reply: + base: + different_topic: "Het bericht en antwoord moeten bij hetzelfde topic horen." + web_hook: + attributes: + payload_url: + invalid: "De URL is ongeldig. URL's moeten http:// of https:// bevatten. En een leeg veld is niet toegestaan." <<: *errors user_profile: no_info_me: "
Als je deze instellingen ooit aan wilt passen, bezoek dan je beheerafdeling; vind het naast het moersleutelicoon in het sitemenu.
+Veel plezier, en succes met het opbouwen van je nieuwe gemeenschap!
activemodel: errors: <<: *errors diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml index 7425a5843a4..d6344f2e514 100644 --- a/config/locales/server.pl_PL.yml +++ b/config/locales/server.pl_PL.yml @@ -15,23 +15,33 @@ pl_PL: short: "%d.%m.%Y" short_no_year: "%-d %B" date_only: "%-d %b %Y" + long: "%B %-d, %Y, %l:%M%P" date: month_names: [null, Styczeń, Luty, Marzec, Kwiecień, Maj, Czerwiec, Lipiec, Sierpień, Wrzesień, Październik, Listopad, Grudzień] <<: *datetime_formats + time: + am: "rano" + pm: "po południu" + <<: *datetime_formats title: "Discourse" topics: "Tematy" posts: "wpisy" loading: "Ładowanie" powered_by_html: 'Zasilane przez Discourse, najlepiej oglądać z włączonym JavaScriptem' log_in: "Logowanie" + purge_reason: "Automatycznie usunięte jako porzucone, dezaktywowane konto." disable_remote_images_download_reason: "Pobieranie zewnętrznych grafik zostało wyłączone z uwagi na niską ilość wolnego miejsca na dysku." anonymous: "Anonim" emails: incoming: default_subject: "Przychodzący email od %{email}" show_trimmed_content: "Pokaż skróconą zawartość" + maximum_staged_user_per_email_reached: "Osiągnięto maksymalną ilość użytkowników zarejestrowanych przez email." errors: + empty_email_error: "Zdarza się kiedy mail jaki dostaliśmy jest pusty." no_message_id_error: "Zdarza się kiedy email nie posiada nagłówka 'Message-Id'." + inactive_user_error: "Zdarza się kiedy nadawca jest nie aktywny." + blocked_user_error: "Zdarza się kiedy nadawca jest zablokowany." errors: &errors format: '%{attribute} %{message}' messages: @@ -48,6 +58,7 @@ pl_PL: exclusion: jest zarezerwowane greater_than: musi być większe niż %{count} greater_than_or_equal_to: musi być większe lub równe %{count} + has_already_been_used: "został już użyty" inclusion: nie jest zawarty w liście invalid: jest nieprawidłowy less_than: musi być mniejszy niż %{count} @@ -88,15 +99,19 @@ pl_PL: default_categories_already_selected: "Nie możesz wybrać kategorii użytej w innej liście." s3_upload_bucket_is_required: "Nie możesz wysyłać na S3 jeżeli nie podasz 's3_upload_bucket'." bulk_invite: - file_should_be_csv: "Wysłany plik powinien być w formacie CSV lub TXT." + file_should_be_csv: "Wgrywany plik powinien być formatu csv." + error: "Wystąpił błąd podczas wgrywania tego pliku. Spróbuj ponownie później." backup: operation_already_running: "Operacja jest już uruchomiona. Nie można teraz utworzyć nowej." backup_file_should_be_tar_gz: "Plik z kopią zapasową powinien mieć postać archiwum .tar.gz." not_enough_space_on_disk: "Nie ma wystarczającej ilości wolnego miejsca, aby wczytać tę kopię zapasową." + invalid_filename: "Plik kopii zapasowej zawiera nieprawidłowe znaki. Nieprawidłowe znaki to a-z 0-9 . - _." not_logged_in: "Aby to zrobić musisz się zalogować." not_found: "Żądany URL lub źródło nie mógł zostać znaleziony." invalid_access: "Nie jesteś uprawniony, by zobaczyć żądane źródło." read_only_mode_enabled: "Strona jest w trybie tylko do odczytu. Możliwość interakcji jest wyłączona." + reading_time: "Czas odczytu" + likes: "Lajki" too_many_replies: one: "Przepraszamy, ale nowi użytkownicy są tymczasowo ograniczeni do 1 odpowiedzi w ramach jednego tematu." few: "Przepraszamy, ale nowi użytkownicy są tymczasowo ograniczeni do %{count} odpowiedzi w ramach jednego tematu." @@ -116,12 +131,16 @@ pl_PL: one: "1 odpowiedź" few: "%{count} odpowiedzi" other: "%{count} odpowiedzi" + no_mentions_allowed: "Przepraszamy, nie możesz odwoływać się do innych użytkowników." + no_mentions_allowed_newuser: "Przepraszamy, nowi użytkownicy nie mogą odwoływać się do innych użytkowników." + no_images_allowed: "Przepraszamy, nowi użytkownicy nie mogą dodawać zdjęć do postów." + no_attachments_allowed: "Przepraszamy, nowi użytkownicy nie mogą dodawać załączników do postów." + no_links_allowed: "Przepraszamy, nowi użytkownicy nie mogą umieszczać linków w wiadomościach." spamming_host: "Przepraszamy, nie możesz umieścić linka do tej strony." user_is_suspended: "Zawieszeni użytkownicy nie mogą wysyłać wiadomości." topic_not_found: "Coś poszło nie tak. Być może temat został zamknięty lub usunięty w międzyczasie?" just_posted_that: "jest zbyt podobne do tego co umieściłeś niedawno" invalid_characters: "zawiera niepoprawne znaki" - is_invalid: "jest niewystarczająca – spróbuj ją rozwinąć" next_page: "następna strona →" prev_page: "← poprzednia strona" page_num: "Strona %{num}" @@ -137,17 +156,29 @@ pl_PL: rss_description: latest: "Ostatnie wątki" hot: "Popularne wątki" + top: "Najlepsze tematy" posts: "Aktualne wpisy" + private_posts: "Najnowsze prywatne wiadomości" + group_posts: "Ostatni post z %{group_name}" + user_posts: "Ostatnie posty @%{username}" + user_topics: "Ostatnie tematy @%{username}" + tag: "Oznaczone tematy" too_late_to_edit: "Ten wpis został utworzony zbyt dawno. Nie może być edytowany ani usunięty." + revert_version_same: "Obecna wersja jest taka sama jak w wersja, którą próbujesz przywrócić." excerpt_image: "zdjęcie" queue: delete_reason: "Skasowany z poziomu kolejki moderacji." groups: errors: + can_not_modify_automatic: "Nie można modyfikować automatyczną grupę" member_already_exist: "'%{username}' należy już do tej grupy." + invalid_domain: "'%{domain}' nie jest poprawną domeną." + invalid_incoming_email: "'%{domain}' nie jest poprawną domeną." + email_already_used_in_group: "'%{email}' jest już używany przez grupę '%{group_name}'." + email_already_used_in_category: "'%{email}' jest już używany przez kategorię '%{category_name}'." default_names: everyone: "wszyscy" - admins: "admini" + admins: "administratorzy" moderators: "moderatorzy" staff: "zespół" trust_level_0: "poziom_zaufania_0" @@ -160,7 +191,7 @@ pl_PL: one: "1 wpis" few: "%{count} wpisy" other: "%{count} wpisów" - new-topic: | + new-topic: |+ Witaj na %{site_name} — **dziękujemy za rozpoczęcie nowej dyskusji!** - Czy tytuł brzmi interesująco, gdy przeczytasz go na głos? Czy jest dobrym podsumowaniem treści? @@ -219,6 +250,9 @@ pl_PL: attributes: category: name: "Nazwa kategorii" + topic: + title: 'Tytuł' + featured_link: 'Polecany link' post: raw: "Treść" user_profile: @@ -232,18 +266,29 @@ pl_PL: too_many_users: "Jedno ostrzeżenie możesz wysłać tylko do pojedynczego użytkownika." cant_send_pm: "Przepraszamy, niestety nie możesz wysłać prywatnej wiadomości temu użytkownikowi." no_user_selected: "Musisz wybrać poprawnego użytkownika," + featured_link: + invalid: "Link jest nieprawidłowy, powinien zawierać http:// lub https://." + invalid_category: "nie może być edytowany w tej kategorii." user: attributes: password: common: "jest jednym z 10000 najczęściej używanych haseł. Wybierz inne, bardziej bezpieczne hasło." same_as_username: "jest takie same jak Twoja nazwa użytkownika. Proszę użyj bardziej bezpiecznego hasła. " same_as_email: "jest takie same jak Twój email. Proszę użyj bardziej bezpiecznego hasła. " + same_as_current: "Hasło jest takie same jak aktualne." ip_address: signup_not_allowed: "Rejestracja z tego konta jest niemożliwa." color_scheme_color: attributes: hex: invalid: "nie jest poprawnym kolorem" + post_reply: + base: + different_topic: "Wpis i odpowiedź muszą należeć do tego samego tematu." + web_hook: + attributes: + payload_url: + invalid: "Link jest nieprawidłowy, powinien zawierać http:// lub https://. Puste pole jest niedozwolone." <<: *errors user_profile: no_info_me: "Enviámos um email de ativação para %{email}. Por favor siga as instruções no email para ativar a sua conta.
Se não receber o email, verifique que configurou correctamente o email no Discourse e verifique a sua pasta de spam.
" + resend_email: + title: "Reenviar Email de Ativação" + message: "Reenviamos o email de ativação para %{email}" + safe_mode: + title: "Entrar em modo de segurança" + description: "O modo de segurança permite-lhe testar o seu sítio sem carregar plugins ou alterações." + no_customizations: "Desativar todas as alterações do sítio" + only_official: "Desativar plugins não-oficiais" + no_plugins: "Desativar todos os plugins" + enter: "Entrar em Modo de Segurança" + wizard: + title: "Configuração do Discourse" + step: + locale: + title: "Bem-vindo ao seu Discourse!" + fields: + default_locale: + description: "Qual é a linguagem por defeito para a sua comunidade?" + forum_title: + title: "Nome" + description: "O nome é um sinal visível à distância, a primeira coisa que potenciais visitantes verão sobre a sua comunidade. O que é o que seu nome e título dizem sobre a sua comunidade?" + fields: + title: + label: "O nome da sua comunidade" + placeholder: "Reduto da Joana" + site_description: + label: "Descreva a sua comunidade numa frase curta" + placeholder: "Um lugar para a Jona e os seus amigos falarem de coisas giras" + introduction: + title: "Introdução" + fields: + welcome: + label: "Tópico de Boas-vindas" + description: "
Como é que descreveria a sua comunidade a um estranho num elevador em cerca de 1 minuto?
O tópico de boas-vindas é a primeira coisa que visitantes verão. Pense nele como num discurso curto ou introdução de um paragrafo.
" + one_paragraph: "Por favor limite a sua mensagem de boas-vindas a um paragrafo." + privacy: + title: "Acesso" + description: "A sua comunidade é aberta a todos, ou é restrita por inscrição, convite ou aprovação? Se preferir, pode configurar o sítio em privado, e depois torná-lo público.
Lembre-se que pode sempre mandar convites a partir de um tópico, ou da sua página de utilizador também.
" + fields: + privacy: + choices: + open: + label: "Público" + description: "Qualquer pessoa pode aceder a esta comunidade e inscrever-se para a criação de uma conta" + restricted: + label: "Privado" + description: "Apenas pessoas que convidei ou aprovei podem aceder a esta comunidade" + contact: + title: "Contacte-nos" + fields: + contact_email: + label: "Email" + placeholder: "name@example.com" + description: "Endereço de email da pessoa ou grupo responsáveis por esta comunidade. Usado para notificações críticas tais como denúncias não tratadas, actualizações de segurança, assim como na sua página de descrição para comunicações urgentes com a comunidade." + contact_url: + label: "Página da Internet" + placeholder: "http://www.example.com/contact-us" + description: "Página da internet com informação geral sobre si ou a sua organização. Será mostrada na sua página de descrição." + site_contact: + label: "Mensagens Automatizadas" + description: "Todas as mensagens pessoais automatizadas do Discourse serão enviadas deste utilizador. Acima de tudo, este utilizador será o remetente de todas as mensagens de boas-vindas automaticamente enviadas a novos utilizadores." + corporate: + title: "Organização" + description: "Estes nomes serão introduzidos na sua Política de Privacidade, que pode editar a qualquer instante na categoria da Equipa de Apoio. Se não tiver uma empresa, sinta-se à vontade para saltar este passo." + fields: + company_short_name: + label: "Nome da Empresa (curto)" + placeholder: "Initech" + company_full_name: + label: "Nome da Empresa (Completo)" + placeholder: "Initech, Inc." + company_domain: + label: "Nome do Domínio da Empresa" + placeholder: "initech.com" + colors: + title: "Tema" + fields: + theme_id: + description: "Prefere um tema claro ou escuro para começar? Pode sempre personalizar a aparência do seu sítio via Administração, Personalizar." + choices: + default: + label: "Claro Simples" + dark: + label: "Escuro Simples" + logos: + title: "Logos" + fields: + logo_url: + label: "Logo Primário" + description: "A imagem do logótipo no canto superior esquerdo do seu sítio. Use uma forma rectangular larga." + logo_small_url: + label: "Logo Compacto" + description: "Uma versão compacta do seu logo, mostrada no canto superior esquerdo, visível quando arrastado para baixo. Use uma forma quadrada." + icons: + title: "Ícones" + fields: + favicon_url: + label: "Ícone Pequeno" + description: "Imagem do ícone usado para representar o seu sítio em navegadores da internet que têm bom aspecto em tamanhos pequenos como 32px por 32px." + apple_touch_icon_url: + label: "Ícone Grande" + description: "Imagem do ícone usado para representar o seu sítio em navegadores da internet que têm bom aspecto em tamanhos grandes como 144px por 144px." + homepage: + description: "Recomendamos que mostre tópicos recentes na sua página de início, mas pode escolher mostrar categorias (grupos de tópicos) na sua página de início se preferir." + title: "Página de início" + fields: + homepage_style: + choices: + latest: + label: "Tópicos recentes" + categories: + label: "Categorias" + emoji: + title: "Emoji" + description: "Que estilo de Emoji prefere para a sua comunidade? Pode sempre adicionar mais Emoji personalizados via Administração, Personalizar, Emoji." + invites: + title: "Convidar Equipa de Apoio" + description: "Está quase completo! Vamos convidar algumas pessoas para a equipa de apoio para ajudar a disseminar as suas conversas com tópicos e respostas interessantes para que a sua comunidade ganhe tração." + finished: + title: "O seu Discourse está Pronto!" + description: | +Se alguma vez quiser mudar estas configurações, visite a sua secção de administração; encontre-a junto ao ícone de chave inglesa no menu do sítio.
+Divirta-se, e boa sorte para a construção da sua comunidade!
activemodel: errors: <<: *errors diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml index 43a6269c8a5..00a5249899a 100644 --- a/config/locales/server.pt_BR.yml +++ b/config/locales/server.pt_BR.yml @@ -8,13 +8,14 @@ pt_BR: dates: short_date_no_year: "D MMM" - short_date: "D MMM, YYYY" + short_date: "D MMM, AAAA" long_date: "D de MMMM de YYYY h:mma" datetime_formats: &datetime_formats formats: short: "%d/%m/%Y" short_no_year: "%B %-d" date_only: "%b %-d, %Y" + long: "%B %-d, %Y, %l:%M%P" date: month_names: [null, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro] <<: *datetime_formats @@ -24,7 +25,7 @@ pt_BR: <<: *datetime_formats title: "Discourse" topics: "Tópicos" - posts: "postagens" + posts: "mensagens" loading: "Carregando" powered_by_html: 'Movido a Discourse, melhor visualizado com JavaScript ativado' log_in: "Entrar" @@ -49,6 +50,8 @@ pt_BR: reply_user_not_matching_error: "Ocorre quando uma resposta chega em um endereço de email diferente ao da notificação enviada." topic_not_found_error: "Ocorre quando uma resposta foi enviada mas o tópico relacionado foi excluído." topic_closed_error: "Ocorre quando uma resposta foi enviada mas o tópico relacionado foi fechado." + bounced_email_error: "O email é um relatório de email devolvido." + screened_email_error: "Acontece quando o endereço de email do remetente já foi examinado." errors: &errors format: '%{attribute} %{message}' messages: @@ -68,7 +71,7 @@ pt_BR: has_already_been_used: "já está sendo usado" inclusion: não está incluído na lista invalid: é inválido - is_invalid: "é inválido; tente ser um pouco mais descritivo" + is_invalid: "parece pouco claro; é uma frase completa?" less_than: precisa ser menor que %{count} less_than_or_equal_to: deve ser menor ou igual à %{count} not_a_number: não é um número @@ -102,12 +105,11 @@ pt_BR: max_username_length_range: "Você não pode definir o máximo abaixo no mínimo." default_categories_already_selected: "Você não pode selecionar uma categoria usada noutra lista." s3_upload_bucket_is_required: "Você não pode habilitar uploads para o S3 a não ser que tenha provido o 's3_upload_bucket'." - bulk_invite: - file_should_be_csv: "O arquivo enviado deve ser do formado csv ou txt." backup: operation_already_running: "Uma operação está sendo executada. Não é possível iniciar um novo trabalho agora." backup_file_should_be_tar_gz: "O arquivo de backup deve ser um arquivo .tar.gz." not_enough_space_on_disk: "Não há espaço suficiente no disco para carregar este backup." + invalid_filename: "O nome do arquivo de backup contém caracteres inválidos. Os caracteres válidos são a-z 0-9 . - _." not_logged_in: "Você precisa estar conectado para fazer isso." not_found: "A URL ou recurso solicitado não pôde ser encontrado." invalid_access: "Você não tem permissão para ver o recurso solicitado." @@ -125,7 +127,7 @@ pt_BR: other: "%{count} respostas a mais" loading: "Carregando Discussão..." permalink: "Permalink" - imported_from: "Este é um tópico de discussão companheiro para a postagem original em %{link}" + imported_from: "Este é um tópico de discussão companheiro para a mensagem original em %{link}" in_reply_to: "▶ %{username}" replies: one: "1 resposta" @@ -133,19 +135,19 @@ pt_BR: no_mentions_allowed: "Desculpe, você não pode mencionar outros usuários." too_many_mentions: one: "Desculpe, você pode mencionar apenas %{count} usuário em um post." - other: "Desculpe, você pode mencionar apenas %{count} usuários em um post." + other: "Desculpe, você pode mencionar apenas %{count} usuários em uma mensagem." no_mentions_allowed_newuser: "Desculpe, usuários novos não podem mencionar outros usuários." too_many_mentions_newuser: - one: "Desculpe, usuários novos podem mencionar apenas %{count} usuário em uma postagem." - other: "Desculpe, usuários novos podem mencionar apenas %{count} usuários em uma postagem." - no_images_allowed: "Desculpe, usuários novos não podem colocar imagens nas postagens." + one: "Desculpe, usuários novos podem mencionar apenas um usuário em uma mensagem." + other: "Desculpe, usuários novos podem mencionar apenas %{count} usuários em uma mensagem." + no_images_allowed: "Desculpe, usuários novos não podem colocar imagens nas mensagens." too_many_images: one: "Desculpe, usuários novos podem colocar apenas %{count} imagem nas postagens." - other: "Desculpe, usuários novos podem colocar apenas %{count} imagens nas postagens." - no_attachments_allowed: "Desculpe, novos usuários não podem colocar anexos nas postagens." + other: "Desculpe, usuários novos podem colocar apenas %{count} imagens nas mensagens." + no_attachments_allowed: "Desculpe, novos usuários não podem colocar anexos nas mensagens." too_many_attachments: one: "Desculpe, novos usuários podem colocar apenas %{count} anexo nas suas postagens." - other: "Desculpe, novos usuários podem colocar apenas %{count} anexos nas suas postagens." + other: "Desculpe, novos usuários podem colocar apenas %{count} anexos nas suas mensagens." no_links_allowed: "Desculpe, usuários novos não podem colocar links nas postagens." too_many_links: one: "Desculpe, usuários novos podem colocar apenas %{count} link nas postagens." @@ -155,7 +157,7 @@ pt_BR: topic_not_found: "Ocorreu um erro. Talvez este tópico foi fechado ou removido enquanto você estava visualizando?" just_posted_that: "é demasiado similar ao que postaste recentemente" invalid_characters: "contém caracteres inválidos" - is_invalid: "é inválido; tenta ser um bocado mais descritivo" + is_invalid: "parece pouco claro; é uma frase completa?" next_page: "próxima página →" prev_page: "← página anterior" page_num: "Página %{num}" @@ -180,6 +182,7 @@ pt_BR: user_topics: "Últimos tópicos por @%{username}" tag: "Tópicos marcados" too_late_to_edit: "Essa mensagem foi criada há muito tempo. Ela não pode mais ser editada ou apagada." + revert_version_same: "A versão atual é a mesma versão para a qual você está tentando reverter." excerpt_image: "imagem" queue: delete_reason: "Deletado pela fila de moderação" @@ -265,6 +268,7 @@ pt_BR: name: "Nome da Categoria" topic: title: 'Título' + featured_link: 'Link Em Destaque' post: raw: "Corpo" user_profile: @@ -284,12 +288,20 @@ pt_BR: common: "é uma das 10000 senhas mais comuns. Por favor, use uma senha mais segura." same_as_username: "é igual o seu nome de usuário. Por favor use uma senha mais segura." same_as_email: "é igual o seu email. Por favor use uma senha mais segura." + same_as_current: "A senha inserida é a mesma que a sua atual senha. Favor inserir uma nova e mais segura." ip_address: signup_not_allowed: "Cadastro não é permitido a partir desta conta." color_scheme_color: attributes: hex: invalid: "Não é uma cor válida" + post_reply: + base: + different_topic: "Postagem e réplica precisam pertencer ao mesmo tópico." + web_hook: + attributes: + payload_url: + invalid: "URL inválida. A URL deve conter http:// ou https://. Espaço em branco não é permitido." <<: *errors user_profile: no_info_me: "Reenviamos o email de confirmação para %{email}" + wizard: + title: "Configuração do Discourse" + step: + locale: + title: "Bem-vindo ao seu Discourse!" + fields: + default_locale: + description: "Qual é o idioma padrão para sua comunidade?" + forum_title: + title: "Nome" + fields: + title: + label: "O nome de sua comunidade" + site_description: + label: "Descreva sua comunidade numa frase curta." + placeholder: "Um lugar para Jane e seus amigos discutirem coisas legais." + introduction: + title: "Introdução" + fields: + welcome: + label: "Tópico de Boas Vindas" + one_paragraph: "Por favor, reduza sua mensagem de boas-vindas para um parágrafo." + privacy: + title: "Acesso" + fields: + privacy: + choices: + open: + label: "Público" + description: "Todos podem acessar essa comunidade e logar em uma conta. " + restricted: + label: "Privado" + description: "Apenas pessoas que eu convidei ou aprovei podem acessar essa comunidade." + contact: + title: "Contato" + fields: + contact_email: + label: "E-mail" + placeholder: "nome@exemplo.com" + contact_url: + placeholder: "http://www.example.com/contact-us" + site_contact: + label: "Mensagens Automatizadas" + corporate: + title: "Organização" + fields: + company_short_name: + label: "Nome da Empresa (curto)" + placeholder: "Initech" + company_full_name: + label: "Nome da Companhia" + placeholder: "Initech, Inc." + company_domain: + label: "Nome do Domínio da Empresa" + placeholder: "initech.com" + colors: + title: "Tema" + fields: + theme_id: + description: "Você prefere um esquema de cores claro ou escuro para começar? Você poderá, futuramente, trocar o esquema de cores do seu site através da Aba: Admin, Configurações." + choices: + default: + label: "Claro Simples" + dark: + label: "Escuro Simples" + logos: + title: "Logotipos" + fields: + logo_url: + label: "Logotipo Primário" + description: "O logotipo ao lado superior esquerdo de seu site. Use um formato de retângulo largo." + logo_small_url: + label: "Logotipo Compacto " + description: "Uma versão compacta de sua logo, mostrada na parte superior esquerda do site quando rolado para baixo. Use um formato quadrado." + icons: + title: "Ícones" + fields: + favicon_url: + label: "Ícone pequeno" + description: "Ícone usado para representar seu site em navegadores, que tenha boa aparência em tamanhos pequenos, como 32px por 32px." + apple_touch_icon_url: + label: "Ícone Largo" + description: "Ícone usado para representar seu site em dispositivos modernos, que tenha boa aparência em tamanhos maiores. O tamanho recomendado é pelo menos 144px por 144px." + homepage: + description: "Recomendamos mostrar os últimos tópicos na sua página inicial, mas você pode escolher mostrar categorias (grupos de tópicos) na página inicial, se preferir." + title: "Página Inicial" + fields: + homepage_style: + choices: + latest: + label: "Últimos tópicos" + categories: + label: "Categorias" + emoji: + title: "Emoji" + description: "Qual estilo de Emoji se adequa melhor para sua comunidade? Você poderá sempre adicionar novas customizações de Emojis através da aba: Admin > Customizar > Emoji." + invites: + title: "Convidar um grupo" + finished: + title: "Seu Discourse está pronto!" activemodel: errors: <<: *errors diff --git a/config/locales/server.ro.yml b/config/locales/server.ro.yml index 728efd6585c..c227fb8723d 100644 --- a/config/locales/server.ro.yml +++ b/config/locales/server.ro.yml @@ -10,21 +10,55 @@ ro: short_date_no_year: "D MMM" short_date: "D MMM, YYYY" long_date: "MMMM D, YYYY h:mma" + datetime_formats: &datetime_formats + formats: + short: "%d-%m-%Y" + short_no_year: "%B %-d" + date_only: "%B %-d, %Y" + long: "%B %-d, %Y, %l:%M%P" + date: + month_names: [null, ianuarie, februarie, martie, aprilie, mai, iunie, iulie, august, septembrie, octombrie, noiembrie, decembrie] + <<: *datetime_formats + time: + am: "AM" + pm: "PM" + <<: *datetime_formats title: "Discourse" - topics: "Discuții" - posts: "postări" - loading: "Încarcă" - powered_by_html: 'Prin intermediul Discourse, Vizualizare optimă cu JavaScript activat' + topics: "Subiecte" + posts: "Postări" + loading: "Se încarcă" + powered_by_html: 'Propulsat de Discourse, Vizualizare optimă cu JavaScript activat' log_in: "Autentificare" - disable_remote_images_download_reason: "Descărcarea de imagini la distanţă a fost dezactivată deoarece nu mai era spaţiu pe disc suficient." - anonymous: "Anonim" + purge_reason: "Cont șters automat, ca fiind abandonat, dezactivat." + disable_remote_images_download_reason: "Descărcarea de imagini la distanță a fost dezactivată deoarece nu mai era spațiu suficient pe disc." + anonymous: "Anonime" + emails: + incoming: + default_subject: "Email primit de la %{email}" + show_trimmed_content: "Arată conținut restrâns." + maximum_staged_user_per_email_reached: "Număr maxim de utilizatori în așteptare, pe email." + errors: + empty_email_error: "Apare când mailul brut pe care l-am primit este gol." + no_message_id_error: "Apare când mailul nu are header 'Message-Id'." + auto_generated_email_error: "Apare când header-ul de 'precedență' este setat pe: list, junk, bulk sau auto_reply, sau atunci când orice alt header conține: auto-submitted, auto-replied sau auto-generated." + no_body_detected_error: "Apare când nu am putut extrage corpul mesajului și nu existau fișiere atașate." + inactive_user_error: "Apare când expeditorul nu este activ." + blocked_user_error: "Apare când expeditorul a fost blocat." + bad_destination_address: "Apare când niciuna dintre adresele de email din câmpurile To/Cc/Bcc nu se potrivește cu o adresa de email expeditor configurată." + strangers_not_allowed_error: "Apare când un utilizator a încercat să creeze un nou subiect într-o categorie în care nu este membru. " + insufficient_trust_level_error: "Apare atunci când un utilizator a încercat să creeze un subiect nou într-o categorie pentru care nu are nivelul de încredere necesar." + reply_user_not_matching_error: "Apare atunci când un răspuns a venit de la o adresă de email diferită de cea la care a fost trimisă notificarea." + topic_not_found_error: "Apare atunci când un răspuns a venit, dar subiectul aferent a fost șters." + topic_closed_error: "Apare atunci când un răspuns a venit, dar subiectul aferent a fost închis." + bounced_email_error: "Emailul este un raport de email ricoșat." + screened_email_error: "Apare atunci când adresa de email a expeditorului a fost deja verificată." errors: &errors format: '%{attribute} %{message}' messages: - too_long_validation: "este limitat la %{max} de caractere; ați introdus %{length}." + too_long_validation: "este limitat la %{max} de caractere; ai introdus %{length}." invalid_boolean: "Valoare logică invalidă." - taken: "a fost deja luat." - accepted: trebuie să fie acceptat + taken: "nu este disponibil" + accepted: trebuie acceptat blank: nu poate fi gol present: trebuie să fie gol confirmation: "nu se potrivește cu %{attribute}" @@ -34,267 +68,407 @@ ro: exclusion: este rezervat greater_than: trebuie să fie mai mare decât %{count} greater_than_or_equal_to: trebuie să fie mai mare sau egal cu %{count} + has_already_been_used: "a fost deja folosit" inclusion: nu este inclus in listă - invalid: este invalid + invalid: nu este valid + is_invalid: "pare neclar, e completă propoziția?" less_than: trebuie să fie mai mic decât %{count} less_than_or_equal_to: trebuie să fie mai mic sau egal cu %{count} not_a_number: nu este un număr not_an_integer: trebuie sa fie un număr întreg odd: trebuie sa fie impar - record_invalid: 'Validare a eşuat: %{errors}' + record_invalid: 'Validarea a eşuat: %{errors}' restrict_dependent_destroy: - one: "Înregistrarea nu poate fi ştearsă pentru că există %{record} înregistrări dependente" - many: "Înregistrarea nu poate fi ştearsă pentru că există %{record} înregistrări dependente" + one: "Înregistrarea nu poate fi ştearsă pentru că există %{record} (de) înregistrări dependente" + many: "Înregistrarea nu poate fi ştearsă pentru că există %{record} (de) înregistrări dependente" too_long: - one: este prea lung (maximum 1 caracter) + one: este prea lung (maximum un caracter) few: este prea lung (maximum %{count} caractere) - other: este prea lung (maximum %{count} caractere) + other: este prea lung (maximum %{count} de caractere) too_short: - one: este prea scurt (minimum 1 caracter) + one: este prea scurt (minimum un caracter) few: este prea scurt (minimum %{count} caractere) - other: este prea scurt (minimum %{count} caractere) + other: este prea scurt (minimum %{count} de caractere) wrong_length: - one: este lungimea greşită (trebuie sa fie 1 caracter) - few: este lungimea greşită (trebuie sa fie %{count} caractere) - other: este lungimea greşită (trebuie sa fie %{count} caractere) - other_than: "trebuie sa fie diferite de %{count}" + one: are lungimea greşită (trebuie sa fie un caracter) + few: are lungimea greşită (trebuie sa fie %{count} caractere) + other: are lungimea greşită (trebuie sa fie %{count} de caractere) + other_than: "trebuie sa fie diferit de %{count}" template: body: 'Au apărut probleme cu următoarele câmpuri:' + header: + one: O eroare a împiedicat acest %{model} să fie salvat + few: '%{count} erori au împiedicat acest %{model} să fie salvat' + other: '%{count} de erori au împiedicat acest %{model} să fie salvat' embed: - load_from_remote: "S-a semnalat o eroare la încarcarea postării." + load_from_remote: "A apărut o eroare la încărcarea postării." + site_settings: + min_username_length_exists: "Nu poți seta numărul minim de caractere din nume utilizator la o valoare mai mare decât cea a celui mai scurt nume utilizator." + min_username_length_range: "Nu poți seta minimum cu o valoare mai mare decât a maximului." + max_username_length_exists: "Nu poți seta numărul maxim de caractere pentru nume utilizator la o valoare mai mică decât a celui mai lung nume utilizator." + max_username_length_range: "Nu poți seta maximum cu o valoare mai mică decât a minimului." + default_categories_already_selected: "Nu poți selecta o categorie folosită într-o altă listă." + s3_upload_bucket_is_required: "Nu poți activa încărcările pe S3 dacă nu ai introdus 's3_upload_bucket'." bulk_invite: - file_should_be_csv: "Fișierul încărcat ar trebuii să fie de formatul csv sau txt." + file_should_be_csv: "Fișierul de încărcat trebuie să fie în format csv." + error: "A apărut o eroare la încărcarea acestui fișier. Te rugăm să încerci din nou, mai târziu." backup: - operation_already_running: "O operație este în plină desfășurare. Nu puteți începe alta nouă." - backup_file_should_be_tar_gz: "Fișierul de rezervă ar trebuii să fie arhivat cu extensia .tar.gz." - not_enough_space_on_disk: "Nu este suficient spațiu pt a încărca aceast fișier de rezervă." + operation_already_running: "O operație este în desfășurare. Nu poți începe alta nouă." + backup_file_should_be_tar_gz: "Fișierul backup ar trebui să fie arhivat cu extensia .tar.gz." + not_enough_space_on_disk: "Nu este suficient spațiu pe disc pentru a încărca backup." + invalid_filename: "Numele fișierului backup conține caractere invalide. Caracterele valide sunt a-z 0-9 . - _." not_logged_in: "trebuie să fii autentificat pentru a executa această acțiune." - not_found: "Adresa URL sau resursă cerută nu pot fi găsite." - invalid_access: "Nu aveţi permisiunea să vedeţi această resursă." - read_only_mode_enabled: "Site-ul este în modul doar-citire. Interacțiunile sunt dezactivate." + not_found: "Adresa URL sau resursa necesară nu poate fi găsită." + invalid_access: "Nu ai permisiunea să vezi această resursă." + read_only_mode_enabled: "Site-ul este în modul exclusiv-citire. Interacțiunile sunt dezactivate." + reading_time: "Durata citirii" likes: "Aprecieri" too_many_replies: - one: "Ne pare rău, dar utilizatori noi sunt limitaţi la 1 răspuns pe discuţie." - few: "Ne pare rău, dar utilizatori noi sunt limitaţi la %{count} răspunsuri pe discuţie." - other: "Ne pare rău, dar utilizatori noi sunt limitaţi la %{count} răspunsuri pe discuţie." + one: "Ne pare rău, dar utilizatorii noi sunt limitați la 1 răspuns pe discuție." + few: "Ne pare rău, dar utilizatorii noi sunt limitați la %{count} răspunsuri pe discuție." + other: "Ne pare rău, dar utilizatori noi sunt limitați la %{count} de răspunsuri pe discuție." embed: - start_discussion: "Pornește Discuție" - continue: "Continuă Discuție" + start_discussion: "Pornește discuție" + continue: "Continuă discuție" + error: "Eroare la încorporare" + referer: "Referent:" + mismatch: "Referentul nu corespunde nici uneia dintre următoarele gazde:" + no_hosts: "Nu s-a setat nicio gazdă pentru încorporare." + configure: "Configurează încorporarea" + more_replies: + one: "Încă un răspuns" + few: "Încă %{count} răspunsuri" + other: "Încă %{count} de răspunsuri" loading: "Încarcă discuția..." - permalink: "Adresă permanentă" + permalink: "Link permanent" imported_from: "Acesta este un subiect de discuție adăugat la discuția originală de la %{link}" in_reply_to: "▶ %{username}" replies: - one: "1 răspuns" - few: "răspunsuri" - other: "%{count} răspunsuri" - spamming_host: "Ne pare rău, nu puteți adăuga o adresă acestei gazde." + one: "Un răspuns" + few: "%{count} răspunsuri" + other: "%{count} de răspunsuri" + no_mentions_allowed: "Ne pare rău, nu poți menționa alți utilizatori." + too_many_mentions: + one: "Ne pare rău, poți menționa doar un utilizator într-o postare." + few: "Ne pare rău, poți menționa doar %{count} utilizatori într-o postare." + other: "Ne pare rău, poți menționa doar %{count} de utilizatori într-o postare." + no_mentions_allowed_newuser: "Ne pare rău, noii utilizatori nu pot menționa alți utilizatori." + too_many_mentions_newuser: + one: "Ne pare rău, noii utilizatori pot menționa doar un utilizator într-o postare." + few: "Ne pare rău, noii utilizatori pot menționa doar %{count} utilizatori într-o postare." + other: "Ne pare rău, noii utilizatori pot menționa doar %{count} de utilizatori într-o postare." + no_images_allowed: "Ne pare rău, nu poți pune imagini în postări." + too_many_images: + one: "Ne pare rău, noii utilizatori pot pune numai o imagine într-o postare." + few: "Ne pare rău, noii utilizatori pot pune numai %{count} imagini într-o postare." + other: "Ne pare rău, noii utilizatori pot pune numai %{count} de imagini într-o postare." + no_attachments_allowed: "Ne pare rău, noii utilizatori nu pot pune atașamente la postări." + too_many_attachments: + one: "Ne pare rău, noii utilizatori pot pune doar un atașament la o postare." + few: "Ne pare rău, noii utilizatori pot pune doar %{count} atașamente la o postare." + other: "Ne pare rău, noii utilizatori pot pune doar %{count} de atașamente la o postare." + no_links_allowed: "Ne pare rău, noii utilizatori nu pot pune link-uri în postări." + too_many_links: + one: "Ne pare rău, noii utilizatori pot pune doar un link într-o postare." + few: "Ne pare rău, noii utilizatori pot pune doar %{count} link-uri într-o postare." + other: "Ne pare rău, noii utilizatori pot pune doar %{count} de link-uri într-o postare." + spamming_host: "Nu poți adăuga un link pentru acest domeniu." user_is_suspended: "Utilizatorii suspendați nu au dreptul de a posta." - just_posted_that: "este prea similar cu ceea ce ați postat recent" + topic_not_found: "Ceva n-a mers bine. Poate că acest subiect a fost închis sau șters în timp ce te uitai la el?" + just_posted_that: "este prea asemănător cu ceea ce ați postat recent" invalid_characters: "conține caractere invalide" - is_invalid: "este invalid; încercați o descriere mai detaliată" - next_page: "urmatoarea pagină →" + is_invalid: "pare neclar, e completă propoziția?" + next_page: "pagina următoare →" prev_page: "← pagina precedentă" page_num: "Pagina %{num}" home_title: "Acasă" - topics_in_category: "Discuții în categoria '%{category}'" + topics_in_category: "Subiecte în categoria '%{category}'" rss_posts_in_topic: "RSS din '%{topic}'" - rss_topics_in_category: "RSS de discuții din categoria '%{category}'" + rss_topics_in_category: "RSS de subiecte din categoria '%{category}'" author_wrote: "%{author} a scris:" - num_posts: "Postări:" + num_posts: "Mesaje:" num_participants: "Participanți:" - read_full_topic: "citește întreaga discuție" + read_full_topic: "Citește întregul subiect" private_message_abbrev: "Msg" rss_description: - latest: "Ultimele discuții" - hot: "Discuții interesante" - too_late_to_edit: "Acea discuție a fost creată acum prea mult timp. Nu mai poate fi editată sau ștearsă." + latest: "Ultimele subiecte" + hot: "Subiecte fierbinți" + top: "Subiecte fierbinți" + posts: "Ultimele postări" + private_posts: "Ultimele mesaje private" + group_posts: "Ultimele postări de la %{group_name}" + group_mentions: "Ultimele menționări de la %{group_name}" + user_posts: "Ultimele postări ale lui @%{username}" + user_topics: "Ultimele subiecte ale lui @%{username}" + tag: "Subiecte etichetate" + too_late_to_edit: "Acea postare este prea veche. Nu mai poate fi editată sau ștearsă." + revert_version_same: "Versiunea curentă este identică cu cea la care încerci să revii." excerpt_image: "imagine" queue: delete_reason: "Şters via coadă de moderare" groups: errors: + can_not_modify_automatic: "Nu poți modifica un grup automat" member_already_exist: "'%{username}' este deja membru al acestui grup" + invalid_domain: "'%{domain}' nu este un domeniu valid." + invalid_incoming_email: "'%{email}' nu este o adresa validă de email." + email_already_used_in_group: "'%{email}' este deja folosit de grupul '%{group_name}'." + email_already_used_in_category: "%{email}' este deja folosit de categoria '%{category_name}'." default_names: everyone: "toată lumea" - admins: "admini" + admins: "administratori" moderators: "moderatori" staff: "personal" - trust_level_0: "trust_level_0" + trust_level_0: "nivel_de_încredere_0" trust_level_1: "nivel_de_încredere_1" trust_level_2: "nivel_de_încredere_2" trust_level_3: "nivel_de_încredere_3" trust_level_4: "nivel_de_încredere_4" education: until_posts: - one: "1 mesaj" + one: "o postare" few: "%{count} postări" - other: "%{count} postări" + other: "%{count} de postări" + new-topic: | + Bun venit pe %{site_name} — **îți mulțumim că ai început o nouă conversație!** + + - Atunci când îl citești cu voce tare, titlul sună interesant ? Rezumă bine conținutul? + + - Cine ar fi interesat de subiectul ăsta? De ce e el important? Ce fel de răspunsuri vrei? + + - Include în subiect cuvinte folosite în mod obișnuit pentru a le da altora posibilitatea să îl *găsească*. Pentru a grupa subiectul tău laolaltă cu alte subiecte asemănătoare, alege o anumită categorie. + + Pentru mai multe îndrumări, [citește ghidul comunității](/guidelines). Această secțiune de pagină va apărea doar pentru prima/primele %{education_posts_text}. new-reply: | - Bine ai venit la %{site_name} — **Mulțumim pentru contribuție!** + Bine ai venit la %{site_name} — **Îți mulțumim pentru contribuție!** - - Răspunsul tău îmbunatațește discuția în vreun fel? + - Răspunsul tău îmbunătațește discuția în vreun fel? - - Fii amabil cu membri comunității. + - Fii amabil cu membrii comunității. - - Critica constructivă e binevenită, criticați *ideea*, nu oamenii. + - Critica constructivă e binevenită, critică *ideea*, nu oamenii. Pentru detalii, [verifică regulile comune](/reguli). Acest panel va apărea doar pentru prima %{education_posts_text}. + avatar: | + ### Ce-ai zice să adaugi o poză contului tău? + + Ai postat câteva subiecte și răspunsuri, dar poza ta de profil nu este tot atât de unică pe cât ești tu - e doar o simplă literă. + + Te-ai gândit să îți **[vizitezi profilul utilizator](%{profile_path})** și să încarci o poză care să te reprezinte? + + Subiectele sunt mai ușor de urmărit și oamenii interesanți sunt mai ușor de găsit atunci când fiecare are o poză unică de profil, în conversații! + sequential_replies: | + ### Ia în considerare ideea de a răspunde la câteva postări simultan + + În loc să răspunzi secvențial la un subiect, poți să dai un singur răspuns care include citate din postări precedente sau referințe la @nume. + + Îți poți edita răspunsul precedent pentru a adăuga un citat, după cum urmează: selectează textul și - când apare - apasă butonul citează răspuns. + + E mai ușor pentru toată lumea să citească subiecte care au răspunsuri mai puține și de substanță, decât subiecte formate dintr-o grămadă de răspunsuri individuale, micuțe. dominating_topic: | ### Permite și altora să se alăture la conversație - Această discuție este importantă pentru tine și – Ai postat mai mult de %{percent}% din răspunsuri aici. + Acest subiect este important pentru tine și – Ai postat mai mult de %{percent}% din răspunsuri aici. - Ești sigur că dai destul timp și altora să-și exprime punctul de vedere? + Ești sigur că acorzi destul timp și altora ca să-și exprime punctul de vedere? too_many_replies: | - ### Ați atins limita maximă de răspunsuri pentru aceasta discuție + ### Ai atins limita maximă de răspunsuri pentru acest subiect - Ne pare rău, dar utilizatorii noi au un număr limitat de %{newuser_max_replies_per_topic} într-o discuție. + Ne pare rău, dar utilizatorii noi au un număr limitat de %{newuser_max_replies_per_topic} răspunsuri într-un subiect. - Nu adăugați un nou răspuns, încercați mai bine să editați un răspuns precedent, sau să vizitați o altă discuție. + Nu adăuga un nou răspuns, încearcă mai bine să editezi un răspuns precedent, sau să vizitează o altă discuție. reviving_old_topic: | - ### Reînvie această discuție? + ### Reînvii acest subiect? - Ultimul răspuns la această discuție a fost dat acum %{days} de zile. Răspunsul tăuva merge în capătul listei și toată lumea ce a fost implicată în discuție va fi notificată. + Ultimul răspuns la acest subiect a fost dat acum %{days} (de) zile. Răspunsul tău va promova subiectul în vârful listei și va notifica pe toată lumea ce a fost implicată anterior în conversație. Ești sigur că dorești să continui această conversație? activerecord: attributes: category: name: "Numele categoriei" + topic: + title: 'Titlu' + featured_link: 'Link promovat' post: raw: "Corp" user_profile: - bio_raw: "Despre Mine" + bio_raw: "Despre mine" errors: models: topic: attributes: base: - warning_requires_pm: "Puteţi ataşa avertizări doar la mesajele private." - too_many_users: "Puteţi trimite avertizări la un singur utilizator odată." - cant_send_pm: "Ne pare rău, nu puteți trimite un mesaj privat acelui utilizator." + warning_requires_pm: "Poți ataşa avertizări doar la mesajele private." + too_many_users: "Poți trimite avertizări la un singur utilizator odată." + cant_send_pm: "Ne pare rău, nu poți trimite un mesaj privat acestui utilizator." no_user_selected: "Trebuie selectat un nume de utilizator valid." + featured_link: + invalid: "e invalid. URL-ul trebuie să includă http:// sau https://." + invalid_category: "nu poate fi editat în această categorie." user: attributes: password: - common: "Este una din 10.000 cele mai cunoscute parole. Folosiți vă rugăm o parolă mai sigură." + common: "este una din cele mai cunoscute 10.000 de parole. Te rugăm să folosești o parolă mai sigură." + same_as_username: "este identică cu nume utilizator. Te rugăm să folosești o parolă mai sigură." + same_as_email: "este identică cu emailul. Te rugăm să folosești o parolă mai sigură." + same_as_current: "este identică cu parola curentă." ip_address: signup_not_allowed: "Înscrierea de pe acest cont nu este permisă." color_scheme_color: attributes: hex: invalid: "nu este o culoare validă" + post_reply: + base: + different_topic: "Postarea și răspunsul trebuie să aparțină aceluiași subiect." + web_hook: + attributes: + payload_url: + invalid: "URL-ul este invalid. URL-ul trebuie să includă http:// sau https:// , iar caracterul spațiu nu este permis." <<: *errors user_profile: - no_info_me: "
Conținutul marcat ascuns temporar.
' + you_must_edit: 'Postarea ta a fost marcată cu marcaj de avertizare de către comunitate. Te rugăm să verifici mesajele.
' + user_must_edit: 'Această postare a fost marcată de către comunitate cu marcaj de avertizare și a fost ascunsă temporar.
' archetypes: regular: - title: "Discuție normală" + title: "Subiect obișnuit" banner: + title: "Subiect banner" message: - make: "Această discuție este de acum o discuție cu stindard. Va apărea în capătul fiecărei ferestre până când va fi înlăturată de către utilizator." - remove: "Această discuție nu mai este una cu stindard. Nu va mai apărea în capătul fiecărei pagini." + make: "Acest subiect este de acum un banner. Va apărea în susul fiecărei pagini până când opțiunea va fi anulată de către utilizator." + remove: "Acest subiect nu mai este un banner. Nu va mai apărea în susul fiecărei pagini." + unsubscribed: + title: "Te-ai dezabonat!" + description: "Te-ai dezabonat. Pentru a-ți schimba adresa de email vizitează preferințe utilizator." + topic_description: "Pentru a te abona din nou la %{link}, folosește controlul de notificări din partea dreaptă-jos a subiectului" + unsubscribe: + title: "Dezabonare" + stop_watching_topic: "Încetează să urmărești activ acest subiect, %{link}" + mute_topic: "Setează pe silențios toate notificările cu privire la acest subiect, %{link}" + unwatch_category: "Încetează să urmărești activ toate subiectele din categoria %{category}" + mailing_list_mode: "Dezactivează modul mailing list" + disable_digest_emails: "Nu îmi mai trimite emailuri-rezumat" + all: "Nu îmi trimite nici un mail de la %{sitename}" + different_user_description: "Pe moment, ești înregistrat cu un nume de utilizator diferit de cel căruia i-am trimis email. Te rugăm sa ieși sau să intri în modul anonim, și apoi să încerci din nou." + not_found_description: "Ne pare rău, nu am putut găsi acest link de dezabonare. Poate că linkul de dezabonare pe care l-ai primit pe email a expirat?" + log_out: "Ieșire" + user_api_key: + title: "Autorizează accesul aplicației" + authorize: "Autorizează" + read: "citire" + read_write: "citire/scriere" + description: "„%{application_name}” cere accesul la contul tău de:" + no_trust_level: "Ne pare rău, nu ai nivelul de încredere necesar pentru a accesa API utilizator" + generic_error: "Ne pare rău, nu putem să emitem chei API utilizator: această funcționalitate este probabil dezactivată din administrarea site-ului" + scopes: + message_bus: "Actualizări directe (live)" + notifications: "Citește și șterge notificările" + push: "Trimite notificările către servicii externe" + session_info: "Citește informațiile despre sesiunea utilizatorului" + read: "Citește tot" + write: "Scrie tot" reports: visits: - title: "Vizite de utilizatori" + title: "Vizite ale utilizatorilor" xaxis: "Zi" yaxis: "Număr de vizite" signups: - title: "Utilizatori Noi" + title: "Utilizatori noi" xaxis: "Zi" yaxis: "Număr de noi utilizatori" - topics: - title: "Discuții" + profile_views: + title: "Vizualizări profil utilizator" xaxis: "Zi" - yaxis: "Număr de discuții noi" + yaxis: "Număr de profiluri utilizator vizualizate" + topics: + title: "Subiecte" + xaxis: "Zi" + yaxis: "Număr de subiecte noi" posts: title: "Postări" xaxis: "Zi" @@ -416,69 +670,88 @@ ro: xaxis: "Zi" yaxis: "Număr de aprecieri noi" flags: - title: "Marcaje" + title: "Marcaje de avertizare" xaxis: "Zi" - yaxis: "Număr de maraje" + yaxis: "Număr de marcaje de avertizare" bookmarks: title: "Semne de carte" xaxis: "Zi" - yaxis: "Număr de semne de carte" + yaxis: "Număr de semne de carte noi" starred: - title: "Participări" + title: "Marcat cu steluță" xaxis: "Zi" - yaxis: "Număr de noi participări" + yaxis: "Număr de subiecte noi marcate cu steluță" users_by_trust_level: title: "Utilizatori pe nivel de încredre" xaxis: "Nivel de încredere" - yaxis: "Număr de utilizator" + yaxis: "Număr de utilizatori" emails: title: "Emailuri trimise" xaxis: "Zi" - yaxis: "Numărul de Emailuri" + yaxis: "Numărul de emailuri" user_to_user_private_messages: title: "De la utilizator la utilizator" xaxis: "Zi" + yaxis: "Număr de mesaje" system_private_messages: title: "Sistem" xaxis: "Zi" + yaxis: "Număr de mesaje" moderator_warning_private_messages: - title: "Avertismente moderatori" + title: "Avertizează moderatori" xaxis: "Zi" + yaxis: "Număr de mesaje" notify_moderators_private_messages: title: "Notifică moderatori" xaxis: "Zi" + yaxis: "Număr de mesaje" notify_user_private_messages: title: "Notifică utilizatori" xaxis: "Zi" + yaxis: "Număr de mesaje" top_referrers: - title: "Top refernințe" + title: "Top referenți" xaxis: "Utilizatori" num_clicks: "Click-uri" - num_topics: "Discuții" + num_topics: "Subiecte" top_traffic_sources: title: "Top surse de trafic" xaxis: "Domeniu" num_clicks: "Click-uri" - num_topics: "Discuții" + num_topics: "Subiecte" num_users: "Utilizatori" top_referred_topics: - title: "Top referințe discuții" - xaxis: "Discuție" + title: "Top subiecte la care se face referire" + xaxis: "Subiect" num_clicks: "Click-uri" page_view_anon_reqs: - title: "Anonim" + title: "Anonimi" xaxis: "Zi" + yaxis: "Vizualizări de pagină anonime" page_view_logged_in_reqs: - title: "Autentificat" + title: "Autentificați" xaxis: "Zi" + yaxis: "Vizualizări de pagină înregistrate" page_view_crawler_reqs: + title: "Roboți web" xaxis: "Zi" + yaxis: "Vizualizări de pagină făcute de roboți web" page_view_total_reqs: title: "Total" xaxis: "Zi" + yaxis: "Total vizualizări de pagină" + page_view_logged_in_mobile_reqs: + title: "Vizualizări de pagină înregistrate " + xaxis: "Zi" + yaxis: "Vizualizări de pagină înregistrate de pe mobil" + page_view_anon_mobile_reqs: + title: "Vizualizări de pagină anonime" + xaxis: "Zi" + yaxis: "Vizualizări de pagină anonime de pe mobil" http_background_reqs: title: "Fundal" xaxis: "Zi" + yaxis: "Interogări folosite pentru actualizare în timp real și urmărire." http_2xx_reqs: title: "Status 2xx (OK)" xaxis: "Zi" @@ -492,270 +765,711 @@ ro: xaxis: "Zi" yaxis: "Erori Client (Status 4xx)" http_5xx_reqs: + title: "HTTP 5xx (Eroare server)" xaxis: "Zi" + yaxis: "Erori server (Status 5xx)" http_total_reqs: title: "Total" xaxis: "Zi" yaxis: "Total cereri" + time_to_first_response: + title: "Timpul până la primul răspuns" + xaxis: "Zi" + yaxis: "Timp mediu (ore)" + topics_with_no_response: + title: "Subiecte fără răspuns" + xaxis: "Zi" + yaxis: "Total" + mobile_visits: + title: "Vizite utilizator" + xaxis: "Zi" + yaxis: "Număr de vizite" dashboard: rails_env_warning: "Serverul funcționează în modul %{env}." - host_names_warning: "Fișierul config/database.yml folosește din oficiu numele gazdei locale. Reactualizați pt a folosii numele de gazdă al site-ului." - gc_warning: 'Serverul dvs funcționează pe parametrii de colecție de gunoi ruby, ceea ce nu oferă cea mai bună performanță. Citiți această discuție despre setările performanței: Modificarea Ruby și Rails pentru Discourse.' - sidekiq_warning: 'Sidekiq nu este pornit. Multe acțiuni, cum ar fi trimiterea de emailuri, sunt executate în nesincronizare de către sidekiq. Asigurați-vă că măcar un porces din sidekiq este pornit. Învață despre Sidekiq aici.' - memory_warning: 'Serverul dvs lucrează cu mai puțin de 1 gb memorie. Cel puțin 1 GB memorie e recomandat.' - google_oauth2_config_warning: 'Serverul e configurat să permită logarea cu Google OAuth2 (enable_google_oauth2_logins), dar valorile secrete ale clientului precum și id-ul clientului nu sunt setate. Mergeți la Setările siteului și modificați setările. Vizualizați ghidul pentru mai multe informații.' - facebook_config_warning: 'Serverul e configurat să permită autentificarea și logarea cu Facebook (enable_facebook_logins), dar id-ul app și valoarea app secretă nu sunt setate. Mergeți la Setările site-ului și modificați setările. Vizualizați ghidul pentru mai multe informații.' - twitter_config_warning: 'Serverul e configurat să permită autentificarea și logarea cu Twitter (enable_twitter_logins),dar cheia și valoarea secretă nu este setată. Mergeți la Setările site-ului și modificați setarea. Vizualizați ghidul pentru mai multe informații.' - github_config_warning: 'Serverul e configurat să permită autentificarea și logarea cu GitHub (enable_github_logins), dar id-ul de client și valorile secrete nu sunt setate. Mergeți la Setările site-ului și modificați setarea. Vizualizați ghidul pentru mai multe informații.' - s3_config_warning: 'Serverul este configurat să încarce fișierele cître s3, dar cel puțin una din următoarele setări nu sunt potrivite: id_cheie_acces_s3, cheia_acces_secret_s3 sau loc_încărcare_s3. Mergeți la setările site-ului și modificați setările. Vedeți "Cum să potrivesc imaginea încărcată la S3?" pentru a învăța mai multe.' - image_magick_warning: 'Serverul este configurat să creeze thumbnail-uri din imagini mari, dar ImageMagick nu e instalat. Instalați ImageMagick downlodați ultima versiune.' - default_logo_warning: "Nu ați ales imaginile logo pentru site-ul dvs. Reactualiza-ți logo_url, logo_small_url și favicon_url în Setările site-ului." - contact_email_invalid: "Emailul de contact al site-ului este invalid. Vă rugăm reactualizați emailul de contact în setările site-ului." - title_nag: "Opțiunea titlul de site este încă la valoarea inițială. Vă rugăm reactualiza-ți cu titlul site-ului în setările site-ului." - site_description_missing: "Opțiunea descriere_site nu este completată. Scrieți o scurtă descriere a forum-ului în setările site-ului." - consumer_email_warning: "Site-ul dvs e configurat să folosească Gmail(sau alt serviciu de email) pentru a trimite emailuri. Gmail limitează numărul de email-uri trimise. Folosiți un provider de mailuri ca mandrill.com pentru a asigura trimiterea mail-urilor." - notification_email_warning: "Opțiunea notificare_email este goală. Vă rugăm modificați-o în Setările site-ului." + host_names_warning: "Fișierul config/database.yml folosește numele implicit al localhost. Actualizează pentru a folosi numele de gazdă al site-ului." + gc_warning: 'Serverul tău funcționează în modul „garbage collection” (eliberarea memoriei) al ruby, ceea ce nu oferă cea mai bună performanță. Citește această discuție despre setările performanței: Modificarea Ruby și Rails pentru Discourse.' + sidekiq_warning: 'Sidekiq nu este pornit. Multe acțiuni, cum ar fi trimiterea de emailuri, sunt executate asincron de către sidekiq. Asigură-te că măcar un proces din sidekiq este pornit. Citește despre Sidekiq aici.' + queue_size_warning: 'Numărul de sarcini aflate în lista de așteptare este de %{queue_size}, ceea ce e mult. Asta poate indica o problemă cu procesul(ele) Sidekiq, sau că e necesar să adaugi mai multi Sidekiq workers.' + memory_warning: 'Serverul tău lucrează cu mai puțin de 1 GB memorie. Se recomandă cel puțin 1 GB memorie.' + google_oauth2_config_warning: 'Serverul e configurat să permită autentificarea cu Google OAuth2 (enable_google_oauth2_logins), dar valorile secrete ale clientului precum și id-ul clientului nu sunt setate. Mergi la Setările site-ului și modifică setările. Vizualizează ghidul pentru mai multe informații.' + facebook_config_warning: 'Serverul e configurat să permită înscrierea și autentificarea cu Facebook (enable_facebook_logins), dar app id și valoarea app secret nu sunt setate. Mergi la Setările site-ului și modifică setările. Vizualizează ghidul pentru mai multe informații.' + twitter_config_warning: 'Serverul e configurat să permită înscrierea și autentificarea cu Twitter (enable_twitter_logins),dar cheia și valoarea secretă nu sunt setate. Mergi la Setările site-ului și modifică setarea. Vizualizează ghidul pentru mai multe informații.' + github_config_warning: 'Serverul e configurat să permită înscrierea și autentificarea cu GitHub (enable_github_logins), dar id-ul de client și valorile secrete nu sunt setate. Mergi la Setările site-ului și modifică setarea. Vizualizează ghidul pentru mai multe informații.' + s3_config_warning: 'Serverul este configurat să încarce fișierele către s3, dar cel puțin una din următoarele setări nu este potrivită: id_cheie_acces_s3, cheia_acces_secret_s3 sau loc_încărcare_s3. Mergi la Setările site-ului și actualizează setările. Vezi "Cum se fac încărcările de imagine pe S3?" pentru a afla mai multe.' + s3_backup_config_warning: 'Serverul este configurat să încarce backup-urile pe opțiunea s3, dar cel puțin una dintre setările următoare nu este completată: s3_access_key_id, s3_secret_access_key sau s3_backup_bucket. Mergi la Setările site-ului și actualizează setările. Pentru mai multe informații, vizualizează "Cum să setezi încărcările de imagini pe opțiunea S3".' + image_magick_warning: 'Serverul este configurat să creeze thumbnail-uri din imagini mari, dar ImageMagick nu e instalat. Instalează ImageMagick descarcă ultima versiune.' + failing_emails_warning: 'Există %{num_failed_jobs} (de) sarcini email care au eșuat. Verifică app.yml și asigură-te că setările serverului de mail sunt corecte. Vizualizează sarcini eșuate în Sidekiq.' + subfolder_ends_in_slash: "Setările subfolderului sunt incorecte; DISCOURSE_RELATIVE_URL_ROOT se termină cu slash." + email_polling_errored_recently: + one: "Email polling a generat o eroare în ultimele 24 de ore. Vizualizează rapoartele pentru mai multe detalii." + few: "Email polling a generat %{count} erori în ultimele 24 de ore. Vizualizează rapoartele pentru mai multe detalii." + other: "Retragerea de emailuri generat %{count} de erori în ultimele 24 de ore. Vizualizează rapoartele pentru mai multe detalii." + missing_mailgun_api_key: "Serverul este configurat să trimită emailuri printr-un mailgun dar nu ai furnizat nici o cheie API folosită pentru a verifica mesajele webhook." + bad_favicon_url: "Eroare la încărcarea Favicon. Verifică setarea favicon_url în Setările site-ului." + poll_pop3_timeout: "Conexiunea la serverul POP3 a dat time-out. Mailurile primite nu au putut fi accesate. Te rugăm să verifici setările POP3 și furnizorul de servicii." + poll_pop3_auth_error: "Conexiunea la serverul POP3 a eșuat cu o eroare de autentificare. Te rugăm să verifici setările POP3." site_settings: - default_locale: "Limba oficială a acestei instanțe de discurs (ISO 639-1 Code)" - allow_user_locale: "Permite utilizatorilor să aleagă preferința de limbă pentru interfață" - min_post_length: "Minimul de carctere permis per postare" - max_post_length: "Maximul de carctere permis per postare" - min_topic_title_length: "Minimul de caractere permis per discuție" - max_topic_title_length: "Maximul de caractere permis per discuție" - min_search_term_length: "Minimul de caractere permis pentru o căutare validă" - allow_duplicate_topic_titles: "Permite discuții cu titluri duplicate sau identice." - unique_posts_mins: "Câte minute până un utilizator poate posta iar cu același conținut" - educate_until_posts: "Când utilizatorul începe să scrie primele (n) postări, arată panelul de instruire în spațiul pentru compunere." - title: "Titlul scurt al siteului, folosit în titlul tag." - site_description: "Descrieți acest site într-o scurtă propoziție, folosit în tagul meta-descriere." - queue_jobs: "PENTRU DEVELOPER! ATENȚIE! Din oficiu, pune operațiile în coadă în sidekiq. Dacă e dezactivat, Site-ul nu va mai funcționa." - crawl_images: "Recuperați imaginile de legătura din URL-uri pentru a insera dimensiunile corecte de înălțime și lățime." - download_remote_images_to_local: "Transformă imaginile de legătură în imagini locale downloadându-le; asta previne stricarea imaginilor." - download_remote_images_threshold: "Spațiul mimin necesar pentru download-ul imaginilor de legătura local (în procente)" - disabled_image_download_domains: "Imagini de legătură nu vor mai fi downloadate din aceste domenii. Listă delimitata-vertical." - post_edit_time_limit: "Autorul poate edita sau șterge postarea până la (n) minute după postare. Setați 0 pentru totdeauna." - edit_history_visible_to_public: "Permite oricui să vadă versiunea precedentă a unei postări editate. Când e dezactivat, doar membrii personalului pot vedea." - delete_removed_posts_after: "Postările înlăturate de către autor vor fi automat șterse după (n) de ore." + censored_words: "Cuvintele vor fi înlocuite automat cu ■■■■" + censored_pattern: "Modelul Regex va fi înlocuit automat cu ■■■■" + delete_old_hidden_posts: "șterge automat toate postările ascunse care stau ascunse mai mult de 30 de zile." + default_locale: "Limba implicită a acestei instanțe de Discourse (ISO 639-1 Code)" + allow_user_locale: "Permite utilizatorilor să-și aleagă singuri limba pentru interfață" + set_locale_from_accept_language_header: "setează limba interfeței pentru utilizatorii anonimi pe baza header-elor de limbă ale web browser-elor lor. (EXPERIMENTAL, nu funcționează cu cache anonim)" + min_post_length: "Lungimea minimă a postării, în caractere" + min_first_post_length: "Numărul minim de caractere permis pentru prima postare (în corpul mesajului)" + min_private_message_post_length: "Numărul minim de caractere permis pentru mesaje, per postare" + max_post_length: "Lungimea maximă permisă a postării, în caractere" + topic_featured_link_enabled: "Activează postarea unui link cu subiecte." + show_topic_featured_link_in_digest: "Arată link-ul promovat al subiectului în rezumatul pe email." + min_topic_title_length: "Minimul de caractere permis în titlul unui subiect" + max_topic_title_length: "Maximul de caractere permis în titlul unui subiect" + min_private_message_title_length: "Numărul minim de caractere permis în titlul unui mesaj" + min_search_term_length: "Lungimea minimă a unui termen de căutare valid, în caractere." + search_tokenize_chinese_japanese_korean: "Forțează căutarea să utilizeze tokens chineză/japoneză/coreană chiar și pe site-uri care nu sunt CJK." + search_prefer_recent_posts: "Dacă ai un forum mare și căutarea este prea lentă, această opțiune încearcă să indexeze mai multe postări recente întâi." + search_recent_posts_size: "Câte postări recente să fie ținute în index" + allow_uncategorized_topics: "Permite crearea de subiecte fără categorie. ATENȚIE: Dacă o să ai postări fără categorie, va trebui să le identifici înainte să poți dezactiva din nou această setare." + allow_duplicate_topic_titles: "Permite subiecte cu titluri duplicat sau identice." + unique_posts_mins: "Câte minute până ce un utilizator poate posta din nou o postare cu același conținut" + educate_until_posts: "Când utilizatorul începe să scrie primele (n) postări, arată panelul de instruire în spațiul pentru scris postarea." + title: "Titlul scurt al site-ului, folosit în tag-ul title." + site_description: "Descrie acest site într-o singură frază, așa cum se folosește în tagul meta-descriere." + contact_email: "Adresa de email a persoanei de contact principale pentru acest site. Folosită pentru notificări critice precum marcaje de avertizare negestionate și pentru chestiuni urgente trimise prin formularul de contact din /despre" + contact_url: "URL-ul de contact pentru acest site. Folosit pentru chestiuni urgente trimise prin formularul de contact din /despre" + queue_jobs: "PENTRU DEVELOPER! ATENȚIE! Implicit, pune operațiile în coadă în sidekiq. Dacă e dezactivat, site-ul nu va mai funcționa." + crawl_images: "Recuperează imaginile din URL-uri la distanță pentru a insera dimensiunile corecte de înălțime și lățime." + download_remote_images_to_local: "Transformă imaginile la distanță în imagini locale descărcându-le; asta previne imaginile stricate." + download_remote_images_threshold: "Spațiul minim necesar pentru descărcarea imaginilor la distanță pe local (în procente)" + download_remote_images_max_days_old: "Nu descărca imaginile de la distanță pentru postări care sunt mai vechi de n zile." + disabled_image_download_domains: "Imaginile la distanță nu vor mai fi descărcate de pe aceste domenii. Listă delimitată de simbolul | (pipe)." + editing_grace_period: "Pentru (n) secunde după postare, editarea nu va crea o versiune nouă în istoricul postării." + post_edit_time_limit: "Autorul poate edita sau șterge postarea până la (n) minute după postare. Setează 0 pentru permanent." + edit_history_visible_to_public: "Permite tuturor să vadă versiunile precedente ale unei postări editate. Când e dezactivat, ele pot fi văzute doar de membrii echipei." + delete_removed_posts_after: "Postările șterse de către autor vor fi automat șterse după (n) de ore. Dacă este setat la 0, postările vor fi șterse imediat." max_image_width: "Maximul lățimii unui thumbnail într-o postare" max_image_height: "Maximul înălțimii unui thumbnail într-o postare" - category_featured_topics: "Numărul discuțiilor afișate după categorie pe /pagina de categorii. După schimbarea valorii, e nevoie de până la 15 minute până ce pagină se va actualiza." - show_subcategory_list: "Arată lista de sub-categorii în locul listei de discuții când se introduce categoria." + category_featured_topics: "Numărul subiectelor afișate după categorie pe /pagina de categorii. După schimbarea valorii, e nevoie de până la 15 minute până ce pagina de categorii se va actualiza." + show_subcategory_list: "Arată lista de sub-categorii în loc de lista de subiecte când se introduce o categorie." fixed_category_positions: "Dacă e bifat, veți putea aranja categoriile într-o ordine fixă. Dacă e nebifat, categoriile sunt listate în ordinea activității." - add_rel_nofollow_to_user_content: "Adaugă atributul rel nofollow la contextul acceptat de utilizator, în afară de adresele de uz intern (incluzând domeniile părinte). Dacă se schimbă, postările trebuiesc refăcute cu: \"rake posts:rebake\"" - post_excerpt_maxlength: "Lungimea maximă a unui extras / sumar dintr-o postare." - post_onebox_maxlength: "Lungimea maximă a postării discursului-scurt în caractere." - onebox_domains_whitelist: "O listă de domenii permise pentru discursul-scurt; aceste domenii ar trebuii să permită OpenGraph sau oEmbed. Testați-le la http://iframely.com/debug" - apple_touch_icon_url: "Iconiță folosită pentru dispozitivele Apple. Mărimea recomandată este 144px pe 144px." - notification_email: "Adresa autorului emailu-ului este folosită când se trimit emailuri esențiale de sistem. Domeniul specificat aici trebuie să aibă SPF, DKIM și rapoarte PTR inversate, setate corect pentru că email-ul să ajungă la destinație." - email_custom_headers: "O listă delimitată vertical a capetelor de email preferențiale" - summary_score_threshold: "Scorul mimim necesar pentru o postare să fie inclus în 'Sumarul acestei postări'" - summary_posts_required: "Minimul de postări într-o discuție înainte de 'Sumarul acestei discuții' este activat" - summary_likes_required: "Minimul de aprecieri într-o discuție înainte de 'Sumarul acestei discuții' este activat" - summary_percent_filter: "Când un utilizator face click pe 'Sumarul acestei discuții', arată primele % de postări" - enable_long_polling: "Indicatorul de mesaje folosit pentru notificări poate folosi sondaj" - long_polling_interval: "Intervalul înainte de sondaj este dat în milisecunde " - polling_interval: "Cât de des e intervalul de sondaj în milisecunde al utilizatorilor autentificați" - anon_polling_interval: "Cat de des e intervalul de sondaj în milisecunde al clienților anonimi" - cooldown_minutes_after_hiding_posts: "Numărul de minute pr care un utilizator trebuie să le aștepte până când poate edita sau ascunde o postare prin marcajele comune" - notify_mods_when_user_blocked: "Dacă un utilizator este blocat automat , trimite un mesaj tuturor moderatorilor." - flag_sockpuppets: "Dacă un utilizator nou răspunde unei discuții de la același IP ca utilizatorul ce a pornit discuția, marchează ambele postări ca potențial spam." - post_undo_action_window_mins: "Numarum de minute în care utilizatorii pot anula acțiunile recente într-o postare (aprecieri, marcări, etc)." - ga_universal_tracking_code: "Codul de urmarie al Google Universal Analytics (analytics.js), ex: UA-12345678-9; see http://google.com/analytics" - ga_universal_domain_name: "Numele de domeniu al Google Universal Analytics (analytics.js) , ex: mysite.com; see http://google.com/analytics" - enable_noscript_support: "Activează căutarea standardă a webcrawler-ului prin tagul noscript" + fixed_category_positions_on_create: "Dacă este bifat, ordonarea categoriilor va fi menținută în dialogul de creare a subiectelor (presupune fixed_category_positions)." + add_rel_nofollow_to_user_content: "Adaugă atributul rel nofollow la toate conținuturile transmise de către utilizator, cu excepția link-urilor interne (includiv domeniile părinte). Dacă schimbi această setare, postările trebuie refăcute cu: \"rake posts:rebake\"" + exclude_rel_nofollow_domains: "O listă a domeniilor unde nofollow nu trebuie adăugat la link-uri. tld.com va permite automat și sub.tld.com. Ca cerință minimă, va trebui să adaugi domeniul top-level al acestui site pentru a permite roboților web să îi găsească tot conținutul. Dacă există părți ale site-ul tău care se află pe alte domenii, adăugă-le și pe acestea." + post_excerpt_maxlength: "Lungimea maximă a unui fragment/rezumat dintr-o postare." + show_pinned_excerpt_mobile: "Arată fragmente din subiectele fixate în vizualizarea de mobil." + show_pinned_excerpt_desktop: "Arată fragmente din subiectele fixate în vizualizarea de desktop." + post_onebox_maxlength: "Lungimea maximă a unei postări afișate în Onebox (în caractere)" + onebox_domains_blacklist: "O listă cu domenii care nu vor putea fi utilizate cu onebox." + max_oneboxes_per_post: "Numărul maxim de utilizări onebox per post." + logo_url: "Imaginea logo din partea din dreapta sus a site-ului tău trebuie să aibă o formă dreptunghiulară. Dacă este lăsată goală, va fi afișat în locul ei un titlu al site-ului în formă text." + digest_logo_url: "Imaginea logo alternativă folosită în partea de sus a emailurilor-rezumat de pe site-ul tău. Trebuie să aibă o forma de dreptunghi lat. Nu trebuie să fie o imagine SVG. Dacă e lăsată goală, va fi folosit în locul ei - `logo_url` ." + logo_small_url: "Imaginea logo mică din partea de sus-stânga a site-ului tău va trebui să aibă o formă dreptunghiulară, vizibilă când se derulează pagina. Dacă e lăsată goală, va fi afișat un pictograf." + favicon_url: "Un favicon pentru site-ul tău trebuie să fie în format png pentru a funcționa corect peste un CDN vedeți http://en.wikipedia.org/wiki/Favicon" + mobile_logo_url: "Imaginea logo cu poziție fixă folosită în partea stângă-sus a site-ului tău mobil. Trebuie să aibă o formă pătrată. Dacă este lăsată goală, va fi folosit `logo_url` . De ex.: http://example.com/uploads/default/logo.png" + apple_touch_icon_url: "Iconiță folosită pentru dispozitivele touch Apple. Mărimea recomandată este 144px pe 144px." + notification_email: "Adresă expeditor: adresa de email folosită când se trimit toate emailurile esențiale ale sistemului. Domeniul specificat aici trebuie să aibă setate corect SPF, DKIM și reverse PTR pentru ca emailul să poată fi livrat." + email_custom_headers: "O listă delimitată cu simbolul | (pipe) a header-elor personalizate de email" + email_subject: "Format de subiecte ce se poate personaliza pentru emailurile standard. Vedeți https://meta.discourse.org/t/customize-subject-format-for-standard-emails/20801" + force_https: "Forțează site-ul să folosească exclusiv HTTPS. ATENȚIE: NU activa această opțiune până nu ai verificat dacă HTTPS este configurat în întregime și funcționează absolut peste tot. Ai verificat, de asemenea, dacă și CND-ul, toate autentificările cu cont pe rețele de socializaer și toate logo-urile și dependențele externe sunt compatibile cu HTTPS?" + summary_score_threshold: "Scorul minim necesar pentru ca o postare să fie inclusă în 'Rezumă acest subiect'" + summary_posts_required: "Minimul de postări într-un subiect înainte de a se activa 'Rezumă acest subiect'." + summary_likes_required: "Minimul de aprecieri într-un subiect înainte de a se activa 'Rezumă acest subiect'." + summary_percent_filter: "Când un utilizator face click pe 'Rezumatul acestui subiect', arată primele % de postări" + summary_max_results: "Numărul maxim de postări returnate de \"Rezumatul acestui subiect\"" + enable_private_messages: "Acordă nivelul de încredere 1 (configurabil via nivel minim de încredere pentru trimiterea de mesaje) utilizatorilor, pentru a le permite să creeze și să răspundă la mesaje. Atenție: echipa poate oricând să trimită mesaje, indiferent de setări." + enable_long_polling: "Bus-ul de mesaje folosit pentru notificări poate utiliza long polling." + long_polling_base_url: "URL de bază folosit pentru long polling (atunci când un CDN servește conținut dinamic, asigură-te că setezi asta pe origin pull) ex: http://origin.site.com" + long_polling_interval: "Durata cât serverul va trebui să aștepte înainte de a răspunde clienților atunci când nu există date de trimis (exclusiv utilizatori autentificați)" + polling_interval: "Atunci când nu se face long polling, cât de des ar trebui clienții autentificați să facă interogări, în milisecunde." + anon_polling_interval: "Cât de frecvent să interogheze clienții anonimi, în milisecunde" + background_polling_interval: "Cât de des să interogheze clienții, în milisecunde (când fereastra este fundal)" + flags_required_to_hide_post: "Număr de marcaje de avertizare care fac ca o postare să fie automat ascunsă și utilizatorului să îi fie trimis automat un mesaj (0 pentru niciodată)" + cooldown_minutes_after_hiding_posts: "Numărul de minute pe care un utilizator trebuie să le aștepte până când va putea edita o postare ascunsă prin marcaje de avertizare ale comunității." + max_topics_in_first_day: "Numărul maxim de subiecte pe care un utilizator are voie să le creeze într-o perioadă de 24 de ore după ce și-a creat prima postare" + max_replies_in_first_day: "Numărul maxim de răspunsuri pe care un utilizator are voie să le creeze într-o perioadă de 24 de ore după ce și-a creat prima postare" + tl2_additional_likes_per_day_multiplier: "Crește numărul maxim de aprecieri pe zi pentru (membrii cu) nivelul de încredere 2, multiplicând cu această valoare" + tl3_additional_likes_per_day_multiplier: "Crește numărul maxim de aprecieri pe zi pentru (membrii cu) nivelul de încredere 3, multiplicând cu această valoare" + tl4_additional_likes_per_day_multiplier: "Crește numărul maxim de aprecieri pe zi pentru (membrii cu) nivelul de încredere 4, multiplicând cu această valoare" + num_spam_flags_to_block_new_user: "Dacă postările unui nou utilizator primesc atâtea marcaje de avertizare ca spam de la num_users_to_block_new_user utilizatori diferiți, ascunde-i toate postările și împiedică-l să mai posteze. 0 pentru dezactivare." + num_users_to_block_new_user: "Dacă mesajele unui nou utilizator obțin num_spam_flags_to_block_new_user marcaje de avertizare de la tot atâția utilizatori diferiți, ascunde toate mesajele sale și blochează-i posibilitatea de a posta. 0 pentru dezactivare." + num_tl3_flags_to_block_new_user: "Dacă postările unui nou utilizator primesc atâtea marcaje de avertizare de la num_tl3_users_to_block_new_user de utilizatori diferiți cu nivel de încredere 3, ascunde toate postările sale și blochează-i posibilitatea de a posta pe viitor. 0 pentru dezactivare." + num_tl3_users_to_block_new_user: "Dacă postările unui utilizator nou primesc num_tl3_flags_to_block_new_user marcaje de avertizare de la tot atâția utilizatori diferiți cu nivelul de încredere 3, ascunde-i toate postările și blochează-i posibilitatea de a posta pe viitor. 0 pentru dezactivare." + notify_mods_when_user_blocked: "Dacă un utilizator este blocat automat, trimite un mesaj tuturor moderatorilor." + flag_sockpuppets: "Dacă un utilizator nou răspunde unui subiect de la același IP ca utilizatorul ce a pornit subiectul, marchează ambele postări ca potențial spam." + traditional_markdown_linebreaks: "Folosește întreruperi de rând tradiționale în Markdown, ceea ce necesită două spații pentru un capăt de rând. " + allow_html_tables: "Permite introducerea de tabele în Markdown prin folosirea de etichete HTML. HEAD, TD, TR, TH vor fi autorizate (necesită un rebake pe toate postările vechi ce conțin tabele)" + post_undo_action_window_mins: "Numărul de minute în care utilizatorii pot anula acțiunile recente asupra unei postări (aprecieri, marcări cu marcaje de avertizare, etc)." + must_approve_users: "Membrii echipei trebuie să aprobe toate conturile noilor utilizatori înainte ca aceștia să poată accesa site-ul. ATENȚIE: activarea acestei opțiuni pentru un site în producție va revoca accesul tuturor utilizatorilor care nu sunt membri ai echipei!" + pending_users_reminder_delay: "Notifică moderatorii dacă noii utilizatori sunt în așteptarea aprobării de mai mult de atâtea ore. Setează la -1 pentru a dezactiva notificările." + maximum_session_age: "Utilizatorul va rămâne autentificat pentru n ore de la ultima vizită" + ga_tracking_code: "ÎNVECHIT: Google analytics (ga.js) cod de urmărire, eg: UA-12345678-9; see http://google.com/analytics" + ga_domain_name: "ÎNVECHIT: numele domeniului Google Analytics (ga.js), de exemplu: siteulmeu.com ; vezi http://google.com/analytics" + ga_universal_tracking_code: "Codul de urmărire Google Universal Analytics (analytics.js), ex: UA-12345678-9; vezi http://google.com/analytics" + ga_universal_domain_name: "Numele de domeniu Google Universal Analytics (analytics.js), ex: mysite.com; vezi http://google.com/analytics" + gtm_container_id: "ID-ul containerului Google Tag Manager. De ex: GTM-ABCDEF" + enable_escaped_fragments: "Întoarce-te la Google's Ajax-Crawling API dacă nu e detectat webcrawler-ul. Vezi https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" + enable_noscript_support: "Activează suportul pentru roboții de căutare web prin tag-ul noscript" allow_moderators_to_create_categories: "Permite moderatorilor să creeze noi categorii" - post_menu: "Determină ce elemente apar în meniul de postare și în ce ordine . Exemple apreciere|editează|marchează|șterge|distribuie|semne de carte|răspunde" - post_menu_hidden_items: "Meniul de elemente de ascuns din oficiu în meniul de postări numai dacă elipsa este activată prin click." - share_links: "Determină ce elemente apar în dialogul distribuit și în ce ordine." - track_external_right_clicks: "Urmărește adresele externe ce sunt activate prin click-dreapta (ex: deschide în tab nou) dezactivate din oficiu fiindcă rescrie URL-uri" - suppress_reply_directly_below: "Nu arăta numărul expadabil de răspunsuri într-o postare când există doar un sigur răspuns sub acesta." - suppress_reply_directly_above: "Nu arăta numărul expadabil de răspunsuri_la într-o postare când există doar un sigur răspuns sub acesta." - suppress_reply_when_quoting: "Nu arata numărul expadabil de răspunsuri_la într-o postare când postarea este un raspuns-citat." - redirect_users_to_top_page: "Redirecționează automat utilizatorii noi și cei absenți de mult în vârful paginii." - email_token_valid_hours: "Parola uitată / activează tokenii de cont valizi pentru (n) ore." - email_token_grace_period_hours: "Parola uitată / activează tokenii de cont ce sunt încă valizi pe o perioadă de (n) ore după ce au fost redobândiți." - enable_badges: "Activează sistemul insigna (experimental)" - version_checks: "Permite actualizarea Discourse Hub pentru versiuni mai noi și arată mesajele de versiune pe /spațiul de lucru admin" - new_version_emails: "Trimite un email la adresa de contact_email când o nouă versiune de Discourse este disponibilă." - port: "PENTRU DEVELOPER! ATENȚIE! Folosiți acest port HTTP decât cel din oficiu , portul 80. lăsați liber pentru portul 80." - force_hostname: "PENTRU DEVELOPER! ATENȚIE! Specificați un nume de gazdă âne URL. Lăsați liber pentru cel din oficiu." - invite_expiry_days: "Cat timp sun valabile cheile de invitație ale utilizatorilor, în zile" - invite_passthrough_hours: "Cât timp un utilizator poate folosii o cheie de invitație recuperată anterior pentru autentificare, în ore" - invite_only: "Înregistrarea publică este dezactivată, toți utilizatorii noi trebuie să fie exclusiv invitați de un alt membru sau personalul site-ului." - login_required: "Autentificarea este necesară pentru a citi conținutul site-ului, nu permite accesul anonim." - min_password_length: "Lungimea minimă de caractere pentru parolă." - block_common_passwords: "nu permite parole ce sunt în cele 10,000 cele mai cunoscute parole." - enable_local_logins: "Activează numele de utilizator local și a conturilor bazate pe logare cu parola. (Notă: Aceasta trebuie activiată pentru invitații pt a funcționa)" - allow_new_registrations: "Permite înregistrarea noilor utilizatori . Debifați pentru a restricționa oricui să creeze un cont nou." + cors_origins: "Origini permise pentru interogările inter-origini (CORS). Fiecare origine trebuie să includă http:// sau https://. Variabila env DISCOURSE_ENABLE_CORS trebuie setată pe true pentru a activa CORS." + use_admin_ip_whitelist: "Adminii se pot autentifica numai dacă au o adresă IP definită în lista de IP-uri verificate (Admin > Rapoarte > IP-uri verificate) " + top_menu: "Determină ce elemente apar în navigare pe pagina principală și în ce ordine. Exemplu: ultimele|noi|necitite|categorii|top|citite|semnedecarte" + post_menu: "Determină ce elemente apar în meniul de postare și în ce ordine . Exemplu: apreciere|editează|marchează|șterge|distribuie|semne de carte|răspunde" + post_menu_hidden_items: "Elemente de meniu care să fie ascunse implicit în meniul de postări dacă nu se dă click pe partea de extindere a meniului." + share_links: "Determină ce elemente apar în dialogul de distribuire și în ce ordine." + track_external_right_clicks: "Urmărește link-urile externe care sunt dezactivate prin click-dreapta (ex: deschide în tab nou) în mod implicit fiindcă rescriu URL-uri" + site_contact_username: "Un nume utilizator valid al unui membru al echipei de la care să se trimită toate mesajele. Dacă e lăsat liber se va folosi contul implicit System." + send_welcome_message: "Trimite tuturor utilizatorilor un mesaj de bun venit cu un ghid rapid de inițiere." + suppress_reply_directly_below: "Nu arăta contorul expandabil de răspunsuri la o postare atunci când nu există decât un singur răspuns direct sub această postare." + suppress_reply_directly_above: "Nu arăta elementul expandabil „ca răspuns la” aferent unei postări, atunci când nu există decât un singur răspuns direct deasupra acestei postări." + suppress_reply_when_quoting: "Nu arăta elementul expandabil „ca răspuns la” aferent unei postări, atunci când postarea citează răspunsul." + max_reply_history: "Număr maxim de răspunsuri care să fie expandate atunci când se expandează un \"răspuns la\"" + topics_per_period_in_top_summary: "Numărul celor mai bune subiecte afișate în rezumatul implicit al celor mai bune subiecte." + topics_per_period_in_top_page: "Numărul celor mai bune subiecte afișat când se selectează 'Afișează mai multe' cele mai bune subiecte." + redirect_users_to_top_page: "Redirecționează automat noii utilizatorii noi și cei absenți de multă vreme, către vârful paginii." + top_page_default_timeframe: "Perioada implicită pentru pagina cea mai vizualizată" + show_email_on_profile: "Afișează adresa de email a unui utilizator în pagina sa de utilizator (vizibilă numai pentru el și pentru membrii echipei)" + prioritize_username_in_ux: "Afișează întâi nume utilizator pe pagina utilizator, pe cardul utilizator și în postări (dacă e dezactivat, se afișează întâi numele)" + email_token_valid_hours: "Tokenul uitat parolă / activează cont sunt valabili pentru (n) ore." + enable_badges: "Activează sistemul de ecusoane" + enable_whispers: "Permite membrilor echipei să comunice privat în cadrul subiectelor." + allow_index_in_robots_txt: "Specifică în robots.txt că acest site poate fi indexat de motoarele de căutare web." + email_domains_blacklist: "O listă de domenii de email separate cu simbolul | (pipe) ale căror utilizatori nu au permisiunea să înregistreze conturi. Exemplu: mailinator.com|trashmail.net" + email_domains_whitelist: "O listă de domenii de email (separate cu simbolul | (pipe)) cu care utilizatorii TREBUIE să se înregistreze. ATENȚIE: utilizatorii cu alte domenii de email decât cele listate nu vor avea permisiunea să se înregistreze." + forgot_password_strict: "Nu informa utilizatorii despre existența unui cont atunci când folosesc dialogul pentru parolă uitată." + log_out_strict: "La ieșire, închide TOATE sesiunile pentru utilizator, pe toate dispozitivele." + version_checks: "Verifică Hub-ul Discourse pentru actualizări și arată notificările de versiuni noi pe spațiul de lucru /admin ." + new_version_emails: "Trimite un email la adresa contact_email când o nouă versiune de Discourse este disponibilă." + port: "PENTRU DEVELOPER! ATENȚIE! Folosește acest port HTTP în locul portului 80 care este implicit. Lasă liber pentru a folosi portul 80, ca implicit." + force_hostname: "PENTRU DEVELOPER! ATENȚIE! Specifică un nume de gazdă în URL. Lasă liber pentru cel implicit." + invite_expiry_days: "Cât timp sunt valabile cheile de invitație ale utilizatorilor, în zile" + invite_passthrough_hours: "Cât timp un utilizator poate folosi o cheie de invitație acceptată anterior pentru autentificare, în ore" + invite_only: "Înregistrarea publică este dezactivată, toți utilizatorii noi trebuie să fie exclusiv invitați de un alt membru sau de personalul site-ului." + login_required: "Cere autentificare pentru a citi conținutul acestui site, blochează accesul anonim." + min_username_length: "Numărul minim de caractere pe care poate să îl aibă un nume de utilizator." + max_username_length: "Numărul maxim de caractere pe care poate să îl aibă un nume de utilizator." + reserved_usernames: "Nume de utilizator pentru care înregistrarea nu este permisă." + min_password_length: "Lungimea minimă a parolei." + min_admin_password_length: "Lungimea maximă a parolei pentru Admin." + block_common_passwords: "Nu permite parole ce sunt printre cele 10,000 cele mai cunoscute parole." + enable_sso: "Activează opțiunea single sign on via site extern (ATENȚIE: ADRESELE DE EMAIL ALE UTILIZATORILOR *TREBUIE* VALIDATE DE SITE-UL EXTERN!)" + verbose_sso_logging: "Raportează diagnosticele legate de SSO în /logs" + enable_sso_provider: "Implementează protocolul furnizorului SSO Discourse la punctul final /session/sso_provider, sso_secret trebuie să fie setat." + sso_url: "URL pentru autentificare unică la punct final (trebuie să includă http:// or https://)" + sso_secret: "șir secret folosit pentru autentificarea criptografică a SSO, asigură-te că este de minim 10 caractere" + sso_overrides_bio: "Suprascrie biografia utilizatorului în profil utilizator și nu-i permite acestuia să o modifice" + sso_overrides_email: "Suprascrie emailul local cu un email de pe un site extern din datele furnizate de SSO la fiecare autentificare și împiedică schimbările locale. (ATENȚIE: pot apărea discrepanțe din cauza normalizării emailurilor locale)" + sso_overrides_username: "Suprascrie numele de utilizator local cu numele utilizator de pe site-ul extern din datele SSO la fiecare autentificare și împiedică schimbările locale (ATENȚIE: pot apărea discrepanțe din cauza diferențelor în lungimea/pre-condițiile numelui utilizator)" + sso_overrides_name: "Suprascrie numele întreg de pe local cu numele întreg din datele SSO la fiecare autentificare și împiedică schimbările locale." + sso_overrides_avatar: "Suprascrie avatarul utilizatorului cu avatarul din datele SSO. Dacă este activat, se recomandă călduros dezactivarea allow_uploaded_avatars" + sso_not_approved_url: "Redirecționează conturile neaprobate SSO către acest URL" + sso_allows_all_return_paths: "Nu restricționa domeniul pentru return_paths furnizate de SSO (implicit, calea de întoarcere trebuie să fie pe site-ul curent)" + enable_local_logins: "Activează numele de utilizator local și conturile bazate pe autentificare cu parolă. (Notă: Pentru ca invitațiile să funcționeze, această opțiune trebuie să fie activată)" + allow_new_registrations: "Permite înregistrarea noilor utilizatori. Debifați pentru a restricționa pe oricine să creeze un cont nou." + enable_signup_cta: "Arată o notificare către utilizatorii anonimi care revin prin care să le ceri să se înscrie pentru a avea un cont pe site." enable_yahoo_logins: "Activează autentificarea cu Yahoo" - enable_google_oauth2_logins: "Activează autentificarea cu Google Oauth2 . Aceasta e metoda de autentificarea suportată de Google momentan. Necesită cheie și secret." - google_oauth2_client_id: "ID-ul client al aplicației Google." - google_oauth2_client_secret: "Secretul clientului din aplicația Google." - enable_twitter_logins: "Activează autentificarea cu Twitter, necesită cheia_de_consumator+twitter și secretul_de_consumator_twitter" - twitter_consumer_key: "Cheia de consumator pentru autentificarea cu Twitter , înregistrată la http://dev.twitter.com" - twitter_consumer_secret: "Secretul de consumator pentru autentificarea cu Twitter, înregistrat la http://dev.twitter.com" - enable_facebook_logins: "Activează autentificarea cu Facebook, neceistă facebook_app_id și facebook_app_secret" + enable_google_oauth2_logins: "Activează autentificarea cu Google Oauth2 . Aceasta e metoda de autentificare pe care o suportă Google. Necesită cheie și secret." + google_oauth2_client_id: "ID client al aplicației tale Google." + google_oauth2_client_secret: "Secret client al aplicației tale Google." + enable_twitter_logins: "Activează autentificarea cu Twitter, necesită twitter_consumer_key and twitter_consumer_secret" + twitter_consumer_key: "Cheie consumator pentru autentificarea cu Twitter, înregistrată la http://dev.twitter.com" + twitter_consumer_secret: "Secret consumator pentru autentificarea cu Twitter, înregistrat la http://dev.twitter.com" + enable_instagram_logins: "Activează autentificarea prin Instagram, necesită instagram_consumer_key și instagram_consumer_secret" + instagram_consumer_key: "Cheie consumator pentru autentificarea Instagram" + instagram_consumer_secret: "Autentificare Instagram pe bază de secret consumator" + enable_facebook_logins: "Activează autentificarea cu Facebook, necesită facebook_app_id și facebook_app_secret" facebook_app_id: "ID-ul aplicației pentru autentificarea cu Facebook, înregistrată la https://developers.facebook.com/apps" - facebook_app_secret: "Secretul aplicației pentru autentificarea cu Facebook, înregistrat la https://developers.facebook.com/apps" + facebook_app_secret: "App secret pentru autentificarea cu Facebook, înregistrat la https://developers.facebook.com/apps" + facebook_request_extra_profile_details: "Solicită informațiile despre mine, locație și website de la Facebook. (necesită ca aplicația ta de autentificare să fie aprobată de Facebook)" enable_github_logins: "Activează autentificarea cu Github, requires github_client_id and github_client_secret" - github_client_id: "ID-ul clientului pentru autentificarea cu Github, înregistrat la https://github.com/settings/applications" + github_client_id: "ID client pentru autentificarea cu Github, înregistrat la https://github.com/settings/applications" github_client_secret: "Secretul clientului pentru autentificarea cu Github, înregistrat la https://github.com/settings/applications" - allow_restore: "Permite rescrierea, ceea ce poate înlocuii TOATE datele din site! Lasăți necompletat decât dacă doriți să reluați o rezervă" - maximum_backups: "Maximul de rezerve de pe disc. Rezervele vechi sunt șterse automat" - enable_s3_backups: "Încarcă rezervele pe s3 când sunt complete. Fiți sigur că ați completat acreditarea s3." - s3_backup_bucket: "Folosește compartimentul de legătură pentru a ține rezerve. Atenție: Asigurați-vă că este un compartiment privat." - active_user_rate_limit_secs: "Cât de de se actializează câmpul 'last_seen_at', în secunde" - previous_visit_timeout_hours: "Cât de mult durează o vizită până când e considerată vizita'precedentă', în ore" - rate_limit_create_topic: "După crearea unei discuții, utilizatorul trebuie să aștepte (n) secunde înainte de a începe una nouă." + readonly_mode_during_backup: "Activează modul exclusiv-citire în timpul operațiunii de backup" + allow_restore: "Bifează-l doar dacă dorești să restaurezi un fișier de backup. Atenție, restaurarea poate șterge/înlocui TOATE datele din site!" + maximum_backups: "Maximul de fișiere backup păstrate. Fișierele backup vechi sunt șterse automat" + automatic_backups_enabled: "Rulează automat operațiuni de backup după cum este definit la frecvența de backup" + backup_frequency: "Cât de frecvent facem backup la site, în zile." + enable_s3_backups: "Încarcă fișierele backup pe s3 când sunt complete. IMPORTANT: sunt necesare date de autentificare valide pentru S3 în secțiunea FIșIERE." + s3_backup_bucket: "Containerul (bucket) de la distanță care ține backupurile. ATENȚIE: Asgură-te că e un container privat." + s3_disable_cleanup: "Dezactivează eliminarea backup-urilor de pe S3 când sunt șterse local." + backup_time_of_day: "Ora în format UTC la care să înceapă operațiunea de backup." + backup_with_uploads: "Include încărcări în backup-urile programate. Dezactivarea acestei opțiuni va face backup doar la baza de date." + active_user_rate_limit_secs: "Cât de des se actualizează câmpul 'last_seen_at', în secunde" + verbose_localization: "Arată pe larg sfaturile de localizare în UI" + previous_visit_timeout_hours: "Durata unei vizite până ce va fi considerată drept vizită 'precedentă', în ore" + top_topics_formula_log_views_multiplier: "valoarea multiplicatorului (n) de vizualizări rapoarte în formula celor mai bune subiecte:\n`log(views_count) * (n) + op_likes_count * 0.5 + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_first_post_likes_multiplier: "valoarea multiplicatorului (n) de prime aprecieri la postări în formula celor mai bune subiecte:\n`log(views_count) * 2 + op_likes_count * (n) + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_least_likes_per_post_multiplier: "valoarea multiplicatorului (n) de cele mai puține aprecieri în formula celor mai bune subiecte:\n`log(views_count) * 2 + op_likes_count * 0.5 + LEAST(likes_count / posts_count, (n)) + 10 + log(posts_count)`" + rebake_old_posts_count: "Numărul de postări care să fie regenerate la fiecare 15 minute." + rate_limit_create_topic: "După crearea unui subiect, utilizatorii trebuie să aștepte (n) secunde până pot crea unul nou." rate_limit_create_post: "După postare, utilizatorii trebuie să aștepte (n) de secunde până să creeze alta postare." - rate_limit_new_user_create_topic: "După crearea unei discuții, utilizatorii noi trebuie să aștepte (n) secunde până pot crea altă nouă." + rate_limit_new_user_create_topic: "După crearea unui subiect, utilizatorii noi trebuie să aștepte (n) secunde până pot crea unul nou." rate_limit_new_user_create_post: "După ce postează, utilizatorii noi trebuie să aștepte (n) secunde până pot crea altă postare." - max_likes_per_day: "Numărul maxim de aprecieri per utilizator zilnic." - max_flags_per_day: "Numărul maxim de marcaje per utilizator zilnic." - max_bookmarks_per_day: "Numărul maxim de semne de carte per utilizator, zilnic." - max_edits_per_day: "Numărul maxim de editări per utilizator, zilnic." - max_topics_per_day: "Numărul maxim de discuții pe care un utilizator le poare crea zilnic." - suggested_topics: "Numărul de discuții sugerate la sfârșitul unei discuții." - limit_suggested_to_category: "Arată doar discuțiile din aceiași categoriie în cele sugerate." - clean_up_uploads: "eliminați încărcările orfane și fără referință pentru a prevenii găzduirea ilegală. ATENȚIE: Poate ați dorii să creați o rezervă a /directorului de încărcări înainte de a activa opțiunea." - clean_orphan_uploads_grace_period_hours: "Perioada de grație (în ore) înainte ca o reîncarcare orfană să fie ștearsă." + max_likes_per_day: "Numărul maxim zilnic de aprecieri per utilizator." + max_flags_per_day: "Numărul maxim zilnic de marcaje de avertizare per utilizator." + max_bookmarks_per_day: "Numărul maxim zilnic de semne de carte per utilizator." + max_edits_per_day: "Numărul maxim zilnic de editări per utilizator." + max_topics_per_day: "Numărul maxim de subiecte pe care un utilizator le poare crea zilnic." + max_private_messages_per_day: "Număr maxim de mesaje pe care utilizatorii le pot crea pe zi." + max_invites_per_day: "Număr maxim de invitații pe care un utilizator le poate trimite pe zi." + max_topic_invitations_per_day: "Numărul maxim de invitații la subiect pe care un utilizator le poate trimite pe zi." + alert_admins_if_errors_per_minute: "Numărul de erori pe minut la care să se declanșeze o alerta admin. Valoarea 0 dezactivează această funcționalitate. NOTĂ: necesită restart." + alert_admins_if_errors_per_hour: "Numărul de erori pe oră la care să se declanșeze o alertă admin. Valoarea 0 dezactivează această funcționalitate. NOTĂ: necesită restart." + categories_topics: "Numărul de subiecte care să fie afișat în pagina /categories ." + suggested_topics: "Numărul de subiecte sugerate în partea de jos a unui subiect." + limit_suggested_to_category: "Arată doar subiectele din aceeași categorie, în subiecte sugerate." + suggested_topics_max_days_old: "Subiectele sugerate nu trebuie să fie mai vechi de n zile." + clean_up_uploads: "șterge încărcările ne-referențiate orfane pentru a preveni găzduirea ilegală. ATENȚIE: înainte de a activa această setare faceți un backup la directorul /uploads ." + clean_orphan_uploads_grace_period_hours: "Perioada de grație (în ore) înainte ca o reîncărcare orfană să fie ștearsă." purge_deleted_uploads_grace_period_days: "Perioada de grație (în zile) înainte ca o încărcare ștearsă să fie eliminată." - enable_s3_uploads: "Pune încărcările pe spațiul Amazon S3." - s3_upload_bucket: "Numele compartimentului Amazon S3 unde fișierele vor fi încărcate. ATENȚIE: cu litere mici, fără puncte." - s3_access_key_id: "Id-ul cheie de acces Amazon S3 ce va fi folosită la încărcarea imaginilor." - s3_secret_access_key: "Cheia secretă de acces Amazon S3 ce va fi folosită la încărcarea imaginilor." - s3_region: "Numele regional Amazon S3 ce va fi folosit la încărcarea imaginilor." - enable_flash_video_onebox: "Activează încastrarea adreselor swf și flv (Adobe Flash) în cutii. ATENȚIE: poate aduce riscuri de securitate." + purge_unactivated_users_grace_period_days: "Perioada de grație (în zile) înainte ca un utilizator care nu și-a activat contul să fie șters." + enable_s3_uploads: "Pune încărcările pe spațiul Amazon S3. IMPORTANT: necesită un acces valid (atât identificatorul cheii de acces cât și cheia secretă)." + s3_use_iam_profile: 'Folosește rolul AWS EC2 IAM pentru retragerea cheilor. NOTĂ: activarea va suprascrie setările pentru "s3 access key id" și "s3 secret access key".' + s3_upload_bucket: "Numele containerului Amazon S3 unde vor fi încărcate fișierele. ATENȚIE: trebuie să fie scris cu litere mici, fără puncte și fără underscore." + s3_access_key_id: "Id cheie de acces Amazon S3 ce va fi folosit la încărcarea imaginilor." + s3_secret_access_key: "Cheie secretă de acces Amazon S3 ce va fi folosită la încărcarea imaginilor." + s3_region: "Numele regiunii Amazon S3 ce va fi folosit la încărcarea imaginilor." + s3_cdn_url: "URL-ul CDN care să fie folosit pentru toate resursele s3 (de exemplu: https://cdn.somewhere.com). ATENȚIE: după schimbarea acestui parametru trebuie regenerate toate postările existente." + avatar_sizes: "Lista mărimilor avatarurilor generate automat." + external_system_avatars_enabled: "Folosiți un serviciu extern de sisteme de avataruri" + external_system_avatars_url: "URL-ul serviciului extern de sisteme de avataruri. Înlocuirile permise sunt {username} {first_letter} {color} {size}" + default_opengraph_image_url: "URL-ul pentru imaginea implicită pentru Open Graph" + twitter_summary_large_image_url: "URL-ul pentru imaginea implicită pentru imaginea card cu rezumatul Twitter (trebuie să aibă minim 280px lățime și 150px înălțime)." + allow_all_attachments_for_group_messages: "Permite toate atașamentele de email pentru mesajele de grup." + convert_pasted_images_to_hq_jpg: "Convertiți imaginile lipite în fișiere JPG de înaltă calitate." + convert_pasted_images_quality: "Calitatea fișierului JPG convertit (1 este cea mai slabă calitate, 100 este cea mai bună calitate)." + enable_flash_video_onebox: "Activează încastrarea adreselor swf și flv (Adobe Flash) în onebox. ATENȚIE: poate aduce riscuri de securitate." default_invitee_trust_level: "Nivelul de încredere implicit (0-4) pentru utilizatorii invitați." - min_trust_to_create_topic: "Nivelul de încredere minim necesar pentru a creea o discuție nouă." + default_trust_level: "Nivelul de încredere implicit (0-4) pentru toți noii utilizatori. ATENȚIE! Schimbarea acestui parametru crește serios riscul de spam." + tl1_requires_topics_entered: "Câte subiecte trebuie să posteze un utilizator nou înainte să fie promovat la nivelul de încredere 1." + tl1_requires_read_posts: "Câte postări trebuie să citească un utilizator nou înainte să fie promovat la nivelul de încredere 1." + tl1_requires_time_spent_mins: "Câte minute trebuie să petreacă un utilizator nou citind postări înainte să fie promovat la nivelul de încredere 1." + tl2_requires_topics_entered: "Câte subiecte trebuie să posteze un utilizator înainte să fie promovat la nivelul de încredere 2." + tl2_requires_read_posts: "Câte postări trebuie să citească un utilizator înainte să fie promovat la nivelul de încredere 2." + tl2_requires_time_spent_mins: "Câte minute trebuie să petreacă un utilizator citind postări înainte să fie promovat la nivelul de încredere 2." + tl2_requires_days_visited: "Câte zile trebuie să viziteze un utilizator site-ul înainte să fie promovat la nivelul încredere 2." + tl2_requires_likes_received: "Câte aprecieri trebuie să primească un utilizator înainte să fie promovat la nivelul încredere 2." + tl2_requires_likes_given: "Câte aprecieri trebuie să acorde un utilizator înainte să fie promovat la nivelul încredere 2." + tl2_requires_topic_reply_count: "La câte subiecte trebuie să răspundă un utilizator înainte să fie promovat la nivelul de încredere 2." + tl3_time_period: "Cerințele (în zile) cu privire la perioada de timp pentru nivelul de încredere 3" + tl3_requires_days_visited: "Numărul minim de zile pe care un utilizator trebuie să le fi petrecut vizitând site-ul în ultimele (tl3 time period) zile pentru a se califica la promovarea la nivelul de încredere 3. Setați o valoare mai mare decât perioada de timp pentru nivelul de încredere 3 pentru a dezactiva promovarea la nivelul de încredere 3 (0 sau mai mult)" + tl3_requires_topics_replied_to: "Numărul minim de subiecte la care trebuie să răspundă un utilizator în ultimele (tl3 time period) zile pentru a se putea califica la promovarea la nivelul de încredere 3. (0 sau mai mult)." + tl3_requires_topics_viewed: "Procentul de subiecte create în ultimele (tl3 time period) zile pe care un utilizator trebuie să le fi vizualizat pentru a se califica la promovarea la nivelul de încredere 3. (0 la 100)" + tl3_requires_topics_viewed_cap: "Numărul maxim necesar de subiecte vizualizate în ultimele (tl3 time period) zile." + tl3_requires_posts_read: "Procentul de postări create în ultimele (tl3 time period) zile pe care un utilizator trebuie să le vizualizeze pentru a fi promovat la nivelul de încredere 3. (0 la 100)" + tl3_requires_posts_read_cap: "Numărul maxim necesar de postări citite în ultimele (tl3 time period) ziile." + tl3_requires_topics_viewed_all_time: "Numărul minim de subiecte pe care un utilizator trebuie să le vizualizeze pentru a fi promovat la nivelul de încredere 3." + tl3_requires_posts_read_all_time: "Numărul minim de postări pe care un utilizator trebuie să le citească pentru a fi promovat la nivelul de încredere 3." + tl3_requires_max_flagged: "Utilizatorul trebuie să nu fi citit mai mult de x postări marcate cu marcaje de avertizare de x utilizatori în ultimele (tl3 time period) zile pentru a fi promovat la nivelul de încredere 3, unde x este valoarea acestei setări. (0 lau mai mult)" + tl3_promotion_min_duration: "Numărul minim de zile cât durează promovarea la nivelul de încredere 3, înainte ca utilizatorul să fie retrogradat la nivelul de încredere 2." + tl3_requires_likes_given: "Numărul minim de aprecieri care trebuie să fie acordate în ultimele (tl3 time period) zile pentru promovarea la nivelul de încredere 3." + tl3_requires_likes_received: "Numărul minim de aprecieri care trebuie să fie primite în ultimele (tl3 time period) zile pentru promovarea la nivelul de încredere 3." + tl3_links_no_follow: "Nu scoate parametrul rel=nofollow din linkurile postate de utilizatori cu nivelul de încredere 3." + min_trust_to_create_topic: "Nivelul de încredere minim necesar pentru a crea un subiect nou." min_trust_to_edit_wiki_post: "Nivelul de încredere minim necesar pentru a edita o postare marcată ca wiki." - newuser_max_links: "Câte adrese poare un utilizator nou adauga la o postare." - newuser_max_images: "Câte imagini poate un utilizator nou adauga la o postare." - newuser_max_attachments: "Câte atașamente poate un utilizator nou adauga la o postare." - newuser_max_mentions_per_post: "Numărul maxim de notificări de @nume poate folosii un utilizator nou într-o postare." - newuser_max_replies_per_topic: "Numărul maxim de răspunsuri un utilizator nou poate adăuga într-o singură discuție până când cineva le răspunde." - max_mentions_per_post: "Numărul maxim de notificări de @nume oricine poate folosii într-o postare." - create_thumbnails: "Creează previzualizari de tipul thumbnail și lightbox ale imaginilor ce sunt prea mari să încapă într-o postare." - email_time_window_mins: "Așteaptă (n) minute până să trimiți orice email de notificare, pentru a da utilizatorilor șansa să-și editeze și să-și finalizeze postările." - email_posts_context: "Câte răspunsuri precedente să fie incluse ca context în email-urile de notificare." - flush_timings_secs: "Cât de frecvent se resetează timpul de pe server, în secunde." - title_min_entropy: "Minimul de entropie (caractere unice, non-engelze ce definesc mai multe elemente) necesară pentru un titlu de discuție." - body_min_entropy: "Minimul de entropie (caractere unice, non-engleze ce definesc mai multe elemente) necesară pentru conținutul unei postari." - title_fancy_entities: "Convertește caracterele ASCII cunoscute în entități HTML în titluri de discuție, ex SmartyPants http://daringfireball.net/projects/smartypants/" - min_title_similar_length: "Lungimea minimă a unui titlu înainte să fie verificat pentru discuții similare." - min_body_similar_length: "Lungimea minimă a conțin utului unei postări până să fie verificată pentru discuții similare." - category_colors: "O listă de culori în sistemul hexadecimal permise pentru categorii." + min_trust_to_edit_post: "Nivelul de încredere minim necesar pentru a edita postări." + min_trust_to_allow_self_wiki: "Nivelul de încredere minim necesar pentru transformarea propriilor mesaje în wiki." + min_trust_to_send_messages: "Nivelul minim de încredere necesar pentru a crea noi mesaje private." + newuser_max_links: "Câte linkuri poate adăuga un nou utilizator într-o postare." + newuser_max_images: "Câte imagini poate adăuga un nou utilizator într-o postare." + newuser_max_attachments: "Câte atașamente poate adăuga un nou utilizator într-o postare." + newuser_max_mentions_per_post: "Numărul maxim de notificări @nume pe care le poate folosi un nou utilizator într-o postare." + newuser_max_replies_per_topic: "Numărul maxim de răspunsuri pe care un utilizator nou le poate adăuga într-un singur subiect înainte ca cineva să răspundă." + max_mentions_per_post: "Numărul maxim de notificări de @nume pe care le poate folosi oricine într-o postare." + max_users_notified_per_group_mention: "Numărul maxim de utilizatori care pot primi o notificare dacă un grup este menționat (dacă pragul este atins, nici o notificare nu va fi trimisă)" + create_thumbnails: "Creează previzualizări de tipul thumbnail și lightbox ale imaginilor ce sunt prea mari să încapă într-o postare." + email_time_window_mins: "Așteaptă (n) minute până să trimiți un email de notificare, pentru a da utilizatorilor șansa să-și editeze și să-și finalizeze postările." + private_email_time_window_seconds: "Așteaptă (n) secunde înainte de a trimite emailuri de notificare privată, pentru a-i da utilizatorului șansa să își editeze sau finalizeze mesajele." + email_posts_context: "Câte răspunsuri precedente să fie incluse drept context în email-urile de notificare." + flush_timings_secs: "Cât de frecvent se resetează datele legate de timp de pe server, în secunde." + title_max_word_length: "Numărul maxim de caractere din titlul unui subiect." + title_min_entropy: "Minimul de entropie (exprimată în număr de caractere unice, cele non-englezești contând ca mai multe caractere) necesar pentru un titlu de subiect." + body_min_entropy: "Entropia minimă (caractere unice, cele ne-englezești contează mai mult) necesară în conținutul unei postări." + allow_uppercase_posts: "Permite toate caracterele majuscule în titlul subiectului sau în conținutul postării." + title_fancy_entities: "Convertește caracterele ASCII cunoscute în entități HTML în titluri de subiect, ex SmartyPants http://daringfireball.net/projects/smartypants/" + min_title_similar_length: "Lungimea minimă a unui titlu înainte să fie verificat pentru subiecte similare." + min_body_similar_length: "Lungimea minimă a conținutului unei postări până să fie verificată pentru subiecte similare." + desktop_category_page_style: "Stil vizual pentru pagina /categories ." + category_colors: "O listă hexazecimală de valori de culori permise pentru categorii." + category_style: "Stil vizual pentru categoria ecusoane." max_image_size_kb: "Mărimea maximă a unei imagini încărcate în kB. Aceasta trebuie configurată în nginx (client_max_body_size) / apache sau proxy." - max_attachment_size_kb: "arimea maximă a unui atașament de fișiere încărcate în Kb. Aceasta trebuie configurata în nginx (client_max_body_size) / apache sau proxy." - authorized_extensions: "O listă de extensii de fișiere permise pentru încărcare (folosiți '*' to pentru activarea tuturor tipurilor de fișiere)" - max_similar_results: "Câte discuții similare să apară deasupra editorului la compunerea unei noi discuții? Comparația se face pe titlu și conținut." - title_prettify: "Preveniți greșelile comune și erorile , incluzând toate majuscule, literă mică pentru primul caracter, multtiple ! și ?, extra . la sfârșit, etc." - topic_views_heat_low: "După atât de multe vizualizări, discuția este parțial luminată." - topic_views_heat_medium: "După atât de multe vizualizări, discuția este moderat luminată." - topic_views_heat_high: "După atât de multe vizualizări, discuția este puternic luminată." - faq_url: "Dacă aveți un FAQ găzduit în altă parte pe care doriți să-l folosiți, postați întregul URL aici." - tos_url: "Dacă aveți un document Termeni și condiții găzduit în altă parte pe care doriți să-l folosiți, postați întregul URL aici." - privacy_policy_url: "Dacă aveți un document de Politica de Confidențialitate găzduit în altă parte, pe care a-ți dorii să-l folosiți, postați întregul URL aici." - white_listed_spam_host_domains: "O listă de domenii exclusă pentru testarea spam. Utilizatorii nu vor fi niciodată restricționați în a crea postări cu adrese către aceste domenii." - staff_like_weight: "Cat de mare este factorul de adaos pentru a trimite aprecieri personalului." - levenshtein_distance_spammer_emails: "Când se face potrivirea email-urilor spam, numărul de caractere diferite care permit o potrivire aproximată." - reply_by_email_enabled: "Activează răspunsurile către discuții prin email." - reply_by_email_address: "Șablonul pentru răspunsuri prin email la email-urile de venire, de exemeplu: %{reply_key}@reply.example.com sau răspunsuri+%{reply_key}@example.com" - email_prefix: "[Eticheta] e folosită în subiectul email-ului. Va fi din oficiu \"titlul\" dacă nu este modificată." - email_site_title: "Titlul site-ului folosit ca expeditor de email-uri trimsie de site. Din oficiu ca 'titlu' dacă nu este setat. Dacă 'titlul' conține caractere care nu sunt permise în email , folosiți această setare." - minimum_topics_similar: "Câte discuții este nevoie să existe până ce câmpul discuții similare este prezent când se compune o discuție nouă." - relative_date_duration: "Numărul de zile după postare când datele de postare vor fi relative (7z) în loc de absolute (20 Feb)." - delete_user_max_post_age: "Nu permite ștergerea utilizatorilor ale căror prima postare e mai veche de (x) de zile." - delete_all_posts_max: "Numărul maxim de postări ce pot fi șterse deodată folosind butonul Șterge toate postările. Dacă un utilizator are mai multe postări decât această valoare, postările nu pot fi șterse toate odată și utilizatorul nu poate fi șters." + max_attachment_size_kb: "Mărimea maximă a unui atașament de fișiere încărcate în Kb. Aceasta trebuie configurata în nginx (client_max_body_size) / apache sau proxy." + authorized_extensions: "O listă de extensii de fișiere permise la încărcare (folosiți '*' pentru activarea tuturor tipurilor de fișiere)" + max_similar_results: "Câte subiecte similare vor fi afișate deasupra editorului atunci când se compune un subiect nou. Comparația se face după titlu și pe conținut." + title_prettify: "Repară greșelile comune și erorile, incluzând toate majuscule, literă mică pentru primul caracter, multiple ! și ?, extra . la sfârșit, etc." + topic_views_heat_low: "După acest număr de vizualizări, câmpul vizualizări este ușor evidențiat." + topic_views_heat_medium: "După acest număr de vizualizări, câmpul vizualizări este moderat evidențiat." + topic_views_heat_high: "După acest număr de vizualizări, câmpul vizualizări este puternic evidențiat." + cold_age_days_low: "După acest număr de zile de conversație, data ultimei activități este ușor estompată." + cold_age_days_medium: "După acest număr de zile de conversație, data ultimei activități este moderat estompată." + cold_age_days_high: "După acest număr de zile de conversație, data ultimei activități este puternic estompată." + history_hours_low: "Numărul de ore în cadrul cărora o postare editată are indicatorul de editare ușor pus în evidență." + history_hours_medium: "Numărul de ore în cadrul cărora o postare editată are indicatorul de editare moderat pus în evidență." + history_hours_high: "Numărul de ore în cadrul cărora o postare editată are indicatorul de editare puternic pus în evidență." + topic_post_like_heat_low: "După ce raportul aprecieri/postare depășește această valoare, câmpul contor de postări va fi ușor pus în evidență." + topic_post_like_heat_medium: "După ce raportul aprecieri/postare depășește această valoare, câmpul contor de postări va fi moderat pus în evidență." + topic_post_like_heat_high: "După ce raportul aprecieri/postare depășește această valoare, câmpul contor de postări va fi puternic pus în evidență." + faq_url: "Dacă ai un FAQ găzduit în altă parte pe care dorești să-l folosești, postează-i întregul URL aici." + tos_url: "Dacă ai un document Condițiile generale de utilizare găzduit în altă parte pe care dorești să-l folosești, postează-i întregul URL aici." + privacy_policy_url: "Dacă ai un document cu Politica de Confidențialitate găzduit în altă parte, pe care dorești să-l folosești, postează-i întregul URL aici." + newuser_spam_host_threshold: "De câte ori poate un utilizator nou să posteze un link către aceeași gazdă în limita de `newuser_spam_host_threshold` postări înainte ca să fie considerat spam." + white_listed_spam_host_domains: "O listă de domenii excluse de la testarea gazdelor spam. Noii utilizatori nu vor fi niciodată restricționați să creeze postări cu linkuri către aceste domenii." + staff_like_weight: "Ce pondere adițională să aibă aprecierile de la membrii echipei." + topic_view_duration_hours: "Contorizează încă o vizualizare a unui subiect nou o singură dată per IP/Utilizator la fiecare N ore." + user_profile_view_duration_hours: "Contorizează câte vizualizare de profil utilizator o singură dată per IP/Utilizator la fiecare N ore" + levenshtein_distance_spammer_emails: "Când se face detectarea spam pe bază de potrivire cu un set de criterii, care este diferența de numere de caractere care încă mai permite o potrivire aproximativă (fuzzy match)." + max_new_accounts_per_registration_ip: "Dacă există deja (n) conturi cu nivelul de încredere 0 de la acest IP (și nici unul nu este un membru al echipei sau la NÎ2 sau mai mare), blochează acceptarea de noi înregistrări de la acest IP." + min_ban_entries_for_roll_up: "Când apeși pe butonul Consolidare, dacă există cel puțin (N) înregistrări, se va crea o nouă înregistrare de subrețea blocată" + max_age_unmatched_emails: "șterge înregistrările emailurilor verificate, care nu corespund, după (N) zile." + max_age_unmatched_ips: "șterge adresele de IP verificate, care nu corespund, după (N) zile." + num_flaggers_to_close_topic: "Numărul minim de marcaje de avertizare unice care este necesar pentru a suspenda un subiect în vederea intervenției." + num_flags_to_close_topic: "Numărul minim de marcaje de avertizare active care este necesar pentru a suspenda un subiect în vederea intervenției" + auto_respond_to_flag_actions: "Activează răspunsul automat la gestionarea unui marcaj de avertizare." + min_first_post_typing_time: "Durata de timp minimă în milisecunde cât este nevoie ca un utilizator să tasteze la prima postare, dacă acest prag nu este atins postarea va intra automat în coada mesajelor care necesită aprobare. Valoarea 0 dezactivează (nerecomandat)" + auto_block_fast_typers_on_first_post: "Blochează automat utilizatorii care nu întrunesc min_first_post_typing_time" + auto_block_fast_typers_max_trust_level: "Nivelul maxim de încredere pentru a-i bloca automat pe cei care scriu rapid la tastatură" + auto_block_first_post_regex: "Un regex care nu ține cont de majuscule și minuscule va determina prima postare a utilizatorului să fie blocată și trimisă în coada de aprobare. Exemplu: raging|a[bc]a va determina toate postările care conțin raging sau aba sau aca să fie blocate din prima. Se aplică doar la prima postare." + reply_by_email_enabled: "Activează răspunsurile către subiecte prin email." + reply_by_email_address: "șablon pentru răspuns prin email de intrare, de exemplu: %{reply_key}@reply.example.com sau răspunsuri+%{reply_key}@example.com" + alternative_reply_by_email_addresses: "Listă de șabloane alternative pentru adresele de email primite cu răspunsuri prin email. Exemplu: %{reply_key}@reply.example.com|replies+%{reply_key}@example.com" + incoming_email_prefer_html: "Folosește HTML în loc de text pentru emailurile primite. Poate provoca probleme neașteptate de formatare!" + disable_emails: "Oprește Discourse să trimite absolut orice fel de emailuri" + strip_images_from_short_emails: "Scoate imaginile din emailurile care au mai puțin de 2800 de Bytes" + short_email_length: "Lungime de email scurt în Bytes" + display_name_on_email_from: "Afișează numele complete în câmpul From din email" + unsubscribe_via_email: "Permite utilizatorilor să se dezaboneze de la emailuri prin trimiterea unui email cu cuvântul 'unsubscribe' în subiect sau în corpul mesajului." + unsubscribe_via_email_footer: "Include un link de dezabonare prin email mailto: în partea de jos a emailurilor trimise." + delete_email_logs_after_days: "șterge rapoartele după (N) zile. 0 pentru a le ține nedeterminat. " + max_emails_per_day_per_user: "Numărul maxim de emailuri de trimis utilizatorilor pe zi. 0 pentru a dezactiva limita" + enable_staged_users: "Creează în mod automat utilizatori în așteptare pe parcursul procesării emailurilor primite." + maximum_staged_users_per_email: "Numărul maxim de utilizatori în așteptare creați la procesarea unui email primit." + auto_generated_whitelist: "Lisă de adrese de email care nu vor fi verificate dacă au conținut autogenerat. Exemplu: foo@bar.com|discourse@bar.com" + block_auto_generated_emails: "Blochează emailurile care sunt identificate ca fiind auto-generate." + ignore_by_title: "Ignoră emailurile care sosesc, pe baza titlurilor lor." + mailgun_api_key: "Cheie API secretă pentru Mailgun folosită la verificarea mesajelor webhook." + soft_bounce_score: "Rata de ricoșeu adăugată unui utilizator atunci când se produce un ricoșeu temporar." + hard_bounce_score: "Rata de ricoșeu adăugată unui utilizator atunci când se produce un ricoșeu permanent." + bounce_score_threshold: "Rata maximă de ricoșeu înainte să nu îi mai trimitem emailuri utilizatorului." + bounce_score_threshold_deactivate: "Rata maximă de ricoșeu înainte să dezactivăm utilizatorul." + reset_bounce_score_after_days: "Resetează automat rata de ricoșeu după X zile." + attachment_content_type_blacklist: "Lista cuvintelor cheie folosite pentru filtrarea atașamentelor în funcție de tipul de conținut." + attachment_filename_blacklist: "Lista cuvintelor cheie folosite la filtrarea atașamentelor în funcție de numele fișierului." + enable_forwarded_emails: "[BETA] Permite utilizatorilor să creeze un subiect prin forward-area unui email." + always_show_trimmed_content: "Arată întotdeauna partea trunchiată a emailurilor sosite. ATENȚIE: s-ar putea dezvălui adresele de email." + manual_polling_enabled: "Trimite emailuri folosind API-ul pentru răspunsuri prin email." + pop3_polling_enabled: "Folosește POP3 pentru răspunsuri prin email." + pop3_polling_ssl: "Folosește SSL pentru conexiunile cu serverul POP3. (Recomandat)" + pop3_polling_openssl_verify: "Verifică certificatul server TLS (Implicit: activat)" + pop3_polling_period_mins: "Prioada în minute între fiecare verificare a contului POP3 pentru emailuri. NOTA: necesită restart." + pop3_polling_port: "Portul pentru retragerea emailurilor din contul POP3." + pop3_polling_host: "Gazda pentru retragerea emailurilor prin POP3." + pop3_polling_username: "Numele de utilizator al contului POP3 pentru retragerea emailurilor." + pop3_polling_password: "Parola contului de POP3 pentru retragerea emailurilor." + log_mail_processing_failures: "Înregistrează toate erorile de procesare la http://yoursitename.com/logs" + email_in: "Permite utilizatorilor să posteze noi subiecte prin email (necesită retragere de emailuri prin POP3). Configurează adresa în tab-ul \"Setări\" al fiecărei categorii." + email_in_min_trust: "Nivelul minim de încredere de care are nevoie un utilizator pentru a i se permite să posteze noi subiecte prin email." + email_prefix: "[Eticheta] e folosită în subiectul email-ului. Implicit va fi \"titlul\", dacă nu este setată altfel." + email_site_title: "Titlul site-ului folosit ca expeditor de email-uri trimise de site. Implicit va fi 'titlu', dacă nu este setat altfel. Dacă 'titlul' conține caractere care nu sunt permise în email, folosiți această setare." + minimum_topics_similar: "Câte subiecte trebuie să existe deja până ce câmpul subiecte similare este prezent când se compune o discuție nouă." + relative_date_duration: "Numărul de zile după crearea unei postări cât data postării va sta afișată în format relativ (7z) în loc de format absolut (20 Feb)." + delete_user_max_post_age: "Nu permite ștergerea utilizatorilor a căror prima postare e mai veche de (x) de zile." + delete_all_posts_max: "Numărul maxim de postări ce pot fi șterse deodată folosind butonul șterge toate postările. Dacă un utilizator are mai multe postări decât această valoare, postările sale nu pot fi șterse dintr-o dată și utilizatorul nu poate fi șters." username_change_period: "Numărul de zile după înregistrare în care conturile își pot schimba numele de utilizator (0 la nu permite schimbarea numelui de utilizator)." - email_editable: "Permite utilizatorilor să schimbe propria adresa de email după înregistrare." - automatically_download_gravatars: "Descarcă Gravatare pentru utilizatori la crearea contului sau schimbarea email-ului." - max_daily_gravatar_crawls: "Numărul maxim de verificări făcute de Discourse pentru existența unui gravatar preferențial într-o zi" + email_editable: "Permite utilizatorilor să își schimbe adresa de email după înregistrare." + logout_redirect: "URL-ul spre care să fie redirecționat browserul după ieșire (ex: http://somesite.com/logout)" + allow_uploaded_avatars: "Permite utilizatorilor să încarce o poză de profil personalizate." + allow_animated_avatars: "Permite utilizatorilor să folosească gif-uri animate în pozele de profil. ATENȚIE: după schimbarea acestei opțiuni trebuie să lansezi un rake task specific, respectiv - avatars:refresh " + allow_animated_thumbnails: "Generează thumbnails animate pentru gif-uri animate." + default_avatars: "URL-urile avatarelor care vor fi folosite implicit pentru noii utilizatori până ce aceștia le vor schimba." + automatically_download_gravatars: "Descarcă Gravatare pentru utilizatori după crearea contului sau schimbarea email-ului." + digest_topics: "Numărul maxim de subiecte notorii care să fie afișate în rezumatul pe email." + digest_posts: "Numărul maxim de postări notorii care să se afișeze în rezumatul-email." + digest_other_topics: "Numărul maxim de subiecte care să fie afișate în secțiunea „Noutăți în subiectele și categoriile pe care le urmărești” din rezumatul pe email." + digest_min_excerpt_length: "Lungimea minimă (în caractere) a extraselor de postări, ce vor fi incluse în emailul-rezumat." + delete_digest_email_after_days: "Nu trimite emailuri-rezumat utilizatorilor care nu au fost văzuți pe site de mai mult de (n) zile." + digest_suppress_categories: "Nu include aceste categorii în emailurile-rezumat." + disable_digest_emails: "Dezactivează emailurile-rezumat pentru toți utilizatorii." + email_accent_bg_color: "Culoarea accent care să fie folosită ca fundal pentru unele elemente din emailurile HTML. Introdu numele culorii („roșu”) sau valoarea hex ('#FF000')." + email_accent_fg_color: "Culoarea textului redat pe culoarea de fundal a emailurilor HTML. Introdu un nume de culoare („alb”) sau o valoare hex ('#FFFFFF')." + email_link_color: "Culoarea link-urilor din emailurile HTML. Introdu un nume de culoare („albastru”) sau o valoare hex ('#0000FF')." + detect_custom_avatars: "Dacă sau nu să verifice dacă utilizatorii și-au încărcat poze de profil personalizate." + max_daily_gravatar_crawls: "Numărul maxim zilnic de verificări pe care Discourse le va face pe Gravatar pentru a vedea dacă există avatare personalizate." + public_user_custom_fields: "O listă albă cu câmpuri personalizate pentru utilizator, ce se pot afișa public." + staff_user_custom_fields: "O listă albă cu câmpuri personalizate pentru utilizator care pot fi vizualizate de membrii echipei." + enable_user_directory: "Furnizează un „carte de telefon” cu utilizatorii" + allow_anonymous_posting: "Permite utilizatorilor să comute pe modul anonim" + anonymous_posting_min_trust_level: "Nivelul minim de încredere necesar pentru a putea activa postarea anonimă." + anonymous_account_duration_minutes: "Pentru protejarea anonimității, creează un nou cont anonim la fiecare N minute pentru fiecare utilizator. Exemplu: dacă e setat la 600, imediat ce au trecut 600 de minute de la ultima postare șI utilizatorul a comutat pe anonim, va fi creat un nou cont anonim." + hide_user_profiles_from_public: "Dezactivează cardurile, profilurile și „cartea de telefon” pentru utilizatorii anonimi." allow_profile_backgrounds: "Permite utilizatorilor să încarce fundaluri de profil." - enable_mobile_theme: "Dispozitivele mobile folosesc o temă cu abilitatea de a schimba la întregul site. Dezactivați pentru a folosii un foiae de stil preferențiala ce este total compatibilă." - dominating_topic_minimum_percent: "Ce procent din postări într-o discuție trebuie să facă un utilizator înainte de ai fi amintit că domină discuția." - suppress_uncategorized_badge: "Nu arăta insigna pentru discuțiile fără categorie în lista de discuții." - global_notice: "Arata un banner GLOBAL ,de URGENȚĂ pentru notificarea tuturor vizitatorilor, lasă nebifat pentru a-l ascunde (HTML permis)." - disable_edit_notifications: "Folosit la dezactivarea notificărilor de editare când se activează funcția 'downloadeaya_imagini_legatură_local' din setările siteului." - display_name_on_posts: "Arată numele complet al utilizatorului pe postare adițional @numelui de utilizator." - invites_per_page: "Invitațiile din oficiu sunt arătate pe pagina utilizatorului." - short_progress_text_threshold: "După ce numărul de postări într-o discuție e mai mare decât acest număr, bară de progres va afișa doar numărul postări. Dacă schimbați lățimea barei de progres, va fi nevoie să schimbați valoarea." - default_code_lang: "Sintaxa de limbaj de programare aplicată la blocarea de cod GitHub (limba-auto, ruby, python etc.)" - warn_reviving_old_topic_age: "Când cineva răspunde la o discuție unde ultimul răspuns e mai vechi decât atâtea zile, un mesaj va fi arătat. dezactivați prin alegerea cifrei 0." - autohighlight_all_code: "Forțează aplicarea de iluminat cod către toate preformatările de blocări de cod chiar când este explicit specificată limba." - feed_polling_enabled: "DOAR ÎNCORPOREAZĂ: Să încorporeze un RSS/ATOM ca postare." - feed_polling_url: "DOAR ÎNCORPOREAZĂ: URL de RSS/ATOM să încorporeze." - embed_by_username: "Utilizatorul care creează subiecte embedded." - embed_username_key_from_feed: "Discourse username of the user who creates the embedded topics.." - embed_truncate: "Truncate the embedded posts." - embed_post_limit: "Numărul maxim de postări de încorporat." + sequential_replies_threshold: "Numărul de postări succesive pe care un utilizator trebuie sa le facă într-un subiect înainte să i se reamintească că a postat un număr excesiv de postări succesive." + enable_mobile_theme: "Dispozitivele mobile folosesc o temă cu abilitatea de a schimba la întregul site. Dezactivează pentru a folosi o foiae de stil personalizată ce este total responsivă." + dominating_topic_minimum_percent: "Ce procent din postările unui subiect trebuie să scrie un utilizator înainte de i se aminti că domină excesiv subiectul." + disable_avatar_education_message: "Dezactivează mesajul educațional pentru schimbarea avatarului." + suppress_uncategorized_badge: "Nu arăta ecusonul pentru subiectele fără categorie în lista de subiecte." + permalink_normalizations: "Aplică următorul regex înainte de a detecta permalink-urile, de exemplu: /(topic.*)\\?.*/\\1 va elimina șirurile de interogare din căile subiectelor. Formatul este regex+șir folosește \\1 etc.pentru a capturarea secvențelor" + global_notice: "Afișează o notificare de tip banner global URGENT, URGENȚĂ pentru toți vizitatori, lasă gol pentru a-l ascunde (HTML permis)." + disable_edit_notifications: "Deactivează editarea notificărilo de către utilizator atunci când setarea 'download_remote_images_to_local' este activată." + automatically_unpin_topics: "Desprinde automat subiecte când utilizatorul ajunge la sfârșitul paginii." + read_time_word_count: "Contor de cuvinte pe minut pentru calcularea timpului estimat de citire." + topic_page_title_includes_category: "Titlul paginii subiectului include un nume de categorie." + max_prints_per_hour_per_user: "Numărul maxim de amprente de vizualizare lăsate pentru /print (0 pentru dezactivare)" + full_name_required: "Numele întreg este un câmp obligatoriu în profilul utilizator." + enable_names: "Afișează numele întreg al utilizatorului în profilul său, în cardul utilizator și în emailuri. Dezactivează pentru ascunde numele peste tot." + display_name_on_posts: "Arată atât numele complet cât și numele de utilizator în postări." + show_time_gap_days: "Dacă două postări sunt create la acest număr de zile distantă una de alta, afișează decalajul în subiect." + invites_per_page: "Invitațiile implicite sunt afișate pe pagina utilizatorului." + short_progress_text_threshold: "După ce numărul de postări într-un subiect devine mai mare decât acest număr, bara de progres va afișa doar numărul postării curente. Dacă schiimbi lățimea barei de progres, va trebui să schimbi această valoare." + default_code_lang: "Evidențierea de sintaxa de limbaj de programare aplicată implicit blocurilor de cod GitHub (lang-auto, Ruby, Python etc.)" + warn_reviving_old_topic_age: "Când cineva răspunde la un subiect unde ultimul răspuns e mai vechi decât atâtea zile, va fi afișată o avertizare. Dezactivează prin alegerea cifrei 0." + autohighlight_all_code: "Forțează aplicarea de punere în evidență cod pe toate blocurile de cod preformatate, chiar și atunci când nu le este explicit specificată limba." + highlighted_languages: "Regulile e evidențiere sintactică. (Atenție: includerea de prea multe limbaje va avea un impact asupra performanței) vezi: https://highlightjs.org/static/demo/ pentru un demo" + feed_polling_enabled: "EXCLUSIV ÎNCORPORARE: Dacă să încorporeze un flux RSS/ATOM ca postări." + feed_polling_url: "EXCLUSIV ÎNCORPORARE: URL fluxului RSS/ATOM care să fie încorporat." + embed_by_username: "Numele utilizator Discourse al utilizatorului care creează subiecte embedded." + embed_username_key_from_feed: "Cheie pentru extragerea numelui utilizator din flux." + embed_title_scrubber: "Expresie regulată pentru curățarea titlurile integrabile." + embed_truncate: "Retează postările încorporate." + allowed_href_schemes: "Alte tipuri de linkuri permise, în afară de http și https." + embed_post_limit: "Numărul maxim de postări care să fie încorporate." + embed_username_required: "Numele utilizator pentru acest subiect este obligatoriu." embed_whitelist_selector: "Selector CSS pentru elementele ce sunt permise în încorporări." - embed_blacklist_selector: "Selector CSS pentru elementele ce sunt scoase din încorporări" - notify_about_flags_after: "Dacă sunt marcaje ce nu au fost aranjate după atâtea ore, Trimite un email la email-ul de contact . Setați 0 pentru a dezactiva." - enable_cdn_js_debugging: "Permite /rapoarte să afișeze erori adăugând permisiune crossorigin tuturor js-urilor incluse." - show_create_topics_notice: "Dacă site-ul are mai puțin de 5 discuții publice, afișează o notificare ce cere adminilor să creeze discuții." + embed_blacklist_selector: "Selector CSS pentru elementele ce sunt șterse din încorporări" + notify_about_flags_after: "Dacă sunt marcaje ce nu au fost aranjate după atâtea ore, trimite un email către email-ul de contact . Setează la 0 pentru a dezactiva." + show_create_topics_notice: "Dacă site-ul are mai puțin de 5 subiecte publice, afișează o notificare prin care se cere adminilor să creeze subiecte." + delete_drafts_older_than_n_days: șterge drafturile mai vechi de (n) zile. + bootstrap_mode_min_users: "Numărul minim de utilizatori necesar pentru dezactivarea modului bootstrap (0 pentru dezactivare)" + vacuum_db_days: "Rulează VACUUM ANALYZE pentru a recupera spațiul din baza de date după o migrare (0 pentru dezactivare)" + prevent_anons_from_downloading_files: "Blochează utilizatorii anonimi de la descărcarea de atașamente. ATENȚIE: aceasta va face ca toate resursele site-ului care sunt postate ca atașamente să nu mai meargă." + slug_generation_method: "Alege o metodă de generare de identificator. 'encodat' va genera șir de caractere encodate cu procentaje. 'nimic' va dezactiva complet identificatorii." enable_emoji: "Activează emoji" + emoji_set: "Cum ți-ar placea să fie emoji tăi?" + enforce_square_emoji: "Forțează un aspect pătrățos la toti emoji." + approve_post_count: "Numărul de postări de la un utilizator simplu trebuie să fie aprobat" + approve_unless_trust_level: "Postările utilizatorilor care au un nivel de încredere mai mic decât acesta trebuie să fie aprobate." + approve_new_topics_unless_trust_level: "Crearea de subiecte noi pentru utilizatorii care se află sub acest nivel de încredere, trebuie aprobată" + notify_about_queued_posts_after: "Dacă există postări care au așteptat să fie verificate mai mult de atâtea ore, un email va fi trimis către contact_email. Setează la 0 pentru a dezactiva aceste emailuri." + auto_close_messages_post_count: "Numărul maxim de postări permise într-un mesaj privat înainte să fie închis automat (0 pentru dezactivare) " + auto_close_topics_post_count: "Numărul maxim de postări permise într-un subiect înainte ca acesta să fie închis automat (0 pentru dezactivare)" + code_formatting_style: "Butonul Cod din cadrul editorului va fi setat cu opțiunea implicită pe acest stil de formatare cod " + default_email_digest_frequency: "Frecvența implicită cu care utilizatorii primesc emailuri-rezumat." + default_include_tl0_in_digests: "Implicit, include postări de la utilizatori noi în emailurile-rezumat. Utilizatorii pot schimba această opțiune din preferințele lor." + default_email_private_messages: "Implicit, trimite un email atunci când cineva trimite un mesaj unui utilizator." + default_email_direct: "Implicit, trimite un mesaj când cineva citează/răspunde/menționează sau invită un utilizator." + default_email_mailing_list_mode: "Implicit, trimite un email pentru fiecare nou mesaj." + default_email_mailing_list_mode_frequency: "Implicit, utilizatorii care activează modul mailing list vor primi emailuri cu această frecvență." + disable_mailing_list_mode: "Anulează utilizatorilor permisiunea de a activa modul mailing list." + default_email_always: "Implicit, trimite o notificare prin email chiar și atunci când utilizatorul este activ." + default_email_previous_replies: "Implicit, include răspunsurile anterioare în emailuri." + default_email_in_reply_to: "Implicit, include în email un extras postarea căreia i se răspunde." + default_other_new_topic_duration_minutes: "Condiție implicită globală referitoare la durata timpului pentru care subiectul este considerat nou" + default_other_auto_track_topics_after_msecs: "Durata de timp implicită la nivel global înainte ca un subiect să fie urmărit în mod automat." + default_other_notification_level_when_replying: "Nivelul global implicit de notificare atunci când un utilizator răspunde la un subiect." + default_other_external_links_in_new_tab: "Implicit, deschide link-urile externe în taburi noi." + default_other_enable_quoting: "Implicit, activează citarea textului evidențiat." + default_other_dynamic_favicon: "Implicit, arată contorul de subiecte noi/actualizate în icoana browserului." + default_other_disable_jump_reply: "Implicit, nu sări la postarea utilizatorului după ce a răspuns." + default_other_like_notification_frequency: "Implicit, notifică utilizatorul la primirea de aprecieri." + default_topics_automatic_unpin: "Desprinde automat subiecte din fixate la vârf, atunci când utilizatorul ajunge la sfârșitul paginii." + default_categories_watching: "Implicit, listează categoriile care sunt urmărite în mod activ." + default_categories_tracking: "Implicit, listează categoriile care sunt urmărite." + default_categories_muted: "Implicit, listează categoriile care sunt setate pe silențios." + default_categories_watching_first_post: "Lista categoriilor în care prima postare din fiecare topic va fi urmărită activ în mod implicit." + max_user_api_reqs_per_day: "Numărul maxim de interogări API utilizator pe cheie, pe zi. " + max_user_api_reqs_per_minute: "Numărul maxim de interogări API utilizator pe cheie, pe minut. " + allow_user_api_keys: "Permite generarea de chei API pentru utilizator" + allow_user_api_key_scopes: "Lista domeniilor pentru care se permit chei API pentru utilizatori" + max_api_keys_per_user: "Numărul maxim de chei API utilizator pe utilizator" + min_trust_level_for_user_api_key: "Nivelul de încredere necesar pentru generarea de chei API utilizator" + allowed_user_api_auth_redirects: "URL permis pentru redirecționarea autentificării pentru cheile API utilizator " + allowed_user_api_push_urls: "URL-uri permise pentru serviciul push al serverului la API utilizator" + tagging_enabled: "Activează etichetele la subiecte?" + min_trust_to_create_tag: "Nivelul minim de încredere necesar pentru crearea unei etichete." + max_tags_per_topic: "Numărul maxim de etichete care pot fi aplicate unui subiect." + max_tag_length: "Numărul maxim de caractere care poate fi folosit într-o etichetă." + max_tag_search_results: "La căutarea de etichete, numărul maxim de rezultate care să fie afișat." + show_filter_by_tag: "Afișează un drop-down pentru filtrarea unei liste de subiecte după etichetă." + max_tags_in_filter_list: "Numărul maxim de etichete care să se afișeze într-un drop-down filtru. Vor fi afișate etichetele cele mai folosite." + tags_sort_alphabetically: "Afișează etichetele în ordine alfabetică. Implicit, etichetele sunt afișate în ordinea popularității." + tag_style: "Stil vizual pentru ecusoanele etichetă." + staff_tags: "O listă de etichete care nu poate fi aplicată decât de către membrii echipei." + min_trust_level_to_tag_topics: "Nivelul minim de încredere necesar pentru a pune etichete pe subiecte." + suppress_overlapping_tags_in_list: "Dacă etichetele corespund exact cu cuvintele din titlul subiectelor, nu mai afișa aceste etichete." + remove_muted_tags_from_latest: "Nu afișa în lista subiectelor recente, subiectele ce au fost etichetate cu etichete setate pe silențios" + company_short_name: "Numele firmei (scurt)" + company_full_name: "Numele firmei (întreg)" + company_domain: "Domeniul firmei" errors: - invalid_email: "Adresa de email invalidă." - invalid_username: "Nu există utilizator cu acest nume de utilizator." + invalid_email: "Adresă de email invalidă." + invalid_username: "Nu există nici un utilizator cu acest nume de utilizator." invalid_integer_min_max: "Valoarea trebuie să fie între %{min} și %{max}." invalid_integer_min: "Valoarea trebuie să fie %{min} sau mai mare." invalid_integer_max: "Valoarea nu poate fi mai mare de %{max}." invalid_integer: "Valoarea trebuie să fie un întreg." regex_mismatch: "Valoare nu se potrivește formatului cerut." + must_include_latest: "Meniul de sus trebuie să includă tab-ul \"recente\"." invalid_string: "Valoare invalidă." + invalid_string_min_max: "Trebuie să aibă între %{min} și %{max} caractere." + invalid_string_min: "Trebuie să aibă %{min} caractere." + invalid_string_max: "Nu trebuie să depășească %{max} caractere." + invalid_reply_by_email_address: "Valoarea trebuie să conțină '%{reply_key}' și să fie diferită de emailul de notificare." + invalid_alternative_reply_by_email_addresses: "Toate valorile trebuie să conțină '%{reply_key}' și să fie diferite de emailul de notificare." + pop3_polling_host_is_empty: "Trebuie să setezi „numele serverului de POP3” înainte să poți activa retragerea de emailuri prin POP3" + pop3_polling_username_is_empty: "Trebuie să setezi „numele utilizator pe serverul POP3” înainte să poți activa retragerea de emailuri prin POP3." + pop3_polling_password_is_empty: "Trebuie să setezi „parola pe serverul POP3” înainte să poți activa retragerea de emailuri prin POP3." + pop3_polling_authentication_failed: "Autentificarea POP3 a eșuat. Te rugăm să verifici detaliile din setările POP3." + reply_by_email_address_is_empty: "Trebuie să setezi o adresă pentru „răspunde prin email” înainte să poți activa răspunsul prin email." + email_polling_disabled: "Trebuie să setezi fie retragerea manuala fie cea prin POP3 înainte să activezi răspunsul prin email." + user_locale_not_enabled: "Trebuie să activezi întâi „permite locale utilizator” înainte de activa această setare." + invalid_regex: "Regex invalid sau nepermis." search: - within_post: "#%{post_number} după %{username}: %{excerpt}" + within_post: "#%{post_number} de %{username}:" types: category: 'Categorii' topic: 'Rezultate' user: 'Utilizatori' - original_poster: "Autorul Original" + sso: + not_found: "Contul tău nu a putut fi găsit. Te rugăm contactează administratorul site-ului." + account_not_approved: "Contul tău este în așteptarea aprobării. Vei primi un email de notificare imediat ce va fi aprobat." + unknown_error: "Există o problema legată de contul tău. Te rugăm contactează administratorul site-ului." + timeout_expired: "Autentificarea în cont a expirat, te rugăm să încerci din să te autentifici din nou." + original_poster: "Creatorul unui subiect" most_posts: "Cele mai multe postări" - most_recent_poster: "Cele mai recente postări" - frequent_poster: "postări frecvente" + most_recent_poster: "Cel mai recent autor" + frequent_poster: "Autor prodigios" redirected_to_top_reasons: - new_user: "Bine ați venit la comunitatea noastră! Aici sunt cele mai populare discuții." + new_user: "Bine ai venit în comunitatea noastră! Aici sunt cele mai populare subiecte." + not_seen_in_a_month: "Bun venit! Nu te-am mai văzut de ceva vreme. Aici sunt cele mai populare subiecte ce au apărut în timpul absenței tale." + merge_posts: + edit_reason: + one: "o postare a fost comasată de către %{username}" + few: "%{count} postări au fost comasate de către %{username}" + other: "%{count} de postări au fost comasate de către %{username}" + errors: + different_topics: "Postările care aparțin unor subiecte diferite nu pot fi comasate." + different_users: "Postările care aparțin unor utilizatori diferiți nu pot fi comasate." + move_posts: + new_topic_moderator_post: + one: "o postare a fost mutată într-un nou subiect: %{topic_link}" + few: "%{count} postări au fost mutate într-un nou subiect: %{topic_link}" + other: "%{count} de postări au fost mutate într-un nou subiect: %{topic_link}" + existing_topic_moderator_post: + one: "o postare a fost comasată într-un subiect existent: %{topic_link}" + few: "%{count} postări au fost comasate într-un subiect existent: %{topic_link}" + other: "%{count} de postări au fost comasate într-un subiect existent: %{topic_link}" change_owner: - post_revision_text: "Apartententa transferată de la %{old_user} la %{new_user}" + post_revision_text: "Autor schimbat din %{old_user} în %{new_user}" + deleted_user: "un utilizator șters" + emoji: + errors: + name_already_exists: "Ne pare rău, numele '%{name}' este deja folosit de un alt emoji." + error_while_storing_emoji: "Ne pare rău, a apărut o eroare la stocarea acestui emoji." topic_statuses: - archived_enabled: "Această discuție este acum arhiva. Este închetată și nu poate fi schimbată în niciun fel." - archived_disabled: "Această discuție este acum dezarhivată. Nu mai este înghețată și poate fi modificată." - closed_enabled: "Această discuție este închisă. Răspunsurile noi nu mai sunt permise." - closed_disabled: "Această discuție este acum deschisă. Răspunsurile noi sunt permise." - autoclosed_disabled: "Această discuție este deschisă. Răspunsurile noi sunt permise." - pinned_enabled: "Această discuție este fixă. Va apărea în vârful propriei categorii până când nu va mai fi fixată, de către personal pentru toată lumea, sau individual de către utilizatori pentru ei înșiși." - pinned_disabled: "Această discuție nu mai este fixată. Nu va mai apărea în topul propriei categorii." - pinned_globally_enabled: "Această discuție este acum fixată global. Va apărea în vârful listei de categorii până când nu va mai fi fixată, de către personal pentru toată lumea, sau individual de către utilizatori pentru ei înșiși ." - pinned_globally_disabled: "Această discuție nu mai este fixată. Nu va mai apărea în topul propriei categorii." - visible_enabled: "Această discuție este acum viziblă. Va fi afișată în lista discuțiilor." - visible_disabled: "Această discuție este acum invizibilă. Nu va mai apărea în nicio listă de discuții. Singura cale de acces va fi prin adresa directă." + archived_enabled: "Acest subiect este acum arhivat. Este înghețat și nu mai poate fi schimbat în nici un fel." + archived_disabled: "Acest subiect este acum dezarhivat. Nu mai este înghețat și poate fi modificat." + closed_enabled: "Acest subiect este acum închis. Nu mai sunt permise răspunsuri noi." + closed_disabled: "Acest subiect este acum deschis. Sunt permise răspunsuri noi." + autoclosed_message_max_posts: + one: "Acest mesaj va fi închis automat după ce atinge limita de maximă de un răspuns." + few: "Acest mesaj va fi închis automat după ce atinge limita de maximă de %{count} răspunsuri." + other: "Acest mesaj va fi închis automat după ce atinge limita de maximă de %{count} de răspunsuri." + autoclosed_topic_max_posts: + one: "Acest subiect a fost închis automat după ce a atins limita maximă de un răspuns." + few: "Acest subiect a fost închis automat după ce a atins limita maximă de %{count} răspunsuri." + other: "Acest subiect a fost închis automat după ce a atins limita maximă de %{count} de răspunsuri." + autoclosed_enabled_days: + one: "Acest subiect a fost închis automat după o zi. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} zile. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} de zile. Nu mai sunt permise răspunsuri noi." + autoclosed_enabled_hours: + one: "Acest subiect a fost închis automat după o oră. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} ore. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} de ore. Nu mai sunt permise răspunsuri noi." + autoclosed_enabled_minutes: + one: "Acest subiect a fost închis automat după un minut. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} minute. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} de minute. Nu mai sunt permise răspunsuri noi." + autoclosed_enabled_lastpost_days: + one: "Acest subiect a fost închis automat după o zi de la primul răspuns. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} zile de la primul răspuns. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} de zile de la primul răspuns. Nu mai sunt permise răspunsuri noi." + autoclosed_enabled_lastpost_hours: + one: "Acest subiect a fost închis automat după o oră de la primul răspuns. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} ore de la primul răspuns. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} de ore de la primul răspuns. Nu mai sunt permise răspunsuri noi." + autoclosed_enabled_lastpost_minutes: + one: "Acest subiect a fost închis automat după un minut de la primul răspuns. Nu mai sunt permise răspunsuri noi." + few: "Acest subiect a fost închis automat după %{count} minute de la primul răspuns. Nu mai sunt permise răspunsuri noi." + other: "Acest subiect a fost închis automat după %{count} de minute de la primul răspuns. Nu mai sunt permise răspunsuri noi." + autoclosed_disabled: "Acest subiect este acum deschis. Sunt permise răspunsuri noi." + autoclosed_disabled_lastpost: "Acest subiect este acum deschis. Sunt permise răspunsuri noi." + pinned_enabled: "Acest subiect este fixat. Va apărea în vârful listei de categorii până când echipa îl va dezactiva opțiunea de fixare pentru toată lumea odată, sau până când utilizatorii vor dezactiva opțiunea, individual, pentru ei înșiși." + pinned_disabled: "Acest subiect nu mai este fixat. Nu va mai apărea în vârful propriei categorii." + pinned_globally_enabled: "Acest subiect este acum fixat global. Va apărea în vârful listei de categorii până când echipa îi va dezactiva opțiunea de fixare pentru toată lumea odată, sau până când utilizatorii vor dezactiva opțiunea, individual, pentru ei înșiși." + pinned_globally_disabled: "Acest subiect nu mai este fixat. Nu va mai apărea în capul propriei categorii." + visible_enabled: "Acest subiect este acum vizibil. Va fi afișat în lista subiectelor." + visible_disabled: "Acest subiect este acum invizibil. Nu va mai apărea în nicio listă de subiecte. Singura cale de acces va fi prin link direct." login: - not_approved: "Contul dumneavoastră nu a fost aprobat încă. Veți fi notificat prin email când sunteți gata să vă autentificați." - incorrect_username_email_or_password: "Nume de utilizator incorect, email sau parola" - wait_approval: "Mulțumim pentru autentificare. Vă vom notifica când contul dumneavoastră a fost aprobat." - active: "Contul dvs a fost activat și e gata să fie folosit." - activate_email: "Sunteți aproape gata! Am trimis un email de activare către %{email}. Vă rugăm urmați instrucțiunile din email pentru a vă activa contul." - not_activated: "Nu vă puteți încă autentifica. Am trimis un email de autentificare către dumneavoastră.Vă rugăm urmați instrucțiunile din email pentru a vă activa contul." - suspended: "Nu vă puteți autentifica până la data de %{date}." + not_approved: "Contul tău nu a fost aprobat încă. Vei fi notificat prin email când ești gata să te autentifici." + incorrect_username_email_or_password: "Nume de utilizator, email sau parolă incorecte" + wait_approval: "Îți mulțumim pentru autentificare. Te vom anunța când contul dumneavoastră a fost aprobat." + active: "Contul tău a fost activat și e gata să fie folosit." + activate_email: "Ești aproape gata! Am trimis un email de activare către %{email}. Te rugăm să urmezi instrucțiunile din email pentru a-ți activa contul." + not_activated: "Nu te poți încă autentifica. Ți-am trimis un email de autentificare. Te rugăm să urmezi instrucțiunile din email pentru a-ți activa contul." + not_allowed_from_ip_address: "Nu te poți conecta ca %{username} de la această adresa de IP." + admin_not_allowed_from_ip_address: "Nu te poți conecta ca administrator de la această adresa de IP." + suspended: "Nu te poți autentifica până la data de %{date}." + suspended_with_reason: "Acest cont este suspendat până la data de %{date}: %{reason}" errors: "%{errors}" - not_available: "Nu este valabil. Încercați %{suggestion}?" - something_already_taken: "Ceva nu a funcționat, poate numele de utilizator sau emailul este deja înregistrat. încercați opțiunea parola uitată." - omniauth_error_unknown: "Ceva a mers greșit la procesarea autentificării, vă rugăm încercați." - new_registrations_disabled: "Înregistrări de conturi noi nu sunt permise deocamdată." - password_too_long: "Parolă este limitată la 200 caractere." + not_available: "Nu este disponibil. Încearcă %{suggestion}?" + something_already_taken: "Ceva nu a funcționat, poate numele de utilizator sau emailul este deja înregistrat. Încearcă opțiunea parola uitată." + omniauth_error: "Ne pare rău, a apărut o eroare la autorizarea contului tău. Poate că nu ai aprobat autorizarea?" + omniauth_error_unknown: "Ceva a mers greșit la procesarea autentificării, te rugăm să încerci din nou." + authenticator_error_no_valid_email: "Nu este permisă nicio adresă de email asociată cu %{account}. Ar trebui să îți configurezi contul cu o adresă de email diferită." + new_registrations_disabled: "Înregistrarea de conturi noi nu este momentan permisă." + password_too_long: "Parole sunt limitate la 200 caractere." + email_too_long: "Adresa de email pe care ai introdus-o este prea lungă. Numele de căsuțe poștale nu trebuie să depășească 254 de caractere, și numele de domenii nu trebuie să depășească 253 de caractere." + reserved_username: "Acest nume utilizator nu este permis." + missing_user_field: "Nu ai completat toate câmpurile utilizatorului" + close_window: "Autentificarea este completă. Închide această fereastră pentru a continua." + already_logged_in: "Oops, se pare că încerci să accepți o invitație de la un alt utilizator. Dacă nu ești %{current_user}, te rugăm ieși și intră din nou." user: + no_accounts_associated: "Nu sunt conturi asociate" + deactivated: "A fost dezactivat din cauza pre a multor emailuri ricoșate la '%{email}'." username: short: "trebuie să fie cel puțin %{min} de caractere" - long: "nu trebuie să fie mai mult de %{max} caractere" + long: "trebuie să nu aibă mai mult de %{max} caractere" characters: "trebuie să includă doar numere, litere și underscor-uri" - unique: "trebuie să fie unice" - blank: "trebuie să fie completat" + unique: "trebuie să fie unic" + blank: "trebuie să fie prezent" + must_begin_with_alphanumeric_or_underscore: "trebuie să înceapă ci o literă, un număr sau un underscore" + must_end_with_alphanumeric: "trebuie să se termine cu o literă sau un număr" + must_not_contain_two_special_chars_in_seq: "trebuie să nu conțină o secvență de 2 sau mai multe caractere speciale (.-_)" + must_not_end_with_confusing_suffix: "trebuie să nu se termine cu un sufix interpretabil, ca de ex. .json, .png etc." email: - not_allowed: "nu este permis din partea acelui furnizor de servicii email. Vă rugăm folosiți altă adresă email." + not_allowed: "nu este permis din partea acelui furnizor de servicii email. Te rugăm folosește altă adresă email." blocked: "nu este permis." + revoked: "No se vor trimite emailuri către '%{email}' până la data de %{date}." + ip_address: + blocked: "Nu sunt permise noi înregistrări de la adresa ta de IP." + max_new_accounts_per_registration_ip: "Nu sunt permise noi înregistrări de la adresa ta de IP (limita maximă a fost atinsă). Contactează un membru al echipei." + flags_reminder: + flags_were_submitted: + one: "Au fost trimise marcaje de avertizare acum mai bine de o oră. Te rugăm, trece-le în revistă. " + few: "Au fost trimise marcaje de avertizare acum mai bine de %{count} ore. Te rugăm, trece-le în revistă. " + other: "Au fost trimise marcaje de avertizare acum mai bine de %{count} de ore. Te rugăm, trece-le în revistă. " + subject_template: + one: "un marcaj de avertizare așteptând să fie gestionat" + few: "%{count} marcaje de avertizare așteptând să fie gestionate" + other: "%{count} de marcaje de avertizare așteptând să fie gestionate" + unsubscribe_mailer: + subject_template: "Confirmă că nu mai vrei să primești actualizări pe email de la %{site_title}" + text_body_template: | + Cineva (posibil tu?) a cerut să nu mai fie trimise actualizări pe email de la %{site_domain_name} către această adresă. + Dacă dorești să confirmi, te rugăm dă click pe acest link: + %{confirm_unsubscribe_link} + + Dacă dorești să primești în continuare actualizări pe email, poți ignora acest mesaj. invite_mailer: - subject_template: "%{invitee_name} te-a invitat la '%{topic_title}' pe %{site_domain_name}" + subject_template: "%{invitee_name} te-a invitat la subiectul '%{topic_title}' pe %{site_domain_name}" text_body_template: | %{invitee_name} te-a invitat la o discuție @@ -765,174 +1479,1520 @@ ro: la - > %{site_title} -- %{site_description} + > %{site_title} -- %{descriere_site} - Dacă sunteți interesat, click pe adresa dedesubt: + Dacă ești interesat, click pe adresa dedesubt: %{invite_link} - Aceasta invitație este de la un utilizator de încredere, deci puteți răspunde discuției cât mai curând. + Aceasta invitație este de la un utilizator de încredere, deci poți răspunde discuției de îndată ce dorești. + custom_invite_mailer: + subject_template: "%{invitee_name} te-a invitat la subiectul '%{topic_title}' pe %{site_domain_name}" + text_body_template: | + %{invitee_name} te-a invitat la o discuție + + > **%{topic_title}** + > + > %{topic_excerpt} + + pe + + > %{site_title} -- %{descriere_site} + + Mesaj de la %{invitee_name}: + + %{user_custom_message} + + Dacă te interesează, dă click pe link-ul de mai jos: + %{invite_link} + + Această invitație este de la un utilizator verificat, deci poți răspunde de îndată ce dorești. invite_forum_mailer: - subject_template: "%{invitee_name} te-a invitat să te alături %{site_domain_name}" + subject_template: "%{invitee_name} te-a invitat să te alături pe %{site_domain_name}" + text_body_template: | + %{invitee_name} te-a invitat să te alături pe + + > **%{site_title}** + > + > %{site_description} + + Dacă te interesează, dă click pe link-ul de mai jos: + + %{invite_link} + + Această invitație vine de la un utilizator verificat, așa că ți se va crea automat un cont. + custom_invite_forum_mailer: + subject_template: "%{invitee_name} te-a invitat să te alături pe %{site_domain_name}" + text_body_template: | + %{invitee_name} te-a invitat să te alaturi pe + + > **%{site_title}** + > + > %{site_description} + + Mesaj de la %{invitee_name}: + + %{user_custom_message} + + Dacă te interesează, dă click pe link-ul de mai jos: + + %{invite_link} + + Această invitație vine de la un utilizator verificat, așa că ți se va crea automat un cont. invite_password_instructions: - subject_template: "Setaţi parolă pentru contul dvs. %{site_name}" + subject_template: "Setează parolă pentru contul tău %{site_name}" + text_body_template: | + Îți mulțumim că ai acceptat invitația pe %{site_name} -- bun venit! + + Acum dă click pe acest link pentru a-ți alege o parolă: + %{base_url}/users/password-reset/%{email_token} + + (Dacă linkul de mai sus a expirat, alege "Mi-am uitat parola" la autentificarea cu adresa ta de email.) test_mailer: - subject_template: "[%{site_name}] Testul de trimitere Email" + subject_template: "[%{site_name}] Test de capacitate de livrare email" + text_body_template: | + Acesta este un email de test de la + + [**%{base_url}**][0] + + A te asigura că emailul se poate livra este o chestiune complicată. Aici sunt câteva lucruri pe care ar trebui să le verifici înainte de toate: + + - Asigură-te *cu rigurozitate* că la setările site-ului, câmpul from: din `emailul de notificare` are adresa corectă. **Domeniul menționat în adresa din câmpul "from" al emailurilor pe care le trimiți este domeniul în raport cu care se va face validarea emailului tău**. + + - ști cum să vizualizezi sursa brută a emailului în clientul tău de mail, astfel încât să poți extrage indicii prețioase din header. În Gmail, acest lucru se face cu opțiunea "arată originalul" din meniu drop-down aflat în partea din dreapta-sus a fiecărui mail. + + - **IMPORTANT:** ISP-ul tău are introdusă înregistrarea pentru reverse DNS astfel încât sa asocieze numele domeniilor cu adresele IP de pe care trimiți mailuri? [Verifică-ți înregistrarea Reverse PTR][2] aici. Dacă ISP-ul tău nu a introdus corect înregistrarea reverse DNS, este foarte puțin probabil că emailul ți se va livra corect. + + - [Înregistrarea SPF][8] a domeniului tău este corectă? [Verifică-ți înregistrarea SPF][1] aici. Observă că TXT reprezintă tipul de înregistrare corect pentru SPF. + + - [Înregistrarea DKIM][3] a domeniului tău este corectă? Aceasta îți poate crește semnificativ capacitatea emailului de a fi livrat. [Verifică-ți înregistrarea DKIM][7] aici. + + - Dacă operezi propriul tău server de mail, asigură-te că IP-urile sale nu sunt listate pe [nicio listă neagră de emailuri][4]. Verifică, de asemenea, că trimite un hostname calificat în întregime, care se rezolvă în DNS prin mesajul său HELO. În caz contrar, multe servicii de mail îți vor respinge emailul. + + - Îți recomandăm călduros să **trimiți un mail de probă [mail-tester.com][mt]** pentru a verifica dacă toate cele de mai sus funcționează corect. + + (Modalitatea *ușoară* de a face asta este să îți faci un cont gratuit pe [SendGrid][sg], [SparkPost][sp], [Mailgun][mg] sau pe [Mailjet][mj], care au planuri generoase de email gratuit și suficiente pentru comunități mici. Însă tot va trebui să îți setezi înregistrările SPF și DKIM în DNS!) + + Sperăm că vei primi acest test de livrare a emailurilor cu calificativul OK! + + Mult noroc, + + Prietenii tăi de la [Discourse](http://www.discourse.org) + + [0]: %{base_url} + [1]: http://www.kitterman.com/spf/validate.html + [2]: http://mxtoolbox.com/ReverseLookup.aspx + [3]: http://www.dkim.org/ + [4]: http://whatismyipaddress.com/blacklist-check + [7]: https://www.mail-tester.com/spf-dkim-check + [8]: http://www.openspf.org/SPF_Record_Syntax + [sg]: https://goo.gl/r1WMF6 + [sp]: https://www.sparkpost.com/ + [mg]: http://www.mailgun.com/ + [mj]: https://www.mailjet.com/pricing + [mt]: http://www.mail-tester.com/ new_version_mailer: - subject_template: "[%{site_name}] O nouă versiune de Discourse, reactializare valabilă" + subject_template: "[%{site_name}] O nouă versiune de Discourse, actualizare disponibilă" + text_body_template: | + Uraaa, o nouă versiune de [Discourse](http://www.discourse.org) este acum disponibilă! + + Versiunea curentă: %{installed_version} + Noua versiune: **%{new_version}** + + - Actualizează folosind metoda noastră de **[actualizare cu un singur click în browser](%{base_url}/admin/upgrade)** + + - Află ce e nou în [raportul de schimbări GitHub](https://github.com/discourse/discourse/commits/master) + + - Vizitează [meta.discourse.org](https://meta.discourse.org) pentru știri, discuții și suport pentru Discourse new_version_mailer_with_notes: - subject_template: "[%{site_name}] update Actualizare valabilă" + subject_template: "[%{site_name}] actualizare disponibilă" + text_body_template: | + Uraaa, o nouă versiune de [Discourse](http://www.discourse.org) este acum disponibilă! + + Versiunea curentă: %{installed_version} + Noua versiune: **%{new_version}** + + - Actualizează folosind metoda noastră de **[actualizare cu un singur click în browser](%{base_url}/admin/upgrade)** + + - Află ce e nou în [raportul de schimbări GitHub](https://github.com/discourse/discourse/commits/master) + + - Vizitează [meta.discourse.org](https://meta.discourse.org) pentru știri, discuții și supot pentru Discourse + + ### Note de versiune + + %{notes} + queued_posts_reminder: + subject_template: + one: "[%{site_name}] o postare așteptând să fie verificată" + few: "[%{site_name}] %{count} postări așteptând să fie verificate" + other: "[%{site_name}] %{count} de postări așteptând să fie verificate" + text_body_template: | + Salutare, + + Există postări de utilizatori noi care așteaptă să fie moderate. [Aprobă-le sau respinge-le aici](%{base_url}/queued-posts). + flag_reasons: + off_topic: "Postarea ta a fost marcată cu marcaj de avertizare **în afara subiectului**: comunitatea simte că nu se potrivește subiectului, așa cum e el momentan definit de titlu și de prima postare." + inappropriate: "Postarea ta a fost marcată cu marcaj de avertizare **inadecvat**: comunitatea simte că este ofensatoare, abuzivă sau în contradicție cu [ghidul comunității noastre](/guidelines)." + spam: "Postarea ta a fost marcată cu marcaj de avertizare **spam**: comunitatea crede că reprezintă o reclamă, ceva ce este de natura excesiv de promoțională, în loc să fie o postare utilă sau relevantă pentru subiect după cum se presupune." + notify_moderators: "Postarea ta a fost marcată cu marcaj de avertizare **în atenția moderatorului**: comunitatea simte că există ceva legat de această postare care necesită intervenția manuală a unui membrul al echipei." flags_dispositions: - agreed: "Mulțumim pentru avertizare. Suntem de acord că există o problemă și ne vom interesa." - agreed_and_deleted: "Mulțumim pentru avertizare. Suntem de acord că este o problemă și postarea va fi eliminată." - disagreed: "Mulțumim pentru avertizare. Ne vom interesa." + agreed: "Îți mulțumim pentru avertizare. Suntem de acord că există o problemă și ne vom interesa." + agreed_and_deleted: "Îți mulțumim pentru avertizare. Suntem de acord că este o problemă și postarea va fi eliminată." + disagreed: "Îți mulțumim pentru avertizare. O să aruncăm o privire." + deferred: "Îți mulțumim că ne-ai informat. O să aruncăm o privire." + deferred_and_deleted: "Îți mulțumim că ne-ai informat. Am șters postarea." + temporarily_closed_due_to_flags: "Acest subiect este temporar închis din cauza numărului mare de marcaje de avertizare primite din partea comunității." system_messages: + post_hidden: + subject_template: "Postare ascunsă din cauza marcajelor de avertizare ale comunității" + text_body_template: | + Salut, + + Acesta este un mesaj automat de pe %{site_name} pentru a te informa că mesajul tău a fost ascuns. + + %{base_url}%{url} + + %{flag_reason} + + Mai mulți membri ai comunității au marcat acestă postare cu marcaje de avertizare înainte ca ea să fie ascunsă, așa că te rugăm să îți revizuiești postarea pentru a ține cont de feedback-ul primit. **Îți poți edita postarea după %{edit_delay} minute, și ea va fi automat re-afișată** + + Totuși dacă postarea este ascunsă de comunitate pentru a doua oară, va rămâne așa până ce va fi gestionată de un membru al echipei -- și asta ar putea atrage și alte consecințe, inclusiv posibilitatea suspendării contului tău.. + + Pentru îndreptări suplimentare, te rugăm să citești [ghidul comunității](%{base_url}/guidelines). + usage_tips: + text_body_template: | + Citește câteva sfaturi rapide destinate noilor utilizatori, [urmărind această postare pe blog](http://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/). + + Pe măsură ce participi aici, vom ajunge să te cunoaștem iar limitările temporare aferente unui utilizator nou, îți vor fi ridicate. Cu timpul vei câștiga [niveluri de încredere](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) care includ abilități speciale și care îți vor da posibilitatea să ne ajuți să ne gestionăm împreuna comunitatea. welcome_user: - subject_template: "Bine ați venit la %{site_name}!" + subject_template: "Bine ai venit pe %{site_name}!" + text_body_template: | + Îți mulțumim că te-ai alăturat pe %{site_name}, și bun venit! + + %{new_user_tips} + + Noi credem într-un [comporament civilizat al comunității](%{base_url}/guidelines) indiferent de circumstante. + + ședere plăcută! + + (Dacă ai nevoie să comunici cu [membrii echipei](%{base_url}/about) din postura de nou utilizator, pur și simplu dă reply la acest mesaj.) welcome_invite: - subject_template: "Bine ați venit la %{site_name}!" + subject_template: "Bine ai venit pe %{site_name}!" + text_body_template: | + Îți mulțumim că ai acceptat invitația pe %{site_name} -- bun venit! + + Am creat pentru tine un nou cont **%{username}**, și acum ești autentificat. Îți poți schimba numele vizitându-ți [profilul utilizator][prefs]. + + Pentru a te autentifica mai târziu: + + 1. Întotdeauna **folosește aceeași adresă de email ca cea din invitația originală** atunci când te autentifici. Altfel nu ne vom putea da seama că ești tu! + + 2. Creează o parolă unică pentru [profilul utilizator][prefs], și folosește-o la autentificare. + + %{new_user_tips} + + Noi credem într-un [comportament civilizat al comunității](%{base_url}/guidelines) indiferent de circumstanțe. + + ședere plăcută! + + (Dacă ai nevoie să comunici cu [membrii echipei](%{base_url}/about) din postura de nou utilizator, pur și simplu dă reply la acest mesaj.) + + [prefs]: %{user_preferences_url} + backup_succeeded: + subject_template: "Backup terminat cu succes" + text_body_template: | + Backup-ul a reușit. + + Vizitează [secțiunea admin > backup](%{base_url}/admin/backups) pentru a descărca noul backup. + + Acesta este raportul: + + ```text + %{logs} + ``` backup_failed: subject_template: "Backup eşuat" + text_body_template: | + Backup-ul a eșuat. + + Acesta e raportul: + + ```text + %{logs} + ``` + restore_succeeded: + subject_template: "Restaurarea terminată cu succes." + text_body_template: | + Restaurarea s-a terminat cu succes. + + Acesta este raportul: + + ```text + %{logs} + ``` restore_failed: subject_template: "Restaurare eşuată" + text_body_template: | + Restaurarea a eșuat. + + Acesta este raportul: + + ```text + %{logs} + ``` bulk_invite_succeeded: subject_template: "Invitația multiplă a fost procesată cu succes" - text_body_template: "Fișierul dvs de invitații multiple a fost procesat, %{sent} de invitații trimise." + text_body_template: "Fișierul tău de invitații multiple a fost procesat, %{sent} (de) invitații trimise." bulk_invite_failed: subject_template: "Invitația multiplă a fost procesată cu erori" text_body_template: | - Fișierul dvs de invitații multiple a fost procesat, %{sent} de invitații trimise cu %{failed} de erori. + Fișierul tău de invitații multiple a fost procesat, %{sent} (de) invitații trimise cu %{failed} (de) erori. Aici este raportul: ``` %{logs} ``` + csv_export_succeeded: + subject_template: "Exportul datelor s-a terminat" + text_body_template: | + Exportul datelor tale a reușit! :dvd: + + %{file_name} (%{file_size}) + + Link-ul de deasupra este disponibil 48 de ore. + csv_export_failed: + subject_template: "Exportul datelor a eșuat" + text_body_template: "Ne pare rău, dar exportul datelor tale a eșuat. Te rugăm să verifici rapoartele sau să contactezi un membru al echipei." + email_reject_insufficient_trust_level: + subject_template: "[%{site_name}] Problemă de email -- Nivelul de încredere este insuficient" + text_body_template: | + Ne pare rău, dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Contul tău nu are nivelul de încredere necesar pentru a crea noi subiecte, de la această adresă de email. Dacă ți se pare că aste e o eroare, contactează un membru al echipei. + email_reject_user_not_found: + subject_template: "[%{site_name}] Problemă de email -- Utilizatorul nu a fost găsit" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Răspunsul tău a fost trimis de pe o adresă de email necunoscută. Încearcă să îl trimiți de pe o altă adresă de email, sau contactează un membru al echipei. + email_reject_screened_email: + subject_template: "[%{site_name}] Problemă de email -- Email blocat" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Răspunsul tău a fost trimis de pe o adresă de email blocată. Încearcă să îl trimiți de pe o altă adresă, sau contactează un membru al echipei. + email_reject_inactive_user: + subject_template: "[%{site_name}] Problemă de email -- Cont dezactivat" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Contul tău asociat acestei adrese de email nu este activat. Te rugăm să îți activezi contul înainte de a trimite emailuri. + email_reject_blocked_user: + subject_template: "[%{site_name}] Problemă de email -- Utilizator blocat" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Contul asociat acestei adrese de email este blocat. + email_reject_reply_user_not_matching: + subject_template: "[%{site_name}] Problemă de email -- Adresă de răspuns neasteptată" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Răspunsul tău a fost trimis de pe o adresă de email diferită de cea așteptată, așa că nu suntem siguri că este aceeași persoană. Încearcă să trimiți de pe altă adresă de email, sau contactează un membru al echipei. + email_reject_no_account: + subject_template: "[%{site_name}] Problemă de email -- Cont utilizator necunoscut" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Nu putem găsi nici un cont care să corespundă adresei tale de email. Încearcă să trimiți de pe o adresă diferită de email, sau contactează un membru al echipei. + email_reject_empty: + subject_template: "[%{site_name}] Problemă de email -- Fără conținut" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Nu am putut găsi nimic scris în conținutul emailului. + + Dacă primești acest mesaj și _ai inclus_ un răspuns, încercă din nou cu o formatare mai simplă. + email_reject_parsing: + subject_template: "[%{site_name}] Problemă de email -- Conținut nerecunoscut" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Nu am putu găsi răspunsul tău în email. **Asigură-te că răspunsul tău este în partea de sus a emailului** -- nu putem procesa răspunsuri intercalate. + email_reject_invalid_access: + subject_template: "[%{site_name}] Problemă de email -- Acces invalid" + text_body_template: |+ + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Contul tău nu are drepturile necesare pentru a posta noi subiecte în acea categorie. Dacă ți se pare că asta e o eroare, contactează un membru al echipei. + + email_reject_strangers_not_allowed: + subject_template: "[%{site_name}] Problemă de email -- Acces invalid" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Categoria căreia i-ai trimis acest email nu permite răspunsuri decât de la utilizatori cu conturi valide și adrese de email cunoscute. Dacă ți se pare că e o eroare, contactează un membru al echipei. + email_reject_invalid_post: + subject_template: "[%{site_name}] Problemă de email -- Eroare la trimiterea unui mesaj" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Dintre cauzele posibile: formatare complexă, mesaj prea lung, mesaj prea scurt. Te rugăm să încerci din nou sau să postezi prin intermediul site-ului, dacă eroarea continuă. + email_reject_invalid_post_specified: + subject_template: "[%{site_name}] Problemă de email -- Eroare de postare" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Cauza: + + %{post_error} + + Dacă poți corecta eroarea, te rugăm să încerci din nou. + email_reject_invalid_post_action: + subject_template: "[%{site_name}] Problemă de email -- Acțiune de postare invalidă" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Acțiunea de postare nu a fost recunoscută. Te rugăm să încerci din nou, sau să postezi pe website dacă eroarea persistă. + email_reject_reply_key: + subject_template: "[%{site_name}] Problemă de email -- Cheie de răspuns necunoscută" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Cheia de răspuns la acest email este invalidă sau necunoscută, așa că nu ne putem da seama la ce email vine acest răspuns. Contactați un membru al echipei. + email_reject_bad_destination_address: + subject_template: "[%{site_name}] Problemă de email -- Adresă destinatar necunoscută" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Nici una din adresele de email de destinație nu este recunoscută. Te rugăm să verifici că trimiți la adresa corecta de email furnizată de către echipă. + email_reject_topic_not_found: + subject_template: "[%{site_name}] Problemă de email -- Subiectul nu a fost găsit" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Subiectul la care vrei să răspunzi nu mai există -- poate că a fost șters? Dacă ți se pare că e o eroare, contactează un membru al echipei. + email_reject_topic_closed: + subject_template: "[%{site_name}] Problemă de email -- Subiect închis" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Subiectul la care vrei să răspunzi este în prezent închis și nu mai acceptă răspunsuri. Dacă ți se pare că e o eroare, contactează un membru al echipei. + email_reject_auto_generated: + subject_template: "[%{site_name}] Problemă de email - Răspuns autogenerat" + text_body_template: | + Ne pare rău dar mesajul tău către %{destination} (cu titlul %{former_title}) nu a mers. + + Emailul tău a fost marcat ca „autogenerat”, ceea ce înseamnă că a fost creat automat de un computer în loc să fie scris de un om; nu putem accepta aceste tipuri de emailuri. Dacă ți se pare că este o eroare, contactează un membru al echipei. + email_error_notification: + subject_template: "[%{site_name}] Problemă de email - Eroare de autentificare POP3" + text_body_template: | + Din păcate,s-a produs o eroare de autentificare la retragerea emailurilor de pe serverul POP + + Te rugăm să te asiguri că ai configurat corect setările POP [setările site-ului](%{base_url}/admin/site_settings/category/email). + + Dacă există interfață utilizator web pentru contul tău POP, ar trebui să te autentifici pe ea și să îți verifici acolo setările. + too_many_spam_flags: + subject_template: "Cont nou suspendat" + text_body_template: | + Salut, + + Acesta este un mesaj automat de pe %{site_name} pentru a te informa că postările tale au fost temporar ascunse pentru că au fost marcate cu marcaje de avertizare de către comunitate.. + + Ca măsura de precauție, noului tău cont i s-a blocat posibilitatea de a crea noi răspunsuri sau subiecte până ce un un membru al echipei nu îl va verifica. Ne cerem scuze pentru inconveniență. + + Pentru îndreptări suplimentare, te rugăm să citești [ghidul comunității](%{base_url}/guidelines). + too_many_tl3_flags: + subject_template: "Cont nou suspendat" + text_body_template: | + Salut, + + Acesta este un mesaj automat de pe %{site_name} pentru a te informa că ți-a fost suspendat contul din cauza unui număr mare de marcaje de avertizare primite de la comunitate. + + Ca măsura de precauție, noului tău cont i s-a blocat posibilitatea de a crea noi răspunsuri sau subiecte până ce un un membru al echipei nu îl va verifica. Ne cerem scuze pentru inconveniență. + + Pentru îndreptări suplimentare, te rugăm să citești [ghidul comunității](%{base_url}/guidelines). + blocked_by_staff: + subject_template: "Cont suspendat temporar" + text_body_template: |+ + Salut, + + Acesta este un mesaj automat de pe %{site_name} pentru a te informa că ți-a fost suspendat temporar contul, ca măsură de precauție. + + Poți să continui să răsfoiești, dar nu vei mai putea să răspunzi sau să creezi subiecte până când un [membru al echipei](%{base_url}/about) nu îți verifică postările recente. Ne cerem scuze pentru inconveniență. + + Pentru îndreptări suplimentare, te rugăm să citești [ghidul comunității](%{base_url}/guidelines). + + user_automatically_blocked: + subject_template: "Noul utilizator %{username} a fost blocat de marcajele de avertizare ale comunității." + text_body_template: | + Acesta este un mesaj automat. + + Noul utilizator [%{username}](%{user_url}) a fost blocat în mod automat din cauza că mai mulți utilizatori au marcat postarea(ările) lui %{username} cu cu marcaje de avertizare. + + Te rugăm [verifică marcajele de avertizare](%{base_url}/admin/flags). Dacă %{username} a fost blocat în mod incorect de la postare, dă click pe butonul deblocare din [pagina de administrare pentru acest utilizator](%{user_url}). + + Pragul poate fi schimbat prin `block_new_user` din setările site-ului. spam_post_blocked: subject_template: "Utilizatorul nou %{username} are postările blocate datorită adreselor repetate" + text_body_template: | + Acesta este un mesaj automat. + + Noul utilizator [%{username}](%{user_url}) a încercat să creeze postări multiple cu link-uri la %{domains}, dar aceste postări au fost blocate pentru a evita spam-ul. Utilizatorul poate încă să creeze noi subiecte dar care să nu link-uiască la %{domains}. + + Te rugăam [verifică acest utilizator](%{user_url}). + + Această setare poate fi schimbată prin `newuser_spam_host_threshold` și `white_listed_spam_host_domains` din setările site-ului. + unblocked: + subject_template: "Contul nu mai este în așteptare" + text_body_template: | + Salut, + + Acesta este un mesaj automat de pe %{site_name} pentru a te informa că - în urma verificărilor echipei - contul tău nu mai este suspendat. + + Acum poți să creezi din nou subiecte și postări. Îți mulțumim pentru răbdare. pending_users_reminder: + subject_template: + one: "un utilizator în așteptarea aprobării" + few: "%{count} utilizatori în așteptarea aprobării" + other: "%{count} de utilizatori în așteptarea aprobării" text_body_template: | Exista înscrieri de noi utilizatori ce așteaptă să fie aprobate (sau respinse) înainte de a putea accesa forumul. - [Vă rugăm să le vizualizați în secțiunea de admin](%{base_url}/admin/users/list/în așteptare). + [Te rugăm să le vizualizezi în secțiunea de admin](%{base_url}/admin/users/list/în așteptare). download_remote_images_disabled: - subject_template: "Downloadul de imagini de legătura dezactivat" - text_body_template: "Funcția `download_remote_images_to_local` a fost dezactivată pentru că limita de spațiu din `download_remote_images_threshold` a fost atinsă." + subject_template: "Descărcarea de imagini la disanță este dezactivată" + text_body_template: "Setarea `download_remote_images_to_local` a fost dezactivată pentru că limita de spațiu din `download_remote_images_threshold` a fost atinsă." + dashboard_problems: + subject_template: "S-au găsit probleme" + text_body_template: | + Anumite probleme îți sunt raportate pe spațul de lucru al adminului. + + [Te rugăm să le verifici și să le rezolvi](%{base_url}/admin). + unsubscribe_link: | + Pentru dezabonare de la aceste emailuri, [click aici](%{unsubscribe_url}). + unsubscribe_link_and_mail: | + Pentru dezabonare de la aceste emailuri, [click aici](%{unsubscribe_url}). + unsubscribe_mailing_list: | + Primești acest mesaj pentru ca ai activat modul mailing list. + + Pentru dezabonare de la aceste emailuri, [click aici](%{unsubscribe_url}). subject_re: "Re: " subject_pm: "[PM] " user_notifications: previous_discussion: "Răspunsurile precedente" + reached_limit: + one: "ATENȚIE: ai atins limita de un email zilnic. Notificările pe email viitoare vor fi stopate." + few: "ATENȚIE: ai atins limita de %{count} emailuri zilnice. Notificările pe email viitoare vor fi stopate." + other: "ATENȚIE: ai atins limita de %{count} de emailuri zilnice. Notificările pe email viitoare vor fi stopate." + in_reply_to: "Ca răspuns la" unsubscribe: title: "Dezabonare" - description: "Nu ești interesat în a primi aceste email-uri? Nicio problemă! Faceți click dedesubt pentru a vă dezabona imediat:" + description: "Nu ești interesat în a primi aceste email-uri? Nicio problemă! Fă click dedesubt pentru a te dezabona imediat:" + reply_by_email: "[Vizitează subiect](%{base_url}%{url}) sau dă reply la acest email pentru a răspunde." + reply_by_email_pm: "[Vizitează mesaj](%{base_url}%{url}) sau dă reply la acest email pentru a răspunde." + only_reply_by_email: "Dă reply la acest email pentru a răspunde." + visit_link_to_respond: "[Vizitează subiect](%{base_url}%{url}) pentru a răspunde." + visit_link_to_respond_pm: "[Vizitează subiect](%{base_url}%{url}) pentru a răspunde." posted_by: "Postat de %{username} pe data %{post_date}" + invited_to_private_message_body: | + %{username} te-a invitat la un mesaj + + > **%{topic_title}** + > + > %{topic_excerpt} + + pe + + > %{site_title} -- %{site_description} + invited_to_topic_body: | + %{username} te-a invitat la o discuție + + > **%{topic_title}** + > + > %{topic_excerpt} + + pe + + > %{site_title} -- %{site_description} + user_invited_to_private_message_pm: + subject_template: "[%{site_name}] %{username} te-a invitat la un mesaj '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_invited_to_private_message_pm_staged: + subject_template: "[%{site_name}] %{username} te-a invitat la un mesaj '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_invited_to_topic: + subject_template: "[%{site_name}] %{username} te-a invitat la subiectul '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} user_replied: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_replied_pm: + subject_template: "[%{site_name}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_quoted: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_linked: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_mentioned: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_group_mentioned: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_posted: subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_watching_first_post: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_posted_pm: subject_template: "[%{site_name}] [MP] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_posted_pm_staged: + subject_template: "%{optional_re}%{topic_title}" + text_body_template: |2 + + %{message} digest: - why: "Un sumar scurt al %{site_link} de ultima oară când ați fost prezent %{last_seen_at}." - new_activity: "Activități noi în discuțiile și postările dvs:" - top_topics: "postări populare" - other_new_topics: "Discuții populare" + why: "Un rezumat scurt al %{site_link} de la ultima ta vizită din %{last_seen_at}." + since_last_visit: "De la ultima ta vizită" + new_topics: "Subiecte noi" + unread_messages: "Mesaje necitite" + unread_notifications: "Notificări necitite" + liked_received: "Aprecieri primite" + new_posts: "Postări noi" + new_users: "Utilizatori noi" + popular_topics: "Subiecte notorii" + follow_topic: "Urmărește acest subiect" + join_the_discussion: "Citește mai mult" + popular_posts: "Postări notorii" + from_topic_label: "De la" + more_new: "Noutăți în subiectele și categoriile pe care le urmărești" + subject_template: "[%{site_name}] Rezumat" + unsubscribe: "Acest rezumat este transmis de pe %{site_link} când a trecut ceva vreme de când nu te-am mai văzut. Pentru a te dezabona, %{unsubscribe_link}." click_here: "click aici" - read_more: "Citește mai mult" - more_topics: "Au fost %{new_topics_since_seen} alte discuții noi de la ultima dvs. vizită pe %{last_seen_at}." - more_topics_category: "Au fost %{new_topics_since_seen} alte discuții noi în aceste categorii de la utima dvs. vizită pe %{last_seen_at}:" + from: "%{site_name} rezumat" + preheader: "Un scurt rezumat de la ultima ta vizită din %{last_seen_at}" + mailing_list: + why: "Toată activitatea de pe %{site_link} pentru data de %{date}" + subject_template: "[%{site_name}] Rezumatul pentru data de %{date}" + unsubscribe: "Acest rezumat este trimis zilnic pentru că modul mailing list este activat. Pentru dezabonare dă click pe %{unsubscribe_link}" + from: "%{site_name} rezumat" + new_topics: "Subiecte noi" + topic_updates: "Actualizări la subiect" + view_this_topic: "Vizualizează acest subiect" + back_to_top: "Înapoi sus" forgot_password: subject_template: "[%{site_name}] Resetare parolă" text_body_template: | - Cineva a cerut resetarea parolei dvs. pe site-ul [%{site_name}](%{base_url}). + Cineva a cerut resetarea parolei tale pe site-ul [%{site_name}](%{base_url}). - Dacă nu ați fost dumneavoastră, puteți ignora fără griji aces email. + Dacă nu ai cerut-o tu, poți ignora fără griji acest email. Click pe următoarea adresă pentru a reseta parola: %{base_url}/users/password-reset/%{email_token} set_password: - subject_template: "[%{site_name}] Alege parola" + subject_template: "[%{site_name}] Setare parola" text_body_template: | - Cineva a cerut crearea unei parole pe siteul [%{site_name}](%{base_url}). Alternativ, vă puteți autentifica folosind orice serviciu online acceptat (Google, Facebook, etc), serviciu ce este asociat cu acesta adresa de email validată. + Cineva a cerut crearea unei parole pe site-ul [%{site_name}](%{base_url}). Alternativ, te poți autentifica folosind orice serviciu online acceptat (Google, Facebook, etc), serviciu ce este asociat cu acesta adresa de email validată. - Dacă nu ați cerut asta, puteți ignora fără griji acest email. + Dacă nu ai cerut asta, poți ignora fără griji acest email. Click pe adresa următoare pentru a alege o parolă: %{base_url}/users/password-reset/%{email_token} admin_login: subject_template: "[%{site_name}] Autentificare" - signup_after_approval: - subject_template: "Ați fost aprobat pe site-ul %{site_name}!" - signup: text_body_template: | - Bine ați venit la %{site_name}! + Cineva a încercat să se autentifice pe contul tău de pe [%{site_name}](%{base_url}). - Click pe următoarea adresă pentru a confirma și activă noul dvs. cont: + Dacă ai fost tu, poți să ignori fără griji acest email. + + Click pe următorul link pentru a te autentifica: + %{base_url}/users/admin-login/%{email_token} + account_created: + subject_template: "[%{site_name}] Noul tău cont" + text_body_template: | + Un cont nou a fost creat pentru tine pe %{site_name} + + Click pe următorul link pentru a-ți alege o parolă pentru noul tău cont + %{base_url}/users/password-reset/%{email_token} + confirm_new_email: + subject_template: "[%{site_name}] Confirmă noua ta adresă de email" + text_body_template: | + Confirmă-ți noua adresă de email pentru %{site_name} dând click pe următorul link: + + %{base_url}/users/authorize-email/%{email_token} + confirm_old_email: + subject_template: "[%{site_name}] Confirmă adresa ta de email curentă" + text_body_template: | + Înainte de a-ți putea schimba adresa de email, trebuie să ne confirmi că deții controlul asupra adresei de email curente. După ce completezi acest pas, va trebui să ne confirmi noua adresă de email. + + Confirmă-ți adresa de email curentă pentru %{site_name} dând click pe următorul link: + + %{base_url}/users/authorize-email/%{email_token} + notify_old_email: + subject_template: "[%{site_name}] Adresa ta de email a fost schimbată" + text_body_template: | + Acesta este un mesaj automat pentru a te informa că adresa ta de email pentru %{site_name} a fost schimbată. Dacă acest lucru s-a întâmplat dintr-o eroare, contractează un administrator al site-lui. + + Adresa ta de email s-a modificat în: + + %{new_email} + signup_after_approval: + subject_template: "Contul tă pe site-ul %{site_name} a fost aprobat!" + text_body_template: | + Bun venit pe %{site_name}! + + Un membru al echipei ți-a aprobat contul pe %{site_name}. + + Click link-ul urmator pentru a-ți confirma și activa noul cont: %{base_url}/users/activate-account/%{email_token} - Dacă adresa de mai sus nu e accesibilă, încercați să o copiați și să o lipiți în bară de adrese a propriului browser. + Dacă link-ul de mai sus nu este clickabil, încearcă să îl copiezi și să îl lipești în bara de adrese din browser. + + %{new_user_tips} + + Noi credem într-un [comportament civlizat al comunității](%{base_url}/guidelines) indiferent de circumstanțe. + + ședere plăcută! + + (Dacă ai nevoie să comunici cu [membrii echipei](%{base_url}/about) din postura de nou utilizator, pur și simplu dă reply la acest mesaj.) + signup: + subject_template: "[%{site_name}] Confirmă-ți noul cont" + text_body_template: | + Bine ai venit pe %{site_name}! + + Click pe următoarea adresă pentru a confirma și activa noul tău cont: + %{base_url}/users/activate-account/%{email_token} + + Dacă adresa de mai sus nu e accesibilă, încearcă să o copiezi și să o lipești în bara de adrese a propriului browser. page_not_found: + title: "Oops! Această pagină nu există sau este privată." popular_topics: "Populare" recent_topics: "Recente" see_more: "Mai multe" - search_title: "Cauta în site" + search_title: "Caută în site" search_google: "Google" login_required: welcome_message: | - #[Bine ați venit la %{title}](#welcome) - Pe acest forum de discuții aveți nevoie de un cont pentru a vizualiza %{title}. Vă rugăm creați un cont sau autentificați-vă pentru a continua. + #[Bine ai venit pe %{title}](#welcome) + Ai nevoie de un cont. Te rugăm să îți creezi un cont sau autentifică-te pentru a continua. terms_of_service: - title: "Termeni și condiții" - signup_form_message: 'Am citit și accept Termenii și Condițiile.' - deleted: 'Șters' + title: "Condițiile generale de utilizare" + signup_form_message: 'Am citit și accept Condițiile generale de utilizare.' + deleted: 'șters' upload: - edit_reason: "descarcă copii locale ale imaginilor" - unauthorized: "Ne pare rău, fișierul pe care-l încercați să-l încărcați nu este autorizat (extensii autorizate: %{authorized_extensions})." - pasted_image_filename: "Lipire imagine" - store_failure: "Încercare de încărcare eșuată #%{upload_id} pentru utilizatorul #%{user_id}." + edit_reason: "copii locale ale imaginilor descărcate" + unauthorized: "Ne pare rău, fișierul pe care-l încerci să-l încarci nu este autorizat (extensii autorizate: %{authorized_extensions})." + pasted_image_filename: "Imagine lipită" + store_failure: "Încercare eșuată de stocare a încărcarii #%{upload_id} pentru utilizatorul #%{user_id}." + file_missing: "Ne pare rău, trebuie să furnizezi un fișier pentru încărcare." + attachments: + too_large: "Ne pare rău, dar fișierul pe care încerci să îl încarci este prea mare (mărimea maximă este de %{max_size_kb}KB)." images: + too_large: "Ne pare rău, dar imaginea pe care încerci să o încarci este prea mare (mărimea maximă este de %{max_size_kb}KB), te rugăm să o redimensionezi și apoi să încerci din nou." size_not_found: "Ne pare rău, nu am putut determina mărimea imaginii. Poate este coruptă?" + avatar: + missing: "Ne pare rău, dar nu putem găsi avatarul asociat cu această adresă de email. Ai putea să îl încarci din nou?" + flag_reason: + sockpuppet: "Un utilizator nou a creat un subiect, și un alt utilizator nou de la aceeași adresă de IP (%{ip_address}) a răspuns. Vezi `flag_sockpuppets` la setările site-ului." + spam_hosts: "Acest nou utilizator a încrecat să creeze postări multiple cu link-uri către acelasi domeniu (%{domain}). Vezi `newuser_spam_host_threshold` la setările site-ului." email_log: - no_user: "Nu pot găsii utilizatorul cu id-ul %{user_id}" + post_user_deleted: "Utilizatorul acestei postări a fost șters." + no_user: "Nu s-a găsit utilizatorul cu id-ul %{user_id}" anonymous_user: "Utilizatorul este anonim" suspended_not_pm: "Utilizatorul este suspendat, nici un mesaj" seen_recently: "Utilizatorul a fost văzut recent" - post_not_found: "Nu pot găsii postarea cu id-ul %{post_id}" - notification_already_read: "Notificarea despre care acest email conține informații a fost citită" + post_not_found: "Nu s-a găsit postarea cu id-ul %{post_id}" + notification_already_read: "Notificarea ce face obiectul acestui email a fost deja citită" topic_nil: "post.topic este nil" post_deleted: "postarea a fost ștearsă de către autor" user_suspended: "utilizatorul a fost suspendat" - already_read: "utilizatorul a citit deja aceasta postare" + already_read: "utilizatorul a citit deja această postare" + exceeded_emails_limit: "Depășit max_emails_per_day_per_user" + exceeded_bounces_limit: "Depășit bounce_score_threshold" message_blank: "mesajul este gol" - message_to_blank: "mesajul.către este gol" - text_part_body_blank: "text_part.body îs blank" + message_to_blank: "message.to este gol" + text_part_body_blank: "text_part.body e gol" body_blank: "conținutul este gol" + no_echo_mailing_list_mode: "Notificările pe mail dezactivate pentru postările proprii ale utilizatorului" color_schemes: base_theme_name: "Bază" about: "Despre" - guidelines: "Informații de ajutor" - privacy: "Privat" - edit_this_page: "Editează aceasta pagină" + guidelines: "Ghid" + privacy: "Confidențialitate" + edit_this_page: "Editează această pagină" csv_export: boolean_yes: "Da" boolean_no: "Nu" static_topic_first_reply: | - Editează prima postare în această discuție pentru a schimba conținutul paginii %{page_name}. + Editează prima postare în acest subiect pentru a schimba conținutul paginii %{page_name}. guidelines_topic: - title: "FAQ/Informații de ajutor" + title: "FAQ/Ghid" + body: | + + + ## [Acesta este un loc pentru discuții civilizate](#civilized) + + Te rugăm să tratezi acest forum de discuții cu același respect cu care ai trata un parc public. și noi, la rândul nostru, suntem o resursă partajată a comunității — un loc în care ne punem la dispoziție aptitudinile, cunoștințele și priceperea prin intermediul conversației în desfășurare. + + Acestea nu sunt reguli absolute, ci doar îndreptări pentru judecata rațională din spatele comunității.Folosește aceste îndreptări pentru a menține acest loc curat și bine iluminat pentru un discurs public civilizat. + + + + ## [Îmbunătățește calitatea discuției](#improve) + + Ajută-ne să facem din locul astă o zonă propice conversației, contribuind neîncetat la creșterea calității discuțiilor, în orice mod, oricât de mic. Dacă nu ești sigur că o postare adaugă ceva la conversație, gândește-te din nou la ce ai de spus și încearcă din nou mai târziu. + + Subiectele discutate aici contează pentru noi, și vrem să acționăm de așa manieră încât să conteze și pentru tine. Fi respectuos cu oamenii cu care discuți subiectele, chiar dacă nu ești de acord cu anumite lucruri care sunt spuse. + + O metodă de a crește calitatea discuției este să te uiți întâi la discuțiile deja existente. Te rugăm să petreci puțin timp răsfoind subiectele de pe aici, înainte de a te apuca să răspunzi sau să le creezi pe ale tale. Astfel, vei avea mai multe șanse să dai peste alții care au aceleasi interese ca și tine. + + + + ## [Fi agreabil, chiar și atunci când nu ești de acord](#agreeable) + + Poate că dorești să răspunzi la ceva cu care nu ești de acord. Asta-i bine. Dar, amintește-ți _să critici ideile și nu oamenii_. Te rugăm să eviți: + + * Insultele. + * Atacurile la persoană. + * Să răspunzi tonului unei postări în loc să răspunzi conținutului ei. + * Contrazicerea de de dragul contrazicerii. + + În loc de asta, furnizează contra-argumente motivate care să îmbunătățească conversația. + + + + ## [Participarea ta contează](#participate) + + Conversațiile pe care le avem aici dau tonul pentru toată lumea. Ajută-ne să influențăm viitorul acestei comunități alegând să te angajezi în discuții care să facă din acest forum un loc interesant — și evitându-i pe cei care nu o fac. + + Discourse furnizează instrumentele care dau posibilitatea comunității să identifice colectiv cele mai bune (și cele mai proaste) contribuții: favorite, semne de carte, aprecieri, marcaje de avertizare, răspunsuri, editări și așa mai departe. Folosește aceste instrumente ca să îți imbunătățești experiența și, de asemenea, pe cea a tuturor celorlați. + + Să încercăm să lăsăm parcul mai frumos decât l-am găsit. + + + + ## [Dacă vezi o problemă, marcheaz-o](#flag-problems) + + Moderatorii au o autoritate specială; ei sunt responsabili de acest forum. Dar și tu, la rândul tău. Cu ajutorul tău, moderatorii pot fi facilitatori ai comunitătii și nu doar niste gunoieri sau polițiști. + + Atunci când sesizezi un comportament greșit, nu răspunde. Asta ar încuraja acel comportament greșit băgându-l în seamă, ți-ar consuma energia și ar irosi timpul tuturor. _Pur și simplu marchează-l cu marcaj de avertizare. Dacă se adună suficiente marcaje de avertizare, se iau masuri, fie automat fie prin intermediul intrevenției unui moderator. + + Pentru a ne întreține comunitatea, moderatorii își rezervă dreptul să șteargă orice conținut și orice cont utilizator din orice motiv și în orice moment. Moderatorii nu pot previzualiza mesajele înainte de postare; ei și membrii echipei nu își pot asuma răspundera pentru nici un fel de conținut postat de comunitate. + + + + ## [Întodeauna fi civilizat](#be-civil) + + Nimic nu sabotează o conversație sănătoasă mai mult decât bădărănia: + + * Fi civilizat. Nu posta ceva ce o persoană rezonabilă ar putea considera ofensator, abuziv sau incitare la ură. + * Păstrează curățenia. Nu posta nimic obscen sau exlicit din punct de vedere sexual. + * Respectați-vă reciproc. Nu hărțui sau îndurera pe nimeni, nu maimuțări alți oameni și nu le expune informațiile lor private. + * Respectă-ne forumul. Nu posta spam sau orice altă formă de vandalism. + + Aceștia nu sunt termeni concreți cu definiții precise — evită până și _aparența_ oricăror din aceste lucruri. Dacă nu ești sigur, întreabă-te cum te-ai simți dacă postarea ta ar apărea pe prima pagină din Dilema veche. + + Acesta este un forum public și motoarele de căutare indexează aceste discuții. Păstrează limbajul, link-urile și imaginile sigure pentru familie și prieteni. + + + + ## [Păstrează ordinea](#keep-tidy) + + Fă un efort să pui lucurile la locul potrivit, ca să petrecem mai mult timp discutând și mai puțin curâțând. Astfel: + + * Nu începe un subiect într-o categorie nepotrivită. + * Nu posta încrucișat același lucru în subiecte diferite. + * Nu posta răspunsuri fără conținut. + * Nu deturna un subiect schimbându-i cursul în mijlocul conversației. + * Nu îți semna postările — fiecare postare are atașate informațiile tale de profil. + + În loc să postezi “+1” sau “de acord”, folosește butonul Apreciere. În loc să duci un subiect într-o direcție radical diferită, folosește Răspunde ca subiect înrudit. + + + + ## [Postează numai ce-i al tău](#stealing) + + Nu posta nimic digital ce aparține altcuiva fără permisiunea lui prealabilă. Nu ai voie să postezi descrieri, link-uri sau metode de a fura conținutul proprietății intelectuale a altcuiva (software, video, audio, imagini), și nici să încalci orice altă lege. + + + + ## [Propulsat de tine](#power) + + Acest site este operat de [echipa noastră prietenoasă](/about) și de *tine*, membrul comunității. Dacă ai orice altă întrebare despre cum merg lucrurile pe-aici, deschide un nou subiect în [categoria de feedback la site](/c/site-feedback) și hai să discutăm! Dacă e vreo chestiune critică sau urgentă care nu poate fi gestionată printr-un meta-subiect sau marcaj de avertizare, contactează-ne prin [pagina echipei](/about). + + + + ## [Condițiile generale de utilizare a site-ului](#tos) + + Da, legea este plictisitoare, însă trebuie să ne protejăm – și prin extensie, și pe tine și datele tale – împotriva băieților răi. Avem niște [Condiții generale de utilizare a site-ului](/tos) ce descriu comportamentul tău (și al nostru) și drepturile legate de conținut, confidențialitate și legi. Pentru a utiliza acest serviciu trebuie să ne accepți [CGU](/tos). tos_topic: - title: "Acordul de servicii" + title: "Condiții generale de utilizare" + body: | + The following terms and conditions govern all use of the %{company_domain} website and all content, services and products available at or through the website, including, but not limited to, %{company_domain} Forum Software, %{company_domain} Support Forums and the %{company_domain} Hosting service ("Hosting"), (taken together, the Website). The Website is owned and operated by %{company_full_name} ("%{company_name}"). The Website is offered subject to your acceptance without modification of all of the terms and conditions contained herein and all other operating rules, policies (including, without limitation, %{company_domain}’s [Privacy Policy](/privacy) and [Community Guidelines](/faq)) and procedures that may be published from time to time on this Site by %{company_name} (collectively, the "Agreement"). + + Please read this Agreement carefully before accessing or using the Website. By accessing or using any part of the web site, you agree to become bound by the terms and conditions of this agreement. If you do not agree to all the terms and conditions of this agreement, then you may not access the Website or use any services. If these terms and conditions are considered an offer by %{company_name}, acceptance is expressly limited to these terms. The Website is available only to individuals who are at least 13 years old. + + + + ## [1. Your %{company_domain} Account](#1) + + If you create an account on the Website, you are responsible for maintaining the security of your account and you are fully responsible for all activities that occur under the account. You must immediately notify %{company_name} of any unauthorized uses of your account or any other breaches of security. %{company_name} will not be liable for any acts or omissions by you, including any damages of any kind incurred as a result of such acts or omissions. + + + + ## [2. Responsibility of Contributors](#2) + + If you post material to the Website, post links on the Website, or otherwise make (or allow any third party to make) material available by means of the Website (any such material, "Content"), You are entirely responsible for the content of, and any harm resulting from, that Content. That is the case regardless of whether the Content in question constitutes text, graphics, an audio file, or computer software. By making Content available, you represent and warrant that: + + * the downloading, copying and use of the Content will not infringe the proprietary rights, including but not limited to the copyright, patent, trademark or trade secret rights, of any third party; + * if your employer has rights to intellectual property you create, you have either (i) received permission from your employer to post or make available the Content, including but not limited to any software, or (ii) secured from your employer a waiver as to all rights in or to the Content; + * you have fully complied with any third-party licenses relating to the Content, and have done all things necessary to successfully pass through to end users any required terms; + * the Content does not contain or install any viruses, worms, malware, Trojan horses or other harmful or destructive content; + * the Content is not spam, is not machine- or randomly-generated, and does not contain unethical or unwanted commercial content designed to drive traffic to third party sites or boost the search engine rankings of third party sites, or to further unlawful acts (such as phishing) or mislead recipients as to the source of the material (such as spoofing); + * the Content is not pornographic, does not contain threats or incite violence, and does not violate the privacy or publicity rights of any third party; + * your content is not getting advertised via unwanted electronic messages such as spam links on newsgroups, email lists, blogs and web sites, and similar unsolicited promotional methods; + * your content is not named in a manner that misleads your readers into thinking that you are another person or company; and + * you have, in the case of Content that includes computer code, accurately categorized and/or described the type, nature, uses and effects of the materials, whether requested to do so by %{company_name} or otherwise. + + + + ## [3. User Content License](#3) + + User contributions are licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License](http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_US). Without limiting any of those representations or warranties, %{company_name} has the right (though not the obligation) to, in %{company_name}’s sole discretion (i) refuse or remove any content that, in %{company_name}’s reasonable opinion, violates any %{company_name} policy or is in any way harmful or objectionable, or (ii) terminate or deny access to and use of the Website to any individual or entity for any reason, in %{company_name}’s sole discretion. %{company_name} will have no obligation to provide a refund of any amounts previously paid. + + + + + ## [4. Payment and Renewal](#4) + + ### General Terms + + Optional paid services or upgrades may be available on the Website. When utilizing an optional paid service or upgrade, you agree to pay %{company_name} the monthly or annual subscription fees indicated. Payments will be charged on a pre-pay basis on the day you begin utilizing the service or upgrade and will cover the use of that service or upgrade for a monthly or annual subscription period as indicated. These fees are not refundable. + + ### Automatic Renewal + + Unless you notify %{company_name} before the end of the applicable subscription period that you want to cancel a service or upgrade, your subscription will automatically renew and you authorize us to collect the then-applicable annual or monthly subscription fee (as well as any taxes) using any credit card or other payment mechanism we have on record for you. Subscriptions can be canceled at any time. + + + + ## [5. Services](#5) + + ### Hosting, Support Services + + Optional Hosting and Support services may be provided by %{company_name} under the terms and conditions for each such service. By signing up for a Hosting/Support or Support services account, you agree to abide by such terms and conditions. + + + + ## [6. Responsibility of Website Visitors](#6) + + %{company_name} has not reviewed, and cannot review, all of the material, including computer software, posted to the Website, and cannot therefore be responsible for that material’s content, use or effects. By operating the Website, %{company_name} does not represent or imply that it endorses the material there posted, or that it believes such material to be accurate, useful or non-harmful. You are responsible for taking precautions as necessary to protect yourself and your computer systems from viruses, worms, Trojan horses, and other harmful or destructive content. The Website may contain content that is offensive, indecent, or otherwise objectionable, as well as content containing technical inaccuracies, typographical mistakes, and other errors. The Website may also contain material that violates the privacy or publicity rights, or infringes the intellectual property and other proprietary rights, of third parties, or the downloading, copying or use of which is subject to additional terms and conditions, stated or unstated. %{company_name} disclaims any responsibility for any harm resulting from the use by visitors of the Website, or from any downloading by those visitors of content there posted. + + + + ## [7. Content Posted on Other Websites](#7) + + We have not reviewed, and cannot review, all of the material, including computer software, made available through the websites and webpages to which %{company_domain} links, and that link to %{company_domain}. %{company_name} does not have any control over those non-%{company_domain} websites and webpages, and is not responsible for their contents or their use. By linking to a non-%{company_domain} website or webpage, %{company_name} does not represent or imply that it endorses such website or webpage. You are responsible for taking precautions as necessary to protect yourself and your computer systems from viruses, worms, Trojan horses, and other harmful or destructive content. %{company_name} disclaims any responsibility for any harm resulting from your use of non-%{company_domain} websites and webpages. + + + + ## [8. Copyright Infringement and DMCA Policy](#8) + + As %{company_name} asks others to respect its intellectual property rights, it respects the intellectual property rights of others. If you believe that material located on or linked to by %{company_domain} violates your copyright, and if this website resides in the USA, you are encouraged to notify %{company_name} in accordance with %{company_name}’s [Digital Millennium Copyright Act](http://en.wikipedia.org/wiki/Digital_Millennium_Copyright_Act) ("DMCA") Policy. %{company_name} will respond to all such notices, including as required or appropriate by removing the infringing material or disabling all links to the infringing material. %{company_name} will terminate a visitor’s access to and use of the Website if, under appropriate circumstances, the visitor is determined to be a repeat infringer of the copyrights or other intellectual property rights of %{company_name} or others. In the case of such termination, %{company_name} will have no obligation to provide a refund of any amounts previously paid to %{company_name}. + + + + ## [9. Intellectual Property](#9) + + This Agreement does not transfer from %{company_name} to you any %{company_name} or third party intellectual property, and all right, title and interest in and to such property will remain (as between the parties) solely with %{company_name}. %{company_name}, %{company_domain}, the %{company_domain} logo, and all other trademarks, service marks, graphics and logos used in connection with %{company_domain}, or the Website are trademarks or registered trademarks of %{company_name} or %{company_name}’s licensors. Other trademarks, service marks, graphics and logos used in connection with the Website may be the trademarks of other third parties. Your use of the Website grants you no right or license to reproduce or otherwise use any %{company_name} or third-party trademarks. + + + + ## [10. Advertisements](#10) + + %{company_name} reserves the right to display advertisements on your content unless you have purchased an Ad-free Upgrade or a Services account. + + + + ## [11. Attribution](#11) + + %{company_name} reserves the right to display attribution links such as ‘Powered by %{company_domain},’ theme author, and font attribution in your content footer or toolbar. Footer credits and the %{company_domain} toolbar may not be removed regardless of upgrades purchased. + + + + ## [12. Changes](#12) + + %{company_name} reserves the right, at its sole discretion, to modify or replace any part of this Agreement. It is your responsibility to check this Agreement periodically for changes. Your continued use of or access to the Website following the posting of any changes to this Agreement constitutes acceptance of those changes. %{company_name} may also, in the future, offer new services and/or features through the Website (including, the release of new tools and resources). Such new features and/or services shall be subject to the terms and conditions of this Agreement. + + + + ## [13. Termination](#13) + + %{company_name} may terminate your access to all or any part of the Website at any time, with or without cause, with or without notice, effective immediately. If you wish to terminate this Agreement or your %{company_domain} account (if you have one), you may simply discontinue using the Website. All provisions of this Agreement which by their nature should survive termination shall survive termination, including, without limitation, ownership provisions, warranty disclaimers, indemnity and limitations of liability. + + + + ## [14. Disclaimer of Warranties](#14) + + The Website is provided "as is". %{company_name} and its suppliers and licensors hereby disclaim all warranties of any kind, express or implied, including, without limitation, the warranties of merchantability, fitness for a particular purpose and non-infringement. Neither %{company_name} nor its suppliers and licensors, makes any warranty that the Website will be error free or that access thereto will be continuous or uninterrupted. If you’re actually reading this, here’s [a treat](http://www.newyorker.com/online/blogs/shouts/2012/12/the-hundred-best-lists-of-all-time.html). You understand that you download from, or otherwise obtain content or services through, the Website at your own discretion and risk. + + + + ## [15. Limitation of Liability](#15) + + In no event will %{company_name}, or its suppliers or licensors, be liable with respect to any subject matter of this agreement under any contract, negligence, strict liability or other legal or equitable theory for: (i) any special, incidental or consequential damages; (ii) the cost of procurement for substitute products or services; (iii) for interruption of use or loss or corruption of data; or (iv) for any amounts that exceed the fees paid by you to %{company_name} under this agreement during the twelve (12) month period prior to the cause of action. %{company_name} shall have no liability for any failure or delay due to matters beyond their reasonable control. The foregoing shall not apply to the extent prohibited by applicable law. + + + + ## [16. General Representation and Warranty](#16) + + You represent and warrant that (i) your use of the Website will be in strict accordance with the %{company_name} [Privacy Policy](/privacy), [Community Guidelines](/guidelines), with this Agreement and with all applicable laws and regulations (including without limitation any local laws or regulations in your country, state, city, or other governmental area, regarding online conduct and acceptable content, and including all applicable laws regarding the transmission of technical data exported from the country in which this website resides or the country in which you reside) and (ii) your use of the Website will not infringe or misappropriate the intellectual property rights of any third party. + + + + ## [17. Indemnification](#17) + + You agree to indemnify and hold harmless %{company_name}, its contractors, and its licensors, and their respective directors, officers, employees and agents from and against any and all claims and expenses, including attorneys’ fees, arising out of your use of the Website, including but not limited to your violation of this Agreement. + + + + ## [18. Miscellaneous](#18) + + This Agreement constitutes the entire agreement between %{company_name} and you concerning the subject matter hereof, and they may only be modified by a written amendment signed by an authorized executive of %{company_name}, or by the posting by %{company_name} of a revised version. Except to the extent applicable law, if any, provides otherwise, this Agreement, any access to or use of the Website will be governed by the laws of the state of California, U.S.A., excluding its conflict of law provisions, and the proper venue for any disputes arising out of or relating to any of the same will be the state and federal courts located in San Francisco County, California. Except for claims for injunctive or equitable relief or claims regarding intellectual property rights (which may be brought in any competent court without the posting of a bond), any dispute arising under this Agreement shall be finally settled in accordance with the Comprehensive Arbitration Rules of the Judicial Arbitration and Mediation Service, Inc. (“JAMS”) by three arbitrators appointed in accordance with such Rules. The arbitration shall take place in San Francisco, California, in the English language and the arbitral decision may be enforced in any court. The prevailing party in any action or proceeding to enforce this Agreement shall be entitled to costs and attorneys’ fees. If any part of this Agreement is held invalid or unenforceable, that part will be construed to reflect the parties’ original intent, and the remaining portions will remain in full force and effect. A waiver by either party of any term or condition of this Agreement or any breach thereof, in any one instance, will not waive such term or condition or any subsequent breach thereof. You may assign your rights under this Agreement to any party that consents to, and agrees to be bound by, its terms and conditions; %{company_name} may assign its rights under this Agreement without condition. This Agreement will be binding upon and will inure to the benefit of the parties, their successors and permitted assigns. + + This document is CC-BY-SA. It was last updated May 31, 2013. + + Originally adapted from the [WordPress Terms of Service](http://en.wordpress.com/tos/). privacy_topic: title: "Politica de confidențialitate" + body: | + + + ## [Ce informații colectăm?](#collect) + + Noi colectăm informații de la tine atunci când te înregistrezi pe site-ul nostru și strângem date atunci când participi la forum citind, scriind sau evaluând conținutul distribuit aici. + + Când te înregistrezi pe site-ul nostru, ți se poate cere să îți introduci numele și adresa. Poți totuși să ne vizitezi site-ul fără să te înregistrezi. Adresa ta de email va fi verificată printr-un email ce conține un link unic. Dacă acel link este vizitat, noi știm că tu deții controlul adresei de email. + + Odată înregistrat și postând, noi înregistrăm adresa de IP de la care a provenit postarea. Putem de asemenea să păstrăm registre de server cu adresele IP ale fiecărei interogări către serverul nostru. + + + + ## [La ce folosim informațiile?](#use) + + Orice informație pe care o colectăm de la tine poate fi folosită într-unul din următoarele moduri: + + * Pentru a-ți personaliza experiența — informațiile tale ne ajută să răspundem mai bine nevoilor tale specifice. + * Să ne îmbunătățim site-ul — ne zbatem în permanență să ne îmbunătățim funcționalitățile site-ului pe baza informațiilor și al feedback-ului pe care îl primim de la tine. + * Să îmbunătățim serviciul clienți — informațiile tale ne ajută să răspundem mai eficient cererilor tale de serviciu clienți și nevoilor tale de suport. + * Să transmitem emailuri periodice — Adresa de email pe care ne-ai furnizat-o poate fi folosită să îți trimitem informații, notificări pe care le ceri cu privire la schimbări în subiecte sau în legătură cu numele tău utilizator, pentru a răspunde la solicitări și/sau alte cereri sau întrebări. + + + + ## [Cum îți protejăm informațiile?](#protect) + + Implementăm o gamă variată de măsuri pentru a menține securitatea informațiilor personale pe care le introduci, trimiți sau accesezi. + + + + ## [Care este politica voastră de păstrare a datelor?](#data-retention) + + Vom face eforturi cu bună-credință pentru a: + + * Nu reține mai mult de 90 de zile rapoartele server ce conțin adresele de IP ale tuturor interogărilor către serverul nostru. + * Nu reține mai mult de 5 ani adresele de IP asociate cu utilizatorii înregistrați și postările lor. + + + + ## [Folosiți cookies](#cookies) + + Da. Cookies sunt fișiere mici pe care un site sau furnizorul său de servicii le transferă pe hard drive-ul computerului tău prin intermediul web browser-ului (dacă permiți) Aceste cookies dau posibilitatea site-ului să îți recunoască browserul și, dacă ai un cont înregistrat, să îl asocieze cu contul tău înregistrat. + + Folosim cookies pentru a-ți înțelege și salva preferințele în vederea vizitelor viitoare și să compilăm și agregăm date despre traficul pe site și interacțiunile site-ului astfel încât să putem oferi experiențe mai și instrumente mai bune pe site, în viitor. Putem contacta terți furnizori de servicii pentru a ne ajuta să ne înțelegem mai bine vizitatorii. Acestor terți furnizori de servicii nu li se va permite să folosească informațiile colectate în numele nostru decât pentru a ne ajuta șă ne desfășurăm și îmbunătățim activitatea.. + + + + ## [Divulgați aceste informații terților?](#disclose) + + Nu vindem, comercializăm sau transferăm în vreun alt fel către terți informațiile tale personale identificabile. Asta nu include terții de încredere care ne ajută să ne exploatăm site-ul, să ne conducem activitatea, sau să te servim, câtă vreme acești terți sunt de acord să păstreze aceste informații confidențiale. Putem de asemenea să divulgăm informațiile tale atunci când credem că e necesar pentru a ne supune legii, să aplicăm politica site-ului, sau să protejăm drepturile, proprietatea sau siguranța noastră sau a altora. Totuși, informațiile nepersonale ale vizitatorilor pot fi furnizate unor terți în scopuri de marketing, reclamă sau în alte scopuri. + + + + ## [Legături cu terți](#third-party) + + Uneori, la discreția noastră, putem include sau oferi produse sau servicii ale terților pe site-ul nostru. Aceste site-uri ale terților au propriile lor politici de confidențialitate separate și independente. De aceea noi nu avem nicio responsabilitate pentru conținutul sau activitățile de pe aceste site-uri către care sunt puse linkuri. Cu toate astea, vom încerca să protejăm integritatea site-ului nostru și suntem dispuși să luam în considerare orice feedback legat de aceste site-uri. + + + + ## [Protecția minorilor](#coppa) + + Site-ul nostru, produsele și serviciile sunt destinate direct persoanelor care au vârsta de peste 13 ani. Dacă acest server este în Statele Unite, și dacă ai mai puțin de 13 ani, în conformitate cu COPPA ([Children's Online Privacy Protection Act](https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act)), nu folosi acest site. + + + ## [Politica de confidențialitate online](#online) + + Această politică de confidențialitate se aplică numai informațiilor colectate online prin intermediul site-ului nostru nu și celor colectate offline. + + + + ## [Acordul tău](#consent) + + Prin utilizarea site-ului nostru, ești de acord cu Politica de confidențialitate a site-ului nostru web. + + + + ## [Schimbări în politica de confidențialitate](#changes) + + Dacă decidem să ne schimbăm politica de confidențialitate, vom afișa schimbările în această pagină. + + Acest document se supune licenței creative commons CC-BY-SA. A fost actualizat ultima dată pe 31 mai 2013. + badges: + editor: + name: Editor + description: Prima postare editată + long_description: | + Acest ecuson se acordă când, pentru prima dată, îți editezi una din postări. Deși nu poți să îți editezi postările la infinit, editarea este întotdeauna o idee buna: poți să îți îmbunătățești postările, să corectezi micile greșeli sau să adaugi chestii pe care le-ai uitat când ai postat prima dată. Editează ca să îți faci postările să strălucească. + basic_user: + name: Simplu utilizator + description: Ți-au fost acordate toate funcțiile esențiale ale comunității + long_description: | + Acest ecuson se acordă când ai ajuns la nivelul de încredere 1. Îți mulțumim că stai nițel pe aici ca să citești câteva subiecte și să înveți despre ce anume e comunitatea noastră. Restricțiile de utilizator nou ți-au fost ridicate; ți-au fost acordate toate capacitățile esențiale, precum trimiterea de mesaje personale, marcarea cu marcaje de avertizare, editare wiki, și capacitatea de a posta imagini și link-uri multiple. + member: + name: Membru + description: Ți s-au acordat invitații, mesaje în grup, mai multe aprecieri + long_description: | + Acest ecuson se acordă când ajungi la nivelul de încredere 2. Îți mulțumim că încerci de câteva săptămâni să te alături cu adevărat comunității noastre. + regular: + name: Utilizator frecvent + description: Ți s-au acordat recategorizare, redenumire, link-uri urmărite, wiki, mai multe aprecieri + long_description: | + Acest ecuson se acordă atunci când ai atins nivelul de încredere 3. Îți mulțumim că ești un utilizator frecvent, „adevărat client al casei” în comunitatea noastră, deja de câteva luni de zile. Acum ești unul dintre cei mai activi cititori și un contributor de încredere care ne ridică întreaga comunitate. Acum vei avea posibilitatea să recategorisești și redenumești subiecte, să utilizezi marcaje de avertizare spam mai puternice, să ai acces la zona privată de sufragerie, și o să primești mult mai multe aprecieri în fiecare zi. + leader: + name: Lider + description: Ți s-au acordat editare globală, fixare, închidere, arhivare, divizare și comasare, mai multe aprecieri + long_description: | + Acest ecuson se acordă când ajungi la nivelul de încredere 4. Ești un lider al acestei comunități, după cum te-a selectat echipa și, reprezinți un exemplu pozitiv prin acțiunile și cuvintele tale. Ai capacitatea să editezi toate postările, să aplici acțiuni de moderare obișnuite precum fixare, închidere, delistare, arhivare, divizare și comasare, și ai tone de aprecieri pe zi. + welcome: + name: Bun venit + description: Ai primit o apreciere + long_description: | + Acest ecuson se acordă atunci când primești prima apreciere la o postare. Felicitări, ai postat ceva ce colegii tăi membri ai comunității au găsit a fi interesant, mișto și folositor! + autobiographer: + name: Autobiograf + description: Ai completat informațiile de la profil + long_description: | + Acest ecuson se acordă pentru completarea profilului utilizator și selectare unei poze de profil. Faptul că oferi celorlați câteva informații despre cine ești și ce anume te interesează contribuie crearea unei comunităil mai bune și mai coezive. Alătură-te nouă! + anniversary: + name: Aniversare + description: Ești membru activ de un an, ai postat cel puțin odată + long_description: | + Acest ecuson se acordă când ai împlinit un an de când ești membru și ai avut cel puțin o postare în acest timp. Îți mulțumim că stai prin zonă și contribui la comunitatea noastră. Nu ne-am putea descurca fără tine. + nice_post: + name: Răspuns fain + description: Ai primit 10 aprecieri la un răspuns + long_description: | + Acest ecuson se acordă când un răspuns de-al tău primește 10 aprecieri. Răspunsul tău a făcut impresie în comunitate și a împins conversația înainte! + good_post: + name: Răspuns mișto + description: Ai primit 25 de aprecieri la un răspuns + long_description: | + Acest ecuson se acordă când un răspuns de-al tău primește 25 de aprecieri. Răspunsul tău a fost excepțional și a făcut conversația mult mai bună pentru toată lumea! + great_post: + name: Răspuns beton + description: Ai primit 50 de aprecieri la un răspuns + long_description: | + Acest ecuson se acordă când un răspuns de-al tău primește 50 de aprecieri. Wow! Răspunsul tău a fost inspirat, fascinant, amuzant sau expert și comunitatea l-a iubit. + nice_topic: + name: Subiect fain + description: Ai primit 10 de aprecieri la un subiect + long_description: | + Acest ecuson se acordă când unul din subiectele tale primește 10 aprecieri. Hei, ai început o conversație care i-a plăcut comunității! + good_topic: + name: Subiect mișto + description: Ai primit 25 de aprecieri la un subiect + long_description: | + Acest ecuson este acordat când un subiect de-al tău primește 25 de aprecieri. Ai lansat o conversație vibrantă și în jurul căreia s-a adunat comunitatea și pe care au iubit-o. + great_topic: + name: Subiect beton + description: Ai primit 50 de aprecieri la un subiect + long_description: | + Acest ecuson se acordă când un subiect de-al tău primește 50 de aprecieri. Ai inițiat o conversație fascinantă și comunitatea s-a bucurat de discuția dinamică ce a rezultat! + nice_share: + name: Distribuție faină + description: Ai distribuit o postare care a atras 25 de vizitatori unici + long_description: | + Acest ecuson se acordă pentru distribuirea unui link care a fost accesat de 25 de vizitatori externi. Îți mulțumim că popularizezi discuțiile noastre și informațiile despre această comunitate. + good_share: + name: Distribuție mișto + description: Ai distribuit o postare care a atras 300 de vizitatori unici + long_description: | + Acest ecuson se acordat pentru distribuirea unui link care a fost accesat de 300 de vizitatori externi. Bună treabă! Ai arătat o discuție fantastică unei mulțimi de oameni noi și ai ajutat această comunitate să crească. + great_share: + name: Distribuție beton + description: Ai distribuit o postare ce a atras 1000 de vizitatori unici + long_description: | + Acest ecuson este acordat pentru distribuirea unui link care a fost accesat de 1000 de vizitatori externi. Wow! A promovat o discuție interesantă în fața unei audiențe enorme și ai ajutat mult comunitatea noastră să crească! + first_like: + name: Prima apreciere + description: Ai apreciat o postare + long_description: | + Acest ecuson se acordă când, pentru prima dată, acorzi o apreciere unei postări folosind butonul :heart: . Acordarea de aprecieri pentru postări reprezintă o metodă minunată de a le arăta colegilor tăi din comunitate că ceea ce au postat ei este interesant, util, mișto sau amuzant. Împășește apreciere! + first_flag: + name: Primul marcaj de avertizare + description: Marcat postare cu marcaj de avertizare + long_description: | + Acest ecuson se acordă când, pentru prima dată, ai marcat o postare cu marcaj de avertizare. Marcarea cu marcaj de avertizare este metoda prin care cu toții ajutăm la menținerea acestui site în condiții de curățenie și luminozitate pentru toată lumea. Dacă observi vreo postare care, indiferent de motiv, necesită atenția moderatorilor, te rugăm să nu eziți să îl marchezi. Poți de asemenea să marchezi cu marcaj de avertizare spre trimiterea de mesaj personal către un coleg utilizator, dacă vezi vreo problemă cu postarea lui. Dacă vezi vreo problemă, :flag_black: semnalează-o! + promoter: + name: Promotor + description: Ai invitat un utilizator + long_description: | + Acest ecuson se acordă când ai invitat pe cineva să se alăture comunității noastre prin intermediul butonului Invită din pagina ta de utilizator, sau de la sfârșitul unui subiect. Invitarea prietenilor care pot fi interesați în discuții specifice reprezintă o metodă minunată de a introduce oameni noi în comunitatea noastră, asa că mulțumim! + campaigner: + name: șef de campanie + description: Ai invitat 3 utilizatori simpli + long_description: | + Acest ecuson se acordă după ce ai invitat 3 persoane care apoi au petrecut suficient timp pe site pentru a deveni utilizatori simpli. O comunitate vibrantă are nevoie de o infuzie regulată de noi-veniți care sa participe în mod obișnuit și care să adauge noi voci la conversații. + champion: + name: Campion + description: Ai invitat 5 membri + long_description: | + Acest ecuson se acordă când ai invitat 5 membri care ulterior au petrecut suficient timp pe site pentru a deveni membri deplini. Wow! Îți mulțumim că ne sporești diversitatea comunității cu noi membri. + first_share: + name: Prima distribuire + description: Ai distribuit o postare + long_description: | + Acest ecuson se acordă când, pentru prima oară, ai distribuit un link la un răspuns folosind butonul Distribuie. Distribuirea link-urilor reprezintă o metodă foarte bună pentru a arăta discuțiile interesante către restul lumii și de a spori comunitatea. + first_link: + name: Primul link + description: Ai adăugat un link la un alt subiect + long_description: | + Acest ecuson se acordă când, pentru prima oară, adaugi un link la alt subiect. Legarea subiectelor ajută colegii care citesc să găsească conversații conexe interesante, arătându-le legătura dintre subiecte în ambele direcții. Link-uiește la discreție! + first_quote: + name: Prima citare + description: Ai citat o postare + long_description: | + Acest ecuson se acordă când, pentru prima dată, citezi o postare precedentă în cadrul propriului tău răspuns și ajută la conexarea discuțiilor în cadrul unui subiect. Cel mai simplu mod să citezi este să selectezi o secțiune a unei postări și apoi să apeși orice buton de răspuns. Citează generos! + read_guidelines: + name: Ghid Citit + description: Ai citit ghidul comunității + long_description: | + Acest ecuson se acordă pentru că ai citit ghidul comunității. Urmând și distribuind aceste reguli simple putem construi o comunitate sustenabilă, amuzantă și sigură pentru toți. Întotdeauna adu-ți aminte că o altă ființă umană, una ce seamănă foarte mult cu tine, se află de partea cealaltă a ecranului. Fii drăguț! + reader: + name: Cititor + description: Ai citit toate răspunsurile dintr-un subiect cu mai mult de 100 de răspunsuri + long_description: | + Acest ecuson se acordă când, pentru prima dată, ai citit un subiect lung cu mai mult de 100 de răspunsuri. Urmărind cu atenție o conversație te ajută să înțelegi diversele puncte de vedere și contribuie la dezvoltarea de conversații interesante. Cu cât citești mai mult, cu atât mai bună devine conversația. După cum ne place să spunem, A citi este fundamental! :slight_smile: + popular_link: + name: Link popular + description: Ai postat un link extern ce a atras 50 de click-uri + long_description: | + Acest ecuson se acordă când ai distribuit un link care a atras 50 de click-uri. Îți mulțumim că postezi link-uri utile și că adaugi un context interesant la conversații! + hot_link: + name: Link fierbinte + description: Ai postat un link extern ce a atras 300 de click-uri + long_description: | + Acest ecuson se acordă când ai distribuit un link ce a atras 300 de click-uri. Îți mulțumim că ai postat un link fascinant care a împins conversația mai departe și a iluminat discuția! + famous_link: + name: Link celebru + description: Ai postat un link extern ce a atras 1000 de click-uri + long_description: | + Acest ecuson se acordă atunci când ai distribuit un link ce a atras 1000 de click-uri. Wow! Ai postat un link ce a îmbunătățit conversația în mod semnificativ adăugând detalii esențiale, context și informație. Bună treabă! + appreciated: + name: Apreciat + description: Ai primit câte 1 apreciere la 20 de postări + long_description: | + Acest ecuson se acordă când primești câte cel puțin o apreciere la 20 de postări diferite. Comunitatea se bucură de contribuțiile tale la conversații! + respected: + name: Respectat + description: Ai primit câte 2 aprecieri la 100 de postări + long_description: | + Acest ecuson se acordă când primești cel puțin câte 2 aprecieri la 100 de postări diferite. Comunitatea începe să îți respecte multe contribuții pe care le ai la conversații. + admired: + name: Admirat + description: Ai primit câte 5 aprecieri în 300 de postări + long_description: | + Acest ecuson se acordă când primești cel puțin câte 5 aprecieri în 300 de postări diferite. Wow! Comunitatea îți admiră contribuțiile frecvente și de înaltă calitate. + out_of_love: + name: Toată stima + description: Ai folosit 50 de aprecieri într-o zi + long_description: | + Acest ecuson se acordă atunci când îți folosești toate cele 50 de aprecieri zilnice. Faptul că îți amintești să îți rezervi un pic de timp pentru a aprecia postările de care te-ai bucurat și pe are le-ai prețuit încurajează colegii tăi de comunitate să creeze pe viitor discuții și mai interesante. + higher_love: + name: Înaltă stimă + description: Ai folosit de 5 ori 50 de aprecieri pe zi + long_description: | + Acest ecuson se acordă când îți folosești de 5 ori toate cele 50 de aprecieri zilnice. Îți mulțumim că îți aloci timp zilnic pentru a încuraja cele mai bune conversații. + crazy_in_love: + name: Maximă stimă + description: Ai folosit de 20 de ori 50 de aprecieri pe zi + long_description: | + Acest ecuson se acordă atunci când folosești toate cele 50 de aprecieri la care ai zilnic dreptul, de-a lungul a 20 zile. Wow! Ești un model de încurajare pentru colegii din comunitate! + thank_you: + name: Mulțumesc + description: Ai 20 de postări apreciate și ai dat 10 apreiceri + long_description: | + Acest ecuson se acordă când ai 20 de postări apreciate și ai acordat 10 alte aprecieri la rândul tău. Atunci când cineva îți apreciază postările, găsești timp să apreciezi și tu ce postează alții. + gives_back: + name: Recunoscător + description: Ai 100 de postări apreciate și ai acordat 100 de aprecieri + long_description: | + Acest ecuson se acordă când ai 100 de postări apreciate și ai acordat 100 de alte aprecieri la rândul tău. Îți mulțumim că întorci favoarea și altora. + empathetic: + name: Empatic + description: Ai 500 de postări apreciate și ai oferit 1000 de aprecieri + long_description: | + Acest ecuson se acordă când ți-au fost apreciate 500 de postări și ai acordat la rândul tău 1000 sau mai multe aprecieri. Wow! Ești un model de generozitate și apreciere reciprocă :two_hearts:. + first_emoji: + name: Primul emoji + description: Ai folosit un emoji într-o postare. + long_description: | + Acest ecuson se acordă prima data când adaugi un emoji la postarea ta :thumbsup:. Emoji permit transmiterea de emoții prin postări, de la fericire :smiley: la tristețe :anguished: la furie :angry: și întreaga planetă :sunglasses: . Apasă un : (două puncte) sau apasă pe butonul Emoji toolbar din editor pentru a alege dintre sute de opțiuni :ok_hand: + first_mention: + name: Prima mențiune + description: Ai fost menționat în postarea unui utilizator + long_description: Acest ecuson se acordă când, pentru prima oară, ai menționat @numele de utilizator al cuiva într-o postare de-a ta. Fiecare menționare generează o notificare către acea persoană, astfel încât ea să știe despre postarea ta. Începi prin a apăsa tasta @ (simbolul at) ca să menționezi orice utilizator sau, dacă îți este permis, grup. E o metodă convenabilă să atragi atenția cuiva. + first_onebox: + name: Primul onebox + description: Ai postat un link care a devenit onebox + long_description: Acest ecuson se acordă când, pentru prima data, ai postat un link singur pe line, ceea ce a făcut ca automat să fie expandat într-un onebox cu un scurt rezumat al link-ului, un titlu și (dacă e disponibilă) cu o poză. + first_reply_by_email: + name: Forum prin email + description: Ai răspuns la o postare prin email + long_description: | + Acest ecuosn se acordă când ai răspuns pentru prima dată la o postare prin email :e-mail:. admin_login: - success: "Mesajul a fost trimis" + success: "Emailul a fost trimis" error: "Eroare!" email_input: "Email Admin" - submit_button: "Trimite Email" + submit_button: "Trimite email" + discourse_hub: + access_token_problem: "Spune-i unui admin: Te rog actualizează setările site-ului pentru a include discourse_org_access_key ." + performance_report: + initial_post_raw: Acest subiect include rapoarte zilnice de performanță referitoare la site-ul tău. + initial_topic_title: Rapoarte de performanță website + topic_invite: + user_exists: "Ne pare rău, acest utilizator a fost deja invitat. Nu poți să inviți un utilizator la un subiect decât o singură dată." + tags: + title: "Etichete" + staff_tag_disallowed: "Eticheta \"%{tag}\" poate fi pusă doar de un membru al echipei." + staff_tag_remove_disallowed: "Eticheta \"%{tag}\" poate fi ștearsă doar de un membru al echipei." + rss_by_tag: "Subiecte etichetate %{tag}" + finish_installation: + congratulations: "Felicitări, ai instalat Discourse!" + register: + button: "Înregistrare" + title: "Înregistrare cont administrator" + help: "înregistrează un cont nou ca să începi" + no_emails: "Din păcate, niciun email de administrator nu a fost setat pe parcursul instalării, așa că finalizarea configurării poate fi dificilă." + confirm_email: + title: "Confirmare email" + message: "Am trimis un email de activare la %{email}. Urmează instrucțiunile din email ca să-ți activezi contul.
Dacă nu primești email, verifică dacă l-ai introdus corect și verifică și dosarul de spam.
" + resend_email: + title: "Retrimite email de activare" + message: "Am trimis un email de activare la %{email}" + safe_mode: + title: "Activează modul sigur" + description: "Modul sigur îți permite să îți testezi site-ul fără să încarci plugin-uri și personalizări." + no_customizations: "Dezactivează toate personalizările site-ului" + only_official: "Dezactivează plugin-urile neoficiale" + no_plugins: "Dezactivează toate plugin-urile" + enter: "Activează modul sigur" + wizard: + title: "Configurare Discourse" + step: + locale: + title: "Bun venit pe Discourse-ul tău!" + fields: + default_locale: + description: "Care e limba implicită pentru comunitatea ta?" + forum_title: + title: "Nume" + description: "Numele este un semn vizibil de la distanță, primul lucru pe care vizitatorii potențiali îl remarcă cu privire la comunitatea ta. Ce spune numele și titlul despre comunitatea ta?" + fields: + title: + label: "Numele comunității tale" + placeholder: "Bârlogul Mariei" + site_description: + label: "Descrie-ți comunitatea într-o singură frază scurtă" + placeholder: "Un loc în care Maria și prietenii stau la taifas despre chestii mișto" + introduction: + title: "Introducere" + fields: + welcome: + label: "Subiect de bun venit" + description: "
Cum ți-ai descrie comunitatea unui străin din lift, într-un minut?
Subiectul vostru de bun venit este primul lucru pe care îl vor vedea noii vizitatori Gândește-te la el ca laun paragraf/b> de 'agățat în lift' sau 'declarație de misiune'.
" + one_paragraph: "Te rugăm să îți restrângi mesajul de bun venit la un paragraf." + privacy: + title: "Acces" + description: "Este comunitatea voastră deschisă tuturor, sau este limită prin apartenență, invitații, sau aprobare? Dacă preferi, poți să setezi lucrurile pe privat și să comuți mai târziu pe public.
Amintește-ți că întotdeauna poți să trimiți invitații din subiecte sau din pagina cu profilul tău de utilizator
" + fields: + privacy: + choices: + open: + label: "Public" + description: "Oricine poate să acceseze această comunitate și să se înscrie pentru un cont" + restricted: + label: "Privat" + description: "Numai cei pe care i-am invitat sau aprobat pot să acceseze această comunitate." + contact: + title: "Contact" + fields: + contact_email: + label: "Mail" + placeholder: "nume@exemplu.comb" + description: "Adresa de email a persoanei sau grupului responsabil de aceasta comunitate. Folosită pentru notificări critice cum ar fi marcaje de avertizare negestionate, actualizări de securitate și afișată pe pagina Despre noi pentru contactarea de urgență a comunității." + contact_url: + label: "Pagină web" + placeholder: "http://www.exemplu.com/contact" + description: "Pagina web generică cu date de contact pentru tine sau organizația ta. Se va afișa pe pagina despre noi. " + site_contact: + label: "Mesaje automate" + description: "Toate mesajele personale automate din Discourse vor fi trimite de la acest utilizator. Ce-i mai important este că acest utilizator va fi desemnat să trimită fiecare mesaj de bun venit ce se trimite automat noilor utilizatori." + corporate: + title: "Organizație" + description: "Aceste nume vor fi introduse în Politica de confidențialitate și Condițiile generale de utilizare, pe care le poți edita oricând în categoria Echipa. Dacă nu ai o firmă, poți sări momentan peste acest pas." + fields: + company_short_name: + label: "Numele firmei (scurt)" + placeholder: "Initech" + company_full_name: + label: "Numele firmei (lung)" + placeholder: "Initech, SRL." + company_domain: + label: "Numele domeniului firmei" + placeholder: "initech.com" + colors: + title: "Temă" + fields: + theme_id: + description: "Preferi o schemă de culori luminoasă sau una întunecată pentru început? Întotdeauna poți continua personalizarea aspectului site-ului via Admin, Personalizare." + choices: + default: + label: "Luminos simplu" + dark: + label: "Întunecat simplu" + logos: + title: "Logo-uri" + fields: + logo_url: + label: "Logo-ul principal" + description: "Imaginea logo din partea stângă-sus a site-ului tău. Folosește o formă de dreptunghi lat." + logo_small_url: + label: "Logo compact" + description: "O versiune compctă a logo-ului tău, care este afișată în partea din stânga-sus a site-ului. Folosește o formă pătrată." + icons: + title: "Iconițe" + fields: + favicon_url: + label: "Iconiță mică" + description: "Imagine iconiță folosită la reprezentarea site-ului tău în web browsere și care arată bine la mărimi mici, ca de ex 32px pe 32px." + apple_touch_icon_url: + label: "Iconiță mare" + description: "Iconiță utilizata pentru a-ți reprezenta site-ul pe dispozitive moderne și care arată bine la dimensiuni mai mari. Dimensiunea recomandată este de 144px pe 144px." + homepage: + description: "Recomandăm afișarea celor subiectelor recente pe pagina principală, dar, dacă preferi, poți să alegi afișarea categoriilor (grupuri de subiecte)." + title: "Pagina principală" + fields: + homepage_style: + choices: + latest: + label: "Subiecte recente" + categories: + label: "Categorii" + emoji: + title: "Emoji" + description: "Ce stil de Emoji preferi pentru comunitatea ta? Întotdeauna poți să adaugi mai multe emoji personalizate via Admin, Personalizări, Emoji." + invites: + title: "Invită membrii echipei" + description: "Aproape ai terminat! Hai să invităm niște membri ai echipei să dea o mână de ajutor și să presare discuțiile cu subiecte și răspunsuri interesante, pentru a lansa comunitatea." + finished: + title: "Discourse-ul tău e gata!" + description: | +Dacă vei dori vreodată să schimbi aceste setări, vizitează secțiunea admin; care se găsește lângă iconița cu cheia franceză din meniul site-ului.
+Distracție plăcută și mult succesla construcția noii comunități!
activemodel: errors: <<: *errors diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index 698842aff0f..ff84a60f71b 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -13,6 +13,9 @@ ru: datetime_formats: &datetime_formats formats: short: "%d.%m.%Y" + short_no_year: "%d %B" + date_only: "%d.%m.%Y" + long: "%d.%m.%Y %H:%M:%S" date: month_names: [null, Январь, Февраль, Март, Апрель, Май, Июнь, Июль, Август, Сентябрь, Октябрь, Ноябрь, Декабрь] <<: *datetime_formats @@ -37,11 +40,18 @@ ru: errors: empty_email_error: "Происходит, когда мы получаем пустое письмо." no_message_id_error: "Происходит, когда письмо не имеет заголовка 'Message-Id'." + auto_generated_email_error: "Случается, когда заголовок 'Приоритет' установлен в: список, мусор, навалочных или автоматический ответ, или когда какой-либо другой заголовок содержит: автоматический представленный, автоматический ответ или автоматически генерируется." + no_body_detected_error: "Случается, когда мы не могли извлечь тело и не было никаких вложений." inactive_user_error: "Происходит, когда отправитель неактивен." blocked_user_error: "Происходит, когда отправитель заблокирован." + bad_destination_address: "Случается, когда ни один из адресов электронной почты в To / Cc / Bcc поля не совпадающего с настройки входящей адрес электронной почты." strangers_not_allowed_error: "Возникает,когда пользователь пытается создать новую тему в разделе,членом которой он не является" + insufficient_trust_level_error: "Случается, когда пользователь пытается создать новую тему в категории они не имеют необходимого уровня доверия для." + reply_user_not_matching_error: "Случается, когда ответ пришел с другой адрес электронной почты уведомление было направлено." topic_not_found_error: "Случается, когда ответ пришел, но связанная тема уже удалена." topic_closed_error: "Случается, когда ответ пришел, но связанная тема уже закрыта." + bounced_email_error: "Электронная почта является подпрыгнул отчет по электронной почте." + screened_email_error: "Случается, когда адрес электронной почты отправителя был уже экранированы." errors: &errors format: '%{attribute} %{message}' messages: @@ -61,7 +71,7 @@ ru: has_already_been_used: "уже было использовано" inclusion: не включен в список invalid: неверный - is_invalid: "- неверно; попробуйте описать подробнее." + is_invalid: "Не совсем ясно, это предложение закончено?" less_than: должен быть меньше %{count} less_than_or_equal_to: должен быть меньше или равен %{count} not_a_number: не число @@ -99,12 +109,11 @@ ru: max_username_length_range: "Нельзя установить максимум ниже минимума." default_categories_already_selected: "Нельзя выбрать раздел, используемый в другом списке." s3_upload_bucket_is_required: "Нельзя включить загрузки на S3, пока не задана настройка 's3_upload_bucket'." - bulk_invite: - file_should_be_csv: "Загружаемый файл должен быть в формате CSV или TXT." backup: operation_already_running: "Действие уже выполняется, поэтому невозможно начать новое действие прямо сейчас." backup_file_should_be_tar_gz: "Файл резервной копии должен быть архивом в формате .TAR.GZ." not_enough_space_on_disk: "Не хватает места на диске сервера для загрузки этой резервной копии." + invalid_filename: "Резервная копия файла содержит недопустимые символы. Допустимые символы A-Z 0-9. - _." not_logged_in: "Для этого действия, пожалуйста авторизуйтесь." not_found: "Запрашиваемая страница или ресурс не найден." invalid_access: "У вас нет прав для просмотра запрашиваемого ресурса." @@ -168,7 +177,7 @@ ru: topic_not_found: "Что-то пошло не так. Возможно, эта тема была закрыта или заархивирована, пока вы ее читали?" just_posted_that: "слишком схоже с уже опубликованным Вами сообщением" invalid_characters: "содержит недопустимые символы" - is_invalid: "слишком короткий" + is_invalid: "Не совсем ясно, это предложение закончено?" next_page: "следующая страница →" prev_page: "← предыдущая страница" page_num: "Страница %{num}" @@ -261,12 +270,12 @@ ru: Вместо нового ответа, сейчас можно начать редактировать свой предыдущий ответ и просто добавить в него новые цитаты и ответы та них. Для этого нужно выделить требуемый текст и нажать на появившуюся кнопку ответить цитированием. Для большинства читатей, намного проще читать темы, в которых длинные ответы и их мало, чем когда много коротеньких ответов. - dominating_topic: | + dominating_topic: |2 Данная тема является для вас важной – количество ваших ответов превышает %{percent}% процентов. Уверены ли вы, что так же даете другим людям возможность высказать свою точку зрения? - too_many_replies: | + too_many_replies: |2 Новые пользователи ограничены %{newuser_max_replies_per_topic} ответами в одной и той же теме. @@ -302,6 +311,7 @@ ru: common: "Вы пытаетесь использовать один из 10000 самых распространенных паролей. Используйте более сложный пароль. " same_as_username: "совпадает с вашим псевдонимом. Пожалуйста, придумайте более надежный пароль." same_as_email: "совпадает с вашим e-mail. Пожалуйста, придумайте более надежный пароль." + same_as_current: "такая же, как текущий пароль." ip_address: signup_not_allowed: "Регистрация с данной учетной записью запрещена." color_scheme_color: @@ -311,6 +321,10 @@ ru: post_reply: base: different_topic: "Сообщение и ответ должен принадлежать к одной и той же теме." + web_hook: + attributes: + payload_url: + invalid: "URL недействителен. URL должен включает в себя HTTP: // или https: //. И ни один пустой не допускается." <<: *errors user_profile: no_info_me: "Your post was flagged by the community. Please see your messages.
' - user_must_edit: 'This post was flagged by the community and is temporarily hidden.
' + you_must_edit: 'Postimi juaj u sinjalizua nga komuniteti. Shikoni mesazhet.
' + user_must_edit: 'Kjo temë u sinjalizua nga komuniteti dhe është fshehur përkohësisht.
' archetypes: regular: - title: "Regular Topic" + title: "Temë e zakonshme" banner: - title: "Banner Topic" + title: "Temë banderolë" message: - make: "This topic is now a banner. It will appear at the top of every page until it is dismissed by the user." - remove: "This topic is no longer a banner. It will no longer appear at the top of every page." + make: "Kjo temë është tani banderolë. Do të shfaqet në majë të gjithë faqes derisa përdoruesi t'a heqë vetë. " + remove: "Kjo temë nuk është më banderolë. Nuk do të shfaqet më në majë të çdo faqeje të sitit. " + unsubscribed: + title: "U çregjistruat!" + description: "U çregjistruat. Për të ndryshuar rregullimet e email-it shkoni tek preferencat e përdoruesit." + topic_description: "Për t'u ri-abonuar tek %{link}, përdorni kontrollin e njoftimeve në fund apo në të djathtë të temës." + unsubscribe: + title: "Çregjistrohuni" + stop_watching_topic: "Ndaloni së ndjekuri këtë temë, %{link}" + unwatch_category: "Ndaloni së ndjekuri të gjitha temat në %{category}" + all: "Mos më dërgoni më email nga %{sitename}" reports: visits: - title: "User Visits" + title: "Vizitat e përdoruesit" xaxis: "Ditë" - yaxis: "Number of visits" + yaxis: "Numri i vizitave" signups: - title: "New Users" + title: "Përdorues të rinj" xaxis: "Ditë" - yaxis: "Number of new users" + yaxis: "Numri i përdoruesve të rinj" profile_views: xaxis: "Ditë" topics: title: "Tema" xaxis: "Ditë" - yaxis: "Number of new topics" + yaxis: "Numri i temave të reja" posts: title: "Postime" xaxis: "Ditë" - yaxis: "Number of new posts" + yaxis: "Numri i postimeve të reja" likes: title: "Pëlqime" xaxis: "Ditë" - yaxis: "Number of new likes" + yaxis: "Numri i pëlqimeve të reja" flags: - title: "Flags" + title: "Sinjalizime" xaxis: "Ditë" - yaxis: "Number of flags" + yaxis: "Numri i sinjalizimeve" bookmarks: - title: "Bookmarks" + title: "Të preferuarat" xaxis: "Ditë" - yaxis: "Number of new bookmarks" + yaxis: "Numri i postimeve të preferuar të rinj" starred: - title: "Starred" xaxis: "Ditë" - yaxis: "Number of new starred topics" users_by_trust_level: - title: "Users per Trust Level" - xaxis: "Trust Level" - yaxis: "Number of Users" + title: "Përdorues për Nivel Besimi" + xaxis: "Niveli i besimit" + yaxis: "Numri i përdoruesve" emails: title: "Emails Sent" xaxis: "Ditë" @@ -572,8 +551,8 @@ sq: yaxis: "Total" mobile_visits: title: "User Visits" - xaxis: "Day" - yaxis: "Number of visits" + xaxis: "Ditë" + yaxis: "Numri i vizitave" dashboard: rails_env_warning: "Your server is running in %{env} mode." host_names_warning: "Your config/database.yml file is using the default localhost hostname. Update it to use your site's hostname." @@ -588,14 +567,6 @@ sq: s3_config_warning: 'The server is configured to upload files to s3, but at least one the following setting is not set: s3_access_key_id, s3_secret_access_key or s3_upload_bucket. Go to the Site Settings and update the settings. See "How to set up image uploads to S3?" to learn more.' s3_backup_config_warning: 'The server is configured to upload backups to s3, but at least one the following setting is not set: s3_access_key_id, s3_secret_access_key or s3_backup_bucket. Go to the Site Settings and update the settings. See "How to set up image uploads to S3?" to learn more.' image_magick_warning: 'The server is configured to create thumbnails of large images, but ImageMagick is not installed. Install ImageMagick using your favorite package manager or download the latest release.' - default_logo_warning: "Set the graphic logos for your site. Update logo_url, logo_small_url, and favicon_url in Site Settings." - contact_email_missing: "Enter a site contact email address so you can be reached for urgent matters regarding your site. Update it in Site Settings." - contact_email_invalid: "The site contact email is invalid. Update it in Site Settings." - title_nag: "Enter the name of your site. Update title in Site Settings." - site_description_missing: "Enter a one sentence description of your site that will appear in search results. Update site_description in Site Settings." - consumer_email_warning: "Your site is configured to use Gmail (or another consumer email service) to send email. Gmail limits how many emails you can send. Consider using an email service provider like mandrill.com to ensure email deliverability." - site_contact_username_warning: "Enter the name of a friendly staff user account to send important automated messages from. Update site_contact_username in Site Settings." - notification_email_warning: "Notification emails are not being sent from a valid email address on your domain; email delivery will be erratic and unreliable. Please set notification_email to a valid local email address in Site Settings." site_settings: censored_words: "Fjalët do të zhvendosen automatikisht me ■■■■" delete_old_hidden_posts: "Auto-delete any hidden posts that stay hidden for more than 30 days." @@ -635,7 +606,6 @@ sq: exclude_rel_nofollow_domains: "A list of domains where nofollow should not be added to links. tld.com will automatically allow sub.tld.com as well. As a minimum, you should add the top-level domain of this site to help web crawlers find all content. If other parts of your website are at other domains, add those too." post_excerpt_maxlength: "Maximum length of a post excerpt / summary." post_onebox_maxlength: "Maximum length of a oneboxed Discourse post in characters." - onebox_domains_whitelist: "A list of domains to allow oneboxing for; these domains should support OpenGraph or oEmbed. Test them at http://iframely.com/debug" logo_url: "The logo image at the top left of your site, should be a wide rectangle shape. If left blank site title text will be shown." logo_small_url: "The small logo image at the top left of your site, should be a square shape, seen when scrolling down. If left blank a home glyph will be shown." mobile_logo_url: "The fixed position logo image used at the top left of your mobile site. Should be a square shape. If left blank, `logo_url` will be used. eg: http://example.com/uploads/default/logo.png" @@ -655,6 +625,7 @@ sq: anon_polling_interval: "How often should anonymous clients poll in milliseconds" background_polling_interval: "How often should the clients poll in milliseconds (when the window is in the background)" cooldown_minutes_after_hiding_posts: "Number of minutes a user must wait before they can edit a post hidden via community flagging" + max_replies_in_first_day: "Numri maksimal i përgjigjeve që një përdorues ka të drejtë të krijojë në periudhën 24-orëshe pas postimit të tij të parë" tl2_additional_likes_per_day_multiplier: "Increase limit of likes per day for tl2 (member) by multiplying with this number" tl3_additional_likes_per_day_multiplier: "Increase limit of likes per day for tl3 (regular) by multiplying with this number" tl4_additional_likes_per_day_multiplier: "Increase limit of likes per day for tl4 (leader) by multiplying with this number" @@ -684,7 +655,6 @@ sq: redirect_users_to_top_page: "Automatically redirect new and long absent users to the top page." show_email_on_profile: "Show a user's email on their profile (only visible to themselves and staff)" email_token_valid_hours: "Forgot password / activate account tokens are valid for (n) hours." - email_token_grace_period_hours: "Forgot password / activate account tokens are still valid for a grace period of (n) hours after being redeemed." enable_badges: "Aktivizo sistemin e targetave" allow_index_in_robots_txt: "Specify in robots.txt that this site is allowed to be indexed by web search engines." email_domains_blacklist: "A pipe-delimited list of email domains that users are not allowed to register accounts with. Example: mailinator.com|trashmail.net" @@ -700,7 +670,7 @@ sq: login_required: "Require authentication to read content on this site, disallow anonymous access." reserved_usernames: "Usernames for which signup is not allowed." min_password_length: "Minimum password length." - block_common_passwords: "Don't allow passwords that are in the 10,000 most common passwords." + block_common_passwords: "Mos lejo fjalëkalimet që gjenden në 10,000 fjalëkalimet më të përdorshme." enable_sso: "Enable single sign on via an external site (WARNING: USERS' EMAIL ADDRESSES *MUST* BE VALIDATED BY THE EXTERNAL SITE!)" enable_sso_provider: "Implement Discourse SSO provider protocol at the /session/sso_provider endpoint, requires sso_secret to be set" sso_secret: "Secret string used to cryptographically authenticate SSO information, be sure it is 10 characters or longer" @@ -870,6 +840,8 @@ sq: suppress_uncategorized_badge: "Don't show the badge for uncategorized topics in topic lists." global_notice: "Display an URGENT, EMERGENCY global banner notice to all visitors, change to blank to hide it (HTML allowed)." disable_edit_notifications: "Disables edit notifications by the system user when 'download_remote_images_to_local' is active." + automatically_unpin_topics: "Çngjiti temat automatikisht kur përdoruesi arrin fundin e faqes." + read_time_word_count: "Numërimi i fjalëve për minutë për të llogaritur kohën e vlerësuar të leximit." full_name_required: "Full name is a required field of a user's profile." enable_names: "Show the user's full name on their profile, user card, and emails. Disable to hide full name everywhere." display_name_on_posts: "Show a user's full name on their posts in addition to their @username." @@ -888,7 +860,6 @@ sq: embed_whitelist_selector: "CSS selector for elements that are allowed in embeds." embed_blacklist_selector: "CSS selector for elements that are removed from embeds." notify_about_flags_after: "If there are flags that haven't been handled after this many hours, send an email to the contact_email. Set to 0 to disable." - enable_cdn_js_debugging: "Allow /logs to display proper errors by adding crossorigin permissions on all js includes." show_create_topics_notice: "If the site has fewer than 5 public topics, show a notice asking admins to create some topics." delete_drafts_older_than_n_days: Delete drafts older than (n) days. 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." @@ -897,6 +868,9 @@ sq: emoji_set: "How would you like your emoji?" enforce_square_emoji: "Force a square aspect ratio to all emojis." approve_unless_trust_level: "Posts for users below this trust level must be approved" + auto_close_messages_post_count: "Numri më i lartë i lejueshëm i postimeve të lejuara në një mesazh përpara se të mbyllet automatikisht (0 për ta çaktivizuar)" + auto_close_topics_post_count: "Numri më i lartë i lejueshëm i postimeve të lejuara në një temë përpara se të mbyllet automatikisht (0 për ta çaktivizuar)" + default_topics_automatic_unpin: "Çngjiti temat automatikisht kur përdoruesi arrin fundin e faqes, e paracaktuar." errors: invalid_email: "Invalid email address." invalid_username: "There's no user with that username." @@ -912,15 +886,15 @@ sq: invalid_string_max: "Must be no more than %{max} characters." invalid_reply_by_email_address: "Value must contain '%{reply_key}' and be different from the notification email." search: - within_post: "#%{post_number} by %{username}" + within_post: "#%{post_number} nga %{username}" types: category: 'Categories' topic: 'Results' user: 'Users' - original_poster: "Original Poster" + original_poster: "Postuesi fillestar" most_posts: "Most Posts" - most_recent_poster: "Most Recent Poster" - frequent_poster: "Frequent Poster" + most_recent_poster: "Postuesi i përgjigjes së fundit" + frequent_poster: "Postues i shpeshtë" redirected_to_top_reasons: new_user: "Welcome to our community! These are the most popular recent topics." not_seen_in_a_month: "Welcome back! We haven't seen you in a while. These are the most popular topics since you've been away." @@ -943,6 +917,12 @@ sq: archived_disabled: "This topic is now unarchived. It is no longer frozen, and can be changed." closed_enabled: "This topic is now closed. New replies are no longer allowed." closed_disabled: "This topic is now opened. New replies are allowed." + autoclosed_message_max_posts: + one: "Ky mesazh u mbyll automatikisht pasi arriti kufirin e lejueshëm të 1 përgjigjeje." + other: "Ky mesazh u mbyll automatikisht pasi arriti kufirin e lejueshëm të %{count} përgjigjeve." + autoclosed_topic_max_posts: + one: "Kjo temë është mbyllur automatikisht pasi arriti kufirin e lejueshëm të 1 përgjigjeje." + other: "Kjo temë është mbyllur automatikisht pasi arriti kufirin e lejueshëm të %{count} përgjigjeve." autoclosed_enabled_days: one: "This topic was automatically closed after 1 day. New replies are no longer allowed." other: "This topic was automatically closed after %{count} days. New replies are no longer allowed." @@ -979,16 +959,7 @@ sq: not_allowed_from_ip_address: "You can't log in as %{username} from that IP address." admin_not_allowed_from_ip_address: "You can't log in as admin from that IP address." suspended: "You can't log in until %{date}." - suspended_with_reason: "Account suspended until %{date}: %{reason}" - errors: "%{errors}" - not_available: "Not available. Try %{suggestion}?" - something_already_taken: "Something went wrong, perhaps the username or email is already registered. Try the forgot password link." - omniauth_error: "Sorry, there was an error authorizing your account. Perhaps you did not approve authorization?" - omniauth_error_unknown: "Something went wrong processing your log in, please try again." - new_registrations_disabled: "New account registrations are not allowed at this time." - password_too_long: "Passwords are limited to 200 characters." - email_too_long: "The email you provided is too long. Mailbox names must be no more than 254 characters, and domain names must be no more than 253 characters." - reserved_username: "That username is not allowed." + reserved_username: "Ky emër nuk lejohet." missing_user_field: "You have not completed all the user fields" close_window: "Authentication is complete. Close this window to continue." user: @@ -1007,37 +978,85 @@ sq: max_new_accounts_per_registration_ip: "New registrations are not allowed from your IP address (maximum limit reached). Contact a staff member." flags_reminder: subject_template: - one: "1 flag waiting to be handled" - other: "%{count} flags waiting to be handled" + one: "1 sinjalizim në pritje për t'u trajtuar" + other: "%{count} sinjalizime në pritje për t'u trajtuar" invite_mailer: - subject_template: "%{invitee_name} invited you to '%{topic_title}' on %{site_domain_name}" - text_body_template: | - %{invitee_name} invited you to a discussion - + subject_template: "%{invitee_name} ju ftoi tek tema '%{topic_title}' tek %{site_domain_name}" + text_body_template: |+ + %{invitee_name} ju ftoi në një bisedë > **%{topic_title}** > > %{topic_excerpt} - at + tek > %{site_title} -- %{site_description} - If you're interested, click the link below: + Nëse jeni i interesuar, klikoni lidhjen e mëposhtme: %{invite_link} - This invitation is from a trusted user, so you can reply to the discussion immediately. - invite_forum_mailer: - subject_template: "%{invitee_name} invited you to join %{site_domain_name}" - invite_password_instructions: - subject_template: "Set password for your %{site_name} account" - text_body_template: | - Thanks for accepting your invitation to %{site_name} -- welcome! + Kjo ftesë vjen nga një përdorues i besuar, ju mund të merrni pjesë në bisedë menjëherë. - Click this link to choose a password now: + custom_invite_mailer: + text_body_template: |+ + %{invitee_name} ju ftoi në një bisedë + > **%{topic_title}** + > + > %{topic_excerpt} + + tek + + > %{site_title} -- %{site_description} + + Mesazh nga %{invitee_name}: + + %{user_custom_message} + + Nëse jeni i interesuar, klikoni lidhjen e mëposhtme: + + %{invite_link} + + Kjo ftesë vjen nga një përdorues i besuar, ju mund të merrni pjesë në bisedë menjëherë. + + invite_forum_mailer: + subject_template: "%{invitee_name} ju ka ftuar të bëheni pjesë e %{site_domain_name}" + text_body_template: | + %{invitee_name} ju ka ftuar të bëheni pjesë e + > **%{site_title}** + > + > %{site_description} + + Nëse jeni i interesuar, klikoni lidhjen e mëposhtme: + %{invite_link} + + Kjo ftesë vjen nga një përdorues i besuar, si rrjedhojë një llogari do të krijohet automatikisht për ju. + custom_invite_forum_mailer: + subject_template: "%{invitee_name} ju ka ftuar të bëheni pjesë e %{site_domain_name}" + text_body_template: | + %{invitee_name} ju ka ftuar të bëheni pjesë e + > **%{site_title}** + > + > %{site_description} + + Mesazhi nga %{invitee_name}: + + %{user_custom_message} + + Nëse jeni i interesuar, klikoni lidhjen e mëposhtme: + %{invite_link} + + Kjo ftesë vjen nga një përdorues i besuar, si rrjedhojë një llogari do të krijohet automatikisht për ju. + invite_password_instructions: + subject_template: "Vendos fjalëkalimin për llogarinë tek %{site_name}" + text_body_template: |+ + Faleminderit që pranuat ftesën tek %{site_name} -- mirësevini! + + Klikoni këtë lidhje për të zgjedhur një fjalëkalim tani: %{base_url}/users/password-reset/%{email_token} - (If the link above has expired, choose "I forgot my password" when logging in with your email address.) + (Nëse lidhjes së mësipërme i ka mbaruar afati, zgjidhni "Kam harruar fjalëkalimin" kur të hyni me adresën tuaj email.) + test_mailer: subject_template: "[%{site_name}] Email Deliverability Test" new_version_mailer: @@ -1046,8 +1065,8 @@ sq: subject_template: "[%{site_name}] ka perditesime" queued_posts_reminder: subject_template: - one: "[%{site_name}] 1 post waiting to be reviewed" - other: "[%{site_name}] %{count} posts waiting to be reviewed" + one: "[%{site_name}] 1 postim pret moderimin" + other: "[%{site_name}] %{count} postime po presin moderimin" flag_reasons: off_topic: "Your post was flagged as **off-topic**: the community feels it is not a good fit for the topic, as currently defined by the title and the first post." inappropriate: "Your post was flagged as **inappropriate**: the community feels it is offensive, abusive, or a violation of [our community guidelines](/guidelines)." @@ -1059,20 +1078,36 @@ sq: disagreed: "Thanks for letting us know. We're looking into it." deferred: "Thanks for letting us know. We're looking into it." deferred_and_deleted: "Thanks for letting us know. We've removed the post." - temporarily_closed_due_to_flags: "This topic is temporarily closed due to a large number of community flags." + temporarily_closed_due_to_flags: "Kjo temë është përkohësisht e mbyllur për shkak të një numri të madh sinjalizimesh nga komuniteti." system_messages: + post_hidden: + subject_template: "Postimi u fsheh ngaqë u sinjalizua nga komuniteti" + text_body_template: | + Përshëndetje, + + Ky është një mesazh automatik nga %{site_name} për t'ju njoftuar se postimi juaj u fsheh. + + %{base_url}%{url} + + %{flag_reason} + + Disa anëtarë të faqes sinjalizuan këtë postim. **Mund t'a modifikoni postimin pas %{edit_delay} minutash, dhe do të shfaqet automatikisht.** + + Sidoqoftë, nëse postimi fshihet nga komuniteti për një herë të dytë, postimi do të mbetet u fshehur derisa të ndërhyjë stafi. Stafi mund të vendosë edhe të pezullojë ose bllokojë llogarinë tuaj. + + Për udhëzime të mëtejshme, shikoni [rregullat e komunitetit](%{base_url}/guidelines). welcome_user: subject_template: "Mirë se vini tek %{site_name}!" text_body_template: | - Thanks for joining %{site_name}, and welcome! + Faleminderit që iu bashkuat %{site_name}, dhe mirësevini! %{new_user_tips} - We believe in [civilized community behavior](%{base_url}/guidelines) at all times. + Ne besojmë në [sjelljen e qytetëruar të komunitetit](%{base_url}/guidelines) kurdoherë. - Enjoy your stay! + Shijojeni qëndrimin tuaj! - (If you need to communicate with [staff members](%{base_url}/about) as a new user, just reply to this message.) + (Nëse ju duhet të komunikoni me [anëtarët e stafit](%{base_url}/about) si një anëtar i ri, thjesht përgjigjuni këtij mesazhi.) welcome_invite: subject_template: "Mirë se vini tek %{site_name}!" text_body_template: | @@ -1097,30 +1132,12 @@ sq: [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "Backup completed successfully" - text_body_template: "The backup was successful.\nVisit the [admin > backup section](%{base_url}/admin/backups) to download your new backup." backup_failed: subject_template: "Backup failed" - text_body_template: | - The backup has failed. - - Here's the log: - - ``` - %{logs} - ``` restore_succeeded: subject_template: "Restore completed successfully" - text_body_template: "The restore was successful." restore_failed: subject_template: "Restore failed" - text_body_template: | - The restore has failed. - - Here's the log: - - ``` - %{logs} - ``` bulk_invite_succeeded: subject_template: "Bulk user invite processed successfully" text_body_template: "Your bulk user invite file was processed, %{sent} invites mailed." @@ -1145,12 +1162,13 @@ sq: csv_export_failed: subject_template: "Data export failed" text_body_template: "We're sorry, but your data export failed. Please check the logs or contact a staff member." + email_reject_insufficient_trust_level: + subject_template: "[%{site_name}] Problem emaili -- Niveli i Besimit nuk mjafton" email_reject_no_account: subject_template: "[%{site_name}] Email issue -- Unknown Account" email_reject_empty: subject_template: "[%{site_name}] Email issue -- No Content" email_reject_parsing: - subject_template: "[%{site_name}] Email issue -- Content unrecognized" text_body_template: | We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work. @@ -1180,17 +1198,55 @@ sq: download_remote_images_disabled: subject_template: "Downloading remote images disabled" text_body_template: "The `download_remote_images_to_local` setting was disabled because the disk space limit at `download_remote_images_threshold` was reached." + dashboard_problems: + subject_template: "Gjetëm ca probleme" + text_body_template: | + Në panelin e kontrollit keni disa probleme që duhen riparuar. + + [Shikoji dhe rregulloji](%{base_url}/admin). + unsubscribe_link: | + Për të mos marrë më njoftime të tilla, [klikoni këtu](%{unsubscribe_url}). + unsubscribe_link_and_mail: | + Për të mos marrë më njoftime të tilla, [klikoni këtu](%{unsubscribe_url}). + unsubscribe_mailing_list: | + Ju po njoftoheni sepse keni aktivizuar metodën e listave me email. + Për të mos marrë më njoftime të tilla, [klikoni këtu](%{unsubscribe_url}). subject_re: "Re: " subject_pm: "[PM] " user_notifications: - previous_discussion: "Previous Replies" + previous_discussion: "Përgjigjet e mëparshme" in_reply_to: "Në Përgjigje Të" unsubscribe: - title: "Unsubscribe" - description: "Not interested in getting these emails? No problem! Click below to unsubscribe instantly:" - posted_by: "Posted by %{username} on %{post_date}" + title: "Çregjistrohuni" + description: "Nuk të interesojnë këto emaila? S'ka problem! Kliko më poshtë për të anuluar abonimin:" + reply_by_email: "[Shiko Temën](%{base_url}%{url}) ose përgjigjju këtij email-i për të postuar." + reply_by_email_pm: "[Shiko Mesazhin](%{base_url}%{url}) ose përgjigjju këtij email-i për të vazhduar bisedën." + only_reply_by_email: "Përgjigjju këtij email-i për të vazhduar." + visit_link_to_respond: "[Shiko Temën](%{base_url}%{url}) për tu përgjigjur." + visit_link_to_respond_pm: "[Shiko Mesazhin](%{base_url}%/{url}) për tu përgjigjur." + posted_by: "Postuar nga %{username} më %{post_date}" + invited_to_private_message_body: | + %{username} ju ftoi tek mesazhi + + > **%{topic_title}** + > + > %{topic_excerpt} + + në + + > %{site_title} -- %{site_description} + invited_to_topic_body: | + %{username} ju ftoi në një bisedë + + > **%{topic_title}** + > + > %{topic_excerpt} + + tek + + > %{site_title} -- %{site_description} user_invited_to_private_message_pm: - subject_template: "[%{site_name}] %{username} invited you to a message '%{topic_title}'" + subject_template: "[%{site_name}] %{username} të ka ftuar tek mesazhi '%{topic_title}'" text_body_template: | %{header_instructions} @@ -1198,7 +1254,7 @@ sq: %{respond_instructions} user_invited_to_private_message_pm_staged: - subject_template: "[%{site_name}] %{username} invited you to a message '%{topic_title}'" + subject_template: "[%{site_name}] %{username} të ka ftuar tek mesazhi '%{topic_title}'" text_body_template: | %{header_instructions} @@ -1206,7 +1262,7 @@ sq: %{respond_instructions} user_invited_to_topic: - subject_template: "[%{site_name}] %{username} invited you to '%{topic_title}'" + subject_template: "[%{site_name}] %{username} të ka ftuar tek tema '%{topic_title}'" text_body_template: | %{header_instructions} @@ -1283,8 +1339,18 @@ sq: %{context} %{respond_instructions} + user_watching_first_post: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_posted_pm: - subject_template: "[%{site_name}] [PM] %{topic_title}" + subject_template: "[%{site_name}] [MP] %{topic_title}" text_body_template: | %{header_instructions} @@ -1295,38 +1361,43 @@ sq: %{respond_instructions} user_posted_pm_staged: subject_template: "%{optional_re}%{topic_title}" - text_body_template: | + text_body_template: |2 %{message} digest: - why: "A brief summary of %{site_link} since your last visit on %{last_seen_at}" - new_activity: "New activity on your topics and posts:" - top_topics: "Popular posts" - other_new_topics: "Popular topics" - click_here: "click here" - read_more: "Read More" - more_topics: "There were %{new_topics_since_seen} other new topics." - more_topics_category: "More new topics:" + why: "Një përmbledhje e shkurtër e temave tek %{site_link} që prej vizitës tuaj të fundit më %{last_seen_at}" + subject_template: "[%{site_name}] - Një përmbledhje e shkurtër" + unsubscribe: "Kjo përmbledhje dërgohet nga %{site_link} kur nuk ju kemi parë prej disa kohësh. Për të çaktivizuar njoftimet %{unsubscribe_link}." + click_here: "klikoni këtu" + from: "%{site_name} - Një përmbledhje e shkurtër" + mailing_list: + subject_template: "[%{site_name}] Përmbledhja për %{date}" + unsubscribe: "Përmbledhja dërgohet përditë, duke qënë se faqja është në formatin \"mailing list\". %{unsubscribe_link} për t'u çabonuar." + from: "%{site_name} përmbledhje" + new_topics: "Tema të reja" + topic_updates: "Tema të azhornuara" + view_this_topic: "Shiko këtë temë" + back_to_top: "Kthehu sipër" forgot_password: - subject_template: "[%{site_name}] Password reset" + subject_template: "[%{site_name}] Rivendosje fjalëkalimi" text_body_template: | - Somebody asked to reset your password on [%{site_name}](%{base_url}). + Dikush kërkoi për të rivendosur fjalëkalimin tuaj tek [%{site_name}](%{base_url}). - If it was not you, you can safely ignore this email. + Nëse nuk ishit ju, mund të mos e merrni parasysh këtë email pa asnjë problem. - Click the following link to choose a new password: + Klikoni lidhjen e mëtejshme për të zgjedhur një fjalëkalim të ri: %{base_url}/users/password-reset/%{email_token} set_password: - subject_template: "[%{site_name}] Set Password" + subject_template: "[%{site_name}] Vendos fjalëkalimin" text_body_template: | - Somebody asked to add a password to your account on [%{site_name}](%{base_url}). Alternatively, you can log in using any supported online service (Google, Facebook, etc) that is associated with this validated email address. + Dikush kërkoi për të shtuar një fjalëkalim tek [%{site_name}](%{base_url}). Nga ana tjetër, mund të hyni në sistem duke përdorur një nga shërbimet online që mbështeten (Google, Facebook, etj) i cili është i lidhur me këtë adresë email. - If you did not make this request, you can safely ignore this email. + Nëse nuk e bëtë ju këtë kërkesë, mund të mos e merrni parasysh këtë email pa asnjë problem. - Click the following link to choose a password: + Klikoni lidhjen e mëtejshme për të zgjedhur një fjalëkalim: %{base_url}/users/password-reset/%{email_token} admin_login: - subject_template: "[%{site_name}] Login" + subject_template: "[%{site_name}] Identifikohu" text_body_template: | Somebody asked to login to your account on [%{site_name}](%{base_url}). @@ -1335,52 +1406,77 @@ sq: Click the following link to login: %{base_url}/users/admin-login/%{email_token} account_created: - subject_template: "[%{site_name}] Your New Account" + subject_template: "[%{site_name}] Llogaria Juaj e Re" text_body_template: | - A new account was created for you at %{site_name} + Një llogari e re u krijua për ju tek %{site_name} - Click the following link to choose a password for your new account: + Klikoni lidhjen e mëtejshme për të zgjedhur një fjalëkalim për llogarinë tuaj të re: %{base_url}/users/password-reset/%{email_token} - signup_after_approval: - subject_template: "You've been approved on %{site_name}!" + confirm_new_email: + subject_template: "[%{site_name}] Konfirmo adresën e re email" text_body_template: | - Welcome to %{site_name}! + Konfirmo adresën e re email për faqen %{site_name} duke klikuar në linkun më poshtë: - A staff member approved your account on %{site_name}. + %{base_url}/users/authorize-email/%{email_token} + confirm_old_email: + subject_template: "[%{site_name}] Konfirmoni adresën e tanishme email" + text_body_template: | + Përpara se sa ta ndryshoni adresën tuaj email, nevojitet të konfirmoni që jeni i + zoti i saj. Pasi ta përmbushni këtë hap, ne + do të miratojmë adresën tuaj të re email. - Click the following link to confirm and activate your new account: + Konfirmoni adresën tuaj të tanishme email për %{site_name} duke klikuar lidhjen e mëtejshme: + + %{base_url}/users/authorize-email/%{email_token} + notify_old_email: + subject_template: "[%{site_name}] Adresa juaj email u ndryshua" + text_body_template: | + Ky është një mesazh automatik që ju njofton se adresa juaj email për + %{site_name} u ndryshua. Nëse ky është një gabim, njoftoni një administrator + + Adresa e re email në sistem tani është: + + %{new_email} + signup_after_approval: + subject_template: "Jeni aprovuar tek %{site_name}!" + text_body_template: | + Mirësevini tek %{site_name}! + + Një anëtar stafi miratoi llogarinë tuaj në %{site_name}. + + Klikoni lidhjen e mëtejshme për të konfirmuar dhe aktivizuar llogarinë tuaj të re: %{base_url}/users/activate-account/%{email_token} - If the above link is not clickable, try copying and pasting it into the address bar of your web browser. + Nëse lidhja e mësipërme nuk punon, mundohuni ta kopjoni dhe hapni atë në shfletuesin tuaj web. %{new_user_tips} - We believe in [civilized community behavior](%{base_url}/guidelines) at all times. + Ne besojmë në [sjelljen e qytetëruar të komunitetit](%{base_url}/guidelines) kurdoherë. - Enjoy your stay! + Shijojeni qëndrimin tuaj! - (If you need to communicate with [staff members](%{base_url}/about) as a new user, just reply to this message.) + (Nëse ju duhet të komunikoni me [anëtarët e stafit](%{base_url}/about) si një anëtar i ri, thjesht përgjigjuni këtij mesazhi.) signup: - subject_template: "[%{site_name}] Confirm your new account" + subject_template: "[%{site_name}] Konfirmoni llogarinë tuaj të re" text_body_template: | - Welcome to %{site_name}! + Mirësevini tek %{site_name}! - Click the following link to confirm and activate your new account: + Klikoni lidhjen e mëtejshme dhe aktivizoni llogarinë tuaj të re: %{base_url}/users/activate-account/%{email_token} - If the above link is not clickable, try copying and pasting it into the address bar of your web browser. + Nëse lidhja e mësipërme nuk punon, mundohuni ta kopjoni dhe hapni atë në shfletuesin tuaj web. page_not_found: - popular_topics: "Popular" - recent_topics: "Recent" - see_more: "More" - search_title: "Search this site" + popular_topics: "Popullore" + recent_topics: "Më të fundit" + see_more: "Më shumë" + search_title: "Kërko në këtë faqe" search_google: "Google" login_required: welcome_message: | #[Welcome to %{title}](#welcome) An account is required. Please create an account or log in to continue. terms_of_service: - title: "Terms of Service" + title: "Kushtet e shërbimit" signup_form_message: 'I have read and accept the Terms of Service.' deleted: 'deleted' upload: @@ -1394,6 +1490,7 @@ sq: too_large: "Sorry, the image you are trying to upload is too big (maximum size is %{max_size_kb}KB), please resize it and try again." size_not_found: "Sorry, but we couldn't determine the size of the image. Maybe your image is corrupted?" email_log: + post_user_deleted: "Përdoruesi i këtij postimi është fshirë." no_user: "Can't find user with id %{user_id}" anonymous_user: "User is anonymous" suspended_not_pm: "User is suspended, not a message" @@ -1401,26 +1498,26 @@ sq: post_not_found: "Can't find a post with id %{post_id}" notification_already_read: "The notification this email is about has already been read" topic_nil: "post.topic is nil" - post_deleted: "post was deleted by the author" + post_deleted: "autori e ka fshirë postimin" user_suspended: "user was suspended" already_read: "user has already read this post" message_blank: "message is blank" message_to_blank: "message.to is blank" text_part_body_blank: "text_part.body is blank" - body_blank: "body is blank" + body_blank: "përmbajtja është bosh" color_schemes: base_theme_name: "Baza" about: "Rreth" - guidelines: "Guidelines" - privacy: "Privacy" - edit_this_page: "Edit this page" + guidelines: "Udhëzimet" + privacy: "Privatësia" + edit_this_page: "Modifiko këtë faqe" csv_export: boolean_yes: "Po" boolean_no: "Jo" static_topic_first_reply: | - Edit the first post in this topic to change the contents of the %{page_name} page. + Modifiko postimin e parë të kësaj teme puer të ndryshuar përmbajtjen e faqes %{page_name}. guidelines_topic: - title: "Pyetjet/Udhëzimet" + title: "Pyetje dhe Përgjigje/Udhëzime" body: | @@ -1659,18 +1756,222 @@ sq: privacy_topic: title: "Politika e Privatësisë" badges: + editor: + name: Redaktor + description: Redaktori i parë i postimit + long_description: | + Kjo stemë jepet kur ndryshoni një nga postimet tuaja për herë të parë. Ndërkohë që nuk do jetë e mundur të ndryshoni postimet tuaja përgjithmonë, ndryshimi është gjithmonë një ide e mirë - ju mund të përmirësoni postimet tuaja, të korigjoni gabime të vogla, apo të shtoni çdo gjë që mungonte nga postimi i parë. Ndryshojini postimet që t'i bëni akoma më të mira! + basic_user: + name: Anëtar i Thjeshtë + description: Ka të drejtat bazë të një anëtari në këtë komunitet Informacion shtesë në anglisht + long_description: | + Kjo stemë jepet kur ju arrini nivelin e bisedës 1. Falemindeit që jeni përreth prej ca kohësh dhe që lexoni disa tema për të mësuar më tepër rreth komunitetit tonë. Limitet e përdoruesit të ri janë hequr, keni mundësi të përdorni të gjitha aftësitë kryesore të komunitetit, si mesazhet private, sinjalizimet, ndryshim për wiki, dhe aftësinë për të postuar disa imazhe njëherazi dhe lidhje. member: - name: Anëtarë + name: Anëtar + description: U dha mundësia për ftesa, mesazhe në grup, më shumë pëlqime + long_description: | + Kjo stemë jepet kur ju arrini nivelin e besimit 2. Faleminderit që jeni pjesë prej më shumë se disa javësh e komunitetit tonë. Ju tashmë mund të dërgoni ftesa nga faqja juaj e përdoruesit ose nga tema të veçanta, të krijoni mesazhe në grup, dhe të keni ca pëlqime më shumë në ditë. regular: - name: I rregullt + name: I zakonshëm + description: U dha mundësia për ri-kategorizim, ri-emërtim, lidhje ndjekëse, wiki, dhe më shumë pëlqime + long_description: | + Kjo stemë jepet kur ju arrini nivelin e besimit 3. Faleminderit që jeni pjesë e komutetit tonë prej disa muajsh. Ju jeni tashmë një prej lexuesve më aktivë, dhe një bashkëpunëtor i besueshëm që përmirëson komunitetin tonë. Ju mundet tashmë të ri-kategorizoni dhe ri-emëroni temat, të keni cilësime të mëtejshme për sinjalizime spam-esh, të keni hyrje në zona private të faqes, gjithashtu dhe më tepër pëlqime ditore. leader: name: Udhëheqës + description: Dhënë mundësia për ndryshim të gjithanshëm, ngjitje në krye, mbyllje, arkivim, ndarje dhe ngjitje, më tepër pëlqime + long_description: | + Kjo stemë jepet kur ju arrini nivelin e besimit 4. Jeni një udhëheqës në këtë komunitet si i përzgjedhur nga stafi, dhe ju jeni një shembull për pjesën tjetër të anëtarëve me veprimet dhe fjalët tuaja këtu. Ju keni mundësinë të ndryshoni të gjitha postimet, të aftë për moderime të tjera siç janë ngjitja në krye, mbyllja, çlistimi, arkivimi, ndarja dhe ngjitja, dhe ju keni tonelata pëlqimesh ditore. welcome: name: Mirë se vini + description: Mori një pëlqim + long_description: | + Kjo stemë jepet kur merrni pëlqimin e parë për një postim. Urime, keni postuar diçka të cilën anëtarët e komunitetit e gjetën interesante, fantastike apo të dobishme! + autobiographer: + name: Autobiograf + description: Plotësoi profilin e anëtarit + long_description: | + Kjo stemë jepet kur mbushni profilin tuaj dhe zgjidhni një imazhi profili. Kur lejoni komunitetin t'ju njohë ca më shumë se kush jeni dhe çfarë ju intereson, ndihmon në përmirësimin dhe lidhjen e mëtejshme të komunitetit. Bashkohuni me ne! anniversary: - name: Përvjetori + name: Përvjetor + description: Anëtar aktiv për një vit, postoi të paktën një herë + long_description: | + Kjo stemë jepet kur keni qenë një anëtar për një vit me të paktën një postim për atë vit. Faleminderit që jeni përreth dhe jepni ndihmën tuaj për komunitetin tonë. Ne nuk mund t'ia dilnim pa ju. + nice_post: + name: Përgjigje e mirë + description: Mori 10 pëlqime në një përgjigje + long_description: | + Kjo stemë jepet kur përgjigja juaj merr 10 pëlqime. Përgjigja juaj ishte vërtet e goditur për komunitetit dhe ndihmoi në ecjen e bisedës më tej! + good_post: + name: Përgjigje goxha e mirë + description: Mori 25 pëlqime në një përgjigje + long_description: | + Kjo stemë jepet kur përgjigja juaj merr 25 pëlqime. Përgjigja juaj ishte e jashtëzakonshme dhe e shndërroi bisedën më të pëlqyeshme për këdo! + great_post: + name: Përgjigje shumë e mirë + description: Mori 50 pëlqime në një përgjigje + long_description: | + Kjo stemë jepet kur përgjigja juaj merr 50 pëlqime. Uau! Përgjigja juaj ishte frymëzuese, interesante, për të qeshur, ose e mprehtë dhe komuniteti e pëlqeu jashtë mase! + nice_topic: + name: Temë e mirë + description: Mori 10 pëlqime në një temë + long_description: | + Kjo stemë jepet kur tema juaj merr 10 pëlqime. Hej, ju nisët një bisedë interesante që komuniteti e shijoi! + good_topic: + name: Temë goxha e mirë + description: Mori 25 pëlqime në një temë + long_description: | + Kjo stemë jepet kur tema juaj merr 25 pëlqime. Ju nisët një bisedë të zjarrtë për të cilën komuniteti u mblodh përreth dhe e pëlqeu! + great_topic: + name: Temë shumë e mirë + description: Mori 50 pëlqime në një temë + long_description: | + Kjo stemë jepet kur tema juaj merr 50 pëlqime. Ju nisët një bisedë interesante dhe komuniteti e shijoi bisedën dinamike që ndoqi! + nice_share: + name: Shpërndarje e mirë + description: Ndau një postim me 25 vizitorë unikë + long_description: | + Kjo stemë jepet kur shpërdan një lidhje që është klikuar nga 25 vizitorë të jashtëm. Faleminderit që keni përhapur fjalën rreth bisedave tona, dhe këtij komuniteti. + good_share: + name: Shpërndarje goxha e mirë + description: Ndau një postim me 300 vizitorë unikë + long_description: | + Kjo stemë jepet kur shpërdan një lidhje që është klikuar nga 300 vizitorë të jashtëm. Punë e paqme! Keni reklamuar një diskutim të mire tek një grup njerëzish të panjohur dhe keni ndihmuar në rritjen e këtij komuniteti. + great_share: + name: Shpërndarje shumë e mirë + description: Ndau një postim me 1000 vizitorë unikë + long_description: | + Kjo stemë jepet kur shpërdan një lidhje që është klikuar nga 1000 vizitorë të jashtëm. Uau! Keni reklamuar një bisedë interesante tek një lexues i shumtë dhe i ri, dhe ndihmuat mjaft në rritjen e komunitetit! + first_like: + name: Pëlqimi i Parë + description: Pëlqeu një postim + long_description: | + Kjo stemë jepet kur për herë të parë ju pëlqeni një postim duke përdorur butonin :heart:. Të pëlqyerit e një postimi është një mënyrë shumë e mirë për t'u bërë të ditur anëtarëve të tjerë që postimi i tyre ishte interesant, i dobishëm, fantastik apo zbavitës. Shpërndaj dashuri! + first_flag: + name: Sinjalizimi i parë + description: Sinjalizoi një postim + long_description: | + Kjo stemë jepet kur për herë të parë sinjalizoni një postim. Sinjalizimi është mënyra se si ndihmojmë në mbajtjen pastër të faqes për këdo. Nëse vini re ndonjë postim që ka nevojë për vëmendjen e një moderatori për cilëndo arsye, ju lutem mos ngurroni të sinjalizoni. Gjithashtu mund të sinjalizoni duke u nisur një mesazh personal përdoruesve nëse shihni diçka që nuk shkon me postimin e tyre. Nëse shihni një problem, :flag_black: sinjalizojeni! + promoter: + name: Promotor + description: Ftoi një anëtar të ri në faqe + long_description: | + Kjo stemë jepet kur ftoni dikë për t'u bërë pjesë e komunitetit nëpërmjet butonit të ftesave në faqen e përdoruesit, ose në fund të faqes. Duke ftuar miq që mund të jenë të interesuar në biseda të veçanta është një mënyrë shumë e mirë të paraqesësh njerëz të rinj në komunitet, kështu që faleminderit! + campaigner: + name: Ambasador + description: Ftoi 3 anëtarë të thjeshtë + long_description: | + Kjo stemë jepet kur ke ftuar 3 persona që në vazhdim, kanë shpenzuar kohë mjaftueshëm në faqe për t'u bërë anëtarë të thjeshtë. Një komunitet kumbues ka nevojë për anëtarë të rinj që marrin pjesë rregullisht dhe i shtojnë zëra të rinj bisedave. + champion: + name: Mega-ambasador + description: Ftoi 5 anëtarë + long_description: | + Kjo stemë jepet kur ke ftuar 5 persona që në vazhdim, kanë shpenzuar kohë mjaftueshëm në faqe për t'u bërë anëtarë të plotë. Uau! Faleminderit për zgjerimin e komunitetit tonë me anëtarë të rinj! + first_share: + name: Shpërndarja e parë + description: Shpërndau një postim + long_description: | + Kjo stemë jepet kur për herë të parë ju ndani një lidhje tek një përgjigje apo temë duke përdorur butonin e shpërndarjes. Të ndarët e lidhjeve është të tregosh biseda interesante me pjesën tjetër të botës dhe të rritësh komunitetitn tënd. + first_link: + name: Lidhja e parë + description: Shtoi një lidhje drejt një teme tjetër + long_description: | + Kjo stemë jepet kur për herë të parë shtoni një lidhje tek një temë tjetër. Duke lidhur tema ndihmoni lexuesit e tjerë të gjejnë biseda interesante që kanë lidhje, duke shfaqur lidhjen midisi temave nga të dyja anët. Shtoni lidhje lirisht! + first_quote: + name: Citimi i parë + description: Citoi një postim + long_description: | + Kjo stemë jepet kur për herë të parë citoni një postim në përgjigjen tuaj. Të cituarit në përgjigjen tuaj e pjesëve të rëndësishme prej postimeve të mëparshme, ndihmon në mbajtjen e bisedave të lidhura me njëra-tjetrën dhe brenda tematikës. Mënyra më e lehtë për të cituar është duke theksuar pjesë të një postimi, dhe duke shtypur më pas butonin përgjigju. Citoni me bollëk! + read_guidelines: + name: Lexoi Udhëzimet + description: Ka lexuar udhëzimet e komunitetit + long_description: | + Kjo stemë jepet pasi lexon udhëzimet e komunitetit. Duke ndjekur dhe ndarë këto udhëzime të thjeshta ndihmon në ndërtimin e një komuniteti të sigurtë, dëfryes dhe të qëndrueshëm. Gjithmonë kini parasysh që është një tjetër qënie njerëzore, dikush shumë i ngjashëm me ju, në anën tjetër të ekranit. Silluni mirë! + reader: + name: Lexues + description: Lexoi çdo përgjigje në një temë me mbi 100 përgjigje + long_description: | + Kjo stemë jepet për herën e parë kur lexoni një temë të gjatë me më tepër se 100 përgjigje. Kur lexon një bisedë ndihmon në ndjekjen e diskutimit, kupton këndvështrimet e ndryshme, dhe çon në biseda më interesante. Sa më shumë lexon, aq më e mirë bëhet biseda. Siç na pëlqen ta themi, të Lexuarit është Themelore! :slight_smile: + popular_link: + name: Lidhje popullore + description: Postoi një lidhje të jashtme që mori 50 klikime + long_description: | + Kjo stemë jepet kur një lidhje që ndatë merr 50 klikime. Faleminderit që postuat një lidhje të dobishme që rriti intersimin në bisedë. + hot_link: + name: Lidhje shumë popullore + description: Postoi një lidhje të jashtme që mori 300 klikime + long_description: | + Kjo stemë jepet kur një lidhje që shpërndatë merr 300 klikime. Faleminderit që postuat një lidhje interesante që e shpuri bisedën përpara dhe ndezi diskutimin! + famous_link: + name: Lidhje e famshme + description: Postoi një lidhje të jashtme që mori 1000 klikime + long_description: | + Kjo stemë jepet kur një lidhje që shpërndani merr 1000 klikime. Uau! Ju postuat një lidhje që ka përmirësuar bisedën duke shtuar detaje të rëndësishme, kontekst, dhe të dhëna. Punë e paqme! + appreciated: + name: I vlerësuar nga komuniteti + description: Mori 1 pëlqim në 20 postime + long_description: | + Kjo stemë jepet kur merrni të paktën një pëlqim në 20 postime të ndryshme. Komunitetit i pëlqen mundi juaj nëpër bisedimet këtu! + respected: + name: I respektuar + description: Mori 2 pëlqime në 100 postime + long_description: |+ + Kjo stemë jepet kur merrni të paktën 2 pëlqime në 100 postime të ndryshme. Po fitoni respektin e komunitetit për mundin e shumtë nëpër bisedimet këtu. + + admired: + name: I admiruar + description: Mori 5 pëlqime në 300 postime + long_description: | + Kjo stemë jepet kur merrni të paktën 5 pëlqime në 300 postime të ndryshme. Uau! Komuniteti e admiron mundin e shpeshtë dhe të një cilësie të lartë për bisedimet këtu. + out_of_love: + name: Me zemër të zbrazur + description: Përdori 50 pëlqime në një ditë + long_description: | + Kjo stemë jepet kur ju përdorni të gjitha nga 50 pëlqimet tuaja ditore. Kur kujtohesh të gjesh kohë dhe të pelqesh postimet që ju pëlqejnë dhe vlerësoni, nxit anëtarët e komunitetit të krijojnë akoma më shumë biseda të mira në të ardhmen. + higher_love: + name: Zemërhapur + description: Dha 50 pëlqime në ditë për 5 ditë rresht + long_description: | + Kjo stemë jepet kur ju pëlqeni 50 postime në 5 ditë. Faleminderit që merrni nga koha juaj për të nxitur bisedat më të mira çdo ditë! + crazy_in_love: + name: Zemërluan + description: Ka dhënë 50 pëlqime në ditë mbi 20 herë + long_description: | + Kjo stemë jepet kur ju pëlqeni 50 postime brenda 20 ditëve. Uau! Ju jeni një shembull nxitjeje të rregullt të anëtarëve të komunitetit! + thank_you: + name: Faleminderit + description: Ka pëlqyer 20 postime dhe ka dhënë 10 pëlqime + long_description: | + Kjo stemë jepet kur keni 20 postime të pelqyera dhe jepni 10 apo më shumë pëlqime në këmbim. Kur dikush pëlqen postimet tuaja, ju gjeni kohën të pëlqeni çfarë të tjerët postojnë, gjithashtu. + gives_back: + name: Jep e merr + description: Ka pëlqyer 100 postime dhe ka dhënë 100 pëlqime + long_description: | + Kjo stemë jepet kur keni 100 postime të pelqyera dhe jepni 100 apo më shumë pëlqime në këmbim. Faleminderit që parapaguani! + empathetic: + name: Empatik + description: Ka pëlqyer 500 postime dhe ka dhënë 1000 pëlqime + long_description: | + Kjo stemë jepet kur ju keni 500 postime të pëlqyera dhe kur jepni 1000 apo më tepër pëlqime në këmbim. Uau! Qenkeni shembulli i zemërgjërit dhe vlerësimit të dyanshëm :two_hearts:. + first_emoji: + name: Emoji i parë + description: Përdori Emoji në një postim + long_description: | + Kjo stemë jepet kur ju shtoni një Emoji në postimin tuaj për herë të parë :thumbsup:. Emoji ju lejon të përçoni emocionet në postimet tuaja, prej kënaqësisë :smiley: tek mërzitja :anguished: e deri tek inati :angry: dhe çdo gjë midis :sunglasses:. Thjesht filloni të shkruani : (dy pika) ose shtypni butonin Emoji në shiritin e veglave të fushës së shkrimit për të zgjedhur mes qindra llojesh :ok_hand: + first_mention: + name: Përmendja e parë + description: Përmendi një përdorues në një postim + long_description: Kjo stemë jepet herën e parë kur ju përmendni @username e dikujt në një postim. Secila përmendje krijon një njoftim për atë person, që të vihen në dijeni për postimin tuaj. Thjesht filloni të shtypni @ (simbolin te) për të përmendur çdo përdorues ose, nëse e mundur, çdo grup - është një mënyrë e volitshme për të patur vëmendjen e dikujt. + first_onebox: + name: Onebox i Parë + description: Postoi një lidhje në onebox + long_description: Kjo stemë jepet herën e parë kur postoni një lidhje në një rresht të vetëm, i cili shpaloset automatikisht në një onebox me një përmbledhje të shkurtër të lidhjes, një titull, dhe (kur është e mundur) një imazh. + first_reply_by_email: + name: Përgjigja e parë me email + description: Iu përgjigj një postimi me email + long_description: | + Kjo stemë jepet herën e parë kur i përgjigjeni një postimi nëpërmjet email-it :e-mail: admin_login: - success: "Email Sent" + success: "Emaili u dërgua" error: "Error!" email_input: "Admin Email" submit_button: "Dërgo Email" @@ -1679,8 +1980,10 @@ sq: performance_report: initial_post_raw: This topic includes daily performance reports for your site. initial_topic_title: Raportet e performancës se faqes - time: - <<: *datetime_formats + wizard: + step: + emoji: + title: "Emoji" activemodel: errors: <<: *errors diff --git a/config/locales/server.sv.yml b/config/locales/server.sv.yml index 9e3620fd499..1488d3d9c10 100644 --- a/config/locales/server.sv.yml +++ b/config/locales/server.sv.yml @@ -71,7 +71,6 @@ sv: has_already_been_used: "har redan använts" inclusion: är inte inkluderad i listan invalid: är ogiltig - is_invalid: "är ogiltig; försök att vara lite mer beskrivande" less_than: måste vara mindre än %{count} less_than_or_equal_to: måste vara mindre eller lika med %{count} not_a_number: är inte ett nummer @@ -105,12 +104,11 @@ sv: max_username_length_range: "Du kan inte sätta maximum högre än minimum." default_categories_already_selected: "Du kan inte välja en kategori som används i en annan lista. " s3_upload_bucket_is_required: "Du kan inte aktivera uppladdning till S3 innan du har angivit 's3_upload_bucket'." - bulk_invite: - file_should_be_csv: "Den uppladdade filen ska vara i csv eller txt format." backup: operation_already_running: "En operation är redan igång. Kan inte starta ett nytt jobb just nu." backup_file_should_be_tar_gz: "Backup-filen ska vara ett .tar.gz arkiv." not_enough_space_on_disk: "Det finns inte tillräckligt mycket utrymme på disken för att ladda upp denna backup." + invalid_filename: "Backupfilnamnet innehåller ogiltiga tecken. Giltiga tecken är a-z 0-9 . - _." not_logged_in: "Du måste vara inloggad för att göra detta." not_found: "Den efterfrågade URL:en eller resursen kan inte hittas." invalid_access: "Du har inte behörighet att visa den efterfrågade resursen." @@ -158,7 +156,6 @@ sv: topic_not_found: "Något har gått fel. Kanske har ämnet stängts eller raderats medan du tittade på det?" just_posted_that: "är för likt det du nyligen postade" invalid_characters: "innehåller otillåtna tecken" - is_invalid: "är ogiltig; försök att skriva lite mer detaljerad" next_page: "nästa sida →" prev_page: "← föregående sida" page_num: "Sida %{num}" @@ -310,7 +307,7 @@ sv: assets_topic_body: "Detta är ett permanent ämne, endast synligt för personal, med syfte att lagra bilder och filer som ska användas till webbplatsens design. Radera ej detta ämne!\n\n\nSå här fungerar det:\n\n\n1. Svara på detta ämne.\n2. Ladda upp alla bilder du vill använda som logotyp, favicon och så vidare här. (Använd verktygfältets uppladdningsikon i inläggsredigeraren, eller dra-och-släpp eller klistra in bilder)\n3. Skicka ditt svar för att posta det.\n4. Högerklicka på bilderna i ditt nya inlägg för att få sökvägen till de uppladdade bilderna, eller klicka på redigera-ikonen för att redigera inlägget och på så sätt hämta sökvägen till bilderna. Kopiera bildernas sökväg. \n5. Klistra in bildernas sökvägar i de [grundläggande inställningarna](/admin/site_settings/category/required).\n\n\nOm du behöver möjliggöra uppladdning av flera olika filtyper, redigera `authorized_extensions` i [inställningarna för filer](/admin/site_settings/category/files)." lounge_welcome: title: "Välkommen till loungen" - body: | + body: |2 Grattis! :confetti_ball: @@ -525,6 +522,11 @@ sv: title: 'Rösta' description: 'Rösta för detta inlägg' long_form: 'röstade för detta inlägg' + user_activity: + no_bookmarks: + others: "Inga bokmärken." + no_likes_given: + others: "Inga gillade inlägg." topic_flag_types: spam: title: 'Spam' @@ -566,6 +568,14 @@ sv: different_user_description: "Du är för tillfället inloggad som en annan användare än den vi skickade e-post till. Var vänlig och logga ut, eller aktivera anonymt läge, och försök igen." not_found_description: "Tyvärr, vi kunde inte hitta den här avprenumerationen. Är det möjligt att länken i din e-post har löpt ut?" log_out: "Logga ut" + user_api_key: + authorize: "Auktorisera" + read: "läs" + read_write: "läs/skriv" + scopes: + message_bus: "Live uppdateringar" + read: "Läs alla" + write: "Skriv alla" reports: visits: title: "Användarbesök" @@ -721,14 +731,6 @@ sv: s3_backup_config_warning: 'Servern är konfigurerad till att ladda upp säkerhetskopior till s3, men minst en av följande inställningar är inte satta: s3_access_key_id, s3_secret_access_key eller s3_backup_bucket. Gå till Webbplatsinställningarna och uppdatera inställningarna. Se "How to set up image uploads to S3?" för att lära dig mer.' image_magick_warning: 'Servern är konfigurerad att skapa ikoner av stora bilder, men ImageMagick är inte installerad. Installera ImageMagick med din föredragna pakethanterare eller ladda hem den senaste utgåvan.' failing_emails_warning: 'Det finns %{num_failed_jobs} e-postutskick som har misslyckats. Kontrollera din app.yml-fil för att säkerställa att serverinställningarna för e-post är korrekta. Se alla misslyckade utskick i Sidekiq.' - default_logo_warning: "Ange de grafiska logotyperna för din webbplats. Uppdatera logo_url, logo_small och favicon_url i webbplatsinställningarna." - contact_email_missing: "Ange en e-postadress för webbplatsen så att du kan nås vid brådskande ärenden. Uppdatera i webbplatsinställningarna." - contact_email_invalid: "Webbplatsens e-postadress för kontakt är ogiltig. Uppdatera den i webbplatsinställningarna." - title_nag: "Ange namnet på webbplatsen. Uppdatera titeln i webbplatsinställningarna." - site_description_missing: "Ange en beskrivning om din webbplats i en mening, som dyker upp i sökresultat. Uppdatera site_description i webbplatsinställningarna." - consumer_email_warning: "Din sida är konfigurerad till att använda Gmail (eller någon annan konsumenttjänst) för att skicka e-post. Gmail begränsar antalet e-post du kan skicka. Överväg att använda en tjänsteleverantör som exempelvis mandrill.com för att säkerställa att all e-post levereras." - site_contact_username_warning: "Ange namnet på en vänlig person ur personalen att skicka viktiga automatiserade meddelanden från. Uppdatera site_contact_username i webbplatsinställningarna." - notification_email_warning: "E-postmeddelanden med notiser skickas inte från en giltig e-postadress från din domän; e-postleverering kommer att vara erratisk och oberäknelig. Var vänlig och ställ in notification_email till en giltig lokal e-postadress i webbplatsinställningarna." subfolder_ends_in_slash: "Inställningarna för dina undermappar är inte korrekt; DISCOURSE_RELATIV_URL_ROOT slutar med ett snedstreck." email_polling_errored_recently: one: "E-postpolling har genererat ett fel de senaste 24 timmarna. Se loggarna för mer detaljer." @@ -782,7 +784,6 @@ sv: show_pinned_excerpt_mobile: "Visa inte utdrag för klistrade ämnen i mobilen." show_pinned_excerpt_desktop: "Visa inte utdrag för klistrade ämnen på datorn." post_onebox_maxlength: "Maxlängd på ett onebox:at Discourse-inlägg i antal tecken." - onebox_domains_whitelist: "En lista över alla domäner som tillåter onebox; dessa domäner bör stödja OpenGraph eller oEmbed. Testa dem på http://iframely.com/debug" logo_url: "Logotypen i övre vänstra sidan av din webbplats bör ha en bred rektangulär form. Om den lämnas blank kommer webbplatsens titel att visas. " digest_logo_url: "Den alternativa logotypen används överst i din webbplats e-postsammanfattning. Den bör ha en bred rektangulär form. Den borde inte vara en SVG-bild. Om den lämnas blank kommer `logo_url` att användas." logo_small_url: "Den lilla logotypen som visas i övre vänstra hörnet av hemsidan när man bläddrar ned i ämnen. Om den lämnas blank kommer hemloggan visas." @@ -849,9 +850,7 @@ sv: show_email_on_profile: "Visa en användares e-postadress på deras profil (endast synlig för de själva och för personal)" prioritize_username_in_ux: "Använd användarnamn först på användarsidan, användarkortet och inlägg (när inaktiverad så visas namnet först)" email_token_valid_hours: "Glömt lösenord / aktivera konto länkar är giltiga i (n) timmar." - email_token_grace_period_hours: "Glömt lösenord / aktivera konto länkar är fortfarande giltiga i en nådefrist på (n) timmar efter att ha blivit utlösta." enable_badges: "Aktivera utmärkelsesystemet" - enable_whispers: "Tillåt privat kommunikation mellan personal inom ett ämne. (experimentellt)" allow_index_in_robots_txt: "Specificera i robots.txt att den här webbplatsen tillåter att bli indexerad av sökmotorer. " email_domains_blacklist: "En pipe-avgränsad lista av alla e-postdomän som användare inte tillåts registrera konton med. Exempel: mailinator.com, trashmail.net" email_domains_whitelist: "En pipe-avgränsad lista av alla e-postdomän som användare MÅSTE registrera konton med. VARNING: Användare med e-postdomän som inte finns på listan kommer inte att tillåtas!" @@ -1036,7 +1035,6 @@ sv: auto_block_first_post_regex: "Skriftlägeskänsligt regex som om godkänt kommer att orsaka att första inlägget av en användare blockeras och skickas till kön för saker som behöver granskas. Exempel: raging|a[bc]a kommer att orsaka att alla inlägg som börjar med raging eller aba eller aca blockeras vid första försöket. Gäller endast användarens första inlägg. " reply_by_email_enabled: "Aktivera möjlighet att svara på ämnen via e-post." reply_by_email_address: "Mall för inkommande e-postadress för svar via e-post, till exempel: %{reply_key}@svar.exempel.se eller svar+%{reply_key}@exempel.se" - alternative_reply_by_email_addresses: "Lista av alternativa mallar för inkommande e-postadresser för svar via e-post." incoming_email_prefer_html: "Använd HTML istället för texten för inkommande e-post. Kan orsaka oväntade formatteringsproblem!" disable_emails: "Förhindra Discourse från att skicka någon form av e-post" strip_images_from_short_emails: "Rensa bilder från e-post som har mindre storlek än 2800 bytes." @@ -1048,10 +1046,11 @@ sv: max_emails_per_day_per_user: "Högsta antal e-postmeddelanden att skicka till användare per dag. Ange 0 för att inaktivera gränsen" enable_staged_users: "Skapa automatiskt arrangerade användare vid bearbetning av inkommande e-post." maximum_staged_users_per_email: "Högsta antal arrangerade användare skapade vid bearbetning av inkommande e-post." - auto_generated_whitelist: "Lista av e-postadresser som inte undersöks för autogenererat innehåll." block_auto_generated_emails: "Blockera inkommande e-post som identifieras som autogenererat." ignore_by_title: "Ignorera inkommande e-post baserat på dess rubrik." mailgun_api_key: "Mailgun Secret API-nyckel att använda för att verifiera webhook-meddelanden." + attachment_content_type_blacklist: "lista av fraser som används till att svartlista bilagor baserade på innehållstyper" + attachment_filename_blacklist: "Lista över fraser som används till att svartlista bilagor baserade på filnamnet" pop3_polling_enabled: "Poll via POP3 för e-postsvar." pop3_polling_ssl: "Använd SSL vid anslutning till POP3-servern. (Rekommenderat)" pop3_polling_period_mins: "Tidsintervall i minuter mellan varje kontroll av POP3-kontot för e-post. OBS: kräver omstart." @@ -1075,7 +1074,6 @@ sv: allow_animated_thumbnails: "Genererar animerade ikoner av animerade gif:ar." default_avatars: "URL:er till avatarer som kommer att användas utgångsläge för nya användare tills de ändrar dem." automatically_download_gravatars: "Ladda ned Gravatars för användare vid kontoregistrering eller e-postadressbyte." - digest_topics: "Högsta antal ämnen att visa i e-postsammanfattningen." digest_min_excerpt_length: "Minsta antal inläggsutdrag i e-postsammanfattningen, i tecken." delete_digest_email_after_days: "Undertryck e-postsammanfattningar för användare som inte har besökt webbplatsen i mer än (n) dagar." digest_suppress_categories: "Undertryck de här kategorierna från e-postsammanfattningar." @@ -1120,7 +1118,6 @@ sv: embed_whitelist_selector: "CSS-väljare för element som tillåts bäddas in. " embed_blacklist_selector: "CSS-väljare för element som tas bort från inbäddningar." notify_about_flags_after: "Skicka ett e-postmeddelande till contact_email om det finns flaggor som inte har hanterats efter så här många timmar. Ange 0 för att inaktivera." - enable_cdn_js_debugging: "Tillåt /logs att visa lämpliga fel genom att lägga till ursprungstillståndet på alla js-inkluderingar." show_create_topics_notice: "Visa en notis som ber administratörerna att skapa några ämnen om webbplatsen har färre än 5 publika ämnen." delete_drafts_older_than_n_days: Ta bort utkast som är äldre än (n) dagar. bootstrap_mode_min_users: "Minsta antal användare som krävs för att inaktivera bootstrap-läget (ange 0 för att inaktivera)" @@ -1167,7 +1164,6 @@ sv: tag_style: "Visuell stil för tagg-utmärkelser." staff_tags: "En lista av taggar som endast kan användas av personalen" min_trust_level_to_tag_topics: "Lägsta förtroendenivå som krävs för att tagga ämnen" - suppress_overlapping_tags_in_list: "Dölj taggar från listvyer om de överlappar med titeln" remove_muted_tags_from_latest: "Visa inte ämnen som taggats med dolda taggar i listan med senaste ämnen." errors: invalid_email: "Felaktig e-postadress." @@ -1403,34 +1399,8 @@ sv: subject_template: "[%{site_name}] E-postlevereringstest" new_version_mailer: subject_template: "[%{site_name}] Ny version av Discourse, uppdatering tillgänglig" - text_body_template: | - Hurra, en ny version av [Discourse](http://www.discourse.org) är tillgänglig! - - Din version: %{installed_version} - Ny version: **%{new_version}** - - - Uppgradera genom att använda den enkla **[uppgraderingsknappen](%{base_url}/admin/upgrade)** i din webbläsare. - - - Se uppdateringarna i [GitHubs ändringslogg](https://github.com/discourse/discourse/commits/master) - - - Besök [meta.discourse.org](http://meta.discourse.org) för att läsa de senaste nyheterna, diskutera och besöka kundtjänsten för Discourse new_version_mailer_with_notes: subject_template: "[%{site_name}] uppdatering tillgänglig" - text_body_template: | - Hurra, en ny version av [Discourse](http://www.discourse.org) är tillgänglig! - - Din version: %{installed_version} - Ny version: **%{new_version}** - - - Uppgradera genom att använda den enkla **[uppgraderingsknappen](%{base_url}/admin/upgrade)** i din webbläsare. - - - Se uppdateringarna i [GitHubs ändringslogg](https://github.com/discourse/discourse/commits/master) - - - Besök [meta.discourse.org](http://meta.discourse.org) för att läsa de senaste nyheterna, diskutera och få support för Discourse - - ### Versionsinformation - - %{notes} queued_posts_reminder: subject_template: one: "[%{site_name}] 1 användare väntar på att granskas" @@ -1468,97 +1438,6 @@ sv: Om meddelandet flaggas av medlemmarna och döljs en andra gång så kommer det att fortsätta döljas tills det har hanterats av personal – och det är möjligt att det leder till andra åtgärder, bland annat avstängning av ditt konto. För ytterligare information, se våra [riktlinjer](%{base_url}/guidelines). - usage_tips: - text_body_template: | - Här är några snabba tips för att komma igång: - - ## Att läsa - - **Fortsätt bara bläddra** för att läsa mer! - - När nya inlägg och ämnen skrivs så dyker de automatiskt upp - du behöver inte uppdatera sidan. - - ## Navigering - - - Använd **ikonerna i övre högra hörnet** för att söka, få tillgång till din användarsida eller ☰-menyn. - - - När du väljer ett ämne tas du alltid till ditt **senaste olästa inlägg** i ämnet. Välj antal svar-räknaren för att börja vid början eller slutet istället. - --
-
order:views | order:latest | order:likes | @username | user:foo |
status:open | status:closed | status:archived | status:noreplies | status:single_user |
#category-slug | category:foo | group:foo | badge:foo | |
in:likes | in:posted | in:watching | in:tracking | in:private |
in:bookmarks | in:first | in:pinned | in:unpinned | in:wiki |
posts_count:num | before:days or date | after:days or date | tags:one,two |
-
rainbows #parks
kommer att söka efter ämnen som innehåller ordet "rainbows" i kategorin "parks".rainbows category:parks status:open order:latest
kommer att söka efter ämnen som innehåller ordet "rainbows" i kategorin "parks" som inte är stängda eller arkiverade, sorterade efter datum på senaste inlägget.rainbows category:"parks and gardens" in:bookmarks
kommer att söka efter ämnen som innehåller ordet "rainbows" i kategorin "parks and gardens" som är bokmärkta av dig.Gönderiniz topluluk tarafından bayraklandı. Lütfen mesajlarınıza göz atın.
' - user_must_edit: 'Bu gönderi topluluk tarafından bayraklandı ve geçici olarak gizlendi.
' + you_must_edit: 'Gönderiniz topluluk tarafından bildirildi. Lütfen özel iletilerinize göz atın.
' + user_must_edit: 'Bu gönderi topluluk tarafından bildirildi ve geçici olarak gizlendi.
' archetypes: regular: title: "Standart Konu" @@ -490,12 +502,20 @@ tr_TR: title: "Abonelik İptal Edildi!" unsubscribe: title: "Aboneliği İptal Et" - stop_watching_topic: "Bu konuyu izlemeyi bırak, %{link}" - mute_topic: "Bu konuya ait tüm bildirimleri sessiz al, %{link}" - unwatch_category: "%{category} içerisindeki konuları izlemeyi durdur" + stop_watching_topic: "Bu konuyu gözlemeyi bırak, %{link}" + mute_topic: "Bu konuya ait tüm bildirimleri sustur, %{link}" + unwatch_category: "%{category} içerisindeki tüm konuları gözlemeyi durdur" mailing_list_mode: "Duyuru listesi modunu kapat" - all: "%{sitename} tarafından hiçbir mail gönderme" + disable_digest_emails: "Bana özet e-postaları göndermeyi durdur" + all: "Bana %{sitename} tarafından gelen hiçbir mail gönderme" + different_user_description: "E-posta gönderdiğimizden farklı bir kullanıcıyla giriş yapmışsınız. Lütfen çıkış yapın, veya anonim moduna geçip tekrar deneyin." log_out: "Çıkış" + user_api_key: + title: "Uygulama erişimini yetkilendir" + authorize: "Yetkilendir" + read: "okuma" + read_write: "okuma/yazma" + no_trust_level: "Üzgünüz, kullanıcı APIsine erişmek için gerekli güvenilirlik seviyeniz yok" reports: visits: title: "Kullanıcı ziyaretleri" @@ -522,13 +542,13 @@ tr_TR: xaxis: "Gün" yaxis: "Yeni beğenilerin sayısı" flags: - title: "Bayraklar" + title: "Bildirilenler" xaxis: "Gün" - yaxis: "Bayrakların sayısı" + yaxis: "Bildirilenlerin sayısı" bookmarks: - title: "İşaretlenenler" + title: "İmlenenler" xaxis: "Gün" - yaxis: "Yeni işaretlenenlerin sayısı" + yaxis: "Yeni imlenenlerin sayısı" starred: title: "Yıldızlı" xaxis: "Gün" @@ -544,23 +564,23 @@ tr_TR: user_to_user_private_messages: title: "Kullanıcıdan kullanıcıya" xaxis: "Gün" - yaxis: "Mesaj sayısı" + yaxis: "İleti sayısı" system_private_messages: title: "Sistem" xaxis: "Gün" - yaxis: "Mesaj sayısı" + yaxis: "İleti sayısı" moderator_warning_private_messages: title: "Moderatör uyarıları" xaxis: "Gün" - yaxis: "Mesaj sayısı" + yaxis: "İleti sayısı" notify_moderators_private_messages: title: "Moderatör bilgilendirme" xaxis: "Gün" - yaxis: "Mesaj sayısı" + yaxis: "İleti sayısı" notify_user_private_messages: title: "Kullanıcı bilgilendirme" xaxis: "Gün" - yaxis: "Mesaj sayısı" + yaxis: "İleti sayısı" top_referrers: title: "En çok atıfta bulunanlar" xaxis: "Kullanıcı" @@ -590,11 +610,15 @@ tr_TR: page_view_total_reqs: title: "Toplam" xaxis: "Gün" - yaxis: "Toplam Sayfa Görünümleri" + yaxis: "Toplam Sayfa Görüntülemeleri" page_view_logged_in_mobile_reqs: + title: "Giriş Yapılmış Sayfa Görüntülemeleri" xaxis: "Gün" + yaxis: "Mobil Giriş Yapılmış Sayfa Görüntülemeleri" page_view_anon_mobile_reqs: + title: "Anonim Sayfa Görüntülemeleri" xaxis: "Gün" + yaxis: "Mobil Anonim Sayfa Görüntülemeleri" http_background_reqs: title: "Arkaplan" xaxis: "Gün" @@ -633,8 +657,8 @@ tr_TR: yaxis: "Ziyaret sayısı" dashboard: rails_env_warning: "Sunucunuz %{env} modunda çalışıyor." - host_names_warning: "config/database.yml dosyasınızda, bilgisayar adı olarak varsayılan değer olan \"localhost\" ayarlı. Değeri, sitenizin bilgisayar adını kullanacak biçimde güncelleyiniz." - gc_warning: 'Sunucunuz, Ruby''nin varsayılan çöp toplama ayarlarını kullanıyor ki bu size en iyi performansı vermeyecektir. Performansı ayarı için şu konuyu okuyun: Discourse için Ruby on Rails Ayarları.' + host_names_warning: "config/database.yml dosyasınızda, bilgisayar adı olarak öntanımlı değer olan \"localhost\" ayarlı. Değeri, sitenizin bilgisayar adını kullanacak biçimde güncelleyiniz." + gc_warning: 'Sunucunuz, Ruby''nin öntanımlı çöp toplama ayarlarını kullanıyor ki bu size en iyi performansı vermeyecektir. Performansı ayarı için şu konuyu okuyun: Discourse için Ruby on Rails Ayarları.' sidekiq_warning: 'Sidekiq çalışmıyor. E-posta yollamak gibi gibi birçok asenkron görev sidekiq''in işidir. En az bir tane sidekiq süreci çalıştırdığınızdan emin olun. Sidekiq ile ilgili bilgi burada.' queue_size_warning: 'Kuyruğa eklenmiş işlerin sayısı fazla: %{queue_size}. Bu Sidekiq işlem(ler)indeki bir sorunu işaret ediyor olabilir, ya da daha fazla Sidekiq işçisi eklemeniz gerekiyor olabilir.' memory_warning: 'Sunucunuz toplam 1GB''tan az bellek ile çalışıyor. En az 1GB bellek tavsiye edilmektedir.' @@ -645,136 +669,144 @@ tr_TR: s3_config_warning: 'Sunucu s3''e dosya yüklenebilmesi için yapılandırılmış, fakat şunlardan en az biri henüz ayarlanmamış: s3_access_key_id, s3_secret_access_key or s3_upload_bucket. Site Ayarları sayfasına gidin ve ayarları güncelleyin. Daha fazla bilgi için "How to set up image uploads to S3?" konulu gönderiye bakın.' s3_backup_config_warning: 'Sunucu s3''e yedekleme yüklenebilmesi için yapılandırılmış, fakat şunlardan en az biri henüz ayarlanmamış: s3_access_key_id, s3_secret_access_key or s3_backup_bucket. Site Ayarları sayfasına gidin ve ayarları güncelleyin. Daha fazla bilgi için "How to set up image uploads to S3?" konulu gönderiye bakın.' image_magick_warning: 'Sunucu büyük resimlerin küçük boylarının oluşturulması için yapılandırılmış, fakat ImageMagick henüz kurulmamış. Favori paket yöneticinizi kullanarak ImageMagick kurun veya son sürümünü indirin.' - failing_emails_warning: 'Başarısızlıkla sonuçlanmış %{num_failed_jobs} e-posta işlemi bulunuyor. app.yml dosyanızı kontrol edin ve e-posta sunucu ayarlarınızın doğru olduğundan emin olun. Sidekiq''deki başarısız işlemlere gözatın.' - default_logo_warning: "Siteniz için logo grafikleri yükleyin. Site Ayarları'nda logo_url, logo_small_url, ve favicon_url güncellemelerini yapın." - contact_email_missing: "Sitenizle alakalı acil durumlar için size ulaşabileceğimiz bir iletişim e-postası girin. Lütfen Site Ayarları'nda iletişim e-postanızı güncelleyin." - contact_email_invalid: "Site iletişim e-postası geçersiz. İletişim e-postanızı Site Ayarları sayfasından güncelleyin." - title_nag: "Sitenizin ismini girin. Site ismini Site Ayarları sayfasından güncelleyin." - site_description_missing: "Arama sonuçlarında gözükecek, sitenizi açıklayan tek bir cümle girin. Site Ayarları sayfasından site açıklamasını güncelleyin." - consumer_email_warning: "Sitenizde e-posta gönderimleri için Gmail (ya da başka bir e-posta hizmeti) kurulumu yapılmış. Gmail ile gönderebileceğiniz e-posta sayısı limitlidir. Onun yerine, e-postalarınızın ulaştırılabildiğinden emin olmak için mandrill.com benzeri bir hizmet sağlayıcısını kullanın." - site_contact_username_warning: "Önemli otomatik mesajları gönderen kişi olarak gözükecek adminin kullanıcı adını girin. Site Ayarları</a> sayfasından site_contact_username parametresini güncelleyin." - notification_email_warning: "Bildiri e-postaları alan adınıza bağlı geçerli bir e-posta adresinden yollanmıyor; e-postalar düzenli ve güvenilir bir şekilde ulaşmayabilir. Lütfen Site Ayarları sayfasından notification_email değeri için geçerli bir yerel e-posta adresi girin." - subfolder_ends_in_slash: "Alt dizin ayarlarınız hatalı, DISCOURSE_RELATIVE_URL_ROOT sonunda slaş bulunmalı" + failing_emails_warning: 'Başarısızlıkla sonuçlanmış %{num_failed_jobs} e-posta işlemi bulunuyor. app.yml dosyanızı kontrol edin ve e-posta sunucu ayarlarınızın doğru olduğundan emin olun. Sidekiq''deki başarısız işlemlere göz atın.' + subfolder_ends_in_slash: "Alt dizin kurulumunuz hatalı, DISCOURSE_RELATIVE_URL_ROOT sonunda yan çizgi bulunmalı." + bad_favicon_url: "Minik simge yüklemesi başarısız oldu. Site Ayarlarından favicon_url alanını kontrol edin." site_settings: - censored_words: " ■■■■ yerine otomatik olarak kullanılacak kelimeler" + censored_words: "kelime yerine otomatik olarak ■■■■ kullanılacak kelimeler" delete_old_hidden_posts: "30 günden fazla süreyle gizli kalan gizlenmiş gönderileri otomatik olarak sil." - default_locale: "Bu Discourse yüklemesinin (ISO 639-1 Code) varsayılan dili" + default_locale: "Bu Discourse yüklemesinin (ISO 639-1 Code) öntanımlı dili" allow_user_locale: "Kullanıcıların arayüz için kendi istedikleri dili seçmesine izin ver" + set_locale_from_accept_language_header: "anonim kullanıcıların arayüz dilini tarayıcılarının dil başlığından al. (DENEYSELDİR, anonim önbellek ile çalışmaz)" min_post_length: "Gönderide olması gereken en az karakter sayısı" min_first_post_length: "İlk gönderi için (konu içi) izin verilen en az karakter sayısı" - min_private_message_post_length: "Mesaj gönderileri için izin verilen en az karakter sayısı" + min_private_message_post_length: "İleti gönderileri için izin verilen en az karakter sayısı" max_post_length: "Gönderide izin verilen en fazla karakter sayısı" min_topic_title_length: "Konuda olması gereken en az karakter sayısı" max_topic_title_length: "Konu başlığında izin verilen en fazla karakter sayısı" - min_private_message_title_length: "Mesaj başlıkları için izin verilen en az karakter sayısı" + min_private_message_title_length: "İleti başlıkları için izin verilen en az karakter sayısı" min_search_term_length: "Arama için girilecek kelimede olması gereken en az karakter sayısı" search_tokenize_chinese_japanese_korean: " CJK olmayan siteler dahil, -Çince/Japonca/Korece için aramayı bilgileri sıfırlamaya zorla" + search_prefer_recent_posts: "Eğer büyük forumunuzda arama yavaş ise, bu seçenek daha yeni gönderilerin dizine eklenmesini deneyecek" + search_recent_posts_size: "Kaç tane son gönderi dizinde tutulacak" allow_uncategorized_topics: "Konuların kategori seçmeden oluşturulmasına izin ver. DİKKAT: Bu özelliği kapamadan önce kategorisiz tüm konuları kategorize etmeniz lazım." allow_duplicate_topic_titles: "Aynı başlık ile birden çok konu açılmasına izin ver." unique_posts_mins: "Kullanıcının aynı içerikle yeni bir gönderi oluşturmadan önce geçmesi gereken dakika" educate_until_posts: "Kullanıcılar, ilk (n) gönderilerini yazmaya başladıklarında, pop-up yeni kullanıcı eğitim paneli metin düzenleyecisinin üstünde çıksın." title: "Sayfa başlığı etiketinde kullanılacak, bu sitenin ismi." site_description: "Meta açıklama etiketinde kullanılacak, bu sitenin bir cümlelik açıklaması." - contact_email: "Bu site için sorumlu kişinin e-posta adresi. Sadece acil durumlar için /about iletişim formu içerisinde ve beklenmeyen bayraklamalar gibi kritik bildiriler için kullanılacak." + contact_email: "Bu site için sorumlu kişinin e-posta adresi. Sadece acil durumlar için /about iletişim formu içerisinde ve beklenmeyen bildirmeler gibi ciddi bildiriler için kullanılacak." contact_url: "Bu site için iletişim URL'si. Acil durumlar için /about iletişim formunda kullanılır." - queue_jobs: "SADECE YAZILIMCILAR İÇİN! UYARI! Aksi gerekmediği takdirde sidekiq işlerini hep otomatik sıraya koydurtun. Bu özellik devre dışı bırakılırsa, siteniz düzgün çalışmayacaktır." + queue_jobs: "SADECE GELİŞTİRİCİLER İÇİN! UYARI! Aksi gerekmediği takdirde işleri sidekiq ile sıraya koydurtun. Bu özellik devre dışı bırakılırsa, siteniz düzgün çalışmayacaktır." crawl_images: "Doğru genişlik ve yükseklik boyutlarını girmek için uzak URL'lerdeki resimlerin birer kopyasını alınsın." download_remote_images_to_local: "Uzaktaki resimler yerel resimlere çevirmek için indirilsin; bu ayar resim bağlantılarının kırılmasını önleyecektir" download_remote_images_threshold: "Uzaktaki resimlerin yerele indirilmesi için gereken en az disk alanı (yüzdesel)" + download_remote_images_max_days_old: "n günden daha eski gönderiler için uzak adresteki resimleri indirme." disabled_image_download_domains: "Bu alan adlarından hiç bir zaman uzaktan resim indirme. Sınırlandırılmış liste." - editing_grace_period: "Gönderi oluşturulduktan (n) saniye içerisinde bir düzenleme yapıldığında, gönderi geçmişinde yeni bir versiyon oluşturma." + editing_grace_period: "Gönderi oluşturulduktan (n) saniye içerisinde bir düzenleme yapıldığında, gönderi geçmişinde yeni bir sürüm oluşturma." post_edit_time_limit: "Yazar gönderiyi yayınladıktan sonra (n) dakika içerisinde gönderiyi düzenleyebilir ya da silebilir. Sonsuz için 0 girin." - edit_history_visible_to_public: "Düzenlenmiş gönderinin eski versiyonlarını herkesin görmesine izin ver. Bu özellik kapatıldığında, eski versiyonları sadece görevliler görebilir." + edit_history_visible_to_public: "Düzenlenmiş gönderinin eski sürümlerini herkesin görmesine izin ver. Bu özellik kapatıldığında, eski versiyonları sadece görevliler görebilir." delete_removed_posts_after: "Yazar tarafından kaldırılan gönderiler (n) saat sonra otomatik olarak silinecektir. 0 olarak ayarlanırsa, gönderiler beklemeden hemen silinir." max_image_width: "Bir gönderideki küçük resimlerin en fazla genişliği" max_image_height: "Bir gönderideki küçük resimlerin en fazla yüksekliği" category_featured_topics: "/categories sayfasında yer alan kategori başına düşen konu sayısı. Bu değeri değiştirirseniz, değişikliğin kategoriler sayfasına yansıması 15 dakika kadar sürebilir." show_subcategory_list: "Bir kategoriye girildiğinde konu listesi yerine alt kategori listesini göster." - fixed_category_positions: "Seçerseniz, kategoriler için sabit bir sıralama belirleyebileceksiniz. Seçmezseniz, kategoriler aktivite sırasına göre listelenir. " + fixed_category_positions: "Seçerseniz, kategoriler için sabit bir sıralama belirleyebileceksiniz. Seçmezseniz, kategoriler etkinlik sırasına göre listelenir. " fixed_category_positions_on_create: "Seçerseniz, konu oluşturma ekranında da kategori sıralaması korunur (fixed_category_positions gerektirir)." - add_rel_nofollow_to_user_content: "İç bağlantılar (ana alan adları dahil) hariç, gönderilen tüm kullanıcı içeriklerine rel nofollow ekle. Bu ayarı değiştirirseniz, tüm gönderileri \"rake post:rebake\" ile rebake etmeniz gerekir." - exclude_rel_nofollow_domains: "nofollow eklenmeyecek sınırlandırılmış alan adları listesi. tld.com'a izin verirseniz otomatik olarak sub.tld.com'a da izin verilir." + add_rel_nofollow_to_user_content: "İç bağlantılar (ana alan adları dahil) hariç, gönderilen tüm kullanıcı içeriklerine rel nofollow ekle. Bu ayarı değiştirirseniz, tüm gönderileri \"rake post:rebake\" ile yeniden işlemeniz gerekir." + exclude_rel_nofollow_domains: "nofollow eklenmeyecek sınırlandırılmış alan adları listesi. ust.com'a izin verirseniz otomatik olarak alt.ust.com'a da izin verilir." post_excerpt_maxlength: "Gönderi alıntısının / özetinin en fazla uzunluğu." + show_pinned_excerpt_mobile: "Mobil görünümünde başa tutturulmuş konuların özetini göster." + show_pinned_excerpt_desktop: "Masaüstü görünümünde başa tutturulmuş konuların özetini göster." post_onebox_maxlength: "Kutulanmış bir Discourse gönderisinin en fazla karakter uzunluğu" - onebox_domains_whitelist: "Kutulamaya izin verilen alan adları listesi; bu alan adları OpenGraph ya da oEmbed desteklemeliler. http://iframely.com/debug adresinden test edebilirsiniz." - logo_url: "Sitenin üst solundaki logo resmi, geniş dikdörtgen şeklinde olmalıdır. Boş bırakılırsa site başlığı gösterilecektir." - logo_small_url: "Sitenin üst solundaki küçük logo resmi, kare şeklinde olmalıdır, aşağıya doğru kaydırılırken görünür. Boş bırakılırsa bir ev oyması gösterilecektir." + max_oneboxes_per_post: "Gönderide olabilecek en fazla kutulama sayısı" + logo_url: "Sitenin üst solundaki görsel, geniş dikdörtgen şeklinde olmalıdır. Boş bırakılırsa site başlığı gösterilecektir." + logo_small_url: "Sitenin üst solundaki küçük görsel, kare şeklinde olmalıdır, aşağıya doğru kaydırılırken görünür. Boş bırakılırsa bir ev oyması gösterilecektir." favicon_url: "Site simgesi, bilgi için http://en.wikipedia.org/wiki/Favicon adresine bakınız, bir CDN ile doğru şekilde çalışmak için png olmalıdır." - mobile_logo_url: "Mobil sitenin üst solunda kullanılan sabit konumlu logo resmi. Kare şeklinde olmalıdır. Boş bırakılırsa, `logo_url` kullanılacaktır. Örneğin: http://example.com/uploads/default/logo.png" + mobile_logo_url: "Mobil sitenin üst solunda kullanılan sabit konumlu görsel. Kare şeklinde olmalıdır. Boş bırakılırsa, `logo_url` kullanılacaktır. Örneğin: http://ornek.com/uploads/default/gorsel.png" apple_touch_icon_url: "Apple dokunmatik cihazları için kullanılan ikon. Önerilen boyut; 144 x 144 pixel." notification_email: "Tüm önemli sistem e-postaları için kullanılacak olan gönderen e-posta adresi. E-postaların başarıyla ulaşması için buraya girilen alan adının SPF, DKIM ve reverse PTR kayıtlarının doğru yapılması lazım." email_custom_headers: "Sınırlandırılmış özel e-posta başlıkları listesi" - email_subject: "Standart e-postaları için özelleştirilebilir konu formatı. Bakınız https://meta.discourse.org/t/customize-subject-format-for-standard-emails/20801" + email_subject: "Standart e-postaları için özelleştirilebilir konu biçimi. Bakınız https://meta.discourse.org/t/customize-subject-format-for-standard-emails/20801" + force_https: "Sitenizi HTTPS kullanmaya zorlayın. DİKKAT: bu seçeneği HTTPS'nin her yerde doğru bir şekilde çalıştığından emin olmadan SEÇMEYİN. Sitenizde bulunan paylaşım siteleri bağlantılarını, CDN' adresinizi, dışsal bağlantısı olan görsellerinizi de kontrol ettiniz mi?" summary_score_threshold: "Bir gönderinin 'Bu Konuyu Özetle' içinde yer alması için gereken en az skor." summary_posts_required: "'Bu Konuyu Özetle'nin etkinleştirilmesi için konuda olması gereken en az gönderi sayısı" summary_likes_required: "'Bu Konuyu Özetle'nin etkinleştirilmesi için konuda olması gereken en az beğeni sayısı" summary_percent_filter: "Kullanıcı 'Bu Konuyu Özetle'ye tıkladığında, gönderinin ilk % kısmını göster" summary_max_results: "'Bu Konuyu Özetle'den dönen en fazla gönderi sayısı" - enable_long_polling: "Bildiri için kullanılan message bus uzun sorgular yapabilir" + enable_private_messages: "Güven seviyesi 1'e(özel ileti göndermek için en az seviye ayarıyla belirlenebilir) sahip kullanıcıların ileti oluşturup cevaplamasına izin ver. Görevliler her durumda ileti gönderebilir." + enable_long_polling: "Bildiri için kullanılan ileti yolu uzun sorgular yapabilir" long_polling_base_url: "Uzun sorgular için kullanılan baz URL (CDN dinamik içerik sunuyorsa, bunu origin olarak ayarladığına emin ol) ör: http://origin.site.com" long_polling_interval: "Gönderilecek bilgi olmadığı zaman sunucunun kullanıcılara geri dönmeden önce beklemesi gereken zaman (sadece giriş yapmış kullanıcın için)" polling_interval: "Uzun sorgular yapılmadığı zaman, kaç mili saniyede bir giriş yapmış kullanıcılar poll yapmalı" anon_polling_interval: "Kaç mili saniyede bir anonim kullanıcılar sorgu yapmalı" background_polling_interval: "(Pencere arkaplanda olduğu zaman) kaç mili saniyede bir kullanıcılan sorgu yapmalı" - cooldown_minutes_after_hiding_posts: "Topluluk tarafından bayraklanarak gizlenen gönderiyi düzenleyebilmek için, kullanıcının beklemesi gereken dakika süresi " + flags_required_to_hide_post: "Gönderinin otomatik olarak gizlenip kullanıcıya ileti gönderilmesi için gereken toplam bildirim sayısı (hiçbir zaman için 0)" + cooldown_minutes_after_hiding_posts: "Topluluk tarafından bildirilerek gizlenen gönderiyi düzenleyebilmek için, kullanıcının beklemesi gereken dakika süresi " + max_topics_in_first_day: "Kullanıcının ilk gönderisini oluşturduktan sonraki 24 saatlik zaman dilimi içerisinde oluşturmasına izin verilen konu sayısı." + max_replies_in_first_day: "Kullanıcının ilk gönderisini oluşturduktan sonraki 24 saatlik zaman dilimi içerisinde oluşturabileceği cevap sayısı." tl2_additional_likes_per_day_multiplier: "Güvenlik seviyesi 2 (Üye) olanlar için günlük beğeni limitini bu rakamla çarparak artır" - tl3_additional_likes_per_day_multiplier: "Güvenlik seviyesi 3 (Müdavim) olanlar için günlük beğeni limitini bu rakamla çarparak artır" + tl3_additional_likes_per_day_multiplier: "Güven seviyesi 3 (Müdavim) olanlar için günlük beğeni limitini bu rakamla çarparak artır" tl4_additional_likes_per_day_multiplier: "Güvenlik seviyesi 4 (Lider) olanlar için günlük beğeni limitini bu rakamla çarparak artır" - notify_mods_when_user_blocked: "Eğer bir kullanıcı otomatik olarak engellendiyse, tüm moderatörlere mesaj yolla." - flag_sockpuppets: "Eğer, yeni kullanıcı konuya, konuyu başlatan yeni kullanıcı ile aynı IP adresinden cevap yazarsa, her iki gönderiyi de potansiyel spam olarak işaretle. " - traditional_markdown_linebreaks: "Markdown'da, satır sonundan önce yazının sağında iki tane boşluk gerektiren, geleneksel satır sonu metodunu kullan kullan." + notify_mods_when_user_blocked: "Eğer bir kullanıcı otomatik olarak engellendiyse, tüm moderatörlere ileti yolla." + flag_sockpuppets: "Eğer, yeni kullanıcı konuya, konuyu başlatan yeni kullanıcı ile aynı IP adresinden cevap yazarsa, her iki gönderiyi de potansiyel istenmeyen olarak bildir. " + traditional_markdown_linebreaks: "Markdown'da, satır sonundan önce yazının sağında iki tane boşluk gerektiren, geleneksel satır sonu metodunu kullan." allow_html_tables: "Tabloların HTML etiketleri kullanılarak Markdown ile oluşturulmasına izin verin. TABLE, THEAD, TD, TR, TH kabul edilir (tablo içeren tüm eski gönderilerin yenilenmesini gerektirir) " - post_undo_action_window_mins: "Kullanıcıya tanınan, bir gönderide yapılan yeni aksiyonları (beğenme, bayraklama, vs) geri alabilme dakika süresi" + post_undo_action_window_mins: "Bir gönderide yapılan yeni eylemlerin (beğenme, bildirme vb) geri alınabileceği zaman, dakika olarak" must_approve_users: "Siteye erişimlerine izin verilmeden önce tüm yeni kullanıcı hesaplarının görevliler tarafından onaylanması gerekir. UYARI: yayındaki bir site için bunu etkinleştirmek görevli olmayan hesapların erişimini iptal edecek." pending_users_reminder_delay: "Belirtilen saatten daha uzun bir süredir onay bekleyen yeni kullanıcılar mevcutsa moderatörleri bilgilendir. Bilgilendirmeyi devre dışı bırakmak için -1 girin." + maximum_session_age: "Kullanıcı son ziyaretinden bu yana n saat boyunca giriş yapmış olarak kalacak" + ga_tracking_code: "ESKİ: Google analiz (ga.js) takip kodu, ör:UA-12345678-9; bakınız http://google.com/analytics" + ga_domain_name: "ESKİ: Google analiz (ga.js) alan adı, ör: benimsitem.com; bakınız http://google.com/analytics" ga_universal_tracking_code: "Google Universal Analytics (analytics.js) takip kodu, ör: UA-12345678-9; bakınız http://google.com/analytics" ga_universal_domain_name: "Google Universal Analytics (analytics.js) alan adı, ör: mysite.com; bakınız http://google.com/analytics" + enable_escaped_fragments: "Eğer bir ağ gezgini tespit edilmezse Google'ın Ajax-Crawling API'sine dönün. Dahası için şuraya bakın : https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" enable_noscript_support: "Noscript etiketi üzerinden standart webcrawler arama motoru desteğini etkinleştir" allow_moderators_to_create_categories: "Moderatörlerin yeni kategoriler oluşturmasına izin ver" cors_origins: "Cross-origin isteklerin (CORS) izin verilen originler. Her origin http:// veya https:// içermeli. CORS'u etkinleştirebilmek için DISCOURSE_ENABLE_CORS env değişkeni doğru olarak ayarlanmalı." use_admin_ip_whitelist: "Yöneticiler, sadece Taranmış IP listesinde tanımlanmış bir IP adresinden erişim sağlıyorlarsa giriş yapabilirler. (Yönetici > Kayıtlar > Taranmış IP'ler)" - top_menu: "Anasayfa navigasyonunda nelerin, hangi sırada yer alacağını belirleyin. Örneğin en sonIyeniIokunmamışIkategorilerIen popülerIokunmuşlarIgönderilenlerIişaretlenenler" - post_menu: "Gönderi menüsündeki öğelerin hangi sırada yer alacağını belirleyin. Örnek: beğen|düzenle|bayrakla|sil|paylaş|işaretle|cevapla" + top_menu: "Anasayfa gezingesinde nelerin, hangi sırada yer alacağını belirleyin. Örneğin en sonIyeniIokunmamışIkategorilerIgözdeIokunmuşlarIgönderilenlerIimlenenler" + post_menu: "Gönderi menüsündeki öğelerin hangi sırada yer alacağını belirleyin. Örnek: beğen|düzenle|bildir|sil|paylaş|imle|cevapla" post_menu_hidden_items: "Gönderi menüsündeki maddeler, genişletme üç noktasına tıklanmadığı takdirde otomatik olarak gizlenir. " share_links: "Paylaşım penceresinde hangi maddelerin ne sırada gözükeceğini belirleyin." - track_external_right_clicks: "URL'leri tekrar yazdığı için, sağ tıklanan dış bağlantıların (ör: yeni bir sekmede aç) takibi varsayılan ayarlarda devre dışı bırakılmıştır." - site_contact_username: "Tüm otomatik mesajlar için gönderen kişi olarak gözükecek geçerli bir görevli kullanıcı adı. Boş bırakılırsa varsayılan Sistem hesabı kullanılacak." - send_welcome_message: "Tüm yeni kullanıcılara bir hoşgeldiniz mesajı ile beraber hızlı başlangıç kılavuzu gönderin." + track_external_right_clicks: "URL'leri tekrar yazdığı için, sağ tıklanan dış bağlantıların (ör: yeni bir sekmede aç) takibi öntanımlı ayarlarda devre dışı bırakılmıştır." + site_contact_username: "Tüm otomatik iletiler için gönderen kişi olarak gözükecek geçerli bir görevli kullanıcı adı. Boş bırakılırsa öntanımlı Sistem hesabı kullanılacak." + send_welcome_message: "Tüm yeni kullanıcılara bir hoş geldiniz iletisi ile beraber hızlı başlangıç kılavuzu gönderin." suppress_reply_directly_below: "Bu gönderinin direk altında sadece tek bir cevap varsa, gönderideki açılabilir cevap sayısı bölümünü gösterme." suppress_reply_directly_above: "Bu gönderinin direk üstünde sadece tek bir cevap varsa, gönderideki açılabilir hangi-cevaba-istinaden-cevapla bölümünü gösterme." suppress_reply_when_quoting: "Gönderi cevabı alıntılarsa, gönderideki açılabilir hangi-cevaba-istinaden-cevapla bölümünü gösterme." max_reply_history: "Hangi-cevaba-istinaden-cevapla bölümü açılınca gösterilecek en fazla cevap sayısı" - topics_per_period_in_top_summary: "Popüler konular özetinde gösterilen popüler konu sayısı." - topics_per_period_in_top_page: "'Daha Fazla Göster' ile genişletilen popüler konular bölümünde gösterilecek popüler konu sayısı. " - redirect_users_to_top_page: "Yeni ve uzun süredir giriş yapmamış kullanıcıları otomatik olarak Popüler sayfasına yönlendir." - top_page_default_timeframe: "Üst sayfa görünümü için varsayılan zaman aralığı" + topics_per_period_in_top_summary: "Gözde konular özetinde gösterilen gözde konu sayısı." + topics_per_period_in_top_page: "'Daha Fazla Göster' ile genişletilen gözde konular bölümünde gösterilecek gözde konu sayısı. " + redirect_users_to_top_page: "Yeni ve uzun süredir giriş yapmamış kullanıcıları otomatik olarak Gözde sayfasına yönlendir." + top_page_default_timeframe: "Üst sayfa görünümü için öntanımlı zaman aralığı" show_email_on_profile: "Kullanıcının e-posta adresini profilinde göster (sadece kendilerine ve site görevlilerine gözükür)" + prioritize_username_in_ux: "Kullanıcı sayfası, kullanıcı kartı ve gönderilerde kullanıcı adını ilk olarak göster(devre dışı ise gerçek isim önce gözükür)" email_token_valid_hours: "Parolamı unuttum / hesap etkinleştirme jetonları (n) saat geçerlidir." - email_token_grace_period_hours: "Parolamı unuttum / hesabı etkinleştir jetonları kullanıldıktan sonra (n) saat boyunca hala geçerlidir." enable_badges: "Rozet sistemini etkinleştir" - enable_whispers: "Bu konu içerisinde yetkililerin birbirleriyle gizli olarak iletişim kurmasına izin ver. (deneyseldir)" - allow_index_in_robots_txt: "robots.txt dosyasında bu sitenin arama motorları tarafından indekslenmesine izin verildiğini belirt." + allow_index_in_robots_txt: "robots.txt dosyasında bu sitenin arama motorları tarafından dizinlenmesine izin verildiğini belirt." email_domains_blacklist: "Kullanıcıların kayıt olurken kullanamayacağı e-posta alan adlarının, dikey çizgilerle ayrıştırılmış listesi. Örneğin: mailinator.com|trashmail.net" email_domains_whitelist: "Kullanıcıların kayıt olurken kullanmak ZORUNDA olduğu e-posta alan adlarının, dikey çizgilerle ayrıştırılmış listesi. UYARI: Bu listede yer almayan e-posta alan adları kabul edilmeyecektir!" + forgot_password_strict: "Parola sıfırlama kullanıldığında kullanıcıyı hesabın varlığı ile ilgili olarak bilgilendirme." log_out_strict: "Çıkış yapılırken, kullanıcının tüm cihazlardaki TÜM seanslarını sonlandır" - version_checks: "Discourse Hub'a versiyon güncellemeleri için ping yolla ve yeni versiyon mesajlarına /admin gösterge panelinde yer ver" - new_version_emails: "Discourse'un yeni versiyonu çıktığında contact_email adresine e-posta gönder." - port: "SADECE YAZILIMCILAR İÇİN! UYARI! Varsayılan 80 portu yerine bu HTTP portunu kullanın. Varsayılan 80'i kullanmak için boş bırakın. " - force_hostname: "SADECE YAZILIMCILAR İÇİN! DİKKAT! URL'de bir bilgisayar adı belirleyin. Varsayılan için boş bırakın." + version_checks: "Discourse Hub'a sürüm güncellemeleri için haber yolla ve yeni versiyon iletilerine /admin gösterge panelinde yer ver" + new_version_emails: "Discourse'un yeni sürümü çıktığında contact_email adresine e-posta gönder." + port: "SADECE YAZILIMCILAR İÇİN! UYARI! Öntanımlı 80 portu yerine bu HTTP portunu kullanın. Öntanımlı 80'i kullanmak için boş bırakın. " + force_hostname: "SADECE YAZILIMCILAR İÇİN! DİKKAT! URL'de bir bilgisayar adı belirleyin. Öntanımlı için boş bırakın." invite_expiry_days: "Kullanıcı davet anahtarlarının geçerlilik süresi, gün olarak" invite_passthrough_hours: "Daha önce kabul edilmiş davetiye anahtarının kullanım süresi, saat olarak" - invite_only: "Halka açık kayıt sistemi devre dışı bırakıldı, tüm yeni kullanıcıların bir üye ya da görevli tarafından davet edilmesi gerekir. " + invite_only: "Herkese açık kayıt sistemi devre dışı bırakıldı, tüm yeni kullanıcıların bir üye ya da görevli tarafından davet edilmesi gerekir. " login_required: "Bu sitede içerik görüntülenebilmesi için kimlik doğrulamayı zorunlu kıl, isimsiz girişe izin verme." min_username_length: "Karakter olarak en küçük kullanıcı adı uzunluğu." max_username_length: "Karakter olarak en büyük kullanıcı adı uzunluğu." - reserved_usernames: "Üyelik için izin verilmeyen kullanıcı adları." - min_password_length: "En az parola uzunluğu." - min_admin_password_length: "Yönetici için en az parola uzunluğu." + reserved_usernames: "Kayıt için izin verilmeyen kullanıcı adları." + min_password_length: "Parolanın en az uzunluğu." + min_admin_password_length: "Yönetici için parolanın en az uzunluğu." block_common_passwords: "En çok kullanılan 10,000 parola arasında yer alan parolalara izin verme." enable_sso: "Dış bir site aracılığı ile tek oturum açma sistemini etkinleştir. (UYARI: etkinleştirildiği takdirde, doğru yapılandırılmamışsa bazı kişilerin, SİZ DAHİL, oturum açmasını engelleyebilir! Ayrıca davetiye sistemini de devre dışı bırakır.)" enable_sso_provider: "/session/sso_provider son noktasında Discourse SSO sağlayıcı protokolünü uygula, sso_secret değerinin seçilmiş olmasını gerektirir" sso_secret: "SSO bilgisinin kritopgrafik şekilde doğrulanması için kullanılan gizli string, 10 karakter veya daha uzun olduğundan emin olun" - sso_overrides_email: "SSO yararlı yükündeki dış sitedeki e-postayı, her giriş yapıldığında, yerel değişiklikleri engellemek için yerel e-postanın üzerine yazar (DİKKAT: yerel e-postaların normalizasyon sürecinde uyuşmazlıklar doğabilir)" + sso_overrides_email: "SSO yararlı yükündeki dış sitedeki e-postayı, her giriş yapıldığında, yerel değişiklikleri engellemek için yerel e-postanın üzerine yazar (DİKKAT: yerel e-postaların olağanlaştırma sürecinde uyuşmazlıklar doğabilir)" sso_overrides_username: "SSO yararlı yükündeki dış sitedeki kullanıcı adını, her giriş yapıldığında, yerel değişiklikleri engellemek için yerel kullanıcı adının üzerine yazar. (DİKKAT: kullanıcı adı uzunluklarıyla ilgili kurallardaki farklılıklardan ötürü uyuşmazlıklar doğabilir)" sso_overrides_name: "SSO yararlı yükündeki dış sitedeki tam adı, her giriş yapıldığında, yerel değişiklikleri engellemek için yerel tam adın üzerine yazar." sso_overrides_avatar: "SSO yararlı yükündeki dış site avatarını kullanıcı avatarının üzerine yazar Eğer etkinleştirildiyse, allow_uploaded_avatars ayarının devre dışı bırakılması şiddetle önerilir" @@ -796,31 +828,36 @@ tr_TR: enable_github_logins: "Github doğrulamasını etkinleştirin, github_client_id ve github_client_secret gereklidir" github_client_id: "Github doğrulaması için gereken, https://github.com/settings/applications adresinde kayıtlı client id" github_client_secret: "Github doğrulaması için gereken, https://github.com/settings/applications adresinde kayıtlı client secret" - allow_restore: "Geri almaya izin ver. Tüm sitedeki verileri değiştirebilir! Bir yedeklemeyi geri yüklemeyi planlamıyorsanız devre dışı bırakın." + readonly_mode_during_backup: "Yedek alınırken yalnızca okuma modunu etkinleştir" + allow_restore: "Geri almaya izin ver. Sitedeki TÜM verileri değiştirebilir! Bir yedeklemeyi geri yüklemeyi planlamıyorsanız devre dışı bırakın." maximum_backups: "Diskte tutulacak en fazla yedek sayısı. Eski yedekler otomatik olarak silinir." - automatic_backups_enabled: "Yedek sıklığında tanımlandığı gibi yedekleri otomatik çalıştır" + automatic_backups_enabled: "Yedek sıklığında tanımlandığı gibi otomatik yedek almayı çalıştır" backup_frequency: "Hangi sıklıkta bir site yedeği oluştururuz, gün olarak." enable_s3_backups: "Tamamlanınca yedeklemeleri S3'e yükle. ÖNEMLİ: Dosyalar ayarında doğru S3 girilmesini gerektirir" s3_backup_bucket: "Yedeklemelerin yüklenmesi için uzak biriktirme yeri. UYARI: Özel bir biriktirme yeri olduğundan emin olun" - backup_time_of_day: "Yedeklemenin yapılacağı UTC zaman" - backup_with_uploads: "Yüklemeleri planlanmış yedeklemlere dahil et. Etkisizleştirilirse sadece veritabanı yedeklenecek." + s3_disable_cleanup: "Yerel olarak silinen yedeklerin S3 sunucularından silinmesini kapat" + backup_time_of_day: "Yedeklemenin yapılacağı vaktin gün içindeki UTC zamanı." + backup_with_uploads: "Planlanmış yedeklere yüklemeleri de dahil et. Etkisizleştirilirse sadece veritabanı yedeklenecek." active_user_rate_limit_secs: "'last_seen_at' alanını ne kadar sıklıkta güncelliyoruz, saniye olarak" - verbose_localization: "UI'da genişletilmiş yerelleştirme ipuçlarını göster" + verbose_localization: "Arayüzde ayrıntılı yerelleştirme ipuçlarını göster" previous_visit_timeout_hours: "Ziyaretin üzerinden burada belirtilen saat kadar süre geçtiğinde, ziyareti \"bir önceki\" olarak nitelendir" + rebake_old_posts_count: "Her 15 dakikada yeniden işlenecek olan eski konu sayısı." rate_limit_create_topic: "Bir konu oluşturduktan sonra, başka bir konu oluşturmak için kullanıcılar (n) saniye beklemeli. " rate_limit_create_post: "Bir gönderi oluşturduktan sonra, başka bir gönderi oluşturmak için kullanıcılar (n) saniye beklemeli. " rate_limit_new_user_create_topic: "Bir konu oluşturduktan sonra, başka bir konu oluşturmak için yeni kullanıcılar (n) saniye beklemeli. " rate_limit_new_user_create_post: "Bir gönderi oluşturduktan sonra, başka bir gönderi oluşturmak için yeni kullanıcılar (n) saniye beklemeli. " max_likes_per_day: "Bir günde, bir kullanıcının verilebileceği en fazla beğeni sayısı." - max_flags_per_day: "Bir günde, bir kullanıcının verebileceği en fazla bayrak sayısı. " - max_bookmarks_per_day: "Kullanıcı başına düşen günlük en fazla işaretleme sayısı." + max_flags_per_day: "Bir günde, bir kullanıcının yapabileceği en fazla bildirme sayısı. " + max_bookmarks_per_day: "Kullanıcı başına düşen günlük en fazla imleme sayısı." max_edits_per_day: "Bir günde, bir kullanıcının yapabileceği en fazla düzenleme sayısı." max_topics_per_day: "Bir günde, bir kullanıcının oluşturabileceği en fazla konu sayısı." - max_private_messages_per_day: "Bir günde kullanıcıların oluşturabileceği en fazla mesaj sayısı" + max_private_messages_per_day: "Bir günde kullanıcıların oluşturabileceği en fazla ileti sayısı" max_invites_per_day: "Bir günde, bir kullanıcının yollayabileceği en fazla davet sayısı." max_topic_invitations_per_day: "Bir günde, bir kullanıcının yollayabileceği en fazla başlık daveti sayısı." + categories_topics: "/categories sayfasında gösterilecek olan konu sayısı." suggested_topics: "Konunun en altında yer alan, önerilen konu sayısı. " limit_suggested_to_category: "Önerilen konularda sadece kullanıcının bulunduğu kategoriye ait konuları göster." + suggested_topics_max_days_old: "Önerilen konular n günden daha eski olmamalı." clean_up_uploads: "Yasadışı barındırmayı engellemek için artık referanssız yüklemeleri kaldır. UYARI: Bu ayarı etkinleştirmeden önce /uploads dizinini yedeklemeyi isteyebilirsiniz" clean_orphan_uploads_grace_period_hours: "Artık yüklemeler kaldırılmadan önce tanınan süre (saat olarak)." purge_deleted_uploads_grace_period_days: "Silinen yüklemelerin kaldırılması için tanınan süre (gün olarak)." @@ -834,10 +871,13 @@ tr_TR: s3_cdn_url: "Tüm s3 öğeleri için CDN URL adresi. (örneğin: https://cdn.somewhere.com). UYARI: bu ayarı değiştirdikten sonra tüm eski gönderileri rebake etmelisiniz." avatar_sizes: "Otomatik üretilen avatar ölçülerinin listesi." external_system_avatars_enabled: "Dışsal sistem avatarları hizmeti kullan." - default_opengraph_image_url: "Varsayılan opengraph imajının URL'si." + default_opengraph_image_url: "Öntanımlı opengraph imajının URL'si." + allow_all_attachments_for_group_messages: "Grup iletileri için tüm e-posta eklentilerine izin ver." + convert_pasted_images_to_hq_jpg: "Yapıştırılan resimleri yüksek kaliteli JPG dosyalarına dönüştür." + convert_pasted_images_quality: "Dönüştürülen JPG dosyasının kalitesi (1 en düşük kalite, 100 en iyi kalite)" enable_flash_video_onebox: "Kutularda swf ve flv (Adobe Flash) yerleştirmelerine izin ver. UYARI: güvenlik açıkları doğurabilir" - default_invitee_trust_level: "Davet edilen kullanıcılar için varsayılan güven seviyesi (0-4)." - default_trust_level: "Tüm yeni kullanıcılar için varsayılan güven seviyesi (0-4). DİKKAT! Bu ayarı değiştirmeniz ciddi spam riski doğurabilir." + default_invitee_trust_level: "Davet edilen kullanıcılar için öntanımlı güven seviyesi (0-4)." + default_trust_level: "Tüm yeni kullanıcılar için öntanımlı güven seviyesi (0-4). DİKKAT! Bu ayarı değiştirmeniz ciddi seviyede istenmeyen gönderi riski doğurabilir." tl1_requires_topics_entered: "Yeni bir kullanıcının güven seviyesi 1'e yükseltilmeden önce oluşturması gereken konu sayısı." tl1_requires_read_posts: "Yeni bir kullanıcının güven seviyesi 1'e yükseltilmeden önce okuması gereken gönderi sayısı." tl1_requires_time_spent_mins: "Yeni bir kullanıcının güven seviyesi 1'e yükseltimeden önce gönderi okuyarak geçirmesi gereken dakika miktarı." @@ -848,13 +888,23 @@ tr_TR: tl2_requires_likes_received: "Bir kullanıcının güven seviyesi 2'ye yükseltilmeden önce alması gereken beğeni sayısı." tl2_requires_likes_given: "Bir kullanıcının güven seviyesi 2'ye yükseltilmeden önce vermesi gereken beğeni sayısı." tl2_requires_topic_reply_count: "Bir kullanıcının güven seviyesi 2'ye yükseltilmeden önce cevaplaması gereken konu sayısı." + tl3_time_period: "Güven Seviyesi 3 için gereken zaman (gün olarak)" + tl3_requires_days_visited: "Kullanıcının güven seviyesi 3'e yükselmeye hak kazanması için son günlerde (gs3 için gereken zaman içerisinde) siteyi ziyaret etmiş olması gereken en az gün sayısı. gs3'e ulaşmayı engellemek için gs3 için gereken zamandan daha fazla bir değer girin. (0 veya daha fazla)" + tl3_requires_topics_replied_to: "Kullanıcının güven seviyesi 3'e yükselmeye hak kazanması için son günlerde (gs3 için gereken zaman içerisinde) cevaplaması gereken en az konu sayısı (0 veya daha fazla)" + tl3_requires_topics_viewed: "Kullanıcının güven seviyesi 3'e yükselmeye hak kazanması için son günlerde (gs3 için gereken zaman içerisinde) okumuş olması gereken konuların yüzdesi (0-100 arası)" + tl3_requires_topics_viewed_cap: "Son günlerde (gs3 için gereken zaman içerisinde) görüntülenmesi gereken en fazla konu sayısı." + tl3_requires_posts_read_cap: "Son günlerde (gs3 için gereken zaman içerisinde) okunması gereken en fazla konu sayısı." tl3_requires_topics_viewed_all_time: "Bir kullanıcının güven seviyesi 3'e yükselmeye hak kazanması için görüntülemesi gereken toplam en az konu sayısı." tl3_requires_posts_read_all_time: "Bir kullanıcının güven seviyesi 3'e yükselmeye hak kazanması için görüntülemesi gereken toplam en az gönderi sayısı." tl3_promotion_min_duration: "Bir kullanıcının güven seviyesi 2'ye düşürülebilmesi için güven seviyesi 3'te geçirmesi gereken en az gün sayısı." + tl3_requires_likes_given: "Kullanıcının güven seviyesi 3'e yükselmeye hak kazanması için son günlerde (gs3 için gereken zaman içerisinde) vermesi gereken beğeni sayısı." + tl3_requires_likes_received: "Kullanıcının güven seviyesi 3'e ulaşmak için son günlerde (gs3 için gereken zaman içerisinde) alması gereken en az beğeni sayısı." tl3_links_no_follow: "Güven seviyesi 3'teki kullanıcılar tarafından paylaşılan linklerdeki rel=nofollow'u kaldırma." min_trust_to_create_topic: "Yeni bir konu oluşturmak için gereken en az güven seviyesi. " min_trust_to_edit_wiki_post: "Wiki olarak işaretlenmiş bir gönderiyi düzenleyebilmek için gereken en az güven seviyesi." - min_trust_to_send_messages: "Özel bir mesaj oluşturabilmek için gerekli olan güven düzeyi." + min_trust_to_edit_post: "Gönderilerin düzenlenebilmesi için gereken en düşük güven seviyesi." + min_trust_to_allow_self_wiki: "Kullanıcının kendi wiki gönderisini oluşturabilmesi için gereken güven seviyesi." + min_trust_to_send_messages: "Özel bir ileti oluşturabilmek için gerekli olan güven seviyesi." newuser_max_links: "Yeni bir kullanıcının bir gönderiye ekleyebileceği bağlantı sayısı." newuser_max_images: "Yeni bir kullanıcının bir gönderiye ekleyebileceği resim sayısı." newuser_max_attachments: "Yeni bir kullanıcının bir gönderiye ekleyebileceği dosya sayısı." @@ -868,23 +918,24 @@ tr_TR: title_max_word_length: "Konu başlığında kullanılan bir kelime için izin verilen en fazla karakter sayısı" title_min_entropy: "Konu başlığı için gereken en az entropi (tekil karakter, ingilizce-dışı karakterler daha fazla sayılır)" body_min_entropy: "Gönderi içeriği için gereken en az entropi (tekil karakter, ingilizce-dışı karakterler daha fazla sayılır)" - allow_uppercase_posts: "Konu başlığı yada gönderi metninin tümünün büyük harf kullanılarak girilebilmesine izin ver." + allow_uppercase_posts: "Konu başlığı ya da gönderi metninin tümünün büyük harf kullanılarak girilebilmesine izin ver." title_fancy_entities: "SmartyPants tarzında, konu başlıklarında ASCII karakterlerini süslü HTML öğelerine çevir: http://daringfireball.net/projects/smartypants/" min_title_similar_length: "Bir başlığın benzer konular için kontrolünün yapılmasından önce sahip olması gereken en az uzunluk." min_body_similar_length: "Bir gönderi metninin benzer konular için kontrolünün yapılmasından önce sahip olması gereken en az uzunluk." + desktop_category_page_style: "/categories sayfasının görsel biçimi." category_colors: "Kategoriler için izin verilen onaltılı renk değerlerinin listesi" - category_style: "Kategori rozetleri için görsel stil." - max_image_size_kb: "KB cinsinden yüklenebilecek en fazla resim büyüklüğü. Bu nginx (client_max_body_size) / apache veya proxyde de ayarlanmalı." - max_attachment_size_kb: "KB cinsinden yüklenebilecek en fazla eklenti dosyası büyüklüğü. Bu nginx (client_max_body_size) / apache veya proxyde de ayarlanmalı." + category_style: "Kategori rozetleri için görsel biçim." + max_image_size_kb: "Yüklenebilecek resmin KB cinsinden en fazla büyüklüğü. Bu nginx (client_max_body_size) / apache veya proxyde de ayarlanmalı." + max_attachment_size_kb: "Yüklenebilecek dosyaların KB cinsinden en fazla büyüklüğü. Bu nginx (client_max_body_size) / apache veya proxyde de ayarlanmalı." authorized_extensions: "Yüklenebilecek dosya uzantılarının listesi (tüm dosya türlerini etkinleştirmek için '*' kullanın)" max_similar_results: "Yeni bir konu oluştururken, düzenleyicinin üzerinde gösterilecek benzer konuların sayısı. Karşılaştırmalar başlık ve içerik üzerinden yapılır." title_prettify: "Tümü büyük harf, ilk karakteri küçük harf, çoklu ! ve ?, sonda ekstra . kullanımı gibi, sık yapılan yazım hatalarını önle." topic_views_heat_low: "Bu kadar görüntülemeden sonra, görüntülemeler alanı hafifçe vurgulanacak." topic_views_heat_medium: "Bu kadar görüntülemeden sonra, görüntülemeler alanı kısmen vurgulanacak." topic_views_heat_high: "Bu kadar görüntülemeden sonra, görüntülemeler alanı belirgin şekilde vurgulanacak." - cold_age_days_low: "Sohbet başlangıcından bu kadar süre geçtiğinde, son aktivite tarihi hafifçe vurgulanır." - cold_age_days_medium: "Sohbet başlangıcından bu kadar süre geçtiğinde, son aktivite tarihi kısmen vurgulanır." - cold_age_days_high: "Sohbet başlangıcından bu kadar süre geçtiğinde, son aktivite tarihi belirgin şekilde vurgulanır." + cold_age_days_low: "Sohbet başlangıcından bu kadar süre geçtiğinde, son etkinlik tarihi hafifçe vurgulanır." + cold_age_days_medium: "Sohbet başlangıcından bu kadar süre geçtiğinde, son etkinlik tarihi kısmen vurgulanır." + cold_age_days_high: "Sohbet başlangıcından bu kadar süre geçtiğinde, son etkinlik tarihi belirgin şekilde vurgulanır." history_hours_low: "Bu kadar saat içerisinde düzenlenen bir gönderinin, düzenlendiğini belirten gösterge hafifçe vurgulanacak. " history_hours_medium: "Bu kadar saat içerisinde düzenlenen bir gönderinin, düzenlendiğini belirten gösterge kısmen vurgulanacak. " history_hours_high: "Bu kadar saat içerisinde düzenlenen bir gönderinin, düzenlendiğini belirten gösterge belirgin şekilde vurgulanacak. " @@ -898,23 +949,28 @@ tr_TR: staff_like_weight: "Görevlilerin beğenilere verilecek ekstra ağırlık faktörü." topic_view_duration_hours: "Her N saatte IP/Kullanıcı başına bir kez yeni konu görüntülemesi say" user_profile_view_duration_hours: "Her N saatte IP/Kullanıcı başına bir kez yeni profil görüntülemesi say" - levenshtein_distance_spammer_emails: "Spam e-postaları eşleştirilirken, bulanık eşleşme için tahammül edilecek karakter sayısı farklılığı." - max_new_accounts_per_registration_ip: "Eğer bu IP'den güven seviyesi 0 olan halihazırda (n) hesap varsa (hiçbiri görevli, GS2 ya da daha yüksek seviyede biri değilse), bu IP'den yeni üyelik kabul etme. " - min_ban_entries_for_roll_up: "Topla butonuna tıklandığında, (N) adetten fazla giriş varsa yeni bir subnet engelleme girişi yaratılacak." + levenshtein_distance_spammer_emails: "İstenmeyen e-postaları eşleştirilirken, bulanık eşleşme için tahammül edilecek karakter sayısı farklılığı." + max_new_accounts_per_registration_ip: "Eğer bu IP'den güven seviyesi 0 olan halihazırda (n) hesap varsa (hiçbiri görevli, GS2 ya da daha yüksek seviyede biri değilse), bu IP'den yeni kayıt kabul etme. " + min_ban_entries_for_roll_up: "Topla düğmesine tıklandığında, (N) adetten fazla giriş varsa yeni bir subnet engelleme girişi yaratılacak." max_age_unmatched_emails: "Taranmış e-posta kayıtlarından karşılığı olmayanları (N) gün sonunda sil. " max_age_unmatched_ips: "Taranmış IP girişlerinden karşılığı olmayanları (N) gün sonunda sil." - num_flaggers_to_close_topic: "Bir konunun moderatör müdahalesi için otomatik olarak durdurulmadan önce alması gereken en az tekil bayrak sayısı" - num_flags_to_close_topic: "Bir konunun moderatör müdahalesi için otomatik olarak durdurulmadan önce alması gereken en az etkin bayrak sayısı " - auto_respond_to_flag_actions: "Bir bayrağı kaldırırken otomatik cevaplamayı etkinleştir" + num_flaggers_to_close_topic: "Bir konunun moderatör müdahalesi için otomatik olarak durdurulmadan önce alması gereken en az tekil bildirim sayısı" + num_flags_to_close_topic: "Bir konunun moderatör müdahalesi için otomatik olarak durdurulmadan önce alması gereken en az etkin bildirim sayısı " + auto_respond_to_flag_actions: "Bir bildirim kaldırırken otomatik olarak cevaplamayı etkinleştir" min_first_post_typing_time: "Milisaniye olarak bir kullanıcının ilk gönderisini yazarken geçmesi gereken en küçük süre, bu süre geçmezse gönderi otomatik olarak onaylanma kuyruğuna girer. Devre dışı bırakmak için 0'a ayarlayın (tavsiye edilmez)." auto_block_fast_typers_on_first_post: "min_first_post_typing_time'ı karşılamayan kullanıcıları otomatik olarak engelle." auto_block_fast_typers_max_trust_level: "Hızlı yazıcıları otomatik engellemek için en büyük güven seviyesi." auto_block_first_post_regex: "Eğer eşleşirse kullanıcının ilk gönderisinin engellenmesi ve onaylanma kuyruğuna gitmesine neden olan harf büyüklüğü duyarsız düzenli ifade. Örnek: reklam|a[bc]a düzenli ifadesi reklam, aba ya da aca içeren ilk gönderilerin engellenmesi ve onaylanma kuyruğuna gitmesine neden olacaktır. Sadece ilk gönderiler için geçerlidir." reply_by_email_enabled: "Konulara e-posta üzerinden cevap yazmayı etkinleştir." reply_by_email_address: "Email ile cevapla özelliği için gelen e-posta adresi şablonu, örnek: %{reply_key}@reply.example.com or replies+%{reply_key}@example.com" + incoming_email_prefer_html: "Gelen e-postalarda metin yerine HTML kullan. Bir ihtimal biçim hatalarına neden olabilir!" disable_emails: "Discourse'un herhangi bir e-posta göndermesine izin verme" strip_images_from_short_emails: "2800 Byte boyutundan küçük e-postalardan resimleri çıkar" short_email_length: "Kısa e-postanın uzunluğu, Byte olarak" + unsubscribe_via_email: "Kullanıcıların konu veya içerik alanında 'unsubscribe' olan bir e-posta göndererek e-postalara abonelikten çıkmasına izin ver" + delete_email_logs_after_days: "(n) günden sonra e-posta kayıtlarını sil. sürekli tutmak için 0" + max_emails_per_day_per_user: "Kullanıcılara bir günde gönderilebilecek en fazla e-posta sayısı. Limiti kaldırmak için 0" + bounce_score_threshold: "Kullanıcıya e-posta gönderimi durdurmak için gereken en fazla geri seken posta sayısı" pop3_polling_enabled: "E-posta cevapları için POP3 üzerinden sorgula" pop3_polling_ssl: "POP3 sunucusuna bağlanırken SSL kullanın. (Tavsiye edilir)" pop3_polling_period_mins: "Periyodik olarak POP3 hesabının e-posta için kontrol edilmesinin dakika bazında sıklığı. NOT: yeniden başlatma gerektirir" @@ -926,82 +982,104 @@ tr_TR: email_in: "Kullanıcıların e-posta aracılığıyla yeni konu oluşturabilmesine izin ver (pop3 sorgulaması gerektirir). Adresleri her kategorinin \"Ayarlar\" sekmesinden düzenleyin." email_in_min_trust: "Bir kullanıcının e-posta aracılığı ile yeni konu oluşturabilmesi için sahip olması gereken en az güven seviyesi." email_prefix: "E-postaların konu bölümünü belirten [etiket]. Boş bırakılırsa 'title' yazacak." - email_site_title: "Bu siteden giden e-postalarda gönderici olarak kullanılacak sitenin başlığı. Herhangi bir şey girilmezse varsayılan olarak 'title' yazacak. Eğer 'başlık\" içeriğinizde, email göndericisinin stringlerinde izin verilmeyen karakterler varsa, bu ayarı kullanın. " + email_site_title: "Bu siteden giden e-postalarda gönderici olarak kullanılacak sitenin başlığı. Herhangi bir şey girilmezse öntanımlı olarak 'title' yazacak. Eğer 'başlık\" içeriğinizde, e-posta göndericisinin stringlerinde izin verilmeyen karakterler varsa, bu ayarı kullanın. " minimum_topics_similar: "Yeni konu oluşturulurken, benzer konuların gösterilmesi için sitede olması gereken konu sayısı." relative_date_duration: "Gönderinin üstünden bu kadar gün geçtikten sonra, gönderi tarihi mutlak şekilde değil (20 Şubat) göreceli şekilde (7g) gösterilecek." - delete_user_max_post_age: "İlk gönderisini (x) günden eski olan kullanıcıların silinmesine izin verme." - delete_all_posts_max: "Tüm Gönderileri Sil butonuna basıldığında tek seferde silinebilecek en fazla gönderi sayısı. Eğer bir kullanıcının gönderi sayısı bu sayıdan fazlaysa, gönderilerin hepsi tek seferde silinemez ve bu kullanıcı silinemez." + delete_user_max_post_age: "İlk gönderisi (x) günden eski olan kullanıcıların silinmesine izin verme." + delete_all_posts_max: "Tüm Gönderileri Sil düğmesine basıldığında tek seferde silinebilecek en fazla gönderi sayısı. Eğer bir kullanıcının gönderi sayısı bu sayıdan fazlaysa, gönderilerin hepsi tek seferde silinemez ve bu kullanıcı silinemez." username_change_period: "Kayıt sonrası, kullanıcı adınının değiştirilebileceği gün sayısı. (Kullanıcı adının değiştirilebilmesini devre dışı bırakmak için 0 girin)" email_editable: "Kullanıcıların kayıt olduktan sonra e-posta adreslerini değiştirmesine izin ver." + logout_redirect: "Çıkış yaptıktan sonra tarayıcının yönlendirileceği adres (ör: http://bitanesite.com/cikis)" allow_uploaded_avatars: "Kullanıcıların özel profil resimleri yüklemelerine izin ver." allow_animated_avatars: "Kullanıcıların hareketli gif profil resimleri kullanmalarına izin ver. UYARI: Bu ayarı değiştirdikten sonra avatars:refresh rake görevini çalıştırın." allow_animated_thumbnails: "Animasyonlu giflerin, animasyonlu küçük resmini oluşturur." - default_avatars: "Yeni kullanıcılar için, onlar değiştirene kadar, varsayılan olarak kullanılacak avatarların URL'leri." + default_avatars: "Yeni kullanıcılar için, onlar değiştirene kadar, öntanımlı olarak kullanılacak avatarların URL'leri." automatically_download_gravatars: "Hesap oluşturma veya e-posta değişikliği esnasında kullanıcılar için Gravatarları indir" - disable_digest_emails: "Tüm kullanıcılar için özet email'leri devre dışı bırak." + digest_min_excerpt_length: "E-posta özetindeki konular için gösterilecek özet boyutu, karakter olarak." + digest_suppress_categories: "Bu kategorileri özet e-postalarından gizle." + disable_digest_emails: "Tüm kullanıcılar için özet e-postaları devre dışı bırak." detect_custom_avatars: "Kullanıcıların özel profil resimleri yükleyip yüklemediklerini kontrol et ya da etme." max_daily_gravatar_crawls: "Discourse'un gün içinde özel avatarlar için Gravatar'ı en fazla kaç kere kontrol edeceği." public_user_custom_fields: "Kullanıcıların için, herkes tarafından görüntülenebilir özel alanların beyaz listesi." staff_user_custom_fields: "Kullanıcıların için, sadece görevlilere görüntülenebilir özel alanların beyaz listesi." - enable_user_directory: "Göz atılabilmesin için kullanıcıların olduğu bir veri dizini sağla" + enable_user_directory: "Göz atılabilmesi için kullanıcıların olduğu bir dizin sağla" allow_anonymous_posting: "Kullanıcıların anonim moda geçebilmelerine izin ver" anonymous_posting_min_trust_level: "Anonim gönderi oluşturabilmeyi etkinleştirebilmek için gereken en az güven seviyesi" anonymous_account_duration_minutes: "Anonimliği koruyabilmek için, her kulanıcı için her N dakikada bir yeni bir anonim hesap oluştur. Örnek: 600'e ayarlanırsa, son gönderi üzerinden 600 dakika geçer geçmez VE kullanıcı anonim moddaysa, yeni bir anonim hesap oluşturulur." hide_user_profiles_from_public: "Anonim kullanıcılar için kullanıcı kartlarını, kullanıcı profillerini ve kullanıcı dizinini devre dışı bırak" allow_profile_backgrounds: "Kullanıcıların profillerine arkaplan eklemesine izin ver." - enable_mobile_theme: "Mobil cihazlar mobil uyumlu temayı kullanır, dilerse masaüstü görünüme geçebilirler. Eğer özel, duyarlı bir stil kullanıyorsanız bunu devredışı bırakın." + enable_mobile_theme: "Mobil cihazlar mobil uyumlu temayı kullanır, dilerse masaüstü görünüme geçebilirler. Eğer özel, duyarlı bir biçim kullanıyorsanız bunu devre dışı bırakın." dominating_topic_minimum_percent: "Konuyu domine ettiğine dair uyarı almadan önce konudaki gönderilerin yüzde kaçının kullanıcıya ait olması gerekir." + disable_avatar_education_message: "Avatar değiştirme için eğitici iletileri kapat." suppress_uncategorized_badge: "Kategorisiz konular için olan rozeti konu listesinde gösterme." global_notice: "Tüm ziyaretçilere İVEDİ ACİL DURUM global manşet uyarısı göster, saklamak için boş bırakın (HTML kullanılabilir)." disable_edit_notifications: " 'download_remote_images_to_local' etkin olduğunda, sistem kullanıcısından gelen düzenleme bildirilerini devre dışı bırakır" automatically_unpin_topics: "Kullanıcı sayfa sonuna eriştiğinde tutturulmuş konuları otomatik olarak sayfadan ayır." + read_time_word_count: "Tahmini okuma süresini hesaplamak için dakika başına kelime sayısı." full_name_required: "Kullanıcı profili için tam ad zorunlu bir alandır." enable_names: "Kullanıcıların tam adlarını profillerde, kullanıcı kartlarında ve e-postalarda göster. Tam adların hiç bir yerde görünmemesi için devre dışı bırak." display_name_on_posts: "Gönderilerde @kullanıcıadı'na ek olarak kullanıcının tam adını da göster." show_time_gap_days: "İki gönderinin tarihleri arasında bu kadar gün farkı varsa, konuda zaman aralığına yer ver." - invites_per_page: "Varsayılan olarak kullanıcı sayfasında gösterilen davetler." + invites_per_page: "Öntanımlı olarak kullanıcı sayfasında gösterilen davetler." short_progress_text_threshold: "Bir konudaki gönderi sayısı bu sayının üzerine çıktığında, ilerleme çubuğunda sadece şu anki gönderi sayısını göster. İlerleme çubuğunun kalınlığını değiştirirseniz, bu değeri de değiştirmeniz gerekebilir." - default_code_lang: "GitHub kod bloklarına (lang-auto, ruby, python vs.) uygulanacak, varsayılan programlama dili sözdizimi vurgulaması." - warn_reviving_old_topic_age: "Herhangi bir kullanıcı, son cevabın burada belirtilen gün sayısından daha önce yazıldığı bir konuya cevap yazmaya başladığında, bir uyarı mesajı çıkacak. Bu özelliği devre dışı bırakmak için 0 girin. " - autohighlight_all_code: "Tüm önceden formatlanan kod bloklarına, açıkça dil seçimi yapılmamış olsa da, zorla kod vurgulaması uygula." + default_code_lang: "GitHub kod parçalarına (lang-auto, ruby, python vs.) uygulanacak olan öntanımlı programlama dili söz dizimi vurgulaması." + warn_reviving_old_topic_age: "Herhangi bir kullanıcı, son cevabın burada belirtilen gün sayısından daha önce yazıldığı bir konuya cevap yazmaya başladığında, bir uyarı iletisi çıkacak. Bu özelliği devre dışı bırakmak için 0 girin. " + autohighlight_all_code: "Tüm önceden biçimlendirilen kod parçalarına, açıkça dil seçimi yapılmamış olsa da, zorla kod vurgulaması uygula." + highlighted_languages: "Dahil edilen kod renklendirme kuralları. (Uyarı: çok fazla dil eklemek performansı etkileyebilir) demo için bakınız: https://highlightjs.org/static/demo/" feed_polling_enabled: "SADECE YERLEŞTİRME İÇİN: RSS/ATOM beslemesinin gönderi olarak yerleştirilip yerleştirilemeyeceği." feed_polling_url: "SADECE YERLEŞTİRME İÇİN: Yerleştirilecek RSS/ATOM beslemesinin URL'i." embed_by_username: "Yerleştirilmiş konuları oluşturan kullanıcıya ait Discourse kullanıcı adı. " embed_username_key_from_feed: "Beslemeden Discourse kullanıcı adını çekmek için kullanılacak anahtar" embed_truncate: "Yerleştirilmiş gönderileri kırp." embed_post_limit: "Yerleştirilecek en fazla gönderi sayısı." - embed_username_required: "Konu olşuturmak için kullanıcı gereklidir." + embed_username_required: "Konu oluşturmak için kullanıcı adı gereklidir." embed_whitelist_selector: "Yerleştirmelerde kullanılmasına izin verilen öğeler için CSS seçicisi." embed_blacklist_selector: "Yerleştirmelerden çıkartılmış öğeler için CSS seçicisi." - notify_about_flags_after: "Bu kadar saat geçmesine rağmen hala ilgilenilmemiş bayraklar varsa, contact_email adresine e-posta gönder. Devre dışı bırakmak için 0 girin. " - enable_cdn_js_debugging: "/logs 'ların asli hataları tüm js içeriklerine crossorigin izinleri ekleyerek göstermesine izin ver." - show_create_topics_notice: "Eğer sitede herkese açık konu sayısı 5'den az ise, adminden yeni konular oluşturmasını isteyen bir uyarı mesajı göster. " + notify_about_flags_after: "Bu kadar saat geçmesine rağmen hala ilgilenilmemiş bildirimler varsa, contact_email adresine e-posta gönder. Devre dışı bırakmak için 0 girin. " + show_create_topics_notice: "Eğer sitede herkese açık konu sayısı 5'den az ise, yöneticiden yeni konular oluşturmasını isteyen bir uyarı iletisi göster. " delete_drafts_older_than_n_days: (n) günden eski taslakları sil. + bootstrap_mode_min_users: "bootstrap modunun edilgen olması için gereken en az kullanıcı sayısı (edilgen bırakmak için 0 yapın)" vacuum_db_days: "Geçiş sonrası DB alanı geri kazanmak için TAM VAKUM ANALİZİ'ni çalıştırın (devre dışı bırakmak için 0 girin)" prevent_anons_from_downloading_files: "Anonim kullanıcıların eklenti indirebilmesini önle. DİKKAT: Bu ayar, eklenti olarak gönderilen resim-dışı site içeriklerinin de çalışmasını engelleyebilir." slug_generation_method: "Slug üretim yöntemi seçin. 'kodlanmış' seçeneği yüzde kodlamalı metin oluşturur. 'hiçbiri' seçeneği slug'ı devre dışı bırakır." - enable_emoji: "Emojiyi aktifleştir" + enable_emoji: "Emojiyi etkinleştir" emoji_set: "Emojinizi nasıl isterdiniz?" enforce_square_emoji: "Tüm emojileri kare en-boy oranına zorla" approve_unless_trust_level: "Bu güven seviyesi altındaki kullanıcılardan gelen gönderilerin onaylanması gerekir" - default_email_private_messages: "Öntanımlı olarak birisi bir kullanıcıya mesaj attığında e-posta gönder." + default_email_digest_frequency: "Öntanımlı olarak kullanıcılar ne sıklıkla e-posta özeti alacak." + default_email_private_messages: "Öntanımlı olarak birisi bir kullanıcıya ileti attığında e-posta gönder." default_email_direct: "Öntanımlı olarak birisi bir kullanıcı hakkında alıntı yapma, cevaplama, bahsetme ya da davet etme eylemlerini gerçekleştirdiğinde e-posta gönder." default_email_mailing_list_mode: "Öntanımlı olarak her yeni gönderi için bir e-posta gönder." + disable_mailing_list_mode: "Kullanıcıların duyuru listesi modunu etkinleştirmesini engelle." default_email_always: "Öntanımlı olarak kullanıcı etkin olsa bile e-posta bildirimi gönder." - default_other_new_topic_duration_minutes: "Konunun yeni olarak düşünülmesi için genel varsayılan koşul." - default_other_auto_track_topics_after_msecs: "Bir konunun otomatik olarak takip edilmesi için geçmesi gereken genel varsayılan zaman." + default_other_new_topic_duration_minutes: "Konunun yeni olarak düşünülmesi için genel öntanımlı koşul." + default_other_auto_track_topics_after_msecs: "Bir konunun otomatik olarak takip edilmesi için geçmesi gereken genel öntanımlı zaman." default_other_external_links_in_new_tab: "Harici linkleri, öntanımlı olarak, yeni bir sekmede aç." default_other_enable_quoting: "Vurgulanmış yazılar için alıntı ile cevaplamayı, öntanımlı olarak, etkinleştir." default_other_dynamic_favicon: "Tarayıcı simgesinde, öntanımlı olarak, yeni/güncellenmiş konu sayısını göster." default_other_disable_jump_reply: "Kullanıcılar cevapladıktan sonra, öntanımlı olarak, onların gönderilerine atlama." + default_other_like_notification_frequency: "Beğenildiğinde öntanımlı olarak kullanıcılara bildir" default_topics_automatic_unpin: "Kullanıcı sayfa sonuna eriştiğinde tutturulmuş konuları otomatik olarak sayfadan ayır." - default_categories_watching: "Öntanımlı olarak, izlenen kategorilerin listesi." + default_categories_watching: "Öntanımlı olarak gözlenen kategorilerin listesi." default_categories_tracking: "Öntanımlı olarak, takip edilen kategorilerin listesi." default_categories_muted: "Öntanımlı olarak, sesi kısılan kategorilerin listesi." + max_user_api_reqs_per_day: "Gün başına yapılabilecek en fazla kullanıcı API isteği" + max_user_api_reqs_per_minute: "Dakika başına yapılabilecek en fazla kullanıcı API isteği" + max_api_keys_per_user: "Kullanıcı başına kullanılabilecek kullanıcı API anahtarı sayısı" + min_trust_level_for_user_api_key: "Kullanıcı API'si oluşturmak için gereken güven seviyesi" tagging_enabled: "Konularda etiketleri etkinleştirin?" min_trust_to_create_tag: "Yeni bir etiket oluşturmak için gereken en az güven seviyesi." - tag_style: "Etiket rozetleri için görsel stil." - min_trust_level_to_tag_topics: "Etiket konuları oluşturmak için gereken en az güven seviyesi." + max_tags_per_topic: "Bir konuya eklenebilecek en fazla etiket." + max_tag_length: "Bir etiket isminde kullanılabilecek en fazla karakter sayısı." + max_tag_search_results: "Etiketler için arama yapılırken gösterilecek en fazla sonuç." + tags_sort_alphabetically: "Etiketleri harf sırasına göre sırala. Öntanımlı olarak gözdelik seviyesine göre gösterilir." + tag_style: "Etiket rozetleri için görsel biçim." + staff_tags: "Yalnızca görevli kişiler tarafından kullanılabilecek etiket listesi" + min_trust_level_to_tag_topics: "Konulara etiket eklemek için gereken en az güven seviyesi." + suppress_overlapping_tags_in_list: "Eğer etiketler konu ismi içerisinde tam kelime olarak bulunuyorsa, etiketi gösterme" + company_short_name: "Firma İsmi (kısa)" + company_full_name: "Firma İsmi (tamamı)" + company_domain: "Firma Alan Adı" errors: invalid_email: "Geçersiz e-posta adresi." invalid_username: "Bu kullanıcı adı ile bir kullanıcı bulunmuyor." @@ -1009,13 +1087,14 @@ tr_TR: invalid_integer_min: "Değer %{min} ya da daha fazla olmalı." invalid_integer_max: "Değer en fazla %{max} olabilir." invalid_integer: "Değer tam sayı olmalı." - regex_mismatch: "Değer istenen formatla eşleşmiyor." - must_include_latest: "Üst menü 'en son\" sekmesini içermeli" + regex_mismatch: "Değer gereken biçimle eşleşmiyor." + must_include_latest: "Üst menü 'en son' sekmesini içermeli" invalid_string: "Geçersiz değer." invalid_string_min_max: "%{min} ile %{max} karakter arasında olmalı." invalid_string_min: "En az %{min} karakter olmalı." invalid_string_max: "En fazla %{max} karakter olabilir." invalid_reply_by_email_address: "Değer '%{reply_key}' içermeli ve bildiri e-postasından farklı olmalı." + pop3_polling_authentication_failed: "POP3 kimlik doğrulaması başarısız. Lütfen pop3 bilgilerinizi kontrol edin." search: within_post: "%{username} tarafından #%{post_number}" types: @@ -1023,15 +1102,23 @@ tr_TR: topic: 'Sonuçlar' user: 'Kullanıcılar' sso: + not_found: "Hesabınız bulunamadı. Lütfen site yöneticisi ile iletişime geçin." + account_not_approved: "Hesabınız onaylanma bekliyor. Onaylandığınızda e-posta ile bilgilendirileceksiniz." unknown_error: "Hesabınızda bir sorun var. Lütfen site yöneticisi ile iletişime geçin." timeout_expired: "Hesabınız zaman aşımına uğradı, lütfen tekrar giriş yapmayı deneyin." - original_poster: "Orjinal Poster" + original_poster: "Özgün Gönderici" most_posts: "En Çok Gönderi" most_recent_poster: "En Son Gönderen" frequent_poster: "En Sık Gönderen" redirected_to_top_reasons: - new_user: "Hoşgeldiniz! Bunlar en popüler yeni gönderiler." - not_seen_in_a_month: "Hoşgeldiniz! Bir süredir yoktunuz. Bunlar sizin yokluğunuzda en popüler olan konular." + new_user: "Hoş geldiniz! Bunlar en yeni gözde konular." + not_seen_in_a_month: "Hoş geldiniz! Bir süredir yoktunuz. Bunlar sizin yokluğunuzda en gözde olan konular." + merge_posts: + edit_reason: + other: "%{count} gönderi %{username} tarafından birleştirildi" + errors: + different_topics: "Farklı konulara ait gönderiler birleştirilemez." + different_users: "Farklı kullanıcılara ait gönderiler birleştirilemez." move_posts: new_topic_moderator_post: other: "%{count} gönderi yeni bir konu için ayıklandı: %{topic_link}" @@ -1049,6 +1136,10 @@ tr_TR: archived_disabled: "Konu şimdi arşivden çıkarıldı. Artık donmuş değil, değiştirilebilir." closed_enabled: "Konu şimdi kapatıldı. Artık yeni cevap yazılmasına izin yok. " closed_disabled: "Konu şimdi açıldı. Yeni cevaplara izin var." + autoclosed_message_max_posts: + other: "Bu ileti %{count} olan en fazla cevap limitini aştığı için otomatik olarak kapatıldı." + autoclosed_topic_max_posts: + other: "Bu konu %{count} olan en fazla cevap limitini aştığı için otomatik olarak kapatıldı." autoclosed_enabled_days: other: "Bu konu %{count} gün sonunda konu otomatik olarak kapatıldı. Yeni cevap girilmesine izin verilmiyor." autoclosed_enabled_hours: @@ -1072,21 +1163,21 @@ tr_TR: login: not_approved: "Hesabını henüz onaylanmadı. Giriş yapmak için hazır olduğunuzda e-posta ile bilgilendirileceksiniz." incorrect_username_email_or_password: "Yanlış kullanıcı adı, e-posta ya da parola" - wait_approval: "Üye olduğunuz için teşekkürler. Hesabınız onaylandığında sizi haberdar edeceğiz." + wait_approval: "Kayıt olduğunuz için teşekkürler. Hesabınız onaylandığında sizi haberdar edeceğiz." active: "Hesabınız etkinleştirildi ve kullanıma hazır." activate_email: "Az kaldı! %{email} adresine bir etkinleştirme e-postası gönderdik. Hesabınızı etkinleştirmek için lütfen e-postadaki yönlendirmeleri takip edin.
Eğer e-postayı almadıysanız, gereksiz klasörünüzü kontrol edin ya da başka bir etkinleştirme e-postası daha göndermek için tekrar giriş yapmayı deneyin.
" not_activated: "Henüz giriş yapamazsınız. Size bir etkinleştirme e-postası gönderdik. Hesabınızı etkinleştirmek için lütfen e-postadaki yönlendirmeleri takip edin." not_allowed_from_ip_address: "Bu IP adresinden %{username} kullanıcı adı ile giriş yapamazsınız." admin_not_allowed_from_ip_address: "Bu IP adresinden admin olarak giriş yapamazsınız." suspended: "%{date} tarihine kadar giriş yapamazsınız." - suspended_with_reason: "Hesap %{date} tarihine kadar yasaklanmıştır. Sebep: %{reason}" + suspended_with_reason: "Hesap %{date} tarihine kadar askıya alınmıştır. Sebep: %{reason}" errors: "%{errors}" not_available: "Uygun değil. Bunu denemeye ne dersiniz? %{suggestion}" - something_already_taken: "Bir şeyler ters gitti. Kullanıcı adı veya e-posta zaten kayıtlı olabilir. Parolamı Unuttum bağlantısını deneyin." + something_already_taken: "Bir şeyler ters gitti. Kullanıcı adı veya e-posta zaten kayıtlı olabilir. Parolamı unuttum bağlantısını deneyin." omniauth_error: "Üzgünüz, hesabınız doğrulanırken bir hata oluştu. Doğrulama işlemini onaylamamış olabilir misiniz?" omniauth_error_unknown: "Girişiniz yapılırken bir şeyler ters gitti, lütfen tekrar deneyin." new_registrations_disabled: "Şu an yeni hesap oluşturulamıyor. " - password_too_long: "Parolalar maksimum 200 karakter olabilir." + password_too_long: "Parolalar en fazla 200 karakter olabilir." email_too_long: "Vermiş olduğun e-posta çok uzun. E-posta kutusu isimleri 254, alan adı isimleri ise 253 karakterden daha uzun olamaz." reserved_username: "Bu kullanıcı adını kullanamazsın." missing_user_field: "Kullanıcı alanlarının tamamını doldurmadınız" @@ -1102,15 +1193,27 @@ tr_TR: must_begin_with_alphanumeric_or_underscore: "bir harf, rakam ya da alt çizgi ile başlamalı" must_end_with_alphanumeric: "bir harf ya da bir rakam ile bitmeli" must_not_contain_two_special_chars_in_seq: "2 ya da daha fazla uzunlukta özel karakter dizisi (.-_) içermemeli" + must_not_end_with_confusing_suffix: ".json ya da .png gibi kafa karıştırıcı bir son ek içermemeli." email: - not_allowed: "için o e-posta sağlayıcısına izin verilmiyor. Lütfen başka bir email adresi kullanın. " + not_allowed: "için o e-posta sağlayıcısına izin verilmiyor. Lütfen başka bir e-posta adresi kullanın. " blocked: "için izin yok." ip_address: blocked: "Mevcut IP adresiniz üzerinden yeni kayıt işlemine izin verilmiyor." - max_new_accounts_per_registration_ip: "Mevcut IP adresiniz üzerinden yeni kayıt işlemine izin verilmiyor. (Belirlenen maksimum limit aşıldı.) Bir yetkili ile iletişime geçin." + max_new_accounts_per_registration_ip: "Mevcut IP adresiniz üzerinden yeni kayıt işlemine izin verilmiyor. (Belirlenen sınır aşıldı.) Bir görevli ile iletişime geçin." flags_reminder: + flags_were_submitted: + other: "Bildirimler %{count} saat önce gönderilmiş. Lütfen inceleyin." subject_template: - other: "İlgilenilmesi gereken %{count} bayrak var" + other: "İlgilenilmesi gereken %{count} bildirim var" + unsubscribe_mailer: + subject_template: "%{site_title} üzerinden daha fazla e-posta güncellemesi almak istemediğinizi onaylayın" + text_body_template: | + Birisi (galiba siz?) bundan sonra %{site_domain_name} adresinden daha fazla e-posta bildirimi almamak için istekte bulundu. + Eğer bunu onaylıyorsanız, lütfen bağlantıya tıklayın: + + %{confirm_unsubscribe_link} + + Eğer e-posta bildirimlerini almaya devam etmek istiyorsanız, bu e-postayı görmezden gelin. invite_mailer: subject_template: "%{invitee_name} sizi %{site_domain_name} sitesindeki '%{topic_title}' adlı konuya davet etti. " text_body_template: | @@ -1130,104 +1233,197 @@ tr_TR: %{invite_link} + Bu davet güvenilir bir kullanıcı tarafından gönderilmiştir, cevap yazarak tartışmaya hemen katılabilirsiniz. + custom_invite_mailer: + subject_template: "%{invitee_name} sizi %{site_domain_name} sitesindeki '%{topic_title}' adlı konuya davet etti " + text_body_template: | + %{invitee_name} sizi + + > %{site_title} -- %{site_description} + + sitesindeki + + > **%{topic_title}** + > + > %{topic_excerpt} + + tartışmasına davet ediyor. + + Ayrıca %{invitee_name} diyor ki: + + %{user_custom_message} + + Eğer ilgileniyorsanız, aşağıdaki bağlantıya tıklayın: + + %{invite_link} + Bu davet güvenilir bir kullanıcı tarafından gönderilmiştir, cevap yazarak tartışmaya hemen katılabilirsiniz. invite_forum_mailer: subject_template: "%{invitee_name} sizi %{site_domain_name} sitesine katılmanız için davet etti" + text_body_template: | + %{invitee_name} sizi foruma katılmaya davet ediyor + + > **%{site_title}** + > + > %{site_description} + + Eğer ilgileniyorsanız, aşağıdaki bağlantıya tıklayın: + + %{invite_link} + + Bu davet güvenilir bir üyeden gönderildi, bu nedenle hesabınız sizin için otomatik olarak oluşturulacak. + custom_invite_forum_mailer: + subject_template: "%{invitee_name} sizi %{site_domain_name} sitesine katılmaya davet etti" + text_body_template: | + %{invitee_name} sizi foruma katılmaya davet ediyor + + > **%{site_title}** + > + > %{site_description} + + %{invitee_name} diyor ki: + + %{user_custom_message} + + Eğer ilgileniyorsanız, aşağıdaki bağlantıya tıklayın: + + %{invite_link} + + Bu davet güvenilir bir üyeden gönderildi, bu nedenle hesabınız sizin için otomatik olarak oluşturulacak. invite_password_instructions: subject_template: "%{site_name} hesabınız için parola oluşturun" text_body_template: | - %{site_name}'e olan davetiyeni kabul ettiğin için teşekkür ederiz -- hoşgeldin! + %{site_name} topluluğuna olan davetiyeni kabul ettiğin için teşekkür ederiz -- hoş geldin! - Şimdi bir şifre seçmek için şu bağlantıya tıklayın: + Şimdi bir parola seçmek için şu bağlantıya tıklayın: %{base_url}/users/password-reset/%{email_token} (Eğer yukarıdaki bağlantının süresi dolmuşsa e-posta adresinizle giriş yaparken "Parolamı unuttum" bağlantısına tıklayınız.) test_mailer: subject_template: "[%{site_name}] E-posta Ulaştırma Testi" new_version_mailer: - subject_template: "[%{site_name}] Yeni Discourse versiyonu, güncelleme var" + subject_template: "[%{site_name}] Yeni Discourse sürümü, güncelleme var" + text_body_template: | + Yuhaaa, [Discourse](http://www.discourse.org) için yeni bir sürüm hazır! + + Sizin sürümünüz: %{installed_version} + Yeni çıkan sürüm: **%{new_version}** + + - **[Tek tıklamayla](%{base_url}/admin/upgrade)** basitçe yükseltin + + - Nelerin yeni olduğunu [GitHub kayıtlarında](https://github.com/discourse/discourse/commits/master) görün + + - Yeniliklerden haberdar olmak, tartışmak ve destek almak için [meta.discourse.org](https://meta.discourse.org) adresini ziyaret edin new_version_mailer_with_notes: subject_template: "[%{site_name}] güncellemesi var" + text_body_template: | + Yuhaaa, [Discourse](http://www.discourse.org) için yeni bir sürüm hazır! + + Sizin sürümünüz: %{installed_version} + Yeni çıkan sürüm: **%{new_version}** + + - **[Tek tıklamayla](%{base_url}/admin/upgrade)** basitçe yükseltin + + - Nelerin yeni olduğunu [GitHub kayıtlarında](https://github.com/discourse/discourse/commits/master) görün + + - Yeniliklerden haberdar olmak, tartışmak ve destek almak için [meta.discourse.org](https://meta.discourse.org) adresini ziyaret edin + + ### Sürüm notları + + %{notes} queued_posts_reminder: subject_template: other: "[%{site_name}] %{count} konu incelenmeyi bekliyor." flag_reasons: - off_topic: "Gönderiniz **konu-dışı** olarak bayraklandı: topluluk, gönderinizin konu başlığı ve ilk gönderi ile tanımlanan konu içeriğine uygun olmadığını düşünüyor. " - inappropriate: "Gönderiniz **uygunsuz** olarak bayraklandı: topluluk gönderinizin saldırgan, kaba ya da [topluluk yönergelerine](/guidelines) aykırı olduğunu düşünüyor." - spam: "Gönderiniz **spam** olarak bayraklandı: topluluk, gönderinizin mevcut konuya uygun veya yararlı olmaktansa fazlasıyla promosyonel ve reklam içerikli olduğunu düşünüyor." - notify_moderators: "Gönderiniz **moderatör kontrolü için** bayraklandı: topluluk, gönderinizle ilgili bir şeyin moderatör tarafından kontrol edilmesi gerektiğini düşünüyor." + off_topic: "Gönderiniz **konu-dışı** olarak bildirildi: topluluk, gönderinizin konu başlığı ve ilk gönderi ile tanımlanan konu içeriğine uygun olmadığını düşünüyor. " + inappropriate: "Gönderiniz **uygunsuz** olarak bildirildi: topluluk gönderinizin saldırgan, kaba ya da [topluluk yönergelerine](/guidelines) aykırı olduğunu düşünüyor." + spam: "Gönderiniz **istenmeyen** olarak bildirildi: topluluk, gönderinizin mevcut konuya uygun veya yararlı olmaktansa fazlasıyla promosyonel ve reklam içerikli olduğunu düşünüyor." + notify_moderators: "Gönderiniz **moderatör kontrolü için** bildirildi: topluluk, gönderinizle ilgili bir şeyin moderatör tarafından kontrol edilmesi gerektiğini düşünüyor." flags_dispositions: agreed: "Bizi bilgilendirdiğiniz için teşekkür ederiz. Bir sorun olduğu konusunda size katılıyoruz ve ilgileniyoruz." agreed_and_deleted: "Bizi bilgilendirdiğiniz için teşekkür ederiz. Bir sorun olduğu konusunda size katılıyoruz, gönderiyi kaldırdık. " disagreed: "Bizi bilgilendirdiğiniz için teşekkür ederiz. Konu ile ilgileniyoruz." deferred: "Bizi bilgilendirdiğiniz için teşekkür ederiz. Konu ile ilgileniyoruz." deferred_and_deleted: "Bizi bilgilendirdiğiniz için teşekkür ederiz. Gönderiyi kaldırdık." - temporarily_closed_due_to_flags: "Bu konu topluluk tarafından çok fazla rapor edildiği için geçici olarak kapatılmıştır." + temporarily_closed_due_to_flags: "Bu konu topluluk tarafından çok fazla bildirildiği için geçici olarak kapatılmıştır." system_messages: + post_hidden: + subject_template: "Gönderi topluluk bildirimleri tarafından gizlendi" welcome_user: - subject_template: "%{site_name} sitesine hoşgeldiniz!" + subject_template: "%{site_name} topluluğuna hoş geldiniz!" text_body_template: | - %{site_name} sitesine katıldığınız için teşekkür ederiz, hoşgeldiniz! + %{site_name} topluluğuna katıldığınız için teşekkür ederiz, hoş geldiniz! %{new_user_tips} - Biz her zaman [medeni topluluk davranışına](%{base_url}/guidelines) inanıyoruz. + Biz her zaman [topluluk yönergelerimize](%{base_url}/guidelines) inanıyoruz. Ziyaretinizin keyfini çıkarın! - (Eğer yeni bir kullanıcı olarak [görevlilerle](%{base_url}/about) iletişim kurmak isterseniz, bu mesajı cevaplamanız yeterli.) + (Eğer yeni bir kullanıcı olarak [görevlilerle](%{base_url}/about) iletişim kurmak isterseniz, bu iletiyi cevaplamanız yeterli.) welcome_invite: - subject_template: "%{site_name} sitesine hoşgeldiniz!" + subject_template: "%{site_name} topluluğuna hoş geldiniz!" text_body_template: | - %{site_name} davetiyenizi onayladığınız için teşekkürler -- hoşgeldiniz! + %{site_name} davetiyenizi onayladığınız için teşekkürler -- hoş geldiniz! Sizin için yeni bir hesap oluşturduk: **%{username}**, ve sisteme girişiniz yapıldı. [Kullanıcı profilinizi][prefs] ziyaret ederek kullanıcı adınızı değiştirebilirsiniz. Daha sonra tekrar giriş yapmak için: - 1. Giriş yaparken her zaman **ilk davetiyenizdekiyle aynı email adresini kullanın**. Yoksa sizin olduğunuzu anlayamayız! + 1. Giriş yaparken her zaman **ilk davetiyenizdeki ile aynı e-posta adresini kullanın**. Yoksa sizin olduğunuzu anlayamayız! - 2. [Kullanıcı profiliniz][prefs] için yeni bir şifre oluşturun ve o şifre ile giriş yapın. + 2. [Kullanıcı profiliniz][prefs] için yeni bir parola oluşturun ve o parola ile giriş yapın. %{new_user_tips} - Biz her zaman [medeni topluluk davranışına](%{base_url}/guidelines) inanıyoruz. + Biz her zaman [topluluk yönergelerimize](%{base_url}/guidelines) inanıyoruz. Ziyaretinizin keyfini çıkarın! - (Eğer yeni bir kullanıcı olarak [görevlilerle](%{base_url}/about) iletişim kurmak isterseniz, bu mesajı cevaplamanız yeterli.) + (Eğer yeni bir kullanıcı olarak [görevlilerle](%{base_url}/about) iletişim kurmak isterseniz, bu iletiyi cevaplamanız yeterli.) [prefs]: %{user_preferences_url} backup_succeeded: subject_template: "Yedekleme başarıyla tamamlandı" - text_body_template: "Yedekleme işlemi başarıyla tamamlandı.\nYeni yedeğinizi [Yönetici Paneli > Yedekler](%{base_url}/admin/backups) adresinden indirebilirsiniz." + text_body_template: | + Yedekleme başarılı oldu. + + Yedeğinizi indirmek için [yönetici> yedekleme alanını](%{base_url}/admin/backups) ziyaret edin. + + İşlem kaydı burada: + + ```text + %{logs} + ``` backup_failed: subject_template: "Yedekleme başarısız" text_body_template: | Yedekleme başarısız oldu. - Kayıtlar burada: - - ``` + İşlem kaydı burada: + ```text %{logs} - ``` - restore_succeeded: subject_template: "Geri alma başarıyla tamamlandı" - text_body_template: "Geri alma başarıyla tamamlandı." + text_body_template: | + Geri yükleme başarılı oldu. + + İşlem kaydı burada: + + ```text + %{logs} + ``` restore_failed: subject_template: "Geri alma başarısız" text_body_template: | - Geri alma başarısız oldu. + Geri yükleme başarısız oldu. - Kayıtlar burada: - - ``` + İşlem kaydı burada: + ```text %{logs} - ``` bulk_invite_succeeded: subject_template: "Toplu davet gönderimi başarıyla tamamlandı" @@ -1257,27 +1453,46 @@ tr_TR: csv_export_failed: subject_template: "Dışarı veri aktarımı başarısız oldu" text_body_template: "Üzgünüz, dışarı veri aktarımı başarısız oldu. Lütfen kayıtları inceleyin veya bir görevli ile iletişime geçin." + email_reject_insufficient_trust_level: + subject_template: "[%{site_name}] E-posta sorunu -- Yetersiz Güven Seviyesi" + email_reject_user_not_found: + subject_template: "[%{site_name}] E-posta sorunu -- Kullanıcı Bulunamadı" + email_reject_screened_email: + subject_template: "[%{site_name}] E-posta sorunu -- Engellenen E-posta" + email_reject_inactive_user: + subject_template: "[%{site_name}] E-posta sorunu -- Edilgen Kullanıcı" + email_reject_blocked_user: + subject_template: "[%{site_name}] E-posta sorunu -- Engellenen Kullanıcı" + email_reject_reply_user_not_matching: + subject_template: "[%{site_name}] E-posta sorunu -- Beklenmeyen Cevap Adresi" email_reject_no_account: subject_template: "[%{site_name}] E-posta sorunu -- Bilinmeyen Hesap" email_reject_empty: subject_template: "[%{site_name}] E-posta sorunu -- İçerik Yok" text_body_template: | - Üzgünüz, ama %{destination} (titled %{former_title}) adresine göndermeye çalıştığınız e-posta başırısız oldu. + Üzgünüz, ama %{destination} (titled %{former_title}) adresine göndermeye çalıştığınız e-posta başarısız oldu. E-postada herhangi bir cevap bulamadık. - Eğer bu mesajı alıyorsanız ve cevap eklediyseniz, daha basit bir biçimleme ile yeniden deneyin. - - - + Eğer bu iletiyi alıyorsanız ve cevap eklediyseniz, daha basit bir biçimleme ile yeniden deneyin. email_reject_parsing: - subject_template: "[%{site_name}] E-posta sorunu -- Tanımlanamayan içerik" + subject_template: "[%{site_name}] E-posta sorunu -- İçerik Tanınamadı" text_body_template: | Üzgünüz, ama %{destination} (titled %{former_title}) adresine göndermeye çalıştığınız e-posta başırısız oldu. E-postada herhangi bir cevap bulamadık. **Cevabınızın e-posta'nın en üstünde yer aldığından emin olun** -- aralardaki cevapları işleyemiyoruz. email_reject_invalid_access: subject_template: "[%{site_name}] E-posta sorunu -- Geçersiz giriş" + email_reject_strangers_not_allowed: + subject_template: "[%{site_name}] E-posta sorunu -- Geçersiz İzin" + email_reject_invalid_post: + subject_template: "[%{site_name}] E-posta sorunu -- Gönderme hatası" + email_reject_invalid_post_specified: + subject_template: "[%{site_name}] E-posta sorunu -- Gönderim hatası" + email_reject_invalid_post_action: + subject_template: "[%{site_name}] E-posta sorunu -- Geçersiz Gönderi Eylemi" email_reject_reply_key: subject_template: "[%{site_name}] E-posta sorunu -- Bilinmeyen Cevap Anahtarı" + email_reject_bad_destination_address: + subject_template: "[%{site_name}] E-posta sorunu -- Bilinmeyen: Adres" email_reject_topic_not_found: subject_template: "[%{site_name}] E-posta sorunu -- Konu Bulunamadı" email_reject_topic_closed: @@ -1286,8 +1501,32 @@ tr_TR: subject_template: "[%{site_name}] E-posta sorunu -- Otomatik Üretilmiş Cevap" email_error_notification: subject_template: "[%{site_name}] E-posta sorunu -- POP doğrulama hatası" + too_many_spam_flags: + subject_template: "Yeni hesap askıda" + text_body_template: | + Merhaba, + + Bu, %{site_name} adresinden size gönderilen, topluluk tarafından bildirildiği için kontrol edilmek üzere gizlenen gönderinizi bildiren otomatik bir iletidir. + + Bir önlem olarak, bir yetkili incelemesine kadar yeni hesabınızdan yeni cevaplar veya konular oluşturmanız engellendi. Bu rahatsızlık için üzgünüz. + + Ek bilgi için, [topluluk yönergelerine](%{base_url}/guidelines) başvurun. + too_many_tl3_flags: + subject_template: "Yeni hesap askıda" + blocked_by_staff: + subject_template: "Hesap geçiçi olarak askıda" + user_automatically_blocked: + subject_template: "Yeni kullanıcı %{username} topluluk bildirimleri tarafından engellendi" spam_post_blocked: subject_template: "Üst üste aynı bağlantıların paylaşılmasından ötürü %{username} adlı yeni kullanıcının gönderileri engelledi" + unblocked: + subject_template: "Hesap artık askıda değil" + text_body_template: | + Merhaba, + + Bu otomatik ileti %{site_name} forumunda, görevli incelemesinin ardından hesabınızın artık askıda olmadığını bilmeniz amacıyla gönderilmiştir. + + Şimdi tekrar gönderi ve konular oluşturabilirsiniz. Sabrınız için teşekkürler. pending_users_reminder: subject_template: other: "%{count} kullanıcı onay bekliyor" @@ -1298,17 +1537,64 @@ tr_TR: download_remote_images_disabled: subject_template: "Uzaktaki resimlerin indirilmesi devre dışı bırakıldı" text_body_template: "`download_remote_images_to_local` ayarı harddisk alanı limiti `download_remote_images_threshold` aşıldığı için devre dışı bırakıldı." + dashboard_problems: + subject_template: "Sorunlar bulundu" + text_body_template: | + Gösterge panelinde bazı hatalar bildirildi gibi gözüküyor. + + [Lütfen inceleyip düzeltin](%{base_url}/admin). + unsubscribe_link: | + Bu e-postaları almayı durdurmak için [buraya tıklayın](%{unsubscribe_url}). + unsubscribe_link_and_mail: | + Bu e-postaları almayı durdurmak için [buraya tıklayın](%{unsubscribe_url}). + unsubscribe_mailing_list: | + Duyuru listesi modunu açtığınız için bunu alıyorsunuz. + + Bu e-postaları almayı durdurmak için [buraya tıklayın](%{unsubscribe_url}). subject_re: "Cvp:" subject_pm: "[ÖM]" user_notifications: previous_discussion: "Önceki Cevaplar" + in_reply_to: "Cevaben" unsubscribe: title: "Aboneliği İptal Et" description: "Bu e-postalarla ilgilenmiyor musunuz? Sorun değil! Aşağıya tıklayarak aboneliğinizi hemen iptal edebilirsiniz:" + reply_by_email: "Yanıtlamak için [konuyu ziyaret edin](%{base_url}%{url}) ya da bu e-postaya cevap verin." + reply_by_email_pm: "Yanıtlamak için [iletiyi ziyaret edin](%{base_url}%{url}) ya da bu e-postaya cevap verin." + only_reply_by_email: "Cevap vermek için bu e-postayı cevaplayın." + visit_link_to_respond: "Cevaplamak için [konuyu ziyaret edin](%{base_url}%{url})." + visit_link_to_respond_pm: "Cevaplamak için [iletiyi ziyaret edin](%{base_url}%{url})." posted_by: "%{post_date} tarihinde %{username} tarafından gönderildi" + invited_to_private_message_body: | + %{username} sizi bir iletiye davet etti + + > **%{topic_title}** + > + > %{topic_excerpt} + + şurada + + > %{site_title} -- %{site_description} + invited_to_topic_body: | + %{username} sizi bir tartışmaya davet etti + + > **%{topic_title}** + > + > %{topic_excerpt} + + şurada + + > %{site_title} -- %{site_description} user_invited_to_private_message_pm: - subject_template: "[%{site_name}] %{username} sizi bir mesaja davet etti '%{topic_title}'" + subject_template: "[%{site_name}] %{username} sizi bir iletiye davet etti '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} user_invited_to_private_message_pm_staged: + subject_template: "[%{site_name}] %{username} sizi bir iletiye davet etti '%{topic_title}'" text_body_template: | %{header_instructions} @@ -1316,6 +1602,7 @@ tr_TR: %{respond_instructions} user_invited_to_topic: + subject_template: "[%{site_name}] %{username} sizi konuya davet etti '%{topic_title}'" text_body_template: | %{header_instructions} @@ -1333,7 +1620,7 @@ tr_TR: %{respond_instructions} user_replied_pm: - subject_template: "[%{site_name}] [PM] %{topic_title}" + subject_template: "[%{site_name}] [ÖM] %{topic_title}" text_body_template: | %{header_instructions} @@ -1414,19 +1701,33 @@ tr_TR: %{respond_instructions} user_posted_pm_staged: subject_template: "%{optional_re}%{topic_title}" - text_body_template: | + text_body_template: |2 %{message} digest: why: "%{last_seen_at} tarihindeki son girişinizden beri %{site_link} sitesine olanların kısa bir özeti" + since_last_visit: "Son ziyaretinizden bu yana" + new_topics: "Yeni Konular" + unread_messages: "Okunmamış İletiler" + unread_notifications: "Okunmamış Bildirimler" + popular_topics: "Gözde Konular" + follow_topic: "Bu konuyu takip et" + join_the_discussion: "Devamını Oku" + popular_posts: "Gözde Gönderiler" + more_new: "Takip ettiğiniz konu ve kategorideki yeniler" subject_template: "[%{site_name}] Özeti" - new_activity: "Konu ve gönderilerinizdeki yeni aktiviteler:" - top_topics: "Popüler gönderiler" - other_new_topics: "Popüler konular" + unsubscribe: "Bir süredir görünmediğiniz için bu e-posta size %{site_link} topluluğundan gönderildi. Bu e-postaları almak istemiyorsanız %{unsubscribe_link}." click_here: "buraya tıklayın" - read_more: "Devamını Oku" - more_topics: "%{new_topics_since_seen} tane daha yeni konu vardı." - more_topics_category: "Daha fazla yeni konu:" + from: "%{site_name} özeti" + preheader: "%{last_seen_at} tarihindeki ziyaretinizden bu yana olanların kısa bir özeti" + mailing_list: + subject_template: "[%{site_name}] %{date} Özeti " + unsubscribe: "Bu günlük e-posta size %{site_link} topluluğundan duyuru listesi modunu etkin yaptığınız için gönderildi. Bu e-postaları almak istemiyorsanız %{unsubscribe_link}." + from: "%{site_name} özeti" + new_topics: "Yeni konular" + topic_updates: "Konu güncellemeleri" + view_this_topic: "Bu konuyu görüntüle" + back_to_top: "Başa dön" forgot_password: subject_template: "[%{site_name}] Parola sıfırlama" text_body_template: | @@ -1439,7 +1740,7 @@ tr_TR: set_password: subject_template: "[%{site_name}] Parola Oluşturun" text_body_template: | - Biri, [%{site_name}](%{base_url}) sitesindeki hesabınıza parola ekleme talebinde bulundu. Dilerseniz, bu doğrulanmış email hesabınızla eşleşen, desteklediğiniz herhangi bir online servisi (Google, Facebook, vs.) kullanarak da giriş yapabilirsiniz. + Biri, [%{site_name}](%{base_url}) sitesindeki hesabınıza parola ekleme talebinde bulundu. Dilerseniz, bu doğrulanmış e-posta hesabınızla eşleşen, desteklediğiniz herhangi bir çevrimiçi servisi (Google, Facebook, vs.) kullanarak da giriş yapabilirsiniz. Eğer istekte bulunan siz değilseniz, bu e-postayı görmezden gelebilirsiniz. @@ -1463,10 +1764,31 @@ tr_TR: %{base_url}/users/password-reset/%{email_token} confirm_new_email: subject_template: "[%{site_name}] Yeni mail adresinizi onaylayın" + text_body_template: | + %{site_name} adresindeki yeni e-posta adresinizi aşağıdaki bağlantıya tıklayarak doğrulayın + %{base_url}/users/authorize-email/%{email_token} + confirm_old_email: + subject_template: "[%{site_name}] Şimdiki e-posta adresinizi doğrulayın" + text_body_template: | + E-posta adresinizi değiştirmeden önce, şu anki e-posta adresinizin kontrolünün sizde olduğunu doğrulamamız gerekiyor. Bu adımı tamamlandıktan sonra, yeni e-posta adresinizi doğrulayacaksınız. + + %{site_name} sitesindeki şu anki e-posta adresinizi aşağıdaki bağlantıya tıklayıp doğrulayın: + + %{base_url}/users/authorize-email/%{email_token} + notify_old_email: + subject_template: "[%{site_name}] E-posta adresiniz değiştirildi" + text_body_template: | + Bu %{site_name} forumunda kullandığınız e-posta adresinizin değiştiğini + bildiren otomatik bir iletidir. Bir hata olduğunu düşünüyorsanız lütfen + yönetici ile iletişime geçin. + + E-posta adresiniz şu e-posta ile değiştirildi: + + %{new_email} signup_after_approval: subject_template: "%{site_name} sitesinde hesabınız onaylandı!" text_body_template: | - %{site_name} sitesine hoşgeldiniz! + %{site_name} topluluğuna hoş geldiniz! %{site_name} sitesindeki hesabınız bir görevli tarafından onaylandı. @@ -1476,29 +1798,30 @@ tr_TR: %{new_user_tips} - Biz her zaman [medeni topluluk davranışına](%{base_url}/guidelines) inanıyoruz. + Biz her zaman [topluluk yönergelerimize](%{base_url}/guidelines) inanıyoruz. Ziyaretinizin keyfini çıkarın! - (Eğer yeni bir kullanıcı olarak [görevlilerle](%{base_url}/about) iletişim kurmak isterseniz, bu mesajı cevaplamanız yeterli.) + (Eğer yeni bir kullanıcı olarak [görevlilerle](%{base_url}/about) iletişim kurmak isterseniz, bu iletiyi cevaplamanız yeterli.) signup: subject_template: "[%{site_name}] Yeni hesabınızı onaylayın" text_body_template: | - %{site_name} sitesine hoşgeldiniz! + %{site_name} topluluğuna hoş geldiniz! Hesabınızı onaylamak ve etkinleştirmek için aşağıdaki bağlantıya tıklayın: %{base_url}/users/activate-account/%{email_token} Eğer yukarıdaki bağlantı tıklanabilir değilse, bağlantıyı kopyalayıp tarayıcınızın adres çubuğuna yapıştırmayı deneyin. page_not_found: - popular_topics: "Popüler" + title: "Hay aksi! Bu sayfa yok ya da gizli." + popular_topics: "Gözde" recent_topics: "Yeni" see_more: "Daha fazla" search_title: "Bu sitede ara" search_google: "Google" login_required: welcome_message: | - #[Hoşgeldiniz %{title}](#welcome) + #[%{title} topluluğuna hoş geldiniz](#welcome) Hesap oluşturmanız gerekiyor. Devam etmek için lütfen bir hesap oluşturun ya da giriş yapın. terms_of_service: title: "Üyelik Sözleşmesi" @@ -1515,10 +1838,13 @@ tr_TR: images: too_large: "Üzgünüz, yüklemeye çalıştığınız resim çok büyük (en fazla %{max_size_kb}KB olabilir), lütfen küçültüp tekrar deneyin." size_not_found: "Üzgünüz, resminizin büyüklüğünü tespit edemedik. Dosya bozuk olabilir mi?" + avatar: + missing: "Üzgünüz, bu e-posta adresiyle ilişkilendirilmiş bir avatar bulamadık. Tekrar yüklemeyi deneyebilir misiniz?" email_log: + post_user_deleted: "Konunun kullanıcısı silindi." no_user: "%{user_id} id'sine sahip bir kullanıcı bulunamadı" anonymous_user: "Kullanıcı anonim" - suspended_not_pm: "Kullanıcı uzaklaştırıldı, mesaj değil" + suspended_not_pm: "Kullanıcı uzaklaştırıldı, ileti değil" seen_recently: "Kullanıcı kısa süre önce görüldü" post_not_found: "%{post_id} id'sine sahip bir gönderi bulunamadı" notification_already_read: "Bu e-postanın içerdiği bildiri önceden okundu" @@ -1526,7 +1852,9 @@ tr_TR: post_deleted: "gönderi sahibi tarafından silindi" user_suspended: "kullanıcı uzaklaştırıldı" already_read: "kullanıcı bu gönderiyi önceden okumuş" - message_blank: "mesaj boş" + exceeded_emails_limit: "max_emails_per_day_per_user aşıldı" + exceeded_bounces_limit: "bounce_score_threshold aşıldı" + message_blank: "ileti boş" message_to_blank: "message.to boş" text_part_body_blank: "text_part.body boş" body_blank: "içerik boş" @@ -1549,45 +1877,45 @@ tr_TR: title: "Gizlilik İlkeleri" badges: editor: - name: Editör - description: İlk mesajını düzenledin. + name: Düzenleyici + description: İlk gönderini düzenledin long_description: | - Bu rozet mesajlarınızdan birini düzenlediğinizde verilecektir. Mesajlarınızı düzenlemek her zaman için iyidir — mesajlarınızı geliştirebilir, küçük hataları düzeltebilir, ya da unuttuğunuz detayları ekleyebilirsiniz. Daha iyi mesaj oluşturabilmek için düzenleyin. + Bu rozet gönderilerinizden birini düzenlediğinizde verilecektir. Gönderilerinizi düzenlemek her zaman için iyidir — gönderilerinizi geliştirebilir, küçük hataları düzeltebilir, ya da unuttuğunuz ayrıntıları ekleyebilirsiniz. Daha iyi gönderi oluşturabilmek için düzenleyin. basic_user: name: Acemi description: Bütün esas forum uygulamalarını kullanabilmeye hak kazanılmıştır long_description: | - Bu rozet ilk rütbene ulaştığın için verildi. Forumda neler olduğunu takip ettiğiniz için ve konuları okuduğunuz için teşekkürler. Artık yeni özelliklere sahipsin; kişisel mesajlaşma, işaretleme, düzenleme, ve çoklu resim ve bağlantı paylaşablme gibi. + Bu rozet 1. güven seviyesine ulaştığın için verildi. Forumda neler olduğunu takip ettiğin için ve konuları okuduğun için teşekkürler. Artık yeni özelliklere sahipsin; özel iletiler, bildirme, düzenleme, ve çoklu resim ve bağlantı paylaşabilme gibi. member: - name: Sadık Üye - description: Davetler, grup mesajlaşmaları, ve daha fazla beğeni hakkı kazanılmıştır + name: Üye + description: Davetler, grup iletileri, ve daha fazla beğeni hakkı kazanılmıştır long_description: | - Bu rozet ikinci rütbeye ulaştığın için verildi.Bir kaç haftadır aramızda zaman geçirdiğin için teşekkürler. Artık kullanıcı sayfandan ya da konu sayfandan davetler gönderebilirsin, kişisel grup mesajları oluşturabilirsin ve günlük daha fazla beğeni yapabilirsin. + Bu rozet 2. güven seviyesine ulaştığın için verildi. Birkaç haftadır aramızda zaman geçirdiğin için teşekkürler. Artık kullanıcı sayfandan ya da konu sayfandan davetler gönderebilirsin, kişisel grup iletileri oluşturabilirsin ve günlük daha fazla beğeni yapabilirsin. regular: - name: Daimi Üye + name: Müdavim description: Yeniden kategorize etme, yeniden isimlendirme, takip edilen bağlantılar, ve daha fazla beğeni hakkı kazanılmıştır long_description: | - Bu rozet üçüncü seviye rütbeye ulaştığın için verildi. Bir kaç aydır düzenli katılımcımız olduğunuz için teşekkür ederiz. Forumumuzun en aktif okuyucularından ve güvenilir katılımcılarından birisiniz. Artık konuları tekrar kategorize edip, isimlendirebilirsiniz, bazı özel alanlara da girebilirsiniz ve günlük daha fazla beğeni yapabilirsiniz. + Bu rozet 3. güven seviyesine ulaştığın için verildi. Bir kaç aydır düzenli katılımcımız olduğun için teşekkür ederiz. Forumumuzun en etkin okuyucularından ve güvenilir katılımcılarından birisisin. Artık konuları tekrar kategorize edip, isimlendirebilirsin, bazı özel alanlara da girebilirsiniz ve günlük daha fazla beğeni yapabilirsin. leader: name: Lider - description: Genel düzenleme, sabitleme, kapama, arşivleme, ayırma ve birleştirme, daha fazla beğeni hakkı kazanılmıştır + description: Genel düzenleme, başa tutturma, kapama, arşivleme, ayırma ve birleştirme, daha fazla beğeni hakkı kazanılmıştır long_description: | - Bu rozet dördüncü rütbeye ulaştığın için verildi. Forumda yönetim tarafından seçilmiş bir lidersin ve yaptığınız paylaşımlarla diğer üyelere örnek oluyorsunuz. Bütün mesajları düzenleme hakkına sahipsiniz. Modaratörlerin yapabileceği, sabitleme,kapama, arşivleme, ayırma ve birleştirme gibi işlemleri yapabilrsiniz. Artık günlük çok daha fazla beğeni yapabilirsiniz. + Bu rozet 4. güven seviyesine ulaştığın için verildi. Forumda yönetim tarafından seçilmiş bir lidersiniz ve yaptığınız paylaşımlarla diğer üyelere örnek oluyorsunuz. Bütün gönderileri düzenleme hakkına sahipsiniz. Moderatörlerin yapabileceği, başa tutturma, kapama, arşivleme, ayırma ve birleştirme gibi işlemleri yapabilirsiniz. Artık günlük çok daha fazla beğeni yapabilirsiniz. welcome: name: Hoş geldiniz - description: İlk Beğeni + description: İlk beğeni alma long_description: | - Bu rozet mesajına ilk beğenini aldığın için verildi. Tebrikler forumda diğer üyelerin ilgisini çeken, yararlı bir paylaşımda bulundun! + Bu rozet gönderine ilk beğenini aldığın için verildi. Tebrikler forumda diğer üyelerin ilgisini çeken, yararlı bir paylaşımda bulundun! autobiographer: name: Güncel Profil description: profil bilgilerini tamamlama long_description: | - Bu rozet profil sayfasını tamamladığınız ve bir profil resmi oluşturduğunuz için verilmiştir. Artık diğer üyeler sizin hakkınzıda daha fazla bilgi sahibi olup, sizin ilgi alanlarınızı daha yakından takip edebilir. + Bu rozet profil sayfasını tamamladığınız ve bir profil resmi seçtiğiniz için verilmiştir. Artık topluluk sizin hakkınızda daha fazla bilgi sahibi olup, sizin ilgi alanlarınızı daha yakından takip edebilir. anniversary: - name: Tanışma Yıldönümü - description: Bir sene içerisinde, en az bir kere mesaj yazmış aktif üye + name: Yıldönümü + description: Bir sene içerisinde, en az bir kere gönderi yazmış etkin üye long_description: | - Bu rozet en az bir mesaj yazarak bir yıllık üyeliğinizi tamamladığınız için size verilmiştir. Forumda zaman geçirdiğiniz ve bizlere katkıda bulunduğunuz için teşekkür ederiz. Sizler olmasanız yapamazdık. + Bu rozet en az bir gönderi yazarak bir yıllık üyeliğinizi tamamladığınız için size verilmiştir. Forumda zaman geçirdiğiniz ve bizlere katkıda bulunduğunuz için teşekkür ederiz. Sizler olmasanız yapamazdık. nice_post: name: Hoş Cevap description: Cevaba 10 beğeni alındı @@ -1612,7 +1940,7 @@ tr_TR: name: Çok İyi Konu description: Konu 25 beğeni topladı long_description: | - Bu rozet açtığınız konuya yapılan 25 beğeniden dolayı verilmiştir. Forum üyeleri tarafından çok beğenilen hararetli bir konu açtınız. + Bu rozet açtığınız konuya yapılan 25 beğeniden dolayı verilmiştir. Forum üyeleri tarafından çok beğenilen hareketli bir konu açtınız. great_topic: name: Muhteşem Konu description: Konu 50 beğeni topladı @@ -1627,7 +1955,7 @@ tr_TR: name: Çok İyi Paylaşım description: Bir gönderiniz 300 tekil ziyaretci tarafından paylaşıldı long_description: | - Bu rozeti paylaştığınız bağlantı forum dışından 300 kişi tarafından tıklandığı için kazandınız.Çok iyi iş başardın! Paylaşımların daha fazla kişiye ulaşmasını ve forumun gelişmesini sağladın. + Bu rozeti paylaştığınız bağlantı forum dışından 300 kişi tarafından tıklandığı için kazandınız. Çok iyi iş başardın! Paylaşımların daha fazla kişiye ulaşmasını ve forumun gelişmesini sağladın. great_share: name: 'Muhteşem Paylaşım ' description: Bir gönderiniz 1000 tekil ziyaretci tarafından paylaşıldı @@ -1637,54 +1965,54 @@ tr_TR: name: İlk Beğeni description: Bir gönderiyi beğendin long_description: | - Bu rozet ilk defa bir mesajı beğendiğin için verildi. Mesajları beğenmek diğer kullanıcıların yaptıkları paylaşımların ilgi çekici olduğunu onlara göstermek açısından oldukça önemlidir. Beğeninizi gösterin! + Bu rozet ilk defa bir gönderiyi beğendiğin için verildi. Gönderileri beğenmek diğer kullanıcıların yaptıkları paylaşımların ilgi çekici olduğunu onlara göstermek açısından oldukça önemlidir. Beğeninizi gösterin! first_flag: - name: İlk İşaret - description: Gönderiyi işaretledin + name: İlk Bildirim + description: Gönderiyi bildirdi long_description: | - Bu rozet ilk kez bir mesajı şikayet ettiğiniz için verilmiştir. Şikayet etme daha huzurlu bir ortam oluşturmaya yardımcı olmak açısından oldukça önemlidir. Eğer herhangi bir mesajın yönetici tarafından incelenmesini istiyorsanız, lütfen şikayet etmekten çekinmeyin. Eğer mesajlarıyla ilgili bir sorun farkederseniz, diğer üyelerede kişisel mesajlar gönderebilirsiniz. Eğer bir problem farkederseniz, :flag_black: şikayet edin! + Bu rozet ilk kez bir gönderiyi bildirdiğiniz için verilmiştir. Bildirme daha huzurlu bir ortam oluşturmaya yardımcı olmak açısından oldukça önemlidir. Eğer herhangi bir gönderinin yönetici tarafından incelenmesini istiyorsanız, lütfen bildirmekten çekinmeyin. Eğer gönderileriyle ilgili bir sorun fark ederseniz, diğer üyelere de kişisel iletiler gönderebilirsiniz. Eğer bir problem fark ederseniz, :flag_black: şikayet edin! promoter: name: Destekçi description: Kullanıcı davet etme long_description: | - Bu rozet kullanıcı sayfanızdan ya da konularının altındaki butondan başka birini forumu kullanmaya davet ettiğiniz için verilmiştir. Arkadaşlarınızı ilgilerini çekebilecek konulara davet etmek forumun büyümesi için mükemmel bir yoldur. Teşekkürler! + Bu rozet kullanıcı sayfanızdan ya da konularının altındaki düğmeden başka birini forumu kullanmaya davet ettiğiniz için verilmiştir. Arkadaşlarınızı ilgilerini çekebilecek konulara davet etmek forumun büyümesi için mükemmel bir yoldur. Teşekkürler! campaigner: name: Mücadeleci description: 3 Acemi kullanıcı davet edildi long_description: | - Bu rozet davet ettiğiniz 3 kişi sitede vakit geçirerek acemi üye rütbesine ulaştığı için size verilmiştir. Hareketli bir forumun düzenli katkıda bulunan katılımcıları ve destekçileri olmalıdır. + Bu rozet davet ettiğiniz 3 kişi sitede vakit geçirerek acemi üye seviyesine ulaştığı için size verilmiştir. Hareketli bir forumun düzenli katkıda bulunan katılımcıları ve destekçileri olmalıdır. champion: name: Şampiyon - description: 5 sadık üye davet edildi + description: 5 üye davet edildi long_description: | - Bu rozet davet ettiğiniz 5 kişi sitede vakit geçirerek sadık üye rütbesine ulaştığı için size verilmiştir. Süper! Yeni üyelerle tanışmamıza sebep olduğunuz için teşekkürler! + Bu rozet davet ettiğiniz 5 kişi sitede vakit geçirerek üye seviyesine ulaştığı için size verilmiştir. Süper! Yeni üyelerle tanışmamıza sebep olduğunuz için teşekkürler! first_share: name: İlk Paylaşım - description: Bir bağlantı paylaşma + description: Bir gönderi paylaşma long_description: | Bu rozet ilk defa bir cevabın ya da konunun bağlantısını paylaştığınız için verilmiştir. Bağlantı paylaşmak tartışmaların daha fazla kişiye ulaşması açısından çok önemlidir. first_link: name: İlk Bağlantı - description: Başka bir konuya link ekleme + description: Başka bir konuya bağlantı ekleme long_description: | Bu rozet ilk defa bir konuya link eklediğiniz için verilmiştir. Konu linkleri diğer okuyucularından bu diyaloglardan yararlanmalarını sağlar. first_quote: name: İlk Alıntı - description: Bir mesajdan alıntı yapma + description: Bir gönderiyi alıntıladı long_description: | - Bu rozet cevabınızda başkasından alıntı yaptığınız için verilmiştir. Başka konulardan ve mesajlardan alıntı yapmak mesajlar arasındaki bağlantıyı kuvvetlendirir. En kolay alıntı yapma yolu alıntı yapacağınız bölümü seçip cevap butonuna basmaktır. + Bu rozet cevabınızda başkasından alıntı yaptığınız için verilmiştir. Başka konulardan ve gönderilerden alıntı yapmak mesajlar arasındaki bağlantıyı kuvvetlendirir. En kolay alıntı yapma yolu alıntı yapacağınız bölümü seçip cevap düğmesine basmaktır. read_guidelines: - name: Site Uyumlusu - description: site kurallarını okuma + name: Yönergeleri Okuma + description: Topluluk yönergelerini okuma long_description: | - Bu rozeti site kurallarını okuduğunuz için kazandınız. Site kurallarını bilmek ve bu kurallara uygun davranmak daha huzurlu bir ortam içiersinde paylaşım yapmanızı sağlar. + Bu rozeti topluluk yönergelerini okuduğunuz için kazandınız. Site kurallarını bilmek ve bu kurallara uygun davranmak daha huzurlu bir ortam içerisinde paylaşım yapmanızı sağlar. reader: name: Okuyucu description: 100 cevaptan fazla cevabı olan bir konunun her cevabını okuma long_description: | - Bu rozet 100 den fazla cevaba sahip olan bir konuyu okuduğunuz için verilmiştir. Bir tartışmayı takip etmek o konu hakkında detaylı bilgi sahibi olmanızı ve görüş açınızı genişletmenizi sağlar. + Bu rozet 100 den fazla cevaba sahip olan bir konuyu okuduğunuz için verilmiştir. Bir tartışmayı takip etmek o konu hakkında ayrıntılı bilgi sahibi olmanızı ve görüş açınızı genişletmenizi sağlar. popular_link: - name: Popüler Bağlantı + name: Gözde Bağlantı description: 50 kere tıklanmış bir bağlantı paylaşma long_description: | Bu rozet 50 tıklama elde etmiş bir bağlantı paylaştığınız için verilmiştir. Yararlı bir link paylaşımı yaptığınız için teşekkür ederiz. @@ -1700,17 +2028,17 @@ tr_TR: name: Takdire Layık description: 20 gönderine 1 beğeni aldın long_description: | - Bu rozet 20 farklı mesajda en az bir beğeni kazandığınız için verilmiştir. Forum olarak tartışmalara olan katkınızı takdir ediyoruz! + Bu rozet 20 farklı gönderide en az bir beğeni kazandığınız için verilmiştir. Topluluk olarak tartışmalara olan katkınızı takdir ediyoruz! respected: - name: Saygıdeğer + name: Saygın description: 100 gönderine 2 beğeni aldın long_description: | - Bu rozet 100 farklı mesajda en az 2 beğeni kazandığınız için verilmiştir.Katkılarınız forum için çok değerli. + Bu rozet 100 farklı gönderide en az 2 beğeni kazandığınız için verilmiştir. Katkılarınız forum için çok değerli. admired: - name: Çok Beğenilen + name: Takdir Edilen description: 300 gönderine 5 beğeni aldın long_description: | - Bu rozet farklı 300 mesajda en az 5 beğeni kazandığınız için verilmiştir.Süper! Tartışmalara olan katkınız muazzam. + Bu rozet farklı 300 gönderide en az 5 beğeni kazandığınız için verilmiştir. Süper! Tartışmalara olan katkınız muazzam. out_of_love: name: Sevgiden Öte description: Bir günde 50 beğeni kullanıldı @@ -1730,31 +2058,34 @@ tr_TR: name: Teşekkürler description: '20 beğeni sahibi olma ve 10 beğenme ' long_description: | - Bu rozet 20 beğenilmiş mesaj sahibi olduğunuz ve bunun karşılığında 10 ya da daha fazla beğeni yaptığınızdan dolayı size verilmiştir. + Bu rozet 20 beğenilmiş gönderi sahibi olduğunuz ve bunun karşılığında 10 ya da daha fazla beğeni yaptığınızdan dolayı size verilmiştir. gives_back: name: Beğenilip Beğenme description: '100 beğeni sahibi olma ve 100 beğenme ' long_description: | - Bu rozet 100 beğenilmiş mesaj sahibi olduğunuz ve bunun karşılığında 100 ya da daha fazla beğeni yaptığınızdan dolayı size verilmiştir. Teşekkür ederiz! + Bu rozet 100 beğenilmiş gönderi sahibi olduğunuz ve bunun karşılığında 100 ya da daha fazla beğeni yaptığınızdan dolayı size verilmiştir. Teşekkür ederiz! empathetic: name: Empatik description: 500 beğeni sahibi olma ve 1000 beğeni long_description: | - Bu rozet 500 beğenilmiş mesaj sahibi olduğunuz ve bunun karşılığında 1000 ya da daha fazla beğeni yaptığınızdan dolayı size verilmiştir. Süper! Cömetliğin ve takdirin örneğisin :two_hearts:. + Bu rozet 500 beğenilmiş gönderisahibi olduğunuz ve bunun karşılığında 1000 ya da daha fazla beğeni yaptığınızdan dolayı size verilmiştir. Süper! Cömetliğin ve takdirin örneğisin :two_hearts:. first_emoji: name: İlk Emoji - description: 'Bir mesajda emoji kullanma ' + description: 'Bir gönderide emoji kullanma ' long_description: | - Bu rozet mesajınıza ilk defa bir emoji eklediğiniz için verilmiştir :thumbsup:. + Bu rozet gönderinize ilk defa bir emoji eklediğiniz için verilmiştir :thumbsup:. first_mention: - name: İlk Anma - description: 'Mesajda bir kullanıcıdan bahsetme ' - long_description: Bu rozet ilk defa mesajınızda başka bir kullanıcıdan bahsettiğiniz için verilmiştir. Her bahsetme bahsi geçen kullanıcıya bildirim gitmesini sağlar, böylece bu kullanıcı sizin mesajınızdan haberdar olur. Sadece bahsi geçen kullanıcı adına @ gerekir. + name: İlk Bahsetme + description: 'Gönderide bir kullanıcıdan bahsetme ' + long_description: Bu rozet ilk defa gönderinizde başka bir kullanıcıdan bahsettiğiniz için verilmiştir. Her bahsetme bahsi geçen kullanıcıya bildirim gitmesini sağlar, böylece bu kullanıcı sizin gönderinizden haberdar olur. Sadece bahsi geçen kullanıcı adına @ gerekir. + first_onebox: + name: İlk Kutulama + description: Kutulanmış bir bağlantı gönderdi first_reply_by_email: - name: İlk Mail Cevabı - description: 'Mesaja mail yolu ile cevap verme ' + name: Mail İle İlk Cevap + description: 'Gönderiye mail yoluyla cevap verme ' long_description: | - Bu rozet ilk defa bir mesaja mail yolu ile cevap verdiğiniz için verilmiştir. + Bu rozet ilk defa bir gönderiye mail yoluyla cevap verdiğiniz için verilmiştir :e-mail:. admin_login: success: "E-posta Gönderildi" error: "Hata!" @@ -1765,8 +2096,130 @@ tr_TR: performance_report: initial_post_raw: Bu konu siteniz hakkında günlük performans raporlarını içerir. initial_topic_title: Site performansı raporları + topic_invite: + user_exists: "Üzgünüz, bu kullanıcı zaten davet edildi. Konuya yalnızca bir kullanıcı davet edebilirsiniz." tags: title: "Etiketler" + staff_tag_disallowed: " \"%{tag}\" etiketi yalnızca görevliler tarafından eklenebilir gözüküyor." + staff_tag_remove_disallowed: " \"%{tag}\" etiketi yalnızca görevliler tarafından silinebilir gözüküyor." + rss_by_tag: "%{tag} etiketli konular" + finish_installation: + congratulations: "Tebrikler, Discourse yüklediniz!" + register: + button: "Kayıt Ol" + title: "Yönetici Hesabı Oluştur" + help: "başlamak için yeni bir hesap oluşturun" + confirm_email: + title: "E-posta adresinizi doğrulayın" + resend_email: + title: "Etkinleştirme E-postasını Tekrar Gönder" + message: "%{email} adresine etkinleştirme e-postasını tekrar gönderdik" + safe_mode: + title: "Güvenli moda gir" + no_customizations: "Tüm site özelleştirmelerini devre dışı bırak" + no_plugins: "Tüm eklentileri devre dışı bırak" + enter: "Güvenli Moda Gir" + wizard: + title: "Discourse Kurulumu" + step: + locale: + title: "Discourse topluluğunuza hoş geldiniz!" + fields: + default_locale: + description: "Topluluğunuz için öntanımlı dil nedir?" + forum_title: + title: "İsim" + fields: + title: + label: "Topluluğunuzun ismi" + placeholder: "Oktay'ın Yeri" + site_description: + label: "Topluluğunuzu kısa bir cümle ile tanımlayın" + placeholder: "Oktay ve arkadaşlarının ilginç şeyleri tartışabilecekleri bir yer" + introduction: + title: "Tanıtım" + fields: + welcome: + label: "Hoş geldiniz Konusu" + description: "
Bir çay evindeki birine topluluğunuzu 1 dakikada nasıl anlatırsınız?
Hoş geldiniz konusu yeni ziyaretçilerin ilk göreceği şeydir. Bunu sizin tek nefeslik 'çay konunuz' veya 'ısmarlama çayınız' olarak görebilirsiniz.
" + one_paragraph: "Lütfen hoş geldiniz iletinizi bir paragraf kadar uzunlukta tutun." + privacy: + title: "Erişim" + description: "Topluluğunuz herkese açık mı yoksa üyelik, davet veya onaylama ile kısıtlı mı? Dilerseniz bu seçeneği daha sonra değiştirebilirsiniz.
Kullanıcı sayfanızdan ve konulardan davetiye gönderebileceğini unutmayın.
" + fields: + privacy: + choices: + open: + label: "Herkese Açık" + description: "Herkes topluluğa erişebilir ve bir hesap için kayıt olabilir." + restricted: + label: "Özel" + description: "Yalnızca davet ettiğim veya onaylanmış kişiler foruma erişebilir." + contact: + title: "İletişim" + fields: + contact_email: + label: "Posta" + placeholder: "isim@ornek.com" + contact_url: + label: "Ağ Sayfası" + placeholder: "http://www.ornek.com/iletisim" + site_contact: + label: "Otomatik İletiler" + description: "Discourse tarafından gönderilen tüm otomatik kişisel iletiler bu kullanıcı tarafından gönderilecek. Daha da önemlisi, kullanıcılara gidecek olan hoş geldiniz mesajları da bu kullanıcı tarafından gönderilecek." + corporate: + description: "Bu isimler sonradan düzenleyebileceğiniz Gizlilik Politikası ve Hizmet Şartları metinlerinde kullanılacak. Eğer bir şirket söz konusu değilse bu adımı geçebilirsiniz." + fields: + company_short_name: + label: "Firma İsmi (kısa)" + placeholder: "Falanteknik" + company_full_name: + label: "Firma İsmi (tamamı)" + placeholder: "Falanteknik A.Ş" + company_domain: + label: "Firma Alan Adı" + placeholder: "falanteknik.com" + colors: + title: "Tema" + fields: + theme_id: + description: "Başlamak için renk düzeni olarak karanlık mı yoksa aydınlık mı istersiniz? Dilediğiniz zaman daha fazla seçeneği Yönetici, Özelleştir alanında bulabilirsiniz." + choices: + default: + label: "Basit Aydınlık" + dark: + label: "Basit Karanlık" + logos: + title: "Görseller" + fields: + logo_url: + label: "Birincil Görsel" + description: "Sitenizin sol üst kısmında gözükecek olan görsel. Geniş bir dikdörtgen olursa iyi olur." + logo_small_url: + label: "Sadeleştirilmiş Görsel" + description: "Site görselinizin öz bir sürümü, aşağıya doğru kaydırılma yapıldığında sol üstte gözükecek. Kare bir görsel iyi olur." + icons: + title: "Simgeler" + fields: + favicon_url: + label: "Simgecik" + apple_touch_icon_url: + label: "Büyük Simge" + homepage: + title: "Ana Sayfa" + fields: + homepage_style: + choices: + latest: + label: "Son Konular" + categories: + label: "Kategoriler" + emoji: + title: "Emoji" + invites: + title: "Görevli Davet Et" + finished: + title: "Discourse'unuz hazır! " activemodel: errors: <<: *errors diff --git a/config/locales/server.uk.yml b/config/locales/server.uk.yml index ba1ff148167..c5cda747699 100644 --- a/config/locales/server.uk.yml +++ b/config/locales/server.uk.yml @@ -15,22 +15,70 @@ uk: posts: "дописи" loading: "Завантаження" powered_by_html: 'Створено за допомогою технології Discourse, бажано переглядати з увімкненим JavaScript' + log_in: "Вхід" + emails: + incoming: + default_subject: "Вхідна пошта від %{email}" + errors: + inactive_user_error: "Таке трапляється, якщо відправник не активний" + blocked_user_error: "Таке трапляється, якщо відправника було заблоковано" + errors: &errors + messages: + accepted: має бути прийнятий + blank: не може бути порожнім + present: має бути порожнім + not_a_number: це не цифра + not_an_integer: має бути цілим числом + too_long: + one: надто довге (максимум 1 символ) + few: надто довге (максимум %{count} символів) + other: надто довге (максимум %{count} символів) + other_than: "має бути іншим ніж %{count}" + template: + body: 'Проблеми на цих полях:' + embed: + load_from_remote: "Під час завантаження допису виникла проблема." backup: operation_already_running: "An operation is currently running. Can't start a new job right now." backup_file_should_be_tar_gz: "The backup file should be a .tar.gz archive." not_enough_space_on_disk: "There is not enough space on disk to upload this backup." not_logged_in: "You need to be logged in to do that." read_only_mode_enabled: "The site is in read only mode. Interactions are disabled." + reading_time: "Час зчитування" + likes: "Вподобання" embed: start_discussion: "Розпочати Дискусію" continue: "Продовжити Дискусію" + more_replies: + one: "1 більше відповідей" + few: "%{count} більше відповідей" + other: "%{count} більше відповідей" loading: "Завантаження обговорення..." permalink: "Постійне посилання" imported_from: "Discussion topic for the original blog entry at: %{link}" + replies: + one: "1 відповідь" + few: "%{count} відповідей" + other: "%{count} відповідей" + no_images_allowed: "Даруйте, нові користувачі не можуть вставляти зображення в дописи." + too_many_images: + one: "Даруйте, нові користувачі можуть вставляти тільки одне зображення в допис." + few: "Даруйте, нові користувачі можуть вставляти тільки %{count} зображень в допис." + other: "Даруйте, нові користувачі можуть вставляти тільки %{count} зображень в допис." + no_attachments_allowed: "Даруйте, нові користувачі не можуть вставляти прикріплення в дописи." + too_many_attachments: + one: "Даруйте, нові користувачі можуть вставляти тільки одне прикріплення в допис." + few: "Даруйте, нові користувачі можуть вставляти тільки %{count} прикріплень в допис." + other: "Даруйте, нові користувачі можуть вставляти тільки %{count} прикріплень в допис." + no_links_allowed: "Даруйте, нові користувачі не можуть вставляти посилання в дописи." + too_many_links: + one: "Даруйте, нові користувачі можуть вставляти тільки одне посилання в допис." + few: "Даруйте, нові користувачі можуть вставляти тільки %{count} посилань в допис." + other: "Даруйте, нові користувачі можуть вставляти тільки %{count} посилань в допис." spamming_host: "Даруйте, Ви не можете вставити посилання на цей хост." + topic_not_found: "Щось пішло не так. Можливо цей допис було закрито або видалено, під час того як ви його переглядали?" just_posted_that: "це дуже схоже на те, що ви нещодавно дописували" invalid_characters: "містить неприпустимі символи" - is_invalid: "є неприпустимим; спробуйте бути трохи більше наочним" next_page: "наступна сторінка →" prev_page: "← попередня сторінка" page_num: "Сторінка %{num}" @@ -44,9 +92,16 @@ uk: rss_description: latest: "Останні теми" hot: "Гарячі теми" + posts: "Останні дописи" + private_posts: "Останні приватні повідомлення" + group_posts: "Останні дописи від %{group_name}" + user_posts: "Останні дописи @%{username}" + user_topics: "Останні теми @%{username}" too_late_to_edit: "Цей допис було створено надто давно. Його вже не можна редагувати або видалити." + excerpt_image: "зображення" groups: default_names: + everyone: "усі" admins: "адміністратори" moderators: "модератори" staff: "персонал" @@ -77,18 +132,28 @@ uk: attributes: category: name: "Назва категорії" + topic: + title: 'Назва' post: raw: "Тіло" + user_profile: + bio_raw: "Про мене" errors: models: user: attributes: ip_address: signup_not_allowed: "Вхід не дозволено з цього облікового запису." + web_hook: + attributes: + payload_url: + invalid: "Хибний URL. URL має містити http:// або https://. І пробіли не дозволяються." + <<: *errors user_profile: no_info_me: "-
-
order:views (按照显示次数排序) | order:latest (按照更新时间排序) | order:likes (按照赞的次数排序) | @用户名 | user:用户名 |
status:open (搜索正常状态的主题) | status:closed (搜索锁定的主题) | status:archived (搜索已经存档的主题) | status:noreplies (搜索没有回复的主题) | status:single_user (搜索只有一个人发言的主题) |
#category-slug (搜索分类代号) | category:分类名 | group:小组名 | badge:徽章名 | |
in:likes (在已赞过的帖子里搜索) | in:posted (在发表的帖子里搜索) | in:watching (在关注的帖子里搜索) | in:tracking (在追踪的帖子里搜索) | in:private (在秘密帖子里搜索) |
in:bookmarks (在收藏的帖子里搜索) | in:first (在第一帖里搜索) | in:pinned (在置顶主题里搜索) | in:unpinned (在未置顶主题里搜索) | in:wiki (在协作主题里搜索) |
posts_count:N (搜索帖子数为 N 的) | before:天数或日期 | after:天数或日期 | tags:一,二 |
-
彩虹 #gong-yuan
将搜索在“公园”分类中没有关闭或存档中的名字包含“彩虹”的主题。彩虹 category:公园 status:open order:latest
将搜索在“公园”分类中没有锁定或存档中的名字包含“彩虹”的主题,并按最后一个帖子的日期来排序。彩虹 category:"公园和花园" in:bookmarks
将搜索在“公园和花园”分类中已被你收藏的且名字包含“彩虹”的主题。我们发送了一封激活邮件到%{email}。请按照邮件中的步骤来激活你的帐号。
如果你没有收到邮件,请检查你正确设置了 Discourse 邮件配置,然后查看你的垃圾邮件收件箱。
" + resend_email: + title: "重发激活邮件" + message: "我们重发了激活邮件至%{email}" + safe_mode: + title: "进入安全模式" + description: "安全模式让你的站点不载入插件或站点自定义设置。" + no_customizations: "禁止所以站点自定义" + only_official: "禁用非官方插件" + no_plugins: "禁用所以插件" + enter: "进入安全模式" + wizard: + title: "Discourse 安装" + step: + locale: + title: "欢迎来到 Discourse!" + fields: + default_locale: + description: "你的社群主要使用什么语言?" + forum_title: + title: "名字" + description: "名字就像远方可见的路标一样,访客“首先”将看到这个社群的名字。你起的名字和标题怎样描述了你的社群?" + fields: + title: + label: "你社群的名字" + placeholder: "小明的论坛" + site_description: + label: "用一句简短的话描述你的社群" + placeholder: "小明和他的朋友讨论酷东西的论坛" + introduction: + title: "介绍" + fields: + welcome: + label: "欢迎主题" + description: "
你将怎么在一分钟内向陌生人描述你的社群?
你的欢迎主题是新访客将先看到的东西。把它想象为一段“电梯宣传”或者“使命声明”。
" + one_paragraph: "请限制你的欢迎消息至一段话。" + privacy: + title: "访问" + description: "你的社群对所有人可见或者需要限制为会员许可、邀请许可或者审核许可?如果你愿意,你可以将其设为私密,然后再切换至公开。
记住你永远可以在主题中邀请别人,或者从你的用户页面里也行。
" + fields: + privacy: + choices: + open: + label: "公开" + description: "任何人都可访问社群,可以创建账户" + restricted: + label: "私密" + description: "只有我邀请或审核通过的人可以访问社群" + contact: + title: "联系" + fields: + contact_email: + label: "邮件" + placeholder: "name@example.com" + description: "社群的负责人或小组的邮件地址。将用来接收关于未处理标记和安全更新的紧急通知,并显示在关于页面上作为紧急联系的方式。" + contact_url: + label: "网页" + placeholder: "http://www.example.com/contact-us" + description: "你或者你的组织平时用于联络的网页。将被显示在关于页面中。" + site_contact: + label: "自动消息" + description: "所有自动发送自 Discourse 的私人消息将以该用户的名义发送。最重要的是,这个用户将被指定为发送给每个新用户的欢迎消息的发送人。" + corporate: + title: "组织" + description: "这些名字将显示于隐私策略和服务条款中,你可以随时在工作人员分类中编辑他们。如果你没有公司,你可以跳过这个步骤。" + fields: + company_short_name: + label: "公司名(短)" + placeholder: "国际科技" + company_full_name: + label: "公司名(全)" + placeholder: "国际科技有限公司。" + company_domain: + label: "公司域名名字" + placeholder: "initech.com" + colors: + title: "主题" + fields: + theme_id: + description: "你喜欢亮色还是暗色的颜色方案?你永远可以在管理-自定义中修改站点的观感。" + choices: + default: + label: "简洁亮" + dark: + label: "简洁黑" + logos: + title: "标志" + fields: + logo_url: + label: "主要标志" + description: "在你站点左上角出现的小号标志图片,应为一个长方形。" + logo_small_url: + label: "紧凑 Logo" + description: "站点标志的紧凑版本,在向下滚动时出现在左上角。用正方形的图片。" + icons: + title: "图标" + fields: + favicon_url: + label: "小图标" + description: "浏览器中你站点显示的图标,要在小尺寸的情况下表现出色,例如 32px X 32px。" + apple_touch_icon_url: + label: "大图标" + description: "现代设备中你站点显示的图标,要在大一点尺寸的情况下表现出色。推荐的尺寸至少要达到144px X 144px。" + homepage: + description: "我们推荐在你的主页显示最新主题,但是如果你喜欢,你也可以选择显示分类(一组主题)。" + title: "主页" + fields: + homepage_style: + choices: + latest: + label: "最新主题" + categories: + label: "分类" + emoji: + title: "Emoji" + description: "你喜欢你的社群使用哪一种 Emoji 样式?你永远可以在管理-自定义-Emoji中增加更多的定制 Emoji。" + invites: + title: "邀请工作人员" + description: "你快做完啦!让我们邀请一些工作人员来帮助你创建一些讨论主题以方便你发布社群。" + finished: + title: "你的 Discourse 已经准备就绪!" + description: | +如果你觉得需要修改这些设置,访问管理员分块;你可以在站点菜单找到扳手图标旁找到。
+祝你玩得开心,还有祝你建设新社区好运!
activemodel: errors: <<: *errors diff --git a/config/locales/server.zh_TW.yml b/config/locales/server.zh_TW.yml index 9f569cadba8..65ada8f36de 100644 --- a/config/locales/server.zh_TW.yml +++ b/config/locales/server.zh_TW.yml @@ -14,17 +14,44 @@ zh_TW: formats: short: "%Y-%m-%d" short_no_year: "%B %-d" + date_only: "%Y年%m月%d日" + long: "%Y年%m月%d日%H:%M" date: month_names: [null, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月] <<: *datetime_formats + time: + am: "AM" + pm: "PM" + <<: *datetime_formats title: "論壇" topics: "討論話題" posts: "文章" loading: "載入中" powered_by_html: 'Powered by Discourse, 請啟用 Javascript 以獲得最佳瀏覽效果' log_in: "登入" + purge_reason: "自動當成遺棄、未啟動的帳號刪除" disable_remote_images_download_reason: "磁盤空間不足,圖像下載已被禁用。" anonymous: "匿名" + emails: + incoming: + default_subject: "收入email從%{email}" + show_trimmed_content: "顯示之前刪除的內容" + maximum_staged_user_per_email_reached: "以達成分期使用者能創造的最大數量信件" + errors: + empty_email_error: "當收到的未加工訊息是空白時發生" + no_message_id_error: "當信件沒有訊息名稱時發生" + auto_generated_email_error: "郵件頭部的“precedence”為:list、junk、bulk 或 auto_reply,或者頭部包含了:auto-submitted、auto-replied 或 auto-generated。" + no_body_detected_error: "無法解析正文並且沒有附件。" + inactive_user_error: "當寄件者不是主動時發生" + blocked_user_error: "當寄件者被阻擋時發生" + bad_destination_address: "發至/抄送/密送欄中的所有郵件都不匹配進站郵件地址。" + strangers_not_allowed_error: "當使用者想在不屬於他的分類中開創一個新的主題時發生" + insufficient_trust_level_error: "用戶嘗試在用戶等級不滿足分類要求時發帖。" + reply_user_not_matching_error: "回覆郵箱地址與通知發送至的郵件地址不同。" + topic_not_found_error: "當得到回應,但相關主題已經被刪除時發生" + topic_closed_error: "當得到回應,但相關主題已經被關閉時發生" + bounced_email_error: "郵件是投遞失敗的錯誤報告。" + screened_email_error: "發件人郵箱已經被封禁。" errors: &errors format: '%{attribute} %{message}' messages: @@ -44,7 +71,7 @@ zh_TW: has_already_been_used: "已經被使用" inclusion: 不包括在這列表中 invalid: 無效的 - is_invalid: "無效,請再仔細描述" + is_invalid: "似乎不清楚,這是個完整的句子嗎?" less_than: 必須少於 %{count} less_than_or_equal_to: 必須少於或等於 %{count} not_a_number: 不是數字 @@ -72,21 +99,32 @@ zh_TW: min_username_length_range: "你不能設定「最小」大於「最大」。" max_username_length_exists: "您不能設置比現有用戶名短的「最大用戶名長度」。" max_username_length_range: "你不能設定「最大」小於「最小」。" + default_categories_already_selected: "不能選擇一個已經用於另一個列表的分類。" + s3_upload_bucket_is_required: "你沒有填寫“s3_upload_bucket”,不能開啟上傳至 S3。" bulk_invite: - file_should_be_csv: "上傳的文件應為 csv 或 txt 格式。" + file_should_be_csv: "上傳檔必須是CSV的格式" + error: "上傳檔案有錯誤,請再試一次。" backup: operation_already_running: "%{operation} 操作正在運行。 目前無法執行新的 %{operation} 操作。" backup_file_should_be_tar_gz: "備份檔案應使用 .tar.gz 歸檔" not_enough_space_on_disk: "沒有足夠的磁碟空間可供備份檔案上傳" + invalid_filename: "備份檔案名包含無效字元。有效字元為 a-z 0-9 . - _." not_logged_in: "你需要先登入才能那樣做。" not_found: "所請求的URL或資源無法找到。" invalid_access: "你不允許查看所請求的資源。" read_only_mode_enabled: "這個網站目前在唯讀模式,無法進行互動功能。" + reading_time: "看時間" + likes: "讚" too_many_replies: other: "我們非常抱歉,新用戶被臨時限制在同一個主題上,只能回覆 %{count} 次" embed: start_discussion: "開始討論" continue: "繼續討論" + error: "錯誤嵌入" + referer: "引薦" + mismatch: "引薦來源與下列任何主機不符" + no_hosts: "未設置嵌入的主機" + configure: "配置嵌入" more_replies: other: "%{count} 個更多回覆" loading: "討論串載入中⋯" @@ -95,12 +133,28 @@ zh_TW: in_reply_to: "▶ %{username}" replies: other: "%{count} 個回覆" + no_mentions_allowed: "抱歉,你不能提及其他使用者" + too_many_mentions: + other: "抱歉,你只能提及帖子中%{count} 的使用者" + no_mentions_allowed_newuser: "抱歉,新使用者不能提及其他使用者" + too_many_mentions_newuser: + other: "抱歉,新使用者只能提及帖子中%{count}的使用者。" + no_images_allowed: "抱歉,新使用者不能在帖子中發布圖片" + too_many_images: + other: "抱歉,新者用者只能在帖子裡放%{count}張圖片" + no_attachments_allowed: "抱歉,新使用者不能在帖子中發布附件" + too_many_attachments: + other: "抱歉,新使用者只能在帖子裡發布%{count} 個附件" + no_links_allowed: "抱歉,新使用者不能在帖子裡放置連結" + too_many_links: + other: "抱歉,新使用者只能在帖子裡放置%{count}個連結" spamming_host: "抱歉,你不能張貼該網站之連結。" user_is_suspended: "被停權的用戶無法張貼文章。" topic_not_found: "出現問題。也許這個話題被關閉或刪除。" + not_accepting_pms: "對不起,%{username} 目前不接收訊息。" just_posted_that: "與你最近發表的內容太相似" invalid_characters: "包含無效字詞" - is_invalid: "無效,請再仔細描述" + is_invalid: "似乎不清楚,這是個完整的句子嗎?" next_page: "下一頁 →" prev_page: "← 上一頁" page_num: "%{num} 頁" @@ -116,13 +170,27 @@ zh_TW: rss_description: latest: "最新討論話題" hot: "熱門討論話題" + top: "熱門話題" posts: " 最近文章" + private_posts: "最近的私人訊息" + group_posts: "%{group_name}發布的最新帖子" + group_mentions: "%{group_name}最近提及的事物" + user_posts: "@%{username}發布的最新公告" + user_topics: "@%{username}發布的最新主題" + tag: "主題標籤" too_late_to_edit: "這文章建立很久了,它已經無法被編輯或刪除" + revert_version_same: "你試圖回復的版本和當前版本相同。" excerpt_image: "圖片" + queue: + delete_reason: "通過帖子審核隊列刪除" groups: errors: + can_not_modify_automatic: "你不能修改自動組" member_already_exist: "'%{username}' 已經是群組成員了。" invalid_domain: "'%{domain}' 不是有效的域名." + invalid_incoming_email: "'%{email}'不是有效的電子郵件位址" + email_already_used_in_group: "'%{email}' 已經被組織'%{group_name}'使用" + email_already_used_in_category: "'%{email}'已經被分類 '%{category_name}'使用" default_names: everyone: "所有人" admins: "管理員" @@ -136,6 +204,16 @@ zh_TW: education: until_posts: other: "%{count} 篇文章" + new-topic: | + 歡迎來到%{site_name} — **衷心感謝你參與討論!** + + - 標題是否清晰明了地描述了主題?看起來有意思麼? + + - 誰會感興趣?它為什麼重要?你期望從社區中獲得什麼樣的回應? + + - 選擇恰當的詞句以便別人能找到你的主題。若想要給主題分組,選擇一個分類。 + + 更多的幫助信息,[請查看我們的社群準則](/guidelines)。此信息面板只在你發佈前 %{education_posts_text}時顯示。 new-reply: | 歡迎來到%{site_name} — **感謝你的貢獻!** @@ -145,11 +223,48 @@ zh_TW: - 歡迎有建設性的評論,但是評論的應該是觀點,而不是人身攻擊。 - 欲查看更多,[請查看我們的社群准則](/guidelines)。此訊息面板只會在你發表前 %{education_posts_text} 時顯示。 + 欲查看更多,[請查看我們的社群守則](/guidelines)。此訊息面板只會在你發表前 %{education_posts_text} 時顯示。 + avatar: | + ### 給你的賬戶設置頭像如何? + + 你已經發表了一些主題和回覆,但是你的個人頭像並不像你一樣獨特——只是一些字母而已。 + + 你考慮過**[訪問你的用戶頁面](%{profile_path})**,再上傳一個代表你的圖片? + + 當所有人都有獨特的頭像時,這會讓專注討論和找到有趣的人更加輕鬆。 + sequential_replies: | + ### 考慮一次性回覆多個帖子 + + 與其接連回覆主題幾次,不如在一個回覆中引用相關內容或者@用戶名引用前面的帖子。 + + 你可以編輯你之前的回覆以添加引用。添加引用需要選擇文字並且點擊出現的引用回覆按鈕。 + + 當主題中的帖子的內容不是多個小且獨立的回覆,而是更少的更有深度的帖子時,我們會更認真地閲讀這個主題。 + dominating_topic: | + ### 讓其他人加入討論 + + 很明顯這個主題對你很重要 – 你已經發表的帖子占該主題 %{percent}% 的回覆。 + + 你有讓其他人自由地表達他們的觀點了嗎? + too_many_replies: | + ### 你發表的回覆數量已經達到該主題的回覆上限。 + + 非常抱歉,但新用戶被臨時限制,只能在同一主題中回覆 %{newuser_max_replies_per_topic} 次。 + + 想要添加另一個回覆不如考慮編輯原先的回覆或訪問其他主題。 + reviving_old_topic: | + ### 復活這個主題? + + 這個主題的最後一個回覆距今已有 %{days} 天了。你的回覆將讓主題重新出現在列表的頂端並通知原先參與討論的人。 + + 你確定要繼續這個老的話題嗎? activerecord: attributes: category: name: "分類名稱" + topic: + title: '標題' + featured_link: '有特色的連結' post: raw: "內容" user_profile: @@ -163,41 +278,98 @@ zh_TW: too_many_users: "你只能同時傳送警告給一位用戶。" cant_send_pm: "抱歉,你不能向該用戶發送私人訊息。" no_user_selected: "你必須選擇有效用戶。" + featured_link: + invalid: "不合法。URL 應包括 http:// 或 https://。" + invalid_category: "在這個分類中無法編輯" user: attributes: password: common: "這個密碼是 10000 個最常用密碼之一,請使用一個更安全的密碼" same_as_username: "與你的使用者名稱相同。請使用其他更安全的密碼。" same_as_email: "與你的電郵相同。請使用其他更安全的密碼。" + same_as_current: "與你當前的密碼相同" ip_address: signup_not_allowed: "不能使用這個帳戶進行登入" color_scheme_color: attributes: hex: invalid: "不是一個有效顏色" + post_reply: + base: + different_topic: "帖子和回復必須都是回在相同的主題" + web_hook: + attributes: + payload_url: + invalid: "URL 不合法。URL 應包括 http:// 或 https://。並且其中沒有空格。" <<: *errors user_profile: no_info_me: "你的帖子被社群成員標記了。請查看你的消息。
' user_must_edit: '你的帖子已經被社群標記並被臨時隱藏。
' archetypes: regular: @@ -342,6 +554,36 @@ zh_TW: message: make: "本主題現在是橫幅主題。它將出現在每頁的頂部,除非用戶將其隱藏。" remove: "本主題已經不再是橫幅主題。它將不在每個頁面的頂部顯示。" + unsubscribed: + title: "退訂!" + description: "你已經退訂。要更改你的郵件設置,訪問你的用戶設置頁面。" + topic_description: "點擊連結 %{link} 重新訂閲,或是使用主題底部或右側的通知控制。" + unsubscribe: + title: "退訂" + stop_watching_topic: "停止觀看這個主題, %{link}" + mute_topic: "關閉此主題的所有通知,%{link}" + unwatch_category: "停止監看%{category}分類中的所有主題" + mailing_list_mode: "停用郵件列表模式" + disable_digest_emails: "不要給我發送摘要郵件" + all: "不要從%{sitename}給我發送任何郵件" + different_user_description: "你登錄的帳戶與郵件不符。請登出,或進入隱私模式,然後再重試。" + not_found_description: "對不起,我們找不到這個退訂連結。有可能你的郵件中的連結已經過期?" + log_out: "退出" + user_api_key: + title: "授權應用訪問" + authorize: "授權" + read: "閲讀" + read_write: "讀/寫" + description: "“%{application_name}”正在請求訪問你的賬戶中的以下權限:" + no_trust_level: "抱歉,你沒有使用用戶 API 所需要的信任等級" + generic_error: "抱歉,我們不能分發用戶 API 密鑰,該特性已經被站點管理員禁用" + scopes: + message_bus: "實時更新" + notifications: "讀取並清除通知" + push: "推送通知到外部服務" + session_info: "讀取用戶會話信息" + read: "讀取所有" + write: "寫入所有" reports: visits: title: "用戶瀏覽量" @@ -352,7 +594,9 @@ zh_TW: xaxis: "天" yaxis: "新用戶數量" profile_views: + title: "查看用戶資料" xaxis: "天" + yaxis: "已看的用戶資料數量" topics: title: "討論話題" xaxis: "天" @@ -423,19 +667,27 @@ zh_TW: page_view_anon_reqs: title: "匿名" xaxis: "天" + yaxis: "未登錄頁面訪問" page_view_logged_in_reqs: title: "已登入" xaxis: "天" + yaxis: "已登錄頁面訪問" page_view_crawler_reqs: title: "網絡爬蟲" xaxis: "天" + yaxis: "Web 爬蟲頁面訪問" page_view_total_reqs: title: "總數" xaxis: "天" + yaxis: "總瀏覽量" page_view_logged_in_mobile_reqs: + title: "已登錄頁面訪問" xaxis: "天" + yaxis: "移動端已登錄頁面訪問" page_view_anon_mobile_reqs: + title: "未登錄頁面訪問" xaxis: "天" + yaxis: "移動端未登錄頁面訪問" http_background_reqs: title: "後台" xaxis: "天" @@ -461,16 +713,23 @@ zh_TW: xaxis: "天" yaxis: "請求總數" time_to_first_response: + title: "第一個回覆時間" xaxis: "天" + yaxis: "平均時間(小時)" topics_with_no_response: + title: "沒有回覆的帖子" xaxis: "天" + yaxis: "總量" mobile_visits: + title: "用戶訪問" xaxis: "天" + yaxis: "訪問次數" dashboard: rails_env_warning: "伺服器現在運行 %{env} 模式。" host_names_warning: "伺服器上 config/database.yml 的主機名稱為 localhost 。請更改成你的網站主機名稱。" gc_warning: '伺服器正在使用的 ruby 可能僅啟用了預設的 垃圾回收設定 (garbage collection), 這個設定無法提供最佳效能。請瀏覽此效能設定的資訊: Tuning Ruby and Rails for Discourse。' sidekiq_warning: 'Sidekiq 未有執行。很多程序, 如發送電子郵件, 需要 sidekiq 非同步 (asynchronous) 執行的。請確保至少運行一個 sidekiq 程序。瞭解 Sidekiq。' + queue_size_warning: '隊列中有較多任務,為 %{queue_size} 個。這可能是因為 Sidekiq 進程的問題導致,或者需要更多的 Sidekiq 進程。' memory_warning: '伺服器記憶體少於 1GB,建議配置至少 1GB 記憶體' google_oauth2_config_warning: '伺服器設定為允許使用 Google Oauth2 註冊以及登入 (enable_google_oauth2_logins),但未設定客戶端 id 和客戶端 secret 值。請至網站設定裡更改設定。參閱教學指南。' facebook_config_warning: '伺服器允許使用 Facebook 帳號登入 (enable_facebook_logins), 但未有設定 app id 及 app secret values 。 請在 網站設定 裡更改設定。 設定教學指南。' @@ -479,26 +738,35 @@ zh_TW: s3_config_warning: '伺服器被設定為上傳文件到 s3,但是至少有一個值未被設定: s3_access_key_id, s3_secret_access_key 或 s3_upload_bucket。到設定更新此設定。參考如何設置圖片上傳至 S3。' s3_backup_config_warning: '伺服器被設置為上傳備份到 s3,但是至少有一個值未被設定: s3_access_key_id, s3_secret_access_key 或 s3_upload_bucket。到設定更新此設定。參考如何設置圖片上傳至 S3。' image_magick_warning: '伺服器被設置為給大圖片創建縮略圖,但是 ImageMagick 沒有被安裝。使用你喜愛的包裝管理器安裝 ImageMagick 或下載最新版。' - default_logo_warning: "設置你網站的圖形logo。請在設定中配置logo_url、logo_small_url和favicon_url。" - contact_email_missing: "輸入一個網站聯絡人的電郵地址,這樣在用戶在網站出現緊急狀況時能夠找到你。在設定中更新它。" - contact_email_invalid: "網站聯絡電郵不正確。在設定中修改。" - title_nag: "為網站給予一個名字。在設定中更新標題。" - site_description_missing: "輸入一句話作為網站的簡介,將出現在搜索結果中。在設定中更新 site_description。" - consumer_email_warning: "您的網站正以Gmail或其他服務供應商郵件服務發送郵件。Gmail限制每日郵件發送數量. 請考慮使用其他電郵服務商來保證郵件能成功發送,例如 mandrill.com。" - notification_email_warning: "通知郵件不是從你域名的一個有效地址發出的;電郵發送將會變得危險和不可靠。請在設定中將 notification_email 設定一個有效的本機電郵地址。" + failing_emails_warning: '有 %{num_failed_jobs} 個郵件任務失敗。請檢查 app.yml 檔案是否正確配置了郵件伺服器。查看 Sidekiq 中失敗的任務。' + subfolder_ends_in_slash: "你的子目錄設置不正確;DISCOURSE_RELATIVE_URL_ROOT以斜杠結尾。" + email_polling_errored_recently: + other: "郵件輪詢在過去的 24 小時內出現了 %{count} 個錯誤。看一看日誌尋找詳情。" + missing_mailgun_api_key: "伺服器設置使用 Mailgun 發送郵件,但並未設置驗證 webhook 消息的 API 密鑰。" + bad_favicon_url: "網站表徵圖無法載入。檢查站點設置中的 favicon_url。" + poll_pop3_timeout: "至 POP3 伺服器的連接超時。無法獲取進站郵件。請檢查POP3 設置和服務商。" + poll_pop3_auth_error: "至 POP3 伺服器的連接驗證失敗。請檢查POP3 設置。" site_settings: censored_words: "將被自動替換為 ■■■■" + censored_pattern: "正則表達式將自動被替換為■■■■" delete_old_hidden_posts: "自動刪除被隱藏超過 30 天的帖子。" default_locale: "Discourse 執行個體 (instance) 的預設語言編碼 (ISO 639-1)" allow_user_locale: "允許用戶選擇自己的語言介面" + set_locale_from_accept_language_header: "為未登錄用戶按照他們的瀏覽器發送的請求頭部設置界面語言。(實驗性,無法和匿名緩存共同使用)" min_post_length: "文章允許的最小文字數" min_first_post_length: "第一篇文章允許的最少文字數" min_private_message_post_length: "文章允許的最小文字數" max_post_length: "文章允許的最大文字數" + topic_featured_link_enabled: "允許發連結帖。" + show_topic_featured_link_in_digest: "在摘要郵件中顯示主題特色連結。" min_topic_title_length: "標題允許的最小文字數" max_topic_title_length: "標題允許的最大文字數" min_private_message_title_length: "標題允許的最小文字數" min_search_term_length: "搜尋條件允許的最小文字數" + search_tokenize_chinese_japanese_korean: "在非中/日/韓語站點強制切割中/日/韓語搜索分詞" + search_prefer_recent_posts: "如果搜索大型論壇較慢,這個選項將優先嘗試最新的帖子" + search_recent_posts_size: "索引多少最新的主題" + allow_uncategorized_topics: "允許發表沒有分類的帖子。警告:如果又任何未分類的帖子,你必須給他們重新分類後才能關閉該選項。" allow_duplicate_topic_titles: "允許話題有相同,重複的標題" unique_posts_mins: "使用者再次發表包含相同內容文章的間隔時間" educate_until_posts: "當用戶開始鍵入他們的前幾個 (n) 新帖子時,在編輯器上顯示教育面板視窗。" @@ -510,7 +778,9 @@ zh_TW: crawl_images: "允許從第三方 URL 取得圖片,來加入寬和高的數值" download_remote_images_to_local: "下載外部鏈接的圖片到本機;以防圖片損壞。" download_remote_images_threshold: "可用來下載外部圖片到本機最少的空間(百分比)" + download_remote_images_max_days_old: "不下載超過 n 天的帖子中的遠程圖片。" disabled_image_download_domains: "在此列表的網域名稱的遠端圖片將不會進行下載,用 | 分割多個域名" + editing_grace_period: "在 (n) 秒之內,對帖子的編輯不生成帖子歷史。" post_edit_time_limit: "作者可以在發表文章後的 ( n ) 分鐘內編輯或刪除他們的文章,設 0 為永遠" edit_history_visible_to_public: "允許任何人查看編輯過的帖子的舊版本。當禁用時,只有職員才能查看。" delete_removed_posts_after: "帖子被作者刪除,將在 (n) 小時後被自動刪除。如果設置為 0,帖子將被立即刪除。" @@ -519,40 +789,73 @@ zh_TW: category_featured_topics: "在分類 /categories 頁面每個分類顯示的討論話題數目。此數值的改變最多需要 15 分鐘才會反應在分類頁面上。" show_subcategory_list: "進入分類時顯示子分類列表,而非話題列表" fixed_category_positions: "若勾選,你將能調整並固定分類的順序。若不勾選,分類將會依照活躍程度來排序。" + fixed_category_positions_on_create: "如果選擇了,目錄排序將會在話題創建對話框中被包含(要求固定目錄位置選項)" add_rel_nofollow_to_user_content: "添加 rel nofollow 屬性到所有的用戶內容,除了內部鏈接(包括父域名)。如果你更改了這個,你必須重新調制所有帖子,而該命令為:“rake posts:rebake”" + exclude_rel_nofollow_domains: "不添加 nofollow 連結的域名列表。填寫 tld.com 將自動包括 sub.tld.com。最少你應該填寫頂級域名來讓爬蟲獲得所有內容。如果你的網站包含其他域名,增加他們。" post_excerpt_maxlength: "文章摘要的最大文字長度" + show_pinned_excerpt_mobile: "移動版顯示置頂主題剪輯。" + show_pinned_excerpt_desktop: "移動版顯示置頂主題剪輯。" post_onebox_maxlength: "Onebox 處理後的 Discourse 帖子的最大字符長度" - onebox_domains_whitelist: "對這些站點啟用 Onebox 的域名列表;這些域名應該支持 OpenGraph 或 oEmbed。在此測試它們:http://iframely.com/debug" + onebox_domains_blacklist: "不會被 Onebox 的域名列表。" + max_oneboxes_per_post: "帖子中最多的 Onebox 數量。" + logo_url: "在你站點左上角出現的小號標誌圖片,應為一個長方形。如果留空,將顯示站點標題文字。" + digest_logo_url: "郵件摘要中使用的標誌圖像。應為長方形。不能使用 SVG 圖片。如果留空,將使用 `logo_url`。" + logo_small_url: "在你站點左上角的小號標誌圖片,應為正方形,當滾動時才可見。如果留空,將顯示主頁表徵圖。" + favicon_url: "你的站點表徵圖(favicon),參考 http://zh.wikipedia.org/wiki/Favicon,如果要正確地通過 CDN 分發,它必須是 png 圖片" + mobile_logo_url: "移動站點左上角的固定標誌圖片。應為正方形。如果留空,`logo_url` 將被使用。如:http://example.com/uploads/default/logo.png" apple_touch_icon_url: "Apple 觸碰設備使用的圖示,建議 144 X 144px 大小" notification_email: "這個表格:被用於發送所有重要系統郵件的郵箱地址。指定的域名必須正確設置 SPF、DKIM 和反向 PTR 記錄以發送郵件。" email_custom_headers: "自定義的電子郵件標題的管道分隔列表" email_subject: "標準郵件的自定義主題格式。參見 https://meta.discourse.org/t/customize-subject-format-for-standard-emails/20801" + force_https: "強制使用 https。警告:開啟前必須確認 HTTPS 已經配置並能夠正常使用!你檢查了 CDN、第三方登錄和站外的 logo / 依賴是否支持 HTTPS 了嗎?" summary_score_threshold: "將一個帖子包含在“概括主題”中所需的最少分數" summary_posts_required: "如果使用了\"此話題的摘用\",話題顯示時需滿足最小的文章的數量" summary_likes_required: "如果使用了\"此話題的摘用\",話題顯示時需滿足最小得到\"讚\"的數量" summary_percent_filter: "當用戶點擊 \"此話題的摘要\",顯示前面多少 % 的文章" summary_max_results: "“概括主題”返回的最大帖子數量" + enable_private_messages: "允許信任等級1(可以另外選擇發送消息的信任等級)的用戶創建消息和回覆消息。注意:管理人員不受限制。" enable_long_polling: "啟用消息匯流排使通知功能可以使用長輪詢(long polling)" long_polling_base_url: "長輪詢的基本 URL(當用 CDN 分發動態內容,請設置此至原始拉取地址)例如:http://origin.site.com" long_polling_interval: "當沒有數據向客戶端發送時伺服器端應等待的時間(僅對已登錄用戶有效)" polling_interval: "當不再長輪詢時,已登錄的客戶端應該多久輪詢一次(單位 毫秒)" anon_polling_interval: "匿名使用者用戶端輪詢時間間隔(單位 毫秒)" background_polling_interval: "客戶端輪詢的間隔,以毫秒計(當視窗在後台時)" + flags_required_to_hide_post: "一個帖子累計多少個標記之後會被自動隱藏,並向帖子作者發送私信通知(0 為從不)" cooldown_minutes_after_hiding_posts: "如果一個文章因為標記而隱藏,用戶需要等待多少分鐘才能編輯該文章" + max_topics_in_first_day: "新用戶在24小時內在發表第一帖後允許創建的主題數" + max_replies_in_first_day: "新用戶在24小時內在發表第一帖後允許創建的回覆數" + tl2_additional_likes_per_day_multiplier: "增加信任等級2(成員)的贊限制,可提供一個乘數與原始值相乘" + tl3_additional_likes_per_day_multiplier: "增加信任等級3(常規)的每日贊限制,將此設置項與原始值相乘" + tl4_additional_likes_per_day_multiplier: "增加信任等級4(資深)的贊限制,可提供一個乘數與原始值相乘" + num_spam_flags_to_block_new_user: "如果新用戶的帖子被 num_users_to_block_new_user 個不同用戶標記,隱藏他們的所有帖子並不讓其繼續發表內容。0 為禁用。" + num_users_to_block_new_user: "如果新用戶的帖子被不同用戶 num_spam_flags_to_block_new_user 次標記為垃圾信息,隱藏他們的所有帖子並不讓其繼續發表內容。0 為禁用。" + num_tl3_flags_to_block_new_user: "如果新用戶的帖子被 num_tl3_users_to_block_new_user 個不同的信任等級3的用戶標記,隱藏他們的所有帖子並不讓其繼續發表內容。0 為禁用。" + num_tl3_users_to_block_new_user: "如果新用戶的帖子被不同的信任等級3的用戶標記 num_tl3_flags_to_block_new_user 次,隱藏他們的所有帖子並不讓其繼續發表內容。0 為禁用。" notify_mods_when_user_blocked: "若有用戶被自動封鎖,將發送訊息給所有板主。" flag_sockpuppets: "如果一個新用戶開始了一個主題,並且同時另一個新用戶以同一個 IP 在該主題回復,他們所有的帖子都將被自動標記為垃圾。" traditional_markdown_linebreaks: "在 Markdown 中使用傳統的換行符號,即用兩個行末空格來換行" + allow_html_tables: "允許在輸入 Markdown 文本時使用表格 HTML 標籤。標籤 TABLE、THEAD、TD、TR、TH 將被允許使用,即白名單這些標籤(需要重置所有包含表格的老帖子的 HTML)" post_undo_action_window_mins: "允許用戶在帖子上進行撤銷操作(讚、標記等)所需等待的時間分隔(分鐘)" + must_approve_users: "新用戶在被允許訪問站點前需要由管理人員批准。警告:在運行的站點中啟用將解除所有非管理人員用戶的訪問權限!" + pending_users_reminder_delay: "如果新用戶等待批准時間超過此小時設置則通知版主。設置 -1 關閉通知。" + maximum_session_age: "用戶自訪問後可維持登錄 n 小時" + ga_tracking_code: "廢棄:Google 分析追蹤代碼(ga.js),例如:UA-12345678-9。參考 http://google.com/analytics" + ga_domain_name: "廢棄:Google 分析域名(ga.js),例如:mysite.com;參考 http://google.com/analytics" ga_universal_tracking_code: "Google 通用 Analytics (分析) 追蹤代碼(analytics.js)追蹤代碼,例如:UA-12345678-9;參考 http://google.com/analytics" ga_universal_domain_name: "Google 通用 Analytics (分析) 域名(analytics.js)追踪代码,例如:mysite.com;参考 http://google.com/analytics" + gtm_container_id: "Google Tag Manager 容器 id。例如:GTM-ABCDEF" + enable_escaped_fragments: "如未偵測到爬蟲回退到使用 Google Ajax-Crawling API。參見 https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" enable_noscript_support: "開啟noscript來對網路爬蟲來做標準的支援" allow_moderators_to_create_categories: "允許板主建立新分類" cors_origins: "允許跨來源資源共享(CORS)。每個來源必須包括 http:// 或 https://。DISCOURSE_ENABLE_CORS 環境選項必須設置為 true 才能啟用 CORS 。" + use_admin_ip_whitelist: "當目前的IP剛好處于IP段禁止名單(Admin > Logs > Screened Ips)中的時候,只有管理員才可登入。" top_menu: "選擇在主頁導航列包含哪些項目,以及排列次序。例如:latest|new|unread|categories|top|read|posted|bookmarks" post_menu: "確定在文章功能表條包含哪些條目,以及排列順序。例如:like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "帖子菜單中默認隱藏的按鈕,點擊省略號後顯示。" share_links: "決定在分享對話方塊裡顯示哪些項目、以什麼順序顯示。" track_external_right_clicks: "追蹤外部連結的右鍵點擊 ( 例如:開啟於瀏覽器的新頁面 ),預設是關閉的,因為它會重寫URLs" + site_contact_username: "論壇給用戶自動發送消息時使用的用戶名;如果留空將使用預設的系統賬戶。" + send_welcome_message: "給所有用戶發送快速開始指導的消息" suppress_reply_directly_below: "當帖子只有一個回覆時,不顯示帖子的回覆數量。" suppress_reply_directly_above: "當帖子只有一個回覆時,不顯示回覆到該帖的回覆。" suppress_reply_when_quoting: "當帖子引用回覆時,不顯示可展開的回覆到某帖的標記。" @@ -560,11 +863,16 @@ zh_TW: topics_per_period_in_top_summary: "預設推薦話題的顯示數量" topics_per_period_in_top_page: "在展開 \"顯示更多\" 推薦話題列表的顯示數量" redirect_users_to_top_page: "將新用戶或長時間未使用的用戶自動重新導向至熱門頁面" + top_page_default_timeframe: "頂部查看頁面的預設時間表" show_email_on_profile: "在用戶頁面顯示用戶的電郵地址(只有用戶自己和職員可見)" + prioritize_username_in_ux: "在用戶頁、用戶卡片和帖子上優先顯示用戶名(未選時,暱稱將先顯示)" email_token_valid_hours: "\"忘記密碼\" / \"重啟帳號\" token 有效的小時數 (n)" - email_token_grace_period_hours: "\"忘記密碼\" / \"重啟帳號\" 的 token 在使用後仍舊有效的小時數 (n)" enable_badges: "啟用勳章系統" + enable_whispers: "允許工作人員在主題中私密交流。" allow_index_in_robots_txt: "在 robots.txt 中記錄這個網站允許被搜尋引擎索引的部分" + email_domains_blacklist: "用管道符“|”分隔的郵箱域名黑名單列表,其中的域名將不能用來註冊賬戶,例如:mailinator.com|trashmail.net" + email_domains_whitelist: "用管道符“|”分隔的電子郵箱域名的列表,用戶必須使用這些郵箱域名註冊。警告:用戶使用不包含在這個列表裡的郵箱域名,將無法成功註冊。" + forgot_password_strict: "用戶找回密碼時不提示帳戶是否存在。" log_out_strict: "登出時,登出用戶所有設備上的所有時段" version_checks: "訪問 Discourse Hub 來檢查版本更新,並在管理面板 /admin 顯示新版本訊息" new_version_emails: "當新版本發佈時,將會發送一封新的 EMail 至 contact_email 設定的位址" @@ -576,13 +884,25 @@ zh_TW: login_required: "需要登入才能進入網站,不允許匿名操作" min_username_length: "最少用戶名長度" max_username_length: "最大用戶名長度" + reserved_usernames: "註冊時不可使用的用戶名。" min_password_length: "最小密碼長度" + min_admin_password_length: "管理員最短密碼長度" block_common_passwords: "不允許使用 10,000 個最常用的密碼" + enable_sso: "啟用通過外部站點單點登錄(警告:用戶的郵件地址必須被外部站點驗證!)" + verbose_sso_logging: "將 SSO 日誌詳情記錄至 /logs" enable_sso_provider: "在 /session/sso_provider endpoint 必須設定 sso_secret 以實現 Discourse SSO 提供方協定" + sso_url: "單點登錄 URL 入口點(必須包含 http:// 或 https://)" sso_secret: "秘密字符串,用於驗證秘密的 SSO 訊息,請確保由 10 個字或以上組成" + sso_overrides_bio: "在用戶頁面中覆蓋用戶的個人信息並禁止用戶修改" + sso_overrides_email: "每一次登錄時,用 SSO 信息中的外部站點的郵件地址覆蓋本地郵件地址,並且阻止本地的郵件地址修改。(警告:因格本地郵件的正規化,郵件地址可能會有所差異)" + sso_overrides_username: "每一次登錄時,用 SSO 信息中的外部站點的用戶名覆蓋本地用戶名,並且阻止本地的用戶名修改。(警告:因格本地用戶名的長度和其他要求,用戶名可能會有所差異)" + sso_overrides_name: "每一次登錄時,用 SSO 信息中的外部站點的全名覆蓋本地全名,並且阻止本地的全名修改。" sso_overrides_avatar: "用 SSO 訊息中的外部網站頭像覆蓋用戶頭像。如果啟用,建議禁用 allow_uploaded_avatars" + sso_not_approved_url: "重定向未受許可的單點登錄賬號至這個 URL" + sso_allows_all_return_paths: "不限制 SSO 提供的 return_paths 中的域名(預設情況下返回地址必須位於當前站點)" enable_local_logins: "啟用網站用戶名稱和密碼驗證 ( 注意:這必須啟用邀請才能有動作 )" allow_new_registrations: "允許新用戶註冊,如果取消選取,則沒有人能夠註冊" + enable_signup_cta: "顯示推薦創建賬戶的提示給那些回訪的未註冊用戶。" enable_yahoo_logins: "啟用雅虎(Yahoo)帳號驗證登入" enable_google_oauth2_logins: "啟用 Google Oauth2 認證。這是目前 Google 支援的認證方式,需要 key 以及 secret。" google_oauth2_client_id: "你的 Google 應用程式的客戶端 ID" @@ -590,19 +910,33 @@ zh_TW: enable_twitter_logins: "啟用推特(Twitter)帳號驗證登入,需要 twitter_consumer_key 和 twitter_consumer_secret" twitter_consumer_key: "推特帳號驗證的客戶密匙(Consumer key),到 http://dev.twitter.com 來註冊獲取" twitter_consumer_secret: "推特帳號驗證的客戶密碼(Consumer secret),到 http://dev.twitter.com 來註冊獲取" + enable_instagram_logins: "啟用 Instagram 驗證,需要 instagram_consumer_key 和 instagram_consumer_secret" + instagram_consumer_key: "Instagram 驗證的 Consumer key" + instagram_consumer_secret: "Instagram 驗證的 Consumer secret" enable_facebook_logins: "啟用臉書(Facebook)帳號驗證登入,需要 facebook_app_id 和 facebook_app_secret" facebook_app_id: "臉書帳號驗證的應用帳號(App id),到 https://developers.facebook.com/apps 來註冊獲取" facebook_app_secret: "臉書帳號驗證的應用密碼(App secret),到 https://developers.facebook.com/apps 來註冊獲取" + facebook_request_extra_profile_details: "從 Facebook 中請求關於我、地點和網站。(需要 Facebook 許可你的登錄應用)" enable_github_logins: "啟用 Github 帳號驗證登入,需要 github_client_id 和 github_client_secret" github_client_id: "Github 帳號驗證的用戶端帳號(Client id),到 https://github.com/settings/applications 來註冊獲取" github_client_secret: "Github 帳號驗證的用戶端密碼(Client secret),到 https://github.com/settings/applications 來註冊獲取" + readonly_mode_during_backup: "備份時啟用只讀模式" allow_restore: "允許還原資料,注意此動作可能覆蓋「所有」網站資料!除非你計畫還原備份檔,否則請保持此設定為 false" maximum_backups: "磁碟備份的最大數量,舊的將會自動刪除" + automatic_backups_enabled: "按照定義的備份頻率運行自動備份計劃" + backup_frequency: "自動創建站點備份的頻率,以天為單位。" enable_s3_backups: "當完成備份後上傳備份到 S3。重要:需要在文件設定中填寫有效的 S3 驗證資料。" s3_backup_bucket: "遠端備份 bucket ,注意:請確定是私有的 bucket" + s3_disable_cleanup: "當在本地刪除備份時不刪除 S3 上的備份。" + backup_time_of_day: "備份的 UTC 時間" + backup_with_uploads: "在備份日程中包括上傳。關閉此項僅備份資料庫。" active_user_rate_limit_secs: "更新“最後一次見到”資料的頻率,單位為秒" verbose_localization: "在界面上顯示詳細的本地化提示" previous_visit_timeout_hours: "系統判斷一次瀏覽之後多少小時後為“上一次”瀏覽" + top_topics_formula_log_views_multiplier: "熱門主題公式中訪問次數因子的值(n):`log(views_count) * (n) + op_likes_count * 0.5 + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_first_post_likes_multiplier: "熱門主題公式中首貼讚的數量的因子的值(n):`log(views_count) * 2 + op_likes_count * (n) + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_least_likes_per_post_multiplier: "熱門主題公式中贊和帖子數量的比例的最小值(n):`log(views_count) * (n) + op_likes_count * 0.5 + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + rebake_old_posts_count: "每 15 分鐘重制老帖子的數量。" rate_limit_create_topic: "建立新討論話題之後,用戶必須間隔多少秒 (n) 才能再建立新討論話題" rate_limit_create_post: "建立新文章之後,用戶必須間隔多少秒 (n) 才能再建立新文章" rate_limit_new_user_create_topic: "建立一個話題後,新用戶必須等待 (n) 秒才能建立另一個新話題" @@ -614,8 +948,13 @@ zh_TW: max_topics_per_day: "每個用戶每天最多建立\"討論話題\"的數量" max_private_messages_per_day: "用戶每天能建立訊息的數量上限" max_invites_per_day: "每個用戶每天最多能邀請用戶的數量。" + max_topic_invitations_per_day: "每個用戶每天能創建的邀請至主題數量的最大值。" + alert_admins_if_errors_per_minute: "激活管理員警告的每分鐘錯誤的數量。0 會禁用這個特性。注意:需要重啟。" + alert_admins_if_errors_per_hour: "激活管理員警告的每小時錯誤的數量。0 會禁用這個特性。注意:需要重啟。" + categories_topics: "/categories 頁面中顯示的主題數。" suggested_topics: "討論話題下的推薦話題數量" limit_suggested_to_category: "目前的話題下只顯示同分類的推薦話題" + suggested_topics_max_days_old: "推薦主題創建時間不能大於 n 天。" clean_up_uploads: "移除孤立的已上傳檔案。警告:你可能想要在啟用這個設定前備份 /uploads 文件夾。" clean_orphan_uploads_grace_period_hours: "刪除孤立的上傳檔案的寬限期(單位:小時)" purge_deleted_uploads_grace_period_days: "徹底刪除孤立的上傳檔案的寬限期(單位:天)" @@ -626,8 +965,18 @@ zh_TW: s3_access_key_id: "上傳至 Amazon S3 的 access key id,將用於上傳圖片" s3_secret_access_key: "上傳至 Amazon S3 的 secret access key,將用於上傳圖片" s3_region: "上傳至 Amazon S3 的 region name,將用於上傳圖片" + s3_cdn_url: "用戶 S3 資料的 CDN URL(例如:https://cdn.somewhere.com)。警告:在改變該設置後你必須重制所有老帖子。" + avatar_sizes: "自動生成的頭像大小列表。" + external_system_avatars_enabled: "使用外部系統頭像服務。" + external_system_avatars_url: "外部系統頭像服務的 URL 地址。可選參數是 {username} {first_letter} {color} {size}" + default_opengraph_image_url: "opengraph圖像的預設URL。" + twitter_summary_large_image_url: "預設 Twitter summary 卡片的 URL(需要至少寬 280px 和高 150px)。" + allow_all_attachments_for_group_messages: "允許群組消息中包含任何郵件附件。" + convert_pasted_images_to_hq_jpg: "將粘貼圖片轉為高質量 JPG 檔案。" + convert_pasted_images_quality: "轉換過的 JPG 檔案質量(1 是最低,100 最高質量)。" enable_flash_video_onebox: "在 Onebox 啟用嵌入 swf 和 flv (Adobe Flash) 的鏈接。警告:可能增加安全風險。" default_invitee_trust_level: "預設的受邀用戶等級 (0-4)" + default_trust_level: "所有新用戶的預設信任等級(0-4)。警告!改變此項將提高廣告氾濫的風險。" tl1_requires_topics_entered: "新用戶升級到信任等級1所需要進入的主題數量。" tl1_requires_read_posts: "新用戶升級到信任等級1所需要閱讀的帖子數量。" tl1_requires_time_spent_mins: "新用戶升級到信任等級1所需要閱讀帖子消耗的時間(分鐘)。" @@ -638,27 +987,45 @@ zh_TW: tl2_requires_likes_received: "一個初級用戶升級到信任等級2所需要獲得的讚賞數。" tl2_requires_likes_given: "初級用戶升級到信任等級2所需要付出的讚賞數。" tl2_requires_topic_reply_count: "一個初級用戶升級到信任等級2所需要回覆的主題數量。" + tl3_time_period: "信任等級3考察期限(天數)" + tl3_requires_days_visited: "要升到信任等級3所需要的,在最近考察時間段內訪問的最低天數。將其設置為高於信任等級3的考察時間可禁用信任等級 3。(設置為 0 或比考察期更長)" + tl3_requires_topics_replied_to: "要升到信任等級3所需要的,在最近考察時間段內回覆的主題數量。(設置為 0 或更高)" + tl3_requires_topics_viewed: "要升到信任等級3所需要的,在最近考察時間段內所查看的新主題的百分比。將其設置為高於信任等級3的考察時間可禁用信任等級 3。(設置為 0 到 100)" + tl3_requires_topics_viewed_cap: "要升到信任等級3所需要的,在最近考察時間段內所需查看的主題數上限,與百分比計算後取最小。" + tl3_requires_posts_read: "要升到信任等級3所需要的,在最近考察時間段內所查看的新主題的百分比。將其設置為高於信任等級3的考察時間可禁用信任等級 3。(設置為 0 或比考察期更長)" + tl3_requires_posts_read_cap: "要升到信任等級3所需要的,在最近考察時間段內所需查看的帖子數上限,與百分比計算後取最小。" tl3_requires_topics_viewed_all_time: "用戶升至信任等級3所需查看的最少主題數量。" tl3_requires_posts_read_all_time: "用戶升至信任等級3所需查看的最少帖子數量。" + tl3_requires_max_flagged: "要升到信任等級3所需要的,在最近考察時間段內,用戶不得被 x 個不同用戶標記 x 篇帖子的 x 值。(設置為 0 或更高)" tl3_promotion_min_duration: "信任等級3的用戶可被降級至信任等級2前最少持續天數。" + tl3_requires_likes_given: "要升到信任等級3所需要的,在最近考察時間段內用戶必須要給出的贊(設置為 0 或更高)" + tl3_requires_likes_received: "要升到信任等級3所需要的,在最近考察時間段內用戶必須要收到的贊(設置為 0 或更高)" tl3_links_no_follow: "禁止從信任等級 3 之用戶所發表的連結中刪除 rel=nofollow 標籤" min_trust_to_create_topic: "建立話題最低所需的信任等級" min_trust_to_edit_wiki_post: "編輯被標示為維基的文章所需之最低信任等級。" + min_trust_to_edit_post: "能編輯帖子的最小信任等級。" + min_trust_to_allow_self_wiki: "用戶將自己的帖子設置為維基模式的最低信任等級。" + min_trust_to_send_messages: "發送消息所需的最低信任等級。" newuser_max_links: "新用戶可添加多少連結於一篇文章中" newuser_max_images: "新用戶可添加多少張圖片於一篇文章中" newuser_max_attachments: "新用戶可添加多少附件於一篇文章中" newuser_max_mentions_per_post: "新用戶可以在一個帖子裡使用@name提及的最大數量。" newuser_max_replies_per_topic: "直至有人回覆他們前,新用戶在一個帖子裡的最大回覆數量。" max_mentions_per_post: "你可以在一個帖子裡使用 @name 提及的最大數量。" + max_users_notified_per_group_mention: "當群組被提及時,接受提醒的最大用戶數 ( 超過閾值後將不發送提醒 )" create_thumbnails: "為太大而無法在帖子裡正常顯示的圖片創造縮略圖及 lightbox 圖片。" email_time_window_mins: "等待多少 (n) 分鐘才給用戶發送通知電子郵件,好讓他們有機會自己來編輯和完善他們的帖子。" + private_email_time_window_seconds: "等待多少(n)秒再給用戶發送通知電子郵件,這可以讓用戶有時間來編輯和完善他們的消息。" email_posts_context: "在通知電郵中包含的作為上下文的回覆數量。" flush_timings_secs: "刷新時間資料的頻率,以秒為單位" + title_max_word_length: "在主題的標題中,允許的詞語長度的最大字元數。" title_min_entropy: "在主題的標題中,允許的最低熵值(單字)。" body_min_entropy: "在一個帖子內文中,允許的最低熵值(單字)。" + allow_uppercase_posts: "允許標題和內容全大寫" title_fancy_entities: "轉換討論話題標題中的 HTML 實體" min_title_similar_length: "開始檢查相似主題的帖子標題的最少長度。" min_body_similar_length: "開始檢查相似主題的帖子內容的最小長度。" + desktop_category_page_style: "/categories 頁面的視覺樣式。" category_colors: "設定分類顏色的十六進制色彩值列表。" category_style: "分類圖標的視覺樣式。" max_image_size_kb: "允許用戶上傳的最大圖片大小(以kB為單位)。確保也在nginx(client_max_body_size),apache 或代理中進行限制文件大小的設定。" @@ -669,6 +1036,9 @@ zh_TW: topic_views_heat_low: "多少次瀏覽後,該視圖將稍稍高亮。" topic_views_heat_medium: "多少次瀏覽後,該視圖將明顯高亮。" topic_views_heat_high: "多少次瀏覽後,該視圖將強烈高亮。" + cold_age_days_low: "在討論開始多少天后,最後活躍日期將輕微暗淡。" + cold_age_days_medium: "在討論開始多少天后,最後活躍日期將明顯暗淡。" + cold_age_days_high: "在討論開始多少天后,最後活躍日期將顯著暗淡。" history_hours_low: "帖子在編輯後編輯指示器輕微高亮的小時數" history_hours_medium: "帖子在編輯後編輯指示器明顯高亮的小時數" history_hours_high: "帖子在編輯後編輯指示器強烈高亮的小時數" @@ -678,38 +1048,196 @@ zh_TW: faq_url: "如果你的 FAQ 文件存放在外部,那麼請在此填寫其完整的 URL 地址。" tos_url: "如果你想要使用一個部署在某個地方的服務條款文檔,那麼請在此填寫其完整URL地址。" privacy_policy_url: "如果你想要使用一個部署在某個地方的隱私政策文檔,那麼請在此填寫其完整URL地址。" + newuser_spam_host_threshold: "新用戶能添加至指向同一主機的連結的 newuser_spam_host_threshold 次數。超過閾值後將用戶視為垃圾投遞者。" 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: "當比對廣告Email時,數字與文字將仍使用模糊比對" max_new_accounts_per_registration_ip: "如果已經有了從這個 IP 創建的 (n) 個信任等級0的賬戶(並且沒有一個是職員或者是信任等級2以上的用戶),不再允許來自該 IP 地址的註冊請求。" min_ban_entries_for_roll_up: "當點擊折疊按鈕且不少於 (N) 條記錄時,將會創建一個子網禁止記錄。" max_age_unmatched_emails: "在 (N) 天後刪除不匹配的電郵地址。" max_age_unmatched_ips: "在 (N) 天後刪除不匹配的 IP 記錄。" + num_flaggers_to_close_topic: "要自動終止一個主題的討論並介入時所需的最小數量的獨立標記者" + num_flags_to_close_topic: "要自動終止一個主題的討論並介入時所需的最小數量的有效標記" auto_respond_to_flag_actions: "啟用自動回覆當加入一個標籤。" + min_first_post_typing_time: "用戶發表第一帖時打字的最小時間(以毫秒計),如果沒有達到該閾值,帖子將自動進入需要批准隊列。設置為 0 禁用(不推薦)" + auto_block_fast_typers_on_first_post: "自動封禁沒有達到首貼輸入時間 min_first_post_typing_time 要求的用戶" + auto_block_fast_typers_max_trust_level: "自動封禁輸入過于快速的用戶的最高信任等級" + auto_block_first_post_regex: "大小寫不相關的正則表達式,如果匹配成功,會導致該用戶不能發表第一帖,而是進入審核隊列。例如:求下載|謝謝樓[主豬],會阻止包含求下載、謝謝樓主或謝謝樓豬的帖子。該選項只適用於首貼。" reply_by_email_enabled: "啟用通過電郵回覆。" + reply_by_email_address: "通過郵件回覆的回覆地址模板,例如:%{reply_key}@reply.example.com 或 replies+%{reply_key}@example.com" + alternative_reply_by_email_addresses: "通過郵件回覆的回覆地址模板,例如:%{reply_key}@reply.example.com|replies+%{reply_key}@example.com" + incoming_email_prefer_html: "對進站郵件優先使用 HTML 而不是純文字檔案。可能導致格式問題。" + disable_emails: "禁止 Discourse 發送任何郵件" + strip_images_from_short_emails: "忽略郵件中小於 2800 位元組的圖片" + short_email_length: "短郵件地址長度(以比特作為單位)" + display_name_on_email_from: "在郵件的來自欄顯示暱稱" + unsubscribe_via_email: "允許用戶在發送的郵件“退訂”來退訂郵件訂閲,“退訂”可在主題或正文中。" + unsubscribe_via_email_footer: "在發出的郵件底部包含退訂連結" + delete_email_logs_after_days: "在(N)天后刪除郵件日誌。設置為 0 無限期保留" + max_emails_per_day_per_user: "每日發送給用戶的最大帖子數量。設置為 0 禁止限制" + enable_staged_users: "處理進站郵件時自動創建暫存用戶。" + maximum_staged_users_per_email: "處理進站郵件時可創建的最大暫存用戶量。" + auto_generated_whitelist: "不會被檢查是否是自動生成內容的郵件地址列表。例如:foo@bar.com|discourse@bar.com" + block_auto_generated_emails: "阻止被檢測為自動生成的進站郵件。" + ignore_by_title: "使用正則表達式根據標題忽略進站郵件。" + mailgun_api_key: "用以驗證 webhook 消息的 Mailgun 密鑰 API。" + soft_bounce_score: "當碰到臨時拒信時,增加用戶的累計退信分值。" + hard_bounce_score: "當碰到永久拒信時,增加用戶的累計退信分值。" + bounce_score_threshold: "停止發送郵件給用戶的累計退信分值。" + bounce_score_threshold_deactivate: "取消激活用戶的累計退信分值。" + reset_bounce_score_after_days: "自動在 X 天后重置累計退信分值。" + attachment_content_type_blacklist: "基于 content type 禁止附件的黑名單列表。" + attachment_filename_blacklist: "基于檔案名禁止附件的黑名單列表。" + enable_forwarded_emails: "[測試] 允許用戶通過抄送郵件發表主題。" + always_show_trimmed_content: "總是顯示進站郵件中被截斷的部分。警告:可能顯示某些郵件地址。" + manual_polling_enabled: "用 API 推送郵件回覆。" + pop3_polling_enabled: "輪詢 POP3 收取郵件回覆。" + pop3_polling_ssl: "連接至 POP3 伺服器時使用 SSL。(推薦)" + pop3_polling_openssl_verify: "驗證伺服器的 TLS 證書(預設:啟用)" + pop3_polling_period_mins: "查詢用於郵件的 POP3 賬戶的間隔(以分鐘計)。注意:需要重新啟動。" + pop3_polling_port: "POP3 輪詢賬戶連接埠。" + pop3_polling_host: "需用 POP3 向該地址輪詢電子郵件的主機。" + pop3_polling_username: "輪詢 POP3 賬戶所用的用戶名。" + pop3_polling_password: "輪詢 POP3 賬戶所用的密碼。" + log_mail_processing_failures: "記錄所有郵件失敗處理日誌至 http://yoursitename.com/logs" + email_in: "允許用戶通過郵件發表新主題(需要 pop3 輪詢)。在每一個分類的“設置”標籤頁配置地址。" email_in_min_trust: "能使用 EMail 發表新話題的最低的用戶信任等級" email_prefix: "EMail主題中使用的 [ 標籤 ],留空將預設使用 'title'" + email_site_title: "郵件發送人站點標題。如果沒有設置,預設為“title”。如果標題包含了任何不允許的字元,使用這個設置。" + minimum_topics_similar: "在編寫新主題時,需要有多少相似主題存在?" + relative_date_duration: "發表多少天內將顯示相對時間(7天)而非絶對時間(2月20日)。" delete_user_max_post_age: "不允許刪除首發表文章超過 (x) 天的用戶" + delete_all_posts_max: "通過刪除所有帖子按鈕可以刪除的最大帖子數量。如果用戶有比這更多的帖子,這些帖子不能一次性刪除並且這個用戶不能被刪除。" + username_change_period: "用戶在註冊多少天內可以更改他們的用戶名(0 表示禁用用戶名更改)" email_editable: "允許用戶在註冊後改變他們的 EMail" + logout_redirect: "登出後重定向至的地址。(如:http://somesite.com/logout)" + allow_uploaded_avatars: "允許用戶上傳自定義個人頭像。" + allow_animated_avatars: "允許用戶使用動畫個人頭像。警告:更改設置後運行 avatars:refresh 這個 rake 任務。" allow_animated_thumbnails: "為 gif 動畫生成動態縮略圖。" default_avatars: "新用戶將會使用的默認頭像的網址。" automatically_download_gravatars: "當用戶註冊或更改EMail時下載 Gravatars 圖片" + digest_topics: "郵件摘要中顯示的流行主題的最大數目。" + digest_posts: "郵件摘要中顯示的最流行帖子的數量。" + digest_other_topics: "郵件摘要中“你關注的主題和分類中的新內容”欄目顯示的主題數目上限。" + digest_min_excerpt_length: "郵件摘要中顯示的帖子摘要字元數下限。" + delete_digest_email_after_days: "不發送摘要郵件給超過(n)天沒訪問的用戶。" + digest_suppress_categories: "不在摘要郵件中顯示這些分類的內容。" + disable_digest_emails: "禁用所有用戶摘要郵件功能。" + email_accent_bg_color: "HTML 郵件中某些元素的背景使用的強調顏色。輸入色彩名(“red”)或十六進制值(“#FF0000”)。" + email_accent_fg_color: "HTML 郵件中背景使用的字型顏色。輸入色彩名(“white”)或十六進制值(“#FFFFFF”)。" + email_link_color: "HTML 郵件中的連結顏色。輸入色彩名字(“blue”)或十六進制值(“#0000FF”)。" + detect_custom_avatars: "檢測用戶是否上傳了自定義個人頭像。" max_daily_gravatar_crawls: "一天內 Discourse 將自動檢查 Gravatar 自訂個人圖示的次數" public_user_custom_fields: "用戶可設定公開顯示的自定欄位白名單。" staff_user_custom_fields: "用戶可設定只給管理員顯示的自定欄位白名單。" + enable_user_directory: "提供可供瀏覽的用戶目錄" + enable_group_directory: "提供可供瀏覽的群組目錄" + allow_anonymous_posting: "允許用戶切換至匿名模式" + anonymous_posting_min_trust_level: "啟用匿名發帖所需的最小信任等級" + anonymous_account_duration_minutes: "為了匿名性,為每個用戶每 N 分鐘創建一個匿名賬戶。例如:如果設置為 600,只要發帖後 600 分鐘到了,並且用戶切換至了匿名模式,就會創建一個新的匿名賬戶。" + hide_user_profiles_from_public: "不對來訪用戶顯示用戶信息卡、用戶資料和用戶目錄。" + user_website_domains_whitelist: "用戶網站要屬於這些域名中。用 | 分割。" allow_profile_backgrounds: "允許使用者上傳個人檔案背景圖片" + sequential_replies_threshold: "在被提醒回覆了太多連續的回覆前,用戶在主題中可以連續回覆的帖子的數量。" + enable_mobile_theme: "為移動設備啟用移動友好的主題,但也能切換回完整站點。如果你想要使用自定義的響應式主題請禁用它。" + dominating_topic_minimum_percent: "用戶在主題中的帖子占到多少百分比時使得用戶主導話題。" + disable_avatar_education_message: "禁用更改頭像操作的教育消息。" suppress_uncategorized_badge: "不在\"無分類\"的話題列表內顯示徽章。" + permalink_normalizations: "在匹配永久連結之前應用如下正則表達式,例如:/(topic.*)\\?.*/\\1 將去掉所有主題路徑的參數字元串。格式為使用正則表達式+使用 \\1 等字元串來訪問捕獲內容" + global_notice: "為所有訪客顯示“緊急的”全局橫幅,留空隱藏它(可以使用 HTML)" + disable_edit_notifications: "當 'download_remote_images_to_local' 啟用時禁用系統編輯提醒。" + automatically_unpin_topics: "當用戶到達底部時自動解除主題置頂。" + read_time_word_count: "一分鐘閲讀的詞的數量,用於估計閲讀時間。" + topic_page_title_includes_category: "主題頁面標題包含分類名。" + native_app_install_banner: "邀請常客安裝 Discourse 本機應用程序" + max_prints_per_hour_per_user: "/print 頁面的每小時最大展示量(設置為 0 禁用)" + full_name_required: "全名是用戶個人信息的必填項。" + enable_names: "在用戶的個人信息、用戶卡片和郵件中顯示全名。禁用將在所有地方隱藏全名。" + display_name_on_posts: "在用戶的帖子中顯示他們的全名以及他們的 @username。" + show_time_gap_days: "如果兩個帖子發表間隔多天,在主題中顯示時間間隔提示。" invites_per_page: "默認在用戶頁顯示的邀請。" + short_progress_text_threshold: "在主題中的帖子數超過這個設定後,進度條將只顯示當前的帖子數。如果你更改了進度條的寬度,你需要修改這個值。" + default_code_lang: "預設語法高亮語言,使用 GitHub 代碼塊(lang-auto、ruby、python或者其他等等。)" + warn_reviving_old_topic_age: "當有人開始回覆最後一貼超過一定天數前的主題時,將有一個警告顯示,不鼓勵他們復活一個老的討論。將其設置為 0 以禁用。" autohighlight_all_code: "即使未顯示特定語言,仍為所有預編排程式套用程式碼顏色提示" + highlighted_languages: "包含語法高亮規則。(警告:包含太多的語言可能影響性能)見:https://highlightjs.org/static/demo/ 查看演示" + feed_polling_enabled: "僅用於嵌入:是否將 RSS/ATOM 訂閲為帖子。" + feed_polling_url: "僅用於嵌入:RSS/ATOM 訂閲的 URL。" + embed_by_username: "創建嵌入主題的 Discourse 的用戶名。" + embed_username_key_from_feed: "從流中獲取 discourse 用戶名的 Key。" + embed_title_scrubber: "抓取嵌入主題的正則表達式。" embed_truncate: "截斷 embed 過的文章" + allowed_href_schemes: "除了 http 和 https 外允許的連結協議。" embed_post_limit: "文章內 embed 的最大數量" + embed_username_required: "創建主題需要用戶名。" embed_whitelist_selector: "在 embeds 頁面允許 CSS 元素選擇器" embed_blacklist_selector: "在 embeds 頁面移除 CSS 元件選擇器" - enable_cdn_js_debugging: "允許 /logs 適當的顯示 crossorigin permissions 所有 js 的錯誤" + notify_about_flags_after: "如果有標記沒有在設定小時後處理,發送一封郵件給 contact_email。設為 0 將禁用。" show_create_topics_notice: "如果網站的公開討論話題少於 5 個,顯示通知要求管理員建立一些討論話題。" + delete_drafts_older_than_n_days: 刪除超過 n 天得草稿。 + bootstrap_mode_min_users: "禁用摘要模式的用戶數下限(0 為禁用)。" + vacuum_db_days: "在資料庫遷移後使用完整掃瞄回收資料庫空間(設置 0 為禁用)" + prevent_anons_from_downloading_files: "禁止匿名用戶下載附件。警告:這將禁止他們訪問任何發表在帖子中的非圖片資源。" + slug_generation_method: "選擇一個連結生成方式。“encoded”將生成以百分號編碼的連結。“none”將禁用自定義連結,只生成預設連結。" enable_emoji: "啟用表情符號" emoji_set: "你會如何喜歡你的表情符號?" enforce_square_emoji: "強制為所有 emojis 設置的正方形比例。" + approve_post_count: "新用戶或基礎用戶需要被審核的帖子數量" + approve_unless_trust_level: "該信任等級之下的用戶的帖子必須被審核" + approve_new_topics_unless_trust_level: "低於該信任等級的用戶的新帖子需要被審核" + notify_about_queued_posts_after: "如果帖子在設定的小時數後仍在等候處理,發送一封郵件至 contact_email。設為 0 將禁用這些郵件。" + auto_close_messages_post_count: "消息中貼子數上限,達到後自動關閉消息(0 為禁用)" + auto_close_topics_post_count: "主題中貼子數上限,達到後自動關閉主題 ( 0 為禁用 )" + code_formatting_style: "編輯器中的代碼格式化按鈕設置的預設格式" + default_email_digest_frequency: "用戶收到摘要郵件的預設頻率。" + default_include_tl0_in_digests: "在摘要郵件中預設包含新用戶帖子。用戶可以自行在參數設置中更改這個設置。" + default_email_private_messages: "預設在有人發消息給用戶時發送一封郵件通知。" + default_email_direct: "預設在有人引用、回覆、提及或者邀請用戶時發送一封郵件通知。" + default_email_mailing_list_mode: "預設為每一個新帖子發送一封郵件通知。" + default_email_mailing_list_mode_frequency: "郵件列表模式下,用戶收到郵件的預設頻率。" + disable_mailing_list_mode: "禁止用戶使用郵件列表模式。" + default_email_always: "即使用戶活躍時,仍預設發送郵件通知。" + default_email_previous_replies: "預設在郵件中包含之前的回覆。" + default_email_in_reply_to: "預設在郵件中包含回覆的摘要文本。" + default_other_new_topic_duration_minutes: "近期主題條件的全局預設設置" + default_other_auto_track_topics_after_msecs: "經過多少毫秒之後一個主題就被自動追蹤的全局預設設置" + default_other_notification_level_when_replying: "用戶回覆主題時的全局預設通知等級" + default_other_external_links_in_new_tab: "預設在新的標籤頁打開外部連結" + default_other_enable_quoting: "預設在高亮選擇文字時啟用引用回覆" + default_other_dynamic_favicon: "預設在瀏覽器表徵圖上顯示新/更新的主題數量" + default_other_disable_jump_reply: "預設不在用戶回覆後跳轉到新帖子位置" + default_other_like_notification_frequency: "預設通知用戶讚的消息" + default_topics_automatic_unpin: "預設時當用戶到達底部時自動解除主題置頂。" + default_categories_watching: "分類列表預設跟蹤。" + default_categories_tracking: "分類列表預設追蹤。" + default_categories_muted: "分類列表預設不顯示。" + default_categories_watching_first_post: "預設監看這些分類中每個新主題的第一貼" + max_user_api_reqs_per_day: "用戶API每日每密鑰最高請求數" + max_user_api_reqs_per_minute: "用戶API每密鑰每分鐘最高請求數" + allow_user_api_keys: "允許生成用戶API密鑰" + allow_user_api_key_scopes: "用戶API授權範圍列表" + max_api_keys_per_user: "每用戶最多持有的用戶 API 數" + min_trust_level_for_user_api_key: "生成用戶 API 密鑰所需的信任等級" + allowed_user_api_auth_redirects: "允許用戶 API 密鑰重定向授權至" + allowed_user_api_push_urls: "允許使用伺服器推送至用戶 API 的 URL" + tagging_enabled: "啟用標籤功能,允許為主題設置標籤?" + min_trust_to_create_tag: "創建標籤所需的最小信任等級。" + max_tags_per_topic: "主題最多允許有多少個標籤。" + max_tag_length: "標籤允許的最大字元數。" + max_tag_search_results: "當搜索標籤時,顯示的結果數上限。" + show_filter_by_tag: "顯示下拉菜單以按照標籤過濾主題列表。" + max_tags_in_filter_list: "過濾菜單中顯示的標籤數上限。優先顯示最常用的標籤。" + tags_sort_alphabetically: "按照字母順序顯示標籤。預設按流行度顯示。" + tag_style: "標籤的視覺樣式。" + staff_tags: "只可由管理人員使用的標籤列表" + min_trust_level_to_tag_topics: "給主題加標籤的最小信任等級" + suppress_overlapping_tags_in_list: "如果標籤匹配了主題標題中的詞,不顯示該標籤" + remove_muted_tags_from_latest: "在最新主題列表中,不顯示有靜音標籤的主題。" + company_short_name: "公司名(短)" + company_full_name: "公司名(全)" + company_domain: "公司域名" errors: invalid_email: "無效的電子郵件地址" invalid_username: "沒有用戶使用該用戶名稱。" @@ -723,127 +1251,830 @@ zh_TW: invalid_string_min_max: "必須介於 %{min} 到 %{max} 字之間。" invalid_string_min: "必須至少 %{min} 個字。" invalid_string_max: "不能超過 %{max} 個字。" + invalid_reply_by_email_address: "值必須包含 '%{reply_key}' 並且要與通知郵件不同。" + invalid_alternative_reply_by_email_addresses: "必須包括 “%{reply_key}” 並與通知郵件地址不同。" + pop3_polling_host_is_empty: "在啟用 POP3 輪詢前,你必須設置 'pop3 polling host'。" + pop3_polling_username_is_empty: "在啟用 POP3 輪詢前,你必須設置 'pop3 polling username'。" + pop3_polling_password_is_empty: "在啟用 POP3 輪詢前,你必須設置 'pop3 polling password'。" + pop3_polling_authentication_failed: "POP3 驗證失敗。請驗證你的 pop3 賬戶信息。" + reply_by_email_address_is_empty: "在啟用郵件回覆之前,你必須設置“reply by email address”。" + email_polling_disabled: "在啟用郵件回覆功能前,你必須啟用手動或者 POP3 輪詢。" + user_locale_not_enabled: "你必須先設置 'allow user locale' 再啟用該設置。" + invalid_regex: "正則表達式非法或者不允許。" search: + within_post: "#{{post_number}} 由 {{username}}" types: category: '分類' topic: '結果' user: '用戶' + sso: + not_found: "無法找到你的賬戶。請聯繫站點管理人員。" + account_not_approved: "你的帳號尚未被審核通過。一旦你的帳號獲得批准,你就會收到一封電子郵件提醒。" + unknown_error: "你的賬戶發生了問題。請聯繫站點管理人員。" + timeout_expired: "賬戶登錄超時,請重新嘗試登錄。" original_poster: "原始作者" most_posts: "大部分文章" most_recent_poster: "當前大部分文章作者" frequent_poster: "頻繁發文者" + redirected_to_top_reasons: + new_user: "歡迎來到我們的社區!這是我們最近的熱門主題。" + not_seen_in_a_month: "歡迎回來!我們已經好久沒見到你了。這些是你不在時的最熱門主題。" + merge_posts: + edit_reason: + other: "%{username}合併了 %{count} 個帖子" + errors: + different_topics: "無法合並不同主題的帖子。" + different_users: "無法合並不同用戶的帖子。" + move_posts: + new_topic_moderator_post: + other: "%{count} 個帖子被分離到了新主題:%{topic_link}" + existing_topic_moderator_post: + other: "%{count} 個帖子被合併到現存主題:%{topic_link}" change_owner: post_revision_text: "所有權從 %{old_user} 轉移至 %{new_user}" + deleted_user: "已經刪除的用戶" + emoji: + errors: + name_already_exists: "抱歉,名字 '%{name}' 已經被另一個 emoji 使用。" + error_while_storing_emoji: "抱歉,存儲 emoji 時發生錯誤。" topic_statuses: archived_enabled: "此討論話題已封存,即已經凍結,無法修改。" archived_disabled: "此討論話題已被解除封存,即不再凍結,可以修改。" closed_enabled: "此討論話題已關閉,不再接受新的回覆。" closed_disabled: "此討論話題已開放,可以發表新的回覆。" + autoclosed_message_max_posts: + other: "消息中回覆已經達到上限 %{count},自動鎖定。" + autoclosed_topic_max_posts: + other: "主題中回覆已經達到上限 %{count},自動關閉。" + autoclosed_enabled_days: + other: "該主題在創建%{count}天后自動關閉。不再允許添加新回覆。" + autoclosed_enabled_hours: + other: "該主題在創建%{count}小時後自動關閉。不再允許新的回覆。" + autoclosed_enabled_minutes: + other: "該主題在創建%{count}分鐘後自動關閉。不再允許新的回覆。" + autoclosed_enabled_lastpost_days: + other: "該主題在最後一個回覆創建後%{count}天后自動關閉。不再允許新的回覆。" + autoclosed_enabled_lastpost_hours: + other: "該主題在最後一個回覆創建後%{count}小時後自動關閉。不再允許添加新回覆。" + autoclosed_enabled_lastpost_minutes: + other: "本主題在最後一個回覆創建後%{count}分鐘後自動鎖定。不再允許添加新回覆。" autoclosed_disabled: "此討論話題已開放,可以發表新的回覆。" + autoclosed_disabled_lastpost: "本主題現在開放了。可以添加新的回覆。" + pinned_enabled: "本主題已置頂,它將始終顯示在它所屬分類的頂部。可由管理人員對所有人解除置頂,或者由用戶自己取消置頂。" pinned_disabled: "此討論話題已被解除置頂,它將不再顯示在它所屬分類的頂部。" + pinned_globally_enabled: "本主題已全局置頂,它將始終顯示在它所屬分類的頂部。可由管理人員對所有人解除置頂,或者由用戶自己取消置頂。" pinned_globally_disabled: "本主題已被解除置頂,它將不再置頂於所屬分類" + visible_enabled: "本主題已設置為顯示在主題列表中。" + visible_disabled: "本主題設置為不顯示在主題列表中。只能通過直達連結來訪問。" login: not_approved: "你的帳號尚未獲得批准。一旦你的帳號獲得批准,你會收到一封電子郵件。" incorrect_username_email_or_password: "用戶名、電子郵箱或密碼不正確" wait_approval: "謝謝註冊帳號。我們會在你的帳號獲得批准之後通知你。" active: "你的帳號已經被啟用,可以使用了。" + activate_email: "快完成了!我們發送了一封激活郵件到%{email}。請按照郵件中的步驟來激活你的帳號。
如果你沒有收到郵件,請檢查你的垃圾郵件收件箱,或者試試再登錄一次,看看能不能收到另一封激活郵件。
" not_activated: "你還不能登入。我們發送了一封啟用郵件給你,請按照郵件中的步驟來啟用你的帳號。" not_allowed_from_ip_address: "你無法透過此 IP 登入成為 %{username}。" admin_not_allowed_from_ip_address: "你無法透過此 IP 登入成為管理員。" suspended: "你在 %{date} 之前無法登入。" + suspended_with_reason: "賬號暫停至%{date}: %{reason}" errors: "%{errors}" not_available: "不可用,試試 %{suggestion}?" something_already_taken: "出了一些問題,可能此用戶名或電子郵箱已經被註冊。試試 忘記密碼 連結吧。" + omniauth_error: "抱歉,在驗證你的帳號時發生了錯誤。可能你沒有批准授權申請?" omniauth_error_unknown: "在處理你的登入過程中發生了錯誤,請重試。" + authenticator_error_no_valid_email: "關聯%{account}的賬戶沒有優秀的郵件地址。你可能需要用不同的郵件地址配置你的賬戶。" new_registrations_disabled: "現在不允許註冊新的帳戶" password_too_long: "密碼不能超過 200 個字符。" + email_too_long: "你輸入的郵件太長了。郵箱名不得超過 254 字元,域名必須不超過 253 字元。" + reserved_username: "該用戶名不可被使用。" missing_user_field: "你還沒有填寫完所有用戶字段" close_window: "驗證已經完成。關閉視窗以繼續。" + already_logged_in: "喔,看起來你正嘗試查看給另一個用戶的邀請連結。如果你不是%{current_user},請退出再重試。" user: no_accounts_associated: "無關聯的帳戶" + deactivated: "因發送至“%{email}”的郵件被多次退信,取消激活" username: short: "必須至少 %{min} 個字" long: "不能超過 %{max} 個字" characters: "必須只包含字母和數位" unique: "必須是唯一的" blank: "必須存在" + must_begin_with_alphanumeric_or_underscore: "必須以字母、數字或下劃線開頭" + must_end_with_alphanumeric: "必須以字母或數字結尾" + must_not_contain_two_special_chars_in_seq: "必須不包括連續的 2 個或更多的特殊字元(.-_)" + must_not_end_with_confusing_suffix: "不能以難以分辨的尾碼結尾,比如 .json 或者 .png 等" email: not_allowed: "本站不允許使用該郵箱服務商提供的電子郵箱,請使用其它郵箱位址。" blocked: "不被允許。" + revoked: "在%{date}之前不發送郵件至“%{email}”" + ip_address: + blocked: "不允許從你的 IP 地址註冊新用戶。" + max_new_accounts_per_registration_ip: "不允許從你的 IP 地址註冊新用戶(達到上限)。聯繫一個管理人員。" + website: + domain_not_allowed: "網站無效。允許的域名有:%{domains}" + flags_reminder: + flags_were_submitted: + other: "這些標記在過去 %{count} 小時內被提交。請審核他們。" + subject_template: + other: "%{count} 個標記需要被處理" + unsubscribe_mailer: + subject_template: "確認你不想要收到%{site_title}的電子郵件更新" + text_body_template: | + 有人(可能是你?)請求不再接受來自%{site_domain_name}的郵件更新。 + 點擊連結以確認退訂: + + %{confirm_unsubscribe_link} + + + 如果你想要繼續接受郵件更新,你可以忽略這封郵件。 invite_mailer: subject_template: "%{invitee_name} 邀請你參與在 %{site_domain_name} 討論的話題 '%{topic_title}'" + text_body_template: | + %{invitee_name} 邀請你參與討論 + + > **%{topic_title}** + > + > %{topic_excerpt} + + 位於站點 + + > %{site_title} -- %{site_description} + + 如果你有興趣,點擊下面的連結: + + %{invite_link} + + 這封邀請來組于受信任的用戶,所以你可以立即回覆。 + custom_invite_mailer: + subject_template: "%{invitee_name}邀請你'%{topic_title}'在%{site_domain_name}" + text_body_template: | + %{invitee_name}邀請你參與 + + > %{site_title} -- %{site_description} + + 中的 + + > **%{topic_title}** + > + > %{topic_excerpt} + + %{invitee_name}的留言: + + %{user_custom_message} + + 如果你有興趣,點擊下面的連結: + + %{invite_link} + + 這封邀請發自受信任的用戶,所以你可以立即回覆主題。 invite_forum_mailer: subject_template: "%{invitee_name} 邀請你加入 %{site_domain_name}" + text_body_template: | + %{invitee_name} 邀請你加入 + + > **%{site_title}** + > + > %{site_description} + + 如果你感興趣,點擊下面的連結: + + %{invite_link} + + 這封邀請發自受信任的用戶,所以你的帳戶將被自動創建。 + custom_invite_forum_mailer: + subject_template: "%{invitee_name}邀請你加入%{site_domain_name}" + text_body_template: | + %{invitee_name}邀請你加入 + + > **%{site_title}** + > + > %{site_description} + + %{invitee_name}的留言: + + %{user_custom_message} + + 如果你感興趣,點擊下面的連結: + + %{invite_link} + + 這封邀請發自受信任的用戶,所以你的帳戶將被自動創建。 invite_password_instructions: subject_template: "為 %{site_name} 的帳戶設置密碼" + text_body_template: | + 感謝你接受來自%{site_name}的邀請——歡迎! + + 點擊下面的連結立即選擇一個密碼: + %{base_url}/users/password-reset/%{email_token} + + (如果連結已經過期,在登錄時用,選擇“我忘記了密碼”,再次輸入你的郵箱即可。) test_mailer: subject_template: "[%{site_name}] 電子郵件發送測試" + text_body_template: | + 這是一封測試電子郵件,發自: + + [**%{base_url}**][0] + + 電子郵件分發很複雜。以下是一些你應該檢查的重點: + + - 確定你在站點設置中為 `notification email` 設置了正確的地址。**這是系統發送郵件裡的“發自”地址,並需要你的域名配置正確以供相關驗證。**。 + + - 學習使用郵件客戶端查看電子郵件原始碼,這樣你可以通過查看郵件頭部來排查重要線索。在 Gmail 中,可以通過每一封郵件下拉菜單中的“顯示原始消息”來查看。 + + - **重要:** 你的 ISP 是否對你發送郵件的域名和 IP 作了反向 DNS 解析?你可以在此[測試你的反向枚舉指針(PTR)記錄][2]。如果你的 ISP 沒有設置正確的反向 DNS 記錄,那麼很可能你的任何電子郵件都不會被成功發送。 + + - 你的域名的[發件人策略框架(SPF)記錄][8]是否正確?你可以在此[測試你的SPF記錄][1]。注意 TXT 是一種正確的官方 SPF 記錄。 + + - 你域名的[域名密鑰身份識別郵件(DKIM)記錄][3]設置是否正確?這將顯著提高郵件分發的成功率。在此[測試你的 DKIM 記錄][7]。 + + - 如果你自己運行郵件伺服器,檢查確認你發送電子郵件的伺服器 IP [不在任何郵件黑名單中][4]。驗證你的 DNS 記錄的 HELO 消息中設置了符合要求的主機名。如果沒有,那麼會導致很多郵件服務商拒收你的郵件。 + + - 我們強烈建議你**發送測試郵件至 [mail-tester.com][mt]**,這樣可以檢查上述設置是否正確。 + + (最簡單的方法是在 [SendGrid][sg]、[SparkPost][sp]、[Mailgun][mg] 和 [Mailjet][mj]註冊免費賬戶,他們的免費賬戶對一個小社群是足夠的。不過你仍然需要在 DNS 設置中設定 SPF 和 DKIM 記錄!) + + 我們衷心希望你成功完成郵件發送測試! + + 祝好運! + + 你的朋友,[Discourse](http://www.discourse.org) + + [0]: %{base_url} + [1]: http://www.kitterman.com/spf/validate.html + [2]: http://mxtoolbox.com/ReverseLookup.aspx + [3]: http://www.dkim.org/ + [4]: http://whatismyipaddress.com/blacklist-check + [7]: https://www.mail-tester.com/spf-dkim-check + [8]: http://www.openspf.org/SPF_Record_Syntax + [sg]: https://sendgrid.com/ + [sp]: https://www.sparkpost.com/ + [mg]: http://www.mailgun.com/ + [mj]: https://www.mailjet.com/pricing + [mt]: http://www.mail-tester.com/ new_version_mailer: subject_template: "[%{site_name}] 有可用的新版 Discourse 更新" + text_body_template: | + 哇哦,有新版本的 [Discourse](http://www.discourse.org) 可以升級! + + 你的版本:%{installed_version} + 新的版本:**%{new_version}** + + - 瀏覽器訪問**[一鍵更新工具](%{base_url}/admin/upgrade)**升級。 + + - 查看[GitHub 改動日誌(英文)](https://github.com/discourse/discourse/commits/master)中更新的內容。 + + - 訪問 [meta.discourse.org(英文)](https://meta.discourse.org) 獲取 Discourse 的最新資訊、討論和支持。也可訪問 [meta.discoursecn.org 非官方的中文支持論壇](https://meta.discoursecn.org) 獲得支持。 new_version_mailer_with_notes: subject_template: "[%{site_name}] 可以升級" + text_body_template: | + 哇哦,有新版本的 [Discourse](http://www.discourse.org) 可以升級! + + 你的版本:%{installed_version} + 新的版本:**%{new_version}** + + - 查看[GitHub 改動日誌(英文)](https://github.com/discourse/discourse/commits/master)中更新的內容。 + + - 瀏覽器訪問**[一鍵更新工具](%{base_url}/admin/upgrade)**升級。 + + - 訪問 [meta.discourse.org(英文)](http://meta.discourse.org) 獲取 Discourse 的最新資訊、討論和支持。也可訪問 [meta.discoursecn.org 非官方的中文支持論壇](http://meta.discoursecn.org) 獲得支持。 + + ### 發行註記 + + %{notes} + queued_posts_reminder: + subject_template: + other: "[%{site_name}] %{count} 個帖子等待審核" + text_body_template: | + 你好, + + 新用戶的帖子等待被編輯或審核。[審核通過或者拒絶](%{base_url}/queued-posts)。 + flag_reasons: + off_topic: "你的帖子被標記為 **偏離主題**:鑒於當前的主題標題和第一個帖子,社群成員們感覺它不適合處于這個主題中。" + inappropriate: "你的帖子被標記為 **不恰當**:社群成員感覺它有冒犯或者侮辱的意味,亦或是它違反了[社群準則](/guidelines)。" + spam: "你的帖子被標記為 **廣告**:社群成員覺得它是廣告,像是在過度地推廣着什麼,而不是預期中與主題有關的內容。" + notify_moderators: "你的帖子被標記為 **需要版主關注**:社群成員認為帖子需要管理人員介入。" flags_dispositions: + agreed: "謝謝你的消息。我們認為這是個問題。我們正在進行處理。" + agreed_and_deleted: "感謝通知我們。我們認為這是一個問題,並且我們已經刪除了帖子。" disagreed: "感謝你讓我們知道。我們正在調查。" deferred: "感謝你讓我們知道。我們正在調查。" + deferred_and_deleted: "感謝通知我們。我們已經刪除了帖子。" + temporarily_closed_due_to_flags: "主題因為大量的社群標記暫時關閉" system_messages: + post_hidden: + subject_template: "帖子因社群標記隱藏" + text_body_template: | + 你好, + + 這是%{site_name}自動發出的郵件,通知你的帖子已被隱藏。 + + %{base_url}%{url} + + %{flag_reason} + + 你的帖子是因為被多個社群成員標記才被隱藏的,所以請考慮根據他們的反饋修改你的帖子。**你可以在 %{edit_delay} 分鐘後開始編輯你的帖子,然後它將重新被顯示。** + + 然而,如果帖子再次被社群成員標記並隱藏,它將被隱藏至版主處理後——並且可能導致進一步的措施,如封禁帳號。 + + 想瞭解更多,請查看我們的[社群指引](%{base_url}/guidelines)。 + usage_tips: + text_body_template: "要查看給新用戶的簡要技巧,[(英文)看看這篇博客文章](http://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/)。\n\n只要你參與,我們將更瞭解你,並且新用戶的臨時限制將被移除。\b隨着時間,你將獲得[信任等級](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924),這將提供一些特殊功能來幫助我們更好地管理社群。\n" welcome_user: subject_template: "歡迎來到 %{site_name}!" + text_body_template: |+ + 感謝你加入%{site_name},歡迎討論! + + %{new_user_tips} + + 我們相信始終相信[公民社群守則](%{base_url}/guidelines) 。好好享受你在論壇的時光! + + (如果身為新的使用者你需要聯絡[工作人員](%{base_url}/about),請直接回覆本訊息) + welcome_invite: subject_template: "歡迎來到 %{site_name}!" + text_body_template: |+ + 歡迎你接受邀請加入 %{site_name} 的 Discourse。 + + 你已經登入你的新帳號 **%{username}** 。你可以在[你的個人檔案][prefs]更改你的使用者名稱。 + + 之後要再登入: + + 1. 永遠 **使用當初註冊的 email ** 登入,不然我們不知道是你! + + 2. 為[你的個人檔案][prefs]創立一個獨立的密碼,用它登入。 + + %{new_user_tips} + + 我們相信[公民社群守則](%{base_url}/guidelines)。 + + 享受你在 Discourse 上的時光! + + (如果身為新的使用者你需要聯絡[工作人員](%{base_url}/about) ,請直接回覆此訊息。 + + [prefs]: %{user_preferences_url} + + backup_succeeded: subject_template: "備份成功完成" + text_body_template: | + 備份成功。 + + 訪問[管理 > 備份](%{base_url}/admin/backups)下載你的新備份檔案。 + + 以下為日誌: + + ```text + %{logs} + ``` backup_failed: subject_template: "備份失敗" + text_body_template: | + 備份已經失敗了。 + + 以下是日誌: + + ```text + %{logs} + ``` restore_succeeded: subject_template: "恢復成功完成" - text_body_template: "這次恢復成功。" + text_body_template: | + 恢復成功。 + + 以下是日誌: + + ``` + %{logs} + ``` restore_failed: subject_template: "復原失敗" + text_body_template: | + 恢復失敗。 + + 以下是日誌: + + ``` + %{logs} + ``` bulk_invite_succeeded: subject_template: "批次用戶邀請已完成處理" + text_body_template: "你的批量邀請用戶已經完成,發送了 %{sent} 個邀請。" bulk_invite_failed: subject_template: "批次使用者邀請處理已經完成,發生了些錯誤" + text_body_template: | + 批量邀請已經完成,發出了 %{sent} 個邀請並且 %{failed} 個失敗。 + + 查看日誌: + + ``` + %{logs} + ``` csv_export_succeeded: subject_template: "資料匯出完成" + text_body_template: | + 數據成功導出!:dvd: + + %{file_name}(%{file_size}) + + 以上的下載連結將在 48 小時後失效。 csv_export_failed: subject_template: "資料匯出失敗" + text_body_template: "我們很抱歉,但是你的數據導出請求失敗了。請檢查日誌或聯繫一位管理人員。" + email_reject_insufficient_trust_level: + subject_template: "[%{site_name}] 電子郵件錯誤 -- 信任等級不足" + text_body_template: | + 我們很抱歉,但是你發送至%{destination}(名為 %{former_title})的郵件出問題了。 + + 你的賬戶沒有足夠的信任等級以該郵件地址發佈新主題。如果你有異議,聯繫管理人員。 + email_reject_user_not_found: + subject_template: "[%{site_name}] 郵件問題 -- 用戶未找到" + text_body_template: | + 我們非常抱歉,但是你發送至 %{destination}(名為%{former_title}) 的郵件出問題了。 + + 你發送回覆的郵件地址是未知的郵件地址。試試從另外一個郵件地址發送,或者聯繫管理人員。 + email_reject_screened_email: + subject_template: "[%{site_name}] 電子郵件錯誤 -- 被封禁的郵件地址" + text_body_template: | + 我們非常抱歉,但是你發送至%{destination}(名為%{former_title})的郵件出問題了。 + + 你發送回覆的郵件地址是已被封禁的郵件地址。試試從另外一個郵件地址發送,或者聯繫管理人員。 + email_reject_inactive_user: + subject_template: "[%{site_name}] 電子郵件錯誤 -- 未激活用戶" + text_body_template: | + 我們非常抱歉,但是你發送至 %{destination}(名為%{former_title}) 的郵件出問題了。 + + 與你賬戶關聯的郵件地址沒有激活,請先激活你的賬號再發送郵件。 + email_reject_blocked_user: + subject_template: "[%{site_name}] 電子郵件錯誤 -- 被封禁的用戶" + text_body_template: | + 我們非常抱歉,但是你發送至 %{destination}(名為%{former_title}) 的郵件出問題了。 + + 與你賬戶關聯的郵件地址已經被封禁。 + email_reject_reply_user_not_matching: + subject_template: "[%{site_name}] 電子郵件錯誤 -- 未預期的回覆地址" + text_body_template: | + 我們非常抱歉,但是你發送至 %{destination}(名為%{former_title}) 的郵件出問題了。 + + 你發送回覆的郵件地址與我們等待的地址不同,所以我們不確定你是不是同一個人。試試從另外一個郵件地址發送,或者聯繫管理人員。 + email_reject_no_account: + subject_template: "[%{site_name}] 電子郵件錯誤 -- 未知賬戶" + text_body_template: | + 我們非常抱歉,但是你發送至 %{destination}(名為%{former_title}) 的郵件出問題了。 + + 我們找不到匹配你郵件地址的賬號。試試從另外一個郵件地址發送,或者聯繫管理人員。 + email_reject_empty: + subject_template: "[%{site_name}] 電子郵件錯誤 -- 無內容" + text_body_template: | + 我們很抱歉,但是你發送至 %{destination}(名為 %{former_title})的郵件沒有成功。 + + 我們不能找到你郵件中的任何回覆內容。 + + 如果你**確定**你的郵件中有回覆內容,試試用更簡單的格式。 + email_reject_parsing: + subject_template: "[%{site_name}] 電子郵件錯誤 -- 內容無法識別" + text_body_template: | + 我們很抱歉,但是你發送至 %{destination}(名為 %{former_title})的郵件無法發送。 + + 我們不能找到你郵件中的回覆。**請確認將你的回覆置於郵件頂端**——我們不能處理行內回覆。 + email_reject_invalid_access: + subject_template: "[%{site_name}] 電子郵件錯誤 -- 無權限" + text_body_template: | + 我們很抱歉,但是你發送至%{destination}(名為 %{former_title})的郵件出問題了。 + + 你的賬戶沒有達到足夠的信任等級在該分類發佈新主題。如果你有異議,聯繫管理人員。 + email_reject_strangers_not_allowed: + subject_template: "[%{site_name}] 電子郵件錯誤 -- 無權限" + text_body_template: |+ + 我們非常抱歉,但是你發送至%{destination}(名為%{former_title})的郵件出問題了。 + + 郵件發至的分類只接受來自合法帳戶且郵件地址已確認的用戶的有郵件。如果你有異議,聯繫管理人員。 + + email_reject_invalid_post: + subject_template: "[%{site_name}] 郵件問題 -- 發佈時錯誤" + text_body_template: | + 我們非常抱歉,但是你發送至%{destination}(名為%{former_title})的郵件出問題了。 + + 可能的原因是:複雜的格式、消息超長、消息太短。請再試一次,如果還不行,使用網站發表。 + email_reject_invalid_post_specified: + subject_template: "[%{site_name}] 郵件問題 -- 發佈時錯誤" + text_body_template: | + 我們非常抱歉,但是你發送至%{destination}(名為%{former_title})的郵件出問題了。 + + 原因: + + %{post_error} + + 如果你能解決錯誤,請再試一次。 + email_reject_invalid_post_action: + subject_template: "[%{site_name}] 電子郵件錯誤 -- 無發表權限" + text_body_template: | + 我們非常抱歉,但是你發送至%{destination}(名為%{former_title})的郵件出問題了。 + + 發送的命令無法被識別。請再試一次,如果還有問題,使用網站發表。 + email_reject_reply_key: + subject_template: "[%{site_name}] 電子郵件錯誤 -- 未知回覆指紋" + text_body_template: | + 我們非常抱歉,但是你發送至%{destination}(名為%{former_title})的郵件出問題了。 + + 郵件中的回覆信令是無效或者未知的,所以我們不知道這封郵件回覆給誰了。請聯繫管理人員。 + email_reject_bad_destination_address: + subject_template: "[%{site_name}] 電子郵件錯誤 -- 未知的回覆至地址" + text_body_template: | + 我們非常抱歉,但是你發送至%{destination}(名為%{former_title}) 郵件出問題了。 + + 目標郵件地址無法識別。請確保你在向管理人員提供的郵件地址發信。 + email_reject_topic_not_found: + subject_template: "[%{site_name}] 郵件問題 -- 主題未找到" + text_body_template: | + 我們很抱歉,但是你發送至%{destination}(名為 %{former_title})的郵件出問題了。 + + 你回覆的主題不存在——可能已經被刪除了?如果你有異議,聯繫管理人員。 + email_reject_topic_closed: + subject_template: "[%{site_name}] 郵件問題 -- 主題已關閉" + text_body_template: | + 我們很抱歉,但是你發送至 %{destination} ( 名為 %{former_title} )的郵件出問題了。 + + 你回覆的主題已經被關閉,不允許回覆。如果你有異議,聯繫管理人員。 + email_reject_auto_generated: + subject_template: "[%{site_name}] 郵件問題 -- 自動生成的回覆" + text_body_template: | + 我們很抱歉,但是你發送至%{destination}(名為 %{former_title})的郵件出問題了。 + + 系統覺得你的郵件是“自動生成”的,即電腦生成了該郵件而不是由你輸入的;我們不能接受這樣的郵件。如果你有異議,聯繫管理人員。 + email_error_notification: + subject_template: "[%{site_name}] 電子郵件錯誤 -- POP 驗證錯誤" + text_body_template: | + 不幸的是,從 POP 伺服器查詢郵件時遇到了驗證錯誤。 + + 請確認你在[站點設置](%{base_url}/admin/site_settings/category/email)中已經正確配置了 POP 驗證信息。 + + 如果 POP 郵件賬號有圖形界面,你可以登錄後查看郵箱設置。 + too_many_spam_flags: + subject_template: "新賬戶被暫時封禁" + text_body_template: | + 你好, + + 這是%{site_name}自動發出的郵件。你的帖子因社群標記而被臨時隱藏。 + + 出於謹慎的考慮,在管理人員審核通過前,你的新賬戶不能再發表新的回覆或者主題。我們對此帶來的不便表示歉意。 + + 要查看更多指引,請參考我們的[社群指引](%{base_url}/guidelines)。 + too_many_tl3_flags: + subject_template: "新賬戶被暫時封禁" + text_body_template: | + 你好, + + 這是%{site_name}自動發出的郵件。你的帳戶因大量社群標記而被暫停使用。 + + 出於謹慎的考慮,在管理人員審核通過前,你的新賬戶不能再發表新的回覆或者主題。我們對此帶來的不便表示歉意。 + + 要查看更多指引,請參考我們的[社群指引](%{base_url}/guidelines)。 + blocked_by_staff: + subject_template: "賬戶被暫時封禁" + text_body_template: | + 你好, + + 這是%{site_name}自動發出的郵件。出於謹慎的考慮,你的帳戶臨時暫停使用。 + + 請繼續瀏覽,但在管理人員審核通過前,你的賬戶不能再發表新的回覆或者主題。我們對此帶來的不便表示歉意。 + + 要查看更多指引,請參考我們的[社群指引](%{base_url}/guidelines)。 + user_automatically_blocked: + subject_template: "新用戶%{username}因社群標記而被封禁" + text_body_template: | + 這是自動發出的郵件。 + + 因多位用戶標記%{username}的帖子,新用戶[%{username}](%{base_url}%{user_url})已被自動封禁。 + + 請[查看這些標記](%{base_url}/admin/flags)。如果%{username}被意外禁用了編輯功能,點擊[該用戶管理頁面](%{base_url}%{user_url})內的解封按鈕。 + + 該閾值可以通過站點設置中的 `block_new_user` 更改。 spam_post_blocked: subject_template: "新用戶 %{username} 由於重複貼連結,文章已被封鎖" + text_body_template: | + 這是自動發出的郵件。 + + 新用戶[%{username}](%{base_url}%{user_url})試圖創建多個連結至 %{domains} 的帖子,但這些帖子因為反垃圾策略而被阻擋了。用戶仍能夠發表不包含到 %{domains} 的帖子。 + + 請[審核該用戶](%{base_url}%{user_url})。 + + 該閾值可以通過站點設置中的 `newuser_spam_host_threshold` 和 `white_listed_spam_host_domains` 更改。 + unblocked: + subject_template: "賬戶已解除封禁" + text_body_template: | + 你好, + + 這是%{site_name}自動發出的郵件。管理人員審核你的帳戶後,你的帳戶不再受到限制。 + + 你現在可以創建新回覆和主題了。感謝你的耐心等待。 pending_users_reminder: subject_template: other: "%{count} 個用戶等待審核" + text_body_template: | + 有新註冊的用戶在訪問論壇前需要被確認(或者拒絶)。 + + [請在管理欄目中審核他們](%{base_url}/admin/users/list/pending)。 download_remote_images_disabled: subject_template: "停用下載遠端圖片" + text_body_template: "`download_remote_images_to_local` 設定已被禁用,因為已經達到 ``download_remote_images_threshold` 設定中的磁碟空間限制。" + dashboard_problems: + subject_template: "發現問題了" + text_body_template: | + 系統在管理員面板中報告了發現的問題。 + + [請檢查並修復他們](%{base_url}/admin)。 + unsubscribe_link: | + 要退訂這些郵件,[點擊這裡](%{unsubscribe_url})。 + unsubscribe_link_and_mail: | + 要退訂這些郵件,[點擊這裡](%{unsubscribe_url})。 + unsubscribe_mailing_list: | + 你啟用了郵件列表模式,所以收到了這些郵件。 + + 要退訂這些郵件,[點擊這裡](%{unsubscribe_url})。 subject_re: "回覆:" subject_pm: "[私訊]" user_notifications: previous_discussion: "之前的回覆" + reached_limit: + other: "警告:你達到了每日郵件限額(%{count})。之後郵件通知將被禁用。" in_reply_to: "回覆給" unsubscribe: title: "取消訂閱" description: "不再對這些郵件感興趣?沒問題!點擊下面按鈕來立即取消訂閱:" + reply_by_email: "[訪問主題](%{base_url}%{url})或者發郵件回覆。" + reply_by_email_pm: "[訪問消息](%{base_url}%{url})或者發郵件回覆。" + only_reply_by_email: "發郵件回覆。" + visit_link_to_respond: "[訪問主題](%{base_url}%{url})以回覆." + visit_link_to_respond_pm: "[訪問消息](%{base_url}%{url})以回覆." posted_by: "由 %{username} 張貼於 %{post_date}" + invited_to_private_message_body: | + %{username} 邀請你至消息交流: + + > **%{topic_title}** + > + > %{topic_excerpt} + + 論壇: + + > %{site_title} -- %{site_description} + invited_to_topic_body: | + %{username} 邀請你參與討論: + + > **%{topic_title}** + > + > %{topic_excerpt} + + 論壇: + + > %{site_title} -- %{site_description} user_invited_to_private_message_pm: subject_template: "[%{site_name}] %{username} 邀請你參與討論 '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_invited_to_private_message_pm_staged: + subject_template: "[%{site_name}] %{username} 邀請你加入消息交流:'%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_invited_to_topic: + subject_template: "[%{site_name}] %{username}邀請你參與“%{topic_title}”" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} user_replied: subject_template: "[%{site_name}] %{username} 在 '%{topic_title}' 討論話題回覆了你的文章" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_replied_pm: + subject_template: "[%{site_name}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_quoted: subject_template: "[%{site_name}] %{username} 在 '%{topic_title}' 討論話題引用了你的內容" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_linked: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_mentioned: subject_template: "[%{site_name}] %{username} 在 '%{topic_title}' 討論話題提及了你" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_group_mentioned: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_posted: subject_template: "[%{site_name}] %{subject_prefix}%{username} 在 '%{topic_title}' 討論話題發表了文章" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_watching_first_post: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_posted_pm: subject_template: "[%{site_name}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_posted_pm_staged: + subject_template: "%{optional_re}%{topic_title}" + text_body_template: |2 + + %{message} digest: why: "在你上一次於 %{last_seen_at} 訪問後,在 %{site_link} 上的摘要。" - new_activity: "在你的討論話題和文章裡的動態:" - top_topics: "熱門文章" - other_new_topics: "熱門討論話題" + since_last_visit: "自從你上次訪問" + new_topics: "新主題" + unread_messages: "未讀私信" + unread_notifications: "未讀通知" + liked_received: "獲得贊" + new_posts: "新帖子" + new_users: "新用戶" + popular_topics: "熱門主題" + follow_topic: "關注主題" + join_the_discussion: "閲讀更多" + popular_posts: "流行帖子" + from_topic_label: "來自" + more_new: "新內容" + subject_template: "[%{site_name}] 摘要" + unsubscribe: "這是封來自%{site_link}的摘要郵件,因為你長時間沒有訪問而發送。%{unsubscribe_link}取消訂閲。" click_here: "點擊此處" - read_more: "閱讀更多" - more_topics: "有其他 %{new_topics_since_seen} 個新主題。" - more_topics_category: "更多新主題:" + from: "%{site_name}的摘要" + preheader: "在你上次於%{last_seen_at}訪問後的新內容摘要" + mailing_list: + why: "%{date}%{site_link}上的所有情況" + subject_template: "[%{site_name}] %{date}摘要" + unsubscribe: "這是每日摘要郵件。站點啟用了郵件列表模式,點擊連結 %{unsubscribe_link} 退訂。" + from: "%{site_name}的摘要" + new_topics: "近期主題" + topic_updates: "主題更新" + view_this_topic: "查看此主題" + back_to_top: "回到頂部" forgot_password: subject_template: "[%{site_name}] 密碼重設" text_body_template: | @@ -855,11 +2086,72 @@ zh_TW: %{base_url}/users/password-reset/%{email_token} set_password: subject_template: "[%{site_name}] 設定密碼" + text_body_template: | + 有人請求添加你在 [%{site_name}](%{base_url}) 的密碼。除此之外,你可以通過已驗證過你郵件地址的在綫服務商登錄。 + + 如果不是你在請求添加密碼,你可以直接忽略本郵件。 + + 點擊下面的連結來選擇一個新密碼: + %{base_url}/users/password-reset/%{email_token} + admin_login: + subject_template: "[%{site_name}]登錄" + text_body_template: | + 有人嘗試登錄你在[%{site_name}](%{base_url})的賬戶。 + + 如果不是你在操作,你可以安全地忽略這封郵件。 + + 點擊下面的連結登錄: + %{base_url}/users/admin-login/%{email_token} account_created: subject_template: "[%{site_name}] 你的新帳號" + text_body_template: | + 你在 %{site_name} 上建立了一個新賬號 + + 點擊下面的連結來為新賬戶設置密碼: + %{base_url}/users/password-reset/%{email_token} + confirm_new_email: + subject_template: "[%{site_name}] 確認你的電子郵件位址" + text_body_template: | + 點擊以下連結確認你在[%{site_name}]上的新電子郵件: + + %{base_url}/users/authorize-email/%{email_token} + confirm_old_email: + subject_template: "[%{site_name}] 確認你的新電子郵箱地址" + text_body_template: | + 在我們修改你的郵箱地址前,我們需要你確認你擁有當前的郵件賬號。在你完成這步之後,我們將確認你的新郵件地址。 + + 點擊下面的連結來確認你當前在%{site_name}上的電子郵箱地址: + + %{base_url}/users/authorize-email/%{email_token} + notify_old_email: + subject_template: "[%{site_name}] 你的郵箱地址已經修改成功" + text_body_template: | + 這是%{site_name}自動發出的郵件,以告知你的郵箱地址已經被修改了。如果這是一個錯誤,請聯繫站點管理人員。 + + 你的郵箱地址被修改為: + + %{new_email} signup_after_approval: subject_template: "你已受到 %{site_name} 的認可!" + text_body_template: | + 歡迎加入%{site_name}! + + 一個管理人員批准了你在%{site_name}的賬戶。 + + 點擊下面的連結來確認並激活你在 %{site_name} 上的新賬號: + %{base_url}/users/activate-account/%{email_token} + + 如果上面的連結無法點擊,請拷貝該連結並粘貼到你的瀏覽器的地址欄裡。 + + %{new_user_tips} + + 我們始終相信[討論應該文明](%{base_url}/guidelines)。 + + 好好享受你在論壇的時光吧! + + (如果你在新用戶級別需要和[管理人員](%{base_url/about)溝通的話,直接回覆這個消息。) signup: + subject_template: "[%{site_name}] 確認你的新賬戶" text_body_template: | 歡迎來到 %{site_name}! @@ -868,22 +2160,38 @@ zh_TW: 如果上面的連結無法點擊,請拷貝該連結並粘貼到你的流覽器的地址欄裡。 page_not_found: + title: "抱歉!這個頁面不存在或者是私密的。" popular_topics: "熱門" recent_topics: "最近" see_more: "更多" search_title: "搜尋該網頁" search_google: "Google" + login_required: + welcome_message: | + #[歡迎來到 %{title}](#welcome) + 你需要一個賬號。請創建一個賬號或者登錄以繼續。 terms_of_service: title: "服務條款" signup_form_message: '我已閱讀並接受 服務條款' deleted: '已刪除' upload: edit_reason: "下載外部圖片留做存檔" + unauthorized: "抱歉,你沒有上傳檔案的權限(驗證擴展:%{authorized_extensions})。" pasted_image_filename: "貼上的圖片" store_failure: "用戶 #%{user_id} 上傳 #%{upload_id} 儲存失敗" + file_missing: "抱歉,你必須選擇一個檔案上傳。" + attachments: + too_large: "抱歉,你試圖上傳的檔案太大了(最大限製為%{max_size_kb}%KB)。" images: + too_large: "抱歉,你試圖上傳的圖片太大了(最大限製為%{max_size_kb}%KB),請裁剪它並重試。" size_not_found: "抱歉,我們無法獲取圖片大小,請檢查你的圖片是否已損壞。" + avatar: + missing: "抱歉,我們沒法找到與你郵件地址關聯的頭像。你能再上傳一次試試嗎?" + flag_reason: + sockpuppet: "新用戶創建了主題,而另一個新用戶以同一個 IP 在該主題回覆。查看站點設置的 `flag_sockpuppets`。" + spam_hosts: "新用戶試圖在多個創建帖子中發錶鏈接到同一個域名的內容。查看站點設置的 `newuser_spam_host_threshold`。" email_log: + post_user_deleted: "帖子的用戶已被刪除。" no_user: "無法找到 ID 為 %{user_id} 的使用者" anonymous_user: "匿名用戶" suspended_not_pm: "用戶已被停權,不是訊息" @@ -894,10 +2202,13 @@ zh_TW: post_deleted: "文章已被做刪除" user_suspended: "用戶被停權" already_read: "此文章用戶已讀" + exceeded_emails_limit: "超過 max_emails_per_day_per_user" + exceeded_bounces_limit: "超過 bounce_score_threshold" message_blank: "訊息空白" message_to_blank: "message.to 為空" text_part_body_blank: "text_part.body is 為空" body_blank: "內容空白" + no_echo_mailing_list_mode: "郵件列表通知已對用戶自己的帖子禁用" color_schemes: base_theme_name: "基礎" about: "關於" @@ -911,19 +2222,690 @@ zh_TW: 編輯本主題的第一帖以改變 %{page_name} 頁面的內容。 guidelines_topic: title: "FAQ / 使用守則" + body: | + + + ## [這是一個文明討論的地方](#civilized) + + 在論壇上請表現得像在公共公園一樣得體。我們一群人共享着一個公共社群資源 — 一個通過不斷進行討論以分享我們技能、知識和興趣的地方。 + + 這些都不是死規矩或者是草率決定,只是一些幫助社群的人們來判斷的規定。試用這些指引來保持乾淨和充滿靈感的文明的公開論壇。 + + + + ## [改善討論](#improve) + + 幫助我們讓這個地方變成一個討論的好地方。你可以總是一致的做一些幫助改善討論的事,即使是小事也行。如果你不確定你的帖子有益於討論,認真想一想你要說什麼再發佈。 + + 這裡討論的主題對我們很重要,並且我們希望你也覺得這些內容對你很重要。尊重這些討論的主題,以及討論他們的人們,特別是當你不同意他們所說的時候。 + + 改善討論的一種方法是找一找已經發生過的事。請在發帖或創建你自己的主題前,花一些時間瀏覽這些主題,這樣你更有機會遇見和你有共同愛好的人。 + + + + ## [即使你不同意他人時,尊重他人](#agreeable) + + 你可能想表達你的不同意。這沒問題。但是,記住_批評觀點,而不是人_。請避免: + + * 指名道姓。 + * 人生攻擊。 + * 回覆帖子無關於帖子的內容。 + * 下意識的反駁。 + + 相反,提供合理的觀點改善討論。 + + + + ## [你的參與有意義](#participate) + + 我們在這兒的討論為大家樹立了榜樣。通過選擇參與有意義的討論,幫助我們將論壇變成一個有意思的地方 — 並且避免那些沒有幫助的行為。 + + Discourse 提供了讓社群共同鑒別最棒(或最差)的貢獻的工具:收藏、書籤、贊、標記、回覆和編輯等等。使用這些工具不僅能改善你自己的體驗,也能改善其他人的體驗。 + + 讓我們創造一個更美好的社群。 + + + + ## [如果你發現問題了,標記它](#flag-problems) + 版主有特別的權力;他們對論壇負責。但是你也是。有了你的幫助,版主能成為社群監察者,而不僅是守衛或者警察。 + + 當你見到不合適的行為,不要回覆。這種承認變相鼓勵了這種不合適的行為,浪費了你的精力,並且浪費了每一個人的時間。_只要標記它。_如果收到了足夠的標記,將會有相應的處理,這個處理可能是自動地,也可能由版主介入。 + + 為了維護我們的社群,版主保留了任何情況下刪除任何內容和任何用戶的權力。版主沒有預先審核任何新帖子;版主和站點維護人員對社群裡發表的任何言論均不負責任。 + + + + ## [永遠保持文明](#be-civil) + + 粗魯這樣的行為會破壞健康的討論: + + * 文明。不要發表任何理智的人會認為冒犯的、過分的或招致怨恨的言論。 + * 拒絶色情。不要發表任何淫穢或性暗示的東西。 + * 尊重每一個人。不要騷擾或者讓別人難過,檢視別人,或暴露他們的個人信息。 + * 尊重我們的論壇。不要發表廣告或者其他垃圾信息。 + + 這些條款不是法律條文,並且沒有準確的定義 — 避免任何做關於他們的_可能擦邊_的事。如果你不確定,問問自己的帖子是否能出現在紐約時報的頭版頭條上。 + + 這是一個公共論壇,並且搜索引擎會索引這些討論。注意發表的語言、連結和圖片,不要在其中包含你的家庭和朋友。 + + + + ## [保持整潔](#keep-tidy) + + 花一點時間讓東西出現在正確的位置,這樣我們能花更多的時間在討論上而非清理格式。所以: + + * 不要在錯誤的分類發表新主題。 + * 不要在多個主題中回覆同樣的內容。 + * 不要發佈沒有內容的回覆。 + * 不要在中途改變主題。 + * 不要在你的帖子中簽名 — 每一貼都附有你的個人信息。 + + 比起發表“+1”或者“同意”,使用贊按鈕。比起將帖子帶向一個決然不同的方向,使用“回覆為關聯主題”。 + + + + ## [只發表你自己的東西](#stealing) + + 你不能在沒有他人授權的情況下發表任何屬於他人的數字資產。你可能不能發表關於竊據他人知識產權(軟件、視頻、音頻和圖像)的任何簡介、連結或方法,或其他任何違反法律的內容。 + + + + ## [有你參與](#power) + + 這個站點由[一群友善的管理人員](/about)、你和社群一起運營。如果你對這裡的事情仍有疑問,在[站點反饋](/c/site-feedback)分類新建一個主題並且開始討論!如果遇到了重要或緊急的事情,並且不能用站務分類的主題或標記解決,通過[管理人員頁面](/about)聯繫我們。 + + + + ## [使用條款](#tos) + + 是的,法律很無聊,但是我們必須保護我們自己 – 引申開來,你和你的數據 – 用於針對不友好的傢伙們。我們有一個[使用條款](/tos)描述你的(以及我們)關於內容、隱私和法律的行為和權力。要使用我們的服務,你必須同意遵守[使用條款](/tos)。 tos_topic: title: "服務條款" + body: | + The following terms and conditions govern all use of the %{company_domain} website and all content, services and products available at or through the website, including, but not limited to, %{company_domain} Forum Software, %{company_domain} Support Forums and the %{company_domain} Hosting service ("Hosting"), (taken together, the Website). The Website is owned and operated by %{company_full_name} ("%{company_name}"). The Website is offered subject to your acceptance without modification of all of the terms and conditions contained herein and all other operating rules, policies (including, without limitation, %{company_domain}’s [Privacy Policy](/privacy) and [Community Guidelines](/faq)) and procedures that may be published from time to time on this Site by %{company_name} (collectively, the "Agreement"). + + Please read this Agreement carefully before accessing or using the Website. By accessing or using any part of the web site, you agree to become bound by the terms and conditions of this agreement. If you do not agree to all the terms and conditions of this agreement, then you may not access the Website or use any services. If these terms and conditions are considered an offer by %{company_name}, acceptance is expressly limited to these terms. The Website is available only to individuals who are at least 13 years old. + + + + ## [1. Your %{company_domain} Account](#1) + + If you create an account on the Website, you are responsible for maintaining the security of your account and you are fully responsible for all activities that occur under the account. You must immediately notify %{company_name} of any unauthorized uses of your account or any other breaches of security. %{company_name} will not be liable for any acts or omissions by you, including any damages of any kind incurred as a result of such acts or omissions. + + + + ## [2. Responsibility of Contributors](#2) + + If you post material to the Website, post links on the Website, or otherwise make (or allow any third party to make) material available by means of the Website (any such material, "Content"), You are entirely responsible for the content of, and any harm resulting from, that Content. That is the case regardless of whether the Content in question constitutes text, graphics, an audio file, or computer software. By making Content available, you represent and warrant that: + + * the downloading, copying and use of the Content will not infringe the proprietary rights, including but not limited to the copyright, patent, trademark or trade secret rights, of any third party; + * if your employer has rights to intellectual property you create, you have either (i) received permission from your employer to post or make available the Content, including but not limited to any software, or (ii) secured from your employer a waiver as to all rights in or to the Content; + * you have fully complied with any third-party licenses relating to the Content, and have done all things necessary to successfully pass through to end users any required terms; + * the Content does not contain or install any viruses, worms, malware, Trojan horses or other harmful or destructive content; + * the Content is not spam, is not machine- or randomly-generated, and does not contain unethical or unwanted commercial content designed to drive traffic to third party sites or boost the search engine rankings of third party sites, or to further unlawful acts (such as phishing) or mislead recipients as to the source of the material (such as spoofing); + * the Content is not pornographic, does not contain threats or incite violence, and does not violate the privacy or publicity rights of any third party; + * your content is not getting advertised via unwanted electronic messages such as spam links on newsgroups, email lists, blogs and web sites, and similar unsolicited promotional methods; + * your content is not named in a manner that misleads your readers into thinking that you are another person or company; and + * you have, in the case of Content that includes computer code, accurately categorized and/or described the type, nature, uses and effects of the materials, whether requested to do so by %{company_name} or otherwise. + + + + ## [3. User Content License](#3) + + User contributions are licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License](http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_US). Without limiting any of those representations or warranties, %{company_name} has the right (though not the obligation) to, in %{company_name}’s sole discretion (i) refuse or remove any content that, in %{company_name}’s reasonable opinion, violates any %{company_name} policy or is in any way harmful or objectionable, or (ii) terminate or deny access to and use of the Website to any individual or entity for any reason, in %{company_name}’s sole discretion. %{company_name} will have no obligation to provide a refund of any amounts previously paid. + + + + + ## [4. Payment and Renewal](#4) + + ### General Terms + + Optional paid services or upgrades may be available on the Website. When utilizing an optional paid service or upgrade, you agree to pay %{company_name} the monthly or annual subscription fees indicated. Payments will be charged on a pre-pay basis on the day you begin utilizing the service or upgrade and will cover the use of that service or upgrade for a monthly or annual subscription period as indicated. These fees are not refundable. + + ### Automatic Renewal + + Unless you notify %{company_name} before the end of the applicable subscription period that you want to cancel a service or upgrade, your subscription will automatically renew and you authorize us to collect the then-applicable annual or monthly subscription fee (as well as any taxes) using any credit card or other payment mechanism we have on record for you. Subscriptions can be canceled at any time. + + + + ## [5. Services](#5) + + ### Hosting, Support Services + + Optional Hosting and Support services may be provided by %{company_name} under the terms and conditions for each such service. By signing up for a Hosting/Support or Support services account, you agree to abide by such terms and conditions. + + + + ## [6. Responsibility of Website Visitors](#6) + + %{company_name} has not reviewed, and cannot review, all of the material, including computer software, posted to the Website, and cannot therefore be responsible for that material’s content, use or effects. By operating the Website, %{company_name} does not represent or imply that it endorses the material there posted, or that it believes such material to be accurate, useful or non-harmful. You are responsible for taking precautions as necessary to protect yourself and your computer systems from viruses, worms, Trojan horses, and other harmful or destructive content. The Website may contain content that is offensive, indecent, or otherwise objectionable, as well as content containing technical inaccuracies, typographical mistakes, and other errors. The Website may also contain material that violates the privacy or publicity rights, or infringes the intellectual property and other proprietary rights, of third parties, or the downloading, copying or use of which is subject to additional terms and conditions, stated or unstated. %{company_name} disclaims any responsibility for any harm resulting from the use by visitors of the Website, or from any downloading by those visitors of content there posted. + + + + ## [7. Content Posted on Other Websites](#7) + + We have not reviewed, and cannot review, all of the material, including computer software, made available through the websites and webpages to which %{company_domain} links, and that link to %{company_domain}. %{company_name} does not have any control over those non-%{company_domain} websites and webpages, and is not responsible for their contents or their use. By linking to a non-%{company_domain} website or webpage, %{company_name} does not represent or imply that it endorses such website or webpage. You are responsible for taking precautions as necessary to protect yourself and your computer systems from viruses, worms, Trojan horses, and other harmful or destructive content. %{company_name} disclaims any responsibility for any harm resulting from your use of non-%{company_domain} websites and webpages. + + + + ## [8. Copyright Infringement and DMCA Policy](#8) + + As %{company_name} asks others to respect its intellectual property rights, it respects the intellectual property rights of others. If you believe that material located on or linked to by %{company_domain} violates your copyright, and if this website resides in the USA, you are encouraged to notify %{company_name} in accordance with %{company_name}’s [Digital Millennium Copyright Act](http://en.wikipedia.org/wiki/Digital_Millennium_Copyright_Act) ("DMCA") Policy. %{company_name} will respond to all such notices, including as required or appropriate by removing the infringing material or disabling all links to the infringing material. %{company_name} will terminate a visitor’s access to and use of the Website if, under appropriate circumstances, the visitor is determined to be a repeat infringer of the copyrights or other intellectual property rights of %{company_name} or others. In the case of such termination, %{company_name} will have no obligation to provide a refund of any amounts previously paid to %{company_name}. + + + + ## [9. Intellectual Property](#9) + + This Agreement does not transfer from %{company_name} to you any %{company_name} or third party intellectual property, and all right, title and interest in and to such property will remain (as between the parties) solely with %{company_name}. %{company_name}, %{company_domain}, the %{company_domain} logo, and all other trademarks, service marks, graphics and logos used in connection with %{company_domain}, or the Website are trademarks or registered trademarks of %{company_name} or %{company_name}’s licensors. Other trademarks, service marks, graphics and logos used in connection with the Website may be the trademarks of other third parties. Your use of the Website grants you no right or license to reproduce or otherwise use any %{company_name} or third-party trademarks. + + + + ## [10. Advertisements](#10) + + %{company_name} reserves the right to display advertisements on your content unless you have purchased an Ad-free Upgrade or a Services account. + + + + ## [11. Attribution](#11) + + %{company_name} reserves the right to display attribution links such as ‘Powered by %{company_domain},’ theme author, and font attribution in your content footer or toolbar. Footer credits and the %{company_domain} toolbar may not be removed regardless of upgrades purchased. + + + + ## [12. Changes](#12) + + %{company_name} reserves the right, at its sole discretion, to modify or replace any part of this Agreement. It is your responsibility to check this Agreement periodically for changes. Your continued use of or access to the Website following the posting of any changes to this Agreement constitutes acceptance of those changes. %{company_name} may also, in the future, offer new services and/or features through the Website (including, the release of new tools and resources). Such new features and/or services shall be subject to the terms and conditions of this Agreement. + + + + ## [13. Termination](#13) + + %{company_name} may terminate your access to all or any part of the Website at any time, with or without cause, with or without notice, effective immediately. If you wish to terminate this Agreement or your %{company_domain} account (if you have one), you may simply discontinue using the Website. All provisions of this Agreement which by their nature should survive termination shall survive termination, including, without limitation, ownership provisions, warranty disclaimers, indemnity and limitations of liability. + + + + ## [14. Disclaimer of Warranties](#14) + + The Website is provided "as is". %{company_name} and its suppliers and licensors hereby disclaim all warranties of any kind, express or implied, including, without limitation, the warranties of merchantability, fitness for a particular purpose and non-infringement. Neither %{company_name} nor its suppliers and licensors, makes any warranty that the Website will be error free or that access thereto will be continuous or uninterrupted. If you’re actually reading this, here’s [a treat](http://www.newyorker.com/online/blogs/shouts/2012/12/the-hundred-best-lists-of-all-time.html). You understand that you download from, or otherwise obtain content or services through, the Website at your own discretion and risk. + + + + ## [15. Limitation of Liability](#15) + + In no event will %{company_name}, or its suppliers or licensors, be liable with respect to any subject matter of this agreement under any contract, negligence, strict liability or other legal or equitable theory for: (i) any special, incidental or consequential damages; (ii) the cost of procurement for substitute products or services; (iii) for interruption of use or loss or corruption of data; or (iv) for any amounts that exceed the fees paid by you to %{company_name} under this agreement during the twelve (12) month period prior to the cause of action. %{company_name} shall have no liability for any failure or delay due to matters beyond their reasonable control. The foregoing shall not apply to the extent prohibited by applicable law. + + + + ## [16. General Representation and Warranty](#16) + + You represent and warrant that (i) your use of the Website will be in strict accordance with the %{company_name} [Privacy Policy](/privacy), [Community Guidelines](/guidelines), with this Agreement and with all applicable laws and regulations (including without limitation any local laws or regulations in your country, state, city, or other governmental area, regarding online conduct and acceptable content, and including all applicable laws regarding the transmission of technical data exported from the country in which this website resides or the country in which you reside) and (ii) your use of the Website will not infringe or misappropriate the intellectual property rights of any third party. + + + + ## [17. Indemnification](#17) + + You agree to indemnify and hold harmless %{company_name}, its contractors, and its licensors, and their respective directors, officers, employees and agents from and against any and all claims and expenses, including attorneys’ fees, arising out of your use of the Website, including but not limited to your violation of this Agreement. + + + + ## [18. Miscellaneous](#18) + + This Agreement constitutes the entire agreement between %{company_name} and you concerning the subject matter hereof, and they may only be modified by a written amendment signed by an authorized executive of %{company_name}, or by the posting by %{company_name} of a revised version. Except to the extent applicable law, if any, provides otherwise, this Agreement, any access to or use of the Website will be governed by the laws of the state of California, U.S.A., excluding its conflict of law provisions, and the proper venue for any disputes arising out of or relating to any of the same will be the state and federal courts located in San Francisco County, California. Except for claims for injunctive or equitable relief or claims regarding intellectual property rights (which may be brought in any competent court without the posting of a bond), any dispute arising under this Agreement shall be finally settled in accordance with the Comprehensive Arbitration Rules of the Judicial Arbitration and Mediation Service, Inc. (“JAMS”) by three arbitrators appointed in accordance with such Rules. The arbitration shall take place in San Francisco, California, in the English language and the arbitral decision may be enforced in any court. The prevailing party in any action or proceeding to enforce this Agreement shall be entitled to costs and attorneys’ fees. If any part of this Agreement is held invalid or unenforceable, that part will be construed to reflect the parties’ original intent, and the remaining portions will remain in full force and effect. A waiver by either party of any term or condition of this Agreement or any breach thereof, in any one instance, will not waive such term or condition or any subsequent breach thereof. You may assign your rights under this Agreement to any party that consents to, and agrees to be bound by, its terms and conditions; %{company_name} may assign its rights under this Agreement without condition. This Agreement will be binding upon and will inure to the benefit of the parties, their successors and permitted assigns. + + This document is CC-BY-SA. It was last updated May 31, 2013. + + Originally adapted from the [WordPress Terms of Service](http://en.wordpress.com/tos/). privacy_topic: title: "隱私政策" + body: | + + + ## [我們收集什麼信息?](#collect) + + 我們從你在我們站點註冊開始從你那開始收集信息,並收集關於你在論壇的閲讀和寫作的數據,並評估分享的內容。 + + 當在我們站點註冊時,你可能被要求輸入你的名字和郵件地址。然而你可以在不用註冊的情況下訪問站點。你的郵件地將通過一個獨一無二的連結驗證。如果連結被訪問了,我們就知道你控制了該郵件地址。 + + 當已註冊和發帖時,我們記錄發佈帖子時的 IP 地址。我們也可能保留伺服器日誌,其中包括了每一個向我們伺服器的請求。 + + + + ## [我們如何使用你的信息?](#use) + + 從你那收集的任何數據將以以下方式使用: + + * 改進你的個人體驗 — 你的信息幫助我們更好地滿足你的個人需求。 + * 改進我們的站點 — 我們基于信息和我們從你那收到的反饋不斷地試圖改進我們的站點。 + * 改善我們的客戶服務 — 你的信息幫助我們更有效地回應用戶服務請求和支持。 + * 用於發送階段性的郵件 — 你提供的郵件地址可能用於接受信息、你想看到的通知或與你用戶名有關的回覆和詢問,或是其他的請求和問題。 + + + + ## [我們如何保護你的信息?](#protect) + + 我們實現了一系列的安全措施保證你輸入、提交或者訪問你個人信息的數據安全。 + + + + ## [數據保存政策是什麼?](#data-retention) + + 我們將善意地: + + * 保存 90 天內的所有向伺服器的包含 IP 地址的請求。 + * 保存 5 年內已註冊用戶和與他們的帖子有關的 IP 地址。 + + + + ## [我們使用 Cookie 嗎?](#cookies) + + 是的。Cookie 是網站或它的服務商通過網頁瀏覽器存儲在你電腦硬碟上的小檔案(如果你同意)。這些 Cookie 使站點能分辨你的瀏覽器,並且,如果你註冊了一個賬戶,與你的註冊賬戶關聯。 + + 我們使用 Cookie 為之後的訪問和編譯一小段關於站點流量和交互的數據來判斷並保存你的個人設置,這樣我們可以在之後提供更好的站點體驗和工具。我們可能使用第三方服務商來幫助我們更好地理解我們的站點訪客。這些服務商是不允許代表我們使用收集的信息,除非是在幫助我們執行和改進我們的站點。 + + + + ## [我們會在站外提供任何信息嗎?](#disclose) + + 我們絶不銷售、教育或任何向外轉移你個人信息的行為。這不包括幫助我們管理站點、改進站定或給你提供服務的第三方團體,這些團體需要保證對這些信息保密。當我們認為提交你的信息符合法律、我們的站點政策或保護我們或其他人的權利、知識產權或安全時,我們也可能提交你的信息。然而,非個人訪問信息可能供其他團體使用,用於市場、廣告或其他用途。 + + + + ## [第三方連結](#third-party) + + 偶爾地,根據我們的判斷,我們可能在我們的站點上包括或提供第三方團體的產品或服務。這些第三方站點用於獨立和不同的隱私政策。因此我們對連結到的站點或活動沒有責任和權利。儘管如此,我們尋求保護我們的整個站點冰鞋歡迎你給這些站點反饋。 + + + + ## [兒童在綫隱私保護法案合規](#coppa) + + 我們的站點、產品和服務提供給 13 歲以上的人們。如果伺服器位於美國,並且你小於 13 歲,根據[兒童在綫隱私保護法案合規](https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act),不要使用這個站點。 + + + + ## [僅用於在綫隱私政策](#online) + + 這個線上隱私政策只適用於通過我們站點收集到的信息,並不包括線下收集的信息。 + + + + ## [你的同意](#consent) + + 你使用站點的同時,代表你同意了我們網站的隱私政策。 + + + + ## [隱私政策的更改](#changes) + + 如果我們決定更改我們的隱私政策,我們將在此頁更新這些改變。 + + 文檔以 CC-BY-SA 發佈。最後更新時間為2013年5月31日。 + badges: + editor: + name: 編輯 + description: 首次編輯帖子 + long_description: | + 該徽章授予給第一次編輯自己帖子的你。雖然你不能永遠在編輯自己的帖子,但是編輯他們總是一個好辦法——你可以改進你的帖子、修正小錯誤,或者是增補你原來沒有寫的內容。編輯能讓你的帖子質量變得更好! + basic_user: + name: 初級用戶 + description: 授予所有常用社群功能 + long_description: | + 該徽章授予給用戶等級達到 1 的成員。感謝你在社群裡花了一些時間並且閲讀了一些帖子,瞭解了我們的社群。你的新用戶限制已經被取消;並且你已經被授予了所有基本的社群權限,必須個人消息、標記、維基編輯和發佈多張圖片和多個連結的能力。 + member: + name: 成員 + description: 授予邀請、群組消息和更多的贊 + long_description: | + 該徽章授予給達到用戶等級 2 的你。感謝你在社群待了幾周,真正融入到了社群中。你現在可以在你的用戶頁或者主題中邀請他人或者創建群組消息了。每天你也可以點更多次讚了。 + regular: + name: 活躍用戶 + description: 授予重分類、重命名、跟蹤連結、維基功能和更多的贊 + long_description: | + 該徽章授予給達到用戶等級 3 的你。感謝你在這幾個月持續地參與社群。你現在是我們之中最活躍的讀者之一了,你持續的貢獻極大地幫助了我們的社群。你現在可以社群待了幾周,真正融入到了社群中。你現在可以重新分類或者重命名主題、使用能力強大的垃圾標記功能以及訪問隱藏的貴賓分類了。而且每天你可以點更多次讚了。 + leader: + name: 資深 + description: 授予全局編輯、固定、鎖定、存檔、分割、合併和更多的贊 + long_description: | + 該徽章授予給達到用戶等級 4 的你。你被管理人員選作了社群的領導力量,你用你的行動和言辭為社群樹立了正面的形象。你現在可以修改所有帖子,使用常見的版主的主題管理功能,比如置頂、鎖定、隱藏、存檔、分割和合併功能。你每天可以點更多的讚了。 + welcome: + name: 歡迎 + description: 得到一個贊 + long_description: | + 該徽章授予給帖子收到了第一個讚的成員。恭喜,有社群成員發現你發表的內容有意思、酷炫或者有用! + autobiographer: + name: 自傳作者 + description: 已填寫用戶資料信息 + long_description: | + 該徽章授予給填寫了用戶頁面並選擇了用戶頭像的你。讓社群成員們多瞭解你一點以及你感興趣的內容,能幫助我們打造一個更好、更團結的社群。讓我們一起努力! + anniversary: + name: 年度紀念日 + description: 一年活躍用戶,至少發了一個帖子 + long_description: | + 該徽章授予給在社群註冊一年並超至少發佈了一個帖子的你。感謝你的持續關注和對我們社群的貢獻!我們希望你繼續參與我們的社群。 + nice_post: + name: 不錯的回覆 + description: 回覆被讚了 10 次 + long_description: | + 該徽章授予給回覆被讚了 10 次的你。你的回覆給社群成員們留下了印象,並且你推動了討論的進程! + good_post: + name: 很好的回覆 + description: 回覆被讚了 25 次 + long_description: | + 該徽章授予給回覆被讚了 25 次的你。你的回覆很傑出,這個討論對每個人都變得更有意義了! + great_post: + name: 精彩的回覆 + description: 回覆被讚了 50 次 + long_description: | + 該徽章授予給回覆被讚了 50 次的你。哇!你的回覆很有啟發、引經據典、令人冷俊不禁或者十分有內涵,整個社群都喜歡它。 + nice_topic: + name: 不錯的主題 + description: 主題被讚了 10 次 + long_description: | + 該徽章授予給主題獲得 10 個讚的你。嗨,你開啟了一個社群成員覺得有意思的討論! + good_topic: + name: 很好的主題 + description: 主題被讚了 25 次 + long_description: | + 該徽章授予給主題獲得 25 個讚的你。你開啟了一個有意義的主題,整個社群都在積極響應,而且大家喜歡你的主題! + great_topic: + name: 精彩的主題 + description: 主題被讚了 50 次 + long_description: | + 該徽章授予給主題獲得 50 個讚的你。你開啟了一個引人入勝的主題,整個社群都沉浸于討論之中。 + nice_share: + name: 不錯的分享 + description: 分享了一個有 25 個獨立訪問者的帖子 + long_description: | + 該徽章授予給分享連結給 25 個其他訪客的你。感謝你廣而告之我們的討論,和對這個社群的幫助。 + good_share: + name: 很棒的分享 + description: 分享了一個有 300 個獨立訪問者的帖子 + long_description: | + 該徽章授予給分享連結給 300 個其他訪客的你。幹得漂亮!你把一個有意思的討論介紹給了許多新的朋友,並且幫助社群前進了一步。 + great_share: + name: 精彩的分享 + description: 分享了一個有 1000 個獨立訪問者的帖子 + long_description: |+ + 該徽章授予給分享連結給 1000 個其他訪客的你。哇!你把一個有意思的討論推廣給了廣大的讀者們,並且幫助社群前進了一大步! + + first_like: + name: 首次贊 + description: 已讚過了一個帖子 + long_description: | + 該徽章授予給第一次使用 :heart: 按鈕讚了帖子的成員。給帖子點贊是一個極好的讓社群成員知道他們的帖子有意思、有用、酷炫或者好玩的方法。分享愛! + first_flag: + name: 首次標記 + description: 已標記過了一個帖子 + long_description: | + 該徽章授予給第一次標記帖子的你。標記是幫助我們幫助社群保持健康、合宜的工具。如果你注意到哪個帖子需要版主的注意,不用在乎什麼原因,直接標記。如果你注意到別人帖子裡的某個問題,你也可用標記功能發送私信給該成員。如果你發現了問題,:flag_black: 標記吧! + promoter: + name: 推廣者 + description: 已邀請了 1 個用戶 + long_description: | + 該徽章授予給邀請他人加入社群的你。你曾使用了用戶頁面的邀請按鈕或主題底部的邀請按鈕。邀請對某個討論感興趣的朋友是引介新人的好辦法,非常感謝! + campaigner: + name: 活動家 + description: 已邀請了 3 個初級用戶 + long_description: |+ + 該徽章授予給邀請了 3 人加入社群的你,你的朋友在站點上度過了很長的時間,已經成為了基礎用戶。活躍的社區需要新鮮的血液日常參與,併為交流帶來多元視點。 + + champion: + name: 外交官 + description: 已邀請了 5 個成員 + long_description: | + 該徽章授予給邀請了 5 人加入社群的你,你的朋友在站點上度過了很長的時間,已經成為了成員。哇!感謝你幫助社群成長,社群因此變得更多元了! + first_share: + name: 首次分享 + description: 已分享了一個帖子 + long_description: | + 該徽章授予給第一次用分享按鈕分享了回覆或者主題的連結的成員。分享連結是一個極好的方式向外部世界展示有趣的討論的方法,並且能推動社群增長。 + first_link: + name: 首個連結 + description: 已連結了另一個主題 + long_description: | + 該徽章授予給第一次連結到另一個主題的你。聯結主題會在各個主題的右側顯示連結和標題,這可以幫助閲讀者迅速地找到相關討論。多連結一些主題吧! + first_quote: + name: 首次引用 + description: 已引用過一個帖子 + long_description: | + 該徽章授予給第一次在回覆中引用帖子的你。在你的回覆中引用之前帖子中的相關的段落將把主題關聯在一起並切題。只要選中別的帖子中的任何文字,然後點擊回覆按鈕將可以引用啦。多引用一些吧! + read_guidelines: + name: 閲讀指引 + description: 閲讀社群指引 + long_description: | + 該徽章授予給閲讀了社群指引的你。遵守和分享簡單的指引能讓我們打造一個穩定、有趣和可持續的社群。永遠記住別人,一個和你有很多共同點的人,就在屏幕的那一側。友好一些! + reader: + name: 讀者 + description: 閲讀了有至少 100 個回覆的主題中的所有回覆 + long_description: | + 該徽章授予給第一次閲讀了超過 100 個回覆的長主題的你。仔細地閲讀對話內容能讓你關注到討論的中心,理解不同的觀點,而且能幫助我們打造更有趣的對話情景。你讀得越多,對話的效果就會越好。就如我們常說的那般,閲讀是最重要的! :slight_smile: + popular_link: + name: 流行連結 + description: 分享的連結被點擊了 50 次 + long_description: | + 該徽章授予給分享的連結被點擊過 50 次的你。感謝你貼出了有用的連結,這讓討論的情節更形象了! + hot_link: + name: 熱門連結 + description: 分享的連結被點擊了 300 次 + long_description: | + 該徽章授予給分享的連結被點擊過 300 次的你。感謝你貼出了精彩的連結,這推進了討論的進程,並且裝點了討論! + famous_link: + name: 著名連結 + description: 分享的連結被點擊了 1000 次 + long_description: | + 該徽章授予給分享的連結被點擊過 1000 次的你。哇!你貼出的連結明顯地推動了交流,它提供了重要的細節、上下文和其他信息,幹得好! + appreciated: + name: 感謝 + description: 有 20 個帖子都被讚了 1 次 + long_description: | + 該徽章授予給 20 個不同的帖子都收到了至少 1 個讚的你。社群感謝你對討論的貢獻! + respected: + name: 尊敬 + description: 有 100 個帖子都被讚了 2 次 + long_description: | + 該徽章授予給 100 個不同的帖子都收到了至少 2 個讚的你。社群越來越尊重你在討論中的貢獻了。 + admired: + name: 敬仰 + description: 有 300 個帖子都被讚了 5 次 + long_description: | + 該徽章授予給 300 個不同的帖子都收到了至少 5 個讚的你。哇!社群敬仰你在討論中頻繁和高質量的貢獻。 + out_of_love: + name: 熱情 + description: 1 天內讚了 50 次 + long_description: | + 該徽章授予給一天內讚了 50 次的你。別忘記休息一下。讚你喜歡的帖子能鼓勵成員不斷改進討論的內容。 + higher_love: + name: "激情\b" + description: 5 天都讚過 50 次 + long_description: | + 該徽章授予給 5 天讚過 50 次的你。感謝你每天都花點時間鼓勵討論的進行! + crazy_in_love: + name: 狂熱 + description: 20 天都讚過 50 次 + long_description: | + 該徽章授予給 20 天讚過 50 次的你。哇!你為社群成員們樹立了一個令人鼓舞的模範! + thank_you: + name: 感謝你 + description: 有 20 個被讚的帖子,給出過 10 個贊 + long_description: | + 該徽章授予給收到了 20 個贊,且讚過別人至少 10 次的你。當別人讚你的帖子的時候,你也找機會贊別人的帖子。 + gives_back: + name: 回饋 + description: 有 100 個被讚的帖子,給出過 100 個贊 + long_description: | + 該徽章授予給收到了 100 個贊,且讚過別人至少 100 次的你。感謝你分享感激! + empathetic: + name: 感性 + description: 有 500 個被讚的帖子,給出過 1000 個贊 + long_description: | + 該徽章授予給收到了 500 個贊,且讚過別人至少 1000 次的你。哇!你是一個富有同情心且會換位思考的模範。 :two_hearts: + first_emoji: + name: 首個表情 + description: 在帖子中使用表情符號 + long_description: | + 該徽章授予給第一次在帖子中使用 Emoji 的你 :thumbsup:。Emoji 讓你在帖子中表達快樂 :smiley:、悲傷 :anguished:、憤怒 :angry: 以及任何東西 :sunglasses:。輸入 :(冒號)或在編輯器中的 Emoji 工具欄中選擇吧 :ok_hand: + first_mention: + name: 首次提及 + description: 在帖子中提到用戶 + long_description: 該徽章授予給第一次在帖子中@別人的你。每個提及都將通知對方,讓他們知道你發了貼。輸入 @ 提及任何用戶,如果可以的話,也可以提及群組——這是個獲得他們注意的好辦法。 + first_onebox: + name: 首個Onebox + description: 發佈過 oneboxed 連結 + long_description: 該徽章授予給第一次在空行中發錶鏈接的你,連結將被展開成 onebox。其中有連結摘要、標題和(如果有)圖片。 + first_reply_by_email: + name: 首次郵件回覆 + description: 通過郵件回覆 + long_description: | + 該徽章授予給第一次通過郵件回覆的你 :e-mail:。 admin_login: success: "已發送郵件" error: "錯誤" email_input: "管理者郵件" submit_button: "送出電子郵件" + discourse_hub: + access_token_problem: "告訴管理員:請更新站點設置,應使用正確的 discourse_org_access_key。" performance_report: + initial_post_raw: 這個主題將用來展示網站每日性能報告。 initial_topic_title: 網站效能報表 - time: - <<: *datetime_formats + topic_invite: + user_exists: "抱歉,用戶已經被邀請了。你可能只想邀請用戶參與主題一次。" + tags: + title: "標籤" + staff_tag_disallowed: "“%{tag}”只可由管理人員使用。" + staff_tag_remove_disallowed: "“%{tag}”只可由管理人員刪除。" + rss_by_tag: "主題標籤 %{tag}" + finish_installation: + congratulations: "祝賀,你已經安裝好了 Discourse!" + register: + button: "註冊" + title: "註冊管理員賬戶" + help: "註冊新賬戶以開始" + no_emails: "不幸的是,在嚮導中你沒有設置管理員郵件地址,所以完善配置可能有點困難。" + confirm_email: + title: "配置你的郵件" + message: "我們發送了一封激活郵件到%{email}。請按照郵件中的步驟來激活你的帳號。
如果你沒有收到郵件,請檢查你正確設置了 Discourse 郵件配置,然後查看你的垃圾郵件收件箱。
" + resend_email: + title: "重發激活郵件" + message: "我們重發了激活郵件至%{email}" + safe_mode: + title: "進入安全模式" + description: "安全模式讓你的站點不載入插件或站點自定義設置。" + no_customizations: "禁止所以站點自定義" + only_official: "禁用非官方插件" + no_plugins: "禁用所以插件" + enter: "進入安全模式" + wizard: + title: "Discourse 安裝" + step: + locale: + title: "歡迎來到 Discourse!" + fields: + default_locale: + description: "你的社群主要使用什麼語言?" + forum_title: + title: "名字" + description: "名字就像遠方可見的路標一樣,訪客“首先”將看到這個社群的名字。你起的名字和標題怎樣描述了你的社群?" + fields: + title: + label: "你社群的名字" + placeholder: "小明的論壇" + site_description: + label: "用一句簡短的話描述你的社群" + placeholder: "小明和他的朋友討論酷東西的論壇" + introduction: + title: "介紹" + fields: + welcome: + label: "歡迎主題" + description: "
你將怎麼在一分鐘內向陌生人描述你的社群?
你的歡迎主題是新訪客將先看到的東西。把它想象為一段“電梯宣傳”或者“使命聲明”。
" + one_paragraph: "請限制你的歡迎消息至一段話。" + privacy: + title: "訪問" + description: "你的社群對所有人可見或者需要限製為會員許可、邀請許可或者審核許可?如果你願意,你可以將其設為私密,然後再切換至公開。
記住你永遠可以在主題中邀請別人,或者從你的用戶頁面裡也行。
" + fields: + privacy: + choices: + open: + label: "公開" + description: "任何人都可訪問社群,可以創建賬戶" + restricted: + label: "私密" + description: "只有我邀請或審核通過的人可以訪問社群" + contact: + title: "聯繫" + fields: + contact_email: + label: "郵件" + placeholder: "name@example.com" + description: "社群的負責人或小組的郵件地址。將用來接收關於未處理標記和安全更新的緊急通知,並顯示在關於頁面上作為緊急聯繫的方式。" + contact_url: + label: "網頁" + placeholder: "http://www.example.com/contact-us" + description: "你或者你的組織平時用於聯絡的網頁。將被顯示在關於頁面中。" + site_contact: + label: "自動消息" + description: "所有自動發送自 Discourse 的私人消息將以該用戶的名義發送。最重要的是,這個用戶將被指定為發送給每個新用戶的歡迎消息的發送人。" + corporate: + title: "組織" + description: "這些名字將顯示于隱私策略和服務條款中,你可以隨時在工作人員分類中編輯他們。如果你沒有公司,你可以跳過這個步驟。" + fields: + company_short_name: + label: "公司名(短)" + placeholder: "國際科技" + company_full_name: + label: "公司名(全)" + placeholder: "國際科技有限公司。" + company_domain: + label: "公司域名名字" + placeholder: "initech.com" + colors: + title: "主題" + fields: + theme_id: + description: "你喜歡亮色還是暗色的顏色方案?你永遠可以在管理-自定義中修改站點的觀感。" + choices: + default: + label: "簡潔亮" + dark: + label: "簡潔黑" + logos: + title: "標誌" + fields: + logo_url: + label: "主要標誌" + description: "在你站點左上角出現的小號標誌圖片,應為一個長方形。" + logo_small_url: + label: "緊湊 Logo" + description: "站點標誌的緊湊版本,在向下滾動時出現在左上角。用正方形的圖片。" + icons: + title: "表徵圖" + fields: + favicon_url: + label: "小表徵圖" + description: "瀏覽器中你站點顯示的表徵圖,要在小尺寸的情況下表現出色,例如 32px X 32px。" + apple_touch_icon_url: + label: "大表徵圖" + description: "現代設備中你站點顯示的表徵圖,要在大一點尺寸的情況下表現出色。推薦的尺寸至少要達到144px X 144px。" + homepage: + description: "我們推薦在你的主頁顯示最新主題,但是如果你喜歡,你也可以選擇顯示分類(一組主題)。" + title: "主頁" + fields: + homepage_style: + choices: + latest: + label: "最新主題" + categories: + label: "分類" + emoji: + title: "Emoji" + description: "你喜歡你的社群使用哪一種 Emoji 樣式?你永遠可以在管理-自定義-Emoji中增加更多的定製 Emoji。" + invites: + title: "邀請工作人員" + description: "你快做完啦!讓我們邀請一些工作人員來幫助你創建一些討論主題以方便你發佈社群。" + finished: + title: "你的 Discourse 已經準備就緒!" + description: | +如果你覺得需要修改這些設置,訪問管理員分塊;你可以在站點菜單找到扳手表徵圖旁找到。
+祝你玩得開心,還有祝你建設新社區好運!
activemodel: errors: <<: *errors diff --git a/config/routes.rb b/config/routes.rb index 49a9ae94baa..11ae9d435f8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,7 +7,7 @@ require_dependency "permalink_constraint" # This used to be User#username_format, but that causes a preload of the User object # and makes Guard not work properly. -USERNAME_ROUTE_FORMAT = /[\w.\-]+/ unless defined? USERNAME_ROUTE_FORMAT +USERNAME_ROUTE_FORMAT = /[\w.\-]+?/ unless defined? USERNAME_ROUTE_FORMAT BACKUP_ROUTE_FORMAT = /.+\.(sql\.gz|tar\.gz|tgz)/i unless defined? BACKUP_ROUTE_FORMAT @@ -20,6 +20,7 @@ Discourse::Application.routes.draw do post "webhooks/sendgrid" => "webhooks#sendgrid" post "webhooks/mailjet" => "webhooks#mailjet" post "webhooks/mandrill" => "webhooks#mandrill" + post "webhooks/sparkpost" => "webhooks#sparkpost" if Rails.env.development? mount Sidekiq::Web => "/sidekiq" @@ -36,6 +37,12 @@ Discourse::Application.routes.draw do end end + get "finish-installation" => "finish_installation#index" + get "finish-installation/register" => "finish_installation#register" + post "finish-installation/register" => "finish_installation#register" + get "finish-installation/confirm-email" => "finish_installation#confirm_email" + put "finish-installation/resend-email" => "finish_installation#resend_email" + resources :directory_items get "site" => "site#site" @@ -45,11 +52,19 @@ Discourse::Application.routes.draw do get "banner" get "emoji" end + + get "site/basic-info" => 'site#basic_info' + get "site_customizations/:key" => "site_customizations#show" - resources :forums get "srv/status" => "forums#status" + get "wizard" => "wizard#index" + get "wizard/qunit" => "wizard#qunit" + get 'wizard/steps' => 'steps#index' + get 'wizard/steps/:id' => "wizard#index" + put 'wizard/steps/:id' => "steps#update" + namespace :admin, constraints: StaffConstraint.new do get "" => "admin#index" @@ -136,6 +151,7 @@ Discourse::Application.routes.draw do get "/incoming/:id/raw" => "email#raw_email" get "/incoming/:id" => "email#incoming" get "preview-digest" => "email#preview_digest" + get "send-digest" => "email#send_digest" post "handle_mail" end end @@ -160,6 +176,7 @@ Discourse::Application.routes.draw do get "customize/permalinks" => "permalinks#index", constraints: AdminConstraint.new get "customize/embedding" => "embedding#show", constraints: AdminConstraint.new put "customize/embedding" => "embedding#update", constraints: AdminConstraint.new + get "flags" => "flags#index" get "flags/:filter" => "flags#index" post "flags/agree/:id" => "flags#agree" @@ -198,9 +215,17 @@ Discourse::Application.routes.draw do resources :api, only: [:index], constraints: AdminConstraint.new do collection do + get "keys" => "api#index" post "key" => "api#create_master_key" put "key" => "api#regenerate_key" delete "key" => "api#revoke_key" + + resources :web_hooks + get 'web_hook_events/:id' => 'web_hooks#list_events', as: :web_hook_events + get 'web_hooks/:id/events' => 'web_hooks#list_events' + get 'web_hooks/:id/events/bulk' => 'web_hooks#bulk_events' + post 'web_hooks/:web_hook_id/events/:event_id/redeliver' => 'web_hooks#redeliver_event' + post 'web_hooks/:id/ping' => 'web_hooks#ping' end end @@ -241,6 +266,8 @@ Discourse::Application.routes.draw do get "email/unsubscribed" => "email#unsubscribed", as: "email_unsubscribed" post "email/unsubscribe/:key" => "email#perform_unsubscribe", as: "email_perform_unsubscribe" + get "extra-locales/:bundle" => "extra_locales#show" + resources :session, id: USERNAME_ROUTE_FORMAT, only: [:create, :destroy, :become] do get 'become' collection do @@ -300,8 +327,8 @@ Discourse::Application.routes.draw do get "users/:username/messages/group/:group_name/archive" => "user_actions#private_messages", constraints: {username: USERNAME_ROUTE_FORMAT, group_name: USERNAME_ROUTE_FORMAT} get "users/:username.json" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT}, defaults: {format: :json} - get "users/:username" => "users#show", as: 'user', constraints: {username: USERNAME_ROUTE_FORMAT} - put "users/:username" => "users#update", constraints: {username: USERNAME_ROUTE_FORMAT} + get "users/:username" => "users#show", as: 'user', constraints: {username: USERNAME_ROUTE_FORMAT, format: /(json|html)/} + put "users/:username" => "users#update", constraints: {username: USERNAME_ROUTE_FORMAT}, defaults: { format: :json } get "users/:username/emails" => "users#check_emails", constraints: {username: USERNAME_ROUTE_FORMAT} get "users/:username/preferences" => "users#preferences", constraints: {username: USERNAME_ROUTE_FORMAT}, as: :email_preferences get "users/:username/preferences/email" => "users_email#index", constraints: {username: USERNAME_ROUTE_FORMAT} @@ -316,9 +343,7 @@ Discourse::Application.routes.draw do get "users/:username/preferences/card-badge" => "users#card_badge", constraints: {username: USERNAME_ROUTE_FORMAT} put "users/:username/preferences/card-badge" => "users#update_card_badge", constraints: {username: USERNAME_ROUTE_FORMAT} get "users/:username/staff-info" => "users#staff_info", constraints: {username: USERNAME_ROUTE_FORMAT} - get "users/:username/summary" => "users#summary", constraints: {username: USERNAME_ROUTE_FORMAT} - get "users/:username/invited" => "users#invited", constraints: {username: USERNAME_ROUTE_FORMAT} get "users/:username/invited_count" => "users#invited_count", constraints: {username: USERNAME_ROUTE_FORMAT} get "users/:username/invited/:filter" => "users#invited", constraints: {username: USERNAME_ROUTE_FORMAT} @@ -340,6 +365,9 @@ Discourse::Application.routes.draw do get "users/by-external/:external_id" => "users#show", constraints: {external_id: /[^\/]+/} get "users/:username/flagged-posts" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT} get "users/:username/deleted-posts" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT} + + get "users/:username/topic-tracking-state" => "users#topic_tracking_state", constraints: {username: USERNAME_ROUTE_FORMAT} + get "user-badges/:username.json" => "user_badges#username", constraints: {username: USERNAME_ROUTE_FORMAT}, defaults: {format: :json} get "user-badges/:username" => "user_badges#username", constraints: {username: USERNAME_ROUTE_FORMAT} @@ -357,11 +385,11 @@ Discourse::Application.routes.draw do post "uploads" => "uploads#create" # used to download original images - get "uploads/:site/:sha" => "uploads#show", constraints: { site: /\w+/, sha: /[a-f0-9]{40}/ } + get "uploads/:site/:sha(.:extension)" => "uploads#show", constraints: { site: /\w+/, sha: /\h{40}/, extension: /[a-z0-9\.]+/i } # used to download attachments - get "uploads/:site/original/:tree:sha" => "uploads#show", constraints: { site: /\w+/, tree: /(\w+\/)+/i, sha: /[a-f0-9]{40}/ } + get "uploads/:site/original/:tree:sha(.:extension)" => "uploads#show", constraints: { site: /\w+/, tree: /([a-z0-9]+\/)+/i, sha: /\h{40}/, extension: /[a-z0-9\.]+/i } # used to download attachments (old route) - get "uploads/:site/:id/:sha" => "uploads#show", constraints: { site: /\w+/, id: /\d+/, sha: /[a-f0-9]{16}/ } + get "uploads/:site/:id/:sha" => "uploads#show", constraints: { site: /\w+/, id: /\d+/, sha: /\h{16}/ } get "posts" => "posts#latest", id: "latest_posts" get "private-posts" => "posts#latest", id: "private_posts" @@ -370,16 +398,21 @@ Discourse::Application.routes.draw do get "posts/:username/deleted" => "posts#deleted_posts", constraints: {username: USERNAME_ROUTE_FORMAT} get "posts/:username/flagged" => "posts#flagged_posts", constraints: {username: USERNAME_ROUTE_FORMAT} - resources :groups do + resources :groups, id: USERNAME_ROUTE_FORMAT do get "posts.rss" => "groups#posts_feed", format: :rss get "mentions.rss" => "groups#mentions_feed", format: :rss + get 'activity' => "groups#show" + get 'activity/:filter' => "groups#show" get 'members' + get 'owners' get 'posts' get 'topics' get 'mentions' get 'messages' get 'counts' + get 'mentionable' + get 'logs' => 'groups#histories' member do put "members" => "groups#add_members" @@ -392,10 +425,6 @@ Discourse::Application.routes.draw do delete "admin/groups/:id/members" => "groups#remove_member", constraints: AdminConstraint.new put "admin/groups/:id/members" => "groups#add_members", constraints: AdminConstraint.new - # In case people try the wrong URL - get '/group/:id', to: redirect('/groups/%{id}') - get '/group/:id/members', to: redirect('/groups/%{id}/members') - resources :posts do put "bookmark" put "wiki" @@ -417,6 +446,9 @@ Discourse::Application.routes.draw do get 'notifications' => 'notifications#index' put 'notifications/mark-read' => 'notifications#mark_read' + # creating an alias cause the api was extended to mark a single notification + # this allows us to cleanly target it + put 'notifications/read' => 'notifications#mark_read' match "/auth/:provider/callback", to: "users/omniauth_callbacks#complete", via: [:get, :post] match "/auth/failure", to: "users/omniauth_callbacks#failure", via: [:get, :post] @@ -451,6 +483,8 @@ Discourse::Application.routes.draw do post "category/:category_id/notifications" => "categories#set_notifications" put "category/:category_id/slug" => "categories#update_slug" + get "categories_and_latest" => "categories#categories_and_latest" + get "c/:id/show" => "categories#show" get "c/:category_slug/find_by_slug" => "categories#find_by_slug" get "c/:parent_category_slug/:category_slug/find_by_slug" => "categories#find_by_slug" @@ -491,7 +525,6 @@ Discourse::Application.routes.draw do # Topics resource get "t/:id" => "topics#show" - post "t" => "topics#create" put "t/:id" => "topics#update" delete "t/:id" => "topics#destroy" put "t/:id/archive-message" => "topics#archive_message" @@ -529,6 +562,7 @@ Discourse::Application.routes.draw do # Topic routes get "t/id_for/:slug" => "topics#id_for_slug" + get "t/:slug/:topic_id/print" => "topics#show", format: :html, print: true, constraints: {topic_id: /\d+/} get "t/:slug/:topic_id/wordpress" => "topics#wordpress", constraints: {topic_id: /\d+/} get "t/:topic_id/wordpress" => "topics#wordpress", constraints: {topic_id: /\d+/} get "t/:slug/:topic_id/moderator-liked" => "topics#moderator_liked", constraints: {topic_id: /\d+/} @@ -558,6 +592,7 @@ Discourse::Application.routes.draw do get "t/:slug/:topic_id/:post_number" => "topics#show", constraints: {topic_id: /\d+/, post_number: /\d+/} get "t/:slug/:topic_id/last" => "topics#show", post_number: 99999999, constraints: {topic_id: /\d+/} get "t/:topic_id/posts" => "topics#posts", constraints: {topic_id: /\d+/}, format: :json + get "t/:topic_id/excerpts" => "topics#excerpts", constraints: {topic_id: /\d+/}, format: :json post "t/:topic_id/timings" => "topics#timings", constraints: {topic_id: /\d+/} post "t/:topic_id/invite" => "topics#invite", constraints: {topic_id: /\d+/} post "t/:topic_id/invite-group" => "topics#invite_group", constraints: {topic_id: /\d+/} @@ -581,12 +616,8 @@ Discourse::Application.routes.draw do resources :queued_posts, constraints: StaffConstraint.new get 'queued-posts' => 'queued_posts#index' - resources :invites do - collection do - get "upload" => "invites#check_csv_chunk" - post "upload" => "invites#upload_csv_chunk" - end - end + resources :invites + post "invites/upload_csv" => "invites#upload_csv" post "invites/reinvite" => "invites#resend_invite" post "invites/reinvite-all" => "invites#resend_all_invites" post "invites/link" => "invites#create_invite_link" @@ -614,6 +645,7 @@ Discourse::Application.routes.draw do delete "draft" => "draft#destroy" get "cdn_asset/:site/*path" => "static#cdn_asset", format: false + get "brotli_asset/*path" => "static#brotli_asset", format: false get "favicon/proxied" => "static#favicon", format: false @@ -631,6 +663,7 @@ Discourse::Application.routes.draw do get '/:tag_id' => 'tags#show', as: 'tag_show' get '/c/:category/:tag_id' => 'tags#show', as: 'tag_category_show' get '/c/:parent_category/:category/:tag_id' => 'tags#show', as: 'tag_parent_category_category_show' + get '/intersection/:tag_id/*additional_tag_ids' => 'tags#show', as: 'tag_intersection' get '/:tag_id/notifications' => 'tags#notifications' put '/:tag_id/notifications' => 'tags#update_notifications' put '/:tag_id' => 'tags#update' @@ -658,5 +691,16 @@ Discourse::Application.routes.draw do # special case for top root to: "list#top", constraints: HomePageConstraint.new("top"), :as => "top_lists" + root to: 'finish_installation#index', constraints: HomePageConstraint.new("finish_installation"), as: 'installation_redirect' + + get "/user-api-key/new" => "user_api_keys#new" + post "/user-api-key" => "user_api_keys#create" + post "/user-api-key/revoke" => "user_api_keys#revoke" + post "/user-api-key/undo-revoke" => "user_api_keys#undo_revoke" + + get "/safe-mode" => "safe_mode#index" + post "/safe-mode" => "safe_mode#enter", as: "safe_mode_enter" + get "*url", to: 'permalinks#show', constraints: PermalinkConstraint.new + end diff --git a/config/site_settings.yml b/config/site_settings.yml index 8d6128c3b6a..0a430713bb3 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -55,9 +55,17 @@ required: client: true default: '/images/default-favicon.ico' apple_touch_icon_url: '/images/default-apple-touch-icon.png' + default_opengraph_image_url: '' + twitter_summary_large_image_url: '' exclude_rel_nofollow_domains: default: '' type: list + company_short_name: + default: '' + company_full_name: + default: '' + company_domain: + default: '' basic: default_locale: @@ -71,6 +79,9 @@ basic: set_locale_from_accept_language_header: default: false validator: "AllowUserLocaleEnabledValidator" + categories_topics: + default: 20 + min: 5 suggested_topics: client: true default: 5 @@ -153,6 +164,10 @@ basic: - facebook - google+ - email + desktop_category_page_style: + client: true + enum: 'CategoryPageStyle' + default: 'categories_and_latest_topics' category_colors: client: true type: list @@ -215,9 +230,11 @@ basic: login: invite_only: + refresh: true client: true default: false login_required: + refresh: true client: true default: false must_approve_users: @@ -267,6 +284,8 @@ login: facebook_app_secret: default: '' regex: "^[a-f0-9]+$" + facebook_request_extra_profile_details: + default: false enable_github_logins: client: true default: false @@ -279,6 +298,7 @@ login: enable_sso: client: true default: false + sso_allows_all_return_paths: false enable_sso_provider: false verbose_sso_logging: false sso_url: @@ -369,7 +389,6 @@ users: email_token_valid_hours: default: 48 min: 1 - email_token_grace_period_hours: 0 purge_unactivated_users_grace_period_days: 14 public_user_custom_fields: type: list @@ -391,6 +410,14 @@ users: hide_user_profiles_from_public: default: false client: true + user_website_domains_whitelist: + default: '' + type: list + +groups: + enable_group_directory: + client: true + default: true posting: min_post_length: @@ -414,6 +441,9 @@ posting: max_post_length: client: true default: 32000 + topic_featured_link_enabled: + client: true + default: true body_min_entropy: 7 min_topic_title_length: client: true @@ -517,6 +547,11 @@ posting: default: '' refresh: true type: list + censored_pattern: + client: true + default: '' + refresh: true + type: regex enable_emoji: default: true client: true @@ -531,6 +566,9 @@ posting: approve_unless_trust_level: default: 0 enum: 'TrustLevelSetting' + approve_new_topics_unless_trust_level: + default: 0 + enum: 'TrustLevelSetting' notify_about_queued_posts_after: default: 24 min: 0 @@ -543,6 +581,12 @@ posting: choices: - 4-spaces-indent - code-fences + embed_truncate: + default: true + allowed_href_schemes: + client: true + default: '' + type: list email: email_time_window_mins: @@ -551,7 +595,11 @@ email: private_email_time_window_seconds: 20 email_posts_context: 5 digest_min_excerpt_length: 100 - digest_topics: 20 + digest_topics: + default: 5 + min: 1 + digest_posts: 3 + digest_other_topics: 5 delete_digest_email_after_days: 365 digest_suppress_categories: type: category_list @@ -559,6 +607,10 @@ email: disable_digest_emails: default: false client: true + email_accent_bg_color: "#2F70AC" + email_accent_fg_color: "#FFFFFF" + email_link_color: "#006699" + show_topic_featured_link_in_digest: false email_custom_headers: 'Auto-Submitted: auto-generated' email_subject: '[%{site_name}] %{optional_pm}%{optional_cat}%{topic_title}' reply_by_email_enabled: @@ -575,6 +627,7 @@ email: default: false validator: "POP3PollingEnabledSettingValidator" pop3_polling_ssl: true + pop3_polling_openssl_verify: true pop3_polling_period_mins: 5 pop3_polling_host: '' pop3_polling_port: 995 @@ -632,11 +685,12 @@ email: reset_bounce_score_after_days: 30 attachment_content_type_blacklist: type: list - default: "pkcs7" + default: "pkcs7|x-vcard" attachment_filename_blacklist: type: list default: "smime.p7s|signature.asc" - + enable_forwarded_emails: false + always_show_trimmed_content: false files: max_image_size_kb: @@ -647,7 +701,7 @@ files: default: 3072 authorized_extensions: client: true - default: 'jpg|jpeg|png|gif' + default: 'jpg|jpeg|png|gif|csv' refresh: true type: list crawl_images: @@ -690,7 +744,7 @@ files: enum: 'S3RegionSiteSetting' s3_upload_bucket: default: '' - regex: "^[a-z0-9-]+$" # can't use '.' when using HTTPS + regex: '^[a-z0-9\-\/]+$' # can't use '.' when using HTTPS s3_cdn_url: default: '' regex: '^https?:\/\/.+[^\/]$' @@ -721,7 +775,6 @@ files: client: true regex: '^((https?:)?\/)?\/.+[^\/]' shadowed_by_global: true - default_opengraph_image_url: '' allow_all_attachments_for_group_messages: false convert_pasted_images_to_hq_jpg: true convert_pasted_images_quality: @@ -742,6 +795,9 @@ trust: min_trust_to_edit_wiki_post: default: 1 enum: 'TrustLevelSetting' + min_trust_to_edit_post: + default: 0 + enum: 'TrustLevelSetting' min_trust_to_allow_self_wiki: default: 3 enum: 'TrustLevelSetting' @@ -825,9 +881,12 @@ security: onebox: enable_flash_video_onebox: false post_onebox_maxlength: 500 - onebox_domains_whitelist: + onebox_domains_blacklist: default: '' type: list + max_oneboxes_per_post: + default: 50 + client: true spam: add_rel_nofollow_to_user_content: true @@ -835,8 +894,8 @@ spam: cooldown_minutes_after_hiding_posts: 10 num_spam_flags_to_block_new_user: 3 num_users_to_block_new_user: 3 - num_tl3_flags_to_block_new_user: 6 - num_tl3_users_to_block_new_user: 4 + num_tl3_flags_to_block_new_user: 4 + num_tl3_users_to_block_new_user: 2 notify_mods_when_user_blocked: false flag_sockpuppets: false newuser_spam_host_threshold: 3 @@ -889,6 +948,9 @@ rate_limits: client: true shadowed_by_global: true default: 0 + max_prints_per_hour_per_user: + default: 5 + client: true developer: force_hostname: @@ -942,6 +1004,9 @@ developer: top_topics_formula_least_likes_per_post_multiplier: default: 3 min: 0 + rebake_old_posts_count: + default: 250 + min: 1 migrate_to_new_scheme: hidden: true default: false @@ -949,6 +1014,9 @@ developer: default: 500 client: true hidden: true + wizard_enabled: + default: true + hidden: true embedding: feed_polling_enabled: @@ -967,8 +1035,8 @@ embedding: embed_post_limit: default: 100 hidden: true - embed_truncate: - default: false + embed_title_scrubber: + default: '' hidden: true embed_whitelist_selector: default: '' @@ -1013,7 +1081,7 @@ backups: shadowed_by_global: true s3_backup_bucket: default: '' - regex: "^[a-z0-9-]+$" # can't use '.' when using HTTPS + regex: '^[a-z0-9\-\/]+$' # can't use '.' when using HTTPS shadowed_by_global: true s3_disable_cleanup: default: false @@ -1022,6 +1090,15 @@ backups: regex: "^((0?(0|1|2|3|4|5|6|7|8|9)|(10|11|12|13|14|15|16|17|18|19|20|21|22|23))):\\d\\d$" backup_with_uploads: true +search: + min_search_term_length: + client: true + default: 3 + + search_tokenize_chinese_japanese_korean: false + search_prefer_recent_posts: false + search_recent_posts_size: 100000 + uncategorized: version_checks: client: true @@ -1041,12 +1118,6 @@ uncategorized: default: '' type: list - # Search - min_search_term_length: - client: true - default: 3 - - search_tokenize_chinese_japanese_korean: false max_similar_results: 5 minimum_topics_similar: 50 @@ -1141,8 +1212,6 @@ uncategorized: notify_about_flags_after: 48 - enable_cdn_js_debugging: false - show_create_topics_notice: client: true default: true @@ -1153,7 +1222,7 @@ uncategorized: disable_edit_notifications: false - vacuum_db_days: 9000 + vacuum_db_days: 90 last_vacuum: default: 0 hidden: true @@ -1191,6 +1260,9 @@ uncategorized: topic_page_title_includes_category: true + native_app_install_banner: false + + user_preferences: default_email_digest_frequency: enum: 'DigestEmailSiteSetting' @@ -1218,6 +1290,9 @@ user_preferences: default_other_auto_track_topics_after_msecs: enum: 'AutoTrackDurationSiteSetting' default: 240000 + default_other_notification_level_when_replying: + enum: 'NotificationLevelWhenReplyingSiteSetting' + default: 2 default_other_external_links_in_new_tab: false default_other_enable_quoting: true default_other_dynamic_favicon: false @@ -1239,6 +1314,33 @@ user_preferences: default_categories_muted: type: category_list default: '' + default_categories_watching_first_post: + type: category_list + default: '' + +user_api: + max_user_api_reqs_per_day: + default: 2880 + max_user_api_reqs_per_minute: + default: 20 + allow_user_api_keys: + default: true + allow_user_api_key_scopes: + default: 'read|write|message_bus|push|notifications|session_info' + type: list + max_api_keys_per_user: + default: 10 + push_api_secret_key: + hidden: true + min_trust_level_for_user_api_key: + default: 1 + allowed_user_api_push_urls: + default: '' + type: list + shadowed_by_global: true + allowed_user_api_auth_redirects: + default: 'https://api.discourse.org/api/auth_redirect|discourse://auth_redirect' + type: list tags: tagging_enabled: diff --git a/config/unicorn.conf.rb b/config/unicorn.conf.rb index b364b45e9ea..74723ef125d 100644 --- a/config/unicorn.conf.rb +++ b/config/unicorn.conf.rb @@ -168,5 +168,10 @@ after_fork do |server, worker| # it may cause issues if bg threads in a v8 isolate randomly stop # working due to fork Discourse.after_fork - PrettyText.cook("warm up **pretty text**") + + begin + PrettyText.cook("warm up **pretty text**") + rescue => e + Rails.logger.error("Failed to warm up pretty text: #{e}") + end end diff --git a/d b/d new file mode 120000 index 00000000000..83fa653519b --- /dev/null +++ b/d @@ -0,0 +1 @@ +bin/docker \ No newline at end of file diff --git a/db/fixtures/001_categories.rb b/db/fixtures/001_categories.rb index c6880b53385..bef41c56d62 100644 --- a/db/fixtures/001_categories.rb +++ b/db/fixtures/001_categories.rb @@ -1,5 +1,5 @@ # fix any bust caches post initial migration -ActiveRecord::Base.send(:subclasses).each{|m| m.reset_column_information} +ActiveRecord::Base.send(:subclasses).each { |m| m.reset_column_information } SiteSetting.refresh! uncat_id = SiteSetting.uncategorized_category_id @@ -10,9 +10,7 @@ if uncat_id == -1 || !Category.exists?(uncat_id) result = Category.exec_sql "SELECT 1 FROM categories WHERE lower(name) = 'uncategorized'" name = 'Uncategorized' - if result.count > 0 - name << SecureRandom.hex - end + name << SecureRandom.hex if result.count > 0 result = Category.exec_sql "INSERT INTO categories (name,color,slug,description,text_color, user_id, created_at, updated_at, position, name_lower) @@ -25,3 +23,27 @@ if uncat_id == -1 || !Category.exists?(uncat_id) Category.exec_sql "INSERT INTO site_settings(name, data_type, value, created_at, updated_at) VALUES ('uncategorized_category_id', 3, #{category_id}, now(), now())" end + +# 60 minutes after our migration runs we need to exectue this code... +duration = Rails.env.production? ? 60 : 0 +if Category.exec_sql(" + SELECT 1 FROM schema_migration_details + WHERE EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_schema = 'public' AND table_name = 'categories' AND column_name = 'logo_url' + ) AND + name = 'AddUploadsToCategories' AND + created_at < (current_timestamp at time zone 'UTC' - interval '#{duration} minutes') + ").to_a.length > 0 + + + Category.transaction do + STDERR.puts "Removing superflous category columns!" + %w[ + logo_url + background_url + ].each do |column| + Category.exec_sql("ALTER TABLE categories DROP column IF EXISTS #{column}") + end + end +end diff --git a/db/fixtures/002_groups.rb b/db/fixtures/002_groups.rb index 154c76bba9b..94757078a7d 100644 --- a/db/fixtures/002_groups.rb +++ b/db/fixtures/002_groups.rb @@ -2,3 +2,4 @@ Group.ensure_automatic_groups! if g = Group.find_by(name: 'trust_level_5', id: 15) g.destroy! end +Group.where(name: 'everyone').update_all(visible: false) diff --git a/db/fixtures/006_badges.rb b/db/fixtures/006_badges.rb index bf99aa53a43..f0d877e9cc7 100644 --- a/db/fixtures/006_badges.rb +++ b/db/fixtures/006_badges.rb @@ -382,7 +382,7 @@ Badge.seed do |b| b.query = nil b.badge_grouping_id = BadgeGrouping::GettingStarted b.default_badge_grouping_id = BadgeGrouping::GettingStarted - b.trigger = Badge::Trigger::PostProcessed + b.trigger = Badge::Trigger::None b.system = true end @@ -396,7 +396,7 @@ Badge.seed do |b| b.query = nil b.badge_grouping_id = BadgeGrouping::GettingStarted b.default_badge_grouping_id = BadgeGrouping::GettingStarted - b.trigger = Badge::Trigger::PostProcessed + b.trigger = Badge::Trigger::None b.system = true end @@ -410,7 +410,7 @@ Badge.seed do |b| b.query = nil b.badge_grouping_id = BadgeGrouping::GettingStarted b.default_badge_grouping_id = BadgeGrouping::GettingStarted - b.trigger = Badge::Trigger::PostProcessed + b.trigger = Badge::Trigger::None b.system = true end diff --git a/db/fixtures/007_web_hook_event_types.rb b/db/fixtures/007_web_hook_event_types.rb new file mode 100644 index 00000000000..d91b5f09a1a --- /dev/null +++ b/db/fixtures/007_web_hook_event_types.rb @@ -0,0 +1,14 @@ +WebHookEventType.seed do |b| + b.id = WebHookEventType::TOPIC + b.name = "topic" +end + +WebHookEventType.seed do |b| + b.id = WebHookEventType::POST + b.name = "post" +end + +WebHookEventType.seed do |b| + b.id = WebHookEventType::USER + b.name = "user" +end diff --git a/db/fixtures/009_users.rb b/db/fixtures/009_users.rb index d65c8f2ef73..dd8a203e6b7 100644 --- a/db/fixtures/009_users.rb +++ b/db/fixtures/009_users.rb @@ -32,7 +32,7 @@ duration = Rails.env.production? ? 60 : 0 if User.exec_sql("SELECT 1 FROM schema_migration_details WHERE EXISTS( SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS - WHERE table_name = 'users' AND column_name = 'last_redirected_to_top_at' + WHERE table_schema = 'public' AND table_name = 'users' AND column_name = 'last_redirected_to_top_at' ) AND name = 'MoveTrackingOptionsToUserOptions' AND created_at < (current_timestamp at time zone 'UTC' - interval '#{duration} minutes') diff --git a/db/fixtures/999_topics.rb b/db/fixtures/999_topics.rb index cfe48615bcc..477ea2d40c2 100644 --- a/db/fixtures/999_topics.rb +++ b/db/fixtures/999_topics.rb @@ -40,10 +40,9 @@ end if seed_welcome_topics puts "Seeding welcome topics" - PostCreator.create(Discourse.system_user, raw: I18n.t('assets_topic_body'), title: "Assets for the site design", skip_validations: true, category: staff ? staff.name : nil) + PostCreator.create(Discourse.system_user, raw: I18n.t('assets_topic_body'), title: I18n.t('assets_topic_title'), skip_validations: true, category: staff ? staff.name : nil) - welcome = File.read(Rails.root + 'docs/WELCOME-TO-DISCOURSE.md') - post = PostCreator.create(Discourse.system_user, raw: welcome, title: "Welcome to Discourse", skip_validations: true) + post = PostCreator.create(Discourse.system_user, raw: I18n.t('discourse_welcome_topic.body'), title: I18n.t('discourse_welcome_topic.title'), skip_validations: true) post.topic.update_pinned(true, true) lounge = Category.find_by(id: SiteSetting.lounge_category_id) @@ -64,3 +63,32 @@ if seed_welcome_topics skip_validations: true, category: staff ? staff.name : nil) end + + + +# run this later, cause we need to make sure new application controller resilience is in place first +duration = Rails.env.production? ? 60 : 0 +if Topic.exec_sql("SELECT 1 FROM schema_migration_details + WHERE EXISTS( + SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS + WHERE table_schema = 'public' AND table_name = 'topics' AND column_name = 'inappropriate_count' + ) AND + name = 'AddTopicColumnsBack' AND + created_at < (current_timestamp at time zone 'UTC' - interval '#{duration} minutes') + ").to_a.length > 0 + + + Topic.transaction do + STDERR.puts "Removing superflous topic columns!" + %w[ + inappropriate_count + bookmark_count + off_topic_count + illegal_count + notify_user_count +].each do |column| + User.exec_sql("ALTER TABLE topics DROP COLUMN IF EXISTS #{column}") + end + + end +end diff --git a/db/migrate/20160815002002_add_user_api_keys.rb b/db/migrate/20160815002002_add_user_api_keys.rb new file mode 100644 index 00000000000..0789781d87b --- /dev/null +++ b/db/migrate/20160815002002_add_user_api_keys.rb @@ -0,0 +1,19 @@ +class AddUserApiKeys < ActiveRecord::Migration + def change + create_table :user_api_keys do |t| + t.integer :user_id, null: false + t.string :client_id, null: false + t.string :key, null: false + t.string :application_name, null: false + t.boolean :read, null: false + t.boolean :write, null: false + t.boolean :push, null: false + t.string :push_url + t.timestamps + end + + add_index :user_api_keys, [:key], unique: true + add_index :user_api_keys, [:user_id] + add_index :user_api_keys, [:client_id] + end +end diff --git a/db/migrate/20160815210156_add_flair_url_to_groups.rb b/db/migrate/20160815210156_add_flair_url_to_groups.rb new file mode 100644 index 00000000000..19cd4c1d2d2 --- /dev/null +++ b/db/migrate/20160815210156_add_flair_url_to_groups.rb @@ -0,0 +1,6 @@ +class AddFlairUrlToGroups < ActiveRecord::Migration + def change + add_column :groups, :flair_url, :string + add_column :groups, :flair_bg_color, :string + end +end diff --git a/db/migrate/20160816052836_user_api_client_id_is_unique.rb b/db/migrate/20160816052836_user_api_client_id_is_unique.rb new file mode 100644 index 00000000000..59b3dc4b354 --- /dev/null +++ b/db/migrate/20160816052836_user_api_client_id_is_unique.rb @@ -0,0 +1,6 @@ +class UserApiClientIdIsUnique < ActiveRecord::Migration + def change + remove_index :user_api_keys, [:client_id] + add_index :user_api_keys, [:client_id], unique: true + end +end diff --git a/db/migrate/20160816063534_add_revoked_at_to_user_api_keys.rb b/db/migrate/20160816063534_add_revoked_at_to_user_api_keys.rb new file mode 100644 index 00000000000..30c252a6e86 --- /dev/null +++ b/db/migrate/20160816063534_add_revoked_at_to_user_api_keys.rb @@ -0,0 +1,5 @@ +class AddRevokedAtToUserApiKeys < ActiveRecord::Migration + def change + add_column :user_api_keys, :revoked_at, :datetime + end +end diff --git a/db/migrate/20160823171911_add_path_whitelist_to_embeddable_hosts.rb b/db/migrate/20160823171911_add_path_whitelist_to_embeddable_hosts.rb new file mode 100644 index 00000000000..9b49fd161ca --- /dev/null +++ b/db/migrate/20160823171911_add_path_whitelist_to_embeddable_hosts.rb @@ -0,0 +1,5 @@ +class AddPathWhitelistToEmbeddableHosts < ActiveRecord::Migration + def change + add_column :embeddable_hosts, :path_whitelist, :string + end +end diff --git a/db/migrate/20160826195018_add_flair_color_to_groups.rb b/db/migrate/20160826195018_add_flair_color_to_groups.rb new file mode 100644 index 00000000000..cf96c741e74 --- /dev/null +++ b/db/migrate/20160826195018_add_flair_color_to_groups.rb @@ -0,0 +1,5 @@ +class AddFlairColorToGroups < ActiveRecord::Migration + def change + add_column :groups, :flair_color, :string + end +end diff --git a/db/migrate/20160905082217_create_web_hook_event_types.rb b/db/migrate/20160905082217_create_web_hook_event_types.rb new file mode 100644 index 00000000000..44466d4510b --- /dev/null +++ b/db/migrate/20160905082217_create_web_hook_event_types.rb @@ -0,0 +1,7 @@ +class CreateWebHookEventTypes < ActiveRecord::Migration + def change + create_table :web_hook_event_types do |t| + t.string :name, null: false + end + end +end diff --git a/db/migrate/20160905082248_create_web_hooks.rb b/db/migrate/20160905082248_create_web_hooks.rb new file mode 100644 index 00000000000..f0f592507ac --- /dev/null +++ b/db/migrate/20160905082248_create_web_hooks.rb @@ -0,0 +1,16 @@ +class CreateWebHooks < ActiveRecord::Migration + def change + create_table :web_hooks do |t| + t.string :payload_url, null: false + t.integer :content_type, default: 1, null: false + t.integer :last_delivery_status, default: 1, null: false + t.integer :status, default: 1, null: false + t.string :secret, default: '' + t.boolean :wildcard_web_hook, default: false, null: false + t.boolean :verify_certificate, default: true, null: false + t.boolean :active, default: false, null: false + + t.timestamps + end + end +end diff --git a/db/migrate/20160905084502_create_web_hook_events.rb b/db/migrate/20160905084502_create_web_hook_events.rb new file mode 100644 index 00000000000..9f15520153c --- /dev/null +++ b/db/migrate/20160905084502_create_web_hook_events.rb @@ -0,0 +1,15 @@ +class CreateWebHookEvents < ActiveRecord::Migration + def change + create_table :web_hook_events do |t| + t.belongs_to :web_hook, null: false, index: true + t.string :headers + t.text :payload + t.integer :status, default: 0 + t.string :response_headers + t.text :response_body + t.integer :duration, default: 0 + + t.timestamps + end + end +end diff --git a/db/migrate/20160905085445_create_join_table_web_hooks_web_hook_event_types.rb b/db/migrate/20160905085445_create_join_table_web_hooks_web_hook_event_types.rb new file mode 100644 index 00000000000..28c54d3abc4 --- /dev/null +++ b/db/migrate/20160905085445_create_join_table_web_hooks_web_hook_event_types.rb @@ -0,0 +1,9 @@ +class CreateJoinTableWebHooksWebHookEventTypes < ActiveRecord::Migration + def change + create_join_table :web_hooks, :web_hook_event_types + + add_index :web_hook_event_types_hooks, [:web_hook_event_type_id, :web_hook_id], + name: 'idx_web_hook_event_types_hooks_on_ids', + unique: true + end +end diff --git a/db/migrate/20160905091958_create_join_table_web_hooks_groups.rb b/db/migrate/20160905091958_create_join_table_web_hooks_groups.rb new file mode 100644 index 00000000000..a2376077105 --- /dev/null +++ b/db/migrate/20160905091958_create_join_table_web_hooks_groups.rb @@ -0,0 +1,6 @@ +class CreateJoinTableWebHooksGroups < ActiveRecord::Migration + def change + create_join_table :web_hooks, :groups + add_index :groups_web_hooks, [:web_hook_id, :group_id], unique: true + end +end diff --git a/db/migrate/20160905092148_create_join_table_web_hooks_categories.rb b/db/migrate/20160905092148_create_join_table_web_hooks_categories.rb new file mode 100644 index 00000000000..8759ff64a7f --- /dev/null +++ b/db/migrate/20160905092148_create_join_table_web_hooks_categories.rb @@ -0,0 +1,6 @@ +class CreateJoinTableWebHooksCategories < ActiveRecord::Migration + def change + create_join_table :web_hooks, :categories + add_index :categories_web_hooks, [:web_hook_id, :category_id], unique: true + end +end diff --git a/db/migrate/20160906200439_add_via_wizard_to_color_schemes.rb b/db/migrate/20160906200439_add_via_wizard_to_color_schemes.rb new file mode 100644 index 00000000000..1fc1881f508 --- /dev/null +++ b/db/migrate/20160906200439_add_via_wizard_to_color_schemes.rb @@ -0,0 +1,6 @@ +class AddViaWizardToColorSchemes < ActiveRecord::Migration + def change + add_column :color_schemes, :via_wizard, :boolean, default: false, null: false + add_column :color_schemes, :theme_id, :string, null: true + end +end diff --git a/db/migrate/20160919003141_add_avatar_url_to_facebook_info.rb b/db/migrate/20160919003141_add_avatar_url_to_facebook_info.rb new file mode 100644 index 00000000000..65b2a80dc29 --- /dev/null +++ b/db/migrate/20160919003141_add_avatar_url_to_facebook_info.rb @@ -0,0 +1,5 @@ +class AddAvatarUrlToFacebookInfo < ActiveRecord::Migration + def change + add_column :facebook_user_infos, :avatar_url, :string + end +end diff --git a/db/migrate/20160919054014_add_fields_to_facebook_user_info.rb b/db/migrate/20160919054014_add_fields_to_facebook_user_info.rb new file mode 100644 index 00000000000..8e50f8fb414 --- /dev/null +++ b/db/migrate/20160919054014_add_fields_to_facebook_user_info.rb @@ -0,0 +1,7 @@ +class AddFieldsToFacebookUserInfo < ActiveRecord::Migration + def change + add_column :facebook_user_infos, :about_me, :text + add_column :facebook_user_infos, :location, :string + add_column :facebook_user_infos, :website, :text + end +end diff --git a/db/migrate/20160920165833_add_moderator_to_invites.rb b/db/migrate/20160920165833_add_moderator_to_invites.rb new file mode 100644 index 00000000000..1476ac0e4f4 --- /dev/null +++ b/db/migrate/20160920165833_add_moderator_to_invites.rb @@ -0,0 +1,5 @@ +class AddModeratorToInvites < ActiveRecord::Migration + def change + add_column :invites, :moderator, :boolean, default: false, null: false + end +end diff --git a/db/migrate/20160930123330_add_notification_level_when_replying.rb b/db/migrate/20160930123330_add_notification_level_when_replying.rb new file mode 100644 index 00000000000..0d3a9f6a5a3 --- /dev/null +++ b/db/migrate/20160930123330_add_notification_level_when_replying.rb @@ -0,0 +1,5 @@ +class AddNotificationLevelWhenReplying < ActiveRecord::Migration + def change + add_column :user_options, :notification_level_when_replying, :integer + end +end diff --git a/db/migrate/20161010230853_single_sign_on_increase_external_avatar_url.rb b/db/migrate/20161010230853_single_sign_on_increase_external_avatar_url.rb new file mode 100644 index 00000000000..dc14e294974 --- /dev/null +++ b/db/migrate/20161010230853_single_sign_on_increase_external_avatar_url.rb @@ -0,0 +1,5 @@ +class SingleSignOnIncreaseExternalAvatarUrl < ActiveRecord::Migration + def change + change_column :single_sign_on_records, :external_avatar_url, :string, limit: 1000 + end +end diff --git a/db/migrate/20161013012136_add_scopes_to_user_api_keys.rb b/db/migrate/20161013012136_add_scopes_to_user_api_keys.rb new file mode 100644 index 00000000000..d3182bdea4b --- /dev/null +++ b/db/migrate/20161013012136_add_scopes_to_user_api_keys.rb @@ -0,0 +1,13 @@ +class AddScopesToUserApiKeys < ActiveRecord::Migration + def change + add_column :user_api_keys, :scopes, :text, array: true, null: false, default: [] + + execute "UPDATE user_api_keys SET scopes = scopes || ARRAY['write'] WHERE write" + execute "UPDATE user_api_keys SET scopes = scopes || ARRAY['read'] WHERE read" + execute "UPDATE user_api_keys SET scopes = scopes || ARRAY['push'] WHERE push" + + remove_column :user_api_keys, :read + remove_column :user_api_keys, :write + remove_column :user_api_keys, :push + end +end diff --git a/db/migrate/20161014171034_add_directory_items_indexes.rb b/db/migrate/20161014171034_add_directory_items_indexes.rb new file mode 100644 index 00000000000..f6b795cd1cb --- /dev/null +++ b/db/migrate/20161014171034_add_directory_items_indexes.rb @@ -0,0 +1,13 @@ +class AddDirectoryItemsIndexes < ActiveRecord::Migration + disable_ddl_transaction! + + def change + add_index :directory_items, :likes_received, algorithm: :concurrently + add_index :directory_items, :likes_given, algorithm: :concurrently + add_index :directory_items, :topics_entered, algorithm: :concurrently + add_index :directory_items, :topic_count, algorithm: :concurrently + add_index :directory_items, :post_count, algorithm: :concurrently + add_index :directory_items, :posts_read, algorithm: :concurrently + add_index :directory_items, :days_visited, algorithm: :concurrently + end +end diff --git a/db/migrate/20161025083648_fix_category_logo_and_background_urls.rb b/db/migrate/20161025083648_fix_category_logo_and_background_urls.rb new file mode 100644 index 00000000000..1f0f5b1a98b --- /dev/null +++ b/db/migrate/20161025083648_fix_category_logo_and_background_urls.rb @@ -0,0 +1,14 @@ +class FixCategoryLogoAndBackgroundUrls < ActiveRecord::Migration + def up + return true if Discourse.asset_host.blank? + + Category.exec_sql <<-SQL + UPDATE categories + SET logo_url = replace(logo_url, '#{Discourse.asset_host}', '') + , background_url = replace(background_url, '#{Discourse.asset_host}', '') + SQL + end + + def down + end +end diff --git a/db/migrate/20161029181306_add_image_url_to_posts.rb b/db/migrate/20161029181306_add_image_url_to_posts.rb new file mode 100644 index 00000000000..ed9e1ab8597 --- /dev/null +++ b/db/migrate/20161029181306_add_image_url_to_posts.rb @@ -0,0 +1,5 @@ +class AddImageUrlToPosts < ActiveRecord::Migration + def change + add_column :posts, :image_url, :string + end +end diff --git a/db/migrate/20161031183811_add_sort_fields_to_categories.rb b/db/migrate/20161031183811_add_sort_fields_to_categories.rb new file mode 100644 index 00000000000..991b5484bec --- /dev/null +++ b/db/migrate/20161031183811_add_sort_fields_to_categories.rb @@ -0,0 +1,6 @@ +class AddSortFieldsToCategories < ActiveRecord::Migration + def change + add_column :categories, :sort_order, :string + add_column :categories, :sort_ascending, :boolean + end +end diff --git a/db/migrate/20161102024700_add_post_uploads_indexes.rb b/db/migrate/20161102024700_add_post_uploads_indexes.rb new file mode 100644 index 00000000000..c8f8ced7143 --- /dev/null +++ b/db/migrate/20161102024700_add_post_uploads_indexes.rb @@ -0,0 +1,6 @@ +class AddPostUploadsIndexes < ActiveRecord::Migration + def change + add_index :post_uploads, :post_id + add_index :post_uploads, :upload_id + end +end diff --git a/db/migrate/20161102024818_add_uploaded_avatar_id_index_to_users.rb b/db/migrate/20161102024818_add_uploaded_avatar_id_index_to_users.rb new file mode 100644 index 00000000000..2e5c6e66e17 --- /dev/null +++ b/db/migrate/20161102024818_add_uploaded_avatar_id_index_to_users.rb @@ -0,0 +1,5 @@ +class AddUploadedAvatarIdIndexToUsers < ActiveRecord::Migration + def change + add_index :users, :uploaded_avatar_id + end +end diff --git a/db/migrate/20161102024838_add_user_avatars_indexes.rb b/db/migrate/20161102024838_add_user_avatars_indexes.rb new file mode 100644 index 00000000000..ea1b26f7f78 --- /dev/null +++ b/db/migrate/20161102024838_add_user_avatars_indexes.rb @@ -0,0 +1,6 @@ +class AddUserAvatarsIndexes < ActiveRecord::Migration + def change + add_index :user_avatars, :custom_upload_id + add_index :user_avatars, :gravatar_upload_id + end +end diff --git a/db/migrate/20161102024900_add_user_profiles_indexes.rb b/db/migrate/20161102024900_add_user_profiles_indexes.rb new file mode 100644 index 00000000000..7a5ce85f26d --- /dev/null +++ b/db/migrate/20161102024900_add_user_profiles_indexes.rb @@ -0,0 +1,6 @@ +class AddUserProfilesIndexes < ActiveRecord::Migration + def change + add_index :user_profiles, :profile_background + add_index :user_profiles, :card_background + end +end diff --git a/db/migrate/20161102024920_add_categories_indexes.rb b/db/migrate/20161102024920_add_categories_indexes.rb new file mode 100644 index 00000000000..d5ad88f10d9 --- /dev/null +++ b/db/migrate/20161102024920_add_categories_indexes.rb @@ -0,0 +1,6 @@ +class AddCategoriesIndexes < ActiveRecord::Migration + def change + add_index :categories, :logo_url + add_index :categories, :background_url + end +end diff --git a/db/migrate/20161124020918_add_scores_indexes_to_top_topics.rb b/db/migrate/20161124020918_add_scores_indexes_to_top_topics.rb new file mode 100644 index 00000000000..0e79373d230 --- /dev/null +++ b/db/migrate/20161124020918_add_scores_indexes_to_top_topics.rb @@ -0,0 +1,9 @@ +class AddScoresIndexesToTopTopics < ActiveRecord::Migration + def change + add_index :top_topics, :daily_score + add_index :top_topics, :weekly_score + add_index :top_topics, :monthly_score + add_index :top_topics, :yearly_score + add_index :top_topics, :all_score + end +end diff --git a/db/migrate/20161202011139_add_whisper_support_to_topics.rb b/db/migrate/20161202011139_add_whisper_support_to_topics.rb new file mode 100644 index 00000000000..0e065889e8a --- /dev/null +++ b/db/migrate/20161202011139_add_whisper_support_to_topics.rb @@ -0,0 +1,16 @@ +class AddWhisperSupportToTopics < ActiveRecord::Migration + def up + remove_column :topics, :bookmark_count + remove_column :topics, :off_topic_count + remove_column :topics, :illegal_count + remove_column :topics, :inappropriate_count + remove_column :topics, :notify_user_count + + add_column :topics, :highest_staff_post_number, :int, default: 0, null: false + execute "UPDATE topics SET highest_staff_post_number = highest_post_number" + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20161202034856_add_uploads_to_categories.rb b/db/migrate/20161202034856_add_uploads_to_categories.rb new file mode 100644 index 00000000000..de35b1a0d0d --- /dev/null +++ b/db/migrate/20161202034856_add_uploads_to_categories.rb @@ -0,0 +1,18 @@ +class AddUploadsToCategories < ActiveRecord::Migration + def up + add_column :categories, :uploaded_logo_id, :integer, index: true + add_column :categories, :uploaded_background_id, :integer, index: true + + transaction do + Category.find_each do |category| + logo_upload = Upload.find_by(url: category.logo_url) + background_upload = Upload.find_by(url: category.background_url) + + category.update_columns( + uploaded_logo_id: logo_upload&.id, + uploaded_background_id: background_upload&.id + ) + end + end + end +end diff --git a/db/migrate/20161205001727_add_topic_columns_back.rb b/db/migrate/20161205001727_add_topic_columns_back.rb new file mode 100644 index 00000000000..d464c54a9e6 --- /dev/null +++ b/db/migrate/20161205001727_add_topic_columns_back.rb @@ -0,0 +1,21 @@ +class AddTopicColumnsBack < ActiveRecord::Migration + + # This really sucks big time, we have no use for these columns yet can not remove them + # if we remove them then sites will be down during migration + + def up + add_column :topics, :bookmark_count, :int + add_column :topics, :off_topic_count, :int + add_column :topics, :illegal_count, :int + add_column :topics, :inappropriate_count, :int + add_column :topics, :notify_user_count, :int + end + + def down + remove_column :topics, :bookmark_count + remove_column :topics, :off_topic_count + remove_column :topics, :illegal_count + remove_column :topics, :inappropriate_count + remove_column :topics, :notify_user_count + end +end diff --git a/db/migrate/20161205065743_add_bio_to_groups.rb b/db/migrate/20161205065743_add_bio_to_groups.rb new file mode 100644 index 00000000000..846b3a1c979 --- /dev/null +++ b/db/migrate/20161205065743_add_bio_to_groups.rb @@ -0,0 +1,6 @@ +class AddBioToGroups < ActiveRecord::Migration + def change + add_column :groups, :bio_raw, :text + add_column :groups, :bio_cooked, :text + end +end diff --git a/db/migrate/20161207030057_add_public_to_groups.rb b/db/migrate/20161207030057_add_public_to_groups.rb new file mode 100644 index 00000000000..edcceb25053 --- /dev/null +++ b/db/migrate/20161207030057_add_public_to_groups.rb @@ -0,0 +1,5 @@ +class AddPublicToGroups < ActiveRecord::Migration + def change + add_column :groups, :public, :boolean, default: :false, null: false + end +end diff --git a/db/migrate/20161208064834_create_group_histories.rb b/db/migrate/20161208064834_create_group_histories.rb new file mode 100644 index 00000000000..1b18971c4ed --- /dev/null +++ b/db/migrate/20161208064834_create_group_histories.rb @@ -0,0 +1,19 @@ +class CreateGroupHistories < ActiveRecord::Migration + def change + create_table :group_histories do |t| + t.integer :group_id, null: false + t.integer :acting_user_id, null: false + t.integer :target_user_id + t.integer :action, index: true, null: false + t.string :subject + t.text :prev_value + t.text :new_value + + t.timestamps null: false + end + + add_index :group_histories, :group_id + add_index :group_histories, :acting_user_id + add_index :group_histories, :target_user_id + end +end diff --git a/db/migrate/20161212123649_add_allow_membership_requests_to_groups.rb b/db/migrate/20161212123649_add_allow_membership_requests_to_groups.rb new file mode 100644 index 00000000000..b219ed4ef8c --- /dev/null +++ b/db/migrate/20161212123649_add_allow_membership_requests_to_groups.rb @@ -0,0 +1,5 @@ +class AddAllowMembershipRequestsToGroups < ActiveRecord::Migration + def change + add_column :groups, :allow_membership_requests, :boolean, default: false, null: false + end +end diff --git a/db/migrate/20161213073938_add_full_name_to_groups.rb b/db/migrate/20161213073938_add_full_name_to_groups.rb new file mode 100644 index 00000000000..655b89551b5 --- /dev/null +++ b/db/migrate/20161213073938_add_full_name_to_groups.rb @@ -0,0 +1,5 @@ +class AddFullNameToGroups < ActiveRecord::Migration + def change + add_column :groups, :full_name, :string + end +end diff --git a/db/migrate/20161215201907_migrate_featured_link_fields.rb b/db/migrate/20161215201907_migrate_featured_link_fields.rb new file mode 100644 index 00000000000..44820a912e9 --- /dev/null +++ b/db/migrate/20161215201907_migrate_featured_link_fields.rb @@ -0,0 +1,6 @@ +class MigrateFeaturedLinkFields < ActiveRecord::Migration + def change + add_column :topics, :featured_link, :string + add_column :categories, :topic_featured_link_allowed, :boolean, default: true + end +end diff --git a/db/migrate/20161216101352_add_all_topics_wiki_to_categories.rb b/db/migrate/20161216101352_add_all_topics_wiki_to_categories.rb new file mode 100644 index 00000000000..7d5fc430002 --- /dev/null +++ b/db/migrate/20161216101352_add_all_topics_wiki_to_categories.rb @@ -0,0 +1,5 @@ +class AddAllTopicsWikiToCategories < ActiveRecord::Migration + def change + add_column :categories, :all_topics_wiki, :boolean, default: false, null: false + end +end \ No newline at end of file diff --git a/docs/ADMIN-QUICK-START-GUIDE.md b/docs/ADMIN-QUICK-START-GUIDE.md index a7a51162559..f02868df86e 100644 --- a/docs/ADMIN-QUICK-START-GUIDE.md +++ b/docs/ADMIN-QUICK-START-GUIDE.md @@ -1,39 +1,18 @@ Congratulations, you are now the proud owner of your very own [Civilized Discourse Construction Kit](http://www.discourse.org). :hatching_chick: +### Getting Started + +If you haven't already, launch the [setup wizard](/wizard) and go through the steps to configure your site. You can run the wizard as many times as you want, it's completely safe! + ### Admin Dashboard -As an admin you have total control over this Discourse instance. Exercise your admin superpowers via the admin dashboard at +Exercise your admin superpowers any time via the admin dashboard at [**/admin**](/admin) You can also access it via the "hamburger" ☰ menu in the upper right: Admin functions are generally marked with the wrench :wrench: icon, so look for that. -### Enter Required Settings - -Go to the [Required tab](/admin/site_settings/category/required) of the site settings and enter all the required fields. **Until you set these required fields, _your Discourse is broken!_** Go ahead and do that now. - -We'll wait. - -### Customize Logos and Colors - -By default you get the standard "penciled in" Discourse logo. Look for the [**assets for the site design**](/t/assets-for-the-site-design) topic; follow the instructions there to upload your logos to that topic, and then paste the uploaded image paths into the required logo settings. - -To quickly give your Discourse a distinctive look, without having to edit or understand CSS, create a new color scheme via [**Customize, Colors**](/admin/customize/colors). - -You can also specify custom CSS and custom HTML headers/footers to further customize the look. One common request is a navigation header that takes you back to the parent site. Here is some example HTML to put in [**Customize, CSS/HTML**](/admin/customize/css_html) under "Header": - -``` - -``` - -### Establish Staff +### Staff Staff members are official representatives of this community. There are two kinds of Staff: @@ -46,17 +25,7 @@ To add additional staff members: - click the admin button :wrench: on their user page - look for the Grant Admin and Grant Moderator buttons there -### Private or Public? - -Discourse assumes you want a public discussion area. If you prefer a private one, change these [login site settings](/admin/site_settings/category/login): - -- `must approve users` -- `login required` -- `invite only` - -If you only want some parts of your site to be private, edit category permissions. You already have one private category: this topic is in it! - -### Configure Login Methods +### Social Logins Users can log in with traditional local username and password accounts. You may want to add: @@ -65,7 +34,7 @@ Users can log in with traditional local username and password accounts. You may - [Facebook logins](https://meta.discourse.org/t/configuring-facebook-login-for-discourse/13394) - [GitHub logins](https://meta.discourse.org/t/configuring-github-login-for-discourse/13745) -If you want to get extra-fancy you can also [set up single-sign on](https://meta.discourse.org/t/official-single-sign-on-for-discourse/13045), or even [build your own login method](https://meta.discourse.org/t/login-to-discourse-with-custom-oauth2-provider/14717). +You can also [set up single-sign on](https://meta.discourse.org/t/official-single-sign-on-for-discourse/13045), or even [build your own login method](https://meta.discourse.org/t/login-to-discourse-with-custom-oauth2-provider/14717). ### Test Your Email @@ -77,60 +46,6 @@ Email is required for new account signups and notifications. **Test your email t If you'd like to enable *replying* to topics via email, [see this howto](https://meta.discourse.org/t/set-up-reply-via-email-support/14003). -### What and Who is this site for? - -One of the default topics is [Welcome to Discourse](/t/welcome-to-discourse). This topic is pinned globally, so it will appear on the homepage, right at the top of the topic list, for all new users. Try viewing your site with incognito, inprivate, or anonymous mode enabled in your browser to see it how new users will. - -Your welcome topic is important because it is the first thing you visitors will see: - -- Where am I? -- Who are these discussions for? -- What can I [find here](https://www.youtube.com/watch?v=d0VNHe5fq30)? -- Why should I visit? - -[Edit your welcome topic](/t/welcome-to-discourse) and write a **brief introduction to your community**. Think of it as your "elevator pitch" – how would you describe this site to a stranger on an elevator when you had about 1 minute to talk? - -Note that pinning topics works a little differently in Discourse: - -- Once someone reads to the bottom of a pinned topic, it is automatically unpinned for them specifically. They can change this via the personal pin controls at the bottom of the topic. -- When staff pins a topic, they can pin it globally to all topic lists, or just within its category. - -If a pin isn't visible enough, you can also turn one single topic into a **banner**. The banner topic floats on top of all topics and all primary pages. Users can permanently dismiss this floating banner by clicking the × in the upper right corner. - -To make (or remove) a pin or a banner, use the admin wrench at the top right or bottom of the topic. - -### Set the Homepage - -By default your homepage is a simple list of the latest posts. - -We strongly recommend sticking with this homepage for small and medium communities until you start getting lots of new topics every day. - -You can change the homepage to the Categories list by editing `top menu` in the [Basic Setup](/admin/site_settings/category/basic) site settings. Change it from the default of - -`latest|new|unread|top|categories` - -to - -`categories|latest|new|unread|top` - -That is, move categories from the far right to the far left -- that leftmost top menu item is your default homepage. - -### Build Your Own FAQ - -Right now [your FAQ](/faq) is the same Creative Commons [universal rules of civilized discourse](http://blog.discourse.org/2013/03/the-universal-rules-of-civilized-discourse/) we provide to all Discourse installs. These built-in community guidelines are referenced a bunch of places; please *do* use them and refer to them often – they really work! - -However, if you want to set up a more detailed FAQ dealing with the specifics of *your* community, here's how: - -1. Create a new [site feedback topic](category/site-feedback), titled "Frequently Asked Questions (FAQ)" or similar. - -2. Use the admin wrench icon below the post to make it a wiki post. This means the post is now editable to any user with a trust level of 1 or higher. - -3. Note the URL to that topic. - -4. Paste that URL into the `faq url` setting in the admin site settings. This links your topic from the hamburger FAQ menu entry at the top right of every page. - -Now you have a community FAQ for your site that is collaboratively editable, and linked from every page on the site. - ### Categories You have three default categories: @@ -145,14 +60,16 @@ To add a category, visit the [categories page](/categories), then click Create C Every category has an initial "About this category" topic. This topic will be pinned to the top of the category, and the description you enter will be used in a bunch of places. Be sure to give your new category a good, clear description, so people understand what belongs there! -### File Uploads +### Pinned Topics and Banners -Basic image uploads work fine out of the box stored locally, provided you have adequate disk space. +Note that pinning topics does work a little differently in Discourse: -- If you'd like other sorts of files to be uploaded beyond just images, modify the [file settings](/admin/site_settings/category/files). +- Once someone reads to the bottom of a pinned topic, it is automatically unpinned for them specifically. They can change this via the personal pin controls at the bottom of the topic. +- When staff pins a topic, they can pin it globally to all topic lists, or just within its category. -- If you'd rather store your images and files on Amazon S3, [follow this howto](http://meta.discourse.org/t/how-to-set-up-image-uploads-to-s3/7229). +If a pin isn't visible enough, you can also turn one single topic into a **banner**. The banner topic floats on top of all topics and all primary pages. Users can permanently dismiss this floating banner by clicking the × in the upper right corner. +To make (or remove) a pin or a banner, use the admin wrench at the top right or bottom of the topic. ### New User Sandbox and the Trust System @@ -171,35 +88,15 @@ All new users start out in a sandbox with restrictions for everyone's safety. ** - have actual links in the "about me" field of their profile - @name mention more than 2 users in a post -Virtually every action a user can take is rate limited for safety, and especially so for new users. But don't worry, new users can [transition to trust level 1](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924/2) in about 15 minutes. +Every action a user can take is rate limited for safety, and especially so for new users. But don't worry, new users can [transition to trust level 1](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924/2) in about 10 minutes of reading. -These defaults are safe, but they may be too conservative for your site: - -- If you are pre-vetting all users, or your site is private and you approve all new users manually, you can set everyone's `default trust level` to 1. - -- You can relax individual new user restrictions. Search settings for `newuser`. Ones commonly adjusted are `newuser max images`, `newuser max replies per topic`, `newuser max links`. - -### User Content Licensing - -Out of the box, Discourse defaults to [Creative Commons licensing](https://creativecommons.org/). - -> Your users will always retain copyright on their posts, and will always grant the site owner enough rights to include their content on the site. -> -> Who is allowed to republish the content posted on this forum? -> -> 1. Only the author -> 2. Author and the owner of this forum -> 3. Anybody\* - -Number 3 is the Discourse default – that's [Creative Commons BY-NC-SA 3.0](http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_US). - - If that's not what you want, edit the [Terms of Service](/tos) to taste via the edit link at the top. +These defaults are safe, but note that while in "bootstrap mode" after you set up your site, all new users will be granted trust level 1 until you reach 50 users. ### Building Your Community Be patient; building communities is hard. Before launching, be sure to: -1. Define your community's purpose in a pinned or banner topic. +1. Clearly define your community's purpose in a pinned or banner topic. 2. Seed the discussion with interesting topics. 3. Commit to visiting and participating regularly. 4. Link your community everywhere and promote it so people can find it. @@ -219,7 +116,7 @@ The invite area on your profile page also includes advanced Staff methods of [se - One CPU and 1GB of memory, with swap, is the minimum for a basic Discourse community. As your community grows you may need more memory or CPU resources. -- Hopefully you are running [in our Docker container install](https://github.com/discourse/discourse/blob/master/docs/INSTALL.md); it's the only one we officially support. It guarantees easy updates, and all recommended optimizations from the Discourse team. +- [Our Docker container install](https://github.com/discourse/discourse/blob/master/docs/INSTALL.md) is the only one we officially support. It guarantees easy updates, and all recommended optimizations from the Discourse team. - You should get an email notification when new versions of Discourse are released. To update your instance via our easy one click upgrade process, visit [/admin/upgrade](/admin/upgrade). diff --git a/docs/DEVELOPER-ADVANCED.md b/docs/DEVELOPER-ADVANCED.md index 1376682c610..fce07d005ca 100644 --- a/docs/DEVELOPER-ADVANCED.md +++ b/docs/DEVELOPER-ADVANCED.md @@ -12,7 +12,7 @@ To get your Ubuntu 16.04 LTS install up and running to develop Discourse and Dis whoami > /tmp/username sudo add-apt-repository ppa:chris-lea/redis-server sudo apt-get -yqq update - sudo apt-get -yqq install python-software-properties vim curl expect debconf-utils git-core build-essential zlib1g-dev libssl-dev openssl libcurl4-openssl-dev libreadline6-dev libpcre3 libpcre3-dev imagemagick postgresql postgresql-contrib-9.5 libpq-dev postgresql-server-dev-9.5 redis-server advancecomp gifsicle jhead jpegoptim libjpeg-turbo-progs optipng pngcrush pngquant + sudo apt-get -yqq install python-software-properties vim curl expect debconf-utils git-core build-essential zlib1g-dev libssl-dev openssl libcurl4-openssl-dev libreadline6-dev libpcre3 libpcre3-dev imagemagick postgresql postgresql-contrib-9.5 libpq-dev postgresql-server-dev-9.5 redis-server advancecomp gifsicle jhead jpegoptim libjpeg-turbo-progs optipng pngcrush pngquant gnupg2 # Ruby curl -sSL https://rvm.io/mpapis.asc | gpg2 --import - diff --git a/docs/DEVELOPMENT-OSX-NATIVE.md b/docs/DEVELOPMENT-OSX-NATIVE.md index a39876babde..c3ff8b9677a 100644 --- a/docs/DEVELOPMENT-OSX-NATIVE.md +++ b/docs/DEVELOPMENT-OSX-NATIVE.md @@ -14,6 +14,7 @@ If you don't already have a Ruby environment that's tuned to your liking, you ca 2. Clone the Discourse repo and cd into it. 3. Run `script/osx_dev`. 4. Review `log/osx_dev.log` to make sure everything finished successfully. +5. Jump To [Setting up your Discourse](#setting-up-your-discourse) Of course, it is good to understand what the script is doing and why. The rest of this guide goes through what's happening. @@ -132,7 +133,7 @@ If you get this error when starting `psql` from the command line: psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"? - + it is because it is still looking in the `/tmp` directory and not in `/var/pgsql_socket`. If running `psql -h /var/pgsql_socket` works then you need to configure the host in your `.bash_profile`: @@ -152,7 +153,7 @@ However, the seed data currently has some dependencies on their being a 'postgre In theory, you're not setting up with vagrant, either, and shouldn't need a vagrant user; however, again, all the seed data assumes 'vagrant'. To avoid headaches, it's probably best to go with this flow, so again, we create a 'vagrant' user. - brew install postgresql # Installs 9.2 + brew install postgresql ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents export PATH=/usr/local/opt/postgresql/bin:$PATH # You may want to put this in your default path! @@ -161,7 +162,7 @@ In theory, you're not setting up with vagrant, either, and shouldn't need a vagr launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist ### Seed data relies on both 'postgres' and 'vagrant' - + createuser --createdb --superuser postgres createuser --createdb --superuser vagrant @@ -204,7 +205,7 @@ mkdir ~/.magick cd ~/.magick curl http://www.imagemagick.org/Usage/scripts/imagick_type_gen > type_gen find /System/Library/Fonts /Library/Fonts ~/Library/Fonts -name "*.[to]tf" | perl type_gen -f - > type.xml -cd /usr/local/Cellar/imagemagick/#{original_node.css('blockquote').inner_html}
" + n.inner_html = original_node.css('div.title').inner_html + blockquote + n.name = "blockquote" + end # Finally, convert all `aside` tags to `div`s @fragment.css('aside, article, header').each do |n| @@ -129,36 +145,42 @@ module Email # iframes can't go in emails, so replace them with clickable links @fragment.css('iframe').each do |i| begin - src_uri = URI(i['src']) + # sometimes, iframes are blacklisted... + if i["src"].blank? + i.remove + next + end + src_uri = URI(i['src']) # If an iframe is protocol relative, use SSL when displaying it display_src = "#{src_uri.scheme || 'https'}://#{src_uri.host}#{src_uri.path}#{src_uri.query.nil? ? '' : '?' + src_uri.query}#{src_uri.fragment.nil? ? '' : '#' + src_uri.fragment}" i.replace "#{CGI.escapeHTML(display_src)}
" rescue URI::InvalidURIError - # If the URL is weird, remove it + # If the URL is weird, remove the iframe i.remove end end end def format_html + style('.with-accent-colors', "background-color: #{SiteSetting.email_accent_bg_color}; color: #{SiteSetting.email_accent_fg_color};") style('h4', 'color: #222;') style('h3', 'margin: 15px 0 20px 0;') style('hr', 'background-color: #ddd; height: 1px; border: 1px;') - style('a', 'text-decoration: none; font-weight: bold; color: #006699;') + style('a', "text-decoration: none; font-weight: bold; color: #{SiteSetting.email_link_color};") style('ul', 'margin: 0 0 0 10px; padding: 0 0 0 20px;') style('li', 'padding-bottom: 10px') - style('div.digest-post', 'margin-left: 15px; margin-top: -5px; max-width: 694px;') - style('div.digest-post h1', 'font-size: 20px;') style('div.footer', 'color:#666; font-size:95%; text-align:center; padding-top:15px;') style('span.post-count', 'margin: 0 5px; color: #777;') style('pre', 'word-wrap: break-word; max-width: 694px;') style('code', 'background-color: #f1f1ff; padding: 2px 5px;') style('pre code', 'display: block; background-color: #f1f1ff; padding: 5px;') - style('.featured-topic a', 'text-decoration: none; font-weight: bold; color: #006699; line-height:1.5em;') + style('.featured-topic a', "text-decoration: none; font-weight: bold; color: #{SiteSetting.email_link_color}; line-height:1.5em;") onebox_styles plugin_styles + + style('.post-excerpt img', "max-width: 50%; max-height: 400px;") end # this method is reserved for styles specific to plugin diff --git a/lib/email_updater.rb b/lib/email_updater.rb index ff6b13c9903..ab4c8246a2a 100644 --- a/lib/email_updater.rb +++ b/lib/email_updater.rb @@ -40,14 +40,14 @@ class EmailUpdater if authorize_both? args[:change_state] = EmailChangeRequest.states[:authorizing_old] - email_token = @user.email_tokens.create(email: args[:old_email]) + email_token = @user.email_tokens.create!(email: args[:old_email]) args[:old_email_token] = email_token else args[:change_state] = EmailChangeRequest.states[:authorizing_new] - email_token = @user.email_tokens.create(email: args[:new_email]) + email_token = @user.email_tokens.create!(email: args[:new_email]) args[:new_email_token] = email_token end - @user.email_change_requests.create(args) + @user.email_change_requests.create!(args) if args[:change_state] == EmailChangeRequest.states[:authorizing_new] send_email(:confirm_new_email, email_token) diff --git a/lib/emoji/db.json b/lib/emoji/db.json index a0b396bcf3b..0ae88e7309a 100644 --- a/lib/emoji/db.json +++ b/lib/emoji/db.json @@ -1300,10 +1300,6 @@ "code": "1f342", "name": "fallen_leaf" }, - { - "code": "1f46a", - "name": "family" - }, { "code": "23e9", "name": "fast_forward" @@ -1388,46 +1384,6 @@ "code": "1f3f4", "name": "flag_black" }, - { - "code": "1f1e8-1f1f3", - "name": "flag_cn" - }, - { - "code": "1f1e9-1f1ea", - "name": "flag_de" - }, - { - "code": "1f1ea-1f1f8", - "name": "flag_es" - }, - { - "code": "1f1eb-1f1f7", - "name": "flag_fr" - }, - { - "code": "1f1ec-1f1e7", - "name": "flag_gb" - }, - { - "code": "1f1ee-1f1f9", - "name": "flag_it" - }, - { - "code": "1f1ef-1f1f5", - "name": "flag_jp" - }, - { - "code": "1f1f0-1f1f7", - "name": "flag_kr" - }, - { - "code": "1f1f7-1f1fa", - "name": "flag_ru" - }, - { - "code": "1f1fa-1f1f8", - "name": "flag_us" - }, { "code": "1f3f3", "name": "flag_white" @@ -4107,6 +4063,126 @@ { "code": "1f4a4", "name": "zzz" + }, + { + "code": "1f469-200d-2764-fe0f-200d-1f469", + "name": "female_couple_with_heart" + }, + { + "code": "1f468-200d-2764-fe0f-200d-1f468", + "name": "male_couple_with_heart" + }, + { + "code": "1f469-200d-2764-fe0f-200d-1f48b-200d-1f469", + "name": "female_couplekiss" + }, + { + "code": "1f468-200d-2764-fe0f-200d-1f48b-200d-1f468", + "name": "male_couplekiss" + }, + { + "code": "1f468-200d-1f469-200d-1f467", + "name": "family_man_woman_girl" + }, + { + "code": "1f468-200d-1f469-200d-1f467-200d-1f466", + "name": "family_man_woman_girl_boy" + }, + { + "code": "1f468-200d-1f469-200d-1f466-200d-1f466", + "name": "family_man_woman_boys" + }, + { + "code": "1f468-200d-1f469-200d-1f467-200d-1f467", + "name": "family_man_woman_girls" + }, + { + "code": "1f469-200d-1f469-200d-1f466", + "name": "family_women_boy" + }, + { + "code": "1f469-200d-1f469-200d-1f467", + "name": "family_women_girl" + }, + { + "code": "1f469-200d-1f469-200d-1f467-200d-1f466", + "name": "family_women_girl_boy" + }, + { + "code": "1f469-200d-1f469-200d-1f466-200d-1f466", + "name": "family_women_boys" + }, + { + "code": "1f469-200d-1f469-200d-1f467-200d-1f467", + "name": "family_women_girls" + }, + { + "code": "1f468-200d-1f468-200d-1f466", + "name": "family_men_boy" + }, + { + "code": "1f468-200d-1f468-200d-1f467", + "name": "family_men_girl" + }, + { + "code": "1f468-200d-1f468-200d-1f467-200d-1f466", + "name": "family_men_girl_boy" + }, + { + "code": "1f468-200d-1f468-200d-1f466-200d-1f466", + "name": "family_men_boys" + }, + { + "code": "1f468-200d-1f468-200d-1f467-200d-1f467", + "name": "family_men_girls" + }, + { + "code": "002a-20e3", + "name": "keycap_star" + }, + { + "code": "1f5e8", + "name": "left_speech_bubble" + }, + { + "code": "1f1e8-1f1f3", + "name": "cn" + }, + { + "code": "1f1eb-1f1f7", + "name": "fr" + }, + { + "code": "1f1e9-1f1ea", + "name": "de" + }, + { + "code": "1f1ee-1f1f9", + "name": "it" + }, + { + "code": "1f1ef-1f1f5", + "name": "jp" + }, + { + "code": "1f1f7-1f1fa", + "name": "ru" + }, + { + "code": "1f1f0-1f1f7", + "name": "kr" + }, + { + "code": "1f1ea-1f1f8", + "name": "es" + }, + { + "code": "1f1ec-1f1e7", + "name": "gb" + }, + { + "code": "1f1fa-1f1f8", + "name": "us" } ], "aliases": { @@ -4212,35 +4288,35 @@ "flag_black": [ "waving_black_flag" ], - "flag_cn": [ - "cn" + "cn": [ + "flag_cn" ], - "flag_de": [ - "de" + "de": [ + "flag_de" ], - "flag_es": [ - "es" + "es": [ + "flag_es" ], - "flag_fr": [ - "fr" + "fr": [ + "flag_fr" ], - "flag_gb": [ - "gb" + "gb": [ + "flag_gb" ], - "flag_it": [ - "it" + "it": [ + "flag_it" ], - "flag_jp": [ - "jp" + "jp": [ + "flag_jp" ], - "flag_kr": [ - "kr" + "kr": [ + "flag_kr" ], - "flag_ru": [ - "ru" + "ru": [ + "flag_ru" ], - "flag_us": [ - "us" + "us": [ + "flag_us" ], "flag_white": [ "waving_white_flag" @@ -4464,4 +4540,4 @@ "zipper_mouth_face" ] } -} +} \ No newline at end of file diff --git a/lib/excerpt_parser.rb b/lib/excerpt_parser.rb index 4a19c337a82..2c62b937198 100644 --- a/lib/excerpt_parser.rb +++ b/lib/excerpt_parser.rb @@ -14,6 +14,7 @@ class ExcerptParser < Nokogiri::XML::SAX::Document @markdown_images = options[:markdown_images] == true @keep_newlines = options[:keep_newlines] == true @keep_emoji_images = options[:keep_emoji_images] == true + @remap_emoji = options[:remap_emoji] == true @start_excerpt = false end @@ -51,7 +52,11 @@ class ExcerptParser < Nokogiri::XML::SAX::Document attributes = Hash[*attributes.flatten] if attributes["class"] == 'emoji' - if @keep_emoji_images + if @remap_emoji + title = (attributes["alt"] || "").gsub(":", "") + title = Emoji.lookup_unicode(title) || attributes["alt"] + return characters(title) + elsif @keep_emoji_images return include_tag(name, attributes) else return characters(attributes["alt"]) diff --git a/lib/file_store/base_store.rb b/lib/file_store/base_store.rb index e88269f7f9d..6f7556494d8 100644 --- a/lib/file_store/base_store.rb +++ b/lib/file_store/base_store.rb @@ -13,35 +13,43 @@ module FileStore end def store_file(file, path, opts = {}) + not_implemented end def remove_upload(upload) - remove_file(upload.url) + remove_file(upload.url, get_path_for_upload(upload)) end def remove_optimized_image(optimized_image) - remove_file(optimized_image.url) + remove_file(optimized_image.url, get_path_for_optimized_image(optimized_image)) end - def remove_file(url) + def remove_file(url, path) + not_implemented end def has_been_uploaded?(url) + not_implemented end def download_url(upload) + not_implemented end def cdn_url(url) + not_implemented end def absolute_base_url + not_implemented end def relative_base_url + not_implemented end def external? + not_implemented end def internal? @@ -49,6 +57,7 @@ module FileStore end def path_for(upload) + not_implemented end def download(upload) @@ -111,6 +120,12 @@ module FileStore `ls -tr #{CACHE_DIR} | head -n +#{CACHE_MAXIMUM_SIZE} | xargs rm -f` end + private + + def not_implemented + raise "Not implemented." + end + end end diff --git a/lib/file_store/local_store.rb b/lib/file_store/local_store.rb index 3891656b084..411b93ed0d2 100644 --- a/lib/file_store/local_store.rb +++ b/lib/file_store/local_store.rb @@ -9,7 +9,7 @@ module FileStore "#{Discourse.base_uri}#{path}" end - def remove_file(url) + def remove_file(url, _) return unless is_relative?(url) source = "#{public_dir}#{url}" return unless File.exists?(source) diff --git a/lib/file_store/s3_store.rb b/lib/file_store/s3_store.rb index 0a50ce4459e..b19963bb65d 100644 --- a/lib/file_store/s3_store.rb +++ b/lib/file_store/s3_store.rb @@ -1,13 +1,11 @@ require "uri" require_dependency "file_store/base_store" -require_dependency "file_store/local_store" require_dependency "s3_helper" require_dependency "file_helper" module FileStore class S3Store < BaseStore - TOMBSTONE_PREFIX ||= "tombstone/" def initialize(s3_helper=nil) @@ -19,32 +17,36 @@ module FileStore store_file(file, path, filename: upload.original_filename, content_type: content_type, cache_locally: true) end + def store_optimized_image(file, optimized_image, content_type = nil) + path = get_path_for_optimized_image(optimized_image) + store_file(file, path, content_type: content_type) + end + # options # - filename # - content_type # - cache_locally def store_file(file, path, opts={}) - filename = opts[:filename].presence - content_type = opts[:content_type].presence + filename = opts[:filename].presence || File.basename(path) # cache file locally when needed cache_file(file, File.basename(path)) if opts[:cache_locally] # stored uploaded are public by default - options = { acl: "public-read" } + options = { + acl: "public-read", + content_type: opts[:content_type].presence || Rack::Mime.mime_type(File.extname(filename)) + } # add a "content disposition" header for "attachments" - options[:content_disposition] = "attachment; filename=\"#{filename}\"" if filename && !FileHelper.is_image?(filename) - # add a "content type" header when provided - options[:content_type] = content_type if content_type + options[:content_disposition] = "attachment; filename=\"#{filename}\"" unless FileHelper.is_image?(filename) # if this fails, it will throw an exception - @s3_helper.upload(file, path, options) + path = @s3_helper.upload(file, path, options) # return the upload url "#{absolute_base_url}/#{path}" end - def remove_file(url) + def remove_file(url, path) return unless has_been_uploaded?(url) - filename = File.basename(url) # copy the removed file to tombstone - @s3_helper.remove(filename, true) + @s3_helper.remove(path, true) end def has_been_uploaded?(url) @@ -59,13 +61,15 @@ module FileStore end def absolute_base_url + bucket = @s3_helper.s3_bucket_name + # cf. http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region @absolute_base_url ||= if SiteSetting.s3_region == "us-east-1" - "//#{s3_bucket}.s3.amazonaws.com" + "//#{bucket}.s3.amazonaws.com" elsif SiteSetting.s3_region == 'cn-north-1' - "//#{s3_bucket}.s3.cn-north-1.amazonaws.com.cn" + "//#{bucket}.s3.cn-north-1.amazonaws.com.cn" else - "//#{s3_bucket}.s3-#{SiteSetting.s3_region}.amazonaws.com" + "//#{bucket}.s3-#{SiteSetting.s3_region}.amazonaws.com" end end @@ -99,12 +103,8 @@ module FileStore end def s3_bucket - @s3_bucket ||= begin - raise Discourse::SiteSettingMissing.new("s3_upload_bucket") if SiteSetting.s3_upload_bucket.blank? - SiteSetting.s3_upload_bucket.downcase - end + raise Discourse::SiteSettingMissing.new("s3_upload_bucket") if SiteSetting.s3_upload_bucket.blank? + SiteSetting.s3_upload_bucket.downcase end - end - end diff --git a/lib/freedom_patches/fast_pluck.rb b/lib/freedom_patches/fast_pluck.rb index 45da8550365..ac1203c66d0 100644 --- a/lib/freedom_patches/fast_pluck.rb +++ b/lib/freedom_patches/fast_pluck.rb @@ -1,5 +1,6 @@ # Speeds up #pluck so its about 2.2x faster, importantly makes pluck avoid creation of a slew # of AR objects +# require_dependency 'sql_builder' @@ -34,22 +35,10 @@ class ActiveRecord::Relation # end class ::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter - if Rails.version >= "4.2.0" - def select_raw(arel, name = nil, binds = [], &block) - arel, binds = binds_from_relation arel, binds - sql = to_sql(arel, binds) - execute_and_clear(sql, name, binds, &block) - end - else - - def select_raw(arel, name = nil, binds = [], &block) - arel, binds = binds_from_relation arel, binds - sql = to_sql(arel, binds) - - result = without_prepared_statement?(binds) ? exec_no_cache(sql, 'SQL', binds) : - exec_cache(sql, 'SQL', binds) - yield result, nil - end + def select_raw(arel, name = nil, binds = [], &block) + arel, binds = binds_from_relation arel, binds + sql = to_sql(arel, binds) + execute_and_clear(sql, name, binds, &block) end end @@ -66,7 +55,6 @@ class ActiveRecord::Relation end end - if has_include?(cols.first) construct_relation_for_association_calculations.pluck(*cols) else @@ -76,7 +64,7 @@ class ActiveRecord::Relation columns_hash.key?(cn) ? arel_table[cn] : cn } - conn.select_raw(relation) do |result,_| + conn.select_raw(relation, nil, relation.arel.bind_values + bind_values) do |result,_| result.type_map = SqlBuilder.pg_type_map result.nfields == 1 ? result.column_values(0) : result.values end diff --git a/lib/freedom_patches/raw_handlebars.rb b/lib/freedom_patches/raw_handlebars.rb index 28f04e3140a..888e99e4138 100644 --- a/lib/freedom_patches/raw_handlebars.rb +++ b/lib/freedom_patches/raw_handlebars.rb @@ -9,7 +9,7 @@ class Barber::Precompiler def precompiler if !@precompiler - source = File.read("#{Rails.root}/app/assets/javascripts/discourse/lib/raw-handlebars.js.es6") + source = File.read("#{Rails.root}/app/assets/javascripts/discourse-common/lib/raw-handlebars.js.es6") template = Tilt::ES6ModuleTranspilerTemplate.new {} transpiled = template.babel_transpile(source) @@ -40,11 +40,11 @@ module Discourse module Handlebars module Helper def precompile_handlebars(string) - "require('discourse/lib/raw-handlebars').template(#{Barber::Precompiler.compile(string)});" + "require('discourse-common/lib/raw-handlebars').template(#{Barber::Precompiler.compile(string)});" end def compile_handlebars(string) - "require('discourse/lib/raw-handlebars').compile(#{indent(string).inspect});" + "require('discourse-common/lib/raw-handlebars').compile(#{indent(string).inspect});" end end end @@ -54,6 +54,18 @@ end class Ember::Handlebars::Template include Discourse::Ember::Handlebars::Helper + def precompile_handlebars(string, input=nil) + "require('discourse-common/lib/raw-handlebars').template(#{Barber::Precompiler.compile(string)});" + end + + def compile_handlebars(string, input=nil) + "require('discourse-common/lib/raw-handlebars').compile(#{indent(string).inspect});" + end + + def global_template_target(namespace, module_name, config) + "#{namespace}[#{template_path(module_name, config).inspect}]" + end + # FIXME: Previously, ember-handlebars-templates uses the logical path which incorrectly # returned paths with the `.raw` extension and our code is depending on the `.raw` # to find the right template to use. diff --git a/lib/freedom_patches/translate_accelerator.rb b/lib/freedom_patches/translate_accelerator.rb index c5e8abf3ab1..8b734f9c89d 100644 --- a/lib/freedom_patches/translate_accelerator.rb +++ b/lib/freedom_patches/translate_accelerator.rb @@ -90,7 +90,6 @@ module I18n key = args.shift locale = options[:locale] || config.locale - @cache ||= LruRedux::ThreadSafeCache.new(LRU_CACHE_SIZE) k = "#{key}#{locale}#{config.backend.object_id}" @@ -122,7 +121,7 @@ module I18n end end - by_site[locale] + by_site[locale].with_indifferent_access end def client_overrides_json(locale) @@ -138,8 +137,7 @@ module I18n load_locale(locale) unless @loaded_locales.include?(locale) if @overrides_enabled - by_locale = overrides_by_locale(locale) - if by_locale + if by_locale = overrides_by_locale(locale) if options.present? options[:overrides] = by_locale @@ -152,9 +150,9 @@ module I18n return result end end - end end + translate_no_override(key, options) end diff --git a/lib/guardian.rb b/lib/guardian.rb index ecfedc92e54..bd678fd811b 100644 --- a/lib/guardian.rb +++ b/lib/guardian.rb @@ -177,7 +177,7 @@ class Guardian end def can_grant_admin?(user) - can_administer_user?(user) && not(user.admin?) + can_administer_user?(user) && !user.admin? end def can_revoke_moderation?(moderator) @@ -185,7 +185,7 @@ class Guardian end def can_grant_moderation?(user) - can_administer?(user) && not(user.moderator?) + can_administer?(user) && !user.moderator? end def can_grant_title?(user) @@ -313,7 +313,7 @@ class Guardian end def can_administer?(obj) - is_admin? && obj.present? + is_admin? && obj.present? && obj.id&.positive? end def can_administer_user?(other_user) diff --git a/lib/guardian/category_guardian.rb b/lib/guardian/category_guardian.rb index dbe5f868194..7e67066e892 100644 --- a/lib/guardian/category_guardian.rb +++ b/lib/guardian/category_guardian.rb @@ -68,4 +68,8 @@ module CategoryGuardian def topic_create_allowed_category_ids @topic_create_allowed_category_ids ||= @user.topic_create_allowed_category_ids end + + def topic_featured_link_allowed_category_ids + @topic_featured_link_allowed_category_ids = Category.where(topic_featured_link_allowed: true).pluck(:id) + end end diff --git a/lib/guardian/group_guardian.rb b/lib/guardian/group_guardian.rb index 8cc3ffa3899..95ec4f2fdef 100644 --- a/lib/guardian/group_guardian.rb +++ b/lib/guardian/group_guardian.rb @@ -5,11 +5,14 @@ module GroupGuardian # Automatic groups are not represented in the GROUP_USERS # table and thus do not allow membership changes. def can_edit_group?(group) - (is_admin? || group.users.where('group_users.owner').include?(user)) && !group.automatic + can_log_group_changes?(group) && !group.automatic + end + + def can_log_group_changes?(group) + (is_admin? || group.users.where('group_users.owner').include?(user)) end def can_see_group_messages?(group) is_admin? || group.users.include?(user) end - end diff --git a/lib/guardian/post_guardian.rb b/lib/guardian/post_guardian.rb index 996ee027ccc..b29467ceede 100644 --- a/lib/guardian/post_guardian.rb +++ b/lib/guardian/post_guardian.rb @@ -58,7 +58,10 @@ module PostGuardian return false unless topic type_symbol = PostActionType.types[post_action_type_id] + return false if type_symbol == :bookmark + return false if type_symbol == :notify_user && !is_moderator? + return can_see_flags?(topic) if PostActionType.is_flag?(type_symbol) if type_symbol == :vote @@ -106,6 +109,10 @@ module PostGuardian return true end + if @user.trust_level < SiteSetting.min_trust_to_edit_post + return false + end + if is_my_own?(post) if post.hidden? return false if post.hidden_at.present? && @@ -183,6 +190,10 @@ module PostGuardian is_admin? end + def can_change_post_timestamps? + is_admin? + end + def can_wiki?(post) return false unless authenticated? return true if is_staff? || @user.has_trust_level?(TrustLevel[4]) diff --git a/lib/guardian/topic_guardian.rb b/lib/guardian/topic_guardian.rb index fabf1c879e7..f61a6139f8b 100644 --- a/lib/guardian/topic_guardian.rb +++ b/lib/guardian/topic_guardian.rb @@ -20,6 +20,7 @@ module TopicGuardian def can_create_post_on_topic?(topic) # No users can create posts on deleted topics + return false if topic.blank? return false if topic.trashed? return true if is_admin? @@ -104,4 +105,8 @@ module TopicGuardian records end + def can_edit_featured_link?(category_id) + return false unless SiteSetting.topic_featured_link_enabled + Category.where(id: category_id||SiteSetting.uncategorized_category_id, topic_featured_link_allowed: true).exists? + end end diff --git a/lib/homepage_constraint.rb b/lib/homepage_constraint.rb index 247da1c904c..a5cfb347582 100644 --- a/lib/homepage_constraint.rb +++ b/lib/homepage_constraint.rb @@ -4,8 +4,12 @@ class HomePageConstraint end def matches?(request) + return @filter == 'finish_installation' if SiteSetting.has_login_hint? + provider = Discourse.current_user_provider.new(request.env) homepage = provider.current_user ? SiteSetting.homepage : SiteSetting.anonymous_homepage homepage == @filter + rescue Discourse::InvalidAccess + false end end diff --git a/lib/import_export/category_exporter.rb b/lib/import_export/category_exporter.rb index 4036ed783f4..9f182e72470 100644 --- a/lib/import_export/category_exporter.rb +++ b/lib/import_export/category_exporter.rb @@ -24,8 +24,8 @@ module ImportExport CATEGORY_ATTRS = [:id, :name, :color, :created_at, :user_id, :slug, :description, :text_color, - :auto_close_hours, :logo_url, :background_url, :auto_close_based_on_last_post, - :topic_template, :suppress_from_homepage, :permissions_params] + :auto_close_hours, :auto_close_based_on_last_post, + :topic_template, :suppress_from_homepage, :all_topics_wiki, :permissions_params] def export_categories @export_data[:category] = CATEGORY_ATTRS.inject({}) { |h,a| h[a] = @category.send(a); h } diff --git a/lib/import_export/category_importer.rb b/lib/import_export/category_importer.rb index 9b21b7aa265..25b57acfcb9 100644 --- a/lib/import_export/category_importer.rb +++ b/lib/import_export/category_importer.rb @@ -47,7 +47,7 @@ module ImportExport parent = Category.new(@export_data[:category]) parent.user_id = @topic_importer.new_user_id(@export_data[:category][:user_id]) # imported user's new id parent.custom_fields["import_id"] = id - parent.permissions = permissions if permissions + parent.permissions = permissions.present? ? permissions : {"everyone" => CategoryGroup.permission_types[:full]} parent.save! set_category_description(parent, @export_data[:category][:description]) end @@ -62,7 +62,7 @@ module ImportExport subcategory.parent_category_id = parent.id subcategory.user_id = @topic_importer.new_user_id(cat_attrs[:user_id]) subcategory.custom_fields["import_id"] = id - subcategory.permissions = permissions if permissions + subcategory.permissions = permissions.present? ? permissions : {"everyone" => CategoryGroup.permission_types[:full]} subcategory.save! set_category_description(subcategory, cat_attrs[:description]) end diff --git a/lib/introduction_updater.rb b/lib/introduction_updater.rb new file mode 100644 index 00000000000..a576b0433c5 --- /dev/null +++ b/lib/introduction_updater.rb @@ -0,0 +1,42 @@ +class IntroductionUpdater + + def initialize(user) + @user = user + end + + def get_summary + summary_from_post(find_welcome_post) + end + + def update_summary(new_value) + post = find_welcome_post + return unless post + + previous_value = summary_from_post(post).strip + + if previous_value != new_value + revisor = PostRevisor.new(post) + + remaining = post.raw.split("\n")[1..-1] + revisor.revise!(@user, raw: "#{new_value}\n#{remaining.join("\n")}") + end + + end + +protected + + def summary_from_post(post) + return post ? post.raw.split("\n").first : nil + end + + def find_welcome_post + welcome_topic = Topic.where(slug: 'welcome-to-discourse').first + return nil unless welcome_topic.present? + + post = welcome_topic.posts.where(post_number: 1).first + return nil unless post.present? + + post + end + +end diff --git a/lib/javascripts/locale/uk.js b/lib/javascripts/locale/uk.js index aad90c79729..edb43885ab4 100644 --- a/lib/javascripts/locale/uk.js +++ b/lib/javascripts/locale/uk.js @@ -8,7 +8,8 @@ MessageFormat.locale.uk = function (n) { } if ((n % 10) === 0 || ((n % 10) >= 5 && (n % 10) <= 9) || ((n % 100) >= 11 && (n % 100) <= 14) && n == Math.floor(n)) { - return 'many'; + // return 'many'; + return 'other'; // TODO should be "many" but is not defined in translations } return 'other'; }; diff --git a/lib/javascripts/moment_locale/ur.js b/lib/javascripts/moment_locale/ur.js new file mode 100644 index 00000000000..8d2111fd03a --- /dev/null +++ b/lib/javascripts/moment_locale/ur.js @@ -0,0 +1,98 @@ +//! moment.js locale configuration +//! locale : Urdu [ur] +//! author : Sawood Alam : https://github.com/ibnesayeed + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + && typeof require === 'function' ? factory(require('../moment')) : + typeof define === 'function' && define.amd ? define(['../moment'], factory) : + factory(global.moment) +}(this, (function (moment) { 'use strict'; + + +var months = [ + 'جنوری', + 'فروری', + 'مارچ', + 'اپریل', + 'مئی', + 'جون', + 'جولائی', + 'اگست', + 'ستمبر', + 'اکتوبر', + 'نومبر', + 'دسمبر' +]; +var days = [ + 'اتوار', + 'پیر', + 'منگل', + 'بدھ', + 'جمعرات', + 'جمعہ', + 'ہفتہ' +]; + +var ur = moment.defineLocale('ur', { + months : months, + monthsShort : months, + weekdays : days, + weekdaysShort : days, + weekdaysMin : days, + longDateFormat : { + LT : 'HH:mm', + LTS : 'HH:mm:ss', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY HH:mm', + LLLL : 'dddd، D MMMM YYYY HH:mm' + }, + meridiemParse: /صبح|شام/, + isPM : function (input) { + return 'شام' === input; + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return 'صبح'; + } + return 'شام'; + }, + calendar : { + sameDay : '[آج بوقت] LT', + nextDay : '[کل بوقت] LT', + nextWeek : 'dddd [بوقت] LT', + lastDay : '[گذشتہ روز بوقت] LT', + lastWeek : '[گذشتہ] dddd [بوقت] LT', + sameElse : 'L' + }, + relativeTime : { + future : '%s بعد', + past : '%s قبل', + s : 'چند سیکنڈ', + m : 'ایک منٹ', + mm : '%d منٹ', + h : 'ایک گھنٹہ', + hh : '%d گھنٹے', + d : 'ایک دن', + dd : '%d دن', + M : 'ایک ماہ', + MM : '%d ماہ', + y : 'ایک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/،/g, ','); + }, + postformat: function (string) { + return string.replace(/,/g, '،'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } +}); + +return ur; + +}))); diff --git a/lib/js_locale_helper.rb b/lib/js_locale_helper.rb index c225d73dfd9..e8550b1b887 100644 --- a/lib/js_locale_helper.rb +++ b/lib/js_locale_helper.rb @@ -1,5 +1,21 @@ module JsLocaleHelper + def self.plugin_translations(locale_str) + @plugin_translations ||= HashWithIndifferentAccess.new + + @plugin_translations[locale_str] ||= begin + translations = {} + + Dir["#{Rails.root}/plugins/*/config/locales/client.#{locale_str}.yml"].each do |file| + if plugin_translations = YAML::load(File.open(file))[locale_str] + translations.deep_merge!(plugin_translations) + end + end + + translations + end + end + def self.load_translations(locale, opts=nil) opts ||= {} @@ -11,23 +27,9 @@ module JsLocaleHelper # load default translations translations = YAML::load(File.open("#{Rails.root}/config/locales/client.#{locale_str}.yml")) - # load plugins translations - plugin_translations = {} - Dir["#{Rails.root}/plugins/*/config/locales/client.#{locale_str}.yml"].each do |file| - plugin_translations.deep_merge! YAML::load(File.open(file)) - end # merge translations (plugin translations overwrite default translations) - translations[locale_str]['js'].deep_merge!(plugin_translations[locale_str]['js']) if translations[locale_str] && plugin_translations[locale_str] && plugin_translations[locale_str]['js'] - - # We used to split the admin versus the client side, but it's much simpler to just - # include both for now due to the small size of the admin section. - # - # For now, let's leave it split out in the translation file in case we want to split - # it again later, so we'll merge the JSON ourselves. - admin_contents = translations[locale_str].delete('admin_js') - translations[locale_str]['js'].deep_merge!(admin_contents) if admin_contents.present? - translations[locale_str]['js'].deep_merge!(plugin_translations[locale_str]['admin_js']) if translations[locale_str] && plugin_translations[locale_str] && plugin_translations[locale_str]['admin_js'] + translations[locale_str]['js'].deep_merge!(plugin_translations(locale_str)['js']) if translations[locale_str] && plugin_translations(locale_str) && plugin_translations(locale_str)['js'] translations end @@ -72,25 +74,36 @@ module JsLocaleHelper end end - def self.output_locale(locale) - locale_sym = locale.to_sym - locale_str = locale.to_s + def self.translations_for(locale_str) + locale_sym = locale_str.to_sym current_locale = I18n.locale I18n.locale = locale_sym site_locale = SiteSetting.default_locale.to_sym - if Rails.env.development? - translations = load_translations(locale_sym, force: true) - else - if locale_sym == :en - translations = load_translations(locale_sym) + translations = + if Rails.env.development? + load_translations(locale_sym, force: true) + elsif locale_sym == :en + load_translations(locale_sym) elsif locale_sym == site_locale || site_locale == :en - translations = load_translations_merged(locale_sym, :en) + load_translations_merged(locale_sym, :en) else - translations = load_translations_merged(locale_sym, site_locale, :en) + load_translations_merged(locale_sym, site_locale, :en) end + + I18n.locale = current_locale + + translations + end + + def self.output_locale(locale) + locale_str = locale.to_s + translations = translations_for(locale_str).dup + + translations[locale_str].keys.each do |k| + translations[locale_str].delete(k) unless k == "js" end message_formats = strip_out_message_formats!(translations[locale_str]['js']) @@ -104,8 +117,6 @@ module JsLocaleHelper result << moment_locale(locale_str) result << moment_formats - I18n.locale = current_locale - result end diff --git a/lib/letter_avatar.rb b/lib/letter_avatar.rb index 7c79c033e9d..79e1a9b884e 100644 --- a/lib/letter_avatar.rb +++ b/lib/letter_avatar.rb @@ -57,11 +57,11 @@ class LetterAvatar def cached_path(identity, size) dir = "#{cache_path}/#{identity.letter}/#{identity.color.join("_")}" FileUtils.mkdir_p(dir) - "#{dir}/#{size}.png" + File.expand_path "#{dir}/#{size}.png" end def fullsize_path(identity) - cached_path(identity, FULLSIZE) + File.expand_path cached_path(identity, FULLSIZE) end def generate_fullsize(identity) diff --git a/lib/middleware/anonymous_cache.rb b/lib/middleware/anonymous_cache.rb index a79b4225663..149ac3f009e 100644 --- a/lib/middleware/anonymous_cache.rb +++ b/lib/middleware/anonymous_cache.rb @@ -11,6 +11,7 @@ module Middleware class Helper USER_AGENT = "HTTP_USER_AGENT".freeze RACK_SESSION = "rack.session".freeze + ACCEPT_ENCODING = "HTTP_ACCEPT_ENCODING".freeze def initialize(env) @env = env @@ -35,6 +36,14 @@ module Middleware @is_mobile == :true end + def has_brotli? + @has_brotli ||= + begin + @env[ACCEPT_ENCODING].to_s =~ /br/ ? :true : :false + end + @has_brotli == :true + end + def is_crawler? @is_crawler ||= begin @@ -45,7 +54,7 @@ module Middleware end def cache_key - @cache_key ||= "ANON_CACHE_#{@env["HTTP_ACCEPT"]}_#{@env["HTTP_HOST"]}#{@env["REQUEST_URI"]}|m=#{is_mobile?}|c=#{is_crawler?}" + @cache_key ||= "ANON_CACHE_#{@env["HTTP_ACCEPT"]}_#{@env["HTTP_HOST"]}#{@env["REQUEST_URI"]}|m=#{is_mobile?}|c=#{is_crawler?}|b=#{has_brotli?}" end def cache_key_body diff --git a/lib/middleware/request_tracker.rb b/lib/middleware/request_tracker.rb index 4a1bcb08034..90b36890d0e 100644 --- a/lib/middleware/request_tracker.rb +++ b/lib/middleware/request_tracker.rb @@ -78,6 +78,9 @@ class Middleware::RequestTracker host = RailsMultisite::ConnectionManagement.host(env) if data + if result && (headers=result[1]) + headers["X-Discourse-TrackView"] = "1" if data[:track_view] + end log_later(data,host) end diff --git a/lib/middleware/unicorn_oobgc.rb b/lib/middleware/unicorn_oobgc.rb deleted file mode 100644 index 0764b27e51e..00000000000 --- a/lib/middleware/unicorn_oobgc.rb +++ /dev/null @@ -1,141 +0,0 @@ -# THIS FILE IS TO BE EXTRACTED FROM DISCOURSE IT IS LICENSED UNDER THE MIT LICENSE -# -# The MIT License (MIT) -# -# Copyright (c) 2013 Discourse -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -# Hook into unicorn, unicorn middleware, not rack middleware -# -# Since we need no knowledge about the request we can simply -# hook unicorn -module Middleware::UnicornOobgc - - MIN_REQUESTS_PER_OOBGC = 3 - - # TUNE ME, for Discourse this number is good - MIN_FREE_SLOTS = 50_000 - - # The oobgc implementation is far more efficient in 2.1 - # as we have a bunch of profiling hooks to hook it - # use @tmm1s implementation - def use_gctools? - if @use_gctools.nil? - @use_gctools = - if RUBY_VERSION >= "2.1.0" - require "gctools/oobgc" - true - else - false - end - end - @use_gctools - end - - def verbose(msg=nil) - @verbose ||= ENV["OOBGC_VERBOSE"] == "1" ? :true : :false - if @verbose == :true - if(msg) - puts msg - end - - true - end - end - - def self.init - # hook up HttpServer intercept - ObjectSpace.each_object(Unicorn::HttpServer) do |s| - s.extend(self) - end - rescue - puts "Attempted to patch Unicorn but it is not loaded" - end - - # the closer this is to the GC run the more accurate it is - def estimate_live_num_at_gc(stat) - stat[:heap_live_num] + stat[:heap_free_num] - end - - def process_client(client) - - if use_gctools? - super(client) - GC::OOB.run - return - end - - stat = GC.stat - - @num_requests ||= 0 - @num_requests += 1 - - gc_count = stat[:count] - live_num = stat[:heap_live_num] - - @expect_gc_at ||= estimate_live_num_at_gc(stat) - - super(client) # Unicorn::HttpServer#process_client - - # at this point client is serviced - stat = GC.stat - new_gc_count = stat[:count] - new_live_num = stat[:heap_live_num] - - # no GC happened during the request - if new_gc_count == gc_count - delta = new_live_num - live_num - - @max_delta ||= delta - - if delta > @max_delta - new_delta = (@max_delta * 1.5).to_i - @max_delta = [new_delta, delta].min - else - # this may seem like a very tiny decay rate, but some apps using caching - # can really mess stuff up, if our delta is too low the algorithm fails - new_delta = (@max_delta * 0.99).to_i - @max_delta = [new_delta, delta].max - end - - if @max_delta < MIN_FREE_SLOTS - @max_delta = MIN_FREE_SLOTS - end - - if @num_requests > MIN_REQUESTS_PER_OOBGC && @max_delta * 2 + new_live_num > @expect_gc_at - t = Time.now - GC.start - stat = GC.stat - @expect_gc_at = estimate_live_num_at_gc(stat) - verbose "OobGC hit pid: #{Process.pid} req: #{@num_requests} max delta: #{@max_delta} expect at: #{@expect_gc_at} #{((Time.now - t) * 1000).to_i}ms saved" - @num_requests = 0 - end - else - - verbose "OobGC miss pid: #{Process.pid} reqs: #{@num_requests} max delta: #{@max_delta}" - - @num_requests = 0 - @expect_gc_at = estimate_live_num_at_gc(stat) - - end - - end - -end diff --git a/lib/new_post_manager.rb b/lib/new_post_manager.rb index f354a277ad1..27aebae6639 100644 --- a/lib/new_post_manager.rb +++ b/lib/new_post_manager.rb @@ -73,6 +73,7 @@ class NewPostManager (user.trust_level <= TrustLevel.levels[:basic] && user.post_count < SiteSetting.approve_post_count) || (user.trust_level < SiteSetting.approve_unless_trust_level.to_i) || + (manager.args[:title].present? && user.trust_level < SiteSetting.approve_new_topics_unless_trust_level.to_i) || is_fast_typer?(manager) || matches_auto_block_regex?(manager) end @@ -80,6 +81,27 @@ class NewPostManager def self.default_handler(manager) if user_needs_approval?(manager) + validator = Validators::PostValidator.new + post = Post.new(raw: manager.args[:raw]) + post.user = manager.user + validator.validate(post) + if post.errors[:raw].present? + result = NewPostResult.new(:created_post, false) + result.errors[:base] = post.errors[:raw] + return result + end + + # Can the user create the post in the first place? + if manager.args[:topic_id] + topic = Topic.unscoped.where(id: manager.args[:topic_id]).first + + unless manager.user.guardian.can_create_post_on_topic?(topic) + result = NewPostResult.new(:created_post, false) + result.errors[:base] << I18n.t(:topic_not_found) + return result + end + end + result = manager.enqueue('default') if is_fast_typer?(manager) || matches_auto_block_regex?(manager) @@ -93,6 +115,7 @@ class NewPostManager def self.queue_enabled? SiteSetting.approve_post_count > 0 || SiteSetting.approve_unless_trust_level.to_i > 0 || + SiteSetting.approve_new_topics_unless_trust_level.to_i > 0 || handlers.size > 1 end diff --git a/lib/onebox/engine/discourse_local_onebox.rb b/lib/onebox/engine/discourse_local_onebox.rb index 3e022e05263..44b60030390 100644 --- a/lib/onebox/engine/discourse_local_onebox.rb +++ b/lib/onebox/engine/discourse_local_onebox.rb @@ -3,117 +3,98 @@ module Onebox class DiscourseLocalOnebox include Engine - # we need to allow for multisite here - def self.is_on_site?(url) - Regexp.new("^#{Discourse.base_url.gsub(".","\\.")}.*$", true) === url.to_s - end - # Use this onebox before others def self.priority 1 end def self.===(other) - if other.kind_of?(URI) - uri = other - begin - route = Rails.application.routes.recognize_path(uri.path.sub(Discourse.base_uri, "")) - case route[:controller] - when 'uploads' - is_on_site?(other) - when 'topics' - # super will use matches_regexp to match the domain name - is_on_site?(other) - else - false - end - rescue ActionController::RoutingError - false - end - else - is_on_site?(other) - end + url = other.to_s + return false unless url[Discourse.base_url] + + path = url.sub(Discourse.base_url, "") + route = Rails.application.routes.recognize_path(path) + + !!(route[:controller] =~ /topics|uploads/) + rescue ActionController::RoutingError + false end def to_html - uri = URI::parse(@url) - route = Rails.application.routes.recognize_path(uri.path.sub(Discourse.base_uri, "")) - url = @url.sub(/[&?]source_topic_id=(\d+)/, "") - source_topic_id = $1.to_i + path = @url.sub(Discourse.base_url, "") + route = Rails.application.routes.recognize_path(path) - # Figure out what kind of onebox to show based on the URL case route[:controller] - when 'uploads' + when "uploads" then upload_html(path) + when "topics" then topic_html(route) + end + end - url.gsub!("http:", "https:") if SiteSetting.force_https - if File.extname(uri.path) =~ /^.(mov|mp4|webm|ogv)$/ - return "" - elsif File.extname(uri.path) =~ /^.(mp3|ogg|wav)$/ - return "" - else - return false + private + + def upload_html(path) + case File.extname(path) + when /^\.(mov|mp4|webm|ogv)$/i + "" + when /^\.(mp3|ogg|wav|m4a)$/i + "" end - when 'topics' + end + + def topic_html(route) + link = "#{@url}" + source_topic_id = @url[/[&?]source_topic_id=(\d+)/, 1].to_i + source_topic = Topic.find_by(id: source_topic_id) if source_topic_id > 0 - 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) - return linked unless post - return linked if post.hidden - return linked unless Guardian.new.can_see?(post) + post = Post.find_by(topic_id: route[:topic_id], post_number: route[:post_number]) + return link unless can_see_post?(post, source_topic) topic = post.topic slug = Slug.for(topic.title) - excerpt = post.excerpt(SiteSetting.post_onebox_maxlength) - excerpt.gsub!("\n"," ") - # hack to make it render for now - excerpt.gsub!("[/quote]", "[quote]") + excerpt.gsub!(/[\r\n]+/, " ") + excerpt.gsub!("[/quote]", "[quote]") # don't break my quote + quote = "[quote=\"#{post.user.username}, topic:#{topic.id}, slug:#{slug}, post:#{post.post_number}\"]#{excerpt}[/quote]" args = {} args[:topic_id] = source_topic_id if source_topic_id > 0 - cooked = PrettyText.cook(quote, args) - return cooked + PrettyText.cook(quote, args) else - # Topic Link - topic = Topic.where(id: route[:topic_id].to_i).includes(:user).first - return linked unless topic - return linked unless Guardian.new.can_see?(topic) + topic = Topic.find_by(id: route[:topic_id]) + return link unless can_see_topic?(topic, source_topic) - post = topic.posts.first + first_post = topic.ordered_posts.first - posters = topic.posters_summary.map do |p| - { - username: p[:user].username, - avatar: PrettyText.avatar_img(p[:user].avatar_template, 'tiny'), - description: p[:description], - extras: p[:extras] - } - end + args = { + topic: topic.id, + avatar: PrettyText.avatar_img(topic.user.avatar_template, "tiny"), + original_url: @url, + title: PrettyText.unescape_emoji(CGI::escapeHTML(topic.title)), + category_html: CategoryBadge.html_for(topic.category), + quote: first_post.excerpt(SiteSetting.post_onebox_maxlength), + } - quote = post.excerpt(SiteSetting.post_onebox_maxlength) - args = { original_url: url, - title: PrettyText.unescape_emoji(CGI::escapeHTML(topic.title)), - avatar: PrettyText.avatar_img(topic.user.avatar_template, 'tiny'), - posts_count: topic.posts_count, - last_post: FreedomPatches::Rails4.time_ago_in_words(topic.last_posted_at, false, scope: :'datetime.distance_in_words_verbose'), - age: FreedomPatches::Rails4.time_ago_in_words(topic.created_at, false, scope: :'datetime.distance_in_words_verbose'), - views: topic.views, - posters: posters, - quote: quote, - category_html: CategoryBadge.html_for(topic.category), - topic: topic.id } - - return Mustache.render(File.read("#{Rails.root}/lib/onebox/templates/discourse_topic_onebox.hbs"), args) + template = File.read("#{Rails.root}/lib/onebox/templates/discourse_topic_onebox.hbs") + Mustache.render(template, args) end end - rescue ActionController::RoutingError - nil - end + def can_see_post?(post, source_topic) + return false if post.nil? || post.hidden || post.trashed? || post.topic.nil? + Guardian.new.can_see_post?(post) || same_category?(post.topic.category, source_topic) + end + + def can_see_topic?(topic, source_topic) + return false if topic.nil? || topic.trashed? || topic.private_message? + Guardian.new.can_see_topic?(topic) || same_category?(topic.category, source_topic) + end + + def same_category?(category, source_topic) + source_topic.try(:category_id) == category.try(:id) + end end end diff --git a/lib/onebox/engine/whitelisted_generic_onebox.rb b/lib/onebox/engine/whitelisted_generic_onebox.rb new file mode 100644 index 00000000000..1ea9a90892f --- /dev/null +++ b/lib/onebox/engine/whitelisted_generic_onebox.rb @@ -0,0 +1,17 @@ +module Onebox + module Engine + class WhitelistedGenericOnebox + + # overwrite the whitelist + def self.===(other) + true + end + + # ensure we're the last engine to be used + def self.priority + Float::INFINITY + end + + end + end +end diff --git a/lib/onebox/templates/discourse_topic_onebox.hbs b/lib/onebox/templates/discourse_topic_onebox.hbs index b9ca0aff51b..41a075db7f3 100644 --- a/lib/onebox/templates/discourse_topic_onebox.hbs +++ b/lib/onebox/templates/discourse_topic_onebox.hbs @@ -1,11 +1,9 @@ diff --git a/lib/oneboxer.rb b/lib/oneboxer.rb index 8430d9ff98f..db043464381 100644 --- a/lib/oneboxer.rb +++ b/lib/oneboxer.rb @@ -1,11 +1,6 @@ - -Dir["#{Rails.root}/lib/onebox/engine/*_onebox.rb"].each {|f| - require_dependency(f.split('/')[-3..-1].join('/')) -} +Dir["#{Rails.root}/lib/onebox/engine/*_onebox.rb"].sort.each { |f| require f } module Oneboxer - - # keep reloaders happy unless defined? Oneboxer::Result Result = Struct.new(:doc, :changed) do @@ -21,13 +16,13 @@ module Oneboxer def self.preview(url, options=nil) options ||= {} - Oneboxer.invalidate(url) if options[:invalidate_oneboxes] + invalidate(url) if options[:invalidate_oneboxes] onebox_raw(url)[:preview] end def self.onebox(url, options=nil) options ||= {} - Oneboxer.invalidate(url) if options[:invalidate_oneboxes] + invalidate(url) if options[:invalidate_oneboxes] onebox_raw(url)[:onebox] end @@ -51,10 +46,6 @@ module Oneboxer "" end - def self.oneboxer_exists_for_url?(url) - Onebox.has_matcher?(url) - end - def self.invalidate(url) Rails.cache.delete(onebox_cache_key(url)) end @@ -67,9 +58,7 @@ module Oneboxer onebox_links = doc.search("a.onebox") if onebox_links.present? onebox_links.each do |link| - if link['href'].present? - yield link['href'], link - end + yield(link['href'], link) if link['href'].present? end end @@ -95,7 +84,7 @@ module Oneboxer doc = Nokogiri::HTML::fragment(doc) if doc.is_a?(String) changed = false - Oneboxer.each_onebox_link(doc) do |url, element| + each_onebox_link(doc) do |url, element| if args && args[:topic_id] url = append_source_topic_id(url, args[:topic_id]) end @@ -119,39 +108,50 @@ module Oneboxer Result.new(doc, changed) end + def self.is_previewing?(user_id) + $redis.get(preview_key(user_id)) == "1" + end + + def self.preview_onebox!(user_id) + $redis.setex(preview_key(user_id), 1.minute, "1") + end + + def self.onebox_previewed!(user_id) + $redis.del(preview_key(user_id)) + end + + def self.engine(url) + Onebox::Matcher.new(url).oneboxed + end + private - def self.onebox_cache_key(url) - "onebox__#{url}" - end - def self.add_discourse_whitelists - # Add custom domain whitelists - if SiteSetting.onebox_domains_whitelist.present? - domains = SiteSetting.onebox_domains_whitelist.split('|') - whitelist = Onebox::Engine::WhitelistedGenericOnebox.whitelist - whitelist.concat(domains) - whitelist.uniq! + def self.preview_key(user_id) + "onebox:preview:#{user_id}" end - end - def self.onebox_raw(url) - Rails.cache.fetch(onebox_cache_key(url), expires_in: 1.day){ - # This might be able to move to whenever the SiteSetting changes? - Oneboxer.add_discourse_whitelists + def self.blank_onebox + { preview: "", onebox: "" } + end - r = Onebox.preview(url, cache: {}, max_width: 695) - { - onebox: r.to_s, - preview: r.try(:placeholder_html).to_s - } - } - rescue => e - # no point warning here, just cause we have an issue oneboxing a url - # we can later hunt for failed oneboxes by searching logs if needed - Rails.logger.info("Failed to onebox #{url} #{e} #{e.backtrace}") + def self.onebox_cache_key(url) + "onebox__#{url}" + end - # return a blank hash, so rest of the code works - {preview: "", onebox: ""} - end + def self.onebox_raw(url) + Rails.cache.fetch(onebox_cache_key(url), expires_in: 1.day) do + uri = URI(url) rescue nil + return blank_onebox if uri.blank? || SiteSetting.onebox_domains_blacklist.include?(uri.hostname) + + r = Onebox.preview(url, cache: {}, max_width: 695) + { onebox: r.to_s, preview: r.try(:placeholder_html).to_s } + end + rescue => e + # no point warning here, just cause we have an issue oneboxing a url + # we can later hunt for failed oneboxes by searching logs if needed + Rails.logger.info("Failed to onebox #{url} #{e} #{e.backtrace}") + # return a blank hash, so rest of the code works + blank_onebox + end end diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb index a9de8e4698b..a41ab8af8c0 100644 --- a/lib/plugin/instance.rb +++ b/lib/plugin/instance.rb @@ -112,7 +112,7 @@ class Plugin::Instance end end - def add_model_callback(klass, callback, &block) + def add_model_callback(klass, callback, options = {}, &block) klass = klass.to_s.classify.constantize rescue klass.to_s.constantize plugin = self @@ -122,10 +122,11 @@ class Plugin::Instance hidden_method_name = :"#{method_name}_without_enable_check" klass.send(:define_method, hidden_method_name, &block) - klass.send(callback) do |*args| + klass.send(callback, options) do |*args| send(hidden_method_name, *args) if plugin.enabled? end + hidden_method_name end # Add validation method but check that the plugin is enabled @@ -203,6 +204,11 @@ class Plugin::Instance end end + def register_seedfu_fixtures(paths) + paths = [paths] if !paths.kind_of?(Array) + SeedFu.fixture_paths.concat(paths) + end + def listen_for(event_name) return unless self.respond_to?(event_name) DiscourseEvent.on(event_name, &self.method(event_name)) @@ -388,6 +394,37 @@ JS end end + def handlebars_includes + assets.map do |asset, opts| + next if opts == :admin + next unless asset =~ DiscoursePluginRegistry::HANDLEBARS_REGEX + asset + end.compact + end + + def javascript_includes + assets.map do |asset, opts| + next if opts == :admin + next unless asset =~ DiscoursePluginRegistry::JS_REGEX + asset + end.compact + end + + def each_globbed_asset + if @path + # Automatically include all ES6 JS and hbs files + root_path = "#{File.dirname(@path)}/assets/javascripts" + + Dir.glob("#{root_path}/**/*") do |f| + if File.directory?(f) + yield [f,true] + elsif f.to_s.ends_with?(".js.es6") || f.to_s.ends_with?(".hbs") + yield [f,false] + end + end + end + end + protected def register_assets! diff --git a/lib/plugin/metadata.rb b/lib/plugin/metadata.rb index f154d2a2e27..bcf8954d2bd 100644 --- a/lib/plugin/metadata.rb +++ b/lib/plugin/metadata.rb @@ -2,8 +2,34 @@ module Plugin; end class Plugin::Metadata + + OFFICIAL_PLUGINS = Set.new([ + "customer-flair", + "discourse-adplugin", + "discourse-akismet", + "discourse-backup-uploads-to-s3", + "discourse-cakeday", + "Canned Replies", + "discourse-data-explorer", + "discourse-details", + "discourse-nginx-performance-report", + "discourse-push-notifications", + "discourse-slack-official", + "discourse-solved", + "Spoiler Alert!", + "staff-notes", + "GitHub badges", + "hosted-site", + "lazyYT", + "logster-rate-limit-checker", + "poll", + "discourse-plugin-linkedin-auth", + "discourse-plugin-office365-auth", + "discourse-oauth2-basic" + ]) + FIELDS ||= [:name, :about, :version, :authors, :url, :required_version] - attr_accessor *FIELDS + attr_accessor(*FIELDS) def self.parse(text) metadata = self.new @@ -13,6 +39,10 @@ class Plugin::Metadata metadata end + def official? + OFFICIAL_PLUGINS.include?(name) + end + def parse_line(line) line = line.strip diff --git a/lib/post_creator.rb b/lib/post_creator.rb index e6439270b8e..928c8473623 100644 --- a/lib/post_creator.rb +++ b/lib/post_creator.rb @@ -32,6 +32,10 @@ class PostCreator # via_email - Mark this post as arriving via email # raw_email - Full text of arriving email (to store) # action_code - Describes a small_action post (optional) + # skip_jobs - Don't enqueue jobs when creation succeeds. This is needed if you + # wrap `PostCreator` in a transaction, as the sidekiq jobs could + # dequeue before the commit finishes. If you do this, be sure to + # call `enqueue_jobs` after the transaction is comitted. # # When replying to a topic: # topic_id - topic we're replying to @@ -88,6 +92,17 @@ class PostCreator return false end + # Make sure none of the users have muted the creator + names = @opts[:target_usernames] + if names.present? && !skip_validations? && !@user.staff? + users = User.where(username: names.split(',').flatten).pluck(:id, :username).to_h + + MutedUser.where(user_id: users.keys, muted_user_id: @user.id).pluck(:user_id).each do |m| + errors[:base] << I18n.t(:not_accepting_pms, username: users[m]) + end + return false if errors[:base].present? + end + if new_topic? topic_creator = TopicCreator.new(@user, guardian, @opts) return false unless skip_validations? || validate_child(topic_creator) @@ -142,10 +157,13 @@ class PostCreator end if @post && errors.blank? + # update counters etc. + @post.topic.reload + publish track_latest_on_category - enqueue_jobs + enqueue_jobs unless @opts[:skip_jobs] BadgeGranter.queue_badge_grant(Badge::Trigger::PostRevision, post: @post) trigger_after_events(@post) @@ -170,6 +188,11 @@ class PostCreator @post end + def enqueue_jobs + return unless @post && !@post.errors.present? + PostJobsEnqueuer.new(@post, @topic, new_topic?, {import_mode: @opts[:import_mode]}).enqueue_jobs + end + def self.track_post_stats Rails.env != "test".freeze || @track_post_stats end @@ -190,7 +213,9 @@ class PostCreator set_reply_info(post) post.word_count = post.raw.scan(/[[:word:]]+/).size - post.post_number ||= Topic.next_post_number(post.topic_id, post.reply_to_post_number.present?) + + whisper = post.post_type == Post.types[:whisper] + post.post_number ||= Topic.next_post_number(post.topic_id, post.reply_to_post_number.present?, whisper) cooking_options = post.cooking_options || {} cooking_options[:topic_id] = post.topic_id @@ -324,6 +349,18 @@ class PostCreator private + # TODO: merge the similar function in TopicCreator and fix parameter naming for `category` + def find_category_id + @opts.delete(:category) if @opts[:archetype].present? && @opts[:archetype] == Archetype.private_message + + category = if (@opts[:category].is_a? Integer) || (@opts[:category] =~ /^\d+$/) + Category.find_by(id: @opts[:category]) + else + Category.find_by(name_lower: @opts[:category].try(:downcase)) + end + category&.id + end + def create_topic return if @topic begin @@ -334,6 +371,9 @@ class PostCreator end @post.topic_id = @topic.id @post.topic = @topic + if @topic && @topic.category && @topic.category.all_topics_wiki + @post.wiki = true + end end def update_topic_stats @@ -443,17 +483,14 @@ class PostCreator end if @user.staged - TopicUser.auto_watch(@user.id, @topic.id) + TopicUser.auto_notification_for_staging(@user.id, @topic.id, TopicUser.notification_reasons[:auto_watch]) + elsif @user.user_option.notification_level_when_replying === NotificationLevels.topic_levels[:watching] + TopicUser.auto_notification(@user.id, @topic.id, TopicUser.notification_reasons[:created_post], NotificationLevels.topic_levels[:watching]) else - TopicUser.auto_track(@user.id, @topic.id, TopicUser.notification_reasons[:created_post]) + TopicUser.auto_notification(@user.id, @topic.id, TopicUser.notification_reasons[:created_post], NotificationLevels.topic_levels[:tracking]) end end - def enqueue_jobs - return unless @post && !@post.errors.present? - PostJobsEnqueuer.new(@post, @topic, new_topic?, {import_mode: @opts[:import_mode]}).enqueue_jobs - end - def new_topic? @opts[:topic_id].blank? end diff --git a/lib/post_destroyer.rb b/lib/post_destroyer.rb index c0ac588d942..ec4047bce18 100644 --- a/lib/post_destroyer.rb +++ b/lib/post_destroyer.rb @@ -47,6 +47,10 @@ class PostDestroyer mark_for_deletion end DiscourseEvent.trigger(:post_destroyed, @post, @opts, @user) + + if @post.is_first_post? && @post.topic + DiscourseEvent.trigger(:topic_destroyed, @post.topic, @user) + end end def recover @@ -60,6 +64,7 @@ class PostDestroyer topic.update_statistics recover_user_actions DiscourseEvent.trigger(:post_recovered, @post, @opts, @user) + DiscourseEvent.trigger(:topic_recovered, topic, @user) if @post.is_first_post? end def staff_recovered @@ -182,7 +187,7 @@ class PostDestroyer def recover_user_actions # TODO: Use a trash concept for `user_actions` to avoid churn and simplify this? - UserActionObserver.log_post(@post) + UserActionCreator.log_post(@post) end def remove_associated_replies diff --git a/lib/post_jobs_enqueuer.rb b/lib/post_jobs_enqueuer.rb index c5f1f6a9d15..0e05c565f9f 100644 --- a/lib/post_jobs_enqueuer.rb +++ b/lib/post_jobs_enqueuer.rb @@ -35,7 +35,7 @@ class PostJobsEnqueuer def after_post_create TopicTrackingState.publish_unread(@post) if @post.post_number > 1 - TopicTrackingState.publish_latest(@topic) + TopicTrackingState.publish_latest(@topic, @post.post_type == Post.types[:whisper]) Jobs.enqueue_in( SiteSetting.email_time_window_mins.minutes, diff --git a/lib/post_merger.rb b/lib/post_merger.rb index 7f994ba6190..4beb6cd6023 100644 --- a/lib/post_merger.rb +++ b/lib/post_merger.rb @@ -27,9 +27,9 @@ class PostMerger edit_reason: I18n.t("merge_posts.edit_reason", count: posts.length, username: @user.username) } - Post.transaction do - revisor = PostRevisor.new(post, post.topic) - revisor.revise!(@user, changes, {}) + revisor = PostRevisor.new(post, post.topic) + + revisor.revise!(@user, changes) do posts.each { |p| PostDestroyer.new(@user, p).destroy } end end diff --git a/lib/post_revisor.rb b/lib/post_revisor.rb index f9e68cf56ad..bf12588e709 100644 --- a/lib/post_revisor.rb +++ b/lib/post_revisor.rb @@ -95,12 +95,23 @@ class PostRevisor end end + track_topic_field(:featured_link) do |topic_changes, featured_link| + if SiteSetting.topic_featured_link_enabled && + featured_link.present? && + topic_changes.guardian.can_edit_featured_link?(topic_changes.topic.category_id) + + topic_changes.record_change('featured_link', topic_changes.topic.featured_link, featured_link) + topic_changes.topic.featured_link = featured_link + end + end + # AVAILABLE OPTIONS: # - revised_at: changes the date of the revision # - force_new_version: bypass ninja-edit window # - bypass_rate_limiter: # - bypass_bump: do not bump the topic, even if last post # - skip_validations: ask ActiveRecord to skip validations + # - skip_revision: do not create a new PostRevision record def revise!(editor, fields, opts={}) @editor = editor @fields = fields.with_indifferent_access @@ -134,9 +145,13 @@ class PostRevisor @validate_topic = @opts[:validate_topic] if @opts.has_key?(:validate_topic) @validate_topic = !@opts[:validate_topic] if @opts.has_key?(:skip_validations) + @skip_revision = false + @skip_revision = @opts[:skip_revision] if @opts.has_key?(:skip_revision) + Post.transaction do revise_post + yield if block_given? # TODO: these callbacks are being called in a transaction # it is kind of odd, because the callback is called "before_edit" # but the post is already edited at this point @@ -190,6 +205,7 @@ class PostRevisor end def should_create_new_version? + return false if @skip_revision edited_by_another_user? || !ninja_edit? || owner_changed? || force_new_version? end @@ -234,7 +250,7 @@ class PostRevisor prev_owner = User.find(@post.user_id) new_owner = User.find(@fields["user_id"]) - # UserActionObserver will create new UserAction records for the new owner + # UserActionCreator will create new UserAction records for the new owner UserAction.where(target_post_id: @post.id) .where(user_id: prev_owner.id) @@ -323,6 +339,7 @@ class PostRevisor end def create_or_update_revision + return if @skip_revision # don't create an empty revision if something failed return unless successfully_saved_post_and_topic @version_changed ? create_revision : update_revision @@ -418,18 +435,14 @@ class PostRevisor def update_category_description return unless category = Category.find_by(topic_id: @topic.id) - body = @post.cooked - matches = body.scan(/\
(.*)\<\/p\>/)
+ doc = Nokogiri::HTML.fragment(@post.cooked)
+ doc.css("img").remove
- matches.each do |match|
- next if match[0] =~ /\
- {{option.percentage}}%
- {{{option.html}}}
- e
+ if SiteSetting.censored_pattern.present?
+ Rails.logger.warn "Post cooking timed out. Clearing the censored_pattern setting and retrying."
+ SiteSetting.censored_pattern = nil
+ sanitized = markdown(working_text, options)
+ else
+ raise e
+ end
+ end
doc = Nokogiri::HTML.fragment(sanitized)
@@ -242,11 +261,11 @@ module PrettyText
whitelist.any?{|u| uri.host == u || uri.host.ends_with?("." << u)}
# we are good no need for nofollow
else
- l["rel"] = "nofollow"
+ l["rel"] = "nofollow noopener"
end
rescue URI::InvalidURIError, URI::InvalidComponentError
# add a nofollow anyway
- l["rel"] = "nofollow"
+ l["rel"] = "nofollow noopener"
end
end
end
@@ -286,6 +305,11 @@ module PrettyText
links << DetectedLink.new(url, true)
end
+ # Extract Youtube links
+ doc.css("div[data-youtube-id]").each do |d|
+ links << DetectedLink.new("https://www.youtube.com/watch?v=#{d['data-youtube-id']}", false)
+ end
+
links
end
diff --git a/lib/s3_helper.rb b/lib/s3_helper.rb
index c203cd89bdf..7fbfcc8d10e 100644
--- a/lib/s3_helper.rb
+++ b/lib/s3_helper.rb
@@ -2,28 +2,47 @@ require "aws-sdk"
class S3Helper
- def initialize(s3_bucket, tombstone_prefix=nil)
- raise Discourse::InvalidParameters.new("s3_bucket") if s3_bucket.blank?
+ class SettingMissing < StandardError; end
- @s3_bucket = s3_bucket
- @tombstone_prefix = tombstone_prefix
+ attr_reader :s3_bucket_name
- check_missing_site_settings
+ def initialize(s3_upload_bucket, tombstone_prefix='', options={})
+ @s3_options = default_s3_options.merge(options)
+
+ @s3_bucket_name, @s3_bucket_folder_path = begin
+ raise Discourse::InvalidParameters.new("s3_bucket") if s3_upload_bucket.blank?
+ s3_upload_bucket.downcase.split("/".freeze, 2)
+ end
+
+ @tombstone_prefix =
+ if @s3_bucket_folder_path
+ File.join(@s3_bucket_folder_path, tombstone_prefix)
+ else
+ tombstone_prefix
+ end
+
+ check_missing_options
end
- def upload(file, unique_filename, options={})
- obj = s3_bucket.object(unique_filename)
+ def upload(file, path, options={})
+ path = get_path_for_s3_upload(path)
+ obj = s3_bucket.object(path)
obj.upload_file(file, options)
+ path
end
- def remove(unique_filename, copy_to_tombstone=false)
+ def remove(s3_filename, copy_to_tombstone=false)
bucket = s3_bucket
+
# copy the file in tombstone
if copy_to_tombstone && @tombstone_prefix.present?
- bucket.object(@tombstone_prefix + unique_filename).copy_from(copy_source: "#{@s3_bucket}/#{unique_filename}")
+ bucket
+ .object(File.join(@tombstone_prefix, s3_filename))
+ .copy_from(copy_source: File.join(@s3_bucket_name, get_path_for_s3_upload(s3_filename)))
end
+
# delete the file
- bucket.object(unique_filename).delete
+ bucket.object(get_path_for_s3_upload(s3_filename)).delete
rescue Aws::S3::Errors::NoSuchKey
end
@@ -32,7 +51,7 @@ class S3Helper
# cf. http://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html
s3_resource.client.put_bucket_lifecycle({
- bucket: @s3_bucket,
+ bucket: @s3_bucket_name,
lifecycle_configuration: {
rules: [
{
@@ -48,28 +67,36 @@ class S3Helper
private
- def s3_resource
- opts = { region: SiteSetting.s3_region }
+ def get_path_for_s3_upload(path)
+ path = File.join(@s3_bucket_folder_path, path) if @s3_bucket_folder_path
+ path
+ end
- unless SiteSetting.s3_use_iam_profile
- opts[:access_key_id] = SiteSetting.s3_access_key_id
- opts[:secret_access_key] = SiteSetting.s3_secret_access_key
- end
+ def default_s3_options
+ opts = { region: SiteSetting.s3_region }
- Aws::S3::Resource.new(opts)
+ unless SiteSetting.s3_use_iam_profile
+ opts[:access_key_id] = SiteSetting.s3_access_key_id
+ opts[:secret_access_key] = SiteSetting.s3_secret_access_key
end
- def s3_bucket
- bucket = s3_resource.bucket(@s3_bucket)
- bucket.create unless bucket.exists?
- bucket
- end
+ opts
+ end
- def check_missing_site_settings
- unless SiteSetting.s3_use_iam_profile
- raise Discourse::SiteSettingMissing.new("s3_access_key_id") if SiteSetting.s3_access_key_id.blank?
- raise Discourse::SiteSettingMissing.new("s3_secret_access_key") if SiteSetting.s3_secret_access_key.blank?
- end
- end
+ def s3_resource
+ Aws::S3::Resource.new(@s3_options)
+ end
+ def s3_bucket
+ bucket = s3_resource.bucket(@s3_bucket_name)
+ bucket.create unless bucket.exists?
+ bucket
+ end
+
+ def check_missing_options
+ unless SiteSetting.s3_use_iam_profile
+ raise SettingMissing.new("access_key_id") if @s3_options[:access_key_id].blank?
+ raise SettingMissing.new("secret_access_key") if @s3_options[:secret_access_key].blank?
+ end
+ end
end
diff --git a/lib/sass/discourse_sass_importer.rb b/lib/sass/discourse_sass_importer.rb
index 3a6f9dea68f..a3e877b8e50 100644
--- a/lib/sass/discourse_sass_importer.rb
+++ b/lib/sass/discourse_sass_importer.rb
@@ -23,7 +23,7 @@ class DiscourseSassImporter < Sass::Importers::Filesystem
"plugins_desktop" => DiscoursePluginRegistry.desktop_stylesheets,
"plugins_variables" => DiscoursePluginRegistry.sass_variables,
"theme_variables" => [ColorScheme::BASE_COLORS_FILE],
- "category_backgrounds" => Proc.new { |c| "body.category-#{c.full_slug} { background-image: url(#{apply_cdn(c.background_url)}) }\n" }
+ "category_backgrounds" => Proc.new { |c| "body.category-#{c.full_slug} { background-image: url(#{apply_cdn(c.uploaded_background.url)}) }\n" }
}
end
@@ -53,8 +53,8 @@ class DiscourseSassImporter < Sass::Importers::Filesystem
end
when "category_backgrounds"
contents = ""
- Category.where('background_url IS NOT NULL').each do |c|
- contents << special_imports[name].call(c) if c.background_url.present?
+ Category.where('uploaded_background_id IS NOT NULL').each do |c|
+ contents << special_imports[name].call(c) if c.uploaded_background
end
else
stylesheets = special_imports[name]
diff --git a/lib/sass/discourse_stylesheets.rb b/lib/sass/discourse_stylesheets.rb
index 5bcd76fce41..cce67137e19 100644
--- a/lib/sass/discourse_stylesheets.rb
+++ b/lib/sass/discourse_stylesheets.rb
@@ -14,7 +14,7 @@ class DiscourseStylesheets
@cache ||= DistributedCache.new("discourse_stylesheet")
end
- def self.stylesheet_link_tag(target = :desktop)
+ def self.stylesheet_link_tag(target = :desktop, media = 'all')
tag = cache[target]
@@ -24,7 +24,7 @@ class DiscourseStylesheets
builder = self.new(target)
builder.compile unless File.exists?(builder.stylesheet_fullpath)
builder.ensure_digestless_file
- tag = %[]
+ tag = %[]
cache[target] = tag
@@ -160,7 +160,7 @@ class DiscourseStylesheets
def digest
@digest ||= begin
theme = (cs = ColorScheme.enabled) ? "#{cs.id}-#{cs.version}" : false
- category_updated = Category.where("background_url IS NOT NULL and background_url != ''").last_updated_at
+ category_updated = Category.where("uploaded_background_id IS NOT NULL").last_updated_at
if theme || category_updated > 0
Digest::SHA1.hexdigest "#{RailsMultisite::ConnectionManagement.current_db}-#{theme}-#{DiscourseStylesheets.last_file_updated}-#{category_updated}"
diff --git a/lib/search.rb b/lib/search.rb
index 4cb1711c4e6..cdad501bd86 100644
--- a/lib/search.rb
+++ b/lib/search.rb
@@ -54,7 +54,7 @@ class Search
posts.each do |post|
# force indexing
post.cooked += " "
- SearchObserver.index(post)
+ SearchIndexer.index(post)
end
posts = Post.joins(:topic)
@@ -67,7 +67,7 @@ class Search
posts.each do |post|
# force indexing
post.cooked += " "
- SearchObserver.index(post)
+ SearchIndexer.index(post)
end
nil
@@ -128,6 +128,30 @@ class Search
end
end
+ def self.min_post_id_no_cache
+ return 0 unless SiteSetting.search_prefer_recent_posts?
+
+
+ offset, has_more = Post.unscoped
+ .order('id desc')
+ .offset(SiteSetting.search_recent_posts_size-1)
+ .limit(2)
+ .pluck(:id)
+
+ has_more ? offset : 0
+ end
+
+ def self.min_post_id(opts=nil)
+ return 0 unless SiteSetting.search_prefer_recent_posts?
+
+ # It can be quite slow to count all the posts so let's cache it
+ Rails.cache.fetch("search-min-post-id:#{SiteSetting.search_recent_posts_size}", expires_in: 1.week) do
+ min_post_id_no_cache
+ end
+ end
+
+ attr_accessor :term
+
def initialize(term, opts=nil)
@opts = opts || {}
@guardian = @opts[:guardian] || Guardian.new
@@ -135,6 +159,7 @@ class Search
@include_blurbs = @opts[:include_blurbs] || false
@blurb_length = @opts[:blurb_length]
@limit = Search.per_facet
+ @valid = true
term = process_advanced_search!(term)
@@ -155,14 +180,26 @@ class Search
@results = GroupedSearchResults.new(@opts[:type_filter], term, @search_context, @include_blurbs, @blurb_length)
end
+ def valid?
+ @valid
+ end
+
def self.execute(term, opts=nil)
self.new(term, opts).execute
end
# Query a term
def execute
- if @term.blank? || @term.length < (@opts[:min_search_term_length] || SiteSetting.min_search_term_length)
- return nil unless @filters.present?
+
+ unless @filters.present?
+ min_length = @opts[:min_search_term_length] || SiteSetting.min_search_term_length
+ terms = (@term || '').split(/\s(?=(?:[^"]|"[^"]*")*$)/).reject {|t| t.length < min_length }
+
+ if terms.blank?
+ @term = ''
+ @valid = false
+ return
+ end
end
# If the term is a number or url to a topic, just include that topic
@@ -215,6 +252,10 @@ class Search
posts.where("topics.posts_count = ?", match.to_i)
end
+ advanced_filter(/min_post_count:(\d+)/) do |posts, match|
+ posts.where("topics.posts_count >= ?", match.to_i)
+ end
+
advanced_filter(/in:first/) do |posts|
posts.where("posts.post_number = 1")
end
@@ -399,6 +440,9 @@ class Search
elsif word == 'in:private'
@search_pms = true
nil
+ elsif word =~ /^private_messages:(.+)$/
+ @search_pms = true
+ nil
else
found ? nil : word
end
@@ -530,6 +574,7 @@ class Search
posts = posts.where("posts.raw || ' ' || u.username || ' ' || COALESCE(u.name, '') ilike ?", "%#{term_without_quote}%")
else
posts = posts.where("post_search_data.search_data @@ #{ts_query}")
+
exact_terms = @term.scan(/"([^"]+)"/).flatten
exact_terms.each do |exact|
posts = posts.where("posts.raw ilike ?", "%#{exact}%")
@@ -612,7 +657,7 @@ class Search
end
def self.query_locale
- @query_locale ||= Post.sanitize(Search.long_locale)
+ "'#{Search.long_locale}'"
end
def query_locale
@@ -622,7 +667,7 @@ class Search
def self.ts_query(term, locale = nil, joiner = "&")
data = Post.exec_sql("SELECT to_tsvector(:locale, :term)",
- locale: locale || long_locale,
+ locale: 'simple',
term: term
).values[0][0]
@@ -641,33 +686,56 @@ class Search
@ts_query_cache[(locale || query_locale) + " " + @term] ||= Search.ts_query(@term, locale)
end
- def aggregate_search(opts = {})
+ def wrap_rows(query)
+ "SELECT *, row_number() over() row_number FROM (#{query.to_sql}) xxx"
+ end
+ def aggregate_post_sql(opts)
min_or_max = @order == :latest ? "max" : "min"
- post_sql =
+ query =
if @order == :likes
# likes are a pain to aggregate so skip
posts_query(@limit, private_messages: opts[:private_messages])
.select('topics.id', "post_number")
- .to_sql
else
- posts_query(@limit, aggregate_search: true,
- private_messages: opts[:private_messages])
+ posts_query(@limit, aggregate_search: true, private_messages: opts[:private_messages])
.select('topics.id', "#{min_or_max}(post_number) post_number")
.group('topics.id')
- .to_sql
end
+ min_id = Search.min_post_id
+ if min_id > 0
+ low_set = query.dup.where("post_search_data.post_id < #{min_id}")
+ high_set = query.where("post_search_data.post_id >= #{min_id}")
+
+ return { default: wrap_rows(high_set), remaining: wrap_rows(low_set) }
+ end
+
# double wrapping so we get correct row numbers
- post_sql = "SELECT *, row_number() over() row_number FROM (#{post_sql}) xxx"
+ { default: wrap_rows(query) }
+ end
- posts = Post.includes(:topic => :category)
- .joins("JOIN (#{post_sql}) x ON x.id = posts.topic_id AND x.post_number = posts.post_number")
- .order('row_number')
+ def aggregate_posts(post_sql)
+ return [] unless post_sql
- posts.each do |post|
- @results.add(post)
+ Post.includes(:topic => :category)
+ .includes(:user)
+ .joins("JOIN (#{post_sql}) x ON x.id = posts.topic_id AND x.post_number = posts.post_number")
+ .order('row_number')
+ end
+
+ def aggregate_search(opts = {})
+ post_sql = aggregate_post_sql(opts)
+
+ added = 0
+ aggregate_posts(post_sql[:default]).each do |p|
+ @results.add(p)
+ added += 1
+ end
+
+ if added < @limit
+ aggregate_posts(post_sql[:remaining]).each {|p| @results.add(p) }
end
end
@@ -679,7 +747,9 @@ class Search
def topic_search
if @search_context.is_a?(Topic)
- posts = posts_query(@limit).where('posts.topic_id = ?', @search_context.id).includes(:topic => :category)
+ posts = posts_query(@limit).where('posts.topic_id = ?', @search_context.id)
+ .includes(:topic => :category)
+ .includes(:user)
posts.each do |post|
@results.add(post)
end
diff --git a/lib/search/grouped_search_results.rb b/lib/search/grouped_search_results.rb
index 2fa450bb745..47e13254883 100644
--- a/lib/search/grouped_search_results.rb
+++ b/lib/search/grouped_search_results.rb
@@ -49,7 +49,7 @@ class Search
def self.blurb_for(cooked, term=nil, blurb_length=200)
- cooked = SearchObserver::HtmlScrubber.scrub(cooked).squish
+ cooked = SearchIndexer::HtmlScrubber.scrub(cooked).squish
blurb = nil
if term
diff --git a/lib/single_sign_on.rb b/lib/single_sign_on.rb
index 64d4e909a61..bd0d408e1c0 100644
--- a/lib/single_sign_on.rb
+++ b/lib/single_sign_on.rb
@@ -1,6 +1,7 @@
class SingleSignOn
ACCESSORS = [:nonce, :name, :username, :email, :avatar_url, :avatar_force_update, :require_activation,
- :bio, :external_id, :return_sso_url, :admin, :moderator, :suppress_welcome_message]
+ :bio, :external_id, :return_sso_url, :admin, :moderator, :suppress_welcome_message,
+ :add_groups, :remove_groups]
FIXNUMS = []
BOOLS = [:avatar_force_update, :admin, :moderator, :require_activation, :suppress_welcome_message]
NONCE_EXPIRY_TIME = 10.minutes
diff --git a/lib/site_setting_extension.rb b/lib/site_setting_extension.rb
index c8fc3288155..70e576f08de 100644
--- a/lib/site_setting_extension.rb
+++ b/lib/site_setting_extension.rb
@@ -32,7 +32,8 @@ module SiteSettingExtension
url_list: 9,
host_list: 10,
category_list: 11,
- value_list: 12)
+ value_list: 12,
+ regex: 13)
end
def mutex
@@ -119,6 +120,7 @@ module SiteSettingExtension
if opts[:shadowed_by_global] && GlobalSetting.respond_to?(name)
val = GlobalSetting.send(name)
+
unless val.nil? || (val == ''.freeze)
hidden_settings << name
shadowed_settings << name
@@ -347,12 +349,9 @@ module SiteSettingExtension
end
def filter_value(name, value)
- # filter domain name
- if %w[disabled_image_download_domains onebox_domains_whitelist exclude_rel_nofollow_domains email_domains_blacklist email_domains_whitelist white_listed_spam_host_domains].include? name
+ if %w[disabled_image_download_domains onebox_domains_blacklist exclude_rel_nofollow_domains email_domains_blacklist email_domains_whitelist white_listed_spam_host_domains].include? name
domain_array = []
- value.split('|').each { |url|
- domain_array.push(get_hostname(url))
- }
+ value.split('|').each { |url| domain_array << get_hostname(url) }
value = domain_array.join("|")
end
value
@@ -445,7 +444,8 @@ module SiteSettingExtension
types[:fixnum] => IntegerSettingValidator,
types[:string] => StringSettingValidator,
'list' => StringSettingValidator,
- 'enum' => StringSettingValidator
+ 'enum' => StringSettingValidator,
+ 'regex' => RegexSettingValidator
}
@validator_mapping[type_name]
end
diff --git a/lib/site_setting_validations.rb b/lib/site_setting_validations.rb
index e69bfc2f95d..7858c68f0e8 100644
--- a/lib/site_setting_validations.rb
+++ b/lib/site_setting_validations.rb
@@ -23,6 +23,7 @@ module SiteSettingValidations
default_categories_selected = [
SiteSetting.default_categories_tracking.split("|"),
SiteSetting.default_categories_muted.split("|"),
+ SiteSetting.default_categories_watching_first_post.split("|")
].flatten.to_set
validate_default_categories(new_val, default_categories_selected)
@@ -32,6 +33,7 @@ module SiteSettingValidations
default_categories_selected = [
SiteSetting.default_categories_watching.split("|"),
SiteSetting.default_categories_muted.split("|"),
+ SiteSetting.default_categories_watching_first_post.split("|")
].flatten.to_set
validate_default_categories(new_val, default_categories_selected)
@@ -41,6 +43,17 @@ module SiteSettingValidations
default_categories_selected = [
SiteSetting.default_categories_watching.split("|"),
SiteSetting.default_categories_tracking.split("|"),
+ SiteSetting.default_categories_watching_first_post.split("|")
+ ].flatten.to_set
+
+ validate_default_categories(new_val, default_categories_selected)
+ end
+
+ def validate_default_categories_watching_first_post(new_val)
+ default_categories_selected = [
+ SiteSetting.default_categories_watching.split("|"),
+ SiteSetting.default_categories_tracking.split("|"),
+ SiteSetting.default_categories_muted.split("|")
].flatten.to_set
validate_default_categories(new_val, default_categories_selected)
diff --git a/lib/slug.rb b/lib/slug.rb
index 133a4e1bd1b..0f3b62b3f07 100644
--- a/lib/slug.rb
+++ b/lib/slug.rb
@@ -2,6 +2,8 @@
module Slug
+ CHAR_FILTER_REGEXP = /[:\/\?#\[\]@!\$&'\(\)\*\+,;=_\.~%\\`^\s|\{\}"<>]+/ # :/?#[]@!$&'()*+,;=_.~%\`^|{}"<>
+
def self.for(string, default = 'topic')
slug = case (SiteSetting.slug_generation_method || :ascii).to_sym
when :ascii then self.ascii_generator(string)
@@ -31,7 +33,7 @@ module Slug
# See also URI::REGEXP::PATTERN.
string.strip
.gsub(/\s+/, '-')
- .gsub(/[:\/\?#\[\]@!\$&'\(\)\*\+,;=_\.~%\\`^\s|\{\}"<>]+/, '') # :/?#[]@!$&'()*+,;=_.~%\`^|{}"<>
+ .gsub(CHAR_FILTER_REGEXP, '')
.gsub(/\A-+|-+\z/, '') # remove possible trailing and preceding dashes
.squeeze('-') # squeeze continuous dashes to prettify slug
end
diff --git a/lib/system_message.rb b/lib/system_message.rb
index 98280b5e9ce..d95cbf00be7 100644
--- a/lib/system_message.rb
+++ b/lib/system_message.rb
@@ -33,7 +33,7 @@ class SystemMessage
post = creator.create
if creator.errors.present?
- raise StandardError, creator.errors.to_s
+ raise StandardError, creator.errors.full_messages.join(" ")
end
UserArchivedMessage.create!(user: Discourse.site_contact_user, topic: post.topic)
diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake
index 12c8d187899..53d3ea80cda 100644
--- a/lib/tasks/assets.rake
+++ b/lib/tasks/assets.rake
@@ -30,16 +30,7 @@ task 'assets:precompile:before' do
if $node_uglify
Rails.configuration.assets.js_compressor = nil
-
- module ::Sprockets
- # TODO: https://github.com/rails/sprockets-rails/pull/342
- # Rails.configuration.assets.gzip = false
- class Base
- def skip_gzip?
- true
- end
- end
- end
+ Rails.configuration.assets.gzip = false
end
end
diff --git a/lib/tasks/emoji.rake b/lib/tasks/emoji.rake
index 729242f9b74..14190b74eb7 100644
--- a/lib/tasks/emoji.rake
+++ b/lib/tasks/emoji.rake
@@ -1,63 +1,119 @@
+EMOJI_LIST_URL = "http://unicode.org/emoji/charts/full-emoji-list.html"
+EMOJI_KEYWORDS_URL = "https://raw.githubusercontent.com/muan/emojilib/master/emojis.json"
+
+# until MS release the emoji flags, we'll use custom made flags
+WINDOWS_FLAGS = Set.new ["1f1e8_1f1f3", "1f1e9_1f1ea", "1f1ea_1f1f8", "1f1eb_1f1f7", "1f1ec_1f1e7", "1f1ee_1f1f9", "1f1ef_1f1f5", "1f1f0_1f1f7", "1f1f7_1f1fa", "1f1fa_1f1f8"]
+
desc "update emoji images"
task "emoji:update" => :environment do
- download_emojis_for("emoji_one", "https://raw.githubusercontent.com/Ranks/emojione/master/assets/png/%s.png", uppercase: true, leading_zeros: true)
- download_emojis_for("twitter", "https://raw.githubusercontent.com/twitter/twemoji/gh-pages/72x72/%s.png", lowercase: true)
- download_emojis_for("apple", "https://raw.githubusercontent.com/github/gemoji/master/images/emoji/unicode/%s.png", lowercase: true, leading_zeros: true)
- # download_google_emojis("~/Desktop/images/%s.png")
+ emojis = {}
+
+ puts "Loading local emoji database..."
+ db = JSON.parse(File.read("lib/emoji/db.json"))
+ db["emojis"].each do |e|
+ emojis[e["code"].tr("-", "_")] = { name: e["name"] }
+ end
+ aliases = db["aliases"].to_h
+
+ puts "Enhancing emoji database with emojilib keywords..."
+ keywords = JSON.parse(open(EMOJI_KEYWORDS_URL).read)
+ keywords.keys.each do |k|
+ next unless char = keywords[k]["char"].presence
+
+ code = char.codepoints
+ .map { |c| c.to_s(16).rjust(4, "0") }
+ .join("_")
+ .downcase
+ .gsub(/_fe0f$/, "")
+
+ emojis[code] ||= { name: k }
+ end
+
+ puts "Retrieving remote emoji list..."
+ list = open(EMOJI_LIST_URL).read
+
+ puts "Parsing remote emoji list..."
+ doc = Nokogiri::HTML(list)
+ doc.css("tr").each do |row|
+ cells = row.css("td")
+ next if cells.size == 0
+
+ code = cells[1].at_css("a")["name"]
+
+ next unless emojis[code]
+
+ apple = cell_to_image(cells[4])
+ google = cell_to_image(cells[5])
+ twitter = cell_to_image(cells[6])
+ one = cell_to_image(cells[7])
+
+ if WINDOWS_FLAGS.include?(code)
+ windows = custom_windows_flag(code)
+ else
+ windows = cell_to_image(cells[9])
+ end
+
+ if apple.blank? || google.blank? || twitter.blank? || one.blank? || windows.blank?
+ emojis.delete(code)
+ next
+ end
+
+ emojis[code][:apple] = apple
+ emojis[code][:google] = google
+ emojis[code][:twitter] = twitter
+ emojis[code][:one] = one
+ emojis[code][:windows] = windows
+ end
+
+ puts "Writing emojis..."
+ write_emojis(emojis, aliases, :apple, "apple")
+ write_emojis(emojis, aliases, :google, "google")
+ write_emojis(emojis, aliases, :twitter, "twitter")
+ write_emojis(emojis, aliases, :one, "emoji_one")
+ write_emojis(emojis, aliases, :windows, "win10")
+
+ puts "Updating db.json..."
+ db = {
+ "emojis" => emojis.keys.map { |k| { "code" => k.tr("_", "-"), "name" => emojis[k][:name] } },
+ "aliases" => aliases,
+ }
+
+ File.write("lib/emoji/db.json", JSON.pretty_generate(db))
+
+ puts "Done!"
end
-def download_emojis_for(set, url_template, options={})
- puts "Downloading emojis for #{set}..."
+def cell_to_image(cell)
+ return unless img = cell.at_css("img")
+ Base64.decode64(img["src"][/base64,(.+)$/, 1])
+end
- path = "public/images/emoji/#{set}"
- FileUtils.rm_rf(path) rescue nil
- FileUtils.mkdir_p(path) rescue nil
+def custom_windows_flag(code)
+ name = code.upcase.tr("_", "-")
+ open("https://github.com/discourse/discourse-emoji-extractor/raw/master/win10/72x72/windows_#{name}.png").read
+end
- uppercase = options[:uppercase] == true
- lowercase = options[:lowercase] == true
- leading_zeros = options[:leading_zeros] == true
+def write_emojis(emojis, aliases, style, folder)
+ path = "public/images/emoji/#{folder}/"
- Emoji.all.each do |emoji|
- codepoints = emoji["emoji"].codepoints.map { |c| c.to_s(16).rjust(leading_zeros ? 4 : 0, '0') }
- filename = codepoints.join('-').sub(/-fe0f\b/, '')
- filename = filename.downcase if lowercase
- filename = filename.upcase if uppercase
- puts "#{filename} -> #{emoji["emoji"]}"
- url = url_template % filename
- data = open(url).read rescue nil
- next if data.nil?
- FileUtils.cd(path) do
- emoji["aliases"].each do |name|
- File.open("#{name}.png", "wb") { |f| f << data }
- ImageOptim.new.optimize_image!("#{name}.png")
+ FileUtils.rm_f Dir.glob("#{path}/*")
+
+ puts folder
+
+ emojis.values.each do |emoji|
+ write_emoji("#{path}/#{emoji[:name]}.png", emoji[style])
+ if aliases[emoji[:name]]
+ aliases[emoji[:name]].each do |new_name|
+ write_emoji("#{path}/#{new_name}.png", emoji[style])
end
end
end
+
+ puts
end
-# extracted from the NotoColorEmoji font
-GOOGLE_EMOJIS ||= {35=>1, 48=>2, 49=>3, 50=>4, 51=>5, 52=>6, 53=>7, 54=>8, 55=>9, 56=>10, 57=>11, 169=>12, 174=>13, 8252=>14, 8265=>15, 8419=>16, 8482=>17, 8505=>18, 8596=>19, 8597=>20, 8598=>21, 8599=>22, 8600=>23, 8601=>24, 8617=>25, 8618=>26, 8986=>27, 8987=>28, 9193=>29, 9194=>30, 9195=>31, 9196=>32, 9200=>33, 9203=>34, 9410=>35, 9642=>36, 9643=>37, 9654=>38, 9664=>39, 9723=>40, 9724=>41, 9725=>42, 9726=>43, 9728=>44, 9729=>45, 9742=>46, 9745=>47, 9748=>48, 9749=>49, 9757=>50, 9786=>51, 9800=>52, 9801=>53, 9802=>54, 9803=>55, 9804=>56, 9805=>57, 9806=>58, 9807=>59, 9808=>60, 9809=>61, 9810=>62, 9811=>63, 9824=>64, 9827=>65, 9829=>66, 9830=>67, 9832=>68, 9851=>69, 9855=>70, 9875=>71, 9888=>72, 9889=>73, 9898=>74, 9899=>75, 9917=>76, 9918=>77, 9924=>78, 9925=>79, 9934=>80, 9940=>81, 9962=>82, 9970=>83, 9971=>84, 9973=>85, 9978=>86, 9981=>87, 9986=>88, 9989=>89, 9992=>90, 9993=>91, 9994=>92, 9995=>93, 9996=>94, 9999=>95, 10002=>96, 10004=>97, 10006=>98, 10024=>99, 10035=>100, 10036=>101, 10052=>102, 10055=>103, 10060=>104, 10062=>105, 10067=>106, 10068=>107, 10069=>108, 10071=>109, 10084=>110, 10133=>111, 10134=>112, 10135=>113, 10145=>114, 10160=>115, 10175=>116, 10548=>117, 10549=>118, 11013=>119, 11014=>120, 11015=>121, 11035=>122, 11036=>123, 11088=>124, 11093=>125, 12336=>126, 12349=>127, 12951=>128, 12953=>129, 126980=>130, 127183=>131, 127344=>132, 127345=>133, 127358=>134, 127359=>135, 127374=>136, 127377=>137, 127378=>138, 127379=>139, 127380=>140, 127381=>141, 127382=>142, 127383=>143, 127384=>144, 127385=>145, 127386=>146, 127462=>147, 127463=>148, 127464=>149, 127465=>150, 127466=>151, 127467=>152, 127468=>153, 127469=>154, 127470=>155, 127471=>156, 127472=>157, 127473=>158, 127474=>159, 127475=>160, 127476=>161, 127477=>162, 127478=>163, 127479=>164, 127480=>165, 127481=>166, 127482=>167, 127483=>168, 127484=>169, 127485=>170, 127486=>171, 127487=>172, 127489=>173, 127490=>174, 127514=>175, 127535=>176, 127538=>177, 127539=>178, 127540=>179, 127541=>180, 127542=>181, 127543=>182, 127544=>183, 127545=>184, 127546=>185, 127568=>186, 127569=>187, 127744=>188, 127745=>189, 127746=>190, 127747=>191, 127748=>192, 127749=>193, 127750=>194, 127751=>195, 127752=>196, 127753=>197, 127754=>198, 127755=>199, 127756=>200, 127757=>201, 127758=>202, 127759=>203, 127760=>204, 127761=>205, 127762=>206, 127763=>207, 127764=>208, 127765=>209, 127766=>210, 127767=>211, 127768=>212, 127769=>213, 127770=>214, 127771=>215, 127772=>216, 127773=>217, 127774=>218, 127775=>219, 127776=>220, 127792=>221, 127793=>222, 127794=>223, 127795=>224, 127796=>225, 127797=>226, 127799=>227, 127800=>228, 127801=>229, 127802=>230, 127803=>231, 127804=>232, 127805=>233, 127806=>234, 127807=>235, 127808=>236, 127809=>237, 127810=>238, 127811=>239, 127812=>240, 127813=>241, 127814=>242, 127815=>243, 127816=>244, 127817=>245, 127818=>246, 127819=>247, 127820=>248, 127821=>249, 127822=>250, 127823=>251, 127824=>252, 127825=>253, 127826=>254, 127827=>255, 127828=>256, 127829=>257, 127830=>258, 127831=>259, 127832=>260, 127833=>261, 127834=>262, 127835=>263, 127836=>264, 127837=>265, 127838=>266, 127839=>267, 127840=>268, 127841=>269, 127842=>270, 127843=>271, 127844=>272, 127845=>273, 127846=>274, 127847=>275, 127848=>276, 127849=>277, 127850=>278, 127851=>279, 127852=>280, 127853=>281, 127854=>282, 127855=>283, 127856=>284, 127857=>285, 127858=>286, 127859=>287, 127860=>288, 127861=>289, 127862=>290, 127863=>291, 127864=>292, 127865=>293, 127866=>294, 127867=>295, 127868=>296, 127872=>297, 127873=>298, 127874=>299, 127875=>300, 127876=>301, 127877=>302, 127878=>303, 127879=>304, 127880=>305, 127881=>306, 127882=>307, 127883=>308, 127884=>309, 127885=>310, 127886=>311, 127887=>312, 127888=>313, 127889=>314, 127890=>315, 127891=>316, 127904=>317, 127905=>318, 127906=>319, 127907=>320, 127908=>321, 127909=>322, 127910=>323, 127911=>324, 127912=>325, 127913=>326, 127914=>327, 127915=>328, 127916=>329, 127917=>330, 127918=>331, 127919=>332, 127920=>333, 127921=>334, 127922=>335, 127923=>336, 127924=>337, 127925=>338, 127926=>339, 127927=>340, 127928=>341, 127929=>342, 127930=>343, 127931=>344, 127932=>345, 127933=>346, 127934=>347, 127935=>348, 127936=>349, 127937=>350, 127938=>351, 127939=>352, 127940=>353, 127942=>354, 127943=>355, 127944=>356, 127945=>357, 127946=>358, 127968=>359, 127969=>360, 127970=>361, 127971=>362, 127972=>363, 127973=>364, 127974=>365, 127975=>366, 127976=>367, 127977=>368, 127978=>369, 127979=>370, 127980=>371, 127981=>372, 127982=>373, 127983=>374, 127984=>375, 128000=>376, 128001=>377, 128002=>378, 128003=>379, 128004=>380, 128005=>381, 128006=>382, 128007=>383, 128008=>384, 128009=>385, 128010=>386, 128011=>387, 128012=>388, 128013=>389, 128014=>390, 128015=>391, 128016=>392, 128017=>393, 128018=>394, 128019=>395, 128020=>396, 128021=>397, 128022=>398, 128023=>399, 128024=>400, 128025=>401, 128026=>402, 128027=>403, 128028=>404, 128029=>405, 128030=>406, 128031=>407, 128032=>408, 128033=>409, 128034=>410, 128035=>411, 128036=>412, 128037=>413, 128038=>414, 128039=>415, 128040=>416, 128041=>417, 128042=>418, 128043=>419, 128044=>420, 128045=>421, 128046=>422, 128047=>423, 128048=>424, 128049=>425, 128050=>426, 128051=>427, 128052=>428, 128053=>429, 128054=>430, 128055=>431, 128056=>432, 128057=>433, 128058=>434, 128059=>435, 128060=>436, 128061=>437, 128062=>438, 128064=>439, 128066=>440, 128067=>441, 128068=>442, 128069=>443, 128070=>444, 128071=>445, 128072=>446, 128073=>447, 128074=>448, 128075=>449, 128076=>450, 128077=>451, 128078=>452, 128079=>453, 128080=>454, 128081=>455, 128082=>456, 128083=>457, 128084=>458, 128085=>459, 128086=>460, 128087=>461, 128088=>462, 128089=>463, 128090=>464, 128091=>465, 128092=>466, 128093=>467, 128094=>468, 128095=>469, 128096=>470, 128097=>471, 128098=>472, 128099=>473, 128100=>474, 128101=>475, 128102=>476, 128103=>477, 128104=>478, 128105=>479, 128106=>480, 128107=>481, 128108=>482, 128109=>483, 128110=>484, 128111=>485, 128112=>486, 128113=>487, 128114=>488, 128115=>489, 128116=>490, 128117=>491, 128118=>492, 128119=>493, 128120=>494, 128121=>495, 128122=>496, 128123=>497, 128124=>498, 128125=>499, 128126=>500, 128127=>501, 128128=>502, 128129=>503, 128130=>504, 128131=>505, 128132=>506, 128133=>507, 128134=>508, 128135=>509, 128136=>510, 128137=>511, 128138=>512, 128139=>513, 128140=>514, 128141=>515, 128142=>516, 128143=>517, 128144=>518, 128145=>519, 128146=>520, 128147=>521, 128148=>522, 128149=>523, 128150=>524, 128151=>525, 128152=>526, 128153=>527, 128154=>528, 128155=>529, 128156=>530, 128157=>531, 128158=>532, 128159=>533, 128160=>534, 128161=>535, 128162=>536, 128163=>537, 128164=>538, 128165=>539, 128166=>540, 128167=>541, 128168=>542, 128169=>543, 128170=>544, 128171=>545, 128172=>546, 128173=>547, 128174=>548, 128175=>549, 128176=>550, 128177=>551, 128178=>552, 128179=>553, 128180=>554, 128181=>555, 128182=>556, 128183=>557, 128184=>558, 128185=>559, 128186=>560, 128187=>561, 128188=>562, 128189=>563, 128190=>564, 128191=>565, 128192=>566, 128193=>567, 128194=>568, 128195=>569, 128196=>570, 128197=>571, 128198=>572, 128199=>573, 128200=>574, 128201=>575, 128202=>576, 128203=>577, 128204=>578, 128205=>579, 128206=>580, 128207=>581, 128208=>582, 128209=>583, 128210=>584, 128211=>585, 128212=>586, 128213=>587, 128214=>588, 128215=>589, 128216=>590, 128217=>591, 128218=>592, 128219=>593, 128220=>594, 128221=>595, 128222=>596, 128223=>597, 128224=>598, 128225=>599, 128226=>600, 128227=>601, 128228=>602, 128229=>603, 128230=>604, 128231=>605, 128232=>606, 128233=>607, 128234=>608, 128235=>609, 128236=>610, 128237=>611, 128238=>612, 128239=>613, 128240=>614, 128241=>615, 128242=>616, 128243=>617, 128244=>618, 128245=>619, 128246=>620, 128247=>621, 128249=>622, 128250=>623, 128251=>624, 128252=>625, 128256=>626, 128257=>627, 128258=>628, 128259=>629, 128260=>630, 128261=>631, 128262=>632, 128263=>633, 128264=>634, 128265=>635, 128266=>636, 128267=>637, 128268=>638, 128269=>639, 128270=>640, 128271=>641, 128272=>642, 128273=>643, 128274=>644, 128275=>645, 128276=>646, 128277=>647, 128278=>648, 128279=>649, 128280=>650, 128281=>651, 128282=>652, 128283=>653, 128284=>654, 128285=>655, 128286=>656, 128287=>657, 128288=>658, 128289=>659, 128290=>660, 128291=>661, 128292=>662, 128293=>663, 128294=>664, 128295=>665, 128296=>666, 128297=>667, 128298=>668, 128299=>669, 128300=>670, 128301=>671, 128302=>672, 128303=>673, 128304=>674, 128305=>675, 128306=>676, 128307=>677, 128308=>678, 128309=>679, 128310=>680, 128311=>681, 128312=>682, 128313=>683, 128314=>684, 128315=>685, 128316=>686, 128317=>687, 128336=>688, 128337=>689, 128338=>690, 128339=>691, 128340=>692, 128341=>693, 128342=>694, 128343=>695, 128344=>696, 128345=>697, 128346=>698, 128347=>699, 128348=>700, 128349=>701, 128350=>702, 128351=>703, 128352=>704, 128353=>705, 128354=>706, 128355=>707, 128356=>708, 128357=>709, 128358=>710, 128359=>711, 128507=>712, 128508=>713, 128509=>714, 128510=>715, 128511=>716, 128512=>717, 128513=>718, 128514=>719, 128515=>720, 128516=>721, 128517=>722, 128518=>723, 128519=>724, 128520=>725, 128521=>726, 128522=>727, 128523=>728, 128524=>729, 128525=>730, 128526=>731, 128527=>732, 128528=>733, 128529=>734, 128530=>735, 128531=>736, 128532=>737, 128533=>738, 128534=>739, 128535=>740, 128536=>741, 128537=>742, 128538=>743, 128539=>744, 128540=>745, 128541=>746, 128542=>747, 128543=>748, 128544=>749, 128545=>750, 128546=>751, 128547=>752, 128548=>753, 128549=>754, 128550=>755, 128551=>756, 128552=>757, 128553=>758, 128554=>759, 128555=>760, 128556=>761, 128557=>762, 128558=>763, 128559=>764, 128560=>765, 128561=>766, 128562=>767, 128563=>768, 128564=>769, 128565=>770, 128566=>771, 128567=>772, 128568=>773, 128569=>774, 128570=>775, 128571=>776, 128572=>777, 128573=>778, 128574=>779, 128575=>780, 128576=>781, 128581=>782, 128582=>783, 128583=>784, 128584=>785, 128585=>786, 128586=>787, 128587=>788, 128588=>789, 128589=>790, 128590=>791, 128591=>792, 128640=>793, 128641=>794, 128642=>795, 128643=>796, 128644=>797, 128645=>798, 128646=>799, 128647=>800, 128648=>801, 128649=>802, 128650=>803, 128651=>804, 128652=>805, 128653=>806, 128654=>807, 128655=>808, 128656=>809, 128657=>810, 128658=>811, 128659=>812, 128660=>813, 128661=>814, 128662=>815, 128663=>816, 128664=>817, 128665=>818, 128666=>819, 128667=>820, 128668=>821, 128669=>822, 128670=>823, 128671=>824, 128672=>825, 128673=>826, 128674=>827, 128675=>828, 128676=>829, 128677=>830, 128678=>831, 128679=>832, 128680=>833, 128681=>834, 128682=>835, 128683=>836, 128684=>837, 128685=>838, 128686=>839, 128687=>840, 128688=>841, 128689=>842, 128690=>843, 128691=>844, 128692=>845, 128693=>846, 128694=>847, 128695=>848, 128696=>849, 128697=>850, 128698=>851, 128699=>852, 128700=>853, 128701=>854, 128702=>855, 128703=>856, 128704=>857, 128705=>858, 128706=>859, 128707=>860, 128708=>861, 128709=>862, 1041637=>978, 1041638=>1088, 1041639=>943, 1041640=>926, 1041641=>974, 1041642=>945, 1041643=>936, 1041644=>1050, 1041645=>917, 1041646=>986, 1042476=>863, 1042478=>865, 1042479=>866, 1042480=>867, 1042481=>868, 1042482=>869, 1042483=>870, 1042484=>871, 1042485=>872, 1042486=>873, 1042487=>864}.freeze
-
-def download_google_emojis(url_template)
- puts "Downloading emojis for google..."
-
- path = "public/images/google"
- FileUtils.rm_rf(path) rescue nil
- FileUtils.mkdir_p(path) rescue nil
-
- Emoji.all.each do |emoji|
- codepoint = emoji["emoji"].codepoints.first
- filename = GOOGLE_EMOJIS[codepoint]
- next if filename.nil?
- puts "#{filename} -> #{emoji["emoji"]}"
- url = url_template % filename
- data = File.open(url, "rb").read
- next if data.nil?
- FileUtils.cd(path) do
- emoji["aliases"].each do |name|
- File.open("#{name}.png", "wb") { |f| f << data }
- ImageOptim.new.optimize_image!("#{name}.png")
- end
- end
- end
+def write_emoji(path, emoji)
+ open(path, "wb") { |f| f << emoji }
+ `pngout #{path}`
+ putc "."
end
diff --git a/lib/tasks/populate.thor b/lib/tasks/populate.thor
index e19323d177e..531f0efa229 100644
--- a/lib/tasks/populate.thor
+++ b/lib/tasks/populate.thor
@@ -74,6 +74,10 @@ class Populate < Thor
puts "Making a new topic: '#{topic_title}'"
post_creator = PostCreator.new(users.sample, title: topic_title, raw: generate_sentence(7))
first_post = post_creator.create
+ unless first_post
+ puts post_creator.errors.full_messages, ""
+ raise StandardError.new(post_creator.errors.full_messages)
+ end
topic = first_post.topic
start_post = 2
topic
@@ -83,7 +87,11 @@ class Populate < Thor
print '.'
raw = rand(4) == 0 ? (rand(2) == 0 ? image_posts.sample : wikipedia_posts.sample) : generate_sentence(7)
post_creator = PostCreator.new(users.sample, topic_id: topic.id, raw: raw)
- post_creator.create
+ post = post_creator.create
+ unless post
+ puts post_creator.errors.full_messages, ""
+ end
+ post
end
def hipster_words
diff --git a/lib/tasks/posts.rake b/lib/tasks/posts.rake
index 37fb02bfafd..324d3ded1d5 100644
--- a/lib/tasks/posts.rake
+++ b/lib/tasks/posts.rake
@@ -18,7 +18,7 @@ task 'posts:fix_letter_avatars' => :environment do
rebaked = 0
total = search.count
- search.order(updated_at: :asc).find_each do |post|
+ search.find_each do |post|
rebake_post(post)
print_status(rebaked += 1, total)
end
@@ -26,6 +26,41 @@ task 'posts:fix_letter_avatars' => :environment do
puts "", "#{rebaked} posts done!", ""
end
+desc 'Rebake all posts matching string/regex and optionally delay the loop'
+task 'posts:rebake_match', [:pattern, :type, :delay] => [:environment] do |_,args|
+ pattern = args[:pattern]
+ type = args[:type]
+ type = type.downcase if type
+ delay = args[:delay].to_i if args[:delay]
+ if !pattern
+ puts "ERROR: Expecting rake posts:rebake_match[pattern,type,delay]"
+ exit 1
+ elsif delay && delay < 1
+ puts "ERROR: delay parameter should be an integer and greater than 0"
+ exit 1
+ end
+
+ if type == "regex"
+ search = Post.where("raw ~ ?", pattern)
+ elsif type == "string" || !type
+ search = Post.where("raw ILIKE ?", "%#{pattern}%")
+ else
+ puts "ERROR: Expecting rake posts:rebake_match[pattern,type] where type is string or regex"
+ exit 1
+ end
+
+ rebaked = 0
+ total = search.count
+
+ search.find_each do |post|
+ rebake_post(post)
+ print_status(rebaked += 1, total)
+ sleep(delay) if delay
+ end
+
+ puts "", "#{rebaked} posts done!", ""
+end
+
def rebake_posts_all_sites(opts = {})
RailsMultisite::ConnectionManagement.each_connection do |db|
rebake_posts(opts)
@@ -41,7 +76,7 @@ def rebake_posts(opts = {})
total = Post.count
rebaked = 0
- Post.order(updated_at: :asc).find_each do |post|
+ Post.find_each do |post|
rebake_post(post, opts)
print_status(rebaked += 1, total)
end
@@ -80,3 +115,27 @@ task 'posts:normalize_code' => :environment do
puts
puts "#{i} posts normalized!"
end
+
+desc 'Remap all posts matching specific string'
+task 'posts:remap', [:find, :replace] => [:environment] do |_,args|
+ find = args[:find]
+ replace = args[:replace]
+ if !find || !replace
+ puts "ERROR: Expecting rake posts:rebake_match[find,replace]"
+ exit 1
+ end
+
+ puts "Remapping"
+ i = 0
+ Post.where("raw LIKE ?", "%#{find}%").each do |p|
+ new_raw = p.raw.dup
+ new_raw = new_raw.gsub!(/#{Regexp.escape(find)}/, replace) || new_raw
+
+ if new_raw != p.raw
+ p.revise(Discourse.system_user, { raw: new_raw }, { bypass_bump: true, skip_revision: true })
+ putc "."
+ i += 1
+ end
+ end
+ puts "", "#{i} posts remapped!", ""
+end
diff --git a/lib/tasks/qunit.rake b/lib/tasks/qunit.rake
index 5aa1d790127..b4e9e228875 100644
--- a/lib/tasks/qunit.rake
+++ b/lib/tasks/qunit.rake
@@ -1,6 +1,6 @@
desc "Runs the qunit test suite"
-task "qunit:test" => :environment do
+task "qunit:test", [:timeout] => :environment do |_, args|
require "rack"
require "socket"
@@ -35,7 +35,7 @@ task "qunit:test" => :environment do
begin
success = true
test_path = "#{Rails.root}/vendor/assets/javascripts"
- cmd = "phantomjs #{test_path}/run-qunit.js http://localhost:#{port}/qunit"
+ cmd = "phantomjs #{test_path}/run-qunit.js http://localhost:#{port}/qunit #{args[:timeout]}"
options = {}
@@ -55,15 +55,15 @@ task "qunit:test" => :environment do
exit if ENV['RETRY'].present? && ENV['RETRY'] == 'false'
sleep 2
tries += 1
- retry unless tries == 10
+ retry unless tries == 3
end
# A bit of a hack until we can figure this out on Travis
tries = 0
- while tries < 3 && $?.exitstatus == 124 && !quit
+ while tries < 3 && $?.exitstatus == 124
tries += 1
puts "\nTimed Out. Trying again...\n"
- rake_system(cmd)
+ sh(cmd)
end
success &&= $?.success?
diff --git a/lib/tasks/redis.rake b/lib/tasks/redis.rake
new file mode 100644
index 00000000000..4300f0686cb
--- /dev/null
+++ b/lib/tasks/redis.rake
@@ -0,0 +1,30 @@
+task 'redis:clean_up' => ['environment'] do
+ return unless Rails.configuration.multisite
+
+ dbs = RailsMultisite::ConnectionManagement.all_dbs
+ dbs << Discourse::SIDEKIQ_NAMESPACE
+
+ regexp = /((\$(?
"
+ end
+
+ sets.add_choice(set[:value], {
+ label: I18n.t("js.#{set[:name]}"),
+ extra_label: "#{imgs.join}"
+ })
+
+ step.on_update do |updater|
+ updater.apply_settings(:emoji_set)
+ end
+ end
+ end
+
+ @wizard.append_step('invites') do |step|
+
+ staff_count = User.where("moderator = true or admin = true").where("id <> ?", Discourse.system_user.id).count
+ step.add_field(id: 'staff_count', type: 'component', value: staff_count)
+
+ step.add_field(id: 'invite_list', type: 'component')
+
+ step.on_update do |updater|
+ users = JSON.parse(updater.fields[:invite_list])
+
+ users.each do |u|
+ args = {}
+ args[:moderator] = true if u['role'] == 'moderator'
+ Invite.create_invite_by_email(u['email'], @wizard.user, args)
+ end
+ end
+ end
+
+ DiscourseEvent.trigger(:build_wizard, @wizard)
+
+ @wizard.append_step('finished') do |step|
+ step.banner = "finished.png"
+ end
+ @wizard
+ end
+
+ protected
+
+ def replace_company(updater, raw, field_name)
+ old_value = SiteSetting.send(field_name)
+ old_value = field_name if old_value.blank?
+
+ new_value = updater.fields[field_name.to_sym]
+ new_value = field_name if new_value.blank?
+
+ raw.gsub!(old_value, new_value)
+ end
+ end
+end
+
diff --git a/lib/wizard/field.rb b/lib/wizard/field.rb
new file mode 100644
index 00000000000..0816e055d7f
--- /dev/null
+++ b/lib/wizard/field.rb
@@ -0,0 +1,39 @@
+class Wizard
+
+ class Choice
+ attr_reader :id, :label, :icon, :data, :extra_label
+ attr_accessor :field
+
+ def initialize(id, opts)
+ @id = id
+ @data = opts[:data]
+ @label = opts[:label]
+ @extra_label = opts[:extra_label]
+ @icon = opts[:icon]
+ end
+ end
+
+ class Field
+ attr_reader :id, :type, :required, :value, :choices
+ attr_accessor :step
+
+ def initialize(attrs)
+ attrs = attrs || {}
+
+ @id = attrs[:id]
+ @type = attrs[:type]
+ @required = !!attrs[:required]
+ @value = attrs[:value]
+ @choices = []
+ end
+
+ def add_choice(id, opts=nil)
+ choice = Choice.new(id, opts || {})
+ choice.field = self
+
+ @choices << choice
+ choice
+ end
+
+ end
+end
diff --git a/lib/wizard/step.rb b/lib/wizard/step.rb
new file mode 100644
index 00000000000..40a8b9f6e5d
--- /dev/null
+++ b/lib/wizard/step.rb
@@ -0,0 +1,26 @@
+class Wizard
+ class Step
+ attr_reader :id, :updater
+ attr_accessor :index, :fields, :next, :previous, :banner
+
+ def initialize(id)
+ @id = id
+ @fields = []
+ end
+
+ def add_field(attrs)
+ field = Field.new(attrs)
+ field.step = self
+ @fields << field
+ field
+ end
+
+ def has_fields?
+ @fields.present?
+ end
+
+ def on_update(&block)
+ @updater = block
+ end
+ end
+end
diff --git a/lib/wizard/step_updater.rb b/lib/wizard/step_updater.rb
new file mode 100644
index 00000000000..f05605c33fe
--- /dev/null
+++ b/lib/wizard/step_updater.rb
@@ -0,0 +1,51 @@
+class Wizard
+ class StepUpdater
+ include ActiveModel::Model
+
+ attr_accessor :refresh_required, :fields
+
+ def initialize(current_user, step, fields)
+ @current_user = current_user
+ @step = step
+ @refresh_required = false
+ @fields = fields
+ end
+
+ def update
+ @step.updater.call(self) if @step.present? && @step.updater.present?
+
+ if success?
+ logger = StaffActionLogger.new(@current_user)
+ logger.log_wizard_step(@step)
+ end
+ end
+
+ def success?
+ @errors.blank?
+ end
+
+ def refresh_required?
+ @refresh_required
+ end
+
+ def update_setting(id, value)
+ value.strip! if value.is_a?(String)
+ SiteSetting.set_and_log(id, value, @current_user) if SiteSetting.send(id) != value
+ end
+
+ def apply_setting(id)
+ update_setting(id, @fields[id])
+ rescue Discourse::InvalidParameters => e
+ errors.add(id, e.message)
+ end
+
+ def ensure_changed(id)
+ errors.add(id, '') if @fields[id] == SiteSetting.defaults[id]
+ end
+
+ def apply_settings(*ids)
+ ids.each {|id| apply_setting(id)}
+ end
+
+ end
+end
diff --git a/plugins/discourse-details/assets/javascripts/initializers/apply-details.js.es6 b/plugins/discourse-details/assets/javascripts/initializers/apply-details.js.es6
index e7164334cef..074d93a3b42 100644
--- a/plugins/discourse-details/assets/javascripts/initializers/apply-details.js.es6
+++ b/plugins/discourse-details/assets/javascripts/initializers/apply-details.js.es6
@@ -18,8 +18,10 @@ function initializeDetails(api) {
this.get("toolbarEvent").applySurround(
`[details=${I18n.t("composer.details_title")}]`,
"[/details]",
- "details_text")
- ;
+ "details_text",
+ { multiline: false }
+ );
+ this.set('optionsVisible', false);
}
}
});
diff --git a/plugins/discourse-details/config/locales/client.fi.yml b/plugins/discourse-details/config/locales/client.fi.yml
new file mode 100644
index 00000000000..6b8672a7704
--- /dev/null
+++ b/plugins/discourse-details/config/locales/client.fi.yml
@@ -0,0 +1,7 @@
+fi:
+ js:
+ details:
+ title: Yhteenveto
+ composer:
+ details_title: Yhteenveto
+ details_text: "Tämä teksti piilotetaan otsikon alle."
diff --git a/plugins/discourse-details/config/locales/client.fr.yml b/plugins/discourse-details/config/locales/client.fr.yml
new file mode 100644
index 00000000000..84f9494dd8e
--- /dev/null
+++ b/plugins/discourse-details/config/locales/client.fr.yml
@@ -0,0 +1,7 @@
+fr:
+ js:
+ details:
+ title: Cacher le texte
+ composer:
+ details_title: Résumé
+ details_text: "Ce texte sera caché"
diff --git a/plugins/discourse-details/config/locales/client.it.yml b/plugins/discourse-details/config/locales/client.it.yml
new file mode 100644
index 00000000000..d5027e46860
--- /dev/null
+++ b/plugins/discourse-details/config/locales/client.it.yml
@@ -0,0 +1,7 @@
+it:
+ js:
+ details:
+ title: Nascondi Dettagli
+ composer:
+ details_title: Summary
+ details_text: "Questo testo verrà nascosto"
diff --git a/plugins/discourse-details/config/locales/client.ur.yml b/plugins/discourse-details/config/locales/client.ur.yml
new file mode 100644
index 00000000000..8051af44458
--- /dev/null
+++ b/plugins/discourse-details/config/locales/client.ur.yml
@@ -0,0 +1,7 @@
+ur:
+ js:
+ details:
+ title: Hide Details
+ composer:
+ details_title: Summary
+ details_text: "This text will be hidden"
diff --git a/plugins/discourse-details/config/locales/server.fi.yml b/plugins/discourse-details/config/locales/server.fi.yml
new file mode 100644
index 00000000000..cc9e0208fbe
--- /dev/null
+++ b/plugins/discourse-details/config/locales/server.fi.yml
@@ -0,0 +1,3 @@
+fi:
+ site_settings:
+ details_enabled: "Laita yhteenveto-plugin päälle. Jos muutat: \"rake posts:rebake\"."
diff --git a/plugins/discourse-details/config/locales/server.fr.yml b/plugins/discourse-details/config/locales/server.fr.yml
new file mode 100644
index 00000000000..4066a0937df
--- /dev/null
+++ b/plugins/discourse-details/config/locales/server.fr.yml
@@ -0,0 +1,3 @@
+fr:
+ site_settings:
+ details_enabled: "Activer le plugin details. Si vous modifiez ceci, vous devez exécuter la commande \"rake posts:rebake\"."
diff --git a/plugins/discourse-details/config/locales/server.ur.yml b/plugins/discourse-details/config/locales/server.ur.yml
new file mode 100644
index 00000000000..c97287e9c4a
--- /dev/null
+++ b/plugins/discourse-details/config/locales/server.ur.yml
@@ -0,0 +1,3 @@
+ur:
+ site_settings:
+ details_enabled: "Enable the details plugin. If you change this, you must rebake all posts with: \"rake posts:rebake\"."
diff --git a/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6 b/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6
index 5109b62881b..427687886ab 100644
--- a/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6
+++ b/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6
@@ -9,10 +9,6 @@ function findTextarea() {
test('details button', () => {
visit("/");
- andThen(() => {
- ok(exists('#create-topic'), 'the create button is visible');
- });
-
click('#create-topic');
click('button.options');
click('.popup-menu .fa-caret-right');
@@ -40,7 +36,7 @@ test('details button', () => {
equal(
find(".d-editor-input").val(),
`[details=${I18n.t("composer.details_title")}]This is my title[/details]`,
- 'it should contain the right output'
+ 'it should contain the right selected output'
);
const textarea = findTextarea();
diff --git a/plugins/discourse-nginx-performance-report/config/locales/server.ar.yml b/plugins/discourse-nginx-performance-report/config/locales/server.ar.yml
index 0c401c64f66..65b70e00fbe 100644
--- a/plugins/discourse-nginx-performance-report/config/locales/server.ar.yml
+++ b/plugins/discourse-nginx-performance-report/config/locales/server.ar.yml
@@ -1,3 +1,3 @@
ar:
site_settings:
- daily_performance_report: "تحليل سجلات NGINX يومي ونشر موضوع \"قاقم فقط\" مع التفاصيل"
+ daily_performance_report: "تحليل سجلّات الخادم NGINX يوميًا ونشر موضوع مفصّل مع طاقم الموقع"
diff --git a/plugins/discourse-nginx-performance-report/config/locales/server.ur.yml b/plugins/discourse-nginx-performance-report/config/locales/server.ur.yml
new file mode 100644
index 00000000000..c9ce6b0c708
--- /dev/null
+++ b/plugins/discourse-nginx-performance-report/config/locales/server.ur.yml
@@ -0,0 +1,3 @@
+ur:
+ site_settings:
+ daily_performance_report: "Analyze NGINX logs daily and post a Staff Only topic with details"
diff --git a/plugins/discourse-nginx-performance-report/lib/log_analyzer.rb b/plugins/discourse-nginx-performance-report/lib/log_analyzer.rb
new file mode 100644
index 00000000000..de23062c43b
--- /dev/null
+++ b/plugins/discourse-nginx-performance-report/lib/log_analyzer.rb
@@ -0,0 +1,157 @@
+class LogAnalyzer
+
+ class LineParser
+
+
+ # log_format log_discourse '[$time_local] $remote_addr "$request" "$http_user_agent" "$sent_http_x_discourse_route" $status $bytes_sent "$http_referer" $upstream_response_time $request_time "$sent_http_x_discourse_username"';
+
+ attr_accessor :time, :ip_address, :url, :route, :user_agent, :rails_duration, :total_duration,
+ :username, :status, :bytes_sent, :referer
+
+ PATTERN = /\[(.*)\] (\S+) \"(.*)\" \"(.*)\" \"(.*)\" ([0-9]+) ([0-9]+) \"(.*)\" ([0-9.]+) ([0-9.]+) "(.*)"/
+
+ TIME_FORMAT = "%d/%b/%Y:%H:%M:%S %Z"
+
+ def self.parse(line)
+
+ result = new
+ _, result.time, result.ip_address, result.url, result.user_agent,
+ result.route, result.status, result.bytes_sent, result.referer,
+ result.rails_duration, result.total_duration, result.username = line.match(PATTERN).to_a
+
+ result.rails_duration = result.rails_duration.to_f
+ result.total_duration = result.total_duration.to_f
+
+ verb = result.url[0..3] if result.url
+ if verb && verb == "POST"
+ result.route += " (POST)"
+ end
+
+ if verb && verb == "PUT"
+ result.route += " (PUT)"
+ end
+
+ result.url = self.sanitize_url(result.url) if result.url
+
+ result
+ end
+
+ def is_mobile?
+ user_agent =~ /Mobile|Android|webOS/ && !(user_agent =~ /iPad|Nexus (7|10)/)
+ end
+
+ def parsed_time
+ DateTime.strptime(time, TIME_FORMAT) if time
+ end
+
+ private
+
+ def self.sanitize_url(url)
+ url.gsub(/api_key=([\w.\-]+)/, 'api_key=[FILTERED]')
+ end
+ end
+
+ attr_reader :total_requests, :message_bus_requests, :filenames,
+ :ip_to_rails_duration, :username_to_rails_duration,
+ :route_to_rails_duration, :url_to_rails_duration,
+ :status_404_to_count, :from_time, :to_time
+
+ def self.analyze(filenames, args)
+ new(filenames, args).analyze
+ end
+
+ class Aggeregator
+
+ attr_accessor :aggregate_type
+
+ def initialize
+ @data = {}
+ @aggregate_type = :duration
+ end
+
+ def add(id, duration, aggregate=nil)
+ ary = (@data[id] ||= [0,0])
+ ary[0] += duration
+ ary[1] += 1
+ unless aggregate.nil?
+ ary[2] ||= Hash.new(0)
+ if @aggregate_type == :duration
+ ary[2][aggregate] += duration
+ elsif @aggregate_type == :count
+ ary[2][aggregate] += 1
+ end
+ end
+ end
+
+ def top(n, aggregator_formatter=nil)
+ @data.sort{|a,b| b[1][0] <=> a[1][0]}.first(n).map do |metric, ary|
+ metric = metric.to_s
+ metric = "[empty]" if metric.length == 0
+ result = [metric, ary[0], ary[1]]
+ # handle aggregate
+ if ary[2]
+ if aggregator_formatter
+ result.push aggregator_formatter.call(ary[2], ary[0], ary[1])
+ else
+ result.push ary[2].sort{|a,b| b[1] <=> a[1]}.first(5).map{|k,v|
+ v = "%.2f" % v if Float === v
+ "#{k}(#{v})"}.join(" ")
+ end
+ end
+
+ result
+ end
+ end
+ end
+
+ def initialize(filenames, args={})
+ @filenames = filenames
+ @ip_to_rails_duration = Aggeregator.new
+ @username_to_rails_duration = Aggeregator.new
+
+ @route_to_rails_duration = Aggeregator.new
+ @route_to_rails_duration.aggregate_type = :count
+
+ @url_to_rails_duration = Aggeregator.new
+ @status_404_to_count = Aggeregator.new
+
+ @total_requests = 0
+ @message_bus_requests = 0
+ @limit = args[:limit]
+ end
+
+ def analyze
+ now = DateTime.now
+
+ @filenames.each do |filename|
+ File.open(filename).each_line do |line|
+ @total_requests += 1
+ parsed = LineParser.parse(line)
+
+ next unless parsed.time
+ next if @limit && ((now - parsed.parsed_time) * 24 * 60).to_i > @limit
+
+ @from_time ||= parsed.time
+ @to_time = parsed.time
+
+ if parsed.url =~ /(POST|GET) \/message-bus/
+ @message_bus_requests += 1
+ next
+ end
+
+ @ip_to_rails_duration.add(parsed.ip_address, parsed.rails_duration)
+
+ username = parsed.username == "-" ? "[Anonymous]" : parsed.username
+ @username_to_rails_duration.add(username, parsed.rails_duration, parsed.route)
+
+ @route_to_rails_duration.add(parsed.route, parsed.rails_duration, parsed.is_mobile? ? "mobile" : "desktop")
+
+ @url_to_rails_duration.add(parsed.url, parsed.rails_duration)
+
+ @status_404_to_count.add(parsed.url,1) if parsed.status == "404"
+ end
+ end
+ self
+ end
+
+end
diff --git a/plugins/discourse-nginx-performance-report/script/nginx_analyze.rb b/plugins/discourse-nginx-performance-report/script/nginx_analyze.rb
index 262ad047ea1..8550806f879 100644
--- a/plugins/discourse-nginx-performance-report/script/nginx_analyze.rb
+++ b/plugins/discourse-nginx-performance-report/script/nginx_analyze.rb
@@ -1,162 +1,5 @@
require 'date'
-
-class LogAnalyzer
-
- class LineParser
-
-
- # log_format log_discourse '[$time_local] $remote_addr "$request" "$http_user_agent" "$sent_http_x_discourse_route" $status $bytes_sent "$http_referer" $upstream_response_time $request_time "$sent_http_x_discourse_username"';
-
- attr_accessor :time, :ip_address, :url, :route, :user_agent, :rails_duration, :total_duration,
- :username, :status, :bytes_sent, :referer
-
- PATTERN = /\[(.*)\] (\S+) \"(.*)\" \"(.*)\" \"(.*)\" ([0-9]+) ([0-9]+) \"(.*)\" ([0-9.]+) ([0-9.]+) "(.*)"/
-
- TIME_FORMAT = "%d/%b/%Y:%H:%M:%S %Z"
-
- def self.parse(line)
-
- result = new
- _, result.time, result.ip_address, result.url, result.user_agent,
- result.route, result.status, result.bytes_sent, result.referer,
- result.rails_duration, result.total_duration, result.username = line.match(PATTERN).to_a
-
- result.rails_duration = result.rails_duration.to_f
- result.total_duration = result.total_duration.to_f
-
- verb = result.url[0..3] if result.url
- if verb && verb == "POST"
- result.route += " (POST)"
- end
-
- if verb && verb == "PUT"
- result.route += " (PUT)"
- end
-
- result.url = self.sanitize_url(result.url) if result.url
-
- result
- end
-
- def is_mobile?
- user_agent =~ /Mobile|Android|webOS/ && !(user_agent =~ /iPad|Nexus (7|10)/)
- end
-
- def parsed_time
- DateTime.strptime(time, TIME_FORMAT) if time
- end
-
- private
-
- def self.sanitize_url(url)
- url.gsub(/(api_key|api_username)=(\w+)/, '\1=[FILTERED]')
- end
- end
-
- attr_reader :total_requests, :message_bus_requests, :filenames,
- :ip_to_rails_duration, :username_to_rails_duration,
- :route_to_rails_duration, :url_to_rails_duration,
- :status_404_to_count, :from_time, :to_time
-
- def self.analyze(filenames, args)
- new(filenames, args).analyze
- end
-
- class Aggeregator
-
- attr_accessor :aggregate_type
-
- def initialize
- @data = {}
- @aggregate_type = :duration
- end
-
- def add(id, duration, aggregate=nil)
- ary = (@data[id] ||= [0,0])
- ary[0] += duration
- ary[1] += 1
- unless aggregate.nil?
- ary[2] ||= Hash.new(0)
- if @aggregate_type == :duration
- ary[2][aggregate] += duration
- elsif @aggregate_type == :count
- ary[2][aggregate] += 1
- end
- end
- end
-
- def top(n, aggregator_formatter=nil)
- @data.sort{|a,b| b[1][0] <=> a[1][0]}.first(n).map do |metric, ary|
- metric = metric.to_s
- metric = "[empty]" if metric.length == 0
- result = [metric, ary[0], ary[1]]
- # handle aggregate
- if ary[2]
- if aggregator_formatter
- result.push aggregator_formatter.call(ary[2], ary[0], ary[1])
- else
- result.push ary[2].sort{|a,b| b[1] <=> a[1]}.first(5).map{|k,v|
- v = "%.2f" % v if Float === v
- "#{k}(#{v})"}.join(" ")
- end
- end
-
- result
- end
- end
- end
-
- def initialize(filenames, args={})
- @filenames = filenames
- @ip_to_rails_duration = Aggeregator.new
- @username_to_rails_duration = Aggeregator.new
-
- @route_to_rails_duration = Aggeregator.new
- @route_to_rails_duration.aggregate_type = :count
-
- @url_to_rails_duration = Aggeregator.new
- @status_404_to_count = Aggeregator.new
-
- @total_requests = 0
- @message_bus_requests = 0
- @limit = args[:limit]
- end
-
- def analyze
- now = DateTime.now
-
- @filenames.each do |filename|
- File.open(filename).each_line do |line|
- @total_requests += 1
- parsed = LineParser.parse(line)
-
- next unless parsed.time
- next if @limit && ((now - parsed.parsed_time) * 24 * 60).to_i > @limit
-
- @from_time ||= parsed.time
- @to_time = parsed.time
-
- if parsed.url =~ /(POST|GET) \/message-bus/
- @message_bus_requests += 1
- next
- end
-
- @ip_to_rails_duration.add(parsed.ip_address, parsed.rails_duration)
-
- username = parsed.username == "-" ? "[Anonymous]" : parsed.username
- @username_to_rails_duration.add(username, parsed.rails_duration, parsed.route)
-
- @route_to_rails_duration.add(parsed.route, parsed.rails_duration, parsed.is_mobile? ? "mobile" : "desktop")
-
- @url_to_rails_duration.add(parsed.url, parsed.rails_duration)
-
- @status_404_to_count.add(parsed.url,1) if parsed.status == "404"
- end
- end
- self
- end
-
-end
+require_relative '../lib/log_analyzer'
args = ARGV.dup
diff --git a/plugins/discourse-nginx-performance-report/spec/line_parser_spec.rb b/plugins/discourse-nginx-performance-report/spec/line_parser_spec.rb
new file mode 100644
index 00000000000..d8f8313bc34
--- /dev/null
+++ b/plugins/discourse-nginx-performance-report/spec/line_parser_spec.rb
@@ -0,0 +1,13 @@
+require 'rails_helper'
+require_relative '../lib/log_analyzer'
+
+describe LogAnalyzer::LineParser do
+ describe '.parse' do
+ let(:line) { '[22/Sep/2016:07:32:00 +0000] 172.0.0.1 "GET /about.json?api_username=system&api_key=1234567 HTTP/1.1" "Some usename" "about/index" 200 1641 "-" 0.014 0.014 "system"' }
+
+ it "should filter out the api_key" do
+ result = described_class.parse(line)
+ expect(result.url).to eq('GET /about.json?api_username=system&api_key=[FILTERED] HTTP/1.1')
+ end
+ end
+end
diff --git a/plugins/lazyYT/assets/javascripts/initializers/lazyYT.js.es6 b/plugins/lazyYT/assets/javascripts/initializers/lazyYT.js.es6
index 34950f184df..21037618f79 100644
--- a/plugins/lazyYT/assets/javascripts/initializers/lazyYT.js.es6
+++ b/plugins/lazyYT/assets/javascripts/initializers/lazyYT.js.es6
@@ -1,18 +1,35 @@
import { withPluginApi } from 'discourse/lib/plugin-api';
+const returnFalse = () => false;
+
export default {
name: "apply-lazyYT",
initialize() {
withPluginApi('0.1', api => {
- api.decorateCooked($elem => $('.lazyYT', $elem).lazyYT({
- onPlay(e, $el) {
- // don't cloak posts that have playing videos in them
- const postId = parseInt($el.closest('article').data('post-id'));
- if (postId) {
- api.preventCloak(postId);
+ api.decorateCooked($elem => {
+
+ const iframes = $('.lazyYT', $elem);
+ if (iframes.length === 0) { return; }
+
+ $('.lazyYT', $elem).lazyYT({
+ onPlay(e, $el) {
+ // don't cloak posts that have playing videos in them
+ const postId = parseInt($el.closest('article').data('post-id'));
+ if (postId) {
+ api.preventCloak(postId);
+ }
+
+ // We use this because watching videos fullscreen in Chrome was super buggy
+ // otherwise. Thanks to arrendek from q23 for the technique.
+ $('iframe', iframes).iframeTracker({ blurCallback: () => {
+ $(document).on("scroll.discourse-youtube", returnFalse);
+ window.setTimeout(() => $(document).off('scroll.discourse-youtube', returnFalse), 1500);
+ $(document).scroll();
+ }});
}
- }
- }));
+ });
+
+ });
});
}
};
diff --git a/plugins/lazyYT/assets/javascripts/jquery.iframetracker.js b/plugins/lazyYT/assets/javascripts/jquery.iframetracker.js
new file mode 100644
index 00000000000..595633ea81b
--- /dev/null
+++ b/plugins/lazyYT/assets/javascripts/jquery.iframetracker.js
@@ -0,0 +1,165 @@
+/**
+ * jQuery iframe click tracking plugin
+ *
+ * @author Vincent Paré (www.finalclap.com)
+ * @copyright © 2013-2015 Vincent Paré
+ * @license http://opensource.org/licenses/Apache-2.0
+ * @version 1.1.0
+ */
+(function($){
+ // Tracking handler manager
+ $.fn.iframeTracker = function(handler){
+ var target = this.get();
+ if (handler === null || handler === false) {
+ $.iframeTracker.untrack(target);
+ } else if (typeof handler == "object") {
+ $.iframeTracker.track(target, handler);
+ } else {
+ throw new Error("Wrong handler type (must be an object, or null|false to untrack)");
+ }
+ };
+
+ // Iframe tracker common object
+ $.iframeTracker = {
+ // State
+ focusRetriever: null, // Element used for restoring focus on window (element)
+ focusRetrieved: false, // Says if the focus was retrived on the current page (bool)
+ handlersList: [], // Store a list of every trakers (created by calling $(selector).iframeTracker...)
+ isIE8AndOlder: false, // true for Internet Explorer 8 and older
+
+ // Init (called once on document ready)
+ init: function(){
+ // Determine browser version (IE8-) ($.browser.msie is deprecated since jQuery 1.9)
+ try {
+ if ($.browser.msie == true && $.browser.version < 9) {
+ this.isIE8AndOlder = true;
+ }
+ } catch(ex) {
+ try {
+ var matches = navigator.userAgent.match(/(msie) ([\w.]+)/i);
+ if (matches[2] < 9) {
+ this.isIE8AndOlder = true;
+ }
+ } catch(ex2) {}
+ }
+
+ // Listening window blur
+ $(window).focus();
+ $(window).blur(function(e){
+ $.iframeTracker.windowLoseFocus(e);
+ });
+
+ // Focus retriever (get the focus back to the page, on mouse move)
+ $('body').append('');
+ this.focusRetriever = $('#focus_retriever');
+ this.focusRetrieved = false;
+ $(document).mousemove(function(e){
+ if (document.activeElement && document.activeElement.tagName == 'IFRAME') {
+ $.iframeTracker.focusRetriever.focus();
+ $.iframeTracker.focusRetrieved = true;
+ }
+ });
+
+ // Special processing to make it work with my old friend IE8 (and older) ;)
+ if (this.isIE8AndOlder) {
+ // Blur doesn't works correctly on IE8-, so we need to trigger it manually
+ this.focusRetriever.blur(function(e){
+ e.stopPropagation();
+ e.preventDefault();
+ $.iframeTracker.windowLoseFocus(e);
+ });
+
+ // Keep focus on window (fix bug IE8-, focusable elements)
+ $('body').click(function(e){ $(window).focus(); });
+ $('form').click(function(e){ e.stopPropagation(); });
+
+ // Same thing for "post-DOMready" created forms (issue #6)
+ try {
+ $('body').on('click', 'form', function(e){ e.stopPropagation(); });
+ } catch(ex) {
+ console.log("[iframeTracker] Please update jQuery to 1.7 or newer. (exception: " + ex.message + ")");
+ }
+ }
+ },
+
+
+ // Add tracker to target using handler (bind boundary listener + register handler)
+ // target: Array of target elements (native DOM elements)
+ // handler: User handler object
+ track: function(target, handler){
+ // Adding target elements references into handler
+ handler.target = target;
+
+ // Storing the new handler into handler list
+ $.iframeTracker.handlersList.push(handler);
+
+ // Binding boundary listener
+ $(target)
+ .bind('mouseover', {handler: handler}, $.iframeTracker.mouseoverListener)
+ .bind('mouseout', {handler: handler}, $.iframeTracker.mouseoutListener);
+ },
+
+ // Remove tracking on target elements
+ // target: Array of target elements (native DOM elements)
+ untrack: function(target){
+ if (typeof Array.prototype.filter != "function") {
+ console.log("Your browser doesn't support Array filter, untrack disabled");
+ return;
+ }
+
+ // Unbinding boundary listener
+ $(target).each(function(index){
+ $(this)
+ .unbind('mouseover', $.iframeTracker.mouseoverListener)
+ .unbind('mouseout', $.iframeTracker.mouseoutListener);
+ });
+
+ // Handler garbage collector
+ var nullFilter = function(value){
+ return value === null ? false : true;
+ };
+ for (var i in this.handlersList) {
+ // Prune target
+ for (var j in this.handlersList[i].target) {
+ if ($.inArray(this.handlersList[i].target[j], target) !== -1) {
+ this.handlersList[i].target[j] = null;
+ }
+ }
+ this.handlersList[i].target = this.handlersList[i].target.filter(nullFilter);
+
+ // Delete handler if unused
+ if (this.handlersList[i].target.length == 0) {
+ this.handlersList[i] = null;
+ }
+ }
+ this.handlersList = this.handlersList.filter(nullFilter);
+ },
+
+ // Target mouseover event listener
+ mouseoverListener: function(e){
+ e.data.handler.over = true;
+ try {e.data.handler.overCallback(this);} catch(ex) {}
+ },
+
+ // Target mouseout event listener
+ mouseoutListener: function(e){
+ e.data.handler.over = false;
+ $.iframeTracker.focusRetriever.focus();
+ try {e.data.handler.outCallback(this);} catch(ex) {}
+ },
+
+ // Calls blurCallback for every handler with over=true on window blur
+ windowLoseFocus: function(event){
+ for (var i in this.handlersList) {
+ if (this.handlersList[i].over == true) {
+ try {this.handlersList[i].blurCallback();} catch(ex) {}
+ }
+ }
+ }
+ };
+
+ // Init the iframeTracker on document ready
+ $(document).ready(function(){
+ $.iframeTracker.init();
+ });
+})(jQuery);
\ No newline at end of file
diff --git a/plugins/lazyYT/plugin.rb b/plugins/lazyYT/plugin.rb
index 70475b73afa..dc1e7da2567 100644
--- a/plugins/lazyYT/plugin.rb
+++ b/plugins/lazyYT/plugin.rb
@@ -6,6 +6,7 @@
# javascript
register_asset "javascripts/lazyYT.js"
+register_asset "javascripts/jquery.iframetracker.js"
# stylesheet
register_asset "stylesheets/lazyYT.css"
diff --git a/plugins/poll/assets/javascripts/components/poll-option.js.es6 b/plugins/poll/assets/javascripts/components/poll-option.js.es6
deleted file mode 100644
index b20f2b52041..00000000000
--- a/plugins/poll/assets/javascripts/components/poll-option.js.es6
+++ /dev/null
@@ -1,25 +0,0 @@
-import computed from 'ember-addons/ember-computed-decorators';
-import { iconHTML } from 'discourse/helpers/fa-icon';
-
-export default Em.Component.extend({
- tagName: "li",
- attributeBindings: ["data-poll-option-id"],
-
- "data-poll-option-id": Em.computed.alias("option.id"),
-
- @computed("option.selected", "isMultiple")
- optionIcon(selected, isMultiple) {
- if (isMultiple) {
- return iconHTML(selected ? 'check-square-o' : 'square-o');
- } else {
- return iconHTML(selected ? 'dot-circle-o' : 'circle-o');
- }
- },
-
- click(e) {
- // ensure we're not clicking on a link
- if ($(e.target).closest("a").length === 0) {
- this.sendAction("toggle", this.get("option"));
- }
- }
-});
diff --git a/plugins/poll/assets/javascripts/components/poll-results-number-voters.js.es6 b/plugins/poll/assets/javascripts/components/poll-results-number-voters.js.es6
deleted file mode 100644
index 412cc8acd20..00000000000
--- a/plugins/poll/assets/javascripts/components/poll-results-number-voters.js.es6
+++ /dev/null
@@ -1,15 +0,0 @@
-import computed from 'ember-addons/ember-computed-decorators';
-import PollVoters from 'discourse/plugins/poll/components/poll-voters';
-
-export default PollVoters.extend({
- @computed("poll.voters", "pollsVoters")
- canLoadMore(voters, pollsVoters) {
- return pollsVoters.length < voters;
- },
-
- @computed("poll.options", "offset")
- voterIds(options) {
- const ids = [].concat(...(options.map(option => option.voter_ids)));
- return this._getIds(ids);
- }
-});
diff --git a/plugins/poll/assets/javascripts/components/poll-results-number.js.es6 b/plugins/poll/assets/javascripts/components/poll-results-number.js.es6
deleted file mode 100644
index bbaf1813bc1..00000000000
--- a/plugins/poll/assets/javascripts/components/poll-results-number.js.es6
+++ /dev/null
@@ -1,25 +0,0 @@
-import round from "discourse/lib/round";
-import computed from 'ember-addons/ember-computed-decorators';
-
-export default Em.Component.extend({
- @computed("poll.options.@each.{html,votes}")
- totalScore() {
- return _.reduce(this.get("poll.options"), function(total, o) {
- const value = parseInt(o.get("html"), 10),
- votes = parseInt(o.get("votes"), 10);
- return total + value * votes;
- }, 0);
- },
-
- @computed("totalScore", "poll.voters")
- average() {
- const voters = this.get("poll.voters");
- return voters === 0 ? 0 : round(this.get("totalScore") / voters, -2);
- },
-
- @computed("average")
- averageRating() {
- return I18n.t("poll.average_rating", { average: this.get("average") });
- },
-
-});
diff --git a/plugins/poll/assets/javascripts/components/poll-results-standard-voters.js.es6 b/plugins/poll/assets/javascripts/components/poll-results-standard-voters.js.es6
deleted file mode 100644
index 50332f4aeff..00000000000
--- a/plugins/poll/assets/javascripts/components/poll-results-standard-voters.js.es6
+++ /dev/null
@@ -1,14 +0,0 @@
-import computed from 'ember-addons/ember-computed-decorators';
-import PollVoters from 'discourse/plugins/poll/components/poll-voters';
-
-export default PollVoters.extend({
- @computed("option.votes", "pollsVoters")
- canLoadMore(voters, pollsVoters) {
- return pollsVoters.length < voters;
- },
-
- @computed("option.voter_ids", "offset")
- voterIds(ids) {
- return this._getIds(ids);
- }
-});
diff --git a/plugins/poll/assets/javascripts/components/poll-results-standard.js.es6 b/plugins/poll/assets/javascripts/components/poll-results-standard.js.es6
deleted file mode 100644
index 588a9d94c57..00000000000
--- a/plugins/poll/assets/javascripts/components/poll-results-standard.js.es6
+++ /dev/null
@@ -1,40 +0,0 @@
-import evenRound from "discourse/plugins/poll/lib/even-round";
-import computed from "ember-addons/ember-computed-decorators";
-
-export default Em.Component.extend({
- tagName: "ul",
- classNames: ["results"],
-
- @computed("poll.voters", "poll.type", "poll.options.[]")
- options(voters, type) {
- const options = this.get("poll.options").slice(0).sort((a, b) => {
- return b.get("votes") - a.get("votes");
- });
-
- let percentages = voters === 0 ?
- Array(options.length).fill(0) :
- _.map(options, o => 100 * o.get("votes") / voters);
-
- // properly round percentages
- if (type === "multiple") {
- // when the poll is multiple choices, just "round down"
- percentages = percentages.map(p => Math.floor(p));
- } else {
- // when the poll is single choice, adds up to 100%
- percentages = evenRound(percentages);
- }
-
- options.forEach((option, i) => {
- const percentage = percentages[i];
- const style = new Handlebars.SafeString(`width: ${percentage}%`);
-
- option.setProperties({
- percentage,
- style,
- title: I18n.t("poll.option_title", { count: option.get("votes") })
- });
- });
-
- return options;
- }
-});
diff --git a/plugins/poll/assets/javascripts/components/poll-voters.js.es6 b/plugins/poll/assets/javascripts/components/poll-voters.js.es6
deleted file mode 100644
index 7dcca87b861..00000000000
--- a/plugins/poll/assets/javascripts/components/poll-voters.js.es6
+++ /dev/null
@@ -1,52 +0,0 @@
-import { ajax } from 'discourse/lib/ajax';
-export default Ember.Component.extend({
- layoutName: "components/poll-voters",
- tagName: 'ul',
- classNames: ["poll-voters-list"],
- isExpanded: false,
- numOfVotersToShow: 0,
- offset: 0,
- loading: false,
- pollsVoters: null,
-
- init() {
- this._super();
- this.set("pollsVoters", []);
- },
-
- _fetchUsers() {
- this.set("loading", true);
-
- ajax("/polls/voters.json", {
- type: "get",
- data: { user_ids: this.get("voterIds") }
- }).then(result => {
- if (this.isDestroyed) return;
- this.set("pollsVoters", this.get("pollsVoters").concat(result.users));
- this.incrementProperty("offset");
- this.set("loading", false);
- }).catch((error) => {
- Ember.logger.log(error);
- bootbox.alert(I18n.t('poll.error_while_fetching_voters'));
- });
- },
-
- _getIds(ids) {
- const numOfVotersToShow = this.get("numOfVotersToShow");
- const offset = this.get("offset");
- return ids.slice(numOfVotersToShow * offset, numOfVotersToShow * (offset + 1));
- },
-
- didInsertElement() {
- this._super();
-
- this.set("numOfVotersToShow", Math.round(this.$().width() / 25) * 2);
- if (this.get("voterIds").length > 0) this._fetchUsers();
- },
-
- actions: {
- loadMore() {
- this._fetchUsers();
- }
- }
-});
diff --git a/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6 b/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6
index a57195303ef..391a5d76acf 100644
--- a/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6
+++ b/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6
@@ -2,7 +2,6 @@ import { default as computed, observes } from 'ember-addons/ember-computed-decor
import InputValidation from 'discourse/models/input-validation';
export default Ember.Controller.extend({
- needs: ['modal'],
numberPollType: 'number',
multiplePollType: 'multiple',
diff --git a/plugins/poll/assets/javascripts/controllers/poll.js.es6 b/plugins/poll/assets/javascripts/controllers/poll.js.es6
deleted file mode 100644
index ba1f840e672..00000000000
--- a/plugins/poll/assets/javascripts/controllers/poll.js.es6
+++ /dev/null
@@ -1,204 +0,0 @@
-import { ajax } from 'discourse/lib/ajax';
-import { default as computed, observes } from "ember-addons/ember-computed-decorators";
-
-export default Ember.Controller.extend({
- isMultiple: Ember.computed.equal("poll.type", "multiple"),
- isNumber: Ember.computed.equal("poll.type", "number"),
- isClosed: Ember.computed.equal("poll.status", "closed"),
- isPublic: Ember.computed.equal("poll.public", "true"),
-
- // shows the results when
- // - poll is closed
- // - topic is archived
- // - user wants to see the results
- showingResults: Em.computed.or("isClosed", "post.topic.archived", "showResults"),
-
- showResultsDisabled: Em.computed.equal("poll.voters", 0),
- hideResultsDisabled: Em.computed.or("isClosed", "post.topic.archived"),
-
- @observes("post.polls")
- _updatePoll() {
- this.set("model", this.get("post.pollsObject")[this.get("model.name")]);
- },
-
- @computed("model", "vote", "model.voters", "model.options", "model.status")
- poll(poll, vote) {
- if (poll) {
- const options = _.map(poll.get("options"), o => Em.Object.create(o));
-
- if (vote) {
- options.forEach(o => o.set("selected", vote.indexOf(o.get("id")) >= 0));
- }
-
- poll.set("options", options);
- }
-
- return poll;
- },
-
- @computed("poll.options.@each.selected")
- selectedOptions() {
- return _.map(this.get("poll.options").filterBy("selected"), o => o.get("id"));
- },
-
- @computed("poll.min")
- min(min) {
- min = parseInt(min, 10);
- if (isNaN(min) || min < 1) { min = 1; }
- return min;
- },
-
- @computed("poll.max", "poll.options.length")
- max(max, options) {
- max = parseInt(max, 10);
- if (isNaN(max) || max > options) { max = options; }
- return max;
- },
-
- @computed("poll.voters")
- votersText(count) {
- return I18n.t("poll.voters", { count });
- },
-
- @computed("poll.options.@each.votes")
- totalVotes() {
- return _.reduce(this.get("poll.options"), function(total, o) {
- return total + parseInt(o.get("votes"), 10);
- }, 0);
- },
-
- @computed("totalVotes")
- totalVotesText(count) {
- return I18n.t("poll.total_votes", { count });
- },
-
- @computed("min", "max", "poll.options.length")
- multipleHelpText(min, max, options) {
- if (max > 0) {
- if (min === max) {
- if (min > 1) {
- return I18n.t("poll.multiple.help.x_options", { count: min });
- }
- } else if (min > 1) {
- if (max < options) {
- return I18n.t("poll.multiple.help.between_min_and_max_options", { min, max });
- } else {
- return I18n.t("poll.multiple.help.at_least_min_options", { count: min });
- }
- } else if (max <= options) {
- return I18n.t("poll.multiple.help.up_to_max_options", { count: max });
- }
- }
- },
-
- @computed("isClosed", "showResults", "loading", "isMultiple", "selectedOptions.length", "min", "max")
- canCastVotes(isClosed, showResults, loading, isMultiple, selectedOptionCount, min, max) {
- if (isClosed || showResults || loading) {
- return false;
- }
-
- if (isMultiple) {
- return selectedOptionCount >= min && selectedOptionCount <= max;
- } else {
- return selectedOptionCount > 0;
- }
- },
-
- castVotesDisabled: Em.computed.not("canCastVotes"),
-
- @computed("castVotesDisabled")
- castVotesButtonClass(castVotesDisabled) {
- return `cast-votes ${castVotesDisabled ? '' : 'btn-primary'}`;
- },
-
- @computed("loading", "post.user_id", "post.topic.archived")
- canToggleStatus(loading, userId, topicArchived) {
- return this.currentUser &&
- (this.currentUser.get("id") === userId || this.currentUser.get("staff")) &&
- !loading &&
- !topicArchived;
- },
-
- actions: {
-
- toggleOption(option) {
- if (this.get("isClosed")) { return; }
- if (!this.currentUser) { return this.send("showLogin"); }
-
- const wasSelected = option.get("selected");
-
- if (!this.get("isMultiple")) {
- this.get("poll.options").forEach(o => o.set("selected", false));
- }
-
- option.toggleProperty("selected");
-
- if (!this.get("isMultiple") && !wasSelected) { this.send("castVotes"); }
- },
-
- castVotes() {
- if (!this.get("canCastVotes")) { return; }
- if (!this.currentUser) { return this.send("showLogin"); }
-
- this.set("loading", true);
-
- ajax("/polls/vote", {
- type: "PUT",
- data: {
- post_id: this.get("post.id"),
- poll_name: this.get("poll.name"),
- options: this.get("selectedOptions"),
- }
- }).then(results => {
- const poll = results.poll;
- const votes = results.vote;
-
- this.setProperties({ vote: votes, showResults: true });
- this.set("model", Em.Object.create(poll));
- }).catch(() => {
- bootbox.alert(I18n.t("poll.error_while_casting_votes"));
- }).finally(() => {
- this.set("loading", false);
- });
- },
-
- toggleResults() {
- this.toggleProperty("showResults");
- },
-
- toggleStatus() {
- if (!this.get("canToggleStatus")) { return; }
-
- const self = this,
- confirm = this.get("isClosed") ? "poll.open.confirm" : "poll.close.confirm";
-
- bootbox.confirm(
- I18n.t(confirm),
- I18n.t("no_value"),
- I18n.t("yes_value"),
- function(confirmed) {
- if (confirmed) {
- self.set("loading", true);
-
- ajax("/polls/toggle_status", {
- type: "PUT",
- data: {
- post_id: self.get("post.id"),
- poll_name: self.get("poll.name"),
- status: self.get("isClosed") ? "open" : "closed",
- }
- }).then(results => {
- self.set("model", Em.Object.create(results.poll));
- }).catch(() => {
- bootbox.alert(I18n.t("poll.error_while_toggling_status"));
- }).finally(() => {
- self.set("loading", false);
- });
- }
- }
- );
-
- },
- }
-
-});
diff --git a/plugins/poll/assets/javascripts/discourse/templates/components/poll-option.hbs b/plugins/poll/assets/javascripts/discourse/templates/components/poll-option.hbs
deleted file mode 100644
index 091a898b61d..00000000000
--- a/plugins/poll/assets/javascripts/discourse/templates/components/poll-option.hbs
+++ /dev/null
@@ -1,2 +0,0 @@
-{{{optionIcon}}}
-{{{option.html}}}
diff --git a/plugins/poll/assets/javascripts/discourse/templates/components/poll-results-number.hbs b/plugins/poll/assets/javascripts/discourse/templates/components/poll-results-number.hbs
deleted file mode 100644
index ace81e9979f..00000000000
--- a/plugins/poll/assets/javascripts/discourse/templates/components/poll-results-number.hbs
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-{{#if isPublic}}
- {{poll-results-number-voters poll=poll}}
-{{/if}}
diff --git a/plugins/poll/assets/javascripts/discourse/templates/components/poll-results-standard.hbs b/plugins/poll/assets/javascripts/discourse/templates/components/poll-results-standard.hbs
deleted file mode 100644
index d5180480874..00000000000
--- a/plugins/poll/assets/javascripts/discourse/templates/components/poll-results-standard.hbs
+++ /dev/null
@@ -1,17 +0,0 @@
-{{#each options as |option|}}
-