Version bump

This commit is contained in:
Neil Lalonde 2019-06-17 20:50:02 -04:00
commit 0bf267a662
205 changed files with 4706 additions and 1529 deletions

View File

@ -7,6 +7,7 @@ AllCops:
- 'vendor/**/*'
- 'node_modules/**/*'
- 'public/**/*'
- 'plugins/**/*'
# Prefer &&/|| over and/or.
Style/AndOr:

View File

@ -68,7 +68,7 @@ install:
- bash -c "if [ '$RAILS_MASTER' == '1' ]; then bundle update --retry=3 --jobs=3 arel rails seed-fu; fi"
- bash -c "if [ '$RAILS_MASTER' == '0' ]; then bundle install --without development --deployment --retry=3 --jobs=3; fi"
- bash -c "if [ '$QUNIT_RUN' == '1' ] || [ '$RUN_LINT' == '1' ]; then yarn install --dev; fi"
- bash -c "if [ '$RUN_LINT' != '1' ]; then LOAD_PLUGINS=1 bundle exec rake db:create db:migrate; fi"
- bash -c "if [ '$RUN_LINT' != '1' ]; then bundle exec rake db:create && LOAD_PLUGINS=1 bundle exec rake db:migrate; fi"
script:
- |

View File

@ -99,6 +99,7 @@ gem 'r2', '~> 0.2.5', require: false
gem 'rake'
gem 'thor', require: false
gem 'diffy', require: false
gem 'rinku'
gem 'sanitize'
gem 'sidekiq'
@ -144,7 +145,6 @@ group :test, :development do
gem 'byebug', require: ENV['RM_INFO'].nil?
gem 'rubocop', require: false
gem 'parallel_tests'
gem 'diffy', require: false
end
group :development do

View File

@ -41,7 +41,7 @@ import {
import {
INLINE_ONEBOX_LOADING_CSS_CLASS,
INLINE_ONEBOX_CSS_CLASS
} from "pretty-text/inline-oneboxer";
} from "pretty-text/context/inline-onebox-css-classes";
const REBUILD_SCROLL_MAP_EVENTS = ["composer:resized", "composer:typed-reply"];

View File

