Version bump

This commit is contained in:
Neil Lalonde 2018-09-14 11:43:45 -04:00
commit 0b282fb812
122 changed files with 1883 additions and 5742 deletions

View File

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

View File

@ -271,7 +271,7 @@ GEM
parallel (1.12.1)
parser (2.5.1.0)
ast (~> 2.4.0)
pg (1.1.0)
pg (1.1.3)
powerpack (0.1.2)
progress (3.4.0)
pry (0.10.4)

View File

@ -40,6 +40,7 @@
<p>{{i18n "admin.customize.theme.color_scheme_select"}}</p>
<p>{{combo-box content=colorSchemes
filterable=true
forceEscape=true
value=colorSchemeId
icon="paint-brush"}}
{{#if colorSchemeChanged}}
@ -142,7 +143,7 @@
{{/unless}}
{{#if selectableChildThemes}}
<p>
{{combo-box filterable=true content=selectableChildThemes value=selectedChildThemeId}}
{{combo-box forceEscape=true filterable=true content=selectableChildThemes value=selectedChildThemeId}}
{{#d-button action="addChildTheme" icon="plus"}}{{i18n "admin.customize.theme.add"}}{{/d-button}}
</p>
{{/if}}

View File

@ -95,13 +95,11 @@
{{#conditional-loading-section isLoading=isLoading}}
{{admin-report
forcedModes="inline-table"
report=usersByTypeReport
lastRefreshedAt=lastRefreshedAt}}
dataSourceName="users_by_type"}}
{{admin-report
forcedModes="inline-table"
report=usersByTrustLevelReport
lastRefreshedAt=lastRefreshedAt}}
dataSourceName="users_by_trust_level"}}
{{/conditional-loading-section}}
</div>

View File

@ -285,11 +285,10 @@ export default function(options) {
hOffset = 0;
} else {
pos = me.caretPosition({
pos: completeStart,
key: options.key
pos: completeStart + 1
});
hOffset = 27;
hOffset = 10;
if (options.treatAsTextarea) vOffset = -32;
}

View File

@ -5,7 +5,7 @@ let _queue = [];
let _processing = 0;
// max number of reports which will be requested in one bulk request
const MAX_JOB_SIZE = 5;
const MAX_JOB_SIZE = 4;
// max number of concurrent bulk requests
const MAX_CONCURRENCY = 3;

View File

@ -17,12 +17,9 @@ export default MultiSelectComponent.extend({
}
if (this.get("nameProperty").indexOf("color") > -1) {
this.set(
"headerComponentOptions",
Ember.Object.create({
selectedNameComponent: "multi-select/selected-color"
})
);
this.get("headerComponentOptions").setProperties({
selectedNameComponent: "multi-select/selected-color"
});
}
},

View File

@ -31,12 +31,9 @@ export default SelectKitComponent.extend({
this.set("values", []);
}
this.set(
"headerComponentOptions",
Ember.Object.create({
selectedNameComponent: this.get("selectedNameComponent")
})
);
this.get("headerComponentOptions").setProperties({
selectedNameComponent: this.get("selectedNameComponent")
});
},
@on("didRender")

View File

@ -14,6 +14,8 @@ export default SelectKitHeaderComponent.extend({
"select-kit/templates/components/multi-select/multi-select-header",
selectedNameComponent: Ember.computed.alias("options.selectedNameComponent"),
forceEscape: Ember.computed.alias("options.forceEscape"),
ariaLabel: Ember.computed.or("computedContent.ariaLabel", "title", "names"),
title: Ember.computed.or("computedContent.title", "names"),

View File

@ -81,13 +81,22 @@ export default Ember.Component.extend(
minimum: null,
minimumLabel: null,
maximumLabel: null,
forceEscape: false,
init() {
this._super();
this.noneValue = "__none__";
this.set("headerComponentOptions", Ember.Object.create());
this.set("rowComponentOptions", Ember.Object.create());
this.set(
"headerComponentOptions",
Ember.Object.create({ forceEscape: this.get("forceEscape") })
);
this.set(
"rowComponentOptions",
Ember.Object.create({
forceEscape: this.get("forceEscape")
})
);
this.set("computedContent", []);
this.set("highlightedSelection", []);

View File

@ -14,6 +14,8 @@ export default Ember.Component.extend({
"name:data-name"
],
forceEscape: Ember.computed.alias("options.forceEscape"),
isNone: Ember.computed.none("computedContent.value"),
ariaHasPopup: true,

View File

@ -18,6 +18,8 @@ export default Ember.Component.extend(UtilsMixin, {
],
classNameBindings: ["isHighlighted", "isSelected"],
forceEscape: Ember.computed.alias("options.forceEscape"),
ariaLabel: Ember.computed.or("computedContent.ariaLabel", "title"),
@computed("computedContent.title", "name")

View File

@ -1,7 +1,11 @@
{{#each icons as |icon|}} {{d-icon icon}} {{/each}}
<span class="selected-name">
{{{label}}}
{{#if forceEscape}}
{{label}}
{{else}}
{{{label}}}
{{/if}}
</span>
{{#if shouldDisplayClearableButton}}

View File

@ -5,7 +5,11 @@
{{/if}}
<span class="selected-name" title={{title}}>
{{{label}}}
{{#if forceEscape}}
{{label}}
{{else}}
{{{label}}}
{{/if}}
</span>
{{#if computedContent.datetime}}

View File

@ -3,6 +3,7 @@
{{component selectedNameComponent
onClickSelectionItem=onClickSelectionItem
highlightedSelection=highlightedSelection
forceEscape=forceEscape
computedContent=selection}}
{{/each}}
<span class="filter choice" tabindex="-1">

View File

@ -2,7 +2,11 @@
<div class="body">
<span class="name">
{{{label}}}
{{#if forceEscape}}
{{label}}
{{else}}
{{{label}}}
{{/if}}
</span>
</div>

View File

@ -1,5 +1,9 @@
{{#each icons as |icon|}} {{d-icon icon}} {{/each}}
<span class="selected-name">
{{{label}}}
{{#if forceEscape}}
{{label}}
{{else}}
{{{label}}}
{{/if}}
</span>

View File

@ -2,5 +2,11 @@
{{{template}}}
{{else}}
{{#each icons as |icon|}} {{d-icon icon}} {{/each}}
<span class="name">{{{label}}}</span>
<span class="name">
{{#if forceEscape}}
{{label}}
{{else}}
{{{label}}}
{{/if}}
</span>
{{/if}}

View File

@ -1,5 +1,9 @@
<span class="selected-name">
{{{label}}}
{{#if forceEscape}}
{{label}}
{{else}}
{{{label}}}
{{/if}}
</span>
{{d-icon caretIcon class="caret-icon fa-fw"}}

View File

@ -7,6 +7,7 @@
//= require handlebars
//= require ember.debug
//= require ember-template-compiler
//= require qunit/qunit/qunit
//= require ember-qunit
//= require ember-shim
//= require wizard-application

View File

@ -73,6 +73,14 @@ class Admin::FlagsController < Admin::AdminController
post_action_type = PostAction.post_action_type_for_post(post.id)
if !post_action_type
render_json_error(
I18n.t("flags.errors.already_handled"),
status: 409
)
return
end
keep_post = ['silenced', 'suspended', 'keep'].include?(params[:action_on_post])
delete_post = params[:action_on_post] == "delete"
restore_post = params[:action_on_post] == "restore"

View File

@ -10,36 +10,32 @@ class DraftsController < ApplicationController
user = fetch_user_from_params
unless user == current_user
raise Discourse::InvalidAccess
end
opts = {
user: user,
offset: params[:offset],
limit: params[:limit]
}
help_key = "user_activity.no_drafts"
if user == current_user
stream = Draft.stream(opts)
stream.each do |d|
parsed_data = JSON.parse(d.data)
if parsed_data
if parsed_data['reply']
d.raw = parsed_data['reply']
end
if parsed_data['categoryId'].present? && !d.category_id.present?
d.category_id = parsed_data['categoryId']
end
stream = Draft.stream(opts)
stream.each do |d|
parsed_data = JSON.parse(d.data)
if parsed_data
if parsed_data['reply']
d.raw = parsed_data['reply']
end
if parsed_data['categoryId'].present? && !d.category_id.present?
d.category_id = parsed_data['categoryId']
end
end
help_key += ".self"
else
help_key += ".others"
end
render json: {
drafts: stream ? serialize_data(stream, DraftSerializer) : [],
no_results_help: I18n.t(help_key)
no_results_help: I18n.t("user_activity.no_drafts.self")
}
end

View File

@ -27,8 +27,8 @@ class MetadataController < ApplicationController
display: display,
orientation: 'any',
start_url: Discourse.base_uri.present? ? "#{Discourse.base_uri}/" : '.',
background_color: "##{ColorScheme.hex_for_name('secondary')}",
theme_color: "##{ColorScheme.hex_for_name('header_background')}",
background_color: "##{ColorScheme.hex_for_name('secondary', view_context.scheme_id)}",
theme_color: "##{ColorScheme.hex_for_name('header_background', view_context.scheme_id)}",
icons: [
{
src: logo,

View File

@ -72,7 +72,7 @@ class UploadsController < ApplicationController
content_type: MiniMime.lookup_by_filename(upload.original_filename)&.content_type,
}
opts[:disposition] = "inline" if params[:inline]
opts[:disposition] ||= "attachment" unless FileHelper.is_image?(upload.original_filename)
opts[:disposition] ||= "attachment" unless FileHelper.is_supported_image?(upload.original_filename)
send_file(Discourse.store.path_for(upload), opts)
else
render_404

View File

@ -362,6 +362,12 @@ module ApplicationHelper
end
end
def scheme_id
return if theme_ids.blank?
theme = Theme.find_by(id: theme_ids.first)
theme&.color_scheme_id
end
def current_homepage
current_user&.user_option&.homepage || SiteSetting.anonymous_homepage
end

View File

@ -26,7 +26,7 @@ module Jobs
# Special case: Images
# If the link is to an image, put the filename as the title
if FileHelper.is_image?(topic_link.url)
if FileHelper.is_supported_image?(topic_link.url)
uri = URI(topic_link.url)
filename = File.basename(uri.path)
crawled = (TopicLink.where(id: topic_link.id).update_all(["title = ?, crawled_at = CURRENT_TIMESTAMP", filename]) == 1)

View File

@ -1,14 +1,6 @@
class AdminDashboardNextGeneralData < AdminDashboardNextData
def reports
@reports ||= %w{
users_by_type
users_by_trust_level
}
end
def get_json
{
reports: self.class.reports(reports).compact,
updated_at: Time.zone.now.as_json
}
end

View File

@ -186,14 +186,16 @@ class ColorScheme < ActiveRecord::Base
new_color_scheme
end
def self.lookup_hex_for_name(name)
enabled_color_scheme = Theme.where(id: SiteSetting.default_theme_id).first&.color_scheme
def self.lookup_hex_for_name(name, scheme_id = nil)
enabled_color_scheme = find_by(id: scheme_id) if scheme_id
enabled_color_scheme ||= Theme.where(id: SiteSetting.default_theme_id).first&.color_scheme
(enabled_color_scheme || base).colors.find { |c| c.name == name }.try(:hex) || "nil"
end
def self.hex_for_name(name)
hex_cache[name] ||= lookup_hex_for_name(name)
hex_cache[name] == "nil" ? nil : hex_cache[name]
def self.hex_for_name(name, scheme_id = nil)
cache_key = scheme_id ? name + "_#{scheme_id}" : name
hex_cache[cache_key] ||= lookup_hex_for_name(name, scheme_id)
hex_cache[cache_key] == "nil" ? nil : hex_cache[cache_key]
end
def colors=(arr)

View File

@ -633,7 +633,7 @@ class PostAction < ActiveRecord::Base
def self.post_action_type_for_post(post_id)
post_action = PostAction.find_by(deferred_at: nil, post_id: post_id, post_action_type_id: PostActionType.notify_flag_types.values, deleted_at: nil)
PostActionType.types[post_action.post_action_type_id]
PostActionType.types[post_action.post_action_type_id] if post_action
end
def self.target_moderators

View File

@ -176,6 +176,13 @@ class Report
report.error = :timeout
end
rescue Exception => e
# ensures that if anything unexpected prevents us from
# creating a report object we fail elegantly and log an error
if !report
Rails.logger.error("Couldnt create report `#{type}`: <#{e.class} #{e.message}>")
return nil
end
report.error = :exception
# given reports can be added by plugins we dont want dashboard failures

View File

@ -3,7 +3,8 @@ class StylesheetCache < ActiveRecord::Base
MAX_TO_KEEP = 50
def self.add(target, digest, content, source_map)
def self.add(target, digest, content, source_map, max_to_keep: nil)
max_to_keep ||= MAX_TO_KEEP
old_logger = ActiveRecord::Base.logger
return false if where(target: target, digest: digest).exists?
@ -15,16 +16,19 @@ class StylesheetCache < ActiveRecord::Base
success = create(target: target, digest: digest, content: content, source_map: source_map)
count = StylesheetCache.count
if count > MAX_TO_KEEP
if count > max_to_keep
remove_lower = StylesheetCache
.where(target: target)
.limit(MAX_TO_KEEP)
.limit(max_to_keep)
.order('id desc')
.pluck(:id)
.last
DB.exec("DELETE FROM stylesheet_cache where id < :id", id: remove_lower)
DB.exec(<<~SQL, id: remove_lower, target: target)
DELETE FROM stylesheet_cache
WHERE id < :id AND target = :target
SQL
end
success

View File

@ -51,6 +51,7 @@ class Theme < ActiveRecord::Base
remove_from_cache!
clear_cached_settings!
ColorScheme.hex_cache.clear
end
after_destroy do
@ -72,6 +73,7 @@ class Theme < ActiveRecord::Base
end
Theme.expire_site_cache!
ColorScheme.hex_cache.clear
end
after_commit ->(theme) do

View File

@ -112,7 +112,7 @@ class Upload < ActiveRecord::Base
end
def fix_dimensions!
return if !FileHelper.is_image?("image.#{extension}")
return if !FileHelper.is_supported_image?("image.#{extension}")
path =
if local?
@ -219,7 +219,7 @@ class Upload < ActiveRecord::Base
upload.sha1 = Upload.generate_digest(path)
end
# optimize if image
FileHelper.optimize_image!(path) if FileHelper.is_image?(File.basename(path))
FileHelper.optimize_image!(path) if FileHelper.is_supported_image?(File.basename(path))
# store to new location & update the filesize
File.open(path) do |f|
upload.url = Discourse.store.store_upload(f, upload)

View File

@ -167,6 +167,8 @@ class SearchIndexer
class HtmlScrubber < Nokogiri::XML::SAX::Document
DIACRITICS ||= /([\u0300-\u036f]|[\u1AB0-\u1AFF]|[\u1DC0-\u1DFF]|[\u20D0-\u20FF])/
def self.strip_diacritics(str)
s = str.unicode_normalize(:nfkd)
s.gsub!(DIACRITICS, "")
@ -196,12 +198,12 @@ class SearchIndexer
attributes = Hash[*attributes.flatten]
ATTRIBUTES.each do |name|
characters(attributes[name]) if attributes[name].present?
if attributes[name].present?
characters(attributes[name]) unless name == "href" && UrlHelper.is_local(attributes[name])
end
end
end
DIACRITICS ||= /([\u0300-\u036f]|[\u1AB0-\u1AFF]|[\u1DC0-\u1DFF]|[\u20D0-\u20FF])/
def characters(str)
str = HtmlScrubber.strip_diacritics(str) if @strip_diacritics
scrubbed << " #{str} "

View File

@ -9,7 +9,7 @@
<%- if (SiteSetting.apple_touch_icon_url != "/images/default-apple-touch-icon.png") && SiteSetting.apple_touch_icon_url.present? %>
<link rel="icon" type="image/png" sizes="144x144" href="<%=SiteSetting.apple_touch_icon_url%>">
<%- end %>
<meta name="theme-color" content="#<%= ColorScheme.hex_for_name('header_background') %>">
<meta name="theme-color" content="#<%= ColorScheme.hex_for_name('header_background', scheme_id) %>">
<% if mobile_view? %>
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<% else %>

View File

@ -2,9 +2,7 @@
<html>
<head>
<title>QUnit Test Runner</title>
<%= stylesheet_link_tag "qunit" %>
<%= stylesheet_link_tag "test_helper" %>
<%= javascript_include_tag "qunit" %>
<%= javascript_include_tag "test_helper" %>
<%= csrf_meta_tags %>
</head>

View File

@ -2,10 +2,8 @@
<html>
<head>
<title>QUnit Test Runner</title>
<%= stylesheet_link_tag "qunit" %>
<%= stylesheet_link_tag "test_helper" %>
<%= discourse_stylesheet_link_tag :wizard, theme_ids: nil %>
<%= javascript_include_tag "qunit" %>
<%= javascript_include_tag "wizard/test/test_helper" %>
<%= csrf_meta_tags %>
<script src="<%= ExtraLocalesController.url("wizard") %>"></script>

View File

@ -543,7 +543,7 @@ ar:
categories:
all: "كل الأقسام"
no_subcategory: "لا شيء"
category: "قسم"
category: "تصنيف"
category_list: "أعرض قائمة الأقسام"
reorder:
title: "إعادة ترتيب الأقسام"
@ -613,6 +613,7 @@ ar:
notifications: "الإشعارات"
statistics: "الأحصائيات"
desktop_notifications:
label: "الإشعارات الحية"
not_supported: "نأسف، لا يدعم المتصفّح الإشعارات."
perm_default: "فعّل الإشعارات"
perm_denied_btn: "رُفض التّصريح"
@ -824,7 +825,7 @@ ar:
email_private_messages: "أرسل إلي رسالة إلكترونية عندما يبعث أحدهم رسالة إلي"
email_always: "أرسل إلي الاشعارات عبر البريد حتى ولو كنت متّصلًا"
other_settings: "أخرى"
categories_settings: "الأقسام"
categories_settings: "التصنيفات"
new_topic_duration:
label: "اعتبر الموضوعات جديدة لو"
not_viewed: "لم أطالعها بعد"
@ -952,6 +953,7 @@ ar:
most_liked_users: "أكثر من أعجبه"
most_replied_to_users: "أكثر من رد عليه"
no_likes: "لا يوجد إعجابات بعد."
top_categories: "أفضل التصنيفات"
ip_address:
title: "عنوان IP الأخير"
registration_ip_address:
@ -1733,7 +1735,7 @@ ar:
title: 'دعوة'
username_placeholder: "اسم المستخدم"
action: 'أرسل دعوة'
help: 'ادعُ الغير إلى هذا الموضوع عبر البريد الإلكترونيّ أو الإشعارات'
help: 'دعوة الآخرين إلى هذا الموضوع عبر البريد الإلكتروني أو الإشعارات'
to_forum: "سنُرسل بريد إلكترني يتيح لصديقك الانضمام مباشرةً بنقر رابط فيه، تسجيل الدخول غير مطلوب."
sso_enabled: "أدخل اسم مَن تريد دعوته إلى هذا الموضوع."
to_topic_blank: "أدخل اسم او عنوان بريد الشخص الذي تريد دعوته إلى هذا الموضوع."
@ -1885,7 +1887,7 @@ ar:
attachment_download_requires_login: "عذرا، عليك تسجيل الدخول لتحميل المرفقات."
abandon:
confirm: "أمتأكد من التخلي عن المنشور؟"
no_value: "لا، أبقها"
no_value: "لا، أبقه"
yes_value: "نعم، لا أريده"
via_email: "وصل هذا المنشور عبر البريد"
via_auto_generated_email: "وصل هذا المنشور عبر بريد مولّد آلياً"
@ -2087,7 +2089,7 @@ ar:
all: 'كل الأقسام'
edit: 'تعديل'
edit_long: "تعديل"
view: 'أظهار الموضوعات في القسم'
view: 'أظهار المواضيع في القسم'
general: 'عام'
settings: 'اعدادات'
topic_template: "إطار الموضوع"
@ -2097,9 +2099,9 @@ ar:
tags_placeholder: "(اختياري) قائمة الأوسمة المسموح بها"
tag_groups_placeholder: "(اختياريّ) قائمة مجموعات الأوسمة المسموح بها"
topic_featured_link_allowed: "اسمح بالروابط المُميزة بهذا القسم."
delete: 'احذف القسم'
create: 'قسم جديد'
create_long: 'أنشئ قسم جديد'
delete: 'احذف التصنيف'
create: 'تصنيف جديد'
create_long: 'أنشئ تصنيف جديد'
save: 'احفظ القسم'
slug: 'عنوان القسم في الURL'
slug_placeholder: '(اختياريّ) كلمات مفصولة-بشرطة للعنوان'
@ -2115,8 +2117,8 @@ ar:
foreground_color: "لون المقدمة"
name_placeholder: "كلمة أو كلمتين على الأكثر"
color_placeholder: "أيّ لون متوافق مع الانترنت"
delete_confirm: "هل تريد فعلاً حذف هذا القسم؟"
delete_error: "حدث خطأ في حذف القسم."
delete_confirm: "هل تريد فعلاً حذف هذا تصنيف؟"
delete_error: "حدث خطأ أثناء حذف هذا التصنيف"
list: "عرض الأقسام"
no_description: "من فضلك أضف وصفا لهذا القسم."
change_in_category_topic: "عدّل الوصف"

View File

@ -162,6 +162,7 @@ de:
ap_southeast_1: "Asien-Pazifik (Singapur)"
ap_southeast_2: "Asien-Pazifik (Sydney)"
cn_north_1: "China (Peking)"
cn_northwest_1: "China (Ningxia)"
eu_central_1: "EU (Frankfurt)"
eu_west_1: "EU (Irland)"
eu_west_2: "EU (London)"
@ -520,7 +521,7 @@ de:
topic_stat_sentence:
one: "%{count} neues Thema seit 1 %{unit}."
other: "%{count} neue Themen seit 1 %{unit}."
more: "(%{count}mehr) …"
more: " (%{count} weitere) …"
ip_lookup:
title: IP-Adressen-Abfrage
hostname: Hostname

View File

@ -162,6 +162,7 @@ fi:
ap_southeast_1: "Aasia ja Tyynimeri (Singapore)"
ap_southeast_2: "Aasia ja Tyynimeri (Sydney)"
cn_north_1: "Kiina (Peking)"
cn_northwest_1: "Kiina (Ningxia)"
eu_central_1: "EU (Frankfurt)"
eu_west_1: "EU (Irlanti)"
eu_west_2: "EU (Lontoo)"
@ -196,6 +197,7 @@ fi:
privacy_policy: "Tietosuojaseloste"
privacy: "Tietosuoja"
tos: "Käyttöehdot"
rules: "Säännöt"
mobile_view: "Mobiilinäkymä"
desktop_view: "Työpöytänäkymä"
you: "Sinä"
@ -536,6 +538,7 @@ fi:
post_count: "# viestiä"
confirm_delete_other_accounts: "Oletko varma, että haluat poistaa nämä tunnukset?"
powered_by: "voimanlähteenä <a href='https://ipinfo.io'>1ipinfo.io</a>"
copied: "kopioitu"
user_fields:
none: "(valitse vaihtoehto)"
user:
@ -639,6 +642,7 @@ fi:
revoke_access: "Peru käyttöoikeus"
undo_revoke_access: "Peru käyttöoikeuden peruminen"
api_approved: "Sallittu:"
api_last_used_at: "Viimeksi käytetty:"
theme: "Teema"
home: "Oletusnäkymä"
staged: "Esikäyttäjä"
@ -777,6 +781,18 @@ fi:
any: "mikä tahansa"
password_confirmation:
title: "Salasana uudelleen"
auth_tokens:
title: "Viimeksi käytetyt laitteet"
title_logs: "Todennusloki"
ip_address: "IP-osoite"
created: "Luotu"
first_seen: "Ensimmäinen vierailu"
last_seen: "Viimeisin vierailu"
operating_system: "Käyttöjärjestelmä"
location: "Paikka"
action: "Toimi"
login: "Kirjaudu sisään"
logout: "Kirjaudu ulos kaikkialta"
last_posted: "Viimeisin viesti"
last_emailed: "Viimeksi lähetetty sähköpostitse"
last_seen: "Nähty"
@ -1008,6 +1024,8 @@ fi:
hide_session: "Muistuta huomenna"
hide_forever: "ei kiitos"
hidden_for_session: "OK, kysyn huomenna uudestaan. Voit aina myös käyttää 'Kirjaudu sisään' -linkkiä luodaksesi tilin."
intro: "Hei! Vaikuttaa siltä, että olet pitänyt keskusteluista, muttet ole luonut käyttäjätiliä."
value_prop: "Kun luot tilin, muistamme mitä olet lukenut, jotta voit aina palata keskusteluissa takaisin oikeaan kohtaan. Saat myös ilmoituksia - palstalla näkyviä ja sähköpostiisi saapuvia - kun joku vastaa sinulle. Ja voit myös tykätä viesteistä. :heartbeat:"
summary:
enabled_description: "Tarkastelet tiivistelmää tästä ketjusta, sen mielenkiintoisimpia viestejä käyttäjien toiminnan perusteella."
description: "Vastauksia on <b>{{replyCount}}</b> kpl."
@ -1021,6 +1039,8 @@ fi:
disable: "Näytä poistetut viestit"
private_message_info:
title: "Viesti"
invite: "Kutsu muita..."
edit: "Lisää tai poista..."
leave_message: "Haluatko varmasti poistua yksityiskeskustelusta?"
remove_allowed_user: "Haluatko varmasti poistaa käyttäjän {{name}} tästä keskustelusta?"
remove_allowed_group: "Haluatko varmasti poistaa käyttäjän {{name}} tästä viestiketjusta?"
@ -1156,6 +1176,7 @@ fi:
default_header_text: Valitse...
no_content: Ei osumia
filter_placeholder: Hae...
filter_placeholder_with_any: Etsi tai luo...
create: "Luo: '{{content}}'"
max_content_reached:
one: "Voit valita vain {{count}} kohteen."
@ -1305,6 +1326,9 @@ fi:
shared_draft:
label: "Jaettu luonnos"
desc: "Luonnostele ketju, joka näkyy vain henkilökunnalle"
toggle_topic_bump:
label: "Ketjun nosto päälle/pois"
desc: "Vastaa muuttamatta ketjun päiväysleimaa"
notifications:
tooltip:
regular:
@ -1609,7 +1633,7 @@ fi:
auto_close: "Ketju suljetaan ajastetusti %{timeLeft}."
auto_publish_to_category: "Ketju julkaistaan alueella <a href=%{categoryUrl}>#%{categoryName}</a> %{timeLeft}."
auto_close_based_on_last_post: "Ketju sulkeutuu %{duration} kuluttua viimeisimmästä viestistä."
auto_delete: "Ketju poistetaan ajastetusti %{timeLeft} kuluttua."
auto_delete: "Ketju poistetaan ajastetusti %{timeLeft}."
auto_reminder: "Sinua muistutetaan tästä ketjusta %{timeLeft}."
auto_close_title: 'Automaattisen sulkemisen asetukset'
auto_close_immediate:
@ -1692,6 +1716,7 @@ fi:
reset_read: "Poista tieto lukemisista"
make_public: "Tee ketjusta julkinen"
make_private: "Muuta yksityiskeskusteluksi"
reset_bump_date: "Palauta ketjun päiväysleima"
feature:
pin: "Kiinnitä ketju"
unpin: "Poista ketjun kiinnitys"
@ -2569,6 +2594,7 @@ fi:
disabled: Pois käytöstä
timeout_error: Kyselyssä kestää liian kauan. Valitse lyhyempi ajanjakso.
exception_error: "Pahoittelut, kyselyä tehtäessä tapahtui virhe"
too_many_requests: Olet tehnyt näin liian monta kertaa. Odota ennen kuin yrität uudelleen.
reports:
trend_title: "%{percent} muutos. Nyt %{current}, viime jaksossa %{prev}."
today: "Tänään"
@ -2935,9 +2961,16 @@ fi:
revert: "Peru muutokset"
revert_confirm: "Haluatko varmasti peruuttaa muutokset?"
theme:
theme: "Teema"
component: "Osa"
components: "Osat"
import_theme: "Tuo teema"
customize_desc: "Mukauta:"
title: "Teemat"
modal_title: "Luo teema"
create: "Luo"
create_type: "Tyyppi:"
create_name: "Nimi:"
long_title: "Muuta sivustosi värejä, CSS:ää ja HTML-sisältöä"
edit: "Muokkaa"
edit_confirm: "Tämä on ulkoinen teema. Jos muokkaat CSS:ää tai HTML:ää, muutokset kumoutuvat kun päivität teeman."
@ -2952,6 +2985,10 @@ fi:
color_scheme_select: "Valitse teemalle värit"
custom_sections: "Mukautetut osiot:"
theme_components: "Teeman osat"
switch_component: "Muuta teemaksi"
switch_component_alert: "Oletko varma että haluat muuttaa teeman osan teemaksi. Siitä tulee itsenäinen teema ja se ei ole enää tytärteema millekään teemalle."
switch_theme: "Muuta teeman osaksi"
switch_theme_alert: "Oletko varma, että haluat muuttaa teeman teeman osaksi? Tällöin se ei ole enää emoteema millekään teeman osalle."
uploads: "Lataukset"
no_uploads: "Voit ladata teemaasi liitteitä kuten fontteja ja kuvia"
add_upload: "Lisää tiedosto"
@ -2974,6 +3011,7 @@ fi:
public_key: "Anna repositorioon pääsy seuraavalle julkiselle avaimelle:"
about_theme: "Tietoa teemasta"
license: "Lisenssi"
component_of: "Teemojen osa:"
update_to_latest: "Päivitä tuoreimpaan"
check_for_updates: "Hae päivityksiä"
updating: "Päivitetään..."
@ -2981,9 +3019,11 @@ fi:
add: "Lisää"
theme_settings: "Teeman asetukset"
no_settings: "Teemalla ei ole asetuksia."
empty: "Ei mitään"
commits_behind:
one: "Teema on yhden muutoksen perässä!"
other: "Teema on {{count}} muutosta perässä!"
compare_commits: "(Näytä uudet muutokset)"
scss:
text: "CSS"
title: "Lisää mukautettua CSS:ää, hyväksymme käyvät CSS- ja SCSS-tyylit"

View File

@ -1044,6 +1044,8 @@ pl_PL:
hide_session: "Przypomnij mi jutro"
hide_forever: "nie, dziękuję"
hidden_for_session: "Ok, zapytamy jutro. Pamiętaj, że konto możesz w każdej chwili założyć klikając na 'Logowanie'."
intro: "Hej! Wygląda na to, że zainteresowała Cię ta dyskusja, ale nie posiadasz jeszcze konta."
value_prop: "Jeśli założysz konto, będziemy pamiętać dokładnie to, co przeczytałeś, więc zawsze wrócisz tam, gdzie ostatnio opuściłeś temat. Otrzymasz również powiadomienia, tutaj i za pośrednictwem poczty email, gdy ktoś Ci odpowie. Możesz również polubić posty, aby dzielić się miłością. :heartpulse:"
summary:
enabled_description: "Przeglądasz podsumowanie tego tematu: widoczne są jedynie najbardziej wartościowe wpisy zdaniem uczestników. "
description: "Jest <b>{{replyCount}}</b> odpowiedzi."

View File

@ -256,14 +256,14 @@ pt_BR:
new_private_message: "Novo rascunho de mensagem privada"
topic_reply: "Resposta preliminar"
topic_count_latest:
one: "Veja {{conta}} tópicos novos ou atualizados"
other: "Veja {{conta}} tópicos novos ou atualizados"
one: "Veja {{count}} tópicos novos ou atualizados"
other: "Veja {{count}} tópicos novos ou atualizados"
topic_count_unread:
one: "Veja {{conta}} tópicos não lidos."
other: "Veja {{conta}} tópicos não lidos."
one: "Veja {{count}} tópicos não lidos."
other: "Veja {{count}} tópicos não lidos."
topic_count_new:
one: "Veja {{conta}} novos tópicos."
other: "Veja {{conta}} novos tópicos."
one: "Veja {{count}} novos tópicos."
other: "Veja {{count}} novos tópicos."
preview: "pré-visualização"
cancel: "cancelar"
save: "Salvar mudanças"

View File

@ -1044,8 +1044,6 @@ ar:
s3_cdn_url: "URL لـCDN يستخدم لكل أصول s3 (مثال: https://cdn.somewhere.com). تحذير : بعد تغيير هذا الإعداد يجب عمل rebake لكل المشاركات القديمة."
avatar_sizes: "قائمة أحجام الرمزية إنشاؤه تلقائيا."
external_system_avatars_enabled: "استخدم خدمات الهه النظام الخارجي "
default_opengraph_image_url: "عنوان رابط صورة ال اوبن جراف الثابتة"
twitter_summary_large_image_url: "عنوان الURL للصورة الافتراضية لكارت الملخص علي تويتر ( يجب ان تكون علي الاقل بعرض 280 بكسل و ارتفاع 150 بكسل )"
allow_all_attachments_for_group_messages: "اسمح بجميع ملحقات البريد للرسائل الجماعيه "
enable_flash_video_onebox: "فعّل تضمين روابط swf وflv (أدوبي فلاش) في لوحات المعاينة. تحذير: قد يتسبّب بمخاطر أمنيّة."
default_invitee_trust_level: "مستوى الثقة الإفتراضي (0-4) للأعضاء المدعوين."
@ -1194,7 +1192,6 @@ ar:
slug_generation_method: "اختر طريقه توليد سبيكه . 'مشفره' سوف تقوم بتوليد سلسله مئويه مشفره.'لاشي' سوف يعطل السبيكه"
enable_emoji: "فعّل الإيموجي"
emoji_set: "كيف تريد أن تبدو الإيموجي؟"
enforce_square_emoji: "أجبِر النّسبة الباعيّة لكلّ الإيموجي لتكون مربّعة."
approve_post_count: "عدد المنشورات للمستخدم الجديد او الاساسي يجب ان تتم الموافقه عليه "
approve_unless_trust_level: "مشاركات للأعضاء أدنى من مستوى الثقة هذا يجب أن تتم الموافقة عليها."
default_email_direct: "ارسل بريد الكتروني عندما يقوم احدهم بالرد/الاقتباس الي/ذكر او دعوه مستخدم افتراضيا"

View File

@ -837,7 +837,6 @@ bg:
slug_generation_method: "Изберете метод за генериране на URL. 'кодирано' ще използва букви URL, кодирани с проценти. 'не' ще откаже генерацията като цяло."
enable_emoji: "Разреши емотикони"
emoji_set: "Как бихте искали да е вашата емотикона?"
enforce_square_emoji: "Направи квадратни всички емотикони."
approve_unless_trust_level: "Постовете на потребители с по-ниско от това ниво на доверие трябва да бъдат одобрени"
default_email_direct: "Изпращай имейл по подразбиране, когато някой цитира, отговаря на публикацията или споменава името на потребителя."
default_email_mailing_list_mode: "Изпращай ми имейл по подразбиране за всяка нова публикация."

View File

@ -926,8 +926,6 @@ ca:
avatar_sizes: "Llista de mides d'avatar generades automàticament."
external_system_avatars_enabled: "Fes servir un servei extern de sistema d'avatars."
external_system_avatars_url: "Adreça URL del sitema extern de servei d'avatars. Les substitucions permeses són {username} {first_letter} {color} {size}"
default_opengraph_image_url: "Adreça URL del protocol opengraph d'imatge per defecte."
twitter_summary_large_image_url: "Adreça URL del resum de la targeta d'imatge per defecte de Twitter (hauria de fer almenys 280px d'amplada i com a míimim 150px d'alçada)."
allow_all_attachments_for_group_messages: "Permet tots els adjunts de correu per a missatges de grup."
enable_flash_video_onebox: "Habilita la incrustació d'enllaços swf i flv (Adobe Flash) emmarcats. ATENCIÓ: això pot comportar riscos de seguretat."
default_invitee_trust_level: "Nivell de confiança per defecte (0-4) per a persones convidades."
@ -1119,7 +1117,6 @@ ca:
slug_generation_method: "Tria un mètode de generació d'adreces amigables. 'encoded' generarà un percentatge de codificació. 'none' anul·larà totalment l'adreça amigable."
enable_emoji: "Activa emojo"
emoji_set: "Com t'agradaria el teu emoji?"
enforce_square_emoji: "Força una relació d'aspecte quadrat per a tots els emojis."
approve_post_count: "Cal aprovar la quantitat de publicacions d'una persona usuària nova o bàsica"
approve_unless_trust_level: "Cal aprovar les publicacions per a persones usuàries amb aquest nivell de confiança"
approve_new_topics_unless_trust_level: "Cal aprovar els nous temes per a persones amb aquest nivell de confiança"

View File

@ -870,7 +870,6 @@ da:
max_flags_per_day: "Maksimalt antal flagmarkeringer per bruger per dag."
clean_orphan_uploads_grace_period_hours: "Grace-periode (i timer) før et forældreløst upload bliver fjernet."
purge_deleted_uploads_grace_period_days: "Grace-periode (i dage) før et slettet upload bliver fjernet."
twitter_summary_large_image_url: "URL til standard Twitter Summary Card billede (skal være mindst 280px i bredden og mindst 150px i højden)."
tl1_requires_topics_entered: "Hvor mange emner en ny bruger skal læse før vedkommende forfremmes til tillidsniveau 1."
tl1_requires_read_posts: "Hvor mange indlæg en ny bruger skal læse før vedkommende forfremmes til tillidsniveau 1."
tl1_requires_time_spent_mins: "Hvor mange minutter en ny bruger skal læse indlæg før vedkommende forfremmes til tillidsniveau 1."

View File

@ -702,7 +702,6 @@ de:
others: "Keine Antworten."
no_drafts:
self: "Du hast keine Entwürfe; beginne eine Antwort in einem beliebigen Thema und es wird automatisch als neuer Entwurf gespeichert."
others: "Du hast keine Berechtigung die Entwürfe dieses Benutzers zu sehen."
topic_flag_types:
spam:
title: 'Spam'
@ -763,6 +762,9 @@ de:
session_info: "Informationen zur Benutzersitzung lesen"
read: "Alles lesen"
write: "Alles schreiben"
flags:
errors:
already_handled: "Die Meldung wurde bereits bearbeitet"
reports:
default:
labels:
@ -1503,7 +1505,6 @@ de:
enable_emoji: "Aktiviere emoji"
enable_emoji_shortcuts: "Geläufige Text-Smileys wie :) :p :( werden in Emojis umgewandelt"
emoji_set: "Welche Emoji sollen es sein?"
enforce_square_emoji: "Emojis immer mit quadratischem Seitenverhältnis darstellen."
emoji_autocomplete_min_chars: "Erforderliche Minimalanzahl von Zeichen, um das Popup zur Emoji-Autovervollständigung zu öffnen."
approve_post_count: "Anzahl der Beiträge eines neuen Benutzer oder Anwärters, die genehmigt werden müssen"
approve_unless_trust_level: "Beiträge von Benutzer unterhalb dieser Vertrauensstufe müssen genehmigt werden"

View File

@ -1015,8 +1015,6 @@ el:
avatar_sizes: "Κατάλογος από αυτόματα δημιουργημένα μεγέθη άβαταρ."
external_system_avatars_enabled: "Χρησιμοποιήσε εξωτερική υπηρεσία για avatars."
external_system_avatars_url: "URL της εξωτερικής υπηρεσίας avatars. Επιτρεπτές αντικαταστάσεις είναι {username} {first_letter} {color} {size}"
default_opengraph_image_url: "Η διεύθυνση URL της προεπιλεγμένης εικόνας opengraph."
twitter_summary_large_image_url: "Η διεύθυνση URL της εικόνας της προκαθορισμένης συνοπτικής κάρτας του Twitter (θα πρέπει να είναι τουλάχιστον 280px σε πλάτος, και τουλάχιστον 150px σε ύψος)."
allow_all_attachments_for_group_messages: "Επιτρέπονται όλοι οι τύποι συνημμένων αρχείων σε ομαδικά μηνύματα."
png_to_jpg_quality: "Ποιότητα των αποθηκευμένων αρχείων JPG (1 χαμηλή ποιότητα, 99 μέγιστη ποιότητα, 100 για απενεργοποίηση)."
allow_staff_to_upload_any_file_in_pm: "Επίτρεψε στο προσωπικό να ανεβάζει οποιοδήποτε τύπο αρχείου στα πμ"
@ -1224,7 +1222,6 @@ el:
slug_generation_method: "Επιλέξτε μια μέθοδο παραγωγής slug. «Κωδικοποιημένη» θα δημιουργήσει μια συμβολοσειρά για ποσοστιαία κωδικοποίηση. «Κανένα» θα απενεργοποιήσει τα slug."
enable_emoji: "Ενεργοποίηση emoji"
emoji_set: "Πως θα ήθελες το emoji σου;"
enforce_square_emoji: "Αναγκαστική εφαρμογή τετράγωνων διαστάσεων σε όλα τα emoji."
approve_post_count: "Ο όγκος των αναρτήσεων ενός καινούριου ή βασικού χρήστη που θα πρέπει να εγκριθεί."
approve_unless_trust_level: "Οι αναρτήσεις για χρήστες κάτω από αυτό το επίπεδο εμπιστοσύνης πρέπει να εγκριθούν"
approve_new_topics_unless_trust_level: "Τα καινούρια νήματα για χρήστες κάτω από αυτό το επίπεδο εμπιστοσύνης πρέπει να εγκριθούν."

View File

@ -796,7 +796,6 @@ en:
others: "No replies."
no_drafts:
self: "You have no drafts; begin composing a reply in any topic and it will be auto-saved as a new draft."
others: "You do not have permission to see drafts for this user."
topic_flag_types:
spam:
@ -864,6 +863,9 @@ en:
read: "Read all"
write: "Write all"
flags:
errors:
already_handled: "Flag was already handled"
reports:
default:
labels:
@ -1726,7 +1728,6 @@ en:
enable_emoji: "Enable emoji"
enable_emoji_shortcuts: "Common smiley text such as :) :p :( will be converted to emojis"
emoji_set: "How would you like your emoji?"
enforce_square_emoji: "Force a square aspect ratio to all emojis."
emoji_autocomplete_min_chars: "Minimum number of characters required to trigger autocomplete emoji popup"
approve_post_count: "The amount of posts from a new or basic user that must be approved"

View File

@ -722,7 +722,6 @@ es:
others: "Sin respuestas."
no_drafts:
self: "No tienes ningún borrador; empieza a escribir una respuesta en cualquier tema y se guardará automáticamente como nuevo borrador."
others: "No tienes permisos para ver los borradores de este usuario."
topic_flag_types:
spam:
title: 'Spam'
@ -1522,7 +1521,6 @@ es:
enable_emoji: "Habilitar emoji"
enable_emoji_shortcuts: "Texto común de emoticones como :) :p :( serán convertidos a emojis"
emoji_set: "¿De qué tipo os gustan los emoji?"
enforce_square_emoji: "Forzar una relación de aspecto cuadrada para todos los emojis."
emoji_autocomplete_min_chars: "Número mínimo de caracteres necesarios para que aparezca el diálogo de selección de emoji"
approve_post_count: "La cantidad de posts que deben ser aprobados de usuarios nuevos o de nivel básico"
approve_unless_trust_level: "Los posts de usuarios con un nivel de confianza inferior a este deberán ser aprobados"

View File

@ -977,8 +977,6 @@ fa_IR:
avatar_sizes: "لیست اندازه‌های آواتار که به صورت خودکار تولید شده است."
external_system_avatars_enabled: "استفاده از سرویس آواتار خارجی."
external_system_avatars_url: "لینک سرویس آواتار خارجی. تغییرات مجاز {username} {first_letter} {color} {size} هستند"
default_opengraph_image_url: "لینک تصویر پیشفرض اپن‌گراف"
twitter_summary_large_image_url: "لینک پیشفرض خلاصه توییتر و تصویر (باید حداقل 280 در 150 پیکسل باشد)"
allow_all_attachments_for_group_messages: "اجازه‌ی ضمیمه فایل در ایمیل پیام‌های گروهی."
png_to_jpg_quality: "کیفیت تبدیل فایل‌های JPG (1 کمترین کیفیت، 99 بالاترین کیفیت، 100 برای غیر‌فعال)"
allow_staff_to_upload_any_file_in_pm: "به مدیران اجازه بده که هر فایلی در پیغام خصوصی آپلود کنند."
@ -1177,7 +1175,6 @@ fa_IR:
slug_generation_method: "یک روش ایجاد نام یکتا انتخاب کنید. 'encoded' رشته‌ای شامل درصد ایجاد می‌کند. 'none' اسم یکتا را به صورت کلی غیر‌فعال می‌نماید."
enable_emoji: "فعالسازی شکلک"
emoji_set: "می‌خواهید شکلک شما چطور باشد؟"
enforce_square_emoji: "تحمیل نسبت ابعاد مربع به تمام شکلک‌ها. "
approve_post_count: "تعداد نوشته‌های کاربر جدید که باید تایید شود."
approve_unless_trust_level: "نوشته‌ها برای کاربران پایین تر از این سطح اعتماد نیاز به تایید دارد. "
approve_new_topics_unless_trust_level: "موضوعات جدید برای کاربرانی با کمتر از این سطح اعتماد باید تایید شود"

View File

@ -629,6 +629,17 @@ fi:
email_login:
invalid_token: "Pahoittelut, tämä sisäänkirjautumislinkki on liian vanha. Paina 'Kirjaudu sisään' nappia ja valitse 'Unohdin salasanani' saadaksesi uuden linkin."
title: "Sähköpostikirjautuminen"
user_auth_tokens:
devices:
android: 'Android-laite'
linux: 'Linux-tietokone'
windows: 'Windows-tietokone'
mac: 'Mac'
iphone: 'iPhone'
ipad: 'iPad'
ipod: 'iPod'
mobile: 'Mobiililaite'
unknown: 'Tuntematon laite'
change_email:
confirmed: "Sähköpostiosoite päivitetty."
please_continue: "Jatka sivustolle %{site_name}"
@ -712,7 +723,6 @@ fi:
others: "Ei vastauksia."
no_drafts:
self: "Sinulla ei ole luonnoksia. Aloita kirjoittamaan viestiä mihin tahansa ketjuun niin se tallentuu automaattiseksi uudeksi luonnokseksi."
others: "Et voi nähdä tämän käyttäjän luonnoksia."
topic_flag_types:
spam:
title: 'Roskaposti'
@ -1128,6 +1138,7 @@ fi:
maximum_session_age: "Käyttäjä pysyy sisäänkirjautuneena n tuntia vierailunsa jälkeen"
ga_universal_tracking_code: "Google Universal analytics (analytics.js) seurantakoodi, esim.: UA-12345678-9; katso http://google.com/analytics"
ga_universal_domain_name: "Google Universal analytics (analytics.js) verkkotunnus, esim.: osoite.fi; katso http://google.com/analytics"
ga_universal_auto_link_domains: "Ota käyttöön verkkotunnusten välinen seurantapalvelu Google Universal Analytics (analytics.js). Poisvieviin näiden verkkotunnusten linkkeihin lisätään client id -tunniste. Katso lisää Googlen Cross-Domain Tracking -oppaasta."
gtm_container_id: "Google Tag Manager -säiliön ID. Esim: GTM-ABCDEF"
enable_escaped_fragments: "Käytä Googlen Ajax-sivustoille tarkoitettua API:a, jos webcrawleria ei tunnisteta. Katso https://developers.google.com/webmasters/ajax-crawling/docs/learn-more"
allow_moderators_to_create_categories: "Salli valvojien luoda uusia alueita"
@ -1263,8 +1274,6 @@ fi:
external_system_avatars_url: "Ulkoisen avatarpalvelun URL. Sallitut vaihdokset ovat {username} {first_letter} {color} {size}"
selectable_avatars_enabled: "Pakota käyttäjä valitsemaan avatarinsa listalta."
selectable_avatars: "Avatarit, joista käyttäjä voi valita."
default_opengraph_image_url: "Oletuksena käytettävän opengraph-kuvan URL."
twitter_summary_large_image_url: "Oletuksena käytettävän Twitter-tiivistelmäkortin kuva (tulisi olla leveydeltään ainakin 280 px leveä ja 150 px korkea)."
allow_all_attachments_for_group_messages: "Salli kaikki sähköpostiliitteet ryhmäviesteissä."
png_to_jpg_quality: "Muunnetun JPG-tiedoston laatu (1 on huonoin laatu, 99 on paras laatu, 100 ottaa pois käytöstä)."
allow_staff_to_upload_any_file_in_pm: "Salli henkilökunnan ladata minkätyyppisiä liitteitä tahansa yksityisviesteihin."
@ -1492,7 +1501,6 @@ fi:
slug_generation_method: "Valitse polkulyhenteen luomisen metodi. 'encoded' käyttää prosenttikoodausta, 'none' poistaa polkulyhenteet käytöstä."
enable_emoji: "Ota emoji käyttöön"
emoji_set: "Millaiset emojit haluat?"
enforce_square_emoji: "Pakota neliö kuvasuhteeksi kaikille emojille."
approve_post_count: "Viestien lukumäärä, joka tarkastetaan uusilta käyttäjiltä ja haastajilta."
approve_unless_trust_level: "Tätä luottamustasoa alhaisempien käyttäjien viestit tarkastetaan"
approve_new_topics_unless_trust_level: "Tätä luottamustasoa alhaisempien käyttäjien aloittamat ketjut tarkastetaan"

View File

@ -722,7 +722,6 @@ fr:
others: "Aucune réponse."
no_drafts:
self: "Vous n'avez pas d'ébauche; commencez à répondre à un sujet et la réponse sera automatiquement sauvegardée comme nouvelle ébauche."
others: "Vous n'avez pas la permission de consulter les ébauches de cet utilisateur."
topic_flag_types:
spam:
title: 'Spam'
@ -1523,7 +1522,6 @@ fr:
enable_emoji: "Activer les emojis"
enable_emoji_shortcuts: "Les textes de smiley courants :) :p :( seront convertis en emojis"
emoji_set: "Comment aimeriez-vous vos emoji ?"
enforce_square_emoji: "Forcer tous les Emojis à être carrés."
emoji_autocomplete_min_chars: "Nombre minimum de caractères nécessaires pour invoquer la fenêtre contextuelle d'emoji"
approve_post_count: "Le nombre de messages d'un utilisateur nouveau ou basique devant être approuvés"
approve_unless_trust_level: "Les messages des utilisateurs qui n'ont pas atteint ce niveau de confiance doivent être approuvés"

View File

@ -1061,8 +1061,6 @@ he:
avatar_sizes: "רשימה של גדלי דמויות שנוצרת אוטומטית."
external_system_avatars_enabled: "שימוש בשירות של מערכת אווטארים חיצונית."
external_system_avatars_url: "כתובת של שירות דמויות חיצוני. החלפות מותרות הן {username} {first_letter} {color} {size}"
default_opengraph_image_url: "URL ברירת המחדל של תמונת opengraph."
twitter_summary_large_image_url: "URL של תמונה מסיכום ברירת המחדל מטוויטר (צריכה להיות ברוחב לפחות 280 פיקסלים ובגובה של לפחות 150 פיקסלים)."
allow_all_attachments_for_group_messages: "אפשרו צירוף קבצים להודעות לקבוצות."
png_to_jpg_quality: "האיכות של קובץ JPG שמומר (1 הנמוכה ביותר, 99 הטובה ביותר, 100 לניטרול)."
allow_staff_to_upload_any_file_in_pm: "אפשרו לחברי צוות להעלות כל קובץ בהודעה פרטית."
@ -1261,7 +1259,6 @@ he:
slug_generation_method: "בחרו צורת ייצור slug. צורה של 'encoded' תגרום למחרוזות עם קידוד אחוזים. 'none' ינטרל slug לחלוטין."
enable_emoji: "הפעלת emoji"
emoji_set: "איך אתם אוהבים את ה-emoji שלכם?"
enforce_square_emoji: "חובת מימדים ריבועיים בכל ה-emojis."
approve_post_count: "מספר הפוסטים ממשתמשים חדשים או בסיסיים שחייבים לאשר אותם"
approve_unless_trust_level: "פוסטים של משתמשים מתחת לרמת אמון זו חייבים לעבור אישור"
approve_new_topics_unless_trust_level: "נושאים חדשים עבור משתמשים מתחת לרמת אמון זו חייבים להיות מאושרים"

View File

@ -1181,8 +1181,6 @@ it:
avatar_sizes: "Elenco delle dimensioni degli avatar, generate automaticamente."
external_system_avatars_enabled: "Utilizza un servizio esterno per gli avatar."
external_system_avatars_url: "URL del servizio esterno di avatar. Le sostituzioni consentite sono {username} {first_letter} {color} {size}"
default_opengraph_image_url: "URL dell'immagine di default opengraph."
twitter_summary_large_image_url: "URL dell'immagine di default della scheda di riepilogo di Twitter (dovrebbe essere almeno 280px in larghezza e almeno 150px in altezza)."
allow_all_attachments_for_group_messages: "Consenti tutti gli allegati sulle email per i messaggi di gruppo."
png_to_jpg_quality: "Qualità del file JPG convertito (1 è la qualità più bassa, 99 è la qualità migliore, 100 per disabilitare)."
allow_staff_to_upload_any_file_in_pm: "Consenti ai membri delle staff di caricare qualsiasi file nei PM."
@ -1394,7 +1392,6 @@ it:
enable_emoji: "Attiva gli emoji"
enable_emoji_shortcuts: "Smiley comuni come :) :p :( verranno convertiti in emoji"
emoji_set: "Come ti piacerebbero le tue emoji?"
enforce_square_emoji: "Forza tutte le emoji ad un aspetto di proporzioni quadrate."
approve_post_count: "La quantità di messaggi di un utente nuovo o di base che deve essere approvata"
approve_unless_trust_level: "I messaggi degli utenti al di sotto di questo livello di esperienza devono essere approvati"
approve_new_topics_unless_trust_level: "I nuovi argomenti degli utenti al di sotto di questo livello di esperienza devono essere approvati"

View File

@ -958,8 +958,6 @@ ko:
avatar_sizes: "자동 생성 아바타 사이즈 목록"
external_system_avatars_enabled: "외부 아바타 시스템을 사용하기"
external_system_avatars_url: "외부 아바타 서비스의 URL. {username} {first_letter} {color} {size} 의 대체가 허용됨"
default_opengraph_image_url: "기본 오픈그래프 이미지의 URL"
twitter_summary_large_image_url: "기본 Twitter 요약 카드 이미지의 URL( 가로 280px, 세로 150px 이상이어야 함)"
allow_all_attachments_for_group_messages: "그룹 메시지에 모든 이메일 첨부 허용"
png_to_jpg_quality: "변환된 JPG 파일의 퀄리티(1은 최하, 99는 최상, 100은 해제)"
allow_staff_to_upload_any_file_in_pm: "운영진이 보내는 개인메시지에 모든 파일 첨부 허용"
@ -1151,7 +1149,6 @@ ko:
slug_generation_method: "slug 생성 방식. 'encoded'는 퍼센트 기호로 인코딩해서 생성합니다. 'none'은 slug 자체를 비활성화합니다.."
enable_emoji: "emoji 활성화"
emoji_set: "어떤 emoji가 좋은가요?"
enforce_square_emoji: "모든 emoji를 정사각형 비율로 강제로 바꿉니다."
approve_unless_trust_level: "허가 받고 글 올려야 하는 유저들 최저 회원등급"
default_email_mailing_list_mode: "기본으로 새로운 포스트가 생길 때마다 이메일 보내기"
default_email_mailing_list_mode_frequency: "이 빈도로 이메일 받기를 설정한 메일링 리스트 가입자"

View File

@ -954,7 +954,6 @@ nl:
avatar_sizes: "Lijst van automatisch gegenereerde avatar groottes."
external_system_avatars_enabled: "Gebruik een avatars service van een extern systeem."
external_system_avatars_url: "URL van de externe avatar service. Toegestaande vervangingen zijn {username} {first_letter} {color} {size}"
default_opengraph_image_url: "URL van de standaard opengraph afbeelding."
png_to_jpg_quality: "Kwaliteit van het geconverteerde JPG bestand (1 is laagste kwaliteit, 99 is beste kwaliteit, 100 om uit te schakelen)."
strip_image_metadata: "Verwijder metadata uit afbeelding."
enable_flash_video_onebox: "Embedden van swf en flv (Adobe Flash) links toestaan in oneboxen. LET OP: dit kan onveilig zijn"
@ -1105,7 +1104,6 @@ nl:
slug_generation_method: "Kies een slug generate methode. 'encoded' zal een percentage encoderen string genereren. 'none' zal slug helemaal uitschakelen."
enable_emoji: "Inschakelen emoji"
emoji_set: "Welke emoji wilt u gebruiken?"
enforce_square_emoji: "Forceer een vierkant aspect ratio bij alle emojis."
approve_post_count: "Het aantal berichten van een nieuwe of normale gebruiker dat moet worden goedgekeurd"
approve_unless_trust_level: "Posts voor gebruikers onder dit vertrouwensniveau moeten worden goedgekeurd"
approve_new_topics_unless_trust_level: "Nieuwe topics voor gebruikers onder dit vertrouwensniveau moeten worden goedgekeurd"

View File

@ -1048,8 +1048,6 @@ pl_PL:
avatar_sizes: "Lista automatycznie wygenerowanych rozmiarów awatarów."
external_system_avatars_enabled: "Użyj zewnętrzny system awatarów."
external_system_avatars_url: "Adres URL zewnętrznego dostawcy awatarów. Dozwolone podstawienia: {username} {first_letter} {color} {size}"
default_opengraph_image_url: "Adres URL domyślnego obrazu otwarciawykresu."
twitter_summary_large_image_url: "Adres URL domyślnego obrazu karty podsumowanie Twitter (powinien mieć przynajmniej 280px szerokości oraz 150px wysokości)."
allow_all_attachments_for_group_messages: "Zezwól na wszystkie załączniki email dla wiadomości grupowych."
png_to_jpg_quality: "Jakość skonwertowanego pliku JPG (1 to najniższa jakość, 99 to najlepsza jakość, 100 aby dezaktywować)."
allow_staff_to_upload_any_file_in_pm: "Pozwól personelowi przesyłać pliki w wiadomościach."
@ -1249,7 +1247,6 @@ pl_PL:
slug_generation_method: "Wybierz metodę tworzenia ślimaka. 'Zakodowane\" stworzy procentowy ciąg kodujący, \"żadne\" wyłączy tą metodę."
enable_emoji: "Włącz obsługę emoji"
emoji_set: "Jaki jest twój preferowany styl emoji?"
enforce_square_emoji: "Narzuć kwadratowy stosunek dla wszystkich emoji."
approve_post_count: "Liczba postów od nowego lub podstawowego użytkownika, które muszą zostać zatwierdzone"
approve_unless_trust_level: "Posty użytkowników poniżej tego poziomu zaufania muszą być zatwierdzane"
approve_new_topics_unless_trust_level: "Nowe wątki dodawane przez użytkowników z poziomem zaufania poniżej muszą zostać zaakceptowane"

View File

@ -907,8 +907,6 @@ pt:
avatar_sizes: "Lista de tamanhos de avatar gerados automaticamente."
external_system_avatars_enabled: "Utilize o serviço do sistema externo de avatars."
external_system_avatars_url: "URL do serviço de avatares externo do sistema. Substituições permitidas são {username} {first_letter} {color} {size}"
default_opengraph_image_url: "URL da imagem opengraph por defeito."
twitter_summary_large_image_url: "URL da imagem do cartão de sumário de defeito do Twitter (deverá ser pelo menos 280px em largura, e pelo menos 150px em altura)."
allow_all_attachments_for_group_messages: "Permitir qualquer anexo de email nas mensagens de grupo."
enable_flash_video_onebox: "Ativar a incorporação de hiperligações swf e flv (Adobe Flash) em caixas únicas. AVISO: pode introduzir riscos de segurança."
default_invitee_trust_level: "Nível de Confiança padrão (0-4) para utilizadores convidados."
@ -1095,7 +1093,6 @@ pt:
slug_generation_method: "Escolha um método de geração slug. 'encoded' irá gerar sequências de caracteres com código percentual. 'none' irá desativar slug por completo."
enable_emoji: "Ativar emoji"
emoji_set: "Como gostaria de ter o seu emoji?"
enforce_square_emoji: "Forçar uma relação de aspecto quadrado para todos os emojis."
approve_post_count: "A quantidade de publicações de um novo utilizador ou utilizador básico que devem ser aprovadas"
approve_unless_trust_level: "Mensagens para utilizadores abaixo deste nível de confiança devem ser aprovados"
approve_new_topics_unless_trust_level: "Novos tópicos para utilizadores abaixo deste nível de confiança devem ser aprovados"

View File

@ -701,8 +701,6 @@ pt_BR:
no_replies:
self: "Você não respondeu a nenhuma postagem."
others: "Sem Respostas."
no_drafts:
others: "Você não tem permissão para ver rascunhos desse usuário."
topic_flag_types:
spam:
title: 'Spam'
@ -1264,8 +1262,6 @@ pt_BR:
external_system_avatars_url: "URL do sistema externo do serviço de avatares. Substituições permitidas são {username} {first_letter} {color} {size}"
selectable_avatars_enabled: "Force os usuários a escolher um avatar da lista."
selectable_avatars: "Lista de usuários avatares podem escolher."
default_opengraph_image_url: "URL da imagem opengraph padrão."
twitter_summary_large_image_url: "URL da imagem do cartão de resumo padrão do Twitter (deve ter pelo menos 280px de largura e pelo menos 150px de altura)."
allow_all_attachments_for_group_messages: "Permitir todos os anexos de e-mail para mensagens de grupo."
png_to_jpg_quality: "Qualidade do arquivo JPG convertido (1 é a qualidade mais baixa, 99 é a melhor qualidade, 100 a desabilitar)."
allow_staff_to_upload_any_file_in_pm: "Permitir que membros da equipe façam upload de arquivos no PM."
@ -1499,7 +1495,6 @@ pt_BR:
enable_emoji: "Habilitar emoji"
enable_emoji_shortcuts: "Texto em smiley comum como :): p :( será convertido em emojis"
emoji_set: "Como você gostaria do seu emoji?"
enforce_square_emoji: "Forçar proporção quadrangular para todos emojis."
emoji_autocomplete_min_chars: "Número mínimo de caracteres necessários para acionar o pop-up de emoji de preenchimento automático"
approve_post_count: "A quantidade de postagens de um usuário novo ou básico que deve ser aprovado"
approve_unless_trust_level: "Mensagens para os usuários abaixo deste nível de confiança devem ser aprovados"

View File

@ -914,8 +914,6 @@ ro:
avatar_sizes: "Lista mărimilor avatarurilor generate automat."
external_system_avatars_enabled: "Folosiți un serviciu extern de sisteme de avataruri"
external_system_avatars_url: "URL-ul serviciului extern de sisteme de avataruri. Înlocuirile permise sunt {username} {first_letter} {color} {size}"
default_opengraph_image_url: "URL-ul pentru imaginea implicită pentru Open Graph"
twitter_summary_large_image_url: "URL-ul pentru imaginea implicită pentru imaginea card cu rezumatul Twitter (trebuie să aibă minim 280px lățime și 150px înălțime)."
allow_all_attachments_for_group_messages: "Permite toate atașamentele de email pentru mesajele de grup."
enable_flash_video_onebox: "Activează încastrarea adreselor swf și flv (Adobe Flash) în onebox. ATENȚIE: poate aduce riscuri de securitate."
default_invitee_trust_level: "Nivelul de încredere implicit (0-4) pentru utilizatorii invitați."
@ -1101,7 +1099,6 @@ ro:
slug_generation_method: "Alege o metodă de generare de identificator. 'encodat' va genera șir de caractere encodate cu procentaje. 'nimic' va dezactiva complet identificatorii."
enable_emoji: "Activează emoji"
emoji_set: "Cum ți-ar placea să fie emoji tăi?"
enforce_square_emoji: "Forțează un aspect pătrățos la toti emoji."
approve_post_count: "Numărul de postări de la un utilizator simplu trebuie să fie aprobat"
approve_unless_trust_level: "Postările utilizatorilor care au un nivel de încredere mai mic decât acesta trebuie să fie aprobate."
approve_new_topics_unless_trust_level: "Crearea de subiecte noi pentru utilizatorii care se află sub acest nivel de încredere, trebuie aprobată"

View File

@ -903,7 +903,6 @@ ru:
s3_secret_access_key: "Amazon S3 secret key для загрузки и хранения изображений"
s3_region: "Географический регион Amazon S3, который будет использоваться для хранения изображений"
avatar_sizes: "Список автоматически сгенерированных размеров аватар."
default_opengraph_image_url: "URL картинки opengraph по-умолчанию."
allow_all_attachments_for_group_messages: "Разрешить все почтовые вложения для групповых сообщений."
enable_flash_video_onebox: "Разрешить умную вставку ссылок sqf и flv (Adobe Flash). ВНИМАНИЕ: повышает риски безопасности сайта."
default_invitee_trust_level: "Уровень доверия приглашенных пользователей по-умолчанию (от 0 до 4)."
@ -1037,7 +1036,6 @@ ru:
slug_generation_method: "Выберите метод генерации URL. 'encoded' будет изпользовать русские буквы в URL закодированные через проценты. 'none' не будет использовать перегенирацию."
enable_emoji: "Активировать смайлы Emoji"
emoji_set: "Какую коллекцию Emoji использовать?"
enforce_square_emoji: "Принудительно использовать квадратный формат для всех смайлов."
approve_unless_trust_level: "Сообщения для пользователей ниже этого уровня доверия подлежат проверки"
default_email_mailing_list_mode: "По умолчанию присылать почтовое уведомление, когда появляется новое сообщение."
default_other_external_links_in_new_tab: "По умолчанию открывать внешние ссылки в новой вкладке."

View File

@ -879,7 +879,6 @@ sk:
s3_cdn_url: "CDN URL ktoré sa použije na všetky dáta v s3 (napríklad https://cdn.niekde.com). VAROVANIE: po zmene tohoto nastavenia musíte použiť príkaz rebake na všetky staré príspevky."
avatar_sizes: "Zoznam automaticky generovaných veľkostí avatarov."
external_system_avatars_enabled: "Použiť externú avatar službu."
default_opengraph_image_url: "URL štandardného opengraph obrázku."
enable_flash_video_onebox: "Povolenia vkladania odkazov na swf a flv (Adobe Flash) v onebox. VAROVANIE: môže vniesť bezpečnostné riziká."
default_invitee_trust_level: "Predvolená stupeň dôvery (0-4) pre pozvaných používateľov."
default_trust_level: "Východzí stupeň dôvery (0-4) pre všekých nových používateľov. UPOZORNENIE: Zmena nastavenia Vás môže vystaviť riziku spamovania. "
@ -1017,7 +1016,6 @@ sk:
slug_generation_method: "Vybrať metódu generovania koncovej časti adresy. 'encoded' vygeneruje percentami zakódovaní reťazec. 'none' vypne koncovú časť adresy úplne."
enable_emoji: "Zapnúť emoji"
emoji_set: "Aké emoji chcete mať?"
enforce_square_emoji: "Vynútiť švorcový pomer strán na všetkých emoji."
approve_unless_trust_level: "Príspevky používateľov pod touto úrovňou důvery musia byť schválené"
auto_close_messages_post_count: "Maximálny počet povolených príspevkov v správe kým je automaticky uzavretá (0 znamená vypnuté)"
auto_close_topics_post_count: "Maximálny počet povolených príspevkov v téme kým je automaticky uzavretá (0 znamená vypnuté)"

View File

@ -759,7 +759,6 @@ sq:
slug_generation_method: "Choose a slug generation method. 'encoded' will generate percent encoding string. 'none' will disable slug at all."
enable_emoji: "Enable emoji"
emoji_set: "How would you like your emoji?"
enforce_square_emoji: "Force a square aspect ratio to all emojis."
approve_unless_trust_level: "Posts for users below this trust level must be approved"
auto_close_messages_post_count: "Numri më i lartë i lejueshëm i postimeve të lejuara në një mesazh përpara se të mbyllet automatikisht (0 për ta çaktivizuar)"
auto_close_topics_post_count: "Numri më i lartë i lejueshëm i postimeve të lejuara në një temë përpara se të mbyllet automatikisht (0 për ta çaktivizuar)"

View File

@ -166,7 +166,6 @@ sr:
show_create_topics_notice: "Ako sajt ima manje od 5 javnih tema, prikaži poruku koja sugeriše administratorima da kreiraju neke teme."
delete_drafts_older_than_n_days: Izbriši radne verzije poruka starije od (n) dana
enable_emoji: "Omogući emotikone"
enforce_square_emoji: "Forsiraj kvadratni oblik za sve emotikone."
auto_close_messages_post_count: "Maksimalan broj dozvoljenih poruka pre nego se tema automatski zatvori (0 da se isključi)"
default_email_mailing_list_mode: "Podrazumevano šalji email za svaku novu poruku"
default_email_previous_replies: "Podrazumevano uključi prethodne odgovore u email poruku"

View File

@ -861,7 +861,6 @@ sv:
s3_cdn_url: "CDN URL som används för alla S3-tillgångar (till exempel: https://cdn.somewhere.com). VARNING: efter ändring av den här inställningen så måste du uppdatera alla gamla inlägg med rake posts: rebake."
avatar_sizes: "Lista på automatiskt genererade avatar-storlekar."
external_system_avatars_enabled: "Använd externa system för avatar-tjänster."
default_opengraph_image_url: "URL för standard opengraphbilden."
allow_all_attachments_for_group_messages: "Tillåt alla e-postbilagor för gruppmeddelanden."
enable_flash_video_onebox: "Aktivera inbäddning av swf- och fic- (Adobe Flash) länkar i onebox:ar. VARNING: det kan introducera säkerhetsrisker."
default_invitee_trust_level: "Förvald förtroendenivå (0-4) för inbjudna användare."
@ -1048,7 +1047,6 @@ sv:
slug_generation_method: "Välj en genereringsmetod för etiketter. Ange 'none' för att inaktivera generering av etiketter. "
enable_emoji: "Aktivera emoji"
emoji_set: "Hur skulle du vilja ha din emoji?"
enforce_square_emoji: "Tvinga fram en kvadratisk bildkvot för alla emojis."
approve_post_count: "Antalet inlägg från en ny användare eller basanvändare som måste godkännas"
approve_unless_trust_level: "Inlägg för användare under den här förtroendenivån måste godkännas"
approve_new_topics_unless_trust_level: "Nya ämnen för användare under denna förtroendenivå måste bli godkända"

View File

@ -793,7 +793,6 @@ tr_TR:
s3_cdn_url: "Tüm s3 öğeleri için CDN URL adresi. (örneğin: https://cdn.somewhere.com). UYARI: bu ayarı değiştirdikten sonra tüm eski gönderileri rebake etmelisiniz."
avatar_sizes: "Otomatik üretilen avatar ölçülerinin listesi."
external_system_avatars_enabled: "Dışsal sistem avatarları hizmeti kullan."
default_opengraph_image_url: "Öntanımlı opengraph imajının URL'si."
allow_all_attachments_for_group_messages: "Grup iletileri için tüm e-posta eklentilerine izin ver."
enable_flash_video_onebox: "Kutularda swf ve flv (Adobe Flash) yerleştirmelerine izin ver. UYARI: güvenlik açıkları doğurabilir"
default_invitee_trust_level: "Davet edilen kullanıcılar için öntanımlı güven seviyesi (0-4)."
@ -946,7 +945,6 @@ tr_TR:
slug_generation_method: "Slug üretim yöntemi seçin. 'kodlanmış' seçeneği yüzde kodlamalı metin oluşturur. 'hiçbiri' seçeneği slug'ı devre dışı bırakır."
enable_emoji: "Emojiyi etkinleştir"
emoji_set: "Emojinizi nasıl isterdiniz?"
enforce_square_emoji: "Tüm emojileri kare en-boy oranına zorla"
approve_unless_trust_level: "Bu güven seviyesi altındaki kullanıcılardan gelen gönderilerin onaylanması gerekir"
default_email_digest_frequency: "Öntanımlı olarak kullanıcılar ne sıklıkla e-posta özeti alacak."
default_email_direct: "Öntanımlı olarak birisi bir kullanıcı hakkında alıntı yapma, cevaplama, bahsetme ya da davet etme eylemlerini gerçekleştirdiğinde e-posta gönder."

View File

@ -1106,8 +1106,6 @@ ur:
avatar_sizes: "خود کار طریقے سے تیار کردہ اوتار کے سائزوں کی فہرست۔"
external_system_avatars_enabled: "بیرونی سسٹم کی اوتار سروس کا استعمال کریں۔"
external_system_avatars_url: "بیرونی سسٹم کی اوتار سروس کا URL۔ اجازت شدہ متبادلات {username} {first_letter} {color} {size} ہیں"
default_opengraph_image_url: "ڈِیفالٹ اَوپَن٘گراف تصویر کا URL۔"
twitter_summary_large_image_url: "ٹویٹر خلاصہ کارڈ کی ڈِیفالٹ تصویر کا URL (کم از کم 280px چوڑائی، اور کم از کم 150px اونچائی کے سائز میں ہونا چاہئے)۔"
allow_all_attachments_for_group_messages: "گروپ کے پیغامات کیلئے تمام ای میل منسلکات کی اجازت دیں۔"
png_to_jpg_quality: "تبدیل شدہ JPG فائل کا معیار (1 سب سے کم معیار ہے، 99 بہترین معیار ہے، 100 غیر فعال)۔"
allow_staff_to_upload_any_file_in_pm: "سٹاف ارکان کو PM میں کوئی بھی فائل اَپ لوڈ کرنے کی اجازت دیں۔"
@ -1332,7 +1330,6 @@ ur:
enable_emoji: "اِیمَوجی فعال کریں"
enable_emoji_shortcuts: "عام سمائلی ٹیکسٹ جیسا کہ :) :p :( اِیمَوجیوں میں تبدیل کر دیا جائے گا"
emoji_set: "آپ اپنا اِیمَوجی کیسا پسند کریں گے؟"
enforce_square_emoji: "تمام اِیمَوجیوں کو ایک مربع اَیسپَیکٹ رَیشو پر مجبور کریں۔"
approve_post_count: "ایک نئے یا بَیسِک صارف کی طرف سے پوسٹس کی تعداد جن کا منظور کیے جانا لاذمی ہے "
approve_unless_trust_level: "اِس ٹرسٹ لَیول سے نیچے کے صارفین کیلئے پوسٹس کا منظور شدہ ہونا لازمی ہے"
approve_new_topics_unless_trust_level: "اِس ٹرسٹ لَیول سے نیچے کے صارفین کیلئے نئے ٹاپکس کا منظور شدہ ہونا لازمی ہے"

View File

@ -722,7 +722,6 @@ vi:
s3_cdn_url: "CDN URL được sử dụng cho tất cả các tài nguyên S3 (vd: https://cdn.somewhere.com). CHÚ Ý: sau khi thay đổi thiết lập này bạn phải tạo lại các bài viết cũ."
avatar_sizes: "Danh sách những kích thước hình đại diện tự động khởi tạo."
external_system_avatars_enabled: "Sử dụng dịch vụ ảnh đại diện bên ngoài."
default_opengraph_image_url: "URL của ảnh opengraph mặc định."
allow_all_attachments_for_group_messages: "Cho phép các email có đính kèm trong tin nhắn nhóm."
enable_flash_video_onebox: "Cho phép nhúng liên kết swf và flv (Adobe Flash). CHÚ Ý: có thể chứa đựng các rủi ro bảo mật."
default_invitee_trust_level: "Bậc tin tưởng mặc định (0-4) cho thành viên được mời."
@ -872,7 +871,6 @@ vi:
slug_generation_method: "Chọn phương thức tạo slug. 'encoded' sẽ tạo ra phần trăm chuỗi mã hóa. 'none' sẽ tắt slug."
enable_emoji: "Kích hoạt emoji"
emoji_set: "Bạn thích dùng gói emoji nào?"
enforce_square_emoji: "Sử dụng kích thước vuông cho tất cả các emoji."
approve_post_count: "Số lượng bài viết từ một thành viên mới hoặc thành viên cũ phải được duyệt"
approve_unless_trust_level: "Bài viết của thành viên dưới cấp độ tin cậy này phải được duyệt"
default_email_direct: "Gửi email khi ai đó trích dẫn/trả lời/đề cập hoặc mời thành viên theo mặc định."

View File

@ -990,8 +990,6 @@ zh_CN:
avatar_sizes: "自动生成的头像大小列表。"
external_system_avatars_enabled: "使用外部系统头像服务。"
external_system_avatars_url: "外部系统头像服务的 URL 地址。可选参数是 {username} {first_letter} {color} {size}"
default_opengraph_image_url: "opengraph图像的缺省URL。"
twitter_summary_large_image_url: "默认 Twitter summary 卡片的 URL需要至少宽 280px 和高 150px。"
allow_all_attachments_for_group_messages: "允许群组私信中包含任何邮件附件。"
png_to_jpg_quality: "转换 JPG 文件的质量1 是最低99 最高100 禁用)。"
allow_staff_to_upload_any_file_in_pm: "允许管理人员在私信中上传任何文件。"
@ -1201,7 +1199,6 @@ zh_CN:
slug_generation_method: "选择一个链接生成方式。“encoded”将生成以百分号编码的链接。“none”将禁用自定义链接只生成默认链接。"
enable_emoji: "启用绘文字emoji"
emoji_set: "你喜欢哪一种 emoji"
enforce_square_emoji: "强制为所有 emojis 设置正方形比例。"
approve_post_count: "新用户或基础用户需要被审核的帖子数量"
approve_unless_trust_level: "该信任等级之下的用户的帖子必须被审核"
approve_new_topics_unless_trust_level: "低于该信任等级的用户的新帖子需要被审核"

View File

@ -894,8 +894,6 @@ zh_TW:
avatar_sizes: "自動生成的頭像大小列表。"
external_system_avatars_enabled: "使用外部系統頭像服務。"
external_system_avatars_url: "外部系統頭像服務的 URL 地址。可選參數是 {username} {first_letter} {color} {size}"
default_opengraph_image_url: "opengraph圖像的預設URL。"
twitter_summary_large_image_url: "預設 Twitter summary 卡片的 URL需要至少寬 280px 和高 150px。"
allow_all_attachments_for_group_messages: "允許群組消息中包含任何郵件附件。"
enable_flash_video_onebox: "在連結預覽中啟用 swf 和 flv (Adobe Flash) 嵌入。警告:可能增加安全風險。"
default_invitee_trust_level: "預設的受邀用戶等級 (0-4)"
@ -1086,7 +1084,6 @@ zh_TW:
slug_generation_method: "選擇一個連結生成方式。“encoded”將生成以百分號編碼的連結。“none”將禁用自定義連結只生成預設連結。"
enable_emoji: "啟用表情符號"
emoji_set: "你喜歡怎麼樣的表情符號?"
enforce_square_emoji: "強制所有表情符號成為正方形比例。"
approve_post_count: "新用戶或基礎用戶需要被審核的帖子數量"
approve_unless_trust_level: "該信任等級之下的用戶的帖子必須被審核"
approve_new_topics_unless_trust_level: "低於該信任等級的用戶的新帖子需要被審核"
@ -1188,9 +1185,6 @@ zh_TW:
other: "%{count} 個帖子被分離到了新主題:%{topic_link}"
existing_topic_moderator_post:
other: "%{count} 個帖子被合併到現存主題:%{topic_link}"
change_owner:
post_revision_text: "所有權從 %{old_user} 轉移至 %{new_user}"
deleted_user: "已經刪除的用戶"
topic_statuses:
archived_enabled: "此討論話題已封存,即已經凍結,無法修改。"
archived_disabled: "此討論話題已被解除封存,即不再凍結,可以修改。"

View File

@ -479,6 +479,7 @@ posting:
min: 1
default: 20
locale_default:
ja: 8
zh_CN: 8
zh_TW: 8
min_first_post_length:
@ -486,6 +487,7 @@ posting:
min: 1
default: 20
locale_default:
ja: 8
zh_CN: 8
zh_TW: 8
min_personal_message_post_length:
@ -493,6 +495,7 @@ posting:
min: 1
default: 10
locale_default:
ja: 3
zh_CN: 3
zh_TW: 3
max_post_length:
@ -513,6 +516,7 @@ posting:
default: 15
min: 1
locale_default:
ja: 6
zh_CN: 6
zh_TW: 6
max_topic_title_length:
@ -529,7 +533,7 @@ posting:
allow_uppercase_posts:
default: false
locale_default:
ja: false
ja: true
title_prettify:
default: true
locale_default:
@ -551,6 +555,7 @@ posting:
client: true
default: 10
locale_default:
ja: 4
zh_CN: 4
zh_TW: 4
enable_personal_messages:
@ -629,6 +634,7 @@ posting:
post_excerpt_maxlength:
default: 300
locale_default:
ja: 120
zh_CN: 120
zh_TW: 120
show_pinned_excerpt_mobile:
@ -671,8 +677,6 @@ posting:
default: 'twitter'
client: true
enum: 'EmojiSetSiteSetting'
enforce_square_emoji:
default: true
emoji_autocomplete_min_chars:
client: true
default: 0
@ -733,6 +737,7 @@ email:
digest_min_excerpt_length:
default: 100
locale_default:
ja: 50
zh_CN: 50
zh_TW: 50
digest_topics:
@ -783,7 +788,9 @@ email:
pop3_polling_host: ''
pop3_polling_port: 995
pop3_polling_username: ''
pop3_polling_password: ''
pop3_polling_password:
default: ''
secret: true
pop3_polling_delete_from_server: true
log_mail_processing_failures: false
incoming_email_prefer_html: true
@ -837,6 +844,7 @@ email:
mailgun_api_key:
default: ''
regex: '^(key-\h{32}|\h{32}-\h{8}-\h{8})$'
secret: true
bounce_score_threshold:
client: true
default: 4
@ -933,7 +941,7 @@ files:
default: false
client: true
s3_use_iam_profile: false
s3_access_key_id:
s3_access_key_id:
default: ''
secret: true
shadowed_by_global: true
@ -1157,6 +1165,7 @@ onebox:
post_onebox_maxlength:
default: 500
locale_default:
ja: 200
zh_CN: 200
zh_TW: 200
onebox_domains_blacklist:
@ -1455,6 +1464,7 @@ uncategorized:
default: 'ascii'
enum: 'SlugSetting'
locale_default:
ja: 'none'
zh_CN: 'none'
zh_TW: 'none'
@ -1598,6 +1608,7 @@ uncategorized:
default: 500
client: true
locale_default:
ja: 350
zh_CN: 350
zh_TW: 350

View File

@ -0,0 +1,9 @@
class RemoveEnforceSquareEmoji < ActiveRecord::Migration[5.2]
def up
execute "DELETE FROM site_settings WHERE name = 'enforce_square_emoji'"
end
def down
raise ActiveRecord::IrreversibleMigration
end
end

View File

@ -6,6 +6,8 @@ We take security very seriously at Discourse. We welcome any peer review of our
In order to give the community time to respond and upgrade we strongly urge you report all security issues privately. Please use our [vulnerability disclosure program at Hacker One](https://hackerone.com/discourse) to provide details and repro steps and we will respond ASAP. If you prefer not to use Hacker One, email us directly at `team@discourse.org` with details and repro steps. Security issues *always* take precedence over bug fixes and feature work. We can and do mark releases as "urgent" if they contain serious security fixes.
For a list of recent security commits, check [our GitHub commits prefixed with SECURITY](https://github.com/discourse/discourse/search?utf8=%E2%9C%93&q=SECURITY&type=Commits).
### Password Storage
Discourse uses the PBKDF2 algorithm to encrypt salted passwords. This algorithm is blessed by NIST. Security experts on the web [tend to agree that PBKDF2 is a secure choice](http://security.stackexchange.com/questions/4781/do-any-security-experts-recommend-bcrypt-for-password-storage).

View File

@ -910,7 +910,7 @@ module Email
end
def attachment_markdown(upload)
if FileHelper.is_image?(upload.original_filename)
if FileHelper.is_supported_image?(upload.original_filename)
"<img src='#{upload.url}' width='#{upload.width}' height='#{upload.height}'>"
else
"<a class='attachment' href='#{upload.url}'>#{upload.original_filename}</a> (#{number_to_human_size(upload.filesize)})"

View File

@ -11,8 +11,8 @@ class FileHelper
)
end
def self.is_image?(filename)
filename =~ images_regexp
def self.is_supported_image?(filename)
filename =~ supported_images_regexp
end
class FakeIO
@ -48,7 +48,7 @@ class FileHelper
# attempt error API compatibility
io = FakeIO.new
io.status = [response.code, ""]
raise OpenURI::HTTPError.new("#{response.code} Error", io)
raise OpenURI::HTTPError.new("#{response.code} Error: #{response.body}", io)
else
log(:error, "FinalDestination did not work for: #{url}") if verbose
throw :done
@ -100,14 +100,12 @@ class FileHelper
).optimize_image!(filename)
end
private
def self.images
@@images ||= Set.new %w{jpg jpeg png gif tif tiff bmp svg webp ico}
def self.supported_images
@@supported_images ||= Set.new %w{jpg jpeg png gif svg ico}
end
def self.images_regexp
@@images_regexp ||= /\.(#{images.to_a.join("|")})$/i
def self.supported_images_regexp
@@supported_images_regexp ||= /\.(#{supported_images.to_a.join("|")})$/i
end
end

View File

@ -39,7 +39,7 @@ module FileStore
content_type: opts[:content_type].presence || MiniMime.lookup_by_filename(filename)&.content_type
}
# add a "content disposition" header for "attachments"
options[:content_disposition] = "attachment; filename=\"#{filename}\"" unless FileHelper.is_image?(filename)
options[:content_disposition] = "attachment; filename=\"#{filename}\"" unless FileHelper.is_supported_image?(filename)
# if this fails, it will throw an exception
path = @s3_helper.upload(file, path, options)
# return the upload url

View File

@ -15,7 +15,7 @@ class ActiveRecord::Base
def self.find_or_create_by_safe!(hash)
begin
find_or_create_by!(hash)
rescue PG::UniqueViolation, ActiveRecord::RecordNotUnique
rescue PG::UniqueViolation, ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid
# try again cause another transaction could have passed by now
find_or_create_by!(hash)
end

View File

@ -38,8 +38,10 @@ class SiteSettings::DefaultsProvider
end
def get(name, locale = DEFAULT_LOCALE)
@defaults.dig(locale.to_sym, name.to_sym) ||
@defaults.dig(DEFAULT_LOCALE.to_sym, name.to_sym)
value = @defaults.dig(locale.to_sym, name.to_sym)
return value unless value.nil?
@defaults.dig(DEFAULT_LOCALE.to_sym, name.to_sym)
end
alias [] get

View File

@ -39,6 +39,7 @@ task 'docker:test' do
begin
@good = true
unless ENV['SKIP_LINT']
puts "travis_fold:start:lint" if ENV["TRAVIS"]
puts "Running linters/prettyfiers"
puts "eslint #{`yarn eslint -v`}"
puts "prettier #{`yarn prettier -v`}"
@ -64,9 +65,11 @@ task 'docker:test' do
@good &&= run_or_fail('yarn prettier --list-different "plugins/**/*.scss" "plugins/**/*.es6"')
end
end
puts "travis_fold:end:lint" if ENV["TRAVIS"]
end
unless ENV['SKIP_TESTS']
puts "travis_fold:start:prepare_tests" if ENV["TRAVIS"]
puts "Cleaning up old test tmp data in tmp/test_data"
`rm -fr tmp/test_data && mkdir -p tmp/test_data/redis && mkdir tmp/test_data/pg`
@ -92,10 +95,16 @@ task 'docker:test' do
@good &&= run_or_fail("bundle exec rake plugin:install_all_official")
end
@good &&= run_or_fail("bundle exec rake db:migrate")
if ENV["SKIP_PLUGINS"]
@good &&= run_or_fail("bundle exec rake db:migrate")
else
@good &&= run_or_fail("LOAD_PLUGINS=1 bundle exec rake db:migrate")
end
puts "travis_fold:end:prepare_tests" if ENV["TRAVIS"]
unless ENV["JS_ONLY"]
puts "travis_fold:start:ruby_tests" if ENV["TRAVIS"]
unless ENV["SKIP_CORE"]
params = []
if ENV["BISECT"]
@ -114,10 +123,11 @@ task 'docker:test' do
@good &&= run_or_fail("bundle exec rake plugin:spec")
end
end
puts "travis_fold:end:ruby_tests" if ENV["TRAVIS"]
end
unless ENV["RUBY_ONLY"]
puts "travis_fold:start:js_tests" if ENV["TRAVIS"]
unless ENV["SKIP_CORE"]
@good &&= run_or_fail("bundle exec rake qunit:test['600000']")
@good &&= run_or_fail("bundle exec rake qunit:test['600000','/wizard/qunit']")
@ -130,11 +140,12 @@ task 'docker:test' do
@good &&= run_or_fail("bundle exec rake plugin:qunit['*','600000']")
end
end
puts "travis_fold:end:js_tests" if ENV["TRAVIS"]
end
end
ensure
puts "travis_fold:start:terminating" if ENV["TRAVIS"]
puts "Terminating"
if ENV['PAUSE_ON_TERMINATE']
@ -146,6 +157,7 @@ task 'docker:test' do
Process.kill("TERM", @pg_pid) if @pg_pid
Process.wait @redis_pid if @redis_pid
Process.wait @pg_pid if @pg_pid
puts "travis_fold:end:terminating" if ENV["TRAVIS"]
end
if !@good

View File

@ -37,8 +37,8 @@ class UploadCreator
# test for image regardless of input
@image_info = FastImage.new(@file) rescue nil
is_image = FileHelper.is_image?(@filename)
is_image ||= @image_info && FileHelper.is_image?("test.#{@image_info.type}")
is_image = FileHelper.is_supported_image?(@filename)
is_image ||= @image_info && FileHelper.is_supported_image?("test.#{@image_info.type}")
if is_image
extract_image_info!

View File

@ -36,7 +36,7 @@ class UrlHelper
uri = URI.parse(url)
filename = File.basename(uri.path)
is_attachment = !FileHelper.is_image?(filename)
is_attachment = !FileHelper.is_supported_image?(filename)
no_cdn = SiteSetting.login_required || SiteSetting.prevent_anons_from_downloading_files

View File

@ -18,7 +18,7 @@ class Validators::UploadValidator < ActiveModel::Validator
extension = File.extname(upload.original_filename)[1..-1] || ""
if is_authorized?(upload, extension)
if FileHelper.is_image?(upload.original_filename)
if FileHelper.is_supported_image?(upload.original_filename)
authorized_image_extension(upload, extension)
maximum_image_file_size(upload)
else
@ -74,11 +74,11 @@ class Validators::UploadValidator < ActiveModel::Validator
end
def authorized_images(upload)
authorized_extensions(upload) & FileHelper.images
authorized_extensions(upload) & FileHelper.supported_images
end
def authorized_attachments(upload)
authorized_extensions(upload) - FileHelper.images
authorized_extensions(upload) - FileHelper.supported_images
end
def authorizes_all_extensions?(upload)

View File

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

View File

@ -12,7 +12,8 @@
"chrome-remote-interface": "^0.25",
"eslint": "^4.19",
"prettier": "^1.13",
"puppeteer": "^1.4",
"pretender": "^1.6"
"puppeteer": "1.4",
"pretender": "^1.6",
"qunit": "2.6"
}
}

View File

@ -7,6 +7,7 @@
fi:
site_settings:
discourse_narrative_bot_enabled: 'Ota Discoursen opastava botti käyttöön (discobot)'
disable_discourse_narrative_bot_welcome_post: "Estä bottia lähettämästä tervetuloviestejä"
discourse_narrative_bot_ignored_usernames: "Käyttäjänimet, jotka botin tulisi jättää huomiotta"
discourse_narrative_bot_disable_public_replies: "Estä bottia vastaamasta julkisesti ketjuihin"

View File

@ -7,6 +7,7 @@
sw:
site_settings:
discourse_narrative_bot_enabled: 'Ruhusu roboti wa maelezo ya Discourse (discobot)'
disable_discourse_narrative_bot_welcome_post: "Sitisha Roboti wa Discourse kukaribisha watu na taarifa"
discourse_narrative_bot_ignored_usernames: "Majina ya watumiaji ambayo Roboti wa Discourse aya dharau"
discourse_narrative_bot_disable_public_replies: "Sitisha majibu ya umma ya roboti wa Discourse"

View File

@ -7,6 +7,7 @@
ar:
site_settings:
poll_enabled: "السماح بالإستفتاء"
poll_maximum_options: "أقصى عدد للخيارات في كلّ تصويت."
poll_edit_window_mins: "عدد الدقائق بعد نشر المنشور المسموح فيها بتعديل التصويت."
poll:

View File

@ -6,6 +6,8 @@
# => RUN_SMOKE_TESTS executes the smoke tests instead of the regular tests from docker.rake
# See lib/tasks/docker.rake and lib/tasks/smoke_test.rake for more information
puts "travis_fold:end:starting_docker_container" if ENV["TRAVIS"]
def run_or_fail(command)
pid = Process.spawn(command)
Process.wait(pid)
@ -13,11 +15,18 @@ def run_or_fail(command)
end
unless ENV['NO_UPDATE']
puts "travis_fold:start:pulling_latest_discourse" if ENV["TRAVIS"]
run_or_fail("git pull")
checkout = ENV['COMMIT_HASH'] || "HEAD"
run_or_fail("git checkout #{checkout}")
puts "travis_fold:end:pulling_latest_discourse" if ENV["TRAVIS"]
puts "travis_fold:start:bundle" if ENV["TRAVIS"]
run_or_fail("bundle")
puts "travis_fold:end:bundle" if ENV["TRAVIS"]
end
if ENV['RUN_SMOKE_TESTS']

View File

@ -11,7 +11,7 @@ Upload.where("lower(extension) in (?)", ['jpg', 'jpeg', 'gif', 'png', 'bmp', 'ti
count += 1
print "\r%8d".freeze % count
absolute_path = Discourse.store.path_for(upload)
if absolute_path && FileHelper.is_image?(upload.original_filename)
if absolute_path && FileHelper.is_supported_image?(upload.original_filename)
file = File.new(absolute_path) rescue nil
next unless file

View File

@ -40,7 +40,7 @@ module ImportScripts
end
def html_for_upload(upload, display_filename)
if FileHelper.is_image?(upload.url)
if FileHelper.is_supported_image?(upload.url)
embedded_image_html(upload)
else
attachment_html(upload, display_filename)

View File

@ -788,6 +788,10 @@ EOM
raw.gsub!(/&#39;/, "'")
raw.gsub!(/\[url="(.+?)"\]http.+?\[\/url\]/, "\\1\n")
raw.gsub!(/\[media\](.+?)\[\/media\]/, "\n\\1\n\n")
raw.gsub!(/\[php\](.+?)\[\/php\]/m) { |m| "\n\n```php\n\n" + @htmlentities.decode($1.gsub(/\n\n/, "\n")) + "\n\n```\n\n" }
raw.gsub!(/\[code\](.+?)\[\/code\]/m) { |m| "\n\n```\n\n" + @htmlentities.decode($1.gsub(/\n\n/, "\n")) + "\n\n```\n\n" }
raw.gsub!(/\[list\](.+?)\[\/list\]/m) { |m| "\n" + $1.gsub(/\[\*\]/, "\n- ") + "\n\n" }
raw.gsub!(/\[quote\]/, "\n[quote]\n")
raw.gsub!(/\[\/quote\]/, "\n[/quote]\n")
raw.gsub!(/date=\'(.+?)\'/, '')
raw.gsub!(/timestamp=\'(.+?)\' /, '')
@ -829,9 +833,16 @@ EOM
puts "Attachment #{attach_id} not found."
attach_string = "Attachment #{attach_id} not found."
else
attach_string = "#{attach_id}\n\n![#{attachments.first['filename']}](#{UPLOADS}/#{attachments.first['loc']})\n"
attach_url = "#{UPLOADS}/#{attachments.first['loc'].gsub(' ', '%20')}"
if attachments.first['filename'].match(/(png|jpg|jpeg|gif)$/)
# images are rendered as a link that contains the image
attach_string = "#{attach_id}\n\n[![#{attachments.first['filename']}](#{attach_url})](#{attach_url})\n"
else
# other attachments are simple download links
attach_string = "#{attach_id}\n\n[#{attachments.first['filename']}](#{attach_url})\n"
end
end
raw.gsub!(attach_regex, attach_string)
raw.sub!(attach_regex, attach_string)
end
raw

View File

@ -28,7 +28,7 @@ describe FileHelper do
expect(e.io.status[0]).to eq("404")
raise
end
end.to raise_error(OpenURI::HTTPError)
end.to raise_error(OpenURI::HTTPError, "404 Error: 404")
end
it "correctly raises an OpenURI HTTP error if it gets a 404" do

View File

@ -37,14 +37,15 @@ describe SiteSettings::DefaultsProvider do
describe 'expose default cache according to locale' do
before do
settings.setting(:test_override, 'default', locale_default: { zh_CN: 'cn' })
settings.setting(:test_boolean_override, true, locale_default: { zh_CN: false })
settings.setting(:test_default, 'test', regex: '^\S+$')
settings.refresh!
end
describe '.all' do
it 'returns all values according to locale' do
expect(settings.defaults.all).to eq(test_override: 'default', test_default: 'test')
expect(settings.defaults.all('zh_CN')).to eq(test_override: 'cn', test_default: 'test')
expect(settings.defaults.all).to eq(test_override: 'default', test_default: 'test', test_boolean_override: true)
expect(settings.defaults.all('zh_CN')).to eq(test_override: 'cn', test_default: 'test', test_boolean_override: false)
end
end
@ -57,6 +58,15 @@ describe SiteSettings::DefaultsProvider do
expect(settings.defaults.get('test_override')).to eq 'default'
end
it 'returns the locale_default value if it exists' do
expect(settings.defaults.get(:test_override, :zh_CN)).to eq 'cn'
expect(settings.defaults.get(:test_override, :de)).to eq 'default'
expect(settings.defaults.get(:test_default, :zh_CN)).to eq 'test'
end
it 'returns the correct locale_default for boolean site settings' do
expect(settings.defaults.get(:test_boolean_override, :zh_CN)).to eq false
end
end
describe '.set_regardless_of_locale' do

View File

@ -30,7 +30,7 @@ describe Stylesheet::Importer do
background = Fabricate(:upload_s3)
category = Fabricate(:category, uploaded_background: background)
expect(compile_css("category_backgrounds")).to include("body.category-#{category.full_slug}{background-image:url(https://s3.cdn/uploads")
expect(compile_css("category_backgrounds")).to include("body.category-#{category.full_slug}{background-image:url(https://s3.cdn/original")
end
end

View File

@ -5,18 +5,27 @@ Fabricator(:upload) do
filesize 1234
width 100
height 200
url { sequence(:url) { |n| "/uploads/default/#{n}/1234567890123456.png" } }
url do |attrs|
sequence(:url) do |n|
Discourse.store.get_path_for(
"original", n + 1, attrs[:sha1], ".#{attrs[:extension]}"
)
end
end
extension "png"
end
Fabricator(:upload_s3, from: :upload) do
url { sequence(:url) { |n| "#{Discourse.store.absolute_base_url}/uploads/default/#{n}/1234567890123456.png" } }
end
Fabricator(:attachment, from: :upload) do
id 42
user
original_filename "archive.zip"
filesize 1234
url "/uploads/default/42/66b3ed1503efc936.zip"
url do |attrs|
sequence(:url) do |n|
File.join(
Discourse.store.absolute_base_url,
Discourse.store.get_path_for(
"original", n + 1, attrs[:sha1], ".#{attrs[:extension]}"
)
)
end
end
end

BIN
spec/fixtures/images/webp_as.bin vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 B

View File

@ -23,11 +23,13 @@ describe "site setting integrity checks" do
it "no locale default has different type than default or invalid key" do
yaml.each_value do |category|
category.each_value do |setting|
category.each do |setting_name, setting|
next unless setting.is_a?(Hash)
if setting['locale_default']
setting['locale_default'].each_pair do |k, v|
expect(LocaleSiteSetting.valid_value?(k.to_s)).to be_truthy
expect(LocaleSiteSetting.valid_value?(k.to_s)).to be_truthy,
"'#{k}' is not a valid locale_default key for '#{setting_name}' site setting"
case setting['default']
when TrueClass, FalseClass
expect(v.class == TrueClass || v.class == FalseClass).to be_truthy

View File

@ -43,6 +43,27 @@ RSpec.describe UploadCreator do
expect(File.extname(upload.url)).to eq('.png')
expect(upload.original_filename).to eq('png_as.png')
end
describe 'for webp format' do
before do
SiteSetting.authorized_extensions = '.webp|.bin'
end
let(:filename) { "webp_as.bin" }
let(:file) { file_from_fixtures(filename) }
it 'should not correct the coerce filename' do
expect do
UploadCreator.new(file, filename).create_for(user.id)
end.to change { Upload.count }.by(1)
upload = Upload.last
expect(upload.extension).to eq('bin')
expect(File.extname(upload.url)).to eq('.bin')
expect(upload.original_filename).to eq('webp_as.bin')
end
end
end
describe 'converting to jpeg' do

View File

@ -65,6 +65,13 @@ describe ColorScheme do
expect(ColorScheme.hex_for_name('undefined')).to eq nil
end
it "returns the base color for an attribute of a specified scheme" do
scheme = ColorScheme.create_from_base(name: "test scheme")
ColorSchemeRevisor.revise(scheme, colors: [{ name: "header_background", hex: "9dc927", default_hex: "949493" }])
scheme.reload
expect(ColorScheme.hex_for_name("header_background", scheme.id)).to eq("9dc927")
end
it "returns the base color for an attribute" do
expect(ColorScheme.hex_for_name('second_one')).to eq base_colors[:second_one]
end

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