diff --git a/Gemfile b/Gemfile
index 345d8e7d82..04de71ec54 100644
--- a/Gemfile
+++ b/Gemfile
@@ -11,7 +11,6 @@ end
if rails_master?
gem 'arel', git: 'https://github.com/rails/arel.git'
gem 'rails', git: 'https://github.com/rails/rails.git'
- gem 'seed-fu', git: 'https://github.com/SamSaffron/seed-fu.git', branch: 'discourse'
else
# until rubygems gives us optional dependencies we are stuck with this
# bundle update actionmailer actionpack actionview activemodel activerecord activesupport railties
@@ -23,15 +22,24 @@ else
gem 'activesupport', '5.2.2'
gem 'railties', '5.2.2'
gem 'sprockets-rails'
- gem 'seed-fu'
end
-gem 'mail', '2.7.1.rc1', require: false
+gem 'seed-fu'
+
+gem 'mail', require: false
gem 'mini_mime'
gem 'mini_suffix'
gem 'hiredis'
-gem 'redis', require: ["redis", "redis/connection/hiredis"]
+
+# holding off redis upgrade temporarily as it is having issues with our current
+# freedom patch, we will follow this up.
+#
+# FrozenError: can't modify frozen Hash
+# /var/www/discourse/vendor/bundle/ruby/2.5.0/gems/redis-4.1.0/lib/redis/client.rb:93:in `delete'
+# /var/www/discourse/vendor/bundle/ruby/2.5.0/gems/redis-4.1.0/lib/redis/client.rb:93:in `initialize'
+# /var/www/discourse/lib/freedom_patches/redis.rb:7:in `initialize'
+gem 'redis', '4.0.1', require: ["redis", "redis/connection/hiredis"]
gem 'redis-namespace'
gem 'active_model_serializers', '~> 0.8.3'
@@ -45,12 +53,7 @@ gem 'discourse-ember-source', '~> 3.5.1'
gem 'ember-handlebars-template', '0.8.0'
gem 'barber'
-# message bus 2.2.0 should be very stable
-# we trimmed some of the internal API surface down so we went with
-# a pre release here to make we don't do a full release prior to
-# baking here. Remove 2.2.0.pre no later than Jan 2019 and move back
-# to the standard releases
-gem 'message_bus', '2.2.0.pre.1'
+gem 'message_bus'
gem 'rails_multisite'
@@ -142,8 +145,13 @@ group :development do
gem 'bullet', require: !!ENV['BULLET']
gem 'better_errors'
gem 'binding_of_caller'
- gem 'annotate'
- gem 'foreman', require: false
+
+ # waiting on 2.7.5 per: https://github.com/ctran/annotate_models/pull/595
+ if rails_master?
+ gem 'annotate', git: 'https://github.com/ctran/annotate_models.git'
+ else
+ gem 'annotate'
+ end
end
# this is an optional gem, it provides a high performance replacement
diff --git a/Gemfile.lock b/Gemfile.lock
index b59803ab6a..8f894e2438 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -61,21 +61,21 @@ GEM
barber (0.12.0)
ember-source (>= 1.0, < 3.1)
execjs (>= 1.2, < 3)
- better_errors (2.4.0)
+ better_errors (2.5.0)
coderay (>= 1.0.0)
erubi (>= 1.0.0)
rack (>= 0.9.0)
binding_of_caller (0.8.0)
debug_inspector (>= 0.0.1)
- bootsnap (1.3.0)
+ bootsnap (1.3.2)
msgpack (~> 1.0)
builder (3.2.3)
- bullet (5.7.5)
+ bullet (5.9.0)
activesupport (>= 3.0.0)
- uniform_notifier (~> 1.11.0)
+ uniform_notifier (~> 1.11)
byebug (10.0.2)
certified (1.0.0)
- chunky_png (1.3.10)
+ chunky_png (1.3.11)
claide (1.0.2)
claide-plugins (0.9.2)
cork
@@ -87,11 +87,11 @@ GEM
connection_pool (2.2.2)
cork (0.3.0)
colored2 (~> 3.1)
- cppjieba_rb (0.3.0)
+ cppjieba_rb (0.3.3)
crack (0.4.3)
safe_yaml (~> 1.0.0)
crass (1.0.4)
- danger (5.11.1)
+ danger (5.13.0)
claide (~> 1.0)
claide-plugins (>= 0.9.2)
colored2 (~> 3.1)
@@ -126,10 +126,10 @@ GEM
jquery-rails (>= 1.0.17)
railties (>= 3.1)
ember-source (2.18.2)
- erubi (1.7.1)
+ erubi (1.8.0)
excon (0.62.0)
execjs (2.7.0)
- exifr (1.3.4)
+ exifr (1.3.5)
fabrication (2.20.1)
fakeweb (1.3.0)
faraday (0.15.4)
@@ -141,11 +141,9 @@ GEM
rake
rake-compiler
fast_xs (0.8.0)
- fastimage (2.1.3)
+ fastimage (2.1.5)
ffi (1.9.25)
flamegraph (0.9.5)
- foreman (0.85.0)
- thor (~> 0.19.1)
fspath (3.1.0)
gc_tracer (1.5.1)
git (1.5.0)
@@ -155,15 +153,15 @@ GEM
hashdiff (0.3.7)
hashie (3.6.0)
highline (1.7.10)
- hiredis (0.6.1)
+ hiredis (0.6.3)
hkdf (0.3.0)
htmlentities (4.3.4)
http_accept_language (2.0.5)
- i18n (1.1.1)
+ i18n (1.5.3)
concurrent-ruby (~> 1.0)
image_size (1.5.0)
in_threads (1.5.0)
- jaro_winkler (1.5.1)
+ jaro_winkler (1.5.2)
jmespath (1.4.0)
jquery-rails (4.3.3)
rails-dom-testing (>= 1, < 3)
@@ -185,22 +183,22 @@ GEM
logstash-event (1.2.02)
logstash-logger (0.26.1)
logstash-event (~> 1.2)
- logster (2.0.0.pre)
+ logster (2.0.1)
loofah (2.2.3)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
lru_redux (1.1.0)
- mail (2.7.1.rc1)
+ mail (2.7.1)
mini_mime (>= 0.1.1)
- maxminddb (0.1.21)
+ maxminddb (0.1.22)
memory_profiler (0.9.12)
- message_bus (2.2.0.pre.1)
+ message_bus (2.2.0)
rack (>= 1.1.3)
metaclass (0.0.4)
method_source (0.8.2)
mini_mime (1.0.1)
- mini_portile2 (2.3.0)
- mini_racer (0.2.3)
+ mini_portile2 (2.4.0)
+ mini_racer (0.2.4)
libv8 (>= 6.3)
mini_scheduler (0.9.1)
sidekiq
@@ -212,17 +210,17 @@ GEM
metaclass (~> 0.0.1)
mock_redis (0.18.0)
moneta (1.0.0)
- msgpack (1.2.4)
+ msgpack (1.2.6)
multi_json (1.13.1)
multi_xml (0.6.0)
multipart-post (2.0.0)
mustache (1.0.5)
nap (1.1.0)
no_proxy_fix (0.1.2)
- nokogiri (1.8.5)
- mini_portile2 (~> 2.3.0)
- nokogumbo (1.5.0)
- nokogiri
+ nokogiri (1.10.1)
+ mini_portile2 (~> 2.4.0)
+ nokogumbo (2.0.1)
+ nokogiri (~> 1.8, >= 1.8.4)
oauth (0.5.4)
oauth2 (1.4.1)
faraday (>= 0.8, < 0.16.0)
@@ -232,7 +230,7 @@ GEM
rack (>= 1.2, < 3)
octokit (4.13.0)
sawyer (~> 0.8.0, >= 0.5.3)
- oj (3.6.2)
+ oj (3.7.8)
omniauth (1.9.0)
hashie (>= 3.4.6, < 3.7.0)
rack (>= 1.6.2, < 3)
@@ -271,12 +269,13 @@ GEM
openid-redis-store (0.0.2)
redis
ruby-openid
- parallel (1.12.1)
- parser (2.5.3.0)
+ optimist (3.0.0)
+ parallel (1.13.0)
+ parser (2.6.0.0)
ast (~> 2.4.0)
- pg (1.1.3)
+ pg (1.1.4)
powerpack (0.1.2)
- progress (3.4.0)
+ progress (3.5.0)
pry (0.10.4)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
@@ -286,15 +285,15 @@ GEM
pry-rails (0.3.6)
pry (>= 0.10.4)
public_suffix (3.0.3)
- puma (3.11.4)
+ puma (3.12.0)
r2 (0.2.7)
rack (2.0.6)
- rack-mini-profiler (1.0.1)
+ rack-mini-profiler (1.0.2)
rack (>= 1.2.0)
rack-openid (1.3.1)
rack (>= 1.1.0)
ruby-openid (>= 2.1.8)
- rack-protection (2.0.3)
+ rack-protection (2.0.5)
rack
rack-test (1.1.0)
rack (>= 1.0, < 3)
@@ -320,10 +319,10 @@ GEM
rb-fsevent (0.10.3)
rb-inotify (0.9.10)
ffi (>= 0.5.0, < 2)
- rbtrace (0.4.10)
+ rbtrace (0.4.11)
ffi (>= 1.0.6)
msgpack (>= 0.4.3)
- trollop (>= 1.16.2)
+ optimist (>= 3.0.0)
rchardet (1.8.0)
redis (4.0.1)
redis-namespace (1.6.0)
@@ -359,7 +358,7 @@ GEM
rspec-support (~> 3.7.0)
rspec-support (3.7.1)
rtlit (0.0.5)
- rubocop (0.61.1)
+ rubocop (0.63.1)
jaro_winkler (~> 1.5.1)
parallel (~> 1.10)
parser (>= 2.5, != 2.5.1.1)
@@ -375,10 +374,10 @@ GEM
nokogiri (>= 1.6.0)
ruby_dep (1.5.0)
safe_yaml (1.0.4)
- sanitize (4.6.5)
+ sanitize (5.0.0)
crass (~> 1.0.2)
- nokogiri (>= 1.4.4)
- nokogumbo (~> 1.4)
+ nokogiri (>= 1.8.0)
+ nokogumbo (~> 2.0)
sass (3.5.6)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
@@ -400,9 +399,9 @@ GEM
shoulda-context (1.2.2)
shoulda-matchers (2.8.0)
activesupport (>= 3.0.0)
- sidekiq (5.1.3)
- concurrent-ruby (~> 1.0)
- connection_pool (~> 2.2, >= 2.2.0)
+ sidekiq (5.2.5)
+ connection_pool (~> 2.2, >= 2.2.2)
+ rack (>= 1.5.0)
rack-protection (>= 1.5.0)
redis (>= 3.3.5, < 5)
slop (3.6.0)
@@ -414,25 +413,24 @@ GEM
activesupport (>= 4.0)
sprockets (>= 3.0.0)
sshkey (1.9.0)
- stackprof (0.2.11)
+ stackprof (0.2.12)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
- thor (0.19.4)
+ thor (0.20.3)
thread_safe (0.3.6)
tilt (2.0.8)
- trollop (2.1.2)
tzinfo (1.2.5)
thread_safe (~> 0.1)
- uglifier (4.1.11)
+ uglifier (4.1.20)
execjs (>= 0.3.0, < 3)
unf (0.1.4)
unf_ext
unf_ext (0.0.7.5)
unicode-display_width (1.4.1)
- unicorn (5.4.0)
+ unicorn (5.4.1)
kgio (~> 2.6)
raindrops (~> 0.7)
- uniform_notifier (1.11.0)
+ uniform_notifier (1.12.1)
webmock (3.4.2)
addressable (>= 2.3.6)
crack (>= 0.3.2)
@@ -478,7 +476,6 @@ DEPENDENCIES
fast_xs
fastimage
flamegraph
- foreman
gc_tracer
highline (~> 1.7.0)
hiredis
@@ -490,10 +487,10 @@ DEPENDENCIES
logstash-logger
logster
lru_redux
- mail (= 2.7.1.rc1)
+ mail
maxminddb
memory_profiler
- message_bus (= 2.2.0.pre.1)
+ message_bus
mini_mime
mini_racer
mini_scheduler
@@ -530,7 +527,7 @@ DEPENDENCIES
rb-inotify (~> 0.9)
rbtrace
rchardet
- redis
+ redis (= 4.0.1)
redis-namespace
rinku
rotp
diff --git a/Procfile b/Procfile
deleted file mode 100644
index 4d752a6c18..0000000000
--- a/Procfile
+++ /dev/null
@@ -1,2 +0,0 @@
-web: bundle exec rails server -p $PORT
-worker: bundle exec sidekiq -e $RAILS_ENV
\ No newline at end of file
diff --git a/README.md b/README.md
index ea0716a668..a00c5b9643 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,8 @@
-
+
+
+
Discourse is the 100% open source discussion platform built for the next decade of the Internet. Use it as a:
@@ -11,12 +15,12 @@ To learn more about the philosophy and goals of the project, [visit **discourse.
## Screenshots
-
-
-
-
+
+
+
+
-
+
Browse [lots more notable Discourse instances](https://www.discourse.org/customers).
diff --git a/app/assets/javascripts/admin/components/admin-report-counters.js.es6 b/app/assets/javascripts/admin/components/admin-report-counters.js.es6
index 3806e29ecb..d64bbe20fc 100644
--- a/app/assets/javascripts/admin/components/admin-report-counters.js.es6
+++ b/app/assets/javascripts/admin/components/admin-report-counters.js.es6
@@ -1,3 +1,5 @@
export default Ember.Component.extend({
- classNames: ["admin-report-counters"]
+ classNames: ["admin-report-counters"],
+
+ attributeBindings: ["model.description:title"]
});
diff --git a/app/assets/javascripts/admin/models/report.js.es6 b/app/assets/javascripts/admin/models/report.js.es6
index d453dd04cc..53e9d90a20 100644
--- a/app/assets/javascripts/admin/models/report.js.es6
+++ b/app/assets/javascripts/admin/models/report.js.es6
@@ -352,7 +352,9 @@ const Report = Discourse.Model.extend({
property: properties.title,
value: postTitle,
formatedValue:
- postTitle && href ? `${escapeExpression(postTitle)}` : "—"
+ postTitle && href
+ ? `${escapeExpression(postTitle)}`
+ : "—"
};
},
diff --git a/app/assets/javascripts/admin/templates/customize-themes-index.hbs b/app/assets/javascripts/admin/templates/customize-themes-index.hbs
index 565d0024db..62d563e3cf 100644
--- a/app/assets/javascripts/admin/templates/customize-themes-index.hbs
+++ b/app/assets/javascripts/admin/templates/customize-themes-index.hbs
@@ -2,13 +2,17 @@
{{i18n 'topic.multi_select.cancel'}}
diff --git a/app/assets/javascripts/discourse/templates/tag-groups-show.hbs b/app/assets/javascripts/discourse/templates/tag-groups-show.hbs index 65e1b8e6d6..6e289180a9 100644 --- a/app/assets/javascripts/discourse/templates/tag-groups-show.hbs +++ b/app/assets/javascripts/discourse/templates/tag-groups-show.hbs @@ -44,6 +44,6 @@ - + {{model.savingStatus}} diff --git a/app/assets/javascripts/discourse/widgets/search-menu-controls.js.es6 b/app/assets/javascripts/discourse/widgets/search-menu-controls.js.es6 index f30e5a61f8..b9128fbe23 100644 --- a/app/assets/javascripts/discourse/widgets/search-menu-controls.js.es6 +++ b/app/assets/javascripts/discourse/widgets/search-menu-controls.js.es6 @@ -19,6 +19,7 @@ createWidget("search-term", { return { type: "text", value: attrs.value || "", + autocomplete: "off", placeholder: attrs.contextEnabled ? "" : I18n.t("search.title") }; }, diff --git a/app/assets/javascripts/select-kit/components/select-kit.js.es6 b/app/assets/javascripts/select-kit/components/select-kit.js.es6 index 49144540c4..ccc5f49f8d 100644 --- a/app/assets/javascripts/select-kit/components/select-kit.js.es6 +++ b/app/assets/javascripts/select-kit/components/select-kit.js.es6 @@ -144,18 +144,16 @@ export default Ember.Component.extend( didComputeAttributes() {}, willComputeContent(content) { - return content; + return applyContentPluginApiCallbacks( + this.get("pluginApiIdentifiers"), + content, + this + ); }, computeContent(content) { return content; }, _beforeDidComputeContent(content) { - content = applyContentPluginApiCallbacks( - this.get("pluginApiIdentifiers"), - content, - this - ); - let existingCreatedComputedContent = []; if (!this.get("allowContentReplacement")) { existingCreatedComputedContent = this.get("computedContent").filterBy( diff --git a/app/assets/javascripts/select-kit/components/select-kit/select-kit-row.js.es6 b/app/assets/javascripts/select-kit/components/select-kit/select-kit-row.js.es6 index 4690ef3543..58ac234318 100644 --- a/app/assets/javascripts/select-kit/components/select-kit/select-kit-row.js.es6 +++ b/app/assets/javascripts/select-kit/components/select-kit/select-kit-row.js.es6 @@ -16,7 +16,11 @@ export default Ember.Component.extend(UtilsMixin, { "ariaLabel:aria-label", "guid:data-guid" ], - classNameBindings: ["isHighlighted", "isSelected"], + classNameBindings: [ + "isHighlighted", + "isSelected", + "computedContent.originalContent.classNames" + ], forceEscape: Ember.computed.alias("options.forceEscape"), diff --git a/app/assets/javascripts/select-kit/components/single-select.js.es6 b/app/assets/javascripts/select-kit/components/single-select.js.es6 index 0c63b9f8b5..aede1d98b7 100644 --- a/app/assets/javascripts/select-kit/components/single-select.js.es6 +++ b/app/assets/javascripts/select-kit/components/single-select.js.es6 @@ -117,7 +117,7 @@ export default SelectKitComponent.extend({ @computed("computedAsyncContent.[]", "computedValue") filteredAsyncComputedContent(computedAsyncContent, computedValue) { - computedAsyncContent = computedAsyncContent.filter(c => { + computedAsyncContent = (computedAsyncContent || []).filter(c => { return computedValue !== get(c, "value"); }); @@ -268,12 +268,18 @@ export default SelectKitComponent.extend({ if (this.validateSelect(computedContentItem)) { this.willSelect(computedContentItem); this.clearFilter(); - this.setProperties({ - highlighted: null, - computedValue: computedContentItem.value - }); - run.next(() => this.mutateAttributes()); + const action = computedContentItem.originalContent.action; + if (action) { + action(); + } else { + this.setProperties({ + highlighted: null, + computedValue: computedContentItem.value + }); + + run.next(() => this.mutateAttributes()); + } run.schedule("afterRender", () => { this.didSelect(computedContentItem); diff --git a/app/assets/javascripts/select-kit/components/topic-footer-mobile-dropdown.js.es6 b/app/assets/javascripts/select-kit/components/topic-footer-mobile-dropdown.js.es6 index 28cebf0eb3..96edaa693c 100644 --- a/app/assets/javascripts/select-kit/components/topic-footer-mobile-dropdown.js.es6 +++ b/app/assets/javascripts/select-kit/components/topic-footer-mobile-dropdown.js.es6 @@ -6,101 +6,29 @@ export default ComboBoxComponent.extend({ filterable: false, autoFilterable: false, allowInitialValueMutation: false, + allowAutoSelectFirst: false, + nameProperty: "label", computeHeaderContent() { - let content = this._super(...arguments); + const content = this._super(...arguments); + content.name = I18n.t("topic.controls"); return content; }, - computeContent(content) { - const topic = this.get("topic"); - const details = topic.get("details"); + mutateAttributes() {}, - if (details.get("can_invite_to")) { - content.push({ - id: "invite", - icon: "users", - name: I18n.t("topic.invite_reply.title"), - __sk_row_type: "noopRow" - }); - } + willComputeContent(content) { + content = this._super(content); - if ( - (topic.get("bookmarked") && !topic.get("bookmarking")) || - (!topic.get("bookmarked") && topic.get("bookmarking")) - ) { - content.push({ - id: "bookmark", - icon: "bookmark", - name: I18n.t("bookmarked.clear_bookmarks"), - __sk_row_type: "noopRow" - }); - } else { - content.push({ - id: "bookmark", - icon: "bookmark", - name: I18n.t("bookmarked.title"), - __sk_row_type: "noopRow" - }); - } - - content.push({ - id: "share", - icon: "link", - name: I18n.t("topic.share.title"), - __sk_row_type: "noopRow" + // TODO: this is for backward compat reasons, should be removed + // when plugins have been updated for long enough + content.forEach(c => { + if (c.name) { + c.label = c.name; + } }); - if (details.get("can_flag_topic")) { - content.push({ - id: "flag", - icon: "flag", - name: I18n.t("topic.flag_topic.title"), - __sk_row_type: "noopRow" - }); - } - return content; - }, - - autoHighlight() {}, - - actions: { - onSelect(value) { - const topic = this.get("topic"); - - if (!topic.get("id")) { - return; - } - - const refresh = () => { - this._compute(); - this.deselect(); - }; - - switch (value) { - case "flag": - this.showFlagTopic(); - refresh(); - break; - case "bookmark": - topic.toggleBookmark().then(refresh()); - break; - case "share": - this.appEvents.trigger( - "share:url", - topic.get("shareUrl"), - $("#topic-footer-buttons") - ); - refresh(); - break; - case "invite": - this.showInvite(); - refresh(); - break; - default: - } - } } }); diff --git a/app/assets/javascripts/select-kit/mixins/plugin-api.js.es6 b/app/assets/javascripts/select-kit/mixins/plugin-api.js.es6 index daa1e362a7..fd8c9ae9f6 100644 --- a/app/assets/javascripts/select-kit/mixins/plugin-api.js.es6 +++ b/app/assets/javascripts/select-kit/mixins/plugin-api.js.es6 @@ -68,13 +68,15 @@ function onSelect(pluginApiIdentifiers, mutationFunction) { export function applyContentPluginApiCallbacks(identifiers, content, context) { identifiers.forEach(key => { (_prependContentCallbacks[key] || []).forEach(c => { - content = c().concat(content); + content = c() + .concat(content) + .uniqBy("id"); }); (_appendContentCallbacks[key] || []).forEach(c => { - content = content.concat(c()); + content = content.concat(c()).uniqBy("id"); }); (_modifyContentCallbacks[key] || []).forEach(c => { - content = c(context, content); + content = c(context, content).uniqBy("id"); }); }); diff --git a/app/assets/stylesheets/common/admin/backups.scss b/app/assets/stylesheets/common/admin/backups.scss index 20b9836986..51fc9f46e5 100644 --- a/app/assets/stylesheets/common/admin/backups.scss +++ b/app/assets/stylesheets/common/admin/backups.scss @@ -6,8 +6,14 @@ $rollback-darker: darken($rollback, 20%) !default; .btn-rollback { color: $secondary; background: $rollback; + .d-icon { + color: $secondary; + } &:hover { background: $rollback-dark; + .d-icon { + color: currentColor; + } } &:active { @include linear-gradient($rollback-darker, $rollback-dark); diff --git a/app/assets/stylesheets/common/admin/badges.scss b/app/assets/stylesheets/common/admin/badges.scss index ee8b99cd84..495eb24a77 100644 --- a/app/assets/stylesheets/common/admin/badges.scss +++ b/app/assets/stylesheets/common/admin/badges.scss @@ -66,6 +66,9 @@ } .badge-intro { margin-top: 10%; + h1 { + line-height: $line-height-medium; + } .badge-intro-emoji { // it's an emoji so we want fixed deminsions height: 55px; diff --git a/app/assets/stylesheets/common/admin/customize.scss b/app/assets/stylesheets/common/admin/customize.scss index e6654ac80e..dcbaf0212e 100644 --- a/app/assets/stylesheets/common/admin/customize.scss +++ b/app/assets/stylesheets/common/admin/customize.scss @@ -71,10 +71,6 @@ margin-bottom: 0; } } - - .create-actions { - margin-left: auto; - } } .admin-container { padding: 0; @@ -203,12 +199,16 @@ vertical-align: top; margin-top: 5px; } + .create-actions { + margin-bottom: 1em; + } .content-wrapper { display: inline-block; vertical-align: top; width: 65%; h1 { display: inline-block; + line-height: $line-height-medium; } } .external-link { diff --git a/app/assets/stylesheets/common/base/compose.scss b/app/assets/stylesheets/common/base/compose.scss index f57cac9d6e..e09bd7bd6a 100644 --- a/app/assets/stylesheets/common/base/compose.scss +++ b/app/assets/stylesheets/common/base/compose.scss @@ -68,7 +68,7 @@ display: none; } .d-icon { - opacity: 1; + color: $secondary; } } } diff --git a/app/assets/stylesheets/common/base/header.scss b/app/assets/stylesheets/common/base/header.scss index b31d29a4a3..5689ca6198 100644 --- a/app/assets/stylesheets/common/base/header.scss +++ b/app/assets/stylesheets/common/base/header.scss @@ -117,6 +117,9 @@ border-top: 1px solid transparent; border-left: 1px solid transparent; border-right: 1px solid transparent; + .d-icon { + color: $primary-medium; + } } &:active { color: $primary; diff --git a/app/assets/stylesheets/common/components/buttons.scss b/app/assets/stylesheets/common/components/buttons.scss index 6b45685f60..3fe12873c3 100644 --- a/app/assets/stylesheets/common/components/buttons.scss +++ b/app/assets/stylesheets/common/components/buttons.scss @@ -176,6 +176,9 @@ // -------------------------------------------------- .btn-social { + .d-icon { + color: #fff; + } color: #fff; background: #666; &:hover { diff --git a/app/assets/stylesheets/common/foundation/variables.scss b/app/assets/stylesheets/common/foundation/variables.scss index 1bbd8c1aa2..29e1ebbba4 100644 --- a/app/assets/stylesheets/common/foundation/variables.scss +++ b/app/assets/stylesheets/common/foundation/variables.scss @@ -10,6 +10,9 @@ $medium-width: 995px !default; $large-width: 1110px !default; $input-padding: 4px 10px; +$topic-body-width: 690px; +$topic-body-width-padding: 11px; +$topic-avatar-width: 45px; // Brand color variables // -------------------------------------------------- @@ -206,10 +209,25 @@ $primary-high: dark-light-diff($primary, $secondary, 30%, -25%); $primary-very-high: dark-light-diff($primary, $secondary, 15%, -10%); //header_primary -$header_primary-low: dark-light-diff($header_primary, $secondary, 90%, -78%); -$header_primary-low-mid: dark-light-diff($primary, $secondary, 70%, -45%); +$header_primary-low: dark-light-diff( + $header_primary, + $header_background, + 90%, + -78% +); +$header_primary-low-mid: dark-light-diff( + $header_primary, + $header_background, + 70%, + -45% +); -$header_primary-medium: dark-light-diff($header_primary, $secondary, 50%, -35%); +$header_primary-medium: dark-light-diff( + $header_primary, + $header_background, + 50%, + -35% +); $header_primary-high: dark-light-diff( $header_primary, $header_background, diff --git a/app/assets/stylesheets/desktop/discourse.scss b/app/assets/stylesheets/desktop/discourse.scss index b5c4dcb651..bdab807843 100644 --- a/app/assets/stylesheets/desktop/discourse.scss +++ b/app/assets/stylesheets/desktop/discourse.scss @@ -15,7 +15,10 @@ body.widget-dragging { .form-vertical { .control-group { - margin-bottom: 24px; + margin-bottom: 1.25em; + } + .controls:not(.controls-dropdown) + .controls { + margin-top: 0.5em; } } diff --git a/app/assets/stylesheets/desktop/topic-post.scss b/app/assets/stylesheets/desktop/topic-post.scss index a6d836b956..0a742e0755 100644 --- a/app/assets/stylesheets/desktop/topic-post.scss +++ b/app/assets/stylesheets/desktop/topic-post.scss @@ -633,9 +633,6 @@ blockquote { } // variables are used to calculate the width of .gap -$topic-body-width: 690px; -$topic-body-width-padding: 11px; -$topic-avatar-width: 45px; .topic-body { width: calc(#{$topic-body-width} + (#{$topic-body-width-padding} * 2)); float: left; diff --git a/app/assets/stylesheets/desktop/user-card.scss b/app/assets/stylesheets/desktop/user-card.scss index 62b989c49f..84990e84db 100644 --- a/app/assets/stylesheets/desktop/user-card.scss +++ b/app/assets/stylesheets/desktop/user-card.scss @@ -287,8 +287,14 @@ $user_card_background: $secondary; align-items: flex-start; padding-bottom: 10px; margin-top: 5px; - + span { + overflow: hidden; + text-overflow: ellipsis; + max-width: 185px; + } .user-badge { + display: flex; + white-space: nowrap; margin-right: 0.5em; background: $primary-very-low; border: 1px solid $primary-low; @@ -305,6 +311,7 @@ $user_card_background: $secondary; .more-user-badges { @extend .user-badge; padding: 3px 8px; + white-space: nowrap; } .suspended { diff --git a/app/assets/stylesheets/mobile/components/topic-footer-mobile-dropdown.scss b/app/assets/stylesheets/mobile/components/topic-footer-mobile-dropdown.scss new file mode 100644 index 0000000000..c5403eaff4 --- /dev/null +++ b/app/assets/stylesheets/mobile/components/topic-footer-mobile-dropdown.scss @@ -0,0 +1,9 @@ +.topic-footer-mobile-dropdown { + .select-kit-row { + &.bookmarked { + .d-icon { + color: $tertiary; + } + } + } +} diff --git a/app/controllers/admin/themes_controller.rb b/app/controllers/admin/themes_controller.rb index f927eee337..31bda272de 100644 --- a/app/controllers/admin/themes_controller.rb +++ b/app/controllers/admin/themes_controller.rb @@ -209,6 +209,8 @@ class Admin::ThemesController < Admin::AdminController end end end + rescue RemoteTheme::ImportError => e + render_json_error e.message end def destroy diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb index a178e401da..884f67ec8f 100644 --- a/app/controllers/invites_controller.rb +++ b/app/controllers/invites_controller.rb @@ -63,7 +63,8 @@ class InvitesController < ApplicationController rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotSaved => e render json: { success: false, - errors: e.record&.errors&.to_hash || {} + errors: e.record&.errors&.to_hash || {}, + message: I18n.t('invite.error_message') } end else diff --git a/app/controllers/svg_sprite_controller.rb b/app/controllers/svg_sprite_controller.rb index 2a8e05958b..266db14013 100644 --- a/app/controllers/svg_sprite_controller.rb +++ b/app/controllers/svg_sprite_controller.rb @@ -10,12 +10,13 @@ class SvgSpriteController < ApplicationController no_cookies RailsMultisite::ConnectionManagement.with_hostname(params[:hostname]) do + theme_ids = params[:theme_ids].split(",").map(&:to_i) - if SvgSprite.version != params[:version] - return redirect_to path(SvgSprite.path) + if SvgSprite.version(theme_ids) != params[:version] + return redirect_to path(SvgSprite.path(theme_ids)) end - svg_sprite = "window.__svg_sprite = #{SvgSprite.bundle.inspect};" + svg_sprite = "window.__svg_sprite = #{SvgSprite.bundle(theme_ids).inspect};" response.headers["Last-Modified"] = 10.years.ago.httpdate response.headers["Content-Length"] = svg_sprite.bytesize.to_s diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index fe87d7d506..5d7c99b13c 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -148,9 +148,11 @@ class UsersController < ApplicationController def check_emails user = fetch_user_from_params(include_inactive: true) - guardian.ensure_can_check_emails!(user) - StaffActionLogger.new(current_user).log_check_email(user, context: params[:context]) + unless user == current_user + guardian.ensure_can_check_emails!(user) + StaffActionLogger.new(current_user).log_check_email(user, context: params[:context]) + end email, *secondary_emails = user.emails diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 4963b95832..38b826b9a5 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -382,7 +382,7 @@ module ApplicationHelper def theme_ids if customization_disabled? - nil + [nil] else request.env[:resolved_theme_ids] end @@ -454,11 +454,11 @@ module ApplicationHelper asset_version: Discourse.assets_digest, disable_custom_css: loading_admin?, highlight_js_path: HighlightJs.path, - svg_sprite_path: SvgSprite.path, + svg_sprite_path: SvgSprite.path(theme_ids), } if Rails.env.development? - setup_data[:svg_icon_list] = SvgSprite.all_icons + setup_data[:svg_icon_list] = SvgSprite.all_icons(theme_ids) end if guardian.can_enable_safe_mode? && params["safe_mode"] diff --git a/app/jobs/regular/update_s3_inventory.rb b/app/jobs/regular/update_s3_inventory.rb new file mode 100644 index 0000000000..946ec47892 --- /dev/null +++ b/app/jobs/regular/update_s3_inventory.rb @@ -0,0 +1,17 @@ +require "s3_inventory" + +module Jobs + # if upload bucket changes or inventory bucket changes we want to update s3 bucket policy and inventory configuration + class UpdateS3Inventory < Jobs::Base + + def execute(args) + return unless SiteSetting.enable_s3_inventory? && SiteSetting.enable_s3_uploads? + + [:upload, :optimized].each do |type| + s3_inventory = S3Inventory.new(Discourse.store.s3_helper, type) + s3_inventory.update_bucket_policy if type == :upload + s3_inventory.update_bucket_inventory_configuration + end + end + end +end diff --git a/app/models/category.rb b/app/models/category.rb index 45aac78824..a99117812c 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -113,6 +113,9 @@ class Category < ActiveRecord::Base # we may consider wrapping this in another spot attr_accessor :displayable_topics, :permission, :subcategory_ids, :notification_level, :has_children + # Allows us to skip creating the category definition topic in tests. + attr_accessor :skip_category_definition + @topic_id_cache = DistributedCache.new('category_topic_ids') def self.topic_ids @@ -212,6 +215,8 @@ class Category < ActiveRecord::Base end def create_category_definition + return if skip_category_definition + t = Topic.new(title: I18n.t("category.topic_prefix", category: name), user: user, pinned_at: Time.now, category_id: id) t.skip_callbacks = true t.ignore_category_auto_close = true diff --git a/app/models/invite.rb b/app/models/invite.rb index 2a7f96876a..b201240536 100644 --- a/app/models/invite.rb +++ b/app/models/invite.rb @@ -16,7 +16,7 @@ class Invite < ActiveRecord::Base has_many :topic_invites has_many :topics, through: :topic_invites, source: :topic validates_presence_of :invited_by_id - validates :email, email: true + validates :email, email: true, format: { with: EmailValidator.email_regex } before_create do self.invite_key ||= SecureRandom.hex diff --git a/app/models/site_setting.rb b/app/models/site_setting.rb index 0bdf7b3000..49b9281c3d 100644 --- a/app/models/site_setting.rb +++ b/app/models/site_setting.rb @@ -152,7 +152,7 @@ class SiteSetting < ActiveRecord::Base bucket = SiteSetting.enable_s3_uploads ? Discourse.store.s3_bucket_name : GlobalSetting.s3_bucket_name # cf. http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region - if SiteSetting.s3_endpoint == "https://s3.amazonaws.com" + if SiteSetting.s3_endpoint.blank? || SiteSetting.s3_endpoint.end_with?("amazonaws.com") if SiteSetting.Upload.s3_region.start_with?("cn-") "//#{bucket}.s3.#{SiteSetting.Upload.s3_region}.amazonaws.com.cn" else diff --git a/app/models/theme.rb b/app/models/theme.rb index 3b0be21fef..6a7854ede1 100644 --- a/app/models/theme.rb +++ b/app/models/theme.rb @@ -121,6 +121,7 @@ class Theme < ActiveRecord::Base end def self.transform_ids(ids, extend: true) + return [] if ids.nil? get_set_cache "#{extend ? "extended_" : ""}transformed_ids_#{ids.join("_")}" do next [] if ids.blank? diff --git a/app/models/theme_field.rb b/app/models/theme_field.rb index 34c24f1f49..740eaf4dd6 100644 --- a/app/models/theme_field.rb +++ b/app/models/theme_field.rb @@ -7,6 +7,10 @@ class ThemeField < ActiveRecord::Base belongs_to :upload has_one :javascript_cache, dependent: :destroy + after_commit do |field| + SvgSprite.expire_cache if field.target_id == Theme.targets[:settings] + end + scope :find_by_theme_ids, ->(theme_ids) { return none unless theme_ids.present? diff --git a/app/serializers/theme_settings_serializer.rb b/app/serializers/theme_settings_serializer.rb index d7fe44c140..1bd892f755 100644 --- a/app/serializers/theme_settings_serializer.rb +++ b/app/serializers/theme_settings_serializer.rb @@ -1,6 +1,6 @@ class ThemeSettingsSerializer < ApplicationSerializer attributes :setting, :type, :default, :value, :description, :valid_values, - :list_type + :list_type, :textarea def setting object.name @@ -41,4 +41,13 @@ class ThemeSettingsSerializer < ApplicationSerializer def include_list_type? object.type == ThemeSetting.types[:list] end + + def textarea + object.textarea + end + + def include_textarea? + object.type == ThemeSetting.types[:string] + end + end diff --git a/config/application.rb b/config/application.rb index 65233ef4d8..a3ecce58ac 100644 --- a/config/application.rb +++ b/config/application.rb @@ -14,7 +14,11 @@ rescue end require File.expand_path('../boot', __FILE__) -require 'rails/all' +require 'active_record/railtie' +require 'action_controller/railtie' +require 'action_view/railtie' +require 'action_mailer/railtie' +require 'sprockets/railtie' # Plugin related stuff require_relative '../lib/discourse_event' diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml index 51ef58d9a4..4633a74138 100644 --- a/config/locales/client.de.yml +++ b/config/locales/client.de.yml @@ -3066,7 +3066,7 @@ de: theme_name: "Theme-Name" component_name: "Komponenten-Name" themes_intro: "Wähle ein bestehendes Theme oder erstelle ein neues, um loszulegen" - beginners_guide_title: "Leitfaden für Einstieger zur Verwendung von Discourse-Themes" + beginners_guide_title: "Leitfaden für Einsteiger zur Verwendung von Discourse-Themes" developers_guide_title: "Leitfaden für Entwickler zur Verwendung von Discourse-Themes" browse_themes: "Community-Themes durchsuchen" import_theme: "Design importieren" @@ -3224,7 +3224,7 @@ de: title: "E-Mails" settings: "Einstellungen" templates: "Vorlagen" - preview_digest: "Vorschau auf Neuigkeiten anzeigen" + preview_digest: "Vorschau auf Neuigkeiten" advanced_test: title: "Erweiterter Test" desc: "Erfahre, wie Discourse erhaltene E-Mails verarbeitet. Um eine E-Mail korrekt zu verarbeiten, kopiere unten bitte die ganze ursprüngliche E-Mail-Nachricht hinein:" diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 42f0aa68af..23bf69cde7 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -3347,7 +3347,7 @@ en: preview: "Preview" is_default: "Theme is enabled by default" user_selectable: "Theme can be selected by users" - color_scheme: "Color Scheme" + color_scheme: "Color Palette" color_scheme_select: "Select colors to be used by theme" custom_sections: "Custom sections:" theme_components: "Theme Components" @@ -3438,19 +3438,19 @@ en: title: "Define theme settings in YAML format" colors: select_base: - title: "Select base color scheme" - description: "Base scheme:" + title: "Select base color palette" + description: "Base palette:" title: "Colors" - edit: "Edit Color Schemes" - long_title: "Color Schemes" - about: "Modify the colors used by your themes. Create a new color scheme to start." - new_name: "New Color Scheme" + edit: "Edit Color Palettes" + long_title: "Color Palettes" + about: "Modify the colors used by your themes. Create a new color palette to start." + new_name: "New Color Palette" copy_name_prefix: "Copy of" - delete_confirm: "Delete this color scheme?" + delete_confirm: "Delete this color palette?" undo: "undo" undo_title: "Undo your changes to this color since the last time it was saved." revert: "revert" - revert_title: "Reset this color to Discourse's default color scheme." + revert_title: "Reset this color to Discourse's default color palette." primary: name: "primary" description: "Most text, icons, and borders." diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml index c7d88e90c8..eca82e19fc 100644 --- a/config/locales/client.es.yml +++ b/config/locales/client.es.yml @@ -915,7 +915,7 @@ es: text: "Invitación masiva desde archivo" success: "Archivo subido correctamente, se te notificará con un mensaje cuando se complete el proceso." error: "Lo siento, el archivo debe tener formato CSV. " - confirmation_message: "Estás a punto de enviar invitaciones por correo a todo el mundo en el archivo subido." + confirmation_message: "Estás a punto de enviar invitaciones por correo a todos en el archivo subido." password: title: "Contraseña" too_short: "Tu contraseña es demasiada corta." @@ -2514,11 +2514,11 @@ es: google_search: |-
+ tagging: all_tags: "Etiquetas" @@ -3072,7 +3072,7 @@ es: themes_intro: "Selecciona un tema existente o crear nuevo para empezar" beginners_guide_title: "Guía para novatos usando temas de Discourse" developers_guide_title: "Guía para desarrolladores para temas de Discourse" - browse_themes: "Ver temas de la comunidad" + browse_themes: "Ver temas (themes) de la comunidad" import_theme: "Importar tema" customize_desc: "Personalizar:" title: "Tema" @@ -3136,7 +3136,7 @@ es: authors: "Autoría:" source_url: "Fuente" required_version: - error: "Este tema ha sido desactivado automáticamente por no ser compatible con esta versión de Discourse." + error: "Este tema ha sido desactivado automáticamente por no ser compatible con la versión actual de Discourse." minimum: "Necesita Discourse versión {{version}} o superior." maximum: "Necesita Discourse versión {{version}} o inferior." component_of: "Componente de:" diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml index 02dfd56143..50833199a8 100644 --- a/config/locales/client.fi.yml +++ b/config/locales/client.fi.yml @@ -3125,7 +3125,7 @@ fi: delete_upload_confirm: "Poista ladattu tiedosto? (Teeman CSS voi lakata toimimasta!)" import_web_tip: "Tietovarasto, jossa teema on" import_file_tip: ".tar.gz or .dcstyle.json -tiedosto, jossa teema on" - is_private: "Teema in yksityisessä git-tietovarastossa" + is_private: "Teema on yksityisessä git-tietovarastossa" remote_branch: "Haaran nimi (valinnainen)" public_key: "Anna repositorioon pääsy seuraavalle julkiselle avaimelle:" about_theme: "Tietoa" diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml index 65af88be57..421046aa59 100644 --- a/config/locales/client.fr.yml +++ b/config/locales/client.fr.yml @@ -259,7 +259,7 @@ fr: new_private_message: "Nouveau brouillon de message direct" topic_reply: "Créer un brouillon de réponse" abandon: - confirm: "Vous avez déjà ouvert un autre brouillon dans ce sujet. Etes-vous sûr de vouloir l'abandonner ?" + confirm: "Vous avez déjà ouvert un autre brouillon dans ce sujet. Êtes-vous sûr de vouloir l'abandonner ?" yes_value: "Oui, abandonner" no_value: "Non, garder" topic_count_latest: @@ -3630,7 +3630,7 @@ fr: cant_delete_all_too_many_posts: 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: "Il est généralement préférable d'anonymiser les utilisateurs plutôt que de les supprimer, afin d'éviter d'enlever du contenu de discussions existantes.Ne veste kateri e-naslov ste uporabili? Vpišite e-naslov in povedali vam bomo če obstaja pri nas.
Če nimate več dostopa do e-naslova vašega računa kontaktirajte našo ekipo.
" + button_ok: "V redu" + button_help: "Pomoč" email_login: link_label: "Pošlji mi povezavo za prijavo na e-pošto" button_label: "preko e-pošte" @@ -1141,16 +1205,25 @@ sl: second_factor_backup_description: "Vnesite eno od rezervnih potrditvenih kod:" second_factor: "Prijava preko Authenticator " email_placeholder: "e-naslov ali uporabniško ime" + caps_lock_warning: "Caps Lock je vključen" + error: "Neznana napaka" + cookies_error: "Vaš brskalnik ima onemogočene piškotke. Prijava verjetno ne bo uspela, če jih ne boste omogočili." rate_limit: "Prosimo počakajte preden se poskusite ponovno prijaviti." blank_username: "Vnesite uporabniško ime ali e-naslov." blank_username_or_password: "Vpišite e-naslov ali uporabniško ime in geslo." reset_password: "Zamenjaj geslo" logging_in: "Prijava v teku..." + or: "ali" authenticating: "Preverjanje..." awaiting_activation: "Vaš uporabniški račun čaka aktivacijo - uporabite povezavo za pozabljeno geslo, če želite prejeti še en e-sporočilo za aktivacijo." awaiting_approval: "Vaš uporabniški račun še ni bil potrjen s strani člana osebja foruma. Prejeli boste e-sporočilo, ko bo potrjen." requires_invite: "Oprostite, dostop do foruma je mogoč samo preko povabila." + not_activated: "Ne morete se še prijaviti. Pred časom smo poslali aktivacijsko e-sporočilo na {{sentTo}}. Sledite navodilom v e-sporočilu da akitivirate vaš uporabniški račun." + not_allowed_from_ip_address: "Ne morete se prijaviti s tega IP naslova." + admin_not_allowed_from_ip_address: "Ne morete se prijaviti kot administrator iz tega IP naslova." + resend_activation_email: "Kliknite tukaj za ponovno pošiljanje aktivacijskega e-sporočila." omniauth_disallow_totp: "Vaš račun ima vklopljeno preverjanje v dveh korakih. Prijavite se z vašim geslom." + resend_title: "Ponovno pošlji aktivacijsko e-sporočilo" change_email: "Spremeni e-naslov" provide_new_email: "Vpišite nov e-naslov in ponovno vam bomo poslali potrditveno e-sporočilo." submit_new_email: "Usveži e-naslov" @@ -1158,41 +1231,72 @@ sl: sent_activation_email_again_generic: "Poslali smo vam novo aktivacijsko sporočilo. Lahko traja nekaj minut, da ga boste prejeli - drugače preverite mapo z neželeno pošto." to_continue: "Prijavite se" preferences: "Za spremembo nastavitev morate biti prijavljeni." - not_approved: "Vaš uporabniški račun še ni bil potrjen. Ko bo pripravljen za prijavo boste obveščenipreko e-sporočila." + forgot: "Ne spominjam se podatkov o svojem računu" + not_approved: "Vaš uporabniški račun še ni bil potrjen. Ko bo pripravljen za prijavo boste obveščeni preko e-sporočila." google_oauth2: + name: "Google" title: "Google" message: "Preverjanje z Googlom (pojavna okna morajo biti omogočena v brskalniku)" twitter: + name: "Twitter" title: "Twitter" message: "Preverjanje s Twittrom (pojavna okna morajo biti omogočena v brskalniku)" instagram: + name: "Instagram" + title: "z Instagramom" message: "Preverjanje z Instagramom (pojavna okna morajo biti omogočena v brskalniku)" facebook: + name: "Facebook" title: "Facebook" message: "Preverjanje s Facebookom (pojavna okna morajo biti omogočena v brskalniku)" yahoo: + name: "Yahoo" + title: "z Yahoojem" message: "Preverjanje z Yahoojem (pojavna okna morajo biti omogočena v brskalniku)" github: + name: "GitHub" + title: "z GitHubom" message: "Preverjanje z GitHubom (pojavna okna morajo biti omogočena v brskalniku)" invites: + accept_title: "Povabilo" welcome_to: "Dobrodošli na %{site_name}!" invited_by: "Povabljeni ste od: " social_login_available: "Omogočena vam bo tudi prijava preko družabnih omrežij s tem e-naslovom." your_email: "E-naslov vašega računa je %{email}." accept_invite: "Sprejmi povabilo" + success: "Vaš račun je ustvarjen in vi ste prijavljeni." name_label: "Ime" password_label: "Nastavi geslo" optional_description: "(neobvezno)" + password_reset: + continue: "Nadaljujte na %{site_name}" + emoji_set: + apple_international: "Apple/International" + google: "Google" + twitter: "Twitter" + emoji_one: "Emoji One" + win10: "Win10" + google_classic: "Google Classic" + facebook_messenger: "Facebook Messenger" category_page_style: + categories_only: "Samo kategorije" categories_with_featured_topics: "Kategorije z izpostavljenimi temami" categories_and_latest_topics: "Kategorije in najnovejše teme" categories_and_top_topics: "Kategorije in najboljše teme" + categories_boxes: "Škatle s podkategorijami" categories_boxes_with_topics: "Škatle z izpostavljenimi temami" + shortcut_modifier_key: + shift: "Shift" + ctrl: "Ctrl" + alt: "Alt" conditional_loading_section: loading: Nalagam... select_kit: + default_header_text: Izberi... no_content: Ni zadetkov filter_placeholder: Išči... + filter_placeholder_with_any: Išči ali ustvari novo... + create: "Ustvari: '{{content}}'" max_content_reached: one: "Izberete lahko samo {{count}} stvar." two: "Izberete lahko samo {{count}} stvari." @@ -1221,19 +1325,30 @@ sl: medium_dark_tone: Srednje temna barva kože dark_tone: Temna barva kože shared_drafts: + title: "Skupni osnutki" notice: "Ta tema je vidna samo tistim, ki lahko vidijo kategorijo {{category}}." + destination_category: "Ciljna kategorija" + publish: "Objavi skupni osnutek" + confirm_publish: "Ali ste prepričani da hočete objaviti ta osnutek?" + publishing: "Objavljamo temo..." composer: + emoji: "Emoji :)" more_emoji: "več..." options: "Možnosti" + whisper: "šepet" unlist: "izločeno" blockquote_text: "Citirano" add_warning: "To je uradno opozorilo." + toggle_whisper: "Preklopi šepet" toggle_unlisted: "Preklopi izločeno" posting_not_on_topic: "Na katero temo bi radi odgovorili?" saving_draft_tip: "shranjevanje..." saved_draft_tip: "shranjeno" saved_local_draft_tip: "shranjeno lokalno" similar_topics: "Vaša tema je podobna kot..." + drafts_offline: "osnutki brez povezave" + edit_conflict: "uredi spor" + group_mentioned_limit: "Opozorilo! Omenili ste {{group}} ampak ta skupina ima več članov kot je omejitev administratorja na {{max}} uporabnika. Nihče ne bo obveščen. " group_mentioned: one: "Z omembo {{group}} boste obvestili {{count}} osebo – ali ste prepričani?" two: "Z omembo {{group}}boste obvestili {{count}} osebi – ali ste prepričani?" @@ -1253,11 +1368,14 @@ sl: category_missing: "Izbrati morate kategorijo" tags_missing: "Izbrati morate vsaj {{count}} oznak" save_edit: "Shrani spremembe" + overwrite_edit: "Prepiši spremembo" + reply_original: "Odgovori v izvirni temi" reply_here: "Odgovori tu" reply: "Odgovori" cancel: "Prekliči" - create_topic: "Ustvari temo" + create_topic: "Objavi temo" create_pm: "Pošlji" + create_whisper: "Šepet" create_shared_draft: "Ustvari skupni osnutek" edit_shared_draft: "Uredi skupni osnutek" title: "Ali pritisnite Ctrl+Enter" @@ -1269,31 +1387,50 @@ sl: topic_featured_link_placeholder: "Vnesite povezavo prikazano z naslovom." remove_featured_link: "Odstrani povezavo iz teme." reply_placeholder: "Tu lahko pišeš. Možna je uporaba Markdown, BBcode ali HTML za oblikovanje. Sem lahko povlečeš ali prilepiš sliko." + reply_placeholder_no_images: "Tipkajte tukaj. Uporabite Markdown, BBCode ali HTML za oblikovanje." reply_placeholder_choose_category: "Najprej morate izbrati kategorijo, preden lahko napišete vsebino prispevka." view_new_post: "Oglej si tvoj nov prispevek " + saving: "Shranjujem" saved: "Shranjeno!" saved_draft: "Osnutek prispevka v pripravi. Izberi za nadaljevanje." uploading: "Nalagam..." show_preview: "prikaži predogled »" hide_preview: "« skrij predogled" quote_post_title: "Citiraj cel prispevek" + bold_label: "B" bold_title: "Krepko" bold_text: "krepko" + italic_label: "I" italic_title: "Ležeče" italic_text: "povdarjeno besedilo" link_title: "Povezava" + link_description: "vnesite opis povezave tukaj" link_dialog_title: "Vstavi povezavo" link_optional_text: "neobvezen naslov" + link_url_placeholder: "https://example.com" quote_title: "Citiraj" quote_text: "Citirano" code_title: "Preformatirano besedilo" code_text: "zamakni preformatirano besedilo s 4 presledki" paste_code_text: "vpiši ali prilepi kodo" upload_title: "Naloži" + upload_description: "vnesite opis prenosa tukaj" olist_title: "Oštevilčen seznam" ulist_title: "Seznam" list_item: "Element seznama" + toggle_direction: "Preklopi smer" + help: "pomoč pri Markdown urejanju" + collapse: "minimiziraj urejevalnik" + open: "odpri urejevalnik" + abandon: "zapri urejevalnik in zavrži osnutek" + enter_fullscreen: "vklopi celozaslonski urejevalnik" + exit_fullscreen: "izklopi celozaslonski urejevalnik" + modal_ok: "V redu" modal_cancel: "Prekliči" + cant_send_pm: "Ne moremo poslati sporočila %{username}." + yourself_confirm: + title: "Ali ste pozabili dodati prejemnike?" + body: "Trenutno bo to sporočilo poslano samo vam!" admin_options_title: "Neobvezne nastavitve osebja za to temo" composer_actions: reply: Odgovori @@ -1312,11 +1449,13 @@ sl: label: Odgovori v temi desc: "Odgovori v temi, ne na posamezen prispevek" toggle_whisper: + label: Preklopi šepet desc: Šepeti so vidni samo članom osebja create_topic: label: "Nova tema" shared_draft: label: "Skupen osnutek" + desc: "Ustvari osnutek teme, ki bo vien samo osebju" toggle_topic_bump: label: "Preklopi izpostavljanje teme" desc: "Odgovori brez da spremeniš čas zadnjega odgovora" @@ -1355,6 +1494,7 @@ sl: two: "je všečkal {{count}} vaša prispevka" few: "je všečkal {{count}} vaše prispevke" other: "je všečkal {{count}} vaših prispevkov" + liked_consolidated: "{{username}} {{description}}" private_message: "{{username}} {{description}}" invited_to_private_message: "{{username}} {{description}}" invited_to_topic: "{{username}} {{description}}" @@ -1392,6 +1532,7 @@ sl: hint_for_supported_browsers: "slike lahko naložite tudi tako, da jih povlečete in spustite v urejevalnik" uploading: "Nalagam" select_file: "Izberite datoteko" + image_link: "povezava na katero bo kazala slika" default_image_alt_text: slika search: sort_by: "Uredi po" @@ -1471,6 +1612,8 @@ sl: before: pred after: po hamburger_menu: "pojdi na drug seznam tem ali kategorijo" + new_item: "nov" + go_back: "pojdi nazaj" not_logged_in_user: "stran uporabnika s povzetkom trenutnih aktivnosti in nastavitev" current_user: "pojdi na svojo uporabniško stran" topics: @@ -1482,12 +1625,12 @@ sl: relist_topics: "Postavi temo nazaj na seznam" reset_read: "Ponastavi prebrano" delete: "Izbriši teme" - dismiss: "Zavrni" - dismiss_read: "Zavrni vse neprebrane" - dismiss_button: "Zavrni" + dismiss: "Opusti" + dismiss_read: "Opusti vse neprebrane" + dismiss_button: "Opusti" dismiss_tooltip: "Opusti samo nove teme ali prenehaj slediti temam" also_dismiss_topics: "Prenehaj slediti tem temam tako da se ne prikažejo več kot neprebrane" - dismiss_new: "Zavrni nove" + dismiss_new: "Opusti nove" toggle: "preklopi množično izbiro tem" actions: "Množična dejanja" change_category: "Določi kategorijo" @@ -1518,7 +1661,7 @@ sl: search: "Ni rezultatov iskanja." educate: new: '
Tu se prikažejo vaše nove teme.
Privzeto se teme prikažejo kot nove in bodo imele oznako novo če so bile ustvarjene v zadnjih 2 dneh.
Obiščite nastavitve če želite spremembo.
' - unread: 'Tu se prikažejo vaše neprebrane teme.
Privzeto se teme prikažejo kot neprebrane s prikazom števila 1 če ste:
Izrecno nastavili temo kot "Opazovano" ali "Sledeno" preko nastavitev obveščenja na dnu teme.
Pojdite na nastavitve če želite spremembo.
' + unread: 'Tu se prikažejo vaše neprebrane teme.
Privzeto se teme prikažejo kot neprebrane s prikazom števila 1 če ste:
Izrecno nastavili temo kot "Opazujem" ali "Sledim" preko nastavitev obveščenja na dnu teme.
Pojdite na nastavitve če želite spremembo.
' bottom: latest: "Ni več najnovejših tem." hot: "Ni več vročih tem." @@ -1599,7 +1742,7 @@ sl: toggle_information: "preklopi podrobnosti teme" read_more_in_category: "Brskaj po ostalih temah v {{catLink}} ali {{latestLink}}." read_more: "Brskaj po ostalih temah {{catLink}} ali {{latestLink}}." - read_more_MF: "{ UNREAD, plural, =0 {} one { Je še 1 neprebrana } two { Sta še 2 neprebrani } other { Je še# neprebranih } } { NEW, plural, =0 {} one { {BOTH, select, true{in} false {je } other{}} 1 nova tema ostala} two { {BOTH, select, true{in } false {sta } other{}} 2 novi temi ostali} } other { {BOTH, select, true{in } false {so } other{}} # nove teme ostale} }, ali {CATEGORY, select, true {brskaj druge teme v {catLink}} false {{latestLink}} other {}}" + read_more_MF: "{ UNREAD, plural, =0 {} one { Je še 1 neprebrana } two { Sta še 2 neprebrani } other { Je še# neprebranih } } { NEW, plural, =0 {} one { {BOTH, select, true{in} false {je } other{}} 1 nova tema ostala} two { {BOTH, select, true{in } false {sta } other{}} 2 novi temi ostali} other { {BOTH, select, true{in } false {so } other{}} # nove teme ostale} }, ali {CATEGORY, select, true {brskaj druge teme v {catLink}} false {{latestLink}} other {}}" browse_all_categories: Brskajte po vseh kategorijah view_latest_topics: poglej najnovejše teme suggest_create_topic: "Ustvari novo temo?" @@ -1666,6 +1809,7 @@ sl: timeline: back: "Nazaj" back_description: "Pojdi nazaj na zadnji neprebrani prispevek" + replies_short: "%{current} / %{total}" progress: title: napredek teme go_top: "na vrh" @@ -1710,7 +1854,7 @@ sl: description: "Število novih odgovorov bo prikazano za to sporočilo. Obveščeni boste, če nekdo omeni vaše @ime ali vam odgovori." tracking: title: "Sledim" - description: "Število novih odgovorov bo prikazano za to sporočilo. Obveščeni boste, če nekdo omeni vaše @ime ali vam odgovori." + description: "Število novih odgovorov bo prikazano za to temo. Obveščeni boste, če nekdo omeni vaše @ime ali vam odgovori." regular: title: "Običajno" description: "Obveščeni boste, če nekdo omeni vaše @ime ali vam odgovori." @@ -1789,7 +1933,7 @@ sl: other: "Trenutno globalno pripetih tem: {{count}}" make_banner: "Naredi to temo v oglasni trak, ki se bo prikazoval na vrhu vseh strani." remove_banner: "Odstrani oglasni trak, ki se pojavlja na vrhu vseh strani." - banner_note: "Uporabniki lahko odstranijo oglasni trak tako da ga zaprejo. Naenkrat je lahko samo ena tema v oglasnem traku." + banner_note: "Uporabniki lahko opustijo oglasni trak tako da ga zaprejo. Naenkrat je lahko samo ena tema v oglasnem traku." no_banner_exists: "Ni nobene teme v oglasnem traku." banner_exists: "Tema na oglasnem traku že obstaja." inviting: "Vabimo..." @@ -1815,6 +1959,7 @@ sl: to_topic_email: "Vnesli ste e-naslov. Poslali bomo vabilo preko e-sporočila, ki bo vašemu prijatelju omogočila, da bo neposredno odgovoril v temo." to_topic_username: "Vnesli ste uporabniško ime. Poslali mu bomo obvestilo s povezavo na to temo." to_username: "Vnesite uporabniško ime osebe, ki bi jo povabili v to temo. Poslali mu bomo obvestilo s povezavo na to temo." + email_placeholder: "name@example.com" success_email: "Poslali smo povabilo na {{emailOrUsername}}. Obvestili vas bomo, ko se bo uporabnik prvič prijavil. Na vaši uporabniški strani lahko v zavihku Povabila spremljate stanje vaših povabil." success_username: "Povabili smo uporabnika, da sodeluje v tej temi." error: "Nismo mogli povabiti to osebo. Mogoče je ta oseba že povabljena? (povabila so omejena)" @@ -1988,7 +2133,7 @@ sl: save: "Shrani možnosti" few_likes_left: "Hvala ker delite všečke! Danes jih imate samo še nekaj na voljo." controls: - reply: "sestavi odgovor na to prispevek" + reply: "sestavi odgovor na ta prispevek" like: "všečkaj ta prispevek" has_liked: "všečkali ste prispevek" undo_like: "razveljavi všeček" @@ -2040,6 +2185,8 @@ sl: off_topic: "Razveljavi prijavo" spam: "Razveljavi prijavo" inappropriate: "Razveljavi prijavo" + bookmark: "Razveljavi zaznamek" + like: "Razveljavi všeček" people: off_topic: "prijavljeno kot ne ustreza temi" spam: "prijavljeno kot neželeno" @@ -2156,6 +2303,7 @@ sl: revert: "Povrni to verzijo" edit_wiki: "Uredi wiki" edit_post: "Uredi prispevek" + comparing_previous_to_current_out_of_total: "{{previous}} {{icon}} {{current}} / {{total}}" displays: inline: title: "Prikaži končno obliko z dodajanji in izbrisi" @@ -2178,21 +2326,28 @@ sl: title: "Prikaži HTML obliko e-sporočila" button: "HTML" category: + can: "lahko… " none: "(brez kategorije)" all: "Vse kategorije" choose: "kategorija…" edit: "uredi" edit_long: "Uredi" view: "Poglej teme v kategoriji" + general: "Splošno" + settings: "Nastavitve" topic_template: "Predloga teme" + tags: "Oznake" tags_allowed_tags: "V tej kategoriji dovoli samo te oznake:" tags_allowed_tag_groups: "V tej kategoriji bodo dovoljene samo oznake teh skupin:" + tags_placeholder: "(neobvezno) seznam dovoljenih oznak" + tag_groups_placeholder: "(neobvezno) seznam dovoljenih oznak skupin" topic_featured_link_allowed: "Dovoli najboljše povezave v tej kategoriji" delete: "Izbriši kategorijo" create: "Nova kategorija" create_long: "Ustvari novo kategorijo" save: "Shrani kategorijo" slug: "URL kategorije" + slug_placeholder: "(neobvezno) besede-s-črtico za URL" creation_error: Prišlo je do napake pri kreiranju kategorije. save_error: Prišlo je do napake pri shranjevanju kategorije. name: "Ime kategorije" @@ -2203,14 +2358,21 @@ sl: badge_colors: "Barve značk" background_color: "Barva ozadja" foreground_color: "Barva ospredja" + name_placeholder: "Največ ena ali dve besede" + color_placeholder: "Katerakoli spletna barva" delete_confirm: "Ste prepričani da želite izbrisati kategorijo?" delete_error: "Prišlo je do napake pri brisanju kategorije." + list: "Seznam kategorij" no_description: "Prosimo dodajte opis kategorije." change_in_category_topic: "Uredi opis" already_used: "Ta barva je že uporabljena na drugi kategoriji." security: "Varnost" special_warning: "Ta kategorija je prednastavljena, zato varnostnih nastavitev ni mogoče urejati. Če ne želite uporabljati te kategorije jo raje izbrišite kot uporabljajte v drug namen." images: "Slike" + email_in: "Dohodni e-naslov po meri:" + email_in_allow_strangers: "Dovoli e-sporočila od anonimnih uporabnikov brez računa" + email_in_disabled: "Objavljanje novih tem preko e-sporočila je onemogočeno v Nastavitvah strani. Za omogočanje objave novih tem preko e-sporočila, " + email_in_disabled_click: 'vključite "email in" nastavitev.' mailinglist_mirror: "Kategorija zrcali poštni seznam" suppress_from_latest: "Ne prikaži to kategorijo med najnovejšimi temami." show_subcategory_list: "Prikaži seznam podkategorij nad temami za to kategorijo." @@ -2218,31 +2380,39 @@ sl: subcategory_num_featured_topics: "Število osrednjih tem na strani nadrejene kategorije:" all_topics_wiki: "Naredi nove teme kot wiki" subcategory_list_style: "Stil seznama podkategorij:" + sort_order: "Seznam tem urejen po:" + default_view: "Privzet seznam tem:" + default_top_period: "Privzeto obdobje za najboljše:" allow_badges_label: "Omogoči nagrajevanje z značkami v tej kategoriji" + edit_permissions: "Uredi dovoljenja" + add_permission: "Dodaj dovoljenja" require_topic_approval: "Zahtevaj moderatorjevo potrditev vseh novih tem" require_reply_approval: "Zahteva odobritev moderatorja za vse nove odgovore" this_year: "to leto" + position: "Pozicija:" + default_position: "Privzeta pozicija" position_disabled: "Kategorije bodo razvrščene glede na aktivnost. Za kontrolo razvrščanja kategorij na seznamih, " position_disabled_click: 'omogoči nastavitev "fiksnih položajev kategorij"' + minimum_required_tags: "Najmanjše število oznak zahtevanih na temi:" parent: "Nadrejena kategorija" num_auto_bump_daily: "Število odprtih tem, ki se samodejno izpostavijo vsak dan:" navigate_to_first_post_after_read: "Premakni se na prvi prispevek ko so vse teme prebrane" notifications: watching: title: "Opazujem" - description: "Samodejno boste opazovali vse teme v teh kategorijah. Obveščeni boste za vsak nov prispevek v vsaki temi. Ob temi bo prikazano število novih odgovorov." + description: "Samodejno boste opazovali vse teme v tej kategoriji. Obveščeni boste za vsak nov prispevek v vsaki temi. Ob temi bo prikazano število novih odgovorov." watching_first_post: title: "Opazujem prvi prispevek" description: "Obveščeni boste o novih temah v tej kategoriji, ne pa tudi o odgovorih v temi." tracking: title: "Sledim" - description: "Samodejno boste sledili vsem temam v teh kategorijah. Obveščeni boste, če nekdo omeni vaše @ime ali vam odgovori. Ob temi bo prikazano število novih odgovorov." + description: "Samodejno boste sledili vsem temam v tej kategoriji. Obveščeni boste, če nekdo omeni vaše @ime ali vam odgovori. Ob temi bo prikazano število novih odgovorov." regular: title: "Običajno" description: "Obveščeni boste, če nekdo omeni vaše @ime ali vam odgovori." muted: title: "Utišano" - description: "O novih temah v teh kategorijah ne boste obveščeni in ne bodo se pojavile med najnovejšimi." + description: "O novih temah v tej kategoriji ne boste obveščeni in ne bodo se pojavile med najnovejšimi." sort_options: default: "privzeto" likes: "Všečki" @@ -2258,6 +2428,7 @@ sl: subcategory_list_styles: rows: "Vrstice" rows_with_featured_topics: "Vrstice z izpostavljenimi temami" + boxes: "Škatle" boxes_with_featured_topics: "Škatle z izpostavljenimi temami" flagging: title: "Hvala, da pomagate ohraniti prijazno skupnost!" @@ -2340,6 +2511,7 @@ sl: unlisted: help: "Ta tema je izločena; ne bo se prikazovala na seznamih tem in se jo lahko dostopa samo preko neposredne povezave." posts: "Prispevki" + posts_long: "{{number}} prispevkov v tej temi" posts_likes_MF: | Ta tema ima {count, plural, one {1 odgovor} two {2 odgovora} other {# odgovorov}} {ratio, select, low {z visokim razmerjem med všečki in prispevki} @@ -2366,6 +2538,7 @@ sl: two: "všečka" few: "všečki" other: "všečkov" + likes_long: "{{number}} všečkov v tej temi" users: "Uporabniki" users_lowercase: one: "uporabnik" @@ -2374,9 +2547,14 @@ sl: other: "uporabnikov" category_title: "Kategorija" history: "Zgodovina" + changed_by: "od {{author}}" + raw_email: + title: "Dohodno e-sporočilo" + not_available: "Ni na voljo!" + categories_list: "Seznam kategorij" filters: - with_topics: "%{filter} tem" - with_category: "%{filter} %{category} tem" + with_topics: "%{filter} teme" + with_category: "%{filter} %{category} teme" latest: title: "Najnovejše" title_with_count: @@ -2463,7 +2641,11 @@ sl: other_periods: "poglej najboljše" browser_update: 'Nažalost, vaš brskalnik je preveč zastarel za to spletno stran. Nadgradite vaš brskalnik.' permission_types: + full: "Ustvari / Odgovori / Vidi" create_post: "Odgovori / Vidi" + readonly: "Vidi" + lightbox: + download: "prenesi" keyboard_shortcuts_help: title: "Bližnjice na tipkovnici" jump_to: @@ -2494,8 +2676,8 @@ sl: show_incoming_updated_topics: ". Prikaži osvežene teme" search: "/ or ctrl+alt+f Iskalnik" help: "? Odpri bližnjice na tipkovnici" - dismiss_new_posts: "x, r Prekliči nov/prispevek" - dismiss_topics: "x, t Prekliči teme" + dismiss_new_posts: "x, r Opusti nov/prispevek" + dismiss_topics: "x, t Opusti teme" log_out: "shift+z shift+z Odjava" composing: title: "Urejevalnik" @@ -2572,15 +2754,30 @@ sl: tagging: all_tags: "Vse oznake" + other_tags: "Druge oznake" selector_all_tags: "vse oznake" + selector_no_tags: "brez oznak" + changed: "spremenjene oznake:" + tags: "Oznake" choose_for_topic: "neobvezne oznake" + delete_tag: "Izbriši oznako" delete_confirm: one: "Ali ste prepričani, da želite izbrisati to oznako in jo umaknili iz {{count}} teme s to oznako?" two: "Ali ste prepričani, da želite izbrisati to oznako in jo umaknili iz {{count}} tem s to oznako?" few: "Ali ste prepričani, da želite izbrisati to oznako in jo umaknili iz {{count}} tem s to oznako?" other: "Ali ste prepričani, da želite izbrisati to oznako in jo umaknili iz {{count}} tem s to oznako?" delete_confirm_no_topics: "Ali ste prepričani da hočete izbrisati to oznako?" + rename_tag: "Preimenuj oznako" + rename_instructions: "Izberite novo ime za oznako:" + sort_by: "Uredi po:" + sort_by_count: "številu" + sort_by_name: "imenu" + manage_groups: "Uredite skupine oznak" + manage_groups_description: "Določi skupine za organiziranje oznak" + upload: "Naloži oznake" upload_description: "Naloži datoteko CSV za množično ustvarjanje oznak" + upload_instructions: "Ena na vrstico, po želji s skupino oznak v formatu 'tag_name,tag_group'." + upload_successful: "Oznake so bile uspešno naložene" delete_unused_confirmation: one: "%{count} oznaka bod izbrisana: %{tags}" two: "%{count} oznaki bosta izbrisani: %{tags}" @@ -2591,31 +2788,46 @@ sl: two: "%{tags} in %{count} drugi" few: "%{tags} in %{count} druge" other: "%{tags} in %{count} drugih" + delete_unused: "Izbriši neuporabljene oznake" + delete_unused_description: "Izbriši vse oznake, ki se ne uporabljajo na nobeni temi ali zasebnem sporočilu" cancel_delete_unused: "Prekliči" filters: - with_category: "%{filter} %{tag} tem v %{category}" - untagged_with_category: "%{filter} neoznačenih tem v %{category}" + without_category: "%{filter} %{tag} teme" + with_category: "%{filter} %{tag} teme v %{category}" + untagged_without_category: "%{filter} neoznačenih tem" + untagged_with_category: "%{filter} neoznačene teme v %{category}" notifications: watching: title: "Opazujem" - description: "Samodejno boste opazovali vse teme s to oznako. Obveščeni boste za vsak nov prispevek v vsaki temi. Ob temi bo prikazano število novih odgovorov." + description: "Samodejno boste opazovali vse teme s temi oznakami. Obveščeni boste za vsak nov prispevek v vsaki temi. Ob temi bo prikazano število novih odgovorov." watching_first_post: title: "Opazujem prvi prispevek" - description: "Obveščeni boste o novih temah z to oznako, ne pa tudi o odgovorih v temah." + description: "Obveščeni boste o novih temah s temi oznakami, ne pa tudi o odgovorih v temah." tracking: title: "Sledim" - description: "Samodejno boste sledili vsem temam s to oznako. Ob temi bo prikazano število novih odgovorov." + description: "Samodejno boste sledili vsem temam s temi oznakami. Ob temi bo prikazano število novih odgovorov." regular: + title: "Običajno" description: "Obveščeni boste, če nekdo omeni vaše @ime ali odgovori na vaš prispevek." muted: title: "Utišano" - description: "Ne boste obveščeni o temah s to oznako in ne bodo se pojavile v seznamu neprebrane." + description: "Ne boste obveščeni o temah s temi oznakami in ne bodo se pojavile v seznamu neprebrane." groups: + title: "Skupine oznak" + about: "Dodajte oznake v skupine da jih lažje upravljate" new: "Nova skupina" + tags_label: "Oznake v tej skupini:" + parent_tag_label: "Nadrejena oznaka:" parent_tag_placeholder: "Neobvezno" + parent_tag_description: "Oznake iz te skupine se ne morejo uporabiti, če ni prisotna tudi nadrejena oznaka." one_per_topic_label: "Omeji na eno oznako na temo iz te skupine" + new_name: "Nova skupina oznak" save: "Shrani" delete: "Izbriši" + confirm_delete: "Ali ste prepričani, da hočete izbrisati to skupino oznak?" + everyone_can_use: "Oznake lahko uporablja kdorkoli" + usable_only_by_staff: "Oznake so vidne vsem, smao osebje jih lahko nastavi" + visible_only_to_staff: "Oznake so vidne samo osebju" topics: none: unread: "Nimate neprebranih tem." @@ -2642,38 +2854,92 @@ sl: custom_message_placeholder: "Vnesi sporočilo po meri" custom_message_template_forum: "Pridruži se našemu forumu!" custom_message_template_topic: "Zdi se mi, da vam bo ta tema všeč!" + forced_anonymous: "Zaradi visoke obremenitve je to prikazano vsem tako kot bi videl neprijavljen uporabnik." + safe_mode: + enabled: "Varni način je vklopljen, za izklop varnega načina zaprite okno brskalnika." admin_js: + type_to_filter: "vnesite za filter..." admin: title: "Discourse Admin" moderator: "Moderator" + reports: + title: "Seznam poročil" dashboard: + title: "Nadzorna plošča" + last_updated: "Nadzorna plošča nazadnje osvežena:" + find_old: "Iščete staro nadzorno ploščo?" + old_link: "obiščite jo tukaj" version: "Verzija" + up_to_date: "Imate zadnjo verzijo!" + critical_available: "Nujna posodobitev je na voljo." + updates_available: "Posodobitve so na voljo." + please_upgrade: "Prosimo, posodobite sistem!" + no_check_performed: "Preverjanje posodobitev se ni izvedlo. Preverite da sidekiq teče." + stale_data: "Zadnje čase se preverjanje posodobitev ni izvedlo. Preveite sidekiq teče. " + version_check_pending: "Izgleda ste nedavno posodobili sistem. Super!" installed_version: "Nameščeno" latest_version: "Najnovejše" + problems_found: "Nekaj priporočil glede na vaše trenutne nastavitve strani" + last_checked: "Nazadnje preverjeno" refresh_problems: "Osveži" + no_problems: "Nismo našli problemov." moderators: "Moderatorji:" admins: "Administratorji:" silenced: "Utišan:" suspended: "Suspendirani:" + private_messages_short: "ZS" private_messages_title: "Zasebna sporočila" + mobile_title: "Mobilni" + space_used: "%{usedSize} uporabljeno" + space_used_and_free: "%{usedSize} (%{freeSize} prosto)" + uploads: "Prenosi" + backups: "Varnostne kopije" backup_count: one: "%{count} varnostna kopija na %{location}" two: "%{count} varnostni kopiji na %{location}" few: "%{count} varnostne kopije na %{location}" other: "%{count} varnostnih kopij na %{location}" + lastest_backup: "Zadnja: %{date}" + traffic_short: "Promet" + traffic: "Spletne zahteve aplikacije" page_views: "Ogledov strani" page_views_short: "Ogledov strani" + show_traffic_report: "Pokaži podrobno poročilo prometa" + community_health: Zdravje skupnosti + moderators_activity: Aktivnosti moderatorjev + whats_new_in_discourse: "Kaj je novega v Discourse?" + activity_metrics: Metrike aktivnosti + all_reports: "Vsa poročila" + general_tab: "Splošno" + moderation_tab: "Moderiranje" + security_tab: "Varnost" + reports_tab: "Poročila" + disabled: Onemogočeno + timeout_error: "Poizvedba traja predolgo, prosimo izberite krajši interval." + exception_error: Prišlo je do napake med poizvedbo. too_many_requests: To dejanje ste izvedli prevečkrat. Prosimo počakajte preden poskusite ponovno. + not_found_error: To poročilo ne obstaja. + filter_reports: Filtriraj poročila reports: + trend_title: "%{percent} sprememba. Trenutno %{current}, je bilo %{prev} v prejšnem obdobju." today: "Danes" yesterday: "Včeraj" + last_7_days: "zadnjih 7 dni" + last_30_days: "zadnjih 30 dni" + all_time: "Ves čas" 7_days_ago: "pred 7 dnevi" 30_days_ago: "pred 30 dnevi" + all: "Vsi" view_table: "tabela" view_graph: "graf" refresh_report: "Osveži poročilo" start_date: "Začetni datum" end_date: "Končni datum" + groups: "Vse skupine" + disabled: "To poročilo je onemogočeno" + totals_for_sample: "Skupaj za vzorec" + total: "Skupaj vseh časov" + no_data: "Ni podatkov za prikaz." trending_search: more: 'Dnevnik iskanj' flags: @@ -2798,9 +3064,13 @@ sl: add_owners: Dodaj skrbnike no_custom_groups: "Ustvari novo skupino po meri" api: + generate_master: "Generiraj glavni API ključ" user: "Uporabnik" title: "API" key: "API ključ" + generate: "Generiraj" + regenerate: "Regeneriraj" + confirm_revoke: "Ali ste prepričani da hočete preklicati ta ključ?" all_users: "Vsi uporabniki" web_hooks: create: "Ustvari" @@ -2893,6 +3163,7 @@ sl: common: "Skupno" desktop: "Namizno" mobile: "Mobilno" + settings: "Nastavitve" preview: "Predogled" color_scheme: "Barvna shema" collapse: Skrči @@ -3000,6 +3271,7 @@ sl: delete_topic: "izbriši temo" recover_topic: "prekliči izbris teme" delete_post: "izbriši prispevek" + impersonate: "poosebi uporabnika" anonymize_user: "anonimiziraj uporabnika" change_category_settings: "spremeni nastavitve kategorije" delete_category: "izbriši kategorijo" @@ -3008,8 +3280,11 @@ sl: unsilence_user: "ukini utišanje uporabnika" removed_silence_user: "utišaj uporabnika (odstranjen)" removed_unsilence_user: "ukini utišanje uporabnika (odstranjeno)" + grant_admin: "odobri administratorja" + grant_moderation: "odobri moderatorja" backup_create: "ustvari varnostno kopijo" deleted_tag: "izbriši oznako" + deleted_unused_tags: "izbriši neuporabljene oznake" renamed_tag: "preimenuj oznako" lock_trust_level: "zakleni nivo zaupanja" unlock_trust_level: "odkleni nivo zaupanja" @@ -3030,7 +3305,7 @@ sl: entity_export: "izvoz entitete" screened_emails: title: "Nadzorovani e-naslovi" - description: "Nadzorovani e-naslovi se bodo preverili ob vsaki novi registraciji uporabniškega računa - vsak poizkus bo blokiran ali bo izvedena druga akcija." + description: "Nadzorovani e-naslovi se bodo preverili ob vsaki novi registraciji uporabniškega računa - vsak poskus bo blokiran ali bo izvedena druga akcija." email: "E-naslov" actions: allow: "Dovoli" @@ -3086,13 +3361,17 @@ sl: add: "Dodaj" success: "Uspeh" upload: "Prenesi" + impersonate: + title: "Poosebi uporabnika" + help: "Uporabljajte to orodje za poosebljanje uporabnika za iskanje in odpravljanje napak. Ko končate se morate odjaviti." + invalid: "Oprostite, ne morete poosebiti tega uporabnika." users: title: "Uporabniki" last_emailed: "Zadnja e-pošta" active: "Aktiviran" show_emails: "Pokaži e-naslove" nav: - new: "Nov" + new: "Novi" active: "Aktivni" pending: "Za potrditev" staff: "Osebje" @@ -3114,6 +3393,11 @@ sl: active: "Aktivni uporabniki" new: "Novi uporabniki" pending: "Uporabniki za potrditev" + newuser: "Uporabniki na nivoju zaupanja 0 (novi)" + basic: "Uporabniki na nivoju zaupanja 1 (osnovni)" + member: "Uporabniki na nivoju zaupanja 2 (člani)" + regular: "Uporabniki na nivoju zaupanja 3 (redni)" + leader: "Uporabniki na nivoju zaupanja 4 (vodja)" staff: "Osebje" silenced: "Utišani uporabniki" suspended: "Suspendirani uporabniki" @@ -3134,7 +3418,7 @@ sl: suspend_failed: "Nekaj je šlo narobe pri suspendiranju uporabnika {{error}}" unsuspend_failed: "Nekaj je šlo narobe pri preklicu suspenza {{error}}" suspend_duration: "Za kako dolgo bo uporabnik suspendiran?" - suspend_reason_label: "Zakaj je uporabnik suspendiran? To besedilo bo vidno vsem na uporabnikovem profilu in se bo prikazalo uporabniku, ko se bo poizkusil prijaviti. Naj bo kratko." + suspend_reason_label: "Zakaj je uporabnik suspendiran? To besedilo bo vidno vsem na uporabnikovem profilu in se bo prikazalo uporabniku, ko se bo poskusil prijaviti. Naj bo kratko." suspend_reason_hidden_label: "Zakaj je uporabnik suspendiran? To besedilo bo prikazano uporabniku, ko se bo poskušal vpisati. Naj bo kratko." suspend_reason: "Razlog" suspend_reason_placeholder: "Razlog za suspenz" @@ -3149,6 +3433,7 @@ sl: silence_reason_placeholder: "Razlog za utišanje" silence_message: "E-sporočilo za uporabnika" silence_message_placeholder: "(pustite prazno, če hočete poslati privzeto sporočilo)" + suspended_until: "(do %{until})" cant_suspend: "Ta uporabnik ne more biti suspendiran." delete_all_posts: "Izbriši vse prispevke" penalty_post_actions: "Kaj bi rad naredil/a z asociiranim prispevkom?" @@ -3165,10 +3450,16 @@ sl: admin: "Admin?" suspended: "Suspendiran?" show_admin_profile: "Admin" + refresh_browsers: "Zahtevaj osvežitev brskalnika" + refresh_browsers_message: "Obvestilo poslano vsem odjemalcem!" show_public_profile: "Pokaži javni profil" + impersonate: "Poosebi uporabnika" action_logs: "Dnevnik akcij" + ip_lookup: "Poizvedba IP" log_out: "Odjava" + grant_admin: "Odobri administratorja" grant_admin_confirm: "Poslali smo ti e-sporočilo za potrditev novega administratorja. Odpri ga in sledi navodilom." + grant_moderation: "Odobri moderatorja" unsuspend: "Prekliči suspenz" suspend: "Suspendiraj" show_flags_received: "Pokaži prejete prijave" @@ -3193,8 +3484,11 @@ sl: approve_bulk_success: "Uspeh! Vsi izbrani uporabniki/ce, so bili potrjeni in obveščeni." time_read: "Čas branja" anonymize: "Anonimiziraj uporabnika" + anonymize_confirm: "Ali ste PREPRIČANI da hočete anonomizirati tega uporabnika? To bo spremenilo njegovo uporabniško ime in e-naslov ter ponastavilo vse profilne podatke." + anonymize_yes: "Da, anonimiziraj tega uporabnika" delete: "Izbriši uporabnika" delete_forbidden_because_staff: "Administratorjev in moderatorjev se ne da izbrisati." + delete_confirm: "Navadno je bolj primerno da se uporabnike anonimizira in ne izbriše, ker se z brisanjem odstrani tudi vsebina iz obstoječih razprav.If you remember your password you can Login.
Otherwise please Reset Password.
+ error_message: "There was an error accepting invite. Please contact the site's administrator." user_exists: "There's no need to invite %{email}, they already have an account!" confirm_email: "You’re almost done! We sent an activation mail to your email address. Please follow the instructions in the mail to activate your account.
If it doesn’t arrive, check your spam folder.
" @@ -1327,7 +1329,7 @@ en: summary_posts_required: "Minimum posts in a topic before 'Summarize This Topic' is enabled" summary_likes_required: "Minimum likes in a topic before 'Summarize This Topic' is enabled" summary_percent_filter: "When a user clicks 'Summarize This Topic', show the top % of posts" - summary_max_results: "Maximum posts returned by 'Summary This Topic'" + summary_max_results: "Maximum posts returned by 'Summarize This Topic'" enable_personal_messages: "Allow trust level 1 (configurable via min trust level to send messages) users to create messages and reply to messages. Note that staff can always send messages no matter what." enable_system_message_replies: "Allows users to reply to system messages, even if personal messages are disabled" @@ -1484,10 +1486,11 @@ en: automatic_backups_enabled: "Run automatic backups as defined in backup frequency" backup_frequency: "The number of days between backups." s3_backup_bucket: "The remote bucket to hold backups. WARNING: Make sure it is a private bucket." - s3_endpoint: "The endpoint can be modified to backup to an S3 compatible service like DigitalOcean Spaces or Minio. WARNING: Use default if using AWS S3" + s3_endpoint: "The endpoint can be modified to backup to an S3 compatible service like DigitalOcean Spaces or Minio. WARNING: Leave blank if using AWS S3." s3_force_path_style: "Enforce path-style addressing for your custom endpoint. IMPORTANT: Required for using Minio uploads and backups." s3_configure_tombstone_policy: "Enable automatic deletion policy for tombstone uploads. IMPORTANT: If disabled, no space will be reclaimed after uploads are deleted." s3_disable_cleanup: "Disable the removal of backups from S3 when removed locally." + enable_s3_inventory: "Generate reports and verify uploads using Amazon S3 inventory. IMPORTANT: requires valid S3 credentials (both access key id & secret access key)." backup_time_of_day: "Time of day UTC when the backup should occur." backup_with_uploads: "Include uploads in scheduled backups. Disabling this will only backup the database." backup_location: "Location where backups are stored. IMPORTANT: S3 requires valid S3 credentials entered in Files settings." @@ -1540,7 +1543,7 @@ en: s3_upload_bucket: "The Amazon S3 bucket name that files will be uploaded into. WARNING: must be lowercase, no periods, no underscores." s3_access_key_id: "The Amazon S3 access key id that will be used to upload images." s3_secret_access_key: "The Amazon S3 secret access key that will be used to upload images." - s3_region: "The Amazon S3 region name that will be used to upload images." + s3_region: "The Amazon S3 region name that will be used to upload images and backups." 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: "List of automatically generated avatar sizes." @@ -3433,14 +3436,14 @@ en: color_schemes: base_theme_name: "Base" - light: "Light Scheme" - dark: "Dark Scheme" - neutral: "Neutral Scheme" - grey_amber: "Grey Amber Scheme" - shades_of_blue: "Shades of Blue Scheme" - latte: "Latte Scheme" - summer: "Summer Scheme" - dark_rose: "Dark Rose Scheme" + light: "Light" + dark: "Dark" + neutral: "Neutral" + grey_amber: "Grey Amber" + shades_of_blue: "Shades of Blue" + latte: "Latte" + summer: "Summer" + dark_rose: "Dark Rose" default_theme_name: "Light" light_theme_name: "Light" dark_theme_name: "Dark" @@ -4209,14 +4212,6 @@ en: 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" diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml index ed9be61e7c..8d85121b69 100644 --- a/config/locales/server.es.yml +++ b/config/locales/server.es.yml @@ -41,11 +41,11 @@ es: other_error: "Algo salió mal actualizando el theme" import_error: generic: Ha ocurrido un error al importar el tema - about_json: "Error de importación: el archivo about.json no existe o no es válido" - about_json_values: "El archivo about.json contiene valores no válidos: %{errors}" + about_json: "Error de importación: el archivo about.json no existe, o no es válido" + about_json_values: "about.json contiene valores no válidos: %{errors}" git: "Error al clonar el repositorio de git, el acceso ha sido denegado o el repositorio no existe" - unpack_failed: "No se ha podido descomprimir el archivo" - unknown_file_type: "El archivo que has subido no parece ser un tema válido de Discourse." + unpack_failed: "Error al descomprimir el archivo" + unknown_file_type: "El archivo que has subido no parece ser un theme válido de Discourse." errors: component_no_user_selectable: "Los componentes de tema no pueden ser seleccionables por los usuarios" component_no_default: "Los componentes de temas no pueden ser el tema por defecto" @@ -155,6 +155,7 @@ es: other: "Has especificado las opciones inválidas %{name}" 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'." + enable_s3_uploads_is_required: "No puedes activar el inventario en S3 a menos que se haya habilitado las subidas en S3." s3_backup_requires_s3_settings: "No puedes usar S3 como método de copia de seguridad salvo que hayas rellenado '%{setting_name}'." s3_bucket_reused: "No puedes usar el mismo bucket para 's3_upload_bucket' y 's3_backup_bucket'. Por favor, selecciona otro bucket o usa una ruta diferente para cada bucket." conflicting_google_user_id: 'El ID de la cuenta Google para esta cuenta ha cambiado; el staff debe intervenir por razones de seguridad. Por favor, póngase en contacto con miembros del staff y envíe esta referenciaNo hemos encontrado ningún tema con el título \"%{topic_title}\".
No hemos encontrado ningún tema con el título \"%{topic_title}\".
Si alguna vez quieres cambiar alguno de estos ajustes, vuelve a lanzar este ayudante cuando quieras o visita el panel de administrador; lo encontrarás al lado del icono de la llave inglesa en el menú.
-¡Pásalo bien, y buena suerte construyendo tu comunidad!
+¡Pásalo bien, y buena suerte construyendo tu nueva comunidad!
search_logs: graph_title: "Cuenta de Búsquedas" joined: "Registrado" diff --git a/config/locales/server.fa_IR.yml b/config/locales/server.fa_IR.yml index 9f121b3e2f..7be3fb6a6d 100644 --- a/config/locales/server.fa_IR.yml +++ b/config/locales/server.fa_IR.yml @@ -800,7 +800,6 @@ fa_IR: summary_posts_required: "حداقل نوشتهها در این جستار قبل از اینکه \" خلاصه این موضوع\" فعال شود" summary_likes_required: "حداقل پسندها در این جستار قبل از اینکه \" خلاصه این موضوع\" فعال شود" summary_percent_filter: "وقتی کاربر بر روی ' خلاصه این موضوع' کلیک کرد٬ % بهترین نوشتهها را نشان بده" - summary_max_results: "حداکثر نوشتههای برگردانده شد با \" خلاصه این موضوع\"" enable_long_polling: "message bus استفاده شده برای آگاه سازی می تواند برای رای گیری طولانی استفاده شود. " long_polling_base_url: " URL پایه استفاده شده برای رای گیری طولانی (وقتی CDN خدمت محتوای پویا می دهد٬ از تنظیم بودن منشا این کشش مطمئن شوید) برای نمونه : http://origin.site.com" long_polling_interval: "مدت زمانی که سرور قبل پاسخ دادن به مشتریها باید صبر کند، وقتی در آنجا داده ای برای ارسال نیست (فقط کاربران وارد شده)" @@ -912,7 +911,6 @@ fa_IR: s3_upload_bucket: "نام میزبان Amazon S3 که فایلها در آنجا بارگذاری می شود. اخطار: باید حروف کوچک باشد٬ بدون دوره٬ بدون زیرخط" s3_access_key_id: "ID کلید درسترسی Amazon S3 که برای بارگذاری عکسها استفاده میشود." s3_secret_access_key: "کلید درسترسی مخفی Amazon S3 که برای بارگذاری عکسها استفاده میشود." - s3_region: "اسم ناحیهی Amazon S3 که برای بارگذاری عکس ها استفاده می شود." s3_cdn_url: "آدرس CDN برای دسترسی به تمام داراییهای s3 (به طور مثال: https://cdn.somewhere.com). هشدار: بعد از تغییر این مقدار باید تمامی نوشتهها و مطالب قدیمی را rebake کنید." avatar_sizes: "لیست اندازههای آواتار که به صورت خودکار تولید شده است." external_system_avatars_enabled: "استفاده از سرویس آواتار خارجی." diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml index 7a40de626a..f74ac24cda 100644 --- a/config/locales/server.fi.yml +++ b/config/locales/server.fi.yml @@ -1227,7 +1227,6 @@ fi: summary_posts_required: "Montako viestiä ketjussa täytyy olla, jotta ketjun tiivistelmä otetaan käyttöön" summary_likes_required: "Montako tykkäystä ketjussa pitää olla, jotta ketjun tiivistelmä otetaan käyttöön" summary_percent_filter: "Kun käyttäjä klikkaa 'Näytä ketjun tiivistelmä', näytä paras % viesteistä" - summary_max_results: "Maksimimäärä viestejä, jotka näytetään ketjun tiivistelmässä" enable_personal_messages: "Salli luottamustason 1 saavuttaneiden käyttäjien (\"min trust level to send messages\" on säädettävissä) lähettää yksityisviestejä ja vastata niihin. Huomioi, että henkilökunta voi aina lähettää yksityisviestejä." enable_system_message_replies: "Sallii käyttäjien vastata systeemin yksityisviesteihin, vaikka yksityisviestit eivät olisikaan käytössä" enable_long_polling: "Ilmoitusten käyttämä viestiväylä voi käyttää long pollingia" @@ -1352,7 +1351,6 @@ fi: automatic_backups_enabled: "Tee automaattinen varmuuskopiointi, kuten tiheysasetus on määritelty" backup_frequency: "Kuinka monen päivän välein otetaan varmuuskopio." s3_backup_bucket: "Amazon S3 bucket johon varmuuskopiot ladataan. VAROITUS: Varmista, että se on yksityinen." - s3_endpoint: "Varmuuskopioinnin päätepisteeksi voi asettaa minkä tahansa S3-yhetensopivan palvelun kuten DigitalOcean Spaces tai Minio. VAROITUS: Valitse oletus jos käytät AWS S3:a" s3_disable_cleanup: "Älä poista varmuuskopiota S3:sta, kun se poistetaan paikallisesti." backup_time_of_day: "UTC-kellonaika, jolloin varmuuskopio tehdään." backup_with_uploads: "Sisällytä lataukset ajastettuihin varmuuskopioihin. Jos tämä on pois käytöstä, vain tietokanta varmuuskopioidaan." @@ -1395,7 +1393,6 @@ fi: s3_upload_bucket: "Amazon S3 bucket, jonne lataukset sijoitetaan. VAROITUS: täytyy olla pienillä kirjaimilla, ei pisteitä, ei alaviivoja." s3_access_key_id: "Amazon S3 access key id, jota käytetään kuvien sijoittamisessa." s3_secret_access_key: "Amazon S3 secret access key, jota käytetään kuvien sijoittamisessa." - s3_region: "Amazon S3 region, jota käytetään kuvien sijoittamisessa." s3_cdn_url: "CDN URL, jota käytetään S3:ssa sijaitseville tiedostoille (esimerkiksi https://cdn.jossain.com). VAROITUS: tämän asetuksen muuttamisen jälkeen sinun täytyy rakentaa uudelleen kaikki vanhat viestit." avatar_sizes: "Profiilikuvista automaattisesti luotavat koot." external_system_avatars_enabled: "Käytä ulkopuolista avatarpalvelua." diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml index b0b36b2d84..a395a3a118 100644 --- a/config/locales/server.fr.yml +++ b/config/locales/server.fr.yml @@ -155,6 +155,7 @@ fr: other: "Vous avez spécifié les choix invalides %{name}" 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'." + enable_s3_uploads_is_required: "Vous ne pouvez pas activer l'inventaire sur S3 avant d'avoir activer les envois S3." s3_backup_requires_s3_settings: "Il n'est pas possible d'utiliser le lieu de sauvegarde S3 sans renseigner le '%{setting_name}'." s3_bucket_reused: "Il n'est pas possible d'utiliser le même bucket pour 's3_upload_bucket' and 's3_backup_bucket'. Choisir un autre bucket ou utiliser un chemin d'accès différent pour chaque bucket." conflicting_google_user_id: 'Le Google Account ID a changé pour ce compte ; un responsable doit intervenir pour des raisons de sécurité. Merci de contacter les responsables et les renvoyer versSi vous vous rappelez de votre mot de passe, vous pouvez vous Connecter.
Sinon, veuillez Réinitialiser mot de passe.
+ error_message: "Il y a eu une erreur lors de l'acceptation d'une invitation. Merci de contacter l'administrateur du site." user_exists: "Il n'y a pas besoin d'inviter %{email} qui a déjà un compte !" confirm_email: "Vous y êtes presque ! Nous avons envoyé un courriel d'activation à votre adresse. Merci de suivre les instructions dans le courriel pour activer votre compte.
Si vous ne le recevez pas, vérifiez votre dossier Spam dans votre messagerie.
" bulk_invite: @@ -387,13 +389,12 @@ fr: Nous sommes désolés, les nouveaux membres sont limités temporairement à %{newuser_max_replies_per_topic} réponses dans un même sujet. Plutôt que d'ajouter une nouvelle réponse, vous pouvez éditer vos messages précédents ou visiter d'autres sujets. - reviving_old_topic: |2 - + reviving_old_topic: | ### Relancer ce sujet ? La dernière réponse à ce sujet était **%{time_ago}**. Votre réponse remettra ce sujet en tête de liste et provoquera une notification à tous les intervenants qui y ont pris part auparavant. - Etes vous sûr de vouloir continuer cette vieille conversation ? + Êtes vous sûr de vouloir continuer cette vieille conversation ? activerecord: attributes: category: @@ -1375,10 +1376,11 @@ fr: automatic_backups_enabled: "Activer les sauvegardes automatiques tels que définis dans les fréquences de sauvegarde" backup_frequency: "Nombre de jours entre sauvegardes" s3_backup_bucket: "Bucket distant qui contiendra les sauvegardes. ATTENTION: Vérifiez que c'est un bucket privé" - s3_endpoint: "Le terminal peut être modifié pour être sauvegardé sur un service compatible S3 comme DigitalOcean Spaces ou Minio. ATTENTION: Utiliser défaut si vous utilisez AWS S3" + s3_endpoint: "Le terminal peut être modifié pour être sauvegardé sur un service compatible S3 comme DigitalOcean Spaces ou Minio. ATTENTION: Laisser vide si vous utilisez AWS S3" s3_force_path_style: "Appliquez l'adressage de type chemin pour votre terminal personnalisé. IMPORTANT : Nécessaire pour utiliser les téléchargements et sauvegardes Minio." s3_configure_tombstone_policy: "Activer la suppression automatique des téléchargements non-référencés (?). IMPORTANT: En cas de désactivation, aucun espace disque ne sera récupéré suite à la suppression de téléchargements." s3_disable_cleanup: "Désactiver la suppression des sauvegardes de S3 lors de leur suppression locale." + enable_s3_inventory: "Générer des rapports et vérifier les envois avec l'inventaire Amazon S3. IMPORTANT: nécessite un accès valide à S3 (l'identifiant et la clé secrète). " 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." backup_location: "Lieu de stockage des archivages. IMPORTANT: S3 reqiuert que des identifiants valides S3 soient saisis dans Files settings." @@ -1421,7 +1423,7 @@ fr: s3_upload_bucket: "Le nom du bucket Amazon S3 qui contiendra les fichiers téléchargés. ATTENTION : doit être en minuscule, sans points et sans tirets bas." s3_access_key_id: "L' access key Amazon S3 qui sera utilisée pour uploader les images." s3_secret_access_key: "La clé secrète Amazon S3 qui va être utilisée pour uploader des images." - s3_region: "Le nom de la région Amazon S3 qui va être utilisée pour uploader des images." + s3_region: "Le nom de la région Amazon S3 qui va être utilisée pour envoyer des images et sauvegardes." s3_cdn_url: "L'adresse du CDN à utiliser pour toutes les ressources s3 (par exemple : https://cdn.monsite.com). ATTENTION : après avoir changé ce paramètre, vous devez régénérer la totalité des messages existants. " avatar_sizes: "Liste des tailles des avatars automatiquement générés" external_system_avatars_enabled: "Utilisez un service d'avatars externe." diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index 59697b8e35..51a317be21 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -881,7 +881,6 @@ he: summary_posts_required: "מספר הפוסטים המנימלי בנושא לפני שהאפשרות \"סיכום נושא זה\" תתאפשר" summary_likes_required: "מינימום הלייקים לנושא לפני שהאפשרות \"סיכום נושא זה\" תתאפשר" summary_percent_filter: "כאשר משתמש/ת מקליקים על \"סיכום נושא זה\", הציגו את % הפוסטים הראשונים" - summary_max_results: "מספר הפוסטים שיוחזרו באמצעות \"סיכום נושא זה\"" enable_long_polling: "באס הודעות שמשמש להתראות יכול להשתמש בתשאול ארוך (long polling)" long_polling_base_url: "בסיס ה-URL שנמצא בשימוש עבור long polling (כאשר CDN מחזיר תוכן דינמי, זכרו להגדיר את ערך זה ל-Origin pull, דוגמת http://origin.site.com)" long_polling_interval: "כמות הזמן שהשרת צריך לחכות לפני שעונה ללקוחות, כאשר אין מידע לשליחה (משתמשים רשומים מחוברים למערכת בלבד)" @@ -994,7 +993,6 @@ he: 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: "CDN URL לכל ה assets ב s3 (למשל: https://cdn.somewhere.com). א-ז-ה-ר-ה: לאחר שינוי של הגדרה זו עליכם לאפות מחדש את כל הפוסטים הישנים." avatar_sizes: "רשימה של גדלי דמויות שנוצרת אוטומטית." external_system_avatars_enabled: "שימוש בשירות של מערכת אווטארים חיצונית." diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml index 2235b47717..dd02d3957b 100644 --- a/config/locales/server.it.yml +++ b/config/locales/server.it.yml @@ -226,6 +226,7 @@ it: topic_not_found: "Quancosa non ha funzionato. Forse questo argomento è stato chiuso o cancellato mentre lo leggevi." not_accepting_pms: "Spiacenti, %{username} non accetta messaggi al momento." max_pm_recepients: "Spiacenti, puoi inviare un messaggio ad un massimo di %{recipients_limit} destinatari." + removed_direct_reply_full_quotes: "La citazione completa del messaggio precedente è stata rimossa automaticamente." just_posted_that: "è troppo simile a ciò che hai appena pubblicato" invalid_characters: "contiene caratteri non validi" is_invalid: "sembra poco chiaro, è una frase completa?" @@ -1011,7 +1012,6 @@ it: summary_posts_required: "Minimo numero di messaggi in un argomento affinché venga abilitato 'Riassumi Questo Argomento' " summary_likes_required: "Minimo numero di \"Mi piace\" in un argomento affinché venga abilitato 'Riassumi Questo Argomento'" summary_percent_filter: "Quando un utente clicca su 'Riassumi Questo Argomento', mostra i primi % messaggi" - summary_max_results: "Massimo numero di messaggi mostrati in 'Riassumi Argomento'" enable_long_polling: "Il message bus per le notifiche può usare il long polling" long_polling_base_url: "URL di base usato per il long polling (quando una CDN serve contenuto dinamico, bisogna impostarlo come origin pull) es. http://origin.site.com" long_polling_interval: "Tempo di attesa prima che il server risponda ai client che non ci sono dati da trasmettere (solo per utenti autenticati)" @@ -1050,6 +1050,7 @@ it: send_welcome_message: "Invia a tutti i nuovi utenti un messaggio di benvenuto con una guida di avvio rapido." suppress_reply_directly_below: "Non mostrare il conteggio espandibile delle risposte quando c'è una sola risposta sotto quel messaggio." suppress_reply_directly_above: "Non mostrare in-risposta-a espandibile in un messaggio quando c'è una sola risposta sopra quel messaggio. " + remove_full_quote: "Rimuovi automaticamente le citazioni complete dalle risposte dirette." suppress_reply_when_quoting: "Non mostrare in-risposta-a espandibile in un messaggio quando il messaggio include la citazione." max_reply_history: "Numero massimo di risposte da espandere quando si espande in-risposta-a" topics_per_period_in_top_summary: "Numero di argomenti popolari mostrati nel riepilogo di default." @@ -1136,7 +1137,6 @@ it: s3_upload_bucket: "Il nome del bucket Amazon S3 sul quale verranno caricati i file. ATTENZIONE: deve essere tutto minuscolo, senza punti, senza trattini bassi." s3_access_key_id: "La access key id Amazon S3 che verrà usata per caricare le immagini." s3_secret_access_key: "La access key secret Amazon S3 che verrà usata per caricare le immagini." - s3_region: "La region name Amazon S3 che verrà usata per caricare le immagini." s3_cdn_url: "URL della CDN da usare per tutte le risorse s3 (ad esempio: https://cdn.somewhere.com). ATTENZIONE: dopo aver cambiato questa impostazione devi aggiornare tutti i vecchi messaggi." avatar_sizes: "Elenco delle dimensioni degli avatar, generate automaticamente." external_system_avatars_enabled: "Utilizza un servizio esterno per gli avatar." @@ -2507,18 +2507,22 @@ it: Questo distintivo è 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: "Può utilizzare a tutte le funzioni essenziali della comunità" long_description: | Questo distintivo è assegnato quando si raggiunge il livello di esperienza 1. Grazie per essere rimasto nei paraggi e per aver letto alcune discussioni, per capire meglio di cosa si occupa la nostra comunità. Le limitazioni imposte ai nuovi utenti sono state rimosse, e ti sono state attivate alcune funzioni essenziali come l'invio di messaggi personali, la segnalazione di messaggi dubbi, la creazione di messaggi Wiki e la possibilità di inviare immagini multiple e collegamenti. member: name: Membro + description: "Puà utilizzare inviti, messaggi di gruppo e più \"mi piace\"" long_description: | Questo distintivo è assegnato quando si raggiunge il livello di esperienza 2. Grazie per esserti unito e per aver partecipato per qualche settimana alla nostra comunità. Ora puoi mandare 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: "Può utilizzare ricategorizza, rinomina, collegamenti seguiti, wiki e ulteriori \"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 maggiore di "Mi piace" al giorno. leader: name: Veterano + description: "Può utilizzare modifica globale, appuntare, chiudere, archiviare, dividere e unire argomenti, e ulteriori \"mi piace\"" long_description: | Questo distintivo è assegnato quando si raggiunge il livello di esperienza 4. Sei un veterano in questa comunità selezionato dallo staff, e qui sei un esempio positivo per il resto della comunità con le tue azioni e parole. Hai la possibilità di modificare tutti i messaggi, agire come un moderatore con azioni comuni quali puntare, chiudere, rendere invisibile, archiviare, dividere e unire, e hai tonnellate di mi piace al giorno. welcome: diff --git a/config/locales/server.ja.yml b/config/locales/server.ja.yml index 0c47572baa..182380faf0 100644 --- a/config/locales/server.ja.yml +++ b/config/locales/server.ja.yml @@ -387,6 +387,7 @@ ja: self: "まだアクティビティーがありません" others: "アクティビティーなし" no_bookmarks: + self: "ブックマークした投稿はありません。ブックマークを使用すると、特定の投稿を素早く参照できます。" others: "ブックマークはありません" no_likes_given: self: "いいね!はしていません。" @@ -397,14 +398,16 @@ ja: topic_flag_types: spam: title: "スパム" - description: "この投稿は、営利目的、宣伝目的の書き込みの可能性がある。" + description: "このトピックは広告です。これは、このサイトに有益ではないまたは関連していない、事実上の広告です。" long_form: "スパムとして通報" short_description: "広告です" inappropriate: title: "不適切" + description: 'このトピックには一般的な人が攻撃的、虐待的、またはコミュニティガイドラインに違反すると見なすコンテンツが含まれています。' long_form: "不適切として通報する" notify_moderators: title: "その他" + description: 'このトピックはガイドライン、利用規約または上記に記載されていない別の理由で、一般のスタッフによる注意が必要です。' long_form: "モデレーターへ知らせるために通報する" short_description: "その他の理由で管理人による確認が必要" email_title: 'トピック"%{title}" は不適切な可能性があるため、管理人による確認を必要とする。' @@ -600,6 +603,7 @@ ja: educate_until_posts: "最初(または複数)の投稿でタイピングを開始したら、ポップアップでガイダンスを表示させるか" title: "サイトの名前です。titleタグで使用されます" site_description: "このサイトについて簡単に説明してください。 descriptionタグで使用されます。" + short_site_description: "ホームページのtitleタグで使用される簡単な説明です。" crawl_images: "正しい幅と高さを取得するためにURLから画像を取得する" download_remote_images_to_local: "リモート画像をダウンロードしてローカル画像に変換する。破損した画像を防ぎます" download_remote_images_threshold: "リモート画像をダウンロードするために必要なディスクスペースの最低残容量 (パーセント)" @@ -611,15 +615,23 @@ ja: fixed_category_positions: "チェックすると、カテゴリの表示順をコントロールできます。チェックしない場合、アクティビティ順に表示されます" fixed_category_positions_on_create: "チェックすると、トピック作成ダイアログ上でカテゴリの順序が維持されます(fixed category positions が必要)。" add_rel_nofollow_to_user_content: ' 内部リンク(親ドメインを含む)を除き、投稿されたすべてのユーザコンテンツに rel nofollow を追加する。この設定を反映するには "rake posts:rebake" を実行して baked markdown をすべて更新する必要があります' + exclude_rel_nofollow_domains: "nofollowをリンクに追加しないドメインのリストです。 example.comは自動的にsub.example.comも許可します。少なくとも、Webクローラーがすべてのコンテンツを見つけやすくするために、このサイトのドメインを追加する必要があります。 もし、Webサイトの他の部分に別のドメインがある場合は、それらも追加してください。" post_excerpt_maxlength: "投稿の引用/サマリの最大文字数" post_onebox_maxlength: "Discourse OneBox投稿の最大文字数" + logo: "サイトの左上にあるロゴ画像です。高さ120、縦横比3:1を超える広い長方形の画像を使用してください。空白のままにすると、サイトのタイトルがテキストで表示されます。" + logo_small: "あなたのサイトの左上にある小さなロゴ画像です。下にスクロールしたときに見えます。 120×120の正方形の画像を使用してください。空白のままにすると、ホームグリフが表示されます。" + digest_logo: "サイトのメールサマリーの上部で使用されるロゴの代替画像です。広い長方形の画像を使用してください。 SVG画像を使わないでください。空白のままにすると、 `logo`で設定した画像が使用されます。" + mobile_logo: "あなたのサイトのモバイル版で使用されるロゴです。高さ120、縦横比3:1を超える広い長方形の画像を使用します。空白のままにすると、 'logo'で設定した画像が使用されます。" + favicon: "あなたのサイトのためのファビコン、https://en.wikipedia.org/wiki/Faviconを参照してください。CDN上で正しく動作するためには、pngでなければなりません。" + apple_touch_icon: "Apple touch端末で使用されるアイコンです。必要なサイズは144×144です。" + opengraph_image: "当該ページに他の適切な画像やサイトロゴがない場合に使用されるデフォルトのopengraph画像です。" + twitter_summary_large_image: "デフォルトのTwitter Summary Cardの画像です(幅280、高さ150以上)。" notification_email: "システムからの重要なメール送信に使用する from: メールアドレス。メールが届くように、ここに指定されたドメインはSPF、DKIM、逆引きPTRレコードが正しく設定されている必要があります。" email_custom_headers: "カスタムメールヘッダのリスト (パイプ(バーティカルバー) 区切り)" summary_score_threshold: "'トピックサマリー'に投稿が含まれるために必要な最低スコア" summary_posts_required: "'トピックサマリー'が有効になるために必要な最小投稿数" summary_likes_required: "'トピックサマリー'が有効になるために必要な最小「いいね!」数" summary_percent_filter: "ユーザが'トピックサマリー'をクリックしたとき, 上位何パーセントのポストを表示するか" - summary_max_results: "'トピックサマリー'として返却される最大ポスト数" enable_long_polling: "通知用のメッセージバスによるロングポーリングの利用を許可する" long_polling_base_url: "ロングポーリングのベースURL(CDNが動的コンテンツを配信している場合、これをoriginに指定してください) eg: http://origin.site.com" long_polling_interval: "ユーザに送信するデータが存在しないとき、サーバが待機する時間(ログインユーザーのみ)" @@ -656,6 +668,7 @@ ja: log_out_strict: "ログアウトした際に、そのユーザーの全デバイスのセッションをログアウトさせる" new_version_emails: "Discourseの新しいバージョンが利用可能になった際に contact_email アドレスにメールで通知する" invite_expiry_days: "招待キーの有効期間 (日)" + invite_only: "公開登録は無効になっています。すべての新規ユーザーは信頼できるユーザーまたはスタッフによって明示的に招待される必要があります。" login_required: "サイトのコンテンツを閲覧するには認証を必須にして、匿名アクセスを拒否する" min_password_length: "パスワードの最小の長さ" block_common_passwords: "最もよく使われている10,000個のパスワードを許可しない" @@ -684,10 +697,14 @@ ja: max_bookmarks_per_day: "ユーザが一日にブックマークできる最大数" max_edits_per_day: "ユーザが一日に編集できる最大数" max_topics_per_day: "ユーザが一日に作成できるトピックの最大数" + max_personal_messages_per_day: "ユーザーが1日に作成できるメッセージの最大数です。" max_invites_per_day: "ユーザが一日に招待できる最大数" max_topic_invitations_per_day: "ユーザが一日にトピックに招待できる最大数" + max_post_deletions_per_minute: "ユーザーが1分間に削除できる投稿の最大数です。" + max_post_deletions_per_day: "ユーザーが1日に削除できる投稿の最大数です。" 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: "削除されたアップロードファイルが完全削除されるまでの猶予期間 (単位:日)。" @@ -695,7 +712,6 @@ ja: s3_upload_bucket: "ファイルをアップロードする Amazon S3のバケット名。 警告: 小文字である必要があり、ピリオドとアンダースコアを含むことはできません" s3_access_key_id: "画像をアップロードするAmazonS3のaccess key id" s3_secret_access_key: "画像をアップロードする Amazon S3 の secret access key" - s3_region: "画像をアップロードする Amazon S3 のリージョン名" s3_cdn_url: "s3アセットに利用するCDNのURL(例: https://cdn.somewhere.com) 警告: 変更後は過去の投稿をrebakeする必要があります" avatar_sizes: "自動生成するアバターサイズのリスト" external_system_avatars_enabled: "外部のアバターシステムサービスを使用します。" diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml index db5f1a0f26..dfeaf9bdb3 100644 --- a/config/locales/server.ko.yml +++ b/config/locales/server.ko.yml @@ -809,7 +809,6 @@ ko: summary_posts_required: "하나의 글타래에 대하여 요약본 보기 모드가 활성화되기 전까지 요구되는 최소 글 수" summary_likes_required: "하나의 글타래에 대하여 요약본 보기 모드가 활성화되기 전까지 요구되는 최소 좋아요 수" summary_percent_filter: "요약본 보기를 클릭시, 글 중에 몇 %의 상위 글을 보여줄 것인가?" - summary_max_results: "이 주제에 대한 요약 글 최대 갯수" enable_long_polling: "Message bus used for notification can use long polling" long_polling_base_url: "long polling에 사용 될 Base URL (CDN이 동적 콘텐트를 제공할 시에는 origin pull로 설정) eg: http://origin.site.com" long_polling_interval: "보낼 데이터가 없을 때 응답 전에 서버가 기다려야하는 시간 (로그인된 유저 전용)" @@ -923,7 +922,6 @@ ko: s3_upload_bucket: "파일이 업로드 될 위치의 Amazon S3 bucket name. 경고: 소문자 알파벳만 허용되며 점 . 이나 밑줄문자 _ 가 없어야 함." s3_access_key_id: "이미지를 업로드 할 때 사용할 Amazon S3의 access key id" s3_secret_access_key: "이미지를 업로드 할 때 사용할 Amazon S3의 secret access key" - s3_region: "이미지를 업로드 할 때 사용할 Amazon S3 region" s3_cdn_url: "s3 에셋에 사용될 CDN URL (예: https://cdn.somewhere.com). 경고: 이 설정 뒤에는 모든 글을 다시 구워야rebake 합니다." avatar_sizes: "자동 생성 아바타 사이즈 목록" external_system_avatars_enabled: "외부 아바타 시스템을 사용하기" diff --git a/config/locales/server.nb_NO.yml b/config/locales/server.nb_NO.yml index ce707c3b43..1f7630ae0e 100644 --- a/config/locales/server.nb_NO.yml +++ b/config/locales/server.nb_NO.yml @@ -1017,7 +1017,6 @@ nb_NO: summary_posts_required: "Minste antall innlegg før 'Sammendrag for Emnet' aktiveres" summary_likes_required: "Minste antall 'likes' i et emne før 'Sammendrag for Emnet' aktiveres" summary_percent_filter: "Når en bruker klikker 'Summér Dette Emnet', vis topp % av innlegg" - summary_max_results: "Maksimalt antall innlegg som returneres av 'Oppsummer denne tråden'" num_spam_flags_to_silence_new_user: "Hvis en ny brukers innlegg flagges som spam av minst num_users_to_silence_new_user forskjellige brukere, skjul den nye brukerens innlegg og stans fremtidige innlegg. 0 for å deaktivere." num_users_to_silence_new_user: "Hvis en ny brukers innlegg flagges som spam num_spam_flags_to_silence_new_user ganger av dette antallet brukere, skjul den nye brukerens innlegg og stans fremtidige innlegg. 0 for å deaktivere." num_tl3_flags_to_silence_new_user: "Hvis en ny brukers innlegg flagges av num_tl3_users_to_silence_new_user forskjellige brukere med tillitsnivå 3, skjul alle den nye brukerens innlegg og stans fremtidige innlegg. 0 for å deaktivere." diff --git a/config/locales/server.nl.yml b/config/locales/server.nl.yml index c19c9799c4..6bfb874ac9 100644 --- a/config/locales/server.nl.yml +++ b/config/locales/server.nl.yml @@ -793,7 +793,6 @@ nl: summary_posts_required: "Minimale aantal berichten in een topic voordat 'Dit topic samenvatten' wordt ingeschakeld" summary_likes_required: "Minimale aantal likes in een topic voordat 'Dit topic samenvatten' wordt ingeschakeld" summary_percent_filter: "Wanneer een gebruiker op 'Dit topic samenvatten' klikt, de top % van berichten tonen" - summary_max_results: "Maximale aantal getoonde berichten in 'Dit topic samenvatten'" enable_long_polling: "Gebruikte 'message bus' voor melding kan 'long polling' gebruiken" long_polling_base_url: "Basis-URL voor 'long polling' (als een CDN dynamische inhoud aanbiedt, zorg er dan voor dat dit op 'origin pull' is ingesteld), zoals http://origin.site.com" long_polling_interval: "De hoeveelheid tijd die de server zou moeten wachten voordat het clients beantwoord als er geen data te verzenden is (alleen voor ingelogde gebruikers)" @@ -890,7 +889,6 @@ nl: s3_upload_bucket: "De naam van de Amazon S3 bucket waar bestanden naar worden geüpload. LET OP: moet bestaan uit kleine letters, zonder puntjes en geen underscores." s3_access_key_id: "Het Amazon S3 access key id dat wordt gebruikt voor het uploaden van afbeeldingen." s3_secret_access_key: "De Amazon S3 secret access key die wordt gebruikt voor het uploaden van afbeeldingen." - s3_region: "De naam van de Amazon S3 region die wordt gebruikt voor het uploaden van afbeeldingen." s3_cdn_url: "De CDN URL voor alle S3 assets (bijvoorbeeld: https://cdn.ergens.com). LETOP: na het wijzigen van deze instelling moeten je alle oude berichten rebaken." avatar_sizes: "Lijst van automatisch gegenereerde avatar groottes." external_system_avatars_enabled: "Gebruik een avatars service van een extern systeem." diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml index b3d10dc1c5..983d80ce6e 100644 --- a/config/locales/server.pl_PL.yml +++ b/config/locales/server.pl_PL.yml @@ -862,7 +862,6 @@ pl_PL: summary_posts_required: "Minimalna liczba wpisów w temacie zanim 'Podsumowanie tematu' jest dostępne" summary_likes_required: "Minimalna liczba polubień w temacie zanim 'Podsumowanie tematu' jest dostępne" summary_percent_filter: "Gdy użytkownik kliknie na 'Podsumowaniu tematu', pokaż % najlepszych wpisów" - summary_max_results: "Maksymalna liczba wpisów w 'Podsumowaniu tematu'" enable_long_polling: "Message bus used for notification can use long polling" long_polling_base_url: "Podstawowy URL używany dla long polling (kiedy CDN dostarcza dynamicznych treści, upewnij się że ustawiłeś to w origin pull) np.: http://origin.site.com" long_polling_interval: "Okres czasu jaki serwer powinien odczekać przed odpowiedzią klientowi kiedy nie ma danych do przesłania (tylko do zalogowanych użytkowników)" @@ -976,7 +975,6 @@ pl_PL: s3_upload_bucket: "Nazwa koszyka Amazon S3, do którego zostaną przesłane pliki. Ostrzeżenie: bez wielkich liter, kropek czy podkreślenia." s3_access_key_id: "Klucz dostępu Amazon S3, który zostanie użyty do przesyłania zdjęć." s3_secret_access_key: "Tajny klucz dostępu Amazon S3, który zostanie użyty do przesyłania zdjęć." - s3_region: "Nazwa obszaru Amazon S3, który zostanie użyty do przesyłania zdjęć." s3_cdn_url: "URL CDN używany dla wszystkich aktywów s3 (na przykład : https://cdn.somewhere.com). Ostrzeżenie: po zmianie tego ustawienia musisz ponownie przywrócić stare posty." avatar_sizes: "Lista automatycznie wygenerowanych rozmiarów awatarów." external_system_avatars_enabled: "Użyj zewnętrzny system awatarów." diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml index 0f5e9acca6..4b40ccb385 100644 --- a/config/locales/server.pt.yml +++ b/config/locales/server.pt.yml @@ -34,10 +34,15 @@ pt: disable_remote_images_download_reason: "A transferência remota de imagens foi desativada porque não existe espaço disponível no disco." anonymous: "Anónimo" remove_posts_deleted_by_author: "Eliminado pelo autor" + redirect_warning: "Não fomos capazes de verificar se a hiperligação que selecionou foi publicada no fórum. Se desejar continuar de qualquer maneira, selecione a hiperligação abaixo." on_another_topic: "Noutro tópico" themes: bad_color_scheme: "Não é possível atualizar o tema, esquema de cor inválido" other_error: "Ocorreu algo de errado ao atualizar o tema" + import_error: + generic: Ocorreu um erro durante a importação do tema + about_json: "Erro de Importação: about.json não existe ou é inválido" + about_json_values: "about.json possui valores inválidos: %{errors}" errors: component_no_user_selectable: "Components de um tema não podem ser seleccionados por um utilizador" component_no_default: "Components de um tema não podem ter o tema predefinido" @@ -55,6 +60,8 @@ pt: number_value_not_valid_min: "Deve ser maior ou igual a %{min}." number_value_not_valid_max: "Deve ser menor ou igual a %{max}." string_value_not_valid: "O novo valor não está dentro do intervalo permitido." + locale_errors: + invalid_yaml: "YAML de traduçaõ é inválido" emails: incoming: default_subject: "Este tópico precisa de um título" @@ -760,7 +767,6 @@ pt: summary_posts_required: "Número mínimo de mensagens num tópico antes que 'Resumir Este Tópico' seja ativo." summary_likes_required: "Número mínimo de gostos num tópico antes que 'Resumir Este Tópico' seja ativo." summary_percent_filter: "Quando um utilizador clica em 'Resumir Este Tópico', mostrar as melhores % de mensagens" - summary_max_results: "Número máximo de mensagens devolvidas por 'Resumo deste Tópico'" enable_long_polling: "O sistema de mensagens usado para notificações pode fazer solicitações longas" long_polling_base_url: "URL base usada para solicitação ao servidor (quando um CDN serve conteúdo dinâmico, certifique-se de configurá-lo para a 'pull' original) ex: http://origem.sítio.com" long_polling_interval: "Quantidade de tempo que um servidor deve esperar antes de notificar os clientes quando não há dados para serem enviados (apenas utilizadores ligados)" @@ -865,7 +871,6 @@ pt: s3_upload_bucket: "Nome do balde da Amazon S3 que contém os ficheiros carregados. AVISO: tem que ser minúsculo, sem pontos e sem sublinhados." s3_access_key_id: "Id da chave de acesso Amazon S3 que será usada para carregar imagens." s3_secret_access_key: "Chave de acesso secreta Amazon S3 que será usada para carregar imagens." - s3_region: "Nome da região Amazon S3 que será usada para carregar imagens." s3_cdn_url: "O URL CDN a ser usado para todos os recursos s3 (por exemplo: https://cdn.somewhere.com). AVISO: após alterar esta configuração deve refazer as últimas mensagens." avatar_sizes: "Lista de tamanhos de avatar gerados automaticamente." external_system_avatars_enabled: "Utilize o serviço do sistema externo de avatars." diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml index 63621289a3..116db16dad 100644 --- a/config/locales/server.pt_BR.yml +++ b/config/locales/server.pt_BR.yml @@ -1008,7 +1008,6 @@ pt_BR: summary_posts_required: "Mensagens mínimas em um tópico antes de 'Resumir este tópico' ficar habilitado" summary_likes_required: "Curtidas mínimas em um tópico antes de 'Resumir este tópico, ficar habilitado" summary_percent_filter: "Quando um usuário clicar em 'Resumor este tópico', mostrar os melhores % mensagens" - summary_max_results: "Máximo número de posts quando resumidos por Categoria " enable_personal_messages: "Permitir que o nível de confiança 1 (configurável por meio do nível mínimo de confiança para enviar mensagens) os usuários criem mensagens e respondam a mensagens. Note que a equipe sempre pode enviar mensagens, não importa o quê." enable_system_message_replies: "Permite que os usuários respondam às mensagens do sistema, mesmo se as mensagens pessoais estiverem desativadas" enable_long_polling: "O sistema de mensagens das notificações pode fazer solicitações longas." @@ -1110,7 +1109,6 @@ pt_BR: automatic_backups_enabled: "Realizar backups automáticos, como definido na frequência de backup" backup_frequency: "O número de dias entre os backups." s3_backup_bucket: "O repositório remoto para realizar backups. AVISO: Certifique-se de que é um repositório privado." - s3_endpoint: "O endpoint pode ser modificado para fazer backup em um serviço compatível com S3, como DigitalOcean Spaces ou Minio. AVISO: use o padrão se estiver usando o AWS S3" s3_force_path_style: "Implemente o endereçamento de estilo de caminho para seu endpoint personalizado. IMPORTANTE: Necessário para usar uploads e backups do Minio." s3_disable_cleanup: "Desabilitar a remoção de backups na S3 quando removidos localmente." backup_time_of_day: "Hora do dia, em UTC, quando o backup deve ocorrer." @@ -1154,7 +1152,6 @@ pt_BR: s3_upload_bucket: "Nome do bucket da Amazon S3 no qual os arquivos serão enviados. AVISO: precisa ser em minúsculas, sem pontos, sem underscores." s3_access_key_id: "A id da chave de acesso da Amazon S3 que será usada para fazer upload de imagens." s3_secret_access_key: "O segredo da chave de acesso da Amazon S3 que será usada para fazer upload de imagens." - s3_region: "O nome da região da Amazon S3 que será usada para fazer upload de imagens." s3_cdn_url: "O endereço do CDN para usar para todos artefatos do s3 (por exemplo: https://cdn.algumlugar.com). AVISO: depois de mudar esta configuração você deve reconverter todas mensagens antigas." avatar_sizes: "Lista de tamanhos de avatar gerados automaticamente." external_system_avatars_enabled: "Usar serviço de avatar externo." diff --git a/config/locales/server.ro.yml b/config/locales/server.ro.yml index 444db9a543..0d5f5fe7c5 100644 --- a/config/locales/server.ro.yml +++ b/config/locales/server.ro.yml @@ -755,7 +755,6 @@ ro: 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_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)" @@ -861,7 +860,6 @@ ro: 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" diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index ce311a892b..1443978c54 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -959,6 +959,7 @@ ru: site_settings: censored_words: "Слова, которые будут автоматически заменены на ■■■■" delete_old_hidden_posts: "Автоматически удалять сообщения, скрытые дольше чем 30 дней." + default_locale: "Язык по умолчанию для этого экземпляра Discourse" allow_user_locale: "Позволять пользователям выбирать язык интерфейса" min_post_length: "Минимально допустимое количество символов в одном сообщении." min_first_post_length: "Минимально допустимое количество символов в первом сообщении (или теле темы)" @@ -972,6 +973,9 @@ ru: educate_until_posts: "Количество первых сообщений новых пользователей, для которых необходимо показывать всплывающую подсказку с советами для новичков." title: "Название этого сайта. Будет использоваться в HTML-тэге title." site_description: "Опишите сайт одним предложением для использования описания в мета-теге description." + short_site_description: "Краткое описание, используемое в теге заголовка на главной странице" + contact_email: "E-mail адрес ключевого контактного лица, ответственного за этот сайт. Используется для критических уведомлений, или срочные обращения через контактную форму на странице /about." + contact_url: "Контактный URL этого сайта. Использованный на странице /about для срочных вопросов." crawl_images: "Скачивать картинки с других сайтов для автоматического определения их размеров." download_remote_images_to_local: "Скачивать картинки, вставленные в сообщения ссылками на другие сайты, и хранить их локально, чтобы предотвратить их изменения или утерю." download_remote_images_threshold: "Минимальное доступное место на диске (в процентах), при котором разрешено автоматическое скачивание картинок для локального хранения." @@ -994,7 +998,6 @@ ru: summary_posts_required: "Минимальное количество сообщение в теме для активации кнопки \"Сводка по теме\"" summary_likes_required: "Минимальное количество симпатий в теме для активации кнопки \"Сводка по теме\"" summary_percent_filter: "При нажатии на кнопку \"Сводка по теме\", показывать лучшие % сообщений" - summary_max_results: "Максимальное количество сообщений, выводимых в 'Обзоре темы'" enable_system_message_replies: "Позволяет пользователям отвечать на системные сообщения, даже если личные сообщения отключены" enable_long_polling: "Использовать механизм long polling для уведомлений о событиях" long_polling_base_url: "Базовый URL, используемый для long polling (при использовании CDN для раздачи динамического контента установите в этом параметре адрес origin pull), например: http://origin.site.com" @@ -1063,6 +1066,10 @@ ru: max_topics_per_day: "Максимальное количество тем, которые пользователь может создать за один день." max_invites_per_day: "Максимальное количество приглашений, которое может отправить пользователь за один день." max_topic_invitations_per_day: "Максимальное количество приглашений в тему, которое может отправить пользователь в течении дня." + max_logins_per_ip_per_hour: "Максимальное количество входов в систему на IP-адрес в час" + max_logins_per_ip_per_minute: "Максимальное количество входов в систему на IP-адрес в минуту" + max_post_deletions_per_minute: "Максимальное количество записей, которые пользователь может удалить за минуту." + max_post_deletions_per_day: "Максимальное количество записей, которые пользователь может удалить за день." alert_admins_if_errors_per_minute: "Количество ошибок в минуту для предупреждения администратора. Значение 0 отключает эту опцию. ВНИМАНИЕ: требуется перезагрузка." alert_admins_if_errors_per_hour: "Количество ошибок в час для предупреждения администратора. Значение 0 отключает эту опцию. ВНИМАНИЕ: требуется перезагрузка." categories_topics: "Количество тем, отображаемых на странице разделов." @@ -1076,7 +1083,6 @@ ru: s3_upload_bucket: "Имя Amazon S3 bucket куда будут загружаться файлы. ВНИМАНИЕ: должно быть в нижнем регистре, без пробелов, без подчеркиваний.\nhttp://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html" s3_access_key_id: "Amazon S3 access key для загрузки и хранения изображений" s3_secret_access_key: "Amazon S3 secret key для загрузки и хранения изображений" - s3_region: "Географический регион Amazon S3, который будет использоваться для хранения изображений" avatar_sizes: "Список автоматически сгенерированных размеров аватар." allow_all_attachments_for_group_messages: "Разрешить все почтовые вложения для групповых сообщений." enable_flash_video_onebox: "Разрешить умную вставку ссылок sqf и flv (Adobe Flash). ВНИМАНИЕ: повышает риски безопасности сайта." @@ -1094,6 +1100,7 @@ ru: tl2_requires_topic_reply_count: "В скольких темах пользователь должен ответить для продвижения до уровня доверия 2." tl3_requires_topics_viewed: "Какой процент созданных тем за последние (tl3 time period) дней должен иметь пользователь для повышения уровня доверия до 3. (от 0 до 100)" tl3_requires_posts_read: "Какой процент созданных сообщений за последние (tl3 time period) дней должен иметь пользователь для повышения уровня доверия до 3. (от 0 до 100)" + tl3_requires_posts_read_cap: "Максимально необходимое количество постов, прочитанных за последние (период времени tl3) дней." tl3_requires_topics_viewed_all_time: "Сколько сообщений пользователь должен прочитать для поднятия уровня доверия до 3." tl3_requires_posts_read_all_time: "Сколько сообщений пользователь должен прочитать для поднятия уровня доверия до 3." tl3_promotion_min_duration: "Минимальное количество дней , в течении которых пользователь с уровнем доверия 3 не может быть понижен до урованя доверия 2." @@ -1178,6 +1185,7 @@ ru: allow_animated_thumbnails: "Генерировать анимированные миниатюры gif-картинок." default_avatars: "URL для аватара, который будет использован по умолчанию для новых пользователей, пока они не изменят его." automatically_download_gravatars: "Скачивать аватарку Gravatar пользователя во время создания учетной записи или изменения e-mail." + digest_posts: "Максимальное количество популярных постов для отображения в резюме по электронной почте." email_link_color: "Цвет ссылок в HTML письмах. Введите название цвета ('blue') или hex значение ('#0000FF')." detect_custom_avatars: "Проверять ли, что пользователи загрузили свои собственные картинки профиля (аватарки)." max_daily_gravatar_crawls: "Максимальное количество загрузок аватаорок с Gravatar за один день" @@ -1208,6 +1216,8 @@ ru: enable_emoji: "Активировать смайлы Emoji" emoji_set: "Какую коллекцию Emoji использовать?" approve_unless_trust_level: "Сообщения для пользователей ниже этого уровня доверия подлежат проверки" + auto_close_messages_post_count: "Максимальное количество постов, разрешенных в сообщении до его автоматического закрытия (0 для отключения)" + auto_close_topics_post_count: "Максимальное количество постов, разрешенных в теме до ее автоматического закрытия (0 для отключения)" max_allowed_message_recipients: "Максимальное число получателей сообщения." default_email_mailing_list_mode: "По умолчанию присылать почтовое уведомление, когда появляется новое сообщение." default_other_auto_track_topics_after_msecs: "Глобальное время по умолчанию перед автоматическим отслеживанием темы." diff --git a/config/locales/server.sk.yml b/config/locales/server.sk.yml index a1270cacdf..46724bfc0a 100644 --- a/config/locales/server.sk.yml +++ b/config/locales/server.sk.yml @@ -739,7 +739,6 @@ sk: summary_posts_required: "Minimálny počet príspevkou predtým ako je zapnuté 'Sumarizuj túto tému'" summary_likes_required: "Minimálny počet páči sa mi predtým ako je zapnuté 'Sumarizuj túto tému'" summary_percent_filter: "Ak používateľ klikne na 'Sumarizuj túto tému', zobraz najlepších % príspevkov" - summary_max_results: "Maximálny počet príspevkov vrátených pomocou 'Sumarizuj túto tému'" enable_long_polling: "Zbernica správ pre upozornenia môže používať techniku long-polling" long_polling_base_url: "Base URL used for long polling (when a CDN is serving dynamic content, be sure to set this to origin pull) eg: http://origin.site.com" long_polling_interval: "Ako dlho má server čakať pred odpovedaním klientom ak nie sú na zaslanie žiadne dáta (iba pre prihlásených používateľov)" @@ -827,7 +826,6 @@ sk: s3_upload_bucket: "Amazon S3 bucket name, do ktorého budú nahraté súbory. POZOR: musí byť malými písmenami, žiadne bodky a žiadne podtržítka." s3_access_key_id: "Amazon S3 access key id, ktoré bude použité pre nahrávanie obrázkov." s3_secret_access_key: "Amazon S3 secret access key, ktorý bude použitý pre nahrávanie obrázkov." - s3_region: "Amazon S3 region name, ktorý bude použitý pre nahrávanie súborov." s3_cdn_url: "CDN URL ktoré sa použije na všetky dáta v s3 (napríklad https://cdn.niekde.com). VAROVANIE: po zmene tohoto nastavenia musíte použiť príkaz rebake na všetky staré príspevky." avatar_sizes: "Zoznam automaticky generovaných veľkostí avatarov." external_system_avatars_enabled: "Použiť externú avatar službu." diff --git a/config/locales/server.sl.yml b/config/locales/server.sl.yml index 62e5f76765..c5b4230912 100644 --- a/config/locales/server.sl.yml +++ b/config/locales/server.sl.yml @@ -28,6 +28,9 @@ sl: posts: "prispevkov" loading: "Nalagam" log_in: "Vpis" + emails: + incoming: + maximum_staged_user_per_email_reached: "Dosegli največje število prirejenih uporabnikov na e-sporočilo." errors: &errors messages: taken: "je že uporabljeno" @@ -67,7 +70,7 @@ sl:Drugače lahkozamenjate geslo.
user_exists: "Ni potrebe za povabilo %{email}, ker je že prijavljen!" - confirm_email: "Ste skoraj koncu! Poslali smo vam aktivacijsko e-sporočilo na vaš e-naslov. Sledite navodilom v e-sporočilu za aktivacijo računa.
Če e-sporočila ne prejmete, preverite predal z vsiljeno pošto.
" + confirm_email: "Ste skoraj na koncu! Poslali smo vam aktivacijsko e-sporočilo na vaš e-naslov. Sledite navodilom v e-sporočilu za aktivacijo računa.
Če e-sporočila ne prejmete, preverite predal z vsiljeno pošto.
" topic_invite: failed_to_invite: "Uporabnika ne moremo povabiti v to temo ker ni član ene od naslednjih skupin uporabnikov: %{group_names}." user_exists: "Uporabnik je bil že povabljen. Uporabnika lahko povabite na vsako temo samo enkrat." @@ -183,6 +186,8 @@ sl: unique_characters: "vsebuje preveč enakih znakov. Uporabite bolj varno geslo." staff_category_name: "Osebje" staff_category_description: "Privatna kategorija za diskusije osebja foruma. Teme so vidne samo administratorjem in moderatorjem." + lounge_welcome: + title: "Dobrodošli v loži" category: uncategorized_description: "Teme, ki ne potrebujejo kategorijo ali ne sodijo v nobeno obstoječo kategorijo." trust_levels: @@ -281,8 +286,13 @@ sl: success_unapproved: "Uspešno ste zamenjali geslo." email_login: invalid_token: "Povezava za prijavo je potekla. Izberite gumb Prijava in uporabite 'Pozabil sem geslo' da dobite novo povezavo." + title: "Prijava z e-naslovom" + change_email: + error_staged: "Prišlo je do napake pri menjavi vašega e-naslova. E-naslov je že v uporabi s strani prirejenega uporabnika." activation: + please_continue: "Vaš nov uporabniški račun je potrjen - preusmerjeni boste na začetno stran." welcome_to: "Dobrodošli na %{site_name}!" + approval_required: "Moderator mora ročno potrditi vaš nov uporabniški račun da boste lahko dostopali do foruma. Ko bo račun potrjen boste prejeli e-sporočilo." post_action_types: off_topic: description: "Prispevek ne ustreza pogovoru v tej temi kot je definiran z naslovom teme in prvim prispevkom v temi in bi verjetno sodil nekam drugam." @@ -344,6 +354,9 @@ sl: original_poster: "Originalni avtor" most_recent_poster: "Zadnji odgovarja" frequent_poster: "Pogosto odgovarja" + redirected_to_top_reasons: + new_user: "Dobrodošli v naši skupnosti! To so najbolj popularne teme zadnjih dni." + not_seen_in_a_month: "Dobrodošli nazaj! Nekaj časa vas nismo videli. To so najbolj popularne teme od kar vas ni bilo." merge_posts: edit_reason: one: "%{count} prispevek združena od %{username}" @@ -434,11 +447,44 @@ sl: other: "Ta tema se je samodejno odprla %{count} minut po zadnjem odgovoru." auto_deleted_by_timer: "Samodejno izbrisana s strani opomnika." login: + not_approved: "Vaš račun še ni bil potrjen. Obveščeni boste preko e-sporočila ko bo račun pripravljen za prijavo." + incorrect_username_email_or_password: "Napačno uporabniško ime, e-naslov ali geslo" + incorrect_password: "Napačno geslo" wait_approval: "Hvala za registracijo. Obvestili vas bomo, ko bo vaš račun potrjen." - suspended_with_reason: "Suspendiran račun do%{date}: %{reason}" + active: "Vaš uporabniški račun je aktiviran in pripravljen za uporabo." + activate_email: "Ste skoraj na koncu! Poslali smo vam aktivacijsko e-sporočilo na %{email}. Sledite navodilom v e-sporočilu za aktivacijo računa.
Če e-sporočila ne prejmete, preverite predal z vsiljeno pošto.
" + not_activated: "Prijava z vašim računom še ni mogoča. Poslali smo vam aktivacijsko e-sporočilo. Sledite navodilom v e-sporočilu za aktivacijo računa." + not_allowed_from_ip_address: "Ne morete se prijaviti kot %{username} iz tega IP naslova." + admin_not_allowed_from_ip_address: "Ne morete se prijaviti kot administrator iz tega IP naslova." + suspended: "Ne morete se prijaviti do %{date}." + suspended_with_reason: "Suspendiran račun do %{date}: %{reason}" + errors: "%{errors}" + not_available: "Ni na voljo. Poskusite %{suggestion}?" + something_already_taken: "Prišlo je do napake, mogoče je uporabniško ime ali e-naslov že registriran. Poskusite povezavo za pozabljeno geslo." + omniauth_error: "Prišlo je do napake pri preverjanju vašega računa. Mogoče niste potrdili avtorizacije?" + omniauth_error_unknown: "Prišlo je do napake pri vaši prijavi, prosimo poskusite ponovno." + authenticator_error_no_valid_email: "E-naslov povezan z računom %{account} ni dovoljen. Morali boste uporabiti drug e-naslov." + new_registrations_disabled: "Nove registracije uporabniških računov trenutno niso mogoče." + password_too_long: "Geslo je omejeno na 200 znakov." + email_too_long: "Vaš e-naslov je predolg. E-naslov je lahko dolg največ 254 znakov, od tega domena največ 253 znakov." + reserved_username: "Uporabniško ime ni dovoljeno." + missing_user_field: "Niste vnesli vseh uporabniških podatkov." + auth_complete: "Avtentikacija je končana." + click_to_continue: "Kliknite tukaj za nadaljevanje." + already_logged_in: "Izgleda da hočete sprejeti povabilo od drugega uporabnika. Če niste %{current_user}, se odjavite in poskusite ponovno." + second_factor_title: "Potrjevanje v dveh korakih" + second_factor_description: "Vnesite potrditveno kodo iz vaše aplikacije:" + second_factor_backup_description: "Vnesite eno od vaših rezervnih potrditvenih kod:" + second_factor_backup_title: "Rezervna potrditvena koda" + invalid_second_factor_code: "Neustrezna potrditvena koda. Vsaka potrditvena koda je lahko uporabljena samo enkrat." + second_factor_toggle: + totp: "Namesto tega uporabite authenticator aplikacijo" + backup_code: "Namesto tega uporabite rezervno potrditveno kodo" user: ip_address: max_new_accounts_per_registration_ip: "Nove registracije uporabnika niso več dovoljene z vašega IP naslova (dosežena je omejitev regitracij). Kontaktirajte člana osebja foruma." + destroy_reasons: + unused_staged_user: "Neuporabljen prirejen uporabnik" flags_reminder: flags_were_submitted: one: "Prijave so bile podane več kot %{count} uro nazaj. [Prosimo, preglejte prijave](%{base_path}/admin/flags)." @@ -451,9 +497,9 @@ sl: few: "%{count} prijave čakajo na pregled" other: "%{count} prijav čaka na pregled" invite_mailer: - subject_template: "%{inviter_name} vas je povabil(a) da sodelujete v '%{topic_title}' na %{site_domain_name}" + subject_template: "%{inviter_name} vas je povabil da sodelujete v '%{topic_title}' na %{site_domain_name}" text_body_template: | - %{inviter_name} vas je povabil(a) da sodelujete v + %{inviter_name} vas je povabil da sodelujete v > **%{topic_title}** > @@ -467,9 +513,9 @@ sl: %{invite_link} custom_invite_mailer: - subject_template: "%{inviter_name} vas je povabil(a) da sodelujete v '%{topic_title}' na %{site_domain_name}" + subject_template: "%{inviter_name} vas je povabil da sodelujete v '%{topic_title}' na %{site_domain_name}" text_body_template: | - %{inviter_name} vas je povabil(a) da sodelujete v + %{inviter_name} vas je povabil da sodelujete v > **%{topic_title}** > @@ -487,9 +533,9 @@ sl: %{invite_link} invite_forum_mailer: - subject_template: "%{inviter_name} vas je povabil(a) da se pridružite %{site_domain_name}" + subject_template: "%{inviter_name} vas je povabil da se pridružite %{site_domain_name}" text_body_template: | - %{inviter_name} vas je povabil(a) da se pridružite + %{inviter_name} vas je povabil da se pridružite > **%{site_title}** > @@ -499,9 +545,9 @@ sl: %{invite_link} custom_invite_forum_mailer: - subject_template: "%{inviter_name} vas je povabil(a) da se pridružite %{site_domain_name}" + subject_template: "%{inviter_name} vas je povabil da se pridružite %{site_domain_name}" text_body_template: | - %{inviter_name} vas je povabil(a) da se pridružite + %{inviter_name} vas je povabil da se pridružite > **%{site_title}** > @@ -533,7 +579,11 @@ sl: few: "Ta tema je začasno zaprta za najmanj %{count} ure, ker je prejela veliko število prijav s strani članov skupnosti." other: "Ta tema je začasno zaprta za najmanj %{count} ur, ker je prejela veliko število prijav s strani članov skupnosti." system_messages: + private_topic_title: "Tema #%{id}" + contents_hidden: "Obiščite prispevek da vidite vsebino" post_hidden: + title: "Prispevek skrit" + subject_template: "Prispevek je bil skrit zaradi prijav iz skupnosti" text_body_template: | Pozdravljeni, @@ -549,6 +599,8 @@ sl: Za dodatna navodila preberite [pravila skupnosti](%{base_url}/guidelines). post_hidden_again: + title: "Prispevek ponovno skrit" + subject_template: "Prispevek je bil ponovno skrit zaradi prijav iz skupnosti zato smo obvestili osebje" text_body_template: | Pozdravljeni, @@ -562,6 +614,8 @@ sl: Za dodatna navodila preberite [pravila skupnosti](%{base_url}/guidelines). flags_agreed_and_post_deleted: + title: "Prijavljen prispevek odstranjen s strani osebja" + subject_template: "Prijavljen prispevek odstranjen s strani osebja" text_body_template: | Pozdravljeni, @@ -584,6 +638,8 @@ sl: S časom vas bomo bolje spoznali in bomo vaše začasne omejitve novega uporabnika odstranili. Čez čas boste lahko dosegli [nivo zaupanja](https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/), ki vam bo omogočal več dejanj s katerimi skupaj upravljamo našo skupnost. welcome_user: + title: "Dobrodošel uporabnik" + subject_template: "Dobrodošli na %{site_name}!" text_body_template: | Hvala za prijavo na %{site_name} in dobrodošli! @@ -592,7 +648,15 @@ sl: Ker podpiramo prijazno komunikacijo, želimo da spoštujete [pravila skupnosti](%{base_url}/guidelines). Lepo se imejte v naši družbi! + welcome_tl1_user: + title: "Dobrodošli na nivoju zaupanja 1!" + subject_template: "Zahvaljujemo se vam, ker nas spremljate" + text_body_template: | + Pozdravljeni! Vidimo da ste pridno spremljali naš forum, kar je super. Zato smo vam povišali [nivo zaupanja!](https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/) + + Vesili smo, da ste med nami in bi radi več vedeli o vas. Vzemite si čas in [izpolnite svoj profil](%{base_url}/my/preferences/profile) ali [začnite novo temo](%{base_url}/categories). welcome_invite: + title: "Dobrodošel povabljeni" subject_template: "Dobrodošli na %{site_name}!" text_body_template: | Hvala da ste sprejeli povabilo na %{site_name} -- dobrodošli! @@ -608,6 +672,52 @@ sl: Lepo se imejte v naši družbi! [prefs]: %{user_preferences_url} + backup_succeeded: + title: "Varnostna kopija uspela" + subject_template: "Varnostna kopija uspela" + text_body_template: | + Varnostna kopija uspela. + + Pojdite v [admin > backup section](%{base_url}/admin/backups) za prenos vaše nove varnostne kopije. + + Tukaj je dnevnik: + + ``` text + %{logs} + ``` + backup_failed: + title: "Varnostna kopija ni uspela" + subject_template: "Varnostna kopija ni uspela" + text_body_template: | + Varnostna kopija ni uspela. + + Tukaj je dnevnik: + + ``` text + %{logs} + ``` + restore_succeeded: + title: "Obnovitev iz varnostne kopije uspela" + subject_template: "Obnovitev iz varnostne kopije uspela" + text_body_template: | + Obnovitev iz varnostne kopije uspela. + + Tukaj je dnevnik: + + ``` text + %{logs} + ``` + restore_failed: + title: "Obnovitev iz varnostne kopije ni uspela" + subject_template: "Obnovitev iz varnostne kopije ni uspela" + text_body_template: | + Obnovitev iz varnostne kopije ni uspela. + + Tukaj je dnevnik: + + ``` text + %{logs} + ``` bulk_invite_succeeded: title: "Množično povabilo je uspelo" subject_template: "Množično povabilo uporabnikov je uspelo" @@ -677,6 +787,13 @@ sl: [Preverite prijave](%{base_url}/admin/flags). Če je bil uporabnik %{username} po nepotrebnem utišan, kliknite gumb Ukini utišanje uporabnika na [admin strani uporabnika](%{user_url}). Ta nastavitev se lahko sprememni preko `silence_new_user` nastavitve. + unsilenced: + text_body_template: | + Pozdravljeni, + + To samodejno sporočilo od %{site_name} vas obvešča da vaš račun ni več zadržan za pregled s strani osebja. + + Sedaj lahko odgovarjate in ustvarite nove teme. Hvala za potrpežljivost. pending_users_reminder: subject_template: one: "%{count} uporabnik čaka na potrditev" @@ -687,6 +804,13 @@ sl: Novo registrirani uporabniki čakajo na potrditev (ali zavrnitev) preden lahko dostopajo do foruma.. [Preverite jih v Admin delu](%{base_url}/admin/users/list/pending). + new_user_of_the_month: + text_body_template: | + Čestitamo, osvojili ste **Nov uporabnik meseca %{month_year}**. :trophy: + + Ta nagrada je podeljena dvem novim uporabnikom vsak mesec in bo stalno vidna na [seznamu značk](%{url}). + + Hitro ste poslali pomemben član skupnosti. Zahvaljujemo se vam za pridružitev in nadaljujte z dobrim delom! queued_posts_reminder: subject_template: one: "%{count} prispevek čaka na pregled" @@ -697,16 +821,28 @@ sl: Za odjavo od takšnih e-sporočil [kliknite tukaj](%{unsubscribe_url}). unsubscribe_link_and_mail: | Za odjavo od takšnih e-sporočil [kliknite tukaj](%{unsubscribe_url}). + email_from: "%{user_name} preko %{site_name}" user_notifications: previous_discussion: "Prejšnji odgovori" + reached_limit: + one: "Opozorilo: na dan vam pošljemo največ %{count} e-sporočilo. Preverite na forumu tudi preostale, ki vam jih nismo poslali. P.S. Čestitamo za popularnost!" + two: "Opozorilo: na dan vam pošljemo največ %{count} e-sporočili. Preverite na forumu tudi preostale, ki vam jih nismo poslali. P.S. Čestitamo za popularnost!" + few: "Opozorilo: na dan vam pošljemo največ %{count} e-sporočila. Preverite na forumu tudi preostale, ki vam jih nismo poslali. P.S. Čestitamo za popularnost!" + other: "Opozorilo: na dan vam pošljemo največ %{count} e-sporočil. Preverite na forumu tudi preostale, ki vam jih nismo poslali. P.S. Čestitamo za popularnost!" in_reply_to: "V odgovor na" unsubscribe: title: "Odjavi" + description: "Nočete prejemati takšnih e-sporočil? Ni problema! Kliknite spodaj za takojšno odjavo:" reply_by_email: "[Pojdi na temo](%{base_url}%{url}) ali odgovori na to e-sporočilo da odgovorite." reply_by_email_pm: "[Pojdi na sporočilo](%{base_url}%{url}) ali odgovori na to e-sporočilo da odgovorite %{participants}." + only_reply_by_email: "Odgovori na to e-sporočilo da odgovorite." + only_reply_by_email_pm: "Odgovori na to e-sporočilo da odgovorite %{participants}." + visit_link_to_respond: "[Pojdi na temo](%{base_url}%{url}) da odgovorite." visit_link_to_respond_pm: "[Pojdi na sporočilo](%{base_url}%{url}) da odgovorite %{participants}." + posted_by: "Objavljeno od %{username}ob %{post_date}" + pm_participants: "Sodelujoči: %{participants}" invited_group_to_private_message_body: | - %{username} je povabil(a) @%{group_name} da sodeluje v + %{username} je povabil @%{group_name} da sodeluje v > **%{topic_title}** > @@ -716,7 +852,7 @@ sl: > %{site_title} -- %{site_description} invited_to_private_message_body: | - %{username} vas je povabil(a) da sodelujete v + %{username} vas je povabil da sodelujete v > **%{topic_title}** > @@ -726,7 +862,7 @@ sl: > %{site_title} -- %{site_description} invited_to_topic_body: | - %{username} vas je povabil(a) da sodelujete v + %{username} vas je povabil da sodelujete v > **%{topic_title}** > @@ -736,13 +872,157 @@ sl: > %{site_title} -- %{site_description} user_invited_to_private_message_pm_group: - subject_template: "[%{email_prefix}] %{username} je povabil(a) @%{group_name} da sodelujete v '%{topic_title}'" + title: "Uporabnik je povabil skupino v ZS" + subject_template: "[%{email_prefix}] %{username} je povabil @%{group_name} da sodelujete v '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} user_invited_to_private_message_pm: - subject_template: "[%{email_prefix}] %{username} vas je povabil(a) da sodelujete v '%{topic_title}'" + title: "Uporabnik je povabil v ZS" + subject_template: "[%{email_prefix}] %{username} vas je povabil da sodelujete v '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} user_invited_to_private_message_pm_staged: - subject_template: "[%{email_prefix}] %{username} vas je povabil(a) da sodelujete v '%{topic_title}'" + title: "Uporabnik je povabil v ZS prirejeni" + subject_template: "[%{email_prefix}] %{username} vas je povabil da sodelujete v '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} user_invited_to_topic: title: "Uporabnik povabljen v temo" + subject_template: "[%{email_prefix}] %{username} vas je povabil v temo '%{topic_title}'" + text_body_template: | + %{header_instructions} + + %{message} + + %{respond_instructions} + user_replied: + title: "Uporabnik je odgovoril" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_replied_pm: + title: "Uporabnik je odgovoril na ZS" + subject_template: "[%{email_prefix}] [ZS] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_quoted: + title: "Uporabnik je citiral" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_linked: + title: "Uporabnik je povezal" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_mentioned: + title: "Uporabnik je omenil" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_mentioned_pm: + title: "Uporabnik je omenil ZS" + subject_template: "[%{email_prefix}] [ZS] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_group_mentioned: + title: "Uporabnik je omenil skupino" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_posted: + title: "Uporabnik je objavil" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_watching_first_post: + title: "Uporabnik opazuje prvi prispevek" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_posted_pm: + title: "Uporabnik je objavil ZS" + subject_template: "[%{email_prefix}] [ZS] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_posted_pm_staged: + title: "Uporabnik je objavil ZS prirejeni" + subject_template: "%{optional_re}%{topic_title}" + text_body_template: |2 + + %{message} account_suspended: title: "Suspendiran račun" subject_template: "[%{email_prefix}] Vaš uporabniški račun je bil suspendiran" @@ -752,58 +1032,123 @@ sl: %{reason} %{message} + account_silenced: + title: "Utišan račun" + subject_template: "[%{email_prefix}] Vaš uporabniški račun je bil utišan" + text_body_template: | + Utišani ste bili na forumu do %{silenced_till}. + + %{reason} + + %{message} + account_exists: + title: "Račun že obstaja" + subject_template: "[%{email_prefix}] Račun že obstaja" + text_body_template: | + Poizkusili ste ustvariti račun na %{site_name} ali spremeniti e-naslov računa na %{email}, vendar račun s tem naslovom že obstaja. + + Če ste pozabili geslo [ga ponovno nastavite](%{base_url}/password-reset). + + Če niste vi poizkusili ustvariti račun %{email} ali spremeniti e-naslov, ne skrbite – to e-sporočilo lahko zanemarite. + + Če imate kakršnakoli vprašanja [kontaktirajte naše prijazno osebje](%{base_url}/about). account_second_factor_disabled: - text_body_template: "Preverjanje v dveh korakih je bilo onemogočeno na vašem računu pri %{site_name}. Sedaj se lahko prijavite samo z geslom - dodatna potrditvena koda ni več potrebna.\n\nČe niste sami izklopili preverjanje v dveh korakih je mogoče, da je nekdo posegel v vaš račun. \n\nČe imate kakršnakoli vprašanja, [kontaktirajte osebje foruma](%{base_url}/about).\n" + title: "Preverjanje v dveh korakih onemogočeno" + subject_template: "[%{email_prefix}] Preverjanje v dveh korakih onemogočeno" + text_body_template: "Preverjanje v dveh korakih je bilo onemogočeno na vašem računu pri %{site_name}. Sedaj se lahko prijavite samo z geslom - dodatna potrditvena koda ni več potrebna.\n\nČe niste sami izklopili preverjanje v dveh korakih je mogoče, da je nekdo posegel v vaš račun. \n\nČe imate kakršnakoli vprašanja [kontaktirajte naše prijazno osebje](%{base_url}/about).\n" digest: why: "Kratek povzetek %{site_link} od vašega zadnjega obiska %{last_seen_at}" since_last_visit: "Od vašega zadnjega obiska" new_topics: "Nove teme" unread_messages: "Neprebrana zasebna sporočila" unread_notifications: "Neprebrana obvestila" - liked_received: "Prejetih všečkov" - new_posts: "Novih prispevkov" - new_users: "Novih uporabnikov" - popular_topics: "Zanimivih tem" + liked_received: "Prejeti všečki" + new_posts: "Novi prispevki" + new_users: "Novi uporabniki" + popular_topics: "Zanimive teme" follow_topic: "Sledi tej temi" - join_the_discussion: "Preberi" + join_the_discussion: "Preberi več" popular_posts: "Zanimivi prispevki" more_new: "Novo za vas" - subject_template: "[%{email_prefix}] povzetek" - unsubscribe: "Ta povzetek je poslan s strani %{site_link}, ker vas nekaj časa ni bilo na strani. Spremenite %{email_preferences_link}, ali %{unsubscribe_link} za odjavo." + subject_template: "[%{email_prefix}] Povzetek" + unsubscribe: "Ta povzetek je poslan s strani %{site_link}, ker vas nekaj časa ni bilo na strani. Spremenite %{email_preferences_link} ali %{unsubscribe_link} za odjavo." your_email_settings: "vaše nastavitve e-pošte" - click_here: "klikni tukaj" - from: "%{site_name} povzetek" + click_here: "kliknite tukaj" + from: "%{site_name} Povzetek" preheader: "Strnjen povzetek od vašega zadnjega obiska %{last_seen_at}" + forgot_password: + title: "Pozabljeno geslo" + subject_template: "[%{email_prefix}] Ponastavi geslo" + text_body_template: | + Nekdo je zahteval zamenjavo gesla na [%{site_name}](%{base_url}). + + Če to niste bili vi, lahko zanemarite to e-sporočilo. + + Kliknite spodnjo povezavo za izbiro novega gesla: + %{base_url}/u/password-reset/%{email_token} email_login: + title: "Prijava s povezavo" + subject_template: "[%{email_prefix}] Prijava s povezavo" text_body_template: | Tukaj je vaša povezava za prijavo na [%{site_name}](%{base_url}). - Če niste vi zahtevali te povezave, lahko ignorirate to e-sporočilo. + Če niste vi zahtevali te povezave, lahko zanemarite to e-sporočilo. Za prijavo sledite povezavi: %{base_url}/session/email-login/%{email_token} set_password: + title: "Nastavi geslo" + subject_template: "[%{email_prefix}] Nastavi geslo" text_body_template: | Nekdo je zahteval dodajanje gesla na vašemu računu pri [%{site_name}](%{base_url}). Alternativno se lahko prijavite tudi s podprtimi zunanjimi računi (Google, Facebook...), ki se ujemajo z vašim e-naslovom. - Če niste vi podali te zahteve, lahko to e-sporočilo ignorirate. + Če niste vi podali te zahteve, lahko zanemarite to e-sporočilo. Sledite povezavi za izbiro gesla: %{base_url}/u/password-reset/%{email_token} admin_login: + title: "Admin prijava" + subject_template: "[%{email_prefix}] Prijava" text_body_template: | Nekdo je zahteval prijavo na vaš račun pri [%{site_name}](%{base_url}). - Če niste vi podali te zahteve, lahko to e-sporočilo ignorirate. + Če niste vi podali te zahteve, lahko zanemarite to e-sporočilo. Za prijavo sledite povezavi: %{base_url}/u/admin-login/%{email_token} account_created: + title: "Račun ustvarjen" + subject_template: "[%{email_prefix}] Vaš nov uporabniški račun" text_body_template: | Ustvarjen je bil nov uporabniški račun na %{site_name} - Spedite povezavi za nastavitev gesla za vaš novi uporabniški račun: + Sledite povezavi za nastavitev gesla za vaš novi uporabniški račun: %{base_url}/u/password-reset/%{email_token} + confirm_new_email: + title: "Potrdite nov e-naslov" + subject_template: "[%{email_prefix}] Potrdite vaš novi e-naslov" + text_body_template: | + Potrdite vaš nov e-naslov pri %{site_name} tako da sledite povezavi: + + %{base_url}/u/authorize-email/%{email_token} + confirm_old_email: + title: "Potrdite star e-naslov" + subject_template: "[%{email_prefix}] Potrdite vaš trenutni e-naslov" + text_body_template: | + Preden lahko spremenite vaš e-naslov, morate potrditi da imate nadzor nad vašim trenutnim e-naslovom. Po tem pa vam bomo omogočili potrditev novega e-naslova. + + Potrdite vaš trenutni e-naslov pri %{site_name} tako da sledite povezavi: + + %{base_url}/u/authorize-email/%{email_token} + notify_old_email: + title: "Obvesti stari e-naslov" + subject_template: "[%{email_prefix}] Vaš e-naslov je bil spremenjen" + text_body_template: | + To samodejno sporočilo vam sporoča da je bil vaš e-naslov pri %{site_name} spremenjen. Če je bilo spremenjeno po nesreči, obvestite administratorja strani. + + Vaš e-naslov je bil spremenjen v: + + %{new_email} signup_after_approval: title: "Registracija po potrditvi" subject_template: "Potrjeni ste bili na %{site_name}!" @@ -824,7 +1169,17 @@ sl: Lepo se imejte v naši družbi! signup: title: "Registracija" + subject_template: "[%{email_prefix}] Potrdite nov uporabniški račun" + text_body_template: | + Dobrodošli na %{site_name}! + + Sledite tej povezavi za aktivacijo vašega novega računa: + %{base_url}/u/activate-account/%{email_token} + + Če zgornja povezava ne reagira na klik, jo skopirajte v naslovno vrstico v vašem brskalniku. suspicious_login: + title: "Opozorilo nove prijave" + subject_template: "[%{site_name}] Opozorilo nove prijave iz %{location}" text_body_template: | Pozdravljeni, @@ -845,7 +1200,19 @@ sl: ## [Dobrodošli na %{title}](#welcome) Za dostop potrebujete uporabniški račun. Prosite obstoječega uporabnika, da vas povabi ali pa se prijavite za nadaljevanje. terms_of_service: + title: "Pogoji uporabe" signup_form_message: 'Prebral sem in sprejemam pogoje uporabe.' + upload: + edit_reason: "prenos slik v lokalno kopijo" + about: "O nas" + privacy: "Zasebnost" + edit_this_page: "Uredi to stran" + static_topic_first_reply: | + Uredite prvi prispevek v tej temi da spremenite vsebino %{page_name} strani. + guidelines_topic: + title: "Pravila skupnosti" + privacy_topic: + title: "Pravilnik o zasebnosti" badges: editor: name: Urednik @@ -1086,6 +1453,13 @@ sl: long_description: | Ta značka vam je podeljena za obiskovanje 365 zaporednih dni. Neverjetno, celo leto! badge_title_metadata: "%{display_name} značka na %{site_title}" + admin_login: + success: "E-sporočilo poslano" + errors: + unknown_email_address: "Neznan e-naslov." + invalid_token: "Napačen žeton." + email_input: "Administratorjev e-naslov" + submit_button: "Pošlji e-sporočilo" tags: forbidden: restricted_to: @@ -1093,3 +1467,9 @@ sl: two: '"%{tag_name}" oznaka je omejena samo za naslednji kategoriji: %{category_names}' few: '"%{tag_name}" oznaka je omejena samo za naslednje kategorije: %{category_names}' other: '"%{tag_name}" oznaka je omejena samo za naslednje kategorije: %{category_names}' + finish_installation: + confirm_email: + message: "Poslali smo vam aktivacijsko e-sporočilo na %{email}. Sledite navodilom v e-sporočilu za aktivacijo računa.
Če e-sporočila niste prejeli, preverite da ste pravilno nastavili e-pošto v Discourse in preverite predal z vsiljeno pošto .
" + resend_email: + title: "Ponovno pošlji aktivacijsko e-sporočilo" + message: "Ponovno smo poslali aktivacijsko e-sporočilo na%{email}"
diff --git a/config/locales/server.sq.yml b/config/locales/server.sq.yml
index ce2bc364b8..a47b3a780f 100644
--- a/config/locales/server.sq.yml
+++ b/config/locales/server.sq.yml
@@ -519,7 +519,6 @@ sq:
summary_posts_required: "Minimum posts in a topic before 'Summarize This Topic' is enabled"
summary_likes_required: "Minimum likes in a topic before 'Summarize This Topic' is enabled"
summary_percent_filter: "When a user clicks 'Summarize This Topic', show the top % of posts"
- summary_max_results: "Maximum posts returned by 'Summary This Topic'"
enable_long_polling: "Message bus used for notification can use long polling"
long_polling_base_url: "Base URL used for long polling (when a CDN is serving dynamic content, be sure to set this to origin pull) eg: http://origin.site.com"
long_polling_interval: "Amount of time the server should wait before responding to clients when there is no data to send (logged on users only)"
@@ -596,7 +595,6 @@ sq:
s3_upload_bucket: "The Amazon S3 bucket name that files will be uploaded into. WARNING: must be lowercase, no periods, no underscores."
s3_access_key_id: "The Amazon S3 access key id that will be used to upload images."
s3_secret_access_key: "The Amazon S3 secret access key that will be used to upload images."
- s3_region: "The Amazon S3 region name that will be used to upload images."
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: "List of automatically generated avatar sizes."
enable_flash_video_onebox: "Enable embedding of swf and flv (Adobe Flash) links in oneboxes. WARNING: may introduce security risks."
diff --git a/config/locales/server.sv.yml b/config/locales/server.sv.yml
index e5b3db797d..19d7a59fa6 100644
--- a/config/locales/server.sv.yml
+++ b/config/locales/server.sv.yml
@@ -698,7 +698,6 @@ sv:
summary_posts_required: "Minsta antal inlägg i ett ämne innan 'Sammanfatta det här ämnet' möjliggörs"
summary_likes_required: "Minsta antal gillningar i ett ämne innan 'Sammanfatta det här ämnet' möjliggörs"
summary_percent_filter: "Visa högsta % av inläggen när en användare bockar i 'Sammanfatta det här ämnet'"
- summary_max_results: "Maximalt antal inlägg som returneras av 'Sammanfatta det här ämnet'"
enable_long_polling: "Meddelande-buss som används för notifiering kan använda long polling"
long_polling_base_url: "URL som används för long polling (när en CDN levererar dynamiskt innehåll, kontrollera att det här är inställt till origin pull) se: http://origin.site.com"
long_polling_interval: "Tid som servern bör vänta innan den svarar på klienter när det inte finns någon data att skicka (endast loggad på användare)"
@@ -803,7 +802,6 @@ sv:
s3_upload_bucket: "Namnet på Amazon S3 behållaren som filerna kommer att laddas upp i. VARNING: måste vara gemener, inga punkter och inga understreck."
s3_access_key_id: "ID för åtkomstnyckeln till Amazon S3 som kommer att användas för att ladda upp bilder."
s3_secret_access_key: "Den hemliga åtkomstnyckeln till Amazon S3 som kommer att användas för att ladda upp bilder."
- s3_region: "Regionsnamn för Amazon S3 som kommer att användas för att ladda upp bilder."
s3_cdn_url: "CDN URL som används för alla S3-tillgångar (till exempel: https://cdn.somewhere.com). VARNING: efter ändring av den här inställningen så måste du uppdatera alla gamla inlägg med rake posts: rebake."
avatar_sizes: "Lista på automatiskt genererade avatar-storlekar."
external_system_avatars_enabled: "Använd externa system för avatar-tjänster."
diff --git a/config/locales/server.sw.yml b/config/locales/server.sw.yml
index 35f860fbd5..440f87b614 100644
--- a/config/locales/server.sw.yml
+++ b/config/locales/server.sw.yml
@@ -737,7 +737,6 @@ sw:
summary_posts_required: "Kiwango cha chini cha machapisho ndani ya mada kabla 'Fupisha Mada' haijaonyeshwa"
summary_likes_required: "Kiwango cha chini cha likes ndani ya mada kabla 'Mada kufupishwa' haijaruhusiwa"
summary_percent_filter: "Mtumiaji akibonyeza 'Fupisha Hii Mada', onyesha % machapisho ya juu"
- summary_max_results: "Kiwango cha juu cha machapisho zinazoonyeshwa kutoka kwa 'Muhtasari wa Hii Mada'"
enable_personal_messages: "Ruhusu watumiaji wenye kiwango cha 1 cha uaminifu (inasanidiwa kwa kupitia kiwango cha chini cha uaminifu kutuma ujumbe) kutuma ujumbe wa barua pepe. Wasaidizi wataweza kutuma ujumbe mda kila wakati."
enable_system_message_replies: "Waruhusu watumiaji wajibu ujumbe wa mfumo,hata kama ujumbe binafsi umezuiliwa."
notify_mods_when_user_silenced: "Kama mtumiaji akinyamazishwa, tuma ujumbe kwa wasimamizi wote."
diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml
index c61c92f958..84f3c84915 100644
--- a/config/locales/server.tr_TR.yml
+++ b/config/locales/server.tr_TR.yml
@@ -644,7 +644,6 @@ tr_TR:
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 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)"
@@ -739,7 +738,6 @@ tr_TR:
s3_upload_bucket: "Dosyaların yükleneceği Amazon S3 biriktirme yeri adı. DİKKAT: büyük harfler, nokta ve altçizgi karakterleri kullanılmamalı."
s3_access_key_id: "Resimleri yüklemek için kullanılacak olan Amazon S3 access key id."
s3_secret_access_key: "Resimleri yüklemek için kullanılacak olan Amazon S3 secret access key."
- s3_region: "Resimleri yüklemek için kullanılacak olan Amazon S3 region name."
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."
diff --git a/config/locales/server.ur.yml b/config/locales/server.ur.yml
index c469a5d076..347b458430 100644
--- a/config/locales/server.ur.yml
+++ b/config/locales/server.ur.yml
@@ -897,7 +897,6 @@ ur:
summary_posts_required: "'اِس ٹاپک کا خلاصہ کریں' فعال ہونے سے پہلے ٹاپک میں پوسٹس کی کم از کم تعداد"
summary_likes_required: "'اِس ٹاپک کا خلاصہ کریں' فعال ہونے سے پہلے ٹاپک میں لائیکس کی کم از کم تعداد"
summary_percent_filter: "جب صارف 'اِس ٹاپک کا خلاصہ کریں' پر کلک کرتا ہے، تو سب سے اوپر % پوسٹس دکھائیں"
- summary_max_results: "'اِس ٹاپک کا خلاصہ کریں' کی طرف سے لوٹائی جانے والی زیادہ سے زیادہ پوسٹس"
enable_personal_messages: "ٹرسٹ لَیول 1 (پیغامات بھیجنے کیلئے کم از کم ٹرسٹ لَیول کے ذریعہ ترتیب دے سکتے ہیں) والے صارفین کو پیغامات بنانے اور پیغامات کا جواب دینے کی اجازت دیں۔ نوٹ کریں کہ جوبھی ہو، اسٹاف ہمیشہ پیغامات بھیج سکتا ہے۔"
enable_system_message_replies: "صارفین کو سِسٹم پیغامات کا جواب دینے کی اجازت دیں، یہاں تک کہ اگر ذاتی پیغامات بھی غیر فعال ہوں"
enable_long_polling: "نوٹیفکیشن کیلئے مَیسج بس استعمال ہو رہا ہے، لانگ پولِنگ کا استعمال کیا جا سکتا ہے"
@@ -1030,7 +1029,6 @@ ur:
s3_upload_bucket: "اَیمَیزَون S3 بَکِّٹ کا نام جس میں فائلیں اَپ لوڈ کی جائیں گی۔ انتباہ: لوئر کَیس، کسی قسم کے پیریڈ، یا انڈر سکور لازمی طور پر نہیں ہونے چاہئیں۔"
s3_access_key_id: "اَیمَیزَون S3 ایکسَیس کلید آئی ڈی جو تصاویر کو اَپ لوڈ کرنے کیلئے استعمال کیا جائے گی۔"
s3_secret_access_key: "اَیمَیزَون S3 سیکرٹ ایکسَیس کلید جو تصاویر کو اَپ لوڈ کرنے کیلئے استعمال کیا جائے گی۔"
- s3_region: "اَیمَیزَون S3 خطے کا نام جو تصاویر کو اَپ لوڈ کرنے کیلئے استعمال کیا جائے گی۔"
s3_cdn_url: "تمام s3 اثاثوں کیلئے استعمال ہونے والا CDN URL (مثال: https://cdn.somewhere.com)۔ انتباہ: اِس ترتیب کو تبدیل کرنے کے بعد آپ کو تمام پرانی پوسٹس کو رِیبَیک کرنا ہوگا۔"
avatar_sizes: "خود کار طریقے سے تیار کردہ اوتار کے سائزوں کی فہرست۔"
external_system_avatars_enabled: "بیرونی سسٹم کی اوتار سروس کا استعمال کریں۔"
diff --git a/config/locales/server.vi.yml b/config/locales/server.vi.yml
index 15d5deae7f..e0263f9d01 100644
--- a/config/locales/server.vi.yml
+++ b/config/locales/server.vi.yml
@@ -576,7 +576,6 @@ vi:
summary_posts_required: "Số bài viết tối thiểu trong một chủ đề trước khi 'Tóm tắt chủ đề này' được kích hoạt"
summary_likes_required: "Số lượt thích trong một chủ đề trước khi 'Tóm tắt chủ đề này' được kích hoạt"
summary_percent_filter: "Khi người dùng nhấn 'Tóm tắt chủ đề này', hiển thị phí trên % của bài viết"
- summary_max_results: "Số bài viết tối đa trả ra bởi 'Tóm tắt chủ đề này'"
enable_long_polling: "Message Bus sử dụng để thông báo có thể sử dụng vòng gọi dài"
long_polling_base_url: "URL chính sử dụng cho vòng gọi dài (khi một CDN phục vụ nội dung động, hãy chắc chắn để thiết lập này là vòng gọi gốc), vd: http://origin.site.com"
long_polling_interval: "Thời gian server phải đợi trước khi gửi trả lời khi không có dữ liệu để gửi (chỉ với tài khoản đăng nhập)"
@@ -671,7 +670,6 @@ vi:
s3_upload_bucket: "Tên Amazon S3 để lưu trữ các file sẽ được upload. CHÚ Ý: phải là chữ thường, không cách và không gạch dưới."
s3_access_key_id: "Amazon S3 access key id này sẽ được sử dụng để tải lên ảnh."
s3_secret_access_key: "Amazon S3 secret access key này sẽ được sử dụng để tải lên ảnh."
- s3_region: "Amazon S3 region name sẽ được sử dụng để tải lên ảnh."
s3_cdn_url: "CDN URL được sử dụng cho tất cả các tài nguyên S3 (vd: https://cdn.somewhere.com). CHÚ Ý: sau khi thay đổi thiết lập này bạn phải tạo lại các bài viết cũ."
avatar_sizes: "Danh sách những kích thước hình đại diện tự động khởi tạo."
external_system_avatars_enabled: "Sử dụng dịch vụ ảnh đại diện bên ngoài."
diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml
index 8c3d4c8a37..ae11f5ab6a 100644
--- a/config/locales/server.zh_CN.yml
+++ b/config/locales/server.zh_CN.yml
@@ -1115,7 +1115,6 @@ zh_CN:
summary_posts_required: "在一个主题启用'摘要模式'的最小帖子数量"
summary_likes_required: "在一个主题启用'摘要模式'的最小赞的数量"
summary_percent_filter: "当用户点击摘要,显示前 % 几的帖子"
- summary_max_results: "“概括主题”返回的最大帖子数量"
enable_personal_messages: "允许信任等级1(可以另外选择发送私信的信任等级)的用户创建私信和回复私信。注意:管理人员不受限制。"
enable_system_message_replies: "即使禁用了个人消息,也允许用户回复系统消息"
enable_long_polling: "启用 Message bus 使通知功能可以使用长轮询(long polling)"
@@ -1241,7 +1240,6 @@ zh_CN:
automatic_backups_enabled: "按照定义的备份频率运行自动备份计划"
backup_frequency: "备份之间的天数。"
s3_backup_bucket: "远端备份 bucket。警告:确认它使私有的 bucket。"
- s3_endpoint: "可以修改端点以备份到S3兼容服务,如DigitalOcean Spaces或Minio。警告:如果使用AWS S3,则使用默认值"
s3_force_path_style: "为您的自定义端点强制执行路径式寻址。注意:使用Minio上载和备份时需要。"
s3_configure_tombstone_policy: "为逻辑删除上载启用自动删除策略。注意:如果禁用,在删除上载后不会回收空间。"
s3_disable_cleanup: "当在本地删除备份时不删除 S3 上的备份。"
@@ -1287,7 +1285,6 @@ zh_CN:
s3_upload_bucket: "上传文件保存于 Amazon S3 的 bucket 名字。警告:必须为小写,无句点,无下划线。"
s3_access_key_id: "将用于上传图片的 Amazon S3 access key。"
s3_secret_access_key: "将用于上传图片的 Amazon S3 secret key。"
- s3_region: "将用于上传图片的 Amazon S3 区域名。"
s3_cdn_url: "用户 S3 资料的 CDN URL(例如:https://cdn.somewhere.com)。警告:在改变该设置后你必须重制所有老帖子。"
avatar_sizes: "自动生成的头像大小列表。"
external_system_avatars_enabled: "使用外部系统头像服务。"
diff --git a/config/locales/server.zh_TW.yml b/config/locales/server.zh_TW.yml
index 30e0217c44..940a61c5d0 100644
--- a/config/locales/server.zh_TW.yml
+++ b/config/locales/server.zh_TW.yml
@@ -723,7 +723,6 @@ zh_TW:
summary_posts_required: "如果使用了\"此話題的摘用\",話題顯示時需滿足最小的文章的數量"
summary_likes_required: "如果使用了\"此話題的摘用\",話題顯示時需滿足最小得到\"讚\"的數量"
summary_percent_filter: "當用戶點擊 \"此話題的摘要\",顯示前面多少 % 的文章"
- summary_max_results: "“概括主題”返回的最大帖子數量"
enable_long_polling: "啟用消息匯流排使通知功能可以使用長輪詢(long polling)"
long_polling_base_url: "長輪詢的基本 URL(當用 CDN 分發動態內容,請設置此至原始拉取地址)例如:http://origin.site.com"
long_polling_interval: "當沒有數據向客戶端發送時伺服器端應等待的時間(僅對已登錄用戶有效)"
@@ -831,7 +830,6 @@ zh_TW:
s3_upload_bucket: "Amazon S3 保存上傳檔案的 bucket 名稱。警告:必須為小寫,不包含句點 (.) 與底線 (_)。"
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: "使用外部系統頭像服務。"
diff --git a/config/routes.rb b/config/routes.rb
index 955d0b1c16..dca765bef8 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -453,7 +453,7 @@ Discourse::Application.routes.draw do
# in most production settings this is bypassed
get "letter_avatar_proxy/:version/letter/:letter/:color/:size.png" => "user_avatars#show_proxy_letter"
- get "svg-sprite/:hostname/svg-:version.js" => "svg_sprite#show", format: false, constraints: { hostname: /[\w\.-]+/, version: /\h{40}/ }
+ get "svg-sprite/:hostname/svg-:theme_ids-:version.js" => "svg_sprite#show", format: false, constraints: { hostname: /[\w\.-]+/, version: /\h{40}/, theme_ids: /([0-9]+(,[0-9]+)*)?/ }
get "svg-sprite/search/:keyword" => "svg_sprite#search", format: false, constraints: { keyword: /[-a-z0-9\s\%]+/ }
get "highlight-js/:hostname/:version.js" => "highlight_js#show", format: false, constraints: { hostname: /[\w\.-]+/ }
diff --git a/config/site_settings.yml b/config/site_settings.yml
index a897c96854..7b13e73b02 100644
--- a/config/site_settings.yml
+++ b/config/site_settings.yml
@@ -1038,7 +1038,7 @@ files:
default: ""
regex: '^[a-z0-9\-\/]+$' # can't use '.' when using HTTPS
s3_endpoint:
- default: "https://s3.amazonaws.com"
+ default: ""
regex: '^https?:\/\/.+[^\/]$'
shadowed_by_global: true
s3_cdn_url:
@@ -1050,6 +1050,9 @@ files:
s3_configure_tombstone_policy:
default: true
shadowed_by_global: true
+ enable_s3_inventory:
+ default: false
+ shadowed_by_global: true
allow_profile_backgrounds:
client: true
default: true
diff --git a/db/migrate/20130221215017_add_description_to_categories.rb b/db/migrate/20130221215017_add_description_to_categories.rb
index aa22568014..24514a4720 100644
--- a/db/migrate/20130221215017_add_description_to_categories.rb
+++ b/db/migrate/20130221215017_add_description_to_categories.rb
@@ -8,10 +8,20 @@ class AddDescriptionToCategories < ActiveRecord::Migration[4.2]
remove_column :categories, :top1_user_id
remove_column :categories, :top2_user_id
- # Migrate excerpts over
- Category.order('id').each do |c|
- post = c.topic.posts.order(:post_number).first
- PostRevisor.new(post).send(:update_category_description)
+ # some ancient installs may have bad category descriptions
+ # attempt to fix
+ if !DB.query_single("SELECT 1 FROM categories limit 1").empty?
+
+ # Reaching into post revisor is not ideal here, but this code
+ # should almost never run, so bypass it
+ Discourse.reset_active_record_cache
+
+ Category.order('id').each do |c|
+ post = c.topic.ordered_posts.first
+ PostRevisor.new(post).update_category_description
+ end
+
+ Discourse.reset_active_record_cache
end
end
diff --git a/db/post_migrate/20190205104116_drop_unused_auth_tables.rb b/db/post_migrate/20190205104116_drop_unused_auth_tables.rb
new file mode 100644
index 0000000000..45b5864d2c
--- /dev/null
+++ b/db/post_migrate/20190205104116_drop_unused_auth_tables.rb
@@ -0,0 +1,18 @@
+require 'migration/table_dropper'
+
+class DropUnusedAuthTables < ActiveRecord::Migration[5.2]
+ def change
+ def up
+ %i{
+ facebook_user_infos
+ twitter_user_infos
+ }.each do |table|
+ Migration::TableDropper.execute_drop(table)
+ end
+ end
+
+ def down
+ raise ActiveRecord::IrreversibleMigration
+ end
+ end
+end
diff --git a/lib/backup_restore/backuper.rb b/lib/backup_restore/backuper.rb
index bbdf0c561a..cdda8a1de2 100644
--- a/lib/backup_restore/backuper.rb
+++ b/lib/backup_restore/backuper.rb
@@ -43,6 +43,8 @@ module BackupRestore
log "Finalizing backup..."
@with_uploads ? create_archive : move_dump_backup
+
+ unpause_sidekiq
upload_archive
after_create_hook
@@ -334,6 +336,7 @@ module BackupRestore
end
def unpause_sidekiq
+ return unless Sidekiq.paused?
log "Unpausing sidekiq..."
Sidekiq.unpause!
rescue => ex
diff --git a/lib/backup_restore/s3_backup_store.rb b/lib/backup_restore/s3_backup_store.rb
index 03edc014c3..fbbb18f1d7 100644
--- a/lib/backup_restore/s3_backup_store.rb
+++ b/lib/backup_restore/s3_backup_store.rb
@@ -32,9 +32,7 @@ module BackupRestore
end
def download_file(filename, destination_path, failure_message = nil)
- unless @s3_helper.object(filename).download_file(destination_path)
- raise failure_message&.to_s || "Failed to download file"
- end
+ @s3_helper.download_file(filename, destination_path, failure_message)
end
def upload_file(filename, source_path, content_type)
diff --git a/lib/discourse.rb b/lib/discourse.rb
index c8d76f3e15..d681ddb2dd 100644
--- a/lib/discourse.rb
+++ b/lib/discourse.rb
@@ -105,6 +105,8 @@ module Discourse
class Deprecation < StandardError; end
+ class ScssError < StandardError; end
+
def self.filters
@filters ||= [:latest, :unread, :new, :read, :posted, :bookmarks]
end
@@ -463,6 +465,11 @@ module Discourse
end
end
+ DiscourseEvent.on(:site_setting_saved) do |site_setting|
+ name = site_setting.name.to_s
+ Jobs.enqueue(:update_s3_inventory) if name.include?("s3_inventory") || name == "s3_upload_bucket"
+ end
+
def self.current_user_provider
@current_user_provider || Auth::DefaultCurrentUserProvider
end
diff --git a/lib/file_store/s3_store.rb b/lib/file_store/s3_store.rb
index 119dd9c0a1..d4bb6647d2 100644
--- a/lib/file_store/s3_store.rb
+++ b/lib/file_store/s3_store.rb
@@ -124,8 +124,14 @@ module FileStore
end
def list_missing_uploads(skip_optimized: false)
- list_missing(Upload, "original/")
- list_missing(OptimizedImage, "optimized/") unless skip_optimized
+ if SiteSetting.enable_s3_inventory
+ require 's3_inventory'
+ S3Inventory.new(s3_helper, :upload).list_missing
+ S3Inventory.new(s3_helper, :optimized).list_missing unless skip_optimized
+ else
+ list_missing(Upload, "original/")
+ list_missing(OptimizedImage, "optimized/") unless skip_optimized
+ end
end
private
@@ -140,7 +146,7 @@ module FileStore
verified_ids = []
files.each do |f|
- id = model.where("url LIKE '%#{f.key}'").pluck(:id).first if f.size > 0
+ id = model.where("url LIKE '%#{f.key}' AND etag = '#{f.etag}'").pluck(:id).first
verified_ids << id if id.present?
marker = f.key
end
@@ -150,7 +156,7 @@ module FileStore
files = @s3_helper.list(prefix, marker)
end
- missing_uploads = model.where("id NOT IN (SELECT val FROM verified_ids)")
+ missing_uploads = model.joins('LEFT JOIN verified_ids ON verified_ids.val = id').where("verified_ids.val IS NULL")
missing_count = missing_uploads.count
if missing_count > 0
diff --git a/lib/s3_helper.rb b/lib/s3_helper.rb
index fbdde9674a..3e7b6c81d6 100644
--- a/lib/s3_helper.rb
+++ b/lib/s3_helper.rb
@@ -193,10 +193,11 @@ class S3Helper
def self.s3_options(obj)
opts = {
region: obj.s3_region,
- endpoint: SiteSetting.s3_endpoint,
force_path_style: SiteSetting.s3_force_path_style
}
+ opts[:endpoint] = SiteSetting.s3_endpoint if SiteSetting.s3_endpoint.present?
+
unless obj.s3_use_iam_profile
opts[:access_key_id] = obj.s3_access_key_id
opts[:secret_access_key] = obj.s3_secret_access_key
@@ -205,6 +206,20 @@ class S3Helper
opts
end
+ def download_file(filename, destination_path, failure_message = nil)
+ unless object(filename).download_file(destination_path)
+ raise failure_message&.to_s || "Failed to download file"
+ end
+ end
+
+ def s3_client
+ @s3_client ||= Aws::S3::Client.new(@s3_options)
+ end
+
+ def s3_inventory_path(path = 'inventory')
+ get_path_for_s3_upload(path)
+ end
+
private
def default_s3_options
@@ -228,10 +243,6 @@ class S3Helper
File.join("uploads", RailsMultisite::ConnectionManagement.current_db, "/")
end
- def s3_client
- @s3_client ||= Aws::S3::Client.new(@s3_options)
- end
-
def s3_resource
Aws::S3::Resource.new(client: s3_client)
end
diff --git a/lib/s3_inventory.rb b/lib/s3_inventory.rb
new file mode 100644
index 0000000000..763f1d1e46
--- /dev/null
+++ b/lib/s3_inventory.rb
@@ -0,0 +1,199 @@
+# frozen_string_literal: true
+
+require "aws-sdk-s3"
+require "csv"
+
+class S3Inventory
+
+ attr_reader :inventory_id, :csv_filename, :model
+
+ CSV_KEY_INDEX ||= 1
+ CSV_ETAG_INDEX ||= 2
+ INVENTORY_PREFIX ||= "inventory"
+ INVENTORY_VERSION ||= "1"
+
+ def initialize(s3_helper, type)
+ @s3_helper = s3_helper
+
+ if type == :upload
+ @inventory_id = "original"
+ @model = Upload
+ elsif type == :optimized
+ @inventory_id = "optimized"
+ @model = OptimizedImage
+ end
+ end
+
+ def file
+ @file ||= unsorted_files.sort_by { |file| -file.last_modified.to_i }.first
+ end
+
+ def list_missing
+ if file.blank?
+ error("Failed to list inventory from S3")
+ return
+ end
+
+ DistributedMutex.synchronize("s3_inventory_list_missing_#{inventory_id}") do
+ current_db = RailsMultisite::ConnectionManagement.current_db
+ timestamp = Time.now.strftime("%Y-%m-%d-%H%M%S")
+ @tmp_directory = File.join(Rails.root, "tmp", INVENTORY_PREFIX, current_db, timestamp)
+ @archive_filename = File.join(@tmp_directory, File.basename(file.key))
+ @csv_filename = @archive_filename[0...-3]
+
+ FileUtils.mkdir_p(@tmp_directory)
+ download_inventory_file_to_tmp_directory
+ decompress_inventory_file
+
+ begin
+ table_name = "#{inventory_id}_inventory"
+ connection = ActiveRecord::Base.connection.raw_connection
+ connection.exec("CREATE TEMP TABLE #{table_name}(key text UNIQUE, etag text PRIMARY KEY)")
+ connection.copy_data("COPY #{table_name} FROM STDIN CSV") do
+ CSV.foreach(csv_filename, headers: false) do |row|
+ connection.put_copy_data("#{row[CSV_KEY_INDEX]},#{row[CSV_ETAG_INDEX]}\n")
+ end
+ end
+
+ uploads = model.where("created_at < ?", file.last_modified)
+ missing_uploads = uploads.joins("LEFT JOIN #{table_name} ON #{table_name}.etag = #{model.table_name}.etag").where("#{table_name}.etag is NULL")
+
+ if (missing_count = missing_uploads.count) > 0
+ missing_uploads.select(:id, :url).find_each do |upload|
+ log upload.url
+ end
+
+ log "#{missing_count} of #{uploads.count} #{model.name.underscore.pluralize} are missing"
+ end
+ ensure
+ connection.exec("DROP TABLE #{table_name}") unless connection.nil?
+ end
+ end
+ end
+
+ def download_inventory_file_to_tmp_directory
+ log "Downloading inventory file to tmp directory..."
+ failure_message = "Failed to inventory file to tmp directory."
+
+ @s3_helper.download_file(file.key, @archive_filename, failure_message)
+ end
+
+ def decompress_inventory_file
+ log "Decompressing inventory file, this may take a while..."
+
+ FileUtils.cd(@tmp_directory) do
+ Discourse::Utils.execute_command('gzip', '--decompress', @archive_filename, failure_message: "Failed to decompress inventory file.")
+ end
+ end
+
+ def update_bucket_policy
+ @s3_helper.s3_client.put_bucket_policy(
+ bucket: bucket_name,
+ policy: {
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Sid": "InventoryAndAnalyticsPolicy",
+ "Effect": "Allow",
+ "Principal": { "Service": "s3.amazonaws.com" },
+ "Action": ["s3:PutObject"],
+ "Resource": ["#{inventory_path_arn}/*"],
+ "Condition": {
+ "ArnLike": {
+ "aws:SourceArn": bucket_arn
+ },
+ "StringEquals": {
+ "s3:x-amz-acl": "bucket-owner-full-control"
+ }
+ }
+ }
+ ]
+ }.to_json
+ )
+ end
+
+ def update_bucket_inventory_configuration
+ @s3_helper.s3_client.put_bucket_inventory_configuration(
+ bucket: bucket_name,
+ id: inventory_id,
+ inventory_configuration: inventory_configuration,
+ use_accelerate_endpoint: false
+ )
+ end
+
+ private
+
+ def inventory_configuration
+ filter_prefix = inventory_id
+ filter_prefix = File.join(bucket_folder_path, filter_prefix) if bucket_folder_path.present?
+
+ {
+ destination: {
+ s3_bucket_destination: {
+ bucket: bucket_arn,
+ prefix: inventory_path,
+ format: "CSV"
+ }
+ },
+ filter: {
+ prefix: filter_prefix
+ },
+ is_enabled: SiteSetting.enable_s3_inventory,
+ id: inventory_id,
+ included_object_versions: "Current",
+ optional_fields: ["ETag"],
+ schedule: {
+ frequency: "Daily"
+ }
+ }
+ end
+
+ def bucket_name
+ @s3_helper.s3_bucket_name
+ end
+
+ def bucket_folder_path
+ @s3_helper.s3_bucket_folder_path
+ end
+
+ def unsorted_files
+ objects = []
+
+ @s3_helper.list(inventory_data_path).each do |obj|
+ if obj.key.match?(/\.csv\.gz$/i)
+ objects << obj
+ end
+ end
+
+ objects
+ rescue Aws::Errors::ServiceError => e
+ log("Failed to list inventory from S3", e)
+ end
+
+ def inventory_data_path
+ File.join(inventory_path, bucket_name, inventory_id, "data")
+ end
+
+ def inventory_path_arn
+ File.join(bucket_arn, inventory_path)
+ end
+
+ def inventory_path
+ path = File.join(INVENTORY_PREFIX, INVENTORY_VERSION)
+ path = File.join(bucket_folder_path, path) if bucket_folder_path.present?
+ path
+ end
+
+ def bucket_arn
+ "arn:aws:s3:::#{bucket_name}"
+ end
+
+ def log(message, ex = nil)
+ puts(message)
+ Rails.logger.error("#{ex}\n" + (ex.backtrace || []).join("\n")) if ex
+ end
+
+ def error(message)
+ log(message, StandardError.new(message))
+ end
+end
diff --git a/lib/search.rb b/lib/search.rb
index 61ccf79d91..04f7315098 100644
--- a/lib/search.rb
+++ b/lib/search.rb
@@ -157,6 +157,7 @@ class Search
term.gsub!(/[\u201c\u201d]/, '"')
@clean_term = term
+ @in_title = false
term = process_advanced_search!(term)
@@ -551,8 +552,6 @@ class Search
end
end
- @in_title = false
-
if word == 'order:latest' || word == 'l'
@order = :latest
nil
diff --git a/lib/site_settings/type_supervisor.rb b/lib/site_settings/type_supervisor.rb
index 0f4f483faa..93da66333e 100644
--- a/lib/site_settings/type_supervisor.rb
+++ b/lib/site_settings/type_supervisor.rb
@@ -6,7 +6,7 @@ module SiteSettings; end
class SiteSettings::TypeSupervisor
include SiteSettings::Validations
- CONSUMED_OPTS = %i[enum choices type validator min max regex hidden regex_error allow_any list_type].freeze
+ CONSUMED_OPTS = %i[enum choices type validator min max regex hidden regex_error allow_any list_type textarea].freeze
VALIDATOR_OPTS = %i[min max regex hidden regex_error].freeze
# For plugins, so they can tell if a feature is supported
@@ -65,11 +65,16 @@ class SiteSettings::TypeSupervisor
@types = {}
@allow_any = {}
@list_type = {}
+ @textareas = {}
end
def load_setting(name_arg, opts = {})
name = name_arg.to_sym
+ if opts[:textarea]
+ @textareas[name] = opts[:textarea]
+ end
+
if (enum = opts[:enum])
@enums[name] = enum.is_a?(String) ? enum.constantize : enum
opts[:type] ||= :enum
@@ -148,6 +153,8 @@ class SiteSettings::TypeSupervisor
result[:choices] = @choices[name] if @choices.has_key? name
result[:list_type] = @list_type[name] if @list_type.has_key? name
+ result[:textarea] = @textareas[name] if @textareas.has_key? name
+
result
end
diff --git a/lib/site_settings/validations.rb b/lib/site_settings/validations.rb
index 2d03fefc3c..327aa7b680 100644
--- a/lib/site_settings/validations.rb
+++ b/lib/site_settings/validations.rb
@@ -53,6 +53,10 @@ module SiteSettings::Validations
validate_error :s3_upload_bucket_is_required if new_val == "t" && SiteSetting.s3_upload_bucket.blank?
end
+ def validate_enable_s3_inventory(new_val)
+ validate_error :enable_s3_uploads_is_required if new_val == "t" && !SiteSetting.Upload.enable_s3_uploads
+ end
+
def validate_backup_location(new_val)
return unless new_val == BackupLocationSiteSetting::S3
validate_error(:s3_backup_requires_s3_settings, setting_name: "s3_backup_bucket") if SiteSetting.s3_backup_bucket.blank?
diff --git a/lib/stylesheet/compiler.rb b/lib/stylesheet/compiler.rb
index 8cba8e677b..9f7b3b9bb0 100644
--- a/lib/stylesheet/compiler.rb
+++ b/lib/stylesheet/compiler.rb
@@ -6,16 +6,6 @@ module Stylesheet
class Compiler
- def self.error_as_css(error, label)
- error = error.message
- error.gsub!("\n", '\A ')
- error.gsub!("'", '\27 ')
-
- "#main { display: none; }
- body { white-space: pre; }
- body:before { font-family: monospace; content: '#{error}' }"
- end
-
def self.compile_asset(asset, options = {})
if Importer.special_imports[asset.to_s]
diff --git a/lib/stylesheet/manager.rb b/lib/stylesheet/manager.rb
index 7beded7f1b..0a77196e34 100644
--- a/lib/stylesheet/manager.rb
+++ b/lib/stylesheet/manager.rb
@@ -166,15 +166,11 @@ class Stylesheet::Manager
source_map_file: source_map_filename
)
rescue SassC::SyntaxError => e
-
- # we do not need this reported as we will report it in the UI anyway
- Rails.logger.info "Failed to compile #{@target} stylesheet: #{e.message}"
-
if %w{embedded_theme mobile_theme desktop_theme}.include?(@target.to_s)
# no special errors for theme, handled in theme editor
["", nil]
else
- [Stylesheet::Compiler.error_as_css(e, "#{@target} stylesheet"), nil]
+ raise Discourse::ScssError, e.message
end
end
diff --git a/lib/svg_sprite/svg_sprite.rb b/lib/svg_sprite/svg_sprite.rb
index 3717d59944..217fa9772c 100644
--- a/lib/svg_sprite/svg_sprite.rb
+++ b/lib/svg_sprite/svg_sprite.rb
@@ -188,39 +188,37 @@ module SvgSprite
SVG_SPRITE_PATHS = Dir.glob(["#{Rails.root}/vendor/assets/svg-icons/**/*.svg",
"#{Rails.root}/plugins/*/svg-icons/*.svg"])
- def self.svg_sprite_cache
- @svg_sprite_cache ||= DistributedCache.new('svg_sprite')
+ def self.all_icons(theme_ids = [])
+ get_set_cache("icons_#{Theme.transform_ids(theme_ids).join(',')}") do
+ Set.new()
+ .merge(settings_icons)
+ .merge(plugin_icons)
+ .merge(badge_icons)
+ .merge(group_icons)
+ .merge(theme_icons(theme_ids))
+ .delete_if { |i| i.blank? || i.include?("/") }
+ .map! { |i| process(i.dup) }
+ .merge(SVG_ICONS)
+ .sort
+ end
end
- def self.all_icons
- Set.new()
- .merge(settings_icons)
- .merge(plugin_icons)
- .merge(badge_icons)
- .merge(group_icons)
- .merge(theme_icons)
- .delete_if { |i| i.blank? || i.include?("/") }
- .map! { |i| process(i.dup) }
- .merge(SVG_ICONS)
- .sort
+ def self.version(theme_ids = [])
+ get_set_cache("version_#{Theme.transform_ids(theme_ids).join(',')}") do
+ Digest::SHA1.hexdigest(all_icons(theme_ids).join('|'))
+ end
end
- def self.rebuild_cache
- icons = all_icons
- svg_sprite_cache['icons'] = icons
- svg_sprite_cache['version'] = Digest::SHA1.hexdigest(icons.join('|'))
+ def self.path(theme_ids = [])
+ "/svg-sprite/#{Discourse.current_hostname}/svg-#{theme_ids&.join(",")}-#{version(theme_ids)}.js"
end
def self.expire_cache
- svg_sprite_cache.clear
+ cache&.clear
end
- def self.version
- svg_sprite_cache['version'] || rebuild_cache
- end
-
- def self.bundle
- icons = svg_sprite_cache['icons'] || all_icons
+ def self.bundle(theme_ids = [])
+ icons = all_icons(theme_ids)
doc = File.open("#{Rails.root}/vendor/assets/svg-icons/fontawesome/solid.svg") { |f| Nokogiri::XML(f) }
fa_license = doc.at('//comment()').text
@@ -240,7 +238,6 @@ Discourse SVG subset of #{fa_license}
svg_file.css('symbol').each do |sym|
icon_id = prepare_symbol(sym, svg_filename)
-
if icons.include? icon_id
sym.attributes['id'].value = icon_id
sym.css('title').each(&:remove)
@@ -286,10 +283,6 @@ Discourse SVG subset of #{fa_license}
icon_id
end
- def self.path
- "/svg-sprite/#{Discourse.current_hostname}/svg-#{version}.js"
- end
-
def self.settings_icons
# includes svg_icon_subset and any settings containing _icon (incl. plugin settings)
site_setting_icons = []
@@ -319,11 +312,11 @@ Discourse SVG subset of #{fa_license}
Group.where("flair_url LIKE '%fa-%'").pluck(:flair_url).uniq
end
- def self.theme_icons
+ def self.theme_icons(theme_ids)
theme_icon_settings = []
- # Theme.all includes default values
- Theme.all.each do |theme|
+ # Need to load full records for default values
+ Theme.where(id: Theme.transform_ids(theme_ids)).each do |theme|
settings = theme.cached_settings.each do |key, value|
if key.to_s.include?("_icon") && String === value
theme_icon_settings |= value.split('|')
@@ -347,4 +340,12 @@ Discourse SVG subset of #{fa_license}
FA_ICON_MAP.each { |k, v| icon_name.sub!(k, v) }
fa4_to_fa5_names[icon_name] || icon_name
end
+
+ def self.get_set_cache(key)
+ cache[key] ||= yield
+ end
+
+ def self.cache
+ @cache ||= DistributedCache.new('svg_sprite')
+ end
end
diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake
index 8575ca11dc..0e2c6525df 100644
--- a/lib/tasks/assets.rake
+++ b/lib/tasks/assets.rake
@@ -58,7 +58,8 @@ task 'assets:precompile:css' => 'environment' do
STDERR.puts "Compiling css for #{db} #{Time.zone.now}"
begin
Stylesheet::Manager.precompile_css
- rescue => PG::UndefinedColumn
+ rescue PG::UndefinedColumn => e
+ STDERR.puts "#{e.class} #{e.message}: #{e.backtrace.join("\n")}"
STDERR.puts "Skipping precompilation of CSS cause schema is old, you are precompiling prior to running migrations."
end
end
diff --git a/lib/theme_javascript_compiler.rb b/lib/theme_javascript_compiler.rb
index d5a11ca291..e01d7a6e84 100644
--- a/lib/theme_javascript_compiler.rb
+++ b/lib/theme_javascript_compiler.rb
@@ -54,7 +54,7 @@ class ThemeJavascriptCompiler
function manipulatePath(path) {
// Override old themeSetting syntax when it's a param inside another node
- if(path.parts[0] == "themeSettings"){
+ if(path.parts && path.parts[0] == "themeSettings"){
const settingParts = path.parts.slice(1);
path.type = "SubExpression";
Object.assign(path, generateHelper(settingParts))
@@ -63,7 +63,7 @@ class ThemeJavascriptCompiler
function manipulateNode(node) {
// Magically add theme id as the first param for each of these helpers
- if (["theme-i18n", "theme-prefix", "theme-setting"].includes(node.path.parts[0])) {
+ if (node.path.parts && ["theme-i18n", "theme-prefix", "theme-setting"].includes(node.path.parts[0])) {
node.params.unshift({
type: "NumberLiteral",
value: #{@theme_id},
@@ -72,7 +72,7 @@ class ThemeJavascriptCompiler
}
// Override old themeSetting syntax when it's in its own node
- if (node.path.parts[0] == "themeSettings") {
+ if (node.path.parts && node.path.parts[0] == "themeSettings") {
Object.assign(node, generateHelper(node.path.parts.slice(1)))
}
}
@@ -100,6 +100,7 @@ class ThemeJavascriptCompiler
if(node.path.original == 'get'
&& node.params
&& node.params[0]
+ && node.params[0].parts
&& node.params[0].parts[0] == 'themeSettings'){
node.path.parts = node.params[0].parts
node.params = []
diff --git a/lib/theme_settings_manager.rb b/lib/theme_settings_manager.rb
index 81c2a7ef0c..c59b1481e6 100644
--- a/lib/theme_settings_manager.rb
+++ b/lib/theme_settings_manager.rb
@@ -105,6 +105,10 @@ class ThemeSettingsManager
def is_valid_value?(new_value)
(@opts[:min]..@opts[:max]).include? new_value.to_s.length
end
+
+ def textarea
+ @opts[:textarea]
+ end
end
class Bool < self
diff --git a/lib/theme_settings_parser.rb b/lib/theme_settings_parser.rb
index 064dd7ef14..ab2ee4396c 100644
--- a/lib/theme_settings_parser.rb
+++ b/lib/theme_settings_parser.rb
@@ -38,6 +38,8 @@ class ThemeSettingsParser
opts[:list_type] = raw_opts[:list_type]
end
+ opts[:textarea] = !!raw_opts[:textarea]
+
opts
end
diff --git a/lib/upload_creator.rb b/lib/upload_creator.rb
index a1386feb2e..0aa4af84b1 100644
--- a/lib/upload_creator.rb
+++ b/lib/upload_creator.rb
@@ -9,7 +9,7 @@ class UploadCreator
WHITELISTED_SVG_ELEMENTS ||= %w{
circle clippath defs ellipse g line linearGradient path polygon polyline
- radialGradient rect stop svg text textpath tref tspan use
+ radialGradient rect stop style svg text textpath tref tspan use
}.each(&:freeze)
# Available options
diff --git a/lib/version.rb b/lib/version.rb
index 000409bf3a..0683bfa873 100644
--- a/lib/version.rb
+++ b/lib/version.rb
@@ -7,7 +7,7 @@ module Discourse
MAJOR = 2
MINOR = 3
TINY = 0
- PRE = 'beta1'
+ PRE = 'beta2'
STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
end
diff --git a/plugins/discourse-narrative-bot/config/locales/server.es.yml b/plugins/discourse-narrative-bot/config/locales/server.es.yml
index f01960b69a..a480e6f07e 100644
--- a/plugins/discourse-narrative-bot/config/locales/server.es.yml
+++ b/plugins/discourse-narrative-bot/config/locales/server.es.yml
@@ -42,9 +42,9 @@ es:
invalid: |-
Lo siento, es matemáticamente imposible lanzar esa combinación de dados. :confounded:
not_enough_dice: |-
- Solo tengo %{num_of_dice} dados para jugar. Es [vergonzoso]((http://www.therobotsvoice.com/2009/04/the_10_most_shameful_rpg_dice.php)) lo sé!
+ Solo tengo %{num_of_dice} dados para jugar. Es [vergonzoso]((http://www.therobotsvoice.com/2009/04/the_10_most_shameful_rpg_dice.php)), ¡lo sé!
out_of_range: |-
- ¿Sabías que [el máximo número de lados](https://www.wired.com/2016/05/mathematical-challenge-of-designing-the-worlds-most-complex-120-sided-dice) para que un dado, matemáticamente correcto, es de 120 lados?
+ ¿Sabías que [el máximo número de lados](https://www.wired.com/2016/05/mathematical-challenge-of-designing-the-worlds-most-complex-120-sided-dice) para un dado, matemáticamente correcto, es 120?
results: |-
> :game_die: %{results}
quote:
diff --git a/plugins/discourse-narrative-bot/config/locales/server.ru.yml b/plugins/discourse-narrative-bot/config/locales/server.ru.yml
index ef0d0c1130..2354e972ce 100644
--- a/plugins/discourse-narrative-bot/config/locales/server.ru.yml
+++ b/plugins/discourse-narrative-bot/config/locales/server.ru.yml
@@ -94,6 +94,7 @@ ru:
'8': "Хорошие перспективы"
'9': "Да"
'10': "Все признаки указывают, что да"
+ '11': "Не знаю, попробуйте еще что нибудь спросить..."
'12': "Спроси меня позже"
'13': "Лучше не скажу вам сейчас"
'14': "Я не могу предсказать"
@@ -142,6 +143,7 @@ ru:
reset_trigger: "новый пользователь"
cert_title: "В знак признания успешного завершения нового руководство пользователя"
hello:
+ title: "Здравствуйте!"
message: |-
Спасибо %{title}, и Добро пожаловать!
@@ -256,7 +258,7 @@ ru:
reply: |-
Опсс! :boom:
- Чтобы сохранить преемственность дискуссий, система удаляет не немедленно, поэтому пост будет удален через некоторое время.
+ Чтобы сохранить преемственность дискуссий, удаление не выполняется немедленно,, поэтому ваш пост будет удален через некоторое время.
recover:
deleted_post_raw: 'Почему @%{discobot_username} удалил моё сообщение? :anguished:'
reply: |-
diff --git a/plugins/discourse-presence/config/locales/client.sl.yml b/plugins/discourse-presence/config/locales/client.sl.yml
index 957345274d..66d8b24c7e 100644
--- a/plugins/discourse-presence/config/locales/client.sl.yml
+++ b/plugins/discourse-presence/config/locales/client.sl.yml
@@ -10,3 +10,8 @@ sl:
presence:
replying: "odgovarja"
editing: "urejanje"
+ replying_to_topic:
+ one: "odgovarja"
+ two: "odgovarja"
+ few: "odgovarja"
+ other: "odgovarja"
diff --git a/plugins/discourse-presence/config/locales/server.sl.yml b/plugins/discourse-presence/config/locales/server.sl.yml
index f22db5aeed..c78811cd11 100644
--- a/plugins/discourse-presence/config/locales/server.sl.yml
+++ b/plugins/discourse-presence/config/locales/server.sl.yml
@@ -7,5 +7,5 @@
sl:
site_settings:
- presence_enabled: 'Pokaži uporabnice/ke, ki trenutno odgovarjajo na odprto temo ali urejujejo objavo?'
+ presence_enabled: 'Pokaži uporabnike, ki trenutno odgovarjajo na odprto temo ali urejujejo objavo?'
presence_max_users_shown: 'Maksimalno prikazano število uporabnikov.'
diff --git a/plugins/poll/assets/stylesheets/common/poll.scss b/plugins/poll/assets/stylesheets/common/poll.scss
index 8510fe6c56..63f671d9ee 100644
--- a/plugins/poll/assets/stylesheets/common/poll.scss
+++ b/plugins/poll/assets/stylesheets/common/poll.scss
@@ -16,20 +16,17 @@ div.poll {
li {
cursor: pointer;
font-size: $font-up-1;
- &:not(:last-of-type) {
- margin-bottom: 0.5em;
- }
}
li[data-poll-option-id] {
color: $primary;
- padding: 0.5em 0.7em 0.7em 0.5em;
+ padding: 0.5em 0;
}
img {
- max-width: 100% !important; /* needed to override internal styles */
+ // needed to override internal styles in image-sizing hack
+ max-width: 100% !important;
height: auto;
- margin-top: 0.25em;
}
.poll-info {
@@ -38,34 +35,34 @@ div.poll {
padding: 1em 0;
.info-label {
- font-size: 1.7em;
+ font-size: $font-up-4;
line-height: $line-height-medium;
}
.info-text {
- margin: 5px 0;
+ margin: 0.25em 0;
display: block;
}
}
.poll-container {
vertical-align: middle;
- padding: 0.8em;
+ padding: 0.5em 1em;
.poll-results-number-rating {
- font-size: 2em;
+ font-size: $font-up-5;
}
}
.poll-buttons {
.info-text {
- margin: 0 5px;
+ margin: 0.25em 0;
color: $primary-medium;
}
}
- .poll-voters-list {
- margin-top: 0.25em;
+ .poll-voters:not(:empty) {
+ margin-bottom: 0.25em;
li {
display: inline;
}
@@ -79,17 +76,18 @@ div.poll {
.results {
> li {
cursor: default;
- padding: 0.5em 0.7em 0.7em 0.5em;
+ padding: 0.25em 0;
+ &:last-child {
+ padding-bottom: 0;
+ }
}
.option {
- padding-bottom: 0.25em;
p {
margin: 0;
}
}
.percentage {
- font-size: $font-up-1;
float: right;
color: $primary-medium;
margin-left: 0.25em;
diff --git a/plugins/poll/assets/stylesheets/desktop/poll.scss b/plugins/poll/assets/stylesheets/desktop/poll.scss
index 0c1b15273c..6926e4a702 100644
--- a/plugins/poll/assets/stylesheets/desktop/poll.scss
+++ b/plugins/poll/assets/stylesheets/desktop/poll.scss
@@ -15,7 +15,7 @@ div.poll {
}
p {
- margin: 1.5em;
+ margin: 0.5em 0;
}
.info-label {
@@ -30,7 +30,7 @@ div.poll {
.poll-buttons {
border-top: 1px solid $primary-low;
- padding: 1em 1.25em;
+ padding: 1em;
.info-text {
line-height: 2em;
diff --git a/plugins/poll/assets/stylesheets/mobile/poll.scss b/plugins/poll/assets/stylesheets/mobile/poll.scss
index a7efc3f483..fd0178e020 100644
--- a/plugins/poll/assets/stylesheets/mobile/poll.scss
+++ b/plugins/poll/assets/stylesheets/mobile/poll.scss
@@ -1,20 +1,19 @@
div.poll {
.poll-buttons {
- padding: 0.5em 1.25em 1em 1.25em;
+ padding: 0.5em 1em 1em 1em;
button {
- margin: 0.25em;
+ margin-right: 0.5em;
}
}
.poll-info {
- padding: 0.5em 1.25em 0 1.25em;
+ padding: 0 1em;
display: flex;
flex-wrap: wrap;
border-top: 1px solid $primary-low;
.info-text {
display: inline;
- margin: 0 0.5em 0.25em 0;
}
.info-number {
font-size: $font-up-6;
@@ -23,8 +22,8 @@ div.poll {
margin: 0;
width: 100%;
}
- .info-label:before {
- content: "\00a0"; //nbsp
+ .info-label {
+ margin-left: 0.25em;
}
}
}
diff --git a/plugins/poll/config/locales/server.fr.yml b/plugins/poll/config/locales/server.fr.yml
index 59d4fa314b..047b65b6a6 100644
--- a/plugins/poll/config/locales/server.fr.yml
+++ b/plugins/poll/config/locales/server.fr.yml
@@ -14,7 +14,7 @@ fr:
poll:
invalid_argument: "Valeur '%{value}' invalide pour paramètre '%{argument}'."
multiple_polls_without_name: "Plusieurs sondages n'ont pas de nom. Utilisez l'attribut 'name' pour donner un identifiant unique aux sondages."
- multiple_polls_with_same_name: "Plusieurs sondages ont le même noms : %{name}. Utilisez l'attribut 'name' pour donner un identifiant unique aux sondages."
+ multiple_polls_with_same_name: "Plusieurs sondages ont le même nom : %{name}. Utilisez l'attribut 'name' pour donner un identifiant unique aux sondages."
default_poll_must_have_at_least_2_options: "Un sondage doit contenir au moins deux options."
named_poll_must_have_at_least_2_options: "Le sondage %{name} doit contenir au moins deux options."
default_poll_must_have_less_options:
diff --git a/spec/components/migration/safe_migrate_spec.rb b/spec/components/migration/safe_migrate_spec.rb
index 62b94805cb..0255006adb 100644
--- a/spec/components/migration/safe_migrate_spec.rb
+++ b/spec/components/migration/safe_migrate_spec.rb
@@ -11,16 +11,6 @@ describe Migration::SafeMigrate do
Migration::SafeMigrate::SafeMigration.enable_safe!
end
- def capture_stdout
- old_stdout = $stdout
- io = StringIO.new
- $stdout = io
- yield
- io.string
- ensure
- $stdout = old_stdout
- end
-
def migrate_up(path)
migrations = ActiveRecord::MigrationContext.new(path).migrations
ActiveRecord::Migrator.new(:up, migrations, migrations.first.version).run
diff --git a/spec/components/s3_inventory_spec.rb b/spec/components/s3_inventory_spec.rb
new file mode 100644
index 0000000000..fdb4a793a6
--- /dev/null
+++ b/spec/components/s3_inventory_spec.rb
@@ -0,0 +1,82 @@
+require "rails_helper"
+require "s3_helper"
+require "s3_inventory"
+require "file_store/s3_store"
+
+describe "S3Inventory" do
+ let(:client) { Aws::S3::Client.new(stub_responses: true) }
+ let(:helper) { S3Helper.new(SiteSetting.Upload.s3_upload_bucket.downcase, "", client: client) }
+ let(:store) { FileStore::S3Store.new(helper) }
+ let(:inventory) { S3Inventory.new(helper, :upload) }
+ let(:csv_filename) { "#{Rails.root}/spec/fixtures/csv/s3_inventory.csv" }
+
+ before do
+ SiteSetting.enable_s3_uploads = true
+ SiteSetting.s3_access_key_id = "abc"
+ SiteSetting.s3_secret_access_key = "def"
+ SiteSetting.enable_s3_inventory = true
+
+ client.stub_responses(:list_objects, -> (context) {
+ inventory_data_path = "#{S3Inventory::INVENTORY_PREFIX}/#{S3Inventory::INVENTORY_VERSION}/bucket/original/data"
+ expect(context.params[:prefix]).to eq(inventory_data_path)
+
+ {
+ contents: [
+ {
+ etag: "\"70ee1738b6b21e2c8a43f3a5ab0eee71\"",
+ key: "example1.csv.gz",
+ last_modified: Time.parse("2014-11-21T19:40:05.000Z"),
+ owner: {
+ display_name: "myname",
+ id: "12345example25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc",
+ },
+ size: 11,
+ storage_class: "STANDARD",
+ },
+ {
+ etag: "\"9c8af9a76df052144598c115ef33e511\"",
+ key: "example2.csv.gz",
+ last_modified: Time.parse("2013-11-15T01:10:49.000Z"),
+ owner: {
+ display_name: "myname",
+ id: "12345example25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc",
+ },
+ size: 713193,
+ storage_class: "STANDARD",
+ }
+ ],
+ next_marker: "eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAyfQ=="
+ }
+ })
+ end
+
+ it "should return the latest inventory file name" do
+ expect(inventory.file.key).to eq("example1.csv.gz")
+ end
+
+ it "should raise error if an inventory file is not found" do
+ client.stub_responses(:list_objects, contents: [])
+ output = capture_stdout { inventory.list_missing }
+ expect(output).to eq("Failed to list inventory from S3\n")
+ end
+
+ it "should display missing uploads correctly" do
+ freeze_time
+
+ CSV.foreach(csv_filename, headers: false) do |row|
+ Fabricate(:upload, etag: row[S3Inventory::CSV_ETAG_INDEX], created_at: 2.days.ago)
+ end
+ upload = Fabricate(:upload, etag: "ETag", created_at: 1.days.ago)
+ Fabricate(:upload, etag: "ETag2", created_at: Time.now)
+
+ inventory.expects(:decompress_inventory_file)
+ inventory.expects(:csv_filename).returns(csv_filename)
+ inventory.file.expects(:last_modified).returns(Time.now)
+
+ output = capture_stdout do
+ inventory.list_missing
+ end
+
+ expect(output).to eq("Downloading inventory file to tmp directory...\n#{upload.url}\n1 of 4 uploads are missing\n")
+ end
+end
diff --git a/spec/components/search_spec.rb b/spec/components/search_spec.rb
index ce6088a0a9..70b9ea8ab2 100644
--- a/spec/components/search_spec.rb
+++ b/spec/components/search_spec.rb
@@ -1053,6 +1053,19 @@ describe Search do
results = Search.execute('first in:title')
expect(results.posts.length).to eq(0)
end
+
+ it 'works irrespective of the order' do
+ topic = Fabricate(:topic, title: "A topic about Discourse")
+ Fabricate(:post, topic: topic, raw: "This is another post")
+ topic2 = Fabricate(:topic, title: "This is another topic")
+ Fabricate(:post, topic: topic2, raw: "Discourse is awesome")
+
+ results = Search.execute('Discourse in:title status:open')
+ expect(results.posts.length).to eq(1)
+
+ results = Search.execute('in:title status:open Discourse')
+ expect(results.posts.length).to eq(1)
+ end
end
context 'ignore_diacritics' do
diff --git a/spec/components/site_settings/type_supervisor_spec.rb b/spec/components/site_settings/type_supervisor_spec.rb
index 9648b0ec27..181a06a146 100644
--- a/spec/components/site_settings/type_supervisor_spec.rb
+++ b/spec/components/site_settings/type_supervisor_spec.rb
@@ -331,6 +331,7 @@ describe SiteSettings::TypeSupervisor do
settings.setting(:type_float, 2.3232)
settings.setting(:type_string, 'string')
settings.setting(:type_url_list, 'string', type: 'url_list')
+ settings.setting(:type_textarea, 'string', textarea: true)
settings.setting(:type_enum_choices, '2', type: 'enum', choices: ['1', '2'])
settings.setting(:type_enum_class, 'a', enum: 'TestEnumClass2')
settings.setting(:type_list, 'a', type: 'list', choices: ['a', 'b'], list_type: 'compact')
@@ -355,6 +356,9 @@ describe SiteSettings::TypeSupervisor do
it 'returns url_list type' do
expect(settings.type_supervisor.type_hash(:type_url_list)[:type]).to eq 'url_list'
end
+ it 'returns textarea type' do
+ expect(settings.type_supervisor.type_hash(:type_textarea)[:textarea]).to eq true
+ end
it 'returns enum type' do
expect(settings.type_supervisor.type_hash(:type_enum_choices)[:type]).to eq 'enum'
end
diff --git a/spec/components/svg_sprite/svg_sprite_spec.rb b/spec/components/svg_sprite/svg_sprite_spec.rb
index 1d0fad90cc..b33fc70d41 100644
--- a/spec/components/svg_sprite/svg_sprite_spec.rb
+++ b/spec/components/svg_sprite/svg_sprite_spec.rb
@@ -3,7 +3,7 @@ require 'rails_helper'
describe SvgSprite do
before do
- SvgSprite.rebuild_cache
+ SvgSprite.expire_cache
end
it 'can generate a bundle' do
@@ -12,6 +12,15 @@ describe SvgSprite do
expect(bundle).to match(/angle-double-down/)
end
+ it 'can generate paths' do
+ version = SvgSprite.version # Icons won't change for this test
+ expect(SvgSprite.path).to eq("/svg-sprite/#{Discourse.current_hostname}/svg--#{version}.js")
+ expect(SvgSprite.path([1, 2])).to eq("/svg-sprite/#{Discourse.current_hostname}/svg-1,2-#{version}.js")
+
+ # Safe mode
+ expect(SvgSprite.path([nil])).to eq("/svg-sprite/#{Discourse.current_hostname}/svg--#{version}.js")
+ end
+
it 'can search for a specific FA icon' do
expect(SvgSprite.search("fa-heart")).to match(/heart/)
expect(SvgSprite.search("poo-storm")).to match(/poo-storm/)
@@ -51,26 +60,43 @@ describe SvgSprite do
it 'includes icons defined in theme settings' do
theme = Fabricate(:theme)
- theme.set_field(target: :settings, name: :yaml, value: "custom_icon: magic")
+
+ # Works for default settings:
+ theme.set_field(target: :settings, name: :yaml, value: "custom_icon: dragon")
theme.save!
+ expect(SvgSprite.all_icons([theme.id])).to include("dragon")
- # TODO: add test for default settings values
+ # Automatically purges cache when default changes:
+ theme.set_field(target: :settings, name: :yaml, value: "custom_icon: gamepad")
+ theme.save!
+ expect(SvgSprite.all_icons([theme.id])).to include("gamepad")
+ # Works when applying override
theme.update_setting(:custom_icon, "gas-pump")
- expect(SvgSprite.all_icons).to include("gas-pump")
+ expect(SvgSprite.all_icons([theme.id])).to include("gas-pump")
+ # Works when changing override
theme.update_setting(:custom_icon, "gamepad")
- expect(SvgSprite.all_icons).to include("gamepad")
- expect(SvgSprite.all_icons).not_to include("gas-pump")
+ expect(SvgSprite.all_icons([theme.id])).to include("gamepad")
+ expect(SvgSprite.all_icons([theme.id])).not_to include("gas-pump")
# FA5 syntax
theme.update_setting(:custom_icon, "fab fa-bandcamp")
- expect(SvgSprite.all_icons).to include("fab-bandcamp")
+ expect(SvgSprite.all_icons([theme.id])).to include("fab-bandcamp")
# Internal Discourse syntax + multiple icons
theme.update_setting(:custom_icon, "fab-android|dragon")
- expect(SvgSprite.all_icons).to include("fab-android")
- expect(SvgSprite.all_icons).to include("dragon")
+ expect(SvgSprite.all_icons([theme.id])).to include("fab-android")
+ expect(SvgSprite.all_icons([theme.id])).to include("dragon")
+
+ # Check themes don't leak into non-theme sprite sheet
+ expect(SvgSprite.all_icons).not_to include("dragon")
+
+ # Check components are included
+ theme.update(component: true)
+ parent_theme = Fabricate(:theme)
+ parent_theme.add_child_theme!(theme)
+ expect(SvgSprite.all_icons([parent_theme.id])).to include("dragon")
end
it 'includes icons from SiteSettings' do
@@ -82,10 +108,12 @@ describe SvgSprite do
expect(all_icons).to include("fab-bandcamp")
SiteSetting.svg_icon_subset = nil
+ SvgSprite.expire_cache
expect(SvgSprite.all_icons).not_to include("drafting-compass")
# does not fail on non-string setting
SiteSetting.svg_icon_subset = false
+ SvgSprite.expire_cache
expect(SvgSprite.all_icons).to be_truthy
end
diff --git a/spec/components/theme_settings_manager_spec.rb b/spec/components/theme_settings_manager_spec.rb
index feb0382298..525d98d507 100644
--- a/spec/components/theme_settings_manager_spec.rb
+++ b/spec/components/theme_settings_manager_spec.rb
@@ -128,6 +128,12 @@ describe ThemeSettingsManager do
expect { string_setting.value = ("a" * 21) }.to raise_error(Discourse::InvalidParameters)
end
+
+ it "can be a textarea" do
+ string_setting = find_by_name(:string_setting_02)
+ expect(find_by_name(:string_setting_02).textarea).to eq(false)
+ expect(find_by_name(:string_setting_03).textarea).to eq(true)
+ end
end
context "List" do
diff --git a/spec/fixtures/csv/s3_inventory.csv b/spec/fixtures/csv/s3_inventory.csv
new file mode 100644
index 0000000000..04325fb7c3
--- /dev/null
+++ b/spec/fixtures/csv/s3_inventory.csv
@@ -0,0 +1,3 @@
+"abc","original/0184537a4f419224404d013414e913a4f56018f2.jpg","defcaac0b4aca535c284e95f30d608d0"
+"abc","original/050afc0ab01debe8cf48fd2ce50fbbf5eb072815.jpg","0cdc623af39cde0adb382670a6dc702a"
+"abc","original/0789fbf5490babc68326b9cec90eeb0d6590db05.png","25c02eaceef4cb779fc17030d33f7f06"
diff --git a/spec/fixtures/images/image.svg b/spec/fixtures/images/image.svg
index b95c0f4a79..f997dcfde2 100644
--- a/spec/fixtures/images/image.svg
+++ b/spec/fixtures/images/image.svg
@@ -1,3 +1,6 @@
diff --git a/spec/fixtures/theme_settings/valid_settings.yaml b/spec/fixtures/theme_settings/valid_settings.yaml
index 8250f34f38..2885fba1b8 100644
--- a/spec/fixtures/theme_settings/valid_settings.yaml
+++ b/spec/fixtures/theme_settings/valid_settings.yaml
@@ -10,6 +10,10 @@ string_setting_02:
min: 2
max: 20
+string_setting_03:
+ default: "string value"
+ textarea: true
+
integer_setting: 51
integer_setting_02:
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
index b769cadb3a..0ddf281380 100644
--- a/spec/helpers/application_helper_spec.rb
+++ b/spec/helpers/application_helper_spec.rb
@@ -233,28 +233,58 @@ describe ApplicationHelper do
describe 'crawlable_meta_data' do
context "opengraph image" do
it 'returns the correct image' do
- SiteSetting.default_opengraph_image_url = '/images/og-image.png'
- SiteSetting.twitter_summary_large_image_url = '/images/twitter.png'
- SiteSetting.large_icon_url = '/images/large_icon.png'
- SiteSetting.apple_touch_icon_url = '/images/default-apple-touch-icon.png'
- SiteSetting.logo_url = '/images/d-logo-sketch.png'
+ SiteSetting.opengraph_image = Fabricate(:upload,
+ url: '/images/og-image.png'
+ )
- expect(helper.crawlable_meta_data(image: "some-image.png")).to include("some-image.png")
- expect(helper.crawlable_meta_data).to include("/images/og-image.png")
+ SiteSetting.twitter_summary_large_image = Fabricate(:upload,
+ url: '/images/twitter.png'
+ )
- SiteSetting.default_opengraph_image_url = ''
- expect(helper.crawlable_meta_data).to include("/images/twitter.png")
+ SiteSetting.large_icon = Fabricate(:upload,
+ url: '/images/large_icon.png'
+ )
- SiteSetting.twitter_summary_large_image_url = ''
- expect(helper.crawlable_meta_data).to include("/images/large_icon.png")
+ SiteSetting.apple_touch_icon = Fabricate(:upload,
+ url: '/images/default-apple-touch-icon.png'
+ )
- SiteSetting.large_icon_url = ''
- expect(helper.crawlable_meta_data).to include("/images/default-apple-touch-icon.png")
+ SiteSetting.logo = Fabricate(:upload, url: '/images/d-logo-sketch.png')
- SiteSetting.apple_touch_icon_url = ''
- expect(helper.crawlable_meta_data).to include("/images/d-logo-sketch.png")
+ expect(
+ helper.crawlable_meta_data(image: "some-image.png")
+ ).to include("some-image.png")
+
+ expect(helper.crawlable_meta_data).to include(
+ SiteSetting.opengraph_image_url
+ )
+
+ SiteSetting.opengraph_image = nil
+
+ expect(helper.crawlable_meta_data).to include(
+ SiteSetting.site_twitter_summary_large_image_url
+ )
+
+ SiteSetting.twitter_summary_large_image = nil
+
+ expect(helper.crawlable_meta_data).to include(
+ SiteSetting.site_large_icon_url
+ )
+
+ SiteSetting.large_icon = nil
+
+ expect(helper.crawlable_meta_data).to include(
+ SiteSetting.site_apple_touch_icon_url
+ )
+
+ SiteSetting.apple_touch_icon = nil
+ SiteSetting.apple_touch_icon_url = nil
+
+ expect(helper.crawlable_meta_data).to include(SiteSetting.site_logo_url)
+
+ SiteSetting.logo = nil
+ SiteSetting.logo_url = nil
- SiteSetting.logo_url = ''
expect(helper.crawlable_meta_data).to_not include("/images")
end
end
diff --git a/spec/jobs/update_s3_inventory_spec.rb b/spec/jobs/update_s3_inventory_spec.rb
new file mode 100644
index 0000000000..07241cea0b
--- /dev/null
+++ b/spec/jobs/update_s3_inventory_spec.rb
@@ -0,0 +1,52 @@
+require 'rails_helper'
+require "file_store/s3_store"
+
+describe Jobs::UpdateS3Inventory do
+ before do
+ SiteSetting.enable_s3_uploads = true
+ SiteSetting.s3_access_key_id = "abc"
+ SiteSetting.s3_secret_access_key = "def"
+ SiteSetting.enable_s3_inventory = true
+
+ store = FileStore::S3Store.new
+ @client = Aws::S3::Client.new(stub_responses: true)
+ store.s3_helper.stubs(:s3_client).returns(@client)
+ Discourse.stubs(:store).returns(store)
+ end
+
+ it "updates the bucket policy and inventory configuration in S3" do
+ id = "original"
+ path = File.join(S3Inventory::INVENTORY_PREFIX, S3Inventory::INVENTORY_VERSION)
+
+ @client.expects(:put_bucket_policy).with(
+ bucket: "bucket",
+ policy: "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"InventoryAndAnalyticsPolicy\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"s3.amazonaws.com\"},\"Action\":[\"s3:PutObject\"],\"Resource\":[\"arn:aws:s3:::bucket/#{path}/*\"],\"Condition\":{\"ArnLike\":{\"aws:SourceArn\":\"arn:aws:s3:::bucket\"},\"StringEquals\":{\"s3:x-amz-acl\":\"bucket-owner-full-control\"}}}]}"
+ )
+ @client.expects(:put_bucket_inventory_configuration)
+ @client.expects(:put_bucket_inventory_configuration).with(
+ bucket: "bucket",
+ id: id,
+ inventory_configuration: {
+ destination: {
+ s3_bucket_destination: {
+ bucket: "arn:aws:s3:::bucket",
+ prefix: path,
+ format: "CSV"
+ }
+ },
+ filter: {
+ prefix: id
+ },
+ is_enabled: true,
+ id: id,
+ included_object_versions: "Current",
+ optional_fields: ["ETag"],
+ schedule: { frequency: "Daily" }
+ },
+ use_accelerate_endpoint: false
+ )
+
+ described_class.new.execute(nil)
+ end
+
+end
diff --git a/spec/models/invite_spec.rb b/spec/models/invite_spec.rb
index 6ed73ee538..15ebea3f32 100644
--- a/spec/models/invite_spec.rb
+++ b/spec/models/invite_spec.rb
@@ -25,9 +25,15 @@ describe Invite do
context 'email validators' do
let(:coding_horror) { Fabricate(:coding_horror) }
- let(:invite) { Invite.create(email: "test@mailinator.com", invited_by: coding_horror) }
+
+ it "should not allow an invite with unformatted email address" do
+ expect {
+ Fabricate(:invite, email: "John Doe