@ -1,4 +1,5 @@
import { default as computed } from "ember-addons/ember-computed-decorators";
import DiscourseURL from "discourse/lib/url";
export default Ember.Component.extend({
// subclasses need this
@ -53,12 +54,20 @@ export default Ember.Component.extend({
},
click() {
if (typeof this.action === "string") {
this.sendAction("action", this.actionParam);
} else if (typeof this.action === "object" && this.action.value) {
this.action.value(this.actionParam);
} else if (typeof this.action === "function") {
this.action(this.actionParam);
let { action } = this;
if (action) {
if (typeof action === "string") {
this.sendAction("action", this.actionParam);
} else if (typeof action === "object" && action.value) {
action.value(this.actionParam);
} else if (typeof this.action === "function") {
action(this.actionParam);
}
}
if (this.href && this.href.length) {
DiscourseURL.routeTo(this.href);
}
return false;

View File

@ -764,7 +764,7 @@ export default Ember.Component.extend({
$textarea.val(value);
$textarea.prop("selectionStart", insert.length);
$textarea.prop("selectionEnd", insert.length);
Ember.run.next(() => $textarea.trigger("change"));
this._focusTextArea();
},

View File

@ -4,12 +4,16 @@ import { queryRegistry } from "discourse/widgets/widget";
import { getRegister } from "discourse-common/lib/get-owner";
import DirtyKeys from "discourse/lib/dirty-keys";
const _cleanCallbacks = {};
let _cleanCallbacks = {};
export function addWidgetCleanCallback(widgetName, fn) {
_cleanCallbacks[widgetName] = _cleanCallbacks[widgetName] || [];
_cleanCallbacks[widgetName].push(fn);
}
export function resetWidgetCleanCallbacks() {
_cleanCallbacks = {};
}
export default Ember.Component.extend({
_tree: null,
_rootNode: null,

View File

@ -92,7 +92,11 @@ export default Ember.Component.extend({
this.currentUser.set("reviewable_count", result.reviewable_count);
}
this.attrs.remove(performResult.remove_reviewable_ids);
if (this.attrs.remove) {
this.attrs.remove(performResult.remove_reviewable_ids);
} else {
return this.store.find("reviewable", reviewable.id);
}
})
.catch(popupAjaxError)
.finally(() => this.set("updating", false));

View File

@ -23,60 +23,59 @@ export default Ember.Component.extend(
const topicStatusKnown = this.topicClosed !== undefined;
if (topicStatusKnown && topicStatus === this.statusType) return;
let statusUpdateAt = moment(this.executeAt);
const statusUpdateAt = moment(this.executeAt);
const duration = moment.duration(statusUpdateAt - moment());
const minutesLeft = duration.asMinutes();
let duration = moment.duration(statusUpdateAt - moment());
let minutesLeft = duration.asMinutes();
let rerenderDelay = 1000;
if (minutesLeft > 0) {
let rerenderDelay = 1000;
if (minutesLeft > 2160) {
rerenderDelay = 12 * 60 * 60000;
} else if (minutesLeft > 1410) {
rerenderDelay = 60 * 60000;
} else if (minutesLeft > 90) {
rerenderDelay = 30 * 60000;
} else if (minutesLeft > 2) {
rerenderDelay = 60000;
}
let autoCloseHours = this.duration || 0;
if (minutesLeft > 2160) {
rerenderDelay = 12 * 60 * 60000;
} else if (minutesLeft > 1410) {
rerenderDelay = 60 * 60000;
} else if (minutesLeft > 90) {
rerenderDelay = 30 * 60000;
} else if (minutesLeft > 2) {
rerenderDelay = 60000;
}
buffer.push(`<h3>${iconHTML("far-clock")} `);
let autoCloseHours = this.duration || 0;
let options = {
timeLeft: duration.humanize(true),
duration: moment.duration(autoCloseHours, "hours").humanize()
};
buffer.push(`<h3>${iconHTML("far-clock")} `);
const categoryId = this.categoryId;
if (categoryId) {
const category = Category.findById(categoryId);
let options = {
timeLeft: duration.humanize(true),
duration: moment.duration(autoCloseHours, "hours").humanize()
};
options = Object.assign(
{
categoryName: category.get("slug"),
categoryUrl: category.get("url")
},
options
);
}
const categoryId = this.categoryId;
if (categoryId) {
const category = Category.findById(categoryId);
options = Object.assign(
{
categoryName: category.get("slug"),
categoryUrl: category.get("url")
},
options
buffer.push(
`<span title="${moment(this.executeAt).format("LLLL")}">${I18n.t(
this._noticeKey(),
options
)}</span>`
);
}
buffer.push("</h3>");
buffer.push(
`<span title="${moment(this.executeAt).format("LLLL")}">${I18n.t(
this._noticeKey(),
options
)}</span>`
);
buffer.push("</h3>");
// TODO Sam: concerned this can cause a heavy rerender loop
if (!Ember.testing) {
this._delayedRerender = Ember.run.later(
this,
this.rerender,
rerenderDelay
);
// TODO Sam: concerned this can cause a heavy rerender loop
if (!Ember.testing) {
this._delayedRerender = Ember.run.later(
this,
this.rerender,
rerenderDelay
);
}
}
},

View File

@ -64,6 +64,7 @@ export default Ember.Controller.extend({
"pending",
"approved",
"rejected",
"deleted",
"ignored",
"reviewed",
"all"

View File

@ -254,47 +254,51 @@ export default Ember.Controller.extend(bufferedProperty("model"), {
},
selectText(postId, buffer) {
return this.get("model.postStream")
.loadPost(postId)
.then(post => {
const composer = this.composer;
const viewOpen = composer.get("model.viewOpen");
const quotedText = Quote.build(post, buffer);
const loadedPost = this.get("model.postStream").findLoadedPost(postId);
const promise = loadedPost
? Ember.RSVP.resolve(loadedPost)
: this.get("model.postStream").loadPost(postId);
// If we can't create a post, delegate to reply as new topic
if (!viewOpen && !this.get("model.details.can_create_post")) {
this.send("replyAsNewTopic", post, quotedText);
return;
}
return promise.then(post => {
const composer = this.composer;
const viewOpen = composer.get("model.viewOpen");
const quotedText = Quote.build(post, buffer);
const composerOpts = {
action: Composer.REPLY,
draftKey: post.get("topic.draft_key")
};
// If we can't create a post, delegate to reply as new topic
if (!viewOpen && !this.get("model.details.can_create_post")) {
this.send("replyAsNewTopic", post, quotedText);
return;
}
if (post.get("post_number") === 1) {
composerOpts.topic = post.get("topic");
} else {
composerOpts.post = post;
}
const composerOpts = {
action: Composer.REPLY,
draftSequence: post.get("topic.draft_sequence"),
draftKey: post.get("topic.draft_key")
};
// If the composer is associated with a different post, we don't change it.
const composerPost = composer.get("model.post");
if (composerPost && composerPost.get("id") !== this.get("post.id")) {
composerOpts.post = composerPost;
}
if (post.get("post_number") === 1) {
composerOpts.topic = post.get("topic");
} else {
composerOpts.post = post;
}
composerOpts.quote = quotedText;
if (composer.get("model.viewOpen")) {
this.appEvents.trigger("composer:insert-block", quotedText);
} else if (composer.get("model.viewDraft")) {
const model = composer.get("model");
model.set("reply", model.get("reply") + quotedText);
composer.send("openIfDraft");
} else {
composer.open(composerOpts);
}
});
// If the composer is associated with a different post, we don't change it.
const composerPost = composer.get("model.post");
if (composerPost && composerPost.get("id") !== this.get("post.id")) {
composerOpts.post = composerPost;
}
composerOpts.quote = quotedText;
if (composer.get("model.viewOpen")) {
this.appEvents.trigger("composer:insert-block", quotedText);
} else if (composer.get("model.viewDraft")) {
const model = composer.get("model");
model.set("reply", model.get("reply") + quotedText);
composer.send("openIfDraft");
} else {
composer.open(composerOpts);
}
});
},
fillGapBefore(args) {

View File

@ -1,16 +1,28 @@
// Append our CSRF token to AJAX requests when necessary.
let installed = false;
let callbacks = $.Callbacks();
export default {
name: "csrf-token",
initialize: function(container) {
var session = container.lookup("session:main");
initialize(container) {
// Add a CSRF token to all AJAX requests
let session = container.lookup("session:main");
session.set("csrfToken", $("meta[name=csrf-token]").attr("content"));
$.ajaxPrefilter(function(options, originalOptions, xhr) {
if (!installed) {
$.ajaxPrefilter(callbacks.fire);
installed = true;
}
callbacks.add(function(options, originalOptions, xhr) {
if (!options.crossDomain) {
xhr.setRequestHeader("X-CSRF-Token", session.get("csrfToken"));
}
});
},
teardown() {
callbacks.empty();
}
};

View File

@ -9,25 +9,32 @@ export default {
initialize(container) {
withPluginApi("0.1", api => {
const siteSettings = container.lookup("site-settings:main");
api.decorateCooked(highlightSyntax);
api.decorateCooked(lightbox);
api.decorateCooked(highlightSyntax, {
id: "discourse-syntax-highlighting"
});
api.decorateCooked(lightbox, { id: "discourse-lightbox" });
if (siteSettings.support_mixed_text_direction) {
api.decorateCooked(setTextDirections);
api.decorateCooked(setTextDirections, {
id: "discourse-text-direction"
});
}
setupLazyLoading(api);
api.decorateCooked($elem => {
const players = $("audio", $elem);
if (players.length) {
players.on("play", () => {
const postId = parseInt($elem.closest("article").data("post-id"));
if (postId) {
api.preventCloak(postId);
}
});
}
});
api.decorateCooked(
$elem => {
const players = $("audio", $elem);
if (players.length) {
players.on("play", () => {
const postId = parseInt($elem.closest("article").data("post-id"));
if (postId) {
api.preventCloak(postId);
}
});
}
},
{ id: "discourse-audio" }
);
});
}
};

View File

@ -95,6 +95,6 @@ export function setupLazyLoading(api) {
}
});
},
{ onlyStream: true }
{ onlyStream: true, id: "discourse-lazy-load" }
);
}

View File

@ -193,8 +193,14 @@ class PluginApi {
* For example, to add a yellow background to all posts you could do this:
*
* ```
* api.decorateCooked($elem => $elem.css({ backgroundColor: 'yellow' }));
* api.decorateCooked(
* $elem => $elem.css({ backgroundColor: 'yellow' }),
* { id: 'yellow-decorator' }
* );
* ```
*
* NOTE: To avoid memory leaks, it is highly recommended to pass a unique `id` parameter.
* You will receive a warning if you do not.
**/
decorateCooked(callback, opts) {
opts = opts || {};
@ -202,12 +208,13 @@ class PluginApi {
addDecorator(callback);
if (!opts.onlyStream) {
decorate(ComposerEditor, "previewRefreshed", callback);
decorate(DiscourseBanner, "didInsertElement", callback);
decorate(ComposerEditor, "previewRefreshed", callback, opts.id);
decorate(DiscourseBanner, "didInsertElement", callback, opts.id);
decorate(
this.container.factoryFor("component:user-stream").class,
"didInsertElement",
callback
callback,
opts.id
);
}
}
@ -930,7 +937,26 @@ export function withPluginApi(version, apiCodeCallback, opts) {
}
let _decorateId = 0;
function decorate(klass, evt, cb) {
let _decorated = new WeakMap();
function decorate(klass, evt, cb, id) {
if (!id) {
// eslint-disable-next-line no-console
console.warn(
"`decorateCooked` should be supplied with an `id` option to avoid memory leaks."
);
} else {
if (!_decorated.has(klass)) {
_decorated.set(klass, new Set());
}
id = `${id}:${evt}`;
let set = _decorated.get(klass);
if (set.has(id)) {
return;
}
set.add(id);
}
const mixin = {};
mixin["_decorate_" + _decorateId++] = function($elem) {
$elem = $elem || this.$();
@ -944,10 +970,3 @@ function decorate(klass, evt, cb) {
export function resetPluginApi() {
_pluginv01 = null;
}
export function decorateCooked() {
// eslint-disable-next-line no-console
console.warn(
"`decorateCooked` has been removed. Use `getPluginApi(version).decorateCooked` instead"
);
}

View File

@ -104,6 +104,29 @@ export default class {
const topicId = parseInt(this._topicId, 10);
let highestSeen = 0;
// Workaround to avoid ignored posts being "stuck unread"
const controller = this._topicController;
const stream = controller ? controller.get("model.postStream") : null;
if (
this.currentUser && // Logged in
this.currentUser.get("ignored_users.length") && // At least 1 user is ignored
stream && // Sanity check
stream.hasNoFilters && // The stream is not filtered (by username or summary)
!stream.canAppendMore && // We are at the end of the stream
stream.posts.lastObject && // The last post exists
stream.posts.lastObject.read && // The last post is read
stream.gaps && // The stream has gaps
!!stream.gaps.after[stream.posts.lastObject.id] && // Stream ends with a gap
stream.topic.last_read_post_number !==
stream.posts.lastObject.post_number +
stream.get(`gaps.after.${stream.posts.lastObject.id}.length`) // The last post in the gap has not been marked read
) {
newTimings[
stream.posts.lastObject.post_number +
stream.get(`gaps.after.${stream.posts.lastObject.id}.length`)
] = 1;
}
Object.keys(newTimings).forEach(postNumber => {
highestSeen = Math.max(highestSeen, parseInt(postNumber, 10));
});
@ -132,12 +155,12 @@ export default class {
}
})
.then(() => {
const controller = this._topicController;
if (controller) {
const topicController = this._topicController;
if (topicController) {
const postNumbers = Object.keys(newTimings).map(v =>
parseInt(v, 10)
);
controller.readPosts(topicId, postNumbers);
topicController.readPosts(topicId, postNumbers);
}
})
.catch(e => {

View File

@ -230,7 +230,9 @@ export class Tag {
const e = this.element;
const attr = e.attributes;
const pAttr = (e.parent && e.parent.attributes) || {};
const src = attr.src || pAttr.src;
let src = attr.src || pAttr.src;
const base62SHA1 = attr["data-base62-sha1"];
if (base62SHA1) src = `upload://${base62SHA1}`;
const cssClass = attr.class || pAttr.class;
if (cssClass && cssClass.includes("emoji")) {

View File

@ -444,9 +444,9 @@ export function getUploadMarkdown(upload) {
) {
return uploadLocation(upload.url);
} else {
return `[${upload.original_filename} (${I18n.toHumanSize(
upload.filesize
)})|attachment](${upload.short_url})`;
return `[${upload.original_filename}|attachment](${
upload.short_url
}) (${I18n.toHumanSize(upload.filesize)})`;
}
}

View File

@ -609,7 +609,11 @@ export default RestModel.extend({
this.set("loadingLastPost", true);
return this.findPostsByIds([postId])
.then(posts => {
posts.forEach(p => this.appendPost(p));
const ignoredUsers = this.get("currentUser.ignored_users");
posts.forEach(p => {
if (ignoredUsers && ignoredUsers.includes(p.username)) return;
this.appendPost(p);
});
})
.finally(() => {
this.set("loadingLastPost", false);

View File

@ -84,7 +84,7 @@ export default Discourse.Route.extend({
category = categories.find(item => {
return (
item &&
item.type === subCategory.toLowerCase() &&
item[type] === subCategory.toLowerCase() &&
item.parent_category_id === main.id
);
});

View File

@ -1,5 +1,6 @@
{{#create-account email=accountEmail disabled=submitDisabled action=(action "createAccount")}}
{{#unless complete}}
{{plugin-outlet name="create-account-before-modal-body"}}
{{#d-modal-body title="create_account.title" class=(concat (if hasAtLeastOneLoginButton "has-alt-auth") " " (if userFields "has-user-fields"))}}
{{#unless hasAuthOptions}}

View File

@ -1,4 +1,5 @@
{{#login-modal screenX=lastX screenY=lastY loginName=loginName loginPassword=loginPassword secondFactorToken=secondFactorToken action=(action "login")}}
{{plugin-outlet name="login-before-modal-body"}}
{{#d-modal-body title="login.title" class=modalBodyClasses}}
{{#if canLoginLocal}}

View File

@ -35,7 +35,7 @@
<div class='reviewable-filter'>
<label class='filter-label'>{{i18n "review.filters.category"}}</label>
{{category-chooser none="category.all" value=filterCategoryId}}
{{category-chooser none="review.filters.all_categories" value=filterCategoryId}}
</div>
<div class='reviewable-filter topic-filter'>

View File

@ -4,13 +4,17 @@ import { isValidLink } from "discourse/lib/click-track";
import { number } from "discourse/lib/formatter";
import highlightText from "discourse/lib/highlight-text";
const _decorators = [];
let _decorators = [];
// Don't call this directly: use `plugin-api/decorateCooked`
export function addDecorator(cb) {
_decorators.push(cb);
}
export function resetDecorators() {
_decorators = [];
}
export default class PostCooked {
constructor(attrs, decoratorHelper, currentUser) {
this.attrs = attrs;

View File

@ -10,5 +10,6 @@
//= require ./pretty-text/white-lister
//= require ./pretty-text/sanitizer
//= require ./pretty-text/oneboxer
//= require ./pretty-text/context/inline-onebox-css-classes
//= require ./pretty-text/inline-oneboxer
//= require ./pretty-text/upload-short-url

View File

@ -0,0 +1,5 @@
export const INLINE_ONEBOX_LOADING_CSS_CLASS =
"<%= CookedPostProcessor::INLINE_ONEBOX_LOADING_CSS_CLASS %>";
export const INLINE_ONEBOX_CSS_CLASS =
"<%= CookedPostProcessor::INLINE_ONEBOX_CSS_CLASS %>";

View File

@ -1,10 +1,10 @@
import { lookupCache } from "pretty-text/oneboxer";
import { cachedInlineOnebox } from "pretty-text/inline-oneboxer";
import {
cachedInlineOnebox,
INLINE_ONEBOX_LOADING_CSS_CLASS,
INLINE_ONEBOX_CSS_CLASS
} from "pretty-text/inline-oneboxer";
} from "pretty-text/context/inline-onebox-css-classes";
const ONEBOX = 1;
const INLINE = 2;
@ -105,7 +105,7 @@ function applyOnebox(state, silent) {
if (onebox && onebox.title) {
text.content = onebox.title;
attrs.push(["class", INLINE_ONEBOX_CSS_CLASS]);
} else {
} else if (!onebox) {
attrs.push(["class", INLINE_ONEBOX_LOADING_CSS_CLASS]);
}
}

View File

@ -45,6 +45,7 @@ function rule(state) {
case "img":
if (mapped) {
token.attrs[srcIndex][1] = mapped.url;
token.attrs.push(["data-base62-sha1", mapped.base62_sha1]);
} else {
token.attrs[srcIndex][1] = state.md.options.discourse.getURL(
"/images/transparent.png"
@ -73,7 +74,12 @@ function rule(state) {
export function setup(helper) {
const opts = helper.getOptions();
if (opts.previewing) helper.whiteList(["img.resizable"]);
helper.whiteList(["img[data-orig-src]", "a[data-orig-href]"]);
helper.whiteList([
"img[data-orig-src]",
"img[data-base62-sha1]",
"a[data-orig-href]"
]);
helper.registerPlugin(md => {
md.core.ruler.push("upload-protocol", rule);

View File

@ -1,10 +1,9 @@
let _cache = {};
import {
INLINE_ONEBOX_LOADING_CSS_CLASS,
INLINE_ONEBOX_CSS_CLASS
} from "pretty-text/context/inline-onebox-css-classes";
export const INLINE_ONEBOX_LOADING_CSS_CLASS =
"<%= CookedPostProcessor::INLINE_ONEBOX_LOADING_CSS_CLASS %>";
export const INLINE_ONEBOX_CSS_CLASS =
"<%= CookedPostProcessor::INLINE_ONEBOX_CSS_CLASS %>";
const _cache = {};
export function applyInlineOneboxes(inline, ajax) {
Object.keys(inline).forEach(url => {
@ -20,7 +19,8 @@ export function applyInlineOneboxes(inline, ajax) {
_cache[onebox.url] = onebox;
let links = inline[onebox.url] || [];
links.forEach(link => {
$(link).text(onebox.title)
$(link)
.text(onebox.title)
.addClass(INLINE_ONEBOX_CSS_CLASS)
.removeClass(INLINE_ONEBOX_LOADING_CSS_CLASS);
});
@ -32,3 +32,11 @@ export function applyInlineOneboxes(inline, ajax) {
export function cachedInlineOnebox(url) {
return _cache[url];
}
export function applyCachedInlineOnebox(url, onebox) {
return (_cache[url] = onebox);
}
export function deleteCachedInlineOnebox(url) {
return delete _cache[url];
}

View File

@ -1,7 +1,7 @@
import {
INLINE_ONEBOX_CSS_CLASS,
INLINE_ONEBOX_LOADING_CSS_CLASS
} from "pretty-text/inline-oneboxer";
INLINE_ONEBOX_LOADING_CSS_CLASS,
INLINE_ONEBOX_CSS_CLASS
} from "pretty-text/context/inline-onebox-css-classes";
// to match:
// abcd

View File

@ -60,7 +60,7 @@ export default Ember.Mixin.create({
_cleanUpEvents() {
$(document).off("mousedown.select-kit", this._boundMouseDownHandler);
if (this.$header().length) {
if (this.$header()) {
this.$header()
.off("blur.select-kit", this._boundBlurHeaderHandler)
.off("focus.select-kit", this._boundFocusHeaderHandler)
@ -68,7 +68,7 @@ export default Ember.Mixin.create({
.off("keypress.select-kit", this._boundKeypressHeaderHandler);
}
if (this.$filterInput().length) {
if (this.$filterInput()) {
this.$filterInput()
.off("change.select-kit", this._boundChangeFilterInputHandler)
.off("keypress.select-kit", this._boundKeypressFilterInputHandler)

View File

@ -425,24 +425,42 @@
}
}
.modal .modal-body.change-timestamp {
overflow-y: scroll;
form {
display: flex;
input.date-picker,
input[type="time"] {
margin: 0;
}
}
}
.change-timestamp,
.poll-ui-builder {
max-width: 420px;
.date-picker {
min-width: 8em;
}
#date-container {
.pika-single {
position: relative !important; // overriding another important
display: inline-block;
margin-top: 5px;
margin-top: 0.5em;
}
}
.date-picker-wrapper {
min-width: 130px;
margin-right: 0.5em;
.date-picker {
height: 100%;
}
}
input[type="time"] {
width: 7em;
text-align: center;
width: 130px;
}
form {

View File

@ -115,6 +115,7 @@
.d-editor-preview-wrapper {
overflow: auto;
cursor: default;
-webkit-overflow-scrolling: touch;
}
.d-editor-input,

View File

@ -211,6 +211,10 @@ class GroupsController < ApplicationController
raise Discourse::InvalidParameters.new(:limit)
end
if limit > 1000
raise Discourse::InvalidParameters.new(:limit)
end
if offset < 0
raise Discourse::InvalidParameters.new(:offset)
end

View File

@ -176,20 +176,22 @@ class InvitesController < ApplicationController
begin
file = params[:file] || params[:files].first
if File.read(file.tempfile).scan(/\n/).count.to_i > 50000
return render json: failed_json.merge(errors: [I18n.t("bulk_invite.max_rows")]), status: 422
count = 0
invites = []
max_bulk_invites = SiteSetting.max_bulk_invites
CSV.foreach(file.tempfile) do |row|
count += 1
invites.push(email: row[0], groups: row[1], topic_id: row[2]) if row[0].present?
break if count >= max_bulk_invites
end
invites = []
CSV.foreach(file.tempfile) do |row|
invite_hash = { email: row[0], groups: row[1], topic_id: row[2] }
if invite_hash[:email].present?
invites.push(invite_hash)
end
end
if invites.present?
Jobs.enqueue(:bulk_invite, invites: invites, current_user_id: current_user.id)
render json: success_json
if count >= max_bulk_invites
render json: failed_json.merge(errors: [I18n.t("bulk_invite.max_rows", max_bulk_invites: max_bulk_invites)]), status: 422
else
render json: success_json
end
else
render json: failed_json.merge(errors: [I18n.t("bulk_invite.error")]), status: 422
end

View File

@ -89,10 +89,13 @@ class StaticController < ApplicationController
destination = path("/")
if params[:redirect].present? && !params[:redirect].match(login_path)
redirect_location = params[:redirect]
if redirect_location.present? && !redirect_location.is_a?(String)
raise Discourse::InvalidParameters.new(:redirect)
elsif redirect_location.present? && !redirect_location.match(login_path)
begin
forum_uri = URI(Discourse.base_url)
uri = URI(params[:redirect])
uri = URI(redirect_location)
if uri.path.present? &&
(uri.host.blank? || uri.host == forum_uri.host) &&

View File

@ -43,6 +43,7 @@ class Users::OmniauthCallbacksController < ApplicationController
else
@auth_result = authenticator.after_authenticate(auth)
end
DiscourseEvent.trigger(:after_auth, authenticator, @auth_result)
preferred_origin = request.env['omniauth.origin']

View File

@ -1165,6 +1165,7 @@ class UsersController < ApplicationController
# We're likely going to contact the remote auth provider, so hijack request
hijack do
DiscourseEvent.trigger(:before_auth_revoke, authenticator, user)
result = authenticator.revoke(user, skip_remote: skip_remote)
if result
render json: success_json

View File

@ -1,3 +1,4 @@
# coding: utf-8
# frozen_string_literal: true
require 'current_user'
require 'canonical_url'
@ -62,7 +63,8 @@ module ApplicationHelper
if GlobalSetting.use_s3? && GlobalSetting.s3_cdn_url
if GlobalSetting.cdn_url
path = path.gsub(GlobalSetting.cdn_url, GlobalSetting.s3_cdn_url)
folder = ActionController::Base.config.relative_url_root || "/"
path = path.gsub(File.join(GlobalSetting.cdn_url, folder, "/"), File.join(GlobalSetting.s3_cdn_url, "/"))
else
# we must remove the subfolder path here, assets are uploaded to s3
# without it getting involved

View File

@ -17,6 +17,12 @@ module Jobs
def execute_onceoff(args)
SETTINGS.each do |old_setting, new_setting|
if (upload = SiteSetting.get(new_setting)) && upload.id >= Upload::SEEDED_ID_THRESHOLD
logger.warn("Skipping migration of the Site Setting #{new_setting} to url cause upload #{upload} already exists for it")
next
end
old_url = DB.query_single(
"SELECT value FROM site_settings WHERE name = '#{old_setting}'"
).first

View File

@ -63,9 +63,8 @@ module Jobs
system('gzip', '-5', absolute_path)
# create upload
download_link = nil
upload = nil
compressed_file_path = "#{absolute_path}.gz"
file_size = number_to_human_size(File.size(compressed_file_path))
if File.exist?(compressed_file_path)
File.open(compressed_file_path) do |file|
@ -78,16 +77,16 @@ module Jobs
if upload.persisted?
user_export.update_columns(upload_id: upload.id)
download_link = upload.url
else
Rails.logger.warn("Failed to upload the file #{Discourse.base_uri}/export_csv/#{file_name}.gz")
end
end
File.delete(compressed_file_path)
end
ensure
post = notify_user(download_link, file_name, file_size, export_title)
post = notify_user(upload, export_title)
if user_export.present? && post.present?
topic = post.topic
user_export.update_columns(topic_id: topic.id)
@ -388,22 +387,22 @@ module Jobs
screened_url_array
end
def notify_user(download_link, file_name, file_size, export_title)
def notify_user(upload, export_title)
post = nil
if @current_user
post = if download_link.present?
post = if upload
SystemMessage.create_from_system_user(
@current_user,
:csv_export_succeeded,
download_link: download_link,
file_name: "#{file_name}.gz",
file_size: file_size,
download_link: "[#{upload.original_filename}|attachment](#{upload.short_url}) (#{number_to_human_size(upload.filesize)})",
export_title: export_title
)
else
SystemMessage.create_from_system_user(@current_user, :csv_export_failed)
end
end
post
end
end

View File

@ -9,7 +9,6 @@ module Jobs
if post&.topic&.visible?
post_alerter = PostAlerter.new
post_alerter.notify_post_users(post, User.where(id: args[:notified_user_ids]))
post_alerter.notify_first_post_watchers(post, post_alerter.tag_watchers(post.topic))
end
end

View File

@ -71,6 +71,7 @@ module Jobs
filename = File.basename(URI.parse(src).path)
filename << File.extname(hotlinked.path) unless filename["."]
upload = UploadCreator.new(hotlinked, filename, origin: src).create_for(post.user_id)
if upload.persisted?
downloaded_urls[src] = upload.url
downloaded_images[remove_scheme(src)] = upload.id
@ -89,39 +90,39 @@ module Jobs
end
# have we successfully downloaded that file?
if downloaded_urls[src].present?
url = downloaded_urls[src]
escaped_src = Regexp.escape(original_src)
replace_raw = ->(match, match_src, replacement, _index) {
if src.include?(match_src)
raw = raw.gsub(
match,
replacement.sub(InlineUploads::PLACEHOLDER, upload.short_url)
)
end
}
# there are 6 ways to insert an image in a post
# HTML tag - <img src="http://...">
raw.gsub!(/src=["']#{escaped_src}["']/i, "src='#{url}'")
if (original_path = Upload.extract_url(original_src)&.to_s) &&
Upload.extract_url(url)&.to_s
raw.gsub!(
/src=["']\S*#{Regexp.escape(original_path)}["']/i,
"src='#{url}'"
)
end
InlineUploads.match_img(raw, external_src: true, &replace_raw)
# BBCode tag - [img]http://...[/img]
raw.gsub!(/\[img\]#{escaped_src}\[\/img\]/i, "[img]#{url}[/img]")
InlineUploads.match_bbcode_img(raw, external_src: true, &replace_raw)
# Markdown linked image - [![alt](http://...)](http://...)
raw.gsub!(/\[!\[([^\]]*)\]\(#{escaped_src}\)\]/) { "[<img src='#{url}' alt='#{$1}'>]" }
# Markdown inline - ![alt](http://...)
raw.gsub!(/!\[([^\]]*)\]\(#{escaped_src}\)/) { "![#{$1}](#{url})" }
# Markdown inline - ![](http://... "image title")
raw.gsub!(/!\[\]\(#{escaped_src} "([^\]]*)"\)/) { "![](#{url})" }
# Markdown inline - ![alt](http://... "image title")
raw.gsub!(/!\[([^\]]*)\]\(#{escaped_src} "([^\]]*)"\)/) { "![](#{url})" }
# Markdown reference - [x]: http://
raw.gsub!(/\[([^\]]+)\]:\s?#{escaped_src}/) { "[#{$1}]: #{url}" }
InlineUploads.match_md_inline_img(raw, external_src: true, &replace_raw)
# Direct link
raw.gsub!(/^#{escaped_src}(\s?)$/) { "<img src='#{url}'>#{$1}" }
raw.gsub!(/^#{escaped_src}(\s?)$/) { "![](#{upload.short_url})#{$1}" }
end
rescue => e
log(:error, "Failed to pull hotlinked image (#{src}) post: #{post_id}\n" + e.message + "\n" + e.backtrace.join("\n"))
if Rails.env.test?
raise e
else
log(:error, "Failed to pull hotlinked image (#{src}) post: #{post_id}\n" + e.message + "\n" + e.backtrace.join("\n"))
end
end
end
end
@ -147,7 +148,10 @@ module Jobs
def extract_images_from(html)
doc = Nokogiri::HTML::fragment(html)
doc.css("img[src], a.lightbox[href]") - doc.css("img.avatar") - doc.css(".lightbox img[src]")
doc.css("img[src], a.lightbox[href]") -
doc.css("img.avatar") -
doc.css(".lightbox img[src]")
end
def should_download_image?(src)

View File

@ -4,6 +4,9 @@ require_dependency 'single_sign_on'
class DiscourseSingleSignOn < SingleSignOn
class BlankExternalId < StandardError; end
class BannedExternalId < StandardError; end
def self.sso_url
SiteSetting.sso_url
end
@ -48,7 +51,21 @@ class DiscourseSingleSignOn < SingleSignOn
"SSO_NONCE_#{nonce}"
end
BANNED_EXTERNAL_IDS = %w{none nil blank null}
def lookup_or_create_user(ip_address = nil)
# we don't want to ban 0 from being an external id
external_id = self.external_id.to_s
if external_id.blank?
raise BlankExternalId
end
if BANNED_EXTERNAL_IDS.include?(external_id.downcase)
raise BannedExternalId, external_id
end
sso_record = SingleSignOnRecord.find_by(external_id: external_id)
if sso_record && (user = sso_record.user)

View File

@ -89,10 +89,12 @@ class Emoji
def self.load_custom
result = []
CustomEmoji.includes(:upload).order(:name).each do |emoji|
result << Emoji.new.tap do |e|
e.name = emoji.name
e.url = emoji.upload&.url
if !GlobalSetting.skip_db?
CustomEmoji.includes(:upload).order(:name).each do |emoji|
result << Emoji.new.tap do |e|
e.name = emoji.name
e.url = emoji.upload&.url
end
end
end

View File

@ -77,6 +77,22 @@ class GlobalSetting
end
end
def self.skip_db=(v)
@skip_db = v
end
def self.skip_db?
@skip_db
end
def self.skip_redis=(v)
@skip_redis = v
end
def self.skip_redis?
@skip_redis
end
def self.use_s3?
(@use_s3 ||=
begin

View File

@ -209,8 +209,10 @@ class Group < ActiveRecord::Base
end
def cook_bio
if !self.bio_raw.blank?
if self.bio_raw.present?
self.bio_cooked = PrettyText.cook(self.bio_raw)
else
self.bio_cooked = nil
end
end
@ -326,13 +328,13 @@ class Group < ActiveRecord::Base
remove_subquery =
case name
when :admins
"SELECT id FROM users WHERE id <= 0 OR NOT admin"
"SELECT id FROM users WHERE id <= 0 OR NOT admin OR staged"
when :moderators
"SELECT id FROM users WHERE id <= 0 OR NOT moderator"
"SELECT id FROM users WHERE id <= 0 OR NOT moderator OR staged"
when :staff
"SELECT id FROM users WHERE id <= 0 OR (NOT admin AND NOT moderator)"
"SELECT id FROM users WHERE id <= 0 OR (NOT admin AND NOT moderator) OR staged"
when :trust_level_0, :trust_level_1, :trust_level_2, :trust_level_3, :trust_level_4
"SELECT id FROM users WHERE id <= 0 OR trust_level < #{id - 10}"
"SELECT id FROM users WHERE id <= 0 OR trust_level < #{id - 10} OR staged"
end
DB.exec <<-SQL
@ -346,15 +348,15 @@ class Group < ActiveRecord::Base
insert_subquery =
case name
when :admins
"SELECT id FROM users WHERE id > 0 AND admin"
"SELECT id FROM users WHERE id > 0 AND admin AND NOT staged"
when :moderators
"SELECT id FROM users WHERE id > 0 AND moderator"
"SELECT id FROM users WHERE id > 0 AND moderator AND NOT staged"
when :staff
"SELECT id FROM users WHERE id > 0 AND (moderator OR admin)"
"SELECT id FROM users WHERE id > 0 AND (moderator OR admin) AND NOT staged"
when :trust_level_1, :trust_level_2, :trust_level_3, :trust_level_4
"SELECT id FROM users WHERE id > 0 AND trust_level >= #{id - 10}"
"SELECT id FROM users WHERE id > 0 AND trust_level >= #{id - 10} AND NOT staged"
when :trust_level_0
"SELECT id FROM users WHERE id > 0"
"SELECT id FROM users WHERE id > 0 AND NOT staged"
end
DB.exec <<-SQL

View File

@ -63,7 +63,8 @@ class Notification < ActiveRecord::Base
watching_first_post: 17,
topic_reminder: 18,
liked_consolidated: 19,
post_approved: 20
post_approved: 20,
code_review_commit_approved: 21
)
end

View File

@ -897,7 +897,7 @@ class Post < ActiveRecord::Base
links = fragments.css("a/@href", "img/@src").map { |media| media.value }.uniq
links.each do |src|
next if src.blank? || upload_patterns.none? { |pattern| src =~ pattern }
next if src.blank? || upload_patterns.none? { |pattern| src.split("?")[0] =~ pattern }
src = "#{SiteSetting.force_https ? "https" : "http"}:#{src}" if src.start_with?("//")
next unless Discourse.store.has_been_uploaded?(src) || (include_local_upload && src =~ /\A\/[^\/]/i)

View File

@ -131,6 +131,7 @@ class User < ActiveRecord::Base
after_create :set_default_categories_preferences
after_update :trigger_user_updated_event, if: :saved_change_to_uploaded_avatar_id?
after_update :trigger_user_automatic_group_refresh, if: :saved_change_to_staged?
before_save :update_usernames
before_save :ensure_password_is_hashed
@ -144,6 +145,7 @@ class User < ActiveRecord::Base
after_save :expire_old_email_tokens
after_save :index_search
after_save :check_site_contact_username
after_commit :trigger_user_created_event, on: :create
after_commit :trigger_user_destroyed_event, on: :destroy
@ -1416,6 +1418,13 @@ class User < ActiveRecord::Base
private
def trigger_user_automatic_group_refresh
if !staged
Group.user_trust_level_change!(id, trust_level)
end
true
end
def trigger_user_updated_event
DiscourseEvent.trigger(:user_updated, self)
true

View File

@ -58,11 +58,11 @@ class WebHook < ActiveRecord::Base
end
def self.enqueue_object_hooks(type, object, event, serializer = nil)
if type == :flag
Discourse.deprecate("The flags webhook is deprecated. Please use reviewable instead.")
end
if active_web_hooks(type).exists?
if type == :flag
Discourse.deprecate("The flags webhook is deprecated. Please use reviewable instead.")
end
payload = WebHook.generate_payload(type, object, serializer)
WebHook.enqueue_hooks(type, event,

View File

@ -6,11 +6,18 @@ class InlineUploads
PLACEHOLDER = "__replace__"
PATH_PLACEHOLDER = "__replace_path__"
UPLOAD_REGEXP_PATTERN = "/original/(\\dX/(?:[a-f0-9]/)*[a-f0-9]{40}[a-z0-9.]*)"
UPLOAD_REGEXP_PATTERN = "/original/(\\dX/(?:[a-f0-9]/)*[a-f0-9]{40}[a-zA-Z0-9.]*)"
private_constant :UPLOAD_REGEXP_PATTERN
def self.process(markdown, on_missing: nil)
markdown = markdown.dup
match_md_reference(markdown) do |match, src, replacement, index|
if upload = Upload.get_from_url(src)
markdown = markdown.sub(match, replacement.sub!(PATH_PLACEHOLDER, "__#{upload.sha1}__"))
end
end
cooked_fragment = Nokogiri::HTML::fragment(PrettyText.cook(markdown, disable_emojis: true))
link_occurences = []
@ -22,12 +29,11 @@ class InlineUploads
end
if seen_link = matched_uploads(node).first
link_occurences <<
if (actual_link = (node.attributes["href"]&.value || node.attributes["src"]&.value))
{ link: actual_link, is_valid: true }
else
{ link: seen_link, is_valid: false }
end
if (actual_link = (node.attributes["href"]&.value || node.attributes["src"]&.value))
link_occurences << { link: actual_link, is_valid: true }
elsif node.name != "p"
link_occurences << { link: actual_link, is_valid: false }
end
end
end
@ -41,10 +47,6 @@ class InlineUploads
raw_matches << [match, src, replacement, index]
end
match_md_reference(markdown) do |match, src, replacement, index|
raw_matches << [match, src, replacement, index]
end
match_img(markdown) do |match, src, replacement, index|
raw_matches << [match, src, replacement, index]
end
@ -60,7 +62,7 @@ class InlineUploads
]
if Discourse.store.external?
regexps << /(https?:#{SiteSetting.Upload.s3_base_url}#{UPLOAD_REGEXP_PATTERN})/
regexps << /((https?:)?#{SiteSetting.Upload.s3_base_url}#{UPLOAD_REGEXP_PATTERN})/
regexps << /(#{SiteSetting.Upload.s3_cdn_url}#{UPLOAD_REGEXP_PATTERN})/
end
@ -98,7 +100,7 @@ class InlineUploads
end
end
markdown.scan(/((\n|\s)+)#{regexp}/) do |match|
markdown.scan(/(([\n\s\)\]\<])+)#{regexp}/) do |match|
if matched_uploads(match[2]).present?
next if indexes.include?($~.offset(3)[0])
@ -126,7 +128,17 @@ class InlineUploads
end
if !Discourse.store.external?
next if uri&.host && uri.host != Discourse.current_hostname
host = uri&.host
hosts = [Discourse.current_hostname]
if cdn_url = GlobalSetting.cdn_url
hosts << URI(GlobalSetting.cdn_url).hostname
end
if host && !hosts.include?(host)
next
end
end
upload = Upload.get_from_url(link)
@ -141,6 +153,11 @@ class InlineUploads
end
end
markdown.scan(/(__([a-f0-9]{40})__)/) do |match|
upload = Upload.find_by(sha1: match[1])
markdown = markdown.sub(match[0], upload.short_path)
end
markdown
end
@ -157,9 +174,11 @@ class InlineUploads
end
end
def self.match_bbcode_img(markdown)
def self.match_bbcode_img(markdown, external_src: false)
markdown.scan(/(\[img\]\s?(.+)\s?\[\/img\])/) do |match|
yield(match[0], match[1], +"![](#{PLACEHOLDER})", $~.offset(0)[0]) if block_given?
if (matched_uploads(match[1]).present? && block_given?) || external_src
yield(match[0], match[1], +"![](#{PLACEHOLDER})", $~.offset(0)[0])
end
end
end
@ -193,11 +212,11 @@ class InlineUploads
end
def self.match_img(markdown, external_src: false)
markdown.scan(/(<(?!img)[^<>]+\/?>)?(\n*)(([ ]*)<img ([^<>]+)>([ ]*))(\n*)/) do |match|
markdown.scan(/(<(?!img)[^<>]+\/?>)?(\n*)(([ ]*)<img ([^>\n]+)>([ ]*))(\n*)/) do |match|
node = Nokogiri::HTML::fragment(match[2].strip).children[0]
src = node.attributes["src"].value
src = node.attributes["src"]&.value
if matched_uploads(src).present? || external_src
if src && (matched_uploads(src).present? || external_src)
text = node.attributes["alt"]&.value
width = node.attributes["width"]&.value
height = node.attributes["height"]&.value
@ -232,31 +251,42 @@ class InlineUploads
def self.matched_uploads(node)
matches = []
base_url = Discourse.base_url.sub(/https?:\/\//, "(https?://)")
if GlobalSetting.cdn_url
cdn_url = GlobalSetting.cdn_url.sub(/https?:\/\//, "(https?://)")
end
regexps = [
/(upload:\/\/([a-zA-Z0-9]+)[a-z0-9\.]*)/,
/(\/uploads\/short-url\/([a-zA-Z0-9]+)[a-z0-9\.]*)/,
/(upload:\/\/([a-zA-Z0-9]+)[a-zA-Z0-9\.]*)/,
/(\/uploads\/short-url\/([a-zA-Z0-9]+)[a-zA-Z0-9\.]*)/,
/(#{base_url}\/uploads\/short-url\/([a-zA-Z0-9]+)[a-zA-Z0-9\.]*)/,
]
db = RailsMultisite::ConnectionManagement.current_db
if Discourse.store.external?
if Rails.configuration.multisite
regexps << /(#{SiteSetting.Upload.s3_base_url}\/uploads\/#{db}#{UPLOAD_REGEXP_PATTERN})/
regexps << /((https?:)?#{SiteSetting.Upload.s3_base_url}\/uploads\/#{db}#{UPLOAD_REGEXP_PATTERN})/
regexps << /(#{SiteSetting.Upload.s3_cdn_url}\/uploads\/#{db}#{UPLOAD_REGEXP_PATTERN})/
else
regexps << /(#{SiteSetting.Upload.s3_base_url}#{UPLOAD_REGEXP_PATTERN})/
regexps << /((https?:)?#{SiteSetting.Upload.s3_base_url}#{UPLOAD_REGEXP_PATTERN})/
regexps << /(#{SiteSetting.Upload.s3_cdn_url}#{UPLOAD_REGEXP_PATTERN})/
regexps << /(\/uploads\/#{db}#{UPLOAD_REGEXP_PATTERN})/
regexps << /(#{base_url}\/uploads\/#{db}#{UPLOAD_REGEXP_PATTERN})/
regexps << /(#{cdn_url}\/uploads\/#{db}#{UPLOAD_REGEXP_PATTERN})/ if cdn_url
end
else
regexps << /(\/uploads\/#{db}#{UPLOAD_REGEXP_PATTERN})/
regexps << /(#{base_url}\/uploads\/#{db}#{UPLOAD_REGEXP_PATTERN})/
regexps << /(#{cdn_url}\/uploads\/#{db}#{UPLOAD_REGEXP_PATTERN})/ if cdn_url
end
node = node.to_s
regexps.each do |regexp|
node.scan(regexp) do |matched|
matches << matched[0]
node.scan(/(^|[\n\s"'\(>])#{regexp}($|[\n\s"'\)<])/) do |matched|
matches << matched[1]
end
end

View File

@ -35,6 +35,11 @@ unless Rails.env.test? && ENV['LOAD_PLUGINS'] != "1"
end
GlobalSetting.load_defaults
if ENV['SKIP_DB_AND_REDIS'] == '1'
GlobalSetting.skip_db = true
GlobalSetting.skip_redis = true
end
require 'pry-rails' if Rails.env.development?
if defined?(Bundler)

View File

@ -1,5 +1,10 @@
# frozen_string_literal: true
if GlobalSetting.skip_redis?
MessageBus.configure(backend: :memory)
return
end
MessageBus.site_id_lookup do |env = nil|
if env
setup_message_bus_env(env)

View File

@ -5,6 +5,13 @@
# the original version
Discourse.git_version
if GlobalSetting.skip_redis?
require 'site_settings/local_process_provider'
Rails.cache = Discourse.cache
SiteSetting.provider = SiteSettings::LocalProcessProvider.new
return
end
reload_settings = lambda {
RailsMultisite::ConnectionManagement.safe_each_connection do
begin

View File

@ -1,5 +1,7 @@
# frozen_string_literal: true
return if GlobalSetting.skip_db?
# Some sanity checking so we don't count on an unindexed column on boot
begin
if ActiveRecord::Base.connection.table_exists?(:users) &&

View File

@ -97,7 +97,7 @@ end
DiscourseEvent.on(:reviewable_transitioned_to) do |status, reviewable|
WebHook.enqueue_object_hooks(:reviewable, reviewable, :reviewable_transitioned_to, reviewable.serializer)
# TODO: Backwards compatibility for Queued Post webhooks. Remve in favor of Reviewable API
# TODO: Backwards compatibility for Queued Post webhooks. Remove in favor of Reviewable API
if reviewable.is_a?(ReviewableQueuedPost)
if reviewable.approved?
WebHook.enqueue_object_hooks(:queued_post, reviewable, :approved_post, QueuedPostSerializer)

View File

@ -1,5 +1,12 @@
# frozen_string_literal: true
if GlobalSetting.skip_redis?
if Rails.logger.respond_to? :chained
Rails.logger = Rails.logger.chained.first
end
return
end
if Rails.env.development? && RUBY_VERSION.match?(/^2\.5\.[23]/)
STDERR.puts "WARNING: Discourse development environment runs slower on Ruby 2.5.3 or below"
STDERR.puts "We recommend you upgrade to Ruby 2.6.1 for the optimal development performance"
@ -137,6 +144,8 @@ RailsMultisite::ConnectionManagement.each_connection do
end
if Rails.configuration.multisite
chained = Rails.logger.chained
chained && chained.first.formatter = RailsMultisite::Formatter.new
if Rails.logger.respond_to? :chained
chained = Rails.logger.chained
chained && chained.first.formatter = RailsMultisite::Formatter.new
end
end

View File

@ -1,5 +1,7 @@
# frozen_string_literal: true
return if GlobalSetting.skip_db?
require_dependency 'webpush'
if SiteSetting.vapid_public_key.blank? || SiteSetting.vapid_private_key.blank? || SiteSetting.vapid_public_key_bytes.blank?

View File

@ -1,6 +1,6 @@
# frozen_string_literal: true
if (Rails.env.production? && SiteSetting.logging_provider == 'lograge') || ENV["ENABLE_LOGRAGE"]
if (Rails.env.production? && SiteSetting.logging_provider == 'lograge') || (ENV["ENABLE_LOGRAGE"] == "1")
require 'lograge'
if Rails.configuration.multisite

View File

@ -372,6 +372,7 @@ ar:
save: "احفظ"
cancel: "ألغِ"
filters:
all_categories: "(جميع الأقسام)"
type:
title: "النوع"
refresh: "تحديث"
@ -627,6 +628,7 @@ ar:
private_messages: "الرسائل"
user_notifications:
ignore_duration_username: "اسم المستخدم"
ignore_duration_save: "تجاهل"
mute_option: "مكتومة"
normal_option: "عادي"
activity_stream: "النّشاط"
@ -2072,8 +2074,10 @@ ar:
title: "مكتومة"
description: "لن يتم إشعارك بأي موضوعات جديدة في هذه الأقسام ولن يتم عرضها في قائمة الموضوعات المنشورة مؤخراً."
search_priority:
label: "أولوية البحث"
options:
normal: "عادي"
ignore: "تجاهل"
sort_options:
default: "افترضى"
likes: "الاعجابات"
@ -2093,6 +2097,7 @@ ar:
boxes_with_featured_topics: "مربعات مع الموضوعات المميزة"
settings_sections:
general: "عام"
appearance: "الظهور"
email: "البريد الإلكتروني"
flagging:
title: "شكرا لمساعدتك في إبقاء مجتمعنا متحضرا."

View File

@ -3630,7 +3630,7 @@ cs:
granted_badges: Udělené odznaky
grant: Udělit
no_user_badges: "%{name} nezískal žádné oznaky."
no_badges: "Nejsou tu žádné odznaky, které by se dali rozdat."
no_badges: "Nejsou tu žádné odznaky, které by se daly rozdat."
none_selected: "Vyberte odznak, abyste mohli začít"
allow_title: Povolit užití odzanku jako titul
multiple_grant: Může být přiděleno několikrát

View File

@ -376,8 +376,9 @@ de:
edit: "Bearbeiten"
save: "Speichern"
cancel: "Abbrechen"
new_topic: "Neues Thema:"
new_topic: "Das Bestätigen dieses Elements wird ein neues Thema erstellen"
filters:
all_categories: "(alle Kategorien)"
type:
title: "Typ"
all: "(alle Arten)"
@ -392,7 +393,7 @@ de:
created_at_asc: "Erstellt am (umgekehrt)"
priority:
title: "Minimale Priorität"
low: "Niedrig"
low: "(irgendein)"
medium: "Mittel"
high: "Hoch"
conversation:
@ -417,9 +418,9 @@ de:
deleted:
title: "Gelöscht"
reviewed:
title: "(Alle überprüft)"
title: "(alle überprüft)"
all:
title: "(Alles)"
title: "(alles)"
types:
reviewable_flagged_post:
title: "Gemeldeter Beitrag"

View File

@ -436,6 +436,7 @@ en:
new_topic: "Approving this item will create a new topic"
filters:
all_categories: "(all categories)"
type:
title: "Type"
all: "(all types)"
@ -451,7 +452,7 @@ en:
priority:
title: "Minimum Priority"
low: "Low"
low: "(any)"
medium: "Medium"
high: "High"
@ -478,9 +479,9 @@ en:
deleted:
title: "Deleted"
reviewed:
title: "(All Reviewed)"
title: "(all reviewed)"
all:
title: "(Everything)"
title: "(everything)"
types:
reviewable_flagged_post:

View File

@ -376,8 +376,9 @@ es:
edit: "Editar"
save: "Guardar"
cancel: "Cancelar"
new_topic: "Nuevo tema:"
new_topic: "Aprobar este item creará un tema nuevo"
filters:
all_categories: "(todas las categorías)"
type:
title: "Tipo"
all: "(todos los tipos)"
@ -392,7 +393,7 @@ es:
created_at_asc: "Creado el (inverso)"
priority:
title: "Prioridad mínima"
low: "Bajo"
low: "(cualquiera)"
medium: "Medio"
high: "Alto"
conversation:
@ -417,9 +418,9 @@ es:
deleted:
title: "Eliminado"
reviewed:
title: "(Todo revisado)"
title: "(todo revisado)"
all:
title: "(Todo)"
title: "(todo)"
types:
reviewable_flagged_post:
title: "Publicación reportada"

View File

@ -296,6 +296,7 @@ et:
save: "Salvesta"
cancel: "Tühista"
filters:
all_categories: "(kõik kategooriad)"
type:
title: "Liik"
refresh: "Värskenda"

View File

@ -375,8 +375,9 @@ fa_IR:
edit: "ویرایش"
save: "ذخیره"
cancel: "لغو کردن"
new_topic: "مبحث جدید:"
new_topic: "تایید این مورد یک مبحث جدید ایجاد خواهد کرد."
filters:
all_categories: "(تمام دسته بندی ها)"
type:
title: "نوع"
all: "(همه نوع)"
@ -391,7 +392,7 @@ fa_IR:
created_at_asc: "ساخته شده (برعکس)"
priority:
title: "کمترین اولویت"
low: "کم"
low: "(هر چی)"
medium: "متوسط"
high: "بالا"
conversation:
@ -416,9 +417,9 @@ fa_IR:
deleted:
title: "حذف شده"
reviewed:
title: "(همه بازنگری ها)"
title: "(همه مرور شده)"
all:
title: "(همه چیز)"
title: "(همه)"
types:
reviewable_flagged_post:
title: "نوشته پرچم شده"
@ -776,15 +777,20 @@ fa_IR:
watched_first_post_tags: "درحال مشاهده نوشته اول"
watched_first_post_tags_instructions: "از اولین نوشته هر موضوع که شامل این برچسب‌ها باشد مطلع خواهید شد."
muted_categories: "بی‌صدا شد"
muted_categories_instructions: "شما درباره هیچ اتفاقی در این دسته بندی آگاهسازی دریافت نمیکنید و آن ها در دسته بندی ها و یا صفحه تازه ها نمایش داده نخواهند شد."
muted_categories_instructions_dont_hide: "شما درباره هیچ اتفاقی در این دسته بندی آگاهسازی دریافت نمیکنید."
no_category_access: "به عنوان یک مدیر دسترسی محدودی به این دسته بندی دارید، ذخیره سازی غیر فعال است."
delete_account: "حساب‌کاربری من را پاک کن"
delete_account_confirm: "آیا مطمئنید که می‌خواهید شناسه‌تان را برای همیشه پاک کنید؟ برگشتی در کار نیست!"
deleted_yourself: "حساب‌ کاربری شما با موفقیت حذف شد."
delete_yourself_not_allowed: "اگر مایل هستید حساب کاربری تان حذف شود با یکی از مدیران تماس بگیرید."
unread_message_count: "پیام‌ها"
admin_delete: "پاک کردن"
users: "کاربران"
muted_users: "بی صدا شده"
muted_users_instructions: "متوقف کردن تمام اطلاعیه ها از طرف این کاربران."
ignored_users: "صرف نظر شده"
ignored_users_instructions: "تمام نوشته ها و اگاه سازی ها از این کاربران را خاموش کنید."
muted_topics_link: "نمایش موضوعات بی‌صدا شده"
watched_topics_link: "نمایش موضوعات مشاهده شده"
tracked_topics_link: "نمایش موضوعات پی‌گیری شده"
@ -793,8 +799,10 @@ fa_IR:
revoke_access: "لغو دسترسی"
undo_revoke_access: "بازنشانی لغو دسترسی"
api_approved: "تایید شده:"
api_last_used_at: "آخرین بار استفاده شده در"
theme: "قالب"
home: "صفحه خانگی پیشفرض"
staged: "کاربر از راه دور"
staff_counters:
flags_given: "پرچم گذاری‌های مفید"
flagged_posts: "نوشته های پرچم گذاری شده"
@ -832,16 +840,25 @@ fa_IR:
choose_new: "یک رمز‌عبور جدید وارد کنید"
choose: "یک رمز‌عبور وارد کنید"
second_factor_backup:
title: "کدهای پشتیبان دو عامله"
regenerate: "ایجاد مجدد"
disable: "ازکاراندازی"
enable: "فعال کردن"
enable_long: "کدهای پشتیبان را به کار بگیر"
manage: "کدهای پشتیبان را مدیریت کن"
copied_to_clipboard: "کپی شد"
copy_to_clipboard_error: "خطا در کپی اطلاعات"
remaining_codes: "شما <strong>{{count}}</strong>کد پشتیبان باقی مانده دارید."
use: "<a href>از کد پشتیبان استفاده کن</a>"
codes:
title: "کد پشتیبان تولید شد"
description: "هر کدام از این کدهای پشتیبان فقط یک بار قابل استفاده است. آن ها را در جای امن و قابل دسترسی نگه دارید."
second_factor:
title: "احراز هویت دو مرحله ای"
disable: "احراز هویت دوعامله را از کار بینداز"
enable: "احراز هویت دو عامله را فعال کن"
confirm_password_description: "لطفا رمز عبور خود را تایید کنید تا ادامه دهیم."
label: "کد"
rate_limit: "لطفا قبل از اینکه کد احراز هویت دیگری را تست کنید کمی صبر کنید"
enable_description: |
این کد QR را در یک اپلیکیشن مورد تایید (<a href="https://www.google.com/search?q=authenticator+apps+for+android" target="_blank">آندروید</a> -- <a href="https://www.google.com/search?q=authenticator+apps+for+ios" target="_blank">IOS</a>) و کد احراز هویت خود را وارد کنید.
@ -934,6 +951,7 @@ fa_IR:
ip: "IP"
details: "جزئیات"
log_out_all: "از همه خارج شو"
active: "الان فعال است"
not_you: "شما نیستید؟"
show_all: "نمایش همه ({{count}})"
show_few: "کمتر نشان بده"
@ -951,13 +969,17 @@ fa_IR:
website: "تارنما"
email_settings: "ایمیل"
hide_profile_and_presence: "نمایه کاربری و حضور من را مخفی کن"
enable_physical_keyboard: "پشتیبانی کی بورد فیزیکی را در آی پد فعال کن"
text_size:
title: "سایز قلم متن"
smaller: "کوچکتر"
normal: "معمولی"
larger: "بزرگتر"
largest: "بزرگترین"
title_count_mode:
title: "عنوان صفحه ی بک گراند تعداد زیر را نمایش دهد:"
notifications: "آگاهسازی جدید"
contextual: "محتوای تازه ی صفحه"
like_notification_frequency:
title: "وقتی پسندیده شد اعلام کن"
always: "همیشه"
@ -970,6 +992,7 @@ fa_IR:
always: "همیشه"
never: "هیچوقت"
email_digests:
title: "وقتی به اینجا سر نمیزنم، ایمیلی از خلاصه ی موضوعات و پاسخ های محبوب برای بفرست."
every_30_minutes: "هر 30 دقیقه"
every_hour: "هر ساعت"
daily: "روزانه"
@ -979,6 +1002,7 @@ fa_IR:
email_level:
title: "وقتی کسی نوشته‌های من را نقل‌قول کرد، یا به من پاسخ داد، یا به @نام‌کاربری من اشاره کرد، یا به موضوعی دعوت کرد، ایمیل بفرست."
always: "همیشه"
only_when_away: "فقط وقتی نیستم"
never: "هیچوقت"
email_messages_level: "وقتی کسی به من پیام خصوصی فرستاد، ایمیل بفرست"
include_tl0_in_digests: "محتوای ایجاد شده توسط کاربران جدید در ایمیل خلاصه قرار گیرد."
@ -1010,6 +1034,7 @@ fa_IR:
title: "دعوت‌ها"
user: "کاربر دعوت شده"
sent: "ارسال شده"
none: "هیچ دعوتنامه ای برای نمایش نیست"
truncated:
one: "نمایش {{count}} دعوت اول."
other: "نمایش {{count}} دعوت اول."
@ -1025,6 +1050,9 @@ fa_IR:
expired: "این دعوت منقضی شده است."
rescind: "پاک کردن"
rescinded: "دعوت حذف شد"
rescind_all: "تمام دعوتنامه های منقضی شده را پاک کن"
rescinded_all: "تمام دعوت نامه های منقضی شده حذف شدند!"
rescind_all_confirm: "مطمئنی می‌خواهی تمام دعوتنامه های منقضی شده را پاک کنی؟"
reinvite: "ارسال دوباره دعوت"
reinvite_all: "ارسال مجدد تمام دعوت‌ها"
reinvite_all_confirm: "آیا از ارسال مجدد تمامی دعوت‌ها اطمینان دارید؟"
@ -1042,6 +1070,7 @@ fa_IR:
text: "دعوت گروهی از طریق فایل"
success: "فایل با موفقیت بارگذاری شد٬ وقتی که پروسه تمام شد به شما را از طریق پیام اطلاع می دهیم. "
error: "با عرض پوزش، نوع فایل باید CSV باشد."
confirmation_message: "میخواهید به همه ی افراد فایل اپلود شده دعوتنامه بفرستید"
password:
title: "رمزعبور"
too_short: "رمز عبورتان خیلی کوتاه است"
@ -1061,9 +1090,18 @@ fa_IR:
post_count:
one: "نوشته‌ها ساخته شدند"
other: "نوشته‌ها ساخته شدند"
likes_given:
one: "داده شده"
other: "داده شده"
likes_received:
one: "دریافت شده"
other: "دریافت شده"
days_visited:
one: "روز‌هایی که بازدید شده"
other: "روز‌هایی که بازدید شده"
topics_entered:
one: "مبحث بازدید شده"
other: "مباحث بازدید شده"
posts_read:
one: "نوشته‌های خوانده شده"
other: "نوشته‌های خوانده شده"
@ -1085,6 +1123,7 @@ fa_IR:
most_liked_users: "بیشترین پسندیده شده"
most_replied_to_users: "بیشترین پاسخ به"
no_likes: "بدون پسندیده شدن."
top_categories: "داغ ترین دسته بندی ها"
topics: "موضوعات"
replies: "پاسخ‌ها"
ip_address:
@ -1171,6 +1210,9 @@ fa_IR:
disable: "نشان دادن نوشته‌های حذف شده"
private_message_info:
title: "پیام"
invite: "فراخواندن دیگران ..."
edit: "حذف یا اضافه ... "
leave_message: "واقعا میخواهید این پیام را ترک کنید؟"
remove_allowed_user: "آیا واقعا می خواهید اسم {{name}} از پیام برداشته شود ؟ "
remove_allowed_group: "آیا از حذف {{name}} از این پیام اطمینان دارید؟"
email: "ایمیل"
@ -1197,6 +1239,8 @@ fa_IR:
button_ok: "اوکی"
button_help: "کمک"
email_login:
link_label: "یک لینک ورود به من ایمیل کن"
button_label: "با ایمیل"
complete_username_not_found: "هیچ حساب کاربری که با <b>%{username}</b> همخوانی داشته باشد پیدا نشد"
complete_email_not_found: "هیچ حساب کاربری که <b>%{email}</b> همخوانی داشته باشد پیدا نشد"
login:
@ -1204,10 +1248,17 @@ fa_IR:
username: "کاربر"
password: "رمز‌عبور"
second_factor_title: "احراز هویت دو مرحله ای"
second_factor_description: "لطفا کد احراز هویت از اپ را وارد کنید:"
second_factor_backup: "<a href>ورود با کد پشتیبان</a>"
second_factor_backup_title: "پشتیبان دو عامله"
second_factor_backup_description: "لطفا یکی از کدهای پشتیبان را وارد کنید:"
second_factor: "<a href>ورود با اپلیکیشن احراز هویت</a>"
email_placeholder: "ایمیل یا نام‌کاربری"
caps_lock_warning: "Caps Lock روشن است"
error: "خطای ناشناخته"
cookies_error: "بروسر شما به نظر کوکی را غیرفعال کرده است. بدون فعالسازی آن نمیتوانید ورود کنید."
rate_limit: "لطفا قبل از ورود مجدد اندکی صبر کنید"
blank_username: "لطفا ایمیل یا نام کاربری خود را وارد کنید"
blank_username_or_password: "لطفا نام‌کاربری یا ایمیل خود ، و رمز‌عبور وارد نمایید."
reset_password: "باز‌یابی رمز عبور"
logging_in: "در حال ورود..."
@ -1238,12 +1289,15 @@ fa_IR:
title: "با توییتر"
message: "احراز هویت با توئیتر (مطمئن شوید که بازدارنده‌های pop up فعال نباشند)"
instagram:
name: "اینستاگرام"
title: "با اینستاگرام"
message: "ورود با اینستاگرام (مطمئن شوید که بازدارنده‌های pop up فعال نباشند)"
facebook:
name: "فیس بوک"
title: "با فیسبوک"
message: "اعتبارسنجی با فیسبوک (مطمئن شوید که بازدارنده‌های pop up فعال نباشند)"
github:
name: "گیت هاب"
title: "با گیت‌هاب"
message: "اعتبارسنجی با گیت‌هاب (مطمئن شوید که بازدارنده‌های pop up فعال نباشند)"
invites:
@ -1265,24 +1319,60 @@ fa_IR:
twitter: "توئیتر"
emoji_one: "ایموجی وان"
win10: "ویندوز 10"
google_classic: "گوگل کلاسیک"
facebook_messenger: "پیامرسان فیس بوک"
category_page_style:
categories_only: "فقط دسته‌بندی‌ها"
categories_with_featured_topics: "دسته‌بندی هایی که دارای موضوعات برجسته هستند"
categories_and_latest_topics: "دسته‌بندی‌ها و آخرین موضوعات"
categories_and_top_topics: "دسته بندی ها و مباحث داغ"
categories_boxes: "باکس هایی با زیر دسته بندی ها"
categories_boxes_with_topics: "باکس هایی با مباحث ویژه"
shortcut_modifier_key:
shift: "Shift"
ctrl: "Ctrl"
alt: "Alt"
enter: "وارد شدن "
conditional_loading_section:
loading: بارگذاری...
category_row:
topic_count: "{{count}} مبحث در این دسته بندی"
select_kit:
default_header_text: انتخاب...
no_content: چیزی یافت نشد.
filter_placeholder: جستجو...
filter_placeholder_with_any: "جستجو کنید یا بسازید ... "
create: "بسازید `{{content}}`"
max_content_reached:
one: "شما فقط {{count}}مورد میتوانید انتخاب کنید"
other: "شما فقط {{count}} مورد میتوانید انتخاب کنید"
min_content_not_reached:
one: "لطفا حداقل {{count}} ایتم را انتخاب کنید"
other: "لطفا حداقل {{count}}ایتم را انتخاب کنید"
emoji_picker:
filter_placeholder: جستجوی شکلک
smileys_&_emotion: احساس ها و لبخندها
people_&_body: افراد و بدن
animals_&_nature: حیوانات و طبیعت
food_&_drink: غذا و نوشیدنی
travel_&_places: مسافرت و مکان ها
activities: فعالیت ها
objects: اشیا
symbols: نشانه ها
flags: پرچم‌ها
custom: ایموجی های مخصوص
recent: اخیرا استفاده شده
default_tone: بدون رنگ خاص
light_tone: رنگ پوست روشن
medium_light_tone: رنگ پوست متوسط روشن
medium_tone: رنگ پوست روشن
medium_dark_tone: رنگ پوست روشن تیره
dark_tone: رنگ پوست تیره
shared_drafts:
title: "درفت مشترک"
destination_category: "دسته بندی مقصد"
publish: "درفت مشترک را منتشر کن"
publishing: "مبحث در حال انتشار"
composer:
emoji: "شکلک :)"
more_emoji: "بیشتر..."
@ -1317,6 +1407,7 @@ fa_IR:
cancel: "لغو کردن"
create_topic: "ایجاد موضوع"
create_pm: "پیام"
edit_shared_draft: "ویرایش درفت مشترک"
title: "یا Ctrl+Enter را بفشارید"
users_placeholder: "افزودن یک کاربر"
title_placeholder: "در یک جمله‌ی کوتاه بگویید که این موضوع در چه موردی است؟"
@ -1326,6 +1417,7 @@ fa_IR:
topic_featured_link_placeholder: "پیوندی که با عنوان نمایش داده می‌شود را وارد کنید."
remove_featured_link: "حذف لینک از موضوع"
reply_placeholder: "اینجا بنویسید. از Markdown, BBCode و یا HTML برای قالب‌بندی متن استفاده کنید. عکس ها را بکشید و یا بچسبانید کنید."
reply_placeholder_choose_category: "قبل از نوشتن در اینجا یک دسته بندی انتخاب کنید"
view_new_post: "نوشته جدیدتان را ببینید."
saving: "در‌حال ذخیره"
saved: "ذخیره شد!"
@ -1344,6 +1436,7 @@ fa_IR:
link_description: "توضیحات لینک را اینجا وارد کنید."
link_dialog_title: "افزودن پیوند"
link_optional_text: "عنوان اختیاری"
link_url_placeholder: "https://example.com"
quote_title: "نقل‌قول"
quote_text: "نقل‌قول"
code_title: "متن قالب‌بندی شده"
@ -1354,9 +1447,12 @@ fa_IR:
olist_title: "فهرست شماره گذاری شده"
ulist_title: "فهرست نقطه‌ای"
list_item: "فهرست موارد"
toggle_direction: "تغییر جهت"
help: "راهنمای ویرایش با Markdown"
collapse: "کوچک سازی پنل نوشتن"
open: "پنل کامپوزر را باز کنید"
abandon: "پنل نوشتن را ببند و پیش‌نویس را حذف کن"
enter_fullscreen: "کامپوزر تمام صفحه"
modal_ok: "تایید"
modal_cancel: "لغو"
cant_send_pm: "متاسفانه , شما نمیتوانید به %{username} پیام بفرستید."
@ -1366,7 +1462,14 @@ fa_IR:
admin_options_title: "تنظیمات اختیاری مدیران برای این موضوع"
composer_actions:
reply: پاسخ
draft: درفت
edit: ویرایش
reply_as_private_message:
label: پیام جدید
desc: یک پیام شخصی جدید بساز
reply_to_topic:
label: پاسخ به مبحث
desc: به مبحث اصلی پاسخ بده و نه هیچ کدام از نوشته ها
create_topic:
label: "موضوع جدید"
notifications:
@ -1381,6 +1484,25 @@ fa_IR:
none: "قادر به بارگیری اعلان‌ها در این زمان نیستیم."
empty: "اعلانی پیدا نشد."
more: "نمایش اعلان‌های قدیمی‌تر"
mentioned: "<span>{{username}}</span>{{description}}"
group_mentioned: "<span>{{username}}</span>{{description}}"
quoted: "<span>{{username}}</span>{{description}}"
replied: "<span>{{username}}</span>{{description}}"
posted: "<span>{{username}}</span>{{description}}"
edited: "<span>{{username}}</span>{{description}}"
liked: "<span>{{username}}</span>{{description}}"
liked_2: "<span>{{username}}،{{username2}}</span>{{description}}"
liked_many:
one: "<span>{{username}}،{{username2}}و %{count} دیگر</span>{{description}}"
other: "<span>{{username}}،{{username2}}و {{count}} دیگر</span>{{description}}"
liked_consolidated: "<span>{{username}}</span>{{description}}"
private_message: "<span>{{username}}</span>{{description}}"
invited_to_private_message: "<p><span>{{username}}</span>{{description}}"
invited_to_topic: "<span>{{username}}</span>{{description}}"
invitee_accepted: "<span>{{username}}</span>دعوت شما را پذیرفت"
moved_post: "<span>{{username}}</span> منتقل کرد {{description}}"
linked: "<span>{{username}}</span>{{description}}"
topic_reminder: "<span>{{username}}</span>{{description}}"
popup:
mentioned: '{{username}} در "{{topic}}" - {{site_title}} به شما اشاره کرد'
group_mentioned: '{{username}} به شما در "{{topic}}" - {{site_title}} اشاره نمود'
@ -1530,7 +1652,11 @@ fa_IR:
move_to_inbox:
title: "انتقال به صندوق دریافت"
help: "بازگرداندن پیام به صندوق دریافتی"
edit_message:
help: "ویرایش اولین نوشته از پیام"
title: "ویرایش پیام"
defer:
help: "علامت به عنوان خوانده نشده"
title: " واگذار کردن"
list: "موضوعات"
new: "موضوع جدید"
@ -1578,11 +1704,13 @@ fa_IR:
jump_reply_down: رفتن به پاسخ بعدی
deleted: "موضوع پاک شده است"
topic_status_update:
title: "زمانسنج مبحث"
save: "تنظیم زمان‌سنج"
num_of_hours: "تعداد ساعت:"
remove: "حذف زمان‌سنج"
publish_to: "انتشار در:"
when: "در زمان:"
public_timer_types: زمانسنجهای مبحث
time_frame_required: یک بازه ی زمانی انتخاب کنید
auto_update_input:
later_today: "امروز"
@ -1590,7 +1718,11 @@ fa_IR:
later_this_week: "این هفته"
this_weekend: "آخر هفته"
next_week: "هفته بعد"
two_weeks: "دو هفته"
next_month: "ماه بعد"
two_months: "دو ماه"
three_months: "سه ماه"
four_months: "چهار ماه"
pick_date_and_time: "انتخاب زمان و تاریخ"
set_based_on_last_post: "بستن با توجه به آخرین نوشته"
publish_to_category:
@ -1710,6 +1842,7 @@ fa_IR:
help: "سنجاق وضعیت این موضوع را بردارید که پس از آن دیگر این موضوع در بالای فهرست موضوعات شما دیده نشود."
share:
title: "اشتراک گذاری"
extended_title: "به اشتراک گذاری یک پیوند"
help: "اشتراک‌گذاری یک پیوند برای این موضوع"
print:
title: "چاپ"
@ -1777,9 +1910,14 @@ fa_IR:
one: "{{count}} نوشته"
other: "{{count}} نوشته"
cancel: "حذف فیلتر"
move_to:
title: "انتقال به"
action: "انتقال به"
error: "در انتقال نوشته ها خطایی رخ داد"
split_topic:
title: "انتقال به موضوع جدید"
action: "انتقال به موضوع جدید"
topic_name: "موضوع جدید"
radio_label: "موضوع جدید"
error: "یک مشکل در انتقال نوشته‌ها به موضوع جدید پیش آمد."
instructions:
@ -1789,10 +1927,14 @@ fa_IR:
title: "انتقال به موضوع موجود"
action: "انتقال به موضوع موجود"
error: "یک خطا در انتقال نوشته‌ها به آن موضوع وجود داشت."
radio_label: "موضوع قدیمی"
instructions:
one: "لطفاً موضوعی را که قصد دارید تا <b>{{count}}</b> نوشته‌ را به آن انتقال دهید، انتخاب نمایید."
other: "لطفاً موضوعی را که قصد دارید تا <b>{{count}}</b> نوشته‌ را به آن انتقال دهید، انتخاب نمایید."
move_to_new_message:
title: "انتقال به پیام جدید"
action: "انتقال به پیام جدید"
message_title: "پیام جدید"
radio_label: "پیام جدید"
merge_posts:
title: "ادغام نوشته‌های انتخاب شده"
@ -1965,6 +2107,8 @@ fa_IR:
tags: "برچسب‌ها"
tags_placeholder: "(اختیاری) فهرست برچسب‌های قابل استفاده"
tag_groups_placeholder: "(اختیاری) لیست برچسب‌های قابل استفاده‌ی گروه"
manage_tag_groups_link: "گروه‌های تگ‌ها را اینجا ویرایش کنید"
allow_global_tags_label: "اجازه‌ی تگ‌های دیگر را هم بده"
topic_featured_link_allowed: "اجازه‌ی لینک‌های برجسته در این دسته‌بندی"
delete: "حذف دسته‌بندی"
create: "دسته‌بندی جدید"
@ -2986,6 +3130,7 @@ fa_IR:
staff: "همکاران"
suspended: "تعلیق شد "
suspect: "مشکوک"
staged: "کاربر از راه دور"
approved: "تایید شده ؟"
titles:
active: "کاربران فعال"

View File

@ -153,6 +153,7 @@ fi:
bootstrap_mode_disabled: "Aloitustila poistetaan seuraavan 24 tunnin aikana."
themes:
default_description: "Oletus"
broken_theme_alert: "Teemassa / komponentissa %{theme} on virheitä, jotka voivat aiheuttaa sen, ettei sivustosi toimi. Voit ottaa sen käytöstä täällä: %{path}."
s3:
regions:
ap_northeast_1: "Aasia ja Tyynimeri (Tokio)"
@ -307,6 +308,7 @@ fi:
search: "Etsi keskustelua otsikon perusteella:"
placeholder: "kirjoita keskustelun otsikko tähän"
review:
order_by: "Järjestä"
in_reply_to: "vastauksena"
claim_help:
optional: "Voit vaatia tämän itsellesi, jolloin muut eivät voi käsitellä sitä."
@ -374,8 +376,9 @@ fi:
edit: "Muokkaa"
save: "Tallenna"
cancel: "Peru"
new_topic: "Uusi ketju:"
new_topic: "Tämän hyväksyminen aloittaa uuden ketjun"
filters:
all_categories: "(kaikki alueet)"
type:
title: "Tyyppi"
all: "(kaikki tyypit)"
@ -384,7 +387,6 @@ fi:
status: "Tila"
category: "Alue"
priority:
low: "Matala"
medium: "Keskiverto"
high: "Korkea"
conversation:
@ -407,10 +409,6 @@ fi:
title: "Sivuutettu"
deleted:
title: "Poistett"
reviewed:
title: "(Kaikki käsitellyt)"
all:
title: "(Kaikki)"
types:
reviewable_flagged_post:
title: "Liputettu viesti"
@ -1552,7 +1550,24 @@ fi:
confirm_body: "Onnistui! Ilmoitukset ovat nyt käytössä."
custom: "Ilmoitus käyttäjältä {{username}} sivustolla %{site_title}"
titles:
mentioned: "mainitsi"
replied: "uusi vastaus"
quoted: "lainasi"
edited: "muokkasi"
liked: "uusi tykkäys"
private_message: "uusi yksityisviesti"
invited_to_private_message: "kutsuttiin yksityiskeskusteluun"
invitee_accepted: "kutsu hyväksyttiin"
posted: "uusi viesti"
moved_post: "viesti siirrettiin"
linked: "linkitti"
granted_badge: "ansiomerkki myönnettiin"
invited_to_topic: "kutsuttiin ketjuun"
group_mentioned: "ryhmä mainittiin"
group_message_summary: "uusia ryhmäyksityisviestejä"
watching_first_post: "uusi ketju"
topic_reminder: "ketjumuistutus"
liked_consolidated: "uusia tykkäyksiä"
post_approved: "viesti hyväksytty"
upload_selector:
title: "Lisää kuva"
@ -1718,6 +1733,7 @@ fi:
help: "Muokkaa keskustelun ensimmäistä viestiä"
title: "Muokkaa viestiä"
defer:
help: "Merkitse lukemattomaksi"
title: "Lykkää"
list: "Ketjut"
new: "uusi ketju"
@ -2751,6 +2767,7 @@ fi:
tags:
remove_muted_tags_from_latest:
always: "aina"
only_muted: "kun käytetään yksin tai muiden vaimennettujen tunnisteiden kanssa"
never: "ei koskaan"
reports:
title: "Saatavilla olevat raportit"
@ -2826,6 +2843,7 @@ fi:
groups: "Kaikki ryhmät"
disabled: "Raportti ei ole käytössä"
totals_for_sample: "Otos yhteensä"
average_for_sample: "Näytteen keskiarvo"
total: "Kaikki yhteensä"
no_data: "Ei näytettäviä tietoja"
trending_search:
@ -3609,6 +3627,7 @@ fi:
delete_posts_failed: "Viestien poistaminen epäonnistui."
penalty_post_actions: "Mitä haluat tehdä kyseiselle viestille?"
penalty_post_delete: "Poista viesti"
penalty_post_delete_replies: "Poista viesti + kaikki vastaukset"
penalty_post_edit: "Muokkaa viestiä"
penalty_post_none: "Älä tee mitään"
penalty_count: "Rangaistusten määrä"

File diff suppressed because it is too large Load Diff

View File

@ -358,6 +358,7 @@ he:
search: "חפש הודעה לפי שם:"
placeholder: "הקלידו את כותרת ההודעה כאן"
review:
order_by: "סידור לפי"
in_reply_to: "בתגובה ל"
claim_help:
optional: "באפשרותך לדרוש את הפריט כדי למנוע מאחרים לסקור אותו."
@ -439,8 +440,9 @@ he:
edit: "ערוך"
save: "שמירה"
cancel: "ביטול"
new_topic: "נושא חדש:"
new_topic: "אישור הפריט הזה ייצור נושא חדש"
filters:
all_categories: "(כל הקטגוריות)"
type:
title: "סוג"
all: "(כל הסוגים)"
@ -448,9 +450,14 @@ he:
refresh: "רענן"
status: "מצב"
category: "קטגוריה"
orders:
priority: "עדיפות"
priority_asc: "עדיפות (הפוכה)"
created_at: "מועד יצירה"
created_at_asc: "מועד יצירה (הפוך)"
priority:
title: "עדיפות מזערית"
low: "נמוכה"
low: "(כלשהו)"
medium: "בינונית"
high: "גבוהה"
conversation:
@ -482,6 +489,8 @@ he:
reviewable_flagged_post:
title: "פוסט שדוגל"
flagged_by: "דוגל על ידי"
reviewable_queued_topic:
title: "נושא בתור"
reviewable_queued_post:
title: "הוספת פוסט לתור"
reviewable_user:

View File

@ -374,8 +374,8 @@ hu:
edit: "Szerkesztés"
save: "Mentés"
cancel: "Visszavon"
new_topic: "Új téma:"
filters:
all_categories: "(összes kategória)"
type:
title: "Típus"
all: "(összes típus)"
@ -385,7 +385,6 @@ hu:
category: "Kategória"
priority:
title: "Minimális prioritás"
low: "Alacsony"
medium: "Közepes"
high: "Magas"
conversation:
@ -409,10 +408,6 @@ hu:
title: "Figyelmen kívül hagyva"
deleted:
title: "Törölve "
reviewed:
title: "(Összes átnézve)"
all:
title: "(Minden)"
types:
reviewable_flagged_post:
title: "Megjelölt bejegyzés"

View File

@ -323,12 +323,12 @@ hy:
save: "Պահպանել"
cancel: "Չեղարկել"
filters:
all_categories: "(Բոլոր կատեգորիաները)"
type:
title: "Տիպ"
refresh: "Թարմացնել"
category: "Կատեգորիա"
priority:
low: "Բարձր"
high: "Ցածր"
scores:
score: "Քանակ"

View File

@ -89,8 +89,12 @@ id:
next_month: "Bulan Depan"
placeholder: tanggal
share:
topic_html: 'Topik: <span class="topic-title">%{topicTitle}</span>'
post: "post #%{postNumber}"
close: "tutup"
twitter: "Bagikan tautan ke Twitter"
facebook: "Bagikan tautan ke Facebook"
email: "Bagikan tautan ke email"
action_codes:
public_topic: "membuat topik ini umum %{when}"
private_topic: "Jadikan topik ini sebagai pesan pribadi"
@ -100,6 +104,7 @@ id:
user_left: "%{who}keluar dari percakapan ini%{when}"
removed_user: "menghapus %{who} %{when}"
removed_group: "%{who}dikeluarkan %{when}"
autobumped: "Otomatis dibenturkan %{when}"
autoclosed:
enabled: "ditutup %{when}"
disabled: "dibuka %{when}"
@ -118,10 +123,16 @@ id:
visible:
enabled: "terdaftar %{when}"
disabled: "tidak terdaftar %{when}"
banner:
enabled: "Jadikan ini sebagai spanduk %{when}. Spanduk akan tampil di bagian atas di setiap halaman hingga diturunkan oleh pengguna."
disabled: "Hilangkan spanduk ini %{when}. Spanduk tidak akan lagi tampil pada bagian teratas di tiap halaman."
topic_admin_menu: "topik aksi admin"
emails_are_disabled: "Semua surel yang keluar telah dinonaktifkan oleh administrator. Tidak ada pemberitahuan email yang akan dikirimkan."
bootstrap_mode_enabled: "Untuk lebih memudahkan peluncuran situs baru Anda, Anda berada di mode bootstrap. Semua pengguna baru akan mendapat level 1 dan mendapat ringkasan email harian diaktifkan. Hal ini akan otomatis dimatikan ketika pengguna %{min_users} sudah ikut."
bootstrap_mode_disabled: "Mode bootstrap akan dinonaktifkan dalam 24 jam."
themes:
default_description: "Asal"
broken_theme_alert: "Situs Anda mungkin tidak akan bekerja karena tema / komponen %{theme} memiliki masalah. Nonaktifkan pada %{path}."
s3:
regions:
ap_northeast_1: "Asia Pacific (Tokyo)"
@ -129,8 +140,11 @@ id:
ap_south_1: "Asia Pasifik (Mumbai)"
ap_southeast_1: "Asia Pacific (Singapore)"
ap_southeast_2: "Asia Pacific (Sydney)"
ca_central_1: "Kanada (Sentral)"
cn_north_1: "Cina (Beijing)"
cn_northwest_1: "Cina (Ningxia)"
eu_central_1: "EU (Frankfurt)"
eu_north_1: "EU (Stockholm)"
eu_west_1: "EU (Ireland)"
eu_west_2: "Eropa (London)"
us_east_1: "US East (N. Virginia)"

View File

@ -376,8 +376,9 @@ it:
edit: "Modifica"
save: "Salva"
cancel: "Annulla"
new_topic: "Nuovo Argomento:"
new_topic: "L'approvazione di questo elemento creerà un nuovo Argomento"
filters:
all_categories: "(tutte le categorie)"
type:
title: "Tipo"
all: "(tutti i tipi)"
@ -392,7 +393,7 @@ it:
created_at_asc: "Data creazione (inversa)"
priority:
title: "Priorità minima"
low: "Bassa"
low: "(qualsiasi)"
medium: "Media"
high: "Alta"
conversation:
@ -417,9 +418,9 @@ it:
deleted:
title: "Eliminato"
reviewed:
title: "(Già revisionati)"
title: "(tutti i revisionati)"
all:
title: "(Tutto)"
title: "(tutto)"
types:
reviewable_flagged_post:
title: "Messaggio segnalato"
@ -738,6 +739,7 @@ it:
allow_private_messages: "Consenti agli altri utenti di inviarmi messaggi privati"
external_links_in_new_tab: "Apri tutti i link esterni in nuove schede"
enable_quoting: "Abilita \"rispondi quotando\" per il testo evidenziato"
enable_defer: "Abilita differimento per marcare gli Argomenti come non letti"
change: "cambia"
moderator: "{{user}} è un moderatore"
admin: "{{user}} è un amministratore"
@ -976,6 +978,7 @@ it:
larger: "Più grande"
largest: "Massima"
title_count_mode:
title: "Il titolo della pagina di background mostra il conteggio di:"
notifications: "Nuove notifiche"
contextual: "Nuovo contenuto nella pagina"
like_notification_frequency:
@ -1172,6 +1175,11 @@ it:
too_few_topics_and_posts_notice: "Diamo <a href='https://blog.discourse.org/2014/08/building-a-discourse-community/'>il via alle discussionii!</a> Al momento ci sono <strong>%{currentTopics} / %{requiredTopics}</strong> Argomenti e <strong>%{currentPosts} / %{requiredPosts}</strong> messaggi. I nuovi arrivati hanno bisogno di conversazioni da leggere e a cui rispondere."
too_few_topics_notice: "Diamo <a href='https://blog.discourse.org/2014/08/building-a-discourse-community/'>il via alle discussioni!</a> Al momento ci sono <strong>%{currentTopics} / %{requiredTopics}</strong> Argomenti. I nuovi arrivati hanno bisogno di conversazioni da leggere e a cui rispondere."
too_few_posts_notice: "Diamo <a href='https://blog.discourse.org/2014/08/building-a-discourse-community/'>il via alle discussioni!</a> Al momento ci sono <strong>%{currentPosts} / %{requiredPosts}</strong> messaggi. I nuovi arrivati hanno bisogno di conversazioni da leggere e a cui rispondere."
logs_error_rate_notice:
reached_hour_MF: "<b>{relativeAge}</b> <a href='{url}' target='_blank'>{rate, plural, one {# error/hour} altro {# errors/hour}}</a> il limite impostato di {limit, plural, one {# error/hour} altro {# errors/hour}}."
reached_minute_MF: "<b>{relativeAge}</b> <a href='{url}' target='_blank'>{rate, plural, one {# error/minute} altro {# errors/minute}}</a> raggiunto il limite impostato di {limit, plural, one {# error/minute} altro {# errors/minute}}."
exceeded_hour_MF: "<b>{relativeAge}</b> <a href='{url}' target='_blank'>{rate, plural, one {# error/hour} altro {# errors/hour}}</a> superato il limite impostato di {limit, plural, one {# error/hour} altro {# errors/hour}}."
exceeded_minute_MF: "<b>{relativeAge}</b> <a href='{url}' target='_blank'>{rate, plural, one {# error/minute} altro {# errors/minute}}</a> superato il limite impostato di {limit, plural, one {# error/minute} other {# errors/minute}}."
learn_more: "per saperne di più..."
all_time: "totale"
all_time_desc: "totale argomenti creati"
@ -2312,6 +2320,7 @@ it:
security: "Sicurezza"
special_warning: "Attenzione: questa è una categoria predefinita e le impostazioni di sicurezza ne vietano la modifica. Se non vuoi usare questa categoria, cancellala invece di modificarla."
uncategorized_security_warning: "Questa è una Categoria speciale. È utilizzata come area di parcheggio per gli Argomenti senza Categoria. Non può avere impostazioni di sicurezza."
uncategorized_general_warning: 'Questa è una Categoria speciale. È usata come Categoria predefinita per i nuovi Argomenti senza una Categoria selezionata. Se vuoi prevenire questo comportamento e forzare la scelta di una Categoria, <a href="%{settingLink}">per favore disabilita l''impostazione qui</a>. Se vuoi cambiare il nome o la descrizione, vai a <a href="%{customizeLink}">Personalizza / Contenuto Testuale</a>.'
images: "Immagini"
email_in: "Indirizzo email personalizzato:"
email_in_allow_strangers: "Accetta email da utenti anonimi senza alcun account"
@ -2835,6 +2844,7 @@ it:
not_found_error: "Spiacenti, questo rapporto non esiste"
filter_reports: Filtra rapporti
reports:
trend_title: "Variazione del %{percent}. Attualmente %{current}, era %{prev} nel periodo precedente."
today: "Oggi"
yesterday: "Ieri"
last_7_days: "Ultimi 7"
@ -2850,12 +2860,16 @@ it:
end_date: "Data Fine"
groups: "Tutti i gruppi"
disabled: "Il rapporto è disabilitato"
totals_for_sample: "Totale per campione"
average_for_sample: "Media per campione"
total: "Totale generale"
no_data: "Non ci sono dati da mostrare."
trending_search:
more: '<a href="%{basePath}/admin/logs/search_logs">Cerca nei log</a>'
disabled: 'Il rapporto sulle ricerche di tendenza è disabilitato. Attiva l''opzione<a href="%{basePath}/admin/site_settings/category/all_results?filter=log%20search%20queries">log search queries</a>per iniziare a raccogliere i dati.'
filters:
file-extension:
label: Estensione file
group:
label: Gruppo
category:
@ -2916,6 +2930,7 @@ it:
custom: "Personalizzato"
automatic: "Automatico"
default_title: "Titolo predefinito"
default_title_description: "sarà applicato a tutti gli utenti del gruppo"
group_owners: Proprietari
add_owners: Aggiungi proprietari
none_selected: "Seleziona un gruppo per iniziare"
@ -2963,6 +2978,8 @@ it:
active_notice: "Invieremo i dettagli dell'evento quando si verificherà"
categories_filter_instructions: "I webhook pertinenti saranno attivati solo se l'evento è in relazione a categorie specifiche. Lasciare vuoto per attivare i webhook per tutte le categorie."
categories_filter: "Categorie Innescate"
tags_filter_instructions: "I webhook pertinenti saranno attivati solo se l'evento è relativo alle Etichette specificate. Lasciare vuoto per attivare i webhook per tutti i gruppi."
tags_filter: "Etichette attivate"
groups_filter_instructions: "I webhook pertinenti saranno attivati solo se l'evento è in relazione a gruppi specifici. Lasciare vuoto per attivare i webhook per tutti i gruppi."
groups_filter: "Gruppi Innescati"
delete_confirm: "Eliminare questo webhook?"
@ -2974,6 +2991,25 @@ it:
details: "Quando c'è una nuova risposta, modifica, cancellazione o recupero."
user_event:
name: "Evento Utente"
details: "Quando un utente si connette, si disconnette, viene creato, approvato o aggiornato."
group_event:
name: "Evento di Gruppo"
details: "Quando un Gruppo viene creato, aggiornato o eliminato."
category_event:
name: "Evento di Categoria"
details: "Quando una categoria viene creata, aggiornata o eliminata."
tag_event:
name: "Evento di Etichetta"
details: "Quando un'Etichetta viene creata, aggiornata o distrutta."
flag_event:
name: "Evento di Segnalazione"
details: "Quando una Segnalazione viene creata, approvata, disapprovata o ignorata."
queued_post_event:
name: "Evento approvazione messaggio"
details: "Quando un nuovo messaggio accodato viene creato, approvato o respinto."
reviewable_event:
name: "Evento revisionabile"
details: "Quando un nuovo elemento è pronto per la revisione e quando il suo stato viene aggiornato."
delivery_status:
title: "Stato di Consegna"
inactive: "Non attivo"
@ -3041,6 +3077,7 @@ it:
title: "Carica un backup su questa istanza"
uploading: "In caricamento..."
uploading_progress: "In caricamento... {{progress}}%"
success: "'{{filename}}' è stato caricato con successo. Il file è in via di elaborazione e potrebbe servire fino ad un minuto perché appaia nella lista."
error: "Si è verificato un errore durante il caricamento {{filename}}': {{message}}"
operations:
is_running: "Un'operazione è attualmente in esecuzione..."
@ -3099,6 +3136,7 @@ it:
new_style: "Nuovo Stile"
install: "Installa"
delete: "Cancella"
delete_confirm: 'Sei sicuro di voler eliminare "%{theme_name}"?'
color: "Colore"
opacity: "Opacità"
copy: "Copia"
@ -3120,6 +3158,9 @@ it:
components: "Componenti"
theme_name: "Nome del Tema"
component_name: "Nome del Componente"
themes_intro: "Seleziona un tema esistente o installane uno nuovo per iniziare"
beginners_guide_title: "Guida per principianti all'uso dei Temi di Discourse"
developers_guide_title: "Guida per sviluppatori ai Temi di Discourse"
browse_themes: "Sfoglia i temi della comunità"
customize_desc: "Personalizza:"
title: "Temi"
@ -3129,6 +3170,7 @@ it:
long_title: "Modifica i colori, i CSS e il contenuto HTML del tuo sito"
edit: "Modifica"
edit_confirm: "Questo è un tema remoto, se modifichi il CSS o l'HTML i cambiamenti verranno cancellati la prossima volta che aggiorni il tema."
update_confirm: "Questi cambiamenti locali saranno eliminati dall'aggiornamento. Confermi di voler continuare?"
update_confirm_yes: "Sì, continua con l'aggiornamento"
common: "Condiviso"
desktop: "Desktop"
@ -3163,7 +3205,13 @@ it:
add_upload: "Aggiungi Caricamento"
upload_file_tip: "Scegli una risorsa da caricare (png, woff2, ecc...)"
variable_name: "Nome SCSS var:"
variable_name_invalid: "Nome di variabile non valido. Sono ammessi solo caratteri alfanumerici. Deve iniziare con una lettera. Deve essere unico."
variable_name_error:
invalid_syntax: "Nome di variabile non valido. Sono ammessi solo caratteri alfanumerici. Deve iniziare con una lettera."
no_overwrite: "Nome di variabile non valido. Non deve sovrascrivere una variabile esistente."
must_be_unique: "Nome di variabile non valido. Deve essere unico."
upload: "Carica"
select_component: "Seleziona un componente..."
unsaved_changes_alert: "Non hai ancora salvato le tue modifiche. Sei sicuro di volerle abbandonare e passare ad altro?"
discard: "Annulla"
stay: "Resta"
@ -3173,8 +3221,10 @@ it:
delete_upload_confirm: "Elimina questo caricamento? (Il CSS del tema potrebbe non funzionare!)"
import_web_tip: "Repository contenente il tema"
import_web_advanced: "Avanzate..."
import_file_tip: "file .tar.gz o .dcstyle.json contenenti un tema"
is_private: "Il tema è in un repository git privato"
remote_branch: "Nome del branch (opzionale)"
public_key: "Concedi l'accesso al repository alla seguente chiave pubblica:"
install: "Installa"
installed: "Installata"
install_popular: "Di successo"
@ -3282,6 +3332,7 @@ it:
preview_digest: "Anteprima Riepilogo"
advanced_test:
title: "Test avanzato"
desc: "Vedi come Discourse processa le email ricevute. Per poter processare correttamente le email, per favore incolla qui sotto l'intero messaggio di email originale."
email: "Messaggio originale"
run: "Esegui test"
text: "Seleziona il corpo del testo"
@ -3494,6 +3545,9 @@ it:
types:
all_search_types: "Tutti i tipi di ricerca"
header: "Intestazione"
full_page: "Pagina completa"
click_through_only: "Tutti (solo click)"
header_search_results: "Risultati ricerca nell'Header"
logster:
title: "Log Errori"
watched_words:

View File

@ -300,7 +300,6 @@ ja:
edit: "編集"
save: "保存"
cancel: "キャンセル"
new_topic: "新しいトピック:"
filters:
type:
title: "タイプ"
@ -319,8 +318,6 @@ ja:
title: "保留中"
rejected:
title: "拒否されたメール"
all:
title: "(すべて)"
types:
reviewable_user:
title: "ユーザー"

View File

@ -318,7 +318,6 @@ ko:
edit: "수정"
save: "저장"
cancel: "취소"
new_topic: "새 토픽:"
filters:
type:
title: "형식"
@ -344,10 +343,6 @@ ko:
title: "무시됨"
deleted:
title: "삭제됨"
reviewed:
title: "(모두 검토됨)"
all:
title: "(모두)"
types:
reviewable_flagged_post:
title: "신고된 글"

View File

@ -299,6 +299,7 @@ nb_NO:
save: "Lagre"
cancel: "Avbryt"
filters:
all_categories: "(alle kategorier)"
type:
title: "Type"
refresh: "Last inn på nytt"

View File

@ -376,8 +376,9 @@ nl:
edit: "Bewerken"
save: "Opslaan"
cancel: "Annuleren"
new_topic: "Nieuw topic:"
new_topic: "Goedkeuren van dit item maakt een nieuw topic"
filters:
all_categories: "(alle categorieën)"
type:
title: "Type"
all: "(alle typen)"
@ -392,7 +393,7 @@ nl:
created_at_asc: "Gemaakt op (omgekeerd)"
priority:
title: "Minimale prioriteit"
low: "Laag"
low: "(alle)"
medium: "Gemiddeld"
high: "Hoog"
conversation:
@ -417,9 +418,9 @@ nl:
deleted:
title: "Verwijderd"
reviewed:
title: "(Alle beoordeelde)"
title: "(alle beoordeelde)"
all:
title: "(Alles)"
title: "(alles)"
types:
reviewable_flagged_post:
title: "Gemarkeerd bericht"

View File

@ -384,6 +384,7 @@ pl_PL:
save: "Zapisz"
cancel: "Anuluj"
filters:
all_categories: "(wszystkie kategorie)"
type:
title: "Typ"
refresh: "Odśwież"

View File

@ -153,6 +153,7 @@ pt_BR:
bootstrap_mode_disabled: "O modo bootstrap será desativado em 24 horas."
themes:
default_description: "Padrão"
broken_theme_alert: "Seu site pode não funcionar porque o tema / componente %{theme} tem erros. Desabilite-o em %{path}."
s3:
regions:
ap_northeast_1: "Ásia Pacífico (Tóquio)"
@ -172,6 +173,7 @@ pt_BR:
us_east_1: "Leste do EUA (N. da Virgínia)"
us_east_2: "Leste do EUA (Ohio)"
us_gov_east_1: "AWS GovCloud (Leste do EUA)"
us_gov_west_1: "AWS GovCloud (EUA-Oeste)"
us_west_1: "Oeste do EUA (N. da Califórnia)"
us_west_2: "Oeste do EUA (Oregon)"
edit: "edite o título e a categoria deste tópico"
@ -306,19 +308,36 @@ pt_BR:
search: "Pesquisar por uma Mensagem pelo título:"
placeholder: "digite o título da mensagem aqui"
review:
order_by: "Ordenar por"
in_reply_to: "Em resposta a"
claim_help:
optional: "Você pode reivindicar este item para impedir que outras pessoas o revisem."
required: "Você precisa reivindicar itens antes de poder revisá-los."
claimed_by_you: "Você reivindicou este item e pode revisá-lo."
claimed_by_other: "Este item só pode ser revisado por <b>{{username}}</b>."
claim:
title: "reivindicar este tópico"
unclaim:
help: "remover esta reivindicação"
awaiting_approval: "Aguardando Aprovação"
delete: "Excluir"
settings:
saved: "Salvo"
save_changes: "Salvar Mudanças"
title: "Configurações"
priorities:
title: "Prioridades Revisáveis"
moderation_history: "Histórico de Moderação"
view_all: "Visualizar Todos"
grouped_by_topic: "Agrupado por Tópico"
none: "Não há itens para revisar."
view_pending: "visualização pendente"
topic_has_pending:
one: "Este tópico tem <b>%{count}</b> postagem pendente de aprovação"
other: "Este tópico tem <b>{{count}}</b> postagens pendentes de aprovação"
title: "Revisar"
topic: "Tópico:"
filtered_topic: "Você filtrou para conteúdo de revisão em um único tópico."
filtered_user: "Usuário"
show_all_topics: "mostrar todos os tópicos"
deleted_post: "(postagem excluída)"
@ -328,6 +347,19 @@ pt_BR:
email: "E-mail"
name: "Nome"
fields: "Campos"
user_percentage:
summary:
one: "{{agreed}}, {{disagreed}}, {{ignored}} ({{count}} sinalização no total)"
other: "{{agreed}}, {{disagreed}}, {{ignored}} ({{count}} sinalizações no total)"
agreed:
one: "{{count}}% concorda"
other: "{{count}}% concordam"
disagreed:
one: "{{count}}% discorda"
other: "{{count}}% discordam"
ignored:
one: "{{count}}% ignora"
other: "{{count}}% ignoram"
topics:
topic: "Tópico"
reviewable_count: "Contagem"
@ -335,25 +367,43 @@ pt_BR:
deleted: "[Tópico Excluído]"
original: "(tópico original)"
details: "detalhes"
unique_users:
one: "%{count} usuário"
other: "{{count}} usuários"
replies:
one: "%{count} resposta"
other: "{{count}} respostas"
edit: "Editar"
save: "Salvar"
cancel: "Cancelar"
new_topic: "Novo Tópico:"
new_topic: "A aprovação deste item criará um novo tópico"
filters:
all_categories: "(todas as categorias)"
type:
title: "Tipo"
all: "(todos os tipos)"
minimum_score: "Pontuação Mínima:"
refresh: "Atualizar"
status: "Status"
category: "Categoria"
orders:
priority: "Prioridade"
priority_asc: "Prioridade (reversa)"
created_at: "Criado a"
created_at_asc: "Criado Em (reverso)"
priority:
title: "Prioridade Mínima"
low: "(qualquer)"
medium: "Média"
high: "Alta"
conversation:
view_full: "visualizar conversa completa"
scores:
about: "Essa pontuação é calculada com base no nível de confiança do relator, na precisão de suas sinalizações anteriores e na prioridade do item que está sendo reportado."
score: "Pontuação"
date: "Data"
type: "Tipo"
status: "Status"
submitted_by: "Submetido Por"
reviewed_by: "Revisado Por"
statuses:
@ -367,12 +417,26 @@ pt_BR:
title: "Ignorados"
deleted:
title: "Excluído"
reviewed:
title: "(Tudo Revisado)"
all:
title: "(tudo)"
types:
reviewable_flagged_post:
title: "Postagem Sinalizada"
flagged_by: "Sinalizado por"
reviewable_queued_topic:
title: "Tópico Enfileirado"
reviewable_queued_post:
title: "Postagem Enfileirada"
reviewable_user:
title: "Usuário"
approval:
title: "Postagem Precisa de Aprovação"
description: "Nós recebemos sua nova postagem, mas é necessário que seja aprovada por um moderador antes de ser exibida. Por favor, tenha paciência."
pending_posts:
one: "Você tem <strong>%{count}</strong> postagem pendente."
other: "Você tem postagens <strong>{{count}}</strong> pendentes."
ok: "OK"
user_action:
user_posted_topic: "<a href='{{userUrl}}'>{{user}}</a> postou <a href='{{topicUrl}}'>o tópico</a>"
@ -417,13 +481,19 @@ pt_BR:
remove_user_as_group_owner: "Revogar proprietário"
groups:
member_added: "Adicionado"
member_requested: "Solicitado em"
add_members:
title: "Adicionar membros"
description: "Gerenciar a associação deste grupo"
usernames: "Nomes de usuários"
requests:
title: "Solicitações"
reason: "Motivo"
accept: "Aceitar"
accepted: "aceito"
deny: "Negar"
denied: "negado"
undone: "solicitação desfeita"
manage:
title: "Gerenciar"
name: "Nome"
@ -454,6 +524,7 @@ pt_BR:
empty:
posts: "Não há publicações de membros deste grupo."
members: "Não há membros neste grupo."
requests: "Não há solicitações de associação para este grupo."
mentions: "Não há menções a este grupo."
messages: "Não há mensagens para este grupo."
topics: "Não há tópicos de membros deste grupo."
@ -623,12 +694,20 @@ pt_BR:
private_message: "Mensagem"
private_messages: "Mensagens"
user_notifications:
ignore_duration_title: "Ignorar Temporizador"
ignore_duration_username: "Nome de Usuário"
ignore_duration_when: "Duração:"
ignore_duration_save: "Ignorar"
ignore_duration_note: "Por favor, note que todos os ignorar são automaticamente removidos após a expiração da duração do ignorar."
ignore_duration_time_frame_required: "Por favor selecione um período de tempo"
ignore_no_users: "Você não tem usuários ignorados."
ignore_option: "Ignorados"
ignore_option_title: "Você não receberá notificações relacionadas a este usuário e todos os tópicos e respostas serão ocultados."
add_ignored_user: "Adicionar..."
mute_option: "Silenciados"
mute_option_title: "Você não receberá notificações relacionadas a este usuário."
normal_option: "Normal"
normal_option_title: "Você será notificado se este usuário responder a você, citá-lo ou mencioná-lo."
activity_stream: "Atividade"
preferences: "Preferências"
profile_hidden: "O perfil público deste usuário está oculto."
@ -654,11 +733,13 @@ pt_BR:
dismiss_notifications: "Descartar Tudo"
dismiss_notifications_tooltip: "Marcar todas as notificações não lidas como lidas"
first_notification: "Sua primeira notificação! Selecione-a para começar."
dynamic_favicon: "Mostrar contagens no ícone do navegador"
theme_default_on_all_devices: "Definir este tema como padrão em todos os meus dispositivos"
text_size_default_on_all_devices: "Definir este tamanho de texto como padrão em todos os meus dispositivos"
allow_private_messages: "Permitir que outros usuários me enviem mensagens pessoais"
external_links_in_new_tab: "Abrir todos os links externos em uma nova aba"
enable_quoting: "Habilitar resposta citando o texto destacado"
enable_defer: "Habilitar adiar para marcar tópicos não lidos"
change: "alterar"
moderator: "{{user}} é um moderador"
admin: "{{user}} é um administrador"
@ -698,6 +779,7 @@ pt_BR:
watched_first_post_tags_instructions: "Você será notificado sobre a primeira postagem em cada tópico novo com estas etiquetas."
muted_categories: "Silenciadas"
muted_categories_instructions: "Você não será notificado de nada sobre novos tópicos nestas categorias, e eles não aparecerão nas categorias ou nas últimas páginas."
muted_categories_instructions_dont_hide: "Você não será notificado de nada sobre novos tópicos nestas categorias."
no_category_access: "Como um moderador, você tem acesso limitado à categorias, salvar está desabilitado."
delete_account: "Excluir Minha Conta"
delete_account_confirm: "Você tem certeza de que deseja permanentemente excluir a sua conta? Esta ação não pode ser desfeita!"
@ -774,11 +856,17 @@ pt_BR:
description: "Cada um destes códigos de backup só pode ser usado uma vez. Mantenha-os em algum lugar seguro, mas acessível."
second_factor:
title: "Autenticação de Dois Fatores"
disable: "Desabilitar Autenticação de Dois Fatores"
enable: "Habilitar Autenticação de Dois Fatores"
confirm_password_description: "Por favor, confirme sua senha para continuar"
label: "Código"
rate_limit: "Por favor, aguarde antes de tentar outro código de autenticação."
enable_description: |
Digitalize este código QR em um aplicativo compatível (<a href="https://www.google.com/search?q=authenticator+apps+for+android" target="_blank">Android</a> - <a href="https://www.google.com/search?q=authenticator+apps+for+ios" target="_blank">iOS</a>) e digite seu código de autenticação.
disable_description: "Por favor, insira o código de autenticação do seu aplicativo"
show_key_description: "Inserir manualmente"
short_description: |
Proteja sua conta com códigos de segurança de uso único.
extended_description: |
A autenticação de dois fatores adiciona segurança extra à sua conta, exigindo um token único além da sua senha. Tokens podem ser gerados em dispositivos <a href="https://www.google.com/search?q=authenticator+apps+for+android" target='_blank'>Android</a> e <a href="https://www.google.com/search?q=authenticator+apps+for+ios">iOS</a>.
oauth_enabled_warning: "Por favor, observe que os logins sociais serão desabilitados quando a autenticação de dois fatores for habilitada na sua conta."
@ -821,6 +909,7 @@ pt_BR:
primary: "E-mail Primário"
secondary: "E-mails Secundários"
no_secondary: "Nenhum e-mail secundário"
sso_override_instructions: "E-mail pode ser atualizado do provedor de SSO."
instructions: "Nunca visível publicamente."
ok: "Nós enviaremos um e-mail para confirmar"
invalid: "Por favor, insira um endereço de e-mail válido"
@ -888,6 +977,10 @@ pt_BR:
normal: "Normal"
larger: "Grande"
largest: "Maior"
title_count_mode:
title: "O plano de fundo do título da página exibe a contagem de:"
notifications: "Novas notificações"
contextual: "Novo conteúdo da página"
like_notification_frequency:
title: "Notificar ao ser curtido"
always: "Sempre"
@ -1082,6 +1175,11 @@ pt_BR:
too_few_topics_and_posts_notice: "Vamos <a href='https://blog.discourse.org/2014/08/building-a-discourse-community/'>começar esta discussão!</a> Há atualmente <strong>%{currentTopics} / %{requiredTopics}</strong> tópicos e <strong>%{currentPosts} / %{requiredPosts}</strong> postagens. Novos visitantes precisam de algumas conversas para ler e responder."
too_few_topics_notice: "Vamos <a href='https://blog.discourse.org/2014/08/building-a-discourse-community/'>começar esta discussão!</a> Há atualmente <strong>%{currentTopics} / %{requiredTopics}</strong> tópicos. Novos visitantes precisam de algumas conversar para ler e responder."
too_few_posts_notice: "Vamos <a href='https://blog.discourse.org/2014/08/building-a-discourse-community/'>começar esta discussão!</a> Há atualmente <strong>%{currentPosts} / %{requiredPosts}</strong> postagens. Novos visitantes precisam de algumas conversas para ler e responder."
logs_error_rate_notice:
reached_hour_MF: "<b>{relativeAge}</b> <a href='{url}' target='_blank'>{rate, plural, one {# erro/hora} other {# erros/hora}}</a> alcançou o limite de configuração do site de {limit, plural, one {# erro/hora} other {# erros/hora}}."
reached_minute_MF: "<b>{relativeAge}</b> <a href='{url}' target='_blank'>{rate, plural, one {# erro/minuto} other {# erros/minuto}}</a> alcançou o limite de configuração do site de {limit, plural, one {# erro/minuto} other {# erros/minuto}}."
exceeded_hour_MF: "<b>{relativeAge}</b> <a href='{url}' target='_blank'>{rate, plural, one {# erro/hora} other {# erros/hora}}</a> ultrapassou o limite de configuração do site de {limit, plural, one {# erro/hora} other {# erros/hora}}."
exceeded_minute_MF: "<b>{relativeAge}</b> <a href='{url}' target='_blank'>{rate, plural, one {# erro/minuto} other {# erros/minuto}}</a> ultrapassou o limite de configuração do site de {limit, plural, one {# erro/minuto} other {# erros/minuto}}."
learn_more: "saber mais..."
all_time: "total"
all_time_desc: "total de tópicos criados"
@ -1137,6 +1235,7 @@ pt_BR:
trust_level: "Nível de Confiança"
search_hint: "nome de usuário, e-mail ou endereço IP"
create_account:
disclaimer: "Ao se registrar, você concorda com a <a href='{{privacy_link}}' target='blank'>política de privacidade</a> e os <a href='{{tos_link}}' target='blank'>termos de serviço</a>."
title: "Criar Nova Conta"
failed: "Algo deu errado, talvez este e-mail já esteja cadastrado, tente usar o link de esqueci a senha."
forgot_password:
@ -1175,6 +1274,7 @@ pt_BR:
email_placeholder: "e-mail ou nome de usuário"
caps_lock_warning: "Caps Lock está ativado"
error: "Erro desconhecido"
cookies_error: "Seu navegador parece ter cookies desativados. Você pode não conseguir efetuar login sem ativá-los primeiro."
rate_limit: "Por favor, aguarde antes de tentar entrar novamente."
blank_username: "Por favor, insira seu e-mail ou nome de usuário."
blank_username_or_password: "Por favor, insira seu e-mail ou nome de usuário, e senha."
@ -1255,6 +1355,8 @@ pt_BR:
enter: "Inserir"
conditional_loading_section:
loading: Carregando...
category_row:
topic_count: "{{count}} tópicos nesta categoria"
select_kit:
default_header_text: Selecionar...
no_content: Nenhuma correspondência encontrada
@ -1346,6 +1448,7 @@ pt_BR:
remove_featured_link: "Remover link do tópico."
reply_placeholder: "Digite aqui. Use Markdown, BBCode, ou HTML para formatar. Arraste ou cole imagens."
reply_placeholder_no_images: "Digite aqui. Use Markdown, BBCode, ou HTML para formatar."
reply_placeholder_choose_category: "Selecione uma categoria antes de digitar aqui."
view_new_post: "Veja a sua nova postagem."
saving: "Salvando"
saved: "Salvo!"
@ -1428,6 +1531,8 @@ pt_BR:
none: "Não foi possível carregar notificações no momento."
empty: "Nenhuma notificação foi encontrada."
more: "ver notificações antigas"
post_approved: "Sua postagem foi aprovada"
reviewable_items: "itens que exigem revisão"
mentioned: "<span>{{username}}</span> {{description}}"
group_mentioned: "<span>{{username}}</span> {{description}}"
quoted: "<span>{{username}}</span> {{description}}"
@ -1466,8 +1571,26 @@ pt_BR:
watching_first_post: '{{username}} criou um novo tópico "{{topic}}" - {{site_title}}'
confirm_title: "Notificações habilitadas - %{site_title}"
confirm_body: "Sucesso! Notificações foram habilitadas."
custom: "Notificação de {{username}} em %{site_title}"
titles:
mentioned: "mencionado"
replied: "nova resposta"
quoted: "citado"
edited: "editado"
liked: "nova curtida"
private_message: "nova mensagem privada"
invited_to_private_message: "convidado para mensagem privada"
invitee_accepted: "convite aceito"
posted: "nova postagem"
moved_post: "postagem movida"
linked: "conectado"
granted_badge: "emblema concedido"
invited_to_topic: "convidado para o tópico"
group_mentioned: "grupo mencionado"
group_message_summary: "novas mensagens de grupo"
watching_first_post: "novo tópico"
topic_reminder: "lembrete de tópico"
liked_consolidated: "novas curtidas"
post_approved: "publicação aprovada"
upload_selector:
title: "Adicionar uma imagem"
@ -1633,6 +1756,7 @@ pt_BR:
help: "Editar primeira postagem da mensagem"
title: "Editar Mensagem"
defer:
help: "Marcar como não lido"
title: "Delegar"
list: "Tópicos"
new: "novo tópico"
@ -1698,7 +1822,9 @@ pt_BR:
next_week: "Próxima semana"
two_weeks: "Duas Semanas"
next_month: "Próximo mês"
two_months: "Dois Meses"
three_months: "Três Meses"
four_months: "Quatro Meses"
six_months: "Seis Meses"
one_year: "Um Ano"
forever: "Para Sempre"
@ -1747,6 +1873,7 @@ pt_BR:
jump_bottom: "pular para a última postagem"
jump_prompt: "pular para..."
jump_prompt_of: "de %{count} postagens"
jump_prompt_long: "Pular para..."
jump_bottom_with_number: "pular para postagem %{post_number}"
jump_prompt_to_date: "até agora"
jump_prompt_or: "ou"
@ -1973,10 +2100,14 @@ pt_BR:
description:
one: <b>%{count}</b> resposta selecionada.
other: "<b>{{count}}</b> respostas selecionadas."
deleted_by_author:
one: "(tópico retirado pelo autor, será automaticamente excluído em %{count} hora a menos que seja sinalizado)"
other: "(tópico retirado pelo autor, será automaticamente excluído em %{count} horas a menos que seja sinalizado)"
post:
quote_reply: "Citação"
edit_reason: "Motivo:"
post_number: "resposta {{number}}"
ignored: "Conteúdo ignorado"
wiki_last_edited_on: "wiki última vez editada em"
last_edited_on: "resposta editada pela última vez em"
reply_as_new_topic: "Responder como um Tópico linkado"
@ -1984,6 +2115,7 @@ pt_BR:
continue_discussion: "Continuando a discussão do {{postLink}}:"
follow_quote: "ir para a resposta citada"
show_full: "Exibir mensagem completa"
show_hidden: "Ver o conteúdo ignorado."
deleted_by_author:
one: "(respostas abandonadas pelo autor, serão removidas automaticamente em %{count} hora a exceto se forem sinalizadas)"
other: "(respostas abandonadas pelo autor, serão removidas automaticamente em %{count} horas a exceto se forem sinalizadas)"
@ -2068,6 +2200,8 @@ pt_BR:
delete_topic_disallowed_modal: "Você não tem permissão para apagar este tópico. Se você realmente quiser que ele seja excluído, envie um sinalizador para a atenção do moderador juntamente com o raciocínio."
delete_topic_disallowed: "você não tem permissão para apagar este tópico"
delete_topic: "apagar tópico"
add_post_notice: "Adicionar Aviso da Staff"
remove_post_notice: "Remover Aviso da Staff"
actions:
flag: "Sinalização"
defer_flags:
@ -2151,9 +2285,13 @@ pt_BR:
settings: "Configurações"
topic_template: "Modelo de Tópico"
tags: "Etiquetas"
tags_allowed_tags: "Restringir estas etiquetas a esta categoria:"
tags_allowed_tag_groups: "Restringir estes grupos de etiquetas a esta categoria:"
tags_placeholder: "(Opcional) lista de etiquetas permitidas"
tags_tab_description: "Etiquetas e grupos de etiquetas especificadas aqui estarão disponíveis apenas nesta categoria e em outras categorias que também as especificam. Elas não estarão disponíveis para uso em outras categorias."
tag_groups_placeholder: "(Opcional) lista de grupos de etiquetas permitidos"
manage_tag_groups_link: "Gerencie grupos de etiquetas aqui."
allow_global_tags_label: "Permitir também outras etiquetas"
topic_featured_link_allowed: "Permitir links em destaque nesta categoria"
delete: "Apagar categoria"
create: "Nova categoria"
@ -2200,14 +2338,16 @@ pt_BR:
default_top_period: "Período Superior Padrão:"
allow_badges_label: "Permitir a concessão de emblemas nesta categoria"
edit_permissions: "Editar Permissões"
reviewable_by_group: "Além da staff, postagens e sinalizações nesta categoria também podem ser revisadas por:"
review_group_name: "nome do grupo"
require_topic_approval: "Requer aprovação do moderador de todos os novos tópicos"
require_reply_approval: "Requer aprovação do moderador de todas as novas respostas"
this_year: "este ano"
position: "Posição na página de categorias:"
default_position: "Posição Padrão"
position_disabled: "Categorias serão mostradas em ordem de atividade. Para controlar a ordem das categorias em listas,"
position_disabled_click: 'habilitar a configuração de "posição de categoria fixa".'
minimum_required_tags: "Número mínimo de tags requeridas em um tópico:"
minimum_required_tags: "Número mínimo de etiquetas requeridas em um tópico:"
parent: "Categoria Principal"
num_auto_bump_daily: "Número de tópicos em aberto para dar um bump diário automaticamente:"
navigate_to_first_post_after_read: "Navegue até a primeira postagem depois que os tópicos forem lidos"
@ -2228,9 +2368,14 @@ pt_BR:
title: "Silenciar"
description: "Você nunca será notificado sobre novos tópicos nestas categorias, e não aparecerão no Recentes."
search_priority:
label: "Prioridade de Pesquisa"
options:
normal: "Normal"
ignore: "Ignorar"
very_low: "Muito Baixa"
low: "Baixo"
high: "Alta"
very_high: "Muito Alta"
sort_options:
default: "padrão"
likes: "Curtidas"
@ -2251,6 +2396,7 @@ pt_BR:
settings_sections:
general: "Geral"
moderation: "Moderação"
appearance: "Aparência"
email: "E-mail"
flagging:
title: "Obrigado por ajudar a manter a civilidade da nossa comunidade!"
@ -2432,7 +2578,18 @@ pt_BR:
readonly: "Ver"
lightbox:
download: "download"
previous: "Anterior (tecla de seta para a esquerda)"
next: "Próximo (tecla de seta para a direita)"
counter: "%curr% de %total%"
close: "Fechar (Esc)"
content_load_error: '<a href="%url%">O conteúdo</a> não pôde ser carregado.'
image_load_error: '<a href="%url%">A imagem</a> não pôde ser carregada.'
keyboard_shortcuts_help:
shortcut_key_delimiter_comma: ","
shortcut_key_delimiter_plus: "+"
shortcut_delimiter_or: "%{shortcut1} ou %{shortcut2}"
shortcut_delimiter_slash: "%{shortcut1}/%{shortcut2}"
shortcut_delimiter_space: "%{shortcut1} %{shortcut2}"
title: "Atalhos de teclado"
jump_to:
title: "Ir Para"
@ -2532,12 +2689,12 @@ pt_BR:
</p>
tagging:
all_tags: "Todas as Etiquetas"
other_tags: "Outras tags"
other_tags: "Outras etiquetas"
selector_all_tags: "todas as etiquetas"
selector_no_tags: "sem etiquetas"
changed: "etiquetas alteradas:"
tags: "Etiquetas"
choose_for_topic: "tags opcionais"
choose_for_topic: "etiquetas opcionais"
delete_tag: "Apagar marcação"
delete_confirm:
one: "Tem certeza de que deseja excluir esta tag e removê-la de um tópico para o qual ela está atribuída?"
@ -2555,11 +2712,11 @@ pt_BR:
upload_instructions: "Uma por linha, opcionalmente com um grupo de etiquetas no formato 'nome_etiqueta,grupo_etiqueta'."
upload_successful: "Etiquetas enviadas com sucesso"
delete_unused_confirmation:
one: "%{count} etiqueta será excluída: %{tags}"
other: "%{count} etiquetas serão excluídas: %{tags}"
one: "%{count} etiqueta será excluída: %{etiquetas}"
other: "%{count} etiquetas serão excluídas: %{etiquetas}"
delete_unused_confirmation_more_tags:
one: "%{tags} e %{count} mais"
other: "%{tags} e %{count} mais"
one: "%{etiquetas} e %{count} mais"
other: "%{etiquetas} e %{count} mais"
delete_unused: "Excluir Etiquetas Não Usadas"
delete_unused_description: "Excluir todas as etiquetas que não estão anexadas a nenhum tópico ou mensagem pessoal"
cancel_delete_unused: "Cancelar"
@ -2597,9 +2754,9 @@ pt_BR:
save: "Salvar"
delete: "Apagar"
confirm_delete: "Tem certeza de que deseja remover este grupo de etiquetas?"
everyone_can_use: "Tags podem ser usadas por todos"
usable_only_by_staff: "As tags são visíveis para todos, mas apenas a equipe pode usá-las"
visible_only_to_staff: "As tags são visíveis apenas para a equipe"
everyone_can_use: "Etiquetas podem ser usadas por todos"
usable_only_by_staff: "As etiquetas são visíveis para todos, mas apenas a equipe pode usá-las"
visible_only_to_staff: "As etiquetas são visíveis apenas para a equipe"
topics:
none:
unread: "Não há nenhum tópico não lido."
@ -2633,11 +2790,14 @@ pt_BR:
tags:
remove_muted_tags_from_latest:
always: "sempre"
only_muted: "quando usado sozinho ou com outras etiquetas silenciadas"
never: "nunca"
reports:
title: "Lista de relatórios disponíveis"
dashboard:
title: "Painel Administrativo"
last_updated: "Painel atualizado:"
discourse_last_updated: "Discourse atualizado:"
version: "Versão"
up_to_date: "Você está atualizado!"
critical_available: "Uma atualização crítica está disponível."
@ -2661,7 +2821,7 @@ pt_BR:
mobile_title: "Mobile"
space_used: "%{usedSize} usado"
space_used_and_free: "%{usedSize} (%{freeSize} livre)"
uploads: "Envios"
uploads: "Uploads"
backups: "Backups"
backup_count:
one: "%{count} backup em %{location}"
@ -2706,12 +2866,15 @@ pt_BR:
groups: "Todos os grupos"
disabled: "Este relatório está desativado"
totals_for_sample: "Totais para amostra"
average_for_sample: "Média para amostra"
total: "Todo o tempo total"
no_data: "Nenhum dado para exibir."
trending_search:
more: '<a href="%{basePath}/admin/logs/search_logs">Registros de pesquisa</a>'
disabled: 'O relatório de pesquisa em alta está desativado. Habilitar<a href="%{basePath}/admin/site_settings/category/all_results?filter=log%20search%20queries">consultas de pesquisa de registro</a> para coletar dados.'
filters:
file-extension:
label: Extensão de arquivo
group:
label: Grupo
category:
@ -2849,6 +3012,9 @@ pt_BR:
queued_post_event:
name: "Postar evento de aprovação"
details: "Quando uma nova postagem na fila é criada, aprovada ou rejeitada."
reviewable_event:
name: "Evento Revisável"
details: "Quando um novo item está pronto para revisão e quando seu status é atualizado."
delivery_status:
title: "Status de Entrega"
inactive: "Inativo"
@ -2913,8 +3079,8 @@ pt_BR:
size: "Tamanho"
upload:
label: "Enviar"
title: "Carregar um backup para esta instância"
uploading: "Subindo..."
title: "Enviar um backup para esta instância"
uploading: "Enviando..."
uploading_progress: "Enviando... {{progress}}%"
success: "'{{filename}} foi enviado com sucesso. O arquivo está sendo processado e levará até um minuto para aparecer na lista."
error: "Houve um erro ao carregar '{{filename}}': {{message}}"
@ -2929,7 +3095,7 @@ pt_BR:
label: "Backup"
title: "Cria um backup"
confirm: "Você quer iniciar um novo backup?"
without_uploads: "Sim (não inclui uploads)"
without_uploads: "Sim (não incluir uploads)"
download:
label: "Download"
title: "Enviar e-mail com link para download"
@ -2975,6 +3141,7 @@ pt_BR:
new_style: "Novo Estilo"
install: "Instalar"
delete: "Apagar"
delete_confirm: 'Você tem certeza de que deseja excluir "%{theme_name}"?'
color: "Cor"
opacity: "Opacidade"
copy: "Copiar"
@ -3008,11 +3175,14 @@ pt_BR:
long_title: "Alterar cores, CSS e conteúdo HTML do seu site"
edit: "Editar"
edit_confirm: "Este é um tema remoto, se você editar CSS / HTML, suas alterações serão apagadas da próxima vez que você atualizar o tema."
update_confirm: "Essas alterações locais serão apagadas pela atualização. Você tem certeza de que quer continuar?"
update_confirm_yes: "Sim, continue com a atualização"
common: "Comum"
desktop: "Desktop"
mobile: "Mobile"
settings: "Configurações"
translations: "Traduções"
extra_scss: "SCSS Extra"
preview: "Prévia"
show_advanced: "Mostrar campos avançados"
hide_advanced: "Ocultar campos avançados"
@ -3037,7 +3207,7 @@ pt_BR:
collapse: Recolher
uploads: "Uploads"
no_uploads: "Você pode fazer upload de recursos associados ao seu tema, como fontes e imagens"
add_upload: "Adicionar upload"
add_upload: "Adicionar Upload"
upload_file_tip: "Escolha um recurso para carregar (png, woff2, etc ...)"
variable_name: "Nome do SCSS var:"
variable_name_invalid: "Nome da variável inválido. Somente alfanumérico permitido. Deve começar com uma carta. Deve ser único."
@ -3335,6 +3505,13 @@ pt_BR:
change_name: "modificar nome"
topic_timestamps_changed: "timestamps do tópico modificadas"
approve_user: "usuário aprovado"
web_hook_create: "criação de webhook"
web_hook_update: "atualização de webhook"
web_hook_destroy: "exclusão de webhook"
web_hook_deactivate: "desativação de webhook"
embeddable_host_create: "criação de host incorporável"
embeddable_host_update: "atualização de host incorporável"
embeddable_host_destroy: "exclusão de host incorporável"
screened_emails:
title: "Emails Filtrados"
description: "Quando alguém tenta cria uma nova conta, os seguintes endereços de e-mail serão verificados e o registro será bloqueado, ou outra ação será executada."
@ -3418,6 +3595,7 @@ pt_BR:
id_not_found: "Desculpe, este nome de usuário não existe no nosso sistema."
active: "Ativado"
show_emails: "Mostrar Emails"
hide_emails: "Ocultar E-mails"
nav:
new: "Novos"
active: "Ativos"
@ -3473,6 +3651,7 @@ pt_BR:
delete_posts_failed: "Houve um problema excluindo as postagens."
penalty_post_actions: "O que você gostaria de fazer com o post associado?"
penalty_post_delete: "Excluir a postagem"
penalty_post_delete_replies: "Excluir a postagem + quaisquer respostas"
penalty_post_edit: "editar a publicação"
penalty_post_none: "Fazer nada"
penalty_count: "Contagem de penalidade"
@ -3669,6 +3848,7 @@ pt_BR:
clear_filter: "Limpar"
add_url: "adicionar URL"
add_host: "adicionar host"
add_group: "adicionar grupo"
uploaded_image_list:
label: "Lista de edição"
empty: "Não há fotos ainda. Por favor, faça o upload de uma."
@ -3680,6 +3860,7 @@ pt_BR:
categories:
all_results: "Todas"
required: "Requerido"
branding: "Branding"
basic: "Configuração Básica"
users: "Usuários"
posting: "Publicando"
@ -3817,6 +3998,7 @@ pt_BR:
save: "Salvar Configurações de Incorporação"
permalink:
title: "Links permanentes"
description: "Por favor note que isto só se aplica a fontes externas, links postados no seu fórum não serão redirecionados."
url: "URL"
topic_id: "ID do Tópico"
topic_title: "Tópico"
@ -3831,9 +4013,15 @@ pt_BR:
add: "Adicionar"
filter: "Busca (URL ou URL Externa)"
reseed:
action:
label: "Substituir Texto…"
title: "Substituir texto de categorias e tópicos por traduções"
modal:
title: "Substituir Texto"
subtitle: "Substituir o texto das categorias e tópicos gerados pelo sistema pelas traduções mais recentes"
categories: "Categorias"
topics: "Tópicos"
replace: "Substituir"
wizard_js:
wizard:
done: "Feito"

View File

@ -323,6 +323,7 @@ ro:
save: "Salvează"
cancel: "Anulează"
filters:
all_categories: "(toate categoriile)"
type:
title: "Tip"
refresh: "Reîmprospătează"

View File

@ -147,11 +147,11 @@ ru:
other: "%{count} лет спустя"
previous_month: "Предыдущий месяц"
next_month: "Следующий месяц"
placeholder: Дата
placeholder: дата
share:
topic_html: 'Тема: <span class="topic-title">%{topicTitle}</span>'
post: "пост #%{postNumber}"
close: "Закрыть"
close: "закрыть"
twitter: "Поделиться ссылкой в Twitter"
facebook: "Поделиться ссылкой в Facebook"
email: "Отправить эту ссылку по e-mail"
@ -440,8 +440,9 @@ ru:
edit: "Редактировать"
save: "Сохранить"
cancel: "Отмена"
new_topic: "Новая тема:"
new_topic: "Утверждение этого пункта создаст новую тему"
filters:
all_categories: "(все категории)"
type:
title: "Тип"
all: "(все типы)"
@ -456,7 +457,7 @@ ru:
created_at_asc: "Созданные в (обратный)"
priority:
title: "Минимальный Приоритет:"
low: "Низкий"
low: "(любой)"
medium: "Средний"
high: "Высокий"
conversation:
@ -481,9 +482,9 @@ ru:
deleted:
title: "Удалено"
reviewed:
title: "(Все Жалобы)"
title: "(все рассмотрено)"
all:
title: "(Все)"
title: "(всё)"
types:
reviewable_flagged_post:
title: "Отмеченный Пост"
@ -717,7 +718,7 @@ ru:
posts: "Сообщения"
topics: "Темы"
latest: "Последние"
latest_by: "последние по"
latest_by: "последние от"
toggle_ordering: "изменить сортировку"
subcategories: "Подразделы"
topic_sentence:
@ -814,7 +815,7 @@ ru:
allow_private_messages: "Разрешить другим пользователям отправлять мне личные сообщения"
external_links_in_new_tab: "Открывать все внешние ссылки в новой вкладке"
enable_quoting: "Позволить отвечать с цитированием выделенного текста"
enable_defer: "Включить отложить, чтобы пометить темы как непрочитанные"
enable_defer: "Включить кнопку отложить, чтобы помечать темы, как непрочитанные"
change: "изменить"
moderator: "{{user}} — модератор"
admin: "{{user}} — админ"

View File

@ -355,6 +355,7 @@ sk:
save: "Uložiť"
cancel: "Zrušiť"
filters:
all_categories: "(všetky kategórie)"
type:
title: "Typ"
refresh: "Obnoviť"

View File

@ -409,8 +409,8 @@ sl:
edit: "Uredi"
save: "Shrani"
cancel: "Prekliči"
new_topic: "Nova tema:"
filters:
all_categories: "(vse kategorije)"
type:
title: "Tip"
all: "(vse vrste)"
@ -419,7 +419,6 @@ sl:
status: "Stanje"
category: "Kategorija"
priority:
low: "Nizka"
medium: "Srednja"
high: "Visoka"
conversation:
@ -443,10 +442,6 @@ sl:
title: "Prezrto"
deleted:
title: "Izbrisano"
reviewed:
title: "(vsi pregledani)"
all:
title: "(vse)"
types:
reviewable_flagged_post:
title: "Prijavljen prispevek"

View File

@ -297,6 +297,7 @@ sw:
save: "hifadhi"
cancel: "Ghairi"
filters:
all_categories: "(Vikundi Vyote)"
type:
title: "Aina"
refresh: "Rudisha Tena"

View File

@ -204,6 +204,7 @@ te:
save: "భద్రపరచు"
cancel: "రద్దుచేయి"
filters:
all_categories: "(అన్ని వర్గాలు)"
type:
title: "రకం"
refresh: "తాజా పరుచు"

View File

@ -307,6 +307,7 @@ tr_TR:
save: "Kaydet"
cancel: "İptal"
filters:
all_categories: "(tüm kategoriler)"
type:
title: "Tür"
refresh: "Yenile"

View File

@ -376,8 +376,9 @@ ur:
edit: "ترمیم"
save: "محفوظ کریں"
cancel: "منسوخ"
new_topic: "نیا ٹاپک:"
new_topic: "اِس شے کی منظوری سے ایک نیا ٹاپک بن جائے گا"
filters:
all_categories: "(تمام زُمرَہ جات)"
type:
title: "قِسم"
all: "(تمام اقسام)"
@ -392,7 +393,7 @@ ur:
created_at_asc: "کو بنایا گیا (ریوَرس)"
priority:
title: "کم از کم ترجیح"
low: "کم"
low: "(کوئی بھی)"
medium: "درمیانی"
high: "زیادہ"
conversation:

View File

@ -671,7 +671,14 @@ vi:
website: "Web Site"
email_settings: "Email"
text_size:
title: "Cở chữ"
smaller: "Nhỏ"
normal: "Bình thường"
larger: "Lớn"
largest: "Lớn nhất"
title_count_mode:
notifications: "Thông báo mới"
contextual: "Trang nội dung mới"
like_notification_frequency:
title: "Thông báo khi tôi like"
always: "Luôn luôn"

View File

@ -344,8 +344,9 @@ zh_CN:
edit: "编辑"
save: "保存"
cancel: "取消"
new_topic: "新主题"
new_topic: "批准此条目将会创建一个主题"
filters:
all_categories: "(所有分类)"
type:
title: "类型"
all: "(全部类型)"
@ -360,7 +361,7 @@ zh_CN:
created_at_asc: "创建时间(倒序)"
priority:
title: "最低优先级"
low: ""
low: "(所有)"
medium: "中等"
high: "高"
conversation:
@ -563,7 +564,7 @@ zh_CN:
title: "跟踪"
description: "你将会在该私信中的每个新帖子发布后收到通知,并且会显示新回复数量。"
watching_first_post:
title: "跟踪"
title: "监看头一帖"
description: "你将收到有关此组中新消息的通知,但不会回复消息。"
tracking:
title: "跟踪"
@ -1604,8 +1605,8 @@ zh_CN:
first: 是第一帖
pinned: 是置顶的
unpinned: 不是置顶的
seen: 阅读
unseen: 我还没有读过的
seen:
unseen: 我还没看过
wiki: 公共编辑
images: 包含图片
all_tags: 上述所有标签
@ -2639,7 +2640,7 @@ zh_CN:
parent_tag_placeholder: "可选"
parent_tag_description: "未设置上级标签前群组内标签无法使用。"
one_per_topic_label: "只可给主题设置一个该组内的标签"
new_name: "新标签组"
new_name: "新标签组"
save: "保存"
delete: "删除"
confirm_delete: "确定要删除此标签组吗?"
@ -2731,7 +2732,7 @@ zh_CN:
reports_tab: "报告"
report_filter_any: "任意"
disabled: 停用
timeout_error: 对不起,查询时间太长,请选择较短的间隔
timeout_error: 对不起,查询时间过长,请选择一个较短的间隔
exception_error: 抱歉,执行查询时发生错误
too_many_requests: 你执行这个操作太多次了,请稍后再试。
not_found_error: 抱歉,报告不存在
@ -3111,7 +3112,7 @@ zh_CN:
edit_css_html_help: "你还未编辑任何 CSS 或 HTML"
delete_upload_confirm: "删除这个上传?(主题 CSS 可能会出问题!)"
import_web_tip: "目录包含主题"
import_web_advanced: "高级。。。"
import_web_advanced: "高级..."
import_file_tip: "包含主题的.tar.gz或.dcstyle.json文件"
is_private: "主题在私有git存储库中"
remote_branch: "分支名称(可选)"
@ -3156,7 +3157,7 @@ zh_CN:
text: "添加头部"
title: "输入显示在所有页面的头部之后的 HTML"
footer:
text: "尾部"
text: "页脚"
title: "输入显示在页面尾部后的 HTML"
embedded_scss:
text: "嵌入使用的 CSS"
@ -3394,9 +3395,9 @@ zh_CN:
web_hook_update: "更新webhook"
web_hook_destroy: "销毁webhook"
web_hook_deactivate: "禁用webhook"
embeddable_host_create: "可嵌入的宿主创建"
embeddable_host_update: "可嵌入的主机更新"
embeddable_host_destroy: "可嵌入的主机销毁"
embeddable_host_create: "创建可嵌入的主机"
embeddable_host_update: "更新可嵌入的主机"
embeddable_host_destroy: "销毁可嵌入的主机"
screened_emails:
title: "被屏蔽的邮件地址"
description: "当有人试图用以下邮件地址注册时,将受到阻止或其它系统操作。"
@ -3414,7 +3415,7 @@ zh_CN:
delete_confirm: "确定要撤销对 IP 地址为 %{ip_address} 的规则?"
roll_up_confirm: "你确定要将常用的 IP 地址归类为子网地址吗?"
rolled_up_some_subnets: "成功地折叠了 IP 封禁记录至这些子网: %{subnets}。"
rolled_up_no_subnet: "无法折叠。"
rolled_up_no_subnet: "没有可折叠内容。"
actions:
block: "封禁"
do_nothing: "放行"
@ -3531,7 +3532,7 @@ zh_CN:
suspended_until: "(直到%{until}"
cant_suspend: "该用户不能被封禁。"
delete_all_posts: "删除所有帖子"
delete_posts_progress: "删除帖子。。。"
delete_posts_progress: "删除帖子..."
delete_posts_failed: "删除帖子时出现问题。"
penalty_post_actions: "你想对相关帖子做什么?"
penalty_post_delete: "删除帖子"

View File

@ -339,7 +339,6 @@ zh_TW:
edit: "編輯"
save: "儲存"
cancel: "取消"
new_topic: "新增話題"
filters:
type:
title: "類型"
@ -349,7 +348,6 @@ zh_TW:
status: "狀態"
category: "分類"
priority:
low: "低"
medium: "中間的"
high: "高"
conversation:
@ -373,10 +371,6 @@ zh_TW:
title: "忽略"
deleted:
title: "刪除"
reviewed:
title: "(所有已審核)"
all:
title: "(所有)"
types:
reviewable_flagged_post:
title: "標記的貼文"

View File

@ -1845,6 +1845,8 @@ ar:
title: "أحذف"
disagree:
title: "لا اوافق"
ignore:
title: "تجاهل"
approve:
title: "تصديق"
reject_user:

View File

@ -178,7 +178,7 @@ de:
confirm_email: "<p>Du bist fast fertig! Wir haben eine Aktivierungsmail an deine E-Mail-Adresse geschickt. Bitte folge den Anweisungen in der E-Mail, um dein Konto zu aktivieren.</p><p>Wenn keine E-Mail ankommt, überprüfe bitte deinen Spam-Ordner.</p>"
bulk_invite:
file_should_be_csv: "Die hochzuladende Datei sollte im CSV-Format vorliegen."
max_rows: "Maximal 50.000 Einladungen können auf einmal versendet werden. Versuche die Datei in kleinere aufzuteilen."
max_rows: "Die ersten %{max_bulk_invites} Einladungen wurden versandt. Versuche, die Datein in kleinere Teile aufzuspalten."
error: "Es gab einen Fehler beim Hochladen dieser Datei. Bitte versuche es später noch einmal."
topic_invite:
failed_to_invite: "Der Benutzer kann nicht in dieses Thema eingeladen werden, ohne Mitglied in einer der folgenden Gruppen zu sein: %{group_names}"
@ -299,8 +299,8 @@ de:
groups:
success:
bulk_add:
one: "%{count} Benutzer wurde zu dieser Gruppe hinzugefügt."
other: "%{count} Benutzer wurden zu dieser Gruppe hinzugefügt."
one: "%{count} Benutzer wurde zur Gruppe hinzugefügt."
other: "%{count} Benutzer wurden zur Gruppe hinzugefügt."
errors:
grant_trust_level_not_valid: "'%{trust_level}' ist keine gültige Vertrauensstufe"
can_not_modify_automatic: "Du kannst eine automatische Gruppe nicht bearbeiten"
@ -1047,7 +1047,7 @@ de:
title: "Anonym"
xaxis: "Tag"
yaxis: "Anonyme Seitenaufrufe"
description: "Anzahl der neuen Seitenaufrufe von Besuchern, die nicht angemeldet sind."
description: "Anzahl neuer Seitenaufrufe durch Besucher, die nicht angemeldet sind."
page_view_logged_in_reqs:
title: "Angemeldet"
xaxis: "Tag"
@ -1101,7 +1101,7 @@ de:
title: "Zeit bis zur ersten Reaktion"
xaxis: "Tag"
yaxis: "Durchschnittszeit (Stunden)"
description: "Durchschnittliche Zeit (in Stunden) bis zur ersten Antwort auf neue Themen"
description: "Durchschnittliche Zeit (in Stunden) bis zur ersten Antwort auf neue Themen."
topics_with_no_response:
title: "Themen ohne Reaktionen"
xaxis: "Tag"
@ -1296,7 +1296,7 @@ de:
ga_universal_tracking_code: "Tracking Code ID von Google Universal Analytics (analytics.js), eg: UA-12345678-9; siehe <a href='https://google.com/analytics' target='_blank'>https://google.com/analytics</a>"
ga_universal_domain_name: "Google Universal Analytics (analytics.js) domain name, eg: mysite.com; <a href='https://google.com/analytics' target='_blank'>Siehe https://google.com/analytics</a>"
ga_universal_auto_link_domains: "Aktiviere Google Universal Analytics (analytics.js) Cross-Domain-Tracking. Ausgehenden Links zu diesen Domains wird eine Client-ID hinzugefügt. Siehe <a href='https://support.google.com/analytics/answer/1034342?hl=en' target='_blank'>Googles Cross-Domain-Tracking-Anleitung</a>."
gtm_container_id: "Google Tag Manager Container-ID, z.B.: GTM-ABCDEF. <br/>Beachte: Skripte von Drittanbietern, die von GTM geladen weren, müssen erlaubt werden in 'content security policy script src'."
gtm_container_id: "Google Tag Manager Container-ID. z.B.: GTM-ABCDEF. <br/>Hinweis: Skripte von Drittanbietern, die von GTM geladen werden, müssten in der 'content security policy script src' gewhitelistet werden."
enable_escaped_fragments: "Als Fallback die Ajax-Crawling-API von Google verwenden, wenn keine Suchmaschine deaktiviert wurde. Siehe <a href='https://developers.google.com/webmasters/ajax-crawling/docs/learn-more' target='_blank'>https://developers.google.com/webmasters/ajax-crawling/docs/learn-more</a>"
moderators_create_categories: "Erlaube Moderatoren, neue Kategorien anzulegen"
cors_origins: "Erlaubte Adressen für Cross-Origin-Requests (CORS). Jede Adresse muss http:// oder https:// enthalten. Die Umgebungsvariable DISCOURSE_ENABLE_CORS muss gesetzt sein, um CORS zu aktivieren."
@ -1360,7 +1360,7 @@ de:
enable_sso_provider: "Aktiviere das Discourse SSO-Provider-Protokoll unter /session/sso_provider; setzt voraus, dass sso_provider_secret gesetzt ist."
sso_url: "URL des Single Sign-On-Endpunkts (muss http:// oder https:// enthalten)"
sso_secret: "Geheimer Schlüssel für die Authentifizierung von SSO-Informationen. Sollte unbedingt 10 Zeichen oder länger sein."
sso_provider_secrets: "Eine Liste von Domain-Secret-Paaren, die Discourse als SSO-Provider verwenden. Stelle sicher, dass SSO-Secrets mindestens 10 Zeichen lang sind. Das Wildcard-Symbol * can verwndet werden, um jede Domain oder Teile davon auszuwählen (z.B. *.example.com)."
sso_provider_secrets: "Eine Liste mit Domain-Secret-Paaren, die Discourse als SSO-Provider verwenden. Stelle sicher, dass SSO-Secrets mindestens 10 Zeichen lang sind. Das Wildcard-Symbol * kann verwendet werden, um jede Domain oder nur einen Teil davon auszuwählen (z.B. *.example.com). "
sso_overrides_bio: "Überschreibt \"Über mich\" im Benutzerprofil und verhindert Änderungen durch den Benutzer"
sso_overrides_groups: "Synchronisiert alle manuellen Gruppenmitgliedschaften mit den Gruppen, die im SSO-Attribut „groups“ angegeben ist (WARNUNG: wenn du keine Gruppen angibst, werden alle Gruppenmitgliedschaften des Benutzers aufgehoben)"
sso_overrides_email: "Überschreibt lokale E-Mail mit E-Mail der externen Site aus dem SSO-Payload (WARNUNG: Diskrepanzen können aufgrund der Normalisierung lokaler E-Mail-Adressen auftreten.)"
@ -1751,7 +1751,7 @@ de:
min_trust_level_for_user_api_key: "Erforderliche Vertrauensstufe für die Generierung von Benutzer API Schlüsseln"
allowed_user_api_auth_redirects: "Zulässige URL für Authentifizierungs-Umleitung für Benutzer-API-Schlüssel. Das Platzhaltersymbol * kann verwendet werden, um jeden Bestandteil der Adresse zu ersetzen (z.B. www.example.com/*)."
allowed_user_api_push_urls: "Erlaubte URL für Server-Push zur Benutzer API"
expire_user_api_keys_days: "Anzahl Tage bevor ein Benutzer API Schlüssel automatisch abläuft. (0 für niemals)"
expire_user_api_keys_days: "Anzahl Tage, bevor ein Benutzer API Schlüssel automatisch abläuft. (0 für niemals)"
tagging_enabled: "Schlagwörter für Themen aktivieren"
min_trust_to_create_tag: "Minimale Vertrauensstufe, um ein Schlagwort zu erstellen."
max_tags_per_topic: "Maximale Anzahl an Schlagwörtern, die einem Thema hinzugefügt werden können."
@ -2345,13 +2345,13 @@ de:
title: "CSV-Export erfolgreich"
subject_template: "[%{export_title}] Datenexport abgeschlossen"
text_body_template: |
Deine Daten wurden erfolgreich exportiert! :dvd:
Dein Datenexport war erfolgreich! :dvd:
<a class="attachment" href="%{download_link}">%{file_name}</a> (%{file_size})
%{download_link}
Der obenstehende Download-Link wird 48 Stunden gültig sein.
Der obige Download Link bleibt für 48 Stunden gültig.
Die Daten sind als Gzip-Archiv komprimiert. Wenn sich das Archiv beim Öffnen nicht selbst extrahiert, verwende eines der hier empfohlenen Werkzeuge: https://www.gzip.org/#faq4
Die Daten sind in einem gzip Archiv komprimiert. Falls sich das Archiv beim Öffnen nicht selbst extrahiert, nutze eins der hier empfohlenen Tools: https://www.gzip.org/#faq4
csv_export_failed:
title: "CSV-Export fehlgeschlagen"
subject_template: "Datenexport fehlgeschlagen"

View File

@ -218,7 +218,7 @@ en:
bulk_invite:
file_should_be_csv: "The uploaded file should be of csv format."
max_rows: "Maximum of 50,000 invites can be sent at a time. Try splitting the file in smaller parts."
max_rows: "First %{max_bulk_invites} invites has been sent. Try splitting the file in smaller parts."
error: "There was an error uploading that file. Please try again later."
topic_invite:
@ -354,7 +354,7 @@ en:
groups:
success:
bulk_add:
one: "%{count} user have been added to the group."
one: "%{count} user has been added to the group."
other: "%{count} users have been added to the group."
errors:
grant_trust_level_not_valid: "'%{trust_level}' is not a valid trust level."
@ -1167,7 +1167,7 @@ en:
title: "Anonymous"
xaxis: "Day"
yaxis: "Anonymous Pageviews"
description: "Number of new page views by visitors not logged in to an account."
description: "Number of new pageviews by visitors not logged in to an account."
page_view_logged_in_reqs:
title: "Logged In"
xaxis: "Day"
@ -1221,7 +1221,7 @@ en:
title: "Time to first response"
xaxis: "Day"
yaxis: "Average time (hours)"
description: "Average time (in hours) of the first response to new topics."
description: "Average time (in hours) of the first response to new topics."
topics_with_no_response:
title: "Topics with no response"
xaxis: "Day"
@ -1421,13 +1421,13 @@ en:
enable_markdown_linkify: "Automatically treat text that looks like a link as a link: www.example.com and https://example.com will be automatically linked"
markdown_linkify_tlds: "List of top level domains that get automatically treated as links"
post_undo_action_window_mins: "Number of minutes users are allowed to undo recent actions on a post (like, flag, etc)."
must_approve_users: "Staff must approve all new user accounts before they are allowed to access the site. WARNING: enabling this for a live site will revoke access for existing non-staff users!"
must_approve_users: "Staff must approve all new user accounts before they are allowed to access the site."
pending_users_reminder_delay: "Notify moderators if new users have been waiting for approval for longer than this many hours. Set to -1 to disable notifications."
maximum_session_age: "User will remain logged in for n hours since last visit"
ga_universal_tracking_code: "Google Universal Analytics (analytics.js) tracking code ID, eg: UA-12345678-9; see <a href='https://google.com/analytics' target='_blank'>https://google.com/analytics</a>"
ga_universal_domain_name: "Google Universal Analytics (analytics.js) domain name, eg: mysite.com; see <a href='https://google.com/analytics' target='_blank'>https://google.com/analytics</a>"
ga_universal_auto_link_domains: "Enable Google Universal Analytics (analytics.js) cross-domain tracking. Outgoing links to these domains will have the client id added to them. See <a href='https://support.google.com/analytics/answer/1034342?hl=en' target='_blank'>Google's Cross-Domain Tracking guide.</a>"
gtm_container_id: "Google Tag Manager container id. eg: GTM-ABCDEF. <br/>Note: third-party scripts loaded by GTM may need to be whitelisted in 'content security policy script src'."
gtm_container_id: "Google Tag Manager container id. eg: GTM-ABCDEF. <br/>Note: Third-party scripts loaded by GTM may need to be whitelisted in 'content security policy script src'."
enable_escaped_fragments: "Fall back to Google's Ajax-Crawling API if no webcrawler is detected. See <a href='https://developers.google.com/webmasters/ajax-crawling/docs/learn-more' target='_blank'>https://developers.google.com/webmasters/ajax-crawling/docs/learn-more</a>"
moderators_create_categories: "Allow moderators to create new categories"
cors_origins: "Allowed origins for cross-origin requests (CORS). Each origin must include http:// or https://. The DISCOURSE_ENABLE_CORS env variable must be set to true to enable CORS."
@ -1501,7 +1501,7 @@ en:
enable_sso_provider: "Implement Discourse SSO provider protocol at the /session/sso_provider endpoint, requires sso_provider_secrets to be set"
sso_url: "URL of single sign on endpoint (must include http:// or https://)"
sso_secret: "Secret string used to cryptographically authenticate SSO information, be sure it is 10 characters or longer"
sso_provider_secrets: "A list of domain-secret pairs that are using Discourse as a SSO provider. Make sure SSO secret is 10 characters or longer. Wildcard symbol * can be used to match any domain or only a part of it (e.g. *.example.com)."
sso_provider_secrets: "A list of domain-secret pairs that are using Discourse as an SSO provider. Make sure SSO secret is 10 characters or longer. Wildcard symbol * can be used to match any domain or only a part of it (e.g. *.example.com)."
sso_overrides_bio: "Overrides user bio in user profile and prevents user from changing it"
sso_overrides_groups: "Synchronize all manual group membership with groups specified in the groups sso attribute (WARNING: if you do not specify groups all manual group membership will be cleared for user)"
sso_overrides_email: "Overrides local email with external site email from SSO payload on every login, and prevent local changes. (WARNING: discrepancies can occur due to normalization of local emails)"
@ -2013,7 +2013,7 @@ en:
min_trust_level_for_user_api_key: "Trust level required for generation of user API keys"
allowed_user_api_auth_redirects: "Allowed URL for authentication redirect for user API keys. Wildcard symbol * can be used to match any part of it (e.g. www.example.com/*)."
allowed_user_api_push_urls: "Allowed URLs for server push to user API"
expire_user_api_keys_days: "Number of days before an user API key automatically expires (0 for never)"
expire_user_api_keys_days: "Number of days before a user API key automatically expires (0 for never)"
tagging_enabled: "Enable tags on topics?"
min_trust_to_create_tag: "The minimum trust level required to create a tag."
@ -2661,7 +2661,7 @@ en:
text_body_template: |
Your data export was successful! :dvd:
<a class="attachment" href="%{download_link}">%{file_name}</a> (%{file_size})
%{download_link}
The above download link will be valid for 48 hours.

View File

@ -178,7 +178,7 @@ es:
confirm_email: "<p>¡Ya casi has terminado! Te enviamos un correo de activación a tu dirección de correo. Por favor sigue las instrucciones de ese correo para activar tu cuenta.</p><p>Si no llega, mira en la carpeta de spam.</p>"
bulk_invite:
file_should_be_csv: "El archivo subido debería ser de formato csv."
max_rows: "Se pueden enviar un máximo de 50,000 invitaciones a la vez. Intenta dividir el archivo en partes más pequeñas."
max_rows: "Las primeras %{max_bulk_invites}invitaciones han sido enviadas. Intenta dividir el archivo en partes más pequeñas."
error: "Ha ocurrido un error al subir ese archivo. Por favor, inténtalo más tarde de nuevo."
topic_invite:
failed_to_invite: "No se puede invitar al usuario a este tema sin ser miembro de un grupo en cualquiera de los siguientes grupos: %{group_names}"
@ -1067,7 +1067,7 @@ es:
title: "Anónimas"
xaxis: "Día"
yaxis: "Páginas vistas anónimas"
description: "Número de nuevas impresiones de páginas de visitantes sin una sesión iniciada."
description: "Número de visitas de página nuevas por visitantes que no han iniciado sesión en una cuenta."
page_view_logged_in_reqs:
title: "Registrados"
xaxis: "Día"
@ -2367,11 +2367,11 @@ es:
title: "Exportación de datos en CSV completada con éxito"
subject_template: "[%{export_title}] exportación de datos completa"
text_body_template: |
¡La exportación de los datos ha finalizado correctamente! :dvd:
¡La exportación de los datos ha sido exitosa! :dvd:
<a class="attachment" href="%{download_link}">%{file_name}</a> (%{file_size})
%{download_link}
El enlace de arriba funcionará durante las próximas 48 horas.
El enlace de arriba será válido por 48 horas.
Los datos han sido comprimidos en un archivo gzip. Si no consigues extraerlo al abrirlo, usa las herramientas recomendadas aquí: https://www.gzip.org/#faq4
csv_export_failed:

View File

@ -1338,6 +1338,7 @@ fa_IR:
missing_user_field: "شما تمام فیلد‌های کاربری را تکمیل نکرده اید"
already_logged_in: "به نظر می‌رسد می‌خواهید دعوت کاربری دیگری را تایید کنید. اگر کاربر %{current_user} نیستید لطفا خارج شده و دوباره وارد سایت شوید."
second_factor_title: "احراز هویت دو مرحله ای"
second_factor_backup_description: "لطفا یکی از کدهای پشتیبان را وارد کنید:"
admin:
email:
sent_test: "فرستاده شد!"
@ -2281,6 +2282,8 @@ fa_IR:
label: "دسته‌بندی هایی که دارای موضوعات برجسته هستند"
categories_and_latest_topics:
label: "دسته‌بندی‌ها و آخرین موضوعات"
categories_and_top_topics:
label: "دسته بندی ها و مباحث داغ"
emoji:
title: "شکلک"
description: "نوع شکلک مورد نظرتان را انتخاب کنید. می‌توانید از بخش مدیریت شکلک های سفارشی اضافه کنید."

View File

@ -177,7 +177,6 @@ fi:
confirm_email: "<p>Melkein valmista! Lähetimme aktivointiviestin sähköpostiosoitteeseesi. Aktivoi tilisi noudattamalla sähköpostissa kerrottuja ohjeita.</p><p>Jos viesti ei saavu, tarkistathan roskapostikansiosi.</p>"
bulk_invite:
file_should_be_csv: "Ladattavan tiedoston tulee olla CSV-muodossa."
max_rows: "Kerrallaan voi lähettää enintään 50 000 kutsua. Jaa tiedosto pienempiin osiin."
error: "Tiedoston lataus epäonnistui. Yritä myöhemmin uudelleen."
topic_invite:
failed_to_invite: "Käyttäjää ei voi kutsua ketjuun, jollei hän ole jonkun näistä ryhmistä jäsen: %{group_names}."
@ -296,10 +295,6 @@ fi:
revert_version_same: "Nykyinen revisio on sama, kuin jonka yrität palauttaa."
excerpt_image: "kuva"
groups:
success:
bulk_add:
one: "%{count} käyttäjä lisättiin ryhmään."
other: "%{count} käyttäjää lisättiin ryhmään."
errors:
grant_trust_level_not_valid: "'%{trust_level}' ei kelpaa luottamustasoksi."
can_not_modify_automatic: "Et voi muokata automaattista ryhmää"
@ -1064,7 +1059,7 @@ fi:
title: "Anonyymit"
xaxis: "Päivä"
yaxis: "Anonyymien sivukatselut"
description: "Kuinka monta sivunkatselua kirjautumattomilta vierailta."
description: "Kuinka monta sivunkatselua sisäänkirjautumattomilta vierailta."
page_view_logged_in_reqs:
title: "Kirjautuneita"
xaxis: "Päivä"
@ -1117,7 +1112,7 @@ fi:
title: "Aika ensimmäiseen vastaukseen"
xaxis: "Päivä"
yaxis: "Keskimääräinen aika (tuntia)"
description: "Keskimääräinen aika (tunteina) siihen, kun uuteen ketjuun vastataan ensimmäisen kerran."
description: "Keskimääräinen aika (tunteina) siihen, että uusiin ketjuihin vastataan."
topics_with_no_response:
title: "Ketjut, joihin ei ole vastattu"
xaxis: "Päivä"
@ -1699,7 +1694,6 @@ fi:
max_api_keys_per_user: "Enimmäismäärä rajapinnan käyttäjäavaimia käyttäjää kohden"
min_trust_level_for_user_api_key: "Vähimmäisluottamustaso, joka vaaditaan rajapinnan käyttäjäavainten muodostamiseen"
allowed_user_api_push_urls: "Sallitut URL-osoitteet "
expire_user_api_keys_days: "Kuinka monessa päivässä rajapinnan käyttäjäavain vanhenee (0 niin ei koskaan)"
tagging_enabled: "Ota käyttöön ketjujen tunnisteet?"
min_trust_to_create_tag: "Vähimmäisluottamustaso, jolla voi luoda tunnisteita."
max_tags_per_topic: "Suurin tunnisteiden määrä, joka voi liittyä ketjuun."
@ -2255,14 +2249,6 @@ fi:
csv_export_succeeded:
title: "CSV:n vienti onnistui"
subject_template: "[%{export_title}] Tiedostojen vienti valmis"
text_body_template: |
Tietojen vienti onnistui! :dvd:
<a class="attachment" href="%{download_link}">%{file_name}</a> (%{file_size})
Yllä oleva latauslinkki toimii 48 tunnin ajan.
Tiedot on pakattu GZIP-arkistoksi. Jos arkisto ei purkaudu kun yrität avata sitä, käytä täällä suositeltuja työkaluja: https://www.gzip.org/#faq4
csv_export_failed:
title: "CSV:n vienti epäonnistui"
subject_template: "Datan vienti epäonnistui"

File diff suppressed because it is too large Load Diff

View File

@ -188,7 +188,7 @@ he:
confirm_email: "<p>כמעט סיימת! שלחנו הודעת הפעלה לכתובת הדוא״ל שלך. נא לעקוב אחר ההנחיות המופיעות בהודעה כדי להפעיל את החשבון שלך.</p><p>אם ההודעה לא הגיעה אליך כדאי לבדוק בתיקיית הספאם.</p>"
bulk_invite:
file_should_be_csv: "הקובץ שנשלח אמור להיות בתסדיר csv."
max_rows: "מותר לשלוח עד 50,000 הודעות כל פעם. כדאי לנסות לפצל את הקובץ לחלקים קטנים יותר."
max_rows: "%{max_bulk_invites} ההזמנות הראשונות נשלחו. כדאי לנסות לפצל את הקובץ לחלקים קטנים יותר."
error: "אירעה שגיאה בשליחת הקובץ. נא לנסות שוב מאוחר יותר."
topic_invite:
failed_to_invite: "לא ניתן להזמין את המשתמש לנושא הזה בהעדר חברות באחת הקבוצות הבאות: %{group_names}"
@ -327,10 +327,10 @@ he:
groups:
success:
bulk_add:
one: "משתמש אחד נוסף לקבוצה."
two: "%{count} משתמשים נוספו לקבוצה."
many: "%{count} משתמשים נוספו לקבוצה."
other: "%{count} משתמשים נוספו לקבוצה."
one: "נוסף משתמש %{count} לקבוצה."
two: "נוספו %{count} משתמשים לקבוצה."
many: "נוספו %{count} משתמשים לקבוצה."
other: "נוספו %{count} משתמשים לקבוצה."
errors:
grant_trust_level_not_valid: "%{trust_level} אינה דרגת אמון תקפה."
can_not_modify_automatic: "אין לך אפשרות לערוך קבוצה אוטומטית"
@ -1120,7 +1120,6 @@ he:
title: "אלמוני"
xaxis: "יום"
yaxis: "צפיות אנונימיות"
description: "מספר הצפיות החדשות בעמודים ממשתמשים שלא נכנסו לחשבון שלהם."
page_view_logged_in_reqs:
title: "מחובר/ת"
xaxis: "יום"
@ -1174,7 +1173,6 @@ he:
title: "זמן לתגובה הראשונה"
xaxis: "יום"
yaxis: "זמן ממוצע (שעות)"
description: "זמן ממוצע (בשעות) של התגובה הראשונה לנושאים חדשים."
topics_with_no_response:
title: "נושאים ללא תגובות"
xaxis: "יום"
@ -1279,6 +1277,7 @@ he:
educate_until_posts: "כאשר המשתמש/ת מתחילים להקיש את (n) הפוסטים הראשונים שלהם, הציגו פאנל הנחיה למשתמש באזור חיבור הפוסטים."
title: "שם האתר הזה, כפי שהוא משמש בתגית הכותרת."
site_description: "תארו את האתר הזה במשפט אחד, כפי שהוא מופיע במטא-תגית התיאור."
short_site_description: "תיאור קצר, כפי שמתואר בתגית הכותרת באתר הבית."
contact_url: "כתובת יצירת הקשר של האתר הזה. נעשה בה שימוש בטופס יצירת הקשר תחת <a href='%{base_path}/about' target='_blank'>/about</a> לטיפול בנושאים דחופים."
crawl_images: "לקבל תמונות מכתובות מרוחקות כדי לציין את ממדי הרוחב והגובה הנכונים."
download_remote_images_to_local: "המרת תמונות מרוחקות למקומיות על ידי הורדתן, פעולה זו מסייעת במניעת תמונות שבורות."
@ -1732,6 +1731,8 @@ he:
default_categories_muted: "רשימת קטגוריות שמושתקות כברירת מחדל."
default_categories_watching_first_post: "רשימת קטגוריות שבה הפוסט הראשון בכל נושא ייצפה אוטומטית."
default_text_size: "גודל הטקסט שנבחר כבררת מחדל"
default_title_count_mode: "מצב בררת מחדל למונה כותרות עמודים"
retain_web_hook_events_period_days: "מספר הימים לשמירת רשומות אירועי התלייה."
allow_user_api_keys: "איפשור יצירת מפתחות API למשתמשים"
allow_user_api_key_scopes: "רשימת אזורים מותרים למפתחות API של משתמשים"
max_api_keys_per_user: "מספר מקסימלי של מפתחות API של משתמש לכל משתמש"
@ -1778,6 +1779,10 @@ he:
enable_sso_disabled: "אתם חייבים קודם כל לאפשר ״אפשור sso״ לפני שאתם מאפשרים הגדרה זו."
min_username_length_range: "לא ניתן לקבוע את המינימום מעל המקסימום."
max_username_length_range: "לא ניתן לקבוע את המקסימום מתחת למינימום."
invalid_hex_value: "ערכי הצבעים חייבים להיות קודים הקסדצימליים באורך 6 תווים."
category_search_priority:
very_low_weight_invalid: "לא ניתן להגדיר משקל מעבר ל־category_search_priority_low_weight."
low_weight_invalid: "לא ניתן להגדיר משקל שווה או גדול מ־1 או קטן מ־category_search_priority_very_low_weight."
unicode_username_whitelist:
regex_invalid: "הביטוי הרגולרי שגוי: %{error}"
leading_trailing_slash: "אסור שהביטוי הרגולרי יתחיל או יסתיים בלוכסן."
@ -1816,6 +1821,29 @@ he:
errors:
different_topics: "לא ניתן למזג פוסטים ששייכים לנושאים שונים."
different_users: "לא ניתן למזג פוסטים ששייכים למשתמשים שונים."
move_posts:
new_topic_moderator_post:
one: "אחד הפוסטים פוצל לנושא חדש: %{topic_link}"
two: "%{count} פוסטים פוצלו לנושא חדש: %{topic_link}"
many: "%{count} פוסטים פוצלו לנושא חדש: %{topic_link}"
other: "%{count} פוסטים פוצלו לנושא חדש: %{topic_link}"
new_message_moderator_post:
one: "אחד הפוסטים פוצל להודעה חדשה: %{topic_link}"
two: "%{count} פוסטים פוצלו להודעה חדשה: %{topic_link}"
many: "%{count} פוסטים פוצלו להודעה חדשה: %{topic_link}"
other: "%{count} פוסטים פוצלו להודעה חדשה: %{topic_link}"
existing_topic_moderator_post:
one: "אחד הפוסטים אוחד לנושא קיים: %{topic_link}"
two: "%{count} פוסטים אוחדו לנושא קיים: %{topic_link}"
many: "%{count} פוסטים אוחדו לנושא קיים: %{topic_link}"
other: "%{count} פוסטים אוחדו לנושא קיים: %{topic_link}"
existing_message_moderator_post:
one: "אחד הפוסטים מוזג להודעה קיימת: %{topic_link}"
two: "%{count} פוסטים מוזגו להודעה קיימת: %{topic_link}"
many: "%{count} פוסטים מוזגו להודעה קיימת: %{topic_link}"
other: "%{count} פוסטים מוזגו להודעה קיימת: %{topic_link}"
change_owner:
post_revision_text: "הבעלות הועברה"
topic_statuses:
autoclosed_message_max_posts:
one: "הודעה זו נסגרה אוטומטית אחרי שהגיעה למספר המקסימלי של תגובות: %{count} ."
@ -1917,7 +1945,13 @@ he:
click_to_continue: "יש ללחוץ כאן כדי להמשיך."
already_logged_in: "אופס, נראה שאתם מנסים לקבל הזמנה שנועדה למשתמש אחר. אם אתם לא %{current_user}, אנא התנתקו ונסו שוב."
second_factor_title: "אימות ב2 גורמים"
second_factor_description: "נא להקליד את קוד האימות הנדרש מהיישומון שלך:"
second_factor_backup_description: "אנא הכניסו את קודי הגיבוי שלכם:"
second_factor_backup_title: "קוד גיבוי לאימות דו־שלבי"
invalid_second_factor_code: "קוד האימות שגוי. מותר להשתמש בכל קוד פעם אחת בלבד."
second_factor_toggle:
totp: "להשתמש ביישומון אימות במקום"
backup_code: "להשתמש בקוד גיבוי במקום"
admin:
email:
sent_test: "נשלח!"
@ -1949,6 +1983,12 @@ he:
destroy_reasons:
same_ip_address: "אותה כתובת ה־IP (%{ip_address}) כמו משתמשים אחרים"
inactive_user: "משתמש בלתי פעיל"
reviewables_reminder:
subject_template:
one: "פריט %{count} ממתין לסקירה"
two: "%{count} פריטים ממתינים לסקירה"
many: "%{count} פריטים ממתינים לסקירה"
other: "%{count} פריטים ממתינים לסקירה"
unsubscribe_mailer:
title: "שולח-מיילים לביטול מנוי"
subject_template: "אשרו שאינכם מעוניינים יותר לקבל עדכוני דוא\"ל מ%{site_title}"
@ -1961,14 +2001,71 @@ he:
אם אתם מעוניינים להמשיך לקבל עדכוני מייל, אתם יכולים להתעלם ממייל זה.
invite_mailer:
title: "שולח-מיילים להזמנה"
subject_template: "הוזמנת על ידי %{inviter_name} לנושא %{topic_title} בפורום %{site_domain_name}"
text_body_template: |
הוזמנת על ידי%{inviter_name} לדיון
> **%{topic_title}**
>
> %{topic_excerpt}
בפורום
> %{site_title} -- %{site_description}
אם מעניין אותך, עליך ללחוץ על הקישור שלהלן:
%{invite_link}
custom_invite_mailer:
title: "שולח-מיילים מותאם-אישית להזמנה"
subject_template: "הוזמנת על ידי %{inviter_name} לנושא %{topic_title} בפורום %{site_domain_name}"
text_body_template: |
הוזמנת על ידי %{inviter_name} לדיון
> **%{topic_title}**
>
> %{topic_excerpt}
בפורום
> %{site_title} -- %{site_description}
עם ההערה הבאה
> %{user_custom_message}
אם מעניין אותך, עליך ללחוץ על הקישור שלהלן:
%{invite_link}
invite_forum_mailer:
title: "שולח-מיילים להזמנה לפורום"
subject_template: "קיבלת הזמנה מאת %{inviter_name} להצטרף אל %{site_domain_name}"
text_body_template: |
הוזמנת על ידי %{inviter_name} להצטרף אל
> **%{site_title}**
>
> %{site_description}
אם מעניין אותך, עליך ללחוץ על הקישור שלהלן:
%{invite_link}
custom_invite_forum_mailer:
title: "דואר הזמנה לפורום מותאם אישית"
subject_template: "קיבלת הזמנה מאת %{inviter_name} להצטרף אל %{site_domain_name}"
text_body_template: |
הוזמנת על ידי %{inviter_name} להצטרף אל
> **%{site_title}**
>
> %{site_description}
עם ההערה הבאה
> %{user_custom_message}
אם מעניין אותך, עליך ללחוץ על הקישור שלהלן:
%{invite_link}
invite_password_instructions:
title: "הנחיות סיסמה למוזמנים"
subject_template: "צרו סיסמה עבור חשבון ה-%{site_name} שלכם."
@ -2216,6 +2313,10 @@ he:
email_revoked:
title: "דוא״ל נשלל"
subject_template: "כתובת הדוא״ל שלך נכונה?"
text_body_template: |
לא הצלחנו להגיע אליך דרך דוא״ל, עמך הסליחה. ההודעות האחרונות ששלחנו לך חזרו עקב בעיית שליחה.
נוכל לבקש ממך לוודא ש[כתובת הדוא״ל שלך](%{base_url}/my/preferences/email) תקינה וזמינה? ייתכן שכדאי לך להוסיף את כתובת הדוא״ל שלנו לספר הכתובות / רשימת אנשי הקשר שלך כדי לשפר את איכות השליחה.
email_bounced: |
ההודעה אל %{email} הוחזרה.
@ -2224,6 +2325,15 @@ he:
``` text
%{raw}
```
ignored_users_summary:
text_body_template: |
שלום רב,
זו הודעה אוטומטית מטעם %{site_name} כדי ליידע אותך ש[פרופיל המשתמש הזה](%{base_url}/u/%{username}/summary) נכנס לרשימת ההתעלמות של %{ignores_threshold} משתמשים אחרים. ייתכן שמדובר במחדל שהולך ומתפתח בקרב קהילתנו.
מוטב אולי לסקור את הפעילות האחרונה של המשתמש הזה ואולי גם של משתמשים אחרים ב[דוח המשתמשים שבהתעלמות](%{base_url}/admin/reports/top_ignored_users).
להדרכה נוספת, ניתן לעיין ב[הנחיות הקהילה שלנו](%{base_url}/guidelines).
too_many_spam_flags:
title: "יותר מידי דיגלי ספאם"
subject_template: "חשבון חדש בהשהיה"
@ -2306,7 +2416,9 @@ he:
title: "ביטול מנוי"
description: "לא מעוניינים בקבלת המיילים האלו? אין בעיה! לחצו למטה כדי להסיר את עצמכם מהמנוי מיידית:"
reply_by_email: "[בקרו בנושא](%{base_url}%{url}) או ענו למייל זה כדי להגיב."
reply_by_email_pm: "יש [לבקר בהודעה](%{base_url}%{url}) או להשיב להודעת דוא״ל זו כדי להגיב אל %{participants}."
only_reply_by_email: "השיבו למייל זה כדי לענות."
only_reply_by_email_pm: "יש להשיב להודעה הזאת כדי להגיב אל %{participants}."
visit_link_to_respond: "[בקרו בנושא](%{base_url}%{url}) כדי לענות."
posted_by: "פורסם על ידי %{username} ב %{post_date}"
pm_participants: "משתתפים: %{participants}"
@ -2621,6 +2733,9 @@ he:
%{base_url}/u/activate-account/%{email_token}
אם הקישור שלהלן אינו זמין ללחיצה, מוטב לנסות להעתיק ולהדביק אותו לסרגל הכתובות של הדפדפן שלך.
suspicious_login:
title: "התראת כניסה חדשה"
subject_template: "[%{site_name}] כניסה חדשה מ%{location}"
page_not_found:
title: "אופס! הדף לא קיים או שהוא פרטי."
popular_topics: "פופלארי"
@ -3018,6 +3133,8 @@ he:
read_guidelines:
name: קראו את ההנחיות
description: "מוטב לעיין ב<a href=\"%{base_uri}/guidelines\">כללי הקהילה</a>"
long_description: |
עיטור זה מוענק על <a href="%{base_uri}/guidelines">קריאת הנחיות הקהילה</a>. התנהלות לפי הכללים המנחים הפשוטים האלה ושיתופים מסייעים בבניית קהילה בטוחה, מהנה וצומחת. תמיד עליך לזכור כי יש שם בן אדם אחר, בדיוק כמוך, בצד השני של המסך. יש לנהוג בצורה נאותה!
reader:
name: קוראים
description: קראו כל תגובה בנושא עם למעלה מ 100 תגובות
@ -3066,6 +3183,8 @@ he:
crazy_in_love:
name: מאוהבים בטירוף
description: השתמשו ב 50 לייקים ביום 20 פעם
long_description: |
עיטור זה מוענק לך לאחר שהשתמשת בכל 50 הלייקים היומיים שלך במשך 20 ימים. חבל על הזמן! התנהגותך היא מופת לחברי הקהילה האחרים!
thank_you:
name: תודה רבה
description: יש לכם 20 פוסטים שנאהבו ונתתם 10 לייקים
@ -3132,6 +3251,11 @@ he:
title: "תגיות"
staff_tag_disallowed: 'רק הסגל יכול להוסיף את התגית „%{tag}”.'
staff_tag_remove_disallowed: 'רק הסגל יכול להסיר את התגית „%{tag}”.'
minimum_required_tags:
one: "עליך לבחור לפחות בתגית %{count}."
two: "עליך לבחור לפחות %{count} תגיות."
many: "עליך לבחור לפחות %{count} תגיות."
other: "עליך לבחור לפחות %{count} תגיות."
upload_row_too_long: "בקובץ ה־CSV אמורה להופיע תגית אחת בכל שורה. מותר להוסיף פסיק לאחר תגית ואז את שם קבוצת התגיות."
rss_by_tag: "נושאים מתוייגים %{tag}"
finish_installation:
@ -3240,6 +3364,9 @@ he:
icons:
title: "אייקונים"
fields:
favicon:
label: "סמל דפדפן"
description: "תמונת סמל שמשמשת לייצוג האתר שלך בצורה יפה גם כשהיא מוקטנת מול הדפדפנים. סיומות קובצי התמונות המומלצות הן PNG או JPG. אנו נשתמש בלוגו הריבועי כבררת מחדל."
large_icon:
label: "אייקון גדול"
homepage:
@ -3267,6 +3394,7 @@ he:
description: "איזה סגנון אמוג׳יז תעדיפו לקהילה שלכם? אתם יכולים להוסיף עוד אמוג׳יז מותאמים אישית תחת ניהול, התאמה אישית, אמוג׳י."
invites:
title: "הזמנת סגל"
description: "כמעט סיימת! אולי נזמין כמה אנשים כדי <a href='https://blog.discourse.org/2014/08/building-a-discourse-community/' target='blank'>לעורר דיונים</a> עם נושאים מעניינים ותגובות שיניעו קדימה את הקהילה שלך."
disabled: "מאחר שכניסה בשליטה מקומית מנוטרלת, אי אפשר לשלוח לכולם הזמנות. נא להמשיך לשלב הבא."
finished:
title: "ה Discourse שלכם מוכן!"
@ -3301,6 +3429,10 @@ he:
low: "נמוכה"
medium: "בינונית"
high: "גבוהה"
must_claim: "עליך לדרוש פריטים בטרם יתאפשר לך לבצע עליהם פעולות."
user_claimed: "הפריט נדרש על ידי משתמש אחר."
missing_version: "עליך לספק משתנה גרסה"
conflict: "אירעה סתירת עדכון שמונעת ממך לעשות את זה."
reasons:
category: "פוסטים בקטגוריה זו דורשים אימות ידני של הסגל. יש לעיין בהגדרות הקטגוריה."
must_approve_users: "כל המשתמשים החדשים חייבים לעבור את אישור הסגל. יש לעיין בנושא `must_approve_users` (חובת אישור משתמשים)."

View File

@ -292,10 +292,6 @@ hy:
revert_version_same: "Ընթացիկ տարբերակը նույնն է, ինչ այն, որը Դուք փորձում եք վերադարձնել:"
excerpt_image: "նկար"
groups:
success:
bulk_add:
one: "%{count} օգտատեր ավելացվել է խմբին:"
other: "%{count} օգտատեր ավելացվել է խմբին:"
errors:
grant_trust_level_not_valid: "'%{trust_level}' -ը վավեր վստահության մակարդակ չէ:"
can_not_modify_automatic: "Դուք չեք կարող փոփոխել ավտոմատ խումբը"
@ -980,7 +976,6 @@ hy:
title: "Անանուն"
xaxis: "Օր"
yaxis: "Անանուն Էջադիտումներ"
description: "Հաշիվ մուտք չգործած այցելուների կողմից նոր էջերի դիտումների քանակը:"
page_view_logged_in_reqs:
title: "Մուտքագրված"
xaxis: "Օր"
@ -1034,7 +1029,6 @@ hy:
title: "Առաջին արձագանքի ժամանակը"
xaxis: "Օր"
yaxis: "Միջին ժամանակը (Ժամ)"
description: "Նոր թեմաներին առաջին արձագանքի միջին ժամանակը (ժամով):"
topics_with_no_response:
title: "Պատասխան չունեցող թեմաներ"
xaxis: "Օր"
@ -1217,7 +1211,6 @@ hy:
maximum_session_age: "Օգտատերը կմնա մուտքագրված վերջին այցելությունից n ժամ անց"
ga_universal_domain_name: "Google Universal Analytics (analytics.js) դոմենի անուն, օրինակ՝ mysite.com; այցելեք <a href='https://google.com/analytics' target='_blank'>https://google.com/analytics</a>"
ga_universal_auto_link_domains: "Միացնել Google Universal Analytics (analytics.js) խաչաձև դոմենի դիտումը: Այս դոմնեների ելքային հղումները կունենան իրենց ավելացված հաճախորդի id: Այցելեք <a href='https://support.google.com/analytics/answer/1034342?hl=en' target='_blank'>Google's Cross-Domain Tracking guide.</a>"
gtm_container_id: "Google Tag Manager container id. eg: GTM-ABCDEF. <br/>Note: third-party scripts loaded by GTM may need to be whitelisted in 'content security policy script src'."
enable_escaped_fragments: "Վերադարձ դեպի Google's Ajax-Crawling API , եթե ոչ մի ցանցային տվայլների հավաքագրիչ (webcrawler) հայտնաբերված չէ: Այցելեք <a href='https://developers.google.com/webmasters/ajax-crawling/docs/learn-more' target='_blank'>https://developers.google.com/webmasters/ajax-crawling/docs/learn-more</a>"
moderators_create_categories: "Թույլատրել մոդերատորներին ստեղծել նոր կատեգորիաներ"
cors_origins: "Թույլատրելի origin-ներ խաչաձև origin հարցումների համար (CORS): Յուրաքանչյուր origin պետք է ներառի http:// կամ https://: DISCOURSE_ENABLE_CORS env փոփոխականը պետք է սահմանված լինի true ՝ CORS -ի միացման համար:"
@ -1277,7 +1270,6 @@ hy:
enable_sso_provider: "Իրականացնել Discourse SSO մատակարարի պրոտոկոլը /session/sso_provider վերջնակետում. պահանջվում է տեղադրել sso_provider_secrets "
sso_url: "Վերջնակետի եզակի նշանի URL (պետք է պարունակի http:// կամ https://)"
sso_secret: "Գաղտնի տող, որը օգտագործվում է կրիպտոգրաֆիկ կերպով SSO տեղեկատվությունը նույնականացնելու համար, համոզվեք, որ այն ունի 10 կամ ավելի սիմվոլ"
sso_provider_secrets: "Դոմեն-գաղտնի արժեք զույգերի ցանկ, որոնք օգտագործում են Discourse-ը՝ որպես SSO մատակարար: Համողվեք, որ SSO գաղտնի արժեքը ունի 10 կամ ավելի սիմվոլ երկարություն: * նշանը կարող է օգտագործվել ցանկացած դոմենի կամ դրա մի մասի համընկնման համար (օրինակ՝ *.example.com):"
sso_overrides_bio: "Վերասահմանում է օգտատիրոջ կենսագրությունը իր պրոֆիլում և կանխարգելում է օգտատիրոջը այն փոփոխելուց"
sso_overrides_groups: "Համաժամանակեցնել բոլոր ձեռքով գրված խմբերի անդամակցությունները՝ խմբերի sso ատրիբուտում սահմանված խմբերի համար: (ՈՒՇԱԴՐՈՒԹՅՈՒՆ՝ եթե Դուք չեք սահմանում խմբեր, բոլոր ձեռքով գրված խմբերի անդամակցություներրը կջնջվեն օգտատիրոջ համար)"
sso_overrides_email: "Վերասահմանում է տեղական էլ. հասցեն արտաքին կայքի էլ. հասցեով SSO տվյալների ուղարկումից յուրաքանչյուր մուտքի ժամանակ և կանխում է տեղական փոփոխությունները: (ՈՒՇԱԴՐՈՒԹՅՈՒՆ՝ անհամապատասխանությունները կարող են տեղի ունենալ տեղական էլ. հասցեների նորմալիզացման պատճառով)"
@ -1652,7 +1644,6 @@ hy:
min_trust_level_for_user_api_key: "Օգտատիրոջ API key-երի գեներացման համար անհրաժեշտ վստահության մակարդակը"
allowed_user_api_auth_redirects: "Թույլատրելի URL նույնականացման վերաուղարկման համար օգտատիրոջ API key -երի համար: * նշանը կարող օգտագործվել դրա ցանկացած մասի հետ համընկնման համար (օրինակ՝ www.example.com/*)."
allowed_user_api_push_urls: "Օգտատիրոջ API -ին սերվերի push անելու համար թույլատրված URL-ները"
expire_user_api_keys_days: "Օրերի քանակը, որից հետո օգտատիրոջ API key -ը ավտոմատ դառնում է ժամկետանց (0 երբեք չդառնալու համար)"
tagging_enabled: "Միացնե՞լ թեմաների թեգերը:"
min_trust_to_create_tag: "Դրոշակ ստեղծելու համար պահանջվող նվազագույն վստահության մակարդակը:"
max_tags_per_topic: "Թեմային տրվող առավելագույն թեգերը"
@ -2182,14 +2173,6 @@ hy:
csv_export_succeeded:
title: "CSV Արտահանումը Հաջողվեց"
subject_template: "[%{export_title}] Տվյալների արտահանումը ավարտվեց"
text_body_template: |
Ձեր տվյալների արտահանումը հաջող էր! :dvd:
<a class="attachment" href="%{download_link}">%{file_name}</a> (%{file_size})
Վերևի ներբեռնման հղումը վավեր կլինի 8 ժամ:
Տվյալները սեղմված են gzip արխիվում: Եթե արխիվը ինքն իրեն չի ընդլայնում, երբ Դուք այն բացում եք, օգտագործեք այստեղ խորհուրդ տրված գործիքները՝ https://www.gzip.org/#faq4
csv_export_failed:
title: "CSV Արտահանումը Ձախողվեց "
subject_template: "Տվյալների արտահանումը ձախողվել է"

Some files were not shown because too many files have changed in this diff Show More