Version bump

This commit is contained in:
Neil Lalonde 2015-06-11 16:07:26 -04:00
commit ac079e6240
152 changed files with 1080 additions and 481 deletions

View File

@ -147,13 +147,13 @@ GEM
thor (~> 0.15)
libv8 (3.16.14.7)
listen (0.7.3)
logster (0.8.1)
lru_redux (0.8.4)
logster (0.8.2)
lru_redux (1.1.0)
mail (2.5.4)
mime-types (~> 1.16)
treetop (~> 1.4.8)
memory_profiler (0.9.0)
message_bus (1.0.12)
memory_profiler (0.9.3)
message_bus (1.0.13)
rack (>= 1.1.3)
redis
metaclass (0.0.4)
@ -182,7 +182,7 @@ GEM
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (~> 1.2)
oj (2.12.0)
oj (2.12.9)
omniauth (1.2.2)
hashie (>= 1.2, < 4)
rack (~> 1.0)
@ -208,7 +208,7 @@ GEM
omniauth-twitter (1.0.1)
multi_json (~> 1.3)
omniauth-oauth (~> 1.0)
onebox (1.5.19)
onebox (1.5.20)
moneta (~> 0.7)
multi_json (~> 1.7)
mustache (~> 0.99)
@ -486,4 +486,4 @@ DEPENDENCIES
unicorn
BUNDLED WITH
1.10.2
1.10.3

View File

@ -2,7 +2,7 @@ import BufferedContent from 'discourse/mixins/buffered-content';
import ScrollTop from 'discourse/mixins/scroll-top';
import SiteSetting from 'admin/models/site-setting';
const CustomTypes = ['bool', 'enum', 'list', 'url_list'];
const CustomTypes = ['bool', 'enum', 'list', 'url_list', 'host_list'];
export default Ember.Component.extend(BufferedContent, ScrollTop, {
classNameBindings: [':row', ':setting', 'setting.overridden', 'typeClass'],

View File

@ -1,32 +0,0 @@
export default Ember.Component.extend({
_setupUrls: function() {
const value = this.get('value');
this.set('urls', (value && value.length) ? value.split("\n") : []);
}.on('init').observes('value'),
_urlsChanged: function() {
this.set('value', this.get('urls').join("\n"));
}.observes('urls.@each'),
urlInvalid: Ember.computed.empty('newUrl'),
keyDown(e) {
if (e.keyCode === 13) {
this.send('addUrl');
}
},
actions: {
addUrl() {
if (this.get('urlInvalid')) { return; }
this.get('urls').addObject(this.get('newUrl'));
this.set('newUrl', '');
},
removeUrl(url) {
const urls = this.get('urls');
urls.removeObject(url);
}
}
});

View File

@ -0,0 +1,34 @@
export default Ember.Component.extend({
classNameBindings: [':value-list'],
_setupCollection: function() {
const values = this.get('values');
this.set('collection', (values && values.length) ? values.split("\n") : []);
}.on('init').observes('values'),
_collectionChanged: function() {
this.set('values', this.get('collection').join("\n"));
}.observes('collection.@each'),
inputInvalid: Ember.computed.empty('newValue'),
keyDown(e) {
if (e.keyCode === 13) {
this.send('addValue');
}
},
actions: {
addValue() {
if (this.get('inputInvalid')) { return; }
this.get('collection').addObject(this.get('newValue'));
this.set('newValue', '');
},
removeValue(value) {
const collection = this.get('collection');
collection.removeObject(value);
}
}
});

View File

@ -39,6 +39,11 @@ export default Ember.ArrayController.extend(Presence, {
});
if (matches.length > 0) {
matchesGroupedByCategory[0].siteSettings.pushObjects(matches);
matchesGroupedByCategory.pushObject({
nameKey: settingsCategory.nameKey,
name: I18n.t('admin.site_settings.categories.' + settingsCategory.nameKey),
siteSettings: matches
});
}
});

View File

@ -1,18 +0,0 @@
{{#if urls}}
<div class='urls'>
{{#each url in urls}}
<div class='url'>
{{d-button action="removeUrl"
actionParam=url
icon="times"
class="btn-small no-text"}}
<a href="{{unbound url}}" target="_blank">{{url}}</a>
</div>
{{/each}}
</div>
{{/if}}
<div class='input'>
{{text-field value=newUrl placeholderKey="admin.site_settings.add_url"}}
{{d-button action="addUrl" icon="plus" class="btn-primary btn-small no-text" disabled=urlInvalid}}
</div>

View File

@ -0,0 +1,18 @@
{{#if collection}}
<div class='values'>
{{#each collection as |value|}}
<div class='value'>
{{d-button action="removeValue"
actionParam=value
icon="times"
class="btn-small no-text"}}
{{value}}
</div>
{{/each}}
</div>
{{/if}}
<div class='input'>
{{text-field value=newValue placeholderKey=addKey}}
{{d-button action="addValue" icon="plus" class="btn-primary btn-small no-text" disabled=inputInvalid}}
</div>

View File

@ -0,0 +1,3 @@
{{value-list values=buffered.value addKey="admin.site_settings.add_host"}}
{{setting-validation-message message=validationMessage}}
<div class='desc'>{{{unbound setting.description}}}</div>

View File

@ -1,3 +1,3 @@
{{url-list value=buffered.value}}
{{value-list value=buffered.value addKey="admin.site_settings.add_url"}}
{{setting-validation-message message=validationMessage}}
<div class='desc'>{{{unbound setting.description}}}</div>

View File

@ -27,7 +27,7 @@ export default DiscourseController.extend({
const selection = window.getSelection();
// no selections
if (selection.rangeCount === 0) return;
if (selection.isCollapsed) return;
// retrieve the selected range
const range = selection.getRangeAt(0),

View File

@ -166,7 +166,7 @@ Discourse.Emoji.search = function(term, options) {
var maxResults = (options && options["maxResults"]) || -1;
if (maxResults === 0) { return []; }
toSearch = toSearch || _.merge(_.keys(emojiHash), _.keys(extendedEmoji));
toSearch = toSearch || _.union(_.keys(emojiHash), _.keys(extendedEmoji)).sort();
var i, results = [];

View File

@ -0,0 +1,43 @@
function replaceSpan($e, username) {
$e.replaceWith("<a href='" +
Discourse.getURL("/users/") + username.toLowerCase() +
"' class='mention'>@" + username + "</a>");
}
const found = [];
const checked = [];
function updateFound($mentions, usernames) {
Ember.run.scheduleOnce('afterRender', function() {
$mentions.each((i, e) => {
const $e = $(e);
const username = usernames[i];
if (found.indexOf(username) !== -1) {
replaceSpan($e, username);
} else if (checked.indexOf(username) !== -1) {
$e.addClass('mention-tested');
}
});
});
}
export function linkSeenMentions($elem, siteSettings) {
const $mentions = $('span.mention:not(.mention-tested)', $elem);
if ($mentions.length) {
const usernames = $mentions.map((_, e) => $(e).text().substr(1).toLowerCase());
const unseen = _.uniq(usernames).filter((u) => {
return u.length >= siteSettings.min_username_length && checked.indexOf(u) === -1;
});
updateFound($mentions, usernames);
return unseen;
}
return [];
}
export function fetchUnseenMentions($elem, usernames) {
return Discourse.ajax("/users/is_local_username", { data: { usernames } }).then(function(r) {
found.push.apply(found, r.valid);
checked.push.apply(checked, usernames);
});
}

View File

@ -1,59 +0,0 @@
// A local cache lookup
var localCache = [];
/**
Lookup a username and return whether it is exists or not.
@function lookup
@param {String} username to look up
@return {Promise} promise that results to whether the name was found or not
**/
function lookup(username) {
return new Em.RSVP.Promise(function (resolve) {
var cached = localCache[username];
// If we have a cached answer, return it
if (typeof cached !== "undefined") {
resolve(cached);
} else {
Discourse.ajax("/users/is_local_username", { data: { username: username } }).then(function(r) {
localCache[username] = r.valid;
resolve(r.valid);
});
}
});
}
/**
Help us link directly to a mentioned user's profile if the username exists.
@class Mention
@namespace Discourse
@module Discourse
**/
Discourse.Mention = {
/**
Paints an element in the DOM with the appropriate classes and markup if the username
it is mentioning exists.
@method paint
@param {Element} the element in the DOM to decorate
**/
paint: function(e) {
var $elem = $(e);
if ($elem.data('mention-tested')) return;
var username = $elem.text().substr(1);
$elem.addClass('mention-loading');
lookup(username).then(function(found) {
if (found) {
$elem.replaceWith("<a href='" + Discourse.getURL("/users/") + username.toLowerCase() + "' class='mention'>@" + username + "</a>");
} else {
$elem.removeClass('mention-loading').addClass('mention-tested');
}
});
}
};

View File

@ -75,7 +75,8 @@ Discourse.Category = Discourse.Model.extend({
parent_category_id: this.get('parent_category_id'),
logo_url: this.get('logo_url'),
background_url: this.get('background_url'),
allow_badges: this.get('allow_badges')
allow_badges: this.get('allow_badges'),
custom_fields: this.get('custom_fields')
},
type: this.get('id') ? 'PUT' : 'POST'
});

View File

@ -713,7 +713,7 @@ const PostStream = RestModel.extend({
// If the result was 404 the post is not found
if (status === 404) {
topic.set('errorTitle', I18n.t('topic.not_found.title'));
topic.set('notFoundHtml', result.responseText);
topic.set('notFoundHtml', result.jqXHR.responseText);
return;
}

View File

@ -3,6 +3,9 @@
<div id="banner-content">
<div class="close" {{action "dismiss"}}><i class="fa fa-times" title="{{i18n 'banner.close'}}"></i></div>
{{{banner.html}}}
{{#if currentUser.staff}}
<p><a href="{{banner.url}}">{{{i18n "banner.edit"}}}</a></p>
{{/if}}
</div>
</div>
</div>

View File

@ -43,3 +43,5 @@
<a href="/admin/site_settings/category/basic">{{i18n 'category.position_disabled_click'}}</a>
{{/if}}
</section>
{{plugin-outlet "category-custom-settings"}}

View File

@ -125,7 +125,7 @@
<div class='container'>
{{#conditional-loading-spinner condition=noErrorYet}}
{{#if model.notFoundHtml}}
{{{model.notFoundHtml}}}
<div class='not-found'>{{{model.notFoundHtml}}}</div>
{{else}}
<div class="topic-error">
<div>{{model.message}}</div>

View File

@ -63,6 +63,7 @@
<h3><span class='desc'>{{i18n 'last_post'}}</span> {{format-date user.last_posted_at leaveAgo="true"}}</h3>
{{/if}}
<h3><span class='desc'>{{i18n 'joined'}}</span> {{format-date user.created_at leaveAgo="true"}}</h3>
{{plugin-outlet "user-card-metadata"}}
</div>
{{/if}}

View File

@ -3,6 +3,7 @@ import afterTransition from 'discourse/lib/after-transition';
import loadScript from 'discourse/lib/load-script';
import avatarTemplate from 'discourse/lib/avatar-template';
import positioningWorkaround from 'discourse/lib/safari-hacks';
import { linkSeenMentions, fetchUnseenMentions } from 'discourse/lib/link-mentions';
const ComposerView = Discourse.View.extend(Ember.Evented, {
_lastKeyTimeout: null,
@ -175,13 +176,22 @@ const ComposerView = Discourse.View.extend(Ember.Evented, {
$('a.onebox', $wmdPreview).each(function(i, e) {
Discourse.Onebox.load(e, refresh);
});
$('span.mention', $wmdPreview).each(function(i, e) {
Discourse.Mention.paint(e);
});
const unseen = linkSeenMentions($wmdPreview, this.siteSettings);
if (unseen.length) {
Ember.run.debounce(this, this._renderUnseen, $wmdPreview, unseen, 500);
}
this.trigger('previewRefreshed', $wmdPreview);
},
_renderUnseen: function($wmdPreview, unseen) {
fetchUnseenMentions($wmdPreview, unseen, this.siteSettings).then(() => {
linkSeenMentions($wmdPreview, this.siteSettings);
this.trigger('previewRefreshed', $wmdPreview);
});
},
_applyEmojiAutocomplete() {
if (!this.siteSettings.enable_emoji) { return; }

View File

@ -50,7 +50,9 @@ export default Discourse.View.extend({
// deselects only when the user left click
// (allows anyone to `extend` their selection using shift+click)
if (e.which === 1 && !e.shiftKey) controller.deselectText();
if (!window.getSelection().isCollapsed &&
e.which === 1 &&
!e.shiftKey) controller.deselectText();
})
.on('mouseup.quote-button', function(e) {
view.selectText(e.target, controller);

View File

@ -48,6 +48,7 @@
//= require ./discourse/components/dropdown-button
//= require ./discourse/components/notifications-button
//= require ./discourse/components/topic-notifications-button
//= require ./discourse/lib/link-mentions
//= require ./discourse/views/composer
//= require ./discourse/lib/show-modal
//= require ./discourse/routes/discourse

View File

@ -1449,8 +1449,8 @@ table#user-badges {
}
}
.url-list {
.url {
.value-list {
.value {
border-bottom: 1px solid #ddd;
padding: 3px;
margin-right: 10px;
@ -1460,7 +1460,7 @@ table#user-badges {
text-overflow: ellipsis;
}
.urls {
.values {
margin-bottom: 10px;
}

View File

@ -68,7 +68,7 @@ aside.quote {
}
.quote-controls, .quote-controls .back:before, .quote-controls .quote-other-topic:before {
color: scale-color($primary, $lightness: 60%);
color: scale-color($primary, $lightness: 70%);
}
.cooked .highlight {

View File

@ -234,12 +234,18 @@ nav.post-controls {
// WARNING: overflow hide is required for quoted / embedded images
// which expect "normal" post width, but expansions are narrower
overflow: hidden;
padding: 10px 15px 15px 15px;
padding: 15px 15px 0 15px;
}
// this is covered by .topic-body .regular on a normal post
// but no such class structure exists for an embedded, expanded post
.cooked {
margin-top: 15px;
}
.topic-avatar {
padding-left: 15px;
padding-top: 0;
padding-top: 15px;
}
// bottom means "reply expansion" below a post
@ -266,7 +272,7 @@ nav.post-controls {
padding-right: 0;
}
.post-date { color: scale-color($primary, $lightness: 50%); }
.post-date { color: scale-color($primary, $lightness: 60%); }
.fa-arrow-up, .fa-arrow-down { margin-left: 5px; }
.reply:first-of-type .row { border-top: none; }
@ -282,7 +288,7 @@ nav.post-controls {
color: scale-color($primary, $lightness: 30%);
}
}
.arrow {color: scale-color($primary, $lightness: 50%);}
.arrow {color: scale-color($primary, $lightness: 60%);}
}
.post-action {

View File

@ -212,6 +212,10 @@ class ApplicationController < ActionController::Base
@guardian ||= Guardian.new(current_user)
end
def current_homepage
current_user ? SiteSetting.homepage : SiteSetting.anonymous_homepage
end
def serialize_data(obj, serializer, opts=nil)
# If it's an array, apply the serializer as an each_serializer to the elements
serializer_opts = {scope: guardian}.merge!(opts || {})

View File

@ -24,6 +24,10 @@ class CategoriesController < ApplicationController
discourse_expires_in 1.minute
unless current_homepage == 'categories'
@title = I18n.t('js.filters.categories.title')
end
store_preloaded("categories_list", MultiJson.dump(CategoryListSerializer.new(@list, scope: guardian)))
respond_to do |format|
format.html { render }
@ -142,6 +146,7 @@ class CategoriesController < ApplicationController
:background_url,
:allow_badges,
:slug,
:custom_fields => [params[:custom_fields].try(:keys)],
:permissions => [*p.try(:keys)])
end
end

View File

@ -1,13 +1,18 @@
class EmbedController < ApplicationController
skip_before_filter :check_xhr, :preload_json, :verify_authenticity_token
before_filter :ensure_embeddable
layout 'embed'
def comments
embed_url = params.require(:embed_url)
topic_id = TopicEmbed.topic_id_for_embed(embed_url)
embed_url = params[:embed_url]
topic_id = nil
if embed_url.present?
topic_id = TopicEmbed.topic_id_for_embed(embed_url)
else
topic_id = params[:topic_id].to_i
end
if topic_id
@topic_view = TopicView.new(topic_id,
@ -21,7 +26,8 @@ class EmbedController < ApplicationController
if @topic_view && @topic_view.posts.size == SiteSetting.embed_post_limit
@posts_left = @topic_view.topic.posts_count - SiteSetting.embed_post_limit - 1
end
else
elsif embed_url.present?
Jobs.enqueue(:retrieve_topic, user_id: current_user.try(:id), embed_url: embed_url)
render 'loading'
end
@ -30,7 +36,6 @@ class EmbedController < ApplicationController
end
def count
embed_urls = params[:embed_url]
by_url = {}
@ -53,8 +58,8 @@ class EmbedController < ApplicationController
def ensure_embeddable
if !(Rails.env.development? && current_user.try(:admin?))
raise Discourse::InvalidAccess.new('embeddable host not set') if SiteSetting.normalized_embeddable_host.blank?
raise Discourse::InvalidAccess.new('invalid referer host') if URI(request.referer || '').host != SiteSetting.normalized_embeddable_host
raise Discourse::InvalidAccess.new('embeddable hosts not set') if SiteSetting.embeddable_hosts.blank?
raise Discourse::InvalidAccess.new('invalid referer host') unless SiteSetting.allows_embeddable_host?(request.referer)
end
response.headers['X-Frame-Options'] = "ALLOWALL"

View File

@ -20,7 +20,7 @@ class ExportCsvController < ApplicationController
export_initiated_by_user_id = UserExport.where(id: export_id)[0].user_id unless UserExport.where(id: export_id).empty?
export_csv_path = UserExport.get_download_path(filename)
if export_csv_path && export_initiated_by_user_id == current_user.id
if export_csv_path && current_user.present? && export_initiated_by_user_id == current_user.id
send_file export_csv_path
else
render nothing: true, status: 404

View File

@ -60,7 +60,6 @@ class ListController < ApplicationController
list_opts[:no_definitions] = true
end
list = TopicQuery.new(user, list_opts).public_send("list_#{filter}")
list.more_topics_url = construct_url_with(:next, list_opts)
list.prev_topics_url = construct_url_with(:prev, list_opts)
@ -69,7 +68,7 @@ class ListController < ApplicationController
@rss = filter
# Note the first is the default and we don't add a title
if idx > 0 && use_crawler_layout?
if (filter.to_s != current_homepage) && use_crawler_layout?
filter_title = I18n.t("js.filters.#{filter.to_s}.title")
if list_opts[:category]
@title = I18n.t('js.filters.with_category', filter: filter_title, category: Category.find(list_opts[:category]).name)

View File

@ -9,7 +9,7 @@ class PostsController < ApplicationController
# Need to be logged in for all actions here
before_filter :ensure_logged_in, except: [:show, :replies, :by_number, :short_link, :reply_history, :revisions, :latest_revision, :expand_embed, :markdown_id, :markdown_num, :cooked, :latest]
skip_before_filter :preload_json, :check_xhr, only: [:markdown_id, :markdown_num, :short_link]
skip_before_filter :preload_json, :check_xhr, only: [:markdown_id, :markdown_num, :short_link, :latest]
def markdown_id
markdown Post.find(params[:id].to_i)
@ -42,16 +42,26 @@ class PostsController < ApplicationController
# Remove posts the user doesn't have permission to see
# This isn't leaking any information we weren't already through the post ID numbers
posts = posts.reject { |post| !guardian.can_see?(post) }
counts = PostAction.counts_for(posts, current_user)
render_json_dump(serialize_data(posts,
PostSerializer,
scope: guardian,
root: 'latest_posts',
add_raw: true,
all_post_actions: counts)
)
respond_to do |format|
format.rss do
@posts = posts
@title = "#{SiteSetting.title} - #{I18n.t("rss_description.posts")}"
@link = Discourse.base_url
@description = I18n.t("rss_description.posts")
render 'posts/latest', formats: [:rss]
end
format.json do
render_json_dump(serialize_data(posts,
PostSerializer,
scope: guardian,
root: 'latest_posts',
add_raw: true,
all_post_actions: counts)
)
end
end
end
def cooked

View File

@ -175,10 +175,12 @@ class UsersController < ApplicationController
end
def is_local_username
params.require(:username)
u = params[:username].downcase
r = User.exec_sql('select 1 from users where username_lower = ?', u).values
render json: {valid: r.length == 1}
users = params[:usernames]
users = [params[:username]] if users.blank?
users.each(&:downcase!)
result = User.where(username_lower: users).pluck(:username_lower)
render json: {valid: result}
end
def render_available_true
@ -345,7 +347,7 @@ class UsersController < ApplicationController
end
def admin_login
unless SiteSetting.enable_sso && !current_user
if current_user
return redirect_to path("/")
end

View File

@ -0,0 +1,20 @@
module ListHelper
def page_links(topic)
posts = topic.posts_count
max_pages = 10
total_pages = (posts / TopicView.chunk_size) + (posts == TopicView.chunk_size ? 0 : 1)
return if total_pages < 2
page = [total_pages - (max_pages+1), 2].max
result = "("
while page <= total_pages
result << " <a href='#{topic.relative_url}?page=#{page}'>#{page}</a> "
page += 1
end
result << ")"
result.html_safe
end
end

View File

@ -11,7 +11,7 @@ module Jobs
# remove old unmatched IP addresses
ScreenedIpAddress.where(action_type: ScreenedIpAddress.actions[:block])
.where("last_match_at < ?", last_match_threshold)
.where("last_match_at < ? OR (last_match_at IS NULL AND created_at < ?)", last_match_threshold, last_match_threshold)
.destroy_all
end

View File

@ -1,3 +1,5 @@
require_dependency 'pinned_check'
class CategoryList
include ActiveModel::Serialization
@ -17,6 +19,8 @@ class CategoryList
prune_empty
find_user_data
sort_unpinned
trim_results
end
private
@ -151,4 +155,27 @@ class CategoryList
@all_topics.each { |ft| ft.user_data = topic_lookup[ft.id] }
end
end
def sort_unpinned
if @guardian.current_user && @all_topics.present?
# Put unpinned topics at the end of the list
@categories.each do |c|
next if c.displayable_topics.blank? || c.displayable_topics.size <= latest_posts_count
unpinned = []
c.displayable_topics.each do |t|
unpinned << t if t.pinned_at && PinnedCheck.unpinned?(t, t.user_data)
end
unless unpinned.empty?
c.displayable_topics = (c.displayable_topics - unpinned) + unpinned
end
end
end
end
def trim_results
@categories.each do |c|
next if c.displayable_topics.blank?
c.displayable_topics = c.displayable_topics[0,latest_posts_count]
end
end
end

View File

@ -8,6 +8,7 @@ class OptimizedImage < ActiveRecord::Base
def self.create_for(upload, width, height, opts={})
return unless width > 0 && height > 0
return if upload.try(:sha1).blank?
DistributedMutex.synchronize("optimized_image_#{upload.id}_#{width}_#{height}") do
# do we already have that thumbnail?
@ -25,7 +26,7 @@ class OptimizedImage < ActiveRecord::Base
# create the thumbnail otherwise
original_path = Discourse.store.path_for(upload)
if original_path.blank?
external_copy = Discourse.store.download(upload)
external_copy = Discourse.store.download(upload) rescue nil
original_path = external_copy.try(:path)
end
@ -159,7 +160,7 @@ class OptimizedImage < ActiveRecord::Base
end
def self.convert_with(instructions, to)
`convert #{instructions.join(" ")}`
`convert #{instructions.join(" ")} &> /dev/null`
return false if $?.exitstatus != 0
ImageOptim.new.optimize_image!(to)

View File

@ -6,6 +6,7 @@ require_dependency 'enum'
require_dependency 'post_analyzer'
require_dependency 'validators/post_validator'
require_dependency 'plugin/filter'
require_dependency 'email_cook'
require 'archetype'
require 'digest/sha1'
@ -76,7 +77,7 @@ class Post < ActiveRecord::Base
end
def self.cook_methods
@cook_methods ||= Enum.new(:regular, :raw_html)
@cook_methods ||= Enum.new(:regular, :raw_html, :email)
end
def self.find_by_detail(key, value)
@ -161,16 +162,20 @@ class Post < ActiveRecord::Base
# case we can skip the rendering pipeline.
return raw if cook_method == Post.cook_methods[:raw_html]
# Default is to cook posts
cooked = if !self.user || SiteSetting.tl3_links_no_follow || !self.user.has_trust_level?(TrustLevel[3])
post_analyzer.cook(*args)
else
# At trust level 3, we don't apply nofollow to links
cloned = args.dup
cloned[1] ||= {}
cloned[1][:omit_nofollow] = true
post_analyzer.cook(*cloned)
end
cooked = nil
if cook_method == Post.cook_methods[:email]
cooked = EmailCook.new(raw).cook
else
cooked = if !self.user || SiteSetting.tl3_links_no_follow || !self.user.has_trust_level?(TrustLevel[3])
post_analyzer.cook(*args)
else
# At trust level 3, we don't apply nofollow to links
cloned = args.dup
cloned[1] ||= {}
cloned[1][:omit_nofollow] = true
post_analyzer.cook(*cloned)
end
end
new_cooked = Plugin::Filter.apply(:after_post_cook, self, cooked)

View File

@ -68,9 +68,16 @@ class SiteSetting < ActiveRecord::Base
@anonymous_menu_items ||= Set.new Discourse.anonymous_filters.map(&:to_s)
end
def self.normalized_embeddable_host
return embeddable_host if embeddable_host.blank?
embeddable_host.sub(/^https?\:\/\//, '')
def self.allows_embeddable_host?(host)
return false if embeddable_hosts.blank?
uri = URI(host) rescue nil
return false unless uri.present?
host = uri.host
return false unless host.present?
!!embeddable_hosts.split("\n").detect {|h| h.sub(/^https?\:\/\//, '') == host }
end
def self.anonymous_homepage

View File

@ -662,7 +662,8 @@ class Topic < ActiveRecord::Base
{
html: post.cooked,
key: self.id
key: self.id,
url: self.url
}
end
@ -842,7 +843,7 @@ class Topic < ActiveRecord::Base
end
def expandable_first_post?
SiteSetting.embeddable_host.present? && SiteSetting.embed_truncate? && has_topic_embed?
SiteSetting.embeddable_hosts.present? && SiteSetting.embed_truncate? && has_topic_embed?
end
private

View File

@ -41,7 +41,6 @@ class UserEmailObserver < ActiveRecord::Observer
def enqueue(type)
return unless notification.user.email_direct?
Jobs.enqueue_in(delay,
:user_email,
type: type,
@ -50,7 +49,8 @@ class UserEmailObserver < ActiveRecord::Observer
end
def enqueue_private(type)
return unless (notification.user.email_direct? && notification.user.email_private_messages?)
return unless notification.user.email_private_messages?
Jobs.enqueue_in(delay,
:user_email,
type: type,

View File

@ -10,7 +10,8 @@ class CategorySerializer < BasicCategorySerializer
:email_in_allow_strangers,
:can_delete,
:cannot_delete_reason,
:allow_badges
:allow_badges,
:custom_fields
def group_permissions
@group_permissions ||= begin

View File

@ -32,7 +32,8 @@ class TopicViewSerializer < ApplicationSerializer
:category_id,
:word_count,
:deleted_at,
:pending_posts_count
:pending_posts_count,
:user_id
attributes :draft,
:draft_key,

View File

@ -23,4 +23,4 @@
<% end %>
</div>
<% content_for :title do %><%= I18n.t('js.filters.categories.title') %><% end %>
<% content_for :title do %><%= @title %><% end %>

View File

@ -21,10 +21,11 @@
<a href='<%= t.relative_url %>' itemprop='item'>
<span itemprop='name'><%= t.title %></span>
</a>
<%= page_links(t) %>
<% if !@category && t.category %>
<span>[<a href='<%= t.category.url %>'><%= t.category.name %></a>]</span>
<% end %>
<span title='<%= t 'posts' %>'>(<%= t.posts_count %>)</span>
<span title='<%= t 'posts' %>'>(<a href="<%=t.last_post_url%>"><%= t.posts_count %></a>)</span>
</div>
<% end %>
</div>
@ -40,6 +41,7 @@
<% if @rss %>
<% content_for :head do %>
<%= auto_discovery_link_tag(:rss, "#{Discourse.base_url}/posts.rss", title: I18n.t("rss_description.posts")) %>
<%= auto_discovery_link_tag(:rss, { action: "#{@rss}_feed" }, title: I18n.t("rss_description.#{@rss}")) %>
<% end %>
<% end %>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:discourse="http://www.discourse.org/" xmlns:atom="http://www.w3.org/2005/Atom">
<rss version="2.0" xmlns:discourse="http://www.discourse.org/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<% lang = SiteSetting.find_by_name('default_locale').try(:value) %>
<% site_email = SiteSetting.find_by_name('contact_email').try(:value) %>
@ -14,7 +14,7 @@
<% topic_url = topic.url -%>
<item>
<title><%= topic.title %></title>
<author><%= "no-reply@example.com (@#{topic.user.username}#{" #{topic.user.name}" if (topic.user.name.present? && SiteSetting.enable_names?)})" -%></author>
<dc:creator><![CDATA[<%= "@#{topic.user.username}#{" #{topic.user.name}" if (topic.user.name.present? && SiteSetting.enable_names?)}" -%>]]></dc:creator>
<category><%= topic.category.name %></category>
<description><![CDATA[
<p><%= t('author_wrote', author: link_to("@#{topic.user.username}", "#{Discourse.base_url}/users/#{topic.user.username_lower}")).html_safe %></p>

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:discourse="http://www.discourse.org/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<% lang = SiteSetting.find_by_name('default_locale').try(:value) %>
<% site_email = SiteSetting.find_by_name('contact_email').try(:value) %>
<title><%= @title %></title>
<link><%= @link %></link>
<description><%= @description %></description>
<% @posts.each do |post| %>
<% next unless post.user %>
<item>
<title><%= post.topic.title %></title>
<dc:creator><![CDATA[<%= "@#{post.user.username}#{" #{post.user.name}" if (post.user.name.present? && SiteSetting.enable_names?)}" -%>]]></dc:creator>
<description><![CDATA[ <%= post.cooked.html_safe %> ]]></description>
<link><%= Discourse.base_url + post.url %></link>
<pubDate><%= post.created_at.rfc2822 %></pubDate>
<guid isPermaLink="false">post-<%= post.id %></guid>
</item>
<% end %>
</channel>
</rss>

View File

@ -4,14 +4,16 @@
<% @breadcrumbs = categories_breadcrumb(@topic_view.topic)
if @breadcrumbs.present? %>
<div itemscope itemtype='http://schema.org/BreadcrumbList'>
<div id='breadcrumbs'>
<% @breadcrumbs.each_with_index do |c,i| %>
<span itemprop='itemListElement' itemscope itemtype='http://schema.org/ListItem'>
<%= link_to c[:url], itemprop: 'item' do %>
<span itemprop='name'><%= c[:name] %></span>
<% end %>
</span>
<meta itemprop='position' content='<%= i + 1 %>'>
<div id="breadcrumb-<%=i%>" itemscope itemtype="http://data-vocabulary.org/Breadcrumb"
<%-if (i+1) < @breadcrumbs.length%>
itemref="breadcrumb-<%=(i+1)%>"
<%-end%>>
<a href="<%=c[:url]%>" itemprop="url">
<span itemprop="title"><%=c[:name]%></span>
</a>
</div>
<% end %>
</div>
<% end %>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<% topic_url = @topic_view.absolute_url %>
<% lang = SiteSetting.find_by_name('default_locale').try(:value) %>
@ -15,7 +15,7 @@
<% next unless post.user %>
<item>
<title><%= @topic_view.title %></title>
<author><%= "no-reply@example.com (@#{post.user.username}#{" #{post.user.name}" if (post.user.name.present? && SiteSetting.enable_names?)})" -%></author>
<dc:creator><![CDATA[<%= "@#{post.user.username}#{" #{post.user.name}" if (post.user.name.present? && SiteSetting.enable_names?)}" -%>]]></dc:creator>
<description><![CDATA[
<% post_url = Discourse.base_url + post.url %>
<p><%= t('author_wrote', author: link_to("@#{post.user.username}", user_url(post.user.username_lower))).html_safe %></p>

View File

@ -45,7 +45,7 @@
<li>
<%= link_to t.title, "#{Discourse.base_url}#{t.relative_url}" %>
<span class='post-count'><%= t.posts_count %></span>
<%= category_badge(t.category) %>
<%= category_badge(t.category, inline_style: true, absolute_url: true) %>
</li>
</ul>
<%- end -%>
@ -75,4 +75,3 @@
site_link: html_site_link,
unsubscribe_link: link_to(t('user_notifications.digest.click_here'), email_unsubscribe_url(host: Discourse.base_url, key: @unsubscribe_key))) %>
</div>

View File

@ -3,8 +3,11 @@ if Rails.configuration.respond_to?(:load_mini_profiler) && Rails.configuration.l
require 'rack-mini-profiler'
require 'flamegraph'
# TODO support Ruby 2.2 once bundler fixes itself
require 'memory_profiler' if RUBY_VERSION >= "2.1.0" && RUBY_VERSION < "2.2.0"
begin
require 'memory_profiler' if RUBY_VERSION >= "2.1.0"
rescue => e
STDERR.put "#{e} failed to require mini profiler"
end
# initialization is skipped so trigger it
Rack::MiniProfilerRails.initialize!(Rails.application)

View File

@ -1,5 +1,7 @@
require 'discourse_iife'
require 'source_url'
Rails.application.assets.register_preprocessor('application/javascript', DiscourseIIFE)
Rails.application.assets.register_postprocessor('application/javascript', SourceURL)
unless Rails.env.production?
require 'source_url'
Rails.application.assets.register_postprocessor('application/javascript', SourceURL)
end

View File

@ -1398,7 +1398,6 @@ ar:
this_month: "هذا الشهر"
this_week: "هذا الاسبوع"
today: "اليوم"
other_periods: "الاطلاع على مواضيع زيادة"
browser_update: 'للأسف, <a href="http://www.discourse.org/faq/#browser">متصفحك قديم لكي يفتح هذه الصفحة</a>. Please <a href="http://browsehappy.com">قم بتحديث متصفحك</a>.'
permission_types:
full: "انشاء / رد / مشاهدة"

View File

@ -1074,7 +1074,6 @@ bs_BA:
this_month: "Ovog mjeseca"
this_week: "Ove nedelje"
today: "Danas"
other_periods: "pogledaj još tema"
browser_update: 'Nažalost, vaš internet browser je prestar za ovaj korišćenje ovog foruma</a>. Idite na i <a href="http://browsehappy.com">obnovite vaš browser</a>.'
permission_types:
full: "Kreiraj / Odgovori / Vidi"

View File

@ -420,6 +420,7 @@ cs:
change_avatar:
title: "Změňte si svůj profilový obrázek"
gravatar: "Založeno na <a href='//gravatar.com/emails' target='_blank'>Gravatar</a>u"
gravatar_title: "Změňte si avatar na webových stránkách Gravatar"
refresh_gravatar_title: "Obnovit Gravatar"
letter_based: "Systémem přidělený profilový obrázek"
uploaded_avatar: "Vlastní obrázek"
@ -555,6 +556,7 @@ cs:
title: "Registrační IP adresa"
avatar:
title: "Profilový obrázek"
header_title: "profil, zprávy, záložky a nastavení"
title:
title: "Titul"
filters:
@ -589,6 +591,7 @@ cs:
read_only_mode:
enabled: "Stranka je nastavena jen pro čtení. Můžete pokračovat v prohlížení ale interakce nemusí fungovat."
login_disabled: "Přihlášení je zakázáno jelikož fórum je v režimu jen pro čtení."
too_few_topics_notice: "Vytvořte alespoň 5 veřejných témat a %{posts} veřejných příspěvků aby se nastartovala diskuze. Noví uživatelé bez obsahu co by mohli číst nezískají důvěryhodnost. Tato zpráva se zobrazuje jenom redakci."
learn_more: "více informací..."
year: 'rok'
year_desc: 'témata za posledních 365 dní'
@ -1019,6 +1022,7 @@ cs:
banner_note: "Uživatelé mohou odmítnout banner jeho zavřením. V jeden moment může být pouze jedno téma jako banner."
already_banner:
zero: "Žádné téma není jako banner."
one: "V současnosti <strong class='badge badge-notification unread'>je</strong> zde zakázané téma."
inviting: "Odesílám pozvánku..."
automatically_add_to_groups_optional: "Tato pozvánka obsahuje také přístup do této skupiny: (volitelné, pouze administrátor)"
automatically_add_to_groups_required: "Tato pozvánka obsahuje také přístup do těchto skupin: (<b>Vyžadováno</b>, pouze administrátor)"
@ -1109,6 +1113,10 @@ cs:
few: "(post withdrawn by author, will be automatically deleted in %{count} hours unless flagged)"
other: "(post withdrawn by author, will be automatically deleted in %{count} hours unless flagged)"
expand_collapse: "rozbalit/sbalit"
gap:
one: "zobrazit 1 skrytou odpověď"
few: "zobrazit {{count}} skryté odpovědi"
other: "zobrazit {{count}} skrytých odpovědí"
more_links: "{{count}} dalších..."
unread: "Příspěvek je nepřečtený."
has_replies:
@ -1287,6 +1295,7 @@ cs:
last: "Poslední revize"
hide: "Schovejte revizi"
show: "Zobrazte revizi"
comparing_previous_to_current_out_of_total: "<strong>{{previous}}</strong> <i class='fa fa-arrows-h'></i> <strong>{{current}}</strong> / {{total}}"
displays:
inline:
title: "Vykreslený příspěvek se změnami zobrazenými v textu"
@ -1310,6 +1319,7 @@ cs:
create: 'Nová kategorie'
save: 'Uložit kategorii'
slug: 'Odkaz kategorie'
slug_placeholder: '(Dobrovolné) podtržená URL'
creation_error: Během vytváření nové kategorie nastala chyba.
save_error: Během ukládání kategorie nastala chyba.
name: "Název kategorie"
@ -1517,7 +1527,6 @@ cs:
this_month: "Tenhle měsíc"
this_week: "Tenhle týden"
today: "Dnes"
other_periods: "další nejlepší témata"
browser_update: 'Bohužel, <a href="http://www.discourse.org/faq/#browser">váš prohlížeč je příliš starý, aby na něm Discourse mohl fungovat</a>. Prosím <a href="http://browsehappy.com">aktualizujte svůj prohlížeč</a>.'
permission_types:
full: "Vytvářet / Odpovídat / Prohlížet"

View File

@ -430,14 +430,14 @@ da:
instructions: "Unikt, ingen mellemrum, kort"
short_instructions: "Folk kan benævne dig som @{{username}}"
available: "Dit brugernavn er tilgængeligt"
global_match: "E-mail tilsvarende det registrerede brugernavn"
global_match: "E-mail svarer til det registrerede brugernavn"
global_mismatch: "Allerede registreret. Prøv {{suggestion}}?"
not_available: "Ikke ledigt. Prøv {{suggestion}}?"
too_short: "Dit brugernavn er for kort"
too_long: "Dit brugernavn er for langt"
checking: "Kontrollerer om brugernavnet er ledigt…"
enter_email: 'Brugernavn fundet; indtast tilsvarende e-mail'
prefilled: "E-mail tilsvarende dette registrerede brugernavn"
prefilled: "E-mail svarer til dette registrerede brugernavn"
locale:
title: "sprog"
instructions: "Brugerinterface sprog. Det skifter når de reloader siden."
@ -609,10 +609,10 @@ da:
reset: "Nulstil adgangskode"
complete_username: "Hvis en konto matcher brugernavnet <b>%{username}</b>, vil du om lidt modtage en email med instruktioner om hvordan man nulstiller passwordet."
complete_email: "Hvis en konto matcher <b>%{email}</b>, vil du om lidt modtage en email med instruktioner om hvordan man nulstiller passwordet."
complete_username_found: "Vi fandt ingen kontoer tilsvarende brugernavnet <b>%{username}</b>, du burde modtage en e-mail med instruktioner om hvordan du nulstiller din adgangskode, i løbet af kort tid."
complete_email_found: "Vi har fundet en konto tilsvarende <b>%{email}</b>, du burde modtage en e-mail med instruktioner om hvordan du nulstiller din adgangskode, i løbet af kort tid."
complete_username_found: "Vi fandt en konto der svarer til brugernavnet <b>%{username}</b>, du burde i løbet af kort tid modtage en e-mail med instruktioner om hvordan du nulstiller din adgangskode."
complete_email_found: "Vi har fundet en konto der svarer til <b>%{email}</b>, du burde i løbet af kort tid modtage en e-mail med instruktioner om hvordan du nulstiller din adgangskode."
complete_username_not_found: "Ingen kontoer passer til brugernavnet <b>%{username}</b>"
complete_email_not_found: "Ingen kontoer tilsvarende <b>%{email}</b>"
complete_email_not_found: "Ingen kontoer svarer til <b>%{email}</b>"
login:
title: "Log ind"
username: "Bruger"
@ -1461,7 +1461,6 @@ da:
this_month: "Denne måned"
this_week: "Denne uge"
today: "I dag"
other_periods: "Se flere top emner"
browser_update: 'Desværre, <a href="http://www.discourse.org/faq/#browser">din browser er for gammel til at kunne virke med dette forum</a>. <a href="http://browsehappy.com">Opgradér venligst din browser</a>.'
permission_types:
full: "Opret / Besvar / Se"

View File

@ -191,6 +191,7 @@ de:
switch_from_anon: "Anonymen Modus beenden"
banner:
close: "Diesen Banner ausblenden."
edit: "Diesen Banner bearbeiten >>"
choose_topic:
none_found: "Keine Themen gefunden."
title:
@ -1460,7 +1461,7 @@ de:
this_month: "Dieser Monat"
this_week: "Diese Woche"
today: "Heute"
other_periods: "zeige weitere angesagte Themen"
other_periods: "zeige angesagte Themen:"
browser_update: '<a href="http://www.discourse.org/faq/#browser">Dein Webbrowser ist leider zu alt, um dieses Forum zu besuchen</a>. Bitte <a href="http://browsehappy.com">installiere einen neueren Browser</a>.'
permission_types:
full: "Erstellen / Antworten / Ansehen"
@ -2102,6 +2103,7 @@ de:
no_results: "Keine Ergebnisse gefunden."
clear_filter: "Filter zurücksetzen"
add_url: "URL hinzufügen"
add_host: "Host hinzufügen"
categories:
all_results: 'Alle'
required: 'Erforderlich'

View File

@ -218,6 +218,7 @@ en:
banner:
close: "Dismiss this banner."
edit: "Edit this banner >>"
choose_topic:
none_found: "No topics found."
@ -387,9 +388,9 @@ en:
github_profile: "Github"
mailing_list_mode: "Send me an email for every new post (unless I mute the topic or category)"
watched_categories: "Watched"
watched_categories_instructions: "You will automatically watch all new topics in these categories. You will be notified of all new posts and topics, plus the count of unread and new posts will also appear next to the topic's listing."
watched_categories_instructions: "You will automatically watch all new topics in these categories. You will be notified of all new posts and topics, and a count of new posts will also appear next to the topic."
tracked_categories: "Tracked"
tracked_categories_instructions: "You will automatically track all new topics in these categories. A count of unread and new posts will appear next to the topic."
tracked_categories_instructions: "You will automatically track all new topics in these categories. A count of new posts will appear next to the topic."
muted_categories: "Muted"
muted_categories_instructions: "You will not be notified of anything about new topics in these categories, and they will not appear on your unread tab."
delete_account: "Delete My Account"
@ -1021,22 +1022,22 @@ en:
"0": 'You are ignoring all notifications on this topic.'
watching_pm:
title: "Watching"
description: "You will be notified of every new post in this message. A count of unread and new posts will also appear next to the topic."
description: "You will be notified of every new reply in this message, and a count of new replies will be shown."
watching:
title: "Watching"
description: "You will be notified of every new post in this topic. A count of unread and new posts will also appear next to the topic."
description: "You will be notified of every new reply in this topic, and a count of new replies will be shown."
tracking_pm:
title: "Tracking"
description: "A count of unread and new posts will appear next to the message. You will be notified if someone mentions your @name or replies to your post."
description: "A count of new replies will be shown for this message. You will be notified if someone mentions your @name or replies to your post."
tracking:
title: "Tracking"
description: "A count of unread and new posts will appear next to the topic. You will be notified if someone mentions your @name or replies to your post. "
description: "A count of new replies will be shown for this topic. You will be notified if someone mentions your @name or replies to your post. "
regular:
title: "Regular"
description: "You will be notified if someone mentions your @name or replies to your post."
regular_pm:
title: "Regular"
description: "You will be notified if someone mentions your @name or replies to your post in the message."
description: "You will be notified if someone mentions your @name or replies to your post."
muted_pm:
title: "Muted"
description: "You will never be notified of anything about this message."
@ -1130,8 +1131,8 @@ en:
sso_enabled: "Enter the username of the person you'd like to invite to this topic."
to_topic_blank: "Enter the username or email address of the person you'd like to invite to this topic."
to_topic_email: "You've entered an email address. We'll email an invitation that allows your friend to immediately reply to this topic."
to_topic_username: "You've entered a username. We'll send a notification to that user with a link inviting them to this topic."
to_username: "Enter the username of the person you'd like to invite. We'll send a notification to that user with a link inviting them to this topic."
to_topic_username: "You've entered a username. We'll send a notification with a link inviting them to this topic."
to_username: "Enter the username of the person you'd like to invite. We'll send a notification with a link inviting them to this topic."
email_placeholder: 'name@example.com'
success_email: "We mailed out an invitation to <b>{{emailOrUsername}}</b>. We'll notify you when the invitation is redeemed. Check the invitations tab on your user page to keep track of your invites."
@ -1441,10 +1442,10 @@ en:
reasons:
watching:
title: "Watching"
description: "You will automatically watch all new topics in these categories. You will be notified of all new posts and topics, plus the count of unread and new posts will also appear next to the topic."
description: "You will automatically watch all new topics in these categories. You will be notified of all new posts and topics, and a count of new replies will appear next to these topics."
tracking:
title: "Tracking"
description: "You will automatically track all new topics in these categories. A count of unread and new posts will appear next to the topic."
description: "You will automatically track all new topics in these categories. A count of new replies will appear next to these topics."
regular:
title: "Regular"
description: "You will be notified if someone mentions your @name or replies to your post."
@ -2292,6 +2293,7 @@ en:
no_results: "No results found."
clear_filter: "Clear"
add_url: "add URL"
add_host: "add host"
categories:
all_results: 'All'
required: 'Required'

View File

@ -191,6 +191,7 @@ es:
switch_from_anon: "Salir de Modo Anónimo"
banner:
close: "Descartar este banner."
edit: "Editar este banner >>"
choose_topic:
none_found: "Ningún tema encontrado."
title:
@ -867,7 +868,7 @@ es:
toggle_information: "detalles del tema"
read_more_in_category: "¿Quieres leer más? Consulta otros temas en {{catLink}} o {{latestLink}}."
read_more: "¿Quieres leer más? {{catLink}} o {{latestLink}}."
read_more_MF: "Hay { UNREAD, plural, =0 {} one { <a href='/unread'>1 no leído</a> } other { are <a href='/unread'># no leídos</a> } } { NEW, plural, =0 {} one { {BOTH, select, true{y } false { } other{}} <a href='/new'>1 nuevo</a> tema} other { {BOTH, select, true{y } false { } other{}} <a href='/new'># nuevos</a> temas} } restantes, o {CATEGORY, select, true {explora otros temas en {catLink}} false {{latestLink}} other {}}"
read_more_MF: "Hay { UNREAD, plural, =0 {} one { <a href='/unread'>1 no leído</a> } other { <a href='/unread'># no leídos</a> } } { NEW, plural, =0 {} one { {BOTH, select, true{y } false { } other{}} <a href='/new'>1 nuevo</a> tema} other { {BOTH, select, true{y } false { } other{}} <a href='/new'># nuevos</a> temas} } restantes, o {CATEGORY, select, true {explora otros temas en {catLink}} false {{latestLink}} other {}}"
browse_all_categories: Ver todas las categorías
view_latest_topics: ver los temas recientes
suggest_create_topic: ¿Por qué no creas un tema?
@ -1462,7 +1463,7 @@ es:
this_month: "Este mes"
this_week: "Esta semana"
today: "Hoy"
other_periods: "ver más temas top"
other_periods: "ver temas top"
browser_update: 'Desafortunadamente, <a href="http://www.discourse.org/faq/#browser">tu navegador es demasiado antiguo para funcionar en este sitio</a>. Por favor <a href="http://browsehappy.com">actualízalo</a>.'
permission_types:
full: "Crear / Responder / Ver"
@ -2104,6 +2105,7 @@ es:
no_results: "Ningún resultado encontrado"
clear_filter: "Limpiar filtro"
add_url: "añadir URL"
add_host: "añadir host"
categories:
all_results: 'Todo'
required: 'Requerido'

View File

@ -1458,7 +1458,6 @@ fi:
this_month: "Tässä kuussa"
this_week: "Tällä viikolla"
today: "Tänään"
other_periods: "näytä lisää huippuketjuja"
browser_update: 'Valitettavasti tätä sivustoa ei voi käyttää <a href="http://www.discourse.org/faq/#browser">näin vanhalla selaimella</a>. Ole hyvä ja <a href="http://browsehappy.com">päivitä selaimesi</a>.'
permission_types:
full: "Luoda / Vastata / Nähdä"

View File

@ -191,6 +191,7 @@ fr:
switch_from_anon: "Sortir du mode anonyme"
banner:
close: "Ignorer cette bannière."
edit: "Éditer cette bannière >>"
choose_topic:
none_found: "Aucun sujet trouvé."
title:
@ -1466,7 +1467,7 @@ fr:
this_month: "Ce mois-ci"
this_week: "Cette semaine"
today: "Aujourd'hui"
other_periods: "voir plus de meilleurs sujets"
other_periods: "voir le top"
browser_update: 'Malheureusement, <a href="http://www.discourse.org/faq/#browser">votre navigateur est trop vieux pour ce site</a>. Merci <a href="http://browsehappy.com">de mettre à jour votre navigateur</a>.'
permission_types:
full: "Créer / Répondre / Voir"
@ -2108,6 +2109,7 @@ fr:
no_results: "Aucun résultat trouvé."
clear_filter: "Effacer"
add_url: "ajouter URL"
add_host: "ajouter hôte"
categories:
all_results: 'Toutes'
required: 'Requis'

View File

@ -379,6 +379,7 @@ he:
set_password: "הזן סיסמה"
change_about:
title: "שינוי בנוגע אליי"
error: "הייתה שגיאה בשינוי הערך"
change_username:
title: "שנה שם משתמש"
confirm: "אם תשנו את שם המשתמש/ת שלך, כל הציטוטים של ההודעות שלך ואזכורי @שם_המשתמש שלך יישברו. את/ה בטוחים לחלוטין שברצונך לשנות?"
@ -393,6 +394,7 @@ he:
change_avatar:
title: "שינוי תמונת הפרופיל"
gravatar: "<a href='//gravatar.com/emails' target='_blank'>Gravatar</a>, מבוסס על"
gravatar_title: "שנה את ה-avatar שלך באתר-Gravatar"
refresh_gravatar_title: "רענון האווטר שלכם"
letter_based: "תמונת פרופיל משובצת מערכתית"
uploaded_avatar: "תמונה אישית"
@ -524,6 +526,7 @@ he:
title: "כתובת IP בהרשמה"
avatar:
title: "תמונת פרופיל"
header_title: "פרופיל, הודעות, סימניות והגדרות "
title:
title: "כותרת"
filters:
@ -682,6 +685,7 @@ he:
title_placeholder: " במשפט אחד, במה עוסק הדיון הזה?"
edit_reason_placeholder: "מדוע ערכת?"
show_edit_reason: "(הוספת סיבת עריכה)"
reply_placeholder: "הקלד כאן. השתמש בMarkdown BBCode או HTML לערוך. גרור והדבק תמונה כדי להעלות אותה."
view_new_post: "הצגת את ההודעה החדשה שלך."
saving: "שומר..."
saved: "נשמר!"
@ -743,7 +747,7 @@ he:
linked: "<i title='linked post' class='fa fa-arrow-left'></i><p><span>{{username}}</span> {{description}}</p>"
granted_badge: "<i title='badge granted' class='fa fa-certificate'></i><p>הרוויח/ה '{{description}}'</p>"
popup:
mentioned: '{{username}} הזכיר אוך ב"{{topic}}" - {{site_title}}'
mentioned: '{{username}} הזכיר אותך ב{{topic}}" - {{site_title}}"'
quoted: '{{username}} ציטט אותך ב"{{topic}}" - {{site_title}}'
replied: '{{username}} הגיב לך ב"{{topic}}" - {{site_title}}'
posted: '{{username}} הגיב ב"{{topic}}" - {{site_title}}'
@ -885,14 +889,14 @@ he:
position: "הודעה %{current} מתוך %{total}"
notifications:
reasons:
'3_6': 'תקבלו התראות כיוון שאת/ה צופה בקטגוריה הזו.'
'3_5': 'תקבל/י התראות כיוון שהתחלת לצפות בנושא הזה אוטומטית.'
'3_2': 'תקבל/י התראות כיוון שאת/ה צופים בנושא הזה.'
'3_6': 'תקבלו התראות כיוון שאת/ה עוקב אחרי קטגוריה זו.'
'3_5': 'תקבל/י התראות כיוון שהתחלת לעקוב אחרי הנושא הזה אוטומטית.'
'3_2': 'תקבל/י התראות כיוון שאת/ה עוקב אחרי נושא הזה.'
'3_1': 'תקבל/י התראות כיוון שאת/ה יצרת את הנושא הזה.'
'3': 'תקבל/י התראות כיוון שאת/ה צופה בנושא הזה.'
'3': 'תקבל/י התראות כיוון שאת/ה עוקב אחרי נושא זה.'
'2_8': 'תקבלו התראות כיוון שאת/ה צופה בקטגוריה הזו.'
'2_4': 'תקבל/י התראות כיוון שפרסמת תגובה לנושא הזה.'
'2_2': 'תקבל/י התראות כיוון שאת/ה עוקב/ת אחרי הנושא הזה.'
'2_2': 'תקבל/י התראות כיוון שאת/ה צופה אחרי הנושא הזה.'
'2': 'תקבל/י התראות כיוון ש<a href="/users/{{username}}/preferences">קראת את הנושא הזה</a>.'
'1_2': 'תקבלו הודעה אם מישהו יזכיר את @שם_המשתמש/ת שלך או ישיב לפרסום שלך.'
'1': 'תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלך או ישיב לפרסום שלך.'
@ -900,17 +904,17 @@ he:
'0_2': 'אתה מתעלם מכל ההתראות בנושא זה.'
'0': 'אתה מתעלם מכל ההתראות בנושא זה.'
watching_pm:
title: "צופה"
description: "תקבל/י התראה על כל פרסום בהודעה זו. גם סך הפרסומים החדשים ואלו שלא נקראו יופיעו לצד הנושא."
title: "עוקב"
description: "תקבל/י התראה על כל פרסום בהודעה זו. "
watching:
title: "צופה"
description: "תקבל/י התראה על כל פרסום חדש תחת נושא זה. סך הפרסומים החדשים ושלא נקראו יופיע גם לצד הנושא."
title: "עוקב"
description: "תקבל/י התראה על כל פרסום חדש תחת נושא זה. "
tracking_pm:
title: "עוקב"
description: "סך הפרסומים החדשים ואלו שלא נקראו יופיע לצד ההודעה. תקבל/י התראה אם מישהו/י יזכירו את @שם_המשתמש/ת שלך או יגיבו לפרסום שלך."
title: "רגיל+"
description: "כמו רגיל, כמו כן סך הפרסומים החדשים ואלו שלא נקראו יופיע לצד ההודעה."
tracking:
title: "עוקב"
description: "סך הפרסום החדשים והלא נקראים יופיע לצד הנושא. תקבלו התראה אם מישהו יזכיר את @שם_המשתמש שלך או ישיב על פרסום שלך."
title: "רגיל+"
description: "כמו רגיל, כמו כן סך הפרסום החדשים והלא נקראים יופיע לצד הנושא. "
regular:
title: "רגיל"
description: "תרבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלך או ישיב לפרסום שלך."
@ -919,10 +923,10 @@ he:
description: "תקבל/י התראה אם מישהו יזכיר את @שם_המשתמש/ת שלך או יגיב לפרסום שלך בהודעה."
muted_pm:
title: "מושתק"
description: "לעולם לא תקבל/י התראה לשום דבר בנוגע להודעה זו."
description: "לעולם לא תקבל/י התראה בנוגע להודעה זו."
muted:
title: "מושתק"
description: "לעולם לא תקבל/י התראות על הנושא הזה, והוא לא יופיע בעמוד הלא נקראו שלך."
description: "לעולם לא תקבל/י התראות על הנושא הזה, והוא לא יופיע בעמוד ה\"לא נקראו\" שלך."
actions:
recover: "שחזר נושא"
delete: "מחק נושא"
@ -995,10 +999,13 @@ he:
to_forum: "נשלח מייל קצר המאפשר לחברך להצטרף באופן מיידי באמצעות לחיצה על קישור, ללא צורך בהתחברות למערכת הפורומים."
sso_enabled: "הכנס את שם המשתמש של האדם שברצונך להזמין לנושא זה."
to_topic_blank: "הכנס את שם המשתמש או כתובת דואר האלקטרוני של האדם שברצונך להזמין לנושא זה."
to_topic_email: "הזנת כתובת אימייל. אנחנו נשלח הזמנה שתאפשר לחברך להשיב לנושא הזה."
to_topic_username: "הכנסת את שם המשתמש של האדם שברצונך להזמין. אנו נשלח התראה למשתמש זה עם קישור המזמין אותו לנושא זה."
to_username: "הכנס את שם המשתמש של האדם שברצונך להזמין. אנו נשלח התראה למשתמש זה עם קישור המזמין אותו לנושא זה."
email_placeholder: 'name@example.com'
success_email: "שלחנו הזמנה ל: <b>{{emailOrUsername}}</b>. נודיע לך כשהזמנה תענה. בדוק את טאב ההזמנות בעמוד המשתמש שלך בשביל לעקוב אחרי ההזמנות ששלחת. "
success_username: "הזמנו את המשתמש להשתתף בנושא."
error: "מצטערים, לא יכלנו להזמין האיש הזה. אולי הוא כבר הוזמן בעבר? (תדירות שליחת ההזמנות מוגבלת)"
login_reply: 'התחברו כדי להשיב'
filters:
n_posts:
@ -1273,11 +1280,11 @@ he:
parent: "קטגורית אם"
notifications:
watching:
title: "צופה"
description: "תצפו באופן אוטומטי בכל הנושאים החדשים בקטגוריות אלה. תקבלו התראה על כל פרסום ונושא חדש, ובנוסף, סך הפרסומים החדשים ושלא נקראו יופיעו לצד הנושא."
tracking:
title: "עוקב"
description: "תעקבו באופן אוטומטי אחרי כל הנושאים החדשים בקטגוריות אלה. סך הפרסומים החדשים ושלא נקראו יופיעו לצד הנושא."
description: "תצפו באופן אוטומטי בכל הנושאים החדשים בקטגוריות אלה. תקבלו התראה על כל פרסום ונושא חדש."
tracking:
title: "רגיל+"
description: "כמו רגיל, וכן סך הפרסומים החדשים ושלא נקראו יופיעו לצד הנושא."
regular:
title: "רגיל"
description: "תקבלו התראה אם מישהו יזכיר את @שם_המשתמש/ת שלכם או ישיב לפרסום שלך."
@ -1312,6 +1319,8 @@ he:
action: "סימון נושא"
topic_map:
title: "סיכום נושא"
participants_title: "מפרסמים מתמידים"
links_title: "לינקים פופלארים"
links_shown: "הצג את כל הקישורים {{totalLinks}}..."
clicks:
one: "לחיצה אחת"
@ -1347,12 +1356,21 @@ he:
אחר {}}
original_post: "הודעה מקורית"
views: "צפיות"
views_lowercase:
one: "צפיה"
other: "צפיות"
replies: "תגובות"
views_long: "הנושא הזה נצפה {{number}} פעמים"
activity: "פעילות"
likes: "לייקים"
likes_lowercase:
one: "לייקים"
other: "לייקים"
likes_long: "יש {{number}} לייקים לנושא הזה"
users: "משתמשים"
users_lowercase:
one: "משתמש"
other: "משתמשים"
category_title: "קטגוריה"
history: "היסטוריה"
changed_by: "מאת {{author}}"
@ -1372,6 +1390,9 @@ he:
read:
title: "נקרא"
help: "נושאים שקראת, לפי סדר קריאתם"
search:
title: "חיפוש"
help: "חיפוש בכל הנושאים"
categories:
title: "קטגוריות"
title_in: "קטגוריה - {{categoryName}}"
@ -1424,7 +1445,6 @@ he:
this_month: "החודש"
this_week: "השבוע"
today: "היום"
other_periods: "ראו עוד נושאים מובילים."
browser_update: 'למרבה הצער, <a href="http://www.discourse.org/faq/#browser">הדפדפן שלכם זקן מידי מכדי לעבוד באתר זה.</a>. אנא <a href="http://browsehappy.com">שדרגו את הדפדפן שלכם</a>.'
permission_types:
full: "צרו / תגובה/ צפייה"
@ -1456,6 +1476,7 @@ he:
admins: 'מנהלים ראשיים:'
blocked: 'חסומים:'
suspended: 'מושעים:'
private_messages_title: "הודעות"
space_free: "{{size}} חופשיים"
uploads: "העלאות"
backups: "גיבויים"
@ -1560,8 +1581,11 @@ he:
name: "שם"
add: "הוספה"
add_members: "הוספת חברים וחברות"
custom: "מותאם"
automatic: "אוטומטי"
automatic_membership_email_domains: "משתמשים אשר נרשמים עם מארח דוא\"ל שתואם בדיוק לאחד מהרשימה, יוספו באופן אוטומטי לקבוצה זו:"
automatic_membership_retroactive: "החלת כלל מארח דוא\"ל זהה כדי להוסיף משתמשים רשומים"
default_title: "ברירת המחדל לכל המשתמשים בקבוצה זו"
api:
generate_master: "ייצר מפתח מאסטר ל-API"
none: "אין מפתחות API פעילים כרגע."

View File

@ -333,6 +333,7 @@ it:
dismiss_notifications: "Imposta tutti come Letti"
dismiss_notifications_tooltip: "Imposta tutte le notifiche non lette come lette "
disable_jump_reply: "Non saltare al mio messaggio dopo la mia risposta"
dynamic_favicon: "Visualizza conteggio argomenti nuovi / creati nell'icona del browser"
edit_history_public: "Consenti agli altri utenti di visualizzare le mie revisioni ai messaggi"
external_links_in_new_tab: "Apri tutti i link esterni in nuove schede"
enable_quoting: "Abilita \"rispondi quotando\" per il testo evidenziato"
@ -378,6 +379,7 @@ it:
set_password: "Imposta Password"
change_about:
title: "Modifica i dati personali"
error: "Si è verificato un errore nel cambio di questo valore."
change_username:
title: "Cambia Utente"
confirm: "Se modifichi il tuo nome utente, non funzioneranno più le precedenti citazioni ai tuoi messaggi e le menzioni @nome. Sei sicuro di volerlo fare?"
@ -392,6 +394,7 @@ it:
change_avatar:
title: "Cambia l'immagine del tuo profilo"
gravatar: "<a href='//gravatar.com/emails' target='_blank'>Gravatar</a>, basato su"
gravatar_title: "Cambia il tuo avatar sul sito Gravatar"
refresh_gravatar_title: "Ricarica il tuo Gravatar"
letter_based: "Immagine del profilo assegnata dal sistema"
uploaded_avatar: "Immagine personalizzata"
@ -523,6 +526,7 @@ it:
title: "Indirizzo IP di Registrazione"
avatar:
title: "Immagine Profilo"
header_title: "profilo, messaggi, segnalibri e preferenze"
title:
title: "Titolo"
filters:
@ -1422,7 +1426,6 @@ it:
this_month: "Questo mese"
this_week: "Questa settimana"
today: "Oggi"
other_periods: "vedi altri argomenti di punta"
browser_update: 'Purtroppo <a href="http://www.discourse.org/faq/#browser">il tuo browser è troppo vecchio per funzionare su questo forum</a>. Per favore <a href="http://browsehappy.com">aggiorna il browser</a>.'
permission_types:
full: "Crea / Rispondi / Visualizza"

View File

@ -1401,7 +1401,6 @@ nb_NO:
this_month: "Denne måneden"
this_week: "Denne uken"
today: "I dag"
other_periods: "vis flere populære emner"
browser_update: 'Dessverre, <a href="http://www.discourse.org/faq/#browser">Din nettleser er for gammel og fungerer ikke med dette nettstedet.</a>. Vennligst <a href="http://browsehappy.com">oppgrader nettleseren din</a>.'
permission_types:
full: "Opprett / Svar / Se"

View File

@ -212,6 +212,7 @@ pl_PL:
switch_from_anon: "Zakończ tryb anonimowy"
banner:
close: "Zamknij ten baner."
edit: "Edytuj ten baner >>"
choose_topic:
none_found: "Nie znaleziono tematów."
title:
@ -1526,7 +1527,7 @@ pl_PL:
this_month: "W tym miesiącu"
this_week: "W tym tygodniu"
today: "Dzisiaj"
other_periods: "zobacz więcej popularnych tematów"
other_periods: "zobacz najważniejsze"
browser_update: 'Niestety <a href="http://www.discourse.org/faq/#browser">twoja przeglądarka jest zbyt przestarzała, aby obsłużyć ten serwis</a>. Prosimy <a href="http://browsehappy.com">zaktualizuj swoją przeglądarkę</a>.'
permission_types:
full: "tworzyć / odpowiadać / przeglądać"
@ -2180,6 +2181,7 @@ pl_PL:
no_results: "Brak wyników wyszukiwania"
clear_filter: "Wyczyść"
add_url: "dodaj URL"
add_host: "dodaj host"
categories:
all_results: 'Wszystkie'
required: 'Wymagane'

View File

@ -1452,7 +1452,6 @@ pt_BR:
this_month: "Neste mes"
this_week: "Nesta semana"
today: "Hoje"
other_periods: "veja mais tópicos em alta"
browser_update: 'Infelizmente, <a href="http://www.discourse.org/faq/#browser">seu navegador é muito antigo para ser utilizado neste site</a>. Por favor <a href="http://browsehappy.com">atualize seu navegador</a>.'
permission_types:
full: "Criar / Responder / Ver"

View File

@ -255,6 +255,11 @@ ru:
approval:
title: "Сообщения для проверки"
description: "Ваше сообщение отправлено, но требует проверки и утверждения модератором. Пожалуйста, будьте терпеливы."
pending_posts:
one: "<strong>1</strong> сообщение ожидает одобрения."
few: "<strong>{{count}}</strong> сообщений ожидают одобрения."
many: "<strong>{{count}}</strong> сообщений ожидают одобрения."
other: "<strong>{{count}}</strong> сообщений ожидают одобрения."
ok: "ОК"
user_action:
user_posted_topic: "<a href='{{userUrl}}'>{{user}}</a> создал <a href='{{topicUrl}}'>тему</a>"
@ -425,6 +430,7 @@ ru:
set_password: "Установить пароль"
change_about:
title: "Изменить информацию обо мне"
error: "При изменении значения произошла ошибка."
change_username:
title: "Изменить псевдоним"
confirm: "Если вы измените свой псевдоним, то все существующие цитаты ваших сообщений и упоминания вас по @псевдониму в чужих сообщениях перестанут ссылаться на вас. Вы точно хотите изменить псевадоним?"
@ -439,6 +445,7 @@ ru:
change_avatar:
title: "Изменить фон профиля"
gravatar: "На основе <a href='//gravatar.com/emails' target='_blank'>Gravatar</a>"
gravatar_title: "Измените свой аватар на сайте Gravatar"
refresh_gravatar_title: "Обновить ваш Gravatar"
letter_based: "Фон профиля по умолчанию"
uploaded_avatar: "Собственный аватар"
@ -578,6 +585,7 @@ ru:
title: "IP адрес регистрации"
avatar:
title: "Аватар"
header_title: "профиль, сообщения, закладки и настройки"
title:
title: "Заголовок"
filters:
@ -950,6 +958,7 @@ ru:
go_top: "перейти наверх"
go_bottom: "перейти вниз"
go: "перейти"
jump_bottom: "перейти к последнему сообщению"
jump_bottom_with_number: "перейти к сообщению %{post_number}"
total: всего сообщений
current: текущее сообщение
@ -1148,6 +1157,11 @@ ru:
many: "(сообщение отозвано автором и будет автоматически удалено в течение %{count} часов, если только на сообщение не поступит жалоба)"
other: "(сообщение отозвано автором и будет автоматически удалено в течение %{count} часов, если только на сообщение не поступит жалоба)"
expand_collapse: "развернуть/свернуть"
gap:
one: "просмотреть 1 скрытый ответ"
few: "просмотреть {{count}} скрытых ответов"
many: "просмотреть {{count}} скрытых ответов"
other: "просмотреть {{count}} скрытых ответов"
more_links: "еще {{count}}..."
unread: "Сообщение не прочитано"
has_replies:
@ -1344,6 +1358,7 @@ ru:
last: "Последняя версия"
hide: "Скрыть редакцию"
show: "Показать редакцию"
comparing_previous_to_current_out_of_total: "<strong>{{previous}}</strong> <i class='fa fa-arrows-h'></i> <strong>{{current}}</strong> / {{total}}"
displays:
inline:
title: "Отобразить сообщение с включенными добавлениями и удалениями."
@ -1446,6 +1461,8 @@ ru:
notify_action: "Сообщение"
topic_map:
title: "Сводка по теме"
participants_title: "Частые авторы"
links_title: "Популярные ссылки"
links_shown: "показать все {{totalLinks}} ссылок..."
clicks:
one: "1 клик"
@ -1576,7 +1593,7 @@ ru:
this_month: "За месяц"
this_week: "За неделю"
today: "Сегодня"
other_periods: "смотреть больше обсуждаемых сообщений"
other_periods: "просмотреть выше"
browser_update: 'К сожалению, ваш браузер устарел и не поддерживается этим сайтом. Пожалуйста, <a href="http://browsehappy.com">обновите браузер</a> (нажмите на ссылку, чтобы узнать больше).'
permission_types:
full: "Создавать / Отвечать / Просматривать"
@ -2016,6 +2033,8 @@ ru:
impersonate:
title: "Войти от имени пользователя"
help: "Используйте этот инструмент, чтобы войти от имени пользователя. Может быть полезно для отладки. После этого необходимо выйти и зайти под своей учетной записью снова."
not_found: "Пользователь не найден."
invalid: "Извините, но вы не можете представиться этим пользователем."
users:
title: 'Пользователи'
create: 'Добавить администратора'

View File

@ -377,6 +377,7 @@ sv:
set_password: "välj lösenord"
change_about:
title: "Ändra Om Mig"
error: "Ett fel inträffade när beskrivningen skulle sparas. "
change_username:
title: "Byt Användarnamn"
confirm: "Det kan finnas konsekvenser till att byta ditt användarnamn. Är du helt säker på att du vill?"
@ -391,6 +392,7 @@ sv:
change_avatar:
title: "Ändra din profilbild"
gravatar: "<a href='//gravatar.com/emails' target='_blank'>Gravatar</a>, baserat på"
gravatar_title: "Byt din avatar på Gravatars hemsida"
refresh_gravatar_title: "Uppdatera din Gravatar"
letter_based: "Profilbild tilldelad av systemet"
uploaded_avatar: "Anpassad bild"
@ -738,6 +740,13 @@ sv:
moved_post: "<i title='moved post' class='fa fa-sign-out'></i><p><span>{{username}}</span> flyttade {{description}}</p>"
linked: "<i title='linked post' class='fa fa-arrow-left'></i><p><span>{{username}}</span> {{description}}</p>"
granted_badge: "<i title='badge granted' class='fa fa-certificate'></i><p>Fötjänade '{{description}}'</p>"
popup:
mentioned: '{{username}} nämnde dig i "{{topic}}" - {{site_title}}'
quoted: '{{username}} citerade dig i "{{topic}}" - {{site_title}}'
replied: '{{username}} svarade dig i "{{topic}}" - {{site_title}}'
posted: '{{username}} skrev i "{{topic}}" - {{site_title}}'
private_message: '{{username}} skickade dig ett privat meddelande i "{{topic}}" - {{site_title}}'
linked: '{{username}} länkade till ett inlägg du gjort från "{{topic}}" - {{site_title}}'
upload_selector:
title: "Lägg till en bild"
title_with_attachments: "Lägg till en bild eller en fil"
@ -813,6 +822,7 @@ sv:
filter_to: "{{post_count}} inlägg i tråd"
create: 'Ny tråd'
create_long: 'Skapa en ny tråd'
private_message: 'Skriv meddelande'
list: 'Trådar'
new: 'ny tråd'
unread: 'oläst'
@ -867,6 +877,7 @@ sv:
go_top: "toppen"
go_bottom: "botten"
go: "gå"
jump_bottom: "hoppa till sista inlägget"
jump_bottom_with_number: "hoppa till inlägg %{post_number}"
total: antal inlägg
current: nuvarande inlägg

View File

@ -1276,7 +1276,6 @@ te:
this_month: "ఈ నెల"
this_week: "ఈ వారం"
today: "ఈ రోజు"
other_periods: "మరిన్ని అగ్ర విషయాలు చూడు"
browser_update: 'దురదృష్టవశాత్తు, <a href="http://www.discourse.org/faq/#browser">ఈ సైట్ లో పనిచేయడానికి మీ బ్రౌజర్ చాలా పాతది </a>. దయచేసి <a href="http://browsehappy.com">మీ బ్రౌజర్ ని నవీకరించండి</a>.'
permission_types:
full: "సృష్టించి / జవాబివ్వు / చూడు"

View File

@ -1392,7 +1392,6 @@ tr_TR:
this_month: "Bu ay"
this_week: "Bu hafta"
today: "Bugün"
other_periods: "daha fazla konuya bak"
browser_update: 'Malesef, <a href="http://www.discourse.org/faq/#browser">tarayıcınız bu site için çok eski</a>. Lütfen <a href="http://browsehappy.com">tarayıcınızı güncelleyin</a>.'
permission_types:
full: "Oluştur / Cevapla / Bak"

View File

@ -496,6 +496,7 @@ zh_CN:
title: "注册 IP 地址"
avatar:
title: "头像"
header_title: "个人页面、消息、书签和设置"
title:
title: "头衔"
filters:
@ -1392,7 +1393,7 @@ zh_CN:
this_month: "本月"
this_week: "本周"
today: "今天"
other_periods: "查看更多热门主题"
other_periods: "跳转到顶部"
browser_update: '抱歉,<a href="http://www.discourse.com/faq/#browser">你的浏览器版本太低,无法正常访问该站点。</a>。请<a href="http://browsehappy.com">升级你的浏览器</a>。'
permission_types:
full: "创建 / 回复 / 阅读"

View File

@ -184,8 +184,17 @@ zh_TW:
none: "沒有要回顧的文章。"
edit: "編輯"
cancel: "取消"
view_pending: "觀看等待審核的貼文"
has_pending_posts:
one: "本主題仍有 <b>1</b> 篇貼文等待審核"
many: "本主題仍有 <b>{{count}}</b>篇貼文等待審核"
confirm: "儲存變更"
delete_prompt: "您確定要刪除 <b>%{username}</b> 這個帳號嗎?這會同時將該帳號的所有貼文一併刪除,並封鎖他的電子郵件與 IP。"
approval:
title: "貼文需等待審核"
description: "貼文已經送出,但必須等待管理者審核過後才會出現在板上,請耐心等候。"
pending_posts:
other: "你有 <strong>{{count}}</strong> 篇貼文在等待審核中"
ok: "確定"
user_action:
user_posted_topic: "<a href='{{userUrl}}'>{{user}}</a> 建立了 <a href='{{topicUrl}}'>此討論話題</a>"
@ -246,6 +255,7 @@ zh_TW:
'11': "編輯"
'12': "送出的項目"
'13': "收件匣"
'14': "等待中"
categories:
all: "所有分類"
all_subcategories: "所有"
@ -356,12 +366,15 @@ zh_TW:
change_avatar:
title: "設定個人資料圖片"
gravatar: "<a href='//gravatar.com/emails' target='_blank'>Gravatar</a>, based on"
gravatar_title: "在 Gravatar 網站修改你的頭像"
refresh_gravatar_title: "重新整理你的 Gravatar 頭像"
letter_based: "系統分配的個人資料圖片"
uploaded_avatar: "自訂圖片"
uploaded_avatar_empty: "新增一張自訂圖片"
upload_title: "上傳你的圖片"
upload_picture: "上傳圖片"
image_is_not_a_square: "警告:我們裁切了你的圖片,因為該圖片不是正方形的。"
cache_notice: "你已經成功更改頭圖,但由於瀏覽器快取的關係,可能要一會兒後才會顯示新頭圖。"
change_profile_background:
title: "基本資料背景圖案"
instructions: "個人資料背景會被置中且默認寬度為850px。"
@ -419,6 +432,8 @@ zh_TW:
every_three_days: "每三天"
weekly: "每週"
every_two_weeks: "每兩星期"
email_direct: "當有人引用、回覆我的發文,或以 @用戶名稱 提到我時,請以電子郵件通知我。"
email_private_messages: "當有人寄給我私人訊息時,以電子郵件通知我。"
email_always: "不要因為我在網站上活動而不寄信通知。"
other_settings: "其它"
categories_settings: "分類"
@ -461,6 +476,7 @@ zh_TW:
none: "你尚未邀請任何人。你可以發送個別邀請,或者透過<a href='https://meta.discourse.org/t/send-bulk-invites/16468'>上傳邀請名單</a>一次邀請一群人。"
text: "從檔案大量邀請"
uploading: "正在上傳..."
success: "檔案已上傳成功,處理完畢後將以私人訊息通知你。"
error: "上傳 '{{filename}}' 時發生問題:{{message}}"
password:
title: "密碼"
@ -509,6 +525,7 @@ zh_TW:
logout: "已登出"
refresh: "重新整理"
read_only_mode:
enabled: "管理員開啟了唯讀模式。你可以繼續瀏覽網站,但一些互動功能可能無法使用。"
login_disabled: "在唯讀模式下不能登入"
learn_more: "進一步了解..."
year: '年'
@ -523,6 +540,8 @@ zh_TW:
unmute: 取消靜音
last_post: 最後一篇文章
last_reply_lowercase: 最新回覆
replies_lowercase:
other: 回覆
summary:
enabled_description: "你正在檢視此討論話題的摘要:在這個社群裡最熱門的文章。"
description: "共有 <b>{{count}}</b> 個回覆。"
@ -628,6 +647,7 @@ zh_TW:
title_placeholder: "用一個簡短的句子來描述想討論的內容。"
edit_reason_placeholder: "你為什麼做編輯?"
show_edit_reason: "(請加入編輯原因)"
reply_placeholder: "在此輸入。請使用 Markdown (http://markdown.tw/) 與 BBCode (http://www.bbcode.org/reference.php) 調整格式,拖曳或貼上圖片可以直接上傳。"
view_new_post: "檢視你的新文章。"
saving: "正在儲存..."
saved: "儲存完畢!"
@ -842,6 +862,7 @@ zh_TW:
title: "一般"
muted_pm:
title: "靜音"
description: "你將不會再收到關於此訊息的通知。"
muted:
title: "靜音"
description: "你將不會收到任何關於此討論話題的通知,此討論話題也不會出現在你的未讀分頁裡。"
@ -862,6 +883,7 @@ zh_TW:
feature:
pin: "置頂主題"
unpin: "取消置頂主題"
pin_globally: "全區置頂討論話題"
make_banner: "討論話題橫幅"
remove_banner: "移除討論話題橫幅"
reply:
@ -879,6 +901,8 @@ zh_TW:
success_message: '已投訴此討論話題。'
feature_topic:
title: "擁有這個話題"
pin: "將此討論主題在{{categoryLink}}類別中置頂"
unpin: "取消此主題在{{categoryLink}}類別的置頂狀態"
already_banner:
zero: "沒有頂置的話題。"
inviting: "正在邀請..."
@ -898,6 +922,7 @@ zh_TW:
to_forum: "我們將向你的朋友發出一封電子郵件,他不必登入,他只要按電子郵件裡的連結就可以加入此論壇。"
to_topic_blank: "輸入你想邀請的用戶的用戶名稱或電子郵件地址到該討論主題"
email_placeholder: '電子郵件地址'
success_username: "我們已經邀請該使用者加入此主題討論"
login_reply: '登入以發表回應'
filters:
n_posts:
@ -1194,6 +1219,7 @@ zh_TW:
notify_action: "訊息"
topic_map:
title: "討論話題摘要"
participants_title: "頻繁發文者"
links_title: "熱門連結"
links_shown: "顯示所有 {{totalLinks}} 個連結..."
clicks:
@ -1310,7 +1336,7 @@ zh_TW:
this_month: "本月"
this_week: "本週"
today: "今天"
other_periods: "看更多精選討論話題"
other_periods: "前往頂端"
browser_update: '抱歉,<a href="http://www.discourse.org/faq/#browser">您的瀏覽器版本太舊,無法正常訪問該站點。</a>。請<a href="http://browsehappy.com">升級您的瀏覽器</a>。'
permission_types:
full: "建立 / 回覆 / 觀看"
@ -1377,6 +1403,7 @@ zh_TW:
agree_title: "確認此投訴為有效且正確"
agree_flag_modal_title: "批准並且 ..."
agree_flag_hide_post: "批准 (隱藏文章 + 送出私人訊息)"
agree_flag_hide_post_title: "隱藏此文章,並自動向此用戶送出私人訊息,要求盡快修改它"
agree_flag_restore_post: "同意(還原文章)"
agree_flag_restore_post_title: "回復此文章"
agree_flag: "同意投訴"
@ -1525,6 +1552,7 @@ zh_TW:
confirm: "你確定要回溯資料庫到以前的工作階段?"
export_csv:
user_archive_confirm: "你確定要下載你的文章嗎?"
success: "開始匯出,處理完畢後將以私人訊息通知你。"
failed: "匯出失敗。請觀看紀錄。"
rate_limit_error: "文章每天只能下載一次,請明天再試。"
button_text: "匯出"

View File

@ -738,7 +738,7 @@ bs_BA:
default_code_lang: "Default programming language syntax highlighting applied to GitHub code blocks (lang-auto, ruby, python etc.)"
warn_reviving_old_topic_age: "When someone starts replying to a topic where the last reply is older than this many days, a warning will be displayed. Disable by setting to 0."
autohighlight_all_code: "Force apply code highlighting to all preformatted code blocks even when they didn't explicitly specify the language."
embeddable_host: "Host that can embed the comments from this Discourse forum."
embeddable_hosts: "Host that can embed the comments from this Discourse forum."
feed_polling_enabled: "EMBEDDING ONLY: Whether to embed a RSS/ATOM feed as posts."
feed_polling_url: "EMBEDDING ONLY: URL of RSS/ATOM feed to embed."
embed_by_username: "Discourse username of the user who creates the embedded topics."

View File

@ -937,7 +937,7 @@ de:
warn_reviving_old_topic_age: "Wenn jemand beginnt auf ein Thema zu antworten, dessen letzte Antwort älter als diese Anzahl an Tagen ist, wird eine Warnung angezeigt. Deaktiviere dies durch setzen auf 0."
autohighlight_all_code: "Erzwinge Syntaxhervorhebung für alle Quellcode-Blöcke, auch dann wenn keine Sprache angeben wurde."
highlighted_languages: "Es wurden Syntaxregeln zur Hervorhebung von Textstellen hinzugefügt. (Achtung: Werden zu viele Sprachen hinzugefügt, kann das die Performance beeinflussen) siehe: https://highlightjs.org/static/demo/ für eine Demo."
embeddable_host: "Host, der Kommentare aus diesem Discourse Forum einbetten darf. Nur Hostname ohne http://"
embeddable_hosts: "Host, der Kommentare aus diesem Discourse Forum einbetten darf. Nur Hostname ohne http://"
feed_polling_enabled: "NUR WENN EINGEBETTET: Bestimmt, ob Inhalte eines RSS-/ATOM-Feeds als zusätzliche Beiträge dargestellt werden."
feed_polling_url: "NUR WENN EINGEBETTET: URL des einzubettenden RSS-/ATOM-Feeds."
embed_by_username: "Discourse-Benutzername des Benutzers, der die eingebetteten Themen erstellt."

View File

@ -173,6 +173,7 @@ en:
rss_description:
latest: "Latest topics"
hot: "Hot topics"
posts: "Latest posts"
too_late_to_edit: "That post was created too long ago. It can no longer be edited or deleted."
excerpt_image: "image"
@ -1125,7 +1126,7 @@ en:
autohighlight_all_code: "Force apply code highlighting to all preformatted code blocks even when they didn't explicitly specify the language."
highlighted_languages: "Included syntax highlighting rules. (Warning: including too many langauges may impact performance) see: https://highlightjs.org/static/demo/ for a demo"
embeddable_host: "Host that can embed the comments from this Discourse forum. Hostname only, do not begin with http://"
embeddable_hosts: "Host(s) that can embed the comments from this Discourse forum. Hostname only, do not begin with http://"
feed_polling_enabled: "EMBEDDING ONLY: Whether to embed a RSS/ATOM feed as posts."
feed_polling_url: "EMBEDDING ONLY: URL of RSS/ATOM feed to embed."
embed_by_username: "Discourse username of the user who creates the embedded topics."
@ -1457,73 +1458,83 @@ en:
usage_tips:
text_body_template: |
A few quick tips to get you started:
Here are a few quick tips to get you started:
## Keep scrolling
## Reading
There are no next page buttons or page numbers to read more, **just keep scrolling down!**
To read more, **just keep scrolling down!**
As new posts come in, they will appear automatically.
As new replies or new topics arrive, they will appear automatically no need to refresh the page.
## Where am I?
## Navigation
- For search, your user page, or the menu, use the **icon <kbd>☰</kbd> buttons at the upper right**.
- For search, your user page, or the <kbd>☰</kbd> menu, use the **icon buttons at upper right**.
- Any topic title will take you to the next unread post. Use the last activity time and post count to enter at the top or bottom.
- Selecting a topic title will always take you to the next unread post in the topic. To enter at the top or bottom, select the date or post count instead.
- While reading a topic, jump to the top &uarr; by selecting the topic title. Select the green progress bar at the bottom right for full navigation controls, or use the <kbd>home</kbd> and <kbd>end</kbd> keys.
<img src="/images/welcome/topic-list-select-areas-2x.png" width="593" height="59">
<img src="/images/welcome/progress-bar.png" width="143" height="39">
- While reading a topic, select the progress bar at the bottom right for full navigation controls. Quickly jump back to the top by selecting the topic title. Press <kbd>?</kbd> for a list of super-speedy keyboard shortcuts.
## How do I reply?
<img src="/images/welcome/progress-bar-2x.png" width="153" height="181">
- To reply to the overall topic, use the Reply button <img src="/images/welcome/reply-topic.png" width="29" height="25"> at the very bottom of the page.
## Replying
- To reply to a specific post, use the Reply button <img src="/images/welcome/reply-post.png" width="29" height="25"> on that post.
- To reply to the **topic in general**, use <img src="/images/welcome/reply-topic-2x.png" width="25" height="23"> at the very bottom of the topic.
- To take the conversation in a different direction, but keep them linked together, use <img src="/images/welcome/reply-as-linked-topic.png" width="15" height="25"> Reply as linked Topic to the right of the post.
- To reply to a **specific person**, use <img src="/images/welcome/reply-post-2x.png" width="25" height="23"> on their post.
To quote someone in your reply, select the text you wish to quote, then press any Reply button.
- To reply with **a new topic**, use <img src="/images/welcome/reply-as-linked-topic-2x.png" width="20" height="25"> to the right of the post. Both old and new topics will be automatically linked together.
<img src="/images/welcome/quote-reply.png" width="350" height="129">
To insert a quote, select the text you wish to quote, then press any Reply button. Repeat for multiple quotes!
To ping someone in your reply, mention their name. Type `@` and an autocompleter will pop up.
<img src="/images/welcome/quote-reply-2x.png" width="326" height="128">
<img src="/images/welcome/username-completion.png" width="230" height="131">
To notify someone in your reply, mention their name. Type `@` to begin selecting a username.
For [standard Emoji](http://www.emoji.codes/), just start typing `:` or the traditional smileys `:)` :smile:
<img src="/images/welcome/username-completion-2x.png" width="191" height="125">
## What else can I do?
To use [standard Emoji](http://www.emoji.codes/), just type `:` to match by name, or use the traditional smileys `;)`
There are action buttons at the bottom of each post.
<img src="/images/welcome/emoji-completion-2x.png" width="144" height="153">
<img src="/images/welcome/like-link-flag-bookmark.png" width="169" height="46">
## Actions
To let someone know that you enjoyed their post, use the **like** button. If you see a problem with a post, privately let them, or our staff, know about it with the **flag** button.
There are action buttons at the bottom of each post:
You can also **share** a link to a post, or **bookmark** it for later reference on your user page.
<img src="/images/welcome/like-link-flag-bookmark-2x.png" width="162" height="42">
## Who is talking to me?
To let someone know that you enjoyed and appreciated their post, use the **like** button. Share the love!
When someone replies to your post, quotes your post, or mentions your `@username`, a number will immediately appear at the top right of the page. Use it access your **notifications**.
If you see a problem with someone's post, privately let them, or [our staff](/about), know about it with the **flag** button. You can also **share** a link to a post, or **bookmark** it for later reference on your user page.
<img src="/images/welcome/notification-panel.png" width="178" height="59">
## Notifications
Don't worry about missing a reply you'll be emailed replies (and messages) if you aren't online when they arrive.
When someone replies to you, quotes your post, or mentions your `@username`, a number will immediately appear at the top right of the page. Use it to access your **notifications**.
## When are conversations new?
<img src="/images/welcome/notification-panel-2x.png" width="160" height="54">
By default all conversations less than two days old are considered new, and any conversation you've participated in (replied to, created, or read for an extended period) will automatically be tracked.
Don't worry about missing a reply you'll be emailed any notifications that arrive when you are away.
You will see the blue new and number indicators next to these topics:
## Your Preferences
<img src="/images/welcome/topics-new-unread.png" width="368" height="89">
- All topics less than **two days old** are considered new.
You can change the individual notification state of a topic via the control at the bottom of the topic (this can also be set per category). To change how you track topics, or the definition of new, see [your user preferences](%{base_url}/my/preferences).
- Any topic you've **actively participated in** (by creating it, replying, or reading for an extended period) will be automatically tracked.
## Why can't I do certain things?
You will see the blue new and unread number indicators next to these topics:
New users are somewhat limited for safety reasons. As you participate here, you'll gain the trust of the community, become a full citizen, and those limitations will automatically be removed. At a high enough [trust level](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924), you'll gain even more abilities to help us manage our community together.
<img src="/images/welcome/topics-new-unread-2x.png" width="341" height="106">
You can change your notifications for any topic via the notification control at the bottom of the topic. You can also set notification state per category.
<img src="/images/welcome/topic-notification-control-2x.png" width="608" height="312">
To change any of these settings, see [your user preferences](%{base_url}/my/preferences).
## Community Trust
New users are somewhat limited for safety reasons. As you participate here, over time you'll gain the trust of the community, become a full citizen, and those limitations will be lifted. At a high enough [trust level](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924), you'll gain new abilities to help us manage our community together.
welcome_user:
subject_template: "Welcome to %{site_name}!"

View File

@ -133,6 +133,7 @@ es:
rss_description:
latest: "Temas recientes"
hot: "Temas calientes"
posts: "Últimos posts"
too_late_to_edit: "Ese post fue publicado hace demasiado tiempo. No puede ser editado ni eliminado."
excerpt_image: "imagen"
queue:
@ -959,7 +960,7 @@ es:
warn_reviving_old_topic_age: "Cuando alguien publica en un tema cuya última respuesta fue hace este número de días o más, se le mostrará un aviso para desalentar el hecho de resucitar una antigua discusión. Deshabilita esta opción introduciendo el valor 0."
autohighlight_all_code: "Forzar el resaltado de código a los bloques de código preformateado cuando no se especifique el lenguaje del código."
highlighted_languages: "Incluye reglas resaltadas de sintaxis. (Advertencia: incluyendo demasiadas lenguages puede afectar al rendimiento) ver: https://highlightjs.org/static/demo/ para una demostración"
embeddable_host: "Host que puede incrustar los comentarios de este foro Discourse. Nombre de host solamente, no comienzan con http://"
embeddable_hosts: "Host(s) que puede incrustar los comentarios de este foro Discourse. Nombre de host solamente, no comienzan con http://"
feed_polling_enabled: "SOLO PARA EMBEBER: embeber feeds RSS/ATOM como posts."
feed_polling_url: "SOLO PARA EMBEBER: URL de los feeds RSS/ATOM a embeber."
embed_by_username: "Nombre de usuario en Discourse del que crea los temas embebidos."

View File

@ -916,7 +916,7 @@ fa_IR:
warn_reviving_old_topic_age: "وقتی کسی شروع می کند با پاسخ دادن به جستاری که آخرین پاسخ برمی گردد به خیلی قبل یک هشدار نمایش داده می شود. نمایش با تنظیمات تا 0. "
autohighlight_all_code: "اعمال زور برای برجسته کردن کد به تمام بلاک های کد تنظیم نشده حتی وقتی به صراحت زبان را مشخص نمی کنند. "
highlighted_languages: "شامل نحوه قوانین برجسته شده. ( اخطار: شامل زبان های متفاوت ممکن است در نحوه اجرا تاثیر گذار باشد) ببین: https://highlightjs.org/static/demo/ برای دمو"
embeddable_host: "سروری که می تونه در نوشته ها جا سازی بشه از انجمن دیسکورس. فقط نام سروری که با http:// شروع می شود"
embeddable_hosts: "سروری که می تونه در نوشته ها جا سازی بشه از انجمن دیسکورس. فقط نام سروری که با http:// شروع می شود"
feed_polling_enabled: "فقط جاسازی: چه جاسازی RSS/ATOM feed به عنوان نوشته"
feed_polling_url: "فقط جاسازی: URL of RSS/ATOM feed to embed."
embed_by_username: "نام کاربری دیسکورس کاربری که نوشته های جاسازی شده را ساخته."

View File

@ -962,7 +962,7 @@ fi:
warn_reviving_old_topic_age: "Kun käyttäjä alkaa kirjoittamaan vastausta ketjuun, jonka uusin viesti on tätä vanhempi päivissä, näytetään varoitus. Poista käytöstä asettamalla arvoksi 0."
autohighlight_all_code: "Pakota koodin korostus kaikkiin esimuotoiltuihin tekstiblokkeihin, vaikka käyttäjä ei määrittelisi kieltä."
highlighted_languages: "Syntaksin korostamisen säännöt. (Varoitus: liian monen kielen sisällyttäminen voi vaikuttaa suorituskykyyn) katso demo: https://highlightjs.org/static/demo/"
embeddable_host: "Isäntä, joka voi upottaa kommentteja tältä palstalta. Pelkkä isäntänimi, älä aloita http://"
embeddable_hosts: "Isäntä, joka voi upottaa kommentteja tältä palstalta. Pelkkä isäntänimi, älä aloita http://"
feed_polling_enabled: "VAIN UPOTUS: Upotetaanko RSS/ATOM syöte viesteinä."
feed_polling_url: "VAIN UPOTUS: RSS/ATOM syötteen URL."
embed_by_username: "Sen käyttäjän Discourse käyttäjänimi, joka luo upotetut ketjut."

View File

@ -133,6 +133,7 @@ fr:
rss_description:
latest: "Sujets récents"
hot: "Sujets populaires"
posts: "Messages récents"
too_late_to_edit: "Ce message a été créé il y a trop longtemps. Il ne peut plus être modifié ou supprimé."
excerpt_image: "image"
queue:
@ -963,7 +964,7 @@ fr:
warn_reviving_old_topic_age: "Lorsque quelqu'un commence à répondre à un sujet dont la dernière réponse est vielle de plusieurs jours, un avertissement sera affiché. Désactiver la fonctionnalité en indiquant: 0."
autohighlight_all_code: "Forcer la mise en évidence de tout les textes dans les balises code, même si ils ne correspondent à aucun langage de programmation."
highlighted_languages: "Include les règles de mise en surbrillance de syntaxe. (Avertissement: l'ajout de trop de langages peut impacter les performances) voir l'exemple https://highlightjs.org/static/demo/"
embeddable_host: "Hôte qui peut incorporer des messages de ce forum Discourse. Nom d'hôte seulement, sans http://"
embeddable_hosts: "Hôte(s) qui peuvent incorporer des messages de ce forum Discourse. Nom d'hôte seulement, sans http://"
feed_polling_enabled: "EMBARQUER UNIQUEMENT: Embarqué le flux RSS/ATOM en tant que messages."
feed_polling_url: "EMBARQUER UNIQUEMENT: Url du flux RSS/ATOM à embarqué."
embed_by_username: "Pseudo de l'utilisateur Discourse qui crée les sujets embarqués."
@ -1265,10 +1266,10 @@ fr:
Afin d'être guider, merci de vous référer à notre [guide de bonne conduite](%{base_url}/guidelines).
usage_tips:
text_body_template: "Quelques astuces pour vous aider à démarrer rapidement.\n\n## Continuez de descendre\n\nIl n'y a pas de bouton Page Suivante ni de numéro de page pour en lire plus, **il vous suffit de descendre !**\n\nLorsque de nouvelles réponses arrivent, elles apparaissent automatiquement. \n\n## Où suis-je ?\n\n- Pour la recherche, votre page d'utilisateur, ou le menu, utiliser les **boutons icônes <kbd>☰</kbd> en haut à droite**.\n\n- Dans la liste des sujets, le titre vous emmènera toujours vers le prochain message non lu. Utiliser les colonnes Activité ou Messages pour allez au premier ou au dernier message. \n\n- Lorsque vous lisez un sujet, retournez en haut de celui &uarr; en cliquant sur le titre. Cliquez sur la barre de progression en bas à droite pour avoir une navigation complète, ou utilisez les touches <kbd>Home</kbd> et <kbd>Fin</kbd>. \n\n <img src=\"/images/welcome/progress-bar.png\" width=\"143\" height=\"39\">\n\n## Comment je réponds ?\n\n- Pour répondre au sujet dans sa globalité, utilisez le bouton \"Répondre\" <img src=\"/images/welcome/reply-topic.png\" width=\"29\" height=\"25\"> tout en bas de la page.\n\n- Pour répondre à un message spécifique, utilisez le bouton \"Répondre\" <img src=\"/images/welcome/reply-post.png\" width=\"29\" height=\"25\">\
\ sur le message.\n\n - Si vous voulez continuer le sujet dans une section différente, mais garder le lien entre votre sujet et le message qui vous l'a inspiré, utilisez la fonction Répondre en créant un nouveau sujet <img src=\"/images/welcome/reply-as-linked-topic.png\" width=\"15\" height=\"25\"> à droite de chaque message.\n\nPour citer quelqu'un dans votre message, sélectionnez le texte que vous voulez citer et appuyez sur un des boutons Répondre.\n\n<img src=\"/images/welcome/quote-reply.png\" width=\"350\" height=\"129\">\n\nPour mentionner le pseudo d'un utilisateur, commencez à taper `@` et une liste d'auto-complétion apparaîtra.\n\n<img src=\"/images/welcome/username-completion.png\" width=\"230\" height=\"131\">\n\nConcernant les [icones Emoji](http://www.emoji.codes/), commencez par écrire `:` ou le traditionnel smiley `:)` :smile: \n\n## Que puis-je faire d'autre ?\n\nÀ la fin de chaque message il y a un ensemble de boutons pour les différentes actions possibles.\n\n<img src=\"/images/welcome/like-link-flag-bookmark.png\" width=\"169\" height=\"46\">\n\nPour faire savoir à quelqu'un que vous avez apprécié son message, cliquez sur le bouton *j'aime** en bas du message. Si vous voyez un problème avec un message, n'hésitez pas à cliquer sur le bouton **signaler** pour avertir\
\ en privé l'auteur ou les modérateurs du contenu de ce message.\n\nVous pouvez aussi **partager** un liens vers un message ou l'ajouter à vos **signets** pour le retrouver sur votre page d'utilisateur. \n\n## Qui me parle ?\n\nQuand quelqu'un répond à votre message, vous cite, ou mentionne votre `@pseudo`, un nombre apparaitra immédiatement en haut à droite de la page. Utilisez-le pour consulter vos **notifications**.\n\n<img src=\"/images/welcome/notification-panel.png\" width=\"178\" height=\"59\">\n\nNe soyez pas inquiêt de manquer des notifications \nLes réponses (et les messages directs) vous seront envoyés par courriel si vous n'êtes pas présent sur le site lorsqu'ils sont envoyés. \n\n## Quand est-ce qu'une conversation est nouvelle ?\n\nPar défaut, toutes les conversations de moins de deux jours sont considérées comme nouvelles, et chaque sujets auxquels vous avez participé (répondus, créés ou lu pendant un long moment) seront automatiquements suivis. \n\nVous verrez le badge bleu de nouveauté et le nombre de nouveaux messages au côté de ces discussions:\n\n<img src=\"/images/welcome/topics-new-unread.png\" width=\"368\" height=\"89\">\n\nVous pouvez modifier l'état du suivi des notifications d'une discussion en utilisant les boutons en bas de la discussion (vous pouvez également\
\ le modifier au niveau des catégories). Pour changer la façon dont vous suivez les discussions, ou pour définir de nouveaux suivis, consultez [vos préférences utilisateurs](%{base_url}/my/preferences). \n\n## Quelles sont les choses que je ne peux pas faire ?\n\nLes nouveaux utilisateurs sont limités pour des raisons de sécurité. Plus vous participerez, plus vous gagnerez la confiance de la communauté et les restrictions disparaîtrons. A plus haut [niveau de confiance](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924), vous gagnerez de nouvelles compétences pour nous aider à gérer la communauté.\n"
text_body_template: "Voilà quelques astuces pour vous aider à démarrer :\n\n## Continuez de descendre\n\nPour en lire plus, **il vous suffit de descendre !** Lorsque de nouvelles réponses arrivent, elles apparaissent automatiquement. \n\n## Navigation\n\n- Pour la recherche, votre page d'utilisateur, ou le menu, utiliser les **boutons icônes <kbd>☰</kbd> en haut à droite**. \n\n- Dans la liste des sujets, le titre vous emmènera toujours vers le prochain message non lu. Cliquer sur la date ou le nombre de messages pour allez au premier ou au dernier message. \n\n- Lorsque vous lisez un sujet, retournez en haut &uarr; en cliquant sur le titre. Cliquez sur la barre de progression en bas à droite pour avoir une navigation complète, ou utilisez les touches <kbd>Home</kbd> et <kbd>Fin</kbd>. \n\n<img src=\"/images/welcome/progress-bar.png\" width=\"143\" height=\"39\"> \n\n## Réponses\n\nPour répondre …\n\n- au **sujet dans sa globalité**, utilisez le bouton \"Répondre\" <img src=\"/images/welcome/reply-topic.png\" width=\"29\" height=\"25\"> tout en bas de la page. \n\n- à une **personne spécifique**, utilisez le bouton \"Répondre\" <img src=\"/images/welcome/reply-post.png\" width=\"29\" height=\"25\"> sur leur message. \n\n- avec **un sujet lié**, utilisez le bouton \"Répondre en créant un\
\ sujet lié\" <img src=\"/images/welcome/reply-as-linked-topic.png\" width=\"15\" height=\"25\"> à droite de chaque message. \n\nPour citer, sélectionnez le texte que vous voulez citer et appuyez sur un des boutons Répondre. \n\n<img src=\"/images/welcome/quote-reply.png\" width=\"350\" height=\"129\"> \n\nPour alerter un utilisateur dans votre message, commencez à taper `@` pour pouvoir sélectionner un pseudo.\n\n<img src=\"/images/welcome/username-completion.png\" width=\"230\" height=\"131\">\n\nConcernant les [icones Emoji](http://www.emoji.codes/), commencez par écrire `:` ou le traditionnel smiley `:)` :smile: \n\n## Actions \n\nÀ la fin de chaque message il y a des boutons pour les différentes actions possibles. \n\n<img src=\"/images/welcome/like-link-flag-bookmark.png\" width=\"169\" height=\"46\"> \n\nPour faire savoir à quelqu'un que vous avez apprécié son message, cliquez sur le bouton **j'aime** en bas du message. Si vous voyez un problème avec un message, n'hésitez pas à cliquer sur le bouton **signaler** pour avertir en privé l'auteur ou les modérateurs du contenu de ce message. \n\nVous pouvez aussi **partager** un liens vers un message ou l'ajouter à vos **signets** pour le retrouver sur votre page d'utilisateur. \n\n## Notifications\n\nQuand quelqu'un répond à votre\
\ message, vous cite, ou mentionne votre `@pseudo`, un nombre apparaitra immédiatement en haut à droite de la page. Utilisez-le pour consulter vos **notifications**. \n\n<img src=\"/images/welcome/notification-panel.png\" width=\"178\" height=\"59\"> \n\nNe soyez pas inquiêt de manquer une réponse vos notifications vous seront envoyées par courriel si vous n'êtes pas présent sur le site lorsqu'ils sont envoyés. \n\n## Vos préférences \n\nPar défaut, toutes les conversations de moins de deux jours sont considérées comme nouvelles, et chaque sujets auxquels vous avez participé (répondus, créés ou lu pendant un long moment) seront automatiquements suivis. \n\nVous verrez le badge bleu de nouveauté et le nombre de nouveaux messages au côté de ces discussions: \n\n<img src=\"/images/welcome/topics-new-unread.png\" width=\"368\" height=\"89\"> \n\nVous pouvez modifier l'état du suivi des notifications d'une discussion en utilisant les boutons en bas de la discussion (vous pouvez également le modifier au niveau des catégories). Pour changer la façon dont vous suivez les discussions, ou pour définir de nouveaux suivis, consultez [vos préférences utilisateurs](%{base_url}/my/preferences). \n\n## Confiance de la communauté\n\nLes nouveaux utilisateurs sont limités pour des raisons de sécurité.\
\ Plus vous participerez, plus vous gagnerez la confiance de la communauté et les restrictions disparaîtront. A plus haut [niveau de confiance](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924), vous gagnerez de nouvelles compétences pour nous aider à gérer la communauté.\n"
welcome_user:
subject_template: "Bienvenue sur %{site_name} !"
text_body_template: "Merci d'avoir rejoint %{site_name} et bienvenue ! \n\n%{new_user_tips}\n\nNous croyons au [comportement communautaire civilisé](%{base_url}/guidelines) en tous temps. \n\nAmusez-vous bien ! \n\n(Si, en tant que nouvel utilisateur, vous avez besoin de communiquer avec un [responsable](%{base_url}/about), répondez simplement à ce message.)\n"

View File

@ -553,7 +553,7 @@ he:
http_background_reqs:
title: "רקע"
xaxis: "יום"
yaxis: שקות שמשמשות לעדכונים חיים ולמעקב"
yaxis: קשות שמשמשות לעדכונים חיים ולמעקב"
http_2xx_reqs:
title: "סטטוס 2xx (OK)"
xaxis: "יום"
@ -925,7 +925,7 @@ he:
warn_reviving_old_topic_age: "כאשר מישהו/מישהי מתחילים להגיב לנושא שבו התגובה האחרונה היא בת יותר מכמה ימים, אזהרה תוצג. בטלו אפשרות זו באמצעות הזנה של 0."
autohighlight_all_code: "לחייב שימוש בקוד הדגשה לכל קוד מעוצב מראש (preformatted code blocks) אפילו אם הם אינם מציינים את השפה."
highlighted_languages: "הכללת הדגשת שגיאות תחביר. (אזהרה: הכללת שפות רבות מידי עשוי להשפיע על הביצוע) ראו: https://highlightjs.org/static/demo/ להדגמה"
embeddable_host: "מארח (Host) אשר יכול להטמיע את התגובות מפורום Discourse זה. שם מארח בלבד, ללא http:// בהתחלה"
embeddable_hosts: "מארח (Host) אשר יכול להטמיע את התגובות מפורום Discourse זה. שם מארח בלבד, ללא http:// בהתחלה"
feed_polling_enabled: "הטמעה בלבד: האם לעמבד פידים של RSS/ATOM כפרסומים."
feed_polling_url: "הטמעה בלבד: URL של פיד RSS/ATOM להטמעה."
embed_by_username: "שם המשתמש של המשתמש/ת שיוצר את הנושאים המוטמעים."
@ -1084,7 +1084,7 @@ he:
>
> %{site_description}
אם אינכם מעוניינים לחצו על הקישור הבא:
אם הינכם מעוניינים לחצו על הקישור הבא:
%{invite_link}

View File

@ -340,6 +340,7 @@ it:
one: "quasi 1 anno fa"
other: "quasi %{count} anni fa"
password_reset:
no_token: "Siamo spiacenti ma il collegamento per il cambio password è troppo vecchio. Collegati di nuovo e seleziona 'Ho dimenticato la password' per avere un nuovo collegamento."
choose_new: "Per favore scegli una nuova password."
choose: "Per favore scegli una password"
update: 'Aggiorna Password'
@ -359,6 +360,7 @@ it:
continue_button: "Procedi su %{site_name}."
welcome_to: "Benvenuto su %{site_name}!"
approval_required: "Un moderatore deve approvare manualmente il tuo account prima che tu possa accedere al forum. Riceverai un'email quando il tuo account sarà approvato!"
missing_session: "Non possiamo verificare che il tuo account sia stato creato, per favore assicurati di avere i cookie abilitati nelle impostazioni del tuo browser."
post_action_types:
off_topic:
title: 'Fuori Tema'

View File

@ -837,7 +837,7 @@ ja:
warn_reviving_old_topic_age: "最後の返信がこの設定よりも古いトピックに返信すると、警告を表示します。0を設定すると無効になります"
autohighlight_all_code: "明示的に言語を指定しなくても、全てのコードブロックにコードハイライトを強制的に適用する"
highlighted_languages: "適用するシンタックスハイライトルール(警告: あまりに多くの言語を含むとパフォーマンスに影響を与えます) デモ: https://highlightjs.org/static/demo/ "
embeddable_host: "このDiscourseフォーラムのコメントを埋め込む事が出来るHost。Host名のみ、http:// で始めない"
embeddable_hosts: "このDiscourseフォーラムのコメントを埋め込む事が出来るHost。Host名のみ、http:// で始めない"
feed_polling_enabled: "EMBEDDING ONLY: ポストとしてRSS/Atomフィードを埋め込むかどうか"
feed_polling_url: "EMBEDDING ONLY: RSS/ATOMフィードのURLを埋め込む事が出来ます"
embed_by_username: "embedされたトピックの作成者として表示されるDiscourseユーザー名"

View File

@ -950,7 +950,7 @@ pt:
warn_reviving_old_topic_age: "Quando alguém começa a responder a um tópico em que a última resposta é mais antiga que estes dias, um aviso será exibido. Desativar ao configurar para 0."
autohighlight_all_code: "Forçar o destaque do código a todos os blocos de código pré-formatados mesmo quando não se especifica a linguagem."
highlighted_languages: "Incluídas regras de destaque da sintaxe (Aviso: incluir demasiadas linguagens pode impactar o desempenho) ver: https://highlightjs.org/static/demo/ para uma demonstração"
embeddable_host: "Servidor que pode incorporar os comentários deste fórum Discourse. Apenas o nome do servidor, não começar com http://"
embeddable_hosts: "Servidor que pode incorporar os comentários deste fórum Discourse. Apenas o nome do servidor, não começar com http://"
feed_polling_enabled: "INCORPORAR APENAS: incorporar feeds RSS/ATOM como mensagens."
feed_polling_url: "INCORPORAR APENAS: URL dos feeds de RSS/ATOM para embutir."
embed_by_username: "Nome de utilizador Discourse do utilizador que cria tópicos embebidos."

View File

@ -950,7 +950,7 @@ pt_BR:
warn_reviving_old_topic_age: "Quando alguém começa a responder a um tópico mais velho do que este número de dias, um aviso será exibido para desencorajar o usuário de reviver uma velha discussão. Desabilite definindo para 0."
autohighlight_all_code: "Aplicar código destacando todos os blocos de código pré-formatados, mesmo quando não for específica o idioma"
highlighted_languages: "Incluir regras de destaque de sintaxe. (AVISO: incluir muitas linguagens podem afetar a performance) veja: https://highlightjs.org/static/demo/ para uma demonstração"
embeddable_host: "Servidor que pode incorporar os comentários deste forum Discourse. Apenas o Nome do Servidor, não começar com http://"
embeddable_hosts: "Servidor que pode incorporar os comentários deste forum Discourse. Apenas o Nome do Servidor, não começar com http://"
feed_polling_enabled: "Se um feed RSS / ATOM são importados como mensagens"
feed_polling_url: "URL do feed RSS / ATOM para importar"
embed_by_username: "Nome de usuário Discourse para o usuário que cria os tópicos"

View File

@ -874,6 +874,7 @@ ru:
s3_access_key_id: "Amazon S3 access key для загрузки и хранения изображений"
s3_secret_access_key: "Amazon S3 secret key для загрузки и хранения изображений"
s3_region: "Географический регион Amazon S3, который будет использоваться для хранения изображений"
avatar_sizes: "Список автоматически сгенерированных размеров аватар."
enable_flash_video_onebox: "Разрешить умную вставку ссылок sqf и flv (Adobe Flash). ВНИМАНИЕ: повышает риски безопасности сайта."
default_invitee_trust_level: "Уровень доверия приглашенных пользователей по-умолчанию (от 0 до 4)."
default_trust_level: "Уровень доверия по умолчанию для всех новых пользователей (0-4). ВНИМАНИЕ! Повышая уровень доверия для новых пользователей, Вы можете столкнуться с большим колличеством спама."
@ -1005,7 +1006,7 @@ ru:
warn_reviving_old_topic_age: "Показывать предупреждение, когда кто-то пытается ответить в очень старую тему. Указывается в днях. Чтобы отключить 0."
autohighlight_all_code: "Принудительно использовать подсветку кода для всех отформатированных блоков кода, даже когда они явно не указан язык."
highlighted_languages: "Включить правила подсветки синтаксиса. (ВНИМАНИЕ: включение для многих языков может вызвать проблемы с производительностью) пример можно посмотреть на: https://highlightjs.org/static/demo/ "
embeddable_host: "Имя хоста которому разрешено использовать комменты с данного форума. Не указывайте http://"
embeddable_hosts: "Имя хоста которому разрешено использовать комменты с данного форума. Не указывайте http://"
feed_polling_enabled: "ТОЛЬКО ДЛЯ ВЛОЖЕННЫХ: Встраивать ли вложенные сообщения в RSS/ATOM ленту"
feed_polling_url: "URL адрес импорта RSS/ATOM ленты"
embed_by_username: "Имя пользователя который созал вложенную тему"
@ -1018,6 +1019,7 @@ ru:
notify_about_flags_after: "Если есть жалобы, которые не были обработаны после этого колличества часов, отправить уведомление по электронной почте на contact_email. Значение 0, чтобы отключить."
enable_cdn_js_debugging: "Добавить права crossorigin для всех js включений для правильного отображения ошибок в /logs "
show_create_topics_notice: "Если общее количество тем меньше 5, показывать персоналу соощбение с просьбой создать новые темы."
delete_drafts_older_than_n_days: Удалять черновики, которые старше (n) дней.
vacuum_db_days: "Запускать VACUUM FULL ANALYZE для восстановления базы данных после миграций ( 0 отключает)"
prevent_anons_from_downloading_files: "Запретить анонимным пользователям скачивать вложенные файлы. ВНИМАНИЕ: при этом будут недоступны любые вложения кроме картинок."
slug_generation_method: "Выберите метод генерации URL. 'encoded' будет изпользовать русские буквы в URL закодированные через проценты. 'none' не будет использовать перегенирацию."
@ -1142,6 +1144,7 @@ ru:
not_allowed_from_ip_address: "Вход с этого IP в качестве пользователя %{username} запрещен."
admin_not_allowed_from_ip_address: "Вход с этого IP в качестве администратора запрещен."
suspended: "Вы не можете войти до %{date}."
suspended_with_reason: "Учетная запись заблокирована до %{date}: %{reason}"
errors: "%{errors}"
not_available: "Недоступно. Попробуйте %{suggestion}?"
something_already_taken: "Что-то пошло не так, возможно, имя пользователя или электронный ящик уже используются. Попробуйте восстановить ваш пароль."
@ -1163,6 +1166,9 @@ ru:
email:
not_allowed: "недопустимый почтовый домен. Пожалуйста, используйте другой адрес."
blocked: "не разрешено."
ip_address:
blocked: "Новые регистрации запрещены с вашего IP-адреса."
max_new_accounts_per_registration_ip: "Новые регистрации запрещены с вашего IP-адреса (достигнут лимит регистраций). Свяжитесь с администрацией."
invite_mailer:
subject_template: "%{invitee_name} приглашает вас присоединиться к '%{topic_title}' на сайте %{site_domain_name}"
text_body_template: |
@ -2124,3 +2130,5 @@ ru:
error: "Ошибка!"
email_input: "Email Администратора"
submit_button: "отправить письмо"
discourse_hub:
access_token_problem: "Пожалуйста, обновите настройки сайта, чтобы задать верный discourse_org_access_key."

View File

@ -938,7 +938,7 @@ sq:
warn_reviving_old_topic_age: "When someone starts replying to a topic where the last reply is older than this many days, a warning will be displayed. Disable by setting to 0."
autohighlight_all_code: "Force apply code highlighting to all preformatted code blocks even when they didn't explicitly specify the language."
highlighted_languages: "Included syntax highlighting rules. (Warning: including too many langauges may impact performance) see: https://highlightjs.org/static/demo/ for a demo"
embeddable_host: "Host that can embed the comments from this Discourse forum. Hostname only, do not begin with http://"
embeddable_hosts: "Host that can embed the comments from this Discourse forum. Hostname only, do not begin with http://"
feed_polling_enabled: "EMBEDDING ONLY: Whether to embed a RSS/ATOM feed as posts."
feed_polling_url: "EMBEDDING ONLY: URL of RSS/ATOM feed to embed."
embed_by_username: "Discourse username of the user who creates the embedded topics."

View File

@ -903,7 +903,7 @@ tr_TR:
warn_reviving_old_topic_age: "Herhangi bir kullanıcı, son cevabın burada belirtilen gün sayısından daha önce yazıldığı bir konuya cevap yazmaya başladığında, bir uyarı mesajı çıkacak. Bu özelliği devre dışı bırakmak için 0 girin. "
autohighlight_all_code: "Tüm önceden formatlanan kod bloklarına, açıkça dil seçimi yapılmamış olsa da, zorla kod vurgulaması uygula."
highlighted_languages: "Dahil edilen sözdizimi vurgulama kuralları. (Dikkat: çok fazla dili dahil etmek performansı etkileyebilir) Demo için https://highlightjs.org/static/demo/ adresine bakınız"
embeddable_host: "Bu Discourse forumundan yorumların yerleştirilebileceği sunucu. Sadece sunucu, http:// ile başlamayın"
embeddable_hosts: "Bu Discourse forumundan yorumların yerleştirilebileceği sunucu. Sadece sunucu, http:// ile başlamayın"
feed_polling_enabled: "SADECE YERLEŞTİRME İÇİN: RSS/ATOM beslemesinin gönderi olarak yerleştirilip yerleştirilemeyeceği."
feed_polling_url: "SADECE YERLEŞTİRME İÇİN: Yerleştirilecek RSS/ATOM beslemesinin URL'i."
embed_by_username: "Yerleştirilmiş konuları oluşturan kullanıcıya ait Discourse kullanıcı adı. "
@ -916,6 +916,7 @@ tr_TR:
notify_about_flags_after: "Bu kadar saat geçmesine rağmen hala ilgilenilmemiş bayraklar varsa, contact_email adresine e-posta gönder. Devre dışı bırakmak için 0 girin. "
enable_cdn_js_debugging: "/logs 'ların asli hataları tüm js içeriklerine crossorigin izinleri ekleyerek göstermesine izin ver."
show_create_topics_notice: "Eğer sitede herkese açık konu sayısı 5'den az ise, adminden yeni konular oluşturmasını isteyen bir uyarı mesajı göster. "
delete_drafts_older_than_n_days: (n) günden eski taslakları sil.
vacuum_db_days: "Geçiş sonra DB alanı geri kazanmak için TAM VAKUM ANALİZİ'ni çalıştırın (devre dışı bırakmak için 0 girin)"
prevent_anons_from_downloading_files: "Anonim kullanıcıların eklenti indirebilmesini önle. DİKKAT: Bu ayar, eklenti olarak gönderilen resim-dışı site içeriklerinin de çalışmasını engelleyebilir."
slug_generation_method: "Slug üretim yöntemi seçin. 'kodlanmış' seçeneği yüzde kodlamalı metin oluşturur. 'hiçbiri' seçeneği slug'ı devre dışı bırakır."
@ -1016,6 +1017,7 @@ tr_TR:
not_allowed_from_ip_address: "Bu IP adresinden %{username} kullanıcı adı ile giriş yapamazsınız."
admin_not_allowed_from_ip_address: "Bu IP adresinden admin olarak giriş yapamazsınız."
suspended: "%{date} tarihine kadar giriş yapamazsınız."
suspended_with_reason: "Hesap %{date} tarihine kadar yasaklanmıştır. Sebep: %{reason}"
errors: "%{errors}"
not_available: "Uygun değil. Bunu denemeye ne dersiniz? %{suggestion}"
something_already_taken: "Bir şeyler ters gitti. Kullanıcı adı veya e-posta zaten kayıtlı olabilir. Parolamı Unuttum bağlantısını deneyin."
@ -1037,6 +1039,9 @@ tr_TR:
email:
not_allowed: "için o e-posta sağlayıcısına izin verilmiyor. Lütfen başka bir email adresi kullanın. "
blocked: "için izin yok."
ip_address:
blocked: "Mevcut IP adresiniz üzerinden yeni kayıt işlemine izin verilmiyor."
max_new_accounts_per_registration_ip: "Mevcut IP adresiniz üzerinden yeni kayıt işlemine izin verilmiyor. (Belirlenen maksimum limit aşıldı.) Bir yetkili ile iletişime geçin."
invite_mailer:
subject_template: "%{invitee_name} sizi %{site_domain_name} sitesindeki '%{topic_title}' adlı konuya davet etti. "
text_body_template: "%{invitee_name} sizi \n\n> %{site_title} -- %{site_description} \n\nsitesindeki\n\n> **%{topic_title}**\n>\n> %{topic_excerpt}\n\ntartışmasına davet ediyor.\n\nEğer ilgileniyorsanız, aşağıdaki bağlantıya tıklayın:\n\n%{invite_link}\n\nBu davet güvenilir bir kullanıcı tarafından gönderilmiştir, cevap yazarak tartışmaya hemen katılabilirsiniz.\n"

View File

@ -934,7 +934,7 @@ zh_CN:
warn_reviving_old_topic_age: "当有人开始回复最后一贴超过一定天数前的主题时,将有一个警告显示,不鼓励他们复活一个老的讨论。将其设置为 0 以禁用。"
autohighlight_all_code: "即使未显式设定语言,仍为所有预编排代码块应用语法高亮。"
highlighted_languages: "包含语法高亮规则。警告包含太多的语言可能会印象性能https://highlightjs.org/static/demo/ 查看演示"
embeddable_host: "能从这个 Discourse 论坛嵌入评论的主机。\n仅主机名不要以 http:// 开头"
embeddable_hosts: "能从这个 Discourse 论坛嵌入评论的主机。\n仅主机名不要以 http:// 开头"
feed_polling_enabled: "仅用于嵌入:是否将 RSS/ATOM 订阅为帖子。"
feed_polling_url: "仅用于嵌入RSS/ATOM 订阅的 URL。"
embed_by_username: "创建嵌入主题的 Discourse 的用户名。"
@ -1004,9 +1004,9 @@ zh_CN:
not_seen_in_a_month: "欢迎回来!我们已经好久没见到你了。这些是你不在时的最热门主题。"
move_posts:
new_topic_moderator_post:
other: "我已经移动了 %{conut} 个帖子到新的主题:%{topic_link}"
other: "我已经移动了 %{count} 个帖子到新的主题:%{topic_link}"
existing_topic_moderator_post:
other: "我已经移动了 %{conut} 个帖子到了一个已存在的主题:%{topic_link}"
other: "我已经移动了 %{count} 个帖子到了一个已存在的主题:%{topic_link}"
change_owner:
post_revision_text: "所有权从 %{old_user} 转移至 %{new_user}"
emoji:

View File

@ -1120,3 +1120,8 @@ zh_TW:
title: "服務條款"
privacy_topic:
title: "隱私政策"
admin_login:
success: "已發送郵件"
error: "錯誤"
email_input: "管理者郵件"
submit_button: "送出電子郵件"

View File

@ -729,9 +729,9 @@ developer:
client: true
embedding:
embeddable_host:
default: ''
regex: "^(?!http).+" # don't allow this to start with http:// or https://
embeddable_hosts:
default: ''
type: host_list
feed_polling_enabled: false
feed_polling_url: ''
embed_by_username:

View File

@ -54,6 +54,15 @@ if seed_welcome_topics
post.topic.update_pinned(true)
end
welcome = File.read(Rails.root + 'docs/ADMIN-QUICK-START-GUIDE.md')
PostCreator.create(Discourse.system_user, raw: welcome, title: "READ ME FIRST: Admin Quick Start Guide", skip_validations: true, category: staff ? staff.name : nil)
filename = DiscoursePluginRegistry.seed_data["admin_quick_start_filename"]
if filename.nil? || !File.exists?(filename)
filename = Rails.root + 'docs/ADMIN-QUICK-START-GUIDE.md'
end
welcome = File.read(filename)
PostCreator.create( Discourse.system_user,
raw: welcome,
title: DiscoursePluginRegistry.seed_data["admin_quick_start_title"] || "READ ME FIRST: Admin Quick Start Guide",
skip_validations: true,
category: staff ? staff.name : nil)
end

View File

@ -0,0 +1,5 @@
class MigrateEmbeddableHost < ActiveRecord::Migration
def change
execute "UPDATE site_settings SET name = 'embeddable_hosts', data_type = 9 WHERE name = 'embeddable_host'"
end
end

View File

@ -1,6 +1,6 @@
module BackupRestore
class RestoreDisabledError < RuntimeError; end
class RestoreDisabledError < RuntimeError; end
class FilenameMissingError < RuntimeError; end
class Restorer
@ -74,7 +74,7 @@ module BackupRestore
protected
def ensure_restore_is_enabled
raise Restore::RestoreDisabledError unless Rails.env.development? || SiteSetting.allow_restore?
raise BackupRestore::RestoreDisabledError unless Rails.env.development? || SiteSetting.allow_restore?
end
def ensure_no_operation_is_running
@ -89,7 +89,7 @@ module BackupRestore
end
def ensure_we_have_a_filename
raise Restore::FilenameMissingError if @filename.nil?
raise BackupRestore::FilenameMissingError if @filename.nil?
end
def initialize_state

View File

@ -207,7 +207,7 @@ class CookedPostProcessor
def update_topic_image(images)
if @post.is_first_post?
img = images.first
@post.topic.update_column(:image_url, img["src"]) if img["src"].present?
@post.topic.update_column(:image_url, img["src"][0...255]) if img["src"].present?
end
end

View File

@ -13,6 +13,7 @@ class DiscoursePluginRegistry
attr_writer :sass_variables
attr_writer :handlebars
attr_writer :serialized_current_user_fields
attr_writer :seed_data
attr_accessor :custom_html
@ -56,6 +57,10 @@ class DiscoursePluginRegistry
def serialized_current_user_fields
@serialized_current_user_fields ||= Set.new
end
def seed_data
@seed_data ||= HashWithIndifferentAccess.new({})
end
end
def register_js(filename, options={})
@ -104,6 +109,10 @@ class DiscoursePluginRegistry
end
end
def self.register_seed_data(key, value)
self.seed_data[key] = value
end
def javascripts
self.class.javascripts
end

View File

@ -31,7 +31,7 @@ class DistributedCache
hash = current.hash(message.site_id)
case payload["op"]
when "set" then hash[payload["key"]] = payload["value"]
when "set" then hash[payload["key"]] = payload["marshalled"] ? Marshal.load(payload["value"]) : payload["value"]
when "delete" then hash.delete(payload["key"])
when "clear" then hash.clear
end
@ -69,7 +69,10 @@ class DistributedCache
end
def self.set(hash, key, value)
publish(hash, { op: :set, key: key, value: value })
# special support for set
marshal = Set === value
value = Marshal.dump(value) if marshal
publish(hash, { op: :set, key: key, value: value, marshalled: marshal })
end
def self.delete(hash, key)

36
lib/email_cook.rb Normal file
View File

@ -0,0 +1,36 @@
# A very simple formatter for imported emails
class EmailCook
def initialize(raw)
@raw = raw
end
def cook
result = ""
in_quote = false
quote_buffer = ""
@raw.each_line do |l|
if l =~ /^\s*>/
in_quote = true
quote_buffer << l.sub(/^[\s>]*/, '') << "<br>"
elsif in_quote
result << "<blockquote>#{quote_buffer}</blockquote>"
quote_buffer = ""
in_quote = false
else
result << l << "<br>"
end
end
if in_quote
result << "<blockquote>#{quote_buffer}</blockquote>"
end
result.gsub!(/(<br>){3,10}/, '<br><br>')
result
end
end

View File

@ -200,7 +200,7 @@ class Guardian
def can_invite_to_forum?(groups=nil)
authenticated? &&
SiteSetting.max_invites_per_day.to_i > 0 &&
(SiteSetting.max_invites_per_day.to_i > 0 || is_staff?) &&
!SiteSetting.enable_sso &&
SiteSetting.enable_local_logins &&
(
@ -213,8 +213,8 @@ class Guardian
def can_invite_to?(object, group_ids=nil)
return false if ! authenticated?
return false unless ( SiteSetting.enable_local_logins && (!SiteSetting.must_approve_users? || is_staff?) )
return false if SiteSetting.max_invites_per_day.to_i == 0
return true if is_admin?
return false if (SiteSetting.max_invites_per_day.to_i == 0 && !is_staff?)
return false if ! can_see?(object)
return false if group_ids.present?

View File

@ -17,6 +17,10 @@ class Plugin::Instance
}
end
def seed_data
@seed_data ||= {}
end
def self.find_all(parent_path)
[].tap { |plugins|
# also follows symlinks - http://stackoverflow.com/q/357754
@ -166,7 +170,11 @@ class Plugin::Instance
def register_color_scheme(name, colors)
color_schemes << {name: name, colors: colors}
end
end
def register_seed_data(key, value)
seed_data[key] = value
end
def automatic_assets
css = styles.join("\n")
@ -224,6 +232,10 @@ class Plugin::Instance
register_assets! unless assets.blank?
seed_data.each do |key, value|
DiscoursePluginRegistry.register_seed_data(key, value)
end
# TODO: possibly amend this to a rails engine
# Automatically include assets

View File

@ -28,6 +28,7 @@ class PostCreator
# cook_method - Method of cooking the post.
# :regular - Pass through Markdown parser and strip bad HTML
# :raw_html - Perform no processing
# :raw_email - Imported from an email
# via_email - Mark this post as arriving via email
# raw_email - Full text of arriving email (to store)
#

View File

@ -224,6 +224,7 @@ module PrettyText
def self.add_s3_cdn(doc)
doc.css("img").each do |img|
next unless img["src"]
img["src"] = img["src"].sub(Discourse.store.absolute_base_url, SiteSetting.s3_cdn_url)
end
end

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