From b105a6a06451cb80e0f59a3174a68307a2fdaef7 Mon Sep 17 00:00:00 2001
From: Alexey Py
Date: Wed, 4 Jan 2017 16:24:36 +0300
Subject: [PATCH 01/54] Update copyright year
Update year to 2017
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 6cdf4c101b8..0c12ed016ff 100644
--- a/README.md
+++ b/README.md
@@ -84,7 +84,7 @@ The original Discourse code contributors can be found in [**AUTHORS.MD**](docs/A
## Copyright / License
-Copyright 2014 - 2016 Civilized Discourse Construction Kit, Inc.
+Copyright 2014 - 2017 Civilized Discourse Construction Kit, Inc.
Licensed under the GNU General Public License Version 2.0 (or later);
you may not use this work except in compliance with the License.
From e0bbe331dff5c99131e992090488a57d0b1db08e Mon Sep 17 00:00:00 2001
From: Neil Lalonde
Date: Fri, 6 Jan 2017 16:10:39 -0500
Subject: [PATCH 02/54] Version bump to v1.8.0.beta1
---
lib/version.rb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/version.rb b/lib/version.rb
index cbb65b44352..78cd1fbdf30 100644
--- a/lib/version.rb
+++ b/lib/version.rb
@@ -3,9 +3,9 @@ module Discourse
unless defined? ::Discourse::VERSION
module VERSION #:nodoc:
MAJOR = 1
- MINOR = 7
+ MINOR = 8
TINY = 0
- PRE = 'beta11'
+ PRE = 'beta1'
STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
end
From 8e7dcbac8f9aa389dad56e285d8957e5d8a5d450 Mon Sep 17 00:00:00 2001
From: Jeff Atwood
Date: Fri, 6 Jan 2017 14:14:18 -0800
Subject: [PATCH 03/54] Update INSTALL-cloud.md
---
docs/INSTALL-cloud.md | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/docs/INSTALL-cloud.md b/docs/INSTALL-cloud.md
index 5e01cb0e101..e9aaccf8bf8 100644
--- a/docs/INSTALL-cloud.md
+++ b/docs/INSTALL-cloud.md
@@ -1,6 +1,6 @@
-**Set up Discourse in the cloud in under 30 minutes** with zero knowledge of Rails or Linux shell using our [Discourse Docker image][dd]. We recommend [DigitalOcean][do], but these steps will work on any Docker-compatible cloud provider or local server.
+**Set up Discourse in the cloud in under 30 minutes** with zero knowledge of Rails or Linux shell using our Discourse Docker image. We recommend [DigitalOcean][do], but these steps will work on any Docker-compatible cloud provider or local server.
-> 🔔 Don't have 30 minutes to set this up? For a flat one-time fee of $99, the community can install Discourse in the cloud for you. [Click here to purchase a self-supported community install](http://jaypfaffman.com/product/99-install/).
+> 🔔 Don't have 30 minutes to set this up? For a flat one-time fee of $99, the community can install Discourse in the cloud for you. [Click here to purchase a self-supported community install](https://www.literatecomputing.com/product/discourse-install/).
### Create New Cloud Server
@@ -136,8 +136,12 @@ Do you want...
- Free HTTPS / SSL support? [Configure Let's Encrypt](https://meta.discourse.org/t/setting-up-lets-encrypt-cert-with-discourse-docker/40709). Paid HTTPS / SSL support? [Configure SSL](https://meta.discourse.org/t/allowing-ssl-for-your-discourse-docker-setup/13847).
+- Use a plugin [from Discourse](https://github.com/discourse) or a third party? [Configure plugins](https://meta.discourse.org/t/install-a-plugin/19157)
+
- Multiple Discourse sites on the same server? [Configure multisite](https://meta.discourse.org/t/multisite-configuration-with-docker/14084).
+- Webhooks when events happen in Discourse? [Configure webhooks](https://meta.discourse.org/t/setting-up-webhooks/49045).
+
- A Content Delivery Network to speed up worldwide access? [Configure a CDN](https://meta.discourse.org/t/enable-a-cdn-for-your-discourse/14857). We recommend [Fastly](http://www.fastly.com/).
- Import old content from vBulletin, PHPbb, Vanilla, Drupal, BBPress, etc? [See our open source importers](https://github.com/discourse/discourse/tree/master/script/import_scripts).
From 393f49f224b9a1689562844f408ecdcc32d0b36f Mon Sep 17 00:00:00 2001
From: Kurtis Rainbolt-Greene
Date: Fri, 6 Jan 2017 14:54:38 -0800
Subject: [PATCH 04/54] Allow for a custom hub server
---
lib/discourse_hub.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/discourse_hub.rb b/lib/discourse_hub.rb
index e174cf065a5..3176902c849 100644
--- a/lib/discourse_hub.rb
+++ b/lib/discourse_hub.rb
@@ -42,7 +42,7 @@ module DiscourseHub
def self.hub_base_url
if Rails.env.production?
- 'https://api.discourse.org/api'
+ ENV['HUB_BASE_URL'] || 'https://api.discourse.org/api'
else
ENV['HUB_BASE_URL'] || 'http://local.hub:3000/api'
end
From b4a1a9daf8eddf49d9d2303c25f0adf1da1cd85e Mon Sep 17 00:00:00 2001
From: Jeff Atwood
Date: Fri, 6 Jan 2017 19:31:08 -0800
Subject: [PATCH 05/54] Update INSTALL-cloud.md
---
docs/INSTALL-cloud.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/INSTALL-cloud.md b/docs/INSTALL-cloud.md
index e9aaccf8bf8..a3fb2204e69 100644
--- a/docs/INSTALL-cloud.md
+++ b/docs/INSTALL-cloud.md
@@ -1,4 +1,4 @@
-**Set up Discourse in the cloud in under 30 minutes** with zero knowledge of Rails or Linux shell using our Discourse Docker image. We recommend [DigitalOcean][do], but these steps will work on any Docker-compatible cloud provider or local server.
+**Set up Discourse in the cloud in under 30 minutes** with zero knowledge of Rails or Linux shell. We recommend [DigitalOcean][do], but these steps will work on any **Docker-compatible** cloud provider or local server.
> 🔔 Don't have 30 minutes to set this up? For a flat one-time fee of $99, the community can install Discourse in the cloud for you. [Click here to purchase a self-supported community install](https://www.literatecomputing.com/product/discourse-install/).
From ea1f4a002158c1cb59e21dbe29cd5ab91f264e5b Mon Sep 17 00:00:00 2001
From: Jeff Atwood
Date: Fri, 6 Jan 2017 23:51:12 -0800
Subject: [PATCH 06/54] add Hacker One page to security.md
---
docs/SECURITY.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/SECURITY.md b/docs/SECURITY.md
index 7c95b01a68a..01fc37fb19c 100644
--- a/docs/SECURITY.md
+++ b/docs/SECURITY.md
@@ -4,7 +4,7 @@ We take security very seriously at Discourse. We welcome any peer review of our
### Where should I report security issues?
-In order to give the community time to respond and upgrade we strongly urge you report all security issues privately. Please email us at `team@discourse.org` with details and we will respond ASAP. Security issues *always* take precedence over bug fixes and feature work. We can and do mark releases as "urgent" if they contain serious security fixes.
+In order to give the community time to respond and upgrade we strongly urge you report all security issues privately. Please use our [vulnerability disclosure program at Hacker One](https://hackerone.com/discourse) to provide details and repro steps and we will respond ASAP. If you prefer not to use Hacker One, email us directly at `team@discourse.org` with details and repro steps. Security issues *always* take precedence over bug fixes and feature work. We can and do mark releases as "urgent" if they contain serious security fixes.
### Password Storage
From bde42e397c8135799429f305aca41033b19a39be Mon Sep 17 00:00:00 2001
From: Miroslav Michalicka
Date: Sun, 8 Jan 2017 10:07:46 +0100
Subject: [PATCH 07/54] Migration script from Drupal 6
---
script/import_scripts/drupal-6.rb | 210 ++++++++++++++++++++++++++++++
1 file changed, 210 insertions(+)
create mode 100644 script/import_scripts/drupal-6.rb
diff --git a/script/import_scripts/drupal-6.rb b/script/import_scripts/drupal-6.rb
new file mode 100644
index 00000000000..9d1b751cda8
--- /dev/null
+++ b/script/import_scripts/drupal-6.rb
@@ -0,0 +1,210 @@
+require "mysql2"
+require File.expand_path(File.dirname(__FILE__) + "/base.rb")
+
+class ImportScripts::Drupal < ImportScripts::Base
+
+ DRUPAL_DB = ENV['DRUPAL_DB'] || "newsite3"
+ VID = ENV['DRUPAL_VID'] || 1
+
+ def initialize
+ super
+
+ @client = Mysql2::Client.new(
+ host: "localhost",
+ username: "root",
+ #password: "password",
+ database: DRUPAL_DB
+ )
+ end
+
+ def categories_query
+ @client.query("SELECT tid, name, description FROM term_data WHERE vid = #{VID}")
+ end
+
+ def execute
+ create_users(@client.query("SELECT uid id, name, mail email, created FROM users;")) do |row|
+ {id: row['id'], username: row['name'], email: row['email'], created_at: Time.zone.at(row['created'])}
+ end
+
+ # You'll need to edit the following query for your Drupal install:
+ #
+ # * Drupal allows duplicate category names, so you may need to exclude some categories or rename them here.
+ # * Table name may be term_data.
+ # * May need to select a vid other than 1.
+ create_categories(categories_query) do |c|
+ {id: c['tid'], name: c['name'], description: c['description']}
+ end
+
+ # "Nodes" in Drupal are divided into types. Here we import two types,
+ # and will later import all the comments/replies for each node.
+ # You will need to figure out what the type names are on your install and edit the queries to match.
+ if ENV['DRUPAL_IMPORT_BLOG']
+ create_blog_topics
+ end
+
+ create_forum_topics
+
+ create_replies
+
+ begin
+ create_admin(email: 'neil.lalonde@discourse.org', username: UserNameSuggester.suggest('neil'))
+ rescue => e
+ puts '', "Failed to create admin user"
+ puts e.message
+ end
+ end
+
+ def create_blog_topics
+ puts '', "creating blog topics"
+
+ create_category({
+ name: 'Blog',
+ user_id: -1,
+ description: "Articles from the blog"
+ }, nil) unless Category.find_by_name('Blog')
+
+ results = @client.query("
+ SELECT n.nid nid,
+ n.title title,
+ n.uid uid,
+ n.created created,
+ n.sticky sticky,
+ nr.body body
+ FROM node n,
+ LEFT JOIN node_revision nr ON nr.vid=n.vid
+ WHERE n.type = 'blog'
+ AND n.status = 1
+ ", cache_rows: false)
+
+ create_posts(results) do |row|
+ {
+ id: "nid:#{row['nid']}",
+ user_id: user_id_from_imported_user_id(row['uid']) || -1,
+ category: 'Blog',
+ raw: row['body'],
+ created_at: Time.zone.at(row['created']),
+ pinned_at: row['sticky'].to_i == 1 ? Time.zone.at(row['created']) : nil,
+ title: row['title'].try(:strip),
+ custom_fields: {import_id: "nid:#{row['nid']}"}
+ }
+ end
+ end
+
+ def create_forum_topics
+ puts '', "creating forum topics"
+
+ total_count = @client.query("
+ SELECT COUNT(*) count
+ FROM node n
+ LEFT JOIN forum f ON f.vid=n.vid
+ WHERE n.type = 'forum'
+ AND n.status = 1
+ ").first['count']
+
+ batch_size = 1000
+
+ batches(batch_size) do |offset|
+ results = @client.query("
+ SELECT n.nid nid,
+ n.title title,
+ f.tid tid,
+ n.uid uid,
+ n.created created,
+ n.sticky sticky,
+ nr.body body
+ FROM node n
+ LEFT JOIN forum f ON f.vid=n.vid
+ LEFT JOIN node_revisions nr ON nr.vid=n.vid
+ WHERE node.type = 'forum'
+ AND node.status = 1
+ LIMIT #{batch_size}
+ OFFSET #{offset};
+ ", cache_rows: false)
+
+ break if results.size < 1
+
+ next if all_records_exist? :posts, results.map {|p| "nid:#{p['nid']}"}
+
+ create_posts(results, total: total_count, offset: offset) do |row|
+ {
+ id: "nid:#{row['nid']}",
+ user_id: user_id_from_imported_user_id(row['uid']) || -1,
+ category: category_id_from_imported_category_id(row['tid']),
+ raw: row['body'],
+ created_at: Time.zone.at(row['created']),
+ pinned_at: row['sticky'].to_i == 1 ? Time.zone.at(row['created']) : nil,
+ title: row['title'].try(:strip)
+ }
+ end
+ end
+ end
+
+ def create_replies
+ puts '', "creating replies in topics"
+
+ if ENV['DRUPAL_IMPORT_BLOG']
+ node_types = "('forum','blog')"
+ else
+ node_types = "('forum')"
+ end
+
+ total_count = @client.query("
+ SELECT COUNT(*) count
+ FROM comments c
+ LEFT JOIN node n ON n.nid=c.nid
+ WHERE node.type IN #{node_types}
+ AND node.status = 1
+ AND comments.status=0;
+ ").first['count']
+
+ batch_size = 1000
+
+ batches(batch_size) do |offset|
+ results = @client.query("
+ SELECT c.cid,
+ c.pid,
+ c.nid,
+ c.uid,
+ c.timestamp,
+ c.comment body
+ FROM comments c
+ LEFT JOIN node n ON n.nid=c.nid
+ WHERE n.type IN #{node_types}
+ AND n.status = 1
+ AND c.status=0
+ LIMIT #{batch_size}
+ OFFSET #{offset};
+ ", cache_rows: false)
+
+ break if results.size < 1
+
+ next if all_records_exist? :posts, results.map {|p| "cid:#{p['cid']}"}
+
+ create_posts(results, total: total_count, offset: offset) do |row|
+ topic_mapping = topic_lookup_from_imported_post_id("nid:#{row['nid']}")
+ if topic_mapping && topic_id = topic_mapping[:topic_id]
+ h = {
+ id: "cid:#{row['cid']}",
+ topic_id: topic_id,
+ user_id: user_id_from_imported_user_id(row['uid']) || -1,
+ raw: row['body'],
+ created_at: Time.zone.at(row['timestamp']),
+ }
+ if row['pid']
+ parent = topic_lookup_from_imported_post_id("cid:#{row['pid']}")
+ h[:reply_to_post_number] = parent[:post_number] if parent and parent[:post_number] > 1
+ end
+ h
+ else
+ puts "No topic found for comment #{row['cid']}"
+ nil
+ end
+ end
+ end
+ end
+
+end
+
+if __FILE__==$0
+ ImportScripts::Drupal.new.perform
+end
From a313ddf8e3ad5b00ea0a674630ac808b808c052b Mon Sep 17 00:00:00 2001
From: Miroslav Michalicka
Date: Sun, 8 Jan 2017 10:16:32 +0100
Subject: [PATCH 08/54] Fix typos
---
script/import_scripts/drupal-6.rb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/script/import_scripts/drupal-6.rb b/script/import_scripts/drupal-6.rb
index 9d1b751cda8..1df513df409 100644
--- a/script/import_scripts/drupal-6.rb
+++ b/script/import_scripts/drupal-6.rb
@@ -70,8 +70,8 @@ class ImportScripts::Drupal < ImportScripts::Base
n.created created,
n.sticky sticky,
nr.body body
- FROM node n,
- LEFT JOIN node_revision nr ON nr.vid=n.vid
+ FROM node n
+ LEFT JOIN node_revisions nr ON nr.vid=n.vid
WHERE n.type = 'blog'
AND n.status = 1
", cache_rows: false)
From 0000de9501d1e8e2a1a27028086e5631ece29905 Mon Sep 17 00:00:00 2001
From: Guo Xiang Tan
Date: Mon, 9 Jan 2017 10:07:01 +0800
Subject: [PATCH 09/54] Run Travis against 2.4.0 as well.
---
.travis.yml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/.travis.yml b/.travis.yml
index ed1f7d20b12..2618ce9d8d0 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -24,7 +24,8 @@ matrix:
fast_finish: true
rvm:
- - 2.3.1
+ - 2.3.3
+ - 2.4.0
services:
- redis-server
From 95d1ad1ab847b78ca62e1c34e8b88ad4ab02de30 Mon Sep 17 00:00:00 2001
From: Guo Xiang Tan
Date: Mon, 9 Jan 2017 10:13:15 +0800
Subject: [PATCH 10/54] Fix typo.
---
config/locales/client.en.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 70d62b11e97..ee066861dfa 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -2561,7 +2561,7 @@ en:
warn_local_payload_url: "It seems you are trying to set up the webhook to a local url. Event delivered to a local address may cause side-effect or unexpected behaviours. Continue?"
secret_invalid: "Secret must not have any blank characters."
secret_too_short: "Secret should be at least 12 characters."
- secret_placeholder: "A optional string, used for generating signature"
+ secret_placeholder: "An optional string, used for generating signature"
event_type_missing: "You need to set up at least one event type."
content_type: "Content Type"
secret: "Secret"
From c260a4e34d8df1a6f8263ca0d3b5c3a6a8a8bb29 Mon Sep 17 00:00:00 2001
From: Guo Xiang Tan
Date: Mon, 9 Jan 2017 11:22:35 +0800
Subject: [PATCH 11/54] FIX: Can't add categories when creating a new web hook.
---
.../admin/controllers/admin-web-hooks-show.js.es6 | 6 ++++++
app/assets/javascripts/admin/models/web-hook.js.es6 | 13 +++++++------
.../javascripts/admin/templates/web-hooks-show.hbs | 2 +-
3 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/app/assets/javascripts/admin/controllers/admin-web-hooks-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-web-hooks-show.js.es6
index 53d8370403b..28f93925127 100644
--- a/app/assets/javascripts/admin/controllers/admin-web-hooks-show.js.es6
+++ b/app/assets/javascripts/admin/controllers/admin-web-hooks-show.js.es6
@@ -65,10 +65,16 @@ export default Ember.Controller.extend({
this.set('saved', false);
const url = extractDomainFromUrl(this.get('model.payload_url'));
const model = this.get('model');
+ const isNew = model.get('isNew');
+
const saveWebHook = () => {
return model.save().then(() => {
this.set('saved', true);
this.get('adminWebHooks').get('model').addObject(model);
+
+ if (isNew) {
+ this.transitionToRoute('adminWebHooks.show', model.get('id'));
+ }
}).catch(popupAjaxError);
};
diff --git a/app/assets/javascripts/admin/models/web-hook.js.es6 b/app/assets/javascripts/admin/models/web-hook.js.es6
index e688a4dd0a1..1ed76970efc 100644
--- a/app/assets/javascripts/admin/models/web-hook.js.es6
+++ b/app/assets/javascripts/admin/models/web-hook.js.es6
@@ -10,7 +10,6 @@ export default RestModel.extend({
verify_certificate: true,
active: false,
web_hook_event_types: null,
- categoriesFilter: null,
groupsFilterInName: null,
@computed('wildcard_web_hook')
@@ -23,9 +22,9 @@ export default RestModel.extend({
}
},
- @observes('category_ids')
- updateCategoriesFilter() {
- this.set('categoriesFilter', Category.findByIds(this.get('category_ids')));
+ @computed('category_ids')
+ categories(categoryIds) {
+ return Category.findByIds(categoryIds);
},
@observes('group_ids')
@@ -55,7 +54,9 @@ export default RestModel.extend({
createProperties() {
const types = this.get('web_hook_event_types');
- const categories = this.get('categoriesFilter');
+ const categories = this.get('categories');
+ const categoryIds = this.get('categories').map(c => c.id);
+
// Hack as {{group-selector}} accepts a comma-separated string as data source, but
// we use an array to populate the datasource above.
const groupsFilter = this.get('groupsFilterInName');
@@ -69,7 +70,7 @@ export default RestModel.extend({
verify_certificate: this.get('verify_certificate'),
active: this.get('active'),
web_hook_event_type_ids: Ember.isEmpty(types) ? [null] : types.map(type => type.id),
- category_ids: Ember.isEmpty(categories) ? [null] : categories.map(c => c.id),
+ category_ids: Ember.isEmpty(categoryIds) ? [null] : categoryIds,
group_ids: Ember.isEmpty(groupNames) || Ember.isEmpty(groupNames[0]) ? [null] : Discourse.Site.currentProp('groups')
.reduce((groupIds, g) => {
if (groupNames.includes(g.name)) { groupIds.push(g.id); }
diff --git a/app/assets/javascripts/admin/templates/web-hooks-show.hbs b/app/assets/javascripts/admin/templates/web-hooks-show.hbs
index b0e0c0c0bfb..458a18c1e22 100644
--- a/app/assets/javascripts/admin/templates/web-hooks-show.hbs
+++ b/app/assets/javascripts/admin/templates/web-hooks-show.hbs
@@ -50,7 +50,7 @@
HTML
From d6bf5b0e78364c5022e178d95da23f636e03a91e Mon Sep 17 00:00:00 2001
From: Guo Xiang Tan
Date: Wed, 11 Jan 2017 17:32:24 +0800
Subject: [PATCH 39/54] Use `any` orientation for web app manifest.
---
app/controllers/metadata_controller.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/metadata_controller.rb b/app/controllers/metadata_controller.rb
index 9d2332e1268..9a8fc915ce3 100644
--- a/app/controllers/metadata_controller.rb
+++ b/app/controllers/metadata_controller.rb
@@ -17,7 +17,7 @@ class MetadataController < ApplicationController
name: SiteSetting.title,
short_name: SiteSetting.title,
display: 'standalone',
- orientation: 'portrait',
+ orientation: 'any',
start_url: "#{Discourse.base_uri}/",
background_color: "##{ColorScheme.hex_for_name('secondary')}",
theme_color: "##{ColorScheme.hex_for_name('header_background')}",
From dfb633fde3c98caa61399db5216c02980262d004 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9gis=20Hanol?=
Date: Wed, 11 Jan 2017 11:03:36 +0100
Subject: [PATCH 40/54] remove 'already initialized constant' warning
---
lib/discourse.rb | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/lib/discourse.rb b/lib/discourse.rb
index 9acae903e10..9c960ae3de9 100644
--- a/lib/discourse.rb
+++ b/lib/discourse.rb
@@ -192,12 +192,12 @@ module Discourse
base_url_no_prefix + base_uri
end
- READONLY_MODE_KEY_TTL ||= 60
- READONLY_MODE_KEY ||= 'readonly_mode'.freeze
- PG_READONLY_MODE_KEY ||= 'readonly_mode:postgres'.freeze
+ READONLY_MODE_KEY_TTL ||= 60
+ READONLY_MODE_KEY ||= 'readonly_mode'.freeze
+ PG_READONLY_MODE_KEY ||= 'readonly_mode:postgres'.freeze
USER_READONLY_MODE_KEY ||= 'readonly_mode:user'.freeze
- READONLY_KEYS = [
+ READONLY_KEYS ||= [
READONLY_MODE_KEY,
PG_READONLY_MODE_KEY,
USER_READONLY_MODE_KEY
@@ -234,9 +234,7 @@ module Discourse
end
def self.readonly_mode?
- return true if recently_readonly?
- READONLY_KEYS.each { |key| return true if !!$redis.get(key) }
- false
+ recently_readonly? || READONLY_KEYS.any? { |key| !!$redis.get(key) }
end
def self.last_read_only
@@ -244,8 +242,7 @@ module Discourse
end
def self.recently_readonly?
- read_only = last_read_only[$redis.namespace]
- return false unless read_only
+ return false unless read_only = last_read_only[$redis.namespace]
read_only > 15.seconds.ago
end
From e793caf3e342a30ea3e93d2c7ad9e4a64b9c64aa Mon Sep 17 00:00:00 2001
From: Arpit Jalan
Date: Wed, 11 Jan 2017 16:15:02 +0530
Subject: [PATCH 41/54] FIX: only allow CSV file to be uploaded for bulk invite
---
.../javascripts/discourse/components/csv-uploader.js.es6 | 4 ++++
app/assets/javascripts/discourse/lib/utilities.js.es6 | 5 +++++
app/controllers/invites_controller.rb | 4 ++--
config/locales/client.en.yml | 1 +
4 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/app/assets/javascripts/discourse/components/csv-uploader.js.es6 b/app/assets/javascripts/discourse/components/csv-uploader.js.es6
index d89aaae30b7..70637588687 100644
--- a/app/assets/javascripts/discourse/components/csv-uploader.js.es6
+++ b/app/assets/javascripts/discourse/components/csv-uploader.js.es6
@@ -6,6 +6,10 @@ export default Em.Component.extend(UploadMixin, {
tagName: "span",
uploadUrl: "/invites/upload_csv",
+ validateUploadedFilesOptions() {
+ return { csvOnly: true };
+ },
+
@computed("uploading")
uploadButtonText(uploading) {
return uploading ? I18n.t("uploading") : I18n.t("user.invited.bulk_invite.text");
diff --git a/app/assets/javascripts/discourse/lib/utilities.js.es6 b/app/assets/javascripts/discourse/lib/utilities.js.es6
index 154f92553b5..5eeb3a358c4 100644
--- a/app/assets/javascripts/discourse/lib/utilities.js.es6
+++ b/app/assets/javascripts/discourse/lib/utilities.js.es6
@@ -192,6 +192,11 @@ export function validateUploadedFile(file, opts) {
bootbox.alert(I18n.t('post.errors.upload_not_authorized', { authorized_extensions: authorizedImagesExtensions() }));
return false;
}
+ } else if (opts["csvOnly"]) {
+ if (!(/\.csv$/i).test(name)) {
+ bootbox.alert(I18n.t('user.invited.bulk_invite.error'));
+ return false;
+ }
} else {
if (!authorizesAllExtensions() && !isAuthorizedFile(name)) {
bootbox.alert(I18n.t('post.errors.upload_not_authorized', { authorized_extensions: authorizedExtensions() }));
diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb
index ae62b9b8732..5b614bc3dc6 100644
--- a/app/controllers/invites_controller.rb
+++ b/app/controllers/invites_controller.rb
@@ -156,9 +156,9 @@ class InvitesController < ApplicationController
Scheduler::Defer.later("Upload CSV") do
begin
- data = if extension == ".csv"
+ data = if extension.downcase == ".csv"
path = Invite.create_csv(file, name)
- Jobs.enqueue(:bulk_invite, filename: "#{name}.csv", current_user_id: current_user.id)
+ Jobs.enqueue(:bulk_invite, filename: "#{name}#{extension}", current_user_id: current_user.id)
{url: path}
else
failed_json.merge(errors: [I18n.t("bulk_invite.file_should_be_csv")])
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 14d88913f01..bbe0aab2c83 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -833,6 +833,7 @@ en:
none: "You haven't invited anyone here yet. You can send individual invites, or invite a bunch of people at once by uploading a CSV file."
text: "Bulk Invite from File"
success: "File uploaded successfully, you will be notified via message when the process is complete."
+ error: "Sorry, file should be of csv format."
password:
title: "Password"
From 6c3426d266a7dfcfcdcf17a8d05abb837f71107d Mon Sep 17 00:00:00 2001
From: Robin Ward
Date: Wed, 11 Jan 2017 11:25:04 -0500
Subject: [PATCH 42/54] Let's not notify for trust levels on Staff, either
---
app/services/badge_granter.rb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/services/badge_granter.rb b/app/services/badge_granter.rb
index 206ffc14ed7..426e24ee8e0 100644
--- a/app/services/badge_granter.rb
+++ b/app/services/badge_granter.rb
@@ -274,7 +274,7 @@ class BadgeGranter
/*where*/
RETURNING id, user_id, granted_at
)
- select w.*, username, locale, u.admin FROM w
+ select w.*, username, locale, (u.admin OR u.moderator) AS staff FROM w
JOIN users u on u.id = w.user_id
"
@@ -315,7 +315,7 @@ class BadgeGranter
# Make this variable in this scope
notification = nil
- next if (row.admin && badge.awarded_for_trust_level?)
+ next if (row.staff && badge.awarded_for_trust_level?)
I18n.with_locale(notification_locale) do
notification = Notification.create!(
From b177827841bcee42a67e48c324ab6cdd4bf420b9 Mon Sep 17 00:00:00 2001
From: Neil Lalonde
Date: Wed, 11 Jan 2017 11:41:11 -0500
Subject: [PATCH 43/54] more specs for staff action logging
---
spec/services/staff_action_logger_spec.rb | 38 +++++++++++++++++++++++
spec/services/user_blocker_spec.rb | 14 +++++++++
2 files changed, 52 insertions(+)
diff --git a/spec/services/staff_action_logger_spec.rb b/spec/services/staff_action_logger_spec.rb
index 676b899dce9..773f990d104 100644
--- a/spec/services/staff_action_logger_spec.rb
+++ b/spec/services/staff_action_logger_spec.rb
@@ -369,4 +369,42 @@ describe StaffActionLogger do
expect(user_history.action).to eq(UserHistory.actions[:create_category])
end
end
+
+ describe 'log_lock_trust_level' do
+ let(:user) { Fabricate(:user) }
+
+ it "raises an error when argument is missing" do
+ expect { logger.log_lock_trust_level(nil) }.to raise_error(Discourse::InvalidParameters)
+ end
+
+ it "creates a new UserHistory record" do
+ user.trust_level_locked = true
+ expect { logger.log_lock_trust_level(user) }.to change { UserHistory.count }.by(1)
+ user_history = UserHistory.last
+ expect(user_history.action).to eq(UserHistory.actions[:lock_trust_level])
+
+ user.trust_level_locked = false
+ expect { logger.log_lock_trust_level(user) }.to change { UserHistory.count }.by(1)
+ user_history = UserHistory.last
+ expect(user_history.action).to eq(UserHistory.actions[:unlock_trust_level])
+ end
+ end
+
+ describe 'log_user_activate' do
+ let(:user) { Fabricate(:user) }
+
+ it "raises an error when argument is missing" do
+ expect { logger.log_user_activate(nil, nil) }.to raise_error(Discourse::InvalidParameters)
+ end
+
+ it "creates a new UserHistory record" do
+ reason = "Staff activated from admin"
+ expect {
+ logger.log_user_activate(user, reason)
+ }.to change { UserHistory.count }.by(1)
+ user_history = UserHistory.last
+ expect(user_history.action).to eq(UserHistory.actions[:activate_user])
+ expect(user_history.details).to eq(reason)
+ end
+ end
end
diff --git a/spec/services/user_blocker_spec.rb b/spec/services/user_blocker_spec.rb
index b75b5766a79..6761c44b3d6 100644
--- a/spec/services/user_blocker_spec.rb
+++ b/spec/services/user_blocker_spec.rb
@@ -58,6 +58,14 @@ describe UserBlocker do
SystemMessage.expects(:create).never
expect(block_user).to eq(false)
end
+
+ it "logs it with context" do
+ SystemMessage.stubs(:create).returns(Fabricate.build(:post))
+ expect {
+ UserBlocker.block(user, Fabricate(:admin))
+ }.to change { UserHistory.count }.by(1)
+ expect(UserHistory.last.context).to be_present
+ end
end
describe 'unblock' do
@@ -81,6 +89,12 @@ describe UserBlocker do
SystemMessage.expects(:create).never
unblock_user
end
+
+ it "logs it" do
+ expect {
+ unblock_user
+ }.to change { UserHistory.count }.by(1)
+ end
end
describe 'hide_posts' do
From c5d6bfe7e2ca558cb1e418cfae874c9cc309e0a0 Mon Sep 17 00:00:00 2001
From: Jay Pfaffman
Date: Wed, 11 Jan 2017 11:26:55 -0800
Subject: [PATCH 44/54] bbpress: Use nicename if display_name is missing
---
script/import_scripts/bbpress.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/script/import_scripts/bbpress.rb b/script/import_scripts/bbpress.rb
index bd5e872650b..26184192c5a 100644
--- a/script/import_scripts/bbpress.rb
+++ b/script/import_scripts/bbpress.rb
@@ -82,7 +82,7 @@ class ImportScripts::Bbpress < ImportScripts::Base
id: u["id"].to_i,
username: u["user_nicename"],
email: u["user_email"].downcase,
- name: u["display_name"],
+ name: u["display_name"].length > 0 ? u["display_name"] : u['user_nicename'],
created_at: u["user_registered"],
website: u["user_url"],
bio_raw: users_description[u["id"]],
From ffbaf374c85cf9b8d6d5fc14f021334821190e42 Mon Sep 17 00:00:00 2001
From: Jay Pfaffman
Date: Wed, 11 Jan 2017 12:55:25 -0800
Subject: [PATCH 45/54] use .presence rather than DIY checking
---
script/import_scripts/bbpress.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/script/import_scripts/bbpress.rb b/script/import_scripts/bbpress.rb
index 738535fa1a7..27c3be1deab 100644
--- a/script/import_scripts/bbpress.rb
+++ b/script/import_scripts/bbpress.rb
@@ -84,7 +84,7 @@ class ImportScripts::Bbpress < ImportScripts::Base
id: u["id"].to_i,
username: u["user_nicename"],
email: u["user_email"].downcase,
- name: u["display_name"].length > 0 ? u["display_name"] : u['user_nicename'],
+ name: u["display_name"].presence || u['user_nicename'],
created_at: u["user_registered"],
website: u["user_url"],
bio_raw: users_description[u["id"]],
From f3a325ac0fdd157af25d9981eab07f39286ce0a7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9gis=20Hanol?=
Date: Wed, 11 Jan 2017 21:55:31 +0100
Subject: [PATCH 46/54] bump onebox
---
Gemfile.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Gemfile.lock b/Gemfile.lock
index 0371a8438b6..fd19febf79e 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -208,7 +208,7 @@ GEM
omniauth-twitter (1.2.1)
json (~> 1.3)
omniauth-oauth (~> 1.1)
- onebox (1.7.2)
+ onebox (1.7.3)
fast_blank (>= 1.0.0)
htmlentities (~> 4.3.4)
moneta (~> 0.8)
From 887e9af84ffbfdfe1925164947af9892f9f2bbec Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9gis=20Hanol?=
Date: Wed, 11 Jan 2017 23:37:12 +0100
Subject: [PATCH 47/54] FEATURE: new 'max_image_megapixels' site setting
---
app/models/upload.rb | 15 +++++++++++----
config/locales/server.en.yml | 3 +++
config/site_settings.yml | 4 ++++
spec/fixtures/images/huge.jpg | Bin 0 -> 557056 bytes
spec/models/upload_spec.rb | 11 ++++++++++-
5 files changed, 28 insertions(+), 5 deletions(-)
create mode 100644 spec/fixtures/images/huge.jpg
diff --git a/app/models/upload.rb b/app/models/upload.rb
index cf95ec5aa28..d6119abc13c 100644
--- a/app/models/upload.rb
+++ b/app/models/upload.rb
@@ -95,6 +95,8 @@ class Upload < ActiveRecord::Base
# - image_type ("avatar", "profile_background", "card_background")
# - is_attachment_for_group_message (boolean)
def self.create_for(user_id, file, filename, filesize, options = {})
+ upload = Upload.new
+
DistributedMutex.synchronize("upload_#{user_id}_#{filename}") do
# do some work on images
if FileHelper.is_image?(filename) && is_actual_image?(file)
@@ -105,13 +107,19 @@ class Upload < ActiveRecord::Base
File.write(file.path, doc.to_s)
file.rewind
else
+ # ensure image isn't huge
+ w, h = FastImage.size(file) || [0, 0]
+ if w * h >= SiteSetting.max_image_megapixels * 1_000_000
+ upload.errors.add(:base, I18n.t("upload.images.larger_than_x_megapixels", max_image_megapixels: SiteSetting.max_image_megapixels))
+ return upload
+ end
+
# fix orientation first
fix_image_orientation(file.path) if should_optimize?(file.path)
end
# retrieve image info
- image_info = FastImage.new(file)
- w, h = *(image_info.try(:size) || [0, 0])
+ w, h = FastImage.size(file) || [0, 0]
# default size
width, height = ImageSizer.resize(w, h)
@@ -214,8 +222,7 @@ class Upload < ActiveRecord::Base
# don't optimize GIFs or SVGs
return false if path =~ /\.(gif|svg)$/i
return true if path !~ /\.png$/i
- image_info = FastImage.new(path) rescue nil
- w, h = *(image_info.try(:size) || [0, 0])
+ w, h = FastImage.size(path) || [0, 0]
# don't optimize large PNGs
w > 0 && h > 0 && w * h < LARGE_PNG_SIZE
end
diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml
index 808beed3794..6468a337a07 100644
--- a/config/locales/server.en.yml
+++ b/config/locales/server.en.yml
@@ -1213,6 +1213,8 @@ en:
authorized_extensions: "A list of file extensions allowed for upload (use '*' to enable all file types)"
max_similar_results: "How many similar topics to show above the editor when composing a new topic. Comparison is based on title and body."
+ max_image_megapixels: "Maximum number of megapixels allowed for an image."
+
title_prettify: "Prevent common title typos and errors, including all caps, lowercase first character, multiple ! and ?, extra . at end, etc."
topic_views_heat_low: "After this many views, the views field is slightly highlighted."
@@ -2640,6 +2642,7 @@ en:
too_large: "Sorry, the file you are trying to upload is too big (maximum size is %{max_size_kb}KB)."
images:
too_large: "Sorry, the image you are trying to upload is too big (maximum size is %{max_size_kb}KB), please resize it and try again."
+ larger_than_x_megapixels: "Sorry, the image you are trying to upload is too large (maximum dimension is %{max_image_megapixels}-megapixels), please resize it and try again."
size_not_found: "Sorry, but we couldn't determine the size of the image. Maybe your image is corrupted?"
avatar:
diff --git a/config/site_settings.yml b/config/site_settings.yml
index 4344fab89e5..ae668d64e45 100644
--- a/config/site_settings.yml
+++ b/config/site_settings.yml
@@ -699,6 +699,10 @@ files:
max_attachment_size_kb:
client: true
default: 3072
+ max_image_megapixels:
+ default: 40
+ min: 5
+ max: 100
authorized_extensions:
client: true
default: 'jpg|jpeg|png|gif'
diff --git a/spec/fixtures/images/huge.jpg b/spec/fixtures/images/huge.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..25f2d5c6fb460b9ee97f1a777594df6feb295089
GIT binary patch
literal 557056
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
b8W>FjqiJ9?4UDFN(KIlc21e7sAWQ=Q0pE|j
literal 0
HcmV?d00001
diff --git a/spec/models/upload_spec.rb b/spec/models/upload_spec.rb
index 6412be89428..4cf0ad64e05 100644
--- a/spec/models/upload_spec.rb
+++ b/spec/models/upload_spec.rb
@@ -17,6 +17,10 @@ describe Upload do
let(:image_svg) { file_from_fixtures(image_svg_filename) }
let(:image_svg_filesize) { File.size(image_svg) }
+ let(:huge_image_filename) { "huge.jpg" }
+ let(:huge_image) { file_from_fixtures(huge_image_filename) }
+ let(:huge_image_filesize) { File.size(huge_image) }
+
let(:attachment_path) { __FILE__ }
let(:attachment) { File.new(attachment_path) }
let(:attachment_filename) { File.basename(attachment_path) }
@@ -55,6 +59,12 @@ describe Upload do
expect(Upload.create_for(user_id, image, image_filename, image_filesize)).to eq(upload)
end
+ it "ensures images isn't huge before processing it" do
+ Upload.expects(:fix_image_orientation).never
+ upload = Upload.create_for(user_id, huge_image, huge_image_filename, huge_image_filesize)
+ expect(upload.errors.size).to be > 0
+ end
+
it "fix image orientation" do
Upload.expects(:fix_image_orientation).with(image.path)
Upload.create_for(user_id, image, image_filename, image_filesize)
@@ -62,7 +72,6 @@ describe Upload do
it "computes width & height for images" do
ImageSizer.expects(:resize)
- image.expects(:rewind).times(3)
Upload.create_for(user_id, image, image_filename, image_filesize)
end
From 240c4870cfa43dea222ed52d4ce57b6ac186588d Mon Sep 17 00:00:00 2001
From: Jeff Atwood
Date: Wed, 11 Jan 2017 15:38:37 -0800
Subject: [PATCH 48/54] FIX: add noopener to website field in user profile
---
.../discourse/templates/components/user-card-contents.hbs | 2 +-
app/assets/javascripts/discourse/templates/user.hbs | 2 +-
app/assets/javascripts/discourse/templates/user/summary.hbs | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/app/assets/javascripts/discourse/templates/components/user-card-contents.hbs b/app/assets/javascripts/discourse/templates/components/user-card-contents.hbs
index a38acddd1d8..a7041a50657 100644
--- a/app/assets/javascripts/discourse/templates/components/user-card-contents.hbs
+++ b/app/assets/javascripts/discourse/templates/components/user-card-contents.hbs
@@ -78,7 +78,7 @@
{{fa-icon "globe"}}
{{#if linkWebsite}}
- {{user.website_name}}
+ {{user.website_name}}
{{else}}
{{user.website_name}}
{{/if}}
diff --git a/app/assets/javascripts/discourse/templates/user.hbs b/app/assets/javascripts/discourse/templates/user.hbs
index de997c39fda..1f91c199930 100644
--- a/app/assets/javascripts/discourse/templates/user.hbs
+++ b/app/assets/javascripts/discourse/templates/user.hbs
@@ -72,7 +72,7 @@
{{#if model.website_name}}
{{fa-icon "globe"}}
{{#if linkWebsite}}
- {{model.website_name}}
+ {{model.website_name}}
{{else}}
{{model.website_name}}
{{/if}}
diff --git a/app/assets/javascripts/discourse/templates/user/summary.hbs b/app/assets/javascripts/discourse/templates/user/summary.hbs
index ceae695ecb1..5dfd55a16a2 100644
--- a/app/assets/javascripts/discourse/templates/user/summary.hbs
+++ b/app/assets/javascripts/discourse/templates/user/summary.hbs
@@ -106,7 +106,7 @@
{{shorten-url link.url}}
From 515f50e42e2dd3be83b7bf09c24c3dafb4a04b3c Mon Sep 17 00:00:00 2001
From: Guo Xiang Tan
Date: Wed, 11 Jan 2017 14:46:48 +0800
Subject: [PATCH 49/54] FEATURE: Log admin action when readonly mode is
changed.
---
app/controllers/admin/backups_controller.rb | 2 ++
app/models/user_history.rb | 6 ++++--
app/services/staff_action_logger.rb | 9 ++++++++-
config/locales/client.en.yml | 1 +
.../admin/backups_controller_spec.rb | 16 +++++++++++++--
spec/services/staff_action_logger_spec.rb | 20 +++++++++++++++++++
6 files changed, 49 insertions(+), 5 deletions(-)
diff --git a/app/controllers/admin/backups_controller.rb b/app/controllers/admin/backups_controller.rb
index 2c71943b488..feed2a709d1 100644
--- a/app/controllers/admin/backups_controller.rb
+++ b/app/controllers/admin/backups_controller.rb
@@ -103,6 +103,8 @@ class Admin::BackupsController < Admin::AdminController
Discourse.disable_readonly_mode(readonly_mode_key)
end
+ StaffActionLogger.new(current_user).log_change_readonly_mode(enable)
+
render nothing: true
end
diff --git a/app/models/user_history.rb b/app/models/user_history.rb
index e7db96a5f64..ddc48286630 100644
--- a/app/models/user_history.rb
+++ b/app/models/user_history.rb
@@ -58,7 +58,8 @@ class UserHistory < ActiveRecord::Base
wizard_step: 40,
lock_trust_level: 41,
unlock_trust_level: 42,
- activate_user: 43
+ activate_user: 43,
+ change_readonly_mode: 44
)
end
@@ -97,7 +98,8 @@ class UserHistory < ActiveRecord::Base
:deactivate_user,
:lock_trust_level,
:unlock_trust_level,
- :activate_user]
+ :activate_user,
+ :change_readonly_mode]
end
def self.staff_action_ids
diff --git a/app/services/staff_action_logger.rb b/app/services/staff_action_logger.rb
index 9efe294e989..c872fdd0f6b 100644
--- a/app/services/staff_action_logger.rb
+++ b/app/services/staff_action_logger.rb
@@ -373,11 +373,18 @@ class StaffActionLogger
raise Discourse::InvalidParameters.new(:step) unless step
UserHistory.create(params(opts).merge({
action: UserHistory.actions[:wizard_step],
- acting_user_id: @admin.id,
context: step.id
}))
end
+ def log_change_readonly_mode(state)
+ UserHistory.create(params.merge({
+ action: UserHistory.actions[:change_readonly_mode],
+ previous_value: !state,
+ new_value: state
+ }))
+ end
+
private
def params(opts=nil)
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index bbe0aab2c83..0620de21f37 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -2919,6 +2919,7 @@ en:
unlock_trust_level: "unlock trust level"
activate_user: "activate user"
deactivate_user: "deactivate user"
+ change_readonly_mode: "change readonly mode"
screened_emails:
title: "Screened Emails"
description: "When someone tries to create a new account, the following email addresses will be checked and the registration will be blocked, or some other action performed."
diff --git a/spec/controllers/admin/backups_controller_spec.rb b/spec/controllers/admin/backups_controller_spec.rb
index 080f4eb6c35..270dc9a2317 100644
--- a/spec/controllers/admin/backups_controller_spec.rb
+++ b/spec/controllers/admin/backups_controller_spec.rb
@@ -179,17 +179,29 @@ describe Admin::BackupsController do
it "enables readonly mode" do
Discourse.expects(:enable_readonly_mode)
- xhr :put, :readonly, enable: true
+ expect { xhr :put, :readonly, enable: true }
+ .to change { UserHistory.count }.by(1)
expect(response).to be_success
+
+ user_history = UserHistory.last
+
+ expect(UserHistory.last.action).to eq(UserHistory.actions[:change_readonly_mode])
+ expect(UserHistory.last.new_value).to eq('t')
end
it "disables readonly mode" do
Discourse.expects(:disable_readonly_mode)
- xhr :put, :readonly, enable: false
+ expect { xhr :put, :readonly, enable: false }
+ .to change { UserHistory.count }.by(1)
expect(response).to be_success
+
+ user_history = UserHistory.last
+
+ expect(UserHistory.last.action).to eq(UserHistory.actions[:change_readonly_mode])
+ expect(UserHistory.last.new_value).to eq('f')
end
end
diff --git a/spec/services/staff_action_logger_spec.rb b/spec/services/staff_action_logger_spec.rb
index 773f990d104..df2e4c6a9ca 100644
--- a/spec/services/staff_action_logger_spec.rb
+++ b/spec/services/staff_action_logger_spec.rb
@@ -370,6 +370,7 @@ describe StaffActionLogger do
end
end
+<<<<<<< 240c4870cfa43dea222ed52d4ce57b6ac186588d
describe 'log_lock_trust_level' do
let(:user) { Fabricate(:user) }
@@ -405,6 +406,25 @@ describe StaffActionLogger do
user_history = UserHistory.last
expect(user_history.action).to eq(UserHistory.actions[:activate_user])
expect(user_history.details).to eq(reason)
+ end
+
+ describe '#log_readonly_mode' do
+ it "creates a new record" do
+ expect { logger.log_change_readonly_mode(true) }.to change { UserHistory.count }.by(1)
+
+ user_history = UserHistory.last
+
+ expect(user_history.action).to eq(UserHistory.actions[:change_readonly_mode])
+ expect(user_history.new_value).to eq('t')
+ expect(user_history.previous_value).to eq('f')
+
+ expect { logger.log_change_readonly_mode(false) }.to change { UserHistory.count }.by(1)
+
+ user_history = UserHistory.last
+
+ expect(user_history.action).to eq(UserHistory.actions[:change_readonly_mode])
+ expect(user_history.new_value).to eq('f')
+ expect(user_history.previous_value).to eq('t')
end
end
end
From 79c80f99747037252cb565763380aa25b713ace2 Mon Sep 17 00:00:00 2001
From: Guo Xiang Tan
Date: Thu, 12 Jan 2017 09:44:22 +0800
Subject: [PATCH 50/54] Make mention bot assign reviewers for collaborators as
well.
---
.mention-bot | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/.mention-bot b/.mention-bot
index 6508c7e8679..9893b57bb84 100644
--- a/.mention-bot
+++ b/.mention-bot
@@ -2,7 +2,7 @@
"maxReviewers": 2,
"message": "Thanks @pullRequester for your pull request :+1:. By analyzing the blame information on this pull request, I identified @reviewers to be potential reviewers.",
"requiredOrgs": ["discourse"],
- "skipCollaboratorPR": true,
- "delayed": true,
- "delayedUntil": "6d"
+ "skipCollaboratorPR": false,
+ "delayed": false,
+ "delayedUntil": "1d"
}
From 23d4435af1fc070d2476dccf80e01c5898a1e90d Mon Sep 17 00:00:00 2001
From: Guo Xiang Tan
Date: Thu, 12 Jan 2017 09:56:20 +0800
Subject: [PATCH 51/54] Oops.
---
spec/services/staff_action_logger_spec.rb | 1 -
1 file changed, 1 deletion(-)
diff --git a/spec/services/staff_action_logger_spec.rb b/spec/services/staff_action_logger_spec.rb
index df2e4c6a9ca..62b30c9b48f 100644
--- a/spec/services/staff_action_logger_spec.rb
+++ b/spec/services/staff_action_logger_spec.rb
@@ -370,7 +370,6 @@ describe StaffActionLogger do
end
end
-<<<<<<< 240c4870cfa43dea222ed52d4ce57b6ac186588d
describe 'log_lock_trust_level' do
let(:user) { Fabricate(:user) }
From 38496985ef65aefa18e5b982075fda1ab10440b7 Mon Sep 17 00:00:00 2001
From: Guo Xiang Tan
Date: Thu, 12 Jan 2017 10:03:37 +0800
Subject: [PATCH 52/54] Fix syntax error.
---
spec/services/staff_action_logger_spec.rb | 1 +
1 file changed, 1 insertion(+)
diff --git a/spec/services/staff_action_logger_spec.rb b/spec/services/staff_action_logger_spec.rb
index 62b30c9b48f..b614faa874b 100644
--- a/spec/services/staff_action_logger_spec.rb
+++ b/spec/services/staff_action_logger_spec.rb
@@ -405,6 +405,7 @@ describe StaffActionLogger do
user_history = UserHistory.last
expect(user_history.action).to eq(UserHistory.actions[:activate_user])
expect(user_history.details).to eq(reason)
+ end
end
describe '#log_readonly_mode' do
From 0f574f641e82f7b8712e7ec58d4c913fc4b65727 Mon Sep 17 00:00:00 2001
From: Guo Xiang Tan
Date: Thu, 12 Jan 2017 12:24:39 +0800
Subject: [PATCH 53/54] UX: Truncate topic link title/URL on desktop to prevent
overflow.
---
.../javascripts/discourse/widgets/topic-map.js.es6 | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/app/assets/javascripts/discourse/widgets/topic-map.js.es6 b/app/assets/javascripts/discourse/widgets/topic-map.js.es6
index 67f70aefd9b..4cbcfae591f 100644
--- a/app/assets/javascripts/discourse/widgets/topic-map.js.es6
+++ b/app/assets/javascripts/discourse/widgets/topic-map.js.es6
@@ -116,7 +116,14 @@ createWidget('topic-map-link', {
},
html(attrs) {
- return attrs.title ? replaceEmoji(attrs.title) : attrs.url;
+ let content = attrs.title || attrs.url;
+ const truncateLength = 85;
+
+ if (content.length > truncateLength) {
+ content = `${content.substr(0, truncateLength).trim()}...`;
+ }
+
+ return attrs.title ? replaceEmoji(content) : content;
}
});
From 1570c4e4a7505d98621a201ef639c22530720c7c Mon Sep 17 00:00:00 2001
From: Arpit Jalan
Date: Thu, 12 Jan 2017 13:26:45 +0530
Subject: [PATCH 54/54] Update Translations
---
config/locales/client.ar.yml | 64 +-
config/locales/client.bs_BA.yml | 1 -
config/locales/client.cs.yml | 2 -
config/locales/client.da.yml | 2 -
config/locales/client.et.yml | 2 -
config/locales/client.fa_IR.yml | 1 -
config/locales/client.gl.yml | 1 -
config/locales/client.he.yml | 4 +-
config/locales/client.it.yml | 191 +++++-
config/locales/client.ja.yml | 2 -
config/locales/client.ko.yml | 1 -
config/locales/client.nb_NO.yml | 597 +++++++++++++++++--
config/locales/client.nl.yml | 2 -
config/locales/client.pl_PL.yml | 1 -
config/locales/client.pt.yml | 2 -
config/locales/client.pt_BR.yml | 2 -
config/locales/client.ro.yml | 2 -
config/locales/client.ru.yml | 167 +++++-
config/locales/client.sk.yml | 2 -
config/locales/client.sq.yml | 4 +-
config/locales/client.sv.yml | 2 -
config/locales/client.te.yml | 1 -
config/locales/client.tr_TR.yml | 11 +-
config/locales/client.uk.yml | 2 -
config/locales/client.vi.yml | 1 -
config/locales/client.zh_TW.yml | 44 +-
config/locales/server.da.yml | 1 -
config/locales/server.es.yml | 1 -
config/locales/server.et.yml | 1 +
config/locales/server.fa_IR.yml | 22 +-
config/locales/server.he.yml | 4 +-
config/locales/server.it.yml | 69 ++-
config/locales/server.nb_NO.yml | 184 ++++--
config/locales/server.nl.yml | 14 +
config/locales/server.pt.yml | 1 -
config/locales/server.ro.yml | 1 -
config/locales/server.ru.yml | 10 +
config/locales/server.tr_TR.yml | 1 -
config/locales/server.vi.yml | 2 +-
plugins/poll/config/locales/client.uk.yml | 13 +
plugins/poll/config/locales/server.nb_NO.yml | 2 +-
public/503.nb_NO.html | 2 +-
42 files changed, 1250 insertions(+), 189 deletions(-)
diff --git a/config/locales/client.ar.yml b/config/locales/client.ar.yml
index 3425c725dd4..c70963c9b84 100644
--- a/config/locales/client.ar.yml
+++ b/config/locales/client.ar.yml
@@ -427,10 +427,19 @@ ar:
other: "%{count} عضو"
group_histories:
actions:
+ change_group_setting: "تغيير إعدادات المجموعة"
add_user_to_group: "إضافة مستخدم"
+ remove_user_from_group: "حذف العضو"
+ make_user_group_owner: "تعيين كمالك"
+ remove_user_as_group_owner: "سحب صلاحية المالك"
groups:
logs:
title: "السجلات"
+ when: "حين"
+ action: "إجراء"
+ acting_user: "العضو المسؤول"
+ target_user: "العضو المستهدف"
+ subject: "الموضوع"
details: "التفاصيل"
from: "من"
to: "إلى"
@@ -438,10 +447,37 @@ ar:
title: 'تعديل المجموعة'
full_name: 'الإسم الكامل'
add_members: "إضافة أعضاء"
+ delete_member_confirm: "إزالة '%{username}' من المجموعة '%{group}'؟"
+ request_membership_pm:
+ title: "طلب العضوية"
+ body: "أود تسجيل العضوية في المجموعة @%{groupName}"
+ name_placeholder: "اسم المجموعة، بدون مسافات. يتبع قواعد اسم المستخدم"
+ public: "السماح للأعضاء للإنضمام / ترك المجموعة (يطبق على المجموعات الظاهرة)"
+ empty:
+ posts: "لا مواضيع لأعضاء هذه المجموعة."
+ members: "لا أعضاء في هذه المجموعة."
+ mentions: "لا توجد إشارات في هذه المجموعة."
+ messages: "لا توجد رسائل في هذه المجموعة."
+ topics: "لا توجد مواضيع لأعضاء هذه المجموعة."
+ logs: "لا توجد سجلات في هذ المجموعة."
add: "أضف"
+ join: "إنضمام للمجموعة"
+ leave: "ترك المجموعة"
+ request: "طلب الإنضمام للمجموعة"
+ automatic_group: مجموعة تلقائية
+ closed_group: مجموعة مغلقة
+ is_group_user: "أنت عضو في هذه المجموعة."
+ allow_membership_requests: "السماح للأعضاء لإرسال طلبات الإنضمام إلى أصحاب المجموعات (يجب أن يسمح للجميع بذكر هذه المجموعة)"
+ membership: "العضوية"
+ name: "الاسم"
+ user_count: "عدد اﻷعضاء"
+ bio: "عن المجموعة"
selector_placeholder: "أضف أعضاء"
owner: "المالك"
visible: "المجموعة مرئية لكل المستخدمين"
+ index:
+ title: "المجموعات"
+ empty: "لا توجد مجموعات ظاهرة"
title:
zero: "مجموعات"
one: "مجموعات"
@@ -449,6 +485,7 @@ ar:
few: "مجموعات"
many: "مجموعات"
other: "مجموعات"
+ activity: "نشاط"
members: "الأعضاء"
topics: "المواضيع"
posts: "المشاركات"
@@ -480,6 +517,15 @@ ar:
muted:
title: "مكتوم"
description: "لن نرسل لك أي إشعار لأي من المواضيع الجديدة في هذه المجموعة."
+ flair_url: "الصورة الرمزية المميزة"
+ flair_url_placeholder: "(إختياري) رابط الصورة أو صنف Font Awesome"
+ flair_bg_color: "خلفية الصورة الرمزية المميزة"
+ flair_bg_color_placeholder: "(إختياري) اللون برقم الهكس"
+ flair_color: "لون الصورة الرمزية"
+ flair_color_placeholder: "(إختياري) اللون برقم الهكس"
+ flair_preview_icon: "معاينة الأيقونة"
+ flair_preview_image: "معاينة الصورة"
+ flair_note: "ملاحظة: الصورة المميزة تظهر فقط لمجموعة العضو الرئيسية."
user_action_groups:
'1': "الإعجابات المعطاة"
'2': "الإعجابات المستلمة"
@@ -549,6 +595,11 @@ ar:
profile: "الصفحة الشخصية"
mute: "كتم"
edit: "تعديل التفضيلات"
+ download_archive:
+ button_text: "تحميل مواضيعي"
+ confirm: "هل أنت متأكد من رغبتك في تحميل جميع مشاركاتك ؟"
+ success: "بدأ التحميل, سيتم إعلامك برسالة عند اكتمال العملية."
+ rate_limit_error: "المشاركات يمكن تحميلها لمرة واحدة في اليوم , الرجاء المحاولة غدا."
new_private_message: "رسالة جديدة"
private_message: "رسالة"
private_messages: "الرسائل"
@@ -572,6 +623,7 @@ ar:
each_browser_note: "ملاحظة: عليك تغيير هذا الإعداد في كل متصفح تستخدمه."
dismiss_notifications: "تجاهل الكل"
dismiss_notifications_tooltip: "جعل جميع اشعارات غيرمقروء الى مقروء"
+ first_notification: "إشعارك الأول! قم بإختياره للبدء."
disable_jump_reply: "لا تنتقل إلى مشاركتي بعد ما أردّ"
dynamic_favicon: "إعرض عدد المواضيع الجديدة والمحدثة في أيقونة المتصفح"
external_links_in_new_tab: "فتح الروابط الخارجية في ألسنة جديدة"
@@ -815,6 +867,8 @@ ar:
account_age_days: "عمر الحساب بالأيام"
create: "أرسل دعوة"
generate_link: "انسخ رابط الدعوة"
+ link_generated: "تم إنشاء رابط الدعوة بنجاح!"
+ valid_for: "رابط الدعوة صحيح فقط للبريد الإلكتروني %{email}"
bulk_invite:
text: "الدعوة من ملف"
success: "رُفع الملف بنجاح. سيصلك إشعارا عبر رسالة عند اكتمال العملية."
@@ -922,6 +976,8 @@ ar:
too_few_topics_notice: "دعونا الحصول على هذه المناقشة التي! وهناك حاليا %{currentTopics} / %{requiredTopics} المواضيع. الزوار الجديدة بحاجة إلى بعض الأحاديث قراءة والرد عليها."
too_few_posts_notice: "دعونا الحصول على هذه المناقشة التي بدأت! يوجد حاليا %{currentPosts} / %{requiredPosts} مشاركات. الزوار الجديدة بحاجة إلى بعض الأحاديث قراءة والرد عليها."
learn_more: "تعلم المزيد..."
+ all_time: 'المجموع'
+ all_time_desc: 'عدد المواضيع المنشأة'
year: 'عام'
year_desc: 'المواضيع المكتوبة خلال 365 يوم الماضية'
month: 'شهر'
@@ -1036,6 +1092,9 @@ ar:
twitter: "تويتر"
emoji_one: "إموجي واحد"
win10: "وندوز10"
+ category_page_style:
+ categories_only: "الفئات فقط"
+ categories_with_featured_topics: "فئات ذات مواضيع متميزة"
shortcut_modifier_key:
shift: 'Shift'
ctrl: 'Ctrl'
@@ -1219,6 +1278,8 @@ ar:
label: في المجموعة
with_badge:
label: مع الشعارات
+ with_tags:
+ label: مع أوسمة
filters:
label: استرجع فقط المواضيع/المشاركات التي...
likes: أعجبني
@@ -1250,6 +1311,7 @@ ar:
topics:
new_messages_marker: "آخر مشاهدة"
bulk:
+ clear_all: "مسح الكل"
unlist_topics: "ازالة المواضيع من القائمة"
reset_read: "تصفير القراءات"
delete: "المواضيع المحذوفة"
@@ -1398,7 +1460,6 @@ ar:
go_bottom: "أسفل"
go: "اذهب"
jump_bottom: "انتقل لآخر مشاركة"
- jump_prompt: "اقفز الى المشاركة"
jump_prompt_long: "إلى أي مشاركة تريد الانتقال؟"
jump_bottom_with_number: "انتقل إلى المشاركة %{post_number}"
total: مجموع المشاركات
@@ -1678,7 +1739,6 @@ ar:
file_too_large: "آسفون، الملف هذا كبير جدا (أقصى حجم هو {{max_size_kb}}ك.بايت). ما رأيك برفع الملف على خدمة سحابيّة، ومن ثمّ تشارك الوصلة؟"
too_many_uploads: "آسفون، يمكنك فقط رفع ملفّ واحد كلّ مرة."
too_many_dragged_and_dropped_files: "آسفون، يمكنك فقط رفع 10 ملفّات كلّ مرة."
- upload_not_authorized: "المعذرة، الملف الذي تحاول رفعه غير مسموح به، الامتدادات المسموح بها هي {{authorized_extensions}}."
image_upload_not_allowed_for_new_user: "آسفون، لا يمكن للمستخدمين الجدد رفع الصور."
attachment_upload_not_allowed_for_new_user: "آسفون، لا يمكن للمستخدمين الجدد رفع المرفقات."
attachment_download_requires_login: "آسفون، عليك الولوج لتنزيل المرفقات."
diff --git a/config/locales/client.bs_BA.yml b/config/locales/client.bs_BA.yml
index 6d615d520e1..540965f4839 100644
--- a/config/locales/client.bs_BA.yml
+++ b/config/locales/client.bs_BA.yml
@@ -1071,7 +1071,6 @@ bs_BA:
edit: "Sorry, there was an error editing your post. Please try again."
upload: "Sorry, there was an error uploading that file. Please try again."
too_many_uploads: "Sorry, you can only upload one file at a time."
- upload_not_authorized: "Sorry, the file you are trying to upload is not authorized (authorized extension: {{authorized_extensions}})."
image_upload_not_allowed_for_new_user: "Sorry, new users can not upload images."
attachment_upload_not_allowed_for_new_user: "Sorry, new users can not upload attachments."
attachment_download_requires_login: "Sorry, you need to be logged in to download attachments."
diff --git a/config/locales/client.cs.yml b/config/locales/client.cs.yml
index 74ce5362ea4..876d31c75db 100644
--- a/config/locales/client.cs.yml
+++ b/config/locales/client.cs.yml
@@ -1302,7 +1302,6 @@ cs:
go_bottom: "dolů"
go: "go"
jump_bottom: "na poslední příspěvek"
- jump_prompt: "přejít na příspěvek"
jump_prompt_long: "Na který příspěvek chcete přejít?"
jump_bottom_with_number: "Skočit na příspěvěk %{post_number}"
total: celkem příspěvků
@@ -1545,7 +1544,6 @@ cs:
file_too_large: "Soubor, který se snažíte nahrát, je bohužel příliš velký (maximální velikost je {{max_size_kb}}kb). Co třeba jej nahrát na cloudovou službu a nasdílet sem odkaz?"
too_many_uploads: "Bohužel, najednou smíte nahrát jen jeden soubor."
too_many_dragged_and_dropped_files: "Bohužel, najednou smíte nahrát jen 10 souborů."
- upload_not_authorized: "Bohužel, soubor, který se snažíte nahrát, není povolený (povolené přípony: {{authorized_extensions}})."
image_upload_not_allowed_for_new_user: "Bohužel, noví uživatelé nemohou nahrávat obrázky."
attachment_upload_not_allowed_for_new_user: "Bohužel, noví uživatelé nemohou nahrávat přílohy."
attachment_download_requires_login: "Omlouváme se, ale pro stáhnutí přílohy musíte být přihlášen."
diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml
index 3ab1cb7ed32..9a3c5e0fe72 100644
--- a/config/locales/client.da.yml
+++ b/config/locales/client.da.yml
@@ -1193,7 +1193,6 @@ da:
go_bottom: "bund"
go: "start"
jump_bottom: "Hop til sidste indlæg"
- jump_prompt: "hop til indlæg"
jump_prompt_long: "Hvilket indlæg vil du gerne springe til?"
jump_bottom_with_number: "hop til indlæg %{post_number}"
total: antal indlæg
@@ -1421,7 +1420,6 @@ da:
file_too_large: "Beklager, filen du prøver at uploade er for stor (den maksimale størrelse er {{max_size_kb}}kb). Du kan evt. uploade filen til en fildelings service og dele linket her."
too_many_uploads: "Beklager, men du kan kun uploade én fil ad gangen."
too_many_dragged_and_dropped_files: "Beklager, du kan maksimalt uploade 10 filer ad gangen"
- upload_not_authorized: "Beklager, filen, som du forsøger at uploade, er ikke godkendt (godkendte filendelser: {{authorized_extensions}})."
image_upload_not_allowed_for_new_user: "Beklager, nye brugere kan ikke uploade billeder."
attachment_upload_not_allowed_for_new_user: "Beklager, nye brugere kan ikke uploade vedhæftede filer."
attachment_download_requires_login: "Beklager, du skal være logget på for at downloade vedhæftede filer."
diff --git a/config/locales/client.et.yml b/config/locales/client.et.yml
index b8e7e0f3e29..f61c6a0af92 100644
--- a/config/locales/client.et.yml
+++ b/config/locales/client.et.yml
@@ -1330,7 +1330,6 @@ et:
go_bottom: "alla"
go: "mine"
jump_bottom: "hüppa viimase postituse juurde"
- jump_prompt: "hüppa postituse juurde"
jump_prompt_of: "%{count} postitusest"
jump_prompt_long: "Millise postituse juurde soovid hüpata?"
jump_bottom_with_number: "hüppa postituse %{post_number} juurde"
@@ -1563,7 +1562,6 @@ et:
file_too_large: "Vabandame. see fail on liiga suur (maksimum on {{max_size_kb}}kB). Miks mitte laadida see suur fail mõnda failijagamisteenusesse pilves ja jagada viidet selleni?"
too_many_uploads: "Vabandame, faile saab üles laadida vaid ühekaupa."
too_many_dragged_and_dropped_files: "Vabandame, faile saab üles laadida vaid kuni 10 korraga."
- upload_not_authorized: "Vabandame, faili tüüp, mida püüad üles laadida, ei ole lubatud (lubatud laiendid: {{authorized_extensions}})."
image_upload_not_allowed_for_new_user: "Vabandame, uued kasutajad ei saa pilte üles laadida."
attachment_upload_not_allowed_for_new_user: "Vabandame, uued kasutajad ei saa manuseid üles laadida."
attachment_download_requires_login: "Vabandame, manuste allalaadimiseks pead olema sisse logitud."
diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml
index c4c1eadfc36..f5ea1fc915f 100644
--- a/config/locales/client.fa_IR.yml
+++ b/config/locales/client.fa_IR.yml
@@ -1171,7 +1171,6 @@ fa_IR:
edit: "متأسفیم، در ویرایش نوشته شما خطایی روی داد. لطفاً دوباره تلاش کنید."
upload: "متأسفیم، در بارگذاری آن پرونده خطایی روی داد. لطفاً دوباره تلاش کنید."
too_many_uploads: "متأسفیم، هر بار تنها میتوانید یک پرونده را بار بگذارید."
- upload_not_authorized: "متأسفیم، پروندهای که تلاش دارید آن را بار بگذارید، پروانهدار نیست (پسوندهای پروانهدار: {{authorized_extensions})"
image_upload_not_allowed_for_new_user: "با عرض پوزش، کاربران جدید نمی توانند تصویر بار گذاری نماییند."
attachment_upload_not_allowed_for_new_user: "با عرض پوزش، کاربران جدید نمی توانند فایل پیوست بار گذاری نماییند."
attachment_download_requires_login: "با عرض پوزش، شما برای دانلود فایل پیوست باید وارد سایت شوید."
diff --git a/config/locales/client.gl.yml b/config/locales/client.gl.yml
index c4fdae32cb1..0473816158f 100644
--- a/config/locales/client.gl.yml
+++ b/config/locales/client.gl.yml
@@ -1294,7 +1294,6 @@ gl:
edit: "Sentímolo pero produciuse un erro editando a publicación. Téntao de novo."
upload: "Sentímolo pero produciuse un erro enviando a publicación. Téntao de novo."
too_many_uploads: "Sentímolo pero só podes enviar un ficheiro de cada vez."
- upload_not_authorized: "Sentímolo pero o ficheiro que tentas enviar non está autorizado (extensións autorizadas: {{authorized_extensions}})."
image_upload_not_allowed_for_new_user: "Sentímolo pero os novos usuarios non poden subir imaxes."
attachment_upload_not_allowed_for_new_user: "Sentímolo pero os novos usuarios non poden subir anexos."
attachment_download_requires_login: "Sentímolo pero debes iniciar sesión para descargar anexos."
diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml
index 8df34455fc2..10c90c7b8f6 100644
--- a/config/locales/client.he.yml
+++ b/config/locales/client.he.yml
@@ -1332,7 +1332,7 @@ he:
go_bottom: "למטה"
go: "קדימה"
jump_bottom: "מעבר לפוסט האחרון"
- jump_prompt: "קפיצה לפוסט"
+ jump_prompt: "קפצו אל..."
jump_prompt_of: "מתוך %{count} פוסטים"
jump_prompt_long: "לאיזה פוסט הייתם רוצים לקפוץ?"
jump_bottom_with_number: "קפיצה לפוסט %{post_number}"
@@ -1565,7 +1565,7 @@ he:
file_too_large: "מצטערים, הקובץ גדול מידי (הגודל המירבי הוא {{max_size_kb}}kb). אולי תקצו להעלות קבצים גדולים לשירות שיתוף בענן ולשתף את הקישור."
too_many_uploads: "סליחה, אך ניתן להעלות רק קובץ אחת כל פעם."
too_many_dragged_and_dropped_files: "מצטערים, אתם יכולים להעלות עד 10 קבצים בו זמנית."
- upload_not_authorized: "סליחה, אך סוג הקובץ שאתם מנסים להעלות אינו מורשה (סיומות מורשות: {{authorized_extensions}})."
+ upload_not_authorized: "מצטערים, הקובץ שאתם מנסים להעלות אינו מורשה (סיומות מורשות: {{authorized_extensions}})."
image_upload_not_allowed_for_new_user: "סליחה, משתמשים חדשים לא יכולים להעלות תמונות."
attachment_upload_not_allowed_for_new_user: "סליחה, משתמשים חדשים לא יכולים להעלות קבצים."
attachment_download_requires_login: "מצטערים, עליכם להיות מחוברים כדי להוריד את הקבצים המצורפים."
diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml
index f6d10bda787..f1acec4aec6 100644
--- a/config/locales/client.it.yml
+++ b/config/locales/client.it.yml
@@ -321,14 +321,63 @@ it:
total_rows:
one: "1 utente"
other: "%{count} utenti"
+ group_histories:
+ actions:
+ change_group_setting: "Cambia le impostazioni del gruppo"
+ add_user_to_group: "Aggiunti utente"
+ remove_user_from_group: "Rimuovi utente"
+ make_user_group_owner: "Assegna proprietà"
+ remove_user_as_group_owner: "Revoca proprietà"
groups:
+ logs:
+ title: "Log"
+ when: "Quando"
+ action: "Azione"
+ acting_user: "Utente attore"
+ target_user: "Utente destinatario"
+ subject: "Oggetto"
+ details: "Dettagli"
+ from: "Da"
+ to: "A"
+ edit:
+ title: 'Modifica Gruppo'
+ full_name: 'Nome Completo'
+ add_members: "Aggiungi Membri"
+ delete_member_confirm: "Rimuovere '%{username}' dal gruppo '%{group}'?"
+ request_membership_pm:
+ title: "Richiesta di Iscrizione"
+ body: "Vorrei iscrivermi a @%{groupName}."
+ name_placeholder: "Nome del gruppo, senza spazi, stesse regole del nome utente"
+ public: "Permetti agli utenti di aggiungersi/togliersi liberamente dal gruppo (il gruppo deve essere visibile)"
+ empty:
+ posts: "Non ci sono messaggi da membri di questo gruppo."
+ members: "Non ci sono membri in questo gruppo."
+ mentions: "Questo gruppo non è stato menzionato."
+ messages: "Non ci sono messaggi per questo gruppo."
+ topics: "Non ci sono argomenti da membri di questo gruppo."
+ logs: "Non ci sono log per questo gruppo."
add: "Aggiungi"
+ join: "Partecipa al Gruppo"
+ leave: "Abbandona il Gruppo"
+ request: "Richiedi di partecipare al gruppo"
+ automatic_group: Gruppo Automatico
+ closed_group: Gruppo Chiuso
+ is_group_user: "Sei un membro di questo gruppo"
+ allow_membership_requests: "Permetti agli utenti di richiedere l'invito ai proprietari del gruppo (il gruppo deve essere menzionabile da chiunque)"
+ membership: "Iscrizione"
+ name: "Nome"
+ user_count: "Numero di Membri"
+ bio: "Informazioni sul Gruppo"
selector_placeholder: "Aggiungi membri"
owner: "proprietario"
visible: "Il Gruppo è visibile a tutti gli utenti"
+ index:
+ title: "Gruppi"
+ empty: "Non ci sono gruppi visibili."
title:
one: "gruppo"
other: "gruppi"
+ activity: "Attività"
members: "Membri"
topics: "Argomenti"
posts: "Messaggi"
@@ -360,6 +409,11 @@ it:
muted:
title: "Silenziato"
description: "Non verrai mai avvertito per i nuovi argomenti in questo gruppo."
+ flair_url_placeholder: "(Facoltativo) URL Immagine o classe Font Awesome"
+ flair_bg_color_placeholder: "(Facoltativo) Codice esadecimale del colore"
+ flair_color_placeholder: "(Facoltativo) Codice esadecimale del colore"
+ flair_preview_icon: "Anteprima Icona"
+ flair_preview_image: "Anteprima Immagine"
user_action_groups:
'1': "Mi piace - Assegnati"
'2': "Mi piace - Ricevuti"
@@ -421,6 +475,11 @@ it:
profile: "Profilo"
mute: "Ignora"
edit: "Modifica opzioni"
+ download_archive:
+ button_text: "Scarica i Miei Messaggi"
+ confirm: "Sei sicuro di voler scaricare i tuoi messaggi?"
+ success: "Esportazione iniziata, verrai avvertito con un messaggio al termine del processo."
+ rate_limit_error: "I messaggi possono essere scaricati una volta al giorno, riprova domani."
new_private_message: "Nuovo Messaggio"
private_message: "Messaggio"
private_messages: "Messaggi"
@@ -683,6 +742,7 @@ it:
link_generated: "Collegamento di invito generato con successo!"
valid_for: "Questo collegamento di invito è valido solamente per il seguente indirizzo email: %{email}"
bulk_invite:
+ none: "Non hai ancora invitato nessuno. Puoi invitare persone singole, o più persone insieme caricando un file CSV."
text: "Invito di Massa da File"
success: "Il file è stato caricato con successo, riceverai un messaggio di notifica quando il processo sarà completato."
password:
@@ -949,6 +1009,7 @@ it:
title: "O premi Ctrl+Enter"
users_placeholder: "Aggiunti un utente"
title_placeholder: "In breve, di cosa tratta questo argomento?"
+ title_or_link_placeholder: "Digita il titolo, o incolla qui il collegamento "
edit_reason_placeholder: "perché stai scrivendo?"
show_edit_reason: "(aggiungi motivo della modifica)"
reply_placeholder: "Scrivi qui. Per formattare il testo usa Markdown, BBCode o HTML. Trascina o incolla le immagini."
@@ -1136,7 +1197,8 @@ it:
topics:
new_messages_marker: "ultima visita"
bulk:
- select_all: "Seleziona tutto"
+ select_all: "Seleziona Tutti"
+ clear_all: "Deseleziona Tutto"
unlist_topics: "Deselezione Topics"
reset_read: "Reimposta Lettura"
delete: "Elimina Argomenti"
@@ -1263,7 +1325,8 @@ it:
go_bottom: "basso"
go: "vai"
jump_bottom: "salta all'ultimo messaggio"
- jump_prompt: "salta al messaggio"
+ jump_prompt: "vai a..."
+ jump_prompt_of: "di %{count} messaggi"
jump_prompt_long: "A quale messaggio vuoi saltare?"
jump_bottom_with_number: "Passa al messaggio %{post_number}"
total: totale messaggi
@@ -1661,6 +1724,7 @@ it:
tags_allowed_tag_groups: "Aggiungi etichette ai gruppi che possono essere utilizzati unicamente in questa categoria:"
tags_placeholder: "Elenco (opzionale) delle etichette permesse"
tag_groups_placeholder: "Elenco (opzionale) dei gruppi di etichette permessi"
+ topic_featured_link_allowed: "Consenti collegamenti in primo piano in questa categoria"
delete: 'Elimina Categoria'
create: 'Crea Categoria'
create_long: 'Crea una nuova categoria'
@@ -1708,6 +1772,10 @@ it:
notifications:
watching:
title: "In osservazione"
+ description: "Osserverai automaticamente tutti gli argomenti in queste categorie. Riceverai notifiche per ogni nuovo messaggio in ogni argomento, e apparirà il conteggio delle nuove risposte."
+ watching_first_post:
+ title: "Osservando il Primo Messaggio"
+ description: "Riceverai una notifica soltanto per il primo messaggio di ogni nuovo argomento in queste categorie."
tracking:
title: "Seguendo"
regular:
@@ -1723,16 +1791,17 @@ it:
views: "Visualizzazioni"
posts: "Messaggi"
activity: "Attività"
+ posters: "Partecipanti"
category: "Categoria"
- created: "Creato"
- sort_ascending: 'Ascendente'
- sort_descending: 'Discendente'
+ created: "Creazione"
+ sort_ascending: 'Crescente'
+ sort_descending: 'Decrescente'
flagging:
title: 'Grazie per aiutarci a mantenere la nostra comunità civile!'
action: 'Segnala Messaggio'
take_action: "Procedi"
notify_action: 'Messaggio'
- official_warning: 'Avvertimento ufficiale'
+ official_warning: 'Avvertimento Ufficiale'
delete_spammer: "Cancella Spammer"
yes_delete_spammer: "Sì, cancella lo spammer"
ip_address_missing: "(N/D)"
@@ -1747,6 +1816,16 @@ it:
spam: "E' Spam"
custom_placeholder_notify_user: "Sii dettagliato, costruttivo e sempre gentile."
custom_placeholder_notify_moderators: "Facci sapere esattamente cosa ti preoccupa, fornendo collegamenti pertinenti ed esempi ove possibile."
+ custom_message:
+ at_least:
+ one: "inserisci almeno 1 carattere"
+ other: "inserisci almeno {{n}} caratteri"
+ more:
+ one: "1 mancante..."
+ other: "{{count}} mancanti..."
+ left:
+ one: "1 mancante"
+ other: "{{count}} mancanti..."
flagging_topic:
title: "Grazie per aiutarci a mantenere la nostra comunità civile!"
action: "Segnala Argomento"
@@ -1755,9 +1834,14 @@ it:
title: "Riassunto Argomento"
participants_title: "Autori Assidui"
links_title: "Collegamenti Di Successo"
+ links_shown: "mostra altri collegamenti..."
clicks:
one: "1 click"
other: "%{count} click"
+ post_links:
+ title:
+ one: "un altro"
+ other: "altri %{count}"
topic_statuses:
warning:
help: "Questo è un avvertimento ufficiale."
@@ -1899,6 +1983,7 @@ it:
new: 'g, n Nuovi'
unread: 'g, u Non letti'
categories: 'g, c Categorie'
+ top: 'g, t Inizio'
bookmarks: 'g, b Segnalibri'
profile: 'g, p Profilo'
messages: 'g, m Messaggi'
@@ -1940,6 +2025,7 @@ it:
mark_regular: 'm, r Argomento normale (default)'
mark_tracking: 'm, t Segui argomento'
mark_watching: 'm, w Osserva argomento'
+ print: 'ctrl+p Stampa argomento'
badges:
earned_n_times:
one: "Guadagnato questo distintivo 1 volta"
@@ -1952,6 +2038,12 @@ it:
badge_count:
one: "1 Distintivo"
other: "%{count} Distintivi"
+ more_badges:
+ one: "+1 altro"
+ other: "+ altri %{count}"
+ granted:
+ one: "1 assegnato"
+ other: "%{count} assegnati"
select_badge_for_title: Seleziona un distintivo da usare come tuo titolo
none: ""
badge_grouping:
@@ -1985,6 +2077,8 @@ it:
delete_confirm: "Sicuro di voler cancellare questa etichetta?"
rename_tag: "Rinomina Etichetta"
rename_instructions: "Scegli un altro nome per l'etichetta:"
+ sort_by: "Ordina per:"
+ sort_by_count: "conteggio"
sort_by_name: "nome"
manage_groups: "Gestisci Gruppi Etichette"
manage_groups_description: "Definisci gruppi per organizzare le etichette"
@@ -2048,6 +2142,9 @@ it:
custom_message_link: "messaggio personalizzato"
custom_message_placeholder: "Inserisci il tuo messaggio personalizzato"
custom_message_template_forum: "Ehi, unisciti a questo forum!"
+ custom_message_template_topic: "Ehi, credo che questo argomento ti possa interessare!"
+ safe_mode:
+ enabled: "La modalità sicura è attiva, per disattivarla chiudi il browser"
admin_js:
type_to_filter: "digita per filtrare..."
admin:
@@ -2095,6 +2192,7 @@ it:
30_days_ago: "30 Giorni Fa"
all: "Tutti"
view_table: "tabella"
+ view_graph: "grafico"
refresh_report: "Aggiorna Rapporto"
start_date: "Data Inizio"
end_date: "Data Fine"
@@ -2211,8 +2309,8 @@ it:
web_hooks:
title: "Webhook"
none: "Non ci sono webhook disponibili adesso."
- instruction: "Webhook consente a Discourse di notificare servizi esterni quando sul tuo sito si verificano determinati eventi. Quando un webhook viene innescato, una richiesta di MESSAGGIO viene inviata agli URL forniti."
- detailed_instruction: "Una richiesta di MESSAGGIO verrà inviata agli URL forniti quando si verifica un evento scelto."
+ instruction: "I Webhook consentono a Discourse di notificare i servizi esterni quando sul tuo sito si verificano determinati eventi. Quando un webhook viene innescato, viene inviata una richiesta di tipo POST agli URL forniti."
+ detailed_instruction: "Una richiesta di tipo POST verrà inviata agli URL forniti quando si verifica uno degli eventi scelti."
new: "Nuovo Webhook"
create: "Crea"
save: "Salva"
@@ -2220,8 +2318,59 @@ it:
description: "Descrizione"
controls: "Componenti"
go_back: "Torna all'elenco"
- payload_url: "Aggiungi URL"
+ payload_url: "URL di Payload"
payload_url_placeholder: "https://example.com/postreceive"
+ warn_local_payload_url: "Stai impostando un webhook che punta ad un indirizzo locale. Eventi inviati ad un indirizzo locale possono causare effetti collaterali o risultati inaspettati. Vuoi continuare?"
+ secret_invalid: "La chiave segreta non può contenere spazi vuoti."
+ secret_too_short: "La chiave segreta deve contenere almeno 12 caratteri."
+ secret_placeholder: "Una stringa opzionale, usata per generare la firma"
+ event_type_missing: "Devi impostare almeno un tipo di evento."
+ content_type: "Tipo Contenuto"
+ secret: "Chiave segreta"
+ event_chooser: "Quali eventi vuoi che attivino questo webhook?"
+ wildcard_event: "Inviami tutto."
+ individual_event: "Seleziona eventi singoli."
+ verify_certificate: "Verifica il certificato TLS della URL payload"
+ active: "Attivo"
+ delete_confirm: "Eliminare questo webhook?"
+ topic_event:
+ name: "Evento Argomento"
+ details: "Quando c'è un nuovo argomento, revisionato, modificato o cancellato."
+ post_event:
+ name: "Evento Messaggio"
+ details: "Quando c'è una nuova risposta, modifica, cancellazione o recupero."
+ user_event:
+ name: "Evento Utente"
+ details: "Quando un utente viene creato, approvato o aggiornato."
+ delivery_status:
+ title: "Stato di Consegna"
+ inactive: "Non attivo"
+ failed: "Fallito"
+ successful: "Completato"
+ events:
+ none: "Non ci sono eventi correlati."
+ redeliver: "Riconsegna "
+ incoming:
+ one: "C'è un nuovo evento."
+ other: "Ci sono {{count}} nuovi eventi."
+ completed_in:
+ one: "Compleato in 1 secondo."
+ other: "Completato in {{count}} secondi."
+ request: "Richiesta"
+ response: "Risposta"
+ redeliver_confirm: "Sicuro di voler rispedire lo stesso payload?"
+ headers: "Intestazioni"
+ payload: "Payload"
+ body: "Corpo"
+ go_list: "Vai all'elenco"
+ go_details: "Modifica webhook"
+ go_events: "Vai agli eventi"
+ ping: "Ping"
+ status: "Codice Stato"
+ event_id: "ID"
+ timestamp: "Creazione"
+ completion: "Tempo Completamento"
+ actions: "Azioni"
plugins:
title: "Plugin"
installed: "Plugin Installati"
@@ -2396,6 +2545,7 @@ it:
test_error: "C'è stato un problema nell'invio dell'email di test. Controlla nuovamente le impostazioni email, verifica che il tuo host non blocchi le connessioni email e riprova."
sent: "Inviato"
skipped: "Omesso"
+ bounced: "Ritornate"
received: "Ricevute"
rejected: "Rifiutate"
sent_at: "Inviato Alle"
@@ -2409,10 +2559,14 @@ it:
delivery_method: "Metodo di consegna"
preview_digest_desc: "Vedi in anteprima il contenuto delle email di riepilogo inviate agli utenti inattivi."
refresh: "Aggiorna"
+ send_digest_label: "Invia questo risultato a:"
+ send_digest: "Invia"
+ sending_email: "Invio email in corso..."
format: "Formato"
html: "html"
text: "testo"
last_seen_user: "Ultimo Utente Visto:"
+ no_result: "Nessun risultato trovato per il riepilogo. "
reply_key: "Chiave di risposta"
skipped_reason: "Motivo Omissione"
incoming_emails:
@@ -2507,6 +2661,7 @@ it:
backup_operation: "operazione di backup"
deleted_tag: "etichetta cancellata"
renamed_tag: "etichetta rinominata"
+ revoke_email: "revoca email"
screened_emails:
title: "Email Scansionate"
description: "Quando qualcuno cerca di creare un nuovo account, verrando controllati i seguenti indirizzi email e la registrazione viene bloccata, o eseguita qualche altra azione."
@@ -2601,6 +2756,7 @@ it:
suspend_reason: "Motivo"
suspended_by: "Sospeso da"
delete_all_posts: "Cancella tutti i messaggi"
+ delete_all_posts_confirm_MF: "Stai per cancellare {POSTS, plural, one {1 messaggio} other {# messaggi}} e {TOPICS, plural, one {1 argomento} other {# argomenti}}. Sei sicuro?"
suspend: "Sospendi"
unsuspend: "Riabilita"
suspended: "Sospeso?"
@@ -2674,9 +2830,17 @@ it:
block_failed: 'Si è verificato un errore durante il blocco dell''utente.'
block_confirm: 'Sei sicuro di voler bloccare questo utente? Non sarà più in grado di creare alcun nuovo argomento o messaggio.'
block_accept: 'Sì, blocca questo utente'
+ bounce_score: "Errori di Ritorno"
+ reset_bounce_score:
+ label: "Azzera"
+ title: "Azzera il conteggio degli errori di ritorno."
deactivate_explanation: "Un utente disattivato deve riconvalidare la propria email."
suspended_explanation: "Un utente sospeso non può connettersi."
block_explanation: "Un utente bloccato non può pubblicare messaggi o iniziare argomenti."
+ bounce_score_explanation:
+ none: "L'indirizzo email non ha causato nessun errore di ritorno recentemente."
+ some: "Sono stati ricevuti alcuni errori di ritorno per quell'indirizzo email."
+ threshold_reached: "Quella email ha ricevuto troppi errori di ritorno."
trust_level_change_failed: "C'è stato un problema nel cambio di livello di esperienza di questo utente. "
suspend_modal_title: "Sospendi Utente"
trust_level_2_users: "Utenti con Livello Esperienza 2"
@@ -2687,6 +2851,9 @@ it:
unlock_trust_level: "Sblocca Livello Esperienza"
tl3_requirements:
title: "Requisiti per Livello Esperienza 3"
+ table_title:
+ one: "Nell'ultimo giorno:"
+ other: "Negli ultimi %{count} giorni:"
value_heading: "Valore"
requirement_heading: "Requisito"
visits: "Visite"
@@ -2786,12 +2953,15 @@ it:
developer: 'Sviluppatore'
embedding: "Incorporo"
legal: "Legale"
+ user_api: 'API Utente'
uncategorized: 'Altro'
backups: "Backup"
login: "Connessione"
plugins: "Plugin"
user_preferences: "Preferenze Utente"
tags: "Etichette"
+ search: "Cerca"
+ groups: "Gruppi"
badges:
title: Distintivi
new_badge: Nuovo Distintivo
@@ -2884,9 +3054,11 @@ it:
embed_by_username: "Nome utente per la creazione dell'argomento"
embed_post_limit: "Numero massimo di messaggi da includere"
embed_username_key_from_feed: "Chiave per ottenere il nome utente discourse dal feed"
+ embed_title_scrubber: "Espressione regolare usata per ripulire i titoli dei messaggi"
embed_truncate: "Tronca i messaggi incorporati"
embed_whitelist_selector: "Selettore CSS per gli elementi da permettere negli embed"
embed_blacklist_selector: "Selettore CSS per gli elementi da rimuovere dagli embed"
+ embed_classname_whitelist: "Classi CSS autorizzate"
feed_polling_enabled: "Importa i messaggi via RSS/ATOM"
feed_polling_url: "URL del feed RSS/ATOM da recuperare"
save: "Salva Impostazioni Inclusione"
@@ -2919,6 +3091,7 @@ it:
other: "La tua comunità ha %{count} membri dello staff."
invites:
add_user: "aggiungi"
+ none_added: "Non hai invitato nessuno dello staff. Sicuro di voler proseguire?"
roles:
admin: "Amministratore"
moderator: "Moderatore"
diff --git a/config/locales/client.ja.yml b/config/locales/client.ja.yml
index ff7a6be70dd..890b5644492 100644
--- a/config/locales/client.ja.yml
+++ b/config/locales/client.ja.yml
@@ -1043,7 +1043,6 @@ ja:
go_bottom: "下"
go: "へ"
jump_bottom: "最後の投稿へ"
- jump_prompt: "投稿へジャンプ"
jump_prompt_long: "どの投稿へジャンプしますか?"
jump_bottom_with_number: "%{post_number}番へジャンプ"
total: 投稿の合計
@@ -1235,7 +1234,6 @@ ja:
edit: "申し訳ありませんが、投稿の編集中にエラーが発生しました。もう一度やり直してください。"
upload: "申し訳ありません、ファイルのアップロード中にエラーが発生しました。再度お試しください。"
too_many_uploads: "申し訳ありませんが、複数のファイルは同時にアップロードできません。"
- upload_not_authorized: "申し訳ありませんが、対象ファイルをアップロードする権限がありません (利用可能な拡張子: {{authorized_extensions}})."
image_upload_not_allowed_for_new_user: "申し訳ありませんが、新規ユーザは画像のアップロードができません。"
attachment_upload_not_allowed_for_new_user: "申し訳ありませんが、新規ユーザはファイルの添付ができません。"
attachment_download_requires_login: "ファイルをダウンロードするには、ログインする必要があります"
diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml
index 4343bb203d5..90200ca37d7 100644
--- a/config/locales/client.ko.yml
+++ b/config/locales/client.ko.yml
@@ -1262,7 +1262,6 @@ ko:
edit: "죄송합니다. 글을 수정하는 중에 오류가 발생했습니다. 다시 시도하십시오."
upload: "죄송합니다. 파일을 업로드하는 동안 오류가 발생했습니다. 다시 시도하십시오."
too_many_uploads: "한번에 한 파일만 업로드 하실 수 있습니다."
- upload_not_authorized: "업로드 하시려는 파일 확장자는 사용이 불가능합니다 (사용가능 확장자: {{authorized_extensions}})."
image_upload_not_allowed_for_new_user: "죄송합니다. 새로운 유저는 이미지를 업로드 하실 수 없습니다."
attachment_upload_not_allowed_for_new_user: "죄송합니다. 새로운 유저는 파일 첨부를 업로드 하실 수 없습니다."
attachment_download_requires_login: "죄송합니다. 첨부 파일을 받으려면 로그인이 필요합니다."
diff --git a/config/locales/client.nb_NO.yml b/config/locales/client.nb_NO.yml
index 9ce8c0f148c..04f0801a4a9 100644
--- a/config/locales/client.nb_NO.yml
+++ b/config/locales/client.nb_NO.yml
@@ -279,10 +279,10 @@ nb_NO:
one: "Dette emnet har 1 innlegg som venter på godkjenning"
other: "Dette emnet har {{count}} innlegg som venter på godkjenning"
confirm: "Lagre endringer"
- delete_prompt: "Er du sikker du ønsker å slette %{username}? Dette vil fjerne alle brukerens innnlegg og blokkere brukerens epost- og ip-addresse."
+ delete_prompt: "Er du sikker du ønsker å slette %{username}? Dette vil fjerne alle brukerens innlegg og blokkere brukerens epost- og IP-adresse."
approval:
title: "Innlegg trenger godkjenning"
- description: "Vi har mottatt ditt nye innlegg men det krever godkjenning av en moderator før det vises. Vennligst vær tålmodig."
+ description: "Vi har mottatt ditt nye innlegg men det krever godkjenning av en moderator før det vises. Ha tolmod."
pending_posts:
one: "Du har 1 innlegg som venter på godkjenning."
other: "Du har {{count}} innlegg som venter på godkjenning."
@@ -409,11 +409,15 @@ nb_NO:
muted:
title: "Ignorert"
description: "Du vil aldri bli varslet om noe angående nye emner i denne gruppen."
+ flair_url: "Bilde for gruppetilhørighet på avatar"
flair_url_placeholder: "(Valgfritt) Font Awesome-klasse eller URL til bilde"
+ flair_bg_color: "Bakgrunnsfarge for gruppetilhørighetsbilde på avatar"
flair_bg_color_placeholder: "(Valgfritt) Fargekode som hex-verdi"
+ flair_color: "Farge på bilde for gruppetilhørighet på avatar"
flair_color_placeholder: "(Valgfritt) Fargekode som hex-verdi"
flair_preview_icon: "Forhåndsvis ikon"
flair_preview_image: "Forhåndsvis bilde"
+ flair_note: "Merk: Bilde for gruppetilhørighet på avatar vil bare vises for brukerens primære gruppe."
user_action_groups:
'1': "Liker tildelt"
'2': "Liker mottatt"
@@ -479,7 +483,7 @@ nb_NO:
button_text: "Last ned mine innlegg"
confirm: "Er du sikker på at du vil laste ned dine innlegg?"
success: "Nedlasting iverksatt. Du vil bli varslet med en melding når prosessen er fullført."
- rate_limit_error: "Innlegg kan lastes ned en gang om dagen, vennligst prøv igjen i morgen."
+ rate_limit_error: "Innlegg kan lastes ned en gang om dagen, prøv igjen i morgen."
new_private_message: "Ny Melding"
private_message: "Melding"
private_messages: "Meldinger"
@@ -501,6 +505,7 @@ nb_NO:
disable: "Slå av varslinger"
enable: "Slå på varslinger"
each_browser_note: "Merk: Du må endre denne innstillinger for hver nettleser du bruker."
+ dismiss_notifications: "Avslå alt"
dismiss_notifications_tooltip: "Merk alle uleste varslinger som lest"
first_notification: "Ditt første varsel! Velg det for å komme i gang."
disable_jump_reply: "Ikke hopp til ditt nye innlegg etter svar"
@@ -526,8 +531,8 @@ nb_NO:
daily: "Send daglige oppdateringer"
individual: "Send en e-post for hvert nye innlegg"
individual_no_echo: "Send en e-post for hvert nye innlegg bortsett fra mine egne"
- many_per_day: "Send meg en e-post for hvert nye innlegg (rundt {{dailyEmailEstimate}} daglig)"
- few_per_day: "Send meg en e-post for hvert nye innlegg (rundt 2 daglig)"
+ many_per_day: "Send meg en e-post for hvert nye innlegg (rundt {{dailyEmailEstimate}} per deg)"
+ few_per_day: "Send meg en e-post for hvert nye innlegg (rundt to ganger om dagen)"
tag_settings: "Stikkord"
watched_tags: "Fulgt"
watched_tags_instructions: "Du vil automatisk følge alle emner med disse stikkordene. Du vil bli varslet om alle nye innlegg og emner, og tallet på nye innlegg til også vises ved siden av emnet."
@@ -540,7 +545,7 @@ nb_NO:
tracked_categories: "Overvåkes"
tracked_categories_instructions: "Du vil automatisk overvåke alle emner i disse kategoriene. Tallet på nye innlegg vil vises ved siden av emnet."
watched_first_post_categories: "Følger første innlegg"
- watched_first_post_categories_instructions: "Du vil bli varslet om det første innlegget i hvert nye emner i disse kategoriene."
+ watched_first_post_categories_instructions: "Du vil bli varslet om det første innlegget i hvert nye emne i disse kategoriene."
watched_first_post_tags: "Følger første innlegg"
watched_first_post_tags_instructions: "Du vil bli varslet om det første innlegget i hvert nye emne med disse stikkordene."
muted_categories: "Ignorert"
@@ -597,7 +602,7 @@ nb_NO:
title: "Endre e-postadresse"
taken: "Beklager, den e-postadressen er ikke tilgjengelig."
error: "Det oppsto en feil ved endring av din e-postadresse. Kanskje den adressen allerede er i bruk?"
- success: "Vi har sendt en e-post til den adressen. Vennligst følg meldingens instruksjoner for bekreftelse."
+ success: "Vi har sendt en e-post til den adressen. Følg meldingens instruksjoner for bekreftelse."
change_avatar:
title: "Bytt profilbilde"
gravatar: "Gravatar, basert på"
@@ -612,15 +617,15 @@ nb_NO:
cache_notice: "Profilbildet ditt er oppdatert, men på grunn av mellomlagring i nettlesere kan det ta litt tid før det synes."
change_profile_background:
title: "Profilbakgrunn"
- instructions: "Profilbakgrunner vil bli sentrert med en standardbredde på 850 piksler."
+ instructions: "Profilbakgrunner vil bli sentrert med en forvalgt bredde på 850 piksler."
change_card_background:
title: "Brukerkort bakgrunn"
- instructions: "Bakgrunnsbilder vil bli sentrert og ha en standardbredde på 590 piksler."
+ instructions: "Bakgrunnsbilder vil bli sentrert og ha en forvalgt bredde på 590 piksler."
email:
title: "E-post"
instructions: "Blir aldri vist offentlig"
ok: "Vi sender deg en e-post for å bekrefte"
- invalid: "Vennligst oppgi en gyldig e-postadresse"
+ invalid: "Oppgi en gyldig e-postadresse"
authenticated: "Din e-post har blitt autentisert av {{provider}}"
frequency_immediately: "Vi sender deg umiddelbart en e-post hvis du ikke har lest det vi sender e-post om."
frequency:
@@ -648,7 +653,7 @@ nb_NO:
locale:
title: "Språk for grensesnitt"
instructions: "Språk for grensesnitt. Endringen vil tre i kraft når du oppdaterer siden."
- default: "(standard)"
+ default: "(forvalg)"
any: "hvilken som helst"
password_confirmation:
title: "Passord igjen"
@@ -682,7 +687,7 @@ nb_NO:
weekly: "ukentlig"
every_two_weeks: "annenhver uke"
include_tl0_in_digests: "Inkludér innhold fra nye brukere i oppsummerings-eposter"
- email_in_reply_to: "Inkludér et utdrag i e-poster av innlegget man svarer på"
+ email_in_reply_to: "Inkluder et utdrag i e-poster av innlegget man svarer på"
email_direct: "Motta en e-post når noen siterer meg, svarer på innlegget mitt, nevner @brukernavnet mitt eller inviterer meg til et emne"
email_private_messages: "Motta en e-post når noen sender meg en melding"
email_always: "Send meg varsler på e-post selv når jeg er aktiv på nettstedet"
@@ -714,11 +719,16 @@ nb_NO:
user: "Invitert bruker"
sent: "Sendt"
none: "Det er ingen ventende invitasjoner å vise."
+ truncated:
+ one: "Viser den første invitasjonen."
+ other: "Viser de {{count}} første invitisajonene."
redeemed: "Løs inn invitasjoner"
redeemed_tab: "Brukt"
+ redeemed_tab_with_count: "Innløste ({{count}})"
redeemed_at: "Løst inn ved"
pending: "Ventende invitasjoner"
pending_tab: "På vent"
+ pending_tab_with_count: "Ventende ({{count}})"
topics_entered: "Emner vist"
posts_read_count: "Innlegg lest"
expired: "Denne invitasjonen har utløpt"
@@ -733,8 +743,10 @@ nb_NO:
account_age_days: "Kontoalder i dager"
create: "Send en invitasjon"
generate_link: "Kopier invitasjonslenke"
+ link_generated: "Invitasjonslenke har blitt generert!"
valid_for: "Invitasjonslenke er kun gyldig for denne e-postadressen: %{email}"
bulk_invite:
+ none: "Du har ikke invitert noen hit enda. Du kan sende individuelle invitasjoner, eller du kan invitere flere personer samtidig ved å laste opp en CSV-fil."
text: "Masseinvitasjon fra fil"
success: "Filen er lastet opp, du vil motta en melding når prosessesen er ferdig"
password:
@@ -776,9 +788,15 @@ nb_NO:
top_topics: "Mest Populære Emner"
no_topics: "Ingen emner enda."
more_topics: "Flere Emner"
+ top_badges: "Toppmerker"
no_badges: "Ennå ingen merker."
more_badges: "Flere merker"
+ top_links: "Topplenker"
no_links: "Ingen lenker enda"
+ most_liked_by: "Mest likt av"
+ most_liked_users: "Mest likt"
+ most_replied_to_users: "Mest besvart"
+ no_likes: "Ingen liker dette enda."
associated_accounts: "Innloggingsforsøk"
ip_address:
title: "Siste IP-adresse"
@@ -806,7 +824,7 @@ nb_NO:
unknown: "Feil"
not_found: "Side Ikke funnet"
desc:
- network: "Vennligst sjekk nettverkstilkoblingen din"
+ network: "Sjekk nettverkstilkoblingen din"
network_fixed: "Ser ut som om den er tilbake."
server: "Feilkode: {{status}}"
forbidden: "Du har ikke tilgang til dette."
@@ -827,7 +845,15 @@ nb_NO:
too_few_topics_and_posts_notice: "La oss få i gang diskusjonen. Det finnes for øyeblikket %{currentTopics} / %{requiredTopics} emner og %{currentPosts} / %{requiredPosts} innlegg. Nye brukere trenger noen samtaler å lese og svare på."
too_few_topics_notice: "La oss få i gang diskusjonen. Det finnes for øyeblikket %{currentTopics} / %{requiredTopics} emner. Nye brukere trenger noen samtaler å lese og svare på."
too_few_posts_notice: "La oss få i gang diskusjonen. Det finnes for øyeblikket %{currentPosts} / %{requiredPosts} innlegg. Nye brukere trenger noen samtaler å lese og svare på."
+ logs_error_rate_notice:
+ reached: "%{relativeAge} – %{rate} nådde innstillingsgrensen satt i %{siteSettingRate}."
+ exceeded: "%{relativeAge} – %{rate} overstiger innstillingsgrensen satt i %{siteSettingRate}."
+ rate:
+ one: "1 feil/%{duration}"
+ other: "%{count} feil/%{duration}"
learn_more: "lær mer..."
+ all_time: 'totalt'
+ all_time_desc: 'totalt antall emner opprettet'
year: 'år'
year_desc: 'emner opprettet de siste 365 dagene'
month: 'måned'
@@ -853,6 +879,7 @@ nb_NO:
summary:
enabled_description: "Du ser for øyeblikket en oppsummering av dette emnet: de mest interessante innleggene ifølge fellesskapet."
description: "Det er {{replyCount}} svar."
+ description_time: "Det er {{replyCount}} svar med en forventet lesetid på {{readingTime}} minutter."
enable: 'Oppsummer dette emnet'
disable: 'Vis alle innlegg'
deleted_filter:
@@ -894,21 +921,21 @@ nb_NO:
email_placeholder: "e-postadresse eller brukernavn"
caps_lock_warning: "Caps Lock er på"
error: "Ukjent feil"
- rate_limit: "Vennligst vent litt før du logger inn igjen."
- blank_username_or_password: "Vennligst oppgi din e-postadresse eller brukernavn og ditt passord."
+ rate_limit: "Vent litt før du logger inn igjen."
+ blank_username_or_password: "Oppgi din e-postadresse eller brukernavn og ditt passord."
reset_password: 'Nullstill passord'
logging_in: "Logger på..."
or: "Eller"
authenticating: "Autentiserer..."
awaiting_confirmation: "Din konto avventer aktivering. Bruk lenken for glemt passord for å sende en ny e-post for aktivering."
awaiting_approval: "Din konto har ikke blitt godkjent av en moderator ennå. Du vil motta en e-post når den er godkjent."
- requires_invite: "Beklager, tilgang til dette forumet er kun ved invitasjon."
- not_activated: "Du kan ikke logge inn ennå. Vi sendte en e-post for aktivering til deg på {{sentTo}}. Vennligst følg instruksjonene i den e-posten for å aktivere din konto."
+ requires_invite: "Beklager, tilgang til dette forumet kun ved invitasjon."
+ not_activated: "Du kan ikke logge inn ennå. Vi sendte en e-post for aktivering til deg på {{sentTo}}. Følg instruksjonene i den e-posten for å aktivere din konto."
not_allowed_from_ip_address: "Du kan ikke logge inn fra den IP-adressen."
admin_not_allowed_from_ip_address: "Du kan ikke logge inn som administrator fra den IP-adressen."
resend_activation_email: "Klikk her for å sende e-posten for aktivering igjen."
sent_activation_email_again: "Vi sendte deg en ny e-post for aktivering på {{currentEmail}}. Det kan ta noen minutter før den kommer fram; sørg for at du sjekker nettsøppel om du ikke finner den."
- to_continue: "Vennligst Logg Inn"
+ to_continue: "Logg inn"
preferences: "Du må være innlogget for å endre brukerinnstillinger."
forgot: "I husker ikke mine kontodetaljer"
google:
@@ -922,6 +949,7 @@ nb_NO:
message: "Autentiserer med Twitter (sørg for at du tillater pop-up vindu)"
instagram:
title: "med Instagram"
+ message: "Logger på med Instagram. Sørg for at du ikke har programvare som blokkerer forgrunnsvinduer."
facebook:
title: "med Facebook"
message: "Autentiserer med Facebook (sørg for at du tillater pop-up vindu)"
@@ -939,6 +967,8 @@ nb_NO:
win10: "Win10"
category_page_style:
categories_only: "Kun kategorier"
+ categories_with_featured_topics: "Kategorier med framhevede emner"
+ categories_and_latest_topics: "Kategorier og siste emner"
shortcut_modifier_key:
shift: 'Shift'
ctrl: 'Ctrl'
@@ -950,6 +980,7 @@ nb_NO:
whisper: "hvisker"
unlist: "skjult"
add_warning: "Dette er en offisiell advarsel."
+ toggle_whisper: "Veksle hvisking"
toggle_unlisted: "Skjul eller gjør synlig"
posting_not_on_topic: "Du svarer på emnet \"{{title}}\", men for øyeblikket ser du på et annet emne."
saving_draft_tip: "lagrer..."
@@ -957,8 +988,13 @@ nb_NO:
saved_local_draft_tip: "lagret lokalt"
similar_topics: "Emnet ditt har likheter med..."
drafts_offline: "utkast offline"
+ group_mentioned:
+ one: "Ved å nevne {{group}}, er du i ferd med å henvende deg til {{count}} én person – er du sikker?"
+ other: "Ved å nevne {{group}}, er du i ferd med å henvende deg til {{count}} folk – er du sikker?"
cannot_see_mention:
category: "Du nevnte {{username}}, men de vil ikke ikke bli varslet fordi de ikke hara tilgang til denne kategorien. Du må legge dem til en gruppe som har tilgang til denne kategorien."
+ private: "Du nevnte {{username}}, men de vil ikke bli varslet fordi de ikke kan se denne samtalen. Du må invitere dem til samtalen."
+ duplicate_link: "Det ser ut til at {{domain}} allerede finnes som innlegg om emnet av @{{username}} i et svar {{ago}} – er du sikker på at du vil gjenta det?"
error:
title_missing: "Tittel er påkrevd"
title_too_short: "Tittel må være på minst {{min}} tegn"
@@ -977,8 +1013,11 @@ nb_NO:
title: "Eller trykk Ctrl+Enter"
users_placeholder: "Legg til en bruker"
title_placeholder: "Oppsummert i en setning, hva handler denne diskusjonen om?"
+ title_or_link_placeholder: "Skriv inn tittel eller lim inn en lenke her"
edit_reason_placeholder: "hvorfor endrer du?"
show_edit_reason: "(legg till endringsbegrunnelse)"
+ topic_featured_link_placeholder: "Skriv inn lenke vist med tittel."
+ reply_placeholder: "Skriv her. Bruk Markdown, BBCode eller HTML for å formattere. Dra og slipp bilder."
view_new_post: "Se ditt nye innlegg."
saving: "Lagrer"
saved: "Lagret!"
@@ -987,8 +1026,10 @@ nb_NO:
show_preview: 'se forhånsvisning »'
hide_preview: '« skjul forhåndsvisning'
quote_post_title: "Siter hele innlegget"
+ bold_label: "F"
bold_title: "Sterk"
bold_text: "sterk tekst"
+ italic_label: "K"
italic_title: "Kursiv"
italic_text: "kursiv tekst"
link_title: "Hyperlenke"
@@ -1006,6 +1047,7 @@ nb_NO:
olist_title: "Nummerert Liste"
ulist_title: "Kulepunkt Liste"
list_item: "Listeelement"
+ heading_label: "O"
heading_title: "Overskrift"
heading_text: "Overskrift"
hr_title: "Horisontalt Skille"
@@ -1016,11 +1058,12 @@ nb_NO:
cant_send_pm: "Beklager, du kan ikke sende privat melding til %{username}."
yourself_confirm:
title: "Glemte du å legge til mottagere?"
+ body: "Nå sender du denne meldingen bare til deg selv!"
admin_options_title: "Valgfrie emne-instillinger for stab"
auto_close:
label: "Tid for auto-lukking av emnet:"
- error: "Vennligst skriv en gyldig verdi."
- based_on_last_post: "Ikke lukk før den siste posten i emnet er minst så gammel."
+ error: "Skriv inn en gyldig verdi."
+ based_on_last_post: "Ikke lukk før det siste innlegget i emnet er minst så gammelt."
all:
examples: 'Før inn antall timer (24), absolutt tid (17:30) eller tidsstempel (2013-11-22 14:00).'
limited:
@@ -1033,23 +1076,39 @@ nb_NO:
more: "se gamle varsler"
total_flagged: "totalt rapporterte innlegg"
mentioned: "
{{username}} {{description}}
"
+ group_mentioned: "
{{username}} {{description}}
"
quoted: "
{{username}} {{description}}
"
replied: "
{{username}} {{description}}
"
+ posted: "
{{username}} {{description}}
"
edited: "
{{username}} {{description}}
"
liked: "
{{username}} {{description}}
"
+ liked_2: "
{{username}}, {{username2}} {{description}}
"
+ liked_many:
+ one: "
{{username}}, {{username2}} og 1 anne {{description}}
"
+ other: "
{{username}}, {{username2}} og {{count}} andre {{description}}
"
private_message: "
{{username}} {{description}}
"
invited_to_private_message: "
{{username}} {{description}}
"
invited_to_topic: "
{{username}} {{description}}
"
invitee_accepted: "
{{username}} accepted your invitation
"
moved_post: "
{{username}} moved {{description}}
"
+ linked: "
{{username}} {{description}}
"
granted_badge: "
Ble tildelt '{{description}}'
"
+ watching_first_post: "
Nytt emne {{description}}
"
+ group_message_summary:
+ one: "
{{count}} melding i {{group_name}}-gruppens innboks
"
+ other: "
{{count}} meldinger i {{group_name}}-gruppens innboks
"
alt:
mentioned: "Nevnt av"
quoted: "Sitert av"
replied: "Svart"
posted: "Innlegg av"
+ edited: "Rediger din melding innen"
liked: "Likte innlegget ditt"
private_message: "Privat melding fra"
+ invited_to_private_message: "Invitert til privat korrespondanse av"
+ invited_to_topic: "Invitert til et emne fra"
+ invitee_accepted: "Invitiasjon akseptert av"
+ moved_post: "Ditt innlegg ble flyttet av"
linked: "Link til innlegget ditt"
granted_badge: "Merke innvilget"
group_message_summary: "Meldinger i gruppeinnboks"
@@ -1067,8 +1126,11 @@ nb_NO:
from_my_computer: "Fra Min Enhet"
from_the_web: "Fra nettet"
remote_tip: "link til bilde"
+ remote_tip_with_attachments: "lenke til bilde eller fil {{authorized_extensions}}"
local_tip: "velg bilder fra din enhet"
- hint: "(du kan også drag & drop inn i editoren for å laste dem opp)"
+ local_tip_with_attachments: "velg bilde eller fil fra din enhet {{authorized_extensions}}"
+ hint: "(du kan også dra og slippe inn i tekstbehandleren for å laste dem opp)"
+ hint_for_supported_browsers: "du kan også dra og slippe eller lime inn bilder i tekstbehandleren"
uploading: "Laster opp bilde"
select_file: "Velg fil"
image_link: "lenken som bildet skal peke til"
@@ -1081,23 +1143,55 @@ nb_NO:
select_all: "Velg alle"
clear_all: "Fjern Alle"
too_short: "Din søketekst er for kort."
+ result_count:
+ one: "Ett resultat for \"{{term}}\""
+ other: "{{count}} resultater for \"{{term}}\""
title: "søk etter emner, innlegg, brukere eller kategorier"
no_results: "Ingen resultater funnet."
no_more_results: "Ingen flere resultater funnet."
searching: "Søker ..."
post_format: "#{{post_number}} av {{username}}"
context:
- user: "Søk innleggene av @{{username}}"
+ user: "Søk i innleggene av @{{username}}"
+ category: "Søk i kategorien #{{category}}"
topic: "Søk i dette emnet"
private_messages: "Søk i meldinger"
advanced:
title: Avansert søk
+ posted_by:
+ label: Skrevet av
+ in_category:
+ label: I kategorien
+ in_group:
+ label: I gruppen
+ with_badge:
+ label: Med merke
+ with_tags:
+ label: Med stikkord
filters:
label: Returner bare emner/innlegg som...
+ likes: Jeg likte
+ posted: jeg skrev innlegg i
watching: Jeg følger
tracking: Jeg overvåker
+ private: er i mine meldinger
+ bookmarks: Jeg har bokmerket
+ first: er det første innlegget
+ pinned: er festet
+ unpinned: er ikke festet
+ wiki: er wiki
+ statuses:
+ label: Der emner
+ open: er åpen
+ closed: er lukket
+ archived: er arkivert
+ noreplies: har ingen svar
+ single_user: inneholder en enkelt bruker
post:
+ count:
+ label: Minimum antall innlegg
time:
+ label: Skrevet
before: før
after: etter
hamburger_menu: "gå til en annen emneliste eller kategori"
@@ -1110,8 +1204,12 @@ nb_NO:
bulk:
select_all: "Velg alle"
clear_all: "Fjern alle"
+ unlist_topics: "Avlist emner"
reset_read: "Nullstill lest"
delete: "Slett emne"
+ dismiss: "Avslå"
+ dismiss_read: "Merk alle som lest"
+ dismiss_button: "Avslå…"
dismiss_tooltip: "Avslå bare nye innlegg eller slutt å overvåke emner"
also_dismiss_topics: "Slutt å overvåke disse emnene slik at de aldri igjen vises til meg som ulest"
dismiss_new: "Lest"
@@ -1125,11 +1223,14 @@ nb_NO:
selected:
one: "Du har valgt 1 emne."
other: "Du har valgt {{count}} emner."
+ change_tags: "Endre stikkord"
+ choose_new_tags: "Velg nye stikkord for disse emnene:"
+ changed_tags: "Stikkordene på disse innleggene ble endret."
none:
unread: "Du har ingen uleste emner å lese."
new: "Du har ingen nye emner å lese."
read: "Du har ikke lest noen emner enda."
- posted: "Du har ikke postet i noen emner enda."
+ posted: "Du har ikke sendt inn innlegg i noen emner enda."
latest: "Det finnes ingen siste emner. Det var synd."
hot: "Det er ingen populære emner."
bookmarks: "Du har ingen bokmerkede emner."
@@ -1137,11 +1238,12 @@ nb_NO:
top: "Det er ingen populære emner."
search: "Det er ingen søkeresultater"
educate:
- unread: '
Dine uleste emner vil vises her.
Som standard anses emner for å være ulest og vil vise ulest-tall 1 dersom du:
Opprettet emnet
Svarte på emnet
Leste emnet i mer enn 4 minutter
Eller dersom du uttrykkelig har satt emnet som overvåkes eller sett via varselkontrollen nederst i hvert emne.
'
bottom:
latest: "Det er ingen siste emner igjen å lese."
hot: "Det er ingen populære emner igjen å lese."
- posted: "Det er ingen postede emner igjen å lese."
+ posted: "Det er ingen emner med innlegg igjen å lese."
read: "Det er ingen leste emner igjen å lese."
new: "Det er ingen nye emner igjen å lese."
unread: "Det er ingen uleste emner igjen å lese."
@@ -1150,10 +1252,17 @@ nb_NO:
bookmarks: "Det er ingen bokmerkede emner."
search: "Det er ingen flere søkeresultater"
topic:
+ unsubscribe:
+ stop_notifications: "Du vil nå få færre varsler for {{title}}"
+ change_notification_state: "Din nåværende varslingsstatus er"
+ filter_to:
+ one: "1 innlegg i emne"
+ other: "{{count}} innlegg i emne"
create: 'Nytt emne'
create_long: 'Opprett et nytt emne'
private_message: 'Begynn en melding'
archive_message:
+ help: 'Flytt meldinger til arkivet ditt'
title: 'Arkiver'
move_to_inbox:
title: 'Flytt til Inbox'
@@ -1174,7 +1283,7 @@ nb_NO:
login_required: "Du må være logget inn for å lese dette emnet."
server_error:
title: "Emnet kunne ikke bli behandlet"
- description: "Beklager, vi kunne ikke behanldle det emnet, muligens på grunn av et tilkoblingsproblem. Vennligst prøv igjen. Om problemet vedvarer, fortell oss."
+ description: "Beklager, vi kunne ikke behandle det emnet, muligens på grunn av et tilkoblingsproblem. Prøv igjen. Om problemet vedvarer, fortell oss om det."
not_found:
title: "Emnet kunne ikke bli funnet"
description: "Beklager, vi kunne ikke finne det emnet. Kanskjer det ble fjernet av en moderator?"
@@ -1208,16 +1317,27 @@ nb_NO:
auto_close_title: 'Auto-lukk innstillinger'
auto_close_save: "Lagre"
auto_close_remove: "Ikke lukk dette emnet automatisk"
+ auto_close_immediate:
+ one: "Det siste innlegget i emnet er allerede en time gammelt, så emnet vil stenges umiddelbart."
+ other: "Det siste innlegget i emnet er allerede %{count} timer gammelt, så emnet vil stenges umiddelbart."
+ timeline:
+ back: "Tilbake"
+ back_description: "Gå tilbake til forrige uleste innlegg"
+ replies_short: "%{current} / %{total}"
progress:
title: emneframgang
go_top: "topp"
go_bottom: "bunn"
go: "gå"
jump_bottom: "Hopp til nyeste innlegg"
+ jump_prompt: "hopp til..."
+ jump_prompt_of: "av %{count} innlegg"
+ jump_prompt_long: "Hvilken melding vil du gå til?"
jump_bottom_with_number: "hopp til innlegg %{post_number}"
total: innlegg totalt
current: gjeldende innlegg
notifications:
+ title: endre hvor ofte du blir varslet om dette emnet
reasons:
mailing_list_mode: "Du har slått på e-postlistemodus, så du vil bli varslet på e-post om svar på dette emnet."
'3_10': 'Du vil motta varsler fordi du følger et stikkord for dette emnet'
@@ -1258,6 +1378,7 @@ nb_NO:
description: "Du vil ikke få varslinger om noe i denne meldingnen. "
muted:
title: "Ignorert"
+ description: "Du vil bli varslet om alt som har med dette emnet og gjøre, og det vil ikke vises i siste."
actions:
recover: "Gjenopprett emne"
delete: "Slett emne"
@@ -1265,16 +1386,18 @@ nb_NO:
close: "Lukk emne"
multi_select: "Velg innlegg..."
auto_close: "Lukk automatisk"
- pin: "Feste emnet..."
- unpin: "Løsgjør emne"
+ pin: "Fest emnet…"
+ unpin: "Løsne emne…"
unarchive: "Opphev arkivering av emne"
archive: "Arkiver emne"
invisible: "Skjul emnet"
visible: "Gjør synlig"
reset_read: "Tilbakestill lesedata"
+ make_public: "Gjør emnet offentlig"
+ make_private: "Gjør om til privat melding"
feature:
pin: "Fest emnet"
- unpin: "Løsgjør emnet"
+ unpin: "Løsne emnet"
pin_globally: "Fest emnet globalt"
make_banner: "Banneremne"
remove_banner: "Fjern banneremne"
@@ -1282,8 +1405,8 @@ nb_NO:
title: 'Svar'
help: 'begynn å skrive et svar til dette emnet'
clear_pin:
- title: "Løsgjør emne"
- help: "Løsgjør fastsatt-statusen til dette emnet så det ikke lenger vises på toppen av din emneliste"
+ title: "Løsne emne"
+ help: "Løsne feste-statusen til dette emnet slik at det ikke lenger vises på toppen av din emneliste"
share:
title: 'Del'
help: 'del en lenke til dette emnet'
@@ -1296,22 +1419,39 @@ nb_NO:
success_message: 'Du har rapportert dette emnet'
feature_topic:
title: "Fremhev dette emnet"
- confirm_pin: "Du har allerede {{count}} låste emner. For mange låste emner kan være et problem for nye og anonyme brukere. Er du sikker på at du ønsker å låse et til emne i denne kategorien?"
+ pin: "La dette emnet få stå på toppen av {{categoryLink}} kategorien til"
+ confirm_pin: "Du har allerede {{count}} festede emner. For mange festede emner kan være et problem for nye og anonyme brukere. Er du sikker på at du ønsker å feste enda et emne i denne kategorien?"
unpin: "Fjern dette emnet fra toppen av {{categoryLink}} kategorien."
+ unpin_until: "Fjern dette emnet fra toppen av {{categoryLink}} kategorien, eller vent til %{until}."
pin_note: "Brukere kan selv fjerne festet for dette emnet."
- confirm_pin_globally: "Du har allerede {{count}} globalt låste emner. For mange låste emner kan bli en byrde for nye og anonyme brukere. Er du sikker på at du vil låse et til emne globalt? "
+ pin_validation: "En dato kreves for å feste dette emnet."
+ not_pinned: "Det er ingen festede emner i {{categoryLink}}."
+ already_pinned:
+ one: "Emner for øyeblikket låst i {{categoryLink}}: Ett"
+ other: "Emne for øyeblikket låst i {{categoryLink}}: {{count}}"
+ pin_globally: "Få dette emnet til å figurere på toppen av alle emnelistene til"
+ confirm_pin_globally: "Du har allerede {{count}} globalt festede emner. For mange festede emner kan bli en byrde for nye og anonyme brukere. Er du sikker på at du vil feste enda et emne globalt? "
unpin_globally: "Fjern dette emnet fra toppen av alle emnelister. "
+ unpin_globally_until: "Fjern dette emnet fra toppen av alle emnelister eller vent til %{until}."
global_pin_note: "Brukere kan fjerne festet for emnet for seg selv"
+ not_pinned_globally: "Det er ingen festede emner globalt."
+ already_pinned_globally:
+ one: "Emner for øyeblikket festet globalt: 1"
+ other: "Dette enmnet er festet globalt: {{count}}"
make_banner: "Gjør dette emnet til et banner som dukker opp på toppen av alle sider."
remove_banner: "Fjern banneret som dukker opp på toppen av alle sider. "
banner_note: "Brukere kan fjerne banneret ved å lukke det. Kun et emne kan være banner på en og samme tid. "
+ no_banner_exists: "Det er ingen banneremner. "
+ banner_exists: "Det er for øyeblikket et banneremne. "
inviting: "Inviterer..."
+ automatically_add_to_groups: "Denne invitasjonen inkluderer også tilgang til disse gruppene:"
invite_private:
title: 'Invitér til samtale'
email_or_username: "Invitertes e-post eller brukernavn."
email_or_username_placeholder: "e-postadresse eller brukernavn"
action: "Invitér"
success: "Vi har invitert denne brukeren til å delta i denne meldingen."
+ success_group: "Vi har invitert denne gruppen til å delta i denne meldingen."
error: "Beklager, det oppstod en feil ved å invitere den brukeren."
group_name: "gruppenavn"
controls: "Emnefunksjoner"
@@ -1349,11 +1489,12 @@ nb_NO:
action: "slå sammen emne"
error: "Det oppsto en feil ved sammenslåing av dette emnet."
instructions:
- one: "Vennligst velg det emnet du vil flytte det innlegget til."
- other: "Vennligst velg emnet du vil flytte de {{count}} innleggene til."
+ one: "Velg det emnet du vil flytte det innlegget til."
+ other: "Velg emnet du vil flytte de {{count}} innleggene til."
merge_posts:
title: "Slå sammen valgte innlegg"
action: "slå sammen valgte innlegg"
+ error: "Feil ved fletting av valgte innlegg."
change_owner:
title: "Endre innleggenes eier"
action: "Endre eierskap"
@@ -1364,6 +1505,12 @@ nb_NO:
one: "Velg den nye eieren til innlegget av {{old_user}}."
other: "Velg den nye eieren til {{count}} innlegg av {{old_user}}."
instructions_warn: "Merk at ingen varsler om dette innlegget vil overføres til den nye eieren i etterkant. Advarsel: For øyeblikket blir ingen innleggsavhengige data overført til den nye brukeren. Bruk med omhu."
+ change_timestamp:
+ title: "Endre tidsstempel"
+ action: "endre tidsstempel"
+ invalid_timestamp: "Tidsstempel kan ikke være i framtiden."
+ error: "Det oppstod en feil ved endring av tidsstempel for emnet."
+ instructions: "Velg et nytt tidsstempel for emnet. Innlegg i emnet blir oppdatert med samme tidsforksjell."
multi_select:
select: 'velg'
selected: 'valgte ({{count}})'
@@ -1376,15 +1523,17 @@ nb_NO:
one: Du har valgt 1 innlegg.
other: Du har valgt {{count}} innlegg.
post:
+ reply: " {{replyAvatar}} {{usernameLink}}"
+ reply_topic: " {{link}}"
quote_reply: "Sitat"
edit: "Redigerer {{link}} {{replyAvatar}} {{username}}"
edit_reason: "Begrunnelse:"
- post_number: "post {{number}}"
+ post_number: "innlegg {{number}}"
last_edited_on: "innlegg sist redigert"
reply_as_new_topic: "Svar med lenket emne"
continue_discussion: "Fortsetter diskusjonen fra {{postLink}}:"
follow_quote: "gå til det siterte innlegget"
- show_full: "Vis hele posten"
+ show_full: "Vis hele innlegget"
show_hidden: 'Se skjult innhold'
deleted_by_author:
one: "(innlegg som er trukket tilbake av forfatter, blir automatisk slettet etter % {count} time, med mindre de blir flagget)"
@@ -1408,12 +1557,13 @@ nb_NO:
one: "du og 1 annen bruker likte dette innlegget"
other: "du og {{count}} andre likte dette innlegget"
errors:
- create: "Beklager, det oppstod en feil ved å publisere ditt innlegg. Vennligst prøv igjen."
+ create: "Beklager, det oppstod en feil ved å publisere ditt innlegg. Prøv igjen."
edit: "Beklager, det oppstod en feil ved redigeringen av ditt innlegg. Vennligst prøv igjen."
upload: "Sorry, there was an error uploading that file. Please try again."
+ file_too_large: "Beklager, den filen er for stor. Største tillatte størrelse er {{max_size_kb}} kb. Hvorfor ikke heller laste opp filen til en fildelingstjeneste og dele lenken?"
too_many_uploads: "Beklager, du kan bare laste opp ett bilde om gangen."
too_many_dragged_and_dropped_files: "Beklager, du kan bare laste opp 10 filer om gangen."
- upload_not_authorized: "Beklager, filen du prøver å laste opp er ikke godkjent (godkjente filtyper: {{authorized_extensions}})."
+ upload_not_authorized: "Beklager, filen du forsøket å laste opp er ikke tillatt. Tillatte filendelser er {{authorized_extensions}}."
image_upload_not_allowed_for_new_user: "Beklager, nye brukere kan ikke laste opp bilder"
attachment_upload_not_allowed_for_new_user: "Beklager, nye brukere kan ikke laste opp vedlegg."
attachment_download_requires_login: "Beklager, du må være logget inn for å laste ned vedlegg."
@@ -1422,8 +1572,13 @@ nb_NO:
no_value: "Nei"
yes_value: "Ja"
via_email: "Dette innlegget ankom via e-post"
+ via_auto_generated_email: "dette innlegget kommer fra en automatisk generert e-post"
+ whisper: "dette innlegget er et privat hvisken for moderatorer"
+ wiki:
+ about: "dette innlegget er en wiki"
archetypes:
save: 'Lagre Alternativene'
+ few_likes_left: "Takk for at du sprer kjærlighet! Du vil nå grensen for antall ting du kan like i dag ganske snart."
controls:
reply: "begynn å skrive et svar til dette innlegget"
like: "lik dette innlegget"
@@ -1449,6 +1604,7 @@ nb_NO:
revert_to_regular: "Fjern stabsfarge"
rebake: "Gjenoppbygg HTML"
unhide: "Vis"
+ change_owner: "Endre eierskap"
actions:
flag: 'Rapportering'
defer_flags:
@@ -1462,10 +1618,12 @@ nb_NO:
like: "Angre liker"
vote: "Angre stemme"
people:
+ off_topic: "markerte dette som urelatert"
spam: "flagget dette som spam"
inappropriate: "flagget dette som upassende"
notify_moderators: "varslet moderatorer"
notify_user: "sendte en melding"
+ bookmark: "bokmerket dette"
like: "likte dette"
vote: "stemte for dette"
by_you:
@@ -1531,6 +1689,10 @@ nb_NO:
confirm:
one: "Er du sikker på at du vil slette det innlegget?"
other: "Er du sikker på at du vil slette alle de innleggene?"
+ merge:
+ confirm:
+ one: "Er du sikker på at du vil flette de innleggene?"
+ other: "Er du sikker på at du vil flette disse {{count}} innleggene?"
revisions:
controls:
first: "Første versjon"
@@ -1562,8 +1724,12 @@ nb_NO:
general: 'Generellt'
settings: 'Innstillinger'
topic_template: "Emnemal"
+ tags: "Stikkord"
+ tags_allowed_tags: "Stikkord som bare kan brukes i denne kategorien:"
+ tags_allowed_tag_groups: "Stikkord som bare kan brukes i denne kategorien:"
tags_placeholder: "(Valgfritt) Liste over tillatte stikkord"
tag_groups_placeholder: "(Valgfritt) Liste over tillatte stikkordgrupper"
+ topic_featured_link_allowed: "Tillat fremhevede lenker i denne kategorien"
delete: 'Slett kategori'
create: 'Ny Kategori'
create_long: 'Opprett en ny kategori'
@@ -1585,10 +1751,11 @@ nb_NO:
delete_confirm: "Er du sikker på at du vil slette denne kategorien?"
delete_error: "Det oppstod en feil ved å slette denne kategorien."
list: "List Kategorier"
- no_description: "Vennligst legg til en beskrivelse for denne kategorien."
+ no_description: "Legg til en beskrivelse for denne kategorien."
change_in_category_topic: "Rediger Beskrivelse"
already_used: 'Denne fargen er i bruk av en annen kategori'
security: "Sikkerhet"
+ special_warning: "Advarsel: Denne kategorien er en forhåndsbestemt kategori og dens sikkerhetsinnstillinger kan ikke endres. Hvis du ikke vil bruke denne kategorien, slett den i stedet for å bruke den til noe annet."
images: "Bilder"
auto_close_label: "Lukk emner automatisk etter:"
auto_close_units: "timer"
@@ -1596,12 +1763,15 @@ nb_NO:
email_in_allow_strangers: "Godta e-post fra anonyme brukere uten brukerkonto"
email_in_disabled: "Posting av nye emner via e-post er deaktivert i nettstedsinstillingene. For å aktivere posting av nye emner via e-post,"
email_in_disabled_click: 'aktiver innstillingen "e-post inn".'
+ suppress_from_homepage: "Utelat denne kategorien fra hjemmesiden."
+ all_topics_wiki: "Gjør nye emner til wiki-er som forvalg."
+ sort_order: "Forvalgt sortering:"
allow_badges_label: "Tillat merker å bli tildelt i denne kategorien"
edit_permissions: "Rediger tillatelser"
add_permission: "Legg til tillatelser"
this_year: "dette året"
position: "posisjon"
- default_position: "Standard posisjon"
+ default_position: "Forvalgt posisjon"
position_disabled: "Kategorier vil bli vist i henhold til aktivitet. For å styre rekkefølgen av kategorier i listen"
position_disabled_click: 'aktivere "faste kategoriposisjoner"-innstillingen.'
parent: "Foreldrekategori"
@@ -1611,6 +1781,7 @@ nb_NO:
description: "Du vil automatisk følge alle emnene i disse kategoriene. Du vil bli varslet om hvert nye innlegg i hvert emne, og antall nye svar vil bli vist."
watching_first_post:
title: "Følger første innlegg"
+ description: "Du vil bare bli varslet om det første innlegget i hvert nye emne i disse kategoriene."
tracking:
title: "Overvåkning"
description: "Du vil automatisk overvåke alle emner i disse kategoriene. Du vil bli varslet dersom noen nevner @navnet ditt eller svarer deg, og antallet nye svar vil bli vist."
@@ -1619,6 +1790,19 @@ nb_NO:
description: "Du vil bli varslet om noen nevner ditt @navn eller svarer deg."
muted:
title: "Ignorert"
+ description: "Du vil aldri bli varslet om noe med tanke på nye emner i disse kategoriene, og de vil ikke vises i siste."
+ sort_options:
+ default: "forvalg"
+ likes: "Gunst"
+ op_likes: "Gunst gitt orginalinnlegget"
+ views: "Visninger"
+ posts: "Innlegg"
+ activity: "Aktivitet"
+ posters: "Bidragsytere"
+ category: "Kategori"
+ created: "Opprettet"
+ sort_ascending: 'Stigende'
+ sort_descending: 'Synkende'
flagging:
title: 'Takk for at du hjelper å holde forumet ryddig!'
action: 'Rapporter innlegg'
@@ -1626,18 +1810,30 @@ nb_NO:
notify_action: 'Melding'
official_warning: 'Offisiell Advarsel'
delete_spammer: "Slett spammer"
+ delete_confirm_MF: "Du er i ferd med å slette {POSTS, flere, ett {1 innlegg} andre {# innlegg}} og {EMNER, flere, ett {1 emne} andre {# emner}} av denne brukeren, fjern kontoen deres, blokker påmeldinger fra deres IP-adresse {ip_address}, og legg til deres e-postadresse {email} til en permanent blokkeringsliste. Er du sikker på at denne brukeren virkelig sender søppelpost?"
yes_delete_spammer: "Ja, slett spammer"
ip_address_missing: "(N/A)"
hidden_email_address: "(skjult)"
submit_tooltip: "Rapporter privat"
take_action_tooltip: "Oppnå rapporteringsterskel umiddelbart, i stedet for å vente på flere rapporteringer."
cant: "Beklager, du kan ikke rapportere dette innlegget nå."
+ notify_staff: 'Gjør stab oppmerksom på dette privat'
formatted_name:
- off_topic: "Det er off-topic "
+ off_topic: "Det er urelatert"
inappropriate: "Det er upassende"
spam: "Det er reklame"
custom_placeholder_notify_user: "Vær spesifikk, konstruktiv og snill."
custom_placeholder_notify_moderators: "La oss vite nøyaktig hva problemet er, og del relevante lenker og eksempler hvorvidt det er mulig."
+ custom_message:
+ at_least:
+ one: "skriv inn minst ett tegn"
+ other: "skriv inn minst {{count}} tegn"
+ more:
+ one: "Én igjen…"
+ other: "{{count}} igjen…"
+ left:
+ one: "ett gjenstående"
+ other: "{{count}} gjenstående"
flagging_topic:
title: "Takk for at du hjelper med å vedlikeholde god skikk i samfundet vårt!"
action: "Rapporter emne"
@@ -1646,9 +1842,15 @@ nb_NO:
title: "Emneoppsummering"
participants_title: "Hyppige Bidragsytere"
links_title: "Populære Lenker"
+ links_shown: "vis flere lenker…"
clicks:
one: "1 klikk"
other: "%{count} klikk"
+ post_links:
+ about: "utvid flere lenker for dette innlegget"
+ title:
+ one: "Én til"
+ other: "%{count} flere"
topic_statuses:
warning:
help: "Dette er en offisiell advarsel."
@@ -1658,11 +1860,14 @@ nb_NO:
help: "dette emnet er låst; det aksepterer ikke lenger nye svar"
archived:
help: "dette emnet er arkivert; det er fryst og kan ikke bli aktivert"
+ locked_and_archived:
+ help: "Dette emnet er lukket og akrivert; nye innlegg godtas ikke og tidligere svar kan ikke endres"
unpinned:
title: "Feste fjernet"
help: "Dette emnet er ikke lenger festet, det vil vises i vanlig rekkefølge"
pinned_globally:
title: "Globalt fastsatt"
+ help: "Emnet er festet globalt; det vil vises på toppen av seneste og i egen kategori"
pinned:
title: "Fastsatt"
help: "Dette emnet er fastsatt for deg; det vil vises i toppen av sin kategori"
@@ -1743,7 +1948,7 @@ nb_NO:
help: "emner opprettet de siste dagene"
posted:
title: "Mine Innlegg"
- help: "emner du har postet i"
+ help: "emner du har bidratt med innlegg i"
bookmarks:
title: "Bokmerker"
help: "emner du har bokmerket"
@@ -1769,13 +1974,13 @@ nb_NO:
daily:
title: "Daglig"
all_time: "Totalt"
- this_year: "År"
- this_quarter: "Kvartal"
- this_month: "Måned"
- this_week: "Uke"
+ this_year: "Det siste året"
+ this_quarter: "Det siste kvartalet"
+ this_month: "Den siste måneden"
+ this_week: "Den siste uken"
today: "I dag"
other_periods: "se toppen"
- browser_update: 'Dessverre, Din nettleser er for gammel og fungerer ikke med dette nettstedet.. Vennligst oppgrader nettleseren din.'
+ browser_update: 'Dessverre, Din nettleser er for gammel og fungerer ikke med dette nettstedet.. Oppgrader nettleseren din.'
permission_types:
full: "Opprett / Svar / Se"
create_post: "Svar / Se"
@@ -1799,32 +2004,160 @@ nb_NO:
title: 'Navigasjon'
jump: '# Gå til innlegg #'
back: 'u Tilbake'
+ up_down: 'k/j Flytt utvalg ↑ ↓'
open: 'o or Enter Åpne valgt emne'
+ next_prev: 'shift+j/shift+k Neste/forrige del'
application:
+ title: 'Applikasjon'
+ create: 'c Opprett nytt emne'
notifications: 'n Åpne varsler'
+ hamburger_menu: '= Åpne hamburgermeny'
+ user_profile_menu: 'p Åpne brukermenyen'
+ show_incoming_updated_topics: '. Vis oppdaterte emner'
search: '/ Søk'
help: '? Åpne tastaturhjelp'
+ dismiss_new_posts: 'x, r Avvis Nye/Innlegg'
+ dismiss_topics: 'x, t Avvis emner'
+ log_out: 'shift+zshift+z Logg ut'
actions:
+ title: 'Handlinger'
+ bookmark_topic: 'f Bokmerk emne / Fjern bokmerke'
pin_unpin_topic: 'shift+p Fest/fjern feste for emne'
+ share_topic: 'shift+s Del emne'
+ share_post: 's Del innlegg'
+ reply_as_new_topic: 't Svar som lenket emne'
+ reply_topic: 'shift+r Svar på emne'
+ reply_post: 'r Svar på innlegg'
+ quote_post: 'q Siter innlegg'
+ like: 'l Lik innlegg'
+ flag: '! Rapporter innlegg'
+ bookmark: 'b Bokmerk innlegg'
+ edit: 'e Rediger innlegg'
+ delete: 'd Slett innlegg'
mark_muted: 'm, m Ignorer emnet'
+ mark_regular: 'm, r Vanlig (forvalgt) emne'
mark_tracking: 'm, t Overvåk emne'
mark_watching: 'm, w Følg emne'
+ print: 'ctrl+p Skriv ut emne'
badges:
+ earned_n_times:
+ one: "Har gjort seg fortjent til dette merket"
+ other: "Har gjort seg fortjent til dette merket %{count} ganger"
+ granted_on: "Tildelt %{date}"
+ others_count: "(%{count}) andre har dette merket"
title: Merker
+ allow_title: "tilgjengelig tittel"
+ multiple_grant: "tildelt flere ganger"
+ badge_count:
+ one: "Étt merke"
+ other: "%{count} Merker"
+ more_badges:
+ one: "+1 mer"
+ other: "+%{count} Flere"
+ granted:
+ one: "ett tildelt"
+ other: "%{count} tildelt"
+ select_badge_for_title: Velg et merke å bruke som din tittel
+ none: ""
+ badge_grouping:
+ getting_started:
+ name: Kom i gang
+ community:
+ name: Gemenskap
+ trust_level:
+ name: Tillitsnivå
+ other:
+ name: Annet
+ posting:
+ name: Publisering
+ google_search: |
+
Søk med Google
+
+
+
tagging:
+ all_tags: "Alle stikkord"
+ selector_all_tags: "alle stikkord"
+ selector_no_tags: "ingen stikkord"
+ changed: "stikkord endret:"
+ tags: "Stikkord"
+ choose_for_topic: "velg alternative stikkord for dette emnet"
+ delete_tag: "Slett stikkord"
+ delete_confirm: "Er du sikker på at du vil slette det stikkordet?"
+ rename_tag: "Gi stikkord nytt navn"
+ rename_instructions: "Velg et nytt navn for dette stikkordet:"
+ sort_by: "Sorter etter:"
+ sort_by_count: "antall"
+ sort_by_name: "navn"
+ manage_groups: "Behandle stikkordgrupper"
+ manage_groups_description: "Definer grupper for å organisere stikkord"
+ filters:
+ without_category: "%{filter} %{tag} emner"
+ with_category: "%{filter} %{tag} emner i %{category}"
+ untagged_without_category: "%{filter} emner uten stikkord"
+ untagged_with_category: "%{filter} emner uten stikkord i %{category}"
notifications:
watching:
title: "Følger"
description: "Du vil automatisk følge alle emnene med dette stikkordet. Du vil bli varslet om alle nye innlegg og emner; i tillegg vil antallet uleste og nye innlegg vises ved siden av emnet."
watching_first_post:
title: "Følger første innlegg"
+ description: "Du vil bare bli varslet om det første innlegget i hvert nye emne som gjør bruk av dette stikkordet."
tracking:
title: "Overvåkning"
description: "Du vil automatisk overvåke alle emner med dette stikkordet. Antallet uleste og nye innlegg vil vises ved siden av emnet."
regular:
title: "Aktivt medlem"
+ description: "Du vil bli varslet hvis noen nevner ditt @navn eller svarer på ditt innlegg."
muted:
title: "Ignorert"
+ description: "Du vil ikke bli varslet om noe vedrørende disse emner som bruker dette stikkordet, og de vil ikke vises i din ulest-liste."
+ groups:
+ title: "Stikkordgrupper"
+ about: "Legg stikkord til grupper for å kunne organisere dem enklere."
+ new: "Ny gruppe"
+ tags_label: "Stikkord i denne gruppen:"
+ parent_tag_label: "Foreldrestikkord:"
+ parent_tag_placeholder: "Valgfritt"
+ parent_tag_description: "Stikkord fra denne gruppen kan ikke brukes, med mindre foreldrestikkordet er til stede."
+ one_per_topic_label: "Sett grense på ett stikkord for hvert emne for denne gruppen"
+ new_name: "Ny stikkordgruppe"
+ save: "Lagre"
+ delete: "Slett"
+ confirm_delete: "Er du sikker på at du vil slette denne stikkordgruppen?"
+ topics:
+ none:
+ unread: "Du har ingen uleste emner."
+ new: "Du har ingen nye emner."
+ read: "Du har ikke lest noen emner enda."
+ posted: "Du har ikke opprettet noen emner enda."
+ latest: "Det er ingen siste emner igjen å lese."
+ hot: "Det er ingen populære emner."
+ bookmarks: "Du har ikke bokmerket noen emner enda."
+ top: "Det er ingen populære emner."
+ search: "Det er ingen søkeresultater."
+ bottom:
+ latest: "Det er ingen siste emner igjen å lese."
+ hot: "Det er ingen populære emner igjen å lese."
+ posted: "Det er ingen emner med innlegg igjen å lese."
+ read: "Det er ingen leste emner igjen å lese."
+ new: "Det er ingen nye emner igjen å lese."
+ unread: "Det er ingen uleste emner igjen å lese."
+ top: "Det er ingen flere populære emner."
+ bookmarks: "Det er ingen bokmerkede emner."
+ search: "Det er ingen flere søkeresultater"
+ invite:
+ custom_message: "Gjør din invitasjon litt mer personlig ved å skrive ett"
+ custom_message_link: "egendefinert melding"
+ custom_message_placeholder: "Skriv inn din egendefinerte melding"
+ custom_message_template_forum: "Hei, du burde ta del i dette forumet!"
+ custom_message_template_topic: "Hei, jeg tenkte du fattet interesse for dette emnet!"
+ safe_mode:
+ enabled: "Sikkert modus er påskrudd, for å gå ut av sikkert modus, lukk dette nettleservinduet"
admin_js:
type_to_filter: "skriv for å filtrere..."
admin:
@@ -1837,7 +2170,7 @@ nb_NO:
up_to_date: "Du har den seneste versjonen!"
critical_available: "En kritisk oppdatering er tilgjengelig."
updates_available: "Oppdateringer er tilgjengelig."
- please_upgrade: "Vennligst oppgrader!"
+ please_upgrade: "Oppgrader!"
no_check_performed: "En sjekk for oppdateringer har ikke blitt utført. Verifiser at sidekiq kjører."
stale_data: "Det har ikke vært sjekket for oppdateringer på en stund. Sjekk at sidekiq kjører."
version_check_pending: "Ser ut som om du oppgraderte nylig. Fantastisk!"
@@ -1878,7 +2211,7 @@ nb_NO:
end_date: "Sluttdato"
groups: "Alle grupper"
commits:
- latest_changes: "Siste endringer: Vennligst oppgrader ofte!"
+ latest_changes: "Siste endringer: Oppgrader ofte!"
by: "av"
flags:
title: "Rapporteringer"
@@ -1955,16 +2288,22 @@ nb_NO:
delete: "Slett"
delete_confirm: "Slette denne grupper?"
delete_failed: "Unable to delete group. If this is an automatic group, it cannot be destroyed."
+ delete_owner_confirm: "Frata '%{username}' eier-privilegium?"
add: "Legg til"
add_members: "Legg til medlemmer"
custom: "Egendefinert"
+ bulk_complete: "Brukeren er lagt til i gruppen."
+ bulk: "Legg flere til i gruppe"
+ bulk_paste: "Lim inn en liste med brukernavn eller e-postadresser, en per linje:"
+ bulk_select: "(velg en gruppe)"
automatic: "Automatisk"
automatic_membership_email_domains: "Brukere som registererer seg med et e-postdomene som er det samme som et i denne listen, vil automatisk bli lagt til i denne gruppen."
automatic_membership_retroactive: "Benytt samme e-postdomeneregel for å legge til eksisterende brukere"
- default_title: "Standardtittel for alle brukere i denne gruppen"
+ default_title: "Forvalgt tittel for alle brukere i denne gruppen"
primary_group: "Sett som primærgruppe automatisk"
group_owners: Eiere
add_owners: Legg til eiere
+ incoming_email: "Egendefinert innkommende e-postadresse"
incoming_email_placeholder: "oppgi e-postadresse"
api:
generate_master: "Generer Master API-nøkkel"
@@ -1983,7 +2322,7 @@ nb_NO:
web_hooks:
title: "Webhooker"
none: "Det finnes ingen webhooker for tiden."
- instruction: "Webhooker lar Discourse sende meldinger til eksterne tjenester når spesifiserte situasjoner oppstår på nettstedet. Når en webhook utløses, sendes en POST-forespørsel til URL-ene du angir."
+ instruction: "Webhooker lar Discourse sender meldinger til eksterne tjenester når spesifiserte situasjoner oppstår på nettstedet. Når en webhook utløses, sendes en POST-forespørsel til nettadressene du angir."
detailed_instruction: "En POST-forespørsel sendes til den angitte URL-en når den valgte hendelsen skjer."
new: "Ny webhook"
create: "Opprett"
@@ -1993,7 +2332,7 @@ nb_NO:
controls: "Kontroller"
go_back: "Tilbake til liste"
payload_url: "Payload URL"
- payload_url_placeholder: "https://example.com/postreceive"
+ payload_url_placeholder: "https://eksempel.no/postmottak"
warn_local_payload_url: "Det ser ut som du prøver å sende webhooken til en lokal URL. Hendelser som sendes til lokale adresser kan gi sideeffekter eller føre til uventet oppførsel. Fortsette?"
secret_invalid: "Delt hemmelighet kan ikke inneholde blanke tegn."
secret_too_short: "Delt hemmelighet må være minst 12 tegn."
@@ -2068,6 +2407,14 @@ nb_NO:
backups: "Sikkerhetskopieringer"
logs: "Logger"
none: "Ingen sikkerhetskopiering er tilgjengelig."
+ read_only:
+ enable:
+ title: "Aktiver skrivebeskyttet modus"
+ label: "Aktiver skrivebeskytting"
+ confirm: "Er du sikker på at du vil skru på skrivebeskyttelsesmodus?"
+ disable:
+ title: "Skru av skrivebeskyttet modus"
+ label: "Skru av skrivebeskytting"
logs:
none: "Ingen logger enda..."
columns:
@@ -2101,9 +2448,11 @@ nb_NO:
is_disabled: "Gjenoppretting er deaktivert i nettstedsinnstillingene."
label: "Gjenooprett"
title: "Gjenopprett sikkerhetskopien"
+ confirm: "Er du sikker på at du vil gjenopprette denne sikkerhetskopien?"
rollback:
label: "Gjenopprett"
title: "Gjenopprett databasen til en tidligere fungerende tilstand"
+ confirm: "Er du sikker på at du vil gjenopprette databasen til den tidligere fungerende tilstanden?"
export_csv:
success: "Eksportering iverksatt. Du vil bli varslet med en melding når prosessen er fullført."
failed: "Eksporteringen feilet. Venligst undersøk loggene."
@@ -2133,14 +2482,14 @@ nb_NO:
body_tag:
text: ""
title: "HTML som settes inn før
Vi er for øyeblikket ikke tilgjengelig på grunn av planlagt vedlikehold av nettstedet