Version bump

This commit is contained in:
Neil Lalonde 2016-08-12 11:49:30 -04:00
commit 1b2a6c6cb6
126 changed files with 1879 additions and 678 deletions

View File

@ -216,7 +216,7 @@ GEM
omniauth-twitter (1.2.1)
json (~> 1.3)
omniauth-oauth (~> 1.1)
onebox (1.5.44)
onebox (1.5.48)
htmlentities (~> 4.3.4)
moneta (~> 0.8)
multi_json (~> 1.11)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 919 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1021 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 932 B

View File

@ -22,7 +22,7 @@ export default Ember.Controller.extend({
@computed('problems.length')
foundProblems(problemsLength) {
return this.currentUser.get('admin') && (problemsLength || 0) > 1;
return this.currentUser.get('admin') && (problemsLength || 0) > 0;
},
@computed('foundProblems')

View File

@ -96,7 +96,7 @@ const AdminUser = Discourse.User.extend({
deleteAllPosts() {
const user = this,
message = I18n.t('admin.user.delete_all_posts_confirm', { posts: user.get('post_count'), topics: user.get('topic_count') }),
message = I18n.messageFormat('admin.user.delete_all_posts_confirm_MF', { "POSTS": user.get('post_count'), "TOPICS": user.get('topic_count') }),
buttons = [{
"label": I18n.t("composer.cancel"),
"class": "cancel-inline",
@ -467,13 +467,13 @@ const AdminUser = Discourse.User.extend({
user.checkEmail().then(function() {
const data = {
posts: user.get('post_count'),
topics: user.get('topic_count'),
"POSTS": user.get('post_count'),
"TOPICS": user.get('topic_count'),
email: user.get('email') || I18n.t("flagging.hidden_email_address"),
ip_address: user.get('ip_address') || I18n.t("flagging.ip_address_missing")
};
const message = I18n.t('flagging.delete_confirm', data),
const message = I18n.messageFormat('flagging.delete_confirm_MF', data),
buttons = [{
"label": I18n.t("composer.cancel"),
"class": "cancel-inline",

View File

@ -10,7 +10,7 @@
<div class="admin-container tl3-requirements">
<h2>{{model.username}} - {{i18n 'admin.user.tl3_requirements.title'}}</h2>
<br/>
<p>{{i18n 'admin.user.tl3_requirements.table_title' time_period=model.tl3Requirements.time_period}}</p>
<p>{{i18n 'admin.user.tl3_requirements.table_title' count=model.tl3Requirements.time_period}}</p>
<table class="table" style="width: auto;">
<thead>

View File

@ -296,7 +296,13 @@ export default Ember.Component.extend({
// Believe it or not pasting an image in Firefox doesn't work without this code
_firefoxPastingHack() {
const uaMatch = navigator.userAgent.match(/Firefox\/(\d+)\.\d/);
if (uaMatch && parseInt(uaMatch[1]) >= 24) {
if (uaMatch) {
let uaVersion = parseInt(uaMatch[1]);
if (uaVersion < 24 || 50 <= uaVersion) {
// The hack is no longer required in FF 50 and later.
// See: https://bugzilla.mozilla.org/show_bug.cgi?id=906420
return;
}
this.$().append( Ember.$("<div id='contenteditable' contenteditable='true' style='height: 0; width: 0; overflow: hidden'></div>") );
this.$("textarea").off('keydown.contenteditable');
this.$("textarea").on('keydown.contenteditable', event => {

View File

@ -36,12 +36,12 @@ export default Ember.Component.extend({
const len = messageLength || 0;
const minLen = Discourse.SiteSettings.min_private_message_post_length;
if (len === 0) {
return I18n.t("flagging.custom_message.at_least", { n: minLen });
return I18n.t("flagging.custom_message.at_least", { count: minLen });
} else if (len < minLen) {
return I18n.t("flagging.custom_message.more", { n: minLen - len });
return I18n.t("flagging.custom_message.more", { count: minLen - len });
} else {
return I18n.t("flagging.custom_message.left", {
n: MAX_MESSAGE_LENGTH - len
count: MAX_MESSAGE_LENGTH - len
});
}
},

View File

@ -113,11 +113,12 @@ export default Ember.Component.extend(StringBuffer, {
}
},
highlight() {
highlight(opts = { isLastViewedTopic: false }) {
const $topic = this.$();
const originalCol = $topic.css('backgroundColor');
$topic
.addClass('highlighted')
.attr('data-islastviewedtopic', opts.isLastViewedTopic)
.stop()
.animate({ backgroundColor: originalCol }, 2500, 'swing', function() {
$topic.removeClass('highlighted');
@ -128,7 +129,7 @@ export default Ember.Component.extend(StringBuffer, {
// highlight the last topic viewed
if (this.session.get('lastTopicIdViewed') === this.get('topic.id')) {
this.session.set('lastTopicIdViewed', null);
this.highlight();
this.highlight({ isLastViewedTopic: true });
} else if (this.get('topic.highlight')) {
// highlight new topics that have been loaded from the server or the one we just created
this.set('topic.highlight', false);

View File

@ -55,5 +55,6 @@ export default MountWidget.extend(Docking, {
didInsertElement() {
this._super();
this.dispatch('topic:current-post-scrolled', 'timeline-scrollarea');
this.dispatch('topic-notifications-button:keyboard-trigger', 'topic-notifications-button');
}
});

View File

@ -69,7 +69,9 @@ export default Ember.Controller.extend({
focusTarget(replyingToTopic, creatingPM, usernames) {
if (this.capabilities.isIOS) { return "none"; }
if (creatingPM && usernames === this.currentUser.get('username')) {
// Focus on usernames if it's blank or if it's just you
usernames = usernames || "";
if (creatingPM && usernames.length === 0 || usernames === this.currentUser.get('username')) {
return 'usernames';
}

View File

@ -69,7 +69,7 @@ export default Ember.Controller.extend(ModalFunctionality, {
willCloseI18n: function() {
if (this.get('model.details.auto_close_based_on_last_post')) {
return I18n.t('topic.auto_close_immediate', {hours: this.get('model.auto_close_time')});
return I18n.t('topic.auto_close_immediate', {count: this.get('model.auto_close_time')});
}
}.property('model.details.auto_close_based_on_last_post', 'model.auto_close_time')

View File

@ -4,6 +4,7 @@ import showModal from 'discourse/lib/show-modal';
import { default as computed, observes } from 'ember-addons/ember-computed-decorators';
import Category from 'discourse/models/category';
import { escapeExpression } from 'discourse/lib/utilities';
import { setTransient } from 'discourse/lib/page-tracker';
const SortOrders = [
{name: I18n.t('search.relevance'), id: 0},
@ -14,6 +15,7 @@ const SortOrders = [
export default Ember.Controller.extend({
needs: ["application"],
bulkSelectEnabled: null,
loading: Em.computed.not("model"),
queryParams: ["q", "context_id", "context", "skip_context"],
@ -24,12 +26,18 @@ export default Ember.Controller.extend({
searching: false,
sortOrder: 0,
sortOrders: SortOrders,
invalidSearch: false,
@computed('model.posts')
resultCount(posts){
resultCount(posts) {
return posts && posts.length;
},
@computed('resultCount')
hasResults(resultCount) {
return (resultCount || 0) > 0;
},
@computed('q')
hasAutofocus(q) {
return Em.isEmpty(q);
@ -62,11 +70,6 @@ export default Ember.Controller.extend({
return isValidSearchTerm(q);
},
@computed('searchTerm', 'searching')
searchButtonDisabled(searchTerm, searching) {
return !!(searching || !isValidSearchTerm(searchTerm));
},
@computed('q')
noSortQ(q) {
if (q) {
@ -85,7 +88,7 @@ export default Ember.Controller.extend({
setSearchTerm(term) {
this._searchOnSortChange = false;
if (term) {
SortOrders.forEach((order) => {
SortOrders.forEach(order => {
if (term.indexOf(order.term) > -1){
this.set('sortOrder', order.id);
term = term.replace(order.term, "");
@ -98,9 +101,9 @@ export default Ember.Controller.extend({
},
@observes('sortOrder')
triggerSearch(){
triggerSearch() {
if (this._searchOnSortChange) {
this.search();
this._search();
}
},
@ -130,15 +133,31 @@ export default Ember.Controller.extend({
this.set("controllers.application.showFooter", !this.get("loading"));
},
canBulkSelect: Em.computed.alias('currentUser.staff'),
@computed('hasResults')
canBulkSelect(hasResults) {
return this.currentUser && this.currentUser.staff && hasResults;
},
@computed
canCreateTopic() {
return this.currentUser && !this.site.mobileView;
},
_search() {
if (this.get("searching")) { return; }
this.set('invalidSearch', false);
const searchTerm = this.get('searchTerm');
if (!isValidSearchTerm(searchTerm)) {
this.set('invalidSearch', true);
return;
}
search(){
if (this.get("searching")) return;
this.set("searching", true);
this.set('bulkSelectEnabled', false);
this.get('selected').clear();
const router = Discourse.__container__.lookup('router:main');
var args = { q: this.get("searchTerm") };
var args = { q: searchTerm };
const sortOrder = this.get("sortOrder");
if (sortOrder && SortOrders[sortOrder].term) {
@ -160,9 +179,9 @@ export default Ember.Controller.extend({
ajax("/search", { data: args }).then(results => {
const model = translateResults(results) || {};
router.transientCache('lastSearch', { searchKey, model }, 5);
setTransient('lastSearch', { searchKey, model }, 5);
this.set("model", model);
}).finally(() => { this.set("searching",false); });
}).finally(() => this.set("searching", false));
},
actions: {
@ -187,22 +206,13 @@ export default Ember.Controller.extend({
this.get('selected').clear();
},
refresh() {
this.set('bulkSelectEnabled', false);
this.get('selected').clear();
this.search();
},
showSearchHelp() {
// TODO: dupe code should be centralized
ajax("/static/search_help.html", { dataType: 'html' }).then((model) => {
showModal('searchHelp', { model });
});
ajax("/static/search_help.html", { dataType: 'html' }).then(model => showModal('searchHelp', { model }));
},
search() {
if (this.get("searchButtonDisabled")) return;
this.search();
this._search();
}
}
});

View File

@ -176,7 +176,7 @@ export default Ember.Controller.extend(ModalFunctionality, {
authMessage: (function() {
if (Ember.isEmpty(this.get('authenticate'))) return "";
const method = findAll(this.siteSettings).findProperty("name", this.get("authenticate"));
const method = findAll(this.siteSettings, this.capabilities, this.isMobileDevice).findProperty("name", this.get("authenticate"));
if(method){
return method.get('message');
}

View File

@ -2,7 +2,6 @@ import { ajax } from 'discourse/lib/ajax';
import computed from 'ember-addons/ember-computed-decorators';
export default Ember.Controller.extend({
needs: ['application'],
showLoginButton: Em.computed.equal("model.path", "login"),

View File

@ -144,7 +144,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, {
@computed('model')
suggestedTitle(model) {
return model.get('isPrivateMessage') ?
`<i class='private-message-glyph fa fa-envelope'></i> ${I18n.t("suggested_topics.pm_title")}` :
`<a href="${this.get('pmPath')}"><i class='private-message-glyph fa fa-envelope'></i></a> ${I18n.t("suggested_topics.pm_title")}` :
I18n.t("suggested_topics.title");
},

View File

@ -7,31 +7,14 @@ export default {
initialize(container) {
const cache = {};
var transitionCount = 0;
// Tell our AJAX system to track a page transition
const router = container.lookup('router:main');
router.on('willTransition', viewTrackingRequired);
router.on('didTransition', function() {
Em.run.scheduleOnce('afterRender', Ember.Route, cleanDOM);
transitionCount++;
_.each(cache, (v,k) => {
if (v && v.target && v.target < transitionCount) {
delete cache[k];
}
});
});
router.transientCache = function(key, data, count) {
if (data === undefined) {
return cache[key];
} else {
return cache[key] = {data, target: transitionCount + count};
}
};
startPageTracking(router);
// Out of the box, Discourse tries to track google analytics

View File

@ -277,7 +277,9 @@ export default {
return;
}
const $selected = $articles.filter('.selected');
const $selected = ($articles.filter('.selected').length !== 0)
? $articles.filter('.selected')
: $articles.filter('[data-islastviewedtopic=true]');
let index = $articles.index($selected);
if ($selected.length !== 0) { //boundries check

View File

@ -2,6 +2,18 @@ const PageTracker = Ember.Object.extend(Ember.Evented);
let _pageTracker = PageTracker.create();
let _started = false;
const cache = {};
let transitionCount = 0;
export function setTransient(key, data, count) {
cache[key] = {data, target: transitionCount + count};
}
export function getTransient(key) {
return cache[key];
}
export function startPageTracking(router) {
if (_started) { return; }
@ -11,8 +23,13 @@ export function startPageTracking(router) {
// Refreshing the title is debounced, so we need to trigger this in the
// next runloop to have the correct title.
Em.run.next(() => {
_pageTracker.trigger('change', url, Discourse.get('_docTitle'));
Em.run.next(() => _pageTracker.trigger('change', url, Discourse.get('_docTitle')));
transitionCount++;
_.each(cache, (v,k) => {
if (v && v.target && v.target < transitionCount) {
delete cache[k];
}
});
});
_started = true;

View File

@ -22,7 +22,10 @@ export function translateResults(results, opts) {
return topic;
});
results.posts = results.posts.map(function(post){
results.posts = results.posts.map(post => {
if (post.username) {
post.userPath = Discourse.getURL(`/users/${post.username.toLowerCase()}`);
}
post = Post.create(post);
post.set('topic', topicMap[post.topic_id]);
return post;
@ -41,24 +44,26 @@ export function translateResults(results, opts) {
results.resultTypes = [];
// TODO: consider refactoring front end to take a better structure
[['topic','posts'],['user','users'],['category','categories']].forEach(function(pair){
const type = pair[0], name = pair[1];
if (results[name].length > 0) {
var result = {
results: results[name],
componentName: "search-result-" + ((opts.searchContext && opts.searchContext.type === 'topic' && type === 'topic') ? 'post' : type),
type,
more: r['more_' + name]
};
if (r) {
[['topic','posts'],['user','users'],['category','categories']].forEach(function(pair){
const type = pair[0], name = pair[1];
if (results[name].length > 0) {
var result = {
results: results[name],
componentName: "search-result-" + ((opts.searchContext && opts.searchContext.type === 'topic' && type === 'topic') ? 'post' : type),
type,
more: r['more_' + name]
};
if (result.more && name === "posts" && opts.fullSearchUrl) {
result.more = false;
result.moreUrl = opts.fullSearchUrl;
if (result.more && name === "posts" && opts.fullSearchUrl) {
result.more = false;
result.moreUrl = opts.fullSearchUrl;
}
results.resultTypes.push(result);
}
results.resultTypes.push(result);
}
});
});
}
const noResults = !!(results.topics.length === 0 &&
results.posts.length === 0 &&
@ -68,7 +73,7 @@ export function translateResults(results, opts) {
return noResults ? null : Em.Object.create(results);
}
function searchForTerm(term, opts) {
export function searchForTerm(term, opts) {
if (!opts) opts = {};
// Only include the data we have
@ -92,7 +97,7 @@ function searchForTerm(term, opts) {
return promise;
}
const searchContextDescription = function(type, name){
export function searchContextDescription(type, name) {
if (type) {
switch(type) {
case 'topic':
@ -107,17 +112,15 @@ const searchContextDescription = function(type, name){
}
};
const getSearchKey = function(args){
export function getSearchKey(args) {
return args.q + "|" + ((args.searchContext && args.searchContext.type) || "") + "|" +
((args.searchContext && args.searchContext.id) || "");
};
const isValidSearchTerm = function(searchTerm) {
export function isValidSearchTerm(searchTerm) {
if (searchTerm) {
return searchTerm.trim().length >= Discourse.SiteSettings.min_search_term_length;
} else {
return false;
}
};
export { searchForTerm, searchContextDescription, getSearchKey, isValidSearchTerm };

View File

@ -22,7 +22,7 @@ const LoginMethod = Ember.Object.extend({
let methods;
let preRegister;
export function findAll(siteSettings) {
export function findAll(siteSettings, capabilities, isMobileDevice) {
if (methods) { return methods; }
methods = [];
@ -55,6 +55,12 @@ export function findAll(siteSettings) {
});
preRegister = undefined;
}
// On Mobile, Android or iOS always go with full screen
if (isMobileDevice || capabilities.isIOS || capabilities.isAndroid) {
methods.forEach(m=>m.set("fullScreenLogin", true));
}
return methods;
}

View File

@ -204,7 +204,11 @@ const ApplicationRoute = Discourse.Route.extend(OpenComposer, {
},
_autoLogin(modal, modalClass, notAuto) {
const methods = findAll(this.siteSettings);
const methods = findAll(this.siteSettings,
this.container.lookup('capabilities:main'),
this.site.isMobileDevice);
if (!this.siteSettings.enable_local_logins && methods.length === 1) {
this.controllerFor('login').send('externalLogin', methods[0]);
} else {

View File

@ -2,13 +2,13 @@ import { ajax } from 'discourse/lib/ajax';
import { translateResults, getSearchKey, isValidSearchTerm } from "discourse/lib/search";
import Composer from 'discourse/models/composer';
import PreloadStore from 'preload-store';
import { getTransient, setTransient } from 'discourse/lib/page-tracker';
export default Discourse.Route.extend({
queryParams: { q: {}, context_id: {}, context: {}, skip_context: {} },
model(params) {
const router = Discourse.__container__.lookup('router:main');
var cached = router.transientCache('lastSearch');
const cached = getTransient('lastSearch');
var args = { q: params.q };
if (params.context_id && !args.skip_context) {
args.search_context = {
@ -21,7 +21,7 @@ export default Discourse.Route.extend({
if (cached && cached.data.searchKey === searchKey) {
// extend expiry
router.transientCache('lastSearch', { searchKey, model: cached.data.model }, 5);
setTransient('lastSearch', { searchKey, model: cached.data.model }, 5);
return cached.data.model;
}
@ -33,7 +33,7 @@ export default Discourse.Route.extend({
}
}).then(results => {
const model = (results && translateResults(results)) || {};
router.transientCache('lastSearch', { searchKey, model }, 5);
setTransient('lastSearch', { searchKey, model }, 5);
return model;
});
},

View File

@ -1,67 +1,71 @@
<div class="search row clearfix">
{{search-text-field value=searchTerm class="full-page-search input-xxlarge search no-blur" action="search" hasAutofocus=hasAutofocus}}
{{d-button action="search" icon="search" class="btn-primary" disabled=searchButtonDisabled}}
{{#if currentUser}}
{{#unless site.mobileView}}
<span class="new-topic-btn">{{d-button id="create-topic" class="btn-default" action="createTopic" actionParam=searchTerm icon="plus" label="topic.create"}}</span>
{{/unless}}
{{d-button action="search" icon="search" class="btn-primary" disabled=searching}}
{{#if canCreateTopic}}
<span class="new-topic-btn">{{d-button id="create-topic" class="btn-default" action="createTopic" actionParam=searchTerm icon="plus" label="topic.create"}}</span>
{{/if}}
{{#if canBulkSelect}}
{{#if model.posts}}
{{d-button icon="list" class="bulk-select" title="topics.bulk.toggle" action="toggleBulkSelect"}}
{{bulk-select-button selected=selected action="refresh"}}
{{/if}}
{{d-button icon="list" class="bulk-select" title="topics.bulk.toggle" action="toggleBulkSelect"}}
{{bulk-select-button selected=selected action="search"}}
{{/if}}
</div>
{{#if model.posts}}
{{#if bulkSelectEnabled}}
{{#if bulkSelectEnabled}}
<div class='fps-select'>
<a href {{action "selectAll"}}>{{i18n "search.select_all"}}</a>
<a href {{action "clearAll"}}>{{i18n "search.clear_all"}}</a>
{{d-link action="selectAll" label="search.select_all"}}
{{d-link action="clearAll" label="search.clear_all"}}
</div>
{{/if}}
{{#if invalidSearch}}
<div class='fps-invalid'>
{{i18n "search.too_short"}}
</div>
{{/if}}
{{/if}}
{{#if context}}
<div class='fps-search-context'>
<label>
{{input type="checkbox" name="searchContext" checked=searchContextEnabled}} {{searchContextDescription}}
</label>
</div>
<div class='fps-search-context'>
<label>
{{input type="checkbox" name="searchContext" checked=searchContextEnabled}} {{searchContextDescription}}
</label>
</div>
{{/if}}
{{#conditional-loading-spinner condition=loading}}
{{#unless model.posts}}
{{#unless hasResults}}
<h3>
{{#if searchActive}}
{{i18n "search.no_results"}}
{{i18n "search.no_results"}}
{{/if}}
<a href class="show-help" {{action "showSearchHelp" bubbles=false}}>{{i18n "search.search_help"}}</a>
</h3>
{{/unless}}
{{#if model.posts}}
<div class='search-title clearfix'>
<div class='result-count'>
<span>
{{{i18n "search.result_count" count=resultCount term=noSortQ}}}
</span>
{{#if hasResults}}
<div class='search-title clearfix'>
<div class='result-count'>
<span>
{{{i18n "search.result_count" count=resultCount term=noSortQ}}}
</span>
</div>
<div class='sort-by'>
<span class='desc'>
{{i18n "search.sort_by"}}
</span>
{{combo-box value=sortOrder content=sortOrders castInteger="true"}}
</div>
</div>
<div class='sort-by'>
<span class='desc'>
{{i18n "search.sort_by"}}
</span>
{{combo-box value=sortOrder content=sortOrders castInteger="true"}}
</div>
</div>
{{/if}}
{{#each model.posts as |result|}}
<div class='fps-result'>
<div class='author'>
{{avatar result imageSize="large"}}
<a href={{result.userPath}} data-user-card="{{unbound result.username}}">
{{avatar result imageSize="large"}}
</a>
</div>
<div class='fps-topic'>
@ -101,7 +105,7 @@
{{#if showLikeCount}}
{{#if result.like_count}}
<span class='like-count'>
{{result.like_count}} <i class="icon fa fa-heart"></i>
{{result.like_count}} {{fa-icon "heart"}}
</span>
{{/if}}
{{/if}}
@ -109,11 +113,11 @@
</div>
{{/each}}
{{#if model.posts}}
<h3 class="search-footer">
{{i18n "search.no_more_results"}}
<a href class="show-help" {{action "showSearchHelp" bubbles=false}}>{{i18n "search.search_help"}}</a>
</h3>
{{#if hasResults}}
<h3 class="search-footer">
{{i18n "search.no_more_results"}}
<a href class="show-help" {{action "showSearchHelp" bubbles=false}}>{{i18n "search.search_help"}}</a>
</h3>
{{/if}}
{{/conditional-loading-spinner}}

View File

@ -31,7 +31,7 @@
{{/if}}
{{#if showFilter}}
<li><a class='btn' href {{action "togglePosts" user}}>{{fa-icon "filter"}}{{i18n 'topic.filter_to' username=username post_count=topicPostCount}}</a></li>
<li><a class='btn' href {{action "togglePosts" user}}>{{fa-icon "filter"}}{{i18n 'topic.filter_to' username=username count=topicPostCount}}</a></li>
{{/if}}
{{#if hasUserFilters}}

View File

@ -16,7 +16,7 @@ createWidget('hamburger-category', {
}
if (!this.currentUser) {
results.push(h('b.topics-count', c.get('topic_count').toString()));
results.push(h('b.topics-count', number(c.get('topic_count'))));
}
return results;

View File

@ -1,17 +1,33 @@
import { createWidget, applyDecorators } from 'discourse/widgets/widget';
import { h } from 'virtual-dom';
import DiscourseURL from 'discourse/lib/url';
import { ajax } from 'discourse/lib/ajax';
createWidget('priority-faq-link', {
tagName: 'a.faq-priority',
buildAttributes(attrs) {
return { href: attrs.href };
},
html() {
return [ I18n.t('faq'), ' ', h('span.badge.badge-notification', I18n.t('new_item')) ];
},
click(e) {
if (this.siteSettings.faq_url === this.attrs.href) {
e.preventDefault();
ajax("/users/read-faq", { method: "POST" }).then(() => {
this.currentUser.set('read_faq', true);
return DiscourseURL.routeToTag($(e.target).closest('a')[0]);
});
}
}
});
export default createWidget('hamburger-menu', {
tagName: 'div.hamburger-panel',
faqLink(href) {
return h('a.faq-priority', { attributes: { href } }, [
I18n.t('faq'),
' ',
h('span.badge.badge-notification', I18n.t('new_item'))
]);
},
adminLinks() {
const { currentUser } = this;
@ -139,7 +155,9 @@ export default createWidget('hamburger-menu', {
const prioritizeFaq = this.currentUser && !this.currentUser.read_faq;
if (prioritizeFaq) {
results.push(this.attach('menu-links', { heading: true, contents: () => this.faqLink(faqUrl) }));
results.push(this.attach('menu-links', { heading: true, contents: () => {
return this.attach('priority-faq-link', { href: faqUrl });
}}));
}
if (currentUser && currentUser.staff) {

View File

@ -21,11 +21,17 @@ const dropdown = {
};
createWidget('header-notifications', {
settings: {
avatarSize: 'medium'
},
html(attrs) {
const { currentUser } = this;
const contents = [ avatarImg('medium', { template: currentUser.get('avatar_template'),
username: currentUser.get('username') }) ];
const contents = [ avatarImg(this.settings.avatarSize, {
template: currentUser.get('avatar_template'),
username: currentUser.get('username')
}) ];
const unreadNotifications = currentUser.get('unread_notifications');
if (!!unreadNotifications) {

View File

@ -71,6 +71,10 @@ createWidget('search-menu-results', {
tagName: 'div.results',
html(attrs) {
if (attrs.invalidTerm) {
return h('div.no-results', I18n.t('search.too_short'));
}
if (attrs.noResults) {
return h('div.no-results', I18n.t('search.no_results'));
}

View File

@ -8,7 +8,8 @@ const searchData = {
results: {},
noResults: false,
term: undefined,
typeFilter: null
typeFilter: null,
invalidTerm: false
};
// Helps with debouncing and cancelling promises
@ -45,8 +46,11 @@ const SearchHelper = {
searchData.noResults = true;
searchData.results = [];
searchData.loading = false;
searchData.invalidTerm = true;
widget.scheduleRerender();
} else {
searchData.invalidTerm = false;
this._activeSearch = searchForTerm(term, { typeFilter, searchContext, fullSearchUrl });
this._activeSearch.then(content => {
searchData.noResults = content.resultTypes.length === 0;
@ -98,7 +102,8 @@ export default createWidget('search-menu', {
} else {
results.push(this.attach('search-menu-results', { term: searchData.term,
noResults: searchData.noResults,
results: searchData.results }));
results: searchData.results,
invalidTerm: searchData.invalidTerm }));
}
return results;
@ -130,13 +135,9 @@ export default createWidget('search-menu', {
triggerSearch() {
searchData.noResults = false;
if (isValidSearchTerm(searchData.term)) {
this.searchService().set('highlightTerm', searchData.term);
searchData.loading = true;
Ember.run.debounce(SearchHelper, SearchHelper.perform, this, 400);
} else {
searchData.results = [];
}
this.searchService().set('highlightTerm', searchData.term);
searchData.loading = true;
Ember.run.debounce(SearchHelper, SearchHelper.perform, this, 400);
},
moreOfType(type) {
@ -160,6 +161,8 @@ export default createWidget('search-menu', {
fullSearch() {
if (!isValidSearchTerm(searchData.term)) { return; }
searchData.results = [];
searchData.loading = false;
SearchHelper.cancel();
const url = this.fullSearchUrl();
if (url) {

View File

@ -110,6 +110,7 @@ aside.onebox {
@include onebox-favicon('githubissue', 'github');
@include onebox-favicon('githubgist', 'github');
@include onebox-favicon('amazon', 'amazon');
@include onebox-favicon('googledocs', 'google_branding/logo_drive_48px');
.onebox-body {
@ -153,10 +154,23 @@ aside.onebox {
@mixin gdocs-logo($type) {
&.g-#{$type}-logo {
background: image-url("favicons/google_branding/logo_#{$type}_128px.png") no-repeat;
background: image-url("favicons/google_branding/logo_#{$type}_48px.png") no-repeat;
}
}
.googledocs-onebox-logo {
width: 60px;
height: 50px;
float: left;
@include gdocs-logo('docs');
@include gdocs-logo('forms');
@include gdocs-logo('sheets');
@include gdocs-logo('slides');
@include gdocs-logo('calendar');
@include gdocs-logo('drive');
}
// Google Calendar Placeholder
.gdocs-onebox-splash {
background-color: blend-primary-secondary(30%);
color: $primary;
@ -165,12 +179,9 @@ aside.onebox {
display: inline-block;
width: 128px;
height: 128px;
@include gdocs-logo('docs');
@include gdocs-logo('forms');
@include gdocs-logo('sheets');
@include gdocs-logo('slides');
@include gdocs-logo('calendar');
@include gdocs-logo('drive');
&.g-calendar-logo {
background: image-url("favicons/google_branding/logo_calendar_128px.png") no-repeat;
}
}
}

View File

@ -1,3 +1,7 @@
.fps-invalid {
margin-bottom: 1em;
}
.fps-result {
.author {

View File

@ -185,7 +185,7 @@
color: $primary;
h3 {
margin-bottom: 0.25em;
margin-bottom: 0.4em;
}
}
}

View File

@ -3,6 +3,7 @@ require_dependency 'site_serializer'
class SiteController < ApplicationController
layout false
skip_before_filter :preload_json, :check_xhr
skip_before_filter :redirect_to_login_if_required, only: ['basic_info']
def site
render json: Site.json_for(guardian)
@ -23,4 +24,22 @@ class SiteController < ApplicationController
def emoji
render json: custom_emoji
end
def basic_info
results = {
logo_url: UrlHelper.absolute(SiteSetting.logo_url),
logo_small_url: UrlHelper.absolute(SiteSetting.logo_small_url),
apple_touch_icon_url: UrlHelper.absolute(SiteSetting.apple_touch_icon_url),
favicon_url: UrlHelper.absolute(SiteSetting.favicon_url),
title: SiteSetting.title,
description: SiteSetting.site_description
}
if SiteSetting.mobile_logo_url.present?
results[:mobile_logo_url] = SiteSetting.mobile_logo_url
end
# this info is always available cause it can be scraped from a 404 page
render json: results
end
end

View File

@ -7,7 +7,9 @@ class UsersController < ApplicationController
skip_before_filter :authorize_mini_profiler, only: [:avatar]
skip_before_filter :check_xhr, only: [:show, :password_reset, :update, :account_created, :activate_account, :perform_account_activation, :user_preferences_redirect, :avatar, :my_redirect, :toggle_anon, :admin_login]
before_filter :ensure_logged_in, only: [:username, :update, :user_preferences_redirect, :upload_user_image, :pick_avatar, :destroy_user_image, :destroy, :check_emails]
before_filter :ensure_logged_in, only: [:username, :update, :user_preferences_redirect, :upload_user_image,
:pick_avatar, :destroy_user_image, :destroy, :check_emails, :topic_tracking_state]
before_filter :respond_to_suspicious_request, only: [:create]
# we need to allow account creation with bad CSRF tokens, if people are caching, the CSRF token on the
@ -140,6 +142,16 @@ class UsersController < ApplicationController
render json: failed_json, status: 403
end
def topic_tracking_state
user = fetch_user_from_params
guardian.ensure_can_edit!(user)
report = TopicTrackingState.report(user.id)
serializer = ActiveModel::ArraySerializer.new(report, each_serializer: TopicTrackingStateSerializer)
render json: MultiJson.dump(serializer)
end
def badge_title
params.require(:user_badge_id)

View File

@ -236,18 +236,22 @@ module Jobs
enqueue_in(secs, job_name, opts)
end
def self.cancel_scheduled_job(job_name, params={})
scheduled_for(job_name, params).each(&:delete)
def self.cancel_scheduled_job(job_name, opts={})
scheduled_for(job_name, opts).each(&:delete)
end
def self.scheduled_for(job_name, params={})
params = params.with_indifferent_access
def self.scheduled_for(job_name, opts={})
opts = opts.with_indifferent_access
unless opts.delete(:all_sites)
opts[:current_site_id] ||= RailsMultisite::ConnectionManagement.current_db
end
job_class = "Jobs::#{job_name.to_s.camelcase}"
Sidekiq::ScheduledSet.new.select do |scheduled_job|
if scheduled_job.klass.to_s == job_class
matched = true
job_params = scheduled_job.item["args"][0].with_indifferent_access
params.each do |key, value|
opts.each do |key, value|
if job_params[key] != value
matched = false
break

View File

@ -1,6 +1,7 @@
module Jobs
class GrantFirstReplyByEmail < Jobs::Onceoff
def execute_onceoff(args)
return unless SiteSetting.enable_badges
to_award = {}

View File

@ -9,7 +9,7 @@ module Jobs
.select(:id, :created_at, :cooked, :user_id)
.visible
.public_posts
.where("cooked like '%emoji%'")
.where("cooked LIKE '%emoji%'")
.find_in_batches do |group|
group.each do |p|
doc = Nokogiri::HTML::fragment(p.cooked)

View File

@ -11,9 +11,8 @@ module Jobs
.select(:id, :created_at, :raw, :user_id)
.visible
.public_posts
.where("raw like '%http%'")
.where("raw LIKE '%http%'")
.find_in_batches do |group|
group.each do |p|
begin
# Note we can't use `p.cooked` here because oneboxes have been cooked out

View File

@ -0,0 +1,16 @@
module Jobs
class ProcessEmail < Jobs::Base
sidekiq_options retry: 3
def execute(args)
Email::Processor.process!(args[:mail], false)
end
sidekiq_retries_exhausted do |msg|
Rails.logger.warn("Incoming email could not be processed after 3 retries.\n\n#{msg["args"][:mail]}")
end
end
end

View File

@ -103,6 +103,7 @@ module Jobs
end
if user.user_option.mailing_list_mode? &&
user.user_option.mailing_list_mode_frequency == 1 && # don't catch notifications for users on daily mailing list mode
(!post.try(:topic).try(:private_message?)) &&
NOTIFICATIONS_SENT_BY_MAILING_LIST.include?(email_args[:notification_type])
# no need to log a reason when the mail was already sent via the mailing list job

View File

@ -66,14 +66,14 @@ class Badge < ActiveRecord::Base
PostRevision = 2
TrustLevelChange = 4
UserChange = 8
PostProcessed = 16
PostProcessed = 16 # deprecated
def self.is_none?(trigger)
[None].include? trigger
end
def self.uses_user_ids?(trigger)
[TrustLevelChange, UserChange, PostProcessed].include? trigger
[TrustLevelChange, UserChange].include? trigger
end
def self.uses_post_ids?(trigger)

View File

@ -25,7 +25,8 @@ class EmbeddableHost < ActiveRecord::Base
def host_must_be_valid
if host !~ /\A[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,7}(:[0-9]{1,5})?(\/.*)?\Z/i &&
host !~ /\A(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\Z/
host !~ /\A(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\Z/ &&
host !~ /\A([a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.)?localhost(\:[0-9]{1,5})?(\/.*)?\Z/i
errors.add(:host, I18n.t('errors.messages.invalid'))
end
end

View File

@ -362,6 +362,10 @@ class Post < ActiveRecord::Base
post_number == 1
end
def is_reply_by_email?
via_email && post_number.present? && post_number > 1
end
def is_flagged?
post_actions.where(post_action_type_id: PostActionType.flag_types.values, deleted_at: nil).count != 0
end

View File

@ -361,6 +361,13 @@ class Topic < ActiveRecord::Base
topics = topics.where("topics.category_id NOT IN (?)", muted_category_ids)
end
# Remove muted categories
muted_tag_ids = TagUser.lookup(user, :muted).pluck(:tag_id)
unless muted_tag_ids.empty?
topics = topics.joins("LEFT OUTER JOIN topic_tags ON topic_tags.topic_id = topics.id")
.where("topic_tags.tag_id NOT IN (?)", muted_tag_ids)
end
topics
end

View File

@ -1,9 +1,8 @@
class SearchPostSerializer < PostSerializer
class SearchPostSerializer < BasicPostSerializer
has_one :topic, serializer: TopicListItemSerializer
attributes :like_count
attributes :like_count, :blurb, :post_number
attributes :blurb
def blurb
options[:result].blurb(object)
end

View File

@ -76,7 +76,7 @@ class BadgeGranter
end
end
def self.queue_badge_grant(type,opt)
def self.queue_badge_grant(type, opt)
return unless SiteSetting.enable_badges
payload = nil
@ -105,12 +105,6 @@ class BadgeGranter
type: "PostAction",
post_ids: [action.post_id, action.related_post_id].compact!
}
when Badge::Trigger::PostProcessed
user = opt[:user]
payload = {
type: "PostProcessed",
user_ids: [user.id]
}
end
$redis.lpush queue_key, payload.to_json if payload
@ -128,16 +122,17 @@ class BadgeGranter
limit -= 1
end
items = items.group_by{|i| i["type"]}
items = items.group_by { |i| i["type"] }
items.each do |type, list|
post_ids = list.map{|i| i["post_ids"]}.flatten.compact.uniq
user_ids = list.map{|i| i["user_ids"]}.flatten.compact.uniq
post_ids = list.flat_map { |i| i["post_ids"] }.compact.uniq
user_ids = list.flat_map { |i| i["user_ids"] }.compact.uniq
next unless post_ids.present? || user_ids.present?
find_by_type(type).each{ |badge|
find_by_type(type).each do |badge|
backfill(badge, post_ids: post_ids, user_ids: user_ids)
}
end
end
end
@ -229,10 +224,10 @@ class BadgeGranter
MAX_ITEMS_FOR_DELTA = 200
def self.backfill(badge, opts=nil)
return unless SiteSetting.enable_badges
return unless badge.query.present? && badge.enabled
return unless badge.enabled
return unless badge.query.present?
post_ids = user_ids = nil
post_ids = opts[:post_ids] if opts
user_ids = opts[:user_ids] if opts
@ -331,7 +326,6 @@ class BadgeGranter
raise ex
end
def self.revoke_ungranted_titles!
Badge.exec_sql("UPDATE users SET title = ''
WHERE NOT title IS NULL AND

View File

@ -877,8 +877,8 @@ en:
too_few_topics_notice: "Let's <a href='http://blog.discourse.org/2014/08/building-a-discourse-community/'>get this discussion started!</a> There are currently <strong>%{currentTopics} / %{requiredTopics}</strong> topics. New visitors need some conversations to read and respond to."
too_few_posts_notice: "Let's <a href='http://blog.discourse.org/2014/08/building-a-discourse-community/'>get this discussion started!</a> There are currently <strong>%{currentPosts} / %{requiredPosts}</strong> posts. New visitors need some conversations to read and respond to."
logs_error_rate_notice:
reached: "<b>[%{relativeAge}]</b> Current rate of <a href='%{url}' target='_blank'>%{rate}</a> has reached site settings's limit of %{siteSettingRate}."
exceeded: "<b>[%{relativeAge}]</b> Current rate of <a href='%{url}' target='_blank'>%{rate}</a> has exceeded site settings's limit of %{siteSettingRate}."
reached: "<b>%{relativeAge}</b> <a href='%{url}' target='_blank'>%{rate}</a> reached site setting limit of %{siteSettingRate}."
exceeded: "<b>%{relativeAge}</b> <a href='%{url}' target='_blank'>%{rate}</a> exceeds site setting limit of %{siteSettingRate}."
rate:
one: "1 error/%{duration}"
other: "%{count} errors/%{duration}"
@ -1028,7 +1028,9 @@ en:
similar_topics: "Your topic is similar to..."
drafts_offline: "drafts offline"
group_mentioned: "By mentioning {{group}}, you are about to notify <a href='{{group_link}}'>{{count}} people</a> are you sure?"
group_mentioned:
one: "By mentioning {{group}}, you are about to notify <a href='{{group_link}}'>1 person</a> are you sure?"
other: "By mentioning {{group}}, you are about to notify <a href='{{group_link}}'>{{count}} people</a> are you sure?"
duplicate_link: "It looks like your link to <b>{{domain}}</b> was already posted in the topic by <b>@{{username}}</b> in <a href='{{post_url}}'>a reply {{ago}}</a> are you sure you want to post it again?"
error:
@ -1185,6 +1187,7 @@ en:
most_liked: "Most Liked"
select_all: "Select All"
clear_all: "Clear All"
too_short: "Your search term is too short."
result_count:
one: "1 result for <span class='term'>\"{{term}}\"</span>"
other: "{{count}} results for <span class='term'>\"{{term}}\"</span>"
@ -1262,7 +1265,9 @@ en:
unsubscribe:
stop_notifications: "You will now receive less notifications for <strong>{{title}}</strong>"
change_notification_state: "Your current notification state is "
filter_to: "{{post_count}} posts in topic"
filter_to:
one: "1 post in topic"
other: "{{count}} posts in topic"
create: 'New Topic'
create_long: 'Create a new Topic'
private_message: 'Start a message'
@ -1311,7 +1316,7 @@ en:
read_more_in_category: "Want to read more? Browse other topics in {{catLink}} or {{latestLink}}."
read_more: "Want to read more? {{catLink}} or {{latestLink}}."
# keys ending with _MF use message format, see /spec/components/js_local_helper_spec.rb for samples
# keys ending with _MF use message format, see https://meta.discourse.org/t/message-format-support-for-localization/7035 for details
read_more_MF: "There {
UNREAD, plural,
=0 {}
@ -1340,7 +1345,9 @@ en:
auto_close_title: 'Auto-Close Settings'
auto_close_save: "Save"
auto_close_remove: "Don't Auto-Close This Topic"
auto_close_immediate: "The last post in the topic is already %{hours} hours old, so the topic will be closed immediately."
auto_close_immediate:
one: "The last post in the topic is already 1 hour old, so the topic will be closed immediately."
other: "The last post in the topic is already %{count} hours old, so the topic will be closed immediately."
timeline:
back: "Back"
@ -1863,7 +1870,9 @@ en:
notify_action: 'Message'
official_warning: 'Official Warning'
delete_spammer: "Delete Spammer"
delete_confirm: "You are about to delete <b>%{posts}</b> posts and <b>%{topics}</b> topics from this user, remove their account, block signups from their IP address <b>%{ip_address}</b>, and add their email address <b>%{email}</b> to a permanent block list. Are you sure this user is really a spammer?"
# keys ending with _MF use message format, see https://meta.discourse.org/t/message-format-support-for-localization/7035 for details
delete_confirm_MF: "You are about to delete {POSTS, plural, one {<b>1</b> post} other {<b>#</b> posts}} and {TOPICS, plural, one {<b>1</b> topic} other {<b>#</b> topics}} from this user, remove their account, block signups from their IP address <b>%{ip_address}</b>, and add their email address <b>%{email}</b> to a permanent block list. Are you sure this user is really a spammer?"
yes_delete_spammer: "Yes, Delete Spammer"
ip_address_missing: "(N/A)"
hidden_email_address: "(hidden)"
@ -1878,9 +1887,15 @@ en:
custom_placeholder_notify_user: "Be specific, be constructive, and always be kind."
custom_placeholder_notify_moderators: "Let us know specifically what you are concerned about, and provide relevant links and examples where possible."
custom_message:
at_least: "enter at least {{n}} characters"
more: "{{n}} to go..."
left: "{{n}} remaining"
at_least:
one: "enter at least 1 character"
other: "enter at least {{count}} characters"
more:
one: "1 to go..."
other: "{{count}} to go..."
left:
one: "1 remaining"
other: "{{count}} remaining"
flagging_topic:
title: "Thanks for helping to keep our community civil!"
@ -1927,6 +1942,8 @@ en:
posts: "Posts"
posts_lowercase: "posts"
posts_long: "there are {{number}} posts in this topic"
# keys ending with _MF use message format, see https://meta.discourse.org/t/message-format-support-for-localization/7035 for details
posts_likes_MF: |
This topic has {count, plural, one {1 reply} other {# replies}} {ratio, select,
low {with a high like to post ratio}
@ -2797,7 +2814,9 @@ en:
suspend_reason: "Reason"
suspended_by: "Suspended by"
delete_all_posts: "Delete all posts"
delete_all_posts_confirm: "You are about to delete %{posts} posts and %{topics} topics. Are you sure?"
# keys ending with _MF use message format, see https://meta.discourse.org/t/message-format-support-for-localization/7035 for details
delete_all_posts_confirm_MF: "You are about to delete {POSTS, plural, one {1 post} other {# posts}} and {TOPICS, plural, one {1 topic} other {# topics}}. Are you sure?"
suspend: "Suspend"
unsuspend: "Unsuspend"
suspended: "Suspended?"
@ -2893,7 +2912,9 @@ en:
unlock_trust_level: "Unlock Trust Level"
tl3_requirements:
title: "Requirements for Trust Level 3"
table_title: "In the last %{time_period} days:"
table_title:
one: "In the last day:"
other: "In the last %{count} days:"
value_heading: "Value"
requirement_heading: "Requirement"
visits: "Visits"
@ -3003,6 +3024,7 @@ en:
plugins: "Plugins"
user_preferences: "User Preferences"
tags: "Tags"
search: "Search"
badges:
title: Badges

View File

@ -476,7 +476,6 @@ fi:
instructions: |
Asetus syrjäyttää koosteet tapahtumista.<br />
Vaimennettujen ketjujen ja alueiden viestejä ei sisällytetä sähköposteihin.
daily: "Lähetä päivittäin"
individual: "Lähetä sähköpostia jokaisesta uudesta viestistä"
many_per_day: "Lähetä minulle sähköpostia jokaisesta uudesta viestistä (noin {{dailyEmailEstimate}} päivässä)"

View File

@ -113,7 +113,7 @@ fr:
google+: 'partager ce lien sur Google+'
email: 'envoyer ce lien dans un courriel'
action_codes:
public_topic: "rendre ce sujet publique %{when}"
public_topic: "rendre ce sujet public %{when}"
private_topic: "rendre ce sujet privé %{when}"
split_topic: "a scindé ce sujet %{when}"
invited_user: "a invité %{who} %{when}"
@ -128,7 +128,7 @@ fr:
disabled: 'ouvert %{when}'
archived:
enabled: 'archivé %{when}'
disabled: 'sorti des archives %{when}'
disabled: 'désarchivé %{when}'
pinned:
enabled: 'épinglé %{when}'
disabled: 'désépinglé %{when}'
@ -144,23 +144,25 @@ fr:
bootstrap_mode_disabled: "Le mode Bootstrap sera désactivé dans les prochaines 24 heures."
s3:
regions:
us_east_1: "US Est (N. Virginia)"
us_west_1: "US Ouest (N. California)"
us_west_2: "US Ouest (Oregon)"
us_east_1: "États-Unis est (Virginie)"
us_west_1: "États-Unis ouest (Californie)"
us_west_2: "États-Unis ouest (Oregon)"
us_gov_west_1: "AWS GovCloud (US)"
eu_west_1: "EU (Irlande)"
eu_central_1: "EU (Frankfurt)"
ap_southeast_1: "Asia Pacific (Singapore)"
ap_southeast_2: "Asia Pacific (Sydney)"
ap_northeast_1: "Asia Pacific (Tokyo)"
ap_northeast_2: "Asia Pacific (Seoul)"
sa_east_1: "South America (Sao Paulo)"
eu_west_1: "UE (Irlande)"
eu_central_1: "UE (Francfort)"
ap_southeast_1: "Asie-Pacifique (Singapour)"
ap_southeast_2: "Asie-Pacifique (Sydney)"
ap_south_1: "Asie-Pacifique (Bombay)"
ap_northeast_1: "Asie-Pacifique (Tokyo)"
ap_northeast_2: "Asie-Pacifique (Séoul)"
sa_east_1: "Amérique du Sud (Sao Paulo)"
cn_north_1: "Chine (Pékin)"
edit: 'éditer le titre et la catégorie de ce sujet'
not_implemented: "Cette fonctionnalité n'a pas encore été implémentée, désolé."
no_value: "Non"
yes_value: "Oui"
generic_error: "Désolé, une erreur est survenue."
generic_error_with_reason: "Une erreur est survenue: %{error}"
generic_error_with_reason: "Une erreur est survenue : %{error}"
sign_up: "S'inscrire"
log_in: "Se connecter"
age: "Âge"
@ -174,12 +176,12 @@ fr:
one: "lien"
other: "liens"
faq: "FAQ"
guidelines: "Règlement"
guidelines: "Charte"
privacy_policy: "Politique de confidentialité"
privacy: "Confidentialité"
terms_of_service: "Conditions Générales d'Utilisation"
mobile_view: "Vue mode Mobile"
desktop_view: "Vue mode Bureau"
mobile_view: "Vue mobile"
desktop_view: "Vue bureau"
you: "Vous"
or: "ou"
now: "à l'instant"
@ -191,7 +193,7 @@ fr:
every_hour: "chaque heure"
daily: "quotidiennes"
weekly: "hebdomadaires"
every_two_weeks: "bi-mensuelles"
every_two_weeks: "toutes les deux semaines"
every_three_days: "tous les trois jours"
max_of_count: "maximum sur {{count}}"
alternation: "ou"
@ -200,7 +202,7 @@ fr:
other: "{{count}} caractères"
suggested_topics:
title: "Sujets similaires"
pm_title: "Messages Proposés"
pm_title: "Messages similaires"
about:
simple_title: "À propos"
title: "À propos de %{title}"
@ -208,7 +210,7 @@ fr:
our_admins: "Nos administrateurs"
our_moderators: "Nos modérateurs"
stat:
all_time: "depuis toujours"
all_time: "Depuis toujours"
last_7_days: "Les 7 derniers jours"
last_30_days: "Les 30 derniers jours"
like_count: "J'aime"
@ -220,17 +222,17 @@ fr:
contact_info: "En cas de problème critique ou urgent sur ce site, veuillez nous contacter : %{contact_info}"
bookmarked:
title: "Signet"
clear_bookmarks: "Vider signets"
clear_bookmarks: "Vider les signets"
help:
bookmark: "Cliquer pour ajouter le premier message de ce sujet à vos signets"
unbookmark: "Cliquer pour retirer tous vos signets pour ce sujet"
unbookmark: "Cliquer pour retirer tous les signets de ce sujet"
bookmarks:
not_logged_in: "désolé, vous devez être connecté pour ajouter des message dans vos signets"
created: "vous avez ajouté ce message dans vos signets"
not_bookmarked: "vous avez lu ce message; cliquez pour l'ajouter dans vos signets"
last_read: "ceci est le dernier message que vous avez lu; cliquez pour l'ajouter dans vos signets"
not_logged_in: "désolé, vous devez être connecté pour ajouter des messages dans vos signets"
created: "vous avez ajouté ce messages à vos signets"
not_bookmarked: "vous avez lu ce message ; cliquez pour lajouter à vos signets"
last_read: "ceci est le dernier message que vous avez lu ; cliquez pour l'ajouter à vos signets"
remove: "Retirer de vos signets"
confirm_clear: "Êtes-vous sûr de vouloir effacer tous les signets de ce sujet?"
confirm_clear: "Êtes-vous sûr de vouloir effacer tous les signets de ce sujet ?"
topic_count_latest:
one: "{{count}} sujet récent."
other: "{{count}} sujets récents."
@ -248,21 +250,22 @@ fr:
saved: "Sauvegardé !"
upload: "Envoyer"
uploading: "Envoi en cours..."
uploading_filename: "Téléchargement de {{filename}}..."
uploading_filename: "Envoi de {{filename}}..."
uploaded: "Envoyé !"
enable: "Activer"
disable: "Désactiver"
undo: "Annuler"
revert: "Rétablir"
failed: "Échec"
switch_to_anon: "Quitter le mode anonyme"
switch_to_anon: "Activer le mode anonyme"
switch_from_anon: "Quitter le mode anonyme"
banner:
close: "Ignorer cette bannière."
edit: "Éditer cette bannière >>"
choose_topic:
none_found: "Aucun sujet trouvé."
title:
search: "Rechercher un sujet par son nom, url ou id :"
search: "Rechercher un sujet par son nom, URL ou ID :"
placeholder: "renseignez ici le titre du sujet"
queue:
topic: "Sujet :"
@ -280,7 +283,7 @@ fr:
confirm: "Sauvegarder les modifications"
delete_prompt: "Êtes-vous sûr de vouloir supprimer <b>%{username}</b> ? Cela supprimera tous ses messages et bloquera son courriel et son adresse IP."
approval:
title: "Ce message doit être approuvé."
title: "Ce message doit être approuvé"
description: "Votre nouveau message a bien été envoyé, mais il doit être approuvé par un modérateur avant d'apparaître publiquement. Merci de votre patience."
pending_posts:
one: "Vous avez <strong>un</strong> message en attente."
@ -355,7 +358,8 @@ fr:
title: "Surveiller"
description: "Vous serez notifié de chaque nouvelle réponse dans chaque message, et le nombre de nouvelles réponses sera affiché."
watching_first_post:
description: "Vous serez uniquement notifié du premier message de chaque sujet de ce groupe"
title: "Surveiller les nouveaux sujets"
description: "Vous serez uniquement notifié du premier message de chaque sujet de ce groupe."
tracking:
title: "Suivre"
description: "Vous serez notifié si quelqu'un mentionne votre @pseudo ou vous répond, et le nombre de nouvelles réponses sera affiché."
@ -440,46 +444,61 @@ fr:
invited_by: "Invité par"
trust_level: "Niveau de confiance"
notifications: "Notifications"
statistics: "Stats"
statistics: "Statistiques"
desktop_notifications:
label: "Notifications de bureau"
not_supported: "Les notifications ne sont pas supportées avec ce navigateur. Désolé."
perm_default: "Activer les notifications"
perm_denied_btn: "Permission Refusée"
perm_denied_btn: "Permission refusée"
perm_denied_expl: "Vous n'avez pas autorisé les notifications. Autorisez-les depuis les paramètres de votre navigateur."
disable: "Désactiver les notifications"
enable: "Activer les notifications"
each_browser_note: "Note : Vous devez changer ce paramètre sur chaque navigateur que vous utilisez."
dismiss_notifications_tooltip: "Marquer comme lues toutes les notifications non lues"
disable_jump_reply: "Ne pas se déplacer à mon nouveau message après avoir répondu"
dismiss_notifications: "Tout ignorer"
dismiss_notifications_tooltip: "Marquer les notifications comme lues"
disable_jump_reply: "Ne pas aller à mon nouveau message après avoir répondu"
dynamic_favicon: "Faire apparaître le nombre de sujets récemment créés ou mis à jour sur l'icône navigateur"
external_links_in_new_tab: "Ouvrir tous les liens externes dans un nouvel onglet"
enable_quoting: "Proposer la citation du texte surligné"
enable_quoting: "Proposer de citer le texte sélectionné"
change: "modifier"
moderator: "{{user}} est un modérateur"
admin: "{{user}} est un administrateur"
moderator_tooltip: "Cet utilisateur est un modérateur"
admin_tooltip: "Cet utilisateur est un admin"
blocked_tooltip: "Cet utilisateur est bloqué."
admin_tooltip: "Cet utilisateur est un administrateur"
blocked_tooltip: "Cet utilisateur est bloqué"
suspended_notice: "L'utilisateur est suspendu jusqu'au {{date}}."
suspended_reason: "Raison :"
github_profile: "Github"
github_profile: "GitHub"
email_activity_summary: "Résumé d'activité"
mailing_list_mode:
label: "Mode mailing list"
enabled: "Activer le mode mailing list"
label: "Liste de diffusion"
enabled: "Activer la liste de diffusion"
instructions: |
Ce réglage outrepasse le résumé d'activités.<br />
Les sujets et catégories passés en silencieux ne sont pas cités dans ces courriels.
Les sujets et catégories passés en silencieux ne sont pas inclus dans ces courriels.
daily: "Envoyer des informations quotidiennes"
individual: "Envoyer un courriel pour chaque nouveau message."
individual: "Envoyer un courriel pour chaque nouveau message"
many_per_day: "M'envoyer un courriel pour chaque nouveau message (environ {{dailyEmailEstimate}} par jour)"
few_per_day: "M'envoyer un courriel pour chaque nouveau message (environ 2 par jour)"
tag_settings: "Tags"
watched_tags: "Surveillés"
watched_tags_instructions: "Vous surveillerez automatiquement tous les sujets avec ces tags. Vous serez notifié de tous les nouveaux messages et sujets, et le nombre de nouveaux messages apparaîtra à coté du sujet."
tracked_tags: "Suivis"
tracked_tags_instructions: "Vous allez suivre automatiquement tous les sujets avec ces tags. Le nombre de nouveaux messages apparaîtra à côté du sujet."
muted_tags: "Silencieux"
muted_tags_instructions: "Vous ne serez notifié de rien concernant les nouveaux sujets avec ces tags, et ils n'apparaîtront pas dans la liste des sujets récents."
watched_categories: "Surveillés"
watched_categories_instructions: "Vous surveillerez automatiquement tous les sujets de ces catégories. Vous serez notifié de tous les nouveaux messages et sujets, et le nombre de nouveaux messages apparaîtra à coté du sujet."
tracked_categories: "Suivies"
muted_categories: "Désactivés"
tracked_categories_instructions: "Vous allez suivre automatiquement tous les sujets dans ces catégories. Le nombre de nouveaux messages apparaîtra à côté du sujet."
watched_first_post_categories: "Surveiller les nouveaux sujets"
watched_first_post_categories_instructions: "Vous serez notifié du premier message de chaque sujet dans ces catégories."
watched_first_post_tags: "Surveiller les nouveaux sujets"
watched_first_post_tags_instructions: "Vous serez notifié du premier message de chaque sujet avec ces tags."
muted_categories: "Silencieuses"
muted_categories_instructions: "Vous ne serez notifié de rien concernant les nouveaux sujets dans ces catégories, et elles n'apparaîtront pas dans les dernières catégories."
delete_account: "Supprimer mon compte"
delete_account_confirm: "Êtes-vous sûr de vouloir supprimer définitivement votre compte ? Cette action ne peut être annulée !"
delete_account_confirm: "Êtes-vous sûr de vouloir supprimer définitivement votre compte ? Cette action ne peut pas être annulée !"
deleted_yourself: "Votre compte a été supprimé avec succès."
delete_yourself_not_allowed: "Vous ne pouvez pas supprimer votre compte maintenant. Contactez un administrateur pour faire supprimer votre compte pour vous."
unread_message_count: "Messages"
@ -488,6 +507,7 @@ fr:
muted_users: "Silencieux"
muted_users_instructions: "Cacher toutes les notifications de ces utilisateurs."
muted_topics_link: "Afficher les sujets en sourdine"
watched_topics_link: "Afficher les sujets surveillés"
automatically_unpin_topics: "Desépingler automatiquement quand j'arrive à la fin."
staff_counters:
flags_given: "signalements utiles"
@ -501,11 +521,11 @@ fr:
sent: "Envoyé"
archive: "Archiver"
groups: "Mes groupes"
bulk_select: "Sélection des messages"
bulk_select: "Sélectionner des messages"
move_to_inbox: "Déplacer dans la boîte de réception"
move_to_archive: "Archiver"
failed_to_move: "Impossible de déplacer les messages sélectionnés (peut-être que votre connexion est coupée)"
select_all: "Sélectionner tout"
select_all: "Tout sélectionner"
change_password:
success: "(courriel envoyé)"
in_progress: "(courriel en cours d'envoi)"
@ -513,10 +533,11 @@ fr:
action: "Envoyer un courriel de réinitialisation du mot de passe"
set_password: "Définir le mot de passe"
change_about:
title: "Modifier à propos de moi"
error: "Il y avait une erreur lors de la modification de cette valeur."
title: "Modifier À propos de moi"
error: "Il y a eu une erreur lors de la modification de cette valeur."
change_username:
title: "Modifier le pseudo"
confirm: "Si vous changez votre pseudonyme, toutes les citations existantes de vos messages et les mentions avec votre @pseudo seront cassées. Êtes-vous sûr de vouloir le changer ?"
taken: "Désolé, ce pseudo est déjà pris."
error: "Il y a eu une erreur lors du changement de votre pseudo."
invalid: "Ce pseudo est invalide. Il ne doit être composé que de lettres et de chiffres."
@ -532,10 +553,10 @@ fr:
refresh_gravatar_title: "Actualiser votre Gravatar"
letter_based: "Image de profil attribuée par le système"
uploaded_avatar: "Avatar personnalisé"
uploaded_avatar_empty: "Ajouter une avatar personnalisé"
uploaded_avatar_empty: "Ajouter un avatar personnalisé"
upload_title: "Envoyer votre avatar"
upload_picture: "Envoyer une image"
image_is_not_a_square: "Attention : nous avons découpé votre image; la largeur et la hauteur n'étaient pas égales."
image_is_not_a_square: "Attention : nous avons découpé votre image ; la largeur et la hauteur n'étaient pas égales."
cache_notice: "Votre photo de profil a bien été modifié, mais il se peut qu'il mette un certain temps à apparaître à cause des caches de navigateur."
change_profile_background:
title: "Arrière plan du profil"
@ -546,7 +567,7 @@ fr:
email:
title: "Courriel"
instructions: "Ne sera jamais visible publiquement"
ok: "On vous enverra un courriel pour confirmer"
ok: "Nous vous enverrons un courriel de confirmation"
invalid: "Merci d'entrer une adresse de courriel valide"
authenticated: "Votre adresse de courriel a été authentifiée par {{provider}}"
frequency_immediately: "Nous vous enverrons un courriel immédiatement si vous n'avez pas lu le contenu en question."
@ -558,10 +579,10 @@ fr:
instructions: "Votre nom complet (facultatif)"
instructions_required: "Votre nom complet"
too_short: "Votre nom est trop court"
ok: "Votre nom a l'air bon."
ok: "Votre nom a l'air correct"
username:
title: "Pseudo"
instructions: "Unique, sans espace, court"
instructions: "Unique, sans espaces, court"
short_instructions: "Les gens peuvent vous mentionner avec @{{username}}"
available: "Votre pseudo est disponible"
global_match: "L'adresse de courriel correspond au pseudo enregistré"
@ -569,12 +590,12 @@ fr:
not_available: "Non disponible. Essayez {{suggestion}} ?"
too_short: "Votre pseudo est trop court"
too_long: "Votre pseudo est trop long"
checking: "Vérification de la disponibilité de votre pseudo..."
enter_email: 'Pseudo trouvé; Entrez l''adresse de courriel correspondante'
checking: "Vérification de la disponibilité du pseudo..."
enter_email: 'Pseudo trouvé ; entrez l''adresse de courriel correspondante'
prefilled: "L'adresse de courriel correspond à ce pseudo enregistré"
locale:
title: "Langue de l'interface"
instructions: "Langue de votre interface. Cette dernière changera lorsque vous actualiserez la page."
instructions: "Langue de l'interface. Le changement sera pris en compte lorsque vous actualiserez la page."
default: "(par défaut)"
password_confirmation:
title: "Confirmation du mot de passe"
@ -591,7 +612,7 @@ fr:
like_notification_frequency:
title: "Notifier lors d'un J'aime"
always: "Toujours"
first_time_and_daily: "La première fois qu'un message est aimé, et quotidiennement"
first_time_and_daily: "La première fois qu'un message est aimé et quotidiennement"
first_time: "La première fois qu'un message est aimé"
never: "Jamais"
email_previous_replies:
@ -600,13 +621,14 @@ fr:
always: "toujours"
never: "jamais"
email_digests:
title: "Lorsque je ne visite pas le site, m'envoyer un courriel avec un résumé des sujets et réponses populaires"
every_30_minutes: "toutes les 30 minutes"
every_hour: "toutes les heures"
daily: "quotidien"
every_three_days: "tous les trois jours"
weekly: "hebdomadaire"
every_two_weeks: "toutes les deux semaines"
include_tl0_in_digests: "Inclure les contributions des nouveaux utilisateurs dans les courriels récapitulatifs"
include_tl0_in_digests: "Inclure les contributions des nouveaux utilisateurs dans les résumés par courriel"
email_in_reply_to: "Inclure un extrait du message auquel il a été répondu dans les courriels"
email_direct: "M'envoyer un courriel quand quelqu'un me cite, répond à mon message ou mentionne mon @pseudo ou m'invite à rejoindre un sujet"
email_private_messages: "M'envoyer un courriel quand quelqu'un m'envoie un message privé"
@ -614,9 +636,9 @@ fr:
other_settings: "Autre"
categories_settings: "Catégories"
new_topic_duration:
label: "Considérer les sujets comme nouveau quand"
label: "Considérer les sujets comme nouveaux quand"
not_viewed: "Je ne les ai pas encore vus"
last_here: "crées depuis ma dernière visite"
last_here: "créés depuis ma dernière visite"
after_1_day: "créés depuis hier"
after_2_days: "créés durant les 2 derniers jours"
after_1_week: "créés durant les 7 derniers jours"
@ -637,7 +659,7 @@ fr:
title: "Invitations"
user: "Utilisateurs"
sent: "Envoyé"
none: "Il n'y a plus d'invitation en attente à afficher."
none: "Il n'y a pas d'invitation en attente à afficher."
truncated:
one: "Afficher la première invitation."
other: "Afficher les {{count}} premières invitations."
@ -650,13 +672,13 @@ fr:
pending_tab_with_count: "En attente ({{count}})"
topics_entered: "Sujets consultés"
posts_read_count: "Messages lus"
expired: "Cette invitation a expirée."
expired: "Cette invitation a expiré."
rescind: "Supprimer"
rescinded: "Invitation annulée"
reinvite: "Envoyer de nouveau l'invitation"
reinvite_all: "Renvoyer invitations"
reinvite: "Renvoyer l'invitation"
reinvite_all: "Renvoyer toutes les invitations"
reinvited: "Invitation renvoyée"
reinvited_all: "Invitations renvoyées!"
reinvited_all: "Invitations renvoyées !"
time_read: "Temps de lecture"
days_visited: "Ratio de présence"
account_age_days: "Âge du compte en jours"
@ -667,8 +689,8 @@ fr:
none: "Vous n'avez encore invité personne. Vous pouvez envoyé des invitations individuelles, ou en masse en <a href='https://meta.discourse.org/t/send-bulk-invites/16468'>envoyant un fichier d'invitation contenant la liste des courriels</a>."
text: "Invitation massive depuis un fichier"
uploading: "Envoi en cours..."
success: "Le fichier a été correctement importé. Vous serez averti par message privé lorsque le traitement sera terminé."
error: "Il y a eu une erreur lors de l'envoi de '{{filename}}': {{message}}"
success: "Le fichier a été correctement importé. Vous serez notifié par message privé lorsque le traitement sera terminé."
error: "Il y a eu une erreur lors de l'envoi de '{{filename}}' : {{message}}"
password:
title: "Mot de passe"
too_short: "Votre mot de passe est trop court."
@ -702,7 +724,7 @@ fr:
bookmark_count:
one: "signet"
other: "signets"
top_replies: "Réponses les plus référencés"
top_replies: "Réponses les plus référencées"
no_replies: "Pas encore de message."
more_replies: "Plus de réponses"
top_topics: "Sujets les plus référencés"
@ -714,9 +736,9 @@ fr:
top_links: "Liens les plus suivis"
no_links: "Pas encore de lien."
most_liked_by: "Les plus aimés par"
most_liked_users: "Plus Aimé"
most_liked_users: "Plus aimé"
most_replied_to_users: "Ayant le plus de réponses"
no_likes: "Pas encore de j'aime."
no_likes: "Aucun J'aime."
associated_accounts: "Connexions"
ip_address:
title: "Dernières adresses IP"
@ -724,7 +746,7 @@ fr:
title: "Adresse IP d'enregistrement"
avatar:
title: "Image de profil"
header_title: "profil, messages, favoris et préférences"
header_title: "profil, messages, signets et préférences"
title:
title: "Titre"
filters:
@ -766,7 +788,8 @@ fr:
too_few_topics_notice: "<a href='http://blog.discourse.org/2014/08/building-a-discourse-community/'>Démarrons cette discussion !</a> Il y a actuellement <strong>%{currentTopics} / %{requiredTopics}</strong> sujets. Les nouveaux visiteurs ont besoin de quelques conversations à lire et répondre."
too_few_posts_notice: "<a href='http://blog.discourse.org/2014/08/building-a-discourse-community/'>Démarrons cette discussion !</a> Il y a actuellement <strong>%{currentPosts} / %{requiredPosts}</strong> messages. Les nouveaux visiteurs ont besoin de quelques conversations à lire et répondre."
logs_error_rate_notice:
reached: "<b>[%{relativeAge}]</b> Le taux actuel de <a href='%{url}' target='_blank'>%{rate}</a> a atteint la limite définie dans les paramètres du site, actuellement à : %{siteSettingRate}."
reached: "<b>[%{relativeAge}]</b> Le taux actuel de <a href='%{url}' target='_blank'>%{rate}</a> a atteint la limite de %{siteSettingRate} définie dans les paramètres du site."
exceeded: "<b>[%{relativeAge}]</b> Le taux actuel de <a href='%{url}' target='_blank'>%{rate}</a> a dépassé la limite de %{siteSettingRate} définie dans les paramètres du site."
rate:
one: "1 erreur/%{duration}"
other: "%{count} erreurs/%{duration}"
@ -807,7 +830,8 @@ fr:
private_message_info:
title: "Message privé"
invite: "Inviter d'autres utilisateurs…"
remove_allowed_user: "Êtes-vous sûr de vouloir supprimer {{name}} de ce message privé?"
remove_allowed_user: "Êtes-vous sûr de vouloir supprimer {{name}} de ce message privé ?"
remove_allowed_group: "Êtes-vous sûr de vouloir supprimer {{name}} de ce message privé ?"
email: 'Courriel'
username: 'Pseudo'
last_seen: 'Vu'
@ -874,6 +898,12 @@ fr:
github:
title: "via GitHub"
message: "Authentification via GitHub (assurez-vous que les popups ne soient pas bloquées)"
emoji_set:
apple_international: "Apple/International"
google: "Google"
twitter: "Twitter"
emoji_one: "Emoji One"
win10: "Win10"
shortcut_modifier_key:
shift: 'Shift'
ctrl: 'Ctrl'
@ -962,6 +992,7 @@ fr:
notifications:
title: "notifications des mentions de votre @pseudo, des réponses à vos messages, à vos sujets, etc."
none: "Actuellement il est impossible de montrer les notifications."
empty: "Aucune notification trouvée."
more: "voir les anciennes notifications"
total_flagged: "Nombre total de messages signalés"
mentioned: "<i title='mentionné' class='fa fa-at'></i><p><span>{{username}}</span> {{description}}</p>"
@ -982,6 +1013,7 @@ fr:
moved_post: "<i title='message déplacé' class='fa fa-sign-out'></i><p><span>{{username}}</span> a déplacé {{description}}</p>"
linked: "<i title='linked post' class='fa fa-link'></i><p><span>{{username}}</span> {{description}}</p>"
granted_badge: "<i title='badge décerné' class='fa fa-certificate'></i><p>Vous avez gagné {{description}}</p>"
watching_first_post: "<i title='new topic' class='fa fa-dot-circle-o'></i><p><span>Nouveau sujet</span> {{description}}</p>"
group_message_summary:
one: "<i title='message dans la boite de réception de groupe' class='fa fa-group'></i><p>{{count}} message dans votre boite de réception {{group_name}} </p>"
other: "<i title='messages dans la boite de réception de groupe' class='fa fa-group'></i><p> {{count}} messages dans votre boite de réception {{group_name}} </p>"
@ -1029,11 +1061,11 @@ fr:
most_viewed: "Plus Vu"
most_liked: "Plus Aimé"
select_all: "Sélectionner tout"
clear_all: "Désélectionner tout"
clear_all: "Tout désélectionner"
result_count:
one: "1 résultat pour <span class='term'>\"{{term}}\"</span>"
other: "{{count}} résultats pour <span class='term'>\"{{term}}\"</span>"
title: "Rechercher les sujets, messages, utilisateurs ou catégories"
title: "rechercher des sujets, messages, utilisateurs ou catégories"
no_results: "Aucun résultat."
no_more_results: "Pas davantage de résultats."
search_help: Aide pour la recherche
@ -1041,7 +1073,7 @@ fr:
post_format: "#{{post_number}} par {{username}}"
context:
user: "Chercher dans les messages de @{{username}}"
category: "Rechercher dans la #{{category}} catégorie"
category: "Rechercher dans la catégorie #{{category}}"
topic: "Rechercher dans ce sujet"
private_messages: "Rechercher des messages"
hamburger_menu: "se rendre dans une autre liste de sujet ou catégorie"
@ -1055,11 +1087,11 @@ fr:
reset_read: "Réinitialiser la lecture"
delete: "Supprimer les sujets"
dismiss: "Ignorer"
dismiss_read: "Ignorer tous les sujets non-lus"
dismiss_read: "Ignorer tous les sujets non lus"
dismiss_button: "Ignorer..."
dismiss_tooltip: "Ignorer les nouveaux messages ou arrêter des suivre les sujets"
also_dismiss_topics: "Arrêter de suivre ces sujets, ils ne s'afficheront donc plus en \"non lu\" pour moi"
dismiss_new: "Ignorer Nouveaux"
dismiss_new: "Ignorer les nouveaux"
toggle: "activer la sélection multiple des sujets"
actions: "Actions sur sélection multiple"
change_category: "Modifier la Catégorie"
@ -1085,8 +1117,8 @@ fr:
top: "Il n'y a pas de meilleurs sujets."
search: "Votre recherche ne retourne aucun résultat."
educate:
new: '<p>Vos nouveaux sujets apparaissent ici</p><p>Par défaut, les sujets sont considérés comme nouveaux et affichent l''indicateur <span class="badge new-topic badge-notification" style="vertical-align:middle;line-height:inherit;">nouveau</span> lorsqu''ils ont été créés depuis moins de 2 jours.</p><p>Vous pouvez modifier cela dans vos <a href="%{userPrefsUrl}">préférences</a>.</p>'
unread: '<p>Vos sujets non-lus apparaissent ici</p><p>Par défaut, les sujets sont considérés comme non-lus et affichent le nombre de messages non-lus <span class="badge new-posts badge-notification">1</span> sont ceux:</p> <ul><li>Que vous avez crées</li><li>Auxquels vous avez répondu</li><li>Que vous avez lu plus de 4 minutes</li></ul><p>Ou que vous avez explicitement suivis ou surveillés</p><p>Vous pouvez modifier cela dans vos <a href="%{userPrefsUrl}">préférences</a>.</p>'
new: '<p>Vos nouveaux sujets apparaissent ici.</p><p>Par défaut, les sujets sont considérés comme nouveaux et affichent l''indicateur <span class="badge new-topic badge-notification" style="vertical-align:middle;line-height:inherit;">nouveau</span> lorsqu''ils ont été créés depuis moins de 2 jours.</p><p>Vous pouvez modifier cela dans vos <a href="%{userPrefsUrl}">préférences</a>.</p>'
unread: '<p>Vos sujets non lus apparaissent ici.</p><p>Par défaut, les sujets considérés comme non lus et qui affichent le nombre de messages non lus <span class="badge new-posts badge-notification">1</span> sont ceux :</p> <ul><li>que vous avez crées</li><li>auxquels vous avez répondus</li><li>que vous avez lus plus de 4 minutes</li></ul><p>ou que vous avez explicitement suivis ou surveillés.</p><p>Vous pouvez modifier cela dans vos <a href="%{userPrefsUrl}">préférences</a>.</p>'
bottom:
latest: "Il n'y a plus de sujet à lire."
hot: "Il n'y a plus de sujet populaire à lire."
@ -1094,7 +1126,7 @@ fr:
read: "Il n'y a plus de sujet à lire."
new: "Il n'y a plus de nouveau sujet."
unread: "Il n'y a plus de sujet à lire."
category: "Il n'y a plus de sujet sur {{category}} à lire."
category: "Il n'y a plus de sujets dans {{category}} à lire."
top: "Il n'y a plus de meilleurs sujets."
bookmarks: "Il n'y a plus de sujets dans vos signets."
search: "Il n'y a plus de résultats à votre recherche."
@ -1114,7 +1146,7 @@ fr:
help: 'Redéplacer dans la boîte de réception'
list: 'Sujets'
new: 'nouveau sujet'
unread: 'non-lus'
unread: 'non lus'
new_topics:
one: '1 nouveau sujet'
other: '{{count}} nouveaux sujets'
@ -1134,7 +1166,7 @@ fr:
description: "Désolé, nous n'avons pas trouvé ce sujet. Peut-être a t-il été retiré par un modérateur ?"
total_unread_posts:
one: "vous avez 1 message non-lu dans ce sujet"
other: "vous avez {{count}} messages non-lus dans ce sujet"
other: "vous avez {{count}} messages non lus dans ce sujet"
unread_posts:
one: "vous avez 1 message non lu sur ce sujet"
other: "vous avez {{count}} messages non lus sur ce sujet"
@ -1165,7 +1197,7 @@ fr:
auto_close_immediate: "Le dernier message dans ce sujet a déjà %{hours} heures, alors le sujet sera fermé immédiatement."
timeline:
back: "Retour"
back_description: "Retourner sur votre dernier sujet non-lu"
back_description: "Revenir sur le dernier message non lu"
replies: "%{current} / %{total} réponses"
replies_short: "%{current} / %{total}"
progress:
@ -1174,14 +1206,17 @@ fr:
go_bottom: "bas"
go: "aller"
jump_bottom: "aller au dernier message"
jump_prompt: "aller au message"
jump_prompt_long: "À quel message voulez-vous aller ?"
jump_bottom_with_number: "aller au message %{post_number}"
total: total messages
current: message courant
position: "message %{current} sur %{total}"
notifications:
title: Modifier la fréquence de vos notifications concernant ce sujet
title: modifier la fréquence des notifications concernant ce sujet
reasons:
mailing_list_mode: "Vous avez activé le mode mailing list, vous serez donc notifié des réponses à ce sujet par courriel."
mailing_list_mode: "Vous avez activé la liste de diffusion, vous serez donc notifié des réponses à ce sujet par courriel."
'3_10': 'Vous recevrez des notifications sur ce sujet car vous surveillez ce tag.'
'3_6': 'Vous recevrez des notifications parce que vous surveillez cette catégorie.'
'3_5': 'Vous recevrez des notifications parce que vous avez commencé à surveiller ce sujet automatiquement.'
'3_2': 'Vous recevrez des notifications car vous surveillez ce sujet.'
@ -1191,8 +1226,8 @@ fr:
'2_4': 'Vous recevrez des notifications car vous avez écrit une réponse dans ce sujet.'
'2_2': 'Vous recevrez des notifications car vous suivez ce sujet.'
'2': 'Vous recevrez des notifications car vous <a href="/users/{{username}}/preferences">avez lu ce sujet</a>.'
'1_2': 'Vous serez averti si quelqu''un mentionne votre @pseudo ou vous répond.'
'1': 'Vous serez averti si quelqu''un mentionne votre @pseudo ou vous répond.'
'1_2': 'Vous serez notifié si quelqu''un mentionne votre @pseudo ou vous répond.'
'1': 'Vous serez notifié si quelqu''un mentionne votre @pseudo ou vous répond.'
'0_7': 'Vous ignorez toutes les notifications de cette catégorie.'
'0_2': 'Vous ignorez toutes les notifications de ce sujet.'
'0': 'Vous ignorez toutes les notifications de ce sujet.'
@ -1240,8 +1275,8 @@ fr:
pin: "Épingler la discussion"
unpin: "Désépingler la discussion"
pin_globally: "Épingler le sujet globalement"
make_banner: "Bannière de sujet"
remove_banner: "Retirer la bannière de sujet"
make_banner: "Sujet à la une"
remove_banner: "Retirer le sujet à la une"
reply:
title: 'Répondre'
help: 'commencez à répondre à ce sujet'
@ -1276,11 +1311,11 @@ fr:
already_pinned_globally:
one: "Sujets actuellement épinglés globalement : <strong class='badge badge-notification unread'>1</strong>"
other: "Sujets actuellement épinglés globalement : <strong class='badge badge-notification unread'>{{count}}</strong>"
make_banner: "Transformer ce sujet en gros titre qui apparaît en haut de chaque page."
remove_banner: "Enlever le gros titre qui apparaît en haut de chaque page."
banner_note: "Les utilisateurs peuvent fermer le gros titre. Seul un sujet peut être mis en gros titre à la fois."
no_banner_exists: "Il n'y a pas actuellement de sujet en gros titre."
banner_exists: "Il y <strong class='badge badge-notification unread'>a</strong> actuellement un sujet en gros titre."
make_banner: "Mettre ce sujet à la une, il apparaîtra en haut de chaque page."
remove_banner: "Enlever le sujet à la une qui apparaît en haut de chaque page."
banner_note: "Les utilisateurs peuvent ignorer le sujet à la une. Seul un sujet peut être mis à la une à la fois."
no_banner_exists: "Il n'y a pas de sujet à la une."
banner_exists: "Il y <strong class='badge badge-notification unread'>a</strong> un sujet à la une."
inviting: "Invitation en cours…"
automatically_add_to_groups: "Cette invitation inclut également l'accès aux groupes suivants :"
invite_private:
@ -1329,6 +1364,10 @@ fr:
instructions:
one: "Merci de sélectionner le sujet dans laquelle vous souhaitez déplacer le message que vous avez sélectionné."
other: "Merci de sélectionner le sujet dans laquelle vous souhaitez déplacer les <b>{{count}}</b> messages que vous avez sélectionné."
merge_posts:
title: "Fusionner les messages sélectionnés"
action: "fusionner les messages sélectionnés"
error: "Il y a eu une erreur lors de la fusion des messages sélectionnés."
change_owner:
title: "Modifier l'auteur des messages"
action: "modifier l'auteur"
@ -1532,6 +1571,10 @@ fr:
confirm:
one: "Êtes-vous sûr de vouloir supprimer ce message ?"
other: "Êtes-vous sûr de vouloir supprimer tous ces messages ?"
merge:
confirm:
one: "Êtes-vous sûr de vouloir fusionner ces messages ?"
other: "Êtes-vous sûr de vouloir fusionner ces {{count}} messages ?"
revisions:
controls:
first: "Première Révision"
@ -1564,10 +1607,10 @@ fr:
settings: 'Paramètres'
topic_template: "Modèle de Sujet"
tags: "Tags"
tags_allowed_tags: "Tags qui ne peuvent être utilisés que dans cette catégorie :"
tags_allowed_tag_groups: "Groupes de tags autorisés uniquement au sein de cette catégorie :"
tags_allowed_tags: "Tags pouvant être utilisés uniquement dans cette catégorie :"
tags_allowed_tag_groups: "Groupes de tags pouvant être utilisés uniquement dans cette catégorie :"
tags_placeholder: "(Facultatif) liste des tags autorisés"
tag_groups_placeholder: "(Facultatif) liste des groups de tags autorisés"
tag_groups_placeholder: "(Facultatif) liste des groupes de tags autorisés"
delete: 'Supprimer la catégorie'
create: 'Nouvelle catégorie'
create_long: 'Créer une nouvelle catégorie'
@ -1614,8 +1657,13 @@ fr:
notifications:
watching:
title: "S'abonner"
description: "Vous surveillerez automatiquement tous les sujets dans ces catégories. Vous serez notifié des nouveaux messages dans tous les sujets, et le nombre de nouvelles réponses sera affiché."
watching_first_post:
title: "Surveiller les nouveaux sujets"
description: "Vous serez uniquement notifié du premier message de chaque sujet dans ces catégories."
tracking:
title: "Suivi"
description: "Vous allez suivre automatiquement tous les sujets dans ces catégories. Vous serez notifié lorsque quelqu'un mentionne votre @pseudo ou vous répond, et le nombre de nouvelles réponses sera affiché."
regular:
title: "Normal"
description: "Vous serez notifié si quelqu'un mentionne votre @pseudo ou vous répond."
@ -1655,14 +1703,15 @@ fr:
title: "Résumé du sujet"
participants_title: "Auteurs fréquents"
links_title: "Liens populaires"
links_shown: "afficher plus de liens..."
clicks:
one: "1 clic"
other: "%{count} clics"
post_links:
about: "Dévelloper plus de liens pour ce sujet"
about: "développer plus de liens pour ce message"
title:
one: "Encore un"
other: "Encore %{count} "
one: "1 autre"
other: "%{count} autres "
topic_statuses:
warning:
help: "Ceci est un avertissement officiel."
@ -1743,12 +1792,12 @@ fr:
unread:
title: "Non lus"
title_with_count:
one: "1 non-lu"
other: " ({{count}}) non-lus"
one: "1 non lu"
other: " ({{count}}) non lus"
help: "sujets que vous suivez ou suivez attentivement actuiellement avec des messages non lus"
lower_title_with_count:
one: "1 non-lu"
other: "{{count}} non-lus"
one: "1 non lu"
other: "{{count}} non lus"
new:
lower_title_with_count:
one: "1 nouveau"
@ -1807,7 +1856,7 @@ fr:
jump_to:
title: 'Aller à'
home: '<b>g</b>, <b>h</b> Accueil'
latest: '<b>g</b>, <b>l</b> Derniers'
latest: '<b>g</b>, <b>l</b> Récents'
new: '<b>g</b>, <b>n</b> Nouveaux'
unread: '<b>g</b>, <b>u</b> Non lus'
categories: '<b>g</b>, <b>c</b> Catégories'
@ -1821,38 +1870,38 @@ fr:
back: '<b>u</b> Retour'
up_down: '<b>k</b>/<b>j</b> Déplacer la sélection &uarr; &darr;'
open: '<b>o</b> ou <b>Entrée</b> Ouvrir le sujet sélectionné'
next_prev: '<b>MAJ.</b>+<b>j</b>/<b>MAJ.</b>+<b>k</b> Prochaîne/précédente section'
next_prev: '<b>MAJ.</b>+<b>j</b>/<b>MAJ.</b>+<b>k</b> Section suivante/précédente'
application:
title: 'Application'
create: '<b>c</b> Créer un nouveau sujet'
notifications: '<b>n</b> Ouvrir les notifications'
hamburger_menu: '<b>=</b> Ouvrir le menu hambergeur'
hamburger_menu: '<b>=</b> Ouvrir le menu hamburger'
user_profile_menu: '<b>p</b>Ouvrir le menu utilisateur'
show_incoming_updated_topics: '<b>.</b> Montrer les sujets mis à jours récemment'
show_incoming_updated_topics: '<b>.</b> Montrer les sujets mis à jour récemment'
search: '<b>/</b> Rechercher'
help: '<b>?</b> Ouvrir l''aide du clavier'
dismiss_new_posts: '<b>x</b>, <b>r</b> Ignorer Nouveaux/Sujets'
dismiss_new_posts: '<b>x</b>, <b>r</b> Ignorer les nouveaux messages'
dismiss_topics: '<b>x</b>, <b>t</b> Ignorer les sujets'
log_out: '<b>MAJ.</b>+<b>z</b> <b>MAJ.</b>+<b>z</b> Se déconnecter'
actions:
title: 'Actions'
bookmark_topic: '<b>f</b> Modifier le signet du sujet'
pin_unpin_topic: '<b>MAJ.</b>+<b>p</b> Epingler/Desépingler le sujet'
pin_unpin_topic: '<b>MAJ.</b>+<b>p</b> Épingler/desépingler le sujet'
share_topic: '<b>MAJ.</b>+<b>s</b> Partager le sujet'
share_post: '<b>s</b> Partager le message'
reply_as_new_topic: '<b>t</b> Répondre en tant que sujet lié'
reply_topic: '<b>MAJ.</b>+<b>r</b> Répondre au sujet'
reply_post: '<b>r</b> Répondre au message'
quote_post: '<b>q</b>Citer le message'
quote_post: '<b>q</b> Citer le message'
like: '<b>l</b> Aimer le message'
flag: '<b>!</b> Signaler le message'
bookmark: '<b>b</b> Mettre le sujet en favoris'
edit: '<b>e</b> Editer le sujet'
delete: '<b>d</b> Supprimer le sujet'
mark_muted: '<b>m</b>, <b>m</b> Faire taire le sujet'
mark_regular: '<b>m</b>, <b>r</b> Sujet (par défaut) habitué'
mark_tracking: '<b>m</b>, <b>t</b> Suivre ce sujet'
mark_watching: '<b>m</b>, <b>w</b> Surveiller ce sujet'
bookmark: '<b>b</b> Ajouter le message aux signets'
edit: '<b>e</b> Modifier le message'
delete: '<b>d</b> Supprimer le message'
mark_muted: '<b>m</b>, <b>m</b> Mettre le sujet en silencieux'
mark_regular: '<b>m</b>, <b>r</b> Notifications par défaut pour le sujet'
mark_tracking: '<b>m</b>, <b>t</b> Suivre le sujet'
mark_watching: '<b>m</b>, <b>w</b> Surveiller le sujet'
badges:
earned_n_times:
one: "A reçu ce badge 1 fois"
@ -1861,7 +1910,7 @@ fr:
others_count: "Autres utilisateurs avec ce badge (%{count})"
title: Badges
allow_title: "titre disponible"
multiple_grant: "donné plusieurs fois"
multiple_grant: "attribué plusieurs fois"
badge_count:
one: "1 badge"
other: "%{count} badges"
@ -1871,7 +1920,7 @@ fr:
granted:
one: "1 décerné"
other: "%{count} décernés"
select_badge_for_title: Choisissez un badge comme titre
select_badge_for_title: Sélectionner un badge comme titre
none: "<none>"
badge_grouping:
getting_started:
@ -1896,11 +1945,12 @@ fr:
tagging:
all_tags: "Tous les tags"
selector_all_tags: "tous les tags"
selector_no_tags: "aucun tags"
changed: "tags modifiés :"
tags: "Tags"
choose_for_topic: "(facultatif) choisir des tags pour ce sujet"
choose_for_topic: "choisir des tags optionnels pour ce sujet"
delete_tag: "Supprimer le tag"
delete_confirm: "Êtes-vous certain de vouloir supprimer ce tag ?"
delete_confirm: "Êtes-vous sûr de vouloir supprimer ce tag ?"
rename_tag: "Renommer ce tag"
rename_instructions: "Choisir un nouveau nom pour ce tag :"
sort_by: "Trier par :"
@ -1911,34 +1961,46 @@ fr:
filters:
without_category: "%{filter} %{tag} sujets"
with_category: "%{filter} %{tag} sujets dans %{category}"
untagged_without_category: "%{filter} sujets non tagués"
untagged_with_category: "%{filter} sujets non tagués dans %{category}"
notifications:
watching:
title: "Abonné"
description: "Vous surveillerez automatiquement tous les sujets avec ce tag. Vous serez notifié de tous les nouveaux messages et sujets, et le nombre de messages non lus et nouveaux apparaîtra à côté du sujet."
watching_first_post:
title: "Surveiller les nouveaux sujets"
description: "Vous serez uniquement notifié du premier message de chaque sujet avec ce tag."
tracking:
title: "Suivi"
description: "Vous allez suivre automatiquement tous les sujets avec ce tag. Le nombre de messages non lus et nouveaux apparaîtra à côté du sujet."
regular:
title: "Habitué"
description: "Vous serez notifié si un utilisateur mentionne votre @pseudo ou réponds à votre message."
title: "Normal"
description: "Vous serez notifié si un utilisateur mentionne votre @pseudo ou répond à votre message."
muted:
title: "Silencieux"
description: "Vous ne recevrez aucune notification sur des nouveaux sujets dans ce tag, et ils n'apparaitront pas sur mon onglet non-lus."
description: "Vous ne recevrez aucune notification sur des nouveaux sujets avec ce tag, et ils napparaîtront pas dans l'onglet non lus."
groups:
about: "Ajout des tags aux groupes pour les gérer plus facilement."
title: "Groupes de tags"
about: "Ajouter des tags aux groupes pour les gérer plus facilement."
new: "Nouveau groupe"
tags_label: "Tags dans ce groupe :"
parent_tag_label: "Tag parent :"
parent_tag_placeholder: "Facultatif"
parent_tag_description: "Les tags de ce groupe ne peuvent pas être utilisés sauf si le tag parent est présent."
one_per_topic_label: "Limiter à un tag de ce groupe par sujet"
new_name: "Nouveau groupe de tags"
save: "Sauvegarder"
delete: "Supprimer"
confirm_delete: "Êtes-vous sûr de vouloir supprimer ce groupe de tags ?"
topics:
none:
unread: "Vous n'avez aucun sujet non lu."
new: "Vous n'avez aucun nouveau sujet."
read: "Vous n'avez lu aucun sujet pour le moment."
posted: "Vous n'avez écrit aucun message pour le moment."
posted: "Vous n'avez écrit dans aucun sujet pour le moment."
latest: "Il n'y a pas de sujets récents."
hot: "Il n'y a pas de sujets populaires."
bookmarks: "Vous n'avez pas encore ajouté de sujet à vos signets"
bookmarks: "Vous n'avez pas encore ajouté de sujets à vos signets"
top: "Il n'y a pas de meilleurs sujets."
search: "Il n'y a pas de résultats de recherche."
bottom:
@ -1955,6 +2017,8 @@ fr:
custom_message: "Rendez votre invitation plus personnelle en écrivant un"
custom_message_link: "message personnalisé"
custom_message_placeholder: "Entrez votre message personnalisé"
custom_message_template_forum: "Hey, tu devrais rejoindre ce forum !"
custom_message_template_topic: "Hey, je pensais que tu pourrais aimer ce sujet !"
admin_js:
type_to_filter: "Commencez à taper pour filtrer..."
admin:
@ -2185,7 +2249,7 @@ fr:
confirm: "Êtes-vous sûr de vouloir restaurer la base de données à l'état de fonctionnement précédent?"
export_csv:
user_archive_confirm: "Êtes-vous sûr de vouloir télécharger vos messages?"
success: "L'exportation a été initialisé. Vous serez averti par message lorsque le traitement sera terminé."
success: "L'exportation a été démarrée. Vous serez notifié par message lorsque le traitement sera terminé."
failed: "L'export a échoué. Veuillez consulter les logs."
rate_limit_error: "Les messages peuvent être téléchargés une fois par jour, veuillez ressayer demain."
button_text: "Exporter"
@ -2407,6 +2471,7 @@ fr:
backup_operation: "sauvegarde"
deleted_tag: "tag supprimé"
renamed_tag: "tag renommé"
revoke_email: "révoquer le courriel"
screened_emails:
title: "Courriels affichés"
description: "Lorsque quelqu'un essaye de créé un nouveau compte, les adresses de courriel suivantes seront vérifiées et l'inscription sera bloquée, ou une autre action sera réalisée."
@ -2573,9 +2638,9 @@ fr:
deactivate_failed: "Il y a eu un problème lors de la désactivation du compte."
unblock_failed: 'Problème rencontré lors du déblocage de l''utilisateur.'
block_failed: 'Problème rencontré lors du blocage de l''utilisateur.'
block_confirm: 'Êtes-vous sûr de vouloir bloquer cet utilisateur? Ils ne pourront plus créer de sujet ou message.'
block_confirm: 'Êtes-vous sûr de vouloir bloquer cet utilisateur ? Il ne pourra plus créer de sujets ou messages.'
block_accept: 'Oui, bloquer cet utilisateur'
bounce_score: "Compteur de rejects"
bounce_score: "Score de rejet"
reset_bounce_score:
label: "Réinitialiser"
title: "Réinitialiser compteur de rejets à 0"

View File

@ -133,9 +133,11 @@ tr_TR:
eu_central_1: "EU (Frankfurt)"
ap_southeast_1: "Asia Pacific (Singapore)"
ap_southeast_2: "Asia Pacific (Sydney)"
ap_south_1: "Asia Pacific (Mumbai)"
ap_northeast_1: "Asia Pacific (Tokyo)"
ap_northeast_2: "Asia Pacific (Seoul)"
sa_east_1: "South America (Sao Paulo)"
cn_north_1: "China (Beijing)"
edit: 'bu konunun başlığını ve kategorisini düzenleyin'
not_implemented: "Bu özellik henüz geliştirilmedi, üzgünüz!"
no_value: "Hayır"
@ -305,6 +307,7 @@ tr_TR:
selector_placeholder: "Üye ekle"
owner: "sahip"
visible: "Grup tüm kullanıcılar tarafından görüntülenebiliyor"
index: "Gruplar"
title:
other: "gruplar"
members: "Üyeler"
@ -326,6 +329,9 @@ tr_TR:
watching:
title: "Gözleniyor"
description: "Tüm mesajlardaki her yazı hakkında bilgilendirileceksiniz ve yeni cevap sayısı gösterilecek."
watching_first_post:
title: "İlk gönderi izlemeniz"
description: "Bu grupta bulunan tüm konuların sadece ilk gönderilerinde bildirim alacaksınız."
tracking:
title: "Takip ediliyor"
description: "Biri @isim şeklinde sizden bahsederse ya da gönderinize cevap verirse bildirim alacaksınız ve yeni cevap sayısı gösterilecek."
@ -443,9 +449,18 @@ tr_TR:
daily: "Günlük güncellemeleri gönder"
individual: "Her yazı için bir eposta gönder"
many_per_day: " ({{dailyEmailEstimate}} konusu hakkında) tüm yeni gönderilerde bana mail gönder"
few_per_day: "Her yeni gönderi için bana email gönder ( 2 günlük )"
tag_settings: "Etiketler"
watched_tags: "Gözlendi"
tracked_tags: "Takip edildi"
muted_tags: "Susturuldu"
muted_tags_instructions: "Bu etiketler ile yeni konular hakkında herhangi bir bildiri almayacaksınız ve en son gönderilerde belirmeyecekler."
watched_categories: "Gözlendi"
tracked_categories: "Takip edildi"
tracked_categories_instructions: "Bu kategorilerdeki tüm konuları otomatik olarak takip edeceksiniz. Yeni gönderilerin sayısı ilgili konunun yanında belirecek."
watched_first_post_categories: "İlk gönderi izlemeniz"
watched_first_post_categories_instructions: "Bu kategorilerde bulunan tüm konuların ilk gönderilerinde bildirim alacaksınız."
watched_first_post_tags: "İlk gönderi izlemeniz"
muted_categories: "Susturuldu"
muted_categories_instructions: "Bu kategorilerdeki yeni konular hakkında herhangi bir bildiri almayacaksınız ve en son gönderilerde belirmeyecekler. "
delete_account: "Hesabımı Sil"
@ -485,8 +500,10 @@ tr_TR:
set_password: "Parola Belirle"
change_about:
title: "Hakkımda'yı Değiştir"
error: "Bu değeri değiştirirken bir hata oluştu."
change_username:
title: "Kullanıcı Adını Değiştir"
confirm: "Kullanıcı adınızı değiştirmeniz halinde, eski gönderilerinizden yapılan tüm alıntılar ve @eskiadınızdaki bahsedilenler bozulacak. Bunu yapmak istediğinize gerçekten emin misiniz?"
taken: "Üzgünüz, bu kullanıcı adı alınmış."
error: "Kullanıcı adınızı değiştirirken bir hata oluştu."
invalid: "Bu kullanıcı adı geçersiz. Sadece sayı ve harf içermelidir."
@ -649,6 +666,10 @@ tr_TR:
other: "oluşturulan konular"
post_count:
other: "oluşturmuş gönderiler"
likes_given:
other: "<i class='fa fa-heart'></i> verilen"
likes_received:
other: "<i class='fa fa-heart'></i> alınan "
days_visited:
other: "ziyaret edilen günler"
posts_read:
@ -666,7 +687,9 @@ tr_TR:
more_badges: "Diğer Rozetleri"
top_links: "Önemli Bağlantılar"
no_links: "Henüz bir bağlantı bulunmuyor."
most_liked_by: "Tarafından en çok beğenilen"
most_liked_users: "Popüler Beğenmeler"
most_replied_to_users: "En çok cevaplanan"
no_likes: "Henüz bir beğeni bulunmuyor."
associated_accounts: "Girişler"
ip_address:
@ -823,6 +846,12 @@ tr_TR:
github:
title: "GitHub ile"
message: "GitHub ile kimlik doğrulaması yapılıyor (pop-up engelleyicilerin etkinleştirilmediğinden emin olun)"
emoji_set:
apple_international: "Apple/Uluslararası"
google: "Google"
twitter: "Twitter"
emoji_one: "Emoji One"
win10: "Win10"
shortcut_modifier_key:
shift: 'Shift'
ctrl: 'Ctrl'
@ -1016,6 +1045,7 @@ tr_TR:
selected:
other: "<b>{{count}}</b> konu seçtiniz."
change_tags: "Etiketleri Değiştir"
choose_new_tags: "Konular için yeni etiketler seçin:"
none:
unread: "Okunmamış konunuz yok."
new: "Yeni konunuz yok."
@ -1102,13 +1132,16 @@ tr_TR:
auto_close_immediate: "Son konudaki mesaj %{hours} saat olmuş, bu yüzden konu hemen kapanacak"
timeline:
back: "Geri"
back_description: "Okunmamış son gönderine dön"
replies: "%{current} / %{total} Cevap"
replies_short: "%{current} / %{total}"
progress:
title: konu gidişatı
go_top: "en üst"
go_bottom: "en alt"
go: "git"
jump_bottom: "son gönderiye geç"
jump_prompt: "Gönderiye git"
jump_bottom_with_number: "%{post_number} numaralı gönderiye geç"
total: tüm gönderiler
current: şu anki gönderi
@ -1167,6 +1200,7 @@ tr_TR:
invisible: "Gizle"
visible: "Görünür Yap"
reset_read: "Görüntüleme Verilerini Sıfırla"
make_private: "Özel mesaj oluştur"
feature:
pin: "Başa Tuttur"
unpin: "Baştan Kaldır"
@ -1311,7 +1345,9 @@ tr_TR:
create: "Üzgünüz, gönderiniz oluşturulurken bir hata oluştu. Lütfen tekrar deneyin."
edit: "Üzgünüz, gönderiniz düzenlenirken bir hata oluştu. Lütfen tekrar deneyin. "
upload: "Üzgünüz, dosya yüklenirken bir hata oluştu. Lütfen tekrar deneyin."
file_too_large: "Üzgünüz, bu dosya çok büyük (maximum size is {{max_size_kb}}kb) Niçin büyük boyutlu dosyanı bir paylaşım servisine yükleyip, sonra bağlantını paylaşmıyorsun ?"
too_many_uploads: "Üzgünüz, aynı anda birden fazla dosya yükleyemezsiniz."
too_many_dragged_and_dropped_files: "Üzgünüz, aynı anda 10'dan fazla dosya yükleyemezsiniz."
upload_not_authorized: "Üzgünüz, yüklemeye çalıştığınız dosya tipine izin verilmiyor. (izin verilen uzantılar: {{authorized_extensions}})."
image_upload_not_allowed_for_new_user: "Üzgünüz, yeni kullanıcılar resim yükleyemiyorlar."
attachment_upload_not_allowed_for_new_user: "Üzgünüz, yeni kullanıcılar dosya ekleyemiyorlar."
@ -1456,6 +1492,8 @@ tr_TR:
settings: 'Ayarlar'
topic_template: "Konu Şablonu"
tags: "Etiketler"
tags_allowed_tags: "Sadece bu kategoride kullanılabilir etiketler:"
tags_allowed_tag_groups: "Yalnızca bu kategoride kullanılabilir etiket grupları:"
delete: 'Kategoriyi Sil'
create: 'Yeni Kategori'
create_long: 'Yeni bir kategori oluştur'
@ -1502,6 +1540,9 @@ tr_TR:
notifications:
watching:
title: "Gözleniyor"
watching_first_post:
title: "İlk gönderi izlemeniz"
description: "Bu kategorilerde bulunan tüm konuların sadece ilk gönderilerinde bildirim alacaksınız."
tracking:
title: "Takip Ediliyor"
regular:
@ -1515,6 +1556,7 @@ tr_TR:
action: 'Gönderiyi Bayrakla'
take_action: "Harekete Geç"
notify_action: 'Mesaj'
official_warning: 'Resmi uyarı'
delete_spammer: "Spamcıyı Sil"
delete_confirm: "Bu kullanıcının <b>%{posts}</b> gönderisini ve <b>%{topics}</b> konusunu silmek, hesabını kapatmak, kullandığı IP Adresi <b>%{ip_address}</b> üzerinden hesap açılmasını engellemek, ve <b>%{email}</b> e-posta adresini kalıcı engellenenler listesine eklemek üzeresiniz. Bu kullanıcının gerçekten spamci olduğuna emin misiniz?"
yes_delete_spammer: "Evet, spamcıyı sil"
@ -1542,6 +1584,7 @@ tr_TR:
title: "Konu Özeti"
participants_title: "Sıkça Yazanlar"
links_title: "Popüler bağlantılar"
links_shown: "Daha fazla bağlantı göster"
clicks:
other: "%{count} tıklama"
post_links:
@ -1706,6 +1749,7 @@ tr_TR:
show_incoming_updated_topics: '<b>.</b> Güncellenmiş konuları göster'
search: '<b>/</b> Ara'
help: '<b>?</b> Klavye yardım sayfasını aç'
dismiss_new_posts: '<b>x</b>, <b>r</b> Yeni Konuları/Gönderileri Yoksay'
dismiss_topics: '<b>x</b>, <b>t</b> Konuları anımsatma'
log_out: '<b>shift</b>+<b>z</b> <b>shift</b>+<b>z</b> Çıkış'
actions:
@ -1725,8 +1769,13 @@ tr_TR:
delete: '<b>d</b> Gönderiyi sil'
mark_muted: '<b>m</b>, <b>m</b> Konuyu sustur'
mark_regular: '<b>m</b>, <b>r</b> Varsayılan konu'
mark_tracking: '<b>m</b>, <b>t</b> Konuyu takip et'
mark_watching: '<b>m</b>, <b>w</b> Konuyu Takip Et'
badges:
earned_n_times:
other: "Bu rozet %{count} defa kazanılmış"
granted_on: "%{date} Tarihinde Verildi"
others_count: "Bu rozete sahip diğer kişiler (%{count})"
title: Rozetler
allow_title: "başlık girin"
multiple_grant: "birden fazla ödüllendirilmiş"

View File

@ -1919,7 +1919,6 @@ de:
Es wurden Probleme in deinem Admin-Dashboard gemeldet.
[Bitte überprüfe und behebe sie](%{base_url}/admin).
unsubscribe_link: |
Um diese E-Mails abzubestellen, [klicke hier](%{unsubscribe_url}).
unsubscribe_link_and_mail: |
@ -2692,7 +2691,6 @@ de:
description: Hat einen Beitrag mit „Gefällt mir“ markiert
long_description: |
Das Abzeichen wird verliehen, wenn du das erste Mal auf die :heart:-Schaltfläche unter einem Beitrag klickst. Beiträge mit „Gefällt mir“ zu markieren, ist eine tolle Art, den Community-Kollegen wissen zu lassen, dass sein Beitrag interessant, nützlich, cool oder witzig war. Teile die Liebe!
first_flag:
name: Erste Meldung
description: Hat einen Beitrag gemeldet

View File

@ -828,6 +828,8 @@ en:
min_private_message_title_length: "Minimum allowed title length for a message in characters"
min_search_term_length: "Minimum valid search term length in characters"
search_tokenize_chinese_japanese_korean: "Force search to tokenize Chinese/Japanese/Korean even on non CJK sites"
search_prefer_recent_posts: "If searching your large forum is slow, this option tries an index of more recent posts first"
search_recent_posts_size: "How many recent posts to keep in the index"
allow_uncategorized_topics: "Allow topics to be created without a category. WARNING: If there are any uncategorized topics, you must recategorize them before turning this off."
allow_duplicate_topic_titles: "Allow topics with identical, duplicate titles."
unique_posts_mins: "How many minutes before a user can make a post with the same content again"
@ -1374,7 +1376,7 @@ en:
tag_style: "Visual style for tag badges."
staff_tags: "A list of tags that can only be applied by staff members"
min_trust_level_to_tag_topics: "Minimum trust level required to tag topics"
suppress_overlapping_tags_in_list: "Hide tags from list views, if they overlap with title"
suppress_overlapping_tags_in_list: "If tags match exact words in topic titles, don't show the tag"
remove_muted_tags_from_latest: "Don't show topics tagged with muted tags in the latest topic list."
errors:
@ -2054,13 +2056,6 @@ en:
If you can correct the problem, please try again.
email_reject_rate_limit_specified:
subject_template: "[%{site_name}] Email issue -- Rate limited"
text_body_template: |
We're sorry, but your email message to %{destination} (titled %{former_title}) didn't work.
Reason: %{rate_limit_description}
email_reject_invalid_post_action:
subject_template: "[%{site_name}] Email issue -- Invalid Post Action"
text_body_template: |

View File

@ -15,25 +15,33 @@ et:
short: "%d.%m.%Y"
short_no_year: "%-d. %B"
date_only: "%-d. %B %Y"
long: "%B %-d, %Y, %l:%M%P"
date:
month_names: [null, jaanuar, veebruar, märts, aprill, mai, juuni, juuli, august, september, oktoober, november, detsember]
<<: *datetime_formats
time:
am: "am"
pm: "pm"
<<: *datetime_formats
title: "Discourse"
topics: "Teemad"
posts: "postitused"
loading: "Laetakse"
powered_by_html: 'Ajamiks on <a href="http://www.discourse.org">Discourse</a>... vaadata JavaScript lubatuna'
log_in: "Logi sisse"
purge_reason: "Kustutatud automaatselt kui mahajäetud, deaktiveeritud konto"
disable_remote_images_download_reason: "Väliste piltide allalaadimine keelati, kuna polnud polnud piisavalt vaba ruumi."
anonymous: "Anonüümne"
emails:
incoming:
default_subject: "%{email} saatis kirja"
show_trimmed_content: "Näita lühendatud sisu"
maximum_staged_user_per_email_reached: "Meili teel loodud ettevalmistamisel olevate kasutajate maksimaalne arv on täis."
errors:
empty_email_error: "Juhtub, kui meieni jõudnud toormeil on tühi."
no_message_id_error: "Juhtub, kui meilil puudub 'Message-Id' päis."
auto_generated_email_error: "Juhtub, kui 'precedence' päis on seatud väärtusele: list, junk, bulk või auto_reply või kui mingi muu päis sisaldab väärtusi: auto-submitted, auto-replied või auto-generated."
no_body_detected_error: "Juhtub, kui meil ei õnnestunud keha eraldada ja manused puudusid."
inactive_user_error: "Juhtub, kui saatja ei ole aktiveeritud."
blocked_user_error: "Juhtub, kui saatja on blokeeritud."
bad_destination_address: "Juhtub, kui ükski To/Cc/Bcc meiliaadresidest ei lange kokku seadistatud sissetulavate meiliaadressidega."
@ -42,6 +50,8 @@ et:
reply_user_not_matching_error: "Juhtub, kui vastus tuleb teistsuguselt meiliaadressilt kui see, millele märguanne saadeti."
topic_not_found_error: "Juhtub, kui vastus tuli aga teema on juba kustutatud."
topic_closed_error: "Juhtub, kui vastus tuli aga teema on juba suletud."
bounced_email_error: "Meil on tagasipõrgatatud meili vearaport."
screened_email_error: "Juhtub, kui saatja on varjestatud."
errors: &errors
format: '%{attribute} %{message}'
messages:
@ -169,6 +179,9 @@ et:
private_posts: "Viimased privaatsõnumid"
group_posts: "Viimased postitused grupilt %{group_name}"
group_mentions: "Viimati mainitud grupis %{group_name}"
user_posts: "Viimased postitused kasutajalt @%{username}"
user_topics: "Viimased teemad kasutajalt @%{username}"
tag: "Sildistatud teemad"
too_late_to_edit: "Postitus loodi kaua aega tagasi. Seda ei saa enam muuta ega kustutada."
revert_version_same: "Praegune versioon on sama sellega, millele sa püüad tagasi pöörduda."
excerpt_image: "pilt"
@ -176,6 +189,7 @@ et:
delete_reason: "Kustutatud modereerimisjärjekorra kaudu"
groups:
errors:
can_not_modify_automatic: "Autommatset gruppi ei saa muuta"
member_already_exist: "'%{username}' on juba selle grupi liige."
invalid_domain: "'%{domain}' ei ole nõuetele vastav domeen."
invalid_incoming_email: "'%{email}' ei ole korrektne meiliaadress."
@ -231,10 +245,18 @@ et:
Saad muuta oma varasemat postitust ning lisada tsitaati valides teksti ning vajutades nähtavale ilmunud nuppu <b>tsiteeri</b>.
Kõigil on lihtsam lugeda teemasid, milles on põhjalikumad vastused paljude pisikeste vastuste asemel.
dominating_topic: |
### Anna teistele mahti vestlusega liituda
See teema on Sulle kindlasti väga tähtis &ndash; enam kui %{percent}% vastustest siin on Sinu postitatud.
Kas oled kindel, et jätad ka teistele piisavalt aega ja võimalust oma arvamuse avaldamiseks?
activerecord:
attributes:
category:
name: "Liigi nimetus"
topic:
title: 'Pealkiri'
post:
raw: "Sisu"
user_profile:
@ -260,13 +282,43 @@ et:
attributes:
hex:
invalid: "pole korrektne värv"
post_reply:
base:
different_topic: "Postitus ja vastus peavad kuuluma samasse teemasse."
<<: *errors
user_profile:
no_info_me: "<div class='missing-profile'>Sinu profiili väli 'Minust' on hetkel tühi, <a href='/users/%{username_lower}/preferences/about-me'>kas sooviksid selle ära täita?</a></div>"
no_info_other: "<div class='missing-profile'>%{name} profiilis on väli 'Minust' veel täitmata</div>"
vip_category_name: "Lounge"
vip_category_description: "Liik, mis on eksklusiivne kasutajatele, kellel on usaldustase 3 või kõrgem."
meta_category_name: "Saidi tagasiside."
meta_category_description: "Arutelu selle saidi, tema korralduse, töömeetodite ja arenguvõimaluste kohta."
staff_category_name: "Meeskond"
staff_category_description: "Privaatfoorum meeskonnasisesteks aruteludeks. Teemad on nähtavad vaid adminnidele ja moderaatoritele."
assets_topic_body: "See on püsiteema, nähtav vaid meeskonnale, selle saidi kujunduses kasutatavate piltide ja failide talletamiseks. Ära seda kustuta!\n\n\nTee nii:\n\n\n1. Vasta siia teemasse.\n2. Lae üles kõik pildid, mida soovida kasutada logodena, ikoonidena, vms. (Kasuta üleslaadimise ikooni postituse redaktori tööriistaribal, võid pildid siia ka lohistada või kleepida.)\n3. Postita oma vastus.\n4. Tee üleslaetud pildifailini leiad kas oma uues postituses oleval pildil paremklikates, või postituse muutmise ikooni klikkides ja kopeerides postitusest redaktoris. Kopeeri teed pildifailideni.\n5. Kleebi need teed sättesse [basic settings](/admin/site_settings/category/required).\n\n\nKui soovid lubada einevate failitüüpide üleslaadimist, muuda `authorized_extensions` sättes [file settings](/admin/site_settings/category/files)."
lounge_welcome:
title: "Teretulemast Lounge'i"
body: |
Õnnitlused! :confetti_ball:
Kui Sa seda teemat näed, oled hiljuti edutatud **püsiliikmeks** (usaldustase 3).
Nüüd võid &hellip;
* Muuta suvalise teema pealkirja
* Muuta suvalise teema foorumit
* Lasta kõiki oma viiteid järgida ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) on eemaldatud)
* Siseneda vaid usaldustasemel 3 ja kõrgemal olevatele kasutajatele mõeldud privaatse Salongi foorumisse
* Peita spämmi vaid ühe tähisega
Siin on [hetke püsiliikmete nimekiri](/badges/3/regular). Tervita neid kindlasti.
Täname, et oled meie kogukonna tähtis liige!
(Täiendava info saamiseks usaldustasemete kohta [vaata teemat][trust]. Pea meeles, et vaid need liikmed kes jätkuvalt seatud nõudmisi täidavad püsivad püsiliikmetena.)
[trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924
category:
topic_prefix: "Liigist %{category}"
errors:
@ -278,6 +330,12 @@ et:
email_already_used_in_category: "'%{email}' on juba liigi '%{category_name}' poolt kasutusse võetud."
cannot_delete:
uncategorized: "Ei saa kustutada Liigitamata liiki"
has_subcategories: "Seda foorumit ei saa kustutada, kuna tal on alamfoorumid."
topic_exists:
one: "Seda foorumit ei saa kustutada, kuna tal on 1 teema. Vanim teema on %{topic_link}."
other: "Seda foorumit ei saa kustutada, kuna tal on %{count} teemat. Vanim teema on %{topic_link}."
topic_exists_no_oldest: "Seda foorumit ei saa kustutada, kuna teemade arv on %{count}."
uncategorized_description: "Teemad, mis ei vaja või mida ei saa liigitada ühegi olemasoleva foorumi alla."
trust_levels:
newuser:
title: "uus kasutaja"
@ -291,6 +349,21 @@ et:
title: "juht"
rate_limiter:
slow_down: "Oled antud seda toimingut liiga palju proovinud. Proovi hiljem uuesti."
too_many_requests: "Antud tegevuse jaoks on meil päevane kordade limiit. Palun oota %{time_left} enne kui uuesti proovid."
by_type:
first_day_replies_per_day: "Oled ületanud uuele kasutajale esimesel päeval lubatud vastuste limiidi. Palun oota %{time_left} enne kui uuesti proovid."
first_day_topics_per_day: "Oled ületanud uuele kasutajale esimesel päeval lubatud teemade lisamise limiidi. Palun oota %{time_left} enne kui uuesti proovid."
create_topic: "Lisad teemasid liiga kiiresti. Palun oota %{time_left} enne kui uuesti proovid."
create_post: "Vastad liiga kiiresti. Palun oota %{time_left} enne kui uuesti proovid."
delete_post: "Kustutad postitusi liiga kiiresti. Palun oota %{time_left} enne kui uuesti proovid."
topics_per_day: "Oled ületanud tänaseks lubatud uute teemade lisamise limiidi. Palun oota %{time_left} enne kui uuesti proovid."
pms_per_day: "Oled ületanud tänaseks lubatud sõnumite limiidi. Palun oota %{time_left} enne kui uuesti proovid."
create_like: "Oled ületanud tänaseks lubatud meeldimiste lisamise limiidi. Palun oota %{time_left} enne kui uuesti proovid."
create_bookmark: "Oled ületanud tänaseks lubatud järjehoidjate lisamise limiidi. Palun oota %{time_left} enne kui uuesti proovid."
edit_post: "Oled ületanud tänaseks lubatud postituste muutmise limiidi. Palun oota %{time_left} enne kui uuesti proovid."
live_post_counts: "Küsid postituste reaalajas loendit liiga kiiresti. Palun oota %{time_left} enne kui uuesti proovid."
unsubscribe_via_email: "Oled ületanud tänaseks lubatud meilitsi tellimuste tühistamise limiidi. Palun oota %{time_left} enne kui uuesti proovid."
topic_invitations_per_day: "Oled ületanud tänaseks lubatud teemadesse kutsumise limiidi. Palun oota %{time_left} enne kui uuesti proovid."
hours:
one: "1 tund"
other: "%{count} tundi"
@ -387,17 +460,34 @@ et:
activation:
action: "Oma konto aktiveerimiseks kliki siia"
continue_button: "Edasi saidile %{site_name}"
welcome_to: "Tere tulemast %{site_name}!"
post_action_types:
off_topic:
title: 'Teemaväline'
long_form: 'tähistasin selle kui teemavälise'
spam:
title: 'Spämm'
long_form: 'tähistasin selle kui spämmi'
email_title: '"%{title}" tähistati spämmina'
email_body: "%{link}\n\n%{message}"
inappropriate:
title: 'Ebasünnis'
long_form: 'tähistasin selle kui sobimatu'
notify_user:
title: 'Saada kasutajale @{{username}} sõnum'
long_form: 'saatsin kasutajale sõnumi'
email_title: 'Sinu postitus teemas "%{title}"'
email_body: "%{link}\n\n%{message}"
notify_moderators:
title: "Miski muu"
description: 'See postitus nõuab meeskonna tähelepanu eelpool loetlemata põhjusel.'
long_form: 'tähistasin selle kui meeskonna tähelepanu vajava'
email_title: 'Postitus teemas "%{title}" nõuab meeskonna tähelepanu'
email_body: "%{link}\n\n%{message}"
bookmark:
title: 'Järjehoidja'
description: 'Lisa sellele postitusele järjehoidja'
long_form: 'lisasin sellele postitusele järjehoidja'
like:
title: 'Laigi'
description: 'Laigi seda postitust'
@ -565,8 +655,6 @@ et:
error: "Viga!"
email_input: "Admini kiri"
submit_button: "Saada kiri"
time:
<<: *datetime_formats
activemodel:
errors:
<<: *errors

View File

@ -1083,7 +1083,6 @@ fa_IR:
%{logs}
```
restore_succeeded:
subject_template: "بازیابی با موفقیت کامل شد "
text_body_template: "بازیابی با موفقیت انجام شد. "
@ -1121,7 +1120,6 @@ fa_IR:
<a class="attachment" href="%{download_link}">%{file_name}</a> (%{file_size})
پیوند زیر برای دانلود فقط برای 48 ساعت اعتبار دارد.
csv_export_failed:
subject_template: "خارج کردن فایل ها ناموفق شد"
text_body_template: "ما متاسفیم٬ ولی خارج کردن اطلاعات ناموفق شد. لطفا سیستم را چک کنید یا با یکی از مدیران تماس بگیرید. "

View File

@ -247,8 +247,6 @@ fi:
Tämä ketju on selvästikin tärkeä sinulle &ndash; olet kirjoittanut yli %{percent}% vastauksista.
Oletko varma, että annat myös muille riittävästi aikaa jakaa omia näkökulmiaan?
too_many_replies: |
### Olet saavuttanut rajoituksen uusien vastausten määrästä
@ -1712,7 +1710,6 @@ fi:
Pahoittelemme, mutta sähköpostin lähettäminen tänne %{destination} (otsikolla %{former_title}) ei onnistunut.
Viestisi lähetettiin estetystä sähköpostiosoitteesta. Yritä lähettää viesti toisesta sähköpostiosoitteesta tai ota yhteyttä henkilökuntaan.
email_reject_inactive_user:
subject_template: "[%{site_name}] Sähköpostiongelma -- Aktivoimaton käyttäjä"
text_body_template: |
@ -1745,7 +1742,6 @@ fi:
Emme löytäneet sähköpostiviestistäsi sisältöä.
Jos saat tämän viestin ja viestisi _sisälsi_ sisältöä, yritä uudestaan yksinkertaisemmalla muotoilulla.
email_reject_parsing:
subject_template: "[%{site_name}] Sähköpostiongelma -- Tunnistamaton sisältö"
text_body_template: |
@ -2138,7 +2134,6 @@ fi:
Vahvista sähköpostiosoitteesti sivustolle %{site_name} klikkaamalla linkkiä:
%{base_url}/users/authorize-email/%{email_token}
notify_old_email:
subject_template: "[%{site_name}] Sähköpostiosoitteesi on vaihdettu"
text_body_template: |
@ -2368,7 +2363,6 @@ fi:
<li><code>rainbows category:"parks and gardens" in:bookmarks</code> etsii alueelta "parks and gardens" kirjanmerkkeihin lisäämiäsi ketjuja, joissa esiintyy sana "rainbows".</li>
</ul>
</p>
badges:
editor:
name: Muokkaaja
@ -2440,13 +2434,11 @@ fi:
description: Ketjunavaus sai 50 tykkäystä
long_description: |
Tämä arvomerkki myönnetään, kun luomasi ketju saa 50 tykkäystä. Aloitit kiehtovan keskustelun, jossa vaihdetuista ajatuksista yhteisö nautti!
nice_share:
name: Hyvä jako
description: Jakoi viestin, ja linkin kautta saapui 25 vierailijaa
long_description: |
Tämä arvomerkki myönnetään, kun jaat linkin, jota klikkaa 25 ulkopuolista vierailijaa. Kiitos kun levität sanaa palstan keskusteluista ja yhteisöstä.
good_share:
name: Erinomainen jako
description: Jakoi viestin, ja linkin kautta saapui 300 vierailijaa

File diff suppressed because it is too large Load Diff

View File

@ -204,7 +204,6 @@ he:
תוכל/י לערוך תגובה קודמת שלך כדי להוסיף ציטוט על ידי הדגשת הטקסט ובחירה בכפתור <b>ציטוט התגובה</b> שיופיע.
קל יותר לכולם לקרוא נושאים עם מספר נמוך יחסית תגובות מעמיקות מאשר הרבה תגובות קצרות ונפרדות.
dominating_topic: |
### אפשר לאחרים להצטרף לשיחה
@ -1181,7 +1180,6 @@ he:
הנה הלוג:
%{logs}
restore_succeeded:
subject_template: "השחזור הסתיים בהצלחה."
text_body_template: "השחזור הצליח."
@ -1337,7 +1335,6 @@ he:
תהנה מהביקור!
(אם אתה צריך ליצור קשר עם [staff members](%{base_url}/about) כחבר חדש, רק השב להודעה זאת. )
signup:
subject_template: "[%{site_name}] אשר את חשבונך החדש"
text_body_template: |

View File

@ -301,7 +301,6 @@ id:
Silahkan sentuh tautan dibawah ini untuk menentukan sandi dari akun baru Anda:
%{base_url}/users/password-reset/%{email_token}
confirm_new_email:
subject_template: "[%{site_name}] Konfirmasi email baru Anda"
text_body_template: |

View File

@ -1183,7 +1183,6 @@ it:
Spiacenti, ma il tuo messaggio email a %{destination} (intitolato %{former_title}) non è stato inviato.
Non è stato riconosciuto alcuno degli indirizzi email di destinazione. Assicurati di inviare a indirizzi email validi.
email_reject_topic_not_found:
subject_template: "[%{site_name}] Problema relativo all'email -- Argomento Non Trovato"
email_reject_topic_closed:

View File

@ -174,7 +174,6 @@ ja:
文章を選択し、<b>引用して返信</b>ボタンをクリックすることで、文章を引用して編集することができます。
こまごまと何度も返信するより、まとまって返信をすることで、より見やすく、より話しやすくなります。
dominating_topic: |
### 他のユーザも議論に参加させてあげましょう
@ -1044,7 +1043,6 @@ ja:
### リリースノート
%{notes}
queued_posts_reminder:
subject_template:
other: "[%{site_name}] %{count} 件の投稿がレビュー待ちです"

View File

@ -377,7 +377,7 @@ ko:
email_title: '"%{title}" 내의 당신의 글'
email_body: "%{link}\n\n%{message}"
notify_moderators:
title: "뭔가 다른것"
title: "기타"
long_form: '주의를 위해 운영진에게 신고했습니다'
email_body: "%{link}\n\n%{message}"
bookmark:
@ -404,7 +404,8 @@ ko:
<a href="/guidelines">커뮤니티 가이드라인</a>에 맞지 않습니다.'
long_form: '부적절함으로 신고하였습니다.'
notify_moderators:
title: "뭔가 다른것"
title: "기타"
description: '이 주제는 <a href="/guidelines">가이드라인</a>, <a href="%{tos_url}">이용약관</a>, 위에서 언급되지 않은 기타 사유로 인해 운영진이 검토할 필요가 있습니다.'
long_form: '관리자의 주의를 위해 신고'
email_title: '글타래 "%{title}" 은 운영자의 확인이 필요합니다'
email_body: "%{link}\n\n%{message}"
@ -586,7 +587,7 @@ ko:
min_private_message_title_length: "메세지 제목의 최소 길이"
min_search_term_length: "검색을 하기 위한 최소 글자 수"
allow_uncategorized_topics: "카테고리 없이 게시 허용. 주의: 카테고리 없는 글은 이 항목을 비활성화에 하기전에 카테고리 설정을 해야 합니다."
allow_duplicate_topic_titles: "같은 제목의 동일한 글타래 허용"
allow_duplicate_topic_titles: "같은 제목의 동일한 주제 허용"
unique_posts_mins: "같은 컨텐츠를 다시 글 할 수 있는 기간(분)"
educate_until_posts: "새로운 사용자가 글를 작성할 시 글 작성 방법에 대한 교육패널을 보여주는데, 해당 패널이 보여지는 초기 글 개수"
title: "타이틀 태그에 쓰일 이 사이트의 이름"
@ -657,11 +658,11 @@ ko:
max_reply_history: "덧글 확장해서 보여지는 최대 갯수"
topics_per_period_in_top_summary: "인기 글타래 요약에 기본으로 보여질 글타래 수"
topics_per_period_in_top_page: "인기 글타래에서 '더 보기'를 요청할 시 보여질 글타래 수"
redirect_users_to_top_page: "자동으로 신규 사용자와 오래간만에 들어온 사용자를 탑 페이지로 리다이렉트 시킴"
show_email_on_profile: "사용자 프로필에서 자신의 이메일 주소 보기( 오직 본인과 관리자만 볼 수 있음)"
redirect_users_to_top_page: "신규 사용자와 오랜만에 방문한 사용자를 인기글 페이지로 리다이렉트."
show_email_on_profile: "사용자 프로필에서 자신의 이메일 주소 보기(본인과 관리자만 볼 수 있음)"
email_token_valid_hours: "비밀번호 찾기, 계정 활성화에 사용되는 토큰의 유효 기간(시간)"
email_token_grace_period_hours: "비밀번호 찾기, 계정 활성화에 사용되는 토큰은 사용되어진 이후 유효한 기간(시간)"
enable_badges: "훈장 시스템 활성화"
enable_badges: "배지 기능 사용"
allow_index_in_robots_txt: "이 사이트가 검색엔진에 의해 인덱스되는 것을 허용합니다.(robots.txt 수정)"
email_domains_blacklist: "가입 금지된 이메일 도메인 목록, 파이프 기호로 구분. 예: mailinator.com|trashmail.net"
email_domains_whitelist: "가입하려면 반드시 사용해야하는 이메일 도메인 목록, 파이프 기호로 구분. 경고: 이 목록외의 도메인으로는 가입이 안됩니다!"
@ -752,7 +753,7 @@ ko:
tl3_requires_posts_read_all_time: "VIP 사용자-3 이 되기 위해 꼭 보아야 하는 글타래의 전체 개수"
tl3_promotion_min_duration: "회원등급이 2로 떨어진 후 다시 VIP 사용자-3 이 될 수 있는 최소 일 수"
tl3_links_no_follow: "VIP 사용자-3 의 글에 있는 링크에서 rel=nofollow 를 제거하지 마시오."
min_trust_to_create_topic: "새로운 글타래를 생성하기 위한 최소 회원등급"
min_trust_to_create_topic: "새로운 주제를 생성하기 위한 최소 회원등급"
min_trust_to_edit_wiki_post: "위키로 설정된 글 수정할 수 있는 최소 회원등급"
newuser_max_links: "새로운 사용자가 글에 붙일 수 있는 최대 링크 개수"
newuser_max_images: "새로운 사용자가 글에 붙일 수 있는 최대 이미지 개수"
@ -803,7 +804,7 @@ ko:
num_flaggers_to_close_topic: "추후 중재를 위해 자동으로 글타래를 일시정지시킬 최소 신고자 수"
num_flags_to_close_topic: "추후 중재를 위해 자동으로 글타래를 일시정지시킬 최소 신고 횟수"
auto_respond_to_flag_actions: "신고 기각 시 자동 답변 활성화"
reply_by_email_enabled: "이메일을 통해 글타래에 댓글을 달 수 있음."
reply_by_email_enabled: "이메일을 통해 주제에 답글을 달 수 있음."
reply_by_email_address: "이메일 주소로 답글을 다는 템플릿. 예: %{reply_key}@reply.myforum.com"
disable_emails: "Discourse가 어떤 메일로 보내지 못하도록 합니다."
strip_images_from_short_emails: "2800바이트, 즉 2.73 KB 이내 사이즈를 가지도록 이미지를 빼주세요."
@ -824,7 +825,7 @@ ko:
delete_user_max_post_age: "(x)일 이전의 첫 글가 있는 유저는 삭제할 수 없음."
delete_all_posts_max: "전체 글 지우기 버튼을 통해 한번에 삭제할 수 있는 최대 글 수. 만약 사용자가 이것보다 많은 글을 가지고 있으면 한번에 삭제 할 수 없다."
username_change_period: "등록 후 사용자 이름 최소 유지 일 수(0은 사용자 이름 변경을 막음)"
email_editable: "등록 후 이메일 주소를 바꿀수 있는 있음"
email_editable: "가입 후 이메일 주소 변경 허용"
allow_animated_thumbnails: "움직이는 gif로 썸네일을 만듭니다."
default_avatars: "신규가입자가 받게될 기본 아바타 URL"
automatically_download_gravatars: "사용자가 계정을 만들거나 이메일을 변경하자마자 Gravatar를 다운로드합니다."
@ -841,8 +842,8 @@ ko:
suppress_uncategorized_badge: "글타래 리스트에서 카테고리가 없는 글타래에 대한 훈장을 보여주지 않는다."
global_notice: "긴급, 비상 전체 배너를 모든 방문자에게 표시합니다. 숨기려면 빈칸으로 바꾸면 됩니다(HTML 허용)."
disable_edit_notifications: "'download_remote_images_to_local'가 활성화되있으면 시스템 사용자에 의한 수정 알림을 비활성화합니다."
full_name_required: "사용자 정보에서 실명은 필수입니다."
enable_names: "사용자의 실명을 프로필, 사용자카드, 이메일에서 보여줍니다. 실명을 아무데서도 안보이게 하려면 비활성화하세요."
full_name_required: "사용자 프로필에서 실명을 필수 입력 항목으로 설정"
enable_names: "사용자의 실명을 프로필, 사용자카드, 이메일에서 표시함. 실명을 표시하지 않으려면 체크를 해제하세요."
display_name_on_posts: "글에 @username 뿐만 아니라 사용자의 전체 이름도 보여준다."
show_time_gap_days: "두 글의 일차를 보여주기 위해 두 글이 떨어져 있어야 할 일수"
invites_per_page: "사용자 페이지에 방문자를 표시합니다."
@ -1206,13 +1207,14 @@ ko:
(새 사용자로서 할말이 있으시면 이글에 답변함으로써 [스태프](%{base_url}/about)들에게 이야기해주세요.)
signup:
subject_template: "[%{site_name}] 새 계정 확인"
text_body_template: |
%{site_name}에 오신것을 환영합니다!
당신의 계정 인증을 위해 아래 링크를 클릭해주세요:
사용자 계정 인증을 위해 아래 링크를 클릭해주세요:
%{base_url}/users/activate-account/%{email_token}
만약 위의 링크를 클릭 할 수 없으면 주소를 복사하여 당신의 웹브라우저에 붙여넣으세요.
만약 위의 링크를 클릭 할 수 없으면 주소를 복사하여 웹브라우저에 붙여 넣으세요.
page_not_found:
popular_topics: "인기"
recent_topics: "최근"
@ -1256,7 +1258,7 @@ ko:
base_theme_name: "기본 테마 색상"
about: "소개"
guidelines: "가이드라인"
privacy: "개인정보 취급방침"
privacy: "개인정보처리방침"
edit_this_page: "이 페이지 수정"
csv_export:
boolean_yes: "네"
@ -1269,7 +1271,7 @@ ko:
tos_topic:
title: "서비스 이용약관"
privacy_topic:
title: "개인정보취급방침"
title: "개인정보처리방침"
admin_login:
success: "이메일 보냄"
error: "에러!"

View File

@ -1296,8 +1296,6 @@ nl:
We konden geen bruikbare tekst in je e-mail vinden.
Als je deze melding krijgt en _wel_ een reactie had gestuurd, kan je het opnieuw proberen met een eenvoudigere opmaak.
email_reject_parsing:
subject_template: "[%{site_name}] E-mailprobleem -- Inhoud niet herkend"
text_body_template: |

View File

@ -170,8 +170,6 @@ pl_PL:
- Postaraj się umieścić słowa kluczowe w tytule, dzięki czemu inni będą mogli łatwo *wyszukać* temat. Przypisz go do kategorii o pokrewnej tematyce.
Aby dowiedzieć się więcej, [zobacz przewodnik społeczności](/guidelines). Ten panel pojawi się tylko przy pierwszym %{education_posts_text}.
new-reply: |
Witaj na %{site_name} &mdash; **dziękujemy za zaangażowanie!**
@ -938,7 +936,6 @@ pl_PL:
(Jeśli powyższy link wygasł, wybierz "Zapomniałem hasła", logując się za pomocą adresu email.)
test_mailer:
subject_template: "[%{site_name}] Test dostarczania poczty"
new_version_mailer:
@ -999,8 +996,6 @@ pl_PL:
```
%{logs}
```
csv_export_succeeded:
subject_template: "Zakończono eksport danych"
text_body_template: |
@ -1009,7 +1004,6 @@ pl_PL:
<a class="attachment" href="%{download_link}">%{file_name}</a> (%{file_size})
Powyższy link będzie aktywny przez 48 godzin.
csv_export_failed:
subject_template: "Nieudany eksport danych"
text_body_template: "Przepraszamy, ale eksport danych zakończył się niepowodzeniem. Sprawdź logi lub skontaktuj się z operatorami serwisu."
@ -1086,7 +1080,6 @@ pl_PL:
Baw się dobrze!
(Jeśli potrzebujesz skontaktować się z [członkiem zespołu](%{base_url}/about) jako nowy użytkownik, odpowiedz na tę wiadomość.)
signup:
subject_template: "[%{site_name}] Potwierdź swoje nowe konto"
text_body_template: |

View File

@ -250,14 +250,12 @@ pt:
Este tópico é claramente importante para si &ndash; publicou mais de %{percent}% das respostas aqui.
Tem a certeza de que está a fornecer o tempo adequado para que outras pessoas também possam partilhar os seus pontos de vista?
too_many_replies: |
### Chegou ao limite de respostas para este tópico
Pedimos desculpa mas novos utilizadores estão temporariamente limitados a %{newuser_max_replies_per_topic} respostas no mesmo tópico.
Em vez de adicionar outra resposta, por favor considere editar as suas respostas anteriores, ou visitar outros tópicos.
reviving_old_topic: |
### Reavivar este tópico?
@ -329,7 +327,6 @@ pt:
(Para mais informação acerca dos Níveis de Confiança, [veja este tópico][confiança]. Por favor tenha conhecimento que apenas membros que continuam a corresponder aos requisitos ao longo do tempo, irão manter-se habituais.)
[confiança]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924
category:
topic_prefix: "Acerca da categoria %{category}"
replace_paragraph: "(Substitua este primeiro parágrafo com uma breve descrição da sua nova categoria. Este guia irá aparecer na área de seleção da categoria, por isso tente mantê-lo abaixo dos 200 caracteres. **Até editar esta descrição ou criar tópicos, esta categoria não irá aparecer na página das categorias.**)"
@ -1423,21 +1420,18 @@ pt:
Pedimos desculpa mas a sua mensagem de email %{destination} (titled %{former_title}) não funcionou.
A sua conta associada com este endereço de email foi bloqueada.
email_reject_reply_user_not_matching:
subject_template: "[%{site_name}] Problema de email -- Utilizador de resposta não encontrado"
text_body_template: |
Pedimos desculpa mas a sua mensagem de email %{destination} (titled %{former_title}) não funcionou.
A sua resposta foi enviada de um email diferente daquele que esperávamos, por esta razão não temos a certeza que seja a mesma pessoa. Tente enviar de outro endereço de email ou contacte um membro do pessoal.
email_reject_no_account:
subject_template: "[%{site_name}] Problema de email -- Conta Desconhecida"
text_body_template: |
Pedimos desculpa mas a sua mensagem de email %{destination} (titled %{former_title}) não funcionou.
Não conseguimos encontrar nenhuma conta com combine com o seu endereço de email. Tente enviar de outro endereço de email ou contacte um membro do pessoal.
email_reject_empty:
subject_template: "[%{site_name}] Problema de email -- Sem Conteúdo"
text_body_template: |

View File

@ -1444,7 +1444,6 @@ sk:
boolean_no: "Nie"
static_topic_first_reply: |
Upravte prvý príspevok v téme pre zmenu obsahu %{page_name} stránky.
guidelines_topic:
title: "FAQ/Pravidlá"
body: |

View File

@ -15,6 +15,9 @@ sq:
short: "%m-%d-%Y"
short_no_year: "%B %-d"
date_only: "%B %-d, %Y"
date:
month_names: [null, Janar, Shkurt, Mars, Prill, Maj, Qershor, Korrik, Gusht, Shtator, Tetor, Nëntor, Dhjetor]
<<: *datetime_formats
title: "Discourse"
topics: "Tema"
posts: "postime"
@ -262,12 +265,12 @@ sq:
self_parent: "A subcategory's parent cannot be itself"
depth: "You can't nest a subcategory under another"
cannot_delete:
uncategorized: "Can't delete Uncategorized"
has_subcategories: "Can't delete this category because it has sub-categories."
uncategorized: "Nuk fshij dot kategorinë \"Uncategorized\""
has_subcategories: "Nuk e fshini dot këtë kategori sepse ajo ka nënkategori. "
topic_exists:
one: "Can't delete this category because is has 1 topic. Oldest topic is %{topic_link}."
other: "Can't delete this category because it has %{count} topics. Oldest topic is %{topic_link}."
topic_exists_no_oldest: "Can't delete this category because topic count is %{count}."
one: "Nuk e fshini dot këtë kategori sepse këtu ka 1 temë. Tema më e vjetër është %{topic_link}."
other: "Nuk e fshini dot këtë kategori sepse këtu ka %{count} tema. Tema më e vjetër është %{topic_link}."
topic_exists_no_oldest: "Nuk e fshini dot këtë kategori sepse numri i temave është %{count}."
trust_levels:
newuser:
title: "anëtar i ri"
@ -846,7 +849,6 @@ sq:
minimum_topics_similar: "How many topics need to exist before similar topics are presented when composing new topics."
relative_date_duration: "Number of days after posting where post dates will be shown as relative (7d) instead of absolute (20 Feb)."
delete_user_max_post_age: "Don't allow deleting users whose first post is older than (x) days."
delete_all_posts_max: "The maximum number of posts that can be deleted at once with the Delete All Posts button. If a user has more than this many posts, the posts cannot all be deleted at once and the user can't be deleted."
username_change_period: "The number of days after registration that accounts can change their username (0 to disallow username change)."
email_editable: "Allow users to change their e-mail address after registration."
allow_uploaded_avatars: "Allow users to upload custom profile pictures."
@ -1677,8 +1679,6 @@ sq:
performance_report:
initial_post_raw: This topic includes daily performance reports for your site.
initial_topic_title: Raportet e performancës se faqes
date:
<<: *datetime_formats
time:
<<: *datetime_formats
activemodel:

View File

@ -2280,8 +2280,6 @@ sv:
## [Användarvillkor](#tos)
Ja, vi vet att juristspråk är tråkigt men vi måste skydda oss själva &ndash; och i förlängningen du och din data &ndash; mot otrevliga människor. Vi har [användarvillkor](/tos) som beskriver din (och våra) uppföranden och rättigheter relaterat till innehåll, integritet och lagar. För att använda den här tjänsten måste du samtycka till våra [användarvillkor](/tos).
tos_topic:
title: "Villkor"
privacy_topic:

View File

@ -306,6 +306,7 @@ tr_TR:
uncategorized_parent: "Kategorisizin üst kategorisi olamaz"
self_parent: "Alt kategorinin üst kategorisi kendisi olamaz"
depth: "Bir alt kategori başka bir alt kategorinin altında yer alamaz"
invalid_email_in: "Bu '%{email}' e-posta geçerli değil."
cannot_delete:
uncategorized: "Kategorisiz silinemez"
has_subcategories: "Alt kategorileri bulunduğu için bu kategori silinemez."
@ -408,8 +409,10 @@ tr_TR:
please_continue: "%{site_name} adresine devam edin"
error: "E-posta adresiniz değiştirilirken bir hata oluştu. Bu adres zaten kullanımda olabilir."
error_staged: "E-posta adresiniz değiştirilirken bir hata oluştu. Bu adres zaten başka bir kullanıcı tarafından kullanımdadır."
already_done: "Üzgünüz, bu doğrulama bağlantısı geçerli değil. Email'iniz değiştirilmiş olabilir mi?"
authorizing_old:
title: "Geçerli e-posta adresi onayladığınız için teşekkür ederiz"
description: "Doğrulama için yeni adresine şimdi email gönderiyoruz."
activation:
action: "Hesabınızı etkinleştirmek için buraya tıklayın"
already_done: "Üzgünüz, hesap doğrulama linki artık geçerli değil. Hesabınız zaten etkin olabilir mi?"
@ -417,6 +420,7 @@ tr_TR:
continue_button: "%{site_name} adresine devam edin"
welcome_to: "%{site_name} sitesine hoşgeldiniz!"
approval_required: "Bu foruma erişebilmeniz için yeni hesabınızın bir moderatör tarafından manuel olarak onaylanması gerekir. Hesabınız onaylandığında e-posta ile bilgilendirileceksiniz!"
missing_session: "Hesabınızı tespit edemiyoruz eğer önceden hesap oluşturduysanız, lütfen çerezlerin etkin olduğundan emin olun."
post_action_types:
off_topic:
title: 'Konu dışı'
@ -482,7 +486,15 @@ tr_TR:
message:
make: "Bu konu artık bir manşettir. Kullanıcı tarafından yoksayılana kadar her sayfanın en üstünde belirecektir."
remove: "Bu konu artık manşet değildir. Artık her sayfanın en üstünde yer belirmeyecektir."
unsubscribed:
title: "Abonelik İptal Edildi!"
unsubscribe:
title: "Aboneliği İptal Et"
stop_watching_topic: "Bu konuyu izlemeyi bırak, %{link}"
mute_topic: "Bu konuya ait tüm bildirimleri sessiz al, %{link}"
unwatch_category: "%{category} içerisindeki konuları izlemeyi durdur"
mailing_list_mode: "Duyuru listesi modunu kapat"
all: "%{sitename} tarafından hiçbir mail gönderme"
log_out: ıkış"
reports:
visits:
@ -567,9 +579,11 @@ tr_TR:
page_view_anon_reqs:
title: "Anonim"
xaxis: "Gün"
yaxis: "Anonim Sayfa Görüntülemeleri"
page_view_logged_in_reqs:
title: "Oturum açıldı"
xaxis: "Gün"
yaxis: "Giriş Yapılmış Sayfa Görüntülemeleri"
page_view_crawler_reqs:
title: "Arama botları"
xaxis: "Gün"
@ -924,6 +938,7 @@ tr_TR:
allow_animated_thumbnails: "Animasyonlu giflerin, animasyonlu küçük resmini oluşturur."
default_avatars: "Yeni kullanıcılar için, onlar değiştirene kadar, varsayılan olarak kullanılacak avatarların URL'leri."
automatically_download_gravatars: "Hesap oluşturma veya e-posta değişikliği esnasında kullanıcılar için Gravatarları indir"
disable_digest_emails: "Tüm kullanıcılar için özet email'leri devre dışı bırak."
detect_custom_avatars: "Kullanıcıların özel profil resimleri yükleyip yüklemediklerini kontrol et ya da etme."
max_daily_gravatar_crawls: "Discourse'un gün içinde özel avatarlar için Gravatar'ı en fazla kaç kere kontrol edeceği."
public_user_custom_fields: "Kullanıcıların için, herkes tarafından görüntülenebilir özel alanların beyaz listesi."
@ -983,6 +998,10 @@ tr_TR:
default_categories_watching: "Öntanımlı olarak, izlenen kategorilerin listesi."
default_categories_tracking: "Öntanımlı olarak, takip edilen kategorilerin listesi."
default_categories_muted: "Öntanımlı olarak, sesi kısılan kategorilerin listesi."
tagging_enabled: "Konularda etiketleri etkinleştirin?"
min_trust_to_create_tag: "Yeni bir etiket oluşturmak için gereken en az güven seviyesi."
tag_style: "Etiket rozetleri için görsel stil."
min_trust_level_to_tag_topics: "Etiket konuları oluşturmak için gereken en az güven seviyesi."
errors:
invalid_email: "Geçersiz e-posta adresi."
invalid_username: "Bu kullanıcı adı ile bir kullanıcı bulunmuyor."
@ -1003,6 +1022,9 @@ tr_TR:
category: 'Kategoriler'
topic: 'Sonuçlar'
user: 'Kullanıcılar'
sso:
unknown_error: "Hesabınızda bir sorun var. Lütfen site yöneticisi ile iletişime geçin."
timeout_expired: "Hesabınız zaman aşımına uğradı, lütfen tekrar giriş yapmayı deneyin."
original_poster: "Orjinal Poster"
most_posts: "En Çok Gönderi"
most_recent_poster: "En Son Gönderen"
@ -1077,6 +1099,8 @@ tr_TR:
characters: "sadece rakam, harf ve altçizgi bulundurabilir "
unique: "özgün olmalı"
blank: "bulunmalı"
must_begin_with_alphanumeric_or_underscore: "bir harf, rakam ya da alt çizgi ile başlamalı"
must_end_with_alphanumeric: "bir harf ya da bir rakam ile bitmeli"
must_not_contain_two_special_chars_in_seq: "2 ya da daha fazla uzunlukta özel karakter dizisi (.-_) içermemeli"
email:
not_allowed: "için o e-posta sağlayıcısına izin verilmiyor. Lütfen başka bir email adresi kullanın. "

View File

@ -1725,7 +1725,6 @@ zh_CN:
我们非常抱歉,但是你发送至%{destination}(名为%{former_title})的邮件出问题了。
邮件发至的分类只接受来自合法帐户且邮件地址已确认的用户的有邮件。如果你有异议,联系管理人员。
email_reject_invalid_post:
subject_template: "[%{site_name}] 邮件问题 -- 发布时错误"
text_body_template: |
@ -2629,7 +2628,6 @@ zh_CN:
description: 分享了一个有 1000 个独立访问者的帖子
long_description: |
该徽章授予给分享链接给 1000 个其他访客的你。哇!你把一个有意思的讨论推广给了广大的读者们,并且帮助社群前进了一大步!
first_like:
name: 首次赞
description: 已赞过了一个帖子
@ -2650,7 +2648,6 @@ zh_CN:
description: 已邀请了 3 个初级用户
long_description: |
该徽章授予给邀请了 3 人加入社群的你,你的朋友在站点上度过了很长的时间,已经成为了基础用户。活跃的社区需要新鲜的血液日常参与,并为交流带来多元视点。
champion:
name: 外交官
description: 已邀请了 5 个成员

View File

@ -45,6 +45,9 @@ Discourse::Application.routes.draw do
get "banner"
get "emoji"
end
get "site/basic-info" => 'site#basic_info'
get "site_customizations/:key" => "site_customizations#show"
resources :forums
@ -315,9 +318,7 @@ Discourse::Application.routes.draw do
get "users/:username/preferences/card-badge" => "users#card_badge", constraints: {username: USERNAME_ROUTE_FORMAT}
put "users/:username/preferences/card-badge" => "users#update_card_badge", constraints: {username: USERNAME_ROUTE_FORMAT}
get "users/:username/staff-info" => "users#staff_info", constraints: {username: USERNAME_ROUTE_FORMAT}
get "users/:username/summary" => "users#summary", constraints: {username: USERNAME_ROUTE_FORMAT}
get "users/:username/invited" => "users#invited", constraints: {username: USERNAME_ROUTE_FORMAT}
get "users/:username/invited_count" => "users#invited_count", constraints: {username: USERNAME_ROUTE_FORMAT}
get "users/:username/invited/:filter" => "users#invited", constraints: {username: USERNAME_ROUTE_FORMAT}
@ -339,6 +340,9 @@ Discourse::Application.routes.draw do
get "users/by-external/:external_id" => "users#show", constraints: {external_id: /[^\/]+/}
get "users/:username/flagged-posts" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT}
get "users/:username/deleted-posts" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT}
get "users/:username/topic-tracking-state" => "users#topic_tracking_state", constraints: {username: USERNAME_ROUTE_FORMAT}
get "user-badges/:username.json" => "user_badges#username", constraints: {username: USERNAME_ROUTE_FORMAT}, defaults: {format: :json}
get "user-badges/:username" => "user_badges#username", constraints: {username: USERNAME_ROUTE_FORMAT}

View File

@ -1022,6 +1022,15 @@ backups:
regex: "^((0?(0|1|2|3|4|5|6|7|8|9)|(10|11|12|13|14|15|16|17|18|19|20|21|22|23))):\\d\\d$"
backup_with_uploads: true
search:
min_search_term_length:
client: true
default: 3
search_tokenize_chinese_japanese_korean: false
search_prefer_recent_posts: false
search_recent_posts_size: 100000
uncategorized:
version_checks:
client: true
@ -1041,12 +1050,6 @@ uncategorized:
default: ''
type: list
# Search
min_search_term_length:
client: true
default: 3
search_tokenize_chinese_japanese_korean: false
max_similar_results: 5
minimum_topics_similar: 50

View File

@ -382,7 +382,7 @@ Badge.seed do |b|
b.query = nil
b.badge_grouping_id = BadgeGrouping::GettingStarted
b.default_badge_grouping_id = BadgeGrouping::GettingStarted
b.trigger = Badge::Trigger::PostProcessed
b.trigger = Badge::Trigger::None
b.system = true
end
@ -396,7 +396,7 @@ Badge.seed do |b|
b.query = nil
b.badge_grouping_id = BadgeGrouping::GettingStarted
b.default_badge_grouping_id = BadgeGrouping::GettingStarted
b.trigger = Badge::Trigger::PostProcessed
b.trigger = Badge::Trigger::None
b.system = true
end
@ -410,7 +410,7 @@ Badge.seed do |b|
b.query = nil
b.badge_grouping_id = BadgeGrouping::GettingStarted
b.default_badge_grouping_id = BadgeGrouping::GettingStarted
b.trigger = Badge::Trigger::PostProcessed
b.trigger = Badge::Trigger::None
b.system = true
end

View File

@ -52,7 +52,7 @@ module BackupRestore
@success = false
else
@success = true
@backup_filename
File.join(@archive_directory, @backup_filename)
ensure
begin
notify_user

View File

@ -51,6 +51,7 @@ class CookedPostProcessor
BadgeGranter.grant(Badge.find(Badge::FirstEmoji), @post.user, post_id: @post.id) if has_emoji?
BadgeGranter.grant(Badge.find(Badge::FirstOnebox), @post.user, post_id: @post.id) if @has_oneboxes
BadgeGranter.grant(Badge.find(Badge::FirstReplyByEmail), @post.user, post_id: @post.id) if @post.is_reply_by_email?
end
def keep_reverse_index_up_to_date

View File

@ -28,10 +28,10 @@ class DiscourseRedis
def initiate_fallback_to_master
begin
slave_client = ::Redis::Client.new(@slave_config)
logger.warn "#{log_prefix}: Checking connection to master server..."
logger.info "#{log_prefix}: Checking connection to master server..."
if slave_client.call([:info]).split("\r\n").include?(MASTER_LINK_STATUS)
logger.warn "#{log_prefix}: Master server is active, killing all connections to slave..."
logger.info "#{log_prefix}: Master server is active, killing all connections to slave..."
CONNECTION_TYPES.each do |connection_type|
slave_client.call([:client, [:kill, 'type', connection_type]])

View File

@ -2,18 +2,21 @@ module Email
class Processor
def initialize(mail)
def initialize(mail, retry_on_rate_limit=true)
@mail = mail
@retry_on_rate_limit = retry_on_rate_limit
end
def self.process!(mail)
Email::Processor.new(mail).process!
def self.process!(mail, retry_on_rate_limit=true)
Email::Processor.new(mail, retry_on_rate_limit).process!
end
def process!
begin
receiver = Email::Receiver.new(@mail)
receiver.process!
rescue RateLimiter::LimitExceeded
@retry_on_rate_limit ? Jobs.enqueue(:process_email, mail: @mail) : raise
rescue Email::Receiver::BouncedEmailError => e
# never reply to bounced emails
log_email_process_failure(@mail, e)
@ -49,7 +52,6 @@ module Email
when ActiveRecord::Rollback then :email_reject_invalid_post
when Email::Receiver::InvalidPostAction then :email_reject_invalid_post_action
when Discourse::InvalidAccess then :email_reject_invalid_access
when RateLimiter::LimitExceeded then :email_reject_rate_limit_specified
end
template_args = {}
@ -61,10 +63,6 @@ module Email
template_args[:post_error] = e.message
end
if message_template == :email_reject_rate_limit_specified
template_args[:rate_limit_description] = e.description
end
if message_template
# inform the user about the rejection
message = Mail::Message.new(mail_string)

View File

@ -77,7 +77,7 @@ module Email
body, @elided = select_body
body ||= ""
raise NoBodyDetectedError if body.blank? && !@mail.has_attachments?
raise NoBodyDetectedError if body.blank? && attachments.empty?
if is_auto_generated?
@incoming_email.update_columns(is_auto_generated: true)
@ -436,15 +436,17 @@ module Email
raise InvalidPostAction.new(e)
end
def attachments
# strip blacklisted attachments (mostly signatures)
@attachments ||= @mail.attachments.select do |attachment|
attachment.content_type !~ SiteSetting.attachment_content_type_blacklist_regex &&
attachment.filename !~ SiteSetting.attachment_filename_blacklist_regex
end
end
def create_post_with_attachments(options={})
# deal with attachments
@mail.attachments.each do |attachment|
# strip blacklisted attachments (mostly signatures)
next if attachment.content_type =~ SiteSetting.attachment_content_type_blacklist_regex
next if attachment.filename =~ SiteSetting.attachment_filename_blacklist_regex
attachments.each do |attachment|
tmp = Tempfile.new("discourse-email-attachment")
begin
# read attachment

View File

@ -13,6 +13,7 @@ module FileStore
end
def store_file(file, path, opts = {})
not_implemented
end
def remove_upload(upload)
@ -24,24 +25,31 @@ module FileStore
end
def remove_file(url)
not_implemented
end
def has_been_uploaded?(url)
not_implemented
end
def download_url(upload)
not_implemented
end
def cdn_url(url)
not_implemented
end
def absolute_base_url
not_implemented
end
def relative_base_url
not_implemented
end
def external?
not_implemented
end
def internal?
@ -49,6 +57,7 @@ module FileStore
end
def path_for(upload)
not_implemented
end
def download(upload)
@ -111,6 +120,12 @@ module FileStore
`ls -tr #{CACHE_DIR} | head -n +#{CACHE_MAXIMUM_SIZE} | xargs rm -f`
end
private
def not_implemented
raise "Not implemented."
end
end
end

View File

@ -27,9 +27,9 @@ class PostMerger
edit_reason: I18n.t("merge_posts.edit_reason", count: posts.length, username: @user.username)
}
Post.transaction do
revisor = PostRevisor.new(post, post.topic)
revisor.revise!(@user, changes, {})
revisor = PostRevisor.new(post, post.topic)
revisor.revise!(@user, changes) do
posts.each { |p| PostDestroyer.new(@user, p).destroy }
end
end

View File

@ -137,6 +137,7 @@ class PostRevisor
Post.transaction do
revise_post
yield if block_given?
# TODO: these callbacks are being called in a transaction
# it is kind of odd, because the callback is called "before_edit"
# but the post is already edited at this point

View File

@ -156,7 +156,14 @@ module PrettyText
Emoji.custom.map {|e| custom_emoji[e.name] = e.url}
context.eval("__optInput.customEmoji = #{custom_emoji.to_json};")
opts = context.eval("__pt = new __PrettyText(__buildOptions(__optInput));")
context.eval('__textOptions = __buildOptions(__optInput);')
# Be careful disabling sanitization. We allow for custom emails
if opts[:sanitize] == false
context.eval('__textOptions.sanitize = false;')
end
opts = context.eval("__pt = new __PrettyText(__textOptions);")
DiscourseEvent.trigger(:markdown_context, context)
baked = context.eval("__pt.cook(#{text.inspect})")

View File

@ -128,6 +128,30 @@ class Search
end
end
def self.min_post_id_no_cache
return 0 unless SiteSetting.search_prefer_recent_posts?
offset, has_more = Post.unscoped
.order('id desc')
.offset(SiteSetting.search_recent_posts_size-1)
.limit(2)
.pluck(:id)
has_more ? offset : 0
end
def self.min_post_id(opts=nil)
return 0 unless SiteSetting.search_prefer_recent_posts?
# It can be quite slow to count all the posts so let's cache it
Rails.cache.fetch("search-min-post-id:#{SiteSetting.search_recent_posts_size}", expires_in: 1.week) do
min_post_id_no_cache
end
end
attr_accessor :term
def initialize(term, opts=nil)
@opts = opts || {}
@guardian = @opts[:guardian] || Guardian.new
@ -135,6 +159,7 @@ class Search
@include_blurbs = @opts[:include_blurbs] || false
@blurb_length = @opts[:blurb_length]
@limit = Search.per_facet
@valid = true
term = process_advanced_search!(term)
@ -155,14 +180,26 @@ class Search
@results = GroupedSearchResults.new(@opts[:type_filter], term, @search_context, @include_blurbs, @blurb_length)
end
def valid?
@valid
end
def self.execute(term, opts=nil)
self.new(term, opts).execute
end
# Query a term
def execute
if @term.blank? || @term.length < (@opts[:min_search_term_length] || SiteSetting.min_search_term_length)
return nil unless @filters.present?
unless @filters.present?
min_length = @opts[:min_search_term_length] || SiteSetting.min_search_term_length
terms = (@term || '').split(/\s(?=(?:[^"]|"[^"]*")*$)/).reject {|t| t.length < min_length }
if terms.blank?
@term = ''
@valid = false
return
end
end
# If the term is a number or url to a topic, just include that topic
@ -529,7 +566,16 @@ class Search
posts = posts.joins('JOIN users u ON u.id = posts.user_id')
posts = posts.where("posts.raw || ' ' || u.username || ' ' || COALESCE(u.name, '') ilike ?", "%#{term_without_quote}%")
else
posts = posts.where("post_search_data.search_data @@ #{ts_query}")
min_id = Search.min_post_id
if min_id > 0
fast_query = posts.dup.where("post_search_data.post_id >= #{min_id}")
posts = fast_query if fast_query.dup.count >= 50
end
exact_terms = @term.scan(/"([^"]+)"/).flatten
exact_terms.each do |exact|
posts = posts.where("posts.raw ilike ?", "%#{exact}%")
@ -653,7 +699,7 @@ class Search
.to_sql
else
posts_query(@limit, aggregate_search: true,
private_messages: opts[:private_messages])
private_messages: opts[:private_messages])
.select('topics.id', "#{min_or_max}(post_number) post_number")
.group('topics.id')
.to_sql
@ -663,6 +709,7 @@ class Search
post_sql = "SELECT *, row_number() over() row_number FROM (#{post_sql}) xxx"
posts = Post.includes(:topic => :category)
.includes(:user)
.joins("JOIN (#{post_sql}) x ON x.id = posts.topic_id AND x.post_number = posts.post_number")
.order('row_number')
@ -679,7 +726,9 @@ class Search
def topic_search
if @search_context.is_a?(Topic)
posts = posts_query(@limit).where('posts.topic_id = ?', @search_context.id).includes(:topic => :category)
posts = posts_query(@limit).where('posts.topic_id = ?', @search_context.id)
.includes(:topic => :category)
.includes(:user)
posts.each do |post|
@results.add(post)
end

View File

@ -119,6 +119,7 @@ module SiteSettingExtension
if opts[:shadowed_by_global] && GlobalSetting.respond_to?(name)
val = GlobalSetting.send(name)
unless val.nil? || (val == ''.freeze)
hidden_settings << name
shadowed_settings << name

View File

@ -5,7 +5,7 @@ module Discourse
MAJOR = 1
MINOR = 7
TINY = 0
PRE = 'beta1'
PRE = 'beta2'
STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
end

View File

@ -0,0 +1,7 @@
fr:
js:
details:
title: Cacher le texte
composer:
details_title: Résumé
details_text: "Ce texte sera caché"

View File

@ -0,0 +1,3 @@
fr:
site_settings:
details_enabled: "Activer le plugin details. Si vous modifiez ceci, vous devez exécuter la commande \"rake posts:rebake\"."

View File

@ -50,14 +50,14 @@ fr:
error_while_casting_votes: "Désolé, il y a eu une erreur lors de l'envoi de vos votes."
error_while_fetching_voters: "Désolé, il y a eu une erreur lors de l'affichage des votants."
ui_builder:
title: Construire Sondage
insert: Insérer Sondage
title: Créer un sondage
insert: Insérer le sondage
help:
options_count: Entrez au moins 2 options
poll_type:
label: Type
regular: Choix Unique
multiple: Choix Multiple
regular: Choix unique
multiple: Choix multiple
number: Nombre
poll_config:
max: Max

View File

@ -17,6 +17,14 @@ pl_PL:
few: "oddanych głosów"
other: "oddanych głosów"
average_rating: "Średnia ocena: <strong>%{average}</strong>."
public:
title: "Głosy są jawne."
multiple:
help:
at_least_min_options:
one: "Wybierz co najmniej <strong>1</strong> opcję"
few: "Wybierz co najmniej <strong>%{count}</strong> opcji"
other: "Wybierz co najmniej <strong>%{count}</strong> opcji"
cast-votes:
title: "Oddaj głos"
label: "Oddaj głos!"
@ -34,3 +42,7 @@ pl_PL:
title: "Zamknij ankietę"
label: "Zamknij"
confirm: "Czy na pewno chcesz zamknąć tę ankietę?"
ui_builder:
title: Utwórz ankietę
help:
options_count: Wprowadź przynajmniej 2 opcje

View File

@ -15,6 +15,20 @@ pt_BR:
one: "voto total"
other: "votos totais"
average_rating: "Resultado médio: <strong>%{average}</strong>."
public:
title: "A votação é pública."
multiple:
help:
at_least_min_options:
one: "Você deve escolher pelo menos <strong>%{count}</strong> opções."
other: "Você deve escolher pelo menos <strong>%{count}</strong> opções."
up_to_max_options:
one: "Você deve escolher até <strong>%{count}</strong> opções."
other: "Você deve escolher até <strong>%{count}</strong> opções."
x_options:
one: "Você deve escolher <strong>%{count}</strong> opções."
other: "Você deve escolher <strong>%{count}</strong> opções."
between_min_and_max_options: "Você pode escolher entre <strong>%{min}</strong> e <strong>%{max}</strong> opções"
cast-votes:
title: "Seus votos"
label: "Votar agora!"
@ -32,3 +46,24 @@ pt_BR:
title: "Fechar a enquete"
label: "Fechar"
confirm: "Você tem certeza que deseja fechar essa enquete?"
error_while_toggling_status: "Desculpe, houve um erro ao mudar a situação da enquete.."
error_while_casting_votes: "Desculpe, houve um erro ao votar."
error_while_fetching_voters: "Desculpe, houve um erro ao mostrar os votantes."
ui_builder:
title: Criar Enquete
insert: Inserir resposta
help:
options_count: Enquetes devem ter no mínimo 2 opções
poll_type:
label: Tipo
regular: Única escolha
multiple: Múltipla escolha
number: Classificação numérica
poll_config:
max: Máx
min: Mín
step: Etapa
poll_public:
label: Exibir votantes
poll_options:
label: Insira uma resposta por linha

View File

@ -18,6 +18,7 @@ en:
site_settings:
poll_enabled: "Allow users to create polls?"
poll_maximum_options: "Maximum number of options allowed in a poll."
poll_edit_window_mins: "Number of minutes after post creation during which polls can be edited."
poll:
multiple_polls_without_name: "There are multiple polls without a name. Use the '<code>name</code>' attribute to uniquely identify your polls."
@ -44,9 +45,10 @@ en:
default_cannot_be_made_public: "Poll with votes cannot be made public."
named_cannot_be_made_public: "Poll named <strong>%{name}</strong> has votes cannot be made public."
cannot_change_polls_after_5_minutes: "You cannot add, remove or rename polls after the first 5 minutes."
op_cannot_edit_options_after_5_minutes: "You cannot add or remove poll options after the first 5 minutes. Please contact a moderator if you need to edit a poll option."
staff_cannot_add_or_remove_options_after_5_minutes: "You cannot add or remove poll options after the first 5 minutes. You should close this topic and create a new one instead."
edit_window_expired:
cannot_change_polls: "You cannot add, remove or rename polls after the first %{minutes} minutes."
op_cannot_edit_options: "You cannot add or remove poll options after the first %{minutes} minutes. Please contact a moderator if you need to edit a poll option."
staff_cannot_add_or_remove_options: "You cannot add or remove poll options after the first %{minutes} minutes. You should close this topic and create a new one instead."
no_polls_associated_with_this_post: "No polls are associated with this post."
no_poll_with_this_name: "No poll named <strong>%{name}</strong> associated with this post."

View File

@ -16,7 +16,7 @@ fr:
named_poll_must_have_at_least_2_options: "Le sondage <strong>%{name}</strong> doit contenir au moins deux options."
default_poll_must_have_less_options:
one: "Un sondage peut contenir une option."
other: "Un sondage peut contenir jusque %{count} options."
other: "Un sondage peut contenir jusqu %{count} options."
named_poll_must_have_less_options:
one: "Le sondage <strong>% {name} </ strong> peut contenir une option."
other: "Le sondage <strong>% {name} </ strong> peut contenir jusquà % {count} options."
@ -38,4 +38,4 @@ fr:
topic_must_be_open_to_toggle_status: "Le sujet doit être ouvert pour modifier le statut."
only_staff_or_op_can_toggle_status: "Seuls les responsables ou l'utilisateur qui a créé ce sujet peuvent modifier le statut d'un sondage."
email:
link_to_poll: "Cliquez ici pour voir le sondage."
link_to_poll: "Cliquer pour voir le sondage."

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