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" } 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) diff --git a/README.md b/README.md index 717ad14f23e..359c8189f14 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ To learn more about the philosophy and goals of the project, [visit **discourse. -Atom   +Atom   Soylent Browse [lots more notable Discourse instances](http://www.discourse.org/faq/customers/). @@ -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. diff --git a/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 b/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 index 5393a27c8f6..8238b1d5afe 100644 --- a/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 @@ -1,9 +1,16 @@ +import computed from 'ember-addons/ember-computed-decorators'; + export default Ember.Controller.extend({ - adminRoutes: function() { - return this.get('model').map(p => { - if (p.get('enabled')) { - return p.admin_route; + @computed('model.@each.enabled_setting') + adminRoutes() { + let routes = []; + + this.get('model').forEach(p => { + if (this.siteSettings[p.get('enabled_setting')] && p.get('admin_route')) { + routes.push(p.get('admin_route')); } - }).compact(); - }.property() + }); + + return routes; + } }); 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..325d9310452 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,8 @@ export default RestModel.extend({ createProperties() { const types = this.get('web_hook_event_types'); - const categories = this.get('categoriesFilter'); + 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 +69,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/components/admin-report-counts.hbs b/app/assets/javascripts/admin/templates/components/admin-report-counts.hbs index d9286ef5800..cc6310768a0 100644 --- a/app/assets/javascripts/admin/templates/components/admin-report-counts.hbs +++ b/app/assets/javascripts/admin/templates/components/admin-report-counts.hbs @@ -4,8 +4,19 @@ {{/if}} {{report.title}} -{{report.todayCount}} -{{report.yesterdayCount}} {{fa-icon "caret-up" class="up"}} {{fa-icon "caret-down" class="down"}} -{{report.lastSevenDaysCount}} {{fa-icon "caret-up" class="up"}} {{fa-icon "caret-down" class="down"}} -{{report.lastThirtyDaysCount}} {{fa-icon "caret-up" class="up"}} {{fa-icon "caret-down" class="down"}} -{{report.total}} + +{{number report.todayCount}} + + + {{number report.yesterdayCount}} {{fa-icon "caret-up" class="up"}} {{fa-icon "caret-down" class="down"}} + + + + {{number report.lastSevenDaysCount}} {{fa-icon "caret-up" class="up"}} {{fa-icon "caret-down" class="down"}} + + + + {{number report.lastThirtyDaysCount}} {{fa-icon "caret-up" class="up"}} {{fa-icon "caret-down" class="down"}} + + +{{number report.total}} diff --git a/app/assets/javascripts/admin/templates/components/admin-report-trust-level-counts.hbs b/app/assets/javascripts/admin/templates/components/admin-report-trust-level-counts.hbs index c78e2630035..3db7af1daa2 100644 --- a/app/assets/javascripts/admin/templates/components/admin-report-trust-level-counts.hbs +++ b/app/assets/javascripts/admin/templates/components/admin-report-trust-level-counts.hbs @@ -1,6 +1,6 @@ {{report.title}} -{{#link-to 'adminUsersList.show' 'newuser'}}{{value-at-tl report.data level="0"}}{{/link-to}} -{{#link-to 'adminUsersList.show' 'basic'}}{{value-at-tl report.data level="1"}}{{/link-to}} -{{#link-to 'adminUsersList.show' 'member'}}{{value-at-tl report.data level="2"}}{{/link-to}} -{{#link-to 'adminUsersList.show' 'regular'}}{{value-at-tl report.data level="3"}}{{/link-to}} -{{#link-to 'adminUsersList.show' 'leader'}}{{value-at-tl report.data level="4"}}{{/link-to}} +{{#link-to 'adminUsersList.show' 'newuser'}}{{number (value-at-tl report.data level="0")}}{{/link-to}} +{{#link-to 'adminUsersList.show' 'basic'}}{{number (value-at-tl report.data level="1")}}{{/link-to}} +{{#link-to 'adminUsersList.show' 'member'}}{{number (value-at-tl report.data level="2")}}{{/link-to}} +{{#link-to 'adminUsersList.show' 'regular'}}{{number (value-at-tl report.data level="3")}}{{/link-to}} +{{#link-to 'adminUsersList.show' 'leader'}}{{number (value-at-tl report.data level="4")}}{{/link-to}} diff --git a/app/assets/javascripts/admin/templates/dashboard.hbs b/app/assets/javascripts/admin/templates/dashboard.hbs index ec7753ac6c9..fbb0eb46b13 100644 --- a/app/assets/javascripts/admin/templates/dashboard.hbs +++ b/app/assets/javascripts/admin/templates/dashboard.hbs @@ -228,7 +228,7 @@ - {{data.num_clicks}} + {{number data.num_clicks}} {{/each}} @@ -248,8 +248,8 @@ {{s.domain}} - {{s.num_clicks}} - {{s.num_topics}} + {{number s.num_clicks}} + {{number s.num_topics}} {{/each}} @@ -261,16 +261,16 @@ {{top_referrers.title}} ({{i18n 'admin.dashboard.reports.last_30_days'}}) - {{top_referrers.ytitles.num_clicks}} - {{top_referrers.ytitles.num_topics}} + {{number top_referrers.ytitles.num_clicks}} + {{number top_referrers.ytitles.num_topics}} {{#each top_referrers.data as |r|}} {{#link-to 'adminUser' r.user_id r.username}}{{unbound r.username}}{{/link-to}} - {{r.num_clicks}} - {{r.num_topics}} + {{number r.num_clicks}} + {{number r.num_topics}} {{/each}} diff --git a/app/assets/javascripts/admin/templates/groups-type.hbs b/app/assets/javascripts/admin/templates/groups-type.hbs index d1d2223c2b3..6c9986fcb39 100644 --- a/app/assets/javascripts/admin/templates/groups-type.hbs +++ b/app/assets/javascripts/admin/templates/groups-type.hbs @@ -6,7 +6,7 @@
  • {{#link-to "adminGroup" group.type group.name}}{{group.name}} {{#if group.userCountDisplay}} - {{group.userCountDisplay}} + {{number group.userCountDisplay}} {{/if}} {{/link-to}}
  • diff --git a/app/assets/javascripts/admin/templates/users-list-show.hbs b/app/assets/javascripts/admin/templates/users-list-show.hbs index 879161e3d48..f18ce56b4b7 100644 --- a/app/assets/javascripts/admin/templates/users-list-show.hbs +++ b/app/assets/javascripts/admin/templates/users-list-show.hbs @@ -55,8 +55,8 @@ {{unbound user.email}} {{{unbound user.last_emailed_age}}} {{{unbound user.last_seen_age}}} - {{{unbound user.topics_entered}}} - {{{unbound user.posts_read_count}}} + {{number user.topics_entered}} + {{number user.posts_read_count}} {{{unbound user.time_read}}} {{{unbound user.created_at_age}}} 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 @@
    - {{category-selector categories=model.categoriesFilter blacklist=model.categoriesFilter}} + {{category-selector categories=model.categories blacklist=model.categories}}
    {{i18n 'admin.web_hooks.categories_filter_instructions'}}
    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/helpers/application.js.es6 b/app/assets/javascripts/discourse/helpers/application.js.es6 index 05306c0e62f..455a2b9fb9d 100644 --- a/app/assets/javascripts/discourse/helpers/application.js.es6 +++ b/app/assets/javascripts/discourse/helpers/application.js.es6 @@ -11,9 +11,9 @@ registerUnbound('number', (orig, params) => { orig = parseInt(orig, 10); if (isNaN(orig)) { orig = 0; } - let title = orig; + let title = I18n.toNumber(orig, { precision: 0 }); if (params.numberKey) { - title = I18n.t(params.numberKey, { number: orig }); + title = I18n.t(params.numberKey, { number: title }); } let classNames = 'number'; 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/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/mobile/modal/login.hbs b/app/assets/javascripts/discourse/templates/mobile/modal/login.hbs index aacaa22bc42..d156ca66dde 100644 --- a/app/assets/javascripts/discourse/templates/mobile/modal/login.hbs +++ b/app/assets/javascripts/discourse/templates/mobile/modal/login.hbs @@ -1,54 +1,59 @@ -{{#d-modal-body title="login.title" class="login-modal"}} - {{login-buttons action="externalLogin"}} - {{#if canLoginLocal}} -
    -
    - - - - - - - - - - - - - -
    - - - {{text-field value=loginName type="email" placeholderKey="login.email_placeholder" id="login-account-name" autocorrect="off" autocapitalize="off"}} -
    - - - {{text-field value=loginPassword type="password" id="login-account-password" maxlength="200"}}   -
    - {{i18n 'forgot_password.action'}} -
    -
    -
    - {{/if}} - {{authMessage}} -
    {{alert}}
    -{{/d-modal-body}} +{{#login-modal screenX=lastX screenY=lastY loginName=loginName loginPassword=loginPassword action="login"}} + {{#d-modal-body title="login.title" class="login-modal"}} + {{login-buttons action="externalLogin"}} + {{#if canLoginLocal}} +
    +
    + + + + + + + + + + + + + +
    + + + {{text-field value=loginName type="email" placeholderKey="login.email_placeholder" id="login-account-name" autocorrect="off" autocapitalize="off"}} +
    + + + {{text-field value=loginPassword type="password" id="login-account-password" maxlength="200"}}   +
    + {{i18n 'forgot_password.action'}} +
    +
    -
    + {{authMessage}} +
    {{alert}}
    + {{/d-modal-body}} + + +{{/login-modal}} 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}} 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; } }); diff --git a/app/assets/javascripts/pretty-text/engines/discourse-markdown/quote.js.es6 b/app/assets/javascripts/pretty-text/engines/discourse-markdown/quote.js.es6 index 4172a2a46f2..96b798a3269 100644 --- a/app/assets/javascripts/pretty-text/engines/discourse-markdown/quote.js.es6 +++ b/app/assets/javascripts/pretty-text/engines/discourse-markdown/quote.js.es6 @@ -1,9 +1,18 @@ import { register } from 'pretty-text/engines/discourse-markdown/bbcode'; +import { registerOption } from 'pretty-text/pretty-text'; +import { performEmojiUnescape } from 'pretty-text/emoji'; + +registerOption((siteSettings, opts) => { + opts.enableEmoji = siteSettings.enable_emoji; + opts.emojiSet = siteSettings.emoji_set; +}); + export function setup(helper) { register(helper, 'quote', {noWrap: true, singlePara: true}, (contents, bbParams, options) => { const params = {'class': 'quote'}; let username = null; + const opts = helper.getOptions(); if (bbParams) { const paramsSplit = bbParams.split(/\,\s*/); @@ -52,7 +61,16 @@ export function setup(helper) { if (postNumber > 0) { href += "/" + postNumber; } // get rid of username said stuff header.pop(); - header.push(['a', {'href': href}, topicInfo.title]); + + let title = topicInfo.title; + + if (opts.enableEmoji) { + title = performEmojiUnescape(topicInfo.title, { + getURL: opts.getURL, emojiSet: opts.emojiSet + }); + } + + header.push(['a', {'href': href}, title]); } } diff --git a/app/assets/stylesheets/common/foundation/base.scss b/app/assets/stylesheets/common/foundation/base.scss index b4267e703fe..2a3c5588d02 100644 --- a/app/assets/stylesheets/common/foundation/base.scss +++ b/app/assets/stylesheets/common/foundation/base.scss @@ -85,6 +85,7 @@ fieldset { pre code { overflow: auto; + tab-size: 4; } // TODO figure out a clean place to put stuff like this diff --git a/app/controllers/admin/backups_controller.rb b/app/controllers/admin/backups_controller.rb index 3c7855668c9..feed2a709d1 100644 --- a/app/controllers/admin/backups_controller.rb +++ b/app/controllers/admin/backups_controller.rb @@ -95,7 +95,16 @@ class Admin::BackupsController < Admin::AdminController def readonly enable = params.fetch(:enable).to_s == "true" - enable ? Discourse.enable_readonly_mode(user_enabled: true) : Discourse.disable_readonly_mode(user_enabled: true) + readonly_mode_key = Discourse::USER_READONLY_MODE_KEY + + if enable + Discourse.enable_readonly_mode(readonly_mode_key) + else + 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/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 2ee6db17710..2359bc31e2a 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -46,6 +46,7 @@ class Admin::UsersController < Admin::AdminController def delete_all_posts @user = User.find_by(id: params[:user_id]) @user.delete_all_posts!(guardian) + # staff action logs will have an entry for each post render nothing: true end @@ -182,6 +183,8 @@ class Admin::UsersController < Admin::AdminController @user.trust_level_locked = new_lock == "true" @user.save + StaffActionLogger.new(current_user).log_lock_trust_level(@user) + unless @user.trust_level_locked p = Promotion.new(@user) 2.times{ p.review } @@ -210,12 +213,14 @@ class Admin::UsersController < Admin::AdminController def activate guardian.ensure_can_activate!(@user) @user.activate + StaffActionLogger.new(current_user).log_user_activate(@user, I18n.t('user.activated_by_staff')) render json: success_json end def deactivate guardian.ensure_can_deactivate!(@user) @user.deactivate + StaffActionLogger.new(current_user).log_user_deactivate(@user, I18n.t('user.deactivated_by_staff')) refresh_browser @user render nothing: true end 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/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')}", diff --git a/app/mailers/user_notifications.rb b/app/mailers/user_notifications.rb index e393eee85af..aeef876c491 100644 --- a/app/mailers/user_notifications.rb +++ b/app/mailers/user_notifications.rb @@ -3,6 +3,7 @@ require_dependency 'email/message_builder' require_dependency 'age_words' class UserNotifications < ActionMailer::Base + include UserNotificationsHelper helper :application default charset: 'UTF-8' @@ -106,20 +107,27 @@ class UserNotifications < ActionMailer::Base end @popular_topics = topics_for_digest[0,SiteSetting.digest_topics] - @other_new_for_you = topics_for_digest.size > SiteSetting.digest_topics ? topics_for_digest[SiteSetting.digest_topics..-1] : [] - - @popular_posts = if SiteSetting.digest_posts > 0 - Post.order("posts.score DESC") - .for_mailing_list(user, min_date) - .where('posts.post_type = ?', Post.types[:regular]) - .where('posts.deleted_at IS NULL AND posts.hidden = false AND posts.user_deleted = false') - .where("posts.post_number > ? AND posts.score > ?", 1, ScoreCalculator.default_score_weights[:like_score] * 5.0) - .limit(SiteSetting.digest_posts) - else - [] - end if @popular_topics.present? + @other_new_for_you = topics_for_digest.size > SiteSetting.digest_topics ? topics_for_digest[SiteSetting.digest_topics..-1] : [] + + @popular_posts = if SiteSetting.digest_posts > 0 + Post.order("posts.score DESC") + .for_mailing_list(user, min_date) + .where('posts.post_type = ?', Post.types[:regular]) + .where('posts.deleted_at IS NULL AND posts.hidden = false AND posts.user_deleted = false') + .where("posts.post_number > ? AND posts.score > ?", 1, ScoreCalculator.default_score_weights[:like_score] * 5.0) + .limit(SiteSetting.digest_posts) + else + [] + end + + @excerpts = {} + + @popular_topics.map do |t| + @excerpts[t.first_post.id] = email_excerpt(t.first_post.cooked) if t.first_post.present? + end + # Try to find 3 interesting stats for the top of the digest new_topics_count = Topic.new_since_last_seen(user, min_date).count diff --git a/app/models/badge.rb b/app/models/badge.rb index 6851b210dce..13e7916f1b1 100644 --- a/app/models/badge.rb +++ b/app/models/badge.rb @@ -1,3 +1,5 @@ +require_dependency 'slug' + class Badge < ActiveRecord::Base # NOTE: These badge ids are not in order! They are grouped logically. # When picking an id, *search* for it. @@ -119,6 +121,10 @@ class Badge < ActiveRecord::Base } end + def awarded_for_trust_level? + id <= 4 + end + def reset_grant_count! self.grant_count = UserBadge.where(badge_id: id).count save! @@ -208,6 +214,7 @@ SQL def i18n_name self.name.downcase.tr(' ', '_') end + end # == Schema Information diff --git a/app/models/global_setting.rb b/app/models/global_setting.rb index dd1c04820ef..a7600d48206 100644 --- a/app/models/global_setting.rb +++ b/app/models/global_setting.rb @@ -145,14 +145,14 @@ class GlobalSetting attr_accessor :provider end - - if Rails.env == "test" - @provider = BlankProvider.new - else - @provider = - FileProvider.from(File.expand_path('../../../config/discourse.conf', __FILE__)) || - EnvProvider.new + def self.configure! + if Rails.env == "test" + @provider = BlankProvider.new + else + @provider = + FileProvider.from(File.expand_path('../../../config/discourse.conf', __FILE__)) || + EnvProvider.new + end end - load_defaults end diff --git a/app/models/topic.rb b/app/models/topic.rb index 86674dfbb77..1e8078051fd 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -54,6 +54,7 @@ class Topic < ActiveRecord::Base validates :title, :if => Proc.new { |t| t.new_record? || t.title_changed? }, :presence => true, :topic_title_length => true, + :censored_words => true, :quality_title => { :unless => :private_message? }, :unique_among => { :unless => Proc.new { |t| (SiteSetting.allow_duplicate_topic_titles? || t.private_message?) }, :message => :has_already_been_used, 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/app/models/user_history.rb b/app/models/user_history.rb index 635014b1d08..ddc48286630 100644 --- a/app/models/user_history.rb +++ b/app/models/user_history.rb @@ -55,7 +55,11 @@ class UserHistory < ActiveRecord::Base rate_limited_like: 37, # not used anymore revoke_email: 38, deactivate_user: 39, - wizard_step: 40 + wizard_step: 40, + lock_trust_level: 41, + unlock_trust_level: 42, + activate_user: 43, + change_readonly_mode: 44 ) end @@ -91,7 +95,11 @@ class UserHistory < ActiveRecord::Base :revoke_moderation, :backup_operation, :revoke_email, - :deactivate_user] + :deactivate_user, + :lock_trust_level, + :unlock_trust_level, + :activate_user, + :change_readonly_mode] end def self.staff_action_ids diff --git a/app/services/badge_granter.rb b/app/services/badge_granter.rb index ece099e4f1f..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 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,6 +315,8 @@ class BadgeGranter # Make this variable in this scope notification = nil + next if (row.staff && badge.awarded_for_trust_level?) + I18n.with_locale(notification_locale) do notification = Notification.create!( user_id: row.user_id, diff --git a/app/services/staff_action_logger.rb b/app/services/staff_action_logger.rb index 57c213b4e2f..c872fdd0f6b 100644 --- a/app/services/staff_action_logger.rb +++ b/app/services/staff_action_logger.rb @@ -14,7 +14,6 @@ class StaffActionLogger raise Discourse::InvalidParameters.new(:deleted_user) unless deleted_user && deleted_user.is_a?(User) UserHistory.create( params(opts).merge({ action: UserHistory.actions[:delete_user], - email: deleted_user.email, ip_address: deleted_user.ip_address.to_s, details: [:id, :username, :name, :created_at, :trust_level, :last_seen_at, :last_emailed_at].map { |x| "#{x}: #{deleted_user.send(x)}" }.join("\n") })) @@ -96,6 +95,14 @@ class StaffActionLogger })) end + def log_lock_trust_level(user, opts={}) + raise Discourse::InvalidParameters.new(:user) unless user && user.is_a?(User) + UserHistory.create!( params(opts).merge({ + action: UserHistory.actions[user.trust_level_locked ? :lock_trust_level : :unlock_trust_level], + target_user_id: user.id + })) + end + def log_site_setting_change(setting_name, previous_value, new_value, opts={}) raise Discourse::InvalidParameters.new(:setting_name) unless setting_name.present? && SiteSetting.respond_to?(setting_name) UserHistory.create( params(opts).merge({ @@ -353,15 +360,31 @@ class StaffActionLogger })) end + def log_user_activate(user, reason, opts={}) + raise Discourse::InvalidParameters.new(:user) unless user + UserHistory.create(params(opts).merge({ + action: UserHistory.actions[:activate_user], + target_user_id: user.id, + details: reason + })) + end + def log_wizard_step(step, opts={}) 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/app/services/user_blocker.rb b/app/services/user_blocker.rb index 5ee5bc01892..cda62083c95 100644 --- a/app/services/user_blocker.rb +++ b/app/services/user_blocker.rb @@ -17,8 +17,11 @@ class UserBlocker unless @user.blocked? @user.blocked = true if @user.save - SystemMessage.create(@user, @opts[:message] || :blocked_by_staff) - StaffActionLogger.new(@by_user).log_block_user(@user) if @by_user + message_type = @opts[:message] || :blocked_by_staff + post = SystemMessage.create(@user, message_type) + if post && @by_user + StaffActionLogger.new(@by_user).log_block_user(@user, {context: "#{message_type}: '#{post.topic&.title rescue ''}'"}) + end end else false diff --git a/app/views/user_notifications/digest.html.erb b/app/views/user_notifications/digest.html.erb index c9261000b0c..66e5930732b 100644 --- a/app/views/user_notifications/digest.html.erb +++ b/app/views/user_notifications/digest.html.erb @@ -149,7 +149,7 @@ body, table, td, th, h1, h2, h3 {font-family: Helvetica, Arial, sans-serif !impo

    <%= t.user.username -%>

    <% end %> - <%- if show_image_with_url(t.image_url) && t.featured_link.nil? -%> + <%- if show_image_with_url(t.image_url) && t.featured_link.nil? && !(@excerpts[t.first_post&.id]||"").include?(t.image_url) -%> @@ -163,7 +163,7 @@ body, table, td, th, h1, h2, h3 {font-family: Helvetica, Arial, sans-serif !impo - <%= email_excerpt(t.first_post.cooked) %> + <%= @excerpts[t.first_post.id] %> diff --git a/app/views/user_notifications/mailing_list.html.erb b/app/views/user_notifications/mailing_list.html.erb index 749ee60867e..582f7c66b3d 100644 --- a/app/views/user_notifications/mailing_list.html.erb +++ b/app/views/user_notifications/mailing_list.html.erb @@ -56,7 +56,16 @@

    - '><%= post.user.name || post.user.username %> + + <%- if show_username_on_post(post) %> + <%= post.user.username %> + <% end %> + + <%- if show_name_on_post(post) %> + - <%= post.user.name %> + <% end %> + + - <%= I18n.l(post.created_at, format: :long) %>

    diff --git a/config/application.rb b/config/application.rb index c098564340b..49b35de4743 100644 --- a/config/application.rb +++ b/config/application.rb @@ -6,8 +6,15 @@ require_relative '../lib/discourse_event' require_relative '../lib/discourse_plugin' require_relative '../lib/discourse_plugin_registry' +require_relative '../lib/plugin_gem' + # Global config require_relative '../app/models/global_setting' +GlobalSetting.configure! +unless Rails.env.test? && ENV['LOAD_PLUGINS'] != "1" + require_relative '../lib/custom_setting_providers' +end +GlobalSetting.load_defaults require 'pry-rails' if Rails.env.development? @@ -15,8 +22,10 @@ if defined?(Bundler) Bundler.require(*Rails.groups(assets: %w(development test profile))) end + module Discourse class Application < Rails::Application + def config.database_configuration if Rails.env.production? GlobalSetting.database_config 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.en.yml b/config/locales/client.en.yml index 70d62b11e97..0620de21f37 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" @@ -2081,7 +2082,9 @@ en: one: "view" other: "views" replies: "Replies" - views_long: "this topic has been viewed {{number}} times" + views_long: + one: "this topic has been viewed 1 time" + other: "this topic has been viewed {{number}} times" activity: "Activity" likes: "Likes" likes_lowercase: @@ -2407,8 +2410,8 @@ en: backups: "backups" traffic_short: "Traffic" traffic: "Application web requests" - page_views: "API Requests" - page_views_short: "API Requests" + page_views: "Pageviews" + page_views_short: "Pageviews" show_traffic_report: "Show Detailed Traffic Report" reports: @@ -2561,7 +2564,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" @@ -2912,6 +2915,11 @@ en: deleted_tag: "deleted tag" renamed_tag: "renamed tag" revoke_email: "revoke email" + lock_trust_level: "lock trust level" + 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/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.

    Gå tilinnstillingene dine for å endre dette.

    ' + new: '

    Dine nye emner vil komme til syne her.

    Som forvalg anses emner som nye og viser ennyindikator hvis de be opprettet i løpet av de siste to dagene.

    Gå til innstillinger for å endre dette.

    ' + unread: '

    Dine uleste emner vil vises her.

    Som forvalg 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.

    Gå tilinnstillingene dine for å endre dette.

    ' 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+z shift+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 taggen." - override_default: "Ikke inkluder standard stilark" + override_default: "Ikke inkluder forvalgt stilark" enabled: "Aktivert?" preview: "forhåndsvisning" undo_preview: "avbryt forhåndsvisning" - rescue_preview: "standard stil" + rescue_preview: "forvalgt stil" explain_preview: "Se nettstedet med dette skreddersydde stilarket" explain_undo_preview: "Gå tilbake til nåværende aktivert tilpasset stilark" - explain_rescue_preview: "Se nettstedet med standard stilark" + explain_rescue_preview: "Se nettstedet med forvalgt stilark" save: "Lagre" new: "Ny" new_style: "Ny Stil" @@ -2153,7 +2502,13 @@ nb_NO: opacity: "Opacity" copy: "Kopier" email_templates: + title: "E-postmaler" subject: "Emne" + multiple_subjects: "Denne e-postmalen har flerfoldige emner." + body: "Meldingstekst" + none_selected: "Velg en e-postmal for å begynne å redigere." + revert: "Tilbakestill endringer" + revert_confirm: "Er du sikker på at du vil tilbakestille dine endringer?" css_html: title: "CSS/HTML" long_title: "CSS og HTML-tilpasninger" @@ -2167,7 +2522,7 @@ nb_NO: undo: "angre" undo_title: "Fjern endringer av denne fargen siden sist den ble lagret." revert: "gå tilbake" - revert_title: "Nullstill denne fargen til standard fargeskjema for Discourse" + revert_title: "Nullstill denne fargen til forvalg i fargepaletten for Discourse" primary: name: 'primær' description: 'Det meste av tekst, ikoner og kanter.' @@ -2201,12 +2556,16 @@ nb_NO: email: title: "E-poster" settings: "Instillinger" + templates: "Maler" preview_digest: "Forhåndsvis Oppsummering" sending_test: "Sender e-post for testing" error: "ERROR - %{server_error}" test_error: "Det oppsto et problem ved utsendelse av e-post for testing. Sjekk e-postinnstillinger nøye, sjekk at verten ikke blokkerer e-posttilkoblinger, og prøv igjen." sent: "Sendt" skipped: "Hoppet over" + bounced: "Tilbakesendt" + received: "Mottatt" + rejected: "Avvist" sent_at: "Sendt" time: "Tid" user: "Bruker" @@ -2216,19 +2575,37 @@ nb_NO: send_test: "Send e-post for testing" sent_test: "sendt!" delivery_method: "Leveringsmetode" + preview_digest_desc: "Forhåndsvis innholde i føljetong-e-postene som sendes til inaktive brukere." refresh: "Refresh" + send_digest_label: "Send dette resultatet til:" + send_digest: "Send" + sending_email: "Sender e-post…" format: "Format" html: "html" text: "tekst" last_seen_user: "Sist Sett Bruker:" + no_result: "Ingen resultater funnet for føljetong." reply_key: "Svar ID" skipped_reason: "Hopp over grunn" incoming_emails: from_address: "Fra" to_addresses: "Til" + cc_addresses: "CC" subject: "Emne" error: "Feil" + none: "Fant ingen innkommende e-poster." + modal: + title: "Innkommende e-postdetaljer" + error: "Feil" + headers: "Hoder" + subject: "Emne" + body: "Meldingstekst" + rejection_message: "Avvisningse-post" filters: + from_placeholder: "fra@eksempel.no" + to_placeholder: "til@eksempel.no" + cc_placeholder: "cc@eksempel.no" + subject_placeholder: "Emne…" error_placeholder: "Feil" logs: none: "Ingen logger funnet" @@ -2279,6 +2656,7 @@ nb_NO: change_site_setting: "endre nettstedsinnstilling" change_site_customization: "endre tilpasninger for nettstedet" delete_site_customization: "slett tilpasninger for nettstedet" + change_site_text: "endre sidens tekst" suspend_user: "bannlys bruker" unsuspend_user: "gjeninnsett bruker" grant_badge: "tildel merke" @@ -2289,8 +2667,19 @@ nb_NO: impersonate: "overta brukerkonto" anonymize_user: "anonymiser bruker" roll_up: "rull opp IP-blokker" + change_category_settings: "endre kategori-innstillinger" delete_category: "slett kategori" create_category: "opprett kategori" + block_user: "blokker bruker" + unblock_user: "fjern blokkering av bruker" + grant_admin: "innvilg admin" + revoke_admin: "tilbakekall admin" + grant_moderation: "innvilg moderering" + revoke_moderation: "tilbakekall moderering" + backup_operation: "sikkerhetskopier operasjon" + deleted_tag: "slettet stikkord" + renamed_tag: "stikkord med nytt navn" + revoke_email: "tilbakekall e-post" screened_emails: title: "Kontrollerte e-poster" description: "Når noen forsøker å lage en ny konto, vil de følgende e-postadressene bli sjekket, og registreringen vil bli blokkert, eller en annen handling vil bli utført." @@ -2306,6 +2695,7 @@ nb_NO: title: "Kontrollerte IPs" description: 'IP-adresser som blir fulgt. Benytt "Tillat" for å hvitliste IP-adresser.' delete_confirm: "Er du sikker på at du vil fjerne regelen for %{ip_address}?" + roll_up_confirm: "Er du sikker på at du vil rulle opp vanligvis undersøkte IP-adresser i delnett?" rolled_up_some_subnets: "Fullførte sammenslåingen av blokkerte IP-addresser til disse subnettene: %{subnets}." rolled_up_no_subnet: "Det var ingenting å slå sammen." actions: @@ -2354,8 +2744,11 @@ nb_NO: active: 'Aktive Brukere' new: 'Nye Brukere' pending: 'Brukere som venter på evaluering' - newuser: 'Brukere med tillitsnivå 0 (Ny Bruker)' - basic: 'Brukere med tillitsnivå 1 (Juniormedlem)' + newuser: 'Brukere på tillitsnivå 0 (Ny Bruker)' + basic: 'Brukere på tillitsnivå 1 (Juniormedlem)' + member: 'Brukere på tillitsnivå 2 (Medlem)' + regular: 'Brukere på tillitsnivå 3 (Aktivt medlem)' + leader: 'Brukere på tillitsnivå 4 (Leder)' staff: "Stab" admins: 'Admins' moderators: 'Moderatorer' @@ -2381,12 +2774,14 @@ nb_NO: suspend_reason: "Begrunnelse" suspended_by: "Bannlyst av" delete_all_posts: "Slett alle innlegg" + delete_all_posts_confirm_MF: "Du er i ferd med å slette {INNLEGG, flertall, ett {ett innlegg} andre {# innlegg}} og {INNLEGG, flertall, ett {ett emne} andre {# emner}}. Er du sikker?" suspend: "Bannlyst" unsuspend: "Gjeninnsett\"" suspended: "Bannlyst?" moderator: "Moderator?" admin: "Admin?" blocked: "Blokkert?" + staged: "Arrangert?" show_admin_profile: "Admin" edit_title: "Rediger Tittel" save_title: "Lagre Tittel" @@ -2396,7 +2791,7 @@ nb_NO: impersonate: 'Gi deg ut for å være en annen' ip_lookup: "IP Lookup" log_out: "Logg ut" - logged_out: "Brukeren ble logget ut med alle enheter" + logged_out: "Brukeren ble logget ut på alle enheter" revoke_admin: 'Tilbakedra Admin' grant_admin: 'Innvilg admin' revoke_moderation: 'Tilbakedra Moderering' @@ -2451,12 +2846,23 @@ nb_NO: deactivate_failed: "Det oppstod et problem ved deaktiveringen av den brukeren." unblock_failed: 'Det oppstod et problem med å oppheve blokkeringen av brukeren.' block_failed: 'Det oppstod et problem med blokkeringen av brukeren.' + block_confirm: 'Er du sikker på at du vil blokkere denne brukeren? Vedkommende vil ikke kunne opprette nye emner eller innlegg.' + block_accept: 'Ja, blokker denne brukeren' + bounce_score: "Antall tilbakesendinger" + reset_bounce_score: + label: "Tilbakestill" + title: "Sett antall tilbakesendinger tilbake til 0" deactivate_explanation: "En deaktivert bruker må re-validere sin e-post." suspended_explanation: "En bannlyst bruker kan ikke logge inn." block_explanation: "En blokkert bruker kan ikke poste eller starte emner." + staged_explanation: "En arrangert bruker kan bare skrive innlegg via e-post i gitte emner." + bounce_score_explanation: + none: "Ingen tilbakesendinger ble mottatt nylig fra den e-posten." + some: "Noen tilbakesendinger ble mottatt nylig fra den e-posten." + threshold_reached: "Mottok for mange tilbakesendinger fra den e-posten." trust_level_change_failed: "Det oppsto et problem ved endring av brukerens tillitsnivå." suspend_modal_title: "Bannlys bruker" - trust_level_2_users: "Brukere med tillitsnivå 2" + trust_level_2_users: "Brukere på tillitsnivå 2" trust_level_3_requirements: "Krav til tillitsnivå 3" trust_level_locked_tip: "tillitsnivå er låst, systemet vil ikke forfremme eller degradere bruker" trust_level_unlocked_tip: "tillitsnivå er ulåst, systemet kan forfremme eller degradere bruker" @@ -2464,6 +2870,9 @@ nb_NO: unlock_trust_level: "Lås opp tillitsnivå" tl3_requirements: title: "Krav til tillitsnivå 3" + table_title: + one: "Den siste dagen:" + other: "De siste %{count} dagene:" value_heading: "Verdi" requirement_heading: "Krav" visits: "Besøk" @@ -2519,12 +2928,24 @@ nb_NO: title: "Vis på offentlig profil?" enabled: "vises på profil" disabled: "vises ikke på profil" + show_on_user_card: + title: "Vis på brukerkort?" + enabled: "vist på brukerkort" + disabled: "ikke vist på brukerkort" field_types: text: 'Tekstfelt' confirm: 'Bekreftelse' dropdown: "Nedtrekk" site_text: + description: "Du kan skreddersy all tekst på forumet ditt. Start ved å søke nedenfor:" + search: "Søk etter tekst du ønsker å endre" title: 'Tekstinnhold' + edit: 'rediger' + revert: "Tilbakestill endringer" + revert_confirm: "Er du sikker på at du ønsker å tilbakestille dine endringer?" + go_back: "Tilbake til søk" + recommended: "Skreddersøm av følgende tekst for å kle dine behov anbefales:" + show_overriden: 'Bare vis overstyrte' site_settings: show_overriden: 'Bare vis overstyrte' title: 'Innstillinger' @@ -2533,7 +2954,7 @@ nb_NO: no_results: "Ingen treff funnet." clear_filter: "Tøm" add_url: "legg til URL" - add_host: "legg til host" + add_host: "legg til vert" categories: all_results: 'Alle' required: 'Påkrevd' @@ -2549,14 +2970,17 @@ nb_NO: spam: 'Spam' rate_limits: 'Frekvensbegresninger' developer: 'Utvikler' - embedding: "Embedding" + embedding: "Innebygging" legal: "Juridisk" + user_api: 'Bruker-API' uncategorized: 'Annet' backups: "Sikkerhetskopier" login: "Login" plugins: "Utvidelser" user_preferences: "Brukerinnstillinger" + tags: "Stikkord" search: "Søk" + groups: "Grupper" badges: title: Merker new_badge: Nytt merke @@ -2565,6 +2989,7 @@ nb_NO: badge: Merke display_name: Visningsnavn description: Beskrivelse + long_description: Helhetlig beskrivelse badge_type: Merketype badge_grouping: Gruppe badge_groupings: @@ -2604,6 +3029,7 @@ nb_NO: post_revision: "Når en bruker redigerer eller lager et nytt innlegg" trust_level_change: "Når bruker endrer tillitsnivå" user_change: "Når en bruker blir redigert eller registrert" + post_processed: "Etter at et innlegg er behandlet" preview: link_text: "Forhåndsvis tildelte merker" plan_text: "Forhåndsvis med plan for spørring" @@ -2612,7 +3038,11 @@ nb_NO: error_help: "Se følgende lenker for hjelp til spørringer for merker." bad_count_warning: header: "ADVARSEL!" - text: "Det er manglende grant samples. Dette skjer når badge søket returnerer bruker-IDer eller post IDer som ikke eksisterer. Dette kan føre til uventede resultater senere - vennligst dobbeltsjekk søket ditt." + text: "Det er manglende grant samples. Dette skjer når merkesøket returnerer bruker-ID-er eller innleggs-ID-er som ikke eksisterer. Dette kan føre til uventede resultater senere - dobbeltsjekk søket ditt." + no_grant_count: "Ingen merker å tildele." + grant_count: + one: "Ett merke å tildele." + other: "%{count} merker å tildele." sample: "Eksempel:" grant: with: %{username} @@ -2626,6 +3056,32 @@ nb_NO: name: "Navn" image: "Bilde" delete_confirm: "Sikker på at du vil slette: %{name}: emoji?" + embedding: + get_started: "Hvis du vil bygge inn Discourse på en annen nettside, begynn med å legge til dens vert." + confirm_delete: "Er du sikker på at du vil slette den verten?" + sample: "Bruk følgende HTML-kode på siden din for å bygge inn Discourse-emner. Erstatt ERSTATT_MEG med kanonisk nettadresse fra siden du bygger den inn i." + title: "Innbygging" + host: "Tillatte verter" + path_whitelist: "Hvitliste for søkesti" + edit: "rediger" + category: "Legg til innlegg i kategori" + add_host: "Legg til vert" + settings: "Innbyggingsinnstillinger" + feed_settings: "Informasjonskanals-innstillinger" + feed_description: "Å tilby en RSS/ATOM-informasjonskanal for din side kan forbedre Discourse sin evne til å importere ditt innhold." + crawling_settings: "Innstillinger for søkeroboter" + crawling_description: "Når Discourse oppretter emner for dine innlegg, og ingen RSS/ATOM-informasjonskanal finnes, vil den prøve å tolke innholdet ditt fra din HTML-kode. Noen ganger kan det være utfordrende å hente ut innhold, så muligheten til å oppgi CSS-regler er der for å gjøre uthentingen enklere." + embed_by_username: "Brukernavn for emneopprettelse" + embed_post_limit: "Maksimalt antall innlegg som skal bygges inn" + embed_username_key_from_feed: "Nøkkel for å hente Discourse-brukernavn fra informasjonskanal" + embed_title_scrubber: "Regulære uttrykk brukt til å finne og korrigere feil i titler" + embed_truncate: "Forkort de innebygde innleggene" + embed_whitelist_selector: "CSS-velger for elementer som tillates i innbygginger" + embed_blacklist_selector: "CSS-velger for element som fjernes fra innbygginger" + embed_classname_whitelist: "Tillatte navn for CSS-klasser" + feed_polling_enabled: "Importer innlegg via RSS/ATOM" + feed_polling_url: "Nettadresse for RSS/ATOM-informasjonskanal å gjennomgangssøke" + save: "Lagre innbyggingsinnstillinger" permalink: title: "Permalenker" url: "URL" @@ -2647,3 +3103,16 @@ nb_NO: back: "Forrige" next: "Neste" step: "%{current} av %{total}" + upload: "Last opp" + uploading: "Laster opp…" + quit: "Kanskje senere" + staff_count: + one: "Din gemenskap har ett stabsmedlem." + other: "Din gemenskap har %{count} stabsmedlemmer." + invites: + add_user: "legg til" + none_added: "Du har ikke invitert noen til staben. Er du sikker på at du vil fortsette?" + roles: + admin: "Administrator" + moderator: "Moderator" + regular: "Regelmessig bruker" diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml index 0b0c70421e7..c17803f668b 100644 --- a/config/locales/client.nl.yml +++ b/config/locales/client.nl.yml @@ -1270,7 +1270,6 @@ nl: go_bottom: "onderkant" go: "ga" jump_bottom: "spring naar laatste bericht" - jump_prompt: "spring naar bericht" jump_prompt_long: "Naar welk bericht wil je springen?" jump_bottom_with_number: "spring naar bericht %{post_number}" total: totaal aantal berichten @@ -1502,7 +1501,6 @@ nl: file_too_large: "Sorry, dit bestand is te groot (maximumgrootte is {{max_size_kb}}kb). Misschien kun je dit bestand uploaden naar een cloudopslagdienst en de link er naar delen?" too_many_uploads: "Sorry, je kan maar één afbeelding tegelijk uploaden." too_many_dragged_and_dropped_files: "Sorry, je kan maar 10 bestanden tegelijk uploaden." - upload_not_authorized: "Sorry, je mag dat type bestand niet uploaden (toegestane extensies: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Sorry, nieuwe gebruikers mogen nog geen afbeeldingen uploaden." attachment_upload_not_allowed_for_new_user: "Sorry, nieuwe gebruikers mogen nog geen bestanden uploaden." attachment_download_requires_login: "Sorry, maar je moet ingelogd zijn om bijlages te downloaden." diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml index f2e4798334a..666600d81cf 100644 --- a/config/locales/client.pl_PL.yml +++ b/config/locales/client.pl_PL.yml @@ -1562,7 +1562,6 @@ pl_PL: upload: "Przepraszamy, wystąpił błąd podczas wczytywania Twojego pliku. Proszę, spróbuj ponownie." too_many_uploads: "Przepraszamy, ale możesz wgrać tylko jeden plik naraz." too_many_dragged_and_dropped_files: "Przepraszamy, ale możesz wgrać tylko 10 plików naraz." - upload_not_authorized: "Przepraszamy, ale plik który chcesz wgrać jest niedozwolony (dozwolone rozszerzenia: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Przepraszamy, ale nowi użytkownicy nie mogą wgrywać obrazów." attachment_upload_not_allowed_for_new_user: "Przepraszamy, ale nowi użytkownicy nie mogą wgrywać załączników." attachment_download_requires_login: "Przepraszamy, musisz się zalogować, aby pobierać załączniki." diff --git a/config/locales/client.pt.yml b/config/locales/client.pt.yml index e10b8e0daf4..cc3aae884e9 100644 --- a/config/locales/client.pt.yml +++ b/config/locales/client.pt.yml @@ -1297,7 +1297,6 @@ pt: go_bottom: "fim" go: "ir" jump_bottom: "ir para a última publicação" - jump_prompt: "ir para publicação" jump_prompt_long: "Para que publicação gostaria de ir?" jump_bottom_with_number: "ir para a publicação %{post_number}" total: total de publicações @@ -1529,7 +1528,6 @@ pt: file_too_large: "Lamentamos mas esse ficheiro é demasiado grande (o tamanho máximo é de {{max_size_kb}}kb). Porque não carregar o seu ficheiro grande para um serviço de partilha na nuvem e depois partilhar o link?" too_many_uploads: "Pedimos desculpa, só pode carregar um ficheiro de cada vez." too_many_dragged_and_dropped_files: "Lamentamos mas só pode carregar 10 ficheiros de cada vez." - upload_not_authorized: "Pedimos desculpa, o tipo de ficheiro que está a carregar não está autorizado (extensões autorizadas: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Pedimos desculpa, os novos utilizadores não podem carregar imagens." attachment_upload_not_allowed_for_new_user: "Pedimos desculpa, os novos utilizadores não podem carregar anexos." attachment_download_requires_login: "Pedimos desculpa, os novos utilizadores não podem carregar anexos." diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml index 8c7bd25cb3f..684cea78e5b 100644 --- a/config/locales/client.pt_BR.yml +++ b/config/locales/client.pt_BR.yml @@ -1273,7 +1273,6 @@ pt_BR: go_bottom: "último" go: "ir" jump_bottom: "ir para a última mensagem" - jump_prompt: "ir para a mensagem" jump_prompt_long: "Gostaria de ir para qual mensagem?" jump_bottom_with_number: "ir para a mensagem %{post_number}" total: total de mensagens @@ -1505,7 +1504,6 @@ pt_BR: file_too_large: "Desculpe, o arquivo que você está tentando enviar é muito grande (o tamanho máximo permitido é {{max_size_kb}}kb). Que tal enviar o seu arquivo grande para um serviço de hospedagem na nuvem e depois compartilhar o link?" too_many_uploads: "Desculpe, você pode enviar apenas um arquivos por vez." too_many_dragged_and_dropped_files: "Desculpe, você só pode subir até 10 arquivos de cada vez." - upload_not_authorized: "Desculpe, o tipo de arquivo que você está tentando enviar não está autorizado (extensões autorizadas: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Desculpe, novos usuário não podem enviar imagens." attachment_upload_not_allowed_for_new_user: "Desculpe, usuários novos não podem enviar anexos." attachment_download_requires_login: "Desculpe, você precisa estar logado para baixar arquivos anexos." diff --git a/config/locales/client.ro.yml b/config/locales/client.ro.yml index 4d6cf5a0470..5dc82097e4f 100644 --- a/config/locales/client.ro.yml +++ b/config/locales/client.ro.yml @@ -1382,7 +1382,6 @@ ro: go_bottom: "sfârșit" go: "mergi" jump_bottom: "sari la ultimul mesaj" - jump_prompt: "sari la postarea" jump_prompt_long: "La ce postare dorești să sari?" jump_bottom_with_number: "sari la mesajul %{post_number}" total: toate postările @@ -1627,7 +1626,6 @@ ro: file_too_large: "Ne pare rău, fișierul este prea mare (mărimea maximă este {{max_size_kb}}kb). De ce nu încarci acest fișier mare pe un serviciu de distribuție prin cloud și apoi să îi partajezi link-ul?" too_many_uploads: "Ne pare rău, poți încărca doar câte un fișier." too_many_dragged_and_dropped_files: "Ne pare rău, poți încărca doar 10 fișiere simultan." - upload_not_authorized: "Ne pare rău, fișierul pe care-l încarci nu este permis (extensii permise: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Ne pare rău, un utilizator nou nu poate încărca imagini." attachment_upload_not_allowed_for_new_user: "Ne pare rău, un utilizator nou nu poate încărca atașamente." attachment_download_requires_login: "Ne pare rău, dar trebuie să fii autentificat pentru a descărca ataşamente." diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml index c11d606bde4..43bc1d0fe3c 100644 --- a/config/locales/client.ru.yml +++ b/config/locales/client.ru.yml @@ -285,7 +285,7 @@ ru: few: "{{count}} новые темы." many: "{{count}} новых тем." other: "{{count}} новых тем." - click_to_show: "Показать." + click_to_show: "Нажмите чтобы показать." preview: "предпросмотр" cancel: "отмена" save: "Сохранить" @@ -372,16 +372,65 @@ ru: few: "%{count} пользователя" many: "%{count} пользователей" other: "%{count} пользователей" + group_histories: + actions: + change_group_setting: "Настроить группу" + add_user_to_group: "Добавить пользователя" + remove_user_from_group: "Удалить пользователя" + make_user_group_owner: "Сделать владельцем" + remove_user_as_group_owner: "Лишить прав владельца" groups: + logs: + title: "Логи" + when: "Когда" + action: "Действие" + acting_user: "Действующий пользователь" + target_user: "Целевой пользователь" + subject: "Тема" + details: "Подробности" + from: "От" + to: "Кому" + edit: + title: 'Редактировать Группу' + full_name: 'Полное Имя' + add_members: "Добавить Участников" + delete_member_confirm: "Удалить '%{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: one: "группа" few: "группы" many: "групп" other: "групп" + activity: "Деятельность" members: "Участники" topics: "Темы" posts: "Сообщения" @@ -413,6 +462,15 @@ ru: muted: title: "Выключено" description: "Не уведомлять о новых темах в этой группе." + flair_url: "Изображение Аватара" + flair_url_placeholder: "(Необязательно) Ссылка на изображение или класс шрифта Font Awesome" + flair_bg_color: "Фоновый Цвет Аватара" + flair_bg_color_placeholder: "(Необязательно) Hex-код цвета" + flair_color: "Цвет Аватара" + flair_color_placeholder: "(Необязательно) Hex-код цвета" + flair_preview_icon: "Иконка Предпросмотра" + flair_preview_image: "Изображение Предпросмотра" + flair_note: "Внимание: Флаер будет показываться только основной группе пользователей." user_action_groups: '1': "Выразил симпатий" '2': "Получил симпатий" @@ -478,6 +536,11 @@ ru: profile: "Профиль" mute: "Отключить" edit: "Настройки" + download_archive: + button_text: "Скачать мои сообщения" + confirm: "Вы уверены, что хотите скачать свои сообщения?" + success: "Скачивание началось, вы будете уведомлены, когда процесс завершится." + rate_limit_error: "Сообщения могут быть скачаны лишь раз в день, попробуйте завтра." new_private_message: "Новое сообщение" private_message: "Личное сообщение" private_messages: "Личные сообщения" @@ -501,6 +564,7 @@ ru: each_browser_note: "Примечание: эта настройка устанавливается в каждом браузере индивидуально." dismiss_notifications: "Отложить все" dismiss_notifications_tooltip: "Пометить все непрочитанные уведомления прочитанными" + first_notification: "Ваше первое уведомление! Выберите его, чтобы начать." disable_jump_reply: "Не переходить к вашему новому сообщению после ответа" dynamic_favicon: "Показывать количество новых / обновленных тем на иконке сообщений" external_links_in_new_tab: "Открывать все внешние ссылки в новой вкладке" @@ -620,6 +684,7 @@ ru: ok: "Мы вышлем вам письмо для подтверждения" invalid: "Введите действующий адрес электронной почты" authenticated: "Ваш адрес электронной почты подтвержден {{provider}}" + frequency_immediately: "Получать уведомления о новых непрочитанных сообщениях незамедлительно." frequency: one: "Мы отправим вам письмо только в том случае, если вы более {{count}} минуты находитесь оффлайн." few: "Мы отправим вам письмо только в том случае, если вы не были онлайн последние {{count}} минуты." @@ -739,7 +804,10 @@ ru: account_age_days: "Дней с момента регистрации" create: "Отправить приглашение" generate_link: "Скопировать ссылку для приглашений" + link_generated: "Пригласительная ссылка успешно создана!" + valid_for: "Пригласительная ссылка действительна только для этого адреса электропочты: %{email}" bulk_invite: + none: "Вы еще никого не приглашали сюда. Вы можете отправить индивидуальные приглашения или пригласить группу людей сразу загрузив CSV файл." text: "Пригласить всех из файла" success: "Файл успешно загружен, вы получите сообщение, когда процесс будет завершен." password: @@ -853,6 +921,8 @@ ru: too_few_topics_notice: "Давайте приступим к обсуждению! Сейчас %{currentTopics} / %{requiredTopics} тем. Новым пользователям будет интереснее тут, если появится больше тем для обсуждений." too_few_posts_notice: "Давайте приступим к обсуждению! Сейчас %{currentPosts} / %{requiredPosts} сообщений. Новым пользователям будет интереснее тут, если появится больше сообщений для обсуждения." logs_error_rate_notice: + reached: "%{relativeAge}%{rate} достигнут установленный для сайта предел %{siteSettingRate}." + exceeded: "%{relativeAge}%{rate} превышен установленный для сайта предел %{siteSettingRate}." rate: one: "1 ошибка/%{duration}" few: "%{count} ошибок/%{duration}" @@ -908,6 +978,7 @@ ru: trust_level: 'Уровень доверия' search_hint: 'Псевдоним, e-mail или IP адрес' create_account: + disclaimer: "Регистрируясь, Вы соглашаетесь с политикой конфиденциальности и условиями предоставления услуг." title: "Зарегистрироваться" failed: "Произошла ошибка. Возможно, этот Email уже используется. Попробуйте восстановить пароль" forgot_password: @@ -1000,6 +1071,9 @@ ru: few: "Упоминая группу {{group}}, вы тем самым отправите уведомление {{count}} пользователям – вы уверены?" many: "Упоминая группу {{group}}, вы тем самым отправите уведомление {{count}} пользователям – вы уверены?" other: "Упоминая группу {{group}}, вы тем самым отправите уведомление {{count}} пользователям – вы уверены?" + cannot_see_mention: + category: "Вы упомянули {{username}}, но они не будут уведомлены, потому что у них нет доступа к этому разделу. Вам нужно добавить их в группу, имеющую доступ к этому разделу." + private: "Вы упомянули {{username}}, но они не будут уведомлены, потому что они не могут видеть это личное сообщение. Вам нужно пригласить их в это ЛС." duplicate_link: "Эту же самую ссылку на {{domain}} уже писал @{{username}} в своем ответе {{ago}} – вы уверены, что хотите повторить ссылку снова?" error: title_missing: "Требуется название темы" @@ -1019,8 +1093,10 @@ ru: title: "Или нажмите Ctrl+Enter" users_placeholder: "Добавить пользователя" title_placeholder: "Название: суть темы коротким предложением" + title_or_link_placeholder: "Введите название или вставьте здесь ссылку" edit_reason_placeholder: "Причина редактирования..." show_edit_reason: "(добавить причину редактирования)" + topic_featured_link_placeholder: "Введите ссылку, отображаемую с названием." reply_placeholder: "Поддерживаемые форматы: Markdown, BBCode и HTML. Чтобы вставить картинку, перетащите ее сюда или вставьте с помощью Ctrl+V, Command-V, или нажмите правой кнопкой мыши и выберите меню \"вставить\"." view_new_post: "Посмотреть созданное вами сообщение." saving: "Сохранение..." @@ -1080,10 +1156,13 @@ ru: more: "посмотреть более ранние уведомления" total_flagged: "всего сообщений с жалобами" mentioned: "

    {{username}} {{description}}

    " + group_mentioned: "

    {{username}} {{description}}

    " quoted: "

    {{username}} {{description}}

    " replied: "

    {{username}} {{description}}

    " + posted: "

    {{username}} {{description}}

    " edited: "

    {{username}} {{description}}

    " liked: "

    {{username}} {{description}}

    " + liked_2: "

    {{username}}, {{username2}} {{description}}

    " liked_many: one: "

    {{username}}, {{username2}} и ещё {{count}} {{description}}

    " few: "

    {{username}}, {{username2}} и ещё {{count}} {{description}}

    " @@ -1094,7 +1173,14 @@ ru: invited_to_topic: "

    {{username}} {{description}}

    " invitee_accepted: "

    {{username}} принял(а) ваше приглашение

    " moved_post: "

    {{username}} переместил(а) {{description}}

    " + linked: "

    {{username}} {{description}}

    " granted_badge: "

    Вы награждены: {{description}}

    " + watching_first_post: "

    Новая Тема {{description}}

    " + group_message_summary: + one: "

    {{count}} входящее сообщение в Вашей группе {{group_name}}

    " + few: "

    {{count}} входящих сообщения в Вашей группе {{group_name}}

    " + many: "

    {{count}} входящих сообщений в Вашей группе {{group_name}}

    " + other: "

    {{count}} входящих сообщений в Вашей группе {{group_name}}

    " alt: mentioned: "Упомянуто" quoted: "Процитировано пользователем" @@ -1109,6 +1195,7 @@ ru: moved_post: "Ваша тема перенесена участником " linked: "Ссылка на ваше сообщение" granted_badge: "Награда получена от" + group_message_summary: "Входящие сообщения группы" popup: mentioned: '{{username}} упомянул вас в "{{topic}}" - {{site_title}}' group_mentioned: '{{username}} упомянул вас в "{{topic}}" - {{site_title}}' @@ -1254,6 +1341,7 @@ ru: search: "Больше ничего не найдено." topic: unsubscribe: + stop_notifications: "Вы будете получать меньше уведомлений для {{title}}" change_notification_state: "Ваше текущее состояние уведомлений" filter_to: one: "1 сообщение в теме" @@ -1331,6 +1419,11 @@ ru: auto_close_title: 'Настройки закрытия темы' auto_close_save: "Сохранить" auto_close_remove: "Не закрывать тему автоматически" + auto_close_immediate: + one: "Последнее сообщение в этой теме отправлено 1 час назад, поэтому данная тема будет закрыта незамедлительно." + few: "Последнее сообщение в этой теме отправлено %{count} часа назад, поэтому данная тема будет закрыта незамедлительно." + many: "Последнее сообщение в этой теме отправлено %{count} часов назад, поэтому данная тема будет закрыта незамедлительно." + other: "Последнее сообщение в этой теме отправлено %{count} часов назад, поэтому данная тема будет закрыта незамедлительно." timeline: back: "Вернуться" back_description: "Перейти к последнему непрочитанному сообщению" @@ -1341,7 +1434,8 @@ ru: go_bottom: "перейти вниз" go: "=>" jump_bottom: "перейти к последнему сообщению" - jump_prompt: "перейти к сообщению" + jump_prompt: "перейти к..." + jump_prompt_of: "из %{count} сообщений" jump_prompt_long: "К какому сообщению вы хотите перейти?" jump_bottom_with_number: "перейти к сообщению %{post_number}" total: всего сообщений @@ -1349,6 +1443,7 @@ ru: notifications: title: изменить частоту уведомлений об этой теме reasons: + mailing_list_mode: "Вы включили режим почтовой рассылки, поэтому Вы будете получать уведомления об ответах в этой теме через e-mail." '3_10': 'Вы будете получать уведомления, т.к. наблюдаете за тэгом этой темы.' '3_6': 'Вы будете получать уведомления, т.к. наблюдаете за этим разделом.' '3_5': 'Вы будете получать уведомления, т.к. наблюдение темы началось автоматически.' @@ -1464,6 +1559,7 @@ ru: email_or_username_placeholder: "e-mail или псевдоним" action: "Пригласить" success: "Мы пригласили этого пользователя принять участие в беседе." + success_group: "Мы пригласили эту группу принять участие в беседе." error: "К сожалению, в процессе приглашения пользователя произошла ошибка." group_name: "название группы" controls: "Управление темой" @@ -1594,6 +1690,7 @@ ru: create: "К сожалению, не удалось создать сообщение из-за ошибки. Попробуйте еще раз." edit: "К сожалению, не удалось изменить сообщение. Попробуйте еще раз." upload: "К сожалению, не удалось загрузить файл. Попробуйте еще раз." + file_too_large: "К сожалению, этот файл слишком большой (максимально допустимый размер {{max_size_kb}} КБ). Почему бы не загрузить Ваш большой файл в службу облачного обмена, а затем поделиться ссылкой?" too_many_uploads: "К сожалению, за один раз можно загрузить только одно изображение." too_many_dragged_and_dropped_files: "К сожалению, за один раз можно загрузить только 10 файлов." upload_not_authorized: "К сожалению, вы не можете загрузить файл данного типа (список разрешенных типов файлов: {{authorized_extensions}})." @@ -1605,11 +1702,13 @@ ru: no_value: "Нет, оставить" yes_value: "Да, отказаться" via_email: "это сообщение пришло с почты" + via_auto_generated_email: "это сообщение пришло с автосгенерированого e-mail" whisper: "Это внутреннее сообщение, т.е. оно видно только модераторам" wiki: about: "это вики-сообщение" archetypes: save: 'Параметры сохранения' + few_likes_left: "Спасибо, что делитесь любовью. На сегодня у Вас осталось несколько лайков." controls: reply: "начать составление ответа на сообщение" like: "мне нравится" @@ -1798,6 +1897,7 @@ ru: tags_allowed_tag_groups: "Группы тегов, которые могут быть использованы только в этом разделе:" tags_placeholder: "(Необязательно) список доступных тегов" tag_groups_placeholder: "(Необязательно) список доступных групп тегов" + topic_featured_link_allowed: "Разрешить популярные ссылки в этой категории" delete: 'Удалить раздел' create: 'Создать Раздел' create_long: 'Создать новый раздел' @@ -1832,6 +1932,7 @@ ru: email_in_disabled: "Создание новых тем через электронную почту отключено в настройках сайта. Чтобы разрешить создание новых тем через электронную почту," email_in_disabled_click: 'активируйте настройку "email in".' suppress_from_homepage: "Не отображать этот раздел на главной странице." + all_topics_wiki: "Создавать новые темы в вики-формате по умолчанию." sort_order: "Порядок сортировки:" allow_badges_label: "Разрешить вручение наград в этом разделе" edit_permissions: "Изменить права доступа" @@ -1877,6 +1978,7 @@ ru: notify_action: 'Сообщение' official_warning: 'Официальное предупреждение' delete_spammer: "Удалить спамера" + delete_confirm_MF: "Вы собираетесь удалить {POSTS, plural, one {1 сообщение} other {# сообщений}} и {TOPICS, plural, one {1 тему} other {# темы}} этого пользователя, а так же удалить его учетную запись, добавить его IP адрес {ip_address} и его почтовый адрес {email} в черный список. Вы действительно уверены, что ваши помыслы чисты и действия не продиктованы гневом?" yes_delete_spammer: "Да, удалить спамера" ip_address_missing: "(не доступно)" hidden_email_address: "(скрыто)" @@ -1922,6 +2024,11 @@ ru: other: "%{count} кликов" post_links: about: "gjrfpf" + title: + one: "ещё 1" + few: "ещё %{count}" + many: "ещё %{count}" + other: "ещё %{count}" topic_statuses: warning: help: "Это официальное предупреждение." @@ -2126,9 +2233,16 @@ ru: mark_watching: 'm, w Наблюдать за темой' print: 'ctrl+p Печатать тему' badges: + earned_n_times: + one: "Заработал эту награду 1 раз" + few: "Заработали эту награду %{count} раз" + many: "Заработали эту награду %{count} раз" + other: "Заработали эту награду %{count} раз" granted_on: "Выдана %{date}" others_count: "Другие с этой наградой (%{count})" title: Награды + allow_title: "доступный заголовок" + multiple_grant: "награждён множество раз" badge_count: one: "1 награда" few: "%{count} наград" @@ -2139,6 +2253,12 @@ ru: few: "+ еще %{count}" many: "+ еще %{count}" other: "+ еще %{count}" + granted: + one: "выдано 1" + few: "выдано %{count}" + many: "выдано %{count}" + other: "выдано %{count}" + select_badge_for_title: Использовать награду в качестве Вашего титула none: "<отсутствует>" badge_grouping: getting_started: @@ -2149,6 +2269,8 @@ ru: name: Уровень доверия other: name: Прочее + posting: + name: Публикации google_search: |

    Искать с помощью Google

    @@ -2235,6 +2357,8 @@ ru: custom_message_placeholder: "Напишите сюда ваше личное сообщение" custom_message_template_forum: "Привет. Подумал, что тебе будет интересно зарегистрироваться на этом форуме!" custom_message_template_topic: "Привет! Подумал, что тебя может заинтересовать эта тема!" + safe_mode: + enabled: "Включен безопасный режим, чтобы выйти из безопасного режима, закройте текущее окно браузера" admin_js: type_to_filter: "Введите текст для фильтрации..." admin: @@ -2417,8 +2541,15 @@ ru: description: "Описание" go_back: "Вернуться к списку" payload_url_placeholder: "https://example.com/postreceive" + secret_invalid: "Ключ не должен содержать пустых символов." + secret_too_short: "Ключ должен быть не менее 12 символов." secret_placeholder: "Необязательная строка, используется для генерации подписи" event_type_missing: "Вам необходимо настроить по крайней мере один тип событий." + secret: "Ключ" + wildcard_event: "Присылать мне всё." + individual_event: "Выбрать отдельные события." + active: "Активный" + active_notice: "Мы будем отправлять подробности события, когда оно будет происходить." delete_confirm: "Удалить Webhook?" topic_event: name: "Событие темы" @@ -2428,6 +2559,7 @@ ru: details: "Происходит, когда сообщение создается, редактируется, удаляется или восстанавливается." user_event: name: "Событие пользователя" + details: "Когда пользователь создаётся, утверждается или обновляется." delivery_status: title: "Статус передачи" inactive: "Неактивна" @@ -2436,6 +2568,16 @@ ru: events: none: "Нет связанных событий." redeliver: "Возврат" + incoming: + one: "Есть новое событие." + few: "{{count}} новых события." + many: "{{count}} новых событий." + other: "{{count}} новых событий." + completed_in: + one: "Завершится через 1 секунду." + few: "Завершится через {{count}} секунд." + many: "Завершится через {{count}} секунд." + other: "Завершится через {{count}} секунд." request: "Запрос" response: "Ответ" headers: "Заголовки" @@ -2562,9 +2704,11 @@ ru: email_templates: title: "Шаблоны писем" subject: "Тема" + multiple_subjects: "Этот шаблон электронной почты имеет множество тем." body: "Текст сообщения" none_selected: "Выберите шаблон письма, чтобы начать редактирование." revert: "Отменить изменения" + revert_confirm: "Вы уверены, что хотите отменить Ваши изменения?" css_html: title: "CSS/HTML" long_title: "Настройка CSS и HTML" @@ -2633,12 +2777,14 @@ ru: delivery_method: "Метод отправки" preview_digest_desc: "Предпросмотр сводки новостей на отправку неактивным пользователям." refresh: "Обновить" + send_digest_label: "Отправить этот результат на:" send_digest: "Отправить" sending_email: "Отправка письма..." format: "Формат" html: "html" text: "текст" last_seen_user: "Последний раз был:" + no_result: "Ничего не найдено для сводки новостей." reply_key: "Ключ ответа" skipped_reason: "Причина пропуска" incoming_emails: @@ -2732,6 +2878,8 @@ ru: revoke_moderation: "отозваны права модератора" backup_operation: "операции резервного копирования" deleted_tag: "удаленный тег" + renamed_tag: "переименованный тэг" + revoke_email: "отозвать e-mail" screened_emails: title: "Почтовые адреса" description: "Когда кто-то создает новую учетную запись, проверяется данный почтовый адрес и регистрация блокируется или производятся другие дополнительные действия." @@ -2834,6 +2982,7 @@ ru: suspend_reason: "Причина" suspended_by: "Заморожен" delete_all_posts: "Удалить все сообщения" + delete_all_posts_confirm_MF: "Вы собираетесь удалить {POSTS, plural, one {1 сообщение} other {# сообщений}} и {TOPICS, plural, one {1 тему} other {# тем}}. Вы уверены?" suspend: "Заморозить" unsuspend: "Разморозить" suspended: "Заморожен?" @@ -2927,6 +3076,11 @@ ru: unlock_trust_level: "Разморозить уровень доверия" tl3_requirements: title: "Требования для 3 уровня доверия" + table_title: + one: "За последний день:" + few: "За последние %{count} дней:" + many: "За последние %{count} дней:" + other: "За последние %{count} дней:" value_heading: "Значение" requirement_heading: "Требование" visits: "Посещений" @@ -3026,6 +3180,7 @@ ru: developer: 'Программистам' embedding: "Встраивание" legal: "Юридическое" + user_api: 'Пользовательский API' uncategorized: 'Вне разделов' backups: "Резервные копии" login: "Учетные записи" @@ -3033,6 +3188,7 @@ ru: user_preferences: "Пользовательские настройки" tags: "Тэги" search: "Поиск" + groups: "Группы" badges: title: Награды new_badge: Новая награда @@ -3159,8 +3315,15 @@ ru: upload: "Загрузить" uploading: "Загрузка..." quit: "Может быть позже" + staff_count: + one: "В Вашем сообществе 1 сотрудник." + few: "В Вашем сообществе %{count} сотрудника." + many: "В Вашем сообществе %{count} сотрудников." + other: "В Вашем сообществе %{count} сотрудников." invites: add_user: "добавить" + none_added: "Вы ещё не пригласили сотрудников. Вы уверены, что хотите продолжить?" roles: admin: "Администратор" moderator: "Модератор" + regular: "Постоянный Пользователь" diff --git a/config/locales/client.sk.yml b/config/locales/client.sk.yml index 689dea6cf44..e11000f12a6 100644 --- a/config/locales/client.sk.yml +++ b/config/locales/client.sk.yml @@ -1221,7 +1221,6 @@ sk: go_bottom: "na spodok" go: "Choď" jump_bottom: "choď na posledný príspevok" - jump_prompt: "choď na príspevok" jump_bottom_with_number: "choď na príspevok číslo %{post_number}" total: Všetkých príspevkov current: tento príspevok @@ -1456,7 +1455,6 @@ sk: file_too_large: "Ľutujeme, daný súbor je príliš veľký (maximálna veľkosť je {{max_size_kb}}kB). Čo takto nahrať ten súbor na zdielané cloudové úložisko a nazdielať odkaz?" too_many_uploads: "Ľutujeme, ale naraz je možné nahrať iba jeden súbor." too_many_dragged_and_dropped_files: "Ľutujeme, ale naraz je možné nahrať iba 10 súborov." - upload_not_authorized: "Ľutujeme, súbor, ktorý sa pokúšate nahrať nemá povolenú príponu (povolené prípony sú: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Ľutujeme, noví použivatelia nemôžu nahrávať obrázky." attachment_upload_not_allowed_for_new_user: "Ľutujeme, noví používatelia nemôžu nahrávať prílohy." attachment_download_requires_login: "Ľutujeme, pre stiahnutie príloh musíte byť prihlásený." diff --git a/config/locales/client.sq.yml b/config/locales/client.sq.yml index f34427fbd32..2f9c8152117 100644 --- a/config/locales/client.sq.yml +++ b/config/locales/client.sq.yml @@ -451,7 +451,7 @@ sq: moderator_tooltip: "Ky anëtar është moderator" admin_tooltip: "Ky anëtar është administrator" blocked_tooltip: "Ky anëtar është i bllokuar" - suspended_notice: "Ky anëtarë është përjashtuar deri më {{date}}." + suspended_notice: "Ky anëtar është përjashtuar deri më {{date}}." suspended_reason: "Arsyeja:" github_profile: "Github" email_activity_summary: "Përmbledhja e aktivitetit" @@ -1200,7 +1200,6 @@ sq: go_bottom: "poshtë" go: "shko" jump_bottom: "hidhu tek përgjigja e fundit" - jump_prompt: "hidhu tek tema" jump_prompt_long: "Tek cila temë doni të shkoni?" jump_bottom_with_number: "shko tek përgjigja %{post_number}" total: totali i postimeve @@ -1415,7 +1414,6 @@ sq: file_too_large: "Na vjen keq, skedari është shumë i madh (maksimumi i lejuar është {{max_size_kb}}kb). Mund t'a vendosni këtë skedar të madh në një faqe tjetër dhe të vendosni këtu vetëm lidhjen." too_many_uploads: "Na vjen keq, por duhet t'i ngarkoni skedarët një nga një." too_many_dragged_and_dropped_files: "Na vjen keq, po ju mund të ngarkoni vetëm 10 skedarë njëkohësisht. " - upload_not_authorized: "Na vjen keq, skedari që po ngarkoni nuk është i autorizuar (tipet e skedarëve të lejuar: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Na vjen keq, anëtarët e rinj nuk mund të ngarkojnë skedarë. " attachment_upload_not_allowed_for_new_user: "Na vjen keq, anëtarët e rinj nuk mund të ngarkojnë skedarë. " attachment_download_requires_login: "Na vjen keq, duhet të identifikoheni për të shkarkuar një dokument. " diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml index 5e1d4097b75..d822038cdbe 100644 --- a/config/locales/client.sv.yml +++ b/config/locales/client.sv.yml @@ -1263,7 +1263,6 @@ sv: go_bottom: "botten" go: "gå" jump_bottom: "hoppa till sista inlägget" - jump_prompt: "hoppa till inlägg" jump_prompt_long: "Vilket inlägg vill du hoppa till?" jump_bottom_with_number: "hoppa till inlägg %{post_number}" total: antal inlägg @@ -1495,7 +1494,6 @@ sv: file_too_large: "Tyvärr, filen är för stor (maximal filstorlek är {{max_size_kb}}kb). Varför inte ladda upp din stora fil till en moln-delningstjänst och sen dela länken?" too_many_uploads: "Tyvärr, du kan bara ladda upp en bild i taget." too_many_dragged_and_dropped_files: "Tyvärr, du kan bara ladda upp 10 filer åt gången." - upload_not_authorized: "Tyvärr, filen du försökte ladda upp är inte tillåten (tillåtna filtyper: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Tyvärr, nya användare kan inte ladda upp bilder." attachment_upload_not_allowed_for_new_user: "Tyvärr, nya användare kan inte bifoga filer." attachment_download_requires_login: "Tyvärr, du måste vara inloggad för att kunna ladda ned bifogade filer." diff --git a/config/locales/client.te.yml b/config/locales/client.te.yml index f62c3de6e66..6256baa99c5 100644 --- a/config/locales/client.te.yml +++ b/config/locales/client.te.yml @@ -852,7 +852,6 @@ te: 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.tr_TR.yml b/config/locales/client.tr_TR.yml index ce3ae0b5729..210cfa8e114 100644 --- a/config/locales/client.tr_TR.yml +++ b/config/locales/client.tr_TR.yml @@ -296,6 +296,11 @@ tr_TR: total_rows: other: "%{count} kullanıcı" groups: + logs: + when: "Ne zaman" + action: "Eylem" + subject: "Konu" + details: "Ayrıntılar" add: "Ekle" selector_placeholder: "Üye ekle" owner: "sahip" @@ -394,8 +399,8 @@ tr_TR: mute: "Sustur" edit: "Tercihleri Düzenle" download_archive: - button_text: "İletilerimi indir" - confirm: "İletilerinizi indirmek istediğinize emin'misiniz?" + button_text: "Gönderilerimi İndir" + confirm: "Gönderilerinizi indirmek istediğinize emin misiniz?" new_private_message: "Yeni İleti" private_message: "İleti" private_messages: "İletiler" @@ -1203,7 +1208,6 @@ tr_TR: go_bottom: "en alt" go: "git" jump_bottom: "son gönderiye geç" - jump_prompt: "gönderiye git" jump_prompt_long: "Hangi gönderiye gitmek istersin?" jump_bottom_with_number: "%{post_number} numaralı gönderiye geç" total: tüm gönderiler @@ -1421,7 +1425,6 @@ tr_TR: file_too_large: "Üzgünüz, bu dosya çok büyük (en fazla {{max_size_kb}}kb). Neden büyük boyutlu dosyanı bir paylaşım servisine yükleyip, sonra bağlantını paylaşmıyorsun ?" too_many_uploads: "Üzgünüz, aynı anda birden fazla dosya yükleyemezsiniz." too_many_dragged_and_dropped_files: "Üzgünüz, aynı anda 10'dan fazla dosya yükleyemezsiniz." - upload_not_authorized: "Üzgünüz, yüklemeye çalıştığınız dosya tipine izin verilmiyor. (izin verilen uzantılar: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Üzgünüz, yeni kullanıcılar resim yükleyemezler." attachment_upload_not_allowed_for_new_user: "Üzgünüz, yeni kullanıcılar dosya yükleyemezler." attachment_download_requires_login: "Üzgünüz, eklentileri indirebilmek için oturum açmanız gerekiyor." diff --git a/config/locales/client.uk.yml b/config/locales/client.uk.yml index 8ce95ff0917..b6e0ec8b4ce 100644 --- a/config/locales/client.uk.yml +++ b/config/locales/client.uk.yml @@ -802,7 +802,6 @@ uk: title: просування по темі go_bottom: "Кнопка" jump_bottom: "перейти до останнього допису" - jump_prompt: "перейти до допису" jump_bottom_with_number: "перейти до допису %{post_number}" total: всього дописів current: поточний допис @@ -914,7 +913,6 @@ uk: edit: "Даруйте, під час редагування допису трапилася помилка. Будь ласка, спробуйте ще раз." upload: "Даруйте, під час завантаження цього файлу трапилася помилка. Будь ласка, спробуйте ще раз." too_many_uploads: "Даруйте, але Ви можете одночасно завантажувати тільки один файл." - upload_not_authorized: "Даруйте, але файл, який Ви намагаєтеся завантажити, є недозволеним (дозволені розширення: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Даруйте, нові користувачі не можуть завантажувати зображення." attachment_upload_not_allowed_for_new_user: "Даруйте, нові користувачі не можуть завантажувати прикріплення." abandon: diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml index f7c25e3762d..3ead479e62b 100644 --- a/config/locales/client.vi.yml +++ b/config/locales/client.vi.yml @@ -1272,7 +1272,6 @@ vi: edit: "Xin lỗi, có lỗi xảy ra khi sửa bài viết của bạn. Vui lòng thử lại." upload: "Xin lỗi, có lỗi xảy ra khi tải lên tập tin này. Vui lòng thử lại." too_many_uploads: "Xin lỗi, bạn chỉ có thể tải lên 1 file cùng 1 lúc." - upload_not_authorized: "Xin lỗi, tập tin của bạn tải lên chưa được cho phép (định dạng cho phép: {{authorized_extensions}})." image_upload_not_allowed_for_new_user: "Xin lỗi, tài khoản mới không thể tải lên ảnh." attachment_upload_not_allowed_for_new_user: "Xin lỗi, tài khoản mới không thể tải lên đính kèm." attachment_download_requires_login: "Xin lỗi, bạn cần đăng nhập để tải về đính kèm." diff --git a/config/locales/client.zh_TW.yml b/config/locales/client.zh_TW.yml index 40af1e5d610..e0cb9f6c2b2 100644 --- a/config/locales/client.zh_TW.yml +++ b/config/locales/client.zh_TW.yml @@ -94,10 +94,10 @@ zh_TW: action_codes: public_topic: "%{when}時讓大家看到這個主題" private_topic: "%{when}時讓其他人看不到這個主題" - split_topic: "於 %{when} 切分此討論話題" + split_topic: "於 %{when} 分割此討論話題" invited_user: "邀請 %{who} 於 %{when} " invited_group: "邀請 %{who} %{when}" - removed_user: "移除 %{who} 於 %{when} " + removed_user: "刪除 %{who} 於 %{when} " removed_group: "刪除 %{who} %{when}" autoclosed: enabled: '於 %{when} 關閉' @@ -117,10 +117,10 @@ zh_TW: visible: enabled: '於 %{when} 列出' disabled: '於 %{when} 除名' - topic_admin_menu: "討論話題管理員操作" + topic_admin_menu: "版區管理員操作" wizard_required: "是時候配置你的論壇啦!點擊開始設置嚮導!" emails_are_disabled: "管理員已經停用了所有外寄郵件功能。通知信件都不會寄出。" - bootstrap_mode_enabled: "為方便站點準備發佈,其正處於初始化模式中。所有新用戶將被授予信任等級1,併為他們設置接受每日郵件摘要。初始化模式會在用戶數超過 %{min_users} 個時關閉。" + bootstrap_mode_enabled: "為方便站點準備發佈,現正處於初始化模式中。所有新用戶將被授予信任等級1,並為他們設置接受每日郵件摘要。初始化模式會在用戶數超過 %{min_users} 個時關閉。" bootstrap_mode_disabled: "初始化模式將會在24小時後關閉。" s3: regions: @@ -638,10 +638,10 @@ zh_TW: website: "網站" email_settings: "電子郵件" like_notification_frequency: - title: "用戶被贊時通知提醒" + title: "用戶被讚時通知提醒" always: "總是" - first_time_and_daily: "每天首個被贊" - first_time: "歷史首個被贊" + first_time_and_daily: "每天首個被讚" + first_time: "歷史首個被讚" never: "永不" email_previous_replies: title: "郵件底部包含歷史回覆" @@ -755,10 +755,10 @@ zh_TW: more_badges: "更多徽章" top_links: "最佳連結" no_links: "暫無連結" - most_liked_by: "誰贊最多" - most_liked_users: "贊誰最多" + most_liked_by: "誰得到最多讚" + most_liked_users: "讚誰最多" most_replied_to_users: "最多回覆至" - no_likes: "暫無贊" + no_likes: "暫無讚" associated_accounts: "登入" ip_address: title: "最近的 IP 位址" @@ -768,7 +768,7 @@ zh_TW: title: "個人資料圖片" header_title: "個人頁面、消息、書籤和設置" title: - title: "標題" + title: "用戶標題" filters: all: "全部" stream: @@ -801,7 +801,7 @@ zh_TW: logout: "已登出" refresh: "重新整理" read_only_mode: - enabled: "站點正處於只讀模式。你可以繼續瀏覽,但是回覆、贊和其他操作暫時被禁用。" + enabled: "站點正處於只讀模式。你可以繼續瀏覽,但是回覆、讚和其他操作暫時被禁用。" login_disabled: "在唯讀模式下不能登入" logout_disabled: "站點在只讀模式下無法登出。" too_few_topics_and_posts_notice: "讓我們開始討論!目前有 %{currentTopics} / %{requiredTopics} 個主題和 %{currentPosts} / %{requiredPosts} 個帖子。新訪客需要能夠閲讀和回覆一些討論。" @@ -835,7 +835,7 @@ zh_TW: hide_forever: "不了" hidden_for_session: "好的,我會在明天提醒你。不過你隨時都可以使用“登錄”來創建賬戶。" intro: "你好!:heart_eyes: 看起來你挺喜歡這樣的討論,可是你還沒有註冊賬戶。" - value_prop: "當你創建賬戶後,我們可以準確地記錄你的閲讀進度,這樣你能夠在下一次訪問時回到你上次閲讀到的地方。你也可以選擇接受新帖子的網頁和郵件通知。並且你可以贊任何帖子來分享你的感謝。:heartbeat:" + value_prop: "當你創建賬戶後,我們可以準確地記錄你的閲讀進度,這樣你能夠在下一次訪問時回到你上次閲讀到的地方。你也可以選擇接受新帖子的網頁和郵件通知。並且你可以讚任何帖子來分享你的感謝。:heartbeat:" summary: enabled_description: "你正在檢視此討論話題的摘要:在這個社群裡最熱門的文章。" description: "有 {{replyCount}} 個回覆。" @@ -972,7 +972,7 @@ zh_TW: title: "或者按 Ctrl+Enter" users_placeholder: "新增用戶" title_placeholder: "用一個簡短的句子來描述想討論的內容。" - title_or_link_placeholder: "鍵入標題,或粘貼一個連結在這裡" + title_or_link_placeholder: "鍵入標題,或貼上一個連結在這裡" edit_reason_placeholder: "你為什麼做編輯?" show_edit_reason: "(請加入編輯原因)" topic_featured_link_placeholder: "在標題裡輸入連結" @@ -1041,9 +1041,9 @@ zh_TW: posted: "

    {{username}} {{description}}

    " edited: "

    {{username}} {{description}}

    " liked: "

    {{username}} {{description}}

    " - liked_2: "

    {{username}}、{{username2}} {{description}}

    " + liked_2: "

    {{username}}、{{username2}} {{description}}

    " liked_many: - other: "

    {{username}}、{{username2}}和其他 {{count}} 人{{description}}

    " + other: "

    {{username}}、{{username2}}和其他 {{count}} 人{{description}}

    " private_message: "

    {{username}} {{description}}

    " invited_to_private_message: "

    {{username}} {{description}}

    " invited_to_topic: "

    {{username}}{{description}}

    " @@ -1096,7 +1096,7 @@ zh_TW: relevance: "最相關" latest_post: "最新發帖" most_viewed: "最多閲讀" - most_liked: "最多贊" + most_liked: "最多讚" select_all: "選擇全部" clear_all: "清除全部" too_short: "你的搜索詞太短。" @@ -1512,7 +1512,7 @@ zh_TW: about: "此帖允許被公共編輯" archetypes: save: '儲存選項' - few_likes_left: "謝謝你的熱情!你今天的贊快用完了。" + few_likes_left: "謝謝你的熱情!你今天的讚快用完了。" controls: reply: "開始編寫對此文章的回覆" like: "給此文章按讚" @@ -1707,8 +1707,8 @@ zh_TW: description: "在這些分類裡面,你將不會收到新主題任何通知,它們也不會出現在“最新”主題列表。 " sort_options: default: "預設" - likes: "贊" - op_likes: "原始帖子贊" + likes: "讚" + op_likes: "原始帖子讚" views: "瀏覽" posts: "帖子" activity: "活動" @@ -1929,7 +1929,7 @@ zh_TW: reply_topic: 'shift+r 回覆主題' reply_post: 'r 回覆帖子' quote_post: 'q 引用帖子' - like: 'l 贊帖子' + like: 'l 讚帖子' flag: '! 標記帖子' bookmark: 'b 收藏帖子' edit: 'e 編輯帖子' @@ -2954,7 +2954,7 @@ zh_TW: embed_by_username: "主題創建者的用戶名" embed_post_limit: "嵌入的最大帖子數量。" embed_username_key_from_feed: "從流中拉取 Discourse 用戶名的 Key " - embed_title_scrubber: "從帖子中提取標題的正則表達式" + embed_title_scrubber: "從帖子中提取標題的正則表達式 \"regular expression\"" embed_truncate: "截斷嵌入的帖子" embed_whitelist_selector: "使用 CSS 選擇器選擇允許的嵌入元素" embed_blacklist_selector: "使用 CSS 選擇器移除嵌入元素" diff --git a/config/locales/server.da.yml b/config/locales/server.da.yml index 433bc8bc38d..e1eec0ecab7 100644 --- a/config/locales/server.da.yml +++ b/config/locales/server.da.yml @@ -1040,7 +1040,6 @@ da: new_posts: "Nye indlæg" popular_topics: "Populære emner" join_the_discussion: "Læs mere" - more_new: "Nyt i emner og kategorier, som du følger" subject_template: "[%{site_name}] Resumé" unsubscribe: "Dette resumé sendes fra %{site_link} når vi ikke har set dig i et stykke tid. For at afmelde %{unsubscribe_link}." click_here: "klik her" diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 312cc18c97b..0e8eb3db049 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -53,6 +53,7 @@ en: purge_reason: "Automatically deleted as abandoned, deactivated account" disable_remote_images_download_reason: "Remote images download was disabled because there wasn't enough disk space available." anonymous: "Anonymous" + remove_posts_deleted_by_author: "Deleted by author" emails: incoming: @@ -95,6 +96,8 @@ en: inclusion: is not included in the list invalid: is invalid is_invalid: "seems unclear, is it a complete sentence?" + contains_censored_words: "includes one or more of the censored words: %{censored_words}" + matches_censored_pattern: "matches the following censored Regex: %{censored_pattern}" less_than: must be less than %{count} less_than_or_equal_to: must be less than or equal to %{count} not_a_number: is not a number @@ -1210,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." @@ -1343,7 +1348,7 @@ en: hide_user_profiles_from_public: "Disable user cards, user profiles and user directory for anonymous users." - user_website_domains_whitelist: "User website will be verified against these domains. Pipe-delimited list." + user_website_domains_whitelist: "User website will be verified against these domains. Pipe-delimited list." allow_profile_backgrounds: "Allow users to upload profile backgrounds." @@ -1614,6 +1619,8 @@ en: user: no_accounts_associated: "No accounts associated" deactivated: "Was deactivated due to too many bounced emails to '%{email}'." + deactivated_by_staff: "Deactivated by staff" + activated_by_staff: "Activated by staff" username: short: "must be at least %{min} characters" long: "must be no more than %{max} characters" @@ -2636,6 +2643,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/locales/server.es.yml b/config/locales/server.es.yml index c2b92650c63..8494bd92fbe 100644 --- a/config/locales/server.es.yml +++ b/config/locales/server.es.yml @@ -2001,7 +2001,6 @@ es: join_the_discussion: "Leer más" popular_posts: "Temas populares" from_topic_label: "Formulario" - more_new: "Nuevos temas en las categorías que sigues" subject_template: "Resumen de [%{site_name}]" unsubscribe: "Este resumen se envía desde %{site_link} cuando pasa un tiempo desde tu última visita. Para cancelar tu suscripción %{unsubscribe_link}." click_here: "clic aquí" diff --git a/config/locales/server.et.yml b/config/locales/server.et.yml index 748c2d4e1e4..c0c3e470d4d 100644 --- a/config/locales/server.et.yml +++ b/config/locales/server.et.yml @@ -570,6 +570,7 @@ et: topic_flag_types: spam: title: 'Spämm' + description: 'See teema on reklaam. See ei ole ei kasulik ega teemakohane.' long_form: 'tähistasin selle kui spämmi' inappropriate: title: 'Ebasobiv' diff --git a/config/locales/server.fa_IR.yml b/config/locales/server.fa_IR.yml index db40a61b66e..15ec41837cb 100644 --- a/config/locales/server.fa_IR.yml +++ b/config/locales/server.fa_IR.yml @@ -15,9 +15,14 @@ fa_IR: short: "%m-%d-%Y" short_no_year: "%B %-d" date_only: "%B %-d, %Y" + long: "%B %-d, %Y, %l:%M%P" date: month_names: [null, ژانویه, فوریه, مارچ, آپریل, می, جون, جولای, آگوست, سپتامبر, اکتبر, نوامبر, دسامبر] <<: *datetime_formats + time: + am: "ق.ظ" + pm: "ب.ظ" + <<: *datetime_formats title: "گفتمان" topics: "موضوعات" posts: "نوشته ها" @@ -139,6 +144,7 @@ fa_IR: topic_not_found: "یک مشکلی وجود دارد. شاید این جستار بسته شده یا پاک شده همزمان که داشتی نگاهش می کردی ؟" just_posted_that: "به آن‌چه که به‌تازگی فرستادید بسیار نزدیک است" invalid_characters: "نویسه‌های نامعتبر در بر دارد." + is_invalid: "نامعتبر است. تلاش کنید که کمی بیش‌ترتوضیح بگذارید." next_page: "صفحه بعد ←" prev_page: "→ صفحه قبل" page_num: "صفحه %{num}" @@ -1300,6 +1306,9 @@ fa_IR: title: "شرایط استفاده از خدمات" privacy_topic: title: "سیاست حفظ حریم خصوصی" + badges: + welcome: + name: خوش آمدید admin_login: success: "ایمیل ارسال شد " error: "خطا!" @@ -1310,8 +1319,17 @@ fa_IR: performance_report: initial_post_raw: این مطلب شامل گزارش عملکرد روزانه سایت شماست. initial_topic_title: گزارش عملکرد وب‌سایت - time: - <<: *datetime_formats + wizard: + step: + forum_title: + title: "نام" + contact: + fields: + contact_email: + label: "ایمیل" + placeholder: "name@example.com" + contact_url: + placeholder: "http://www.example.com/contact-us" activemodel: errors: <<: *errors diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index ae3ac35cd01..13b87c496d7 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -163,6 +163,7 @@ he: spamming_host: "סליחה אך אינכם יכולים להוסיף קישור לאתר זה." user_is_suspended: "משתמשים מושעים אינם מורשים לפרסם." topic_not_found: "משהו השתבש אולי נושא זה נסגר או נמחק בזמן שקראתם אותו?" + not_accepting_pms: "מצטעים, %{username} לא מקבל הודעות כרגע." just_posted_that: "דומה מידי למה שפרסמתם לאחרונה" invalid_characters: "מכיל תווים לא תקניים" is_invalid: "נראה לא ברור, האם זה משפט שלם?" @@ -1186,6 +1187,7 @@ he: automatically_unpin_topics: "הסרת נעיצה אוטומטית של נושאים כאשר המשתמשים מגיעים לתחתית." read_time_word_count: "מספר המילים לדקה כדי להעריך את זמן הקריאה." topic_page_title_includes_category: "כותרת דף נושא כוללת את שם הקטגוריה." + native_app_install_banner: "בקשו ממבקרים חוזרים להתקין את אפליקציית Discourse." max_prints_per_hour_per_user: "מספר מקסימלי של צפיות בדף /print (הדפסה) (קיבעו ל 0 כדי לנטרל)" full_name_required: "שם מלא הוא שדה נדרש לפרופיל משתמש/ת." enable_names: "הצגת השם המלא של המשתמש/ת בעמודי הפרופיל שלהם, בכרטיסי המשתמש ובדוא\"ל שלהם. נטרלו להסתרת השם המלא בכל מקום." @@ -2109,7 +2111,7 @@ he: join_the_discussion: "קראו עוד" popular_posts: "פוסטים פופולאריים" from_topic_label: "מאת" - more_new: "חדש בנושאים וקרטגוריות שאתם עוקבים אחריהם" + more_new: "חדש בשבילכם" subject_template: "[%{site_name}] סיכום" unsubscribe: "סיכום זה נשלח מ %{site_link} כאשר אנחנו לא רואים אתכם לאורך זמן. כדי לבטל את המנוי %{unsubscribe_link}." click_here: "לחצו כאן" diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml index 794f7cbfd28..1e06d463bb0 100644 --- a/config/locales/server.it.yml +++ b/config/locales/server.it.yml @@ -570,7 +570,7 @@ it: read_write: "lettura/scrittura" scopes: message_bus: "Aggiornamenti in tempo reale" - notifications: "Leggi e elimina tutte le notifiche" + notifications: "Leggi e elimina le notifiche" read: "Leggi tutto" write: "Scrivi tutto" reports: @@ -1586,6 +1586,73 @@ it: title: "Etichette" staff_tag_remove_disallowed: "L'etichetta \"%{tag}\" può essere cancellata soltanto dallo staff." rss_by_tag: "Argomenti etichettati %{tag}" + wizard: + step: + introduction: + title: "Introduzione" + fields: + welcome: + label: "Argomento di Benvenuto" + privacy: + title: "Accesso" + fields: + privacy: + choices: + open: + label: "Pubblico" + restricted: + label: "Privato" + contact: + title: "Contatto" + fields: + contact_email: + label: "Email" + placeholder: "nome@esempio.com" + contact_url: + label: "Sito Web" + site_contact: + label: "Messaggi Automatici" + corporate: + title: "Società" + fields: + company_short_name: + label: "Nome Azienda (breve)" + company_full_name: + label: "Nome Azienda (completo)" + company_domain: + label: "Nome Dominio Azienda" + colors: + title: "Tema" + fields: + theme_id: + choices: + default: + label: "Semplice Chiaro" + dark: + label: "Semplice Scuro" + logos: + title: "Loghi" + fields: + logo_url: + label: "Logo Primario" + logo_small_url: + label: "Logo Piccolo" + icons: + title: "Icone" + fields: + favicon_url: + label: "Icona Piccola" + apple_touch_icon_url: + label: "Icona Grande" + homepage: + title: "Homepage" + fields: + homepage_style: + choices: + categories: + label: "Categorie" + emoji: + title: "Emoji" activemodel: errors: <<: *errors diff --git a/config/locales/server.nb_NO.yml b/config/locales/server.nb_NO.yml index b574de140f6..9df2e7f1285 100644 --- a/config/locales/server.nb_NO.yml +++ b/config/locales/server.nb_NO.yml @@ -49,7 +49,7 @@ nb_NO: errors: &errors format: '%{attribute} %{message}' messages: - too_long_validation: "er begrenset til %{max} karakterer; du brukte %{length}." + too_long_validation: "er begrenset til %{max} tegn; du brukte %{length}." invalid_boolean: "Ugyldig boolsk verdi." taken: "er allerede tatt" accepted: må bli godkjent @@ -103,6 +103,7 @@ nb_NO: operation_already_running: "En prosess kjører allerede. Kan ikke starte en ny jobb akkurat nå." backup_file_should_be_tar_gz: "Backup-filen må være en .tar.gz arkiveringsfil." not_enough_space_on_disk: "Det er ikke nok plass på disk til å laste opp denne backupen." + invalid_filename: "Det sikkerhetskopierte filnavnet inneholder ugyldige tegn. Gyldige tegn er a-z 0-9 . - _." not_logged_in: "Du må være logget inn for å gjøre dette." not_found: "Den etterspurte URL eller ressurs ble ikke funnet" invalid_access: "Du har ingen tilgang til denne resurssen." @@ -168,6 +169,8 @@ nb_NO: posts: "Siste innlegg" private_posts: "Siste private meldinger" group_posts: "Siste innlegg fra %{group_name}" + user_posts: "Siste innlegg av @%{username}" + user_topics: "Siste emner av @%{username}" tag: "Emner merket med stikkord" too_late_to_edit: "Det innlegget ble laget for lenge siden. Det kan ikke lenger bli redigert eller slettet." excerpt_image: "bilde" @@ -233,7 +236,7 @@ nb_NO: Er du sikker du gir nok tid til andre å dele sine innspill også? too_many_replies: | - ### Du har nådd det maksimale antallet mulige svar for dette emnet + ### Du har nådd maksimalt antallet mulige svar for dette emnet Vi beklager, men nye brukere er midlertidig begrenset til %{newuser_max_replies_per_topic} svar per emne. @@ -250,6 +253,7 @@ nb_NO: name: "Kategorinavn" topic: title: 'Tittel' + featured_link: 'Framhevet lenke' post: raw: "Body" user_profile: @@ -263,12 +267,14 @@ nb_NO: too_many_users: "Du kan bare sende advarsel til en bruker om gangen." cant_send_pm: "Beklager, du kan ikke sende en privat melding til den brukeren." no_user_selected: "Du må velge en gyldig bruker. " + featured_link: + invalid: "er ugyldig. Nettadressen bør inneholde http:// eller https://" user: attributes: password: common: "er et av de 10000 mest vanlige passordene. Venligst benytt et mer sikkert passord." - same_as_username: "er det somme som ditt brukernavn. Vennligst ta i bruk et mer sikkert passord." - same_as_email: "er det samme som din e-mail. Vennligst ta i bruk et mer sikkert passord." + same_as_username: "er det somme som brukernavnet ditt. Benytt et sikrere passord." + same_as_email: "er det samme som din e-mail. Benytt et sikrere passord." ip_address: signup_not_allowed: "Registrering er ikke tillatt fra denne kontoen." color_scheme_color: @@ -284,7 +290,7 @@ nb_NO: no_info_me: "
    Om meg-feltet på din profil er for øyeblikket blankt, ønsker du å fylle det ut?
    " no_info_other: "
    %{name} har ikke skrevet noe i Om meg-feltet på sin profil ennå
    " vip_category_name: "Salong" - vip_category_description: "En kategori tilgjengelig for brukere med tillitsnivå 3 og høyere." + vip_category_description: "En kategori tilgjengelig for brukere på tillitsnivå 3 og høyere." meta_category_name: "Tilbakemeldinger" meta_category_description: "Diskusjon om dette nettstedet, hvordan det er organisert, hvordan det fungerer og hvordan vi kan forbedre det." staff_category_name: "Stab" @@ -293,7 +299,7 @@ nb_NO: discourse_welcome_topic: title: "Velkommen til Discourse" lounge_welcome: - title: "Velkommen til Salongen" + title: "Velkommen til salongen" body: |2 Gratulerer! :confetti_ball: @@ -305,14 +311,14 @@ nb_NO: * Redigere tittelen på alle emner * Endre kategorien på alle emner * Få lenkene dine fulgt opp ([automatisk nofollow](http://en.wikipedia.org/wiki/Nofollow) er fjernet) - * Tilgang til en privat Lounge kategori bare synlig for brukere med tillitsnivå 3 eller høyere. - * All spam du flagger vil bli gjemt umiddelbart. + * Tilgang til en privat salong-kategori som bare er synlig for brukere på tillitsnivå 3 eller høyere. + * All søppelpost du flagger vil bli gjemt umiddelbart. Her er den [oppdaterte listen over andre "trofaste"](/badges/3/regular). Si gjerne hei! Takk for at du er en aktiv del av fellesskapet vårt. - (For mer informasjon om tillitsnivå, [see dette emnet][trust]. Vennligst merk at bare medlemmer som fortsetter å oppfylle kravene over tid vil forbli *trofaste*.) + (For mer informasjon om tillitsnivå, [see dette emnet][trust]. Merk deg at bare medlemmer som fortsetter å oppfylle kravene over tid vil forbli *trofaste*.) [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: @@ -338,11 +344,15 @@ nb_NO: title: " bruker" member: title: "medlem" + regular: + title: "trofast" + leader: + title: "leder" rate_limiter: too_many_requests: "Vi har en daglig begrensning for hvor mange ganger den handlingen kan utføres. Venligst vent %{time_left} før du prøver igjen." by_type: - first_day_replies_per_day: "Du har oppnådd det maksimale antall svar en ny bruker kan publisere på sin første dag. Vær så snill og vent %{time_left} før du prøver igjen." - first_day_topics_per_day: "Du har oppnådd det maksimale antall emner en ny bruker kan publisere på sin første dag. Vær så snill og vent %{time_left} før du prøver igjen." + first_day_replies_per_day: "Du har nådd det maksimale antall svar en ny bruker kan publisere på sin første dag. Vær så snill og vent %{time_left} før du prøver igjen." + first_day_topics_per_day: "Du har nådd det maksimale antall emner en ny bruker kan publisere på sin første dag. Vær så snill og vent %{time_left} før du prøver igjen." topics_per_day: "Du har oppnådd høyest antall innlegg for i dag. Vær så snill og vent %{time_left} før du prøver igjen." hours: one: "1 time" @@ -449,7 +459,7 @@ nb_NO: approval_required: "En moderator må manuelt godkjenne kontoen din før du får tilgang til forumet. Du vil motta en e-post når kontoen din er godkjent!" post_action_types: off_topic: - title: 'Off-Topic' + title: 'Urelatert' description: 'Dette innlegget er ikke relevant til den aktuelle emne som definert av tittelen og første innlegget, og burde sannsynligvis flyttes et annet sted. ' long_form: 'markerte dette som urelevant' spam: @@ -460,9 +470,10 @@ nb_NO: email_body: "%{link}\n\n%{message}" inappropriate: title: 'Upassende' - description: 'Dette innlegget har innhold som for en fornuftig person vil kunne være fornærmende, nedverdigende eller brudd på retningslinjene til dette nettsamfunnet.' + description: 'Dette innlegget har innhold som for en fornuftig person vil kunne være fornærmende, nedverdigende eller brudd på retningslinjene til denne gemenskapen.' long_form: 'markerte dette som upassende' notify_user: + title: 'Send en melding til @{{username}}' long_form: 'sendt melding til bruker' email_title: 'Ditt innlegg i "%{title}"' email_body: "%{link}\n\n%{message}" @@ -494,7 +505,7 @@ nb_NO: long_form: 'rapporterte dette som spam' inappropriate: title: 'Upassende' - description: 'Dette innlegget har innhold som en fornuftig person vil anslå å være fornærmende, nedverdigende eller brudd på retningslinjene til dette nettsamfunnet.' + description: 'Dette innlegget har innhold som en fornuftig person vil anslå å være fornærmende, nedverdigende eller brudd på retningslinjene til denne gemenskapen.' long_form: 'markerte dette som upassende' notify_moderators: title: "Noe annet" @@ -502,8 +513,8 @@ nb_NO: email_title: 'Emne "%{title}" krever moderator oppmerksomhet' email_body: "%{link}\n\n%{message}" flagging: - you_must_edit: '

    Innlegget ditt har blitt rapportert av nettsamfunnet. Venligst sjekk dine meldinger.

    ' - user_must_edit: '

    Dette innlegget ble rapportert av nettsamfunnet og er midlertidig skjult.

    ' + you_must_edit: '

    Innlegget ditt har blitt rapportert av nettsamfunnet. Sjekk meldingene dine.

    ' + user_must_edit: '

    Dette innlegget ble rapportert av gemenskapen og er midlertidig skjult.

    ' archetypes: regular: title: "Vanlig emne" @@ -518,6 +529,14 @@ nb_NO: unwatch_category: "Slutt å følge alle emner i %{category}" mailing_list_mode: "Slå av e-postlistemodus" disable_digest_emails: "Slutt å sende meg oppsummerings-eposter" + log_out: "Logg ut" + user_api_key: + read: "les" + read_write: "les/skriv" + scopes: + message_bus: "Sanntidsoppdateringer" + read: "Les alt" + write: "Skriv alt" reports: visits: title: "Brukerbesøk" @@ -528,7 +547,9 @@ nb_NO: xaxis: "Dag" yaxis: "Antall nye brukere" profile_views: + title: "Visninger av brukerprofil" xaxis: "Dag" + yaxis: "Antallet brukerprofiler vist" topics: title: "Emner" xaxis: "Dag" @@ -599,17 +620,22 @@ nb_NO: page_view_anon_reqs: title: "Anonym" xaxis: "Dag" + yaxis: "Anonyme sidevisninger" page_view_logged_in_reqs: title: "Innlogget" xaxis: "Dag" + yaxis: "Innloggede sidevisninger" page_view_crawler_reqs: title: "Web crawlere" xaxis: "Dag" page_view_total_reqs: title: "Totalt" xaxis: "Dag" + yaxis: "Totalt antall sidevisninger" page_view_logged_in_mobile_reqs: + title: "Innloggede sidevisninger" xaxis: "Dag" + yaxis: "Innloggede sidevisninger fra mobil" page_view_anon_mobile_reqs: xaxis: "Dag" http_background_reqs: @@ -650,7 +676,7 @@ nb_NO: yaxis: "Antall besøk" dashboard: rails_env_warning: "Serveren din kjører i %{env] modus." - host_names_warning: "Din config/database.yml fil bruker standard localhost hostnavn. Venligst legg inn ditt ønskede hostnavn" + host_names_warning: "Din config/database.yml-fil bruker forvalgt lokalvert-vertsnavn. Oppdater det til å bruke din sides vertsnavn." memory_warning: 'Serveren din kjører med mindre enn 1 GB med minne. Minst 1 GB RAM er anbefalt.' site_settings: censored_words: "Ord som automatisk vil bli erstattet med ■■■■" @@ -659,18 +685,20 @@ nb_NO: allow_user_locale: "Tillat brukere å velge eget språk" min_post_length: "Minimum tillatt lengde for innlegg i tegn" min_first_post_length: "Minimum tillatt lengde på for teksten i første innlegg" + min_private_message_post_length: "Minste tillatte innleggslengde for meldinger i antall tegn" max_post_length: "Maksimum tillatt lengde for innlegg i tegn" min_topic_title_length: "Minimum tillatt lengde for tittel i tegn" max_topic_title_length: "Maksimum tillatt lengde for innlegg i tegn" + min_private_message_title_length: "Minste antall tegn tillatt til bruk for tittellengde i meldinger" min_search_term_length: "Minimum lengde på søkeord i tegn" allow_duplicate_topic_titles: "Tillat flere emner med identisk tittel." - unique_posts_mins: "Hvor mange minutter før en bruker kan lage en post med det samme innholdet igjen" + unique_posts_mins: "Hvor mange minutter før en bruker kan lage et innlegg med det samme innholdet igjen" educate_until_posts: "Når bruker begynner å skrive på de første (n) innleggene, vis pop-up med opplæringspanelet for nye brukere i editoren." title: "Navnet på denne siden, slik du vil ha det i title-taggen." site_description: "Beskriv siden med en setning, vil brukes i description-taggen." contact_email: "Epost til ansvarlig kontakt for denne siden. Brukes til kritiske påminninger som uhåndterte flagg og som kontakt-adresse på /about-siden." contact_url: "Kontakt URL for siden. Brukes på /about siden." - queue_jobs: "KUN FOR UTVIKLERE! ADVARSEL! Jobber køes som standard i Sidekiq. Hvis det slås av vil siden ikke fungere. " + queue_jobs: "KUN FOR UTVIKLERE! ADVARSEL! Jobber køes som forvalg i Sidekiq. Hvis det slås av vil siden ikke fungere. " crawl_images: "Hent bilder fra ekstern URL for å sette inn korrekt høyde og bredde." download_remote_images_to_local: "Konverter eksterne bilder ved å laste de ned lokalt, dette forhindrer ødelagte bilder." download_remote_images_threshold: "Minimum ledig diskplass for å kunne laste ned eksterne bilder (i prosent)" @@ -683,60 +711,77 @@ nb_NO: max_image_height: "Maksimal thumbnail høyde for bilder i et innlegg" post_excerpt_maxlength: "Maksimal lengde på utdrag eller oppsummering av innlegg." apple_touch_icon_url: "Ikon brukt på Apple touch enheter. Anbefalt størrelse er 144px x 144px." - summary_max_results: "Det maksimale antall innlegg som returneres av 'Oppsummér dette emnet'" + summary_max_results: "Maksimalt antall innlegg som returneres av 'Oppsummer dette emnet'" allow_moderators_to_create_categories: "Tillat moderatorer å opprette nye kategorier" - topics_per_period_in_top_summary: "Antall topp-emner vises som standard i oppsummeringen av topp-emner." + topics_per_period_in_top_summary: "Antall topp-emner vises som forvalg i oppsummeringen av topp-emner." show_email_on_profile: "Vis brukerens e-postadresse i profilen (kun synlig for brukeren selv og forumstaben)" email_token_valid_hours: "Glemt passord / aktiver konto tokens er gyldig for (n) timer." enable_badges: "Aktiver badge system" log_out_strict: "Ved utlogging, logg ut av ALLE enheter som er pålogget" invite_expiry_days: "Hvor lenge en bruker invitasjons nøkkel er gyldig i dager" + min_username_length: "Minste antall tegn tillatt for brukernavn." + max_username_length: "Største antall tegn tillatt for brukernavn." + min_password_length: "Minimums passordslengde." + min_admin_password_length: "Minimums passordslengde for administrator." rate_limit_create_post: "Etter et innlegg må ny brukere vente (n) sekunder før de kan skrive et nytt" rate_limit_new_user_create_post: "Etter et innlegg må ny brukere vente (n) sekunder før de kan skrive et nytt" max_likes_per_day: "Maximum antall liker per bruker per dag" newuser_max_links: "Hvor mange linker en ny bruker kan legge til i et innlegg." newuser_max_images: "Hvor mange bilder en ny bruker kan legge til i et innlegg." title_prettify: "Unngå vanlige skrivefeil i titler, sånn som store bokstaver, liten bokstav først, mange !, ? og punktum på slutten, osv." - faq_url: "Hvis du har en FAQ på et annet nettsted du gjerne vil bruke, vennligst sett inn URL'en her." + faq_url: "Hvis du har O-S-S på et annet nettsted du gjerne vil bruke, skriv inn nettadressen her." tos_url: "Dersom du har et bruksvilkår-dokument et annet sted som du vil bruke, skriv inn den fullstendige URL-en her." privacy_policy_url: "Dersom du har en personvernerklæring et annet sted som du vil bruke, skriv inn den fullstendige URL-en her." delete_user_max_post_age: "Ikke tillatt å slette brukere hvor deres første innlegg er mer enn (x) dager gamle." email_editable: "Tillat brukere å endre deres email etter at de har registrert seg." - digest_topics: "Det maksimale antall populære emner å vise i oppsummerings-eposten." - digest_posts: "Det maksimale antall populære innlegg å vise i oppsummerings-eposten." - digest_other_topics: "Det maksimale antall emner å vise i delen 'Nytt i emner og kategorier du følger' i oppsummerings-eposten." - digest_min_excerpt_length: "Minimalt lenge på utdrag av innlegg i e-post-oppsummeringen, i antall tegn." + digest_topics: "Maksimalt antall populære emner å vise i oppsummerings-e-posten." + digest_posts: "Maksimalt antall populære innlegg å vise i oppsummerings-e-posten." + digest_other_topics: "Maksimalt antall emner å vise i delen 'Nytt i emner og kategorier du følger' i oppsummerings-e-posten." + digest_min_excerpt_length: "Minimal lengde på utdrag av innlegg i e-post-oppsummeringen, i antall tegn." delete_digest_email_after_days: "Utelat oppsummerings-eposter for brukere ikke sett på nettstedet siden mer enn (n) dager." digest_suppress_categories: "Utelat disse kategoriene i oppsummerings-eposter" disable_digest_emails: "Deaktivér oppsummerings-eposter for alle brukere." allow_profile_backgrounds: "Gi brukere mulighet til å laste opp profilbakgrunner." - enable_mobile_theme: "Mobilenheter bruker et mobilvennlig tema, med muligheten til å gå til den fulle siden. Deaktiver dette hvis du ønsker å bruke et tilpasset stilark." + enable_mobile_theme: "Mobilenheter bruker et mobilvennlig drakt, med muligheten til å gå til den fulle siden. Deaktiver dette hvis du ønsker å bruke et tilpasset stilark." dominating_topic_minimum_percent: "Hvor mange innlegg en bruker kan lage innenfor en topic før de blir påminnet om dominering av en topic." automatically_unpin_topics: "Automatisk fjern feste for emner når brukeren når bunnen." + embed_post_limit: "Maksimalt antall innlegg som skal bygges inn." + embed_username_required: "Brukernavn kreves for opprettelse av emne." enable_emoji: "Aktiver emoji." emoji_set: "Hvordan vil du ha din emoji?" - default_email_digest_frequency: "Standardinnstillingen for hvor ofte brukere mottar oppsummerings-eposter" - default_include_tl0_in_digests: "La det være standardinnsillingen å inkluder innlegg fra nye brukere i oppsummerings-eposter. Brukere kan endre dette i preferansene sine." - default_email_mailing_list_mode_frequency: "Brukere som slår på e-postlistemodus, vil motta e-poster så ofte som standard" + default_email_digest_frequency: "Forvalgt innstilling for hvor ofte brukere mottar oppsummerings-e-poster" + default_include_tl0_in_digests: "La det være forvalgt innstilling å inkludere innlegg fra nye brukere i oppsummerings-e-poster. Brukere kan endre dette i innstillingene sine." + default_email_mailing_list_mode_frequency: "Brukere som slår på e-postlistemodus, vil motta e-poster så ofte som forvalg" disable_mailing_list_mode: "Forby brukere å slå på e-postlistemodus" - default_email_previous_replies: "Inkludér tidligere svar i e-poster som standard." - default_topics_automatic_unpin: "Automatisk fjern feste for emner når brukeren når bunnen som standard." - default_categories_watching: "Liste med kategorier som følges som standard" - default_categories_tracking: "Liste med kategorier som overvåkes som standard" - default_categories_muted: "Liste med kategorier som blir dempet som standard" - default_categories_watching_first_post: "Liste med kategorier hvor det første innlegget i hvert nye emner følges som standard." + default_email_previous_replies: "Inkludér tidligere svar i e-poster som forvalg." + default_topics_automatic_unpin: "Automatisk fjern feste for emner når brukeren når bunnen som forvalg." + default_categories_watching: "Liste med kategorier som følges som forvalg" + default_categories_tracking: "Liste med kategorier som overvåkes som forvalg" + default_categories_muted: "Liste med kategorier som blir dempet som forvalg" + default_categories_watching_first_post: "Liste med kategorier hvor det første innlegget i hvert nye emne følges som forvalg." remove_muted_tags_from_latest: "Ikke vis emner med dempede stikkord i listen med siste emner." + company_short_name: "Firmanavn (kort)" + company_full_name: "Firmanavn (hele)" + company_domain: "Firmadomene" errors: invalid_email: "Ugyldig e-mail adresse" + invalid_username: "Ingen bruker med det brukernavnet." + invalid_integer_min_max: "Verdien må være mellom %{min} og %{max}." invalid_string: "Ugyldig verdi" + invalid_string_min: "Må være minst %{min} tegn." + invalid_string_max: "Må ikke være mer enn %{max} tegn." search: types: category: 'Kategorier' topic: 'Resultater' user: 'Brukere' + most_posts: "Flest innlegg" + most_recent_poster: "Ferskeste innlegg av" redirected_to_top_reasons: new_user: "Velkommen til vårt forum! Dette er de mest populære emnene for tiden. " not_seen_in_a_month: "Velkommen tilbake! Nå har ikke vi sett deg på en stund. Dette er de mest populære emnene for tiden." + change_owner: + deleted_user: "en slettet bruker" topic_statuses: archived_enabled: "Dette emnet er nå arkivert. Det er fryst og kan ikke bli endret på noen måte. " archived_disabled: "Dette emnet er ikke lenger arkivert. Det er ikke lenger fryst, og kan endres." @@ -772,13 +817,17 @@ nb_NO: incorrect_username_email_or_password: "Feil brukernavn, email eller passord" wait_approval: "Takk for at du registrerte deg. Vi vil varsle deg når din konto er blitt godkjent." active: "Kontoen din har blitt godkjent og er klar for bruk." - activate_email: "

    Nesten ferdig! Vi har sendt en e-post til %{email}. Vennligst trykk på lenken i e-posten for å aktivere kontoen din.

    Hvis den ikke dukker opp, sjekk søppepostmappen din eller logg inn på nytt for å sende en ny-e-post.

    " + activate_email: "

    Nesten ferdig! Vi har sendt en e-post til %{email}. Følg lenken i e-posten for å aktivere kontoen din.

    Hvis den ikke dukker opp, sjekk søppepostmappen din eller logg inn på nytt for utsending av ny e-post.

    " + not_available: "Ikke mulig. Prøv %{suggestion}?" something_already_taken: "Noe gikk galt, kanskje brukernavn eller email er allerede i bruk? Prøv 'glemt passord' linken." - omniauth_error_unknown: "Noe gikk galt under innloggingsprosessen, vennligst prøv igjen." + omniauth_error_unknown: "Noe gikk galt under innloggingsprosessen, prøv igjen." + new_registrations_disabled: "Nye kontoregistreringer tillates ikke per nå." password_too_long: "Passord er begrenset til 200 tegn." + reserved_username: "Det brukernavnet tillates ikke." missing_user_field: "Du har ikke fylt ut alle brukerfeltene." - already_logged_in: "Oisann, ser ut som du prøver å akteptere en invitasjon for en en annen bruker. Hvis du ikke er %{current_user}, vennligst logg ut og prøv igjen." + already_logged_in: "Oisann, ser ut som du prøver å akseptere en invitasjon for en en annen bruker. Hvis du ikke er %{current_user}, logg ut og prøv igjen." user: + no_accounts_associated: "Ingen tilknyttede kontoer" username: short: "må være på minst %{min} tegn" long: "kan ikke være mer enn %{max} tegn" @@ -789,6 +838,8 @@ nb_NO: ip_address: blocked: "Nye registreringer er ikke tillatt fra IP-adressen din." max_new_accounts_per_registration_ip: "Nye registreringer er ikke tillatt fra IP-adressen din (maksimalt antall nådd). Ta kontakt med et medlem av staben." + new_version_mailer_with_notes: + subject_template: "[%{site_name}]-oppdatering tilgjengelig" flags_dispositions: agreed: "Takk for at du sier ifra. Vi er enig at det er et problem her og vi ser på saken." disagreed: "Takk for at du sier ifra. Vi skal se på det. " @@ -799,24 +850,36 @@ nb_NO: subject_template: "Velkommen til %{site_name}!" welcome_invite: subject_template: "Velkommen til %{site_name}!" + backup_failed: + subject_template: "Sikkerhetskopiering mislyktes" + restore_failed: + subject_template: "Gjenoppretting mislyktes" too_many_spam_flags: subject_template: "Ny konto på vent" too_many_tl3_flags: subject_template: "Ny konto på vent" + unblocked: + subject_template: "Kontoen er ikke lenger på vent" unsubscribe_mailing_list: | Du mottar dette fordi du har slått på e-postlistemodus. For å melde deg av disse e-postene [klikk her](%{unsubscribe_url}). user_notifications: + previous_discussion: "Tidligere svar" digest: why: "Dette har skjedd på %{site_link} siden ditt forrige besøk %{last_seen_at}" + since_last_visit: "Siden siste besøk" new_topics: "Nye emner" + unread_messages: "Uleste meldinger" unread_notifications: "Uleste varslinger." new_posts: "Nye innlegg" new_users: "Nye brukere" popular_topics: "Populære emner" + follow_topic: "Følg dette emnet" join_the_discussion: "Les mer" - more_new: "Nytt i emner og kategorier du følger" + popular_posts: "Populære innlegg" + from_topic_label: "Fra" + more_new: "Nytt for deg" subject_template: "[%{site_name}] Oppsummering" unsubscribe: "Denne oppsummeringen blir sendt fra %{site_link} når vi ikke har sett deg på en stund. For å melde deg av %{unsubscribe_link}." click_here: "trykk her" @@ -827,6 +890,8 @@ nb_NO: unsubscribe: "Denne oppsummeringen sendes daglig fordi e-postlistemodus er aktivert. For å melde deg deg av %{unsubscribe_link}." from: "%{site_name}-oppsummering" new_topics: "Nye emner" + view_this_topic: "Vis dette emnet" + back_to_top: "Tilbake til toppen" account_created: subject_template: "[%{site_name}] Din Nye Konto" text_body_template: | @@ -836,6 +901,10 @@ nb_NO: %{base_url}/users/password-reset/%{email_token} confirm_new_email: subject_template: "[%{site_name}] Bekreft e-postadressen din" + confirm_old_email: + subject_template: "[%{site_name}] Bekreft nåværende e-postadresse" + notify_old_email: + subject_template: "[%{site_name}] Din e-postadresse har blitt endret" signup: subject_template: "[%{site_name}] Bekreft din nye konto" text_body_template: | @@ -845,6 +914,7 @@ nb_NO: %{base_url}/users/activate-account/%{email_token} page_not_found: title: "Oisann! Den siden finnes ikke eller er privat." + popular_topics: "Populært" recent_topics: "Nylig" see_more: "Mer" search_title: "Søk i denne siden" @@ -865,9 +935,12 @@ nb_NO: size_not_found: "Beklager, vi kunne ikke fastslå størrelsen på bildet ditt. Kanskje bildet ditt er blitt ødelagt?" email_log: no_user: "Finner ikke brukeren med id %{user_id}" + anonymous_user: "Brukeren er anonym" + seen_recently: "Brukeren ble sett nylig" post_deleted: "innlegget var " user_suspended: "Brukeren var suspendert" already_read: "bruker har allerede lest dette innlegget" + message_blank: "meldingen er tom" about: "Om" guidelines: "Retningslinjer" privacy: "Personvern" @@ -1061,8 +1134,39 @@ nb_NO: Dette dokumentet er lisensiert under CC-BY-SA. De ble sist oppdatert 31. mai 2013. badges: + editor: + name: Tekstbehandler + member: + name: Medlem + anniversary: + name: Jubileum + good_topic: + name: Bra emne + champion: + description: Inviterte fem medlemmer + first_quote: + name: Første sitering + description: Siterte et innlegg + read_guidelines: + name: Les retningslinjene + famous_link: + name: Berømt lenke + appreciated: + name: Verdsatt + out_of_love: + name: Ikke mer kjærlighet å gi + thank_you: + name: Takk skal du ha + gives_back: + name: Gir tilbake first_onebox: long_description: Dette merket tildeles den første gangen du publiserer et innlegg med en lenke på en egen linje, som deretter automatisk blir utvidet til en miniboks med en kort oppsummering av lenken, en tittel og (dersom tilgjengelig) et bilde. + admin_login: + success: "E-post sendt" + error: "Feil!" + submit_button: "Send e-post" + tags: + title: "Stikkord" finish_installation: confirm_email: title: "Bekreft din e-postadresse" diff --git a/config/locales/server.nl.yml b/config/locales/server.nl.yml index cfefb9cfda3..bc8fe987153 100644 --- a/config/locales/server.nl.yml +++ b/config/locales/server.nl.yml @@ -319,6 +319,8 @@ nl: staff_category_name: "Staf" staff_category_description: "Privécategorie voor stafgesprekken. Topics zijn alleen zichtbaar voor admins en moderatoren." assets_topic_body: "Dit is een permanent topic, dat alleen zichtbaar is voor de staf, en dient als opslag voor afbeeldingen en documenten die worden gebruikt in het design van de site . Gooi deze niet weg!\n\n\nHoe het werkt:\n\n\n1. Antwoord op dit topic.\n2. Upload hier alle afbeeldingen die je wenst te gebruiken als logo's, favicons enzovoort. (Gebruik het upload icoon in de toolbar, sleep afbeeldingen, of plak afbeeldingen.)\n3. Verzend je bericht om het te posten.\n4. Klik met de rechtermuisknop op de afbeeldingen in je nieuwe bericht om het pad naar de geüploade afbeelding te verkrijgen, of klik het bewerken icoon om je bericht te wijzigen en zo het pad naar de afbeeldingen te verkrijgen. Kopieer het pad naar de afbeeldingen.\n5. Plak deze paden naar de afbeeldingen in [basic settings](/admin/site_settings/category/required).\n\n\nAls je andere bestandstypen wilt kunnen uploaden, moet je dit instellen in `authorized_extensions` in de [file settings](/admin/site_settings/category/files)." + discourse_welcome_topic: + title: "Welkom bij Discourse" lounge_welcome: title: "Welkom in de Lounge" body: |2 @@ -1520,8 +1522,20 @@ nl: initial_topic_title: Performancerapportages van de website topic_invite: user_exists: "Sorry, die gebruiker is al uitgenodigd. Je kan een gebruiker maar een keer voor een topic uitnodigen." + safe_mode: + no_customizations: "Alle website-aanpassingen uitschakelen" + only_official: "Niet-officiële plug-ins uitschakelen" + no_plugins: "Alle plug-ins uitschakelen" wizard: step: + forum_title: + title: "Naam" + homepage: + fields: + homepage_style: + choices: + categories: + label: "Categorieën" invites: description: "Je bent bijna klaar! Nodig wat stafleden uit om te helpen met het starten van discussies met interessante topics en berichten om je gemeenschap op te zetten." finished: diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml index f83786f476b..c804bf6f53c 100644 --- a/config/locales/server.pt.yml +++ b/config/locales/server.pt.yml @@ -2085,7 +2085,6 @@ pt: join_the_discussion: "Ler Mais" popular_posts: "Publicações Populares" from_topic_label: "De" - more_new: "Novidades em tópicos e categorias que acompanha" subject_template: "Sumário de [%{site_name}] " unsubscribe: "Este resumo é enviado de %{site_link} quando não o vemos há algum tempo. Para anular a subscrição %{unsubscribe_link}." click_here: "clique aqui" diff --git a/config/locales/server.ro.yml b/config/locales/server.ro.yml index c227fb8723d..bdc17892370 100644 --- a/config/locales/server.ro.yml +++ b/config/locales/server.ro.yml @@ -2149,7 +2149,6 @@ ro: join_the_discussion: "Citește mai mult" popular_posts: "Postări notorii" from_topic_label: "De la" - more_new: "Noutăți în subiectele și categoriile pe care le urmărești" subject_template: "[%{site_name}] Rezumat" unsubscribe: "Acest rezumat este transmis de pe %{site_link} când a trecut ceva vreme de când nu te-am mai văzut. Pentru a te dezabona, %{unsubscribe_link}." click_here: "click aici" diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index ff84a60f71b..f9ac1651f13 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -305,6 +305,8 @@ ru: too_many_users: "Можно отправлять предупреждения только одному пользователю за раз." cant_send_pm: "Извините, вы не можете посылать личные сообщения данному пользователю." no_user_selected: "Вы должны выбрать корректного пользователя." + featured_link: + invalid: "недействителен. URL должен включать http:// или https://." user: attributes: password: @@ -336,6 +338,8 @@ ru: staff_category_name: "Персонал" staff_category_description: "Приватный раздел для персонала, в котором темы видны только администраторам и модераторам." assets_topic_body: "Это постоянная тема, для хранения изображений и файлов, используемых в дизайне сайта, доступная только сотрудникам. Не удаляйте её! \n\n\nВаши действия:\n\n\n1. Ответьте в эту тему.\n2. Загрузите все изображения, которые вы хотите использовать для логотипов, значков и т.д. сюда. (Используйте значок на панели инструментов в редакторе сообщений, перетащите мышкой, или вставьте изображения из буфера.) \n3. Сохраните свое сообщение.\n4. Щелкните правой кнопкой мыши изображении в новом сообщении, чтобы получить путь к загруженным изображениям, или щелкните значок редактирования и получите путь к изображениям. Скопируйте пути к изображениям.\n5. Вставьте эти пути в [Настройки сайта] (/admin/site_settings/category/required) .\n\n\nЕсли Вам нужно активировать дополнительные типы файлов, отредактируйте `authorized_extensions` во вкладке [Файлы] (/admin/site_settings/category/files)." + discourse_welcome_topic: + title: "Добро пожаловать в Discourse" lounge_welcome: title: "Добро пожаловать в Фойе" body: |2 @@ -1376,6 +1380,10 @@ ru: subject_template: "Обнаружены проблемы" text_body_template: | Некоторые проблемы требуют вашего внимания, более детально можно прочитать [в админке](%{base_url}/admin). + unsubscribe_link: | + Чтобы отписаться от таких писем, [нажмите сюда](%{unsubscribe_url}). + unsubscribe_link_and_mail: | + Чтобы отписаться от таких писем, [нажмите сюда](%{unsubscribe_url}). subject_re: "Re:" subject_pm: "[PM]" user_notifications: @@ -1383,6 +1391,8 @@ ru: unsubscribe: title: "Отписаться" description: "Не заинтересованы в получении данных писем? Нет проблем! Нажмите на ссылку ниже, чтобы мгновенно отписаться от рассылки:" + visit_link_to_respond: "[Посетите тему](%{base_url}%{url}) чтобы ответить." + visit_link_to_respond_pm: "[Посетите сообщение](%{base_url}%{url}) чтобы ответить." posted_by: "Отправлено %{username} %{post_date}" user_invited_to_private_message_pm: subject_template: "[%{site_name}] %{username} приглашает вас к обсуждению сообщения '%{topic_title}'" diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml index cea368a1dbe..05b75444265 100644 --- a/config/locales/server.tr_TR.yml +++ b/config/locales/server.tr_TR.yml @@ -1714,7 +1714,6 @@ tr_TR: follow_topic: "Bu konuyu takip et" join_the_discussion: "Devamını Oku" popular_posts: "Gözde Gönderiler" - more_new: "Takip ettiğiniz konu ve kategorideki yeniler" subject_template: "[%{site_name}] Özeti" unsubscribe: "Bir süredir görünmediğiniz için bu e-posta size %{site_link} topluluğundan gönderildi. Bu e-postaları almak istemiyorsanız %{unsubscribe_link}." click_here: "buraya tıklayın" diff --git a/config/locales/server.vi.yml b/config/locales/server.vi.yml index 12fe42e93d8..34d5f1db028 100644 --- a/config/locales/server.vi.yml +++ b/config/locales/server.vi.yml @@ -1198,7 +1198,7 @@ vi: test_mailer: subject_template: "[%{site_name}] Email Thử Nghiệm" new_version_mailer: - subject_template: "[%{site_name}] Phiên bạn Discourse mới, cập nhật đã sẵn sàng" + subject_template: "[%{site_name}] Phiên bản Discourse mới, cập nhật đã sẵn sàng" new_version_mailer_with_notes: subject_template: "[%{site_name}] cập nhật đã sẵn sàng" queued_posts_reminder: diff --git a/config/site_settings.yml b/config/site_settings.yml index 0a430713bb3..ae668d64e45 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -699,9 +699,13 @@ 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|csv' + default: 'jpg|jpeg|png|gif' refresh: true type: list crawl_images: diff --git a/docs/INSTALL-cloud.md b/docs/INSTALL-cloud.md index 5e01cb0e101..a3fb2204e69 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. 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). 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 diff --git a/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb b/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb index 2f2e75030cd..84500b50f77 100644 --- a/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb +++ b/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb @@ -52,7 +52,7 @@ class PostgreSQLFallbackHandler logger.warn "#{log_prefix}: Master server is active. Reconnecting..." self.master_up(key) - Discourse.disable_readonly_mode + Discourse.disable_readonly_mode(Discourse::PG_READONLY_MODE_KEY) end rescue => e logger.warn "#{log_prefix}: Connection to master PostgreSQL server failed with '#{e.message}'" @@ -103,7 +103,7 @@ module ActiveRecord })) verify_replica(connection) - Discourse.enable_readonly_mode + Discourse.enable_readonly_mode(Discourse::PG_READONLY_MODE_KEY) else begin connection = postgresql_connection(config) diff --git a/lib/custom_setting_providers.rb b/lib/custom_setting_providers.rb new file mode 100644 index 00000000000..370097d4247 --- /dev/null +++ b/lib/custom_setting_providers.rb @@ -0,0 +1,7 @@ +# Support for plugins to register custom setting providers. They can do this +# by having a file, `register_provider.rb` in their root that will be run +# at this point. + +Dir.glob(File.join(File.dirname(__FILE__), '../plugins', '*', "register_provider.rb")) do |p| + require p +end diff --git a/lib/discourse.rb b/lib/discourse.rb index 9f27827f4c5..9c960ae3de9 100644 --- a/lib/discourse.rb +++ b/lib/discourse.rb @@ -113,24 +113,6 @@ module Discourse end end - def self.last_read_only - @last_read_only ||= {} - end - - def self.recently_readonly? - read_only = last_read_only[$redis.namespace] - return false unless read_only - read_only > 15.seconds.ago - end - - def self.received_readonly! - last_read_only[$redis.namespace] = Time.zone.now - end - - def self.clear_readonly! - last_read_only[$redis.namespace] = nil - end - def self.disabled_plugin_names plugins.select { |p| !p.enabled? }.map(&:name) end @@ -210,43 +192,66 @@ module Discourse base_url_no_prefix + base_uri end - READONLY_MODE_KEY_TTL ||= 60 - READONLY_MODE_KEY ||= 'readonly_mode'.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 - def self.enable_readonly_mode(user_enabled: false) - if user_enabled - $redis.set(USER_READONLY_MODE_KEY, 1) + READONLY_KEYS ||= [ + READONLY_MODE_KEY, + PG_READONLY_MODE_KEY, + USER_READONLY_MODE_KEY + ] + + def self.enable_readonly_mode(key = READONLY_MODE_KEY) + if key == USER_READONLY_MODE_KEY + $redis.set(key, 1) else - $redis.setex(READONLY_MODE_KEY, READONLY_MODE_KEY_TTL, 1) - keep_readonly_mode + $redis.setex(key, READONLY_MODE_KEY_TTL, 1) + keep_readonly_mode(key) end MessageBus.publish(readonly_channel, true) true end - def self.keep_readonly_mode + def self.keep_readonly_mode(key) # extend the expiry by 1 minute every 30 seconds unless Rails.env.test? Thread.new do while readonly_mode? - $redis.expire(READONLY_MODE_KEY, READONLY_MODE_KEY_TTL) + $redis.expire(key, READONLY_MODE_KEY_TTL) sleep 30.seconds end end end end - def self.disable_readonly_mode(user_enabled: false) - key = user_enabled ? USER_READONLY_MODE_KEY : READONLY_MODE_KEY + def self.disable_readonly_mode(key = READONLY_MODE_KEY) $redis.del(key) MessageBus.publish(readonly_channel, false) true end def self.readonly_mode? - recently_readonly? || !!$redis.get(READONLY_MODE_KEY) || !!$redis.get(USER_READONLY_MODE_KEY) + recently_readonly? || READONLY_KEYS.any? { |key| !!$redis.get(key) } + end + + def self.last_read_only + @last_read_only ||= {} + end + + def self.recently_readonly? + return false unless read_only = last_read_only[$redis.namespace] + read_only > 15.seconds.ago + end + + def self.received_readonly! + last_read_only[$redis.namespace] = Time.zone.now + end + + def self.clear_readonly! + last_read_only[$redis.namespace] = nil end def self.request_refresh! 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 diff --git a/lib/email/receiver.rb b/lib/email/receiver.rb index 561757a5612..3acdafe96fd 100644 --- a/lib/email/receiver.rb +++ b/lib/email/receiver.rb @@ -156,7 +156,7 @@ module Email elsif bounce_score >= SiteSetting.bounce_score_threshold # NOTE: we check bounce_score before sending emails, nothing to do # here other than log it happened. - reason = I18n.t("user.email.revoked", email: user.email, date: user.user_stat.reset_bounce_score_after) + reason = I18n.t("user.email.revoked", date: user.user_stat.reset_bounce_score_after) StaffActionLogger.new(Discourse.system_user).log_revoke_email(user, reason) end end @@ -239,6 +239,8 @@ module Email end def parse_from_field(mail) + return unless mail[:from] + if mail[:from].errors.blank? mail[:from].address_list.addresses.each do |address_field| address_field.decoded diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb index a41ab8af8c0..393e4eb0867 100644 --- a/lib/plugin/instance.rb +++ b/lib/plugin/instance.rb @@ -363,27 +363,7 @@ JS # # This is a very rough initial implementation def gem(name, version, opts = {}) - gems_path = File.dirname(path) + "/gems/#{RUBY_VERSION}" - spec_path = gems_path + "/specifications" - spec_file = spec_path + "/#{name}-#{version}.gemspec" - unless File.exists? spec_file - command = "gem install #{name} -v #{version} -i #{gems_path} --no-document --ignore-dependencies" - if opts[:source] - command << " --source #{opts[:source]}" - end - puts command - puts `#{command}` - end - if File.exists? spec_file - spec = Gem::Specification.load spec_file - spec.activate - unless opts[:require] == false - require opts[:require_name] ? opts[:require_name] : name - end - else - puts "You are specifying the gem #{name} in #{path}, however it does not exist!" - exit(-1) - end + PluginGem.load(path, name, version, opts) end def enabled_site_setting(setting=nil) diff --git a/lib/plugin_gem.rb b/lib/plugin_gem.rb new file mode 100644 index 00000000000..48df5e57c8b --- /dev/null +++ b/lib/plugin_gem.rb @@ -0,0 +1,27 @@ +module PluginGem + def self.load(path, name, version, opts=nil) + opts ||= {} + + gems_path = File.dirname(path) + "/gems/#{RUBY_VERSION}" + spec_path = gems_path + "/specifications" + spec_file = spec_path + "/#{name}-#{version}.gemspec" + unless File.exists? spec_file + command = "gem install #{name} -v #{version} -i #{gems_path} --no-document --ignore-dependencies" + if opts[:source] + command << " --source #{opts[:source]}" + end + puts command + puts `#{command}` + end + if File.exists? spec_file + spec = Gem::Specification.load spec_file + spec.activate + unless opts[:require] == false + require opts[:require_name] ? opts[:require_name] : name + end + else + puts "You are specifying the gem #{name} in #{path}, however it does not exist!" + exit(-1) + end + end +end diff --git a/lib/post_destroyer.rb b/lib/post_destroyer.rb index ec4047bce18..49fd91b887d 100644 --- a/lib/post_destroyer.rb +++ b/lib/post_destroyer.rb @@ -29,7 +29,7 @@ class PostDestroyer pa.post_action_type_id IN (?) )", PostActionType.notify_flag_type_ids) .each do |post| - PostDestroyer.new(Discourse.system_user, post).destroy + PostDestroyer.new(Discourse.system_user, post, {context: I18n.t('remove_posts_deleted_by_author')}).destroy end end diff --git a/lib/pretty_text/helpers.rb b/lib/pretty_text/helpers.rb index fa61e9efc2f..1c0c2f0e1a1 100644 --- a/lib/pretty_text/helpers.rb +++ b/lib/pretty_text/helpers.rb @@ -50,7 +50,7 @@ module PrettyText topic = Topic.find_by(id: topic_id) if topic && Guardian.new.can_see?(topic) { - title: topic.title, + title: Rack::Utils.escape_html(topic.title), href: topic.url } end diff --git a/lib/validators/censored_words_validator.rb b/lib/validators/censored_words_validator.rb new file mode 100644 index 00000000000..3d3c3685264 --- /dev/null +++ b/lib/validators/censored_words_validator.rb @@ -0,0 +1,15 @@ +class CensoredWordsValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + if !SiteSetting.censored_words.blank? && value =~ /#{SiteSetting.censored_words}/i + record.errors.add( + attribute, :contains_censored_words, + censored_words: SiteSetting.censored_words + ) + elsif !SiteSetting.censored_pattern.blank? && value =~ /#{SiteSetting.censored_pattern}/i + record.errors.add( + attribute, :matches_censored_pattern, + censored_pattern: SiteSetting.censored_pattern + ) + end + end +end diff --git a/lib/version.rb b/lib/version.rb index 70b09593184..a97692ffaec 100644 --- a/lib/version.rb +++ b/lib/version.rb @@ -4,7 +4,7 @@ module Discourse module VERSION #:nodoc: MAJOR = 1 MINOR = 7 - TINY = 0 + TINY = 1 PRE = nil STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.') diff --git a/plugins/poll/config/locales/client.uk.yml b/plugins/poll/config/locales/client.uk.yml index f825d6d3d67..aa468da1dc8 100644 --- a/plugins/poll/config/locales/client.uk.yml +++ b/plugins/poll/config/locales/client.uk.yml @@ -8,6 +8,19 @@ uk: js: poll: + total_votes: + one: "голос" + few: "голосів" + other: "голоси" + average_rating: "Середній рейтинг: %{average}." + multiple: + help: + at_least_min_options: + one: "Виберіть хоча б 1 варіант" + few: "Виберіть хоча б %{count} варіантів" + other: "Виберіть хоча б %{count} варіанти" + cast-votes: + label: "Проголосувати!" show-results: label: "Показати результати" hide-results: diff --git a/plugins/poll/config/locales/server.nb_NO.yml b/plugins/poll/config/locales/server.nb_NO.yml index 8bee01dab82..8351e953157 100644 --- a/plugins/poll/config/locales/server.nb_NO.yml +++ b/plugins/poll/config/locales/server.nb_NO.yml @@ -30,7 +30,7 @@ nb_NO: named_cannot_be_made_public: "Avstemningen %{name} har avgitte stemmer og kan ikke gjøres offentlig." edit_window_expired: cannot_change_polls: "Du kan ikke legge til, fjerne eller navne om avstemninger etter de første %{minutes} minuttene." - op_cannot_edit_options: "Du kan ikke legge til eller fjerne svaralternativer etter de første %{minutes} minuttene. Vennligst kontakt en moderator hvis du har behov for å redigere et svaralternativ." + op_cannot_edit_options: "Du kan ikke legge til eller fjerne svaralternativer etter de første %{minutes} minuttene. Kontakt en moderator hvis du har behov for å redigere et svaralternativ." staff_cannot_add_or_remove_options: "Du kan ikke lette til eller fjerne valgalternativer for avstemningen etter de første %{minutes} minuttene. Du bør stenge dette emnet og lage et nytt i stedet." no_polls_associated_with_this_post: "Ingen avstemning er assosiert med dette innlegget." no_poll_with_this_name: "Ingen avstemning med navnet %{name} er assosiert med dette innlegget." diff --git a/public/503.nb_NO.html b/public/503.nb_NO.html index 47350db7197..80ebfe2b004 100644 --- a/public/503.nb_NO.html +++ b/public/503.nb_NO.html @@ -5,7 +5,7 @@

    Vi er for øyeblikket ikke tilgjengelig på grunn av planlagt vedlikehold av nettstedet

    -

    Vennligst kom tilbake om noen minutter.

    +

    Kom tilbake om noen minutter.

    Beklager ulempene dette medfører!

    diff --git a/script/import_scripts/bbpress.rb b/script/import_scripts/bbpress.rb index bd5e872650b..27c3be1deab 100644 --- a/script/import_scripts/bbpress.rb +++ b/script/import_scripts/bbpress.rb @@ -16,6 +16,8 @@ class ImportScripts::Bbpress < ImportScripts::Base BATCH_SIZE ||= 1000 BB_PRESS_PW ||= ENV['BBPRESS_PW'] || "" BB_PRESS_USER ||= ENV['BBPRESS_USER'] || "root" + BB_PRESS_PREFIX ||= ENV['BBPRESS_PREFIX'] || "wp_" + def initialize super @@ -37,12 +39,12 @@ class ImportScripts::Bbpress < ImportScripts::Base puts "", "importing users..." last_user_id = -1 - total_users = bbpress_query("SELECT COUNT(*) count FROM wp_users WHERE user_email LIKE '%@%'").first["count"] + total_users = bbpress_query("SELECT COUNT(*) count FROM #{BB_PRESS_PREFIX}users WHERE user_email LIKE '%@%'").first["count"] batches(BATCH_SIZE) do |offset| users = bbpress_query(<<-SQL SELECT id, user_nicename, display_name, user_email, user_registered, user_url - FROM wp_users + FROM #{BB_PRESS_PREFIX}users WHERE user_email LIKE '%@%' AND id > #{last_user_id} ORDER BY id @@ -62,7 +64,7 @@ class ImportScripts::Bbpress < ImportScripts::Base users_description = {} bbpress_query(<<-SQL SELECT user_id, meta_value description - FROM wp_usermeta + FROM #{BB_PRESS_PREFIX}usermeta WHERE user_id IN (#{user_ids_sql}) AND meta_key = 'description' SQL @@ -71,7 +73,7 @@ class ImportScripts::Bbpress < ImportScripts::Base users_last_activity = {} bbpress_query(<<-SQL SELECT user_id, meta_value last_activity - FROM wp_usermeta + FROM #{BB_PRESS_PREFIX}usermeta WHERE user_id IN (#{user_ids_sql}) AND meta_key = 'last_activity' SQL @@ -82,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"], + name: u["display_name"].presence || u['user_nicename'], created_at: u["user_registered"], website: u["user_url"], bio_raw: users_description[u["id"]], @@ -97,7 +99,7 @@ class ImportScripts::Bbpress < ImportScripts::Base categories = bbpress_query(<<-SQL SELECT id, post_name, post_parent - FROM wp_posts + FROM #{BB_PRESS_PREFIX}posts WHERE post_type = 'forum' AND LENGTH(COALESCE(post_name, '')) > 0 ORDER BY post_parent, id @@ -119,7 +121,7 @@ class ImportScripts::Bbpress < ImportScripts::Base last_post_id = -1 total_posts = bbpress_query(<<-SQL SELECT COUNT(*) count - FROM wp_posts + FROM #{BB_PRESS_PREFIX}posts WHERE post_status <> 'spam' AND post_type IN ('topic', 'reply') SQL @@ -134,7 +136,7 @@ class ImportScripts::Bbpress < ImportScripts::Base post_title, post_type, post_parent - FROM wp_posts + FROM #{BB_PRESS_PREFIX}posts WHERE post_status <> 'spam' AND post_type IN ('topic', 'reply') AND id > #{last_post_id} @@ -155,7 +157,7 @@ class ImportScripts::Bbpress < ImportScripts::Base posts_likes = {} bbpress_query(<<-SQL SELECT post_id, meta_value likes - FROM wp_postmeta + FROM #{BB_PRESS_PREFIX}postmeta WHERE post_id IN (#{post_ids_sql}) AND meta_key = 'Likes' SQL diff --git a/script/import_scripts/drupal-6.rb b/script/import_scripts/drupal-6.rb new file mode 100644 index 00000000000..1df513df409 --- /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_revisions 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 diff --git a/spec/components/active_record/connection_adapters/postgresql_fallback_adapter_spec.rb b/spec/components/active_record/connection_adapters/postgresql_fallback_adapter_spec.rb index a9e61dbea15..74f48940754 100644 --- a/spec/components/active_record/connection_adapters/postgresql_fallback_adapter_spec.rb +++ b/spec/components/active_record/connection_adapters/postgresql_fallback_adapter_spec.rb @@ -42,8 +42,13 @@ describe ActiveRecord::ConnectionHandling do end after do - with_multisite_db(multisite_db) { Discourse.disable_readonly_mode } - Discourse.disable_readonly_mode + pg_readonly_mode_key = Discourse::PG_READONLY_MODE_KEY + + with_multisite_db(multisite_db) do + Discourse.disable_readonly_mode(pg_readonly_mode_key) + end + + Discourse.disable_readonly_mode(pg_readonly_mode_key) ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[Rails.env]) end diff --git a/spec/components/discourse_spec.rb b/spec/components/discourse_spec.rb index 5d441eacc33..b1b21cfd5c9 100644 --- a/spec/components/discourse_spec.rb +++ b/spec/components/discourse_spec.rb @@ -118,7 +118,7 @@ describe Discourse do context 'user enabled readonly mode' do it "adds a key in redis and publish a message through the message bus" do expect($redis.get(user_readonly_mode_key)).to eq(nil) - message = MessageBus.track_publish { Discourse.enable_readonly_mode(user_enabled: true) }.first + message = MessageBus.track_publish { Discourse.enable_readonly_mode(user_readonly_mode_key) }.first assert_readonly_mode(message, user_readonly_mode_key) end end @@ -160,10 +160,10 @@ describe Discourse do end it "returns true when user enabled readonly mode key is present in redis" do - Discourse.enable_readonly_mode(user_enabled: true) + Discourse.enable_readonly_mode(user_readonly_mode_key) expect(Discourse.readonly_mode?).to eq(true) - Discourse.disable_readonly_mode(user_enabled: true) + Discourse.disable_readonly_mode(user_readonly_mode_key) expect(Discourse.readonly_mode?).to eq(false) end end diff --git a/spec/components/email/receiver_spec.rb b/spec/components/email/receiver_spec.rb index 0a7b0a1bed0..47c7c4a1dac 100644 --- a/spec/components/email/receiver_spec.rb +++ b/spec/components/email/receiver_spec.rb @@ -383,37 +383,46 @@ describe Email::Receiver do expect(Post.last.raw).to match(/discourse\.rb/) end - it "handles forwarded emails" do - SiteSetting.enable_forwarded_emails = true - expect { process(:forwarded_email_1) }.to change(Topic, :count) + context "with forwarded emails enabled" do + before { SiteSetting.enable_forwarded_emails = true } - forwarded_post, last_post = *Post.last(2) + it "handles forwarded emails" do + expect { process(:forwarded_email_1) }.to change(Topic, :count) - expect(forwarded_post.user.email).to eq("some@one.com") - expect(last_post.user.email).to eq("ba@bar.com") + forwarded_post, last_post = *Post.last(2) - expect(forwarded_post.raw).to match(/XoXo/) - expect(last_post.raw).to match(/can you have a look at this email below/) + expect(forwarded_post.user.email).to eq("some@one.com") + expect(last_post.user.email).to eq("ba@bar.com") - expect(last_post.post_type).to eq(Post.types[:regular]) - end + expect(forwarded_post.raw).to match(/XoXo/) + expect(last_post.raw).to match(/can you have a look at this email below/) - it "handles weirdly forwarded emails" do - group.add(Fabricate(:user, email: "ba@bar.com")) - group.save + expect(last_post.post_type).to eq(Post.types[:regular]) + end - SiteSetting.enable_forwarded_emails = true - expect { process(:forwarded_email_2) }.to change(Topic, :count) + it "handles weirdly forwarded emails" do + group.add(Fabricate(:user, email: "ba@bar.com")) + group.save - forwarded_post, last_post = *Post.last(2) + SiteSetting.enable_forwarded_emails = true + expect { process(:forwarded_email_2) }.to change(Topic, :count) - expect(forwarded_post.user.email).to eq("some@one.com") - expect(last_post.user.email).to eq("ba@bar.com") + forwarded_post, last_post = *Post.last(2) - expect(forwarded_post.raw).to match(/XoXo/) - expect(last_post.raw).to match(/can you have a look at this email below/) + expect(forwarded_post.user.email).to eq("some@one.com") + expect(last_post.user.email).to eq("ba@bar.com") + + expect(forwarded_post.raw).to match(/XoXo/) + expect(last_post.raw).to match(/can you have a look at this email below/) + + expect(last_post.post_type).to eq(Post.types[:whisper]) + end + + # Who thought this was a good idea?! + it "doesn't blow up with localized email headers" do + expect { process(:forwarded_email_3) }.to change(Topic, :count) + end - expect(last_post.post_type).to eq(Post.types[:whisper]) end end diff --git a/spec/components/pretty_text_spec.rb b/spec/components/pretty_text_spec.rb index 315b0cac408..b63d77584b4 100644 --- a/spec/components/pretty_text_spec.rb +++ b/spec/components/pretty_text_spec.rb @@ -10,10 +10,10 @@ describe PrettyText do describe "off topic quoting" do it "can correctly populate topic title" do - topic = Fabricate(:topic, title: "this is a test topic") + topic = Fabricate(:topic, title: "this is a test topic :slight_smile:") expected = <

    ddd

    HTML 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/fixtures/emails/forwarded_email_3.eml b/spec/fixtures/emails/forwarded_email_3.eml new file mode 100644 index 00000000000..1f37822b0a7 Binary files /dev/null and b/spec/fixtures/emails/forwarded_email_3.eml differ diff --git a/spec/fixtures/images/huge.jpg b/spec/fixtures/images/huge.jpg new file mode 100644 index 00000000000..25f2d5c6fb4 Binary files /dev/null and b/spec/fixtures/images/huge.jpg differ diff --git a/spec/models/topic_spec.rb b/spec/models/topic_spec.rb index e4574b75c98..809f7954299 100644 --- a/spec/models/topic_spec.rb +++ b/spec/models/topic_spec.rb @@ -4,11 +4,53 @@ require 'rails_helper' require_dependency 'post_destroyer' describe Topic do - let(:now) { Time.zone.local(2013,11,20,8,0) } let(:user) { Fabricate(:user) } - it { is_expected.to validate_presence_of :title } + context 'validations' do + let(:topic) { Fabricate.build(:topic) } + + context "#title" do + it { is_expected.to validate_presence_of :title } + + describe 'censored words' do + site_setting(:censored_words, 'pineapple|pen') + site_setting(:censored_pattern, 'orange.*') + + describe 'when title contains censored words' do + it 'should not be valid' do + topic.title = 'I have a Pineapple' + + expect(topic).to_not be_valid + + expect(topic.errors.full_messages.first).to include(I18n.t( + 'errors.messages.contains_censored_words', censored_words: SiteSetting.censored_words + )) + end + end + + describe 'when title matches censored pattern' do + it 'should not be valid' do + topic.title = 'I have orangEjuice' + + expect(topic).to_not be_valid + + expect(topic.errors.full_messages.first).to include(I18n.t( + 'errors.messages.matches_censored_pattern', censored_pattern: SiteSetting.censored_pattern + )) + end + end + + describe 'when title does not contain censored words' do + it 'should be valid' do + topic.title = 'The cake is a lie' + + expect(topic).to be_valid + end + end + end + end + end it { is_expected.to rate_limit } 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 diff --git a/spec/services/staff_action_logger_spec.rb b/spec/services/staff_action_logger_spec.rb index 676b899dce9..b614faa874b 100644 --- a/spec/services/staff_action_logger_spec.rb +++ b/spec/services/staff_action_logger_spec.rb @@ -369,4 +369,62 @@ 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 + + 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 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