-
+
@@ -58,13 +58,13 @@ body, table, td, th, h1, h2, h3 {font-family: Helvetica, Arial, sans-serif !impo
-
+
-<%=t 'user_notifications.digest.since_last_visit' %>
+<%=t 'user_notifications.digest.since_last_visit' %>
@@ -72,22 +72,22 @@ body, table, td, th, h1, h2, h3 {font-family: Helvetica, Arial, sans-serif !impo
|
<%- @counts.each do |count| -%>
- |
- <%= count[:value] -%>
+ |
+ <%= count[:value] -%>
|
<%- end -%>
<%- @counts.each do |count| -%>
- |
- <%=t count[:label_key] -%>
+ |
+ <%=t count[:label_key] -%>
|
<%- end -%>
-<%=t 'user_notifications.digest.popular_topics' %>
+<%=t 'user_notifications.digest.popular_topics' %>
@@ -123,7 +123,7 @@ body, table, td, th, h1, h2, h3 {font-family: Helvetica, Arial, sans-serif !impo
@@ -138,18 +138,18 @@ body, table, td, th, h1, h2, h3 {font-family: Helvetica, Arial, sans-serif !impo
- |
+ |
|
-
+ |
<% if t.user %>
- <%= t.user.username -%>
<% if SiteSetting.enable_names? && t.user.name.present? && t.user.name.downcase != t.user.username.downcase %>
- <%= t.user.name -%>
+ <%= t.user.name -%>
<% end %>
+ <%= t.user.username -%>
<% end %>
|
- <%- if show_image_with_url(t.image_url) -%>
+ <%- if show_image_with_url(t.image_url) && t.featured_link.nil? -%>
|
@@ -162,7 +162,7 @@ body, table, td, th, h1, h2, h3 {font-family: Helvetica, Arial, sans-serif !impo
- |
+ |
<%= email_excerpt(t.first_post.cooked) %>
|
@@ -189,7 +189,7 @@ body, table, td, th, h1, h2, h3 {font-family: Helvetica, Arial, sans-serif !impo
<% end %>
-
+
<%=t 'user_notifications.digest.join_the_discussion' %>
|
@@ -215,8 +215,8 @@ body, table, td, th, h1, h2, h3 {font-family: Helvetica, Arial, sans-serif !impo
-
-
+
+
@@ -252,7 +252,7 @@ body, table, td, th, h1, h2, h3 {font-family: Helvetica, Arial, sans-serif !impo
- |
+ |
<%= email_excerpt(post.cooked) %>
|
@@ -272,23 +272,23 @@ body, table, td, th, h1, h2, h3 {font-family: Helvetica, Arial, sans-serif !impo
- |
+ |
|
<% if post.user %>
- <%= post.user.username -%>
<% if SiteSetting.enable_names? && post.user.name && post.user.name.downcase != post.user.username.downcase %>
- <%= post.user.name -%>
+ <%= post.user.name -%>
<% end %>
+ <%= post.user.username -%>
<% end %>
|
<%=t 'user_notifications.digest.from_topic_label' %>
- <%= post.topic.title.truncate(60, separator: /\s/) -%>
+ <%= post.topic.title.truncate(60, separator: /\s/) -%>
-
+
<%=t 'user_notifications.digest.join_the_discussion' %>
|
@@ -331,12 +331,7 @@ body, table, td, th, h1, h2, h3 {font-family: Helvetica, Arial, sans-serif !impo
|
-
- <%= t.user_data ? (t.highest_post_number - (t.user_data.last_read_post_number || 0)) : t.highest_post_number %>
-
- |
-
-
+
<%= t.title.truncate(60, separator: /\s/) -%>
<%- if SiteSetting.show_topic_featured_link_in_digest && t.featured_link %>
diff --git a/app/views/users/password_reset.html.erb b/app/views/users/password_reset.html.erb
index 24364acffc..61a61feb64 100644
--- a/app/views/users/password_reset.html.erb
+++ b/app/views/users/password_reset.html.erb
@@ -49,6 +49,7 @@
<%- content_for(:no_ember_head) do %>
+
<%= script "ember_jquery" %>
<%= render_google_universal_analytics_code %>
<%- end %>
diff --git a/bin/docker/mailcatcher b/bin/docker/mailcatcher
index e25dc7c364..f1f258d70f 100755
--- a/bin/docker/mailcatcher
+++ b/bin/docker/mailcatcher
@@ -1,4 +1,4 @@
#!/bin/bash
-CMD="mailcatcher --http-ip 0.0.0.0 -f || (apt-get install -y libsqlite3-dev && gem install mailcatcher && mailcatcher --http-ip 0.0.0.0 -f)"
+CMD="mailcatcher --http-ip 0.0.0.0 -f"
docker exec -it discourse_dev /bin/bash -c "$CMD"
diff --git a/config/application.rb b/config/application.rb
index 5ac2319164..c098564340 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -80,14 +80,6 @@ module Discourse
config.assets.precompile << "locales/#{file.match(/([a-z_A-Z]+\.js)\.erb$/)[1]}"
end
- # Activate observers that should always be running.
- config.active_record.observers = [
- :user_email_observer,
- :user_action_observer,
- :post_alert_observer,
- :search_observer
- ]
-
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
config.time_zone = 'UTC'
@@ -142,7 +134,7 @@ module Discourse
# Our templates shouldn't start with 'discourse/templates'
config.handlebars.templates_root = 'discourse/templates'
- config.handlebars.raw_template_namespace = "Ember.TEMPLATES"
+ config.handlebars.raw_template_namespace = "Discourse.RAW_TEMPLATES"
require 'discourse_redis'
require 'logster/redis_store'
@@ -169,6 +161,22 @@ module Discourse
end
config.after_initialize do
+ # require common dependencies that are often required by plugins
+ # in the past observers would load them as side-effects
+ # correct behavior is for plugins to require stuff they need,
+ # however it would be a risky and breaking change not to require here
+ require_dependency 'category'
+ require_dependency 'post'
+ require_dependency 'topic'
+ require_dependency 'user'
+ require_dependency 'post_action'
+ require_dependency 'post_revision'
+ require_dependency 'notification'
+ require_dependency 'topic_user'
+ require_dependency 'group'
+ require_dependency 'user_field'
+ require_dependency 'post_action_type'
+
# So open id logs somewhere sane
OpenID::Util.logger = Rails.logger
if plugins = Discourse.plugins
diff --git a/config/locales/client.ar.yml b/config/locales/client.ar.yml
index 25fe51aa68..3425c725dd 100644
--- a/config/locales/client.ar.yml
+++ b/config/locales/client.ar.yml
@@ -425,18 +425,23 @@ ar:
few: "%{count} أعضاء"
many: "%{count} عضوًا"
other: "%{count} عضو"
+ group_histories:
+ actions:
+ add_user_to_group: "إضافة مستخدم"
groups:
- empty:
- posts: "لا مشاركات من أعضاء هذه المجموعة."
- members: "لا أعضاء في هذه المجموعة."
- mentions: "لم يُشر أحد إلى هذه المجموعة."
- messages: "لا رسائل لهذه المجموعة."
- topics: "لا مواضيع لأعضاء هذه المجموعة."
+ logs:
+ title: "السجلات"
+ details: "التفاصيل"
+ from: "من"
+ to: "إلى"
+ edit:
+ title: 'تعديل المجموعة'
+ full_name: 'الإسم الكامل'
+ add_members: "إضافة أعضاء"
add: "أضف"
selector_placeholder: "أضف أعضاء"
owner: "المالك"
visible: "المجموعة مرئية لكل المستخدمين"
- index: "المجموعات"
title:
zero: "مجموعات"
one: "مجموعات"
@@ -811,11 +816,8 @@ ar:
create: "أرسل دعوة"
generate_link: "انسخ رابط الدعوة"
bulk_invite:
- none: "لم تقم بدعوة اي احد حتى الان. تستطيع ارسال دعوة , أو ارسال عدة دعوات عن طريقuploading a bulk invite file."
text: "الدعوة من ملف"
- uploading: "يرفع..."
success: "رُفع الملف بنجاح. سيصلك إشعارا عبر رسالة عند اكتمال العملية."
- error: "حدثت مشكلة في رفع '{{filename}}': {{message}}"
password:
title: "كلمة المرور"
too_short: "كلمة المرور قصيرة جدا."
@@ -2505,15 +2507,12 @@ ar:
refresh: "تحديث"
new: "جديد"
selector_placeholder: "أدخل اسم المستخدم"
- name_placeholder: "اسم المجموعة، بدون مسافات. يتبع قواعد اسم المستخدم"
about: "هنا عدّل على عضوية المجموعة والاسماء"
group_members: "أعضاء المجموعة"
delete: "حذف"
delete_confirm: "أأحذف هذه المجموعة؟"
delete_failed: "تعذّر حذف المجموعة. إن كانت مجموعة آليّة، فلا يمكن تدميرها."
- delete_member_confirm: "أأزيل '%{username}' من المجموعة '%{group}'؟"
delete_owner_confirm: "هل تريد إزالة صلاحيات الإدارة من '%{username} ؟"
- name: "الاسم"
add: "اضافة"
add_members: "اضافة عضو"
custom: "مخصص"
diff --git a/config/locales/client.bs_BA.yml b/config/locales/client.bs_BA.yml
index 218da0806f..6d615d520e 100644
--- a/config/locales/client.bs_BA.yml
+++ b/config/locales/client.bs_BA.yml
@@ -586,11 +586,8 @@ bs_BA:
create: "Pošalji Pozivnicu"
generate_link: "Kopiraj link za invite"
bulk_invite:
- none: "Još niste nikoga pozvali ovdje. Moete slati pojedinačne pozivnice ili pozvati više ljudi odjednom učitavanjem datoteke za grupno pozivanje."
text: "Bulk Invite from File"
- uploading: "Uploading..."
success: "File uploaded successfully, you will be notified shortly with progress."
- error: "There was an error uploading '{{filename}}': {{message}}"
password:
title: "Šifra"
too_short: "Vaša šifra je prekratka."
@@ -1412,7 +1409,6 @@ bs_BA:
refresh: "Refresh"
new: "New"
selector_placeholder: "add users"
- name_placeholder: "Group name, no spaces, same as username rule"
about: "Edit your group membership and names here"
group_members: "Group members"
delete: "Delete"
diff --git a/config/locales/client.cs.yml b/config/locales/client.cs.yml
index c86a8b5e1d..74ce5362ea 100644
--- a/config/locales/client.cs.yml
+++ b/config/locales/client.cs.yml
@@ -347,17 +347,10 @@ cs:
few: "%{count} uživatelé"
other: "%{count} uživatelů"
groups:
- empty:
- posts: "V této skupině není od žádného člena ani jeden příspěvek."
- members: "V této skupině není žádny uživatel."
- mentions: "Tato skupina nebyla ještě @zmíněna."
- messages: "Pro tuto skupinu není žádná zpráva."
- topics: "V této skupině není od žádného člena ani jedno téma."
add: "Přidat"
selector_placeholder: "Přidat členy"
owner: "Vlastník"
visible: "Skupina je viditelná pro všechny uživatele"
- index: "Skupiny"
title:
one: "skupina"
few: "skupiny"
@@ -715,11 +708,8 @@ cs:
create: "Poslat pozvánku"
generate_link: "Zkopírovat odkaz na pozvánku"
bulk_invite:
- none: "Zatím jste nikoho nepozval. Můžete poslat individuální pozvánku nebo pozvat skupinu lidí naráz pomocí nahrání souboru."
text: "Hromadné pozvání s pomocí souboru"
- uploading: "Nahrávám..."
success: "Nahrání souboru proběhlo úspěšně. O dokončení celého procesu budete informování pomocí zprávy."
- error: "Nastala chyba při nahrávání '{{filename}}': {{message}}"
password:
title: "Heslo"
too_short: "Vaše heslo je příliš krátké."
@@ -2303,15 +2293,12 @@ cs:
refresh: "Obnovit"
new: "Nová"
selector_placeholder: "zadejte uživatelské jméno"
- name_placeholder: "Název skupiny, bez mezer, stejná pravidla jako pro uživatelská jména"
about: "Zde můžete upravit názvy skupin a členství"
group_members: "Členové skupiny"
delete: "Smazat"
delete_confirm: "Smazat toto skupiny?"
delete_failed: "Unable to delete group. If this is an automatic group, it cannot be destroyed."
- delete_member_confirm: "Odstranit '%{username}' ze '%{group}' skupiny?"
delete_owner_confirm: "Odstranit vlastnickou výsadu od '%{username}'?"
- name: "Jméno"
add: "Přidat"
add_members: "Přidat členy"
custom: "Přizpůsobené"
@@ -2328,11 +2315,6 @@ cs:
add_owners: Přidat vlastníky
incoming_email: "Vlastní příchozí emailová adresa"
incoming_email_placeholder: "zadej emailovou adresu"
- flair_url: "Avatar Flair Image"
- flair_url_placeholder: "(Volitelné) URL obrázku nebo třídy Font Awesome "
- flair_bg_color: "Avatar Flair Barva pozadí"
- flair_color: "Avatar Flair Color"
- flair_preview: "Náhled"
api:
generate_master: "Vygenerovat Master API Key"
none: "Nejsou tu žádné aktivní API klíče."
diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml
index 845f5f829b..3ab1cb7ed3 100644
--- a/config/locales/client.da.yml
+++ b/config/locales/client.da.yml
@@ -321,17 +321,10 @@ da:
one: "1 bruger"
other: "%{count} brugere"
groups:
- empty:
- posts: "Der er ingen indlæg af medlemmer af denne gruppe."
- members: "Der er ingen medlemmer i denne gruppe."
- mentions: "Denne gruppe er ikke nævnt."
- messages: "Der er ingen besked til denne gruppe."
- topics: "Der er intet emne af medlemmer af denne gruppe."
add: "Tilføj"
selector_placeholder: "Tilføj medlemmer"
owner: "ejer"
visible: "Gruppen er synlige for alle brugere"
- index: "Grupper"
title:
one: "gruppe"
other: "grupper"
@@ -683,11 +676,8 @@ da:
create: "Send en invitation"
generate_link: "Kopier invitations-link"
bulk_invite:
- none: "Du har ikke inviteret nogen her endnu. Du kan sende individuelle invitationer eller invitere en masse mennesker på én gang ved at uploade en samlet liste over invitationer."
text: "Masse invitering fra en fil"
- uploading: "Uploader..."
success: "Fil uploaded successfuldt, du vil blive meddelt via en beskede når processen er fuldendt."
- error: "Der var en fejl ved upload af filen '{{filename}}': {{message}}"
password:
title: "Adgangskode"
too_short: "Din adgangskode er for kort."
@@ -2067,15 +2057,12 @@ da:
refresh: "Genindlæs"
new: "Nye"
selector_placeholder: "indtast brugernavn"
- name_placeholder: "Gruppenavn, ingen mellemrum, på samme måde som brugernavne"
about: "Redigér gruppemedlemsskaber og gruppenavne her"
group_members: "Gruppe medlemmer"
delete: "Slet"
delete_confirm: "Slet denne gruppe?"
delete_failed: "Kan ikke slette gruppen. Hvis dette er en automatisk gruppe, kan den ikke ødelægges."
- delete_member_confirm: "Fjern '%{username}' fra gruppen '%{group}'?"
delete_owner_confirm: "Fjern ejer-privilegier for '%{username}'?"
- name: "Navn"
add: "Tilføj"
add_members: "Tilføj medlemmer"
custom: "Brugerdefineret"
@@ -2092,8 +2079,6 @@ da:
add_owners: Tilføj ejere
incoming_email: "Brugerdefineret indkommende email"
incoming_email_placeholder: "indtast email"
- flair_bg_color_placeholder: "(Valgfrit) Hex farveværdi"
- flair_preview: "Vis"
api:
generate_master: "Generér API-nøgle"
none: "Der er ingen aktive API-nøgler i øjeblikket."
diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml
index d59f5af7c8..4c1abc4875 100644
--- a/config/locales/client.de.yml
+++ b/config/locales/client.de.yml
@@ -321,18 +321,59 @@ de:
total_rows:
one: "1 Benutzer"
other: "%{count} Benutzer"
+ group_histories:
+ actions:
+ change_group_setting: "Gruppeneinstellung ändern"
+ add_user_to_group: "Benutzer hinzufügen"
+ remove_user_from_group: "Benutzer entfernen"
+ make_user_group_owner: "Zum Eigentümer machen"
+ remove_user_as_group_owner: "Eigentümerrechte entziehen"
groups:
+ logs:
+ title: "Protokolle"
+ when: "Wann"
+ action: "Aktion"
+ acting_user: "Benutzer der Aktion"
+ target_user: "Betroffener Benutzer"
+ subject: "Gegenstand"
+ details: "Details"
+ from: "Von"
+ to: "An"
+ edit:
+ title: 'Gruppe bearbeiten'
+ full_name: 'Vollständiger Name'
+ add_members: "Mitglieder hinzufügen"
+ delete_member_confirm: "'%{username}' aus der Gruppe '%{group}' entfernen?"
+ request_membership_pm:
+ title: "Mitgliedschaftsanfrage"
+ body: "Ich möchte mich um eine Mitgliedschaft in @%{groupName} bewerben."
+ name_placeholder: "Gruppenname, keine Leerzeichen, gleiche Regel wie beim Benutzernamen"
+ public: "Benutzern erlauben, die Gruppenzugehörigkeit frei zu wechseln (Erfordert, dass die Gruppe sichtbar ist)"
empty:
- posts: "Es gibt keinen Beitrag von Mitgliedern dieser Gruppe."
- members: "Diese Gruppe hat keine Mitglieder."
- mentions: "Diese Gruppe wurde nicht erwähnt."
+ posts: "Es gibt keine Beiträge von Mitgliedern dieser Gruppe."
+ members: "Es gibt keine Mitglieder in dieser Gruppe."
+ mentions: "Es gibt keine Erwähnungen in dieser Gruppe."
messages: "Es gibt keine Nachrichten für diese Gruppe."
- topics: "Es gibt kein Thema von Mitgliedern dieser Gruppe."
+ topics: "Es gibt keine Themen von Mitgliedern dieser Gruppe."
+ logs: "Es gibt keine Protokolleinträge für diese Gruppe."
add: "Hinzufügen"
+ join: "Gruppe beitreten"
+ leave: "Gruppe verlassen"
+ request: "Gruppenbeitritt beantragen"
+ automatic_group: Automatische Gruppe
+ closed_group: Geschlossene Gruppe
+ is_group_user: "Du bist ein Mitglied in dieser Gruppe."
+ allow_membership_requests: "Erlaube Benutzern, eine Mitgliedschaftsanfrage an Gruppenbesitzer zu schicken (Erfordert, dass jeder die Gruppe erwähnen kann)"
+ membership: "Mitgliedschaft"
+ name: "Name"
+ user_count: "Anzahl der Mitglieder"
+ bio: "Über die Gruppe"
selector_placeholder: "Mitglieder hinzufügen"
owner: "Eigentümer"
visible: "Gruppe ist für alle Benutzer sichtbar"
- index: "Gruppen"
+ index:
+ title: "Gruppen"
+ empty: "Es gibt keine sichtbaren Gruppen."
title:
one: "Gruppe"
other: "Gruppen"
@@ -367,6 +408,15 @@ de:
muted:
title: "Stummgeschaltet"
description: "Du erhältst keine Benachrichtigungen über neue Themen in dieser Gruppe."
+ flair_url: "Avatar-Hintergrund"
+ flair_url_placeholder: "(Optional) Bild-URL oder Font Awesome-Klasse"
+ flair_bg_color: "Avatar-Hintergrundfarbe"
+ flair_bg_color_placeholder: "(Optional) Hex-Farbwert"
+ flair_color: "Avatar-Hintergrundfarbe"
+ flair_color_placeholder: "(Optoinal) Hex-Farbwert"
+ flair_preview_icon: "Vorschau-Icon"
+ flair_preview_image: "Vorschaubild"
+ flair_note: "Hinweise: Ein Avatar-Hintergrund wird nur für die Hauptgruppe eines Benutzers angezeigt."
user_action_groups:
'1': "Abgegebene Likes"
'2': "Erhaltene Likes"
@@ -695,11 +745,9 @@ de:
link_generated: "Der Einladungslink wurde erfolgreich generiert!"
valid_for: "Der Einladungslink ist nur für die Adresse %{email} gültig"
bulk_invite:
- none: "Du hast noch niemanden hierher eingeladen. Du kannst individuelle Einladungen verschicken oder eine Masseneinladung an eine Gruppe von Leuten verschicken indem du eine Datei für Masseneinladung hochlädst."
+ none: "Du hast hier noch niemanden eingeladen. Du kannst einzelne Einladungen versenden, oder eine Reihe von Leuten auf einmal einladen, indem du eine CSV-Datei hochlädst."
text: "Masseneinladung aus Datei"
- uploading: "Wird hochgeladen…"
success: "Die Datei wurde erfolgreich hochgeladen. Du erhältst eine Nachricht, sobald der Vorgang abgeschlossen ist."
- error: "Beim Hochladen der Datei '{{filename}}' ist ein Fehler aufgetreten: {{message}}"
password:
title: "Passwort"
too_short: "Dein Passwort ist zu kurz."
@@ -964,8 +1012,10 @@ de:
title: "Oder drücke Strg+Eingabetaste"
users_placeholder: "Benutzer hinzufügen"
title_placeholder: "Um was geht es in dieser Diskussion? Schreib einen kurzen Satz."
+ title_or_link_placeholder: "Gib einen Titel ein oder füge einen Link ein"
edit_reason_placeholder: "Warum bearbeitest du?"
show_edit_reason: "(Bearbeitungsgrund hinzufügen)"
+ topic_featured_link_placeholder: "Gib einen Link, der mit dem Titel angezeigt wird."
reply_placeholder: "Schreib hier. Verwende Markdown, BBCode oder HTML zur Formatierung. Füge Bilder ein oder ziehe sie herein."
view_new_post: "Sieh deinen neuen Beitrag an."
saving: "Wird gespeichert"
@@ -1677,6 +1727,7 @@ de:
tags_allowed_tag_groups: "Schlagwortgruppen, die nur in dieser Kategorie verwendet werden können:"
tags_placeholder: "(Optional) Liste erlaubter Schlagwörter"
tag_groups_placeholder: "(Optional) Liste erlaubter Schlagwort-Gruppen"
+ topic_featured_link_allowed: "Erlaube hervorgehobene Links in dieser Kategorie"
delete: 'Kategorie löschen'
create: 'Neue Kategorie'
create_long: 'Eine neue Kategorie erstellen'
@@ -1711,6 +1762,7 @@ de:
email_in_disabled: "Das Erstellen von neuen Themen per E-Mail ist in den Website-Einstellungen deaktiviert. Um das Erstellen von neuen Themen per E-Mail zu erlauben,"
email_in_disabled_click: 'aktiviere die Einstellung „email in“.'
suppress_from_homepage: "Löse diese Kategorie von der Startseite."
+ all_topics_wiki: "Mache neue Themen standardmäßig zu Wikis."
sort_order: "Standardsortierung:"
allow_badges_label: "Erlaube das Verleihen von Abzeichen in dieser Kategorie."
edit_permissions: "Berechtigungen bearbeiten"
@@ -2225,15 +2277,12 @@ de:
refresh: "Aktualisieren"
new: "Neu"
selector_placeholder: "Benutzername eingeben"
- name_placeholder: "Gruppenname, keine Leerzeichen, gleiche Regel wie beim Benutzernamen"
about: "Hier kannst du Gruppenzugehörigkeiten und Gruppennamen bearbeiten."
group_members: "Gruppenmitglieder"
delete: "Löschen"
delete_confirm: "Diese Gruppe löschen?"
delete_failed: "Gruppe konnte nicht gelöscht werden. Wenn dies eine automatische Gruppe ist, kann sie nicht gelöscht werden."
- delete_member_confirm: "'%{username}' aus der Gruppe '%{group}' entfernen?"
delete_owner_confirm: "Eigentümerrechte für '%{username}' entfernen?"
- name: "Name"
add: "Hinzufügen"
add_members: "Mitglieder hinzufügen"
custom: "Benutzerdefiniert"
@@ -2250,14 +2299,6 @@ de:
add_owners: Eigentümer hinzufügen
incoming_email: "Benutzerdefinierte Adresse für eingehende E-Mails"
incoming_email_placeholder: "E-Mail-Adresse eingeben"
- flair_url: "Avatar Flair Bild"
- flair_url_placeholder: "(optionale) Bild-URL oder Font Awesome class"
- flair_bg_color: "Profilbild Dekor-Knopf Hintergrundfarbe"
- flair_bg_color_placeholder: "(Optional) Hex Farbwert"
- flair_color: "Avatar Flair Farbe"
- flair_color_placeholder: "(optionaler) Hex Farbenwert"
- flair_preview: "Vorschau"
- flair_note: "Beachte: Das Flair wird nur für die Primärgruppe eines Nutzers angezeigt"
api:
generate_master: "Master API Key erzeugen"
none: "Es gibt momentan keine aktiven API-Keys"
@@ -2312,7 +2353,7 @@ de:
details: "Wenn auf einen Beitrag geantwortet wird oder der Beitrag geändert, gelöscht oder wiederhergestellt wird."
user_event:
name: "Benutzer Ereignis"
- details: "Wenn ein Benutzer erstellt oder angenommen wird."
+ details: "Wenn ein Benutzer erstellt, genehmigt oder aktualisiert wird."
delivery_status:
title: "Versandstatus"
inactive: "Inaktiv"
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 257ab7fbe2..bd4b138524 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -401,7 +401,7 @@ en:
delete_member_confirm: "Remove '%{username}' from the '%{group}' group?"
request_membership_pm:
title: "Membership Request"
- body: "I would like to request membership in @%{groupName}."
+ body: "I would like to apply for membership in @%{groupName}."
name_placeholder: "Group name, no spaces, same as username rule"
public: "Allow users to join/leave the group freely (Requires group to be visible)"
empty:
@@ -415,17 +415,24 @@ en:
join: "Join Group"
leave: "Leave Group"
request: "Request to Join Group"
+ automatic_group: Automatic Group
+ closed_group: Closed Group
+ is_group_user: "You are a member of this group"
allow_membership_requests: "Allow users to send membership requests to group owners (Requires everyone to be able to mention the group)"
+ membership: "Membership"
name: "Name"
user_count: "Number of Members"
bio: "About Group"
selector_placeholder: "Add members"
owner: "owner"
visible: "Group is visible to all users"
- index: "Groups"
+ index:
+ title: "Groups"
+ empty: "There are no visible groups."
title:
one: "group"
other: "groups"
+ activity: "Activity"
members: "Members"
topics: "Topics"
posts: "Posts"
@@ -1471,6 +1478,7 @@ en:
go: "go"
jump_bottom: "jump to last post"
jump_prompt: "jump to post"
+ jump_prompt_of: "of %{count} posts"
jump_prompt_long: "What post would you like to jump to?"
jump_bottom_with_number: "jump to post %{post_number}"
total: total posts
@@ -1906,7 +1914,7 @@ en:
tags_allowed_tag_groups: "Tag groups that can only be used in this category:"
tags_placeholder: "(Optional) list of allowed tags"
tag_groups_placeholder: "(Optional) list of allowed tag groups"
- topic_featured_link_allowed: "Restricts editing the topic featured link in this category. Require site setting topic_featured_link_enabled is checked."
+ topic_featured_link_allowed: "Allow featured links in this category"
delete: 'Delete Category'
create: 'New Category'
create_long: 'Create a new category'
@@ -1941,6 +1949,7 @@ en:
email_in_disabled: "Posting new topics via email is disabled in the Site Settings. To enable posting new topics via email, "
email_in_disabled_click: 'enable the "email in" setting.'
suppress_from_homepage: "Suppress this category from the homepage."
+ all_topics_wiki: "Make new topics wikis by default."
sort_order: "Default Sort:"
allow_badges_label: "Allow badges to be awarded in this category"
edit_permissions: "Edit Permissions"
@@ -3212,6 +3221,7 @@ en:
user_preferences: "User Preferences"
tags: "Tags"
search: "Search"
+ groups: "Groups"
badges:
title: Badges
diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml
index a235a3a083..e95fa743a1 100644
--- a/config/locales/client.es.yml
+++ b/config/locales/client.es.yml
@@ -99,7 +99,7 @@ es:
x_years:
one: "%{count} año después"
other: "%{count} años después"
- previous_month: 'Anterior mes'
+ previous_month: 'Mes anterior'
next_month: 'Próximo mes'
share:
topic: 'comparte un enlace a este tema'
@@ -142,9 +142,9 @@ es:
bootstrap_mode_disabled: "El modo de arranque se desactivará en las próximas 24 horas."
s3:
regions:
- us_east_1: "US East (N. Virginia)"
- us_west_1: "US West (N. California)"
- us_west_2: "US West (Oregon)"
+ us_east_1: "EEUU Este (Virginia del Norte)"
+ us_west_1: "EEUU Oeste (Californa norte)"
+ us_west_2: "EEUU Oeste (Oregon)"
us_gov_west_1: "AWS GovCloud (US)"
eu_west_1: "UE (Irlanda)"
eu_central_1: "UE (Frankfurt)"
@@ -211,10 +211,10 @@ es:
all_time: "Todo el tiempo"
last_7_days: "Últimos 7 días"
last_30_days: "Últimos 30 días"
- like_count: "Me Gusta"
+ like_count: "Me gusta"
topic_count: "Temas"
post_count: "Posts"
- user_count: "Nuevos usuarios"
+ user_count: "Usuarios nuevos"
active_user_count: "Usuarios activos"
contact: "Contáctanos"
contact_info: "En caso de un error crítico o un asunto urgente referente a este sitio, por favor, contáctanos en %{contact_info}."
@@ -222,8 +222,8 @@ es:
title: "Marcador"
clear_bookmarks: "Quitar Marcadores"
help:
- bookmark: "Clic para guardar en marcadores el primer post de este tema"
- unbookmark: "Clic para quitar todos los marcadores de este tema"
+ bookmark: "Haz clic para guardar en marcadores el primer post de este tema"
+ unbookmark: "Haz clic para quitar todos los marcadores de este tema"
bookmarks:
not_logged_in: "Lo sentimos, debes iniciar sesión para guardar posts en marcadores."
created: "has guardado este post en marcadores"
@@ -270,7 +270,7 @@ es:
approve: 'Aprobar'
reject: 'Rechazar'
delete_user: 'Eliminar usuario'
- title: "Necesita Aprobación"
+ title: "Necesita aprobación"
none: "No hay posts para revisar"
edit: "Editar"
cancel: "Cancelar"
@@ -278,10 +278,10 @@ es:
has_pending_posts:
one: "Este tema tiene 1 post esperando aprobación"
other: "Este tema tiene {{count}} posts esperando aprobación"
- confirm: "Guardar Cambios"
+ confirm: "Guardar cambios"
delete_prompt: "¿Seguro que quieres eliminar a %{username}? Se eliminarán todos sus posts y se bloqueará su email y dirección IP."
approval:
- title: "El Post Necesita Aprobación"
+ title: "El post necesita aprobación"
description: "Hemos recibido tu nuevo post pero necesita ser aprobado por un moderador antes de aparecer. Por favor, ten paciencia."
pending_posts:
one: "Tienes 1 post pendiente."
@@ -302,13 +302,13 @@ es:
sent_by_user: "Enviado por {{user}}"
sent_by_you: "Enviado por ti"
directory:
- filter_name: "filtrar por usuario"
+ filter_name: "filtrar por nombre de usuario"
title: "Usuarios"
likes_given: "Dados"
likes_received: "Recibidos"
topics_entered: "Vistos"
topics_entered_long: "Temas vistos"
- time_read: "Tiempo de Lectura"
+ time_read: "Tiempo de lectura"
topic_count: "Temas"
topic_count_long: "Temas creados"
post_count: "Respuestas"
@@ -321,18 +321,59 @@ es:
total_rows:
one: "1 usuario"
other: "%{count} usuarios"
+ group_histories:
+ actions:
+ change_group_setting: "Cambiar ajustes de grupo"
+ add_user_to_group: "Añadir usuario"
+ remove_user_from_group: "Quitar usuario"
+ make_user_group_owner: "Convertir en dueño"
+ remove_user_as_group_owner: "Quitar de dueño"
groups:
+ logs:
+ title: "Registros"
+ when: "Cuándo"
+ action: "Acción"
+ acting_user: "Usuario que actuó"
+ target_user: "Usuario objetivo"
+ subject: "Sujeto"
+ details: "Detalles"
+ from: "De"
+ to: "A"
+ edit:
+ title: 'Editar grupo'
+ full_name: 'Nombre completo'
+ add_members: "Añadir miembros"
+ delete_member_confirm: "¿Quitar a '%{username}' del grupo '%{group}'?"
+ request_membership_pm:
+ title: "Solicitud de miembro"
+ body: "Me gustaría pertenecer al grupo @%{groupName}."
+ name_placeholder: "Nombre del grupo, sin espacios, igual que los nombres de usuarios"
+ public: "Permitir a los usuarios unirse o salir del grupo cuando quieran (es necesario que el grupo sea visible)"
empty:
- posts: "No hay mensajes publicados por los miembros de este grupo."
- members: "Este grupo no tiene miembros."
+ posts: "No existe ningún post de miembros de este grupo"
+ members: "No hay miembros en este grupo."
mentions: "No hay menciones de este grupo."
- messages: "No hay mensajes para este grupo."
+ messages: "No hay menciones a este grupo."
topics: "No hay temas de miembros de este grupo."
+ logs: "No hay registros para este grupo."
add: "Añadir"
+ join: "Unirse al grupo"
+ leave: "Salirse del grupo"
+ request: "Solicitar unirse al grupo"
+ automatic_group: Grupo automático
+ closed_group: Grupo cerrado
+ is_group_user: "Eres miembro de este grupo"
+ allow_membership_requests: "Permitir a los usuarios solicitudes para ser miembro a los dueños del grupo (es necesario que todo el mundo pueda mencionar al grupo)"
+ membership: "Membresía"
+ name: "Nombre"
+ user_count: "Número de miembros"
+ bio: "Acerca del grup"
selector_placeholder: "Añadir miembros"
owner: "propietario"
visible: "El grupo es visible para todos los usuarios"
- index: "Grupos"
+ index:
+ title: "Grupos"
+ empty: "No hay grupos visibles."
title:
one: "grupo"
other: "grupos"
@@ -354,7 +395,7 @@ es:
notifications:
watching:
title: "Vigilando"
- description: "e te notificará de cada nuevo post en este mensaje y se mostrará un contador de nuevos posts."
+ description: "Se te notificará de cada nuevo post en este mensaje y se mostrará un contador de nuevos posts."
watching_first_post:
title: "Vigilar Primer Post"
description: "Sólo se te notificará del primer post en cada nuevo tema en este grupo."
@@ -367,6 +408,15 @@ es:
muted:
title: "Silenciado"
description: "Nunca se te notificará de nada sobre temas en este grupo."
+ flair_url: "Adorno de imagen de usuario"
+ flair_url_placeholder: "(Opcional) Dirección URL de una imagen o clase de Font Awesome"
+ flair_bg_color: "Color de fondo del adorno de la imagen de usuario"
+ flair_bg_color_placeholder: "(Opcional) Valor del color en hexadecimal"
+ flair_color: "Color del adorno de la imagen de usuario"
+ flair_color_placeholder: "(Opcional) Valor del color en hexadecimal"
+ flair_preview_icon: "Previsualización del icono"
+ flair_preview_image: "Previsualización de la imagen"
+ flair_note: "Nota: el adorno solo se mostrará para el grupo primario del usuario."
user_action_groups:
'1': "'Me gusta' Dados"
'2': "'Me gusta' Recibidos"
@@ -695,11 +745,9 @@ es:
link_generated: "¡Enlace de invitación generado satisfactoriamente!"
valid_for: "El enlace de invitación sólo es válido para esta dirección: %{email}"
bulk_invite:
- none: "No has invitado a nadie todavía. Puedes enviar invitaciones individuales o invitar a un grupo de personas a la vez subiendo un archivo para invitaciones en masa."
+ none: "Aún no has invitado a nadie aquí. Puedes enviar invitaciones individuales, o invitar varias personas a la vez subiendo un archivo CSV."
text: "Archivo de Invitación en Masa"
- uploading: "Subiendo..."
success: "Archivo subido correctamente, se te notificará con un mensaje cuando se complete el proceso."
- error: "Hubo un error al subir '{{filename}}': {{message}}"
password:
title: "Contraseña"
too_short: "Tu contraseña es demasiada corta."
@@ -793,9 +841,9 @@ es:
enabled: "Este sitio está en modo solo-lectura. Puedes continuar navegando pero algunas acciones como responder o dar \"me gusta\" no están disponibles por ahora."
login_disabled: "Iniciar sesión está desactivado mientras el foro esté en modo solo lectura."
logout_disabled: "Cerrar sesión está desactivado mientras el sitio se encuentre en modo de sólo lectura."
- too_few_topics_and_posts_notice: "¡Vamos a dar por comenzada la comunidad! Hay %{currentTopics} / %{requiredTopics} temas y %{currentPosts} / %{requiredPosts} mensajes. Los nuevos visitantes necesitan algo que leer y a lo que responder."
+ too_few_topics_and_posts_notice: "¡Vamos a dar por comenzada la comunidad! Hay %{currentTopics} / %{requiredTopics} temas y %{currentPosts} / %{requiredPosts} posts. Los nuevos visitantes necesitan algo que leer y a lo que responder."
too_few_topics_notice: "¡Vamos a dar por comenzada la comunidad! Hay %{currentTopics} / %{requiredTopics} temas. Los nuevos visitantes necesitan algo que leer y a lo que responder."
- too_few_posts_notice: "¡Vamos a dar por empezada la comunidad! Hay %{currentPosts} / %{requiredPosts} mensajes. Los nuevos visitantes necesitan algo que leer y a lo que responder."
+ too_few_posts_notice: "¡Vamos a dar por empezada la comunidad! Hay %{currentPosts} / %{requiredPosts} posts. Los nuevos visitantes necesitan algo que leer y a lo que responder."
logs_error_rate_notice:
reached: "%{relativeAge} – %{rate} alcanzó el límite establecido en las opciones del sitio del %{siteSettingRate}."
exceeded: "%{relativeAge} – %{rate} excedió el límite establecido en las opciones del sitio del %{siteSettingRate}."
@@ -826,7 +874,7 @@ es:
hide_forever: "no, gracias"
hidden_for_session: "Vale, te preguntaremos mañana. Recuerda que también puedes usar el botón 'Iniciar sesión' para crear una cuenta en cualquier momento."
intro: "¡Hola! :heart_eyes: Parece que estás interesado en las cosas que nuestros usuarios publican, pero no tienes una cuenta registrada."
- value_prop: "Cuando te registras, recordamos lo que has leído, para que puedas volver justo donde estabas leyendo. También recibes notificaciones, por aquí y por email, cuando se publican nuevos mensajes. ¡También puedes darle a Me gusta a los mensajes! :heartbeat:"
+ value_prop: "Cuando te registras, recordamos lo que has leído, para que puedas volver justo donde estabas leyendo. También recibes notificaciones, por aquí y por email, cuando se publican nuevos posts. ¡También puedes darle a Me gusta a los mensajes! :heartbeat:"
summary:
enabled_description: "Estás viendo un resumen de este tema: los posts más interesantes determinados por la comunidad."
description: "Hay {{replyCount}} respuestas."
@@ -964,6 +1012,7 @@ es:
title: "O pulsa Ctrl+Intro"
users_placeholder: "Añadir usuario"
title_placeholder: "En una frase breve, ¿de qué trata este tema?"
+ title_or_link_placeholder: "Escribe un título o pega un enlace aquí"
edit_reason_placeholder: "¿Por qué lo estás editando?"
show_edit_reason: "(añadir motivo de edición)"
topic_featured_link_placeholder: "Introduce el enlace mostrado con el título."
@@ -1662,22 +1711,6 @@ es:
side_by_side_markdown:
title: "Mostrar las diferencias crudas a la par"
button: ' Crudo'
- group:
- edit:
- title: 'Editar grupo'
- title: 'Títul'
- name: "Nombre"
- bio: "Sobre el grupo"
- name_placeholder: "Nombre del grupo, sin espacios, al igual que un usuario"
- flair_url: "Imagen distintiva"
- flair_url_placeholder: "(Opcional) URL de la imagen o Clase de Font Awesome"
- flair_bg_color: "Color de fondo de la imagen distintiva"
- flair_bg_color_placeholder: "(Opcional) Valor hexadecimal del color"
- flair_color: "Color de la imagen distintiva"
- flair_color_placeholder: "(Opcional) Valor hexadecimal del color"
- flair_preview_icon: "Vista previa del icono"
- flair_preview_image: "Vista previa de la imagen"
- flair_note: "Nota: la imagen distintiva sólo se mostrará para el grupo primario del usuario."
category:
can: 'puede… '
none: '(sin categoría)'
@@ -1694,7 +1727,7 @@ es:
tags_allowed_tag_groups: "Grupos de etiquetas que sólo pueden pueden utilizarse en esta categoría:"
tags_placeholder: "(Opcional) lista de etiquetas permitidas"
tag_groups_placeholder: "(Opcional) lista de grupos de etiquetas permitidos"
- topic_featured_link_allowed: "Limita la edición del enlace destacado del tema en esta categoría. Requiere que la opción topic_featured_link_enabled esté habilitada."
+ topic_featured_link_allowed: "Permitir enlaces destacados en esta categoría"
delete: 'Eliminar categoría'
create: 'Crear categoría'
create_long: 'Crear una nueva categoría'
@@ -1729,6 +1762,7 @@ es:
email_in_disabled: "La posibilidad de publicar nuevos temas por email está deshabilitada en los ajustes del sitio. Para habilitar la publicación de nuevos temas por email,"
email_in_disabled_click: 'activa la opción "email in".'
suppress_from_homepage: "Ocultar categoría de la página de inicio."
+ all_topics_wiki: "Hacer todos los temas wiki por defecto"
sort_order: "Orden por defecto:"
allow_badges_label: "Permitir conceder distintivos en esta categoría"
edit_permissions: "Editar permisos"
@@ -2247,15 +2281,12 @@ es:
refresh: "Actualizar"
new: "Nuevo"
selector_placeholder: "introduce nombre de usuario"
- name_placeholder: "Nombre del grupo, sin espacios, al igual que la regla del nombre usuario"
about: "Edita los aquí los nombres de los grupos y sus miembros"
group_members: "Miembros del grupo"
delete: "Borrar"
delete_confirm: "Borrar este grupo?"
delete_failed: "No se pudo borrar el grupo. Si este es un grupo automático, no se puede destruir."
- delete_member_confirm: "¿Eliminar a '%{username}' del grupo '%{group}'?"
delete_owner_confirm: "¿Quitar privilegios de propietario para '%{username}'?"
- name: "Nombre"
add: "Añadir"
add_members: "Añadir miembros"
custom: "Personalizado"
@@ -2272,14 +2303,6 @@ es:
add_owners: Añadir propietarios
incoming_email: "Correos electrónicos entrantes personalizados"
incoming_email_placeholder: "introducir dirección de email"
- flair_url: "Imagen distintiva"
- flair_url_placeholder: "(Opcional) URL de imagen o clase de Font Awesome"
- flair_bg_color: "Color de fondo de imagen distintiva"
- flair_bg_color_placeholder: "(Optional) Valor hexadecimal del color"
- flair_color: "Color de la imagen distintiva"
- flair_color_placeholder: "(Opcional) Color en valor hexadecimal"
- flair_preview: "Vista previa"
- flair_note: "Nota: sólo se mostrará la imagen distintiva del grupo principal del usuario."
api:
generate_master: "Generar clave maestra de API"
none: "No hay ninguna clave de API activa en este momento."
@@ -2334,7 +2357,7 @@ es:
details: "Cuando se publique, edite, elimine o recupere una respuesta."
user_event:
name: "Evento de usuario"
- details: "Cuando se cree o apruebe un usuario."
+ details: "Cuando un usuario es creado, aprobado o actualizado."
delivery_status:
title: "Estado de entrega"
inactive: "Inactivo"
diff --git a/config/locales/client.et.yml b/config/locales/client.et.yml
index 799598b9b8..694effb5a2 100644
--- a/config/locales/client.et.yml
+++ b/config/locales/client.et.yml
@@ -322,17 +322,10 @@ et:
one: "1 kasutaja"
other: "%{count} kasutajat"
groups:
- empty:
- posts: "Selle grupi liikmetelt ei ole postitusi."
- members: "Selles grupis liikmeid pole."
- mentions: "Seda gruppi pole mainitud."
- messages: "Sellele grupile teated puuduvad."
- topics: "Selle grupi liikmetelt teemasid ei ole."
add: "Lisa"
selector_placeholder: "Lisa liikmeid"
owner: "omanik"
visible: "Grupp on kõigile kasutajatele nähtav."
- index: "Grupid"
title:
one: "grupp"
other: "grupid"
@@ -1660,22 +1653,6 @@ et:
side_by_side_markdown:
title: "Näita töötlemata lähteandmete erinevusi kõrvuti"
button: ' Toores'
- group:
- edit:
- title: 'Muuda gruppi'
- title: 'Pealkiri'
- name: "Nimi"
- bio: "Grupist"
- name_placeholder: "Grupi nimi, tühikuteta, vastab kasutajanime reeglitele"
- flair_url: "Avatari andekuse pilt"
- flair_url_placeholder: "(Valikuline) Pildi URL või Font Awesome klass"
- flair_bg_color: "Avatari andekuse taustavärv"
- flair_bg_color_placeholder: "(Valikuline) Värvi väärtus heksakoodis"
- flair_color: "Avatari andekuse värv"
- flair_color_placeholder: "(Valikuline) Värvi väärtus heksakoodis"
- flair_preview_icon: "Ikooni eelvaatlus"
- flair_preview_image: "Pildi eelvaatlus"
- flair_note: "Märkus: Andekus kuvatakse vaid kasutaja põhigrupi jaoks."
category:
can: 'saab… '
none: '(foorum puudub)'
@@ -1692,7 +1669,6 @@ et:
tags_allowed_tag_groups: "Siltide grupid, mida saab kasutada vaid selles foorumis:"
tags_placeholder: "(Valikuline) loetelu lubatud silte"
tag_groups_placeholder: "(Valikuline) loetelu lubatud siltide gruppe"
- topic_featured_link_allowed: "Piirab teema põhiloo lingi redigeerimist selles foorumis. Nõuab, et saidi säte topic_featured_link_enabled oleks märgistatud."
delete: 'Kustuta foorum'
create: 'Uus foorum'
create_long: 'Loo uus foorum'
@@ -2247,15 +2223,12 @@ et:
refresh: "Värskenda"
new: "Uus"
selector_placeholder: "sisesta kasutajanimi"
- name_placeholder: "Grupi nimi, tühikuteta, vastab kasutajanime reeglitele"
about: "Siin saad muuta oma grupi liikmelisust ja nimesid"
group_members: "Grupi liikmed"
delete: "Kustuta"
delete_confirm: "Kustutame selle grupi?"
delete_failed: "Ei suuda kustutada seda gruppi. Kui see on automaatne grupp, ei saa seda hävitada."
- delete_member_confirm: "Eemalda '%{username}' grupist '%{group}'?"
delete_owner_confirm: "Eemaldan kasutajalt '%{username}' omaniku õigused?"
- name: "Nimi"
add: "Lisa"
add_members: "Lisa liikmeid"
custom: "Individuaalne"
@@ -2272,7 +2245,6 @@ et:
add_owners: Lisa omanikke
incoming_email: "Individuaalne sissetuleva meili aadress"
incoming_email_placeholder: "sisesta meiliaadress"
- flair_preview: "Eelvaade"
api:
generate_master: "Genereeri API peavõti"
none: "Hetkel aktiivsed API võtmed puuduvad."
@@ -2327,7 +2299,6 @@ et:
details: "Kui teemas on uus vastus, muudatus, kustutamine või taastamine."
user_event:
name: "Kasutaja sündmus"
- details: "Kui kasutaja luakse või heaks kiidetakse."
delivery_status:
title: "Kättetoimetamise staatus"
inactive: "Mitteaktiivne"
diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml
index 33fbec66f4..c4c1eadfc3 100644
--- a/config/locales/client.fa_IR.yml
+++ b/config/locales/client.fa_IR.yml
@@ -264,16 +264,12 @@ fa_IR:
total_rows:
other: "%{count} کاربران"
groups:
- empty:
- posts: "در این گروه هیچ پستی توسط کاربران "
- members: "هیچ عضوی در این گروه وجود ندارد."
- mentions: "هیچ کجا به این گروه اشارهای نشده است."
- messages: "پیامی در این گروه وجود ندارد."
- topics: "در این گروه هیچ موضوعی توسط کاربران ارسال نشده."
add: "افزودن"
selector_placeholder: "افزودن عضو"
owner: "مالک"
visible: "همهٔ کاربران گروه را میبینند"
+ index:
+ title: "گروهها"
title:
other: "گروهها"
members: "اعضا"
@@ -559,11 +555,8 @@ fa_IR:
create: "فرستادن یک دعوتنامه"
generate_link: "کپی لینک دعوت"
bulk_invite:
- none: "شما هنوز کسی را اینجا دعوت نکرده اید. می توانید بصورت تکی یا گروهی یکجا دعوتنامه را بفرستید از طریق بارگذار فراخوانه فله ای ."
text: "دعوت گروهی از طریق فایل"
- uploading: "بارگذاری..."
success: "فایل با موفقیت بارگذاری شد٬ وقتی که پروسه تمام شد به شما را از طریق پیام اطلاع می دهیم. "
- error: "در بارگذاری «{{filename}}» خطایی روی داد: {{message}}"
password:
title: "رمزعبور"
too_short: "رمز عبورتان خیلی کوتاه است"
@@ -572,6 +565,10 @@ fa_IR:
same_as_email: "رمز عبورتان با ایمیل شما برابر است. "
ok: "گذرواژهٔ خوبی است."
instructions: "در آخرین %{count} کاراکتر"
+ summary:
+ top_badges: "مدال های برتر"
+ no_badges: "هنوز مدالی نیست."
+ more_badges: "مدال های بیشتر"
associated_accounts: "ورود ها"
ip_address:
title: "آخرین نشانی IP"
@@ -904,6 +901,8 @@ fa_IR:
category: "هیچ موضوعاتی در {{category}} نیست."
top: "موضوع برتر وجود ندارد."
search: " هیچ نتیجه جستجویی وجود ندارد."
+ educate:
+ unread: ' موضوعات جدید در اینجا قرار می گیرند. به طور پیش فرض، موضوعات جدید در نظر گرفته خواهند شد و نشان داده می شوند جدید شاخص اگر آنها در 2 روز گذشته ایجاد شده باشند شما می توانید این را برای خود تغییر دهید تنظیمات. '
bottom:
latest: "موضوع تازهٔ دیگری نیست."
hot: "موضوع داغ دیگری نیست."
@@ -1503,6 +1502,14 @@ fa_IR:
full: "ساختن / پاسخ دادن / دیدن"
create_post: "پاسخ دادن / دیدن"
readonly: "دیدن"
+ badges:
+ earned_n_times:
+ other: "این مدال را %{count} بار به دست آورده"
+ others_count: "بقیه با این مدال (%{count})"
+ title: مدال ها
+ badge_count:
+ other: "%{count} مدال"
+ select_badge_for_title: انتخاب یک مدال برای استفاده در عنوان خود
admin_js:
type_to_filter: "بنویسید تا فیلتر کنید..."
admin:
@@ -1621,15 +1628,12 @@ fa_IR:
refresh: "تازه کردن"
new: "جدید"
selector_placeholder: "نام کاربری را وارد نمایید ."
- name_placeholder: "نام گروه، بدون فاصله، همان قاعده نام کاربری"
about: "اعضای گروهت و نام ها را اینجا ویرایش کن"
group_members: "اعضای گروه"
delete: "حذف"
delete_confirm: "حفظ کردن این گروه؟"
delete_failed: "قادر به حذف گروه نیستیم. اگر این یک گروه خودکار است، نمی توان آن را از بین برد."
- delete_member_confirm: "حذف کردن '%{username}' از '%{group}' گروه؟"
delete_owner_confirm: "حذف حق مالکیت برای '%{username}'؟"
- name: "نام"
add: "اضافه کردن"
add_members: "اضافه کردن عضو"
custom: "دلخواه"
diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml
index b3776d68d9..59d93b5477 100644
--- a/config/locales/client.fi.yml
+++ b/config/locales/client.fi.yml
@@ -321,28 +321,67 @@ fi:
total_rows:
one: "1 käyttäjä"
other: "%{count} käyttäjää"
+ group_histories:
+ actions:
+ change_group_setting: "Muuta ryhmän asetusta"
+ add_user_to_group: "Lisää käyttäjä"
+ remove_user_from_group: "Poista käyttäjä"
+ make_user_group_owner: "Myönnä isännyys"
+ remove_user_as_group_owner: "Peru isännyys"
groups:
+ logs:
+ title: "Lokit"
+ when: "Milloin"
+ action: "Toiminta"
+ acting_user: "Toimiva käyttäjä"
+ target_user: "Kohdekäyttäjä"
+ subject: "Aihe"
+ details: "Yksityiskohdat"
+ edit:
+ title: 'Muuta ryhmää'
+ full_name: 'Täysimittainen nimi'
+ add_members: "Lisää jäseniä"
+ delete_member_confirm: "Poista '%{username}' ryhmästä '%{group}'?"
+ request_membership_pm:
+ title: "Jäsenhakemus"
+ body: "Haluaisin ryhmään @%{groupName}."
+ name_placeholder: "Ryhmän nimi. Ei välilyöntejä, samat säännöt kuin käyttäjänimillä"
+ public: "Salli jäsenten liittyä/poistua ryhmästä vapaasti (ryhmän tulee olla näkyvillä)"
empty:
- posts: "Ryhmän jäsenet eivät ole kirjoittaneet viestejä."
- members: "Kukaan ei kuulu tähän ryhmään."
+ posts: "Ryhmän jäsenet eivät ole lähettäneet viestejä."
+ members: "Ryhmässä ei ole jäseniä."
mentions: "Ryhmää ei ole mainittu."
- messages: "Tällä ryhmällä ei ole yksityistä ketjua."
- topics: "Ryhmän jäsenet eivät ole aloittaneet ketjuja."
+ messages: "Ryhmälle ei ole yksityisviestejä."
+ topics: "Ryhmän jäsenet eivät ole luoneet ketjuja."
+ logs: "Ryhmälle ei ole lokitietoja."
add: "Lisää"
+ join: "Liity ryhmään"
+ leave: "Poistu ryhmästä"
+ request: "Hae ryhmään"
+ automatic_group: Automaattinen ryhmä
+ closed_group: Suljettu ryhmä
+ is_group_user: "Olet tämän ryhmän jäsen"
+ allow_membership_requests: "Salli käyttäjien lähettää jäsenhakemuksia ryhmien isännille (vaatii että kaikki voivat mainita ryhmän)"
+ membership: "Jäsenyys"
+ name: "Nimi"
+ user_count: "Jäsenmäärä"
+ bio: "Tietoa ryhmästä"
selector_placeholder: "Lisää jäseniä"
owner: "omistaja"
visible: "Ryhmä näkyy kaikille käyttäjille"
- index: "Ryhmät"
+ index:
+ title: "Ryhmät"
+ empty: "Näkyvillä olevia ryhmiä ei ole."
title:
one: "ryhmä"
other: "ryhmät"
members: "Jäsenet"
topics: "Ketjut"
posts: "Viestit"
- mentions: "Viittaukset"
+ mentions: "Maininnat"
messages: "Viestit"
alias_levels:
- title: "Ketkä voivat lähettää viestejä tälle ryhmälle tai @viitata siihen?"
+ title: "Ketkä voivat lähettää viestejä tälle ryhmälle tai @mainita sen?"
nobody: "Ei kukaan"
only_admins: "Vain ylläpitäjät"
mods_and_admins: "Vain ylläpitäjät ja valvojat"
@@ -367,6 +406,15 @@ fi:
muted:
title: "Vaimennetut"
description: "Et saa ilmoituksia uusista ketjuista tässä ryhmässä."
+ flair_url: "Avatarpinssin kuva"
+ flair_url_placeholder: "(Valinnainen) kuvan URL tai Font Awesome -luokka"
+ flair_bg_color: "Avatar-pinssin taustaväri"
+ flair_bg_color_placeholder: "(Valinnainen) värin Hex-arvo"
+ flair_color: "Avatarpinssin väri"
+ flair_color_placeholder: "(Valinnainen) värin Hex-arvo"
+ flair_preview_icon: "Ikonin esikatselu"
+ flair_preview_image: "Kuvan esikatselu"
+ flair_note: "Huom. Käyttäjän ensisijainen ryhmä määrää pinssin."
user_action_groups:
'1': "Annetut tykkäykset"
'2': "Saadut tykkäykset"
@@ -374,7 +422,7 @@ fi:
'4': "Ketjut"
'5': "Vastauksia"
'6': "Vastaukset"
- '7': "Viittaukset"
+ '7': "Maininnat"
'9': "Lainaukset"
'11': "Muokkaukset"
'12': "Lähetetyt"
@@ -432,7 +480,7 @@ fi:
button_text: "Lataa viestini"
confirm: "Haluatko varmasti ladata viestisi?"
success: "Lataus aloitettu. Saat ilmoituksen yksityisviestinä, kun prosessi on valmis."
- rate_limit_error: "Viestit voi ladata kerran vuorokaudessa. Ole hyvä ja yritä huomenna uudelleen."
+ rate_limit_error: "Viestit voi ladata kerran vuorokaudessa. Yritä huomenna uudelleen."
new_private_message: "Uusi viesti"
private_message: "Viesti"
private_messages: "Viestit"
@@ -575,7 +623,7 @@ fi:
title: "Sähköposti"
instructions: "Ei tule julkiseksi"
ok: "Lähetämme sinulle sähköpostin varmistukseksi."
- invalid: "Ole hyvä ja anna toimiva sähköpostiosoite"
+ invalid: "Sähköpostiosoite ei kelpaa."
authenticated: "{{provider}} on todentanut sähköpostiosoitteesi"
frequency_immediately: "Saat sähköpostia välittömästi, jollet ole jo lukenut asiaa, jota sähköpostiviesti koskee."
frequency:
@@ -638,7 +686,7 @@ fi:
every_two_weeks: "joka toinen viikko"
include_tl0_in_digests: "Sisällytä uusien käyttäjien viestit sähköpostikoosteisiin"
email_in_reply_to: "Liitä sähköpostiin lyhennelmä viestistä, johon vastataan"
- email_direct: "Lähetä minulle sähköposti, jos joku lainaa viestiäni, vastaa viestiini, viittaa @nimeeni tai kutsuu minut viestiketjuun"
+ email_direct: "Lähetä minulle sähköposti, jos joku lainaa viestiäni, vastaa viestiini, maintsee @nimeni tai kutsuu minut viestiketjuun"
email_private_messages: "Lähetä minulle sähköposti, kun joku lähettää minulle viestin"
email_always: "Lähetä sähköposti-ilmoitukset, vaikka olen aktiivinen palstalla."
other_settings: "Muut"
@@ -696,11 +744,9 @@ fi:
link_generated: "Kutsulinkki luotiin onnistuneesti!"
valid_for: "Kutsulinkki on käypä tälle sähköpostiosoitteelle: %{email}"
bulk_invite:
- none: "Et ole kutsunut vielä ketään. Voit lähettää yksittäisiä kutsuja tai kutsua useita ihmisiä kerralla lähettämällä massakutsun tiedostosta."
+ none: "Et ole kutsunut vielä ketään tänne. Voit lähettää yksittäisiä kutsuja tai kutsua joukon ihmisiä kerralla lataamalla CSV-tiedoston."
text: "Lähetä massakutsu tiedostosta"
- uploading: "Lähettää..."
success: "Tiedoston lähettäminen onnistui. Saat viestin, kun prosessi on valmis."
- error: "Tiedoston '{{filename}}' lähetyksen aikana tapahtui virhe: {{message}}"
password:
title: "Salasana"
too_short: "Salasanasi on liian lyhyt."
@@ -873,7 +919,7 @@ fi:
email_placeholder: "sähköposti tai käyttäjätunnus"
caps_lock_warning: "Caps Lock on päällä"
error: "Tuntematon virhe"
- rate_limit: "Ole hyvä ja odota hetki ennen kuin yrität kirjautua uudelleen."
+ rate_limit: "Odota hetki ennen kuin yrität kirjautua uudelleen."
blank_username_or_password: "Kirjoita sähköpostiosoite tai käyttäjänimi ja salasana."
reset_password: 'Uusi salasana'
logging_in: "Kirjaudutaan..."
@@ -941,8 +987,8 @@ fi:
similar_topics: "Tämä ketju vaikuttaa samalta kuin.."
drafts_offline: "offline luonnokset"
group_mentioned:
- one: "Jos viittaat ryhmään {{group}}, 1 käyttäjä saa ilmoituksen – oletko varma?"
- other: "Jos viittaat ryhmään {{group}}, {{count}} käyttäjää saa ilmoituksen – oletko varma?"
+ one: "Jos mainitset ryhmän {{group}}, 1 käyttäjä saa ilmoituksen – oletko varma?"
+ other: "Jos mainitset ryhmän {{group}}, {{count}} käyttäjää saa ilmoituksen – oletko varma?"
cannot_see_mention:
category: "Mainitsit käyttäjän {{username}} mutta hän ei saa ilmoitusta, koska hänellä ei ole pääsyä tälle alueelle. Hänet tulee lisätä ryhmään, jolla on pääsy alueelle."
private: "Mainitsit käyttäjän {{username}} mutta hän ei saa ilmoitusta, koska hän ei näe tätä yksityiskeskustelua. Hänet tulee kutsua tähän yksityiskeskusteluun."
@@ -965,6 +1011,7 @@ fi:
title: "Tai paina Ctrl+Enter"
users_placeholder: "Lisää käyttäjä"
title_placeholder: "Kuvaile lyhyesti mistä tässä ketjussa on kyse?"
+ title_or_link_placeholder: "Kirjoita otsikko tai liitä linkki tähän"
edit_reason_placeholder: "miksi muokkaat viestiä?"
show_edit_reason: "(lisää syy muokkaukselle)"
reply_placeholder: "Kirjoita tähän. Käytä Markdownia, BBCodea tai HTML:ää muotoiluun. Raahaa tai liitä kuvia."
@@ -1012,7 +1059,7 @@ fi:
admin_options_title: "Tämän ketjun vain henkilökunnalle näytettävät asetukset"
auto_close:
label: "Sulje ketju automaattisesti tämän ajan jälkeen:"
- error: "Ole hyvä ja syötä kelpaava arvo."
+ error: "Arvo ei kelpaa."
based_on_last_post: "Älä sulje ennen kuin viimeisin viesti ketjussa on vähintään näin vanha."
all:
examples: 'Syötä aika tunteina (24), absoluuttisena aikana (17:30) tai aikaleimana (2013-11-22 14:00).'
@@ -1048,7 +1095,7 @@ fi:
one: " {{count}} viesti ryhmän {{group_name}} saapuneissa "
other: " {{count}} viestiä ryhmän {{group_name}} saapuneissa "
alt:
- mentioned: "Viittaaja"
+ mentioned: "Mainitsija"
quoted: "Lainaaja"
replied: "Vastasi"
posted: "Kirjoittaja"
@@ -1678,6 +1725,7 @@ fi:
tags_allowed_tag_groups: "Tällä alueella sallitut tunnisteryhmät:"
tags_placeholder: "(Valinnainen) lista sallituista tunnisteista"
tag_groups_placeholder: "(Valinnainen) lista sallituista tunnisteryhmistä"
+ topic_featured_link_allowed: "Salli ketjulinkit tällä alueella"
delete: 'Poista alue'
create: 'Uusi alue'
create_long: 'Luo uusi alue'
@@ -1712,6 +1760,7 @@ fi:
email_in_disabled: "Uusien ketjujen luominen sähköpostitse on otettu pois käytöstä sivuston asetuksissa. Salliaksesi uusien ketjujen luomisen sähköpostilla, "
email_in_disabled_click: 'ota käyttöön "email in" asetus.'
suppress_from_homepage: "Vaimenna alue kotisivulta."
+ all_topics_wiki: "Tee uusista ketjuista wiki-viestejä oletuksena."
sort_order: "Oletusjärjestys:"
allow_badges_label: "Salli ansiomerkkien myöntäminen tältä alueelta"
edit_permissions: "Muokkaa oikeuksia"
@@ -2230,15 +2279,12 @@ fi:
refresh: "Lataa uudelleen"
new: "Uusi"
selector_placeholder: "syötä käyttäjätunnus"
- name_placeholder: "Ryhmän nimi, ei välilyöntejä, samat säännöt kuin käyttäjänimillä"
about: "Muokkaa ryhmien jäsenyyksiä ja nimiä täällä"
group_members: "Ryhmään kuuluvat"
delete: "Poista"
delete_confirm: "Poista tämä ryhmä?"
delete_failed: "Ryhmän poistaminen ei onnistu. Jos tämä on automaattinen ryhmä, sitä ei voi poistaa."
- delete_member_confirm: "Poista '%{username}' ryhmästä '%{group}'?"
delete_owner_confirm: "Poista omistajan etuudet käyttäjältä '%{username}'?"
- name: "Nimi"
add: "Lisää"
add_members: "Lisää jäseniä"
custom: "Mukautetut"
@@ -2255,14 +2301,6 @@ fi:
add_owners: Lisää omistajia
incoming_email: "Saapuvan sähköpostin osoite"
incoming_email_placeholder: "aseta sähköpostiosoite"
- flair_url: "Avatarpinssikuva"
- flair_url_placeholder: "(Valinnainen) Kuvan URL tai Font Awesome luokka"
- flair_bg_color: "Avatarpinssin taustaväri"
- flair_bg_color_placeholder: "(Valinnainen) värin Hex-arvo"
- flair_color: "Avatarpinssin väri"
- flair_color_placeholder: "(Valinnainen) värin Hex-arvo"
- flair_preview: "Esikatselu"
- flair_note: "Huom: Pinssi määräytyy käyttäjän ensisijaisen ryhmän mukaan."
api:
generate_master: "Luo rajapinnan pääavain"
none: "Aktiivisia API avaimia ei ole määritelty."
diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml
index 94a7817e35..d5b1f3d31c 100644
--- a/config/locales/client.fr.yml
+++ b/config/locales/client.fr.yml
@@ -321,18 +321,59 @@ fr:
total_rows:
one: "1 utilisateur"
other: "%{count} utilisateurs"
+ group_histories:
+ actions:
+ change_group_setting: "Changer les paramètres du groupe"
+ add_user_to_group: "Ajouter l'utilisateur"
+ remove_user_from_group: "Supprimer l'utilisateur"
+ make_user_group_owner: "Rendre propriétaire"
+ remove_user_as_group_owner: "Retirer le propriétaire"
groups:
+ logs:
+ title: "Journaux"
+ when: "Quand"
+ action: "Action"
+ acting_user: "Utilisateur agissant"
+ target_user: "Utilisateur cible"
+ subject: "Sujet"
+ details: "Détails"
+ from: "De"
+ to: "À"
+ edit:
+ title: 'Modifier le groupe'
+ full_name: 'Nom complet'
+ add_members: "Ajouter des membres"
+ delete_member_confirm: "Supprimer %{username} du groupe « %{group} » ?"
+ request_membership_pm:
+ title: "Demande d'adhésion"
+ body: "Je souhaiterais adhérer à @%{groupName}."
+ name_placeholder: "Nom du groupe, sans espaces, même règle que pour les pseudos"
+ public: "Autoriser les utilisateurs à rejoindre/quitter le groupe librement (nécessite que le groupe soit visible)"
empty:
- posts: "Il n'y a aucun message de la part des membres de ce groupe."
- members: "Il n'y a aucun membre dans ce groupe."
+ posts: "Il n'y a aucun message de membres de ce groupe."
+ members: "Il n' y a aucun membre dans ce groupe."
mentions: "Il n'y a aucune mention de ce groupe."
messages: "Il n'y a aucun message pour ce groupe."
- topics: "Il n'y a aucun sujet de la part des membres de ce groupe."
+ topics: "Il n'y a aucun sujet par des membres de ce groupe."
+ logs: "Il n'y a aucun journal pour ce groupe."
add: "Ajouter"
+ join: "Rejoindre le groupe"
+ leave: "Quitter le groupe"
+ request: "Demander à rejoindre le groupe"
+ automatic_group: Groupe automatique
+ closed_group: Groupe fermé
+ is_group_user: "Vous êtes membre de ce groupe"
+ allow_membership_requests: "Autoriser les utilisateurs à envoyer des demandes d'adhésion aux propriétaires de groupe (nécessite que tout le monde puisse mentionner le groupe)"
+ membership: "Adhésion"
+ name: "Nom"
+ user_count: "Nombre de membres"
+ bio: "À propos du groupe"
selector_placeholder: "Ajouter des membres"
owner: "propriétaire"
visible: "Ce groupe est visible par tous les utilisateurs"
- index: "Groupes"
+ index:
+ title: "Groupes"
+ empty: "Il n'y a aucun groupe visible."
title:
one: "groupe"
other: "groupes"
@@ -367,6 +408,15 @@ fr:
muted:
title: "Silencieux"
description: "Nous ne serez jamais notifié de quoi que ce soit à propos des nouveaux sujets dans ce groupe."
+ flair_url: "Image de la vignette d'avatar"
+ flair_url_placeholder: "(Facultatif) URL de l'image ou classe Font Awesome"
+ flair_bg_color: "Couleur de l'arrière-plan de la vignette d'avatar"
+ flair_bg_color_placeholder: "(Facultatif) Couleur en héxadécimal"
+ flair_color: "Couleur de la vignette d'avatar"
+ flair_color_placeholder: "(Facultatif) Couleur en héxadécimal"
+ flair_preview_icon: "Prévisualiser l'icône"
+ flair_preview_image: "Prévisualiser l'image"
+ flair_note: "Note : la vignette d'avatar sera uniquement affichée pour le groupe principal d'un utilisateur."
user_action_groups:
'1': "J'aime donnés"
'2': "J'aime reçus"
@@ -695,11 +745,9 @@ fr:
link_generated: "Lien d'invitation généré avec succés !"
valid_for: "Le lien d'invitation est seulement valide pour cette adresse courriel : %{email}"
bulk_invite:
- none: "Vous n'avez encore invité personne. Vous pouvez envoyé des invitations individuelles, ou en masse en envoyant un fichier d'invitation contenant la liste des courriels."
+ none: "Vous n'avez invité personne pour le moment. Vous pouvez envoyer des invitations individuelles ou inviter plusieurs personnes à la fois en envoyant un fichier CSV."
text: "Invitation massive depuis un fichier"
- uploading: "Envoi en cours…"
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."
@@ -964,6 +1012,7 @@ fr:
title: "ou appuyez sur Ctrl+Entrée"
users_placeholder: "Ajouter un utilisateur"
title_placeholder: "Quel est le sujet en une courte phrase ?"
+ title_or_link_placeholder: "Entrez un titre, ou copiez un lien ici"
edit_reason_placeholder: "pourquoi modifiez-vous le message ?"
show_edit_reason: "(ajouter la raison de la modification)"
topic_featured_link_placeholder: "Entrez un lien affiché avec le titre."
@@ -1662,22 +1711,6 @@ fr:
side_by_side_markdown:
title: "Afficher les différences de la source côte-à-côte"
button: ' Brut'
- group:
- edit:
- title: 'Modifier le groupe'
- title: 'Titre'
- name: "Nom"
- bio: "À propos du groupe"
- name_placeholder: "Nom du groupe, sans espaces, même règle que pour les pseudos"
- flair_url: "Image de la vignette d'avatar"
- flair_url_placeholder: "(Facultatif) URL de l'image ou classe Font Awesome"
- flair_bg_color: "Couleur de l'arrière-plan de la vignette d'avatar"
- flair_bg_color_placeholder: "(Facultatif) Couleur en héxadécimal"
- flair_color: "Couleur de la vignette d'avatar"
- flair_color_placeholder: "(Facultatif) Couleur en héxadécimal"
- flair_preview_icon: "Prévisualiser l'icône"
- flair_preview_image: "Prévisualiser l'image"
- flair_note: "Note : la vignette d'avatar sera uniquement affichée pour le groupe principal d'un utilisateur."
category:
can: 'peut… '
none: '(aucune catégorie)'
@@ -1694,7 +1727,7 @@ fr:
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 groupes de tags autorisés"
- topic_featured_link_allowed: "Restreindre la création de sujets avec lien à cette catégorie. Nécessite que le paramètre topic_featured_link_enabled soit activé."
+ topic_featured_link_allowed: "Autoriser les sujets avec lien dans cette catégorie"
delete: 'Supprimer la catégorie'
create: 'Nouvelle catégorie'
create_long: 'Créer une nouvelle catégorie'
@@ -1729,6 +1762,7 @@ fr:
email_in_disabled: "La possibilité de créer des nouveaux sujets via courriel est désactivé dans les Paramètres. Pour l'activer,"
email_in_disabled_click: 'activer le paramètre "email in".'
suppress_from_homepage: "Retirer cette catégorie de la page d'accueil"
+ all_topics_wiki: "Faire des nouveaux sujets des Wikis par défaut"
sort_order: "Tri par défaut :"
allow_badges_label: "Autoriser les badges à être accordé dans cette catégorie"
edit_permissions: "Modifier les permissions"
@@ -2247,15 +2281,12 @@ fr:
refresh: "Actualiser"
new: "Nouveau"
selector_placeholder: "entrer le pseudo"
- name_placeholder: "Nom du groupe, sans espace, mêmes règles que pour les pseudos"
about: "Modifier votre adhésion et les noms ici"
group_members: "Membres du groupe"
delete: "Supprimer"
delete_confirm: "Supprimer ce groupe ?"
delete_failed: "Impossible de supprimer le groupe. Si c'est un groupe automatique il ne peut être détruit."
- delete_member_confirm: "Enlever %{username} du groupe « %{group} » ?"
delete_owner_confirm: "Retirer les privilèges de propriétaire pour %{username} ?"
- name: "Nom"
add: "Ajouter"
add_members: "Ajouter des membres"
custom: "Personnalisé"
@@ -2272,14 +2303,6 @@ fr:
add_owners: Ajouter des propriétaires
incoming_email: "Adresse de courriel entrant personnalisée"
incoming_email_placeholder: "Entrer une adresse de courriel"
- flair_url: "Image de la vignette d'avatar"
- flair_url_placeholder: "(Facultatif) URL de l'image ou classe Font Awesome"
- flair_bg_color: "Couleur de l'arrière-plan de la vignette d'avatar"
- flair_bg_color_placeholder: "(Facultatif) Couleur en héxadécimal"
- flair_color: "Couleur de la vignette d'avatar"
- flair_color_placeholder: "(Facultatif) Couleur en héxadécimal"
- flair_preview: "Prévisualiser"
- flair_note: "Note : la vignette d'avatar sera uniquement affichée pour le groupe principal d'un utilisateur."
api:
generate_master: "Générer une clé d'API maître"
none: "Il n'y a pas de clés API actives en ce moment."
@@ -2334,7 +2357,7 @@ fr:
details: "Quand il y a une réponse nouvelle, modifiée, supprimée ou rétablie."
user_event:
name: "Événement d'utilisateur"
- details: "Quand un utilisateur est créé ou approuvé."
+ details: "Quand un utilisateur est créé, approuvé ou mis à jour."
delivery_status:
title: "État de l'envoi"
inactive: "Inactif"
diff --git a/config/locales/client.gl.yml b/config/locales/client.gl.yml
index 31a9589fea..c4fdae32cb 100644
--- a/config/locales/client.gl.yml
+++ b/config/locales/client.gl.yml
@@ -27,6 +27,7 @@ gl:
millions: "{{number}}M"
dates:
time: "h:mm a"
+ timeline_date: "MMM YYYY"
long_no_year: "D MMM h:mm a"
long_no_year_no_time: "D MMM"
full_no_year_no_time: "D MMMM"
@@ -38,6 +39,7 @@ gl:
long_date_with_year_without_time: "D MMM, 'YY"
long_date_without_year_with_linebreak: "D MMM LT"
long_date_with_year_with_linebreak: "D MMM, 'YY LT"
+ wrap_ago: "fai %{date}"
tiny:
half_a_minute: "< 1m"
less_than_x_seconds:
@@ -108,9 +110,13 @@ gl:
google+: 'compartir esta ligazón no Google+'
email: 'enviar esta ligazón nun correo electrónico'
action_codes:
+ public_topic: "fixo esta publicación pública no %{when}"
+ private_topic: "fixo esta publicación privada no %{when}"
split_topic: "este tema dividiuse o %{when}"
invited_user: "convidou a %{who} %{when}"
+ invited_group: "invitou %{who} o %{when}"
removed_user: "eliminou a %{who} %{when}"
+ removed_group: "eliminou %{who} o %{when}"
autoclosed:
enabled: 'pechado o %{when}'
disabled: 'aberto o %{when}'
@@ -130,6 +136,7 @@ gl:
enabled: 'listado o %{when}'
disabled: 'retirado da lista o %{when}'
topic_admin_menu: "accións do administrador de temas"
+ wizard_required: "É hora de configura-lo teu foro! Inicie o Asistente de Configuración!"
emails_are_disabled: "Todos os correos electrónicos saíntes foron desactivados globalmente por un administrador. Non se enviará ningún tipo de notificación por correo electrónico."
s3:
regions:
@@ -307,12 +314,6 @@ gl:
one: "Un usuario"
other: "%{count} usuarios"
groups:
- empty:
- posts: "Non hai publicacións de membros deste grupo."
- members: "Non hai ningún membro neste grupo."
- mentions: "Non hai ningunha mención deste grupo."
- messages: "Non hai ningunha mensaxe para este grupo."
- topics: "Non hai temas por membros deste grupo."
add: "Engadir"
selector_placeholder: "Engadir membros"
owner: "propietario"
@@ -626,11 +627,8 @@ gl:
create: "Enviar un convite"
generate_link: "Copiar a ligazón do convite"
bulk_invite:
- none: "Aínda non convidaches a ninguén. Podes enviar convites individuais ou en grupo se subes un ficheiro para convites múltiples."
text: "Convidar en grupo desde un ficheiro"
- uploading: "Enviando..."
success: "O ficheiro enviouse correctamente, notificaráseche por mensaxe cando remate o proceso."
- error: "Produciuse un erro ao subir «{{filename}}»: {{message}}"
password:
title: "Contrasinal"
too_short: "O teu contrasinal é demasiado curto."
@@ -1793,15 +1791,12 @@ gl:
refresh: "Actualizar"
new: "Novo"
selector_placeholder: "escribe o nome do usuario"
- name_placeholder: "Nome do grupo sen espazos, como na regra do nome do usuario"
about: "Edita aquí a túa pertenza a un grupo e nomes"
group_members: "Membros do grupo"
delete: "Eliminar"
delete_confirm: "Eliminar este grupo?"
delete_failed: "Non é posíbel eliminar o grupo. Se este é un grupo automático, non se pode destruír."
- delete_member_confirm: "Queres eliminar a «%{username}» do grupo «%{group}»?"
delete_owner_confirm: "Eliminar os privilexios de usuario de «%{username}»?"
- name: "Nome"
add: "Engadir"
add_members: "Engadir membros"
custom: "Personalizar"
diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml
index 9f0769cf0b..b7a8758ee1 100644
--- a/config/locales/client.he.yml
+++ b/config/locales/client.he.yml
@@ -183,7 +183,7 @@ he:
you: "אתם"
or: "או"
now: "ממש עכשיו"
- read_more: 'קרא עוד'
+ read_more: 'קראו עוד'
more: "עוד"
less: "פחות"
never: "אף פעם"
@@ -321,18 +321,59 @@ he:
total_rows:
one: "משתמש/ת 1"
other: "%{count} משתמשים"
+ group_histories:
+ actions:
+ change_group_setting: "שינוי הגדרות קבוצה"
+ add_user_to_group: "הוספת משתמש/ת"
+ remove_user_from_group: "הסרת משתמש/ת"
+ make_user_group_owner: "הפיכה לבעלים"
+ remove_user_as_group_owner: "שלילת בעלות"
groups:
+ logs:
+ title: "לוגים"
+ when: "מתי"
+ action: "פעולה"
+ acting_user: "משתמשים פועלים"
+ target_user: "משתמשי מטרה"
+ subject: "נושא"
+ details: "פרטים"
+ from: "מאת"
+ to: "אל"
+ edit:
+ title: 'עריכת קבוצה'
+ full_name: 'שם מלא'
+ add_members: "הוספת חברים"
+ delete_member_confirm: "הסרת '%{username}' מהקבוצה '%{group}'?"
+ request_membership_pm:
+ title: "בקשת חברות"
+ body: "הייתי מעוניין להגיש בקשת חברות ב-@%{groupName}."
+ name_placeholder: "שם קבוצה, ללא רווחים, לפי הכללים של שמות משתמשים"
+ public: "אפשרו למשתמשים להצטרף/לעזוב את הקבוצה בחופשיות (על הקבוצה להיות נראית)"
empty:
- posts: "אין פוסט של חברים בקבוצה זו"
+ posts: "אין פוסטים של חברי קבוצה זו."
members: "אין חברים בקבוצה זו."
- mentions: "אין אזכורים של קבוצה זו."
+ mentions: "אין איזכורים של קבוצה זו."
messages: "אין הודעות לקבוצה זו."
- topics: "אין נושא מטעם חברים בקבוצה זו."
+ topics: "אין נושאים שנוצרו על ידי חברים של קבוצה זו."
+ logs: "אין לוגים עבור קבוצה זו."
add: "הוספה"
+ join: "הצטרפות לקבוצה"
+ leave: "עזיבת קבוצה"
+ request: "בקשה להצטרפות לקבוצה"
+ automatic_group: קבוצה אוטומטית
+ closed_group: קבוצה סגורה
+ is_group_user: "אתם חברים בקבוצה זו."
+ allow_membership_requests: "אפשרו למשתמשים לשלוח בקשות חברות לבעלי הקבוצה (מצריך שכולם יוכלו לאזכר את הקבוצה)"
+ membership: "חברות"
+ name: "שם"
+ user_count: "מספר חברים"
+ bio: "אודות הקבוצה"
selector_placeholder: "הוספת חברים וחברות"
owner: "מנהל"
visible: "הקבוצה זמינה לכל המשתמשים"
- index: "קבוצות"
+ index:
+ title: "קבוצות"
+ empty: "אין קבוצות נראות."
title:
one: "קבוצה"
other: "קבוצות"
@@ -367,6 +408,15 @@ he:
muted:
title: "מושתק"
description: "לעולם לא תקבלו התראה על נושאים חדשים בקבוצה זו."
+ flair_url: "תמונת פלייר אווטר"
+ flair_url_placeholder: "(אופציונלי) URL של תמונה או מחלקה של Font Awesome"
+ flair_bg_color: "צבע רקע של פלייר לאווטר"
+ flair_bg_color_placeholder: "(אופציונלי) ערך הקסדצימלי של הצבע"
+ flair_color: "צבע פלייר אווטר"
+ flair_color_placeholder: "(אופציונלי) ערך הקסדצימלי של הצבע"
+ flair_preview_icon: "תצוגה מקדימה של אייקון"
+ flair_preview_image: "תצוגה מקדימה של תמונה"
+ flair_note: "שימו לב: פלייר יופיע רק עבור הקבוצה הראשית של משתמשים."
user_action_groups:
'1': "לייקים שניתנו"
'2': "לייקים שהתקבלו"
@@ -695,11 +745,9 @@ he:
link_generated: "קישור הזמנה יוצר בהצלחה!"
valid_for: "קישור הזמנה תקף רק לכתובת המייל הזו: %{email}"
bulk_invite:
- none: "נכון לעכשיו לא הזמנת לכאן אף אחד. תוכלו לשלוח הזמנות אישיות, או להזמין כמה אנשים בבת אחת באמצעות העלאת קובץ הזמנה קבוצתית."
+ none: "עדיין לא הזמנתם לכאן אף אחד. תוכלו לשלוח הזמנות פרטניות, או להזמין כמה אנשים יחד על ידי העלאת קובץ CSV."
text: "הזמנה קבוצתית מקובץ"
- uploading: "העלאה..."
success: "העלאת הקובץ החלה בהצלחה, תקבלו התראה באמצעות מסר כאשר התהליך יושלם."
- error: "חלה תקלה בהעלאת \"'{{filename}}': \n{{message}}"
password:
title: "סיסמה"
too_short: "הסיסמה שלך קצרה מידי."
@@ -964,6 +1012,7 @@ he:
title: "או לחצו Ctrl+Enter"
users_placeholder: "הוספת משתמש"
title_placeholder: " במשפט אחד, במה עוסק הדיון הזה?"
+ title_or_link_placeholder: "הקלידו כותרת, או הדביקו קישור כאן"
edit_reason_placeholder: "מדוע ערכת?"
show_edit_reason: "(הוספת סיבת עריכה)"
topic_featured_link_placeholder: "הזינו קישור שיוצג עם הכותרת."
@@ -1664,22 +1713,6 @@ he:
side_by_side_markdown:
title: "הציגו את ההבדלי המקור הגולמיים זה לצד זה"
button: ' גלם'
- group:
- edit:
- title: 'עריכת קבוצה'
- title: 'כותרת'
- name: "שם"
- bio: "אודות הקבוצה"
- name_placeholder: "שם הקבוצה, ללא רווחים, זהה לכלל שם-משתמש/ת"
- flair_url: "תמונת פלייר אווטר"
- flair_url_placeholder: "(אופציונלי) URL של תמונה או מחלקה של Font Awesome"
- flair_bg_color: "צבע רקע של פלייר לאווטר"
- flair_bg_color_placeholder: "(אופציונלי) ערך צבע בהקס"
- flair_color: "צבע פלייר אווטר"
- flair_color_placeholder: "(אופציונלי) ערך צבע בהקס"
- flair_preview_icon: "תצוגה מקדימה של אייקון"
- flair_preview_image: "תצוגה מקדימה של תמונה"
- flair_note: "שימו לב: פלייר יופיע רק עבור הקבוצה הראשית של משתמשים."
category:
can: 'יכול… '
none: '(ללא קטגוריה)'
@@ -1696,7 +1729,7 @@ he:
tags_allowed_tag_groups: "קבוצות תגים שניתנות לשימוש בקטגוריה זו:"
tags_placeholder: "(אופציונלי) רשימת תגים מותרים"
tag_groups_placeholder: "(אופציונלי) רשימת קבוצות תגים"
- topic_featured_link_allowed: "מגביל עריכת קישור מומלץ של נושא בקטגוריה זו. ההגדרה topic_featured_link_enabled צריכה להיות מסומנת."
+ topic_featured_link_allowed: "אפשרו קישורים מומלצים בקטגוריה זו"
delete: 'מחק קטגוריה'
create: 'קטגוריה חדשה'
create_long: 'יצירת קטגוריה חדשה'
@@ -1731,6 +1764,7 @@ he:
email_in_disabled: "אפשרות הפרסום של נושאים חדשים דרך דוא\"ל נוטרלה בהגדרות האתר. כדי לאפשר פרסום באמצעות משלוח דוא\"ל,"
email_in_disabled_click: 'אפשרו את את ההגדרה "דוא"ל נכנס"'
suppress_from_homepage: "הרחיקו קטגוריה זו מהעמוד הראשי."
+ all_topics_wiki: "כברירת מחדל נושאים חדשים יהיו וויקי."
sort_order: "סידור ברירת מחדל:"
allow_badges_label: "הרשו לעיטורים להיות מוענקים בקטגוריה זו"
edit_permissions: "ערוך הרשאות"
@@ -2249,15 +2283,12 @@ he:
refresh: "רענן"
new: "חדש"
selector_placeholder: "הזינו שם משתמש/ת"
- name_placeholder: "שם הקבוצה, ללא רווחים, בזהה לחוקי שם המשתמש"
about: "ערוך את חברות הקבוצה שלך והשמות כאן"
group_members: "חברי הקבוצה"
delete: "מחק"
delete_confirm: "למחוק קבוצה זו?"
delete_failed: "לא ניתן למחוק קבוצה זו. אם זו קבוצה אוטומטית, היא בלתי ניתנת למחיקה."
- delete_member_confirm: "להסיר את '%{username}' מהקבוצה '%{group}'?"
delete_owner_confirm: "הסרת הרשאות מנהל עבור '%{username}'?"
- name: "שם"
add: "הוספה"
add_members: "הוספת חברים וחברות"
custom: "מותאם"
@@ -2274,14 +2305,6 @@ he:
add_owners: הוספת בעלים
incoming_email: "התאימו אישית כתובת מייל נכנס"
incoming_email_placeholder: "הכניסו כתובת מייל"
- flair_url: "תמונת פלייר אווטר"
- flair_url_placeholder: "(אופציונלי) URL של תמונה או Font Awesome class"
- flair_bg_color: "צבע רקע של פלייר לאווטר"
- flair_bg_color_placeholder: "(אופציונלי) ערך צבע ב Hex"
- flair_color: "צבע פלייר אווטר"
- flair_color_placeholder: "(אופציונלי) ערך צבע הקסדצימלי"
- flair_preview: "תצוגה מקדימה"
- flair_note: "שימו לב: פלייר יופיע רק עבור הקבוצה הראשית של משתמשים."
api:
generate_master: "ייצר מפתח מאסטר ל-API"
none: "אין מפתחות API פעילים כרגע."
@@ -2336,7 +2359,7 @@ he:
details: "כאשר יש תגובה חדשה, עריכה, מחיקה או שחזור."
user_event:
name: "אירוע משתמש"
- details: "כאשר משתמש נוצר או מאושר."
+ details: "כאשר משתמש נוצר, מאושר, או מעודכן."
delivery_status:
title: "מצב שליחה"
inactive: "לא פעיל"
@@ -2405,7 +2428,7 @@ he:
error: "הייתה שגיאה במהלך העלאת '{{filename}}': {{message}}"
operations:
is_running: "פעולה רצה כרגע..."
- failed: "ה{{operation}} נכשלה. אנא בדוק את הלוגים."
+ failed: "ה-{{operation}} נכשל/ה. אנא בידקו את הלוגים."
cancel:
label: "ביטול"
title: "בטל את הפעולה הנוכחית"
diff --git a/config/locales/client.id.yml b/config/locales/client.id.yml
index dd3dcb0df7..ec61709eea 100644
--- a/config/locales/client.id.yml
+++ b/config/locales/client.id.yml
@@ -292,17 +292,10 @@ id:
total_rows:
other: "%{count} pengguna"
groups:
- empty:
- posts: "Tidak ada posting dari anggota kelompok ini."
- members: "TIdak ada anggota pada kelompok ini."
- mentions: "Tidak ada balasan oleh kelompok ini."
- messages: "Tidak ada pesan untuk kelompok ini."
- topics: "Tidak ada topik dari anggota kelompok ini."
add: "Menambahkan"
selector_placeholder: "Menambahkan anggota"
owner: "pemilik"
visible: "Grup terlihat oleh semua pengguna"
- index: "Grup"
title:
other: "Grup"
members: "Anggota"
@@ -591,8 +584,6 @@ id:
generate_link: "Salin Tautan Undangan"
bulk_invite:
text: "Undangan Massal dari Berkas"
- uploading: "Mengunggah..."
- error: "Terdapat gangguan mengunggah '{{filename}}': {{message}}"
password:
title: "Kata sandi"
too_short: "Password kamu terlalu pendek."
diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml
index cb72a2e3c5..f6d10bda78 100644
--- a/config/locales/client.it.yml
+++ b/config/locales/client.it.yml
@@ -322,17 +322,10 @@ it:
one: "1 utente"
other: "%{count} utenti"
groups:
- empty:
- posts: "Non ci sono messaggi dai membri di questo gruppo."
- members: "Non ci sono membri in questo gruppo."
- mentions: "Non ci sono menzioni a questo gruppo."
- messages: "Non ci sono messaggi per questo gruppo."
- topics: "Non ci sono argomenti da membri di questo gruppo."
add: "Aggiungi"
selector_placeholder: "Aggiungi membri"
owner: "proprietario"
visible: "Il Gruppo è visibile a tutti gli utenti"
- index: "Gruppi"
title:
one: "gruppo"
other: "gruppi"
@@ -1652,13 +1645,6 @@ it:
side_by_side_markdown:
title: "Mostra le differenze nei sorgenti fianco-a-fianco"
button: ' Raw'
- group:
- edit:
- title: 'Modifica gruppo'
- title: 'Titolo'
- name: "Nome"
- flair_preview_icon: "Anteprima icona"
- flair_preview_image: "Anteprima immagine"
category:
can: 'può…'
none: '(nessuna categoria)'
@@ -2186,15 +2172,12 @@ it:
refresh: "Aggiorna"
new: "Nuovo"
selector_placeholder: "inserisci nome utente"
- name_placeholder: "Nome del gruppo, senza spazi, stesse regole del nome utente"
about: "Modifica qui la tua appartenenza ai gruppi e i loro nomi"
group_members: "Membri del gruppo"
delete: "Cancella"
delete_confirm: "Cancellare questo gruppo?"
delete_failed: "Impossibile cancellare il gruppo. Se questo è un gruppo automatico, non può essere eliminato."
- delete_member_confirm: "Rimuovere '%{username}' dal gruppo '%{group}'?"
delete_owner_confirm: "Rimuovere i privilegi per '%{username}'?"
- name: "Nome"
add: "Aggiungi"
add_members: "Aggiungi membri"
custom: "Personalizzato"
@@ -2211,14 +2194,6 @@ it:
add_owners: Aggiungi proprietari
incoming_email: "Indirizzo email personalizzato"
incoming_email_placeholder: "inserisci l'indirizzo e-mail"
- flair_url: "Immagine Avatar"
- flair_url_placeholder: "(Facoltativo) URL Immagine o categoria Font Awesome"
- flair_bg_color: "Colore di sfondo Avatar"
- flair_bg_color_placeholder: "(Facoltativo) Codice Hex colore"
- flair_color: "Colore Avatar"
- flair_color_placeholder: "(Facoltativo) Codice Hex colore"
- flair_preview: "Anteprima"
- flair_note: "Nota: l'Avatar verrà mostrato solo per il gruppo principale dell'utente."
api:
generate_master: "Genera una Master API Key"
none: "Non ci sono chiavi API attive al momento."
diff --git a/config/locales/client.ja.yml b/config/locales/client.ja.yml
index c2b9f0d7e5..2ae0a4ea1b 100644
--- a/config/locales/client.ja.yml
+++ b/config/locales/client.ja.yml
@@ -188,8 +188,8 @@ ja:
like_count: "いいね!"
topic_count: "トピック"
post_count: "投稿"
- user_count: "新規ユーザ"
- active_user_count: "アクティブユーザ"
+ user_count: "新規ユーザー"
+ active_user_count: "アクティブユーザー"
contact: "お問い合わせ"
contact_info: "このサイトに影響を与える重要な問題や緊急の問題が発生した場合は、 %{contact_info}までご連絡ください"
bookmarked:
@@ -238,7 +238,7 @@ ja:
topic: "トピック:"
approve: '承認'
reject: 'リジェクト'
- delete_user: '削除されたユーザ'
+ delete_user: '削除されたユーザー'
title: "承認待ち"
none: "レビュー待ちの投稿はありません。"
edit: "編集"
@@ -269,8 +269,8 @@ ja:
sent_by_user: "{{user}} が送信"
sent_by_you: "あなた が送信"
directory:
- filter_name: "ユーザ名でフィルタ"
- title: "ユーザ"
+ filter_name: "ユーザー名でフィルタ"
+ title: "ユーザー"
likes_given: "与えた"
likes_received: "もらった"
topics_entered: "閲覧数"
@@ -286,18 +286,12 @@ ja:
posts_read: "既読"
posts_read_long: "投稿の閲覧数"
total_rows:
- other: "%{count}人のユーザ"
+ other: "%{count}人のユーザー"
groups:
- empty:
- posts: "このグループのメンバーからの投稿はありません。"
- members: "このグループからの投稿はありません。"
- mentions: "このグループのメンションはありません。"
- messages: "このグループへのメッセージはありません。"
- topics: "このグループのメンバーのトピックは何もありません。"
add: "追加"
selector_placeholder: "メンバーを追加"
owner: "オーナー"
- visible: "このグループは全てのユーザに表示されています。"
+ visible: "このグループは全てのユーザーに表示されています。"
title:
other: "グループ"
members: "メンバー"
@@ -367,7 +361,7 @@ ja:
phone: 電話
other_accounts: "同じIPアドレスを持つアカウント"
delete_other_accounts: "%{count}件削除"
- username: "ユーザ名"
+ username: "ユーザー名"
trust_level: "トラストレベル"
read_time: "読んだ時間"
topics_entered: "入力したトピック"
@@ -409,10 +403,10 @@ ja:
change: "変更"
moderator: "{{user}} はモデレータです"
admin: "{{user}} は管理者です"
- moderator_tooltip: "このユーザはモデレータです"
- admin_tooltip: "このユーザは管理者です"
- blocked_tooltip: "このユーザはブロックされています"
- suspended_notice: "このユーザは {{date}} まで凍結状態です。"
+ moderator_tooltip: "このユーザーはモデレータです"
+ admin_tooltip: "このユーザーは管理者です"
+ blocked_tooltip: "このユーザーはブロックされています"
+ suspended_notice: "このユーザーは {{date}} まで凍結状態です。"
suspended_reason: "理由: "
github_profile: "Github"
email_activity_summary: "アクティビティの情報"
@@ -433,9 +427,9 @@ ja:
delete_yourself_not_allowed: "アカウントを削除できませんでした。サイトの管理者へ連絡してください。"
unread_message_count: "メッセージ"
admin_delete: "削除"
- users: "ユーザ"
+ users: "ユーザー"
muted_users: "ミュート"
- muted_users_instructions: "ユーザからの通知をすべて行いません"
+ muted_users_instructions: "ユーザーからの通知をすべて行いません"
muted_topics_link: "ミュートしたトピックを表示する"
staff_counters:
flags_given: "役に立った通報"
@@ -464,10 +458,10 @@ ja:
title: "プロフィールを変更"
error: "変更中にエラーが発生しました。"
change_username:
- title: "ユーザ名を変更"
- taken: "このユーザ名は既に使われています。"
- error: "ユーザ名変更中にエラーが発生しました。"
- invalid: "このユーザ名は無効です。英数字のみ利用可能です。"
+ title: "ユーザー名を変更"
+ taken: "このユーザー名は既に使われています。"
+ error: "ユーザー名の変更中にエラーが発生しました。"
+ invalid: "このユーザー名は無効です。英数字のみ利用可能です。"
change_email:
title: "メールアドレスを変更"
taken: "このメールアドレスは既に使われています。"
@@ -489,7 +483,7 @@ ja:
title: "プロフィールの背景画像"
instructions: "プロフィールの背景画像は、幅850pxで中央揃えになります"
change_card_background:
- title: "ユーザカードの背景画像"
+ title: "ユーザーカードの背景画像"
instructions: "背景画像は、幅590pxで中央揃えになります"
email:
title: "メールアドレス"
@@ -506,7 +500,7 @@ ja:
too_short: "名前が短いです"
ok: "問題ありません"
username:
- title: "ユーザ名"
+ title: "ユーザー名"
instructions: "空白を含まず、被らない名前を入力してください"
short_instructions: "@{{username}} であなたにメンションを送ることができます"
available: "ユーザ名は利用可能です"
@@ -596,11 +590,8 @@ ja:
create: "招待を送る"
generate_link: "招待リンクをコピー"
bulk_invite:
- none: "まだだれも招待していません。ひとりひとりを招待することもできますが、一括招待ファイルをアップロードすることで、一度に複数のユーザを招待する事ができます。"
text: "ファイルからまとめて招待をする"
- uploading: "アップロードしています..."
success: "ファイルは無事にアップロードされました。完了されましたらメッセージでお知らせをさせていただきます。"
- error: "ファイルアップロードエラー:'{{filename}}': {{message}}"
password:
title: "パスワード"
too_short: "パスワードが短すぎます。"
@@ -1579,7 +1570,7 @@ ja:
create: 'c 新しいトピックを作成'
notifications: 'n お知らせを開く'
hamburger_menu: '= メニューを開く'
- user_profile_menu: 'p ユーザメニュを開く'
+ user_profile_menu: 'p ユーザーメニューを開く'
show_incoming_updated_topics: '. 更新されたトピックを表示する'
search: '/ 検索'
help: '? キーボードヘルプを表示する'
@@ -1734,14 +1725,11 @@ ja:
refresh: "更新"
new: "新規"
selector_placeholder: "ユーザ名を入力"
- name_placeholder: "グループ名を入力 (ユーザ名同様にスペースなし)"
about: "グループメンバーとグループ名を編集"
group_members: "グループメンバー"
delete: "削除"
delete_confirm: "このグループを削除しますか?"
delete_failed: "グループの削除に失敗しました。自動作成グループを削除することはできません。"
- delete_member_confirm: "'%{group}' グループから'%{username}' を削除しますか?"
- name: "名前"
add: "追加"
add_members: "メンバーを追加"
custom: "カスタム"
diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml
index 4b452c1e7f..4343bb203d 100644
--- a/config/locales/client.ko.yml
+++ b/config/locales/client.ko.yml
@@ -294,17 +294,10 @@ ko:
total_rows:
other: "%{count} 사용자"
groups:
- empty:
- posts: "이 그룹의 구성원에 의해 작성된 게시물은 없습니다."
- members: "이 그룹에는 구성원이 없습니다."
- mentions: "이 그룹에 대한 언급이 없습니다."
- messages: "이 그룹에 대한 메시지는 없습니다."
- topics: "이 그룹의 구성원에 의해 작성된 주제글이 없습니다."
add: "추가"
selector_placeholder: "멤버 추가"
owner: "소유자"
visible: "모든 사용자에게 보이는 그룹입니다."
- index: "그룹"
title:
other: "그룹"
members: "멤버"
@@ -624,11 +617,8 @@ ko:
create: "이 포럼에 친구를 초대하기"
generate_link: "초대 링크 복사"
bulk_invite:
- none: "아직 아무도 초대하지 않았습니다. 초대장을 각각 보내거나, uploading a bulk invite file을 이용하여 단체 초대를 보낼 수 있습니다."
text: "파일로 대량 초대하기"
- uploading: "업로드 중..."
success: "파일이 성공적으로 업로드되었습니다. 완료되면 메시지로 알려드리겠습니다."
- error: "'{{filename}}': {{message}} 업로드중 에러가 있었습니다."
password:
title: "비밀번호"
too_short: "암호가 너무 짧습니다."
@@ -1735,15 +1725,12 @@ ko:
refresh: "새로고침"
new: "새로운"
selector_placeholder: "아이디를 입력하세요"
- name_placeholder: "그룹 이름, 사용자 이름처럼 빈칸 없이 작성"
about: "회원과 이름을 변경"
group_members: "그룹 멤버"
delete: "삭제"
delete_confirm: "이 그룹을 삭제 하시겠습니까?"
delete_failed: "이것은 자동으로 생성된 그룹입니다. 삭제할 수 없습니다."
- delete_member_confirm: "'%{group}' 그룹에서 '%{username}'을 제외시키겠습니까?"
delete_owner_confirm: "'%{username}' 님에게서 소유자권한을 제거할까요?"
- name: "이름"
add: "추가"
add_members: "사용자 추가하기"
custom: "Custom"
diff --git a/config/locales/client.nb_NO.yml b/config/locales/client.nb_NO.yml
index 4c1e441fbc..9b23e3e9c5 100644
--- a/config/locales/client.nb_NO.yml
+++ b/config/locales/client.nb_NO.yml
@@ -127,13 +127,15 @@ nb_NO:
disabled: 'fjernet fra arkiv %{when}'
pinned:
enabled: 'festet %{when}'
- disabled: 'avfestet %{when}'
+ disabled: 'feste fjernet %{when}'
pinned_globally:
enabled: 'festet globalt %{when}'
+ disabled: 'feste fjernet %{when}'
topic_admin_menu: "admin-handlinger for emne"
+ wizard_required: "Det er på tide å sette opp forumet! Start veiviseren!"
emails_are_disabled: "All utgående e-post har blitt deaktivert globalt av en administrator. Ingen e-postvarslinger vil bli sendt."
bootstrap_mode_enabled: "For å gjøre det enklere å lansere det nye nettstedet ditt er det i bootstrap-modus. Alle nye brukere vil få tillitsnivå 1 og ha daglige oppdateringer på e-post aktivert. Dette vil automatisk bli slått av når antallet brukere overstiger %{min_users}."
- bootstrap_mode_disabled: "Bootstrap modus vil være deaktivert i de neste 24 timene"
+ bootstrap_mode_disabled: "Bootstrap modus vil være deaktivert de neste 24 timene"
s3:
regions:
eu_west_1: "EU (Irland)"
@@ -302,10 +304,6 @@ nb_NO:
one: "1 bruker"
other: "%{count} brukere"
groups:
- empty:
- posts: "Det er ingen innlegg av medlemmene i denne gruppen."
- members: "Det er ingen medlemmer i denne gruppen."
- messages: "Det er ingen meldinger for denne gruppen."
add: "Legg til"
selector_placeholder: "Legg til medlemmer"
owner: "eier"
@@ -331,9 +329,10 @@ nb_NO:
title: "Følger"
description: "Du vil bli varslet om hvert nye innlegg i hver beskjed, og antallet nye svar vil bli vist."
watching_first_post:
+ title: "Følger første innlegg"
description: "Du vil bare bli varslet om det første innlegget i hvert nye emne i denne gruppen."
tracking:
- title: "Sporer"
+ title: "Overvåker"
description: "Du vil få beskjeddersom nevner @navnet_ditt eller svarer deg, og antallet nye svar vil bli vist."
regular:
title: "Normal"
@@ -373,7 +372,7 @@ nb_NO:
ip_lookup:
title: Slå opp IP-adresse
hostname: Vertsnavn
- location: Posisjon
+ location: Sted
location_not_found: (ukjent)
organisation: Organisasjon
phone: Telefon
@@ -426,6 +425,8 @@ nb_NO:
github_profile: "Github"
email_activity_summary: "Oppsummering av aktivitet"
mailing_list_mode:
+ label: "E-postlistemodus"
+ enabled: "Slå på e-postlistemodus"
instructions: |
Denne innstillingen overstyrer oppsummeringen av aktivitet.
Dempede emner og kategorier blir ikke inkludert i disse e-postene.
@@ -433,14 +434,20 @@ nb_NO:
individual_no_echo: "Send en e-post for hvert nye innlegg bortsett fra mine egne"
many_per_day: "Send meg en e-post for hvert nye innlegg (rundt {{dailyEmailEstimate}} daglig)"
few_per_day: "Send meg en e-post for hvert nye innlegg (rundt 2 daglig)"
- watched_tags_instructions: "Du vil automatisk overvåke alle emner med disse stikkordene. Du vil bli varslet om alle nye innlegg og emner, og tallet på nye innlegg til også vises ved siden av emnet."
- tracked_tags_instructions: "Du vil automatisk spore alle emner med disse stikkordene. Tallet på nye innlegg vil vises ved siden av emnet."
+ tag_settings: "Stikkord"
+ watched_tags: "Fulgt"
+ watched_tags_instructions: "Du vil automatisk følge alle emner med disse stikkordene. Du vil bli varslet om alle nye innlegg og emner, og tallet på nye innlegg til også vises ved siden av emnet."
+ tracked_tags: "Overvåkes"
+ tracked_tags_instructions: "Du vil automatisk overvåke alle emner med disse stikkordene. Tallet på nye innlegg vil vises ved siden av emnet."
+ muted_tags: "Dempet"
muted_tags_instructions: "Du vil ikke bli varslet om noe med tanke på nye emner med disse stikkordene, og de vil ikke vises i siste."
- watched_categories: "Følger"
- watched_categories_instructions: "Du vil automatisk spore alle emner i disse kategoriene. Du vil bli varslet om alle nye innlegg og emner, og tallet på nye innlegg vil vises ved siden av emnet."
- tracked_categories: "Sporet"
- tracked_categories_instructions: "Du vil automatisk spore alle emner i disse kategoriene. Tallet på nye innlegg vil vises ved siden av emnet."
+ watched_categories: "Fulgt"
+ watched_categories_instructions: "Du vil automatisk følge alle emner i disse kategoriene. Du vil bli varslet om alle nye innlegg og emner, og tallet på nye innlegg vil vises ved siden av emnet."
+ tracked_categories: "Overvåkes"
+ tracked_categories_instructions: "Du vil automatisk overvåke alle emner i disse kategoriene. Tallet på nye innlegg vil vises ved siden av emnet."
+ watched_first_post_categories: "Følger første innlegg"
watched_first_post_categories_instructions: "Du vil bli varslet om det første innlegget i hvert nye emner i disse kategoriene."
+ watched_first_post_tags: "Følger første innlegg"
watched_first_post_tags_instructions: "Du vil bli varslet om det første innlegget i hvert nye emne med disse stikkordene."
muted_categories: "Dempet"
muted_categories_instructions: "Du vil ikke bli varslet om noe med tanke på nye emner i disse kategoriene, og de vil ikke vises i siste."
@@ -453,6 +460,9 @@ nb_NO:
users: "Brukere"
muted_users: "Dempet"
muted_users_instructions: "Skjul alle varsler fra denne brukeren"
+ muted_topics_link: "Vis dempede emner"
+ watched_topics_link: "Se emner som følges"
+ automatically_unpin_topics: "Automatisk fjern feste for emner når jeg når bunnen."
staff_counters:
flags_given: "nyttige rapporteringer"
flagged_posts: "rapporterte innlegg"
@@ -471,7 +481,7 @@ nb_NO:
success: "(e-post sendt)"
in_progress: "(sender e-post)"
error: "(feil)"
- action: "Send e-post for passordnullstilling"
+ action: "Send e-post for nullstilling av passord"
set_password: "Sett passord"
change_about:
title: "Rediger om meg"
@@ -498,10 +508,10 @@ nb_NO:
image_is_not_a_square: "Vi har beskjært bildet ditt, høyde og bredde er ikke lik"
change_profile_background:
title: "Profilbakgrunn"
- instructions: "Profil bakgrunner vil bli sentrert med en standard bredde på 850px"
+ instructions: "Profilbakgrunner vil bli sentrert med en standardbredde på 850 piksler."
change_card_background:
title: "Brukerkort bakgrunn"
- instructions: "Bakgrunnsbilder vil bli sentrert og ha en standard bredde på 590px."
+ instructions: "Bakgrunnsbilder vil bli sentrert og ha en standardbredde på 590 piksler."
email:
title: "E-post"
instructions: "Blir aldri vist offentlig"
@@ -538,22 +548,23 @@ nb_NO:
last_seen: "Sist sett"
created: "Medlem fra"
log_out: "Logg ut"
- location: "Posisjon"
+ location: "Sted"
card_badge:
- title: "Brukerkort merke"
+ title: "Brukerkort-merke"
website: "Nettsted"
email_settings: "E-post"
like_notification_frequency:
title: "Varsle når likt"
always: "Alltid"
- first_time_and_daily: "Første gnag et innlegg blir likt og daglig"
+ first_time_and_daily: "Første gang et innlegg blir likt, og daglig"
first_time: "Første gang et innlegg blir likt"
never: "Aldri"
email_previous_replies:
+ title: "Inkludér tidligere svar nederst i e-poster"
always: "alltid"
never: "aldri"
email_digests:
- title: "Send meg en oppsummering på e-post av polære emner og svar dersom jeg ikke besøker siden"
+ title: "Send meg en oppsummering på e-post av populære emner og svar dersom jeg ikke besøker siden"
every_30_minutes: "hvert 30 minutt"
every_hour: "hver time"
daily: "daglig"
@@ -561,25 +572,32 @@ nb_NO:
weekly: "ukentlig"
every_two_weeks: "annenhver uke"
include_tl0_in_digests: "Inkludér innhold fra nye brukere i oppsummerings-eposter"
+ email_in_reply_to: "Inkludér et utdrag i e-poster av innlegget man svarer på"
email_direct: "Motta en e-post når noen siterer meg, svarer på innlegget mitt, nevner @brukernavnet mitt eller inviterer meg til et emne"
- email_private_messages: "Motta en e-post når noen sender deg en melding"
+ email_private_messages: "Motta en e-post når noen sender meg en melding"
email_always: "Send meg varsler på e-post selv når jeg er aktiv på nettstedet"
other_settings: "Annet"
categories_settings: "Kategorier"
new_topic_duration:
label: "Anse emner som nye når"
- not_viewed: "Jeg har ikke sett på dem enda."
+ not_viewed: "jeg ikke har sett dem ennå"
last_here: "opprettet siden jeg var her sist"
- auto_track_topics: "Følg automatisk emner jeg åpner"
+ after_1_day: "opprettet i løpet av det siste døgnet"
+ after_2_days: "opprettet i løpet av de siste 2 døgnene"
+ after_1_week: "opprettet i løpet av sist uke"
+ after_2_weeks: "opprettet i løpet av de siste 2 ukene"
+ auto_track_topics: "Overvåk automatisk emner jeg åpner"
auto_track_options:
never: "aldri"
immediately: "øyeblikkelig"
+ after_30_seconds: "etter 30 sekunder"
after_1_minute: "etter 1 minutt"
after_2_minutes: "etter 2 minutt"
after_3_minutes: "etter 3 minutt"
after_4_minutes: "etter 4 minutt"
- after_5_minutes: "etter 5 minut"
+ after_5_minutes: "etter 5 minutt"
after_10_minutes: "etter 10 minutt"
+ notification_level_when_replying: "Når jeg publiserer noe i et emner, sett det emnet til"
invited:
search: "skriv for å søke etter invitasjoner..."
title: "invitasjoner"
@@ -602,11 +620,8 @@ nb_NO:
account_age_days: "Kontoalder i dager"
create: "Send en invitasjon"
bulk_invite:
- none: "Du har ikke invitert noen hit enda. Du kan sende individuelle invitasjoner, eller invitere en gruppe folk på en gang ved å laste opp en fil med flere invitasjoner."
text: "Masseinvitasjon fra fil"
- uploading: "Laster opp..."
success: "Filen er lastet opp, du vil motta en melding når prosessesen er ferdig"
- error: "En feil oppsto ved opplastingen av '{{filename}}': {{message}}"
password:
title: "Passord"
too_short: "Passordet ditt er for kort"
@@ -621,6 +636,8 @@ nb_NO:
top_replies: "Mest Populære Svar"
top_topics: "Mest Populære Emner"
more_topics: "Flere Emner"
+ no_badges: "Ennå ingen merker."
+ more_badges: "Flere merker"
associated_accounts: "Innloggingsforsøk"
ip_address:
title: "Siste IP-adresse"
@@ -905,6 +922,10 @@ nb_NO:
user: "Søk innleggene av @{{username}}"
topic: "Søk i dette emnet"
private_messages: "Søk i meldinger"
+ advanced:
+ filters:
+ watching: Jeg følger
+ tracking: Jeg overvåker
hamburger_menu: "gå til en annen emneliste eller kategori"
new_item: "ny"
go_back: 'gå tilbake'
@@ -914,6 +935,8 @@ nb_NO:
bulk:
reset_read: "Nullstill lest"
delete: "Slett Emne"
+ dismiss_tooltip: "Avslå bare nye innlegg eller slutt å overvåke emner"
+ also_dismiss_topics: "Slutt å overvåke disse emnene slik at de aldri igjen vises til meg som ulest"
dismiss_new: "Lest"
toggle: "Veksle mellom massevelging av emner"
actions: "Massehandlinger"
@@ -936,6 +959,8 @@ nb_NO:
category: "Det er ingen {{category}} emner."
top: "Det er ingen populære emner."
search: "Det er ingen søkeresultater"
+ educate:
+ unread: 'Dine uleste emner vil vises her. Som standard anses emner for å være ulest og vil vise ulest-tall 1 dersom du: - Opprettet emnet
- Svarte på emnet
- Leste emnet i mer enn 4 minutter
Eller dersom du uttrykkelig har satt emnet som overvåkes eller sett via varselkontrollen nederst i hvert emne. Gå tilinnstillingene dine for å endre dette. '
bottom:
latest: "Det er ingen siste emner igjen å lese."
hot: "Det er ingen populære emner igjen å lese."
@@ -1017,14 +1042,16 @@ nb_NO:
current: gjeldende innlegg
notifications:
reasons:
+ mailing_list_mode: "Du har slått på e-postlistemodus, så du vil bli varslet på e-post om svar på dette emnet."
+ '3_10': 'Du vil motta varsler fordi du følger et stikkord for dette emnet'
'3_6': 'Du vil motta varsler fordi du følger denne kategorien'
'3_5': 'Du vil motta varsler fordi du startet å følge dette emnet automatisk.'
'3_2': 'Du vil motta varsler fordi du følger dette emnet.'
'3_1': 'Du vil motta varsler fordi du opprettet dette emnet.'
'3': 'Du vil motta varsler fordi du følger dette emnet.'
- '2_8': 'Du vil motta varsler fordi du følger denne kategorien.'
+ '2_8': 'Du vil motta varsler fordi du overvåker denne kategorien.'
'2_4': 'Du vil motta varsler fordi du svarte på dette emnet.'
- '2_2': 'Du vil motta varsler fordi du følger dette emnet.'
+ '2_2': 'Du vil motta varsler fordi du overvåker dette emnet.'
'2': 'Du vil motta varsler fordi du read this topic.'
'1_2': 'Du vil bli varslet om noen nevner ditt @navn eller svarer på ditt innlegg.'
'1': 'Du vil bli varslet om noen nevner ditt @navn eller svarer på ditt innlegg.'
@@ -1038,10 +1065,10 @@ nb_NO:
title: "Følger"
description: "Du vil bli varslet om hvert nye innlegg i dette emnet. Antall nye tilbakemeldinger vil også bli vist. "
tracking_pm:
- title: "Følger"
+ title: "Overvåker"
description: "Antall nye tilbakemeldinger vil bli vist for denne meldingen. Du vil bli varslet om noen nevner ditt @name eller svarer på din melding. "
tracking:
- title: "Følger"
+ title: "Ovevåker"
description: "Antall nye svar vil bli vist for dette emnet. Du vil bli varslet om noen nevner ditt @name eller svarer på ditt innlegg.. "
regular:
title: "Normal"
@@ -1091,10 +1118,10 @@ nb_NO:
title: "Fremhev dette emnet"
confirm_pin: "Du har allerede {{count}} låste emner. For mange låste emner kan være et problem for nye og anonyme brukere. Er du sikker på at du ønsker å låse et til emne i denne kategorien?"
unpin: "Fjern dette emnet fra toppen av {{categoryLink}} kategorien."
- pin_note: "Brukere kan låse opp emnet selv."
+ pin_note: "Brukere kan selv fjerne festet for dette emnet."
confirm_pin_globally: "Du har allerede {{count}} globalt låste emner. For mange låste emner kan bli en byrde for nye og anonyme brukere. Er du sikker på at du vil låse et til emne globalt? "
unpin_globally: "Fjern dette emnet fra toppen av alle emnelister. "
- global_pin_note: "Brukere kan låse opp emner for dem selv. "
+ global_pin_note: "Brukere kan fjerne festet for emnet for seg selv"
make_banner: "Gjør dette emnet til et banner som dukker opp på toppen av alle sider."
remove_banner: "Fjern banneret som dukker opp på toppen av alle sider. "
banner_note: "Brukere kan fjerne banneret ved å lukke det. Kun et emne kan være banner på en og samme tid. "
@@ -1120,7 +1147,7 @@ nb_NO:
to_topic_username: "Du har oppgitt et brukernavn. Vi sender et varsel med en link som inviterer dem til dette emnet."
to_username: "Oppgi brukernavnet til personen du ønsker å invitere. Vi sender et varsel med en lenke som inviterer dem til dette emnet."
email_placeholder: 'navn@example.com'
- success_email: "Vi har sendt ut en invitasjon til {{emailOrUsername}}. Vi varsler deg når invitasjonen er godtatt. Sjekk invitiasjonsfanen på brukersiden din for å holde styr på invitasjonene dine."
+ success_email: "Vi har sendt ut en invitasjon til {{emailOrUsername}}. Vi varsler deg når invitasjonen er godtatt. Sjekk invitiasjonsfanen på brukersiden din for å beholde oversikten over invitasjonene dine."
success_username: "Vi har invitert brukeren til å delta i dette emnet."
error: "Beklager, vi kunne ikke invitere den brukeren. De har muligens allerede blitt invitert?"
login_reply: 'Logg Inn for å svare'
@@ -1388,13 +1415,17 @@ nb_NO:
position: "posisjon"
default_position: "Standard posisjon"
position_disabled: "Kategorier vil bli vist i henhold til aktivitet. For å styre rekkefølgen av kategorier i listen"
- position_disabled_click: 'kan du aktivere "faste kategoriposisjoner" i innstillinger.'
+ position_disabled_click: 'aktivere "faste kategoriposisjoner"-innstillingen.'
parent: "Foreldrekategori"
notifications:
watching:
title: "Følger"
+ description: "Du vil automatisk følge alle emnene i disse kategoriene. Du vil bli varslet om hvert nye innlegg i hvert emne, og antall nye svar vil bli vist."
+ watching_first_post:
+ title: "Følger første innlegg"
tracking:
- title: "Sporing"
+ title: "Overvåkning"
+ description: "Du vil automatisk overvåke alle emner i disse kategoriene. Du vil bli varslet dersom noen nevner @navnet ditt eller svarer deg, og antallet nye svar vil bli vist."
regular:
title: "Normal"
description: "Du vil bli varslet om noen nevner ditt @navn eller svarer deg."
@@ -1440,8 +1471,8 @@ nb_NO:
archived:
help: "dette emnet er arkivert; det er fryst og kan ikke bli aktivert"
unpinned:
- title: "Løsgjort"
- help: "Dette emnet er ikke lenger fastsatt, det vil vises i vanlig rekkefølge"
+ title: "Feste fjernet"
+ help: "Dette emnet er ikke lenger festet, det vil vises i vanlig rekkefølge"
pinned_globally:
title: "Globalt fastsatt"
pinned:
@@ -1508,7 +1539,7 @@ nb_NO:
title_with_count:
one: "Ulest (1)"
other: "Ulest ({{count}})"
- help: "emner du for øyeblikket følger eller sporer med uleste innlegg"
+ help: "emner med uleste innlegg du for øyeblikket følger eller overvåker"
lower_title_with_count:
one: "1 ulest"
other: "{{count}} uleste"
@@ -1561,6 +1592,26 @@ nb_NO:
full: "Opprett / Svar / Se"
create_post: "Svar / Se"
readonly: "Se"
+ keyboard_shortcuts_help:
+ actions:
+ pin_unpin_topic: 'shift+p Fest/fjern feste for emne'
+ mark_muted: 'm, m Demp emnet'
+ mark_tracking: 'm, t Overvåk emne'
+ mark_watching: 'm, w Følg emne'
+ badges:
+ title: Merker
+ tagging:
+ notifications:
+ watching:
+ title: "Følger"
+ description: "Du vil automatisk følge alle emnene med dette stikkordet. Du vil bli varslet om alle nye innlegg og emner; i tillegg vil antallet uleste og nye innlegg vises ved siden av emnet."
+ watching_first_post:
+ title: "Følger første innlegg"
+ tracking:
+ title: "Overvåkning"
+ description: "Du vil automatisk overvåke alle emner med dette stikkordet. Antallet uleste og nye innlegg vil vises ved siden av emnet"
+ muted:
+ title: "Dempet"
admin_js:
type_to_filter: "skriv for å filtrere..."
admin:
@@ -1691,7 +1742,6 @@ nb_NO:
delete: "Slett"
delete_confirm: "Slette denne grupper?"
delete_failed: "Unable to delete group. If this is an automatic group, it cannot be destroyed."
- delete_member_confirm: "Fjern '%{username}' fra '%{group}' gruppen?"
add: "Legg til"
add_members: "Legg til medlemmer"
custom: "Egendefinert"
@@ -2206,7 +2256,7 @@ nb_NO:
required: 'Påkrevd'
basic: 'Grunnleggende oppsett'
users: 'Brukere'
- posting: 'Posting'
+ posting: 'Innlegg'
email: 'E-post'
files: 'Filer'
trust: 'Tillitsnivå'
@@ -2222,6 +2272,8 @@ nb_NO:
backups: "Sikkerhetskopier"
login: "Login"
plugins: "Utvidelser"
+ user_preferences: "Brukerinnstillinger"
+ search: "Søk"
badges:
title: Merker
new_badge: Nytt merke
@@ -2306,3 +2358,9 @@ nb_NO:
label: "Ny:"
add: "Legg til"
filter: "Søk (URL eller ekstern URL)"
+ wizard_js:
+ wizard:
+ done: "Ferdig"
+ back: "Forrige"
+ next: "Neste"
+ step: "%{current} av %{total}"
diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml
index 34abe389b5..0b0c70421e 100644
--- a/config/locales/client.nl.yml
+++ b/config/locales/client.nl.yml
@@ -322,17 +322,10 @@ nl:
one: "1 lid"
other: "%{count} leden"
groups:
- empty:
- posts: "Er is geen enkel bericht door leden van deze groep."
- members: "Er zijn geen leden in deze groep."
- mentions: "Deze groep wordt niet benoemd."
- messages: "Er zijn geen berichten voor deze groep."
- topics: "Er is geen topic gemaakt door de leden van deze groep."
add: "Voeg toe"
selector_placeholder: "Voeg leden toe"
owner: "eigenaar"
visible: "Groep is zichtbaar voor alle gebruikers"
- index: "Groepen"
title:
one: "groep"
other: "groepen"
@@ -428,6 +421,11 @@ nl:
profile: "Profiel"
mute: "Negeer"
edit: "Wijzig voorkeuren"
+ download_archive:
+ button_text: "Download mijn berichten"
+ confirm: "Weet je zeker dat je je berichten wilt downloaden?"
+ success: "Downloaden is gestart, je krijgt een bericht als het proces is afgerond."
+ rate_limit_error: "Berichten kunnen slechts één keer per dag gedownload worden, probeer het morgen nog eens."
new_private_message: "Nieuw bericht"
private_message: "Bericht"
private_messages: "Berichten"
@@ -451,6 +449,7 @@ nl:
each_browser_note: "Let op: Je moet deze optie instellen voor elke browser die je gebruikt."
dismiss_notifications: "Markeer alles als gelezen"
dismiss_notifications_tooltip: "Markeer alle ongelezen berichten als gelezen"
+ first_notification: "Je eerste notificatie! Selecteer het om te beginnen."
disable_jump_reply: "Niet naar je nieuwe bericht gaan na reageren"
dynamic_favicon: "Laat aantal nieuwe / bijgewerkte topics zien in favicon"
external_links_in_new_tab: "Open alle externe links in een nieuw tabblad"
@@ -473,6 +472,7 @@ nl:
Genegeerde topics en categorieën zitten niet in deze e-mails.
daily: "Verzend dagelijkse updates"
individual: "Verstuur een e-mail voor elk nieuw bericht"
+ individual_no_echo: "Stuur een e-mail voor elk nieuw bericht behalve die van mijzelf."
many_per_day: "Stuur mij een e-mail voor elk nieuw bericht (ongeveer {{dailyEmailEstimate}} per dag)"
few_per_day: "Stuur mij een e-mail voor elk nieuw bericht (ongeveer 2 per dag)"
tag_settings: "Tags"
@@ -685,12 +685,12 @@ nl:
account_age_days: "leeftijd van account in dagen"
create: "Stuur een uitnodiging"
generate_link: "Kopieer uitnodigingslink"
+ link_generated: "Uitnodigingslink is succesvol aangemaakt!"
+ valid_for: "De uitnodigingslink is alleen geldig voor dit e-mailadres: %{email}"
bulk_invite:
- none: "Je hebt nog niemand uitgenodigd. Je kan individueel uitnodigen of een groep mensen tegelijk door een groepsuitnodiging-bestand te uploaden"
+ none: "Je hebt nog niemand hier uitgenodigd. Je kunt individueel uitnodigen, of een groep mensen tegelijk uitnodigen door een CSV-bestand te uploaden."
text: "Groepsuitnodiging via bestand"
- uploading: "Uploaden..."
success: "Het uploaden van het bestand is gelukt, je krijgt een notificatie via een bericht als het proces afgerond is."
- error: "Het uploaden van '{{filename}}' is niet gelukt: {{message}}"
password:
title: "Wachtwoord"
too_short: "Je wachtwoord is te kort."
@@ -932,6 +932,9 @@ nl:
group_mentioned:
one: "Door het noemen van de groep {{group}}, sta je op het punt om 1 persoon op de hoogte te brengen – weet je dit zeker?"
other: "Door het noemen van de groep {{group}}, sta je op het punt om {{count}} personen op de hoogte te brengen – weet je dit zeker?"
+ cannot_see_mention:
+ category: "Je hebt {{username}} genoemd, maar het lid zal geen notificatie krijgen omdat het geen toegang heeft tot deze categorie. Je zult {{username}} moeten toevoegen aan een groep die toegang heeft tot deze categorie."
+ private: "Je hebt {{username}} genoemd, maar het lid zal geen notificatie krijgen omdat het dit persoonlijke bericht niet kan zien. Je zult {{username}} moeten uitnodigen voor dit PB."
duplicate_link: "Het ziet er naar uit dat je link naar {{domain}} al genoemd is in deze topic door @{{username}} in een bericht {{ago}} – weet je zeker dat je dit opnieuw wilt plaatsen?"
error:
title_missing: "Titel is verplicht"
@@ -953,6 +956,7 @@ nl:
title_placeholder: "Waar gaat de discussie over in één korte zin?"
edit_reason_placeholder: "vanwaar de wijziging?"
show_edit_reason: "(geef een reden)"
+ topic_featured_link_placeholder: "Plaats gegeven link met titel."
reply_placeholder: "Typ hier. Gebruik Markdown, BBCode, of HTML om op te maken. Sleep of plak afbeeldingen."
view_new_post: "Bekijk je nieuwe bericht."
saving: "Opslaan"
@@ -1138,6 +1142,8 @@ nl:
topics:
new_messages_marker: "laatste bezoek"
bulk:
+ select_all: "Alles selecteren"
+ clear_all: "Alles wissen"
unlist_topics: "Topics van lijst halen"
reset_read: "markeer als ongelezen"
delete: "Verwijder topics"
@@ -1458,6 +1464,7 @@ nl:
post:
reply: " {{replyAvatar}} {{usernameLink}}"
reply_topic: " {{link}}"
+ quote_reply: "Citeer"
edit: "Aan het bewerken {{link}} {{replyAvatar}} {{username}}"
edit_reason: "Reden: "
post_number: "bericht {{number}}"
@@ -1695,6 +1702,7 @@ nl:
email_in_disabled: "Het plaatsen van nieuwe topics via e-mail is uitgeschakeld in de webite-instellingen. Om het plaatsen van nieuwe topic via e-mail mogelijk te maken,"
email_in_disabled_click: 'schakel "e-mail in" instelling in.'
suppress_from_homepage: "Negeer deze categorie op de homepage"
+ sort_order: "Standaardsortering:"
allow_badges_label: "Laat badges toekennen voor deze categorie"
edit_permissions: "Wijzig permissies"
add_permission: "Nieuwe permissie"
@@ -1720,6 +1728,11 @@ nl:
muted:
title: "Genegeerd"
description: "Je zult niet op de hoogte worden gebracht over nieuwe topics in deze categorie en ze zullen niet verschijnen in Recent."
+ sort_options:
+ default: "standaard"
+ category: "Categorie"
+ sort_ascending: 'Oplopend'
+ sort_descending: 'Aflopend'
flagging:
title: 'Bedankt voor het beleefd houden van onze gemeenschap!'
action: 'Meld bericht'
@@ -2198,15 +2211,12 @@ nl:
refresh: "Herlaad"
new: "Nieuw"
selector_placeholder: "vul gebruikersnaam in"
- name_placeholder: "Groepsnaam, geen spaties, zelfde regels als bij een gebruikersnaam"
about: "Wijzig hier je deelname aan groepen en je namen"
group_members: "Groepsleden"
delete: "Verwijder"
delete_confirm: "Verwijder deze groepen?"
delete_failed: "Kan groep niet verwijderen. Als dit een automatische groep is, kan deze niet verwijderd worden."
- delete_member_confirm: "Verwijder '%{username}' uit de '%{group'} groep?"
delete_owner_confirm: "Verwijder eigenaarsprivileges van '% {username}'?"
- name: "Naam"
add: "Voeg toe"
add_members: "Voeg leden toe"
custom: "Aangepast"
@@ -2223,14 +2233,6 @@ nl:
add_owners: Eigenaren toevoegen
incoming_email: "Aangepaste inkomende e-mailadressen "
incoming_email_placeholder: "Voer je e-mailadres in"
- flair_url: "Avatar flair afbeelding"
- flair_url_placeholder: "(Optioneel) Afbeeldings-URL of Font Awesome class"
- flair_bg_color: "Avatar flair achtergrondkleur"
- flair_bg_color_placeholder: "(Optioneel) Hexadecimale kleurwaarde"
- flair_color: "Avatar flair kleur"
- flair_color_placeholder: "(Optioneel) Hexadecimale kleurwaarde"
- flair_preview: "Voorbeeld"
- flair_note: "Noot: Flair wordt alleen getoond voor de primaire groep van een gebruiker."
api:
generate_master: "Genereer Master API Key"
none: "Er zijn geen actieve API keys"
@@ -2285,7 +2287,6 @@ nl:
details: "Wanneer een nieuw bericht geplaatst, bewerkt, verwijderd of hersteld wordt."
user_event:
name: "Gebruikersgebeurtenis"
- details: "Wanneer een gebruiker wordt aangemaakt of goedgekeurd."
delivery_status:
title: "Afleveringsstatus"
inactive: "Inactief"
@@ -2503,6 +2504,8 @@ nl:
delivery_method: "Verzendmethode"
preview_digest_desc: "Bekijk een voorbeeld van de digest e-mails die gestuurd worden naar inactieve leden."
refresh: "Verniew"
+ send_digest_label: "Stuur dit resultaat naar:"
+ sending_email: "E-mail wordt verzonden..."
format: "Formaat"
html: "html"
text: "text"
diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml
index a370b8f38a..4784ee1c2c 100644
--- a/config/locales/client.pl_PL.yml
+++ b/config/locales/client.pl_PL.yml
@@ -347,18 +347,55 @@ pl_PL:
one: "1 użytkownik"
few: "%{count} użytkownicy"
other: "%{count} użytkowników"
+ group_histories:
+ actions:
+ change_group_setting: "Zmień ustawienia grupy"
+ add_user_to_group: "Dodaj użytkownika"
+ remove_user_from_group: "Usuń użytkownika"
+ make_user_group_owner: "Nadaj prawa właściciela"
+ remove_user_as_group_owner: "Usuń prawa właściciela"
groups:
+ logs:
+ title: "Logi"
+ when: "Kiedy"
+ action: "Akcja"
+ subject: "Kontekst"
+ details: "Szczegóły"
+ from: "Od"
+ to: "Do"
+ edit:
+ title: 'Edytuj grupę'
+ full_name: 'Pełna nazwa'
+ add_members: "Dodaj użytkowników"
+ delete_member_confirm: "Usuń '%{username}' z grupy '%{group}'?"
+ request_membership_pm:
+ title: "Prośba o członkostwo"
+ name_placeholder: "Nazwa grupy, bez spacji, takie same zasady jak przy nazwie użytkownika"
+ public: "Zezwalaj użytkownikom na zapraszanie/opuszczanie grupy (Grupa musi być widoczna)"
empty:
posts: "Członkowie tej grupy nie opublikowali żadnych postów."
- members: "W tej grupie nie ma żadnych członków."
- mentions: "Nie ma wzmianki w tej grupie."
- messages: "Nie ma żadnej wiadomości dla tej grupy."
- topics: "Członkowie tej grupy nie opublikowali żadnych postów."
+ members: "Nie ma użytkowników w tej grupie"
+ mentions: "Nie ma wspomnień tej grupy"
+ messages: "Nie ma wiadomości dla tej grupy"
+ topics: "Nie ma wątków stworzonych przez użytkowników tej grupy"
+ logs: "Nie ma logów dla tej grupy"
add: "Dodaj"
+ join: "Dołącz do grupy"
+ leave: "Opuść grupę"
+ request: "Żądanie dołączenia do grupy"
+ automatic_group: Automatyczna grupa
+ closed_group: Zamknięta grupa
+ is_group_user: "Jesteś członkiem tej grupy"
+ membership: "Członkostwo"
+ name: "Nazwa"
+ user_count: "Ilość użytkowników"
+ bio: "O grupie"
selector_placeholder: "Dodaj członków"
owner: "właściciel"
visible: "Grupa jest widoczna dla wszystkich użytkowników"
- index: "Grupy"
+ index:
+ title: "Grupy"
+ empty: "Nie ma widocznych grup"
title:
one: "grupa"
few: "grupy"
@@ -394,6 +431,8 @@ pl_PL:
muted:
title: "Wyciszony"
description: "Nie otrzymasz powiadomień o nowych tematach w tej grupie."
+ flair_preview_icon: "Podgląd ikony"
+ flair_preview_image: "Podgląd obrazka"
user_action_groups:
'1': "Przyznane lajki"
'2': "Otrzymane lajki"
@@ -712,12 +751,10 @@ pl_PL:
account_age_days: "Wiek konta w dniach"
create: "Wyślij zaproszenie"
generate_link: "Skopiuj link z zaproszeniem"
+ link_generated: "Link z zaproszenie został poprawnie wygenerowany!"
bulk_invite:
- none: "Jeszcze nikogo nie zaproszono. Możesz wysłać pojedyncze zaproszenie lub zaprosić wiele osób na raz wysyłając odpowiedni plik."
text: "Zaproszenia hurtowe z pliku"
- uploading: "Wysyłanie…"
success: "Plik został przesłany pomyślnie: otrzymasz prywatną wiadomość, gdy proces zostanie zakończony."
- error: "Podczas przesyłania wystąpił błąd '{{filename}}': {{message}}"
password:
title: "Hasło"
too_short: "Hasło jest za krótkie."
@@ -738,6 +775,14 @@ pl_PL:
one: "utworzono post"
few: "utworzonych postów"
other: "utworzono posty"
+ likes_given:
+ one: "dano"
+ few: "dano"
+ other: "dano"
+ likes_received:
+ one: "otrzymano"
+ few: "otrzymano"
+ other: "otrzymano"
days_visited:
one: "dzień odwiedzin"
few: "dni odwiedzin"
@@ -1130,6 +1175,7 @@ pl_PL:
statuses:
open: są otwarte
closed: są zamknięte
+ archived: są archiwizowane
noreplies: ma zero odpowiedzi
post:
time:
@@ -1675,14 +1721,6 @@ pl_PL:
side_by_side_markdown:
title: "Pokaż porównanie źródeł w formie tekstowej obok siebie"
button: ' Tekst'
- group:
- edit:
- title: 'Edycja grupy'
- title: 'Tytuł'
- name: "Nazwa"
- bio: "O grupie"
- flair_preview_icon: "Podgląd ikony"
- flair_preview_image: "Podgląd obrazu"
category:
can: 'może… '
none: '(brak kategorii)'
@@ -1754,6 +1792,14 @@ pl_PL:
muted:
title: "Wyciszone"
description: "Nie otrzymasz powiadomień o nowych tematach w tych kategoriach. Nie pojawią się na liście nieprzeczytanych."
+ sort_options:
+ default: "domyślny"
+ likes: "Polubienia"
+ views: "Odsłony"
+ posts: "Posty"
+ activity: "Aktywność"
+ category: "Kategoria"
+ created: "Utworzony"
flagging:
title: 'Dziękujemy za pomoc w utrzymaniu porządku w naszej społeczności!'
action: 'Oflaguj wpis'
@@ -2201,15 +2247,12 @@ pl_PL:
refresh: "Odśwież"
new: "Nowa"
selector_placeholder: "nazwa użytkownika"
- name_placeholder: "Nazwa grupy: bez spacji, takie same zasady jak przy nazwie użytkownika"
about: "Tu możesz edytować przypisania do grup oraz ich nazwy"
group_members: "Członkowie grupy"
delete: "Usuń"
delete_confirm: "Usunąć tę grupę?"
delete_failed: "Nie można usunąć grupy. Jeżeli jest to grupa automatyczna, nie może zostać zniszczona."
- delete_member_confirm: "Usunąć '%{username}' z grupy '%{group}' ?"
delete_owner_confirm: "Usunąć status właściciela dla '%{username}'?"
- name: "Nazwa"
add: "Dodaj"
add_members: "Dodaj członków"
custom: "Niestandardowe"
@@ -2226,7 +2269,6 @@ pl_PL:
add_owners: Dodaj właścicieli
incoming_email: "Niestandardowy adres poczty przychodzącej"
incoming_email_placeholder: "podaj adres e-mail"
- flair_preview: "Podgląd"
api:
generate_master: "Generuj Master API Key"
none: "Nie ma teraz aktywnych kluczy API."
@@ -2433,6 +2475,7 @@ pl_PL:
name: 'polubienie'
description: "Kolor przycisku lajkuj"
email:
+ title: "Emaile"
settings: "Ustawienia"
templates: "Szablony"
preview_digest: "Pokaż zestawienie aktywności"
@@ -2467,8 +2510,10 @@ pl_PL:
incoming_emails:
from_address: "Od"
to_addresses: "Do"
+ cc_addresses: "Cc"
subject: "Temat"
error: "Błąd"
+ none: "Brak przychodzących emaili."
modal:
title: "Szczegóły przychodzącego emaila"
error: "Błąd"
diff --git a/config/locales/client.pt.yml b/config/locales/client.pt.yml
index e8693841bb..12b885cdd8 100644
--- a/config/locales/client.pt.yml
+++ b/config/locales/client.pt.yml
@@ -322,17 +322,10 @@ pt:
one: "1 utilizador"
other: "%{count} utilizadores"
groups:
- empty:
- posts: "Não há nenhuma publicação feita por membros deste grupo."
- members: "Não há nenhum membro neste grupo."
- mentions: "Não há nenhuma menção deste grupo."
- messages: "Não há nenhuma mensagem para este grupo."
- topics: "Não há nenhum tópico feito por membros deste grupo."
add: "Adicionar"
selector_placeholder: "Adicionar membros"
owner: "proprietário"
visible: "O grupo é visível para todos os utilizadores"
- index: "Grupos"
title:
one: "grupo"
other: "grupos"
@@ -695,11 +688,9 @@ pt:
link_generated: "Ligação de convite gerada com sucesso!"
valid_for: "Ligação de convite é válida apenas para este endereço de email: %{email}"
bulk_invite:
- none: "Ainda não convidou ninguém. Pode enviar convites individuais, ou convidar um grupo de pessoas de uma única vez carregando um ficheiro com convites em massa."
+ none: "Ainda não convidou ninguém. Pode enviar convites individuais, ou convidar um grupo de pessoas de uma única vez carregando um ficheiro CSV."
text: "Convite em massa a partir de ficheiro"
- uploading: "A carregar…"
success: "Ficheiro carregado corretamente, será notificado via mensagem assim que o processo esteja concluído."
- error: "Erro de carregamento '{{filename}}': {{message}}"
password:
title: "Palavra-passe"
too_short: "A sua palavra-passe é muito curta."
@@ -966,6 +957,7 @@ pt:
title_placeholder: "Numa breve frase, de que se trata esta discussão?"
edit_reason_placeholder: "Porque está a editar?"
show_edit_reason: "(adicione a razão para a edição)"
+ topic_featured_link_placeholder: "Inserir ligação mostrada com o título."
reply_placeholder: "Digite aqui. Utilize Markdown, BBCode, ou HTML para formatar. Arraste ou cole imagens."
view_new_post: "Ver a sua nova publicação"
saving: "A Guardar"
@@ -2229,15 +2221,12 @@ pt:
refresh: "Atualizar"
new: "Novo"
selector_placeholder: "insira o nome de utilizador"
- name_placeholder: "Nome do grupo, sem espaços, com as mesmas regras do nome de utilizador"
about: "Editar aqui a sua participação e nomes no grupo"
group_members: "Membros do grupo"
delete: "Eliminar"
delete_confirm: "Eliminar este grupo?"
delete_failed: "Impossível eliminar grupo. Se se trata de um grupo automático, não pode ser eliminado."
- delete_member_confirm: "Remova o '%{username}' do grupo '%{group}'?"
delete_owner_confirm: "Remover privilégios do proprietário para '%{username}'?"
- name: "Nome"
add: "Adicionar"
add_members: "Adicionar membros"
custom: "Personalizar"
@@ -2254,14 +2243,6 @@ pt:
add_owners: Adicionar proprietários
incoming_email: "Endereço de email de entrada personalizado"
incoming_email_placeholder: "introduza o endereço de email"
- flair_url: "Imagem da Marca de Avatar"
- flair_url_placeholder: "(Opcional) URL da Imagem ou classe de Font Awesome"
- flair_bg_color: "Cor de fundo da Marca de Avatar"
- flair_bg_color_placeholder: "(Opcional) Valor Hexadecimal da cor"
- flair_color: "Cor da Marca de Avatar"
- flair_color_placeholder: "(Opcional) Valor Hexadecimal da cor"
- flair_preview: "Pré-visualização"
- flair_note: "Nota: a Marca de um utilizador só aparecerá para o seu grupo primário."
api:
generate_master: "Gerar Chave Mestra API "
none: "Não existem chaves API ativas neste momento."
@@ -2316,7 +2297,6 @@ pt:
details: "Quando uma resposta é nova, editada, apagada ou recuperada. "
user_event:
name: "Evento de Utilizador"
- details: "Quando um utilizador é criado ou aprovado."
delivery_status:
title: "Estado de Entrega"
inactive: "Inativo"
diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml
index a6e1a2432f..2ff20a6d08 100644
--- a/config/locales/client.pt_BR.yml
+++ b/config/locales/client.pt_BR.yml
@@ -321,18 +321,15 @@ pt_BR:
total_rows:
one: "1 usuário"
other: "%{count} usuários"
+ group_histories:
+ actions:
+ add_user_to_group: "Adicionar usuário"
+ remove_user_from_group: "Remover usuário"
groups:
- empty:
- posts: "Não há postagens por membros deste grupo."
- members: "Não há membros neste grupo."
- mentions: "Não há menção a este grupo."
- messages: "Não há mensagens para este grupo."
- topics: "Não há topicos por membros deste grupo."
add: "Adicionar"
selector_placeholder: "Adicionar membros"
owner: "proprietário"
visible: "Grupo é visível para todos os usuários"
- index: "Grupos"
title:
one: "grupo"
other: "grupos"
@@ -694,11 +691,8 @@ pt_BR:
link_generated: "Link de convite gerado com sucesso!"
valid_for: "Link de convite é válido apenas para esse endereço de email: %{email}"
bulk_invite:
- none: "Você ainda não convidou ninguém. Você pode enviar convites individuais, ou enviar vários de uma vez através da ferramenta de enviar em massa."
text: "Convidar em massa a partir de arquivo"
- uploading: "Subindo..."
success: "Arquivo enviado com sucesso, você será notificado por mensagem quando o processo estiver completo."
- error: "Houve um erro ao enviar '{{filename}}': {{message}}"
password:
title: "Senha"
too_short: "A sua senha é muito curta."
@@ -1658,12 +1652,6 @@ pt_BR:
side_by_side_markdown:
title: "Mostrar a diferença da fonte crua lado-a-lado"
button: ' Cru'
- group:
- edit:
- title: 'Editar Grupo'
- title: 'Título'
- name: "Nome"
- name_placeholder: "Nome do grupo, sem espaços, mesma regra que o nome de usuário"
category:
can: 'pode… '
none: '(sem categoria)'
@@ -2229,15 +2217,12 @@ pt_BR:
refresh: "Atualizar"
new: "Novo"
selector_placeholder: "digite o nome de usuário"
- name_placeholder: "Nome do grupo, sem espaços, regras iguais ao nome de usuário"
about: "Editar participação no grupo e nomes aqui"
group_members: "Membros do grupo"
delete: "Apagar"
delete_confirm: "Apagar este grupos?"
delete_failed: "Unable to delete group. If this is an automatic group, it cannot be destroyed."
- delete_member_confirm: "Remover '%{username}' do grupo '%{group}'?"
delete_owner_confirm: "Remover privilégio de proprietário de '%{username}'?"
- name: "Nome"
add: "Adicionar"
add_members: "Adicionar membros"
custom: "Definidos"
@@ -2254,10 +2239,6 @@ pt_BR:
add_owners: Adicionar proprietários
incoming_email: "Endereço de email de entrada personalizado"
incoming_email_placeholder: "Insira um endereço de email"
- flair_url_placeholder: "(Opcional) URL de imagem ou classe Font Awesome"
- flair_bg_color_placeholder: "(Opcional) Valor em hexadecimal da cor"
- flair_color_placeholder: "(Opcional) Valor em hexadecimal da cor"
- flair_preview: "Pré-visualizar"
api:
generate_master: "Gerar chave Mestra de API"
none: "Não existem chaves API ativas no momento."
@@ -2311,7 +2292,6 @@ pt_BR:
details: "Quando existir uma nova resposta, edição, deleção ou recuperação."
user_event:
name: "Evento de Usuário"
- details: "When um usuário é criado ou aprovado."
delivery_status:
title: "Status de Entrega"
inactive: "Inativo"
diff --git a/config/locales/client.ro.yml b/config/locales/client.ro.yml
index d65040f90b..4d6cf5a047 100644
--- a/config/locales/client.ro.yml
+++ b/config/locales/client.ro.yml
@@ -347,18 +347,59 @@ ro:
one: "1 utilizator"
few: "%{count} utilizatori"
other: "%{count} de utilizatori"
+ group_histories:
+ actions:
+ change_group_setting: "Schimbă setarea grupului"
+ add_user_to_group: "Adaugă utilizator"
+ remove_user_from_group: "Șterge utilizator"
+ make_user_group_owner: "Fă proprietar"
+ remove_user_as_group_owner: "Revocă proprietar"
groups:
+ logs:
+ title: "Jurnale"
+ when: "Când"
+ action: "Acțiune"
+ acting_user: "Utilizator temporar"
+ target_user: "Utilizator țintă"
+ subject: "Subiect"
+ details: "Detalii"
+ from: "De la"
+ to: "Către"
+ edit:
+ title: 'Editează grup'
+ full_name: 'Nume complet'
+ add_members: "Adaugă membri"
+ delete_member_confirm: "Șterge utilizatorul '%{username}' din grupul '%{group}'?"
+ request_membership_pm:
+ title: "Cerere de adăugare ca membru"
+ body: "Aș dori să fac o cerere de adăugare ca membru în @%{groupName}."
+ name_placeholder: "Numele grupului, fără spații, la fel ca regula pentru nume utilizator"
+ public: "Permite utilizatorilor să intre/iasă din grup fără restricții. (Presupune ca grupul să fie vizibil)"
empty:
- posts: "Nu există nici o postare a membrilor acestui grup."
+ posts: "Nu există postări ale membrilor acestui grup."
members: "Nu există nici un membru în acest grup."
- mentions: "Nu sunt mențiuni ale acestui grup."
- messages: "Nu este nici un mesaj pentru acest grup."
- topics: "Nu exista nici un subiect postat de membrii acestui grup."
+ mentions: "Nu există nicio menționare în acest grup."
+ messages: "Nu există nici un mesaj în acest grup."
+ topics: "Nu există nici un subiect creat de vreun membru al acestui grup."
+ logs: "Nu există nici un jurnal pentru acest grup."
add: "Adaugă"
+ join: "Alătură-te grupului"
+ leave: "Părăsește grupul"
+ request: "Cere să te alături grupului"
+ automatic_group: Grup automat
+ closed_group: Grup închis
+ is_group_user: "Ești membru al acestui grup"
+ allow_membership_requests: "Permite utilizatorilor să trimită cereri de adăugare ca membri către proprietarii grupului. (Presupune ca toată lumea să aibă posibilitatea de a menționa grupul)"
+ membership: "Apartenență"
+ name: "Nume"
+ user_count: "Număr de membri"
+ bio: "Despre grup"
selector_placeholder: "Adaugă membri"
owner: "Proprietar"
visible: "Grupul este vizibil tuturor utilizatorilor"
- index: "Grupuri"
+ index:
+ title: "Grupuri"
+ empty: "Nu există nici un grup vizibil."
title:
one: "Grup"
few: "Grupuri"
@@ -394,6 +435,15 @@ ro:
muted:
title: "Setat pe silențios"
description: "Nu vei fi niciodată notificat despre nimic legat de noile subiecte din acest grup."
+ flair_url: "Imagine avatar cu element distinct"
+ flair_url_placeholder: "(Opțional) URL imagine sau clasă Font Awesome"
+ flair_bg_color: "Culoarea de fundal a avatarului cu element distinct"
+ flair_bg_color_placeholder: "(Opțional) Valoarea Hex a culorii"
+ flair_color: "Culoarea avatarului cu element distinct"
+ flair_color_placeholder: "(Opțional) Valoarea Hex a culorii"
+ flair_preview_icon: "Previzualizează iconiță"
+ flair_preview_image: "Previzualizează imagine"
+ flair_note: "Observație: Elementul distinct va fi afișat doar pentru grupul principal al utilizatorului."
user_action_groups:
'1': "Aprecieri date"
'2': "Aprecieri primite"
@@ -726,11 +776,9 @@ ro:
link_generated: "Link de invitare generat cu succes!"
valid_for: "Link-ul de invitare este valid doar pentru următoarele adrese de email: %{email}"
bulk_invite:
- none: "Nu ai invitat încă pe nimeni. Poți trimite invitații individuale sau mai multor oameni deodată prin încărcarea fișierului de invitații multiple."
+ none: "Nu ai invitat încă pe nimeni aici. Poți trimite invitații individuale sau poți invita mai multe persoane odată încărcând un fișier CSV."
text: "Invitație multiplă din fișier"
- uploading: "Se încarcă..."
success: "Fișier încărcat cu succes, vei fi înștiințat printr-un mesaj când procesarea este completă."
- error: "A apărut o eroare la încărcarea fișierului '{{filename}}': {{message}}"
password:
title: "Parolă"
too_short: "Parola este prea scurtă."
@@ -1005,8 +1053,10 @@ ro:
title: "Sau apasă Ctrl+Enter"
users_placeholder: "Adaugă un utilizator"
title_placeholder: "Despre ce e vorba în acest subiect - pe scurt?"
+ title_or_link_placeholder: "Introdu titlul, sau copiază aici un link"
edit_reason_placeholder: "de ce editezi?"
show_edit_reason: "(adaugă motivul editării)"
+ topic_featured_link_placeholder: "Introdu link afișat cu titlu."
reply_placeholder: "Scrie aici. Utilizează formatarea Markdown, BBCode sau HTML. Trage sau lipește imagini."
view_new_post: "Vezi noua ta postare."
saving: "Se salvează"
@@ -1763,6 +1813,7 @@ ro:
tags_allowed_tag_groups: "În această categorie se pot folosi numai grupurile de etichete:"
tags_placeholder: "(Opțional) lista etichetelor permise"
tag_groups_placeholder: "(Opțional) lista grupurilor de etichete permise"
+ topic_featured_link_allowed: "Permite link-uri promovate în această categorie."
delete: 'Șterge categorie'
create: 'Categorie nouă'
create_long: 'Creează o categorie nouă'
@@ -1797,6 +1848,7 @@ ro:
email_in_disabled: "Postarea subiectelor noi prin email este dezactivată din setările siteului. Pentru a activa postarea subiectelor noi prin email,"
email_in_disabled_click: 'activează opțiunea "primire email ".'
suppress_from_homepage: "Elimină această categorie de pe pagina principală."
+ all_topics_wiki: "Transformă subiectele noi în wiki-uri, implicit."
sort_order: "Sortare implicită:"
allow_badges_label: "Permite acordarea de ecusoane în această categorie"
edit_permissions: "Editează permisiuni"
@@ -2338,15 +2390,12 @@ ro:
refresh: "Reîmprospătează"
new: "Noi"
selector_placeholder: "introdu nume de utilizator"
- name_placeholder: "Numele grupului, fără spații, asemenea regulii de la numele de utilizator"
about: "Editează aici numele și apartenența la grupuri"
group_members: "Membrii grupului"
delete: "Șterge"
delete_confirm: "Ștergi acest grup?"
delete_failed: "Imposibil de șters grupul. Dacă este unul automat, nu se poate șterge."
- delete_member_confirm: "Şterge '%{username}' din grupul '%{group}'?"
delete_owner_confirm: "Revocă dreptul de proprietar pentru '%{username}'?"
- name: "Nume"
add: "Adaugă"
add_members: "Adaugă membri"
custom: "Personalizat"
@@ -2363,14 +2412,6 @@ ro:
add_owners: Adaugă proprietari
incoming_email: "Adresă de primire emailuri personalizată"
incoming_email_placeholder: "introducere adresă de email"
- flair_url: "Imagine avatar cu element distinct"
- flair_url_placeholder: "(Opțional) URL-ul imagine sau clasă Font Awesome"
- flair_bg_color: "Culoarea de fundal a avatarului cu element distinct"
- flair_bg_color_placeholder: "(Opțional) Valoarea Hex a culorii"
- flair_color: "Culoarea avatarului cu element distinct"
- flair_color_placeholder: "(Opțional) Valoarea Hex a culorii"
- flair_preview: "Previzualizare"
- flair_note: "Observație: Elementul distinct va fi afișat doar pentru grupul principal al utilizatorului."
api:
generate_master: "Generează cheie API principală"
none: "Nu sunt chei API principale active deocamdată."
@@ -2425,7 +2466,7 @@ ro:
details: "Atunci când exista un răspuns nou, editat, șters sau recuperat."
user_event:
name: "Eveniment utilizator"
- details: "Atunci când un utilizator este creat sau aprobat."
+ details: "Când un utilizator este creat, aprobat sau actualizat."
delivery_status:
title: "Starea livrării"
inactive: "Inactivă"
diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml
index 2df09f0654..c11d606bde 100644
--- a/config/locales/client.ru.yml
+++ b/config/locales/client.ru.yml
@@ -373,17 +373,10 @@ ru:
many: "%{count} пользователей"
other: "%{count} пользователей"
groups:
- empty:
- posts: "Участники этой группы не отправили ни одного сообщения"
- members: "В этой группе нет участников"
- mentions: "Упоминаний этой группы нет"
- messages: "Для этой группы нет сообщений"
- topics: "Участниками этой группы не создано ни одной темы"
add: "Добавить"
selector_placeholder: "Добавить участников"
owner: "владелец"
visible: "Группа видима всем пользователям"
- index: "Группы"
title:
one: "группа"
few: "группы"
@@ -747,11 +740,8 @@ ru:
create: "Отправить приглашение"
generate_link: "Скопировать ссылку для приглашений"
bulk_invite:
- none: "Вы еще никого не приглашали на этот форум. Можно отправить индивидуальные приглашения по одному, или же пригласить сразу несколько людей из файла."
text: "Пригласить всех из файла"
- uploading: "Загрузка..."
success: "Файл успешно загружен, вы получите сообщение, когда процесс будет завершен."
- error: "В процессе загрузки файла '{{filename}}' произошла ошибка: {{message}}"
password:
title: "Пароль"
too_short: "Пароль слишком короткий."
@@ -2380,15 +2370,12 @@ ru:
refresh: "Обновить"
new: "Добавить новую"
selector_placeholder: "введите псевдоним"
- name_placeholder: "Название группы, без пробелов, по тем же правилам, что и для псевдонимов."
about: "Здесь можно редактировать группы и имена групп"
group_members: "Участники группы"
delete: "Удалить"
delete_confirm: "Удалить эту группу?"
delete_failed: "Невозможно удалить группу. Если группа была создана автоматически, то она не может быть удалена."
- delete_member_confirm: "Удалить пользователя '%{username}' из группы '%{group}'?"
delete_owner_confirm: "Отозвать права владельца у пользователя '%{username}'?"
- name: "Название"
add: "Добавить"
add_members: "Добавить участников"
custom: "Настраиваемые"
@@ -2405,10 +2392,6 @@ ru:
add_owners: Добавить владельцев
incoming_email: "Специальный входящий адрес e-mail"
incoming_email_placeholder: "введите e-mail"
- flair_url_placeholder: "(Необязательно) Ссылка на изображение или класс шрифта Font Awesome"
- flair_bg_color_placeholder: "(Необязательно) Hex-код цвета"
- flair_color_placeholder: "(Необязательно) Hex-код цвета"
- flair_preview: "Предпросмотр"
api:
generate_master: "Сгенерировать ключ API"
none: "Отсутствует ключ API."
@@ -2445,7 +2428,6 @@ ru:
details: "Происходит, когда сообщение создается, редактируется, удаляется или восстанавливается."
user_event:
name: "Событие пользователя"
- details: "Происходит, когда создается или подтверждается пользователь."
delivery_status:
title: "Статус передачи"
inactive: "Неактивна"
diff --git a/config/locales/client.sk.yml b/config/locales/client.sk.yml
index c8c81ef7da..689dea6cf4 100644
--- a/config/locales/client.sk.yml
+++ b/config/locales/client.sk.yml
@@ -342,17 +342,10 @@ sk:
few: "%{count} používatelia"
other: "%{count} používateľov"
groups:
- empty:
- posts: "Neexistuje žiadny príspevok od člena tejto skupiny."
- members: "Táto skupina neobsahuje žiadnych členov."
- mentions: "Táto skupina nieje nikde zmienená."
- messages: "Neexistujú žiadne správy pre túto skupinu."
- topics: "Neexistuje žiadna téma od členov tejto skupiny."
add: "Pridať"
selector_placeholder: "Pridať členov"
owner: "vlastník"
visible: "Skupina je viditeľná všetkým používateľom"
- index: "Skupiny"
title:
one: "skupina"
few: "skupiny"
@@ -695,11 +688,8 @@ sk:
create: "Poslať Pozvánku"
generate_link: "Kopírovať Odkaz Pozvánky"
bulk_invite:
- none: "Zatiaľ ste tu nikoho nepozvali. Môžete odosielať pozvánky individuálne alebo pozvať skupinu ľudí naraz pomocou nahratia súboru."
text: "Hromadná pozvánka zo súboru"
- uploading: "Prebieha nahrávanie..."
success: "Súbor bol úspešne odoslaný. Keď sa nahrávanie dokončí, budete na to upozornený cez správu."
- error: "Pri nahrávaní '{{filename}}' sa vyskytla chyba: {{message}}"
password:
title: "Heslo"
too_short: "Vaše heslo je príliš krátke."
@@ -2162,15 +2152,12 @@ sk:
refresh: "Obnoviť"
new: "Nový"
selector_placeholder: "zadať používateľské meno"
- name_placeholder: "Názov skupiny, bez medzier, rovnaké pravidlá ako pre používateľa"
about: "Tu upravíte Vaše členstvo v skupinách a mená"
group_members: "Členovia skupiny"
delete: "Odstrániť"
delete_confirm: "Zmazať túto skupinu?"
delete_failed: "Nepodarilo sa zmazať skupinu. Pokiaľ je skupina automatická, nemôže byť zrušená."
- delete_member_confirm: "Odstrániť '%{username}' zo skupiny '%{group}'?"
delete_owner_confirm: "Odobrať vlastnícke práva %{username}'?"
- name: "Meno"
add: "Pridať"
add_members: "Pridať členov"
custom: "Vlastné"
@@ -2187,7 +2174,6 @@ sk:
add_owners: Pridať vlastníkov
incoming_email: "Vlastná e-mailová adresa pre príchodziu poštu"
incoming_email_placeholder: "zadajte emailovú adresu"
- flair_preview: "Náhľad"
api:
generate_master: "Vygenerovať Master API kľúč"
none: "V súčasnosti neexistujú žiadne aktívne API kľúče."
diff --git a/config/locales/client.sq.yml b/config/locales/client.sq.yml
index 35dbf8f25c..f34427fbd3 100644
--- a/config/locales/client.sq.yml
+++ b/config/locales/client.sq.yml
@@ -320,17 +320,10 @@ sq:
one: "1 anëtar"
other: "%{count} anëtarë"
groups:
- empty:
- posts: "Nuk ka postim nga anëtarët e këtij grupi."
- members: "Nuk ka asnjë anëtar në këtë grup."
- mentions: "Nuk ka përmendje për këtë grup."
- messages: "Nuk ka mesazhe për këtë grup."
- topics: "Nuk ka asnjë temë nga anëtarët e këtij grupi."
add: "Shto"
selector_placeholder: "Shto anëtarë"
owner: "autori"
visible: "Grupi është i dukshëm për të gjithë përdoruesit"
- index: "Grupet"
title:
one: "grup"
other: "grupe"
@@ -676,11 +669,8 @@ sq:
create: "Dërgo një ftesë"
generate_link: "Kopjo lidhjen e ftesës"
bulk_invite:
- none: "Ju nuk keni ftuar askënd deri tani. Mund të dërgoni ftesa individuale ose mund të ftoni një grup personash duke ngarkuar skedarin."
text: "Skedari për ftesat në grup"
- uploading: "Duke ngarkuar..."
success: "Skedari u ngarkua, do njoftoheni me mesazh kur procesi të mbarojë. "
- error: "Pati një gabi gjatë ngarkimit të skedarit '{{filename}}': {{message}}"
password:
title: "Fjalëkalimi"
too_short: "Fjalëkalimi është shumë i shkurër."
@@ -2104,15 +2094,12 @@ sq:
refresh: "Rifresko"
new: "I Ri"
selector_placeholder: "vendos emrin e përdoruesit"
- name_placeholder: "Emri i grupit, pa hapësira, si username-t"
about: "Modifiko anëtarët e grupit dhe emrin këtu"
group_members: "Përdorues grupi"
delete: "Fshij"
delete_confirm: "Fshije këtë grup?"
delete_failed: "Nuk e fshimë dot grupin. Nëse ky është një grup automatik, nuk fshihet dot. "
- delete_member_confirm: "Do të heqësh '%{username}' nga grupi '%{group}'?"
delete_owner_confirm: "Hiqe privilegjin e pronarit për '%{username}'?"
- name: "Emri"
add: "Shto"
add_members: "Shto Anëtar"
custom: "Grupet e krijuara"
@@ -2123,7 +2110,6 @@ sq:
automatic: "Automatik"
group_owners: Pronarët
add_owners: Shto pronarë
- flair_preview: "Parashikimi"
api:
generate_master: "Gjenero Master API Key"
none: "Për momentin, nuk ka çelësa API aktivë."
diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml
index 3af09a3a03..5e1d4097b7 100644
--- a/config/locales/client.sv.yml
+++ b/config/locales/client.sv.yml
@@ -322,17 +322,10 @@ sv:
one: "1 användare"
other: "%{count} användare"
groups:
- empty:
- posts: "Det finns inga inlägg från medlemmar in denna grupp."
- members: "Det finns ingen medlem i den här gruppen."
- mentions: "Det finns ingen omnämnande i den här gruppen."
- messages: "Det finns inget meddelande för den här gruppen."
- topics: "Det finns inget ämne från medlemmar i den här gruppen."
add: "Lägg till"
selector_placeholder: "Lägg till medlemmar"
owner: "ägare"
visible: "Gruppen är synlig för alla användare"
- index: "Grupper"
title:
one: "grupp"
other: "grupper"
@@ -695,11 +688,8 @@ sv:
link_generated: "Länk för inbjudan framgångsrikt skapad!"
valid_for: "Länk för inbjudan är endast giltig för denna email adress: %{email}"
bulk_invite:
- none: "Du har inte skickat några inbjudningar. Du kan skicka individuella inbjudningar, eller så kan du bjuda in flera på en gång genom att ladda upp en bulkfil."
text: "Massinbjudan från fil"
- uploading: "Laddar upp..."
success: "Filen laddades upp, du blir underrättad via meddelande när processen är klar"
- error: "Det blev ett fel vid uppladdning av '{{filename}}': {{message}}"
password:
title: "Lösenord"
too_short: "Ditt lösenord är för kort."
@@ -2216,15 +2206,12 @@ sv:
refresh: "Uppdatera"
new: "Ny"
selector_placeholder: "ange användarnamn"
- name_placeholder: "Gruppnamn, inga mellanslag, samma regler som för användarnamn"
about: "Redigera dina gruppmedlemskap och -namn här."
group_members: "Gruppmedlemmar"
delete: "Radera"
delete_confirm: "Ta bort den här gruppen?"
delete_failed: "Oförmögen att ta bort grupp. Om det här är en automatisk grupp så kan den inte raderas."
- delete_member_confirm: "Ta bort '%{username}' från '%{group}' gruppen?"
delete_owner_confirm: "Ta bort användarprivilegier för '\"{username}'?"
- name: "Namn"
add: "Lägg till"
add_members: "Lägg till medlemmar"
custom: "Anpassad"
@@ -2241,9 +2228,6 @@ sv:
add_owners: Lägg till ägare
incoming_email: "Egenvald inkommande e-postadress"
incoming_email_placeholder: "Ange e-postadress"
- flair_bg_color_placeholder: "(Valfritt) Hexadecimal färgkod"
- flair_color_placeholder: "(Valfritt) Hexadecimal färgkod"
- flair_preview: "Förhandsgranska"
api:
generate_master: "Generera API-huvudnyckel"
none: "Det finns inga aktiva API-nycklar just nu."
@@ -2292,7 +2276,6 @@ sv:
details: "När det finns ett nytt svar, redigerat, borttaget eller återskapat."
user_event:
name: "Användarevent"
- details: "När en användare är skapad eller godkänd."
delivery_status:
title: "Leveransstatus"
inactive: "Inaktiv"
diff --git a/config/locales/client.te.yml b/config/locales/client.te.yml
index e5e0f62757..f62c3de6e6 100644
--- a/config/locales/client.te.yml
+++ b/config/locales/client.te.yml
@@ -410,10 +410,7 @@ te:
account_age_days: "రోజుల్లో ఖాతా వయసు"
create: "ఒక ఆహ్వానం పంపు"
bulk_invite:
- none: "మీరు ఇంకా ఎవరినీ ఆహ్వానించలేదు. మీరు వ్యక్తిగత ఆహ్వానాలు పంపవచ్చు, లేదా కొంతమందికి ఒకేసారి ఆహ్వాన దస్త్రం ఎగుమతించుట ద్వారా పంపవచ్చు."
text: "దస్త్రం నుండి బహుళ ఆహ్వానాలు"
- uploading: "ఎగుమతవుతోంది..."
- error: "'{{filename}}' ఎగుమతించుటలో దోషం: {{message}}"
password:
title: "సంకేతపదం"
too_short: "మీ సంకేతపదం మరీ చిన్నది."
@@ -1250,14 +1247,11 @@ te:
refresh: "తాజా పరుచు"
new: "కొత్త"
selector_placeholder: "సభ్యనామం రాయండి"
- name_placeholder: "గంపు పేరు, జాగా లేకుండా, సభ్యనామం వలె"
about: "మీ గుంపు మెంబర్షిప్పు మరియు పేర్లు ఇక్కడ సవరించండి"
group_members: "గుంపు సభ్యులు"
delete: "తొలగించు"
delete_confirm: "ఈ గుంపును తొలగించాలనుకుంటున్నారా? "
delete_failed: "గుంపును తొలగించలేకున్నాము. ఇది స్వీయ గుంపు అయితే దీన్ని నాశనం చేయలేరు."
- delete_member_confirm: " '%{group}' గుంపు నుండి '%{username}' ను తొలగించాలా?"
- name: "పేరు"
add: "కలుపు"
add_members: "సభ్యులను కలుపు"
automatic_membership_email_domains: "వినియోగదారుడు ఏ ఈ-మెయిల్ డొమైన్ తో నమోదు చేసుకున్నాడో అది ఖచ్చితంగా ఈ జాబితాలో ఒక దానిని పోలి స్వయంసిధ్ధంగా గ్రూప్ కి కలుస్తాయి:"
diff --git a/config/locales/client.tr_TR.yml b/config/locales/client.tr_TR.yml
index 2bd748a47d..08ffe7b320 100644
--- a/config/locales/client.tr_TR.yml
+++ b/config/locales/client.tr_TR.yml
@@ -296,17 +296,10 @@ tr_TR:
total_rows:
other: "%{count} kullanıcı"
groups:
- empty:
- posts: "Bu grubun üyelerinden gönderi yok."
- members: "Bu grupta üye yok."
- mentions: "Bu gruptan söz edilmemiş."
- messages: "Bu grup için bir ileti yok."
- topics: "Bu grubun üyelerinden konu yok."
add: "Ekle"
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"
@@ -658,11 +651,8 @@ tr_TR:
create: "Davet Yolla"
generate_link: "Davet bağlantısını kopyala"
bulk_invite:
- none: "Henüz kimseyi buraya davet etmediniz. Tek tek davetiye gönderebilirsiniz, ya da toplu bir davetiye dosyası yükleyerek birçok kişiyi aynı anda davet edebilirsiniz. "
text: "Dosyadan Toplu Davet Gönder"
- uploading: "Yükleniyor..."
success: "Dosya başarıyla yüklendi, işlem tamamlandığında iletiyle bilgilendirileceksiniz."
- error: "'{{filename}}' yüklenirken bir hata oluştu: {{message}}"
password:
title: "Parola"
too_short: "Parolanız çok kısa."
@@ -2101,15 +2091,12 @@ tr_TR:
refresh: "Yenile"
new: "Yeni"
selector_placeholder: "kullanıcı adı girin"
- name_placeholder: "Grup adı, kullanıcı adındaki gibi boşluksuz olmalı"
about: "Grup üyeliğinizi ve isimleri burada düzenleyin"
group_members: "Grup üyeleri"
delete: "Sil"
delete_confirm: "Grup silinsin mi?"
delete_failed: "Grup silinemedi. Bu otomatik oluşturulmuş bir grup ise, yok edilemez."
- delete_member_confirm: "'%{username}' adlı kullanıcıyı '%{group}' grubundan çıkart?"
delete_owner_confirm: "'%{username}' için sahiplik izni kaldırılsın mı?"
- name: "Ad"
add: "Ekle"
add_members: "Üye ekle"
custom: "Özel"
@@ -2126,14 +2113,6 @@ tr_TR:
add_owners: Sahiplik ekle
incoming_email: "Özel gelen e-posta adresi"
incoming_email_placeholder: "e-posta adresi girin"
- flair_url: "Avatar Kabiliyet Resmi"
- flair_url_placeholder: "(İsteğe bağlı) Resim URL'i ya da Font Awesome sınıfı"
- flair_bg_color: "Avatar Kabiliyet Arkaplan Rengi"
- flair_bg_color_placeholder: "(İsteğe bağlı) Hex renk değeri"
- flair_color: "Avatar Kabiliyet Resmi"
- flair_color_placeholder: "(İsteğe bağlı) Hex renk değeri"
- flair_preview: "Önizleme"
- flair_note: "Not: Kabiliyet sadece bir kullanıcının birincil grubu için gösterecek."
api:
generate_master: "Ana API Anahtarı Üret"
none: "Şu an etkin API anahtarı bulunmuyor."
@@ -2188,7 +2167,6 @@ tr_TR:
details: "Yeni bir cevap oluşturulduğunda, düzenlendiğinde veya silindiğinde."
user_event:
name: "Kullanıcı Olayı"
- details: "Kullanıcı oluşturulduğunda veya onaylandığında."
delivery_status:
title: "Teslim Durumu"
inactive: "Etkin Değil"
diff --git a/config/locales/client.uk.yml b/config/locales/client.uk.yml
index 794b486727..8ce95ff091 100644
--- a/config/locales/client.uk.yml
+++ b/config/locales/client.uk.yml
@@ -228,15 +228,31 @@ uk:
days_visited: "Відвідини"
days_visited_long: "Днів відвідано"
posts_read: "Прочитані"
+ posts_read_long: "Повідомлень Прочитано"
total_rows:
one: "%{count} користувач"
few: "%{count} користувачі"
other: "%{count} користувачів"
+ group_histories:
+ actions:
+ change_group_setting: "Змінити налаштування групи"
+ add_user_to_group: "Добавити користувача"
+ remove_user_from_group: "Видалити користувача"
groups:
+ logs:
+ subject: "Тема"
+ details: "Деталі"
+ from: "Від"
+ to: "До"
+ edit:
+ title: 'Редагувати Групу'
+ full_name: 'Повне Ім''я'
+ add_members: "Добавити учасників"
+ delete_member_confirm: "Видалити '%{username}' з групи '%{group}'?"
add: "Додати"
+ closed_group: Закрита Група
selector_placeholder: "Додати учасників"
visible: "Група видна всім користувачам"
- index: "Групи"
title:
one: "група"
few: "групи"
@@ -479,8 +495,6 @@ uk:
create: "Надіслати Запрошення"
bulk_invite:
text: "Масове Запрошення з Файлу"
- uploading: "Вивантаження..."
- error: "Під час завантаження '{{filename}}' сталася помилка: {{message}}"
password:
title: "Пароль"
too_short: "Ваш пароль надто короткий."
@@ -492,6 +506,7 @@ uk:
title: "Підсумок"
stats: "Статистика"
time_read: "час читання"
+ more_topics: "Більше тем"
ip_address:
title: "Остання IP-адреса"
registration_ip_address:
@@ -1218,17 +1233,14 @@ uk:
refresh: "Оновити"
new: "Новий"
selector_placeholder: "введіть ім'я користувача"
- name_placeholder: "Group name, no spaces, same as username rule"
about: "Edit your group membership and names here"
group_members: "Учасники групи"
delete: "Видалити"
delete_confirm: "Видалити цю групу?"
delete_failed: "Не вдалося видалити групу. Якщо це - автоматична група, її неможливо знищити."
- name: "Ім'я"
add: "Додати"
add_members: "Додати учасників"
bulk_select: "(обрати групу)"
- flair_preview: "Попередній перегляд"
api:
generate_master: "Згенерувати Головний ключ API"
none: "Наразі немає жодного активного ключа API."
diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml
index c654d71668..f7c25e3762 100644
--- a/config/locales/client.vi.yml
+++ b/config/locales/client.vi.yml
@@ -291,17 +291,10 @@ vi:
total_rows:
other: "%{count} người dùng"
groups:
- empty:
- posts: "Không có chủ đề của các thành viên trong nhóm"
- members: "Không có thành viên nào trong nhóm"
- mentions: "Không có thành viên nào trong nhóm"
- messages: "Không có tin nhắn nào trong nhóm"
- topics: "Không có chủ đề của các thành viên trong nhóm"
add: "Thêm"
selector_placeholder: "Thêm thành viên"
owner: "chủ"
visible: "Mọi thành viên có thể nhìn thấy nhóm"
- index: "Nhóm"
title:
other: "các nhóm"
members: "Các thành viên"
@@ -620,11 +613,8 @@ vi:
create: "Gửi một lời mời"
generate_link: "Chép liên kết Mời"
bulk_invite:
- none: "Bạn đã mời ai ở đây chưa. Bạn có thể mời một hoặc một nhóm bằng tải lên hàng loạt file mời."
text: "Mời hàng loạt bằng file"
- uploading: "Uploading..."
success: "Tải lên thành công, bạn sẽ được thông báo qua tin nhắn khi quá trình hoàn tất."
- error: "Có lỗi xảy ra khi upload '{{filename}}': {{message}}"
password:
title: "Mật khẩu"
too_short: "Mật khẩu của bạn quá ngắn."
@@ -1746,15 +1736,12 @@ vi:
refresh: "Làm mới"
new: "Mới"
selector_placeholder: "nhập tên tài khoản"
- name_placeholder: "Tên nhóm, không khoản trắng, cùng luật với tên tài khoản"
about: "Chỉnh sửa nhóm thành viên và tên của bạn ở đây"
group_members: "Nhóm thành viên"
delete: "Xóa"
delete_confirm: "Xóa nhóm này?"
delete_failed: "Không thể xóa nhóm. Nếu đây là một nhóm tự động, nó không thể hủy bỏ."
- delete_member_confirm: "Loại bỏ '%{username}' khỏi nhóm '%{group}'?"
delete_owner_confirm: "Loại bỏ quyền sở hữu của '%{username}'?"
- name: "Tên"
add: "Thêm"
add_members: "Thêm thành viên"
custom: "Tùy biến"
diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml
index 3412f320d8..f4eb0653bb 100644
--- a/config/locales/client.zh_CN.yml
+++ b/config/locales/client.zh_CN.yml
@@ -295,18 +295,45 @@ zh_CN:
posts_read_long: "阅读帖子"
total_rows:
other: "%{count} 位用户"
+ group_histories:
+ actions:
+ change_group_setting: "更改小组设置"
+ add_user_to_group: "增加用户"
+ remove_user_from_group: "移除用户"
+ make_user_group_owner: "设为所有者"
+ remove_user_as_group_owner: "撤销所有者"
groups:
+ logs:
+ title: "日志"
+ when: "时间"
+ action: "操作"
+ acting_user: "操作用户"
+ target_user: "目标用户"
+ subject: "主题"
+ details: "详情"
+ from: "来自"
+ to: "发至"
+ edit:
+ title: '编辑群组'
+ full_name: '名字'
+ add_members: "增加组员"
+ delete_member_confirm: "从“%{group}”群组中移除用户“%{username}'?"
+ request_membership_pm:
+ title: "成员申请"
+ body: "我想申请 @%{groupName} 的成员资格。"
+ name_placeholder: "群组名,没有空格,和用户名一样的规则"
+ public: "允许用户自由加入/离开群组(需要群组是可见)"
empty:
- posts: "群组的成员从未发表帖子。"
+ posts: "群组成员没有发布帖子。"
members: "群组没有成员。"
- mentions: "群组从未被提及过。"
- messages: "群组从未发送过消息。"
- topics: "群组的成员从未发表主题。"
add: "添加"
+ join: "加入群组"
+ request: "请求加入群组"
selector_placeholder: "添加成员"
owner: "所有者"
visible: "群组对所有用户可见"
- index: "群组"
+ index:
+ title: "群组"
title:
other: "群组"
members: "成员"
@@ -659,11 +686,8 @@ zh_CN:
link_generated: "邀请链接生成成功!"
valid_for: "邀请链接只对这个邮件地址有效:%{email}"
bulk_invite:
- none: "你从未邀请过他人。你可以发送单个邀请,或者上传批量邀请文件一次邀请多人。"
text: "通过文件批量邀请"
- uploading: "上传中..."
success: "文件上传成功,当操作完成时将通过消息通知你。"
- error: "在上传 '{{filename}}' 时出现错误:{{message}}"
password:
title: "密码"
too_short: "密码过短"
@@ -795,7 +819,7 @@ zh_CN:
disable: "显示已删除的帖子"
private_message_info:
title: "私信"
- invite: "邀请其他..."
+ invite: "邀请其他人..."
remove_allowed_user: "确定将 {{name}} 从本条消息中移除?"
remove_allowed_group: "确定将 {{name}} 从本条消息中移除?"
email: '邮箱'
@@ -918,6 +942,7 @@ zh_CN:
title: "或 Ctrl + 回车"
users_placeholder: "添加用户"
title_placeholder: "一句话告诉讨论什么..."
+ title_or_link_placeholder: "键入标题,或粘贴一个链接在这里"
edit_reason_placeholder: "编辑理由"
show_edit_reason: "添加理由"
reply_placeholder: "在此键入。使用Markdown,BBCode,或HTML格式。可拖拽或粘贴图片。"
@@ -2115,15 +2140,12 @@ zh_CN:
refresh: "刷新"
new: "新群组"
selector_placeholder: "输入用户名"
- name_placeholder: "群组名,不能含有空格,与用户名规则一致"
about: "在这里编辑群组的名字和成员"
group_members: "群组成员"
delete: "删除"
delete_confirm: "删除这个群组吗?"
delete_failed: "无法删除群组。如果该群组是自动生成的,则不可删除。"
- delete_member_confirm: "从群组“%{group}”中移除“%{username}”?"
delete_owner_confirm: "移除“%{username}”的权限?"
- name: "名字"
add: "添加"
add_members: "添加成员"
custom: "定制"
@@ -2140,10 +2162,6 @@ zh_CN:
add_owners: 添加所有者
incoming_email: "自定义进站电子邮件地址"
incoming_email_placeholder: "输入邮箱地址"
- flair_url_placeholder: "(可选)图片 URL 或 Font Awesome class"
- flair_bg_color_placeholder: "(可选)十六进制色彩值"
- flair_color_placeholder: "(可选)十六进制色彩值"
- flair_preview: "预览"
api:
generate_master: "生成主 API 密钥"
none: "当前没有可用的 API 密钥。"
@@ -2198,7 +2216,6 @@ zh_CN:
details: "当有新回复、编辑、帖子被删除或者恢复时。"
user_event:
name: "用户事件"
- details: "当用户被创建或者通过时。"
delivery_status:
title: "分发状态"
inactive: "不活跃"
diff --git a/config/locales/client.zh_TW.yml b/config/locales/client.zh_TW.yml
index 741c358bd9..74e3d8f65f 100644
--- a/config/locales/client.zh_TW.yml
+++ b/config/locales/client.zh_TW.yml
@@ -26,6 +26,7 @@ zh_TW:
millions: "{{number}} 百萬"
dates:
time: "h:mm"
+ timeline_date: "MMM YYYY"
long_no_year: "MMM D h:mm a"
long_no_year_no_time: "MMM D"
full_no_year_no_time: "MMMM Do"
@@ -281,6 +282,8 @@ zh_TW:
total_rows:
other: "%{count} 用戶"
groups:
+ edit:
+ delete_member_confirm: "從 '%{group}' 群組刪除 '%{username}' ?"
add: "新增"
selector_placeholder: "新增成員"
owner: "擁有者"
@@ -304,8 +307,13 @@ zh_TW:
notifications:
watching:
title: "關注"
+ tracking:
+ description: "只有當有人@您或者回覆您的文章時,您才會收到通知,並且會顯示新回覆的次數。"
regular:
title: "一般"
+ description: "只有當有人@您或者回覆您的文章時,您才會收到通知。"
+ muted:
+ description: "你將不會再收到任何關於此群組的新通知。"
user_action_groups:
'1': "已按讚"
'2': "已收到的讚"
@@ -361,6 +369,8 @@ zh_TW:
profile: "基本資料"
mute: "靜音"
edit: "編輯喜好設定"
+ download_archive:
+ success: "開始下載,處理完畢後將以私人訊息通知你。"
new_private_message: "新訊息"
private_message: "訊息"
private_messages: "訊息"
@@ -541,11 +551,8 @@ zh_TW:
create: "送出邀請"
generate_link: "拷貝邀請連結"
bulk_invite:
- none: "你尚未邀請任何人。你可以發送個別邀請,或者透過上傳邀請名單一次邀請一群人。"
text: "從檔案大量邀請"
- uploading: "正在上傳..."
success: "檔案已上傳成功,處理完畢後將以私人訊息通知你。"
- error: "上傳 '{{filename}}' 時發生問題:{{message}}"
password:
title: "密碼"
too_short: "你的密碼太短。"
@@ -1496,14 +1503,11 @@ zh_TW:
refresh: "重新整理"
new: "建立"
selector_placeholder: "輸入用戶名稱"
- name_placeholder: "群組名稱,不可含有空白字元,使用戶名稱的規則相同"
about: "請在此編輯你的群組成員與名稱"
group_members: "群組成員"
delete: "刪除"
delete_confirm: "刪除此群組?"
delete_failed: "無法刪除群組,自動建立的群組無法刪除。"
- delete_member_confirm: "從 '%{group}' 群組刪除 '%{username}' ?"
- name: "名稱"
add: "加入"
add_members: "新增成員"
custom: "客製"
diff --git a/config/locales/server.ar.yml b/config/locales/server.ar.yml
index b772eb260b..7b72d2fe20 100644
--- a/config/locales/server.ar.yml
+++ b/config/locales/server.ar.yml
@@ -120,8 +120,6 @@ ar:
max_username_length_range: "لا يمكن أن تكون القيمة العليا أصغر من الدنيا."
default_categories_already_selected: "لا يمكنك تحديد فئة تستخدم في قائمة أخرى."
s3_upload_bucket_is_required: "لا يمكنك تفعيل الرفع إلى S3 حتّى توفّر 's3_upload_bucket'."
- bulk_invite:
- file_should_be_csv: "على نسق الملف الملف المرفوع أن يكون إمّا csv أو txt."
backup:
operation_already_running: "ثمّة عملية تجري حاليا. لا يمكنك بدء مهمة جديدة الآن."
backup_file_should_be_tar_gz: "على الملف الاحتياطي أن يكون أرشيف \".tar.gz\"."
@@ -1006,9 +1004,7 @@ ar:
top_page_default_timeframe: "الوقت المثبت علي الصفحة الأكثر مشاهدة."
show_email_on_profile: "إظهار بريدك المستخدم على صفحته الشخصية (مرئية فقط لأنفسهم والموظفين)"
email_token_valid_hours: "نسيت كلمه السر/ تنشيط رموز الحساب صالحه ل(n) ساعات"
- email_token_grace_period_hours: "نسيت كلمه السر/ تنشيط رموز الحساب لا تزال صالحة لفترة سماح بالـ(n) ساعات بعد استبدالها."
enable_badges: "تفعيل نظام الأوسمة."
- enable_whispers: "السماح للموظفين الخصوصين التواصل ضمن موضوع.(تجريبي)"
allow_index_in_robots_txt: "تحديد في ملف robots.txt أن يسمح هذا الموقع ليتم فهرستها من قبل محركات البحث على شبكة الإنترنت."
email_domains_blacklist: "قائمة pipe-delimited المجالات البريد الإلكتروني الذي لا يسمح للمستخدمين تسجيل حسابات مع. مثال: mailinator.com | trashmail.net"
email_domains_whitelist: "قائمة pipe-delimited من مجالات البريد الإلكتروني التي يجب على المستخدمين تسجيل حسابات مع. تحذير: لن يسمح للمستخدمين مع مجالات البريد الإلكتروني الأخرى غير المذكورة هنا!"
@@ -1250,7 +1246,6 @@ ar:
embed_whitelist_selector: "منتقي CSS للعناصر التي تسمح في التضمينات."
embed_blacklist_selector: "منتقي CSS للعناصر التي حذفت من التضمينات."
notify_about_flags_after: "اذا كانت هناك علامه انه لم يتم تاتعامل معه بعد هذه الساعات, ارسال رساله الي جهه الاتصال_بريده الالكتروني. اضبط 0 للتعطيل"
- enable_cdn_js_debugging: "السماح/logs لعرض أخطاء المناسبة عن طريق إضافة تتضمن تحليل عرض كل شبيبة."
show_create_topics_notice: "إذا كان الموقع يحتوي على أقل من 5 مواضيع عامة , إظهار إشعار مطالبة المسؤولين إنشاء بعض المواضيع."
delete_drafts_older_than_n_days: حذف المسودات مضى عليها أكثر من (ن) يوما.
prevent_anons_from_downloading_files: "امنع المستخدمين المجهولين من تحميل المرفقات. تحذير:سوف تمنع اي شخص ليس لديه صوره موقع اصول نشره كمرفقات من العمل."
diff --git a/config/locales/server.bs_BA.yml b/config/locales/server.bs_BA.yml
index 4140cfd933..2f8009c83b 100644
--- a/config/locales/server.bs_BA.yml
+++ b/config/locales/server.bs_BA.yml
@@ -43,8 +43,6 @@ bs_BA:
taken: "has already been taken"
embed:
load_from_remote: "There was an error loading that post."
- bulk_invite:
- file_should_be_csv: "The uploaded file should be of csv or txt format."
backup:
operation_already_running: "An operation is currently running. Can't start a new job right now."
backup_file_should_be_tar_gz: "The backup file should be a .tar.gz archive."
@@ -460,7 +458,6 @@ bs_BA:
redirect_users_to_top_page: "Automatically redirect new and long absent users to the top page."
show_email_on_profile: "Show a user's email on their profile (only visible to themselves and staff)"
email_token_valid_hours: "Forgot password / activate account tokens are valid for (n) hours."
- email_token_grace_period_hours: "Forgot password / activate account tokens are still valid for a grace period of (n) hours after being redeemed."
enable_badges: "Enable the badge system"
allow_index_in_robots_txt: "Specify in robots.txt that this site is allowed to be indexed by web search engines."
email_domains_blacklist: "A list of email domains that users are not allowed to register accounts with. Example: mailinator.com trashmail.net"
@@ -622,7 +619,6 @@ bs_BA:
embed_whitelist_selector: "CSS selector for elements that are allowed in embeds."
embed_blacklist_selector: "CSS selector for elements that are removed from embeds."
notify_about_flags_after: "If there are flags that haven't been handled after this many hours, send an email to the contact_email. Set to 0 to disable."
- enable_cdn_js_debugging: "Allow /logs to display proper errors by adding crossorigin permissions on all js includes."
show_create_topics_notice: "If the site has fewer than 5 public topics, show a notice asking admins to create some topics."
prevent_anons_from_downloading_files: "Prevent anonymous users from downloading files. WARNING: this will prevent any site assets posted as attachments from working."
errors:
diff --git a/config/locales/server.cs.yml b/config/locales/server.cs.yml
index 11c4f17bf5..e441ff8c96 100644
--- a/config/locales/server.cs.yml
+++ b/config/locales/server.cs.yml
@@ -89,8 +89,6 @@ cs:
max_username_length_exists: "Nemůžeš nastavit délku maximální uživatelského jména kratší než je nejdelší uživatelské jméno. "
max_username_length_range: "Nemůžeš nastavit maximum pod minimum."
default_categories_already_selected: "Nemůžeš vybrat kategorii používanou v jiném seznamu."
- bulk_invite:
- file_should_be_csv: "Nahraný soubrou by měl být ve formátu csv nebo txt."
backup:
operation_already_running: "Právě probíhá operace %{operation}. V tuto chvíli nelze zahájit novou operaci %{operation}."
backup_file_should_be_tar_gz: "Záloha by měla být archiv s příponou .tar.gz."
diff --git a/config/locales/server.da.yml b/config/locales/server.da.yml
index 5c9e71a6b1..433bc8bc38 100644
--- a/config/locales/server.da.yml
+++ b/config/locales/server.da.yml
@@ -102,8 +102,6 @@ da:
max_username_length_range: "Du kan ikke sætte maksimum til mindre end minimum."
default_categories_already_selected: "Du kan ikke vælge en kategori der er brugt i en anden liste."
s3_upload_bucket_is_required: "Du kan ikke oploade til S3 med mindre du har angivet 's3_upload_bucket'."
- bulk_invite:
- file_should_be_csv: "Den uploadede fil skal være i .csv eller .txt format."
backup:
operation_already_running: "Der kører allerede en %{operation}. Kan ikke starte et nyt %{operation} job lige nu."
backup_file_should_be_tar_gz: "Backup filen skal være et .tar.gz arkiv."
@@ -835,7 +833,6 @@ da:
topics_per_period_in_top_page: "Antallet af top emner der vises når 'Vis Mere' er aktiveret."
show_email_on_profile: "Vis en brugers email på deres profil (kun synligt for brugerne selv - samt admin)"
email_token_valid_hours: "Glemte password / konto aktiverings muligheder er gyldige i (n) timer."
- email_token_grace_period_hours: "Glemt password / konto aktiverings muligheder er fortsat gyldige i (n) timer efter at være blevet indløst."
enable_badges: "Aktiver badge systemet"
log_out_strict: "Når brugeren logger af, log da ud af alle sessioner, på alle enheder"
new_version_emails: "Send en email til contact_email adressen når der er en ny version af Discourse tilgængelig."
@@ -1038,10 +1035,17 @@ da:
subject_template: "[%{site_name}] [PM] %{topic_title}"
digest:
why: "Et kort resumé af %{site_link} siden dit sidste besøg %{last_seen_at}"
+ since_last_visit: "Siden dit sidste besøg"
+ unread_messages: "Ulæste beskeder"
+ new_posts: "Nye indlæg"
+ popular_topics: "Populære emner"
+ join_the_discussion: "Læs mere"
+ more_new: "Nyt i emner og kategorier, som du følger"
subject_template: "[%{site_name}] Resumé"
unsubscribe: "Dette resumé sendes fra %{site_link} når vi ikke har set dig i et stykke tid. For at afmelde %{unsubscribe_link}."
click_here: "klik her"
from: "%{site_name} resumé"
+ preheader: "Et kort resume siden de sidste besøg %{last_seen_at}"
mailing_list:
subject_template: "[%{site_name}] Resumé for %{date}"
forgot_password:
diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml
index 01ee15be88..81514c4100 100644
--- a/config/locales/server.de.yml
+++ b/config/locales/server.de.yml
@@ -71,6 +71,7 @@ de:
has_already_been_used: "wird bereits verwendet"
inclusion: ist nicht in der Liste enthalten
invalid: ist ungültig
+ is_invalid: "scheint unklar, ist das ein ganzer Satz?"
less_than: muss weniger als %{count} sein
less_than_or_equal_to: muss weniger oder gleich %{count} sein
not_a_number: ist keine Zahl
@@ -105,7 +106,8 @@ de:
default_categories_already_selected: "Du kannst keine Kategorie auswählen, welche bereits in einer anderen Liste benutzt wird. "
s3_upload_bucket_is_required: "Uploads auf Amazon S3 können nicht aktiviert werden, bevor der 's3_upload_bucket' eingetragen wurde."
bulk_invite:
- file_should_be_csv: "Die hochgeladene Datei sollte im CSV oder TXT Format vorliegen."
+ file_should_be_csv: "Die hochzuladende Datei sollte im CSV-Format vorliegen."
+ error: "Es gab einen Fehler beim Hochladen dieser Datei. Bitte versuche es später noch einmal."
backup:
operation_already_running: "Eine Arbeitsschritt wird momentan bearbeitet. Im Moment kann kein neuer Vorgang gestartet werden."
backup_file_should_be_tar_gz: "Die Sicherungsdatei sollte ein .tar.gz-Archiv sein."
@@ -123,6 +125,11 @@ de:
embed:
start_discussion: "Diskussion beginnen"
continue: "Diskussion fortsetzen"
+ error: "Fehler bei der Einbettung"
+ referer: "Referrer:"
+ mismatch: "Der Referrer entsprach keiner der folgenden Hostnamen:"
+ no_hosts: "Es wurden keine Hostnamen für die Einbettung konfiguriert."
+ configure: "Einbettung konfigurieren"
more_replies:
one: "1 weitere Antwort"
other: "%{count} weitere Antworten"
@@ -158,6 +165,7 @@ de:
topic_not_found: "Etwas ist schief gelaufen. Wurde das Thema eventuell geschlossen oder gelöscht, während du es angeschaut hast?"
just_posted_that: "ist einer einer vor Kurzem von dir geschriebenen Nachricht zu ähnlich"
invalid_characters: "enthält ungültige Zeichen"
+ is_invalid: "scheint unklar, ist das ein ganzer Satz?"
next_page: "nächste Seite →"
prev_page: "← vorherige Seite"
page_num: "Seite %{num}"
@@ -268,6 +276,7 @@ de:
name: "Name der Kategorie"
topic:
title: 'Titel'
+ featured_link: 'Hervorgehobener Link'
post:
raw: "Hauptteil"
user_profile:
@@ -281,6 +290,9 @@ de:
too_many_users: "Du kannst eine Warnung nur an einen Benutzer zugleich anhängen."
cant_send_pm: "Entschuldigung, du kannst diesem Benutzer keine Direktnachricht schicken."
no_user_selected: "Du musst einen gültigen Benutzer auswählen."
+ featured_link:
+ invalid: "ist ungültig. URL sollte http:// oder https:// enthalten."
+ invalid_category: "kann in dieser Kategorie nicht bearbeitet werden."
user:
attributes:
password:
@@ -375,6 +387,7 @@ de:
create_topic: "Du erstellst zu schnell zu viele Themen hintereinander. Bitte warte %{time_left}, bis Du es wieder versuchst."
create_post: "Du antwortest zu schnell. Bitte warte %{time_left}, bis Du es wieder versuchst."
delete_post: "Du löschst zu schnell Beiträge. Bitte warte %{time_left}, bis Du es wieder versuchst."
+ public_group_membership: "Du wechselst die Gruppenzugehörigkeit zu häufig. Bitte warte %{time_left}, bevor du es erneut versuchst."
topics_per_day: "Du hast die maximale Anzahl an neuen Themen für heute erreicht. Bitte warte %{time_left}, bis Du es wieder versuchst."
pms_per_day: "Du hast die maximale Anzahl an Nachrichten für heute erreicht. Bitte warte %{time_left}, bis Du es wieder versuchst."
create_like: "Du hast die maximale Anzahl „Gefällt mir“ für heute erreicht. Bitte warte %{time_left}, bis Du es wieder versuchst."
@@ -529,6 +542,13 @@ de:
title: 'Abstimmung'
description: 'Stimme für diesen Beitrag'
long_form: 'für diesen Beitrag gestimmt'
+ user_activity:
+ no_bookmarks:
+ self: "Du hast keine Beiträge mit Lesezeichen, Lesezeichen ermöglichen es dir, diese später einfach zu finden."
+ others: "Keine Lesezeichen."
+ no_likes_given:
+ self: "Du hast noch keine Beiträge mit einem „Like“ markiert."
+ others: "Keine Beiträge mit „Like“."
topic_flag_types:
spam:
title: 'Spam'
@@ -575,8 +595,16 @@ de:
authorize: "Genehmigen"
read: "Lesen"
read_write: "Lesen/Schreiben"
+ description: "\"%{application_name}\" fordert den folgenden Zugriff auf dein Konto:"
no_trust_level: "Entschuldige, du hast nicht die erforderliche Vertrauensstufe, um die Benutzer API zu nutzen."
generic_error: "Entschuldige, wir können keinen Benutzer API Schlüssel erstellen. Dieses Feature ist möglicherweise vom Site Administrator deaktiviert worden."
+ scopes:
+ message_bus: "Live-Aktualisierungen"
+ notifications: "Benachrichtigungen lesen und leeren"
+ push: "Push-Benachrichtigungen an externe Dienste"
+ session_info: "Informationen zur Benutzersitzung lesen"
+ read: "Alles lesen"
+ write: "Alles schreiben"
reports:
visits:
title: "Nutzerbesuche"
@@ -742,14 +770,17 @@ de:
poll_pop3_auth_error: "Die Verbindung zum POP3-Server schlägt mit einem Authentisierungsfehler fehl. Überprüfe deine POP3-Einstellungen."
site_settings:
censored_words: "Wörter, die automatisch durch ■■■■ ersetzt werden"
+ censored_pattern: "Regex-Muster das automatisch ersetzt wird mit ■■■■"
delete_old_hidden_posts: "Automatisch alle Beiträge löschen, die länger als 30 Tage versteckt bleiben."
default_locale: "Die Standardsprache dieser Discourse-Instanz (kodiert in ISO 639-1)."
- allow_user_locale: "Erlaube Benutzern, ihre eigene Interfacesprache zu wählen"
+ allow_user_locale: "Erlaube Benutzern, ihre eigene Oberflächensprache zu wählen"
set_locale_from_accept_language_header: "Sprache der Benutzeroberfläche für anonyme Benutzer an Hand der Spracheinstellung ihres Browsers wählen (EXPERIMENTELL, funktioniert nicht mit Caches für anonyme Benutzer)"
min_post_length: "Minimal zulässige Beitragslänge in Zeichen."
min_first_post_length: "Minimal zulässige Länge des ersten Beitrags (eines Themas) in Zeichen"
min_private_message_post_length: "Minimale zulässige Beitragslänge in Zeichen für Nachrichten"
max_post_length: "Maximale zulässige Beitragslänge in Zeichen."
+ topic_featured_link_enabled: "Beitrag mit Link zu hervorgehobenen Themen erlauben"
+ show_topic_featured_link_in_digest: "Zeige den Hervorgehobene Themen Link in der E-Mail-Zusammenfassung."
min_topic_title_length: "Minimale zulässige Titellänge von Themen in Zeichen."
max_topic_title_length: "Maximale zulässige Titellänge von Themen in Zeichen."
min_private_message_title_length: "Minimale zulässige Titellänge von Nachrichten in Zeichen."
@@ -787,6 +818,8 @@ de:
show_pinned_excerpt_mobile: "Zeige einen Auszug hervorgehobener Beiträge in der mobilen Ansicht."
show_pinned_excerpt_desktop: "Zeige einen Auszug hervorgehobener Beiträge in der Desktop-Ansicht."
post_onebox_maxlength: "Maximale Länge eines Onebox-Discourse-Beitrags in Zeichen."
+ onebox_domains_blacklist: "Eine Liste von Domains, die nie in eine Onebox umgewandelt wird."
+ max_oneboxes_per_post: "Maximale Anzahl von Oneboxes in einem Beitrag."
logo_url: "Das Logo oben links auf deiner Site sollte eine breite, rechteckige Form haben. Wenn du kein Logo auswählst, wird stattdessen `title` angezeigt."
digest_logo_url: "Das alternative Logo oben in den E-Mail-Zusammenfassungen deiner Site. Sollte eine breite, rechteckige Form haben. Sollte kein SVG-Bild sein. Wenn leer, wird `logo_url` verwendet."
logo_small_url: "Dein Logo in klein für die obere linke Seite deiner Site, in Form eines rechteckigen Quadrates. Es wird angezeigt, wenn der Benutzer scrollt. Wenn du dieses Feld frei lässt, wird stattdessen ein Haus-Symbol angezeigt."
@@ -856,9 +889,8 @@ de:
show_email_on_profile: "Im Profil die E-Mail-Adresse des Benutzers anzeigen (ist nur für den Benutzer selbst und Mitarbeiter sichtbar)."
prioritize_username_in_ux: "Zeige den Benutzernamen auf der Benutzerseite, der Benutzerkarte und in Beiträgen an erster Stelle (wenn deaktiviert, wird der Name an erster Stelle angezeigt)"
email_token_valid_hours: "Tokens zur Passwort-Wiederherstellung / Aktivierung eines Kontos sind für (n) Stunden gültig."
- email_token_grace_period_hours: "Tokens zur Passwort-Wiederherstellung / Aktivierung eines Kontos sind auch nach ihrer Verwendung noch für eine Frist von (n) Stunden gültig."
enable_badges: "Abzeichen aktivieren"
- enable_whispers: "Erlaube Moderatoren und Administratoren in Beiträgen privat zu kommunizieren (experimentell)"
+ enable_whispers: "Erlaube dem Team private Kommunikation innerhalb von Themen."
allow_index_in_robots_txt: "Suchmaschinen mittels der robots.txt Datei erlauben, die Site zu indizieren."
email_domains_blacklist: "Eine durch senkrechte Striche getrennte Liste von E-Mail-Domains, die für die Registrierung neuer Konten nicht verwendet werden dürfen. Beispiel: mailinator.com|trashmail.net"
email_domains_whitelist: "Eine durch senkrechte Striche getrennte Liste von E-Mail-Domains, die für die Registrierung neuer Konten verwendet werden können. ACHTUNG: Benutzer mit E-Mail-Adressen anderer Domains werden nicht zugelassen!"
@@ -889,6 +921,7 @@ de:
sso_overrides_name: "Überschreibt den vollen Namen des Benutzers mit den Daten von der externen Site aus dem SSO-Payload bei jedem Login. Außerdem werden lokale Änderungen verhindert."
sso_overrides_avatar: "Überschreibt das Profilbild des Benutzers mit dem Profilbild aus dem SSO-Payload. Wenn aktiv, dann sollte allow_uploaded_avatars deaktiviert werden."
sso_not_approved_url: "Nicht genehmigte SSO-Konten zu dieser URL weiterleiten"
+ sso_allows_all_return_paths: "Beschränke die Domain für SSO-Return-Paths (standardmäßig muss der Return Path auf der aktuellen Seite sein)"
enable_local_logins: "Aktiviere Login mit lokal gespeicherten Benutzernamen und Passwörtern. (Anmerkung: muss aktiviert sein, damit Einladungen funktionieren)"
allow_new_registrations: "Erlaube das Registrieren neuer Benutzerkonten. Wird dies deaktiviert, so kann niemand mehr ein neues Konto erstellen."
enable_signup_cta: "Zeige wiederkehrenden Gästen einen Hinweis, dass diese sich Anmelden oder Registrieren sollen."
@@ -1079,9 +1112,12 @@ de:
reset_bounce_score_after_days: "Bounce-Score automatisch nach X Tagen zurücksetzen."
attachment_content_type_blacklist: "Liste der Schlüsselwörter für die Ablehnung von Anhängen basierend auf Inhaltstypen."
attachment_filename_blacklist: "Liste der Schlüsselwörter für die Ablehnung von Anhängen basierend auf dem Dateinamen."
+ enable_forwarded_emails: "[Beta] Erlaube Benutzern, ein Thema zu erstellen, indem sie eine E-Mail weiterleiten."
+ always_show_trimmed_content: "Immer den gekürzten Teil von eingehenden E-Mails anzeigen. WARNUNG: lässt möglicherweise E-Mail-Adressen erkennen."
manual_polling_enabled: "Eingehende E-Mails über die API für E-Mail-Antworten annehmen."
pop3_polling_enabled: "E-Mail-Antworten über POP3 abholen."
pop3_polling_ssl: "SSL für die Verbindung zum POP3-Server verwenden. (Empfohlen)"
+ pop3_polling_openssl_verify: "Überprüfe TLS-Server-Zertifikat (Standard: aktiviert)"
pop3_polling_period_mins: "Intervall in Minuten zum Abholen neuer E-Mails vom POP3-Konto. HINWEIS: benötigt Neustart."
pop3_polling_port: "Port für die POP3-Abfrage."
pop3_polling_host: "Hostname für die POP3-Abfrage."
@@ -1104,10 +1140,16 @@ de:
allow_animated_thumbnails: "Generiert animierte Vorschaubilder aus animierten GIFs."
default_avatars: "URLs zu Bildern, die als Standard-Profilbilder verwendet werden sollen, bis neue Benutzer ihr Profilbild geändert haben."
automatically_download_gravatars: "Profilbilder von Gravatar herunterladen, wenn ein Benutzer sich registriert oder seine E-Mail-Adresse ändert."
+ digest_topics: "Die maximale Anzahl von Top-Beiträgen, die in der E-Mail-Zusammenfassung angezeigt werden sollen."
+ digest_posts: "Die maximale Anzahl von beliebten Beiträgen, die in der E-Mail-Zusammenfassung angezeigt werden sollen."
+ digest_other_topics: "Die maximale Anzahl von Themen, die in dem Bereich 'Neues in Themen und Kategorien, denen du folgst' in der E-Mail-Zusammenfassung angezeigt werden sollen."
digest_min_excerpt_length: "Minimale Zeichenlänge für Auszüge von Beiträgen in der E-Mail-Zusammenfassung."
delete_digest_email_after_days: "Unterdrücke E-Mail-Zusammenfassungen für Benutzer, die länger als (n) Tage nicht auf der Site gesehen wurden."
digest_suppress_categories: "Unterdrücke diese Kategorien in E-Mail-Zusammenfassungen."
disable_digest_emails: "Deaktiviere E-Mail-Zusammenfassungen für alle Benutzer."
+ email_accent_bg_color: "Die Hervorhebungsfarbe, die als Hintergrund mancher Elemente in HTML-E-Mails verwendet wird. Gib’ einen Namen ('red') oder einen Hex-Wert ('#FF000') der Farbe an."
+ email_accent_fg_color: "Gib’ einen Namen ('white') oder einen Hex-Wert ('#FFFFFF') der Farbe an."
+ email_link_color: "Die Farbe von Links in HTML-Mails. Gib’ einen Namen ('blue') oder einen Hex-Wert ('#0000FF') der Farbe an."
detect_custom_avatars: "Aktiviere diese Option, um zu überprüfen, ob Benutzer eigene Profilbilder hochgeladen haben."
max_daily_gravatar_crawls: "Wie oft pro Tag Discourse höchstens auf Gravatar nach benuterdefinierten Avataren suchen soll."
public_user_custom_fields: "Liste selbst definierter Profil-Felder, die öffentlich angezeigt werden dürfen."
@@ -1146,12 +1188,12 @@ de:
embed_username_key_from_feed: "Schlüssel, um Discourse-Benutzernamen aus Feed zu ermitteln."
embed_title_scrubber: "Regulärer Ausdruck (Regex) um eingebettete Titel zu bereinigen"
embed_truncate: "Kürze die eingebetteten Beiträge"
+ allowed_href_schemes: "URI-Schemas, die in Links zusätzlich zu http und https erlaubt sind."
embed_post_limit: "Maximale Anzahl der Beiträge die eingebettet werden."
embed_username_required: "Der Benutzername ist für die Themenerstellung notwendig"
embed_whitelist_selector: "CSS-Selektor für Elemente, die in Einbettungen erlaubt sind."
embed_blacklist_selector: "CSS-Selektor für Elemente, die in Einbettungen entfernt werden."
notify_about_flags_after: "Wenn es Meldungen gibt, die nicht nach dieser Anzahl von Stunden behandelt wurden, sende eine E-Mail an contact_email. Setze dies auf 0 um es zu deaktivieren."
- enable_cdn_js_debugging: "Ermöglicht die Anzeige vollständiger Fehler auf /logs, indem alle eingebetteten JavaScripts Cross-Origin Zugriffsberechtigungen erhalten."
show_create_topics_notice: "Administratoren eine Warnmeldung anzeigen, wenn im Forum weniger als 5 öffentlich sichtbare Themen existieren."
delete_drafts_older_than_n_days: Lösche Entwürfe, die mehr als (n) Tage alt sind.
bootstrap_mode_min_users: "Erforderliche Benutzeranzahl, um den Bootstrapping-Modus zu deaktivieren (0 = ausgeschaltet)"
@@ -1180,6 +1222,7 @@ de:
default_email_in_reply_to: "Standardmäßig einen Anriss des Beitrags, auf den geantwortet wurde, in E-Mails einfügen."
default_other_new_topic_duration_minutes: "Zeit wie lange ein Thema als \"Neu\" markiert werden soll. "
default_other_auto_track_topics_after_msecs: "Zeit bevor ein Thema automatisch verfolg wird. "
+ default_other_notification_level_when_replying: "Globales Standard-Benachrichtigungslevel, wenn ein Benutzer auf ein Thema antwortet."
default_other_external_links_in_new_tab: "Öffne externe Links standardmäßig in einem neuen Tab."
default_other_enable_quoting: "Aktiviere standardmäßig die Zitat-Antwort Funktion für hervorgehobenen Text."
default_other_dynamic_favicon: "Zeige standardmäßig die Anzahl von neuen und geänderten Beiträgen im Browser-Symbol an."
@@ -1189,8 +1232,11 @@ de:
default_categories_watching: "Liste der standardmäßig beobachteten Kategorien."
default_categories_tracking: "Liste der standardmäßig gefolgten Kategorien."
default_categories_muted: "Liste der standardmäßig stummgeschalteten Kategorien."
+ default_categories_watching_first_post: "Liste von Kategorien, in denen der erste Beiträge in jedem neuen Thema automatisch beobachtet wird."
max_user_api_reqs_per_day: "Maximale Zahl der Benutzer API Anfragen pro Schlüssel pro Tag"
max_user_api_reqs_per_minute: "Maximale Zahl der Benutzer API Anfragen pro Schlüssel pro Minute"
+ allow_user_api_keys: "Erlaube das Generieren von Benutzer-API-Schlüsseln"
+ allow_user_api_key_scopes: "Liste erlaubter Scopes für Benutzer-API-Schlüssel"
max_api_keys_per_user: "Maximale Zahl der Benutzer API Anfragen pro Benutzer"
min_trust_level_for_user_api_key: "Erforderliche Vertrauensstufe für die Generierung von Benutzer API Schlüsseln"
allowed_user_api_auth_redirects: "Erlaubte URL für die Authentifizierungs-Umleitung von Benutzer API Schlüsseln"
@@ -1207,9 +1253,10 @@ de:
staff_tags: "Eine Liste von Schlagwörtern, die nur von Mitarbeitern angewendet werden können."
min_trust_level_to_tag_topics: "Minimale Vertrauensstufe, um Schlagwörter zu Themen hinzuzufügen."
suppress_overlapping_tags_in_list: "Schlagwort nicht zeigen, wenn es genau so im Thementitel vorkommt"
- remove_muted_tags_from_latest: "Zeige in der Liste der neusten Beiträge keine Themen mit stummgeschalteten Schlagwörtern."
+ remove_muted_tags_from_latest: "Zeige in der Liste der neuesten Beiträge keine Themen mit stummgeschalteten Schlagwörtern."
company_short_name: "Firmenname (kurz)"
company_full_name: "Firmenname (komplett)"
+ company_domain: "Firmendomain"
errors:
invalid_email: "Ungültige E-Mail-Adresse"
invalid_username: "Es gibt keinen Benutzer mit diesem Benutzernamen."
@@ -1232,6 +1279,7 @@ de:
reply_by_email_address_is_empty: "Du musst 'reply by email address' definieren, bevor per E-Mail antworten aktiviert wird"
email_polling_disabled: "Du musst entweder manuelles oder POP3 polling aktivieren, bevor per E-Mail antworten aktiviert wird"
user_locale_not_enabled: "Du musst zuerst 'allow user locale' aktivieren bevor du dies aktivierst"
+ invalid_regex: "Regulärer Ausdruck ist ungültig oder nicht erlaubt."
search:
within_post: "#%{post_number} von %{username}"
types:
@@ -1324,6 +1372,7 @@ de:
something_already_taken: "Etwas ist schief gelaufen. Möglicherweise ist der Benutzername bereits registriert. Probiere den 'Passwort vergessen'-Link."
omniauth_error: "Entschuldigung, bei der Autorisierung deines Kontos ist ein Fehler aufgetreten. Hast du die Autorisierung möglicherweise abgelehnt?"
omniauth_error_unknown: "Während des Anmeldens ist etwas schief gelaufen, bitte versuche es noch einmal."
+ authenticator_error_no_valid_email: "E-Mail-Adressen mit %{account} sind nicht erlaubt. Du musst möglicherweise dein Konto mit einer anderen E-Mail-Adresse einrichten."
new_registrations_disabled: "Leider können derzeit keine neuen Konten registriert werden."
password_too_long: "Passwörter sind beschränkt auf 200 Zeichen."
email_too_long: "Die von dir eingegebene E-Mail-Adresse ist zu lang. Der Teil vor dem @ darf maximal 254 Zeichen lang sein und Domain-Namen maximal 253 Zeichen."
@@ -1559,76 +1608,9 @@ de:
Weitre Hinweise findest du in unseren [Community-Richtlinien](%{base_url}/guidelines).
usage_tips:
text_body_template: |
- In dieser Nachricht findest du einige Tipps um dir den Einstieg zu erleichtern.
+ Ein paar Tipps für die ersten Schritte als neuer Benutzer [findest du in diesem Blog-Eintrag](http://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/).
- ## Einfach weiterscrollen
-
- Es gibt keine Knöpfe um auf die nächste Seite zu gelangen oder Seitenzahlen – um mehr zu lesen, **scrolle einfach weiter nach unten!**
-
- Wenn neue Beiträge eingebracht werden, erscheinen diese automatisch - ohne dass die Seite neu geladen werden muss.
-
- ## Wo bin ich?
-
- - Um die Suche, das Menü ☰ oder deine Profilseite aufzurufen, benutze die **Schaltflächen oben rechts**.
-
- - Das Klicken auf den Titel eines Themas bringt dich zu **deinem nächsten ungelesenen Beitrag** in diesem Thema. Um stattdessen ganz oben oder ganz unten einzusteigen, klicke die Beitragszahl oder das Datum der letzten Antwort.
-
-
-
- - Während des Lesens eines Themas kannst du mit Hilfe dessen Titels zum ↑ Anfang springen. Die grüne Fortschrittsanzeige unten rechts erlaubt weitere Navigation.
-
-
-
- Du kannst auch ? auf der Tastatur drücken, für eine Liste super-schneller Tastaturkürzel.
-
- ## Wie antworte ich?
-
- - Um auf das gesamte Thema zu antworten, benutze den Antwortknopf ganz unten auf der Seite.
-
- - Um auf einen bestimmten Beitrag zu antworten kannst du die Schaltfläche direkt unter diesem Beitrag verwenden.
-
- Das Zitieren eines Beitrags ist mit dem Auswählen des gewünschten Texts gefolgt von einem beliebigen Antwortknopf möglich.
-
-
-
- Um jemanden in auf deinen Beitrag aufmerksam zu machen, erwähne ihn durch das Eingeben von `@` gefolgt von seinem Benutzernamen.
-
-
-
- - Um die Diskussion in eine andere Richtung zu lenken, die beiden Themen aber zu verknüpfen, benutze bitte Mit verknüpftem Thema antworten` rechts des passenden Beitrags.
-
-
- ## Was kann ich sonst noch machen?
-
- Unter jedem Beitrag befinden sich Aktionsbuttons:
-
-
-
- Um zu Zeigen, dass dir der Beitrag gefallen hat, drücke den **❤**-Knopf. Wenn du ein Problem mit einem Beitrag feststellst, mach den Autor oder die Moderatoren durch **Melden** darauf aufmerksam.
-
- Du kannst außerdem einen Link zu einem Beitrag **teilen**, oder ihn zum Merken mit einem [**Lesezeichen**](/my/activity/bookmarks) versehen.
-
- ## Wer schreibt mir?
-
- Wenn jemand auf deinen Beitrag antwortet, deinen Beitrag zitiert, oder deinen `@Benutzernamen` erwähnt, zeigt sich sofort eine Zahl oben rechts auf der Seite. Dort kannst du auch deine **Benachrichtigungen** abrufen.
-
-
-
- Um das Verpassen von Antworten (und Nachrichten) musst du dir keine Sorgen machen – diese werden dir 3 Minuten nach ihrer Erstellung automatisch per E-Mail zugeschickt, für den Fall dass du nicht online sein solltest wenn sie ankommen.
-
- ## Wann sind Themen neu?
-
- Standardmäßig gelten alle Themen die weniger als zwei Tage alt sind als neu. Alle Themen an denen du teilgenommen hast (durch Antwort, eigene Erstellung, oder längeres Lesen) werden automatisch verfolgt.
-
- Neben diesen Themen wirst du blaue Indikatoren finden, die dich über die Aktualität informieren:
-
-
-
- Du kannst den Informationsmodus eines Themas mit dem Menü am Ende anpassen (auch für ganze Kategorien möglich). Du kannst damit Stummstellen, Verfolgen oder Benachrichtigungen über alles Neue erhalten. Um diese Funktion zu konfigurieren, gehe in [deine Einstellungen](/my/preferences).
-
- ## Warum kann ich manche Sachen nicht machen?
-
- Aus Sicherheitsgründen sind neue Benutzer etwas eingeschränkt in ihren Befugnissen. Mit dem Teilnehmen hier und dem Gewinnen von Vertrauen werden diese Einschränkungen automatisch aufgehoben. Wenn du eine höhere Vertrauensstufe erlangst, kannst du außerdem ein wenig beim Moderieren helfen.
+ Während du hier teilnimmst, werden wir dich kennenlernen und die vorübergehenden Einschränkungen für neue Benutzer werden aufgehoben. Über die Zeit, erreichst du [Vertrauensstufen](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924), die spezielle Fähigkeiten beinhalten, um die Community gemeinsam zu verwalten.
welcome_user:
subject_template: "Willkommen bei %{site_name}!"
text_body_template: |
@@ -2098,10 +2080,24 @@ de:
%{message}
digest:
why: "Eine kurze Zusammenfassung von %{site_link} seit deinem letzten Besuch am %{last_seen_at}"
+ since_last_visit: "Seit deinem letzten Besuch"
+ new_topics: "Neue Themen"
+ unread_messages: "Ungelesene Nachrichten"
+ unread_notifications: "Ungelesene Benachrichtigungen"
+ liked_received: "Erhaltene Likes"
+ new_posts: "Neue Beiträge"
+ new_users: "Neue Benutzer"
+ popular_topics: "Beliebte Themen"
+ follow_topic: "Diesem Thema folgen"
+ join_the_discussion: "Mehr lesen"
+ popular_posts: "Beliebte Beiträge"
+ from_topic_label: "Von"
+ more_new: "Neues in Themen und Kategorien, denen du folgst"
subject_template: "Zusammenfassung für [%{site_name}]"
unsubscribe: "Diese Zusammenfassung wird von %{site_link} gesendet, wenn wir dich einige Zeit lang nicht gesehen haben. Abbestellen unter %{unsubscribe_link}."
click_here: "klicke hier"
from: "Zusammenfassung für %{site_name}"
+ preheader: "Eine kurze Zusammenfassung seit deinem letzten Besuch am %{last_seen_at}"
mailing_list:
why: "Alle Aktivitäten auf %{site_link} am %{date}"
subject_template: "[%{site_name}] Zusammenfassung für den %{date}"
@@ -2244,6 +2240,7 @@ de:
message_to_blank: "message.to ist leer"
text_part_body_blank: "text_part.body ist leer"
body_blank: "body ist leer"
+ no_echo_mailing_list_mode: "Mailinglisten-Benachrichtigung für eigene Beiträge deaktivieren"
color_schemes:
base_theme_name: "Basis"
about: "Über uns"
@@ -2809,36 +2806,139 @@ de:
staff_tag_disallowed: "Das Schlagwort \"%{tag}\" kann nur von Mitarbeitern angewendet werden."
staff_tag_remove_disallowed: "Das Schlagwort \"%{tag}\" kann nur von Mitarbeitern entfernt werden."
rss_by_tag: "Themen mit dem Schlagwort %{tag}"
+ finish_installation:
+ congratulations: "Glückwunsch, du hast Discourse installiert!"
+ register:
+ button: "Registrieren"
+ title: "Administrator-Konto registrieren"
+ help: "registriere ein neues Konto, um loszulegen"
+ no_emails: "Leider wurden bei der Einrichtung keine Administrator-Mails festgelegt, sodass es schwer sein dürfte, die Konfiguration abzuschließen."
+ confirm_email:
+ title: "Bestätige deine E-Mail-Adresse"
+ message: "Wir haben eine Aktivierungsmail an %{email} gesendet. Bitte folge den Anweisungen in der E-Mail, um dein Konto zu aktivieren. Wenn diese nicht ankommst, stelle sicher, dass du E-Mail für dein Discourse richtig eingestellt hast und prüfe deinen Spamordner. "
+ resend_email:
+ title: "Aktivierungsmail erneut senden"
+ message: "Wir haben die Aktivierungsmail noch einmal an %{email} gesendet"
+ safe_mode:
+ title: "Abgesicherten Modus betreten"
+ description: "Der abgesicherte Modus ermöglicht es dir, deine Seite zu testen, ohne Plugins oder Seiten-Anpassungen zu laden."
+ no_customizations: "Alle Seiten-Anpassungen deaktivieren"
+ only_official: "Inoffizielle Plugins deaktivieren"
+ no_plugins: "Alle Plugins deaktivieren"
+ enter: "Abgesicherten Modus betreten"
wizard:
+ title: "Discourse einrichten"
step:
+ locale:
+ title: "Willkommen zu Discourse!"
+ fields:
+ default_locale:
+ description: "Was ist die Standardsprache für deine Community?"
forum_title:
title: "Name"
+ description: "Der Name ist ein Zeichen, das aus der Ferne sichtbar ist, wahrscheinlich die erste Sache, die mögliche Besucher über deine Community bemerken werden Was sagt dein Name und Titel über deine Community aus?"
+ fields:
+ title:
+ label: "Name deiner Community"
+ placeholder: "Erikas Stammtisch"
+ site_description:
+ label: "Beschreibe deine Community in einem kurzen Satz"
+ placeholder: "Ein Ort für Erika und ihre Bekannten, um coole Sachen zu besprechen"
introduction:
title: "Einführung"
+ fields:
+ welcome:
+ label: "Willkommen-Thema"
+ description: " Wie würdest du deine Community einem Fremden im Fahrstuhl in ungefähr 1 Minute beschreiben? - Für wen sind diese Diskussionen?
- Was kann ich hier finden?
- Warum sollte ich vorbeikommen?
Dein Willkommensthema ist die erste Sache, die neue Besucher sehen werden. Betrachte es als dein 'Fahrstuhl-Vorstellungsgespräch' oder als 'Leitbild'. "
+ one_paragraph: "Bitte begrenze deine Willkommensnachricht auf einen Absatz."
privacy:
title: "Zugriff"
+ description: "Ist deine Community offen für alle oder beschränkt durch Mitgliedschaft, Einladung oder Genehmigung? Wenn du dies bevorzugst, kannst du alles zunächst privat einrichten und dann später auf öffentlich umschalten. Bitte denke daran, dass du Einladungen auch immer aus Themen oder von deiner Benutzerprofilseite aus schicken kannst. "
fields:
privacy:
choices:
open:
label: "Öffentlich"
+ description: "Jeder kann auf diese Community zugreifen, der ein Konto registriert."
restricted:
label: "Privat"
+ description: "Nur Personen, die ich eingeladen oder genehmigt habe, können auf diese Community zugreifen."
contact:
title: "Kontakt"
fields:
contact_email:
label: "Mail"
placeholder: "name@example.com"
+ description: "E-Mail-Adresse der verantwortlichen Person oder Gruppe für diese Community. Wird verwendet für kritische Benachrichtigungen wie unbehandelte Meldungen, Sicherheitsaktualisierungen sowie auf eurer „Über uns“-Seite für dringenden Community-Kontakt."
+ contact_url:
+ label: "Webseite"
+ placeholder: "http://www.example.com/kontaktiere-uns"
+ description: "Allgemeines Kontaktformular für euch oder eure Organisation. Wird angezeigt auf eurer „Über uns“-Seite."
+ site_contact:
+ label: "Automatische Nachrichten"
+ description: "Alle automatischen, persönlichen Discourse-Nachrichten werden von diesem Benutzer versandt. Insbesondere wird dieser Benutzer der ausgewiesene Absender jeder Willkommensnachricht sein, die automatisch an neue Benutzer geschickt werden."
corporate:
title: "Organisation"
+ description: "Diese Namen werden in eure Datenschutzerklärung und Nutzungsbedingungen eingefügt, die du jederzeit in der Team-Kategorie ändern kannst Wenn du keine Firma hast, kannst du diesen Schritt auch überspringen."
fields:
company_short_name:
label: "Firmenname (kurz)"
+ placeholder: "Musterfirma"
company_full_name:
label: "Firmenname (komplett)"
+ placeholder: "Musterfirma GmbH"
+ company_domain:
+ label: "Firmen-Domainname"
+ placeholder: "musterfirma.com"
+ colors:
+ title: "Design"
+ fields:
+ theme_id:
+ description: "Bevorzugst du ein helles oder dunkles Farbschema? Du kannst das Erscheinungsbild deiner Seite jederzeit weiter anpassen unter Administration, Anpassen."
+ choices:
+ default:
+ label: "Simple Light (Hell)"
+ dark:
+ label: "Simple Dark (Dunkel)"
+ logos:
+ title: "Logos"
+ fields:
+ logo_url:
+ label: "Hauptlogo"
+ description: "Das Logobild für den linken, oberen Bereich deiner Seite. Verwende eine weite, rechteckige Form."
+ logo_small_url:
+ label: "Kompaktes Logo"
+ description: "Eine kompakte Version deines Logos, das auf deiner Seite oben links angezeigt wird, wenn man herunterscollt. Verwende eine quadratische Form."
+ icons:
+ title: "Icons"
+ fields:
+ favicon_url:
+ label: "Kleines Icon"
+ description: "Icon-Bild, das in Webbrowsern mit kleineren Dimensionen gut aussieht. Die empfohlene Größe beträgt 32x32 Pixel."
+ apple_touch_icon_url:
+ label: "Großes Icon"
+ description: "Icon-Bild, das auf modernen Geräten mit größeren Dimensionen gut aussieht. Die empfohlene Größe beträgt mindestens 144x144 Pixel."
+ homepage:
+ description: "Wir empfehlen, die aktuellen Themen auf deiner Startseite anzuzeigen, aber du kannst dich auch dafür entscheiden, Kategorien (Gruppen von Themen) auf der Startseite anzuzeigen, wenn dir das lieber ist."
+ title: "Homepage"
+ fields:
+ homepage_style:
+ choices:
+ latest:
+ label: "Neueste Beiträge"
+ categories:
+ label: "Kategorien"
emoji:
title: "Emoji"
+ description: "Welches Emoji-Design bevorzugst du für deine Community? Du kannst später jederzeit mehr benutzerdefinierte Emoji einfügen unter Administration, Anpassen, Emoji."
+ invites:
+ title: "Team einladen"
+ description: "Du hast es fast geschafft! Lass uns ein paar Team-Mitglieder einladen, um eure Diskussionen in Gang zu bringen mit interessanten Themen und Antworten und deine Community zu beginnen."
+ finished:
+ title: "Dein Discourse ist bereit!"
+ description: |
+ Wenn du diese Einstellungen jemals ändern möchtest, besuche deinen Administrationsbereich; finde ihn neben dem Schraubenschüssel-Symbol im Seitenmenü..
+ Viel Spaß, und viel Glück beim Aufbauen deiner neuen Community!
activemodel:
errors:
<<: *errors
diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml
index 2260ce3ab9..7ad38baffb 100644
--- a/config/locales/server.en.yml
+++ b/config/locales/server.en.yml
@@ -379,8 +379,27 @@ en:
staff_category_name: "Staff"
staff_category_description: "Private category for staff discussions. Topics are only visible to admins and moderators."
+ assets_topic_title: "Assets for the site design"
assets_topic_body: "This is a permanent topic, visible only to staff, for storing images and files used in the site design. Don't delete it!\n\n\nHere's how:\n\n\n1. Reply to this topic.\n2. Upload all the images you wish to use for logos, favicons, and so forth here. (Use the upload toolbar icon in the post editor, or drag-and-drop or paste images.)\n3. Submit your reply to post it.\n4. Right click the images in your new post to get the path to the uploaded images, or click the edit icon to edit your post and retrieve the path to the images. Copy the image paths.\n5. Paste those image paths into [basic settings](/admin/site_settings/category/required).\n\n\nIf you need to enable different file type uploads, edit `authorized_extensions` in the [file settings](/admin/site_settings/category/files)."
+ discourse_welcome_topic:
+ title: "Welcome to Discourse"
+ body: |
+
+ The first paragraph of this pinned topic will be visible as a welcome message to all new visitors on your homepage. It's important!
+
+ **Edit this** into a brief description of your community:
+
+ - Who is it for?
+ - What can they find here?
+ - Why should they come here?
+ - Where can they read more (links, resources, etc)?
+
+
+
+ You may want to close this topic via the admin :wrench: (at the upper right and bottom), so that replies don't pile up on an announcement.
+
+
lounge_welcome:
title: "Welcome to the Lounge"
body: |
@@ -977,7 +996,6 @@ en:
prioritize_username_in_ux: "Show username first on user page, user card and posts (when disabled name is shown first)"
email_token_valid_hours: "Forgot password / activate account tokens are valid for (n) hours."
- email_token_grace_period_hours: "Forgot password / activate account tokens are still valid for a grace period of (n) hours after being redeemed."
enable_badges: "Enable the badge system"
enable_whispers: "Allow staff private communication within topics."
@@ -1020,6 +1038,7 @@ en:
sso_overrides_name: "Overrides local full name with external site full name from SSO payload on every login, and prevent local changes."
sso_overrides_avatar: "Overrides user avatar with external site avatar from SSO payload. If enabled, disabling allow_uploaded_avatars is highly recommended"
sso_not_approved_url: "Redirect unapproved SSO accounts to this URL"
+ sso_allows_all_return_paths: "Do not restrict the domain for return_paths provided by SSO (by default return path must be on current site)"
enable_local_logins: "Enable local username and password login based accounts. (Note: this must be enabled for invites to work)"
allow_new_registrations: "Allow new user registrations. Uncheck this to prevent anyone from creating a new account."
@@ -1306,18 +1325,24 @@ en:
delete_digest_email_after_days: "Suppress summary emails for users not seen on the site for more than (n) days."
digest_suppress_categories: "Suppress these categories from summary emails."
disable_digest_emails: "Disable summary emails for all users."
+ email_accent_bg_color: "The accent color to be used as the background of some elements in HTML emails. Enter a color name ('red') or hex value ('#FF000')."
+ email_accent_fg_color: "The color of text rendered on the email bg color in HTML emails. Enter a color name ('white') or hex value ('#FFFFFF')."
+ email_link_color: "The color of links in HTML emails. Enter a color name ('blue') or hex value ('#0000FF')."
detect_custom_avatars: "Whether or not to check that users have uploaded custom profile pictures."
max_daily_gravatar_crawls: "Maximum number of times Discourse will check Gravatar for custom avatars in a day"
public_user_custom_fields: "A whitelist of custom fields for a user that can be shown publicly."
staff_user_custom_fields: "A whitelist of custom fields for a user that can be shown to staff."
enable_user_directory: "Provide a directory of users for browsing"
+ enable_group_directory: "Provide a directory of groups for browsing"
allow_anonymous_posting: "Allow users to switch to anonymous mode"
anonymous_posting_min_trust_level: "Minimum trust level required to enable anonymous posting"
anonymous_account_duration_minutes: "To protect anonymity create a new anonymous account every N minutes for each user. Example: if set to 600, as soon as 600 minutes elapse from last post AND user switches to anon, a new anonymous account is created."
hide_user_profiles_from_public: "Disable user cards, user profiles and user directory for anonymous users."
+ user_website_domains_whitelist: "User website will be verified against these domains. Pipe-delimited list."
+
allow_profile_backgrounds: "Allow users to upload profile backgrounds."
sequential_replies_threshold: "Number of posts a user has to make in a row in a topic before being reminded about too many sequential replies."
@@ -1602,6 +1627,8 @@ en:
ip_address:
blocked: "New registrations are not allowed from your IP address."
max_new_accounts_per_registration_ip: "New registrations are not allowed from your IP address (maximum limit reached). Contact a staff member."
+ website:
+ domain_not_allowed: "Website is invalid. Allowed domains are: %{domains}"
flags_reminder:
flags_were_submitted:
@@ -1828,97 +1855,9 @@ en:
usage_tips:
text_body_template: |
- Here are a few quick tips to get you started:
+ For a few quick tips on getting started as a new user, [check out this blog post](http://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/).
- ## Reading
-
- To read more, **just keep scrolling down!**
-
- As new replies or new topics arrive, they will appear automatically – no need to refresh the page.
-
- ## Navigation
-
- - For search, your user page, or the ☰ menu, use the **icon buttons at upper right**.
-
- - Selecting a topic title will always take you to your **next unread reply** in the topic. To enter at the top or bottom instead, select the reply count or last reply date.
-
-
-
- - While reading a topic, use the timeline on the right to jump to the top, bottom, or your last read position. On smaller screens, select the progress bar at bottom right to expand it:
-
-
-
- You can also press ? on your keyboard for a list of super-speedy keyboard shortcuts.
-
- ## Replying
-
- To insert a quote, select the text you wish to quote, then press any Reply button to open the editor. Repeat for multiple quotes.
-
-
-
- You can always continue reading while you compose your reply, and we automatically save drafts as you write.
-
- To notify someone about your reply, mention their name. Type `@` to begin selecting a username.
-
-
-
- To use [standard Emoji](http://www.emoji.codes/), just type `:` to match by name, or use the traditional smileys `;)`
-
-
-
- To generate a summary for a link, paste it on a line by itself:
-
-
-
- Your reply can be formatted using simple HTML, BBCode, or [Markdown](http://commonmark.org/help/):
-
- This is bold.
- This is [b]bold[/b].
- This is **bold**.
-
- For more formatting tips, [try our fun 10 minute interactive tutorial!](http://commonmark.org/help/tutorial/)
-
- ## Actions
-
- There are action buttons at the bottom of each post:
-
-
-
- - To let someone know that you enjoyed and appreciated their post, use the **like** button. Share the love!
-
- - Grab a copy-pasteable link to any reply or topic via the **link** button.
-
- - Use the … show more button to reveal more actions. **Flag** to privately let the author, or [our staff](%{base_url}/about), know about a problem. **Bookmark** to find this post later on your profile page.
-
- ## Notifications
-
- When someone replies to you, quotes your post, mentions your `@username`, or even links to your post, a number will immediately appear at the top right of the page. Select it to access your **notifications**.
-
-
-
- Don't worry about missing a reply – you'll be emailed any notifications that arrive when you are away.
-
- ## Preferences
-
- - All topics less than **two days old** are considered new.
-
- - Any topic you've **actively participated in** (by creating it, replying to it, or reading it for an extended period) will be automatically tracked on your behalf.
-
- You will see the new and unread number indicators next to these topics:
-
-
-
- You can change your notifications for any topic via the notification control at the bottom, and right hand side, of each topic.
-
-
-
- You can also set notification state per category, if you want to watch or mute every new topic in a specific category.
-
- To change any of these settings, see [your user preferences](%{base_url}/my/preferences).
-
- ## Community Trust
-
- It's great to meet you! As you participate here, over time we'll get to know you, and your temporary new user limitations will be lifted. Keep participating, and over time you'll gain new [trust levels](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) that include special abilities to help us manage our community together.
+ As you participate here, we’ll get to know you, and temporary new user limitations will be lifted. Over time you’ll gain [trust levels](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) that include special abilities to help us manage our community together.
welcome_user:
subject_template: "Welcome to %{site_name}!"
@@ -2461,7 +2400,7 @@ en:
join_the_discussion: "Read More"
popular_posts: "Popular Posts"
from_topic_label: "From"
- more_new: "New in topics and categories you follow"
+ more_new: "New for you"
subject_template: "[%{site_name}] Summary"
unsubscribe: "This summary is sent from %{site_link} when we haven't seen you in a while. To unsubscribe %{unsubscribe_link}."
click_here: "click here"
diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml
index 8a38dea743..0eb6cea2b4 100644
--- a/config/locales/server.es.yml
+++ b/config/locales/server.es.yml
@@ -71,6 +71,7 @@ es:
has_already_been_used: "ya se está utilizando"
inclusion: no está incluido en la lista
invalid: no es válido
+ is_invalid: "parece poco claro, es una oración completa?"
less_than: debe ser menor que %{count}
less_than_or_equal_to: debe ser menor o igual que %{count}
not_a_number: no es un número
@@ -105,7 +106,8 @@ es:
default_categories_already_selected: "No se puede seleccionar una categoría ya utilizada en otra lista."
s3_upload_bucket_is_required: "No se pueden activar las subidas a S3 a menos que se haya proporcionado un valor a 's3_upload_bucket'."
bulk_invite:
- file_should_be_csv: "El archivo a subir debe tener formato csv o txt."
+ file_should_be_csv: "El archivo subido debería ser de formato csv."
+ error: "Ha ocurrido un error al subir ese archivo. Por favor, inténtalo más tarde de nuevo."
backup:
operation_already_running: "Actualmente se está ejecutando una operación. No se puede iniciar un nuevo trabajo en este momento."
backup_file_should_be_tar_gz: "El archivo de la copia de seguridad debería ser del tipo .tar.gz"
@@ -123,6 +125,11 @@ es:
embed:
start_discussion: "Empezar discusión"
continue: "Continuar discusión"
+ error: "Error al insertar"
+ referer: "Referente:"
+ mismatch: "El referente no ha coincidido con ninguno de los siguientes hosts:"
+ no_hosts: "No se han definido hosts para el insertado"
+ configure: "Configurar insertado"
more_replies:
one: "otra respuesta"
other: "otras %{count} respuestas"
@@ -158,6 +165,7 @@ es:
topic_not_found: "Algo ha salido mal. ¿Tal vez este tema ha sido cerrado o eliminado mientras estabas lo estabas mirando?"
just_posted_that: "es demasiado parecido a lo que has publicado recientemente"
invalid_characters: "contiene caracteres no válidos"
+ is_invalid: "parece poco claro, es una oración completa?"
next_page: "siguiente página →"
prev_page: "← página anterior"
page_num: "Página %{num}"
@@ -268,6 +276,7 @@ es:
name: "Nombre de la categoría"
topic:
title: 'Título'
+ featured_link: 'Enlace destacado'
post:
raw: "Body"
user_profile:
@@ -281,6 +290,9 @@ es:
too_many_users: "Solamente puedes enviar advertencias a un usuario a la vez."
cant_send_pm: "Lo sentimos, no puedes enviar un mensaje privado a este usuario."
no_user_selected: "Debes seleccionar un usuario válido."
+ featured_link:
+ invalid: "es inválido. La dirección debería incluir http:// o https://."
+ invalid_category: "no puede ser editado en esta categoría."
user:
attributes:
password:
@@ -375,6 +387,7 @@ es:
create_topic: "Estás creando temas demasiado rápido. Por favor, espera %{time_left} antes de intentarlo de nuevo."
create_post: "Estás respondiendo demasiado rápido. Por favor, espera %{time_left} antes de intentarlo de nuevo."
delete_post: "Estás eliminando posts demasiado rápido. Por favor espera %{time_left} antes de intentarlo de nuevo."
+ public_group_membership: "Estás uniéndote o saliendo de grupos con mucha frecuencia. Por favor, espera %{time_left} antes de volver a intentarlo."
topics_per_day: "Has llegado al límite de nuevos temas de hoy. Por favor, espera %{time_left} antes de intentarlo de nuevo."
pms_per_day: "Has llegado al límite de mensajes de hoy. Por favor, espera %{time_left} antes de intentarlo de nuevo."
create_like: "Has llegado al límite de Me gusta de hoy. Por favor, espera %{time_left} antes de intentarlo de nuevo."
@@ -529,6 +542,13 @@ es:
title: 'Vota'
description: 'Vota por este post'
long_form: 'Votado para este post'
+ user_activity:
+ no_bookmarks:
+ self: "No tienes temas en marcadores, añadir temas a marcadores te permite acceder a ellos más tarde fácilmente."
+ others: "Sin marcadores."
+ no_likes_given:
+ self: "No le has dado a \"Me gusta\" en ningún tema."
+ others: "No te gusta ningún tema."
topic_flag_types:
spam:
title: 'Spam'
@@ -750,6 +770,7 @@ es:
poll_pop3_auth_error: "La conexión al servidor POP3 está fallando debido a un error de autenticación. Por favor revisa los ajustes POP3."
site_settings:
censored_words: "Las palabras serán reemplazadas con ■■■■"
+ censored_pattern: "Patrones de Regex serán automáticamente reemplazados con ■■■■"
delete_old_hidden_posts: "Auto-borrar cualquier post que se quede oculto por mas de 30 días."
default_locale: "El idioma por defecto de Discourse (ISO 639-1 Code)"
allow_user_locale: "Permitir que los usuarios escojan su propio idioma para la interfaz"
@@ -758,6 +779,8 @@ es:
min_first_post_length: "Extensión mínima permitida en el primer mensaje (cuerpo del tema) en caracteres"
min_private_message_post_length: "Extensión mínima de los posts en los mensajes, en número de caracteres"
max_post_length: "Extensión máxima de los posts, en número de caracteres"
+ topic_featured_link_enabled: "Activar publicar temas a partir de un enlace."
+ show_topic_featured_link_in_digest: "Mostrar el enlace destacado por el tema en el email de resumen."
min_topic_title_length: "Extensión mínima del título de los temas, en número de caracteres"
max_topic_title_length: "Extensión máxima del título de los temas, en número de caracteres"
min_private_message_title_length: "Extensión mínima del título de los temas en mensajes, en número de caracteres"
@@ -795,6 +818,8 @@ es:
show_pinned_excerpt_mobile: "Mostrar extracto de temas destacados en la vista móvil."
show_pinned_excerpt_desktop: "Mostrar extracto de temas destacados en la vista de escritorio."
post_onebox_maxlength: "Extensión máxima en caracteres de un post de Discourse en formato Onebox."
+ onebox_domains_blacklist: "Una lista de dominios que nunca se mostrarán en un obenox."
+ max_oneboxes_per_post: "Número máximo de oneboxes en un tema."
logo_url: "El logo situado en la esquina superior izquierda de tu sitio, debería encajar en las dimensiones de un rectángulo. Si se deja en blanco, se mostrará un texto con el título del sitio."
digest_logo_url: "La imagen de logo alterno utilizado en la parte superior del resumen del sitio enviado por email. Debería encajar en las dimensiones de un rectángulo. No debería ser una imagen SVG. Si se deja en blanco, se utilizará `logo_url`."
logo_small_url: "El logo pequeño situado en la esquina superior izquierda del sitio, debería encajar en las dimensiones de un cuadrado y se muestra cuando se hace scroll hacia abajo. Si se deja en blanco, se mostrará un glifo de una casita."
@@ -864,9 +889,8 @@ es:
show_email_on_profile: "Mostrar el e-mail los usuarios en su perfil (solamente visibles para ellos mismos y el staff)"
prioritize_username_in_ux: "Mostrar username primero en la página de usuario, tarjeta de usuario y mensajes (cuando el nombre ha sido desactivado se muestra primero)"
email_token_valid_hours: "Los tokens para restablecer contraseña olvidada / activar cuenta son válidos durante (n) horas."
- email_token_grace_period_hours: "Los tokens para restablecer contraseña olvidada / activar cuenta son válidos durante (n) horas de periodo de gracia, después de ser redimidos."
enable_badges: "Activar el sistema de distintivos"
- enable_whispers: "Permitir al staff comunicarse privadamente en los temas. (experimental)"
+ enable_whispers: "Permitir a los miembros del staff comunicarse privadamente entre ellos en temas públicos."
allow_index_in_robots_txt: "Especificar en robots.txt que este sitio puede ser indexado por los motores de búsqueda web."
email_domains_blacklist: "Una lista de dominios de correo electrónico con los que los usuarios no se podrán registrar. Ejemplo: mailinator.com|trashmail.net"
email_domains_whitelist: "Una lista de dominios de email con los que los usuarios DEBERÁN registrar sus cuentas. AVISO: ¡los usuarios con un email con diferente dominio a los listados no estarán permitidos!"
@@ -1087,9 +1111,11 @@ es:
reset_bounce_score_after_days: "Restablecer la puntuación de reobte automáticamente pasados X días."
attachment_content_type_blacklist: "Lista de palabras clave utilizadas para bloquear adjuntos basados en el tipo de contenido."
attachment_filename_blacklist: "Lista de palabras clave utilizadas para bloquear adjuntos basados en el nombre de archivo."
+ enable_forwarded_emails: "[BETA] Permitir a los usuarios crear temas enviándolos por email."
manual_polling_enabled: "Lanza emails usando la API para las respuestas por email."
pop3_polling_enabled: "Poll vía POP3 para respuestas de e-mail."
pop3_polling_ssl: "Usar SSL mientras se conecta al servidor POP3. (Recomendado)"
+ pop3_polling_openssl_verify: "Verificar certificado TLS sel servidor (activado por defecto)"
pop3_polling_period_mins: "El período en minutos entre revisiones de correo de la cuenta POP3. NOTA: requiere reiniciar."
pop3_polling_port: "El puerto utilizado para hacer polling a la cuenta POP3."
pop3_polling_host: "El host utilizado para hacer polling de e-mails vía POP3."
@@ -1112,6 +1138,9 @@ es:
allow_animated_thumbnails: "Generar miniaturas en movimiento de los gifs animados."
default_avatars: "URLs de avatares que se utilizarán por defecto para nuevos usuarios."
automatically_download_gravatars: "Descargar Gravatars para usuarios cuando se creen una cuenta o cambien el email."
+ digest_topics: "El número máximo de temas populares que se muestran en el email de resumen."
+ digest_posts: "El número máximo de temas populares que se mostrarán en el email de resumen."
+ digest_other_topics: "El número máximo de temas que se mostrarán en la sección del email de resumen 'Nuevo en temas y categorías'."
digest_min_excerpt_length: "Mínimo de caracteres del extracto de posts en el resumen por email."
delete_digest_email_after_days: "Suprimir los emails de resumen para aquellos usuarios que no han visto el sitio desde más de (n) días."
digest_suppress_categories: "Suprimir estas categorías de los emails de resumen."
@@ -1154,12 +1183,12 @@ es:
embed_username_key_from_feed: "Clave para extraer el nombre de usuario en Discourse desde el feed."
embed_title_scrubber: "Expresión regular para depurar títulos embebibles."
embed_truncate: "Truncar los posts embebidos."
+ allowed_href_schemes: "Esquemas permitidos en enlaces además de http y https."
embed_post_limit: "Número máximo de posts a embeber."
embed_username_required: "Se requiere el nombre de usuario para la creación de temas."
embed_whitelist_selector: "Selector CSS para los elementos que están permitidos en los embebidos."
embed_blacklist_selector: "Selector CSS para los elementos que están eliminados desde los embebidos."
notify_about_flags_after: "Si hay reportes que no han sido revisados después de este número de horas, enviar un correo electrónico al contact_email. Deshabilita esta opción introduciendo el valor 0."
- enable_cdn_js_debugging: "Permitir /logs mostrar los errores correctamente, añadiendo permisos crossorigin en todas las inclusiones de js"
show_create_topics_notice: "Si el sitio tiene menos de 5 temas abiertos al público, mostrar un aviso pidiendo a los administradores crear más temas."
delete_drafts_older_than_n_days: Eliminar borradores de más de (n) días de antigüedad.
bootstrap_mode_min_users: "Mínimo número de usuarios requerido para desactivar el modo bootstrap (pon 0 para desactivar esta opción)"
@@ -1177,6 +1206,7 @@ es:
auto_close_topics_post_count: "Máximo número de publicaciones permitidas en un tema antes de que sea cerrado automáticamente (0 para desactivar)"
code_formatting_style: "El botón de código en el editor se establecerá por defecto a este estilo de formato de código"
default_email_digest_frequency: "Cuán a menudo recibirán los usuarios emails de resumen por defecto."
+ default_include_tl0_in_digests: "Incluir temas de usuarios nuevos en los emails de resumen por defecto. Los usuarios pueden cambiar esto en sus preferencias."
default_email_private_messages: "Enviar un email cuando alguien envíe un mensaje al usuario por defecto."
default_email_direct: "Enviar un email cuando alguien cite/responda/mencione o invite al usuario por defecto."
default_email_mailing_list_mode: "Enviar un email por cada nuevo post por defecto."
@@ -1187,6 +1217,7 @@ es:
default_email_in_reply_to: "Incluir por defecto un extracto del post al que se ha respondido en los emails."
default_other_new_topic_duration_minutes: "Condición por defecto para que un tema sea considerado nuevo"
default_other_auto_track_topics_after_msecs: "Tiempo por defecto hasta que un tema sea seguido automáticamente."
+ default_other_notification_level_when_replying: "Nivel global de notificación cuando el usuario responde a un tema."
default_other_external_links_in_new_tab: "Abrir enlaces externos en una nueva pestaña por defecto."
default_other_enable_quoting: "Activar respuesta citando texto seleccionado por defecto."
default_other_dynamic_favicon: "Mostrar temas nuevos/actualizados en el icono del navegador por defecto"
@@ -1196,17 +1227,28 @@ es:
default_categories_watching: "Lista de categorías que están vigiladas por defecto."
default_categories_tracking: "Lista de categorías que están seguidas por defecto"
default_categories_muted: "Lista de categorías que están silenciadas por defecto."
+ default_categories_watching_first_post: "Lista de categorías en las que el mensaje de cada nuevo tema será vigilado por defecto."
+ max_user_api_reqs_per_day: "Número máximo de peticiones de API de usuario por clave y por día"
+ max_user_api_reqs_per_minute: "Número máximo de peticiones de API de usuario por clave y por minuto"
+ allow_user_api_keys: "Permitir que se generen claves de API de usuario"
+ max_api_keys_per_user: "Número máximo de claves de usuario por usuario"
+ min_trust_level_for_user_api_key: "Nivel de confianza necesario para generar claves de API de usuario"
tagging_enabled: "¿Activar etiquetas para los temas?"
min_trust_to_create_tag: "El mínimo nivel de confianza requerido para crear una etiqueta."
max_tags_per_topic: "El máximo número de etiquetas que se pueden añadir a un tema."
max_tag_length: "Máximo número de caracteres que puede tener una etiqueta."
+ max_tag_search_results: "Al buscar etiquetas, el número máximo de resultados que mostrar."
show_filter_by_tag: "Mostrar un desplegable para filtrar una lista de temas por etiqueta."
max_tags_in_filter_list: "Máximo número de etiquetas en el desplegable. Se mostrarán primero aquellas más utilizadas."
tags_sort_alphabetically: "Mostrar etiquetas en orden alfabético. Por defecto se mostrarán por popularidad."
tag_style: "Estilo visual de las etiquetas."
staff_tags: "Una lista de etiquetas que sólo pueden ser aplicadas por administradores o moderadores"
min_trust_level_to_tag_topics: "Nivel mínimo requerido para etiquetar temas"
+ suppress_overlapping_tags_in_list: "Si alguna etiqueta coinciden con palabras en el título de los temas, ocultarla."
remove_muted_tags_from_latest: "No mostrar temas con etiquetas silenciadas en la lista de temas recientes."
+ company_short_name: "Nombre de la empresa (corto)"
+ company_full_name: "Nombre de la empresa (largo)"
+ company_domain: "Dominio de la empresa"
errors:
invalid_email: "Dirección de correo electrónico inválida. "
invalid_username: "No existe ningún usuario con ese nombre de usuario. "
@@ -1221,6 +1263,7 @@ es:
invalid_string_min: "Debe contener como mínimo %{min} caracteres. "
invalid_string_max: "No debe exceder los %{max} caracteres. "
invalid_reply_by_email_address: "El valor debe contener '%{reply_key}' y debe ser diferente del email de notificación."
+ invalid_alternative_reply_by_email_addresses: "Todas los valores deben contener '%{reply_key}' y deben ser diferentes del email de notificación."
pop3_polling_host_is_empty: "Debes establecer un host de 'pop3 polling' antes de activar el polling POP3."
pop3_polling_username_is_empty: "Debes establecer un usuario de 'pop3 polling' antes de activar el polling POP3."
pop3_polling_password_is_empty: "Debes establecer una contraseña de 'pop3 polling' antes de activar el polling POP3."
@@ -1228,6 +1271,7 @@ es:
reply_by_email_address_is_empty: "Debes establecer el campo 'reply by email address' antes de activar respuesta por email."
email_polling_disabled: "Debes activar el polling POP3 o bien el manual antes de activar la respuesta por email."
user_locale_not_enabled: "Debes activar primero 'allow user locale' antes de activar esta opción."
+ invalid_regex: "El código Regex es inválido o no está permitido."
search:
within_post: "#%{post_number} por %{username}"
types:
@@ -1246,6 +1290,13 @@ es:
redirected_to_top_reasons:
new_user: "¡Bienvenido a nuestra comunidad! Estos son los temas recientes mas populares."
not_seen_in_a_month: "¡Bienvenido de vuelta! No te habíamos visto en un tiempo. Estos son los temas mas populares desde que no has estado."
+ merge_posts:
+ edit_reason:
+ one: "Un tema fue juntado por %{username}"
+ other: "%{count} mensaje fueron juntados por %{username}"
+ errors:
+ different_topics: "Mensajes que pertenecen a temas diferentes no pueden ser juntados."
+ different_users: "Mensajes que pertenecen a diferentes usuarios no pueden ser juntados."
move_posts:
new_topic_moderator_post:
one: "un post fue trasladado a un nuevo tema: %{topic_link}"
@@ -1313,6 +1364,7 @@ es:
something_already_taken: "Algo ha salido mal, quizá el nombre de usuario o el email ya han sido registrados. Prueba con el enlace de olvidé mi contraseña."
omniauth_error: "Lo sentimos, hubo un error al autorizar tu cuenta. ¿Quizás no has aprobado la autorización?"
omniauth_error_unknown: "Algo ha salido mal procesando tu inicio de sesión, por favor, vuelve a intentarlo."
+ authenticator_error_no_valid_email: "Ninguna dirección de email asociada con %{account} está permitida. Puede que necesites configurar tu cuenta con una dirección de email diferente."
new_registrations_disabled: "El registro de nuevas cuentas no está permitido en este momento."
password_too_long: "Las contraseñas están limitadas a 200 caracteres"
email_too_long: "El email que has proporcionado es demasiado largo. Las direcciones de correo no deben tener más de 254 caracteres y los nombres de dominio no más de 253."
@@ -1322,6 +1374,7 @@ es:
already_logged_in: "Ups, parece que estás intentando aceptar una invitación dirigida a otro usuariol. Si no eres %{current_user}, por favor cierra sesión e inténtalo de nuevo."
user:
no_accounts_associated: "No hay cuentas relacionadas."
+ deactivated: "Ha sido desactivado a causa de muchos rebotes al email '%{email}'."
username:
short: "debe contener al menos %{min} caracteres"
long: "debe contener no más de %{max} caracteres"
@@ -1335,6 +1388,7 @@ es:
email:
not_allowed: "este proveedor de email no está permitido. Por favor, utiliza otra dirección de email."
blocked: "no está permitido."
+ revoked: "No se enviarán más emails a '%{email}' hasta %{date}."
ip_address:
blocked: "No se permiten nuevos registros desde tu dirección IP."
max_new_accounts_per_registration_ip: "No se permiten nuevos registros desde tu dirección IP (alcanzado el límite máximo). Contacta un miembro del staff."
@@ -1373,8 +1427,60 @@ es:
%{invite_link}
Esta invitación proviene de un usuario de confianza, por lo que puedes comentar en el tema inmediatamente.
+ custom_invite_mailer:
+ subject_template: "%{invitee_name} te ha invitado a '%{topic_title}' en %{site_domain_name}"
+ text_body_template: |
+ %{invitee_name} te ha invitado a un debate
+
+ > **%{topic_title}**
+ >
+ > %{topic_excerpt}
+
+ en
+
+ > %{site_title} -- %{site_description}
+
+ Mensaje de %{invitee_name}:
+
+ %{user_custom_message}
+
+ Si estás interesado en participar, haz clic en el enlace debajo:
+
+ %{invite_link}
+
+ Esta invitación viene de un usuario en el que confiamos, por lo que podrás responder inmediatamente.
invite_forum_mailer:
subject_template: "%{invitee_name} te invitó a unirte a %{site_domain_name}"
+ text_body_template: |
+ %{invitee_name} te ha invitado a unirte a
+
+ > **%{site_title}**
+ >
+ > %{site_description}
+
+ Si estás interesado, haz clic en el botón debajo:
+
+ %{invite_link}
+
+ Esta invitación viene de un usuario en el que confiamos, por lo que se te creará una cuenta automáticamente.
+ custom_invite_forum_mailer:
+ subject_template: "%{invitee_name} te ha invitado a %{site_domain_name}"
+ text_body_template: |
+ %{invitee_name} te ha invitado a
+
+ > **%{site_title}**
+ >
+ > %{site_description}
+
+ Mensaje de %{invitee_name}:
+
+ %{user_custom_message}
+
+ Si estás interesado en unirte, haz clic en el enlace debajo:
+
+ %{invite_link}
+
+ Esta invitación viene de un usuario en el que confiamos, por lo que se te creará una cuenta automáticamente.
invite_password_instructions:
subject_template: "Asigna una contraseña para tu cuenta en %{site_name}"
text_body_template: |
@@ -1388,12 +1494,43 @@ es:
subject_template: "[%{site_name}] Prueba de envío de email"
new_version_mailer:
subject_template: "[%{site_name}] Nueva versión de Discourse, actualización disponible"
+ text_body_template: |
+ ¡Genial, una nueva versión de [Discourse](http://www.discourse.org) está disponible!
+
+ Tu versión: %{installed_version}
+ Nueva versión: **%{new_version}**
+
+ - Actualiza usando nuestro sencillo **[sistema de un clic para actualizar](%{base_url}/admin/upgrade)**
+
+ - Echa un vistazo a los cambios en el [changelog de GitHub](https://github.com/discourse/discourse/commits/master)
+
+ - Visita [meta.discourse.org](https://meta.discourse.org) para noticias, debates y ayuda para Discourse.
new_version_mailer_with_notes:
subject_template: "[%{site_name}] actualización disponible"
+ text_body_template: |+
+ ¡Genial, una nueva versión de [Discourse](http://www.discourse.org) está disponible!
+
+ Tu versión: %{installed_version}
+ Nueva versión: **%{new_version}**
+
+ - Actualiza usando nuestro sencillo **[sistema de un clic para actualizar](%{base_url}/admin/upgrade)**
+
+ - Echa un vistazo a los cambios en el [changelog de GitHub](https://github.com/discourse/discourse/commits/master)
+
+ - Visita [meta.discourse.org](https://meta.discourse.org) para noticias, debates y ayuda para Discourse.
+
+ ### Detalles de la versión
+
+ %{notes}
+
queued_posts_reminder:
subject_template:
one: "[%{site_name}] 1 post esperando ser revisado"
other: "[%{site_name}] %{count} posts esperando ser revisados"
+ text_body_template: |
+ Hola,
+
+ Algunos mensajes de usuarios nuevos han sido retenidos para moderar y están esperando ser revisados. [Apruébalos o recházalos aquí](%{base_url}/queued-posts).
flag_reasons:
off_topic: "Tu post fue reportado como **off-topic**: la comunidad piensa que no se ajusta debidamente al tema, definido por el título o el primer post."
inappropriate: "Tu post fue reportado como **inapropiado**: la comunidad piensa que es ofensivo, abusivo o que vulnera alguna de [nuestros consejos de uso](/guidelines)."
@@ -1407,6 +1544,22 @@ es:
deferred_and_deleted: "Gracias por hacérnoslo saber. Hemos eliminado el post."
temporarily_closed_due_to_flags: "Este tema está temporalmente cerrado debido a un gran número de reportes de la comunidad."
system_messages:
+ post_hidden:
+ subject_template: "Mensaje ocultado debido a varios reportes de la comnuidad"
+ text_body_template: |
+ Hola,
+
+ Esto es un mensaje automático de %{site_name} para hacerte saber que tu mensaje ha sido ocultado.
+
+ %{base_url}%{url}
+
+ %{flag_reason}
+
+ Varios miembros de la comunidad han reportado el mensaje antes de que fuera ocultado, por lo que te recomendamos que revises tu mensaje para reflejar su opinión. **Puedes editar tu mensaje en %{edit_delay} minutos, y será automáticamente mostrado de nuevo.**
+
+ Sin embargo, si el mensaje es ocultado por la comunidad una segunda vez, seguirá ocultado hasta que el staff lo revise – y se podrían tomar medidas incluida la posible suspensión de tu cuenta.
+
+ Para más información sobre lo que consideramos adecuado, lee las [directrices de la comunidad](%{base_url}/guidelines).
welcome_user:
subject_template: "¡Bienvenido a %{site_name}!"
text_body_template: |
@@ -1443,12 +1596,47 @@ es:
[prefs]: %{user_preferences_url}
backup_succeeded:
subject_template: "La copia de seguridad se completo exitosamente"
+ text_body_template: |+
+ Copia de seguridad realizada con éxito.
+
+ Visita la sección [admin > copias de seguridad](%{base_url}/admin/backups) para descargarla.
+
+ Aquí está el registro:
+
+ ```text
+ %{logs}
+ ```
+
backup_failed:
subject_template: "La copia de seguridad falló"
+ text_body_template: |
+ La copia de seguridad ha fallado.
+
+ Aquí está el registro:
+
+ ```text
+ %{logs}
+ ```
restore_succeeded:
subject_template: "Restauración completada exitosamente."
+ text_body_template: |
+ La restauración se ha completado con éxito.
+
+ Aquí está el registro:
+
+ ```text
+ %{logs}
+ ```
restore_failed:
subject_template: "La restauración falló."
+ text_body_template: |
+ La restauración ha fallado.
+
+ Aquí está el registro:
+
+ ```text
+ %{logs}
+ ```
bulk_invite_succeeded:
subject_template: "Invitación masiva procesada con éxito"
text_body_template: "Tu archivo de invitación masiva ha sido procesado, se han enviado %{sent} invitaciones."
@@ -1475,6 +1663,12 @@ es:
text_body_template: "Lo sentimos, pero la exportación de datos falló. Por favor, verifica los registros o contacta a un miembro del staff."
email_reject_insufficient_trust_level:
subject_template: "[%{site_name}] Problema relacionado con el email -- Insuficiente nivel de confianza"
+ text_body_template: |
+ Lo sentimos, pero tu mensaje de email a %{destination} (con título %{former_title}) no ha funcionado.
+
+ Tu cuenta no tiene el nivel de confianza necesario para publicar nuevos temas a esta dirección de email. Si crees que se trata de un error, contacta a un miembro del staff.
+ email_reject_user_not_found:
+ subject_template: "[%{site_name}] Problema de email -- Usuario no encontrado"
email_reject_inactive_user:
subject_template: "[%{site_name}] Problema relacionado con el email -- Usuario inactivo"
text_body_template: |
@@ -1508,6 +1702,37 @@ es:
subject_template: "[%{site_name}] Problema con el correo electrónico -- Respuesta Auto Generada"
email_error_notification:
subject_template: "[%{site_name}] Problema con el correo electrónico -- Error de autenticación POP"
+ too_many_spam_flags:
+ subject_template: "Nueva cuenta retenida"
+ text_body_template: |
+ Hola,
+
+ Esto es un mensaje automático de %{site_name} para hacerte saber que tus mensajes han sido ocultados temporalmente porque han sido reportados por la comunidad.
+
+ Como medida cautelar, tu cuenta nueva ha sido bloqueada y no puede crear nuevas respuestas o temas hasta que un miembro del staff la revise. Sentimos las molestias ocasionadas.
+
+ Para más información sobre lo que consideramos adecuado, lee las [directrices de la comunidad](%{base_url}/guidelines).
+ too_many_tl3_flags:
+ subject_template: "Nueva cuenta retenida"
+ text_body_template: |
+ Hola,
+
+ Esto es un mensaje automático de %{site_name} para hacerte saber que tus mensajes han sido ocultados temporalmente porque han sido reportados muchas veces por la comunidad.
+
+ Como medida cautelar, tu cuenta nueva ha sido bloqueada y no puede crear nuevas respuestas o temas hasta que un miembro del staff la revise. Sentimos las molestias ocasionadas.
+
+ Para más información sobre lo que consideramos adecuado, lee las [directrices de la comunidad](%{base_url}/guidelines).
+ blocked_by_staff:
+ subject_template: "Cuenta temporalmente retenida"
+ text_body_template: |
+ Hola,
+
+ Esto es un mensaje automático de %{site_name} para hacerte saber que tu cuenta ha sido temporalmente retenida como medida cautelar.
+
+ Por favor, sigue leyendo, pero no podrás responder o crear temas hasta que un [miembro del staff](%{base_url}/about) revise tus últimos temas. Sentimos las molestias ocasionadas.
+
+
+ Para más información sobre lo que consideramos adecuado, lee las [directrices de la comunidad](%{base_url}/guidelines).
user_automatically_blocked:
subject_template: "Nuevo usuario %{username} bloqueado por las \"banderas\" de la comunidad."
text_body_template: |
@@ -1719,10 +1944,23 @@ es:
%{message}
digest:
why: "Un breve resumen de %{site_link} desde tu última visita el %{last_seen_at}"
+ since_last_visit: "Desde tu última visita"
+ new_topics: "Temas nuevos"
+ unread_messages: "Mensajes no leídos"
+ unread_notifications: "Notificaciones no leídas"
+ new_posts: "Nuevos temas"
+ new_users: "Nuevos usuarios"
+ popular_topics: "Temas populares"
+ follow_topic: "Seguir este tema"
+ join_the_discussion: "Leer más"
+ popular_posts: "Temas populares"
+ from_topic_label: "Formulario"
+ more_new: "Nuevos temas en las categorías que sigues"
subject_template: "Resumen de [%{site_name}]"
unsubscribe: "Este resumen se envía desde %{site_link} cuando pasa un tiempo desde tu última visita. Para cancelar tu suscripción %{unsubscribe_link}."
click_here: "clic aquí"
from: "resumen de %{site_name}"
+ preheader: "Un corto resumen desde tu última visita el %{last_seen_at}"
mailing_list:
why: "Actividad en %{site_link} a %{date}"
subject_template: "[%{site_name}] Resumen del %{date}"
@@ -1865,6 +2103,7 @@ es:
message_to_blank: "message.to está en blanco"
text_part_body_blank: "text_part.body está en blanco"
body_blank: "el cuerpo está en blanco"
+ no_echo_mailing_list_mode: "Modo lista de correo desactivado para los post del usuario"
color_schemes:
base_theme_name: "Base"
about: "Acerca de"
@@ -2432,6 +2671,137 @@ es:
staff_tag_disallowed: "La etiqueta \"%{tag}\" solo puede ser insertada por moderadores."
staff_tag_remove_disallowed: "La etiqueta \"%{tag}\" solo puede ser eliminada por moderadores."
rss_by_tag: "Temas con la etiqueta %{tag}"
+ finish_installation:
+ congratulations: "Enhorabuena, ¡has instalado Discourse!"
+ register:
+ button: "Registrarse"
+ title: "Registrar cuenta de administrador"
+ help: "registra una nueva cuenta para empezar"
+ no_emails: "Desgraciadamente, no se han definido emails de administrador durante la instalación, por lo que finalizar la configuración podría ser difícil."
+ confirm_email:
+ title: "Confirmar tu email"
+ message: "Hemos enviado un email de activación a %{email}. Por favor, sigue las intrucciones en el email para activar tu cuenta. Si no llega, asegúrate que el email esté configurado correctamente en Discourse y comprueba tu carpeta de spam "
+ resend_email:
+ title: "Volver a enviar email de activación"
+ message: "Hemos reenviado el correo de activación a %{email}"
+ safe_mode:
+ title: "Activar modo seguro"
+ description: "El modo seguro permite probar tu página sin cargar plugins o customizaciones."
+ no_customizations: "Desactivar todas las customizaciones"
+ only_official: "Desactivar plugins no oficiale"
+ no_plugins: "Desactivar todos los plugins"
+ enter: "Activar modo seguro"
+ wizard:
+ title: "Instalación de Discourse"
+ step:
+ locale:
+ title: "¡Bienvenido a tu foro de discourse!"
+ fields:
+ default_locale:
+ description: "¿Cuál es el idioma por defecto para tu comunidad?"
+ forum_title:
+ title: "Nombre"
+ description: "El nombre es un cartel que se vé desde lejos, la primera cosa que los visitantes en potencia verán sobre tu comunidad. ¿Qué dice el nombre de yu comunidad?"
+ fields:
+ title:
+ label: "El nombre de la comunidad"
+ site_description:
+ label: "Describe tu comunidad en una frase corta"
+ introduction:
+ title: "Introducción"
+ fields:
+ welcome:
+ label: "Tema de bienvenida"
+ description: " ¿Cómo le describirías tu comunidad a un desconocido en alrededor de 1 minuto? - ¿A quién están enfocado el contenido?
- ¿Qué puedo encontrar aquí?
- ¿Por qué debería visitar esta página
Tu tema de bienvenida es la primera cosa que los nuevos visitantes verán. Piensa que es el párrafo que define tu comunidad."
+ one_paragraph: "El mensaje de bienvenida no debería ser más de un párrafo."
+ privacy:
+ title: "Acceso"
+ description: "¿Es tu comunidad abierta a todo el mundo o está restringida a ciertos miembros, ya sea por invitación o aprobación? Si lo prefieres, puedes hacer que sea privada, y hacerla pública más tarde. Recuerda que siempre puedes enviar invitaciones desde temas, o desde tu página de perfil. "
+ fields:
+ privacy:
+ choices:
+ open:
+ label: "Pública"
+ description: "Todo el mundo puede acceder a la comunidad y registrar una cuenta"
+ restricted:
+ label: "Privada"
+ description: "Solo gente invitada o con aprobación tiene acceso a esta comunidad"
+ contact:
+ title: "Contacto"
+ fields:
+ contact_email:
+ label: "Correo"
+ placeholder: "nombre@ejemplo.com"
+ description: "Dirección de email de la persona o grupo responsable de esta comunidad. Usado para notificaciones críticas como reportes sin atender, actualizaciones de seguridad y estará en la página Acerca de para cosas urgentes."
+ contact_url:
+ label: "Página web"
+ placeholder: "http://ejemplo.com/contacto"
+ description: "Tu página de contacto o la de tu organización. Será mostrada en la página de acerca de."
+ site_contact:
+ label: "Mensajes automáticos"
+ description: "Todos los mensajes privados automáticos de Discourse serán mandados desde este usuarios. Más importante, este usuario será el que envíe el mensaje de bienvenida que se manda automáticamente a todos los usuarios."
+ corporate:
+ title: "Organización"
+ description: "Estos nombres se usarán en tu Política de privacidad y Términos y condiciones, que podrás editar en todo momento en la categoría Staff. Si no tienes una empresa, puedes saltarte este paso por ahora."
+ fields:
+ company_short_name:
+ label: "Nombre de la empresa (corto)"
+ placeholder: "Initech"
+ company_full_name:
+ label: "Nombre de la empresa (completo)"
+ placeholder: "Initech S.L."
+ company_domain:
+ label: "Dominio de la empresa "
+ placeholder: "initech.com"
+ colors:
+ title: "Tema"
+ fields:
+ theme_id:
+ description: "¿Prefieres un tema oscuro o claro para empezar? Siempre lo puedes personalizar a través del panel del Administrador."
+ choices:
+ default:
+ label: "Simple y claro"
+ dark:
+ label: "Simple y oscuro"
+ logos:
+ title: "Logos"
+ fields:
+ logo_url:
+ label: "Logo principal"
+ description: "La imágen que estará arriba a la izquierda en tu página. Usar un rectángulo ancho."
+ logo_small_url:
+ label: "Logo compacto"
+ description: "Una versión compacta del logo que estará arriba a la izquierda cuando los usuarios bajen. Usar un cuadrado."
+ icons:
+ title: "Iconos"
+ fields:
+ favicon_url:
+ label: "Icono pequeño"
+ description: "Imagen usada para representar tu página en los navegadores que se vea bien en tamaños pequelos como 32px por 32px."
+ apple_touch_icon_url:
+ label: "Icono grande"
+ description: "Icono usado para representar tu página en dispositivos modernos y que se ve bien para tamaños grandes. El tamaño recomendado es al menos de 144px por 144px."
+ homepage:
+ description: "Recomendamos mostrar los últimos temas en tu página principal, pero siempre puedes mostrar categorías (grupos de temas) en la página principal si prefieres."
+ title: "Página de inicio"
+ fields:
+ homepage_style:
+ choices:
+ latest:
+ label: "Temas recientes"
+ categories:
+ label: "Categorías"
+ emoji:
+ title: "Emoji"
+ description: "¿Qué estilo de Emoji prefieres para tu comunidad? Siempre puedes añadir más Emojis personalizados a trvés de Admin, Personalizar, Emoji."
+ invites:
+ title: "Invitar staff"
+ description: "¡Ya casi está! Invita algunos miembros del staff para ayudar a iniciar conversaciones con temas interesantes y respuestas para dar tu comunidad por empezadas."
+ finished:
+ title: "Tu foro de Discourse está listo!"
+ description: |
+ Si alguna vez quieres cambiar alguno de estos ajustes, visita tu sección de administrador; la puedes encontrar el lado del icono de una llave inglesa en el menú de la página..
+ Diviértete, y ¡buena suerte construyendo tu nueva comunidad!
activemodel:
errors:
<<: *errors
diff --git a/config/locales/server.fa_IR.yml b/config/locales/server.fa_IR.yml
index 678d7ba238..d4eb86e7d3 100644
--- a/config/locales/server.fa_IR.yml
+++ b/config/locales/server.fa_IR.yml
@@ -84,8 +84,6 @@ fa_IR:
max_username_length_range: "شما نمیتوانید حداکثر را کمتر از حداقل بگذارید."
default_categories_already_selected: "شما نمیتوانید یک دسته بندی که در یک فهرست دیگر استفاده شده را انتخاب کنید."
s3_upload_bucket_is_required: "شما نمیتوانید بارگذاری به S3 را فعال کنید مگر اینکه 's3_upload_bucket' ارائه بدهید."
- bulk_invite:
- file_should_be_csv: "قالب پروندهی بارگذاری شده باید csv و یا txt باشد."
backup:
operation_already_running: "یک عملیات در حال اجراست. کار جدیدی نمی توان شروع کرد."
backup_file_should_be_tar_gz: "پروندهی پشتیبان باید یک فایل فشرده با پسوند tar.gz. باشد."
@@ -681,7 +679,6 @@ fa_IR:
top_page_default_timeframe: "دعوتنامه های معمولی در صفحه کاربر نشان داده می شوند. "
show_email_on_profile: "به کاربران ایمیلشان را در نمایه نشان بده (فقط برای خودشان و مدیران)"
email_token_valid_hours: "رمز عبور فراموش شده/ حساب کاربری فعال اعتبار دارد برای (n) ساعت."
- email_token_grace_period_hours: "رمز عبور فراموش شده/ نشانه حساب کاربری فعال هنوز قابل اعتبار است برای مهلت (n) ساعت بعد از اینکه بخشوده شد."
enable_badges: "فعال سازی سیستم مدال دهی"
allow_index_in_robots_txt: "مشخص کردن در robots.txt که به این سایت اجازه می دهد به نمایه شدن برای موتورهای جستجوی وب."
email_domains_blacklist: "لیست pipe-delimit دامنه های ایمیل که کاربران اجازه ندارند با آن حساب کاربری ثبت نام کنند. برای مثال: mailinator.com|trashmail.net"
@@ -877,7 +874,6 @@ fa_IR:
embed_whitelist_selector: "CSS انتخاب کننده برای المان های که اجازه دارند جاسازی شوند."
embed_blacklist_selector: "CSS انتخاب کننده برای المان های که از جاسازی پاک شده اند. "
notify_about_flags_after: "اگر پرچم هایی هست که به آنها بعد از چند ساعت رسیدگی نشده٬ ایمیلی ارسال کن به contact_email. برای از کار انداختن 0 را تنظیم کن."
- enable_cdn_js_debugging: "اجازه بده / logs به نمایش خطاهای مناسب با اضافه کردن مجوز crossorigin به همه آنها دارای js ."
show_create_topics_notice: "اگر سایت کمتر از 5 جستار عمومی دارد٬ اطلاع بده به مدیران تا جستارهای بیشتری بسازند."
delete_drafts_older_than_n_days: پیشنویسهای قدیمیتر از (n) روز را حذف کن
prevent_anons_from_downloading_files: "جلوگیری از دانلود کردن فایل پیوست توسط افراد ناشناس. اخطار: این جلوگیری می کنه از هر سایت دارای بدون عکسی. "
diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml
index a9d9f68e29..2eb42c48b3 100644
--- a/config/locales/server.fi.yml
+++ b/config/locales/server.fi.yml
@@ -106,7 +106,8 @@ fi:
default_categories_already_selected: "Et voi valita aluetta, joka on käytössä toisella listalla"
s3_upload_bucket_is_required: "Et voi ottaa s3 latausta käyttöön, jos et ole määrittänyt 's3_upload_bucket'."
bulk_invite:
- file_should_be_csv: "Ladattavan tiedoston pitäisi olla csv- tai txt-muodossa."
+ file_should_be_csv: "Ladattavan tiedoston tulee olla CSV-muodossa."
+ error: "Tiedoston lataus epäonnistui. Yritä myöhemmin uudelleen."
backup:
operation_already_running: "Tehtävä on parhaillaan käynnissä. Uutta tehtävää ei voi aloittaa juuri nyt."
backup_file_should_be_tar_gz: "Varmuuskopion tulisi olla .tar.gz-pakattu tiedosto."
@@ -124,6 +125,7 @@ fi:
embed:
start_discussion: "Lisää kommentti"
continue: "Siirry keskusteluun"
+ error: "Virhe upotettaessa"
more_replies:
one: "1 muu kommentti"
other: "%{count} muuta kommenttia"
@@ -272,6 +274,7 @@ fi:
name: "Alueen nimi"
topic:
title: 'Otsikko'
+ featured_link: 'Ketjulinkki'
post:
raw: "Leipäteksti"
user_profile:
@@ -285,12 +288,15 @@ fi:
too_many_users: "Voit lähettää varoituksia vain yhdelle käyttäjälle kerrallaan."
cant_send_pm: "Pahoittelut, et voi lähettää tälle käyttäjälle yksityisviestiä."
no_user_selected: "Sinun täytyy valita kelpaava käyttäjä."
+ featured_link:
+ invalid: "ei ole käypä. URL:in tulisi sisältää http:// tai https://."
+ invalid_category: "ei voi muokata tällä alueella."
user:
attributes:
password:
- common: "on yksi 10 000 yleisimmästä salasanasta. Ole hyvä ja valitse turvallisempi salasana."
- same_as_username: "on sama kuin käyttäjätunnuksesi. Ole hyvä ja valitse turvallisempi salasana."
- same_as_email: "on sama kuin sähköpostiosoitteesi. Ole hyvä ja valitse turvallisempi salasana."
+ common: "on yksi 10 000 yleisimmästä salasanasta. Valitse turvallisempi salasana."
+ same_as_username: "on sama kuin käyttäjätunnuksesi. Valitse turvallisempi salasana."
+ same_as_email: "on sama kuin sähköpostiosoitteesi. Valitse turvallisempi salasana."
same_as_current: "on sama kuin nykyinen salasanasi."
ip_address:
signup_not_allowed: "Kirjautuminen ei ole sallittu tälle tilille."
@@ -372,21 +378,22 @@ fi:
change_failed_explanation: "Yritit alentaa käyttäjän %{user_name} luottamustasolle '%{new_trust_level}'. Käyttäjän luottamustaso on jo valmiiksi '%{current_trust_level}'. %{user_name} jatkaa edelleen luottamustasolla '%{current_trust_level}' - jos haluat alentaa luottamustasoa, lukitse se ensin"
rate_limiter:
slow_down: "Olet tehnyt tämän toiminnon liian monta kertaa, yritä uudelleen myöhemmin."
- too_many_requests: "Tämä toiminto voidaan suorittaa vain määrätyn monta kertaa päivässä. Ole hyvä ja odota %{time_left} ja yritä sitten uudelleen."
+ too_many_requests: "Tämä toiminto voidaan suorittaa vain määrätyn monta kertaa päivässä. Odota %{time_left} ja yritä sitten uudelleen."
by_type:
- first_day_replies_per_day: "Uusi käyttäjä ei voi ensimmäisenä päivänään kirjoittaa enempää viestejä. Ole hyvä ja odota %{time_left} ja yritä sitten uudelleen."
- first_day_topics_per_day: "Uusi käyttäjä ei voi ensimmäisenä päivänään luoda enempää ketjuja. Ole hyvä ja odota %{time_left} ja yritä sitten uudelleen."
- create_topic: "Yrität luoda ketjuja liian nopeasti. Ole hyvä ja odota %{time_left} ja yritä sitten uudelleen."
- create_post: "Yrität vastata liian nopeasti. Ole hyvä ja odota %{time_left} ja yritä sitten uudelleen."
- delete_post: "Poistat viestejä liian nopeasti. Ole hyvä ja odota %{time_left} ja yritä sitten uudelleen."
- topics_per_day: "Olet luonut enimmäismäärän uusia ketjuja tälle päivälle. Ole hyvä ja odota %{time_left} ja yritä sitten uudelleen."
- pms_per_day: "Olet lähettänyt enimmäismäärän viestejä tälle päivälle. Ole hyvä ja odota %{time_left} ja yritä sitten uudelleen."
- create_like: "Olet tykännyt enimmäismäärän tälle päivälle. Ole hyvä ja odota %{time_left} ja yritä sitten uudelleen."
- create_bookmark: "Olet lisännyt enimmäismäärän kirjanmerkkejä tälle päivälle. Odota %{time_left} ennen kuin yrität uudelleen."
- edit_post: "Olet saavuttanut muokkausten enimmäismäärän tälle päivälle. Odota %{time_left} ennen kuin yrität uudelleen."
- live_post_counts: "Kysyt viestimääriä liian nopealla tahdilla. Odota %{time_left} ennen kuin yrität uudelleen."
- unsubscribe_via_email: "Olet perunut enimmäismäärän sähköpostitse tänään. Odota %{time_left} ennen uudelleen yrittämistä."
- topic_invitations_per_day: "Olet kutsunut enimmäismäärän tälle päivälle. Odota %{time_left} ennen uudelleen yrittämistä."
+ first_day_replies_per_day: "Uusi käyttäjä ei voi ensimmäisenä päivänään kirjoittaa enempää viestejä. Odota %{time_left} ja yritä sitten uudelleen."
+ first_day_topics_per_day: "Uusi käyttäjä ei voi ensimmäisenä päivänään luoda enempää ketjuja. Odota %{time_left} ja yritä sitten uudelleen."
+ create_topic: "Yrität luoda ketjuja liian nopeasti. Odota %{time_left} ja yritä sitten uudelleen."
+ create_post: "Yrität vastata liian nopeasti. Odota %{time_left} ja yritä sitten uudelleen."
+ delete_post: "Poistat viestejä liian nopeasti. Odota %{time_left} ja yritä sitten uudelleen."
+ public_group_membership: "Liityt/eroat ryhmistä liian nopeasti. Odota %{time_left} ja yritä sitten uudelleen."
+ topics_per_day: "Olet luonut enimmäismäärän uusia ketjuja tälle päivälle. Odota %{time_left} ja yritä sitten uudelleen."
+ pms_per_day: "Olet lähettänyt enimmäismäärän viestejä tälle päivälle. Odota %{time_left} ja yritä sitten uudelleen."
+ create_like: "Olet tykännyt enimmäismäärän tälle päivälle. Odota %{time_left} ja yritä sitten uudelleen."
+ create_bookmark: "Olet lisännyt enimmäismäärän kirjanmerkkejä tälle päivälle. Odota %{time_left} ja yritä sitten uudelleen."
+ edit_post: "Olet saavuttanut muokkausten enimmäismäärän tälle päivälle. Odota %{time_left} ja yritä sitten uudelleen."
+ live_post_counts: "Kysyt viestimääriä liian nopealla tahdilla. Odota %{time_left} ja yritä sitten uudelleen."
+ unsubscribe_via_email: "Olet perunut enimmäismäärän sähköpostitse tänään. Odota %{time_left} ja yritä sitten uudelleen."
+ topic_invitations_per_day: "Olet kutsunut enimmäismäärän tälle päivälle. Odota %{time_left} ja yritä sitten uudelleen."
hours:
one: "1 tunti"
other: "%{count} tuntia"
@@ -578,7 +585,7 @@ fi:
mailing_list_mode: "Poistu postituslistatilasta"
disable_digest_emails: "Älä lähetä minulle sähköpostikoosteita"
all: "Älä lähetä minulle sähköpostia sivustolta %{sitename}"
- different_user_description: "Olet kirjautunut sisään eri käyttäjänä kuin jolle sähköposti lähetettiin. Ole hyvä ja kirjaudu ulos tai siirry anonyymitilaan, ja yritä sitten uudelleen."
+ different_user_description: "Olet kirjautunut sisään eri käyttäjänä kuin jolle sähköposti lähetettiin. Kirjaudu ulos tai siirry anonyymitilaan ja yritä sitten uudelleen."
not_found_description: "Pahoittelut, tätä tilauksen perumista ei löytynyt. Kenties sinulle lähetetty linkki on vanhentunut?"
log_out: "Kirjaudu ulos"
user_api_key:
@@ -770,6 +777,8 @@ fi:
min_first_post_length: "Ketjun aloitusviestin (leipätekstin) merkkien minimimäärä"
min_private_message_post_length: "Viestin merkkien minimimäärä viesteille"
max_post_length: "Viestin merkkien minimimäärä"
+ topic_featured_link_enabled: "Ota käyttöön ketjulinkit."
+ show_topic_featured_link_in_digest: "Näytä ketjulinkki tiivistelmäsähköpostissa."
min_topic_title_length: "Viestin otsikon merkkien minimimäärä"
max_topic_title_length: "Viestin otsikon merkkien maksimimäärä"
min_private_message_title_length: "Viestin otsikon merkkien minimimäärä viestille"
@@ -873,9 +882,8 @@ fi:
show_email_on_profile: "Näytä käyttäjän sähköpostiosoite profiilissa (näkyy vain käyttäjälle itselleen ja henkilökunnalle)"
prioritize_username_in_ux: "Näytä käyttäjänimi ensimmäisenä käyttäjäsivulla, -kortissa ja viesteissä (jos poistetaan käytöstä, nimi näytetään ensin)"
email_token_valid_hours: "Unohtuneen salasanan / tilin vahvistamisen tokenit ovat voimassa (n) tuntia."
- email_token_grace_period_hours: "Unohtuneen salasanan / tilin vahvistamisen tokenit ovat vielä voimassa (n) tuntia käyttämisen jälkeen."
enable_badges: "Ota käyttöön ansiomerkkijärjestelmä"
- enable_whispers: "Salli henkilökunnan keskustella yksityisestä ketjun sisällä. (kokeellinen)"
+ enable_whispers: "Salli henkilökunnan yksityiskeskustelu ketjujen sisällä."
allow_index_in_robots_txt: "Määrittele robots.txt-tiedostossa, että hakukoneet saavat luetteloida sivuston."
email_domains_blacklist: "Pystyviivalla eroteltu lista sähköposti-verkkotunnuksista, joista käyttäjät eivät voi luoda tiliä. Esimerkiksi mailinator.com|trashmail.net"
email_domains_whitelist: "Pystyviivalla eroteltu lista sähköposti-verkkotunnuksista, joista käyttäjien pitää luoda tilinsä. VAROITUS: Käyttäjiä, joiden sähköpostiosoite on muusta verkkotunnuksesta ei sallita!"
@@ -1016,7 +1024,7 @@ fi:
newuser_max_mentions_per_post: "Kuinka monta @nimi mainintaa uusi käyttäjä voi lisätä viestiin."
newuser_max_replies_per_topic: "Uuden käyttäjän viestien maksimimäärä samassa ketjussa, kunnes joku vastaa heille."
max_mentions_per_post: "Kuinka monta @nimi mainintaa kukaan voi lisätä viestiin."
- max_users_notified_per_group_mention: "Kuinka moni voi saada ilmoituksen, kun ryhmään viitataan (jos raja ylittyy, kukaan ei saa ilmoitusta)"
+ max_users_notified_per_group_mention: "Kuinka moni voi saada ilmoituksen, kun ryhmä mainitaan (jos raja ylittyy, kukaan ei saa ilmoitusta)"
create_thumbnails: "Luo esikatselu- ja lightbox-kuvia, jotka ovat liian suuria mahtuakseen viestiin."
email_time_window_mins: "Odota (n) minuuttia ennen ilmoitussähköpostien lähettämistä, jotta käyttäjällä on aikaa muokata ja viimeistellä viestinsä."
private_email_time_window_seconds: "Odota (n) sekuntia ennen sähköposti-ilmoitusten lähettämistä käyttäjille, jotta kirjoittajalla on mahdollisuus tehdä muokkaukset ja viimeistellä viestinsä."
@@ -1094,6 +1102,7 @@ fi:
manual_polling_enabled: "Työnnä sähköpostit käyttäen sähköpostivastausten APIa."
pop3_polling_enabled: "Pollaa sähköpostivastaukset POP3:lla."
pop3_polling_ssl: "Käytä SSL-salausta yhdistettäessä POP3-palvelimeen. (Suositellaan)"
+ pop3_polling_openssl_verify: "Varmenna TLS-palvelinsertifikaatti (Oletus: päällä)"
pop3_polling_period_mins: "Tiheys minuuteissa kuinka usein POP3 tililtä tarkastetaan uudet sähköpostit. HUOM: vaatii uudelleenkäynnistyksen."
pop3_polling_port: "POP3 pollauksen portti."
pop3_polling_host: "POP3 pollauksen host."
@@ -1116,6 +1125,9 @@ fi:
allow_animated_thumbnails: "Luo animoidut esikatselukuvat animoiduista gif-tiedostoista."
default_avatars: "Verkko-osoitteet profiilikuviin, joita käytetään oletuksena uusille käyttäjille."
automatically_download_gravatars: "Lataa käyttäjille Gravatarit automaattisesti tilin luonnin ja sähköpostin vaihdon yhteydessä."
+ digest_topics: "Yläraja sähköpostikoosteessa näytettävien suosittujen ketjujen määrälle."
+ digest_posts: "Yläraja sähköpostikoosteessa näytettävien suosittujen viestien määrälle."
+ digest_other_topics: "Yläraja sähköpostikoosteen 'Uutta seuraamissasi ketjuissa ja alueissa' -osiossa näytettävien ketjujen määrälle."
digest_min_excerpt_length: "Vähimmäispituus merkeissä viestin katkelmalle, joka näytetään sähköpostikoosteissa."
delete_digest_email_after_days: "Älä lähetä sähköpostikoosteita käyttäjille, joita ei ole nähty sivustolla yli (n) päivään."
digest_suppress_categories: "Älä liitä näiden alueiden viestejä sähköpostikoosteisiin."
@@ -1159,7 +1171,6 @@ fi:
embed_whitelist_selector: "CSS valitsin elementeille, jotka sallitaan upotetuissa viesteissä."
embed_blacklist_selector: "CSS valitstin elementeille, jotka poistetaan upotetuista viesteistä."
notify_about_flags_after: "Jos liputuksia ei ole käsitelty näin moneen tuntiin, lähetä sähköposti contact_email osoitteeseen. Aseta 0 ottaaksesi pois käytöstä."
- enable_cdn_js_debugging: "Salli /logs näyttää kunnolliset virheilmoitukset lisäämällä crossorigin permissions kaikkiin sisällytettyihin js-kirjastoihin."
show_create_topics_notice: "Jos palstalla on vähemmän kuin 5 julkista ketjua, huomauta ylläpitäjiä ketjujen luonnista."
delete_drafts_older_than_n_days: Poista yli (n) päivää vanhat luonnokset.
bootstrap_mode_min_users: "Vähimmäismäärä käyttäjiä, joka vaaditaan aloitustilan poistamiseen (aseta 0 poistaaksesi käytöstä)"
@@ -2039,6 +2050,18 @@ fi:
%{message}
digest:
why: "Lyhyt kooste siitä mitä on tapahtunut sivustolla %{site_link} viimeisimmän vierailusi jälkeen %{last_seen_at}."
+ since_last_visit: "Viime vierailusi jälkeen"
+ new_topics: "Uutta ketjua"
+ unread_messages: "Lukematonta viestiä"
+ unread_notifications: "Lukematonta ilmoitusta"
+ liked_received: "Saatua tykkäystä"
+ new_posts: "Uutta viestiä"
+ new_users: "Uutta käyttäjää"
+ popular_topics: "Suosittuja ketjuja"
+ follow_topic: "Seuraa tätä ketjua"
+ join_the_discussion: "Lue lisää"
+ popular_posts: "Suosittuja viestejä"
+ from_topic_label: "Lähettäjä"
subject_template: "[%{site_name}] Kooste"
unsubscribe: "Tämä kooste lähetettiin sivustolta %{site_link}, koska emme ole nähneet sinua vähään aikaan. Jos et halua vastaanottaa näitä viestejä %{unsubscribe_link}."
click_here: "klikkaa tästä"
@@ -2541,6 +2564,19 @@ fi:
button: "Rekisteröidy"
title: "Rekisteröi ylläpitäjätunnus"
help: "aloita rekisteröimällä uusi tunnus"
+ confirm_email:
+ title: "Vahvista sähköpostisi"
+ message: "Lähetimme vahvistusviestin osoitteeseen %{email}. Ota tili käyttöön seuraamalla viestin ohjeita. Jos viesti ei saavu, varmista että näppäilit sähköpostin oikein Discourseen ja tarkista roskapostikansiosi. "
+ resend_email:
+ title: "Lähetä vahvistusviesti uudelleen"
+ message: "Lähetimme uuden vahvistusviestin osoitteeseen %{email}"
+ safe_mode:
+ title: "Siirry vikasietotilaan"
+ description: "Vikasietotilassa voit testata sivustoasi ilman lisäosia ja sivuston mukautuksia."
+ no_customizations: "Poista käytöstä sivuston mukautukset"
+ only_official: "Poista käytöstä epäviralliset lisäosat"
+ no_plugins: "Poista käytöstä kaikki lisäosat"
+ enter: "Siirry vikasietotilaan"
wizard:
title: "Discoursen asennus"
step:
@@ -2567,6 +2603,7 @@ fi:
description: "Kuinka kuvailisit yhteisöä hississä ventovieraalle, jos sinulla olisi minuutti aikaa? - Keille nämä keskustelut on suunnattu?
- Mistä täällä puhutaan?
- Miksi täällä kannattaa käydä?
Tervetuloa-ketju on ensimmäinen asia, jonka palstalle saapunut näkee. Ajattele sitä yhden kappaleen mittaisena \"hissipuheena\" tai \"perimmäisenä tavoitteena\". "
one_paragraph: "Pidä tervetuloviesti yhden kappaleen mittaisena."
privacy:
+ title: "Käyttöoikeudet"
description: "Onko yhteisö avoin kaikille vai onko pääsy riippuvainen jäsenyydestä, kutsusta tai hyväksynnästä? Jos haluat, voit laittaa kaiken alulle yksityisesti ja muuttaa foorumin julkiseksi myöhemmin. Muista, että voit aina lähettää kutsuja ketjujen alalaidasta kuin myös omalta käyttäjäsivultasikin. "
fields:
privacy:
@@ -2587,6 +2624,7 @@ fi:
contact_url:
label: "Internet-sivu"
placeholder: "http://www.example.com/contact-us"
+ description: "Sinun tai organisaatiosi yleinen yhteydenottosivu. Näytetään Tietoja-sivulla."
site_contact:
label: "Automaattiset viestit"
description: "Tämän käyttäjän nimissä Discourse lähettää kaikki automaattiset yksityisviestit käyttäjälle. Tärkeimpänä, käyttäjä on uudelle käyttäjälle lähetettävän tervetuloviestin lähettäjä."
@@ -2638,7 +2676,7 @@ fi:
homepage_style:
choices:
latest:
- label: "Tuoreimmat"
+ label: "Tuoreimmat ketjut"
categories:
label: "Keskustelualueet"
emoji:
diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml
index 03a9dca989..6800943653 100644
--- a/config/locales/server.fr.yml
+++ b/config/locales/server.fr.yml
@@ -125,6 +125,11 @@ fr:
embed:
start_discussion: "Démarrer la discussion"
continue: "Continuer la discussion"
+ error: "Erreur d'intégration"
+ referer: "Référent :"
+ mismatch: "Le référent ne correspondait à aucun des hôtes suivants :"
+ no_hosts: "Aucun hôte n'a été configuré pour l'intégration."
+ configure: "Configurer l'intégration"
more_replies:
one: "1 réponse supplémentaire"
other: "%{count} réponses supplémentaires"
@@ -382,6 +387,7 @@ fr:
create_topic: "Vous créez des sujets trop rapidement. Patientez s'il vous plaît %{time_left} avant d'essayer à nouveau."
create_post: "Vous répondez trop rapidement. Patientez s'il vous plaît %{time_left} avant d'essayer à nouveau."
delete_post: "Vous effacez des messages trop rapidement. Patientez s'il vous plaît %{time_left} avant d'essayer à nouveau."
+ public_group_membership: "Vous rejoignez et/ou quittez des groupes trop souvent. Veuillez attendre %{time_left} avant d'essayer à nouveau."
topics_per_day: "Vous avez atteint le nombre maximum de nouveaux sujets pour aujourd'hui. Patientez s'il vous plaît %{time_left} avant d'essayer à nouveau."
pms_per_day: "Vous avez atteint le nombre maximum de nouveaux messages pour aujourd'hui. Patientez s'il vous plaît %{time_left} avant d'essayer à nouveau."
create_like: "Vous avez atteint le nombre maximum de J'aime pour aujourd'hui. Patientez s'il vous plaît %{time_left} avant d'essayer à nouveau."
@@ -774,8 +780,6 @@ fr:
min_private_message_post_length: "Longueur minimale des messages en nombre de caractères"
max_post_length: "Longueur maximale autorisée des messages en nombres de caractères"
topic_featured_link_enabled: "Activer la création de sujets avec lien"
- topic_featured_link_onebox: "Si possible, afficher une Onebox dans le corps du message et empêcher la modification du contenu."
- open_topic_featured_link_in_external_window: "Ouvrir le lien associé au sujet dans un nouvel onglet."
show_topic_featured_link_in_digest: "Afficher les sujets avec lien dans le résumé par courriel."
min_topic_title_length: "Longueur minimale autorisée des titres de sujet en nombre de caractères"
max_topic_title_length: "Longueur maximale autorisée des titres de sujet en nombre de caractères"
@@ -885,7 +889,6 @@ fr:
show_email_on_profile: "Afficher l'adresse du courriel de l'utilisateur sur leur page utilisateur (seulement visible pour l'utilisateur et les équipes techniques)"
prioritize_username_in_ux: "Afficher le pseudonyme en premier sur la page d'un utilisateur, sa carte et ses messages (si désactivé, le nom est affiché en premier)"
email_token_valid_hours: "Les jetons (tokens) de Mot de passe oublié / Activation de comptes sont valides (n) jours."
- email_token_grace_period_hours: "Les jetons (tokens) de Mot de passe oublié / Activation de comptes sont encore valides pour une période de grâce de (n) heures après leur expiration."
enable_badges: "Activer le système de badges"
enable_whispers: "Autoriser les communications privées entre responsables au sein d'un sujet."
allow_index_in_robots_txt: "Préciser dans robots.txt que le site est autorisé à être indexé par les robots des moteurs de recherche."
@@ -918,6 +921,7 @@ fr:
sso_overrides_name: "Surcharger les noms complets locaux avec les noms complets externes d'un SSO à chaque connexion, et prévenir les modifications locales."
sso_overrides_avatar: "Surcharge les avatars des utilisateurs avec les avatars d'un SSO. Si activé, il est fortement recommandé de désactiver allow_uploaded_avatars."
sso_not_approved_url: "Rediriger les comptes SSO non validés vers cette URL"
+ sso_allows_all_return_paths: "Ne pas restreindre le domaine pour les return_paths fournis par le SSO (par défaut, le chemin de retour doit être sur le site actuel)"
enable_local_logins: "Activer les comptes locaux avec pseudo et mot de passe. (Note : ceci doit être activé pour que les invitations fonctionnent)"
allow_new_registrations: "Autorise l'inscription des nouveaux utilisateurs. Décocher pour prévenir la création de nouveau compte."
enable_signup_cta: "Afficher un rappel aux visiteurs pour les encourager à créer un compte."
@@ -1143,6 +1147,9 @@ fr:
delete_digest_email_after_days: "Ne pas envoyer de résumés par courriel aux utilisateurs qui n'ont pas visité le site depuis plus de (n) jours."
digest_suppress_categories: "Ne pas inclure ces catégories dans les résumés par courriel."
disable_digest_emails: "Désactiver les résumés par courriel pour tous les utilisateurs."
+ email_accent_bg_color: "La couleur d'accentuation utilisée comme arrière-plan de certains éléments des courriels HTML. Entrez un nom de couleur (« red ») ou une valeur hexadécimale (« #FF0000 »)."
+ email_accent_fg_color: "La couleur des textes rendus sur la couleur d'arrière-plan des courriels HTML. Entrez un nom de couleur (« white ») ou une valeur hexadécimale (« #FFFFFF »)."
+ email_link_color: "La couleur des liens dans les courriels HTML. Entrez un nom de couleur (« blue ») ou une valeur hexadécimale (« #0000FF »)."
detect_custom_avatars: "Vérifier ou non si les utilisateurs ont envoyé une photo de profil personnalisée."
max_daily_gravatar_crawls: "Nombre maximum de fois que Discourse vérifiera Gravatar pour des avatars personnalisés en une journée."
public_user_custom_fields: "Une liste blanche des champs personnalisés pour un utilisateur qui peuvent être affichés publiquement."
@@ -1187,7 +1194,6 @@ fr:
embed_whitelist_selector: "Sélecteur CSS pour les éléments qui seront autorisés dans les contenus embarqués."
embed_blacklist_selector: "Sélecteur CSS pour les éléments qui seront interdits dans les contenus embarqués."
notify_about_flags_after: "Si il y a des signalements qui n'ont pas été traités après ce nombre d'heure, envoyer un courriel à contact_email. Désactiver la fonctionnalité en indiquan 0."
- enable_cdn_js_debugging: "Autoriser /logs à afficher correctement les erreurs en ajoutant des permissions de crossorigin sur toutes les inclusions de js."
show_create_topics_notice: "Si le site contient moins de 5 sujets publics, afficher un message pour demander aux administrateurs de créer d'autres sujets."
delete_drafts_older_than_n_days: Supprimer les brouillons plus vieux que (n) jours.
bootstrap_mode_min_users: "Nombre minimum d'utilisateurs nécessaire pour désactiver le mode de démarrage (mettre à 0 pour désactiver)"
@@ -2077,6 +2083,7 @@ fr:
new_topics: "Nouveaux sujets"
unread_messages: "Messages non lus"
unread_notifications: "Notifications non lues"
+ liked_received: "J'aime reçus"
new_posts: "Nouveaux messages"
new_users: "Nouveaux utilisateurs"
popular_topics: "Sujets populaires"
diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml
index f21887a790..edf4643f9f 100644
--- a/config/locales/server.he.yml
+++ b/config/locales/server.he.yml
@@ -125,6 +125,11 @@ he:
embed:
start_discussion: "התחלת דיון"
continue: "המשך דיון"
+ error: "תקלה בשילוב"
+ referer: "מפנה:"
+ mismatch: "המפנה לא התאים לאף אחד מהשרתים הבאים:"
+ no_hosts: "אף שרת לא הוגדר לשילוב."
+ configure: "הגדרת שילוב (Embedding)"
more_replies:
one: "עוד תגובה אחת"
other: "עוד %{count} תגובות"
@@ -379,6 +384,7 @@ he:
create_topic: "אתם יוצרים נושא חדש מהר מדי. אנא המתנו %{time_left} לפני ניסיון חוזר לבצע פעולה זו."
create_post: "אתם מגיבים מהר מדי. אנא המתינו %{time_left} לפני ניסיון חוזר לבצע פעולה זו."
delete_post: "אתם מוחקים פוסטים מהר מידי. אנא המתינו %{time_left} לפני שאתם מנסים שוב."
+ public_group_membership: "אתם מצטרפים/עוזבים קבוצות בתדירות גבוהה מידי. אנא המתינו %{time_left} לפני שתנסו שוב."
topics_per_day: "הגעתם למספר המירבי של נושאים חדשים היום. אנא המתינו %{time_left} לפני ניסיון חוזר לבצע פעולה זו."
pms_per_day: "הגעתם למספר המירבי של הודעות היום. אנא המתינו %{time_left} לפני ניסיון חוזר לבצע פעולה זו."
create_like: "הגעתם למספר המירבי של לייקים היום. אנא המתינו %{time_left} לפני ניסיון חוזר לבצע פעולה זו."
@@ -771,8 +777,6 @@ he:
min_private_message_post_length: "אורך הפוסט המינימלי המותר בתווים להודעות"
max_post_length: "מספר התווים המקסימלי כאורך פוסט"
topic_featured_link_enabled: "איפשור של פרסום קישור עם נושאים."
- topic_featured_link_onebox: "הצגת onebox בתוכן פוסט במידת האפשר ומניעת עריכת תוכן פוסט."
- open_topic_featured_link_in_external_window: "פתיחת קישור מומלץ של נושא בחלון חיצוני."
show_topic_featured_link_in_digest: "הצגת קישור מומלץ של הנושא במייל התמצות."
min_topic_title_length: "מספר התווים המינימלי הנדרש לכותרת נושא"
max_topic_title_length: "מספר התווים המקסימלי המותר לכותרת נושא"
@@ -882,7 +886,6 @@ he:
show_email_on_profile: "הצגת כתובת הדוא\"ל של המשתמשים בעמוד הפרופיל שלהם (גלוי רק להם ולצוות)"
prioritize_username_in_ux: "הציגו שם-משתמש ראשון בדף המשתמש, כרטיס המשתמש ופוסטים (כשמנוטרל השם מופיע קודם)"
email_token_valid_hours: "סיסמאות שכחת סיסמה / הפעלת חשבון תקפים במשך (n) שעות."
- email_token_grace_period_hours: "סיסמאות שכחת סיסמה / הפעלת חשבון עדיין זמינים לזמן חסד של (n) שעות לאחר שהופקו."
enable_badges: "הפעלת מערכת העיטורים"
enable_whispers: "אפשרו לצוות לקיים תקשורת פרטית בתוך נושאים."
allow_index_in_robots_txt: "פרטו ב-robots.txt שלאתר זה מותר להיות מאונדקס על ידי מנועי חיפוש."
@@ -915,6 +918,7 @@ he:
sso_overrides_name: "דורס שם מלא מקומי עם שם מלא מאתר חיצוני מתוכן SSO בכל התחברות, מונע שינויים מקומיים."
sso_overrides_avatar: "מעקף אווטאר של משתמש בעזרת אווטר אתר חיצוני מ-SSO Payload. אם אפשרות זו מופעלת, מומלץ מאוד לבטל את האפשרות להעלאת אווטר."
sso_not_approved_url: "SSO של חשבונות שלא אושרו יופנו ל URL זה"
+ sso_allows_all_return_paths: "אל תגבילו את שמות המתחם של נתיבי החזרה (return_paths) שניתנים על ידי ה-SSO (כברירת מחדל, נתיבי החזרה חייבים להיות באתר הנוכחי)"
enable_local_logins: "אפשרו התחברות שמבוססת על שמות משתמשים וסיסמאות מקומיים. (שימו לב: אפשרות זו חייבת להיות מותרת כדי שהזמנות להצטרפות יפעלו)"
allow_new_registrations: "אפשרו הרשמות משתמשים חדשים. בטלו סימון זה כדי למנוע יצירת חשבונות חדשים."
enable_signup_cta: "הציגו מודעה למשתמשים אנונימיים חוזרים שמציעה להם להרשם כדי לקבל חשבון."
@@ -941,7 +945,7 @@ he:
automatic_backups_enabled: "הרץ גיבויים אוטומטים כמו שמוגדר בתדירות הגיבויים"
backup_frequency: "באיזו תכיפות אנחנו מגבים את האתר, בימים."
enable_s3_backups: "העלאת גיבויים ל-S3 לאחר השלמתם. חשוב: דורש הזנת הרשאות S3 תקפות להגדרות הקבצים."
- s3_backup_bucket: "הדלי המרוחק שבו לשמור גיבויים. אזהרה: סימו לב שהוא דלי פרטי."
+ s3_backup_bucket: "הדלי המרוחק שבו לשמור גיבויים. אזהרה: שימו לב שהוא דלי פרטי."
s3_disable_cleanup: "בטלו את ההסרה של גיבויים מ S3 כאשר הם מוסרים מקומית."
backup_time_of_day: "הגדרת זמן לגיבוי לפי UTC."
backup_with_uploads: "כללו העלאות בגיבויים התקופתיים. ביטול של אפשרות זו תגבה רק את בסיס הנתונים."
@@ -1140,6 +1144,9 @@ he:
delete_digest_email_after_days: "השתקת מיילי סיכום למשתמשים שלא ביקרו באתר למעלה מ (n) ימים."
digest_suppress_categories: "וותרו על קטגוריות אלו במיילים מסכמים."
disable_digest_emails: "בטל סיכומי מיילים לכל המשתמשים."
+ email_accent_bg_color: "צבע האקסנט שיעשה בו שימוש כרקע לחלק מהאלמנטים של מיילים מסוג HTML. הכניסו שם צבע ('red') או ערך הקסדצימלי ('#FF000')."
+ email_accent_fg_color: "צבע הטקסט שמופיע על צבע הרקע של מיילים מסוג HTML. הכניסו שם צבע ('white') או ערך הקסדצימלי ('#FFFFFF')."
+ email_link_color: "צבע הקישורים במיילים מסוג HTML. הכניסו שם צבע ('blue') או ערך הקסדצימלי ('#0000FF')."
detect_custom_avatars: "האם לבדוק או לא לבדוק שמשתמשים העלו תמונות פרופיל אישיות."
max_daily_gravatar_crawls: "מספר הפעמים המקסימלי ש-Discourse יבדוק אווטרים ב-Gravatar ביום"
public_user_custom_fields: "רשימה לבנה (whitelist) של שדות מותאמים למשתמש שיכולים להיות מוצגים באופן פומבי."
@@ -1184,7 +1191,6 @@ he:
embed_whitelist_selector: "בוררי CSS לאלמנטים שיותר להטמיע."
embed_blacklist_selector: "בוררי CSS לאלמנטים שיוסרו מן ההטמעות."
notify_about_flags_after: "אם יש דגלים שלא טופלו לאחר כמות זו של שעות, שילחו אימייל ל contact_email. קבעו 0 לניטרול."
- enable_cdn_js_debugging: "אפשרו ל-/logs להציג שגיאות בצורה נכונה באמצעות הוספת הרשאות לגישה בין אתרים (crossorigin permissions) בכל ה-js הכלולים."
show_create_topics_notice: "אם לאתר פחות מ-5 נושאים פומביים, הציגו מודעה המבקשת מן המנהלים ליצור עוד נושאים."
delete_drafts_older_than_n_days: מחקו טיוטות בנות יותר מ (n) ימים.
bootstrap_mode_min_users: "מספר משתמשים מינימלי שנדרש כדי לנטרל מצב איתחול (קבעו ל 0 כדי לנטרל)"
@@ -1597,94 +1603,9 @@ he:
להנחיות נוספות, אנא פנו ל[הנחיות הקהילה](%{base_url}/guidelines).
usage_tips:
text_body_template: |
- כמה טיפים לשימוש במערכת::
- איך קוראים
+ כמה טיפים לגבי איך להתחיל כמשתמשים חדשים, [ראו את הפוסט הזה](http://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/).
- כדי לקרוא עוד, פשוט המשיכו לגלול מטה!
-
- כאשר יופיעו תגובות נוספות או נושאים חדשים, הם יצוצו אוטומטית - אין צורך לרענן את העמוד.
- ניווט
-
- כדי לחפש, להגיע לעמוד המשתמש/ת שלך או להגיע לתפריט ☰, השתמשו באייקונים הקטנים שלמעלה מימין.
-
- כשתבחר/י בכותרת של נושא, מיד תועברו לתשובה הראשונה שלא קראתם עדיין באותו הנושא. כדי להיכנס ישר לראש רשימת הפרסומים, או לתחתית שלה, לחצו על מספר התגובות המופיע לצד שם הנושא, או על התאריך.
-
-
-
- כשאתם קוראים נושא, השתמשו בסרגל הזמנים שלצידו כדי לדלג למעלה, למטה או לחלק האחרון שקראתם. במסכים קטנים, לחצו על סרגל ההתקדמות שלמטה על מנת להרחיבו:
-
-
-
- אתם יכולים גם ללחוץ על ? במקלת כדי לראות רשימה של קיצורי מקלדת סופר-מהירים.
- משלוח תגובות
-
- כדי להכניס ציטוט, סמנו את הטקסט שברצונכם לצטט, ואז לחצו על כדי לפתוח את העורך. עשו זאת כמה פעמים כדי להוסיף ציטוטים נוספים:
-
-
-
- את/ה תמיד יכולים להמשיך לקרוא בזמן שאתם מחברים תגובה, ואנחנו נשמור עבורכם את הטיוטה ככל שתתקדמו בכתיבתה.
-
- כדי לעדכן מישהו או מישהי בתגובה שכתבתם, הזכירו את שמם. הקלידו @ כדי להתחיל בבחירת שם המשתמש/ת שלהם:
-
-
-
- כדי להשתמש ב[אימו'גים סטנדרטיים](http://www.emoji.codes/), פשוט הקלידו : כדי לבחור בהם לפי שם, או השתמשו בצירופי הסמיילים המקובלים :wink:.
-
-
-
- כדי ליצור סיכום של קישור מהאינטרנט, הדיברו אותו בשורה נפרדת משל עצמו:
-
-
-
- התגובה שלכם יכולה להיבנות באמצעות קוד HTML פשוט, BBCode או [Markdown](http://commonmark.org/help/):
-
- This is **bold**.
- This is bold.
- This is [b]bold[/b].
-
- כדי לקבל עוד טיפים לעיצוב טקסט, נסו את ההדרכה האינטרקטיבית הכיפית שלנו. זה לוקח רק 10 דקות!(http://commonmark.org/help/tutorial/)
-
- פעולות
-
- יש לחצני פעולות מתחת לכל פרסום:
-
-
-
-
- - כדי לספר למישהו/מישהי שנהניתם והערכתם את הפרסום שלהם, השתמש בלחצן like/אהבתי. שתפו את שאהבתם!
-
- - העתיקו והדביקו קישור לכל תגובה או נושאים שאהבתים בעזרת לחצן ה**link/קישור**.
-
- - השתמשו ב… כדי להציג עוד לחצנים ועוד פעולות. Flag/סמנו כדי לדווח למי שכתבו את הפרסום, או [לצוות שלנו](%{base_url}/about), על בעיה. הוסיפו Bookmark/סימניה כדי לאתר לאתר את הפרסום הזה בהמשך בעמוד דרך עמוד הפרופיל שלכם.
-
- ## התראות
-
- כאשר מישהו או מישהי מגיבים אליכם, מצטטים את הפרסום שלכם, מזכירים את @שם_המשתמש/ת שלכם או אפילו מקשרים אל הפרסום שלכם, מיד יופיע מספר בפינה השמאלית העליונה של המסך. לחצו עליו על מנת להציג את ההתראות שלכם.
-
-
-
- אל תחששו להחמיץ תגובות - תקבלו דוא"ל על כל התראה שמגיעה כשאתם לא מחוברים.
-
- ## העדפות
-
- - כל הנושאים שפורסמו לפני פחות מיומיים נחשבים חדשים.
- - כל נושא בו השתתפתם באופן פעיל (אם יצרתם אותו, הגבתם אליו או קראתם אותו במשך זמן כלשהו) יהיה באופן אוטומטי תחת מעקב שלכם.
-
- תוכלו לראות את האינדיקציות למספרי ההודעות החדשות ואלו שלא קראתם לצד הנושאים:
-
-
-
- תוכלו לשנות את סוג ההתראות לכל נושא בעזרת סרגל ההתראות שמתחת ומצד שמאל לכל נושא.
-
-
-
- תוכלו גם לכוון התראות לפי קטגוריה, אם תרצו לצפות או להשתיק כל נושא בקטגוריה מסויימת.
-
- כדי לשנות את ההעדפות הללו, ראו את [עמוד העדפות המשתמש/ת](%{base_url}/my/preferences) שלך.
-
- ## אמון הקהילה
-
- זה נהדר לפגוש אתכם כאן! ככל שתפעלו כאן, וככל שיעבור הזמן, נלמד להכיר וחלק ממגבלות המשתמש/ת החדשים יוסרו. המשיכו להשתתף, ועם הזמן תזכו בעוד [רמות אמון](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) שמאפשרות יכולות מיוחדות שיאפשרו לכם לסייע בניהול המשותף של הקהילה.
+ ככל שתשתתפו כאן, נכיר אתכם, ומגבלות זמניות על משתמשים חדשים יוסרו. במהלך הזמן תצבעו [דרגות אמון](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) שכוללות יכולות לסייע לנו לנהל את הקהילה שלנו ביחד.
welcome_user:
subject_template: "ברוכים הבאים ל %{site_name}!"
text_body_template: |
@@ -2160,6 +2081,7 @@ he:
new_topics: "נושאים חדשים"
unread_messages: "הודעות שלא נקראו"
unread_notifications: "התראות שלא נקראו"
+ liked_received: "לייקים שהתקבלו"
new_posts: "פוסטים חדשים"
new_users: "משתמשים חדשים"
popular_topics: "נושאים פופולאריים"
diff --git a/config/locales/server.id.yml b/config/locales/server.id.yml
index 90efb2a7ce..488efd6901 100644
--- a/config/locales/server.id.yml
+++ b/config/locales/server.id.yml
@@ -81,8 +81,6 @@ id:
max_username_length_exists: "Anda tidak boleh menentukan jumlah karakter maksimum username dibawah username terpendek. "
max_username_length_range: "Anda tidak bisa menentukan jumlah maksimum dibawah jumlah minimum."
default_categories_already_selected: "Anda tidak boleh memilih kategori yang digunakan di daftar lainnya."
- bulk_invite:
- file_should_be_csv: "File yang diunggah harus dalam format csv atau txt."
backup:
operation_already_running: "Proses lain sedang berjalan. Tidak dapat menjalankan proses baru saat ini."
backup_file_should_be_tar_gz: "File backup harus berupa arsip .tar.gz."
diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml
index d5adaaeeb8..a824245d9b 100644
--- a/config/locales/server.it.yml
+++ b/config/locales/server.it.yml
@@ -818,7 +818,6 @@ it:
redirect_users_to_top_page: "Redirigi automaticamente i nuovi utenti e quelli assenti da tempo sulla pagina degli argomenti di punta."
show_email_on_profile: "Mostra l'email di un utente nel suo profilo (visibile solo a se stesso e allo staff)"
email_token_valid_hours: "I messaggi di password dimenticata / attivazione account sono validi per (n) ore."
- email_token_grace_period_hours: "I messaggi di password dimenticata / attivazione account sono ancora validi per un periodo di grazia di (n) ore dopo essere stati convalidati."
enable_badges: "Attiva il sistema a distintivi"
allow_index_in_robots_txt: "Specifica nel file robots.txt che questo sito permette l'indicizzazione da parte dei motori di ricerca."
email_domains_blacklist: "Una lista di domini email separati dal carattere pipe \"|\" con cui gli utenti non possono registrare un account. Ad esempio: mailinator.com/trashmail.net"
diff --git a/config/locales/server.ja.yml b/config/locales/server.ja.yml
index 21b58c0322..e3b5af7924 100644
--- a/config/locales/server.ja.yml
+++ b/config/locales/server.ja.yml
@@ -77,8 +77,6 @@ ja:
load_from_remote: "投稿の読み込みに失敗しました。"
site_settings:
min_username_length_range: "最小値を最大値より上にすることはできません。"
- bulk_invite:
- file_should_be_csv: "アップロードするファイルは、csv または txt 形式である必要があります。"
backup:
operation_already_running: "操作を実行しています。他の操作はできません。"
backup_file_should_be_tar_gz: "バックアップファイルは .tar.gz形式である必要があります。"
@@ -102,10 +100,10 @@ ja:
in_reply_to: "▶ %{username}"
replies:
other: "%{count} 通の返信"
- no_mentions_allowed: "あなたは他のユーザへメンションを送ることができません。"
- no_images_allowed: "新規ユーザは投稿に画像を付ける事はできません。"
+ no_mentions_allowed: "あなたは他のユーザーへメンションを送ることができません。"
+ no_images_allowed: "新規ユーザーは投稿に画像を付ける事はできません。"
spamming_host: "申し訳ありませんが、このホストへのリンクを貼ることはできません。"
- user_is_suspended: "凍結中のユーザは投稿できません。"
+ user_is_suspended: "凍結中のユーザーは投稿できません。"
topic_not_found: "問題が発生しました。トピックがクローズしたか、閲覧中に削除された可能性があります。"
just_posted_that: "は最近の投稿と内容がほぼ一緒です"
invalid_characters: "は不正な文字を含んでいます"
@@ -174,11 +172,11 @@ ja:
こまごまと何度も返信するより、まとまって返信をすることで、より見やすく、より話しやすくなります。
dominating_topic: |
- ### 他のユーザも議論に参加させてあげましょう
+ ### 他のユーザーも議論に参加させてあげましょう
- このトピックはあなたにとても重要なもののようですね – ここの回答のうち %{percent}% 以上があなたによってなされています。
+ このトピックはあなたにとても重要なもののようですね – ここへ %{percent}% 以上の返信をあなたが行っています。
- 他のユーザが回答するために十分な時間的猶予を与えているか、ちょっと振り返ってみませんか?
+ 他のユーザーも返信するためにも、ある程度時間を開けているか確認してみましょう。
too_many_replies: |
### このトピックに回答出来る制限を超えました
@@ -206,14 +204,14 @@ ja:
attributes:
base:
warning_requires_pm: "プライベートメッセージでのみ警告を送ることができます"
- too_many_users: "1度に1ユーザにしか警告を送る事はできません"
- cant_send_pm: "申し訳ありません。このユーザにはプライベートメッセージを送る事ができません"
- no_user_selected: "有効なユーザを選択してください"
+ too_many_users: "一度に1ユーザーにしか警告を送る事はできません"
+ cant_send_pm: "申し訳ありません。このユーザーにはプライベートメッセージを送る事ができません"
+ no_user_selected: "有効なユーザーを選択してください"
user:
attributes:
password:
common: "は10000最も一般的なパスワードのいずれかである。より安全なパスワードを使用してください。"
- same_as_username: "はあなたのユーザ名と同じです。より安全なパスワードを使用してください"
+ same_as_username: "はあなたのユーザー名と同じです。より安全なパスワードを使用してください"
same_as_email: "はあなたのメールアドレスと同じです。より安全なパスワードを使用してください"
ip_address:
signup_not_allowed: "このアカウントからのサインアップできません。"
@@ -268,10 +266,10 @@ ja:
topic_exists_no_oldest: "%{count}個のトピックを持っているため、このカテゴリを削除できません。"
trust_levels:
newuser:
- title: "新しいユーザ"
+ title: "新しいユーザー"
basic:
- title: "ベーシックユーザ"
- change_failed_explanation: "%{user_name} を '%{new_trust_level}' に格下げしようとしましたが、既にトラストレベルが '%{current_trust_level}' です。%{user_name} は '%{current_trust_level}' のままになります - もしユーザーを降格させたい場合は、トラストレベルをロックしてください"
+ title: "ベーシックユーザー"
+ change_failed_explanation: "%{user_name} を '%{new_trust_level}' に下げようとしましたが、既にトラストレベルが '%{current_trust_level}' です。%{user_name} は '%{current_trust_level}' のままになります - もしユーザーを降格させたい場合は、トラストレベルをロックしてください"
rate_limiter:
too_many_requests: "このアクションを一日の間に実施可能な回数が決まっています。%{time_left}待ってから再度試してください。"
hours:
@@ -367,7 +365,7 @@ ja:
long_form: '不適切として通報する'
notify_user:
title: '@{{username}}へメッセージを送る'
- long_form: 'メッセージが送られたユーザ'
+ long_form: 'メッセージが送られたユーザー'
email_title: '「%{title}」にの投稿'
email_body: "%{link}\n\n%{message}"
notify_moderators:
@@ -402,28 +400,28 @@ ja:
email_title: 'トピック"%{title}" は不適切な可能性があるため、管理人による確認を必要とする。'
email_body: "%{link}\n\n%{message}"
flagging:
- you_must_edit: '投稿が他のユーザから通報されました。投稿したメッセージを確認してください。 '
- user_must_edit: 'この投稿は他のユーザから通報されたため、非表示にされています。 '
+ you_must_edit: '投稿が他のユーザーから通報されました。投稿したメッセージを確認してください。 '
+ user_must_edit: 'この投稿は他のユーザーから通報されたため、非表示にされています。 '
archetypes:
regular:
title: "通常のトピック"
banner:
title: "バナートピック"
message:
- make: "このトピックはバナートピックに設定されています。ユーザが解除しない限り、ページ毎の一番上に表示されます"
+ make: "このトピックはバナートピックに設定されています。ユーザーが解除しない限り、ページ毎の一番上に表示されます"
remove: "このトピックはバナーではなくなりました。トップページには表示されなくなります"
reports:
visits:
- title: "訪問ユーザ"
+ title: "訪問ユーザー"
xaxis: "日"
yaxis: "訪問者数"
signups:
- title: "新規ユーザ"
+ title: "新規ユーザー"
xaxis: "日"
- yaxis: "新規ユーザ数"
+ yaxis: "新規ユーザー数"
profile_views:
xaxis: "日"
- yaxis: "ユーザプロフィールの閲覧数"
+ yaxis: "ユーザープロフィールの閲覧数"
topics:
title: "トピック"
xaxis: "日"
@@ -451,13 +449,13 @@ ja:
users_by_trust_level:
title: "ユーザーごとのトラストレベル"
xaxis: "トラストレベル"
- yaxis: "ユーザ数"
+ yaxis: "ユーザー数"
emails:
title: "送信メール"
xaxis: "日"
yaxis: "メールの数"
user_to_user_private_messages:
- title: "ユーザ to ユーザ"
+ title: "ユーザーからユーザーへ"
xaxis: "日"
yaxis: "メッセージ数"
system_private_messages:
@@ -473,12 +471,12 @@ ja:
xaxis: "日"
yaxis: "メッセージ数"
notify_user_private_messages:
- title: "ユーザ通知"
+ title: "ユーザーの通知"
xaxis: "日"
yaxis: "メッセージ数"
top_referrers:
title: "トップリファラ"
- xaxis: "ユーザ"
+ xaxis: "ユーザー"
num_clicks: "クリック"
num_topics: "トピック"
top_traffic_sources:
@@ -486,19 +484,19 @@ ja:
xaxis: "ドメイン"
num_clicks: "クリック"
num_topics: "トピック"
- num_users: "ユーザ"
+ num_users: "ユーザー"
top_referred_topics:
title: "トップ被参照トピック"
xaxis: "トピック"
num_clicks: "クリック"
page_view_anon_reqs:
- title: "匿名ユーザ"
+ title: "匿名ユーザー"
xaxis: "日"
- yaxis: "匿名ユーザからの閲覧数"
+ yaxis: "匿名ユーザーからの閲覧数"
page_view_logged_in_reqs:
title: "ログイン"
xaxis: "日"
- yaxis: "ログインユーザからの閲覧数"
+ yaxis: "ログインユーザーからの閲覧数"
page_view_crawler_reqs:
title: "クローラー"
xaxis: "日"
@@ -508,13 +506,13 @@ ja:
xaxis: "日"
yaxis: "合計閲覧数"
page_view_logged_in_mobile_reqs:
- title: "ログインユーザからの閲覧数"
+ title: "ログインユーザーからの閲覧数"
xaxis: "日"
- yaxis: "モバイルでログインしているユーザからの閲覧数"
+ yaxis: "モバイルでログインしているユーザーからの閲覧数"
page_view_anon_mobile_reqs:
- title: "匿名ユーザからの閲覧数"
+ title: "匿名ユーザーからの閲覧数"
xaxis: "日"
- yaxis: "モバイルで閲覧している匿名ユーザの閲覧数"
+ yaxis: "モバイルで閲覧している匿名ユーザーの閲覧数"
http_background_reqs:
title: "背景"
xaxis: "日"
@@ -548,7 +546,7 @@ ja:
xaxis: "日"
yaxis: "合計"
mobile_visits:
- title: "訪問ユーザ"
+ title: "訪問ユーザー"
xaxis: "日"
yaxis: "訪問者数"
dashboard:
@@ -569,7 +567,7 @@ ja:
censored_words: "自動的に ■■■■ で置換されます"
delete_old_hidden_posts: "30日以上非表示になっている投稿を自動で削除します"
default_locale: "この Discourse インスタンスのデフォルト言語 (ISO 639-1 Code)"
- allow_user_locale: "ユーザーが各自の言語設定を選択できるようにする"
+ allow_user_locale: "ユーザーが言語を選択できるようにする"
min_post_length: "投稿を許可する最少の文字数"
min_first_post_length: "最初の投稿(投稿本文)を許可する最少の文字数"
min_private_message_post_length: "メッセージに投稿可能な最少の文字数"
@@ -652,7 +650,6 @@ ja:
redirect_users_to_top_page: "新規ユーザーと長く不在のユーザーをトップページに自動的にリダイレクトさせる"
show_email_on_profile: "プロフィールのメールアドレスを表示(自分とスタッフのみ閲覧できます)"
email_token_valid_hours: "パスワードリマインダ、アカウントアクティベート時のトークンを何時間有効にするか"
- email_token_grace_period_hours: "パスワードリマインダ、アカウントアクティベート時のトークンを無効するときに、何時間猶予を与えるか"
enable_badges: "バッジ機能を有効にする"
allow_index_in_robots_txt: "サーチエンジンにインデックスを許可するようにrobots.txtを指定する"
email_domains_blacklist: "ユーザーがアカウント登録をすることができない、パイプ区切りのドメイン名のリスト。 例 : mailinator.com|trashmail.net"
@@ -860,7 +857,6 @@ ja:
embed_whitelist_selector: "embedを許可するエレメントのCSS Selector"
embed_blacklist_selector: "embedから削除するエレメントのCSS Selector"
notify_about_flags_after: "この数時間後に処理されていない通報がある場合は、contact_emailにメールを送信する。0を設定すると無効になります"
- enable_cdn_js_debugging: "全てのJSにcrossorigin権限を追加することで、/logsに適切なエラーを表示することを許可する"
show_create_topics_notice: "サイトにpublicなトピックが5よりも少ない場合、トピックを作成するための通知が管理者に表示される"
delete_drafts_older_than_n_days: (n) 日間経過したドラフトを削除
prevent_anons_from_downloading_files: "匿名ユーザーが添付ファイルをダウンロードするのを防止。警告: 画像ではなく、添付ファイルとして投稿された全てのファイルが対象です"
diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml
index 9a084a5ade..ae26f88e02 100644
--- a/config/locales/server.ko.yml
+++ b/config/locales/server.ko.yml
@@ -75,8 +75,6 @@ ko:
other: '%{model} 저장 시에 %{count}개의 에러가 발생하여 진행을 못했습니다.'
embed:
load_from_remote: "글 로딩 중 오류가 발생하였습니다."
- bulk_invite:
- file_should_be_csv: "CSV 또는 TXT형식의 파일을 업로드해야 합니다."
backup:
operation_already_running: "현재 %{operation} 작업중입니다. %{operation} 작업을 지금 시작할 수 없습니다."
backup_file_should_be_tar_gz: "백업 파일은 .tar.gz형식의 파일이어야 합니다."
@@ -655,7 +653,6 @@ ko:
redirect_users_to_top_page: "신규 사용자와 오랜만에 방문한 사용자를 인기글 페이지로 리다이렉트."
show_email_on_profile: "사용자 프로필에서 자신의 이메일 주소 보기(본인과 관리자만 볼 수 있음)"
email_token_valid_hours: "비밀번호 찾기, 계정 활성화에 사용되는 토큰의 유효 기간(시간)"
- email_token_grace_period_hours: "비밀번호 찾기, 계정 활성화에 사용되는 토큰은 사용되어진 이후 유효한 기간(시간)"
enable_badges: "배지 기능 사용"
allow_index_in_robots_txt: "이 사이트가 검색엔진에 의해 인덱스되는 것을 허용합니다.(robots.txt 수정)"
email_domains_blacklist: "가입 금지된 이메일 도메인 목록, 파이프 기호로 구분. 예: mailinator.com|trashmail.net"
@@ -854,7 +851,6 @@ ko:
embed_whitelist_selector: "embed에서 보여져야 할 DOM element 선택하는 CSS 셀렉터"
embed_blacklist_selector: "embed에서 지워져야 할 DOM element 선택하는 CSS 셀렉터"
notify_about_flags_after: "이 시간동안 처리되지 않은 신고가 들어와 있으면, contact_email 주소로 이메일을 보냅니다. 0으로 넣으면 비활성화됩니다."
- enable_cdn_js_debugging: "/logs에서 적절한 모든 js를 포함해 crossorigin 권한 오류가 뜨도록 합니다."
show_create_topics_notice: "이 사이트에 5개 이하의 공개 글타래가 있으면, 관리자에게 글타래 좀 만들라고 알려줍니다."
delete_drafts_older_than_n_days: (n) 일지난 임시 보관글 삭제하기
prevent_anons_from_downloading_files: "익명 사용자가 다운로드를 받지 못하게 합니다. 경고: 이미지 파일 외 모든 첨부파일이 다운로드 받지 못하게 됩니다."
diff --git a/config/locales/server.nb_NO.yml b/config/locales/server.nb_NO.yml
index 87977d1221..696932ff94 100644
--- a/config/locales/server.nb_NO.yml
+++ b/config/locales/server.nb_NO.yml
@@ -151,6 +151,7 @@ nb_NO:
posts: "Siste innlegg"
private_posts: "Siste private meldinger"
group_posts: "Siste innlegg fra %{group_name}"
+ tag: "Emner merket med stikkord"
too_late_to_edit: "Det innlegget ble laget for lenge siden. Det kan ikke lenger bli redigert eller slettet."
excerpt_image: "bilde"
queue:
@@ -175,13 +176,13 @@ nb_NO:
new-topic: |
Velkommen til %{site_name} — **takk for at du starter et nytt innlegg!**
- - Høres tittelen på innlegget interessant ut hvis du leser den høyt? Er det en god oppsummering?
+ - Høres tittelen på innlegget interessant ut hvis du leser den høyt? Er den en god oppsummering?
- Hvem vil være interessert i dette? Hvorfor har det noe å si? Hva slags respons er du ute etter?
- - Bruk relevante begrep i emnet så andre kan *finne* det. Velg en kategori for å gruppere emnet ditt med andre liknende emner.
+ - Bruk relevante begrep i emnet så andre kan *finne* det. Velg en kategori for å gruppere emnet ditt med andre lignende emner.
- [Se våre retningslinjer for felleskapet](/guidelines) for mer informasjon. Denne meldingen vises kun for ditt/dine første %{education_posts_text}.
+ [Se retningslinjene for dette nettstedet](/guidelines) for mer informasjon. Denne meldingen vises kun for ditt/dine første %{education_posts_text}.
new-reply: |
Velkommen til %{site_name} — **takk for at du bidrar!**
@@ -253,7 +254,7 @@ nb_NO:
no_info_other: "%{name} har ikke skrevet noe i Om meg-feltet på sin profil ennå "
vip_category_name: "Salong"
vip_category_description: "En kategori tilgjengelig for brukere med tillitsnivå 3 og høyere."
- meta_category_name: "Tilbakemelding"
+ meta_category_name: "Tilbakemeldinger"
meta_category_description: "Diskusjon om dette nettstedet, hvordan det er organisert, hvordan det fungerer og hvordan vi kan forbedre det."
staff_category_name: "Stab"
staff_category_description: "Privat kategori for diskusjoner blant staben. Emner er kun synlige for administratorer og moderatorer."
@@ -283,7 +284,7 @@ nb_NO:
[trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924
category:
topic_prefix: "Om kategorien %{category} "
- replace_paragraph: "(Erstatt dette første avsnittet med en kort beskrivelse av den nye kategorien din. Denne teksten vil vises i oversikten over kategorier, så prøv å holde den under 200 ord. **Til du endrer denne beskrivelsen eller oppretter emner vil denne kategorien ikke vises på kategorier-siden.**)"
+ replace_paragraph: "(Erstatt dette første avsnittet med en kort beskrivelse av den nye kategorien din. Denne teksten vil vises i oversikten over kategorier, så prøv å holde den under 200 ord. **Inntil du endrer denne beskrivelsen eller oppretter emner, vil denne kategorien ikke vises på kategorier-siden.**)"
post_template: "%{replace_paragraph}\n\nBruk de følgende avsnittene for en lengre beskrivelse, eller for å beskrive retningslinjer eller regler for kategorien:\n\n- Hvorfor skal folk bruke denne kategorien? Hva er den ment for?\n\n- På hvilken måte skiller den seg fra de andre kategoriene vi allerede har?\n\n- Hva skal emner i denne kategorien generelt sett inneholde?\n\n- Trenger vi denne kategorien? Kan vi slå den sammen med en annen kategori eller underkategori?\n"
errors:
uncategorized_parent: "Ukategorisert kan ikke ha en foreldrekategori"
@@ -296,6 +297,7 @@ nb_NO:
one: "Kan ikke slette denne kategorien fordi den har 1 emne. Eldste emne er %{topic_link}."
other: "Kan ikke slette denne kategorien fordi den har %{count} emner. Eldste emne er %{topic_link}."
topic_exists_no_oldest: "Kan ikke slette denne kategorien fordi emneantallet er %{count}."
+ uncategorized_description: "Emner som ikke trenger en kategori eller som ikke passer i noen av de eksisterende."
trust_levels:
newuser:
title: "ny bruker"
@@ -404,6 +406,7 @@ nb_NO:
please_continue: "Fortsett til %{site_name}"
error: "Det oppsto en feil ved endring av din e-postadresse. Kanskje addressen allerede er i bruk?"
authorizing_old:
+ title: "Takk for at du bekreftet din nåværende e-postadresse"
description: "Vi sender deg en e-post til din nye adresse for bekreftelse."
activation:
already_done: "Beklager, denne bekreftelseslenken er ikke lenger gyldig. Kanskje er kontoen din allerede aktivert?"
@@ -477,6 +480,10 @@ nb_NO:
make: "Dette emnet er nå en banner. Det vil vises på toppen av hver side til brukeren lukker det."
remove: "Dette emnet er ikke lenger en banner. Det vil ikke lenger vises på toppen av hver side."
unsubscribe:
+ stop_watching_topic: "Slutt å følge dette emnet, %{link}"
+ mute_topic: "Demp alle varslene for dette emnet, %{link}"
+ unwatch_category: "Slutt å følge alle emner i %{category}"
+ mailing_list_mode: "Slå av e-postlistemodus"
disable_digest_emails: "Slutt å sende meg oppsummerings-eposter"
reports:
visits:
@@ -575,7 +582,7 @@ nb_NO:
http_background_reqs:
title: "Bakgrunn"
xaxis: "Dag"
- yaxis: "Forespørsler for live-oppdateringer og -sporing"
+ yaxis: "Forespørsler brukt for direkte-oppdateringer og -overvåkning"
http_2xx_reqs:
title: "Status 2xx (OK)"
xaxis: "Dag"
@@ -614,16 +621,16 @@ nb_NO:
memory_warning: 'Serveren din kjører med mindre enn 1 GB med minne. Minst 1 GB RAM er anbefalt.'
site_settings:
censored_words: "Ord som automatisk vil bli erstattet med ■■■■"
- delete_old_hidden_posts: "Auto-slett skjulte innlegg som er skjult i mer enn 30 dager."
+ delete_old_hidden_posts: "Slett automatisk skjulte innlegg som har vært skjult i mer enn 30 dager."
default_locale: "Standard språk for denne instansen av Discourse (ISO 639-1 Kode)"
- allow_user_locale: "Tillta at brukere velger eget språk"
+ allow_user_locale: "Tillat brukere å velge eget språk"
min_post_length: "Minimum tillatt lengde for innlegg i tegn"
min_first_post_length: "Minimum tillatt lengde på for teksten i første innlegg"
max_post_length: "Maksimum tillatt lengde for innlegg i tegn"
min_topic_title_length: "Minimum tillatt lengde for tittel i tegn"
max_topic_title_length: "Maksimum tillatt lengde for innlegg i tegn"
min_search_term_length: "Minimum lengde på søkeord i tegn"
- allow_duplicate_topic_titles: "Tillat emner med lik, duplikat tittel."
+ allow_duplicate_topic_titles: "Tillat flere emner med identisk tittel."
unique_posts_mins: "Hvor mange minutter før en bruker kan lage en post med det samme innholdet igjen"
educate_until_posts: "Når bruker begynner å skrive på de første (n) innleggene, vis pop-up med opplæringspanelet for nye brukere i editoren."
title: "Navnet på denne siden, slik du vil ha det i title-taggen."
@@ -637,7 +644,7 @@ nb_NO:
disabled_image_download_domains: "Eksterne bilder vil aldri bli lastet ned fra disse domenene (pipe-separert liste)."
editing_grace_period: "(n) sekunder etter publisering vil redigering ikke opprette en ny versjon i redigeringsloggen."
post_edit_time_limit: "Forfattere kan redigere eller slette innleggene sine (n) minutter etter opprettelse. Sett 0 for uendelig."
- edit_history_visible_to_public: "Alle kan se tidligere versjoner av et redigert innlegg. Hvis det er slått av kan kun stab se det."
+ edit_history_visible_to_public: "Alle kan se tidligere versjoner av et redigert innlegg. Hvis det er slått av kan kun staben se det."
delete_removed_posts_after: "Innlegg som blir fjernet av forfatter blir automatisk slettet etter (n) timer. Sett til 0 og innleggene blir slettet øyeblikkelig."
max_image_width: "Maksimal thumbnail bredde for bilder i et innlegg"
max_image_height: "Maksimal thumbnail høyde for bilder i et innlegg"
@@ -646,7 +653,7 @@ nb_NO:
summary_max_results: "Det maksimale antall innlegg som returneres av 'Oppsummér dette emnet'"
allow_moderators_to_create_categories: "Tillat moderatorer å opprette nye kategorier"
topics_per_period_in_top_summary: "Antall topp-emner vises som standard i oppsummeringen av topp-emner."
- show_email_on_profile: "Vis brukerens e-postadresse i profilen (kun synlig for brukeren selv og forum staff)"
+ show_email_on_profile: "Vis brukerens e-postadresse i profilen (kun synlig for brukeren selv og forumstaben)"
email_token_valid_hours: "Glemt passord / aktiver konto tokens er gyldig for (n) timer."
enable_badges: "Aktiver badge system"
log_out_strict: "Ved utlogging, logg ut av ALLE enheter som er pålogget"
@@ -672,10 +679,20 @@ nb_NO:
allow_profile_backgrounds: "Gi brukere mulighet til å laste opp profilbakgrunner."
enable_mobile_theme: "Mobilenheter bruker et mobilvennlig tema, med muligheten til å gå til den fulle siden. Deaktiver dette hvis du ønsker å bruke et tilpasset stilark."
dominating_topic_minimum_percent: "Hvor mange innlegg en bruker kan lage innenfor en topic før de blir påminnet om dominering av en topic."
+ automatically_unpin_topics: "Automatisk fjern feste for emner når brukeren når bunnen."
enable_emoji: "Aktiver emoji."
emoji_set: "Hvordan vil du ha din emoji?"
default_email_digest_frequency: "Standardinnstillingen for hvor ofte brukere mottar oppsummerings-eposter"
default_include_tl0_in_digests: "La det være standardinnsillingen å inkluder innlegg fra nye brukere i oppsummerings-eposter. Brukere kan endre dette i preferansene sine."
+ default_email_mailing_list_mode_frequency: "Brukere som slår på e-postlistemodus, vil motta e-poster så ofte som standard"
+ disable_mailing_list_mode: "Forby brukere å slå på e-postlistemodus"
+ default_email_previous_replies: "Inkludér tidligere svar i e-poster som standard."
+ default_topics_automatic_unpin: "Automatisk fjern feste for emner når brukeren når bunnen som standard."
+ default_categories_watching: "Liste med kategorier som følges som standard"
+ default_categories_tracking: "Liste med kategorier som overvåkes som standard"
+ default_categories_muted: "Liste med kategorier som blir dempet som standard"
+ default_categories_watching_first_post: "Liste med kategorier hvor det første innlegget i hvert nye emner følges som standard."
+ remove_muted_tags_from_latest: "Ikke vis emner med dempede stikkord i listen med siste emner."
errors:
invalid_email: "Ugyldig e-mail adresse"
invalid_string: "Ugyldig verdi"
@@ -712,10 +729,10 @@ nb_NO:
other: "Dette emnet ble automatisk lukket %{count} minutter etter siste innlegg. Emnet kan ikke lenger svares på. "
autoclosed_disabled: "Dette emnet er nå åpent. Emnet kan svares på. "
autoclosed_disabled_lastpost: "Dette emnet er åpnet. Nye svar er tillatt."
- pinned_enabled: "Dette emnet er nå fastsatt. Det vil vises i toppen av sin kategori og alle emne lister frem til en administrator, for alle, eller brukerne for dem selv løsgjør emnet. "
- pinned_disabled: "Dette emnet er ikke lenger fastsatt. Det vil ikke lenger vises i toppen av sin kategori."
- pinned_globally_enabled: "Dette emnet er nå fastsatt globalt. Det vil vises i toppen av sin kategori og alle emne lister frem til administrator, for alle, eller brukerne for dem selv løsgjør emnet. "
- pinned_globally_disabled: "Dette emnet er ikke lenger fastsatt. Det vil ikke lenger vises i toppen av sin kategori."
+ pinned_enabled: "Dette emnet er nå festet. Det vil vises i toppen av sin kategori inntil festet fjernes av en administrator eller av enkeltbrukere for seg selv."
+ pinned_disabled: "Dette emnet er ikke lenger festet. Det vil ikke lenger vises i toppen av sin kategori."
+ pinned_globally_enabled: "Dette emnet er nå festet globalt. Det vil vises i toppen av sin kategori og alle emne lister inntil festet fjernes for alle av staben, eller for enkelte brukere av dem selv."
+ pinned_globally_disabled: "Dette emnet er ikke lenger festet. Det vil ikke lenger vises i toppen av sin kategori."
visible_enabled: "Dette emnet er nå listet. Det vil vises i emne listene. "
visible_disabled: "Dette ement er ikke lenger listet. Det vil ikke lenger bli vist i noen av emnelistene. Den eneste måten å få tilgang til dette emnet er via en direkte link. "
login:
@@ -753,6 +770,10 @@ nb_NO:
subject_template: "Ny konto på vent"
too_many_tl3_flags:
subject_template: "Ny konto på vent"
+ unsubscribe_mailing_list: |
+ Du mottar dette fordi du har slått på e-postlistemodus.
+
+ For å melde deg av disse e-postene [klikk her](%{unsubscribe_url}).
user_notifications:
digest:
why: "Dette har skjedd på %{site_link} siden ditt forrige besøk %{last_seen_at}"
@@ -770,7 +791,7 @@ nb_NO:
preheader: "En kort oppsummering siden ditt siste besøk på %{last_seen_at}"
mailing_list:
subject_template: "[%{site_name}] Oppsummering for %{date}"
- unsubscribe: "Denne oppsummeringen sendes daglig fordi e-postliste-modus er aktivert. For å melde deg deg av %{unsubscribe_link}."
+ unsubscribe: "Denne oppsummeringen sendes daglig fordi e-postlistemodus er aktivert. For å melde deg deg av %{unsubscribe_link}."
from: "%{site_name}-oppsummering"
new_topics: "Nye emner"
account_created:
diff --git a/config/locales/server.nl.yml b/config/locales/server.nl.yml
index 166ed34cb6..3dd6a3a8cb 100644
--- a/config/locales/server.nl.yml
+++ b/config/locales/server.nl.yml
@@ -71,6 +71,7 @@ nl:
has_already_been_used: "is al gebruikt"
inclusion: komt niet voor in de lijst
invalid: is ongeldig
+ is_invalid: "lijkt onduidelijk, is het een volledige zin?"
less_than: moet minder zijn dan %{count}
less_than_or_equal_to: moet minder zijn dan of gelijk zijn aan %{count}
not_a_number: is niet een getal
@@ -105,11 +106,13 @@ nl:
default_categories_already_selected: "Je kan geen categorie selecteren die wordt gebruikt in een andere lijst."
s3_upload_bucket_is_required: "U kunt niet de uploads van de S3 toestaan totdat u de 's3_upload_bucket' hebt verleend."
bulk_invite:
- file_should_be_csv: "Het bestand moet in csv- of txt-formaat zijn."
+ file_should_be_csv: "Het geüploade bestand moet in csv-formaat zijn."
+ error: "Er trad een fout op tijdens het uploaden van dat bestand. Probeer het later nog eens."
backup:
operation_already_running: "Er wordt al een opdracht uitgevoerd. Kan nu niet een nieuwe opdracht starten."
backup_file_should_be_tar_gz: "Het backupbestand moet een .tar.gz archief zijn."
not_enough_space_on_disk: "Er is niet voldoende ruimte op de schijf vrij om deze backup te uploaden."
+ invalid_filename: "De naam van het backup-bestand bevat ongeldige tekens. Geldige tekens zijn a-z 0-9 . - _."
not_logged_in: "Om dat te kunnen doen moet je ingelogd zijn."
not_found: "De opgevraagde URL of resource kan niet gevonden worden."
invalid_access: "Je hebt geen permissie om de opgevraagde resource te bekijken."
@@ -157,6 +160,7 @@ nl:
topic_not_found: "Er is iets fout gegaan. Wellicht is het topic gesloten of verwijderd terwijl je er naar keek?"
just_posted_that: "lijkt teveel op het bericht dat je net geschreven hebt"
invalid_characters: "bevat ongeldige tekens"
+ is_invalid: "lijkt onduidelijk, is het een volledige zin?"
next_page: "volgende pagina →"
prev_page: "← vorige pagina"
page_num: "Pagina %{num}"
@@ -267,6 +271,7 @@ nl:
name: "Naam categorie"
topic:
title: 'Titel'
+ featured_link: 'Uitgelichte link'
post:
raw: "Inhoud"
user_profile:
@@ -280,18 +285,29 @@ nl:
too_many_users: "Je kunt een waarschuwing per keer slechts naar één ander lid sturen."
cant_send_pm: "Sorry, je kan geen privébericht sturen naar deze persoon."
no_user_selected: "Je moet een geldige gebruiker selecteren."
+ featured_link:
+ invalid: "is ongeldig. URL moet http:// of https:// bevatten."
+ invalid_category: "kan niet worden gewijzigd in deze categorie."
user:
attributes:
password:
common: "is een van de 10000 meest gebruikte wachtwoorden. Gebruik een veiliger wachtwoord."
same_as_username: "is hetzelfde als je gebruikersnaam. Gebruik een veiliger wachtwoord."
same_as_email: "is hetzelfde als je e-mailadres. Gebruik een veiliger wachtwoord."
+ same_as_current: "is hetzelfde als je huidige wachtwoord."
ip_address:
signup_not_allowed: "Inschrijven vanaf dit account is niet toegestaan."
color_scheme_color:
attributes:
hex:
invalid: "is niet een geldige kleur"
+ post_reply:
+ base:
+ different_topic: "Het bericht en antwoord moeten bij hetzelfde topic horen."
+ web_hook:
+ attributes:
+ payload_url:
+ invalid: "De URL is ongeldig. URL's moeten http:// of https:// bevatten. En een leeg veld is niet toegestaan."
<<: *errors
user_profile:
no_info_me: ""
@@ -468,6 +484,7 @@ nl:
please_continue: "Ga verder naar %{site_name}"
error: "Er ging iets mis bij het wijzigen van je e-mailadres. Wellicht is deze al in gebruik?"
error_staged: "Er ging iets mis bij het wijzigen van je e-mailadres. Het adres is reeds in gebruik door een staged gebruiker."
+ already_done: "Sorry, de bevestigingslink is niet langer geldig. Misschien is je e-mail al veranderd?"
authorizing_old:
title: "Dank voor het bevestigen van je e-mailadres"
description: "We sturen nu ter bevestiging een e-mail naar je nieuwe adres."
@@ -478,6 +495,7 @@ nl:
continue_button: "Ga verder naar %{site_name}"
welcome_to: "Welkom bij %{site_name}!"
approval_required: "Een moderator moet je nieuwe account handmatig activeren voordat je toegang krijgt tot dit forum. Je krijgt een e-mail van ons wanneer je account is goedgekeurd!"
+ missing_session: "We kunnen niet vaststellen of je account is aangemaakt, wees er alsjeblieft zeker van dat je cookies accepteert."
post_action_types:
off_topic:
title: 'Off-topic'
@@ -517,6 +535,9 @@ nl:
title: 'Stem'
description: 'Stem op dit bericht'
long_form: 'heeft op dit bericht gestemd'
+ user_activity:
+ no_bookmarks:
+ self: "Je hebt geen favoriete berichten, als favoriet gemarkeerde berichten kun je later makkelijk terugvinden."
topic_flag_types:
spam:
title: 'Spam'
@@ -631,19 +652,27 @@ nl:
page_view_anon_reqs:
title: "Anoniem"
xaxis: "Dag"
+ yaxis: "Anonieme paginaweergaven"
page_view_logged_in_reqs:
title: "Ingelogd"
xaxis: "Dag"
+ yaxis: "Ingelogde paginaweergaven"
page_view_crawler_reqs:
title: "Web Crawlers"
xaxis: "Dag"
+ yaxis: "Web Crawler paginaweergaven"
page_view_total_reqs:
title: "Totaal"
xaxis: "Dag"
+ yaxis: "Totaal paginaweergaven"
page_view_logged_in_mobile_reqs:
+ title: "Ingelogde paginaweergaven"
xaxis: "Dag"
+ yaxis: "Mobiele ingelogde paginaweergaven"
page_view_anon_mobile_reqs:
+ title: "Anonieme paginaweergaven"
xaxis: "Dag"
+ yaxis: "Mobiele anonieme paginaweergaven"
http_background_reqs:
title: "Achtergrond"
xaxis: "Dag"
@@ -789,9 +818,7 @@ nl:
top_page_default_timeframe: "Standaard tijdspanne voor de top overzicht pagina."
show_email_on_profile: "Laat e-mail van gebruikers zien in hun profiel (alleen zichtbaar voor henzelf en staf)"
email_token_valid_hours: "Wachtwoord vergeten / activeer account tokens zijn (n) uur geldig."
- email_token_grace_period_hours: "Wachtwoord vergeten / activeer account tokens zijn nog geldig gedurende een respijtperiode van (n) uur na het benutten."
enable_badges: "Activeer het badgesysteem"
- enable_whispers: "Sta private communicatie tussen medewerkers toe in een topic. (experimenteel)"
allow_index_in_robots_txt: "Specificeer in robots.txt dat de site geïndexeerd mag worden door zoekmachines."
email_domains_blacklist: "Een lijst van e-maildomeinen gescheiden door een vertikaal streepje (pipe), die niet worden toegestaan. Voorbeeld: mailingen.com|trashmail.net"
email_domains_whitelist: "Een lijst van e-maildomeinen gescheiden door een vertikaal streepje (pipe), die zijn voorgeschreven om te worden toegelaten. WAARSCHUWING: Gebruikers met andere e-maildomeinen dan opgenomen in de lijst worden NIET toegelaten."
@@ -1018,7 +1045,6 @@ nl:
embed_whitelist_selector: "CSS-selector voor de elementen die zijn toegestaan in invoegberichten."
embed_blacklist_selector: "CSS-selector voor de elementen die zijn verwijderd uit invoegberichten."
notify_about_flags_after: "Als er vlaggen zijn die nog niet zijn afgehandeld na dit aantal uren, stuur dan een e-mail naar de contact_email. Zet op 0 om uit te schakelen."
- enable_cdn_js_debugging: "Laat /logs juiste errors weergeven door crossorigin toestemmingen toe te voegen op alle js includes."
show_create_topics_notice: "Als de site minder dan 5 publieke topics heeft, toon dan een melding waarin admins gevraagd wordt om een aantal topics te creëren."
delete_drafts_older_than_n_days: Verwijder concepten ouder dan (n) dagen.
prevent_anons_from_downloading_files: "Voorkom dat anonieme gebruikers bijlagen mogen downloaden. WAARSCHUWING: hierdoor zullen website onderdelen, anders dan afbeeldingen, die zijn gepost als bijlage niet langer werken."
@@ -1496,6 +1522,15 @@ nl:
initial_topic_title: Performancerapportages van de website
topic_invite:
user_exists: "Sorry, die gebruiker is al uitgenodigd. Je kan een gebruiker maar een keer voor een topic uitnodigen."
+ wizard:
+ step:
+ invites:
+ description: "Je bent bijna klaar! Nodig wat stafleden uit om te helpen met het starten van discussies met interessante topics en berichten om je gemeenschap op te zetten."
+ finished:
+ title: "Je Discourse staat klaar!"
+ description: |
+ Als je deze instellingen ooit aan wilt passen, bezoek dan je beheerafdeling; vind het naast het moersleutelicoon in het sitemenu.
+ Veel plezier, en succes met het opbouwen van je nieuwe gemeenschap!
activemodel:
errors:
<<: *errors
diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml
index 4f42ba8c4c..15420b3d85 100644
--- a/config/locales/server.pl_PL.yml
+++ b/config/locales/server.pl_PL.yml
@@ -15,6 +15,7 @@ pl_PL:
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, Styczeń, Luty, Marzec, Kwiecień, Maj, Czerwiec, Lipiec, Sierpień, Wrzesień, Październik, Listopad, Grudzień]
<<: *datetime_formats
@@ -28,13 +29,16 @@ pl_PL:
loading: "Ładowanie"
powered_by_html: 'Zasilane przez Discourse, najlepiej oglądać z włączonym JavaScriptem'
log_in: "Logowanie"
+ purge_reason: "Automatycznie usunięte jako porzucone, dezaktywowane konto."
disable_remote_images_download_reason: "Pobieranie zewnętrznych grafik zostało wyłączone z uwagi na niską ilość wolnego miejsca na dysku."
anonymous: "Anonim"
emails:
incoming:
default_subject: "Przychodzący email od %{email}"
show_trimmed_content: "Pokaż skróconą zawartość"
+ maximum_staged_user_per_email_reached: "Osiągnięto maksymalną ilość użytkowników zarejestrowanych przez email."
errors:
+ empty_email_error: "Zdarza się kiedy mail jaki dostaliśmy jest pusty."
no_message_id_error: "Zdarza się kiedy email nie posiada nagłówka 'Message-Id'."
inactive_user_error: "Zdarza się kiedy nadawca jest nie aktywny."
blocked_user_error: "Zdarza się kiedy nadawca jest zablokowany."
@@ -95,11 +99,13 @@ pl_PL:
default_categories_already_selected: "Nie możesz wybrać kategorii użytej w innej liście."
s3_upload_bucket_is_required: "Nie możesz wysyłać na S3 jeżeli nie podasz 's3_upload_bucket'."
bulk_invite:
- file_should_be_csv: "Wysłany plik powinien być w formacie CSV lub TXT."
+ file_should_be_csv: "Wgrywany plik powinien być formatu csv."
+ error: "Wystąpił błąd podczas wgrywania tego pliku. Spróbuj ponownie później."
backup:
operation_already_running: "Operacja jest już uruchomiona. Nie można teraz utworzyć nowej."
backup_file_should_be_tar_gz: "Plik z kopią zapasową powinien mieć postać archiwum .tar.gz."
not_enough_space_on_disk: "Nie ma wystarczającej ilości wolnego miejsca, aby wczytać tę kopię zapasową."
+ invalid_filename: "Plik kopii zapasowej zawiera nieprawidłowe znaki. Nieprawidłowe znaki to a-z 0-9 . - _."
not_logged_in: "Aby to zrobić musisz się zalogować."
not_found: "Żądany URL lub źródło nie mógł zostać znaleziony."
invalid_access: "Nie jesteś uprawniony, by zobaczyć żądane źródło."
@@ -248,6 +254,7 @@ pl_PL:
name: "Nazwa kategorii"
topic:
title: 'Tytuł'
+ featured_link: 'Polecany link'
post:
raw: "Treść"
user_profile:
@@ -261,12 +268,16 @@ pl_PL:
too_many_users: "Jedno ostrzeżenie możesz wysłać tylko do pojedynczego użytkownika."
cant_send_pm: "Przepraszamy, niestety nie możesz wysłać prywatnej wiadomości temu użytkownikowi."
no_user_selected: "Musisz wybrać poprawnego użytkownika,"
+ featured_link:
+ invalid: "Link jest nieprawidłowy, powinien zawierać http:// lub https://."
+ invalid_category: "nie może być edytowany w tej kategorii."
user:
attributes:
password:
common: "jest jednym z 10000 najczęściej używanych haseł. Wybierz inne, bardziej bezpieczne hasło."
same_as_username: "jest takie same jak Twoja nazwa użytkownika. Proszę użyj bardziej bezpiecznego hasła. "
same_as_email: "jest takie same jak Twój email. Proszę użyj bardziej bezpiecznego hasła. "
+ same_as_current: "Hasło jest takie same jak aktualne."
ip_address:
signup_not_allowed: "Rejestracja z tego konta jest niemożliwa."
color_scheme_color:
@@ -276,6 +287,10 @@ pl_PL:
post_reply:
base:
different_topic: "Wpis i odpowiedź muszą należeć do tego samego tematu."
+ web_hook:
+ attributes:
+ payload_url:
+ invalid: "Link jest nieprawidłowy, powinien zawierać http:// lub https://. Puste pole jest niedozwolone."
<<: *errors
user_profile:
no_info_me: ""
@@ -334,6 +349,8 @@ pl_PL:
title: "początkujący"
member:
title: "uczestnik"
+ regular:
+ title: "zwyczajny"
leader:
title: "lider"
change_failed_explanation: "Twoja próba obniżenia poziomu %{user_name} do '%{new_trust_level}' była nieudana. Ten użytkownik posiada już poziom '%{current_trust_level}'. %{user_name} pozostanie na poziomie '%{current_trust_level}' - jeśli chcesz to zmienić, najpierw zablokuj poziom zaufania temu użytkownikowi."
@@ -515,6 +532,12 @@ pl_PL:
title: 'Głosuj'
description: 'Głosuj za tym wpisem'
long_form: 'zagłosowano za tym wpisem'
+ user_activity:
+ no_bookmarks:
+ others: "Brak zakładek."
+ no_likes_given:
+ self: "Nie masz lajkowanych postów."
+ others: "Brak lajkowanych postów."
topic_flag_types:
spam:
title: 'Spam'
@@ -540,6 +563,8 @@ pl_PL:
message:
make: "Ten temat został ustawiony jako baner. Będzie pojawiać się na górze każdej strony do czasu zamknięcia przez użytkownika."
remove: "Ten temat nie jest już banerem. Nie będzie pojawiać się na górze każdej strony."
+ unsubscribed:
+ title: "Od subskrybuj!"
unsubscribe:
title: "Wypisz"
stop_watching_topic: "Przestań obserwować ten temat, %{link}"
@@ -550,8 +575,16 @@ pl_PL:
log_out: "Wyloguj"
user_api_key:
title: "Zezwolić na dostęp aplikacji"
+ authorize: "Autoryzuj"
read: "odczyt"
read_write: "odzczyt/zapis"
+ scopes:
+ message_bus: "Aktualizacje"
+ notifications: "Przeczytaj i wyczyść powiadomienia"
+ push: "Powiadomienia push dla zewnętrznych usług"
+ session_info: "Czytaj informację o sesji użytkowników"
+ read: "Czytaj wszystko."
+ write: "Zapisz wszystko"
reports:
visits:
title: "Wizyty użytkowników"
@@ -635,19 +668,27 @@ pl_PL:
page_view_anon_reqs:
title: "Anonimowy"
xaxis: "Dzień"
+ yaxis: "Anonimowe odsłony"
page_view_logged_in_reqs:
title: "Zalogowany"
xaxis: "Dzień"
+ yaxis: "Zalogowane odsłony"
page_view_crawler_reqs:
title: "Bot indeksujący"
xaxis: "Dzień"
+ yaxis: "Odsłony botów indeksujących"
page_view_total_reqs:
title: "Łącznie"
xaxis: "Dzień"
+ yaxis: "Wszystkie odsłony"
page_view_logged_in_mobile_reqs:
+ title: "Zalogowane odsłony"
xaxis: "Dzień"
+ yaxis: "Odsłony użytkowników mobilnych"
page_view_anon_mobile_reqs:
+ title: "Anonimowe odsłony"
xaxis: "Dzień"
+ yaxis: "Odsłony anonimowych użytkowników mobilnych"
http_background_reqs:
title: "Tło"
xaxis: "Dzień"
@@ -707,10 +748,14 @@ pl_PL:
min_first_post_length: "Minimalna długość treści (liczba znaków) pierwszego wpisu w temacie "
min_private_message_post_length: "Minimalna długość treści wiadomości "
max_post_length: "Maksymalna długość wpisu, w znakach"
+ topic_featured_link_enabled: "Włącz dodawanie linków w tematach."
+ show_topic_featured_link_in_digest: "Pokazuj polecany link tematu w podsumowaniu mailowym."
min_topic_title_length: "Minimalna długość tytułu tematu, w znakach"
max_topic_title_length: "Maksymalna długość tytułu tematu, w znakach"
min_private_message_title_length: "Minimalna liczba znaków w temacie wiadomości "
min_search_term_length: "Minimalna długość wyszukiwanego tekstu, w znakach"
+ search_prefer_recent_posts: "Jeśli wyszukiwanie na twoim duży forum jest wolne, ta opcja pozwala zaindeskować ostanie posty wpierw."
+ search_recent_posts_size: "Jak dużo ostanich postów trzymać w indexie"
allow_uncategorized_topics: "Zezwól na tworzenie tematów bez kategorii. UWAGA: jeśli jest jakiś nieskategoryzowany temat, musisz go przypisać do kategorii, zanim wyłączysz tę opcję."
allow_duplicate_topic_titles: "Pozwól na tworzenie tematów o identycznych tytułach."
unique_posts_mins: "Ile minut musi upłynąć zanim użytkownik będzie mógł ponownie zrobić wpis z tą samą treścią"
@@ -736,6 +781,7 @@ pl_PL:
fixed_category_positions_on_create: "Jeżeli jest sprawdzone to porządkowanie kategorii będzie zależało od stworzonego tematu (requires fixed_category_positions). "
post_excerpt_maxlength: "Maksymalna długość podsumowania / streszczenia wpisu."
post_onebox_maxlength: "Maksymalna długość (ilość znaków) treści wpisu osadzonego via Onebox"
+ max_oneboxes_per_post: "Masymalna ilość oneboxów w poście."
logo_url: "Zdjęcie logo w lewym górnym rogu twojej strony powinno mieć kształt szerokiego prostokąta. Jeśli zostawisz miejsce puste, wyświetlany będzie tytuł strony."
apple_touch_icon_url: "Ikona używana przez urządzenia Apple. Rekomendowany wymiar to 144px na 144px."
notification_email: "Adres z którego wysyłane będą wszystkie istotne emaile systemowe.\nKonieczna jest poprawna konfiguracja rekordów SPF, DKIM oraz zwrotnego PTR użytej domeny."
@@ -768,6 +814,7 @@ pl_PL:
show_email_on_profile: "Pokazuj email użytkownika w jego profilu (widoczny jedynie dla użytkownika i personelu)."
email_token_valid_hours: "Tokeny resetujące hasło / aktywujące konto są ważne przez (n) godzin."
enable_badges: "Włącz system odznak"
+ enable_whispers: "Pozwalaj administracji na prywatną rozmowę w tematach."
log_out_strict: "Po wylogowaniu wyloguj WSZYSTKIE sesje użytkownika na wszystkich urządzeniach."
port: "OSTRZEŻENIE! Tylko dla Developera! Użyj ten port HTTP zamiast domyślnego portu 80. Pozostaw puste pole, domyślnie port 80"
force_hostname: "OSTRZEŻENIE! Tylko dla Developera! Określ nazwę hosta w adresie URL. Pozostaw domyślnie puste."
@@ -872,6 +919,8 @@ pl_PL:
default_other_external_links_in_new_tab: "Otwórz linki zewnętrzne w nowej karcie domyślnie."
default_categories_watching: "Lista kategorii obserwowanych domyślnie."
default_categories_tracking: "Lista kategorii śledzonych domyślnie."
+ company_short_name: "Nazwa firmy (skrócona)"
+ company_full_name: "Nazwa firmy (pełna)"
errors:
invalid_email: "Nieprawidłowy adres email."
invalid_username: "Użytkownik o takiej nazwie nie istnieje."
@@ -1056,6 +1105,12 @@ pl_PL:
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."
+ too_many_spam_flags:
+ subject_template: "Nowe konto zawieszone"
+ too_many_tl3_flags:
+ subject_template: "Nowe konto zawieszone"
+ blocked_by_staff:
+ subject_template: "Konto tymczasowo zawieszone"
pending_users_reminder:
subject_template:
one: "1 użytkownik czeka na zatwierdzenie"
@@ -1080,7 +1135,23 @@ pl_PL:
user_posted_pm:
subject_template: "[%{site_name}] [PW] %{topic_title}"
digest:
+ new_topics: "Nowe tematy"
+ new_posts: "Nowe wpisy"
+ new_users: "Nowi użytkownicy"
+ popular_topics: "Popularne tematy"
+ follow_topic: "Śledź ten temat"
+ join_the_discussion: "Czytaj więcej"
+ popular_posts: "Popularne wpisy"
+ from_topic_label: "Od"
+ subject_template: "%{site_name} Podsumowanie"
click_here: "kliknij tutaj"
+ from: "%{site_name} podsumowanie"
+ mailing_list:
+ from: "%{site_name} podsumowanie"
+ new_topics: "Nowe tematy"
+ topic_updates: "Aktualizacje tematu"
+ view_this_topic: "Zobacz ten temat"
+ back_to_top: "Powrót do góry"
forgot_password:
subject_template: "[%{site_name}] Reset hasła"
text_body_template: |
@@ -1106,6 +1177,8 @@ pl_PL:
Kliknij na linku poniżej, aby ustawić swoje hasło:
%{base_url}/users/password-reset/%{email_token}
+ confirm_old_email:
+ subject_template: "[%{site_name}] Potwierdź aktualny adres email"
signup_after_approval:
subject_template: "Zostałeś zaakceptowany na forum %{site_name}!"
text_body_template: |+
@@ -1136,6 +1209,7 @@ pl_PL:
Jeśli powyższy link nie jest klikalny, spróbuj skopiować i wkleić go do pasku adresu Twojej przeglądarki.
page_not_found:
+ title: "Ups! Ta strona nie istnieje lub jest prywatna."
popular_topics: "Popularne"
recent_topics: "Ostatnie"
see_more: "Więcej"
@@ -1155,15 +1229,19 @@ pl_PL:
edit_reason: "lokalne kopie pobranych obrazów"
unauthorized: "Sorry, the file you are trying to upload is not authorized (authorized extensions: %{authorized_extensions})."
pasted_image_filename: "Wklejone zdjęcie"
+ file_missing: "Przepraszamy, należy podać plik do przesłania."
images:
size_not_found: "Przepraszamy, ale nie udało się ustalić rozmiaru obrazu. Może twój obraz jest uszkodzony?"
email_log:
no_user: "Nie można znaleźć użytkownika z ID %{user_id}"
+ anonymous_user: "Użytkownik anonimowy"
post_deleted: "Wpis został usunięty przez autora"
user_suspended: "użytkownik został zawieszony"
already_read: "użytkownik przeczytał ten post"
+ message_blank: "wiadomość jest pusta"
color_schemes:
base_theme_name: "Podstawa"
+ about: "O stronie"
guidelines: "Przewodnik"
privacy: "Prywatność"
edit_this_page: "Edytuj tę stronę"
@@ -1178,6 +1256,13 @@ pl_PL:
title: "Warunki użytkowania"
privacy_topic:
title: "Polityka prywatności"
+ badges:
+ first_mention:
+ name: Pierwsze Wspomnienie
+ first_onebox:
+ name: Pierwszy Onebox
+ first_reply_by_email:
+ name: Pierwsza Odpowiedz przez Email
admin_login:
success: "Email wysłany"
error: "Błąd!"
@@ -1188,6 +1273,85 @@ pl_PL:
performance_report:
initial_post_raw: 'Ten temat zawiera codzienne raporty wydajności dla twojej witryny. '
initial_topic_title: 'Testy wydajności witryny. '
+ safe_mode:
+ no_customizations: "Wyłącz własną personalizację strony"
+ only_official: "Wyłącz nieoficjalne wtyczki"
+ no_plugins: "Wyłącz wszystkie wtyczki"
+ enter: "Włącz Tryb Bezpieczny"
+ wizard:
+ title: "Instalacja Discourse"
+ step:
+ forum_title:
+ title: "Imię"
+ privacy:
+ title: "Dostęp"
+ fields:
+ privacy:
+ choices:
+ open:
+ label: "Publiczne"
+ description: "Wszyscy mają dostęp do społeczności, mogą się rejestrować aby zakładać konta"
+ restricted:
+ label: "Prywatne"
+ description: "Tylko osoby zaproszone mają dostęp do społeczności"
+ contact:
+ title: "Dane kontaktowe"
+ fields:
+ contact_email:
+ label: "E-mail"
+ placeholder: "name@example.com"
+ contact_url:
+ label: "Strona kontaktowa"
+ site_contact:
+ label: "Automatyczne wiadomości"
+ corporate:
+ title: "Organizacja"
+ fields:
+ company_short_name:
+ label: "Nazwa organizacji (krótka)"
+ placeholder: "Initech"
+ company_full_name:
+ label: "Nazwa organizacji (pełna)"
+ placeholder: "Initech, Inc."
+ company_domain:
+ label: "Domena Organizacji"
+ placeholder: "initech.com"
+ colors:
+ title: "Motyw"
+ fields:
+ theme_id:
+ choices:
+ default:
+ label: "Prosty Jasny"
+ dark:
+ label: "Prosty Ciemny"
+ logos:
+ title: "Loga"
+ fields:
+ logo_url:
+ label: "Podstawowe logo"
+ icons:
+ title: "Ikony"
+ fields:
+ favicon_url:
+ label: "Mała ikona"
+ apple_touch_icon_url:
+ label: "Duża ikona"
+ homepage:
+ title: "Strona Główna"
+ fields:
+ homepage_style:
+ choices:
+ latest:
+ label: "Ostatnie Tematy"
+ categories:
+ label: "Kategorie"
+ emoji:
+ title: "Emotikony"
+ invites:
+ title: "Zaproś administrację"
+ finished:
+ title: "Twój Discourse jest Gotowy!"
activemodel:
errors:
<<: *errors
diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml
index 51436d2711..7db79a95b7 100644
--- a/config/locales/server.pt.yml
+++ b/config/locales/server.pt.yml
@@ -106,7 +106,8 @@ pt:
default_categories_already_selected: "Não pode selecionar uma categoria usada noutra lista."
s3_upload_bucket_is_required: "Não pode ativar carregamentos para o S3 excepto se tiver fornecido o 's3_upload_bucket'."
bulk_invite:
- file_should_be_csv: "O ficheiro a carregar deve estar em formato csv ou txt."
+ file_should_be_csv: "O ficheiro carregado deve ser do formato CSV."
+ error: "Ocorreu um erro ao carregar esse ficheiro. Por favor tente mais tarde."
backup:
operation_already_running: "Existe atualmente uma operação em execução. Neste momento não é possível iniciar um novo trabalho. "
backup_file_should_be_tar_gz: "O ficheiro da cópia de segurança deve ser um arquivo .tar.gz"
@@ -272,6 +273,7 @@ pt:
name: "Nome da Categoria"
topic:
title: 'Título'
+ featured_link: 'Ligação Destacada'
post:
raw: "Corpo"
user_profile:
@@ -285,6 +287,9 @@ pt:
too_many_users: "Apenas pode enviar avisos a um utilizador de cada vez."
cant_send_pm: "Pedimos desculpa, não pode enviar uma mensagem privada a esse utilizador."
no_user_selected: "Tem que selecionar um utilizador válido."
+ featured_link:
+ invalid: "é inválida. URL deve incluir http:// ou https://."
+ invalid_category: "não pode ser editada nesta categoria."
user:
attributes:
password:
@@ -771,6 +776,8 @@ pt:
min_first_post_length: "Tamanho mínimo permitido para a primeira mensagem (corpo do tópico), em caracteres"
min_private_message_post_length: "Tamanho mínimo permitido para mensagens, em caracteres"
max_post_length: "Tamanho máximo permitido por mensagem, em caracteres"
+ topic_featured_link_enabled: "Permitir publicar uma ligação com tópicos."
+ show_topic_featured_link_in_digest: "Mostrar a ligação destacada do tópico no email de resumo."
min_topic_title_length: "Tamanho mínimo permitido por título de cada tópico, em caracteres"
max_topic_title_length: "Tamanho máximo permitido por título de cada tópico, em caracteres"
min_private_message_title_length: "Tamanho mínimo permitido por título nas mensagens, em caracteres"
@@ -879,9 +886,8 @@ pt:
show_email_on_profile: "Mostrar o email do utilizador no seu perfil (apenas visível para si próprio e para o pessoal)"
prioritize_username_in_ux: "Mostrar o nome de utilizador primeiro na página de utilizador, cartão de utilizador e publicações (quando o nome desactivado é mostrado primeiro)"
email_token_valid_hours: "Os símbolos para palavra-passe esquecida /conta ativada são válidos por (n) horas."
- email_token_grace_period_hours: "Os símbolos para palavra-passe esquecida /conta ativada são válidos por um período de carência de (n) horas após serem recuperados"
enable_badges: "Ativar o sistema de distintivos"
- enable_whispers: "Permitir comunicação privada do pessoal dentro de tópico (experimental)"
+ enable_whispers: "Permitir à equipa de apio comunicar de forma privada dentro de tópicos."
allow_index_in_robots_txt: "Especificar em robots.txt que este sítio permite ser indexado pelos motores de pesquisa."
email_domains_blacklist: "Lista de domínios de email que os utilizadores não podem usar para registo de contas. Exemplo: mailinator.com|trashmail.net"
email_domains_whitelist: "Lista de domínios de email que os utilizadores DEVEM usar para registar contas. AVISO: Utilizadores com domínios de email diferentes dos listados não serão permitidos!"
@@ -1181,7 +1187,6 @@ pt:
embed_whitelist_selector: "Seletor CSS para elementos permitidos em incorporações."
embed_blacklist_selector: "Seletor CSS para elementos que foram removidos de incorporações."
notify_about_flags_after: "Se houver sinalizações que não tenham sido tratadas após tantas horas, envie um email para 'contact_email'. Configurar a 0 para desativar."
- enable_cdn_js_debugging: "Permitir que /logs exiba erros próprios ao adicionar permissões de origem-cruzada em todos os js incluídos."
show_create_topics_notice: "Se o sítio tem menos de 5 tópicos públicos, mostrar um aviso pedindo aos administradores a criação de mais tópicos."
delete_drafts_older_than_n_days: Eliminar rascunhos mais antigos que (n) days.
bootstrap_mode_min_users: "Número mínimo de utilizadores necessários para desactivar o modo de inicialização (coloque 0 para desactivar)"
@@ -1596,99 +1601,6 @@ pt:
Contudo, se a publicação for ocultada pela comunidade uma segunda vez, irá manter-se ocultada até ser tratada pelo pessoal – e poderão ocorrer outras medidas, incluindo uma possível suspensão da sua conta.
Para orientação adicional, por favor consulte as [orientações da comunidade](%{base_url}/guidelines).
- usage_tips:
- text_body_template: |
- Aqui ficam algumas dicas para que possa começar:
-
- ## Leitura
-
- Para ler mais, **simplesmente continue a arrastar para baixo!**
-
- À medida que novas respostas ou novos tópicos surgem, estes irão surgir automaticamente – não é necessário atualizar a página.
-
- ## Navegação
-
- - Para pesquisar, a sua página de utilizador, ou o menu ☰, utilize **os botões-ícone no canto superior direito**.
-
- - A selecção de um título do tópico leva-o sempre para a **próxima resposta não lida** no tópico. Para entrar na parte superior ou inferior, seleccione a contagem de respostas ou última data de resposta.
-
-
-
- - Ao ler um tópico, selecione a linha do tempo à direita para saltar para o topo, fundo, ou a última posição lida. Em ecrãs mais pequenos, selecione a barra de progresso no canto inferior direito para expandi-la:
-
-
-
- Também pode premir ? no seu teclado para mostrar uma lista de atalhos de teclado super-rápidos.
-
- ## Responder
-
- Para inserir uma citação, selecione o texto que deseja citar, e de seguida prima qualquer botão de Responder para abrir o editor. Repita para múltiplas citações.
-
-
-
- Pode continuar sempre a ler enquanto compõe a sua resposta, e nós automaticamente guardamos rascunhos enquanto escreve.
-
- Para notificar alguém sobre a sua resposta, mencione o nome correspondente. Escreva `@` para começar a selecionar um nome de utilizador.
-
-
-
- Para utilizar [Emoji padrão](http://www.emoji.codes/), simplesmente digite `:` para encontrar por nome, ou as tradicionais carinhas risonhas `;)`
-
-
-
- Para gerar um sumário para uma ligação, cole-o numa linha por si só:
-
-
-
- A sua resposta pode ser formatada com HTML simplificado, BBCode ou [Markdown](http://commonmark.org/help/):
-
- Isto é negrito.
- Isto é [b]negrito[/b].
- Isto é **negrito**.
-
- Para mais dicas sobre formatação, [experimente o nosso tutorial interactivo de 10mn!](http://commonmark.org/help/tutorial/)
-
- ## Acções
-
- Existem botões de acção no final de cada publicação:
-
-
-
- - Para deixar alguém saber que desfrutou e apreciou as suas mensagens, utilize o botão **gosto**. Partilhe o amor!
-
- - Obtenha uma ligação copiável e colável para qualquer resposta ou tópico via o botão **ligação**.
-
- - Use o … botão mostrar mais para revelar mais ações. **Denuncie** para privadamente deixar o autor, ou [a nossa equipa de apoio](%{base_url}/about), saber sobre um problema. **Adicione um marcador** para encontrar esta publicação mais tarde na sua página de perfil.
-
- ## Notificações
-
- Quando alguém lhe responde, cita a sua publicação ou menciona o seu `@nome-de-utilizador`, um número irá aparecer imediatamente no canto superior direito na página. Selecione-o para aceder às suas **notificações**.
-
-
-
- Não se preocupe com perder uma resposta – irá receber por email quaisquer notificações que chegarem enquanto estiver ausente.
-
- ## Preferências
-
- - Todos os tópicos com menos de **dois dias de idade** são considerados novos.
-
- - Qualquer tópico em que tenha **participado activamente** (criado, respondido, ou lido por um período extenso) será automaticamente seguido em seu nome.
-
- Verá os indicadores numéricos de respostas novas e não lidas junto destes tópicos:
-
-
-
- Pode alterar as suas notificações para qualquer tópico através do controlo de notificações no final, e no lado direito, de cada tópico.
-
-
-
- Pode também configurar estados de notificação por categoria, se quiser vigiar ou silenciar cada novo tópico numa categoria específica.
-
- Para mudar qualquer uma destas preferências, veja [as suas preferências de utilizador](%{base_url}/my/preferences).
-
- ## Confiança da Comunidade
-
- É fantástico encontra-lo aqui! À medida que for participando aqui, iremos conhecendo-lo, e as suas limitações temporárias de novo utlizador serão levantadas. Continue a participar, e ganhará novos [níveis de confiança](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924), que incluem abilidades especiais para nos ajudar a gerir a nossa comunidade juntos.
welcome_user:
subject_template: "Bem-vindo a %{site_name}!"
text_body_template: |
diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml
index 32a34eee14..00a5249899 100644
--- a/config/locales/server.pt_BR.yml
+++ b/config/locales/server.pt_BR.yml
@@ -105,8 +105,6 @@ pt_BR:
max_username_length_range: "Você não pode definir o máximo abaixo no mínimo."
default_categories_already_selected: "Você não pode selecionar uma categoria usada noutra lista."
s3_upload_bucket_is_required: "Você não pode habilitar uploads para o S3 a não ser que tenha provido o 's3_upload_bucket'."
- bulk_invite:
- file_should_be_csv: "O arquivo enviado deve ser do formado csv ou txt."
backup:
operation_already_running: "Uma operação está sendo executada. Não é possível iniciar um novo trabalho agora."
backup_file_should_be_tar_gz: "O arquivo de backup deve ser um arquivo .tar.gz."
@@ -870,9 +868,7 @@ pt_BR:
show_email_on_profile: "Mostrar o email de um usuário em seus perfis (apenas visível a eles mesmos e staff)"
prioritize_username_in_ux: "Mostrar primeiro o nome de usuário na página do usuário, cartão do usuário e publicações (quando desabilitado, o nome será mostrado primeiro) "
email_token_valid_hours: "Tokens de Esqueceu senha / ativar conta são válidas por (n) horas."
- email_token_grace_period_hours: "Tokens de esqueceu senha / ativar conta ainda serão válidas por um período extra de (n) horas depois de serem resgatados."
enable_badges: "Habilita o sistema de emblemas"
- enable_whispers: "Permitir comunicação privativa da equipe dentro de um tópico. (experimental)"
allow_index_in_robots_txt: "Especificar no robots.txt que este site é permitido de ser indexado por sistemas de busca na web."
email_domains_blacklist: "Lista delimitada por barras (|) de domínios de email que não são permitidos registros de contas. Exemplo: mailinator.com|trashmail.net"
email_domains_whitelist: "Lista separada por barra (|) de domínios de email que usuários DEVEM usar para registrar contas. CUIDADO: Usuário com domínio de email diferentes da lista não serão permitidos!"
@@ -1107,7 +1103,6 @@ pt_BR:
embed_whitelist_selector: "Seletor CSS para os elementos que são permitidos em embeds."
embed_blacklist_selector: "Selector CSS para elementos que são removidos dos embeds."
notify_about_flags_after: "Se houver sinalizações sem ações após muitas horas, envia um e-mail para contact_email. Ajuste para 0 para desligar."
- enable_cdn_js_debugging: "Permitir /logs de mostrar os devidos erros ao adicionar permissões de crossorigin em todos os includes de js."
show_create_topics_notice: "Se o site tem menos de 5 tópicos públicos, mostrar um aviso pedindo para os administradores criarem alguns tópicos."
delete_drafts_older_than_n_days: Apagar rascunhos mais antigos do que (N) dias.
prevent_anons_from_downloading_files: "Impedir que usuários anônimos façam download de arquivos anexados. AVISO: isso irá impedir quaisquer componentes do site que não sejam imagens, tendo sido postados como anexos, de funcionar."
@@ -1304,100 +1299,6 @@ pt_BR:
deferred_and_deleted: "Obrigado por nos avisar. Nós removemos o post."
temporarily_closed_due_to_flags: "Este tópico foi temporariamente fechado devido a um grande número de sinalizações da comunidade."
system_messages:
- usage_tips:
- text_body_template: |
- Eis algumas dicas rápidas para iniciar:
-
- ## Leitura
-
- Para ler mais, **basta continuar rolando a página para baixo!**
-
- À medida que novas respostas ou tópicos forem chegando, eles irão aparecer automaticamente -- não há necessidade de refrescar a página.
-
- ## Navegação
-
- - Para fazer buscas, voltar para a sua página de usuário, ou acessar o menu ☰, use os **botões com ícone no lado superior direito**.
-
- - Selecionando o título do tópico sempre leva para a próxima **mensagem não lida** daquele tópico. Para entrar no início ou no final, selecione o contador de mensagens ou a data da última mensagem.
-
-
-
- - Enquanto estiver lendo um tópico, use a linha do tempo do lado direito para ir ao início, final ou a local da última leitura. Em telas pequenas, selecione a barra de progresso verde no canto inferior direito para acessar os controles de navegação:
-
-
-
- Você também pode selecionar a tecla ? para ver uma lista com todos os atalhos do teclado.
-
- ## Respostas
-
- Para inserir uma citação, selecione o texto desejado e pressione qualquer botão de Resposta para abrir o editor:
-
-
-
- Para citações múltiplas, repita o mesmo processo.
-
-
-
- Você pode continuar lendo enquanto compõe uma resposta. O rascunho da sua mensagem é salvo automaticamente enquanto você escreve.
-
- Para notificar alguém da sua resposta, mencione o nome da pessoa. Digite `@` para selecionar o nome de um usuário.
-
-
-
- Para usar [Emojis comuns](http://www.emoji.codes/), basta ou digitar `:` para ver a lista de opções, ou usar um dos sorrisos tradicionais `:)` :smile:
-
-
-
- Para gerar o resumo de um link, copie-o em uma linha por conta própria:
-
-
- Você pode formatar as suas respostas usando HTML simples, BBCode, ou [Markdown](http://commonmark.org/help/):
-
- Este está em negrito.
- Este está em [b]negrito[/b].
- Este está em **negrito**.
-
- Para outras dicas de formatação, [experimente os nossos tutoriais interativos de 10 minutos!](http://commonmark.org/help/tutorial/)
-
- ## Ações
-
- Há "botões de ação" embaixo de cada resposta.
-
-
-
- - Para indicar que você gostou de uma resposta, use o botão **Like** ("Curtir").
-
- - Use o botão **Link** para pegar um link direto para qualquer tópico ou resposta.
-
- - Use o botão … para revelar mais ações. O botão **Flag** notifica, de forma privada, o autor ou a [nossa equipe](%{base_url}/about), de algum problema. O **Bookmark** serve para consultar depois o tópico na sua página de usuário.
-
- ## Notificações
-
- Quando alguém responder a uma mensagem sua, citar sua mensagem, mencionar o seu `@nomedeusuário`, ou mesmo criar um link para um comentário seu, um número irá aparecer imediatamente próximo ao seu avatar no canto superior direito da página. Clique neste número para acessar as suas **notificações**.
-
-
-
- Não se preocupe se perder uma resposta – você receberá um email com as respostas (e mensagens) caso não esteja online quando elas chegarem.
-
- ## Preferências
-
- - Todos os tópicos com menos de dois dias são considerados novos.
-
- - Todos os tópicos dos quais você tenha **participado ativamente** (que tenha respondido, criado, ou lido por um certo tempo) serão automaticamente rastreados para você.
-
- Você irá ver números indicando respostas novas e não lidas próximos a estes tópicos:
-
-
-
- Você pode mudar as notificações de qualquer tópico por meio do controle de notificações que fica embaixo, no lado direito de cada tópico.
-
-
-
- Você também pode configurar as notificações por categoria. Para mudar as configurações, veja as [suas preferências de usuário](%{base_url}/my/preferences).
-
- ## Níveis de Confiança Comunitária
-
- É um prazer conhecer você! Conforme for participando, irá ganhando confiança da comunidade e as suas restrições de usuário novato serão removidas automaticamente. Ao atingir [níveis de confiança](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) mais altos, você ganhará habilidades especiais que lhe permitirão ajudar a gerenciar a comunidade junto conosco.
welcome_user:
subject_template: "Bem-vindo ao %{site_name}!"
text_body_template: |
diff --git a/config/locales/server.ro.yml b/config/locales/server.ro.yml
index 2c4fb75826..c227fb8723 100644
--- a/config/locales/server.ro.yml
+++ b/config/locales/server.ro.yml
@@ -110,7 +110,8 @@ ro:
default_categories_already_selected: "Nu poți selecta o categorie folosită într-o altă listă."
s3_upload_bucket_is_required: "Nu poți activa încărcările pe S3 dacă nu ai introdus 's3_upload_bucket'."
bulk_invite:
- file_should_be_csv: "Fișierul încărcat ar trebui să fie în format csv sau txt."
+ file_should_be_csv: "Fișierul de încărcat trebuie să fie în format csv."
+ error: "A apărut o eroare la încărcarea acestui fișier. Te rugăm să încerci din nou, mai târziu."
backup:
operation_already_running: "O operație este în desfășurare. Nu poți începe alta nouă."
backup_file_should_be_tar_gz: "Fișierul backup ar trebui să fie arhivat cu extensia .tar.gz."
@@ -129,6 +130,11 @@ ro:
embed:
start_discussion: "Pornește discuție"
continue: "Continuă discuție"
+ error: "Eroare la încorporare"
+ referer: "Referent:"
+ mismatch: "Referentul nu corespunde nici uneia dintre următoarele gazde:"
+ no_hosts: "Nu s-a setat nicio gazdă pentru încorporare."
+ configure: "Configurează încorporarea"
more_replies:
one: "Încă un răspuns"
few: "Încă %{count} răspunsuri"
@@ -283,6 +289,7 @@ ro:
name: "Numele categoriei"
topic:
title: 'Titlu'
+ featured_link: 'Link promovat'
post:
raw: "Corp"
user_profile:
@@ -296,6 +303,9 @@ ro:
too_many_users: "Poți trimite avertizări la un singur utilizator odată."
cant_send_pm: "Ne pare rău, nu poți trimite un mesaj privat acestui utilizator."
no_user_selected: "Trebuie selectat un nume de utilizator valid."
+ featured_link:
+ invalid: "e invalid. URL-ul trebuie să includă http:// sau https://."
+ invalid_category: "nu poate fi editat în această categorie."
user:
attributes:
password:
@@ -391,6 +401,7 @@ ro:
create_topic: "Ai atins numărul maxim de subiecte. Te rugăm să aștepți %{time_left} înainte să încerci din nou."
create_post: "Răspunzi prea rapid. Te rugăm să aștepți %{time_left} înainte să încerci din nou."
delete_post: "ștergi postările prea rapid. Te rugăm să aștepți %{time_left} înainte să încerci din nou."
+ public_group_membership: "Ieși/intri din/în grupuri prea frecvent. Te rugăm așteaptă %{time_left} până să încerci din nou."
topics_per_day: "Ai atins numărul maxim de subiecte noi pe ziua de azi. Te rugăm să aștepți %{time_left} înainte să încerci din nou."
pms_per_day: "Ai atins numărul maxim de mesaje pe ziua de azi. Te rugăm să aștepți %{time_left} înainte să încerci din nou."
create_like: "Ai atins numărul maxim de aprecieri pe ziua de azi. Te rugăm să aștepți %{time_left} înainte să încerci din nou."
@@ -808,6 +819,8 @@ ro:
min_first_post_length: "Numărul minim de caractere permis pentru prima postare (în corpul mesajului)"
min_private_message_post_length: "Numărul minim de caractere permis pentru mesaje, per postare"
max_post_length: "Lungimea maximă permisă a postării, în caractere"
+ topic_featured_link_enabled: "Activează postarea unui link cu subiecte."
+ show_topic_featured_link_in_digest: "Arată link-ul promovat al subiectului în rezumatul pe email."
min_topic_title_length: "Minimul de caractere permis în titlul unui subiect"
max_topic_title_length: "Maximul de caractere permis în titlul unui subiect"
min_private_message_title_length: "Numărul minim de caractere permis în titlul unui mesaj"
@@ -916,9 +929,8 @@ ro:
show_email_on_profile: "Afișează adresa de email a unui utilizator în pagina sa de utilizator (vizibilă numai pentru el și pentru membrii echipei)"
prioritize_username_in_ux: "Afișează întâi nume utilizator pe pagina utilizator, pe cardul utilizator și în postări (dacă e dezactivat, se afișează întâi numele)"
email_token_valid_hours: "Tokenul uitat parolă / activează cont sunt valabili pentru (n) ore."
- email_token_grace_period_hours: "Tokenul Parola uitată / activează cont sunt încă valabili pe o perioadă de grație de (n) ore după ce au fost acceptați."
enable_badges: "Activează sistemul de ecusoane"
- enable_whispers: "Permite membrilor echipei să comunice privat în cadrul unui subiect. (experimental)"
+ enable_whispers: "Permite membrilor echipei să comunice privat în cadrul subiectelor."
allow_index_in_robots_txt: "Specifică în robots.txt că acest site poate fi indexat de motoarele de căutare web."
email_domains_blacklist: "O listă de domenii de email separate cu simbolul | (pipe) ale căror utilizatori nu au permisiunea să înregistreze conturi. Exemplu: mailinator.com|trashmail.net"
email_domains_whitelist: "O listă de domenii de email (separate cu simbolul | (pipe)) cu care utilizatorii TREBUIE să se înregistreze. ATENȚIE: utilizatorii cu alte domenii de email decât cele listate nu vor avea permisiunea să se înregistreze."
@@ -949,6 +961,7 @@ ro:
sso_overrides_name: "Suprascrie numele întreg de pe local cu numele întreg din datele SSO la fiecare autentificare și împiedică schimbările locale."
sso_overrides_avatar: "Suprascrie avatarul utilizatorului cu avatarul din datele SSO. Dacă este activat, se recomandă călduros dezactivarea allow_uploaded_avatars"
sso_not_approved_url: "Redirecționează conturile neaprobate SSO către acest URL"
+ sso_allows_all_return_paths: "Nu restricționa domeniul pentru return_paths furnizate de SSO (implicit, calea de întoarcere trebuie să fie pe site-ul curent)"
enable_local_logins: "Activează numele de utilizator local și conturile bazate pe autentificare cu parolă. (Notă: Pentru ca invitațiile să funcționeze, această opțiune trebuie să fie activată)"
allow_new_registrations: "Permite înregistrarea noilor utilizatori. Debifați pentru a restricționa pe oricine să creeze un cont nou."
enable_signup_cta: "Arată o notificare către utilizatorii anonimi care revin prin care să le ceri să se înscrie pentru a avea un cont pe site."
@@ -1174,6 +1187,9 @@ ro:
delete_digest_email_after_days: "Nu trimite emailuri-rezumat utilizatorilor care nu au fost văzuți pe site de mai mult de (n) zile."
digest_suppress_categories: "Nu include aceste categorii în emailurile-rezumat."
disable_digest_emails: "Dezactivează emailurile-rezumat pentru toți utilizatorii."
+ email_accent_bg_color: "Culoarea accent care să fie folosită ca fundal pentru unele elemente din emailurile HTML. Introdu numele culorii („roșu”) sau valoarea hex ('#FF000')."
+ email_accent_fg_color: "Culoarea textului redat pe culoarea de fundal a emailurilor HTML. Introdu un nume de culoare („alb”) sau o valoare hex ('#FFFFFF')."
+ email_link_color: "Culoarea link-urilor din emailurile HTML. Introdu un nume de culoare („albastru”) sau o valoare hex ('#0000FF')."
detect_custom_avatars: "Dacă sau nu să verifice dacă utilizatorii și-au încărcat poze de profil personalizate."
max_daily_gravatar_crawls: "Numărul maxim zilnic de verificări pe care Discourse le va face pe Gravatar pentru a vedea dacă există avatare personalizate."
public_user_custom_fields: "O listă albă cu câmpuri personalizate pentru utilizator, ce se pot afișa public."
@@ -1218,7 +1234,6 @@ ro:
embed_whitelist_selector: "Selector CSS pentru elementele ce sunt permise în încorporări."
embed_blacklist_selector: "Selector CSS pentru elementele ce sunt șterse din încorporări"
notify_about_flags_after: "Dacă sunt marcaje ce nu au fost aranjate după atâtea ore, trimite un email către email-ul de contact . Setează la 0 pentru a dezactiva."
- enable_cdn_js_debugging: "Permite /logs să afișeze corect erorile adăugând permisiuni crossorigin pe toate js includes."
show_create_topics_notice: "Dacă site-ul are mai puțin de 5 subiecte publice, afișează o notificare prin care se cere adminilor să creeze subiecte."
delete_drafts_older_than_n_days: șterge drafturile mai vechi de (n) zile.
bootstrap_mode_min_users: "Numărul minim de utilizatori necesar pentru dezactivarea modului bootstrap (0 pentru dezactivare)"
@@ -1646,97 +1661,9 @@ ro:
Pentru îndreptări suplimentare, te rugăm să citești [ghidul comunității](%{base_url}/guidelines).
usage_tips:
text_body_template: |
- Aici sunt câteva sfaturi rapide pentru început:
+ Citește câteva sfaturi rapide destinate noilor utilizatori, [urmărind această postare pe blog](http://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/).
- ## Citirea
-
- Pentru a citi mai mult, **dă scroll în jos!**
-
- Pe măsură ce sunt postate noi răspunsuri și noi subiecte, ele vor apărea în mod automat - nu e nevoie să reîmprospătezi pagina.
-
- ## Navigarea
-
- - Pentru a folosi căutarea, pentru a accesa pagina ta de utilizator, sau meniul ☰, folosește **butoanele icoană din dreapta-sus**.
-
- - Selectarea unui titlu de subiect te va duce întotdeauna la **următorul răspuns necitit** din subiect. Pentru a intra la începutul sau la sfârșitul listei de mesaje, selectează contorul de răspunsuri sau data ultimului răspuns.
-
-
-
- - Atunci când citești un subiect, poți folosi bara temporală din dreapta pentru a sări la începutul listei de mesaje, la sfârșitul ei sau la ultima poziție citită. Pe ecranele mai mici, selectează bara de progres din dreapta-jos pentru a o expanda:
-
-
-
- De asemenea, poți apăsa tasta ? pentru o lista ultra-rapidă de scurtături de tastatură.
-
- ## Răspunsul
-
- Pentru a introduce un citat, sleceează textul pe care dorești să îl citezi, apoi apasă orice buton Răspunde pentru a deschide editorul. Pentru mai multe citate repetă operațiunea.
-
-
-
- Întotdeauna poți să continui să citești în timp ce ăți compui răspunsul, iar noi vom salva automat drafturile, pe măsură ce scrii.
-
- Pentru a notifica pe cineva cu privire la răspunsul tău, menționează-i numele. Apasă `@` pentru a selecta un utilizator.
-
-
-
- Pentru a folosi [Emoji standard](http://www.emoji.codes/), apasă pur și simplu `:` pentru a sorta după nume, sau folosește tradiționalele smileys `;)`
-
-
-
- Pentru a genera un onebox pentru un link anume, lipiți-l pe o linie, de unul singur:
-
-
-
- Răspunsul tău poate fi formatat folosind HTML simplu, BBCode, sau [Markdown](http://commonmark.org/help/):
-
- Acesta este bold.
- Acesta este [b]bold[/b].
- Acesta este **bold**.
-
- Pentru mai multe sfaturi privind formatarea, [încearcă tutorialul nostru interactiv și amuzant de numai 10 minute!](http://commonmark.org/help/tutorial/)
-
- ## Acțiunile
-
- Există butoane de acțiune în partea de jos a fiecărei postări:
-
-
-
- - Pentru a-i spune cuiva că ți-a făcut plăcere și ai apreciat postarea sa, folosește butonul **apreciere**. Împărtășește apreciere!
-
- - Folosind butonul **Distribuie** poți prelua un link ce se poate copia-lipi.
-
- - Folosește … butonul arată mai mult pentru a descoperi mai multe acțiuni **Marchează cu marcaj de avertizare** pentru a informa în mod privat autorul, sau [echipa noastră](%{base_url}/about), cu privire la o anumită problemă. Folosește **Semn de carte** pentru a găsi această postare mai târziu, în pagina ta de profil.
-
- ## Notificările
-
- Când cineva îți răspunde la o postare, te citează, te menționează `@nume utilizator`, sau pune un link la un post al tău, îți va apărea imediat un număr în partea din dreapta-sus a paginii. Selectează-l pentru a-ți accesa **notificările**.
-
-
-
- Nu îți face griji că ai putea pierde vreun răspuns - vei primi pe email orice notificări apar cât ești plecat.
-
- ## Preferințele
-
- - Toate subiectele mai **recente de doua zile** sunt considerate noi.
-
- - Orice subiect la care **ai participat în mod activ** (creându-l, răspunzând la el, sau citindu-l pe o perioadă mai îndelungată) va fi urmărit în mod automat pentru uzul tău.
-
- Vei vedea indicatoarele "nou" și "număr necitite" alături de următoarele subiecte:
-
-
-
- Poți schimba notificările pentru fiecare subiect prin controlul de notificări aflat jos, în partea dreapta, la fiecare subiect.
-
-
-
- Poți de asemenea să alegi starea notificărilor pe categorii, dacă vrei să urmărești sau să ignori fiecare nou subiect dintr-o categorie specifică.
-
- Pentru a schimba oricare dintre aceste preferințe, mergi la [preferințe utilizator](%{base_url}/my/preferences).
-
- ## Încrederea comunității
-
- Ne bucurăm de cunoștință! Pe măsură ce vei participa aici, de-a lungul timpului te vom cunoaște mai bine și limitările temporare de nou utilizator ce ți se aplică, vor fi ridicate. Continua să participi și, cu timpul, vei câștiga noi [niveluri de încredere](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) ce vor include abilități speciale pentru a ne ajuta să gestionăm împreună această comunitate.
+ Pe măsură ce participi aici, vom ajunge să te cunoaștem iar limitările temporare aferente unui utilizator nou, îți vor fi ridicate. Cu timpul vei câștiga [niveluri de încredere](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) care includ abilități speciale și care îți vor da posibilitatea să ne ajuți să ne gestionăm împreuna comunitatea.
welcome_user:
subject_template: "Bine ai venit pe %{site_name}!"
text_body_template: |
@@ -2214,6 +2141,7 @@ ro:
new_topics: "Subiecte noi"
unread_messages: "Mesaje necitite"
unread_notifications: "Notificări necitite"
+ liked_received: "Aprecieri primite"
new_posts: "Postări noi"
new_users: "Utilizatori noi"
popular_topics: "Subiecte notorii"
diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml
index 84277c5611..ff84a60f71 100644
--- a/config/locales/server.ru.yml
+++ b/config/locales/server.ru.yml
@@ -109,8 +109,6 @@ ru:
max_username_length_range: "Нельзя установить максимум ниже минимума."
default_categories_already_selected: "Нельзя выбрать раздел, используемый в другом списке."
s3_upload_bucket_is_required: "Нельзя включить загрузки на S3, пока не задана настройка 's3_upload_bucket'."
- bulk_invite:
- file_should_be_csv: "Загружаемый файл должен быть в формате CSV или TXT."
backup:
operation_already_running: "Действие уже выполняется, поэтому невозможно начать новое действие прямо сейчас."
backup_file_should_be_tar_gz: "Файл резервной копии должен быть архивом в формате .TAR.GZ."
@@ -873,7 +871,6 @@ ru:
redirect_users_to_top_page: "Автоматически перенаправлять новых и давно отсутствующих пользователей к началу страницы."
show_email_on_profile: "Показать Email пользователя в профиле (видно только себе и персоналу)"
email_token_valid_hours: "Ссылка на восстановление пароля / активацию аккаунта будет действовать в течении (n) часов."
- email_token_grace_period_hours: "Ссылка на восстановление пароля / активацию аккаунта будет действовать в течении (n) часов."
enable_badges: "Включить систему наград"
allow_index_in_robots_txt: "Разрешить поисковикам индексировать сайт в robots.txt"
email_domains_blacklist: "Список почтовых доменов, с которых запрещена регистрация учетных записей. Пример: mailinator.com trashmail.net"
@@ -1072,7 +1069,6 @@ ru:
embed_whitelist_selector: "CSS selector которые разрешины для использования."
embed_blacklist_selector: "CSS selector которые запрещены для использования."
notify_about_flags_after: "Если есть жалобы, которые не были обработаны после этого колличества часов, отправить уведомление по электронной почте на contact_email. Значение 0, чтобы отключить."
- enable_cdn_js_debugging: "Добавить права crossorigin для всех js включений для правильного отображения ошибок в /logs "
show_create_topics_notice: "Если общее количество тем меньше 5, показывать персоналу соощбение с просьбой создать новые темы."
delete_drafts_older_than_n_days: Удалять черновики, которые старше (n) дней.
prevent_anons_from_downloading_files: "Запретить анонимным пользователям скачивать вложенные файлы. ВНИМАНИЕ: при этом будут недоступны любые вложения кроме картинок."
diff --git a/config/locales/server.sk.yml b/config/locales/server.sk.yml
index 3b95980404..d9e61ec6bd 100644
--- a/config/locales/server.sk.yml
+++ b/config/locales/server.sk.yml
@@ -99,8 +99,6 @@ sk:
max_username_length_range: "Nemôžete nastaviť maximum menšie ako minimum."
default_categories_already_selected: "Nemôžete vybrať kategóriu použitú v inom zozname."
s3_upload_bucket_is_required: "Nemôžete nahrávať na S3 pokiaľ ste nezadali 's3_upload_bucket'."
- bulk_invite:
- file_should_be_csv: "Nahrávaný súbor by mal byť vo formáte csv alebo txt."
backup:
operation_already_running: "Prebieha spracovanie inej operácie. Momentálne sa nová úloha nedá spustiť. "
backup_file_should_be_tar_gz: "Záložný súbor musí byť archív .tar.gz"
@@ -831,9 +829,7 @@ sk:
top_page_default_timeframe: "Východzí interval pre presmerovanie na hlavnú stránku."
show_email_on_profile: "Zobraziť používateľov email na ich profile (viditeľné len nimi samotnými a obsluhou)"
email_token_valid_hours: "Platnosť tokenov pre Zabudnuté heslo a aktiváciu účtu v (n) hodinách."
- email_token_grace_period_hours: "Platnosť tokenov pre Zabudnuté heslo a aktiváciu účtu v (n) hodinách po ich uplatnení."
enable_badges: "Povoliť systém odznakov"
- enable_whispers: "Povoliť súkromnú konverzáciu pre redakciu v rámci témy. (experimantálne)"
allow_index_in_robots_txt: "V súbore robots.txt nastaviť, že tieto stránky je povolené indexovať vyhľadávačmi."
email_domains_blacklist: "Rúrou oddelený zoznam emailových domén, ktorých použitie nie je povolené pri registrácií. Napríklad: mailinator.com|trashmail.net"
email_domains_whitelist: "Zoznam emailových domén oddelených zvislým oddelovačom \"|\", s použitím ktorých sa používateľ MUSÍ zaregistrovať. VAROVANIE: registrácia použivatelia s neuvedenými doménami nebude povolená!"
@@ -1065,7 +1061,6 @@ sk:
embed_whitelist_selector: "CSS prepínač na elementy, ktoré sú povolené pri vkladaní."
embed_blacklist_selector: "CSS prepínač na elementy, ktoré sú vymazané pri vkladaní."
notify_about_flags_after: "Ak existujú príznaky ktoré neboli vyriešené po uvedenom počte hodín, pošli email na contact_email. Pre vypnutie nastavte 0."
- enable_cdn_js_debugging: "Pomocou pridania \"crossorigin\" práv pre všetky vložené js umožniť /logs riadne zobrazenie chýb."
show_create_topics_notice: "Zobraz výzvu žiadajúcu administrátorov o vytvorenie nejakých tém, ak majú stránky menej ako 5 verejných tém."
delete_drafts_older_than_n_days: Vymazať návrhy staršie ako (n) dní.
vacuum_db_days: "Spustiť VACUUM ANALYZE na získanie DB miesto po migráciách (pre vypnutie nastavte na 0)"
diff --git a/config/locales/server.sq.yml b/config/locales/server.sq.yml
index 7e7b4641f2..070be4c701 100644
--- a/config/locales/server.sq.yml
+++ b/config/locales/server.sq.yml
@@ -62,8 +62,6 @@ sq:
load_from_remote: "Postimi nuk mundi të ngarkohet. Riprovoheni!"
site_settings:
default_categories_already_selected: "Nuk mund të zgjidhni një kategori të përdorur në një tjetër listë."
- bulk_invite:
- file_should_be_csv: "Skedari duhet të jete i formatit csv ose txt"
not_logged_in: "Ju duhet të identifikoheni për këtë veprim."
invalid_access: "Ju nuk jeni të drejta për të parë burimin e kërkuar."
reading_time: "Koha e leximit"
@@ -657,7 +655,6 @@ sq:
redirect_users_to_top_page: "Automatically redirect new and long absent users to the top page."
show_email_on_profile: "Show a user's email on their profile (only visible to themselves and staff)"
email_token_valid_hours: "Forgot password / activate account tokens are valid for (n) hours."
- email_token_grace_period_hours: "Forgot password / activate account tokens are still valid for a grace period of (n) hours after being redeemed."
enable_badges: "Aktivizo sistemin e targetave"
allow_index_in_robots_txt: "Specify in robots.txt that this site is allowed to be indexed by web search engines."
email_domains_blacklist: "A pipe-delimited list of email domains that users are not allowed to register accounts with. Example: mailinator.com|trashmail.net"
@@ -863,7 +860,6 @@ sq:
embed_whitelist_selector: "CSS selector for elements that are allowed in embeds."
embed_blacklist_selector: "CSS selector for elements that are removed from embeds."
notify_about_flags_after: "If there are flags that haven't been handled after this many hours, send an email to the contact_email. Set to 0 to disable."
- enable_cdn_js_debugging: "Allow /logs to display proper errors by adding crossorigin permissions on all js includes."
show_create_topics_notice: "If the site has fewer than 5 public topics, show a notice asking admins to create some topics."
delete_drafts_older_than_n_days: Delete drafts older than (n) days.
prevent_anons_from_downloading_files: "Prevent anonymous users from downloading attachments. WARNING: this will prevent any non-image site assets posted as attachments from working."
diff --git a/config/locales/server.sv.yml b/config/locales/server.sv.yml
index 6628bb63ad..80fbd7386b 100644
--- a/config/locales/server.sv.yml
+++ b/config/locales/server.sv.yml
@@ -104,8 +104,6 @@ sv:
max_username_length_range: "Du kan inte sätta maximum högre än minimum."
default_categories_already_selected: "Du kan inte välja en kategori som används i en annan lista. "
s3_upload_bucket_is_required: "Du kan inte aktivera uppladdning till S3 innan du har angivit 's3_upload_bucket'."
- bulk_invite:
- file_should_be_csv: "Den uppladdade filen ska vara i csv eller txt format."
backup:
operation_already_running: "En operation är redan igång. Kan inte starta ett nytt jobb just nu."
backup_file_should_be_tar_gz: "Backup-filen ska vara ett .tar.gz arkiv."
@@ -852,9 +850,7 @@ sv:
show_email_on_profile: "Visa en användares e-postadress på deras profil (endast synlig för de själva och för personal)"
prioritize_username_in_ux: "Använd användarnamn först på användarsidan, användarkortet och inlägg (när inaktiverad så visas namnet först)"
email_token_valid_hours: "Glömt lösenord / aktivera konto länkar är giltiga i (n) timmar."
- email_token_grace_period_hours: "Glömt lösenord / aktivera konto länkar är fortfarande giltiga i en nådefrist på (n) timmar efter att ha blivit utlösta."
enable_badges: "Aktivera utmärkelsesystemet"
- enable_whispers: "Tillåt privat kommunikation mellan personal inom ett ämne. (experimentellt)"
allow_index_in_robots_txt: "Specificera i robots.txt att den här webbplatsen tillåter att bli indexerad av sökmotorer. "
email_domains_blacklist: "En pipe-avgränsad lista av alla e-postdomän som användare inte tillåts registrera konton med. Exempel: mailinator.com, trashmail.net"
email_domains_whitelist: "En pipe-avgränsad lista av alla e-postdomän som användare MÅSTE registrera konton med. VARNING: Användare med e-postdomän som inte finns på listan kommer inte att tillåtas!"
@@ -1122,7 +1118,6 @@ sv:
embed_whitelist_selector: "CSS-väljare för element som tillåts bäddas in. "
embed_blacklist_selector: "CSS-väljare för element som tas bort från inbäddningar."
notify_about_flags_after: "Skicka ett e-postmeddelande till contact_email om det finns flaggor som inte har hanterats efter så här många timmar. Ange 0 för att inaktivera."
- enable_cdn_js_debugging: "Tillåt /logs att visa lämpliga fel genom att lägga till ursprungstillståndet på alla js-inkluderingar."
show_create_topics_notice: "Visa en notis som ber administratörerna att skapa några ämnen om webbplatsen har färre än 5 publika ämnen."
delete_drafts_older_than_n_days: Ta bort utkast som är äldre än (n) dagar.
bootstrap_mode_min_users: "Minsta antal användare som krävs för att inaktivera bootstrap-läget (ange 0 för att inaktivera)"
diff --git a/config/locales/server.te.yml b/config/locales/server.te.yml
index 1c8fa5ffc6..aedbb41896 100644
--- a/config/locales/server.te.yml
+++ b/config/locales/server.te.yml
@@ -61,8 +61,6 @@ te:
other: '%{count} దోషాల వల్ల %{model} భద్రపరుచుట వీలవలేదు'
embed:
load_from_remote: "ఈ టపా లోడింగులో దోషం"
- bulk_invite:
- file_should_be_csv: "ఎగుమతించే దస్త్రం కేవలం csv లేదా txt రూపంలో ఉండాలి"
backup:
operation_already_running: "ఒక పరిక్రియ ప్రస్తుతం జరుగుతోంది. కొత్త పని ఇప్పుడు మొదలుపెట్టవీలవదు."
backup_file_should_be_tar_gz: "బ్యాకప్ దస్త్రం తప్పనిసరి .tar.gz కట్ట అయి ఉండాలి."
diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml
index 0e3ef4eef7..cea368a1db 100644
--- a/config/locales/server.tr_TR.yml
+++ b/config/locales/server.tr_TR.yml
@@ -89,8 +89,6 @@ tr_TR:
max_username_length_range: "En küçük değer altında en büyük değer ayarlayamazsınız."
default_categories_already_selected: "Bir başka listede kullanılan bir kategoriyi seçemezsiniz."
s3_upload_bucket_is_required: "Bir 's3_upload_bucket' tanımlamadıysanız, S3 yüklemelerini etkinleştiremezsiniz."
- bulk_invite:
- file_should_be_csv: "Yüklenen dosya csv veya txt biçiminde olmalı. "
backup:
operation_already_running: "Devam eden bir işlem var. Yeni bir işlem başlatılamaz."
backup_file_should_be_tar_gz: "Yedekleme dosyası .tar.gz uzantılı olmalı."
@@ -785,9 +783,7 @@ tr_TR:
show_email_on_profile: "Kullanıcının e-posta adresini profilinde göster (sadece kendilerine ve site görevlilerine gözükür)"
prioritize_username_in_ux: "Kullanıcı sayfası, kullanıcı kartı ve gönderilerde kullanıcı adını ilk olarak göster(devre dışı ise gerçek isim önce gözükür)"
email_token_valid_hours: "Parolamı unuttum / hesap etkinleştirme jetonları (n) saat geçerlidir."
- email_token_grace_period_hours: "Parolamı unuttum / hesabı etkinleştir jetonları kullanıldıktan sonra (n) saat boyunca hala geçerlidir."
enable_badges: "Rozet sistemini etkinleştir"
- enable_whispers: "Konu içerisinde görevlilerin birbirleriyle gizli olarak iletişim kurmasına izin ver. (deneyseldir)"
allow_index_in_robots_txt: "robots.txt dosyasında bu sitenin arama motorları tarafından dizinlenmesine izin verildiğini belirt."
email_domains_blacklist: "Kullanıcıların kayıt olurken kullanamayacağı e-posta alan adlarının, dikey çizgilerle ayrıştırılmış listesi. Örneğin: mailinator.com|trashmail.net"
email_domains_whitelist: "Kullanıcıların kayıt olurken kullanmak ZORUNDA olduğu e-posta alan adlarının, dikey çizgilerle ayrıştırılmış listesi. UYARI: Bu listede yer almayan e-posta alan adları kabul edilmeyecektir!"
@@ -1040,7 +1036,6 @@ tr_TR:
embed_whitelist_selector: "Yerleştirmelerde kullanılmasına izin verilen öğeler için CSS seçicisi."
embed_blacklist_selector: "Yerleştirmelerden çıkartılmış öğeler için CSS seçicisi."
notify_about_flags_after: "Bu kadar saat geçmesine rağmen hala ilgilenilmemiş bildirimler varsa, contact_email adresine e-posta gönder. Devre dışı bırakmak için 0 girin. "
- enable_cdn_js_debugging: "/logs 'ların asli hataları tüm js içeriklerine crossorigin izinleri ekleyerek göstermesine izin ver."
show_create_topics_notice: "Eğer sitede herkese açık konu sayısı 5'den az ise, yöneticiden yeni konular oluşturmasını isteyen bir uyarı iletisi göster. "
delete_drafts_older_than_n_days: (n) günden eski taslakları sil.
bootstrap_mode_min_users: "bootstrap modunun edilgen olması için gereken en az kullanıcı sayısı (edilgen bırakmak için 0 yapın)"
@@ -1354,99 +1349,6 @@ tr_TR:
system_messages:
post_hidden:
subject_template: "Gönderi topluluk bildirimleri tarafından gizlendi"
- usage_tips:
- text_body_template: |
- İşte başlangıç için birkaç ipucu:
-
- ## Okuma
-
- Daha fazla okumak için, **yalnızca aşağı kaydırmaya devam edin!**
-
- As new replies or new topics arrive, they will appear automatically – no need to refresh the page.
-
- ## Gezinti
-
- - For search, your user page, or the ☰ menu, use the **icon buttons at upper right**.
-
- - Selecting a topic title will always take you to your **next unread reply** in the topic. To enter at the top or bottom instead, select the reply count or last reply date.
-
-
-
- - While reading a topic, use the timeline on the right to jump to the top, bottom, or your last read position. On smaller screens, select the progress bar at bottom right to expand it:
-
-
-
- Ayrıca süper hızlı klavye kısayollarının listesini görmek için ? tuşuna basabilirsiniz.
-
- ## Cevaplama
-
- To insert a quote, select the text you wish to quote, then press any Reply button to open the editor. Repeat for multiple quotes.
-
-
-
- You can always continue reading while you compose your reply, and we automatically save drafts as you write.
-
- Birine cevabınız hakkında bildirim yollamak için ismini kullanın. `@` yazarak kullanıcı ismi aramaya başlayabilirsiniz.
-
-
-
- To use [standard Emoji](http://www.emoji.codes/), just type `:` to match by name, or use the traditional smileys `;)`
-
-
-
- To generate a summary for a link, paste it on a line by itself:
-
-
-
- Cevabınız basit HTML, BBCode, veya [Markdown](http://commonmark.org/help/) kullanılarak biçimlendirilebilir:
-
- Bu kalın.
- Bu da [b]kalın[/b].
- E bu da **kalın**.
-
- Daha fazla biçimlendirme ipucu için [10 dakikalık öğreticiyi](http://commonmark.org/help/tutorial/) deneyebilirsiniz!
-
- ## Eylemler
-
- Tüm gönderilerin altında eylem düğmeleri bulunur:
-
-
-
- - To let someone know that you enjoyed and appreciated their post, use the **like** button. Share the love!
-
- - Grab a copy-pasteable link to any reply or topic via the **link** button.
-
- - Use the … show more button to reveal more actions. **Flag** to privately let the author, or [our staff](%{base_url}/about), know about a problem. **Bookmark** to find this post later on your profile page.
-
- ## Bildirimler
-
- When someone replies to you, quotes your post, mentions your `@username`, or even links to your post, a number will immediately appear at the top right of the page. Select it to access your **notifications**.
-
-
-
- Don't worry about missing a reply – you'll be emailed any notifications that arrive when you are away.
-
- ## Tercihler
-
- - All topics less than **two days old** are considered new.
-
- - Any topic you've **actively participated in** (by creating it, replying to it, or reading it for an extended period) will be automatically tracked on your behalf.
-
- You will see the new and unread number indicators next to these topics:
-
-
-
- You can change your notifications for any topic via the notification control at the bottom, and right hand side, of each topic.
-
-
-
- You can also set notification state per category, if you want to watch or mute every new topic in a specific category.
-
- Bu ayarların herhangi birini değiştirmek için [kullanıcı tercihleri](%{base_url}/my/preferences) sayfasını ziyaret edin.
-
- ## Topluluk Güvenilirliği
-
- It's great to meet you! As you participate here, over time we'll get to know you, and your temporary new user limitations will be lifted. Keep participating, and over time you'll gain new [trust levels](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) that include special abilities to help us manage our community together.
welcome_user:
subject_template: "%{site_name} topluluğuna hoş geldiniz!"
text_body_template: |
diff --git a/config/locales/server.vi.yml b/config/locales/server.vi.yml
index 4f13cb3550..12fe42e93d 100644
--- a/config/locales/server.vi.yml
+++ b/config/locales/server.vi.yml
@@ -94,8 +94,6 @@ vi:
max_username_length_range: "Bạn không thể thiết lập số tối đa nhỏ hơn số tối thiểu"
default_categories_already_selected: "Bạn không thể chọn một danh mục được sử dụng trong danh sách khác."
s3_upload_bucket_is_required: "Bạn không thể tải lên S3 mà chưa thiết lập 's3_upload_bucket'."
- bulk_invite:
- file_should_be_csv: "Tập tin tải lên nên ở dạng csv hoặc txt."
backup:
operation_already_running: "Một tiến trình đang được thực hiện. Không thể bắt đầu một tiến trình mới ngay bây giờ."
backup_file_should_be_tar_gz: "Tập tin sao lưu nên nên ở dạng .tar.gz."
@@ -755,9 +753,7 @@ vi:
top_page_default_timeframe: "Khung thời gian mặc định cho trang xem trên cùng."
show_email_on_profile: "Hiển thị email thành viên trên trang hồ hơ (chỉ cho họ và quản trị viên)"
email_token_valid_hours: "Token quyên mật khẩu / kích hoạt tài khoản có giá trị trong (n) giờ."
- email_token_grace_period_hours: "Token quyên mật khẩu / kích hoạt tài khoản vẫn còn giá trị (n) giờ sau khi được gia hạn"
enable_badges: "Kích hoạt hệ thống huy hiệu"
- enable_whispers: "Cho phép quản trị viên giao tiếp riêng trong chủ đề. (thực nghiệm)"
allow_index_in_robots_txt: "Chỉ rõ trong robots.txt trang web này cho phép tạo chỉ mục bởi web search engines."
email_domains_blacklist: "Một danh sách đuôi email mà người dùng không được phép dùng để đăng ký tài khoản. Ví dụ: maillinator.com|trashmail.net. Lưu ý mỗi tên miền cách nhau bởi dấu \"|\"."
email_domains_whitelist: "Danh sách tên miền người dùng ĐƯỢC PHÉP đăng ký tài khoản. CẢNH BÁO: người dùng với tên miền email khác trong danh sách sẽ không được phép đăng ký!"
@@ -1009,7 +1005,6 @@ vi:
embed_whitelist_selector: "Bộ chọn các thành phần CSS được hỗ trợ khi nhúng."
embed_blacklist_selector: "Bộ chọn các thành phần CSS được loại bỏ khi nhúng."
notify_about_flags_after: "Nếu có các đánh dấu chưa được xử lý sau số giờ được thiết lập ở đây, gửi email đến contact_email. Đặt là 0 để vô hiệu hóa."
- enable_cdn_js_debugging: "Cho phép /logs hiển thị lỗi thích hợp bằng cách thêm quyền cross-origin trên tất cả js kèm theo."
show_create_topics_notice: "Nếu trang có ít hơn 5 chủ đề công khai, hiển thị một thông báo yêu cầu quản trị tạo thêm các chủ đề mới"
delete_drafts_older_than_n_days: Xóa các bản nháp cũ hơn (n) ngày.
vacuum_db_days: "Chạy VACUUM ANALYZE để lấy lại khoảng trống DB sau khi migration (đặt là 0 để tắt)"
diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml
index 3354f7d00a..bd0098eb48 100644
--- a/config/locales/server.zh_CN.yml
+++ b/config/locales/server.zh_CN.yml
@@ -102,7 +102,8 @@ zh_CN:
default_categories_already_selected: "不能选择一个已经用于另一个列表的分类。"
s3_upload_bucket_is_required: "你没有填写“s3_upload_bucket”,不能开启上传至 S3。"
bulk_invite:
- file_should_be_csv: "上传的文件应为 csv 或 txt 格式。"
+ file_should_be_csv: "上传的文件应为 csv 格式。"
+ error: "上传文件的时候出错了。请重试。"
backup:
operation_already_running: "有操作正在运行。目前无法开始新的操作。"
backup_file_should_be_tar_gz: "备份文件应为 .tar.gz 存档文件。"
@@ -119,6 +120,11 @@ zh_CN:
embed:
start_discussion: "开始讨论"
continue: "继续讨论"
+ error: "嵌入故障"
+ referer: "来源:"
+ mismatch: "来源(referer)不符合下列主机地址:"
+ no_hosts: "嵌入没有设置任何主机地址。"
+ configure: "配置嵌入"
more_replies:
other: "%{count} 个更多回复"
loading: "正在载入讨论中..."
@@ -271,6 +277,9 @@ zh_CN:
too_many_users: "一次只能发送警告给一个用户。"
cant_send_pm: "抱歉,不能向该用户发送私信。"
no_user_selected: "必须选择一个有效的用户。"
+ featured_link:
+ invalid: "不合法。URL 应包括 http:// 或 https://。"
+ invalid_category: "无法编辑该分类。"
user:
attributes:
password:
@@ -364,6 +373,7 @@ zh_CN:
create_topic: "你创建新主题的速度太快了,请等待%{time_left}之后再试。"
create_post: "你回帖太快了,请等待%{time_left}之后再试。"
delete_post: "你正在快速地删除帖子。请等 %{time_left}之后再试。"
+ public_group_membership: "你加入/离开群组的速度太快了,请等待%{time_left}之后再试。"
topics_per_day: "你今天新主题的数量已经到达上限,请等待%{time_left}之后再试。"
pms_per_day: "你今天的消息数量已经到达上限,请等待%{time_left}之后再试。"
create_like: "你今天的“赞”数量已经到达上限,请等待%{time_left}之后再试。"
@@ -729,6 +739,8 @@ zh_CN:
min_first_post_length: "第一帖(主题内容)允许的最少字符数"
min_private_message_post_length: "消息允许的最小字符数"
max_post_length: "帖子允许的最大字符数"
+ topic_featured_link_enabled: "允许发链接帖。"
+ show_topic_featured_link_in_digest: "在摘要邮件中显示主题特色链接。"
min_topic_title_length: "标题允许的最少字符数"
max_topic_title_length: "标题允许的最大字符数"
min_private_message_title_length: "消息标题允许的最小字符数"
@@ -837,9 +849,8 @@ zh_CN:
show_email_on_profile: "在用户页面显示用户的邮件地址(只有用户和管理人员可见)"
prioritize_username_in_ux: "在用户页、用户卡片和帖子上优先显示用户名(未选时,昵称将先显示)"
email_token_valid_hours: "“忘记密码”/“激活账户”令牌有效的小时数(n)。"
- email_token_grace_period_hours: "“忘记密码”/“激活账户”令牌在使用后仍旧有效的小时数(n)。"
enable_badges: "启用徽章系统"
- enable_whispers: "允许在主题中给管理人员密频。(experimental)"
+ enable_whispers: "允许工作人员在主题中私密交流。"
allow_index_in_robots_txt: "在 robots.txt 中详细指出这个站点允许被网页搜索引擎检索。"
email_domains_blacklist: "用管道符“|”分隔的邮箱域名黑名单列表,其中的域名将不能用来注册账户,例如:mailinator.com|trashmail.net"
email_domains_whitelist: "用管道符“|”分隔的电子邮箱域名的列表,用户必须使用这些邮箱域名注册。警告:用户使用不包含在这个列表里的邮箱域名,将无法成功注册。"
@@ -870,6 +881,7 @@ zh_CN:
sso_overrides_name: "每一次登录时,用 SSO 信息中的外部站点的全名覆盖本地全名,并且阻止本地的全名修改。"
sso_overrides_avatar: "用单点登录信息中的外部站点头像覆盖用户头像。如果启用,强烈建议禁用 allow_uploaded_avatars"
sso_not_approved_url: "重定向未受许可的单点登录账号至这个 URL"
+ sso_allows_all_return_paths: "不限制 SSO 提供的 return_paths 中的域名(默认情况下返回地址必须位于当前站点)"
enable_local_logins: "启用本地用户名和密码验证。(注意:邀请特性需要该选项)"
allow_new_registrations: "允许新用户注册。取消选择将阻止任何人创建一个新账户。"
enable_signup_cta: "显示推荐创建账户的提示给那些回访的未注册用户。"
@@ -1090,10 +1102,14 @@ zh_CN:
automatically_download_gravatars: "为注册或更改邮箱的用户下载 Gravatar 头像。"
digest_topics: "邮件摘要中显示的流行主题的最大数目。"
digest_posts: "邮件摘要中显示的最流行帖子的数量。"
+ digest_other_topics: "邮件摘要中“你关注的主题和分类中的新内容”栏目显示的主题数目上限。"
digest_min_excerpt_length: "邮件摘要中显示的帖子摘要字符数下限。"
delete_digest_email_after_days: "不发送摘要邮件给超过(n)天没访问的用户。"
digest_suppress_categories: "不在摘要邮件中显示这些分类的内容。"
disable_digest_emails: "禁用所有用户摘要邮件功能。"
+ email_accent_bg_color: "HTML 邮件中某些元素的背景使用的强调颜色。输入色彩名(“red”)或十六进制值(“#FF0000”)。"
+ email_accent_fg_color: "HTML 邮件中背景使用的字体颜色。输入色彩名(“white”)或十六进制值(“#FFFFFF”)。"
+ email_link_color: "HTML 邮件中的链接颜色。输入色彩名字(“blue”)或十六进制值(“#0000FF”)。"
detect_custom_avatars: "检测用户是否上传了自定义个人头像。"
max_daily_gravatar_crawls: "一天内 Discourse 将自动检查 gravatar 自定义头像的次数"
public_user_custom_fields: "可公开显示的用户自定义属性白名单"
@@ -1138,7 +1154,6 @@ zh_CN:
embed_whitelist_selector: "在嵌入页面加入元素 CSS 选择器。"
embed_blacklist_selector: "在嵌入页面移除元素 CSS 选择器。"
notify_about_flags_after: "如果有标记没有在设定小时后处理,发送一封邮件给 contact_email。设为 0 将禁用。"
- enable_cdn_js_debugging: "为包含的 js 启动跨源访问 /logs 权限以显示合适的错误。"
show_create_topics_notice: "如果站点只有少于 5 篇的公开帖子时,显示一条请管理员创建帖子的提示。"
delete_drafts_older_than_n_days: 删除超过 n 天得草稿。
bootstrap_mode_min_users: "禁用摘要模式的用户数下限(0 为禁用)。"
@@ -1185,6 +1200,7 @@ zh_CN:
max_api_keys_per_user: "每用户最多持有的用户 API 数"
min_trust_level_for_user_api_key: "生成用户 API 密钥所需的信任等级"
allowed_user_api_auth_redirects: "允许用户 API 密钥重定向授权至"
+ allowed_user_api_push_urls: "允许使用服务器推送至用户 API 的 URL"
tagging_enabled: "启用标签功能,允许为主题设置标签?"
min_trust_to_create_tag: "创建标签所需的最小信任等级。"
max_tags_per_topic: "主题最多允许有多少个标签。"
@@ -1538,6 +1554,8 @@ zh_CN:
然而,如果帖子再次被社群成员标记并隐藏,它将被隐藏至版主处理后——并且可能导致进一步的措施,如封禁帐号。
想了解更多,请查看我们的[社群指引](%{base_url}/guidelines)。
+ usage_tips:
+ text_body_template: "要查看给新用户的简要技巧,[(英文)看看这篇博客文章](http://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/)。\n\n只要你参与,我们将更了解你,并且新用户的临时限制将被移除。\b随着时间,你将获得[信任等级](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924),这将提供一些特殊功能来帮助我们更好地管理社群。\n"
welcome_user:
subject_template: "欢迎来到 %{site_name}!"
text_body_template: |
@@ -2010,6 +2028,7 @@ zh_CN:
new_topics: "新主题"
unread_messages: "未读私信"
unread_notifications: "未读通知"
+ liked_received: "获得赞"
new_posts: "新帖子"
new_users: "新用户"
popular_topics: "热门主题"
@@ -2760,16 +2779,50 @@ zh_CN:
description: "你的社群主要使用什么语言?"
forum_title:
title: "名字"
+ description: "名字就像远方可见的路标一样,访客“首先”将看到这个社群的名字。你起的名字和标题怎样描述了你的社群?"
fields:
title:
label: "你社群的名字"
- contact:
+ placeholder: "小明的论坛"
+ site_description:
+ label: "用一句简短的话描述你的社群"
+ placeholder: "小明和他的朋友讨论酷东西的论坛"
+ introduction:
+ title: "介绍"
fields:
+ welcome:
+ label: "欢迎主题"
+ description: "你将怎么在一分钟内向陌生人描述你的社群? - 谁会对这些讨论感兴趣?
- 我能获得什么?
- 为什么我应该访问?
你的欢迎主题是新访客将先看到的东西。把它想象为一段“电梯宣传”或者“使命声明”。 "
+ one_paragraph: "请限制你的欢迎消息至一段话。"
+ privacy:
+ title: "访问"
+ description: "你的社群对所有人可见或者需要限制为会员许可、邀请许可或者审核许可?如果你愿意,你可以将其设为私密,然后再切换至公开。 记住你永远可以在主题中邀请别人,或者从你的用户页面里也行。 "
+ fields:
+ privacy:
+ choices:
+ open:
+ label: "公开"
+ description: "任何人都可访问社群,可以创建账户"
+ restricted:
+ label: "私密"
+ description: "只有我邀请或审核通过的人可以访问社群"
+ contact:
+ title: "联系"
+ fields:
+ contact_email:
+ label: "邮件"
+ placeholder: "name@example.com"
+ description: "社群的负责人或小组的邮件地址。将用来接收关于未处理标记和安全更新的紧急通知,并显示在关于页面上作为紧急联系的方式。"
contact_url:
label: "网页"
placeholder: "http://www.example.com/contact-us"
+ description: "你或者你的组织平时用于联络的网页。将被显示在关于页面中。"
+ site_contact:
+ label: "自动消息"
+ description: "所有自动发送自 Discourse 的私人消息将以该用户的名义发送。最重要的是,这个用户将被指定为发送给每个新用户的欢迎消息的发送人。"
corporate:
title: "组织"
+ description: "这些名字将显示于隐私策略和服务条款中,你可以随时在工作人员分类中编辑他们。如果你没有公司,你可以跳过这个步骤。"
fields:
company_short_name:
label: "公司名(短)"
@@ -2784,6 +2837,7 @@ zh_CN:
title: "主题"
fields:
theme_id:
+ description: "你喜欢亮色还是暗色的颜色方案?你永远可以在管理-自定义中修改站点的观感。"
choices:
default:
label: "简洁亮"
@@ -2803,9 +2857,12 @@ zh_CN:
fields:
favicon_url:
label: "小图标"
+ description: "浏览器中你站点显示的图标,要在小尺寸的情况下表现出色,例如 32px X 32px。"
apple_touch_icon_url:
label: "大图标"
+ description: "现代设备中你站点显示的图标,要在大一点尺寸的情况下表现出色。推荐的尺寸至少要达到144px X 144px。"
homepage:
+ description: "我们推荐在你的主页显示最新主题,但是如果你喜欢,你也可以选择显示分类(一组主题)。"
title: "主页"
fields:
homepage_style:
@@ -2816,8 +2873,10 @@ zh_CN:
label: "分类"
emoji:
title: "Emoji"
+ description: "你喜欢你的社群使用哪一种 Emoji 样式?你永远可以在管理-自定义-Emoji中增加更多的定制 Emoji。"
invites:
title: "邀请工作人员"
+ description: "你快做完啦!让我们邀请一些工作人员来帮助你创建一些讨论主题以方便你发布社群。"
finished:
title: "你的 Discourse 已经准备就绪!"
description: |
diff --git a/config/locales/server.zh_TW.yml b/config/locales/server.zh_TW.yml
index 57b5747e9c..9b82b2e8c4 100644
--- a/config/locales/server.zh_TW.yml
+++ b/config/locales/server.zh_TW.yml
@@ -71,8 +71,6 @@ zh_TW:
min_username_length_range: "你不能設定「最小」大於「最大」。"
max_username_length_exists: "您不能設置比現有用戶名短的「最大用戶名長度」。"
max_username_length_range: "你不能設定「最大」小於「最小」。"
- bulk_invite:
- file_should_be_csv: "上傳的文件應為 csv 或 txt 格式。"
backup:
operation_already_running: "%{operation} 操作正在運行。 目前無法執行新的 %{operation} 操作。"
backup_file_should_be_tar_gz: "備份檔案應使用 .tar.gz 歸檔"
@@ -552,7 +550,6 @@ zh_TW:
redirect_users_to_top_page: "將新用戶或長時間未使用的用戶自動重新導向至熱門頁面"
show_email_on_profile: "在用戶頁面顯示用戶的電郵地址(只有用戶自己和職員可見)"
email_token_valid_hours: "\"忘記密碼\" / \"重啟帳號\" token 有效的小時數 (n)"
- email_token_grace_period_hours: "\"忘記密碼\" / \"重啟帳號\" 的 token 在使用後仍舊有效的小時數 (n)"
enable_badges: "啟用勳章系統"
allow_index_in_robots_txt: "在 robots.txt 中記錄這個網站允許被搜尋引擎索引的部分"
log_out_strict: "登出時,登出用戶所有設備上的所有時段"
@@ -695,7 +692,6 @@ zh_TW:
embed_post_limit: "文章內 embed 的最大數量"
embed_whitelist_selector: "在 embeds 頁面允許 CSS 元素選擇器"
embed_blacklist_selector: "在 embeds 頁面移除 CSS 元件選擇器"
- enable_cdn_js_debugging: "允許 /logs 適當的顯示 crossorigin permissions 所有 js 的錯誤"
show_create_topics_notice: "如果網站的公開討論話題少於 5 個,顯示通知要求管理員建立一些討論話題。"
enable_emoji: "啟用表情符號"
emoji_set: "你會如何喜歡你的表情符號?"
diff --git a/config/routes.rb b/config/routes.rb
index 00b429f09f..cc95f859fe 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -326,8 +326,8 @@ Discourse::Application.routes.draw do
get "users/:username/messages/group/:group_name/archive" => "user_actions#private_messages", constraints: {username: USERNAME_ROUTE_FORMAT, group_name: USERNAME_ROUTE_FORMAT}
get "users/:username.json" => "users#show", constraints: {username: USERNAME_ROUTE_FORMAT}, defaults: {format: :json}
- get "users/:username" => "users#show", as: 'user', constraints: {username: USERNAME_ROUTE_FORMAT}
- put "users/:username" => "users#update", constraints: {username: USERNAME_ROUTE_FORMAT}
+ get "users/:username" => "users#show", as: 'user', constraints: {username: USERNAME_ROUTE_FORMAT, format: /(json|html)/}
+ put "users/:username" => "users#update", constraints: {username: USERNAME_ROUTE_FORMAT}, defaults: { format: :json }
get "users/:username/emails" => "users#check_emails", constraints: {username: USERNAME_ROUTE_FORMAT}
get "users/:username/preferences" => "users#preferences", constraints: {username: USERNAME_ROUTE_FORMAT}, as: :email_preferences
get "users/:username/preferences/email" => "users_email#index", constraints: {username: USERNAME_ROUTE_FORMAT}
@@ -384,11 +384,11 @@ Discourse::Application.routes.draw do
post "uploads" => "uploads#create"
# used to download original images
- get "uploads/:site/:sha" => "uploads#show", constraints: { site: /\w+/, sha: /[a-f0-9]{40}/ }
+ get "uploads/:site/:sha(.:extension)" => "uploads#show", constraints: { site: /\w+/, sha: /\h{40}/, extension: /[a-z0-9\.]+/i }
# used to download attachments
- get "uploads/:site/original/:tree:sha" => "uploads#show", constraints: { site: /\w+/, tree: /(\w+\/)+/i, sha: /[a-f0-9]{40}/ }
+ get "uploads/:site/original/:tree:sha(.:extension)" => "uploads#show", constraints: { site: /\w+/, tree: /([a-z0-9]+\/)+/i, sha: /\h{40}/, extension: /[a-z0-9\.]+/i }
# used to download attachments (old route)
- get "uploads/:site/:id/:sha" => "uploads#show", constraints: { site: /\w+/, id: /\d+/, sha: /[a-f0-9]{16}/ }
+ get "uploads/:site/:id/:sha" => "uploads#show", constraints: { site: /\w+/, id: /\d+/, sha: /\h{16}/ }
get "posts" => "posts#latest", id: "latest_posts"
get "private-posts" => "posts#latest", id: "private_posts"
@@ -401,6 +401,8 @@ Discourse::Application.routes.draw do
get "posts.rss" => "groups#posts_feed", format: :rss
get "mentions.rss" => "groups#mentions_feed", format: :rss
+ get 'activity' => "groups#show"
+ get 'activity/:filter' => "groups#show"
get 'members'
get 'posts'
get 'topics'
diff --git a/config/site_settings.yml b/config/site_settings.yml
index 1d4eaee0a3..f947b862cb 100644
--- a/config/site_settings.yml
+++ b/config/site_settings.yml
@@ -298,6 +298,7 @@ login:
enable_sso:
client: true
default: false
+ sso_allows_all_return_paths: false
enable_sso_provider: false
verbose_sso_logging: false
sso_url:
@@ -388,7 +389,6 @@ users:
email_token_valid_hours:
default: 48
min: 1
- email_token_grace_period_hours: 0
purge_unactivated_users_grace_period_days: 14
public_user_custom_fields:
type: list
@@ -410,6 +410,14 @@ users:
hide_user_profiles_from_public:
default: false
client: true
+ user_website_domains_whitelist:
+ default: ''
+ type: list
+
+groups:
+ enable_group_directory:
+ client: true
+ default: true
posting:
min_post_length:
@@ -599,6 +607,9 @@ email:
disable_digest_emails:
default: false
client: true
+ email_accent_bg_color: "#2F70AC"
+ email_accent_fg_color: "#FFFFFF"
+ email_link_color: "#006699"
show_topic_featured_link_in_digest: false
email_custom_headers: 'Auto-Submitted: auto-generated'
email_subject: '[%{site_name}] %{optional_pm}%{optional_cat}%{topic_title}'
@@ -1211,7 +1222,7 @@ uncategorized:
disable_edit_notifications: false
- vacuum_db_days: 9000
+ vacuum_db_days: 90
last_vacuum:
default: 0
hidden: true
diff --git a/db/fixtures/001_categories.rb b/db/fixtures/001_categories.rb
index b1bfc5cbb9..02adda656b 100644
--- a/db/fixtures/001_categories.rb
+++ b/db/fixtures/001_categories.rb
@@ -25,15 +25,15 @@ if uncat_id == -1 || !Category.exists?(uncat_id)
end
# 60 minutes after our migration runs we need to exectue this code...
-duration = Rails.env.production? ? 60 : 0
+duration = Rails.env.production? ? 30 : 0
if Category.exec_sql("
SELECT 1 FROM schema_migration_details
WHERE EXISTS(
SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
- WHERE table_schema = 'public' AND table_name = 'categories' AND column_name = 'uploaded_logo_id'
+ WHERE table_schema = 'public' AND table_name = 'categories' AND column_name = 'logo_url'
) AND
name = 'AddUploadsToCategories' AND
- created_at < (current_timestamp at time zone 'UTC' - interval '#{duration} minutes')
+ created_at < (current_timestamp at time zone 'UTC' - interval '#{duration} days')
").to_a.length > 0
diff --git a/db/fixtures/999_topics.rb b/db/fixtures/999_topics.rb
index e46419fd20..477ea2d40c 100644
--- a/db/fixtures/999_topics.rb
+++ b/db/fixtures/999_topics.rb
@@ -40,10 +40,9 @@ end
if seed_welcome_topics
puts "Seeding welcome topics"
- PostCreator.create(Discourse.system_user, raw: I18n.t('assets_topic_body'), title: "Assets for the site design", skip_validations: true, category: staff ? staff.name : nil)
+ PostCreator.create(Discourse.system_user, raw: I18n.t('assets_topic_body'), title: I18n.t('assets_topic_title'), skip_validations: true, category: staff ? staff.name : nil)
- welcome = File.read(Rails.root + 'docs/WELCOME-TO-DISCOURSE.md')
- post = PostCreator.create(Discourse.system_user, raw: welcome, title: "Welcome to Discourse", skip_validations: true)
+ post = PostCreator.create(Discourse.system_user, raw: I18n.t('discourse_welcome_topic.body'), title: I18n.t('discourse_welcome_topic.title'), skip_validations: true)
post.topic.update_pinned(true, true)
lounge = Category.find_by(id: SiteSetting.lounge_category_id)
diff --git a/db/migrate/20161215201907_migrate_featured_link_fields.rb b/db/migrate/20161215201907_migrate_featured_link_fields.rb
new file mode 100644
index 0000000000..44820a912e
--- /dev/null
+++ b/db/migrate/20161215201907_migrate_featured_link_fields.rb
@@ -0,0 +1,6 @@
+class MigrateFeaturedLinkFields < ActiveRecord::Migration
+ def change
+ add_column :topics, :featured_link, :string
+ add_column :categories, :topic_featured_link_allowed, :boolean, default: true
+ end
+end
diff --git a/db/migrate/20161216101352_add_all_topics_wiki_to_categories.rb b/db/migrate/20161216101352_add_all_topics_wiki_to_categories.rb
new file mode 100644
index 0000000000..7d5fc43000
--- /dev/null
+++ b/db/migrate/20161216101352_add_all_topics_wiki_to_categories.rb
@@ -0,0 +1,5 @@
+class AddAllTopicsWikiToCategories < ActiveRecord::Migration
+ def change
+ add_column :categories, :all_topics_wiki, :boolean, default: false, null: false
+ end
+end
\ No newline at end of file
diff --git a/docs/WELCOME-TO-DISCOURSE.md b/docs/WELCOME-TO-DISCOURSE.md
deleted file mode 100644
index 42c2f12fb9..0000000000
--- a/docs/WELCOME-TO-DISCOURSE.md
+++ /dev/null
@@ -1,12 +0,0 @@
-The first paragraph of this pinned topic will be visible as a welcome message to all new visitors on your homepage. It's important!
-
-**Edit this** into a brief description of your community:
-
-- Who is it for?
-- What can they find here?
-- Why should they come here?
-- Where can they read more (links, resources, etc)?
-
-
-
-You may want to close this topic via the admin :wrench: (at the upper right and bottom), so that replies don't pile up on an announcement.
diff --git a/lib/discourse_featured_link.rb b/lib/discourse_featured_link.rb
deleted file mode 100644
index 304383e923..0000000000
--- a/lib/discourse_featured_link.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-module DiscourseFeaturedLink
- CUSTOM_FIELD_NAME = 'featured_link'.freeze
-
- AdminDashboardData::GLOBAL_REPORTS << CUSTOM_FIELD_NAME
-
- Report.add_report(CUSTOM_FIELD_NAME) do |report|
- report.data = []
- link_topics = TopicCustomField.where(name: CUSTOM_FIELD_NAME)
- link_topics = link_topics.joins(:topic).where("topics.category_id = ?", report.category_id) if report.category_id
- link_topics.where("topic_custom_fields.created_at >= ?", report.start_date)
- .where("topic_custom_fields.created_at <= ?", report.end_date)
- .group("DATE(topic_custom_fields.created_at)")
- .order("DATE(topic_custom_fields.created_at)")
- .count
- .each { |date, count| report.data << { x: date, y: count } }
- report.total = link_topics.count
- report.prev30Days = link_topics.where("topic_custom_fields.created_at >= ?", report.start_date - 30.days)
- .where("topic_custom_fields.created_at <= ?", report.start_date)
- .count
- end
-
- def self.cache_onebox_link(link)
- # If the link is pasted swiftly, onebox may not have time to cache it
- Oneboxer.onebox(link, invalidate_oneboxes: false)
- link
- end
-end
diff --git a/lib/email/styles.rb b/lib/email/styles.rb
index 39adcf88cd..a6fb8e2732 100644
--- a/lib/email/styles.rb
+++ b/lib/email/styles.rb
@@ -152,23 +152,24 @@ module Email
end
def format_html
+ style('.with-accent-colors', "background-color: #{SiteSetting.email_accent_bg_color}; color: #{SiteSetting.email_accent_fg_color};")
style('h4', 'color: #222;')
style('h3', 'margin: 15px 0 20px 0;')
style('hr', 'background-color: #ddd; height: 1px; border: 1px;')
- style('a', 'text-decoration: none; font-weight: bold; color: #006699;')
+ style('a', "text-decoration: none; font-weight: bold; color: #{SiteSetting.email_link_color};")
style('ul', 'margin: 0 0 0 10px; padding: 0 0 0 20px;')
style('li', 'padding-bottom: 10px')
- style('div.digest-post', 'margin-left: 15px; margin-top: -5px; max-width: 694px;')
- style('div.digest-post h1', 'font-size: 20px;')
style('div.footer', 'color:#666; font-size:95%; text-align:center; padding-top:15px;')
style('span.post-count', 'margin: 0 5px; color: #777;')
style('pre', 'word-wrap: break-word; max-width: 694px;')
style('code', 'background-color: #f1f1ff; padding: 2px 5px;')
style('pre code', 'display: block; background-color: #f1f1ff; padding: 5px;')
- style('.featured-topic a', 'text-decoration: none; font-weight: bold; color: #006699; line-height:1.5em;')
+ style('.featured-topic a', "text-decoration: none; font-weight: bold; color: #{SiteSetting.email_link_color}; line-height:1.5em;")
onebox_styles
plugin_styles
+
+ style('.post-excerpt img', "max-width: 50%; max-height: 400px;")
end
# this method is reserved for styles specific to plugin
diff --git a/lib/freedom_patches/fast_pluck.rb b/lib/freedom_patches/fast_pluck.rb
index 45da855036..ac1203c66d 100644
--- a/lib/freedom_patches/fast_pluck.rb
+++ b/lib/freedom_patches/fast_pluck.rb
@@ -1,5 +1,6 @@
# Speeds up #pluck so its about 2.2x faster, importantly makes pluck avoid creation of a slew
# of AR objects
+#
require_dependency 'sql_builder'
@@ -34,22 +35,10 @@ class ActiveRecord::Relation
# end
class ::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
- if Rails.version >= "4.2.0"
- def select_raw(arel, name = nil, binds = [], &block)
- arel, binds = binds_from_relation arel, binds
- sql = to_sql(arel, binds)
- execute_and_clear(sql, name, binds, &block)
- end
- else
-
- def select_raw(arel, name = nil, binds = [], &block)
- arel, binds = binds_from_relation arel, binds
- sql = to_sql(arel, binds)
-
- result = without_prepared_statement?(binds) ? exec_no_cache(sql, 'SQL', binds) :
- exec_cache(sql, 'SQL', binds)
- yield result, nil
- end
+ def select_raw(arel, name = nil, binds = [], &block)
+ arel, binds = binds_from_relation arel, binds
+ sql = to_sql(arel, binds)
+ execute_and_clear(sql, name, binds, &block)
end
end
@@ -66,7 +55,6 @@ class ActiveRecord::Relation
end
end
-
if has_include?(cols.first)
construct_relation_for_association_calculations.pluck(*cols)
else
@@ -76,7 +64,7 @@ class ActiveRecord::Relation
columns_hash.key?(cn) ? arel_table[cn] : cn
}
- conn.select_raw(relation) do |result,_|
+ conn.select_raw(relation, nil, relation.arel.bind_values + bind_values) do |result,_|
result.type_map = SqlBuilder.pg_type_map
result.nfields == 1 ? result.column_values(0) : result.values
end
diff --git a/lib/guardian/category_guardian.rb b/lib/guardian/category_guardian.rb
index ccebde7dbf..7e67066e89 100644
--- a/lib/guardian/category_guardian.rb
+++ b/lib/guardian/category_guardian.rb
@@ -70,7 +70,6 @@ module CategoryGuardian
end
def topic_featured_link_allowed_category_ids
- @topic_featured_link_allowed_category_ids = CategoryCustomField.where(name: "topic_featured_link_allowed", value: "true")
- .pluck(:category_id)
+ @topic_featured_link_allowed_category_ids = Category.where(topic_featured_link_allowed: true).pluck(:id)
end
end
diff --git a/lib/guardian/topic_guardian.rb b/lib/guardian/topic_guardian.rb
index b107fc7e66..f61a6139f8 100644
--- a/lib/guardian/topic_guardian.rb
+++ b/lib/guardian/topic_guardian.rb
@@ -106,8 +106,7 @@ module TopicGuardian
end
def can_edit_featured_link?(category_id)
- SiteSetting.topic_featured_link_enabled &&
- (topic_featured_link_allowed_category_ids.empty? || # no per category restrictions
- category_id && topic_featured_link_allowed_category_ids.include?(category_id.to_i)) # category restriction exists
+ return false unless SiteSetting.topic_featured_link_enabled
+ Category.where(id: category_id||SiteSetting.uncategorized_category_id, topic_featured_link_allowed: true).exists?
end
end
diff --git a/lib/import_export/category_exporter.rb b/lib/import_export/category_exporter.rb
index 745c9f9dbd..9f182e7247 100644
--- a/lib/import_export/category_exporter.rb
+++ b/lib/import_export/category_exporter.rb
@@ -25,7 +25,7 @@ module ImportExport
CATEGORY_ATTRS = [:id, :name, :color, :created_at, :user_id, :slug, :description, :text_color,
:auto_close_hours, :auto_close_based_on_last_post,
- :topic_template, :suppress_from_homepage, :permissions_params]
+ :topic_template, :suppress_from_homepage, :all_topics_wiki, :permissions_params]
def export_categories
@export_data[:category] = CATEGORY_ATTRS.inject({}) { |h,a| h[a] = @category.send(a); h }
diff --git a/lib/letter_avatar.rb b/lib/letter_avatar.rb
index 7c79c033e9..79e1a9b884 100644
--- a/lib/letter_avatar.rb
+++ b/lib/letter_avatar.rb
@@ -57,11 +57,11 @@ class LetterAvatar
def cached_path(identity, size)
dir = "#{cache_path}/#{identity.letter}/#{identity.color.join("_")}"
FileUtils.mkdir_p(dir)
- "#{dir}/#{size}.png"
+ File.expand_path "#{dir}/#{size}.png"
end
def fullsize_path(identity)
- cached_path(identity, FULLSIZE)
+ File.expand_path cached_path(identity, FULLSIZE)
end
def generate_fullsize(identity)
diff --git a/lib/middleware/unicorn_oobgc.rb b/lib/middleware/unicorn_oobgc.rb
deleted file mode 100644
index 0764b27e51..0000000000
--- a/lib/middleware/unicorn_oobgc.rb
+++ /dev/null
@@ -1,141 +0,0 @@
-# THIS FILE IS TO BE EXTRACTED FROM DISCOURSE IT IS LICENSED UNDER THE MIT LICENSE
-#
-# The MIT License (MIT)
-#
-# Copyright (c) 2013 Discourse
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-# THE SOFTWARE.
-
-# Hook into unicorn, unicorn middleware, not rack middleware
-#
-# Since we need no knowledge about the request we can simply
-# hook unicorn
-module Middleware::UnicornOobgc
-
- MIN_REQUESTS_PER_OOBGC = 3
-
- # TUNE ME, for Discourse this number is good
- MIN_FREE_SLOTS = 50_000
-
- # The oobgc implementation is far more efficient in 2.1
- # as we have a bunch of profiling hooks to hook it
- # use @tmm1s implementation
- def use_gctools?
- if @use_gctools.nil?
- @use_gctools =
- if RUBY_VERSION >= "2.1.0"
- require "gctools/oobgc"
- true
- else
- false
- end
- end
- @use_gctools
- end
-
- def verbose(msg=nil)
- @verbose ||= ENV["OOBGC_VERBOSE"] == "1" ? :true : :false
- if @verbose == :true
- if(msg)
- puts msg
- end
-
- true
- end
- end
-
- def self.init
- # hook up HttpServer intercept
- ObjectSpace.each_object(Unicorn::HttpServer) do |s|
- s.extend(self)
- end
- rescue
- puts "Attempted to patch Unicorn but it is not loaded"
- end
-
- # the closer this is to the GC run the more accurate it is
- def estimate_live_num_at_gc(stat)
- stat[:heap_live_num] + stat[:heap_free_num]
- end
-
- def process_client(client)
-
- if use_gctools?
- super(client)
- GC::OOB.run
- return
- end
-
- stat = GC.stat
-
- @num_requests ||= 0
- @num_requests += 1
-
- gc_count = stat[:count]
- live_num = stat[:heap_live_num]
-
- @expect_gc_at ||= estimate_live_num_at_gc(stat)
-
- super(client) # Unicorn::HttpServer#process_client
-
- # at this point client is serviced
- stat = GC.stat
- new_gc_count = stat[:count]
- new_live_num = stat[:heap_live_num]
-
- # no GC happened during the request
- if new_gc_count == gc_count
- delta = new_live_num - live_num
-
- @max_delta ||= delta
-
- if delta > @max_delta
- new_delta = (@max_delta * 1.5).to_i
- @max_delta = [new_delta, delta].min
- else
- # this may seem like a very tiny decay rate, but some apps using caching
- # can really mess stuff up, if our delta is too low the algorithm fails
- new_delta = (@max_delta * 0.99).to_i
- @max_delta = [new_delta, delta].max
- end
-
- if @max_delta < MIN_FREE_SLOTS
- @max_delta = MIN_FREE_SLOTS
- end
-
- if @num_requests > MIN_REQUESTS_PER_OOBGC && @max_delta * 2 + new_live_num > @expect_gc_at
- t = Time.now
- GC.start
- stat = GC.stat
- @expect_gc_at = estimate_live_num_at_gc(stat)
- verbose "OobGC hit pid: #{Process.pid} req: #{@num_requests} max delta: #{@max_delta} expect at: #{@expect_gc_at} #{((Time.now - t) * 1000).to_i}ms saved"
- @num_requests = 0
- end
- else
-
- verbose "OobGC miss pid: #{Process.pid} reqs: #{@num_requests} max delta: #{@max_delta}"
-
- @num_requests = 0
- @expect_gc_at = estimate_live_num_at_gc(stat)
-
- end
-
- end
-
-end
diff --git a/lib/onebox/engine/discourse_local_onebox.rb b/lib/onebox/engine/discourse_local_onebox.rb
index 34bc278961..44b6003039 100644
--- a/lib/onebox/engine/discourse_local_onebox.rb
+++ b/lib/onebox/engine/discourse_local_onebox.rb
@@ -34,9 +34,9 @@ module Onebox
def upload_html(path)
case File.extname(path)
- when /^\.(mov|mp4|webm|ogv)$/
+ when /^\.(mov|mp4|webm|ogv)$/i
""
- when /^\.(mp3|ogg|wav)$/
+ when /^\.(mp3|ogg|wav|m4a)$/i
""
end
end
diff --git a/lib/oneboxer.rb b/lib/oneboxer.rb
index 13d8152202..5a2b656525 100644
--- a/lib/oneboxer.rb
+++ b/lib/oneboxer.rb
@@ -16,13 +16,13 @@ module Oneboxer
def self.preview(url, options=nil)
options ||= {}
- Oneboxer.invalidate(url) if options[:invalidate_oneboxes]
+ invalidate(url) if options[:invalidate_oneboxes]
onebox_raw(url)[:preview]
end
def self.onebox(url, options=nil)
options ||= {}
- Oneboxer.invalidate(url) if options[:invalidate_oneboxes]
+ invalidate(url) if options[:invalidate_oneboxes]
onebox_raw(url)[:onebox]
end
@@ -88,7 +88,7 @@ module Oneboxer
doc = Nokogiri::HTML::fragment(doc) if doc.is_a?(String)
changed = false
- Oneboxer.each_onebox_link(doc) do |url, element|
+ each_onebox_link(doc) do |url, element|
if args && args[:topic_id]
url = append_source_topic_id(url, args[:topic_id])
end
@@ -112,8 +112,24 @@ module Oneboxer
Result.new(doc, changed)
end
+ def self.is_previewing?(user_id)
+ $redis.get(preview_key(user_id)) == "1"
+ end
+
+ def self.preview_onebox!(user_id)
+ $redis.setex(preview_key(user_id), 1.minute, "1")
+ end
+
+ def self.onebox_previewed!(user_id)
+ $redis.del(preview_key(user_id))
+ end
+
private
+ def self.preview_key(user_id)
+ "onebox:preview:#{user_id}"
+ end
+
def self.blank_onebox
{ preview: "", onebox: "" }
end
diff --git a/lib/post_creator.rb b/lib/post_creator.rb
index 8797a48f8f..1c9de20e6e 100644
--- a/lib/post_creator.rb
+++ b/lib/post_creator.rb
@@ -5,7 +5,6 @@ require_dependency 'topic_creator'
require_dependency 'post_jobs_enqueuer'
require_dependency 'distributed_mutex'
require_dependency 'has_errors'
-require_dependency 'discourse_featured_link'
class PostCreator
include HasErrors
@@ -361,6 +360,9 @@ class PostCreator
end
@post.topic_id = @topic.id
@post.topic = @topic
+ if @topic && @topic.category && @topic.category.all_topics_wiki
+ @post.wiki = true
+ end
end
def update_topic_stats
diff --git a/lib/post_destroyer.rb b/lib/post_destroyer.rb
index fbb9bff2f5..ec4047bce1 100644
--- a/lib/post_destroyer.rb
+++ b/lib/post_destroyer.rb
@@ -187,7 +187,7 @@ class PostDestroyer
def recover_user_actions
# TODO: Use a trash concept for `user_actions` to avoid churn and simplify this?
- UserActionObserver.log_post(@post)
+ UserActionCreator.log_post(@post)
end
def remove_associated_replies
diff --git a/lib/post_revisor.rb b/lib/post_revisor.rb
index 4fea530847..bf12588e70 100644
--- a/lib/post_revisor.rb
+++ b/lib/post_revisor.rb
@@ -250,7 +250,7 @@ class PostRevisor
prev_owner = User.find(@post.user_id)
new_owner = User.find(@fields["user_id"])
- # UserActionObserver will create new UserAction records for the new owner
+ # UserActionCreator will create new UserAction records for the new owner
UserAction.where(target_post_id: @post.id)
.where(user_id: prev_owner.id)
diff --git a/lib/search.rb b/lib/search.rb
index 6f0e374faa..cdad501bd8 100644
--- a/lib/search.rb
+++ b/lib/search.rb
@@ -54,7 +54,7 @@ class Search
posts.each do |post|
# force indexing
post.cooked += " "
- SearchObserver.index(post)
+ SearchIndexer.index(post)
end
posts = Post.joins(:topic)
@@ -67,7 +67,7 @@ class Search
posts.each do |post|
# force indexing
post.cooked += " "
- SearchObserver.index(post)
+ SearchIndexer.index(post)
end
nil
diff --git a/lib/search/grouped_search_results.rb b/lib/search/grouped_search_results.rb
index 2fa450bb74..47e1325488 100644
--- a/lib/search/grouped_search_results.rb
+++ b/lib/search/grouped_search_results.rb
@@ -49,7 +49,7 @@ class Search
def self.blurb_for(cooked, term=nil, blurb_length=200)
- cooked = SearchObserver::HtmlScrubber.scrub(cooked).squish
+ cooked = SearchIndexer::HtmlScrubber.scrub(cooked).squish
blurb = nil
if term
diff --git a/lib/tasks/search.rake b/lib/tasks/search.rake
index 4f118227c6..c944812d79 100644
--- a/lib/tasks/search.rake
+++ b/lib/tasks/search.rake
@@ -18,8 +18,8 @@ def reindex_search(db=RailsMultisite::ConnectionManagement.current_db)
post_number = p["post_number"].to_i
topic_id = p["topic_id"].to_i
- SearchObserver.update_posts_index(post_id, cooked, title, category)
- SearchObserver.update_topics_index(topic_id, title , cooked) if post_number == 1
+ SearchIndexer.update_posts_index(post_id, cooked, title, category)
+ SearchIndexer.update_topics_index(topic_id, title , cooked) if post_number == 1
putc "."
end
@@ -30,7 +30,7 @@ def reindex_search(db=RailsMultisite::ConnectionManagement.current_db)
id = u["id"]
name = u["name"]
username = u["username"]
- SearchObserver.update_users_index(id, username, name)
+ SearchIndexer.update_users_index(id, username, name)
putc "."
end
@@ -41,7 +41,7 @@ def reindex_search(db=RailsMultisite::ConnectionManagement.current_db)
Category.exec_sql("select id, name from categories").each do |c|
id = c["id"]
name = c["name"]
- SearchObserver.update_categories_index(id, name)
+ SearchIndexer.update_categories_index(id, name)
end
puts
diff --git a/lib/tasks/user_actions.rake b/lib/tasks/user_actions.rake
index b9ced27e4e..ffba1f2b22 100644
--- a/lib/tasks/user_actions.rake
+++ b/lib/tasks/user_actions.rake
@@ -1,13 +1,15 @@
desc "rebuild the user_actions table"
task "user_actions:rebuild" => :environment do
- o = UserActionObserver.send :new
MessageBus.off
UserAction.delete_all
- PostAction.all.each{|i| o.after_save(i)}
- Topic.all.each {|i| o.after_save(i)}
- Post.all.each {|i| o.after_save(i)}
- Notification.all.each {|i| o.after_save(i)}
- # not really needed but who knows
- MessageBus.on
+ PostAction.all.each{|i| UserActionCreator.log_post_action(i)}
+ Topic.all.each {|i| UserActionCreator.log_topic(i)}
+ Post.all.each {|i| UserActionCreator.log_post(i)}
+ Notification.all.each do |notification|
+ UserActionCreator.log_notification(notification.post,
+ notification.user,
+ notification.notification_type,
+ notification.user)
+ end
end
diff --git a/lib/version.rb b/lib/version.rb
index b1ca02d97f..cbb65b4435 100644
--- a/lib/version.rb
+++ b/lib/version.rb
@@ -5,7 +5,7 @@ module Discourse
MAJOR = 1
MINOR = 7
TINY = 0
- PRE = 'beta10'
+ PRE = 'beta11'
STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
end
diff --git a/plugins/discourse-details/assets/javascripts/initializers/apply-details.js.es6 b/plugins/discourse-details/assets/javascripts/initializers/apply-details.js.es6
index ca9cbbda66..074d93a3b4 100644
--- a/plugins/discourse-details/assets/javascripts/initializers/apply-details.js.es6
+++ b/plugins/discourse-details/assets/javascripts/initializers/apply-details.js.es6
@@ -21,6 +21,7 @@ function initializeDetails(api) {
"details_text",
{ multiline: false }
);
+ this.set('optionsVisible', false);
}
}
});
diff --git a/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6 b/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6
index afe45dfffd..427687886a 100644
--- a/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6
+++ b/plugins/discourse-details/test/javascripts/acceptance/details-button-test.js.es6
@@ -36,7 +36,7 @@ test('details button', () => {
equal(
find(".d-editor-input").val(),
`[details=${I18n.t("composer.details_title")}]This is my title[/details]`,
- 'it should contain the right output'
+ 'it should contain the right selected output'
);
const textarea = findTextarea();
diff --git a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6 b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6
index 1f2fe22c32..e6d961a562 100644
--- a/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6
+++ b/plugins/poll/assets/javascripts/widgets/discourse-poll.js.es6
@@ -78,8 +78,10 @@ createWidget('discourse-poll-voters', {
fetchVoters() {
const { attrs, state } = this;
+ if (state.loaded === 'loading') { return; }
const { voterIds } = attrs;
+
if (!voterIds.length) { return; }
const windowSize = Math.round(($('.poll-container:eq(0)').width() / 25) * 2);
@@ -136,7 +138,19 @@ createWidget('discourse-poll-standard-results', {
if (options) {
const voters = poll.get('voters');
- const ordered = options.sort((a, b) => b.votes - a.votes);
+ const ordered = options.sort((a, b) => {
+ if (a.votes < b.votes) {
+ return 1;
+ } else if (a.votes === b.votes) {
+ if (a.html < b.html) {
+ return -1;
+ } else {
+ return 1;
+ }
+ } else {
+ return -1;
+ }
+ });
const percentages = voters === 0 ?
Array(ordered.length).fill(0) :
diff --git a/plugins/poll/config/locales/server.ja.yml b/plugins/poll/config/locales/server.ja.yml
index 7866ecedb9..7cb65b2a8a 100644
--- a/plugins/poll/config/locales/server.ja.yml
+++ b/plugins/poll/config/locales/server.ja.yml
@@ -7,7 +7,7 @@
ja:
site_settings:
- poll_enabled: "ユーザによる投票を許可しますか?"
+ poll_enabled: "ユーザーによる投票を許可しますか?"
poll_maximum_options: "投票で許可されるオプションの最大数。"
poll:
multiple_polls_without_name: "名前のない複数の投票があります。一意に投票結果を識別するために、属性'name'を使用します。"
diff --git a/plugins/poll/test/javascripts/acceptance/polls-test.js.es6 b/plugins/poll/test/javascripts/acceptance/polls-test.js.es6
index 401838b610..35aec81b5c 100644
--- a/plugins/poll/test/javascripts/acceptance/polls-test.js.es6
+++ b/plugins/poll/test/javascripts/acceptance/polls-test.js.es6
@@ -1,5 +1,4 @@
-import { acceptance, controllerFor } from "helpers/qunit-helpers";
-import PostCooked from 'discourse/widgets/post-cooked';
+import { acceptance } from "helpers/qunit-helpers";
acceptance("Rendering polls", {
loggedIn: true,
@@ -11,7 +10,7 @@ acceptance("Rendering polls", {
{ "Content-Type": "application/json" },
object
];
- }
+ };
server.get('/t/13.json', () => {
return response({"post_stream":{"posts":[{"id":19,"name":null,"username":"tgx","avatar_template":"/letter_avatar_proxy/v2/letter/t/ecae2f/{size}.png","created_at":"2016-12-01T02:39:49.199Z","cooked":"\n\n","post_number":1,"post_type":1,"updated_at":"2016-12-01T02:47:18.317Z","reply_count":0,"reply_to_post_number":null,"quote_count":0,"avg_time":null,"incoming_link_count":0,"reads":1,"score":0,"yours":true,"topic_id":13,"topic_slug":"this-is-a-test-topic-for-polls","display_username":null,"primary_group_name":null,"primary_group_flair_url":null,"primary_group_flair_bg_color":null,"primary_group_flair_color":null,"version":2,"can_edit":true,"can_delete":false,"can_recover":true,"can_wiki":true,"read":true,"user_title":null,"actions_summary":[{"id":3,"can_act":true},{"id":4,"can_act":true},{"id":5,"hidden":true,"can_act":true},{"id":7,"can_act":true},{"id":8,"can_act":true}],"moderator":false,"admin":true,"staff":true,"user_id":1,"hidden":false,"hidden_reason_id":null,"trust_level":4,"deleted_at":null,"user_deleted":false,"edit_reason":null,"can_view_edit_history":true,"wiki":false,"polls":{"poll":{"options":[{"id":"57ddd734344eb7436d64a7d68a0df444","html":"test","votes":0},{"id":"b5b78d79ab5b5d75d4d33d8b87f5d2aa","html":"haha","votes":0}],"voters":2,"status":"open","name":"poll"},"test":{"options":[{"id":"c26ad90783b0d80936e5fdb292b7963c","html":"donkey","votes":0},{"id":"99f2b9ac452ba73b115fcf3556e6d2d4","html":"kong","votes":0}],"voters":3,"status":"open","name":"test"}}}],"stream":[19]},"timeline_lookup":[[1,0]],"id":13,"title":"This is a test topic for polls","fancy_title":"This is a test topic for polls","posts_count":1,"created_at":"2016-12-01T02:39:48.055Z","views":1,"reply_count":0,"participant_count":1,"like_count":0,"last_posted_at":"2016-12-01T02:39:49.199Z","visible":true,"closed":false,"archived":false,"has_summary":false,"archetype":"regular","slug":"this-is-a-test-topic-for-polls","category_id":1,"word_count":10,"deleted_at":null,"user_id":1,"draft":null,"draft_key":"topic_13","draft_sequence":4,"posted":true,"unpinned":null,"pinned_globally":false,"pinned":false,"pinned_at":null,"pinned_until":null,"details":{"auto_close_at":null,"auto_close_hours":null,"auto_close_based_on_last_post":false,"created_by":{"id":1,"username":"tgx","avatar_template":"/letter_avatar_proxy/v2/letter/t/ecae2f/{size}.png"},"last_poster":{"id":1,"username":"tgx","avatar_template":"/letter_avatar_proxy/v2/letter/t/ecae2f/{size}.png"},"participants":[{"id":1,"username":"tgx","avatar_template":"/letter_avatar_proxy/v2/letter/t/ecae2f/{size}.png","post_count":1}],"suggested_topics":[{"id":8,"title":"Welcome to Discourse","fancy_title":"Welcome to Discourse","slug":"welcome-to-discourse","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2016-11-24T02:10:54.328Z","last_posted_at":"2016-11-24T02:10:54.393Z","bumped":true,"bumped_at":"2016-11-24T02:10:54.393Z","unseen":false,"pinned":true,"unpinned":null,"excerpt":"The first paragraph of this pinned topic will be visible as a welcome message to all new visitors on your homepage. It's important! \n\nEdit this into a brief description of your community: \n\n\nWho is it for?\nWhat can they …","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"archetype":"regular","like_count":0,"views":0,"category_id":1,"posters":[{"extras":"latest single","description":"Original Poster, Most Recent Poster","user":{"id":-1,"username":"system","avatar_template":"/letter_avatar_proxy/v2/letter/s/bcef8e/{size}.png"}}]},{"id":12,"title":"Some testing topic testing","fancy_title":"Some testing topic testing","slug":"some-testing-topic-testing","posts_count":4,"reply_count":0,"highest_post_number":4,"image_url":null,"created_at":"2016-11-24T08:36:08.773Z","last_posted_at":"2016-12-01T01:15:52.008Z","bumped":true,"bumped_at":"2016-12-01T01:15:52.008Z","unseen":false,"last_read_post_number":4,"unread":0,"new_posts":0,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"archetype":"regular","like_count":0,"views":2,"category_id":1,"posters":[{"extras":"latest single","description":"Original Poster, Most Recent Poster","user":{"id":1,"username":"tgx","avatar_template":"/letter_avatar_proxy/v2/letter/t/ecae2f/{size}.png"}}]},{"id":11,"title":"Some testing topic","fancy_title":"Some testing topic","slug":"some-testing-topic","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2016-11-24T08:35:26.758Z","last_posted_at":"2016-11-24T08:35:26.894Z","bumped":true,"bumped_at":"2016-11-24T08:35:26.894Z","unseen":false,"last_read_post_number":1,"unread":0,"new_posts":0,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"archetype":"regular","like_count":0,"views":0,"category_id":1,"posters":[{"extras":"latest single","description":"Original Poster, Most Recent Poster","user":{"id":1,"username":"tgx","avatar_template":"/letter_avatar_proxy/v2/letter/t/ecae2f/{size}.png"}}]}],"notification_level":3,"notifications_reason_id":1,"can_move_posts":true,"can_edit":true,"can_delete":true,"can_recover":true,"can_remove_allowed_users":true,"can_invite_to":true,"can_create_post":true,"can_reply_as_new_topic":true,"can_flag_topic":true},"highest_post_number":1,"last_read_post_number":1,"last_read_post_id":19,"deleted_by":null,"has_deleted":false,"actions_summary":[{"id":4,"count":0,"hidden":false,"can_act":true},{"id":7,"count":0,"hidden":false,"can_act":true},{"id":8,"count":0,"hidden":false,"can_act":true}],"chunk_size":20,"bookmarked":false});
diff --git a/plugins/poll/test/javascripts/widgets/discourse-poll-standard-results-test.js.es6 b/plugins/poll/test/javascripts/widgets/discourse-poll-standard-results-test.js.es6
index a4172adcee..f1668b1179 100644
--- a/plugins/poll/test/javascripts/widgets/discourse-poll-standard-results-test.js.es6
+++ b/plugins/poll/test/javascripts/widgets/discourse-poll-standard-results-test.js.es6
@@ -45,10 +45,11 @@ widgetTest('multiple options in descending order', {
this.set('poll', Ember.Object.create({
type: 'multiple',
options: [
- { votes: 5 },
- { votes: 2 },
- { votes: 4 },
- { votes: 1 }
+ { votes: 5, html: 'a' },
+ { votes: 2, html: 'b' },
+ { votes: 4, html: 'c' },
+ { votes: 1, html: 'b' },
+ { votes: 1, html: 'a' }
],
voters: 12
}));
@@ -59,5 +60,8 @@ widgetTest('multiple options in descending order', {
assert.equal(this.$('.option .percentage:eq(1)').text(), '33%');
assert.equal(this.$('.option .percentage:eq(2)').text(), '16%');
assert.equal(this.$('.option .percentage:eq(3)').text(), '8%');
+ assert.equal(this.$('.option span:nth-child(2):eq(3)').text(), 'a');
+ assert.equal(this.$('.option .percentage:eq(4)').text(), '8%');
+ assert.equal(this.$('.option span:nth-child(2):eq(4)').text(), 'b');
}
});
diff --git a/spec/components/guardian_spec.rb b/spec/components/guardian_spec.rb
index f461598501..c559c7f92a 100644
--- a/spec/components/guardian_spec.rb
+++ b/spec/components/guardian_spec.rb
@@ -2285,21 +2285,33 @@ describe Guardian do
context 'topic featured link category restriction' do
before { SiteSetting.topic_featured_link_enabled = true }
let(:guardian) { Guardian.new }
+ let(:uncategorized) { Category.find(SiteSetting.uncategorized_category_id) }
- it 'returns true if no category restricts editing link' do
- expect(guardian.can_edit_featured_link?(nil)).to eq(true)
- expect(guardian.can_edit_featured_link?(5)).to eq(true)
+ context "uncategorized" do
+ let!(:link_category) { Fabricate(:link_category) }
+
+ it "allows featured links if uncategorized allows it" do
+ uncategorized.topic_featured_link_allowed = true
+ uncategorized.save!
+ expect(guardian.can_edit_featured_link?(nil)).to eq(true)
+ end
+
+ it "forbids featured links if uncategorized forbids it" do
+ uncategorized.topic_featured_link_allowed = false
+ uncategorized.save!
+ expect(guardian.can_edit_featured_link?(nil)).to eq(false)
+ end
end
context 'when exist' do
- let!(:category) { Fabricate(:category) }
+ let!(:category) { Fabricate(:category, topic_featured_link_allowed: false) }
let!(:link_category) { Fabricate(:link_category) }
it 'returns true if the category is listed' do
expect(guardian.can_edit_featured_link?(link_category.id)).to eq(true)
end
- it 'returns false if the category is not listed' do
+ it 'returns false if the category does not allow it' do
expect(guardian.can_edit_featured_link?(category.id)).to eq(false)
end
end
diff --git a/spec/components/onebox/engine/discourse_local_onebox_spec.rb b/spec/components/onebox/engine/discourse_local_onebox_spec.rb
index c3b015befc..3a6d0862ce 100644
--- a/spec/components/onebox/engine/discourse_local_onebox_spec.rb
+++ b/spec/components/onebox/engine/discourse_local_onebox_spec.rb
@@ -66,20 +66,23 @@ describe Onebox::Engine::DiscourseLocalOnebox do
context "for a link to an internal audio or video file" do
+ let(:sha) { Digest::SHA1.hexdigest("discourse") }
+ let(:path) { "/uploads/default/original/3X/5/c/#{sha}" }
+
it "returns nil if file type is not audio or video" do
- url = "#{Discourse.base_url}/uploads/default/original/3X/5/c/24asdf42.pdf"
+ url = "#{Discourse.base_url}#{path}.pdf"
FakeWeb.register_uri(:get, url, body: "")
expect(Onebox.preview(url).to_s).to eq("")
end
it "returns some onebox goodness for audio file" do
- url = "#{Discourse.base_url}/uploads/default/original/3X/5/c/24asdf42.mp3"
+ url = "#{Discourse.base_url}#{path}.MP3"
html = Onebox.preview(url).to_s
expect(html).to eq("")
end
it "returns some onebox goodness for video file" do
- url = "#{Discourse.base_url}/uploads/default/original/3X/5/c/24asdf42.mp4"
+ url = "#{Discourse.base_url}#{path}.mov"
html = Onebox.preview(url).to_s
expect(html).to eq("")
end
diff --git a/spec/components/post_creator_spec.rb b/spec/components/post_creator_spec.rb
index b6fe3fb660..6c14492394 100644
--- a/spec/components/post_creator_spec.rb
+++ b/spec/components/post_creator_spec.rb
@@ -5,7 +5,6 @@ require 'topic_subtype'
describe PostCreator do
before do
- ActiveRecord::Base.observers.enable :all
end
let(:user) { Fabricate(:user) }
@@ -34,6 +33,14 @@ describe PostCreator do
expect(TopicUser.where(user_id: p.user_id, topic_id: p.topic_id).count).to eq(0)
end
+ it "can be created with first post as wiki" do
+ cat = Fabricate(:category)
+ cat.all_topics_wiki = true
+ cat.save
+ post = PostCreator.create(user, basic_topic_params.merge(category: cat.id ))
+ expect(post.wiki).to eq(true)
+ end
+
it "ensures the user can create the topic" do
Guardian.any_instance.expects(:can_create?).with(Topic,nil).returns(false)
expect { creator.create }.to raise_error(Discourse::InvalidAccess)
@@ -99,6 +106,8 @@ describe PostCreator do
it "generates the correct messages for a secure topic" do
+ UserActionCreator.enable
+
admin = Fabricate(:admin)
cat = Fabricate(:category)
@@ -132,6 +141,8 @@ describe PostCreator do
it 'generates the correct messages for a normal topic' do
+ UserActionCreator.enable
+
p = nil
messages = MessageBus.track_publish do
p = creator.create
diff --git a/spec/components/post_destroyer_spec.rb b/spec/components/post_destroyer_spec.rb
index 6a506fd6a0..58781bd2f1 100644
--- a/spec/components/post_destroyer_spec.rb
+++ b/spec/components/post_destroyer_spec.rb
@@ -4,7 +4,7 @@ require 'post_destroyer'
describe PostDestroyer do
before do
- ActiveRecord::Base.observers.enable :all
+ UserActionCreator.enable
end
let(:moderator) { Fabricate(:moderator) }
diff --git a/spec/components/search_spec.rb b/spec/components/search_spec.rb
index 8d054157b1..a9184ef090 100644
--- a/spec/components/search_spec.rb
+++ b/spec/components/search_spec.rb
@@ -10,7 +10,7 @@ describe Search do
end
before do
- ActiveRecord::Base.observers.enable :search_observer
+ SearchIndexer.enable
end
context 'post indexing observer' do
diff --git a/spec/controllers/admin/groups_controller_spec.rb b/spec/controllers/admin/groups_controller_spec.rb
index dacdde2568..732d07c3ad 100644
--- a/spec/controllers/admin/groups_controller_spec.rb
+++ b/spec/controllers/admin/groups_controller_spec.rb
@@ -88,14 +88,19 @@ describe Admin::GroupsController do
it "ignore name change on automatic group" do
expect do
- xhr :put, :update, { id: 1, group: { name: "WAT", visible: "true" } }
- end.to_not change { GroupHistory.count }
+ xhr :put, :update, { id: 1, group: {
+ name: "WAT",
+ visible: "true",
+ allow_membership_requests: "true"
+ } }
+ end.to change { GroupHistory.count }.by(1)
expect(response).to be_success
group = Group.find(1)
expect(group.name).not_to eq("WAT")
expect(group.visible).to eq(true)
+ expect(group.allow_membership_requests).to eq(true)
end
it "doesn't launch the 'automatic group membership' job when it's not retroactive" do
diff --git a/spec/controllers/onebox_controller_spec.rb b/spec/controllers/onebox_controller_spec.rb
index a2f5c38174..adec21d4f8 100644
--- a/spec/controllers/onebox_controller_spec.rb
+++ b/spec/controllers/onebox_controller_spec.rb
@@ -4,42 +4,82 @@ describe OneboxController do
let(:url) { "http://google.com" }
- it 'invalidates the cache if refresh is passed' do
- Oneboxer.expects(:preview).with(url, invalidate_oneboxes: true)
- xhr :get, :show, url: url, refresh: 'true'
+ it "requires the user to be logged in" do
+ expect { xhr :get, :show, url: url }.to raise_error(Discourse::NotLoggedIn)
end
- describe "found onebox" do
+ describe "logged in" do
- let(:body) { "this is the onebox body"}
+ before { @user = log_in(:admin) }
- before do
- Oneboxer.expects(:preview).with(url, invalidate_oneboxes: false).returns(body)
- xhr :get, :show, url: url
+ it 'invalidates the cache if refresh is passed' do
+ Oneboxer.expects(:preview).with(url, invalidate_oneboxes: true)
+ xhr :get, :show, url: url, refresh: 'true', user_id: @user.id
end
- it 'returns success' do
- expect(response).to be_success
+ describe "cached onebox" do
+
+ let(:body) { "This is a cached onebox body" }
+
+ before do
+ Oneboxer.expects(:cached_preview).with(url).returns(body)
+ Oneboxer.expects(:preview).never
+ xhr :get, :show, url: url, user_id: @user.id
+ end
+
+ it "returns success" do
+ expect(response).to be_success
+ end
+
+ it "returns the cached onebox response in the body" do
+ expect(response.body).to eq(body)
+ end
+
end
- it 'returns the onebox response in the body' do
- expect(response.body).to eq(body)
+ describe "only 1 outgoing preview per user" do
+
+ it "returns 429" do
+ Oneboxer.expects(:is_previewing?).returns(true)
+ xhr :get, :show, url: url, user_id: @user.id
+ expect(response.status).to eq(429)
+ end
+
end
- end
+ describe "found onebox" do
- describe "missing onebox" do
+ let(:body) { "this is the onebox body"}
+
+ before do
+ Oneboxer.expects(:preview).with(url, invalidate_oneboxes: false).returns(body)
+ xhr :get, :show, url: url, user_id: @user.id
+ end
+
+ it 'returns success' do
+ expect(response).to be_success
+ end
+
+ it 'returns the onebox response in the body' do
+ expect(response.body).to eq(body)
+ end
- it "returns 404 if the onebox is nil" do
- Oneboxer.expects(:preview).with(url, invalidate_oneboxes: false).returns(nil)
- xhr :get, :show, url: url
- expect(response.response_code).to eq(404)
end
- it "returns 404 if the onebox is an empty string" do
- Oneboxer.expects(:preview).with(url, invalidate_oneboxes: false).returns(" \t ")
- xhr :get, :show, url: url
- expect(response.response_code).to eq(404)
+ describe "missing onebox" do
+
+ it "returns 404 if the onebox is nil" do
+ Oneboxer.expects(:preview).with(url, invalidate_oneboxes: false).returns(nil)
+ xhr :get, :show, url: url, user_id: @user.id
+ expect(response.response_code).to eq(404)
+ end
+
+ it "returns 404 if the onebox is an empty string" do
+ Oneboxer.expects(:preview).with(url, invalidate_oneboxes: false).returns(" \t ")
+ xhr :get, :show, url: url, user_id: @user.id
+ expect(response.response_code).to eq(404)
+ end
+
end
end
diff --git a/spec/controllers/search_controller_spec.rb b/spec/controllers/search_controller_spec.rb
index ceb07f93de..7e967f0b7d 100644
--- a/spec/controllers/search_controller_spec.rb
+++ b/spec/controllers/search_controller_spec.rb
@@ -5,7 +5,7 @@ describe SearchController do
context "integration" do
before do
- ActiveRecord::Base.observers.enable :search_observer
+ SearchIndexer.enable
end
it "can search correctly" do
diff --git a/spec/controllers/session_controller_spec.rb b/spec/controllers/session_controller_spec.rb
index 0354ff813d..50858f7acd 100644
--- a/spec/controllers/session_controller_spec.rb
+++ b/spec/controllers/session_controller_spec.rb
@@ -141,6 +141,19 @@ describe SessionController do
expect(response).to redirect_to('/b/')
end
+ it 'redirects to random url if it is allowed' do
+ SiteSetting.sso_allows_all_return_paths = true
+
+ sso = get_sso('https://gusundtrout.com')
+ sso.external_id = '666' # the number of the beast
+ sso.email = 'bob@bob.com'
+ sso.name = 'Sam Saffron'
+ sso.username = 'sam'
+
+ get :sso_login, Rack::Utils.parse_query(sso.payload)
+ expect(response).to redirect_to('https://gusundtrout.com')
+ end
+
it 'redirects to root if the host of the return_path is different' do
sso = get_sso('//eviltrout.com')
sso.external_id = '666' # the number of the beast
diff --git a/spec/controllers/static_controller_spec.rb b/spec/controllers/static_controller_spec.rb
index f8ba662984..732f94255a 100644
--- a/spec/controllers/static_controller_spec.rb
+++ b/spec/controllers/static_controller_spec.rb
@@ -3,6 +3,15 @@ require 'rails_helper'
describe StaticController do
context 'brotli_asset' do
+ it 'returns a brotli encoded 404 if asset is missing' do
+
+ get :brotli_asset, path: 'missing.js'
+
+ expect(response.status).to eq(404)
+ expect(response.headers['Content-Encoding']).not_to eq('br')
+ expect(response.headers["Cache-Control"]).to match(/max-age=5/)
+ end
+
it 'has correct headers for brotli assets' do
begin
assets_path = Rails.root.join("public/assets")
diff --git a/spec/controllers/uploads_controller_spec.rb b/spec/controllers/uploads_controller_spec.rb
index f06bd7fe78..3dd88514a0 100644
--- a/spec/controllers/uploads_controller_spec.rb
+++ b/spec/controllers/uploads_controller_spec.rb
@@ -170,7 +170,7 @@ describe UploadsController do
expect(response.response_code).to eq(404)
end
- it "returns 404 when the upload doens't exist" do
+ it "returns 404 when the upload doesn't exist" do
Upload.stubs(:find_by).returns(nil)
get :show, site: site, sha: sha, extension: "pdf"
@@ -187,6 +187,16 @@ describe UploadsController do
get :show, site: site, sha: sha, extension: "zip"
end
+ it "handles file without extension" do
+ SiteSetting.authorized_extensions = "*"
+ upload = Fabricate(:upload, original_filename: "image_file", sha1: sha)
+ controller.stubs(:render)
+ controller.expects(:send_file)
+
+ get :show, site: site, sha: sha
+ expect(response).to be_success
+ end
+
context "prevent anons from downloading files" do
before { SiteSetting.stubs(:prevent_anons_from_downloading_files).returns(true) }
diff --git a/spec/controllers/user_actions_controller_spec.rb b/spec/controllers/user_actions_controller_spec.rb
index 52583c7f86..9e60610127 100644
--- a/spec/controllers/user_actions_controller_spec.rb
+++ b/spec/controllers/user_actions_controller_spec.rb
@@ -9,7 +9,7 @@ describe UserActionsController do
end
it 'renders list correctly' do
- ActiveRecord::Base.observers.enable :all
+ UserActionCreator.enable
post = Fabricate(:post)
xhr :get, :index, username: post.user.username
diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb
index 95a8f2e573..5d4f5cb80b 100644
--- a/spec/controllers/users_controller_spec.rb
+++ b/spec/controllers/users_controller_spec.rb
@@ -237,6 +237,18 @@ describe UsersController do
end
context 'valid token' do
+ context 'when rendered' do
+ render_views
+
+ it 'renders referrer never on get requests' do
+ user = Fabricate(:user, auth_token: SecureRandom.hex(16))
+ token = user.email_tokens.create(email: user.email).token
+ get :password_reset, token: token
+
+ expect(response.body).to include('')
+ end
+ end
+
it 'returns success' do
user = Fabricate(:user, auth_token: SecureRandom.hex(16))
token = user.email_tokens.create(email: user.email).token
@@ -254,6 +266,19 @@ describe UsersController do
expect(session["password-#{token}"]).to be_blank
end
+ it 'disallows double password reset' do
+
+ user = Fabricate(:user, auth_token: SecureRandom.hex(16))
+ token = user.email_tokens.create(email: user.email).token
+
+ get :password_reset, token: token
+ put :password_reset, token: token, password: 'hg9ow8yhg98o'
+ put :password_reset, token: token, password: 'test123123Asdfsdf'
+
+ user.reload
+ expect(user.confirm_password?('hg9ow8yhg98o')).to eq(true)
+ end
+
it "redirects to the wizard if you're the first admin" do
user = Fabricate(:admin, auth_token: SecureRandom.hex(16), auth_token_updated_at: Time.now)
token = user.email_tokens.create(email: user.email).token
@@ -1306,7 +1331,7 @@ describe UsersController do
let(:user) { Fabricate :user, username: "joecabot", name: "Lawrence Tierney" }
before do
- ActiveRecord::Base.observers.enable :all
+ SearchIndexer.enable
Fabricate :post, user: user, topic: topic
end
diff --git a/spec/fabricators/embeddable_host_fabricator.rb b/spec/fabricators/embeddable_host_fabricator.rb
index 9f589d389e..582619f23b 100644
--- a/spec/fabricators/embeddable_host_fabricator.rb
+++ b/spec/fabricators/embeddable_host_fabricator.rb
@@ -27,5 +27,5 @@ Fabricator(:private_category, from: :category) do
end
Fabricator(:link_category, from: :category) do
- before_validation { |category, transients| category.custom_fields['topic_featured_link_allowed'] = 'true' }
+ before_validation { |category, transients| category.topic_featured_link_allowed = true }
end
diff --git a/spec/integration/groups_spec.rb b/spec/integration/groups_spec.rb
index cf2f054777..33e972bda6 100644
--- a/spec/integration/groups_spec.rb
+++ b/spec/integration/groups_spec.rb
@@ -4,19 +4,26 @@ describe "Groups" do
let(:user) { Fabricate(:user) }
let(:group) { Fabricate(:group, users: [user]) }
- def sign_in(user)
- password = 'somecomplicatedpassword'
- user.update!(password: password)
- Fabricate(:email_token, confirmed: true, user: user)
- post "/session.json", { login: user.username, password: password }
- expect(response).to be_success
- end
-
describe 'viewing groups' do
- it 'should return the right response' do
- group.update_attributes!(visible: true)
- other_group = Fabricate(:group, name: '0000', visible: true)
+ let(:other_group) do
+ Fabricate(:group, name: '0000', visible: true, automatic: false)
+ end
+ before do
+ other_group
+ group.update_attributes!(automatic: true, visible: true)
+ end
+
+ context 'when group directory is disabled' do
+ site_setting(:enable_group_directory, false)
+
+ it 'should deny access' do
+ get "/groups.json"
+ expect(response).to be_forbidden
+ end
+ end
+
+ it 'should return the right response' do
get "/groups.json"
expect(response).to be_success
@@ -25,8 +32,32 @@ describe "Groups" do
group_ids = response_body["groups"].map { |g| g["id"] }
- expect(group_ids).to include(group.id, other_group.id)
+ expect(response_body["extras"]["group_user_ids"]).to eq([])
+ expect(group_ids).to include(other_group.id)
+ expect(group_ids).to_not include(group.id)
expect(response_body["load_more_groups"]).to eq("/groups?page=1")
+ expect(response_body["total_rows_groups"]).to eq(1)
+ end
+
+ context 'viewing as an admin' do
+ it 'should display automatic groups' do
+ admin = Fabricate(:admin)
+ sign_in(admin)
+ group.add(admin)
+
+ get "/groups.json"
+
+ expect(response).to be_success
+
+ response_body = JSON.parse(response.body)
+
+ group_ids = response_body["groups"].map { |g| g["id"] }
+
+ expect(response_body["extras"]["group_user_ids"]).to eq([group.id])
+ expect(group_ids).to include(group.id, other_group.id)
+ expect(response_body["load_more_groups"]).to eq("/groups?page=1")
+ expect(response_body["total_rows_groups"]).to eq(10)
+ end
end
end
@@ -66,6 +97,8 @@ describe "Groups" do
end
it "should be able update the group" do
+ group.update!(allow_membership_requests: false)
+
expect do
xhr :put, "/groups/#{group.id}", { group: {
flair_bg_color: 'FFF',
@@ -135,7 +168,15 @@ describe "Groups" do
)
end
- let(:group) { Fabricate(:group, users: [user1, user2]) }
+ let(:user3) do
+ Fabricate(:user,
+ last_seen_at: nil,
+ last_posted_at: nil,
+ email: 'c@test.org'
+ )
+ end
+
+ let(:group) { Fabricate(:group, users: [user1, user2, user3]) }
it "should allow members to be sorted by" do
xhr :get, "/groups/#{group.name}/members", order: 'last_seen_at', desc: true
@@ -144,7 +185,7 @@ describe "Groups" do
members = JSON.parse(response.body)["members"]
- expect(members.map { |m| m["id"] }).to eq([user1.id, user2.id])
+ expect(members.map { |m| m["id"] }).to eq([user1.id, user2.id, user3.id])
xhr :get, "/groups/#{group.name}/members", order: 'last_seen_at'
@@ -152,7 +193,7 @@ describe "Groups" do
members = JSON.parse(response.body)["members"]
- expect(members.map { |m| m["id"] }).to eq([user2.id, user1.id])
+ expect(members.map { |m| m["id"] }).to eq([user2.id, user1.id, user3.id])
xhr :get, "/groups/#{group.name}/members", order: 'last_posted_at', desc: true
@@ -160,7 +201,7 @@ describe "Groups" do
members = JSON.parse(response.body)["members"]
- expect(members.map { |m| m["id"] }).to eq([user2.id, user1.id])
+ expect(members.map { |m| m["id"] }).to eq([user2.id, user1.id, user3.id])
end
it "should not allow members to be sorted by columns that are not allowed" do
@@ -170,7 +211,7 @@ describe "Groups" do
members = JSON.parse(response.body)["members"]
- expect(members.map { |m| m["id"] }).to eq([user1.id, user2.id])
+ expect(members.map { |m| m["id"] }).to eq([user1.id, user2.id, user3.id])
end
end
diff --git a/spec/integration/safe_mode_spec.rb b/spec/integration/safe_mode_spec.rb
new file mode 100644
index 0000000000..f421c8fb97
--- /dev/null
+++ b/spec/integration/safe_mode_spec.rb
@@ -0,0 +1,13 @@
+require 'rails_helper'
+
+RSpec.describe 'Safe mode' do
+ describe 'entering safe mode' do
+ context 'when no params are given' do
+ it 'should redirect back to safe mode page' do
+ post '/safe-mode'
+
+ expect(response.status).to redirect_to(safe_mode_path)
+ end
+ end
+ end
+end
diff --git a/spec/integration/users_spec.rb b/spec/integration/users_spec.rb
new file mode 100644
index 0000000000..7350c87ca5
--- /dev/null
+++ b/spec/integration/users_spec.rb
@@ -0,0 +1,54 @@
+require 'rails_helper'
+
+RSpec.describe "Users" do
+ let(:user) { Fabricate(:user) }
+
+ describe "viewing a user" do
+
+ it "should be able to view a user" do
+ get "/users/#{user.username}"
+
+ expect(response).to be_success
+ expect(response.body).to include(user.username)
+ end
+
+ describe 'when username contains a period' do
+ before do
+ user.update!(username: 'test.test')
+ end
+
+ it "should be able to view a user" do
+ get "/users/#{user.username}"
+
+ expect(response).to be_success
+ expect(response.body).to include(user.username)
+ end
+ end
+ end
+
+ describe "updating a user" do
+ before do
+ sign_in(user)
+ end
+
+ it "should be able to update a user" do
+ put "/users/#{user.username}.json", { name: 'test.test' }
+
+ expect(response).to be_success
+ expect(user.reload.name).to eq('test.test')
+ end
+
+ describe 'when username contains a period' do
+ before do
+ user.update!(username: 'test.test')
+ end
+
+ it "should be able to update a user" do
+ put "/users/#{user.username}.json", { name: 'testing123' }
+
+ expect(response).to be_success
+ expect(user.reload.name).to eq('testing123')
+ end
+ end
+ end
+end
diff --git a/spec/jobs/automatic_group_membership_spec.rb b/spec/jobs/automatic_group_membership_spec.rb
index e6d5999308..5989deb489 100644
--- a/spec/jobs/automatic_group_membership_spec.rb
+++ b/spec/jobs/automatic_group_membership_spec.rb
@@ -10,6 +10,8 @@ describe Jobs::AutomaticGroupMembership do
it "updates the membership" do
user1 = Fabricate(:user, email: "foo@wat.com")
user2 = Fabricate(:user, email: "foo@bar.com")
+ user3 = Fabricate(:user, email: "bar@wat.com", staged: true)
+ user4 = Fabricate(:user, email: "abc@wat.com", active: false)
group = Fabricate(:group, automatic_membership_email_domains: "wat.com", automatic_membership_retroactive: true)
Jobs::AutomaticGroupMembership.new.execute(group_id: group.id)
@@ -17,6 +19,8 @@ describe Jobs::AutomaticGroupMembership do
group.reload
expect(group.users.include?(user1)).to eq(true)
expect(group.users.include?(user2)).to eq(false)
+ expect(group.users.include?(user3)).to eq(false)
+ expect(group.users.include?(user4)).to eq(false)
end
end
diff --git a/spec/mailers/user_notifications_spec.rb b/spec/mailers/user_notifications_spec.rb
index a427b6d3b0..d6359818c9 100644
--- a/spec/mailers/user_notifications_spec.rb
+++ b/spec/mailers/user_notifications_spec.rb
@@ -152,6 +152,18 @@ describe UserNotifications do
end
+ context "with topics only from new users" do
+ let!(:new_today) { Fabricate(:topic, user: Fabricate(:user, trust_level: TrustLevel[0], created_at: 10.minutes.ago), title: "Hey everyone look at me") }
+ let!(:new_yesterday) { Fabricate(:topic, user: Fabricate(:user, trust_level: TrustLevel[0], created_at: 25.hours.ago), created_at: 25.hours.ago, title: "This topic is of interest to you") }
+
+ it "returns topics from new users if they're more than 24 hours old" do
+ expect(subject.to).to eq([user.email])
+ html = subject.html_part.body.to_s
+ expect(html).to include(new_yesterday.title)
+ expect(html).to_not include(new_today.title)
+ end
+ end
+
context "with new topics" do
before do
diff --git a/spec/models/category_user_spec.rb b/spec/models/category_user_spec.rb
index ab3acbff02..d22098ab99 100644
--- a/spec/models/category_user_spec.rb
+++ b/spec/models/category_user_spec.rb
@@ -68,7 +68,7 @@ describe CategoryUser do
context 'integration' do
before do
- ActiveRecord::Base.observers.enable :all
+ NotificationEmailer.enable
end
it 'should operate correctly' do
diff --git a/spec/models/directory_item_spec.rb b/spec/models/directory_item_spec.rb
index 6612686e3f..37131d1bf8 100644
--- a/spec/models/directory_item_spec.rb
+++ b/spec/models/directory_item_spec.rb
@@ -20,7 +20,7 @@ describe DirectoryItem do
context 'refresh' do
before do
- ActiveRecord::Base.observers.enable :all
+ UserActionCreator.enable
end
let!(:post) { create_post }
diff --git a/spec/models/email_token_spec.rb b/spec/models/email_token_spec.rb
index cf62b1c5cd..edbfff853c 100644
--- a/spec/models/email_token_spec.rb
+++ b/spec/models/email_token_spec.rb
@@ -90,16 +90,6 @@ describe EmailToken do
expect(user.send_welcome_message).to eq true
end
- context "when using the code a second time" do
-
- it "doesn't send the welcome message" do
- SiteSetting.email_token_grace_period_hours = 1
- EmailToken.confirm(email_token.token)
- user = EmailToken.confirm(email_token.token)
- expect(user.send_welcome_message).to eq false
- end
- end
-
end
context 'success' do
@@ -120,13 +110,7 @@ describe EmailToken do
expect(email_token).to be_confirmed
end
- it "can be confirmed again" do
- EmailToken.stubs(:confirm_valid_after).returns(1.hour.ago)
-
- expect(EmailToken.confirm(email_token.token)).to eq user
-
- # Unless `confirm_valid_after` has passed
- EmailToken.stubs(:confirm_valid_after).returns(1.hour.from_now)
+ it "will not confirm again" do
expect(EmailToken.confirm(email_token.token)).to be_blank
end
end
diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb
index ef64bcfbe3..02ee99917c 100644
--- a/spec/models/notification_spec.rb
+++ b/spec/models/notification_spec.rb
@@ -2,7 +2,7 @@ require 'rails_helper'
describe Notification do
before do
- ActiveRecord::Base.observers.enable :all
+ NotificationEmailer.enable
end
it { is_expected.to validate_presence_of :notification_type }
@@ -139,21 +139,6 @@ describe Notification do
end
end
- describe '@mention' do
-
- it "calls email_user_mentioned on creating a notification" do
- UserEmailObserver.any_instance.expects(:after_commit).with(instance_of(Notification))
- Fabricate(:notification)
- end
-
- end
-
- describe '@mention' do
- it "calls email_user_quoted on creating a quote notification" do
- UserEmailObserver.any_instance.expects(:after_commit).with(instance_of(Notification))
- Fabricate(:quote_notification)
- end
- end
describe 'private message' do
before do
@@ -249,7 +234,8 @@ describe Notification do
describe 'ensure consistency' do
it 'deletes notifications if post is missing or deleted' do
- ActiveRecord::Base.observers.disable :all
+ NotificationEmailer.disable
+
p = Fabricate(:post)
p2 = Fabricate(:post)
diff --git a/spec/models/post_action_spec.rb b/spec/models/post_action_spec.rb
index fb621269df..aa7daba215 100644
--- a/spec/models/post_action_spec.rb
+++ b/spec/models/post_action_spec.rb
@@ -220,7 +220,9 @@ describe PostAction do
describe 'when a user likes something' do
it 'should generate notifications correctly' do
- ActiveRecord::Base.observers.enable :all
+
+ PostActionNotifier.enable
+
PostAction.act(codinghorror, post, PostActionType.types[:like])
expect(Notification.count).to eq(1)
diff --git a/spec/models/post_mover_spec.rb b/spec/models/post_mover_spec.rb
index 1a8077804c..bb606ef791 100644
--- a/spec/models/post_mover_spec.rb
+++ b/spec/models/post_mover_spec.rb
@@ -31,8 +31,7 @@ describe PostMover do
before do
p1.replies << p3
p2.replies << p4
- # add a like to a post, enable observers so we get user actions
- ActiveRecord::Base.observers.enable :all
+ UserActionCreator.enable
@like = PostAction.act(another_user, p4, PostActionType.types[:like])
end
diff --git a/spec/models/post_timing_spec.rb b/spec/models/post_timing_spec.rb
index 7817cee98b..74aec7b8e6 100644
--- a/spec/models/post_timing_spec.rb
+++ b/spec/models/post_timing_spec.rb
@@ -81,8 +81,7 @@ describe PostTiming do
# integration test
it 'processes timings correctly' do
-
- ActiveRecord::Base.observers.enable :all
+ PostActionNotifier.enable
post = Fabricate(:post)
user2 = Fabricate(:coding_horror, created_at: 1.day.ago)
diff --git a/spec/models/site_spec.rb b/spec/models/site_spec.rb
index a3376a4c4e..d8bb189b34 100644
--- a/spec/models/site_spec.rb
+++ b/spec/models/site_spec.rb
@@ -3,9 +3,6 @@ require_dependency 'site'
describe Site do
it "omits categories users can not write to from the category list" do
-
- ActiveRecord::Base.observers.enable :anon_site_json_cache_observer
-
category = Fabricate(:category)
user = Fabricate(:user)
diff --git a/spec/models/tag_user_spec.rb b/spec/models/tag_user_spec.rb
index 2e4dd4bdb0..aee8839eca 100644
--- a/spec/models/tag_user_spec.rb
+++ b/spec/models/tag_user_spec.rb
@@ -68,12 +68,7 @@ describe TagUser do
end
context "integration" do
- before do
- ActiveRecord::Base.observers.enable :all
- end
-
let(:user) { Fabricate(:user) }
-
let(:watched_tag) { Fabricate(:tag) }
let(:muted_tag) { Fabricate(:tag) }
let(:tracked_tag) { Fabricate(:tag) }
diff --git a/spec/models/topic_spec.rb b/spec/models/topic_spec.rb
index 0f35c71448..e4574b75c9 100644
--- a/spec/models/topic_spec.rb
+++ b/spec/models/topic_spec.rb
@@ -303,7 +303,7 @@ describe Topic do
context 'with a similar topic' do
let!(:topic) {
- ActiveRecord::Base.observers.enable :search_observer
+ SearchIndexer.enable
post = create_post(title: "Evil trout is the dude who posted this topic")
post.topic
}
@@ -429,7 +429,7 @@ describe Topic do
let(:actions) { topic.user.user_actions }
it "should set up actions correctly" do
- ActiveRecord::Base.observers.enable :all
+ UserActionCreator.enable
expect(actions.map{|a| a.action_type}).not_to include(UserAction::NEW_TOPIC)
expect(actions.map{|a| a.action_type}).to include(UserAction::NEW_PRIVATE_MESSAGE)
@@ -1354,6 +1354,13 @@ describe Topic do
expect(Topic.for_digest(user, 1.year.ago, top_order: true)).to be_blank
end
+ it "returns topics from TL0 users if given include_tl0" do
+ new_user = Fabricate(:user, trust_level: 0)
+ topic = Fabricate(:topic, user_id: new_user.id)
+
+ expect(Topic.for_digest(user, 1.year.ago, top_order: true, include_tl0: true)).to eq([topic])
+ end
+
it "returns topics from TL0 users if enabled in preferences" do
new_user = Fabricate(:user, trust_level: 0)
topic = Fabricate(:topic, user_id: new_user.id)
@@ -1755,7 +1762,7 @@ describe Topic do
topic.featured_link = ' https://github.com/discourse/discourse'
expect(topic.save).to be_truthy
- expect(topic.custom_fields['featured_link']).to eq('https://github.com/discourse/discourse')
+ expect(topic.featured_link).to eq('https://github.com/discourse/discourse')
end
context 'when category restricts present' do
@@ -1766,13 +1773,24 @@ describe Topic do
it 'can save the featured link if it belongs to that category' do
link_topic.featured_link = 'https://github.com/discourse/discourse'
expect(link_topic.save).to be_truthy
- expect(link_topic.custom_fields['featured_link']).to eq('https://github.com/discourse/discourse')
+ expect(link_topic.featured_link).to eq('https://github.com/discourse/discourse')
end
- it 'can not save the featured link if it belongs to that category' do
+ it 'can not save the featured link if category does not allow it' do
+ topic.category = Fabricate(:category, topic_featured_link_allowed: false)
topic.featured_link = 'https://github.com/discourse/discourse'
expect(topic.save).to be_falsey
end
+
+ it 'if category changes to disallow it, topic remains valid' do
+ t = Fabricate(:topic, category: link_category, featured_link: "https://github.com/discourse/discourse")
+
+ link_category.topic_featured_link_allowed = false
+ link_category.save!
+ t.reload
+
+ expect(t.valid?).to eq(true)
+ end
end
end
end
diff --git a/spec/models/topic_user_spec.rb b/spec/models/topic_user_spec.rb
index 3259316c22..04c3c1440f 100644
--- a/spec/models/topic_user_spec.rb
+++ b/spec/models/topic_user_spec.rb
@@ -174,11 +174,6 @@ describe TopicUser do
expect(topic_user.last_visited_at.to_i).to eq(today.to_i)
end
end
-
- it 'triggers the observer callbacks when updating' do
- UserActionObserver.instance.expects(:after_save).twice
- 2.times { TopicUser.track_visit!(topic.id, user.id) }
- end
end
describe 'read tracking' do
@@ -213,7 +208,6 @@ describe TopicUser do
context 'private messages' do
it 'should ensure recepients and senders are watching' do
- ActiveRecord::Base.observers.enable :all
target_user = Fabricate(:user)
post = create_post(archetype: Archetype.private_message, target_usernames: target_user.username);
diff --git a/spec/models/trust_level3_requirements_spec.rb b/spec/models/trust_level3_requirements_spec.rb
index 46e3d89992..cb0a2b4e44 100644
--- a/spec/models/trust_level3_requirements_spec.rb
+++ b/spec/models/trust_level3_requirements_spec.rb
@@ -221,7 +221,7 @@ describe TrustLevel3Requirements do
describe "num_likes_given" do
it "counts likes given in the last 100 days" do
- ActiveRecord::Base.observers.enable :user_action_observer
+ UserActionCreator.enable
recent_post1 = create_post(created_at: 1.hour.ago)
recent_post2 = create_post(created_at: 10.days.ago)
@@ -237,7 +237,7 @@ describe TrustLevel3Requirements do
describe "num_likes_received" do
it "counts likes received in the last 100 days" do
- ActiveRecord::Base.observers.enable :user_action_observer
+ UserActionCreator.enable
t = Fabricate(:topic, user: user, created_at: 102.days.ago)
old_post = create_post(topic: t, user: user, created_at: 102.days.ago)
diff --git a/spec/models/user_action_spec.rb b/spec/models/user_action_spec.rb
index 79b7b4e5c8..5aeaa25781 100644
--- a/spec/models/user_action_spec.rb
+++ b/spec/models/user_action_spec.rb
@@ -3,7 +3,7 @@ require 'rails_helper'
describe UserAction do
before do
- ActiveRecord::Base.observers.enable :all
+ UserActionCreator.enable
end
it { is_expected.to validate_presence_of :action_type }
@@ -50,6 +50,8 @@ describe UserAction do
end
it 'includes the events correctly' do
+ PostActionNotifier.enable
+
mystats = stats_for_user(user)
expecting = [UserAction::NEW_TOPIC, UserAction::NEW_PRIVATE_MESSAGE, UserAction::GOT_PRIVATE_MESSAGE, UserAction::BOOKMARK].sort
expect(mystats).to eq(expecting)
diff --git a/spec/models/user_profile_spec.rb b/spec/models/user_profile_spec.rb
index d6b2c6ac01..34a88c48cd 100644
--- a/spec/models/user_profile_spec.rb
+++ b/spec/models/user_profile_spec.rb
@@ -54,16 +54,19 @@ describe UserProfile do
expect(user_profile).not_to be_valid
end
- it "doesn't support invalid website" do
- user_profile = Fabricate.build(:user_profile, website: "http://https://google.com")
- user_profile.user = Fabricate.build(:user)
- expect(user_profile).not_to be_valid
- end
+ context "website validation" do
+ let(:user) { Fabricate(:user) }
- it "supports valid website" do
- user_profile = Fabricate.build(:user_profile, website: "https://google.com")
- user_profile.user = Fabricate.build(:user)
- expect(user_profile.valid?).to be true
+ it "ensures website is valid" do
+ expect(Fabricate.build(:user_profile, user: user, website: "http://https://google.com")).not_to be_valid
+ expect(Fabricate.build(:user_profile, user: user, website: "https://google.com")).to be_valid
+ end
+
+ it "validates website domain if user_website_domains_whitelist setting is present" do
+ SiteSetting.user_website_domains_whitelist = "discourse.org"
+ expect(Fabricate.build(:user_profile, user: user, website: "https://google.com")).not_to be_valid
+ expect(Fabricate.build(:user_profile, user: user, website: "http://discourse.org")).to be_valid
+ end
end
describe 'after save' do
diff --git a/spec/models/user_search_spec.rb b/spec/models/user_search_spec.rb
index 5d5a55f4f2..47621ef60f 100644
--- a/spec/models/user_search_spec.rb
+++ b/spec/models/user_search_spec.rb
@@ -18,7 +18,7 @@ describe UserSearch do
let(:staged) { Fabricate :staged }
before do
- ActiveRecord::Base.observers.enable :all
+ SearchIndexer.enable
Fabricate :post, user: user1, topic: topic
Fabricate :post, user: user2, topic: topic2
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 614cf17697..dbec2af755 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -922,6 +922,7 @@ describe User do
before do
# To make testing easier, say 1 reply is too much
SiteSetting.stubs(:newuser_max_replies_per_topic).returns(1)
+ UserActionCreator.enable
end
context "for a user who didn't create the topic" do
@@ -938,7 +939,10 @@ describe User do
context "with a reply" do
before do
- PostCreator.new(Fabricate(:user), raw: 'whatever this is a raw post', topic_id: topic.id, reply_to_post_number: post.post_number).create
+ PostCreator.new(Fabricate(:user),
+ raw: 'whatever this is a raw post',
+ topic_id: topic.id,
+ reply_to_post_number: post.post_number).create
end
it "resets the `posted_too_much` threshold" do
@@ -1171,6 +1175,17 @@ describe User do
expect(group_history.target_user).to eq(user)
end
+ it "get attributes from the group" do
+ group = Fabricate(:group, automatic_membership_email_domains: "bar.com|wat.com", grant_trust_level: 1, title: "bars and wats", primary_group: true)
+ user = Fabricate.build(:user, trust_level: 0, email: "foo@bar.com", password: "strongpassword4Uguys")
+ user.password_required!
+ expect(user.save).to eq(true)
+ user.reload
+ expect(user.title).to eq("bars and wats")
+ expect(user.trust_level).to eq(1)
+ expect(user.trust_level_locked).to eq(true)
+ end
+
end
describe "number_of_flags_given" do
diff --git a/spec/phantom_js/smoke_test.js b/spec/phantom_js/smoke_test.js
index f703257fa8..6cac5534f5 100644
--- a/spec/phantom_js/smoke_test.js
+++ b/spec/phantom_js/smoke_test.js
@@ -139,7 +139,7 @@ var runTests = function() {
});
test("at least one topic shows up", function() {
- return document.querySelector(".topic-list tbody tr");
+ return $(".topic-list tbody tr").length;
});
execAsync("navigate to 1st topic", 500, function() {
@@ -147,7 +147,7 @@ var runTests = function() {
});
test("at least one post body", function() {
- return document.querySelector(".topic-post");
+ return $(".topic-post").length;
});
execAsync("click on the 1st user", 500, function() {
@@ -157,7 +157,7 @@ var runTests = function() {
});
test("user has details", function() {
- return document.querySelector("#user-card .names");
+ return $("#user-card .names").length;
});
exec("open login modal", function() {
@@ -165,7 +165,7 @@ var runTests = function() {
});
test("login modal is open", function() {
- return document.querySelector(".login-modal");
+ return $(".login-modal").length;
});
exec("type in credentials & log in", function() {
@@ -175,7 +175,7 @@ var runTests = function() {
});
test("is logged in", function() {
- return document.querySelector(".current-user");
+ return $(".current-user").length;
});
exec("go home", function() {
@@ -183,11 +183,11 @@ var runTests = function() {
});
test("it shows a topic list", function() {
- return document.querySelector(".topic-list");
+ return $(".topic-list").length;
});
test('we have a create topic button', function() {
- return document.querySelector("#create-topic");
+ return $("#create-topic").length;
});
exec("open composer", function() {
@@ -195,7 +195,7 @@ var runTests = function() {
});
test('the editor is visible', function() {
- return document.querySelector(".d-editor");
+ return $(".d-editor").length;
});
exec("compose new topic", function() {
@@ -209,7 +209,7 @@ var runTests = function() {
});
test("updates preview", function() {
- return document.querySelector(".d-editor-preview p");
+ return $(".d-editor-preview p").length;
});
exec("open upload modal", function() {
@@ -217,7 +217,7 @@ var runTests = function() {
});
test("upload modal is open", function() {
- return document.querySelector("#filename-input");
+ return $("#filename-input").length;
});
// TODO: Looks like PhantomJS 2.0.0 has a bug with `uploadFile`
@@ -246,7 +246,7 @@ var runTests = function() {
});
test("topic is created", function() {
- return document.querySelector(".fancy-title");
+ return $(".fancy-title").length;
});
exec("click reply button", function() {
@@ -254,7 +254,7 @@ var runTests = function() {
});
test("composer is open", function() {
- return document.querySelector("#reply-control .d-editor-input");
+ return $("#reply-control .d-editor-input").length;
});
exec("compose reply", function() {
diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb
index c1297809c0..c57a421704 100644
--- a/spec/rails_helper.rb
+++ b/spec/rails_helper.rb
@@ -43,6 +43,7 @@ Spork.prefork do
config.include Helpers
config.include MessageBus
config.include RSpecHtmlMatchers
+ config.include IntegrationHelpers, type: :request
config.mock_framework = :mocha
config.order = 'random'
config.infer_spec_type_from_file_location!
@@ -103,9 +104,11 @@ Spork.prefork do
#
# $redis = DiscourseMockRedis.new
#
- # disable all observers, enable as needed during specs
- #
- ActiveRecord::Base.observers.disable :all
+ PostActionNotifier.disable
+ SearchIndexer.disable
+ UserActionCreator.disable
+ NotificationEmailer.disable
+
SiteSetting.provider.all.each do |setting|
SiteSetting.remove_override!(setting.name)
end
diff --git a/spec/models/user_email_observer_spec.rb b/spec/services/notification_emailer_spec.rb
similarity index 82%
rename from spec/models/user_email_observer_spec.rb
rename to spec/services/notification_emailer_spec.rb
index 013b1db941..8e44538af3 100644
--- a/spec/models/user_email_observer_spec.rb
+++ b/spec/services/notification_emailer_spec.rb
@@ -1,6 +1,10 @@
require 'rails_helper'
-describe UserEmailObserver do
+describe NotificationEmailer do
+
+ before do
+ NotificationEmailer.enable
+ end
let(:topic) { Fabricate(:topic) }
let(:post) { Fabricate(:post, topic: topic) }
@@ -18,8 +22,8 @@ describe UserEmailObserver do
shared_examples "enqueue" do
it "enqueues a job for the email" do
- Jobs.expects(:enqueue_in).with(delay, :user_email, UserEmailObserver::EmailUser.notification_params(notification,type))
- UserEmailObserver.process_notification(notification)
+ Jobs.expects(:enqueue_in).with(delay, :user_email, NotificationEmailer::EmailUser.notification_params(notification,type))
+ NotificationEmailer.process_notification(notification)
end
context "inactive user" do
@@ -27,13 +31,13 @@ describe UserEmailObserver do
it "doesn't enqueue a job" do
Jobs.expects(:enqueue_in).with(delay, :user_email, has_entry(type: type)).never
- UserEmailObserver.process_notification(notification)
+ NotificationEmailer.process_notification(notification)
end
it "enqueues a job if the user is staged" do
notification.user.staged = true
- Jobs.expects(:enqueue_in).with(delay, :user_email, UserEmailObserver::EmailUser.notification_params(notification,type))
- UserEmailObserver.process_notification(notification)
+ Jobs.expects(:enqueue_in).with(delay, :user_email, NotificationEmailer::EmailUser.notification_params(notification,type))
+ NotificationEmailer.process_notification(notification)
end
end
@@ -46,7 +50,7 @@ describe UserEmailObserver do
it "doesn't enqueue a job" do
Jobs.expects(:enqueue_in).with(delay, :user_email, has_entry(type: type)).never
- UserEmailObserver.process_notification(notification)
+ NotificationEmailer.process_notification(notification)
end
end
@@ -55,7 +59,7 @@ describe UserEmailObserver do
it "doesn't enqueue a job" do
Post.any_instance.expects(:post_type).returns(Post.types[:small_action])
Jobs.expects(:enqueue_in).with(delay, :user_email, has_entry(type: type)).never
- UserEmailObserver.process_notification(notification)
+ NotificationEmailer.process_notification(notification)
end
end
@@ -68,7 +72,7 @@ describe UserEmailObserver do
it "doesn't enqueue a job if the user has mention emails disabled" do
notification.user.user_option.update_columns(email_direct: false)
Jobs.expects(:enqueue_in).with(delay, :user_email, has_entry(type: type)).never
- UserEmailObserver.process_notification(notification)
+ NotificationEmailer.process_notification(notification)
end
end
@@ -78,7 +82,7 @@ describe UserEmailObserver do
it "doesn't enqueue a job if the user has private message emails disabled" do
notification.user.user_option.update_columns(email_private_messages: false)
Jobs.expects(:enqueue_in).with(delay, :user_email, has_entry(type: type)).never
- UserEmailObserver.process_notification(notification)
+ NotificationEmailer.process_notification(notification)
end
end
@@ -92,8 +96,8 @@ describe UserEmailObserver do
it "enqueue a delayed job for users that are online" do
notification.user.last_seen_at = 1.minute.ago
- Jobs.expects(:enqueue_in).with(delay, :user_email, UserEmailObserver::EmailUser.notification_params(notification,type))
- UserEmailObserver.process_notification(notification)
+ Jobs.expects(:enqueue_in).with(delay, :user_email, NotificationEmailer::EmailUser.notification_params(notification,type))
+ NotificationEmailer.process_notification(notification)
end
end
@@ -140,7 +144,7 @@ describe UserEmailObserver do
it "doesn't enqueue a job for a small action" do
notification.data_hash["original_post_type"] = Post.types[:small_action]
Jobs.expects(:enqueue_in).with(delay, :user_email, has_entry(type: type)).never
- UserEmailObserver.process_notification(notification)
+ NotificationEmailer.process_notification(notification)
end
end
diff --git a/spec/models/post_alert_observer_spec.rb b/spec/services/post_action_notifier_spec.rb
similarity index 97%
rename from spec/models/post_alert_observer_spec.rb
rename to spec/services/post_action_notifier_spec.rb
index be6f8c7876..b04b7c032f 100644
--- a/spec/models/post_alert_observer_spec.rb
+++ b/spec/services/post_action_notifier_spec.rb
@@ -1,10 +1,10 @@
require 'rails_helper'
require_dependency 'post_destroyer'
-describe PostAlertObserver do
+describe PostActionNotifier do
before do
- ActiveRecord::Base.observers.enable :post_alert_observer
+ PostActionNotifier.enable
end
let!(:evil_trout) { Fabricate(:evil_trout) }
diff --git a/spec/services/post_alerter_spec.rb b/spec/services/post_alerter_spec.rb
index 48689faae4..ff160244f3 100644
--- a/spec/services/post_alerter_spec.rb
+++ b/spec/services/post_alerter_spec.rb
@@ -63,8 +63,7 @@ describe PostAlerter do
context 'edits' do
it 'notifies correctly on edits' do
-
- ActiveRecord::Base.observers.enable :all
+ PostActionNotifier.enable
post = Fabricate(:post, raw: 'I love waffles')
@@ -89,7 +88,7 @@ describe PostAlerter do
context 'likes' do
it 'notifies on likes after an undo' do
- ActiveRecord::Base.observers.enable :all
+ PostActionNotifier.enable
post = Fabricate(:post, raw: 'I love waffles')
@@ -101,7 +100,7 @@ describe PostAlerter do
end
it 'notifies on does not notify when never is selected' do
- ActiveRecord::Base.observers.enable :all
+ PostActionNotifier.enable
post = Fabricate(:post, raw: 'I love waffles')
@@ -110,12 +109,11 @@ describe PostAlerter do
PostAction.act(evil_trout, post, PostActionType.types[:like])
-
expect(Notification.where(post_number: 1, topic_id: post.topic_id).count).to eq(0)
end
it 'notifies on likes correctly' do
- ActiveRecord::Base.observers.enable :all
+ PostActionNotifier.enable
post = Fabricate(:post, raw: 'I love waffles')
diff --git a/spec/services/post_owner_changer_spec.rb b/spec/services/post_owner_changer_spec.rb
index b1452d35c4..bdbb36541a 100644
--- a/spec/services/post_owner_changer_spec.rb
+++ b/spec/services/post_owner_changer_spec.rb
@@ -74,7 +74,8 @@ describe PostOwnerChanger do
UserAction.create!( action_type: UserAction::REPLY, user_id: p2user.id, acting_user_id: p2user.id,
target_post_id: p2.id, target_topic_id: p2.topic_id, created_at: p2.created_at )
- ActiveRecord::Base.observers.enable :user_action_observer
+
+ UserActionCreator.enable
end
subject(:change_owners) { described_class.new(post_ids: [p1.id, p2.id], topic_id: topic.id, new_owner: user_a, acting_user: editor).change_owner! }
diff --git a/spec/services/random_topic_selector_spec.rb b/spec/services/random_topic_selector_spec.rb
index d57f5519d2..18decd73c7 100644
--- a/spec/services/random_topic_selector_spec.rb
+++ b/spec/services/random_topic_selector_spec.rb
@@ -23,7 +23,7 @@ describe RandomTopicSelector do
end
it 'can correctly backfill' do
- category = Fabricate(:category)
+ category = Fabricate(:category, sort_order: 'op_likes')
t1 = Fabricate(:topic, category_id: category.id)
_t2 = Fabricate(:topic, category_id: category.id, visible: false)
_t3 = Fabricate(:topic, category_id: category.id, deleted_at: 1.minute.ago)
diff --git a/spec/models/search_observer_spec.rb b/spec/services/search_indexer_spec.rb
similarity index 75%
rename from spec/models/search_observer_spec.rb
rename to spec/services/search_indexer_spec.rb
index fccf861220..74ac1c2b4f 100644
--- a/spec/models/search_observer_spec.rb
+++ b/spec/services/search_indexer_spec.rb
@@ -1,13 +1,13 @@
require 'rails_helper'
-describe SearchObserver do
+describe SearchIndexer do
it 'correctly indexes chinese' do
SiteSetting.default_locale = 'zh_CN'
data = "你好世界"
expect(data.split(" ").length).to eq(1)
- SearchObserver.update_posts_index(99, "你好世界", "", nil)
+ SearchIndexer.update_posts_index(99, "你好世界", "", nil)
raw_data = PostSearchData.where(post_id: 99).pluck(:raw_data)[0]
expect(raw_data.split(' ').length).to eq(2)
@@ -16,13 +16,13 @@ describe SearchObserver do
it 'correctly indexes a post' do
data = "This is a test"
- SearchObserver.update_posts_index(99, data, "", nil)
+ SearchIndexer.update_posts_index(99, data, "", nil)
raw_data, locale = PostSearchData.where(post_id: 99).pluck(:raw_data, :locale)[0]
expect(raw_data).to eq("This is a test")
expect(locale).to eq("en")
- SearchObserver.update_posts_index(99, "tester", "", nil)
+ SearchIndexer.update_posts_index(99, "tester", "", nil)
raw_data = PostSearchData.where(post_id: 99).pluck(:raw_data)[0]
expect(raw_data).to eq("tester")
diff --git a/spec/support/integration_helpers.rb b/spec/support/integration_helpers.rb
new file mode 100644
index 0000000000..24331a0761
--- /dev/null
+++ b/spec/support/integration_helpers.rb
@@ -0,0 +1,9 @@
+module IntegrationHelpers
+ def sign_in(user)
+ password = 'somecomplicatedpassword'
+ user.update!(password: password)
+ Fabricate(:email_token, confirmed: true, user: user)
+ post "/session.json", { login: user.username, password: password }
+ expect(response).to be_success
+ end
+end
diff --git a/test/javascripts/acceptance/groups-test.js.es6 b/test/javascripts/acceptance/groups-test.js.es6
index 04c8e6f5bf..74422b1065 100644
--- a/test/javascripts/acceptance/groups-test.js.es6
+++ b/test/javascripts/acceptance/groups-test.js.es6
@@ -12,7 +12,7 @@ test("Browsing Groups", () => {
click("a[href='/groups/discourse/members']");
andThen(() => {
- equal(find('.group-header').text().trim(), 'Awesome Team', "it displays the group page");
+ equal(find('.group-info-name').text().trim(), 'Awesome Team', "it displays the group page");
});
});
@@ -24,24 +24,31 @@ test("Viewing Group", () => {
ok(count('.group-members tr') > 0, "it lists group members");
});
- visit("/groups/discourse/posts");
+ click(".nav-pills li a[title='Activity']");
+
andThen(() => {
ok(count('.user-stream .item') > 0, "it lists stream items");
});
- visit("/groups/discourse/topics");
+ click(".group-activity-nav li a[href='/groups/discourse/activity/topics']");
+
andThen(() => {
ok(count('.user-stream .item') > 0, "it lists stream items");
});
- visit("/groups/discourse/mentions");
+ click(".group-activity-nav li a[href='/groups/discourse/activity/mentions']");
+
andThen(() => {
ok(count('.user-stream .item') > 0, "it lists stream items");
});
- visit("/groups/discourse/messages");
andThen(() => {
- ok(find(".nav-stacked li a[title='Messages']").length === 0, 'it should not show messages tab if user is not admin');
+ equal(
+ find(".group-activity li a[href='/groups/discourse/activity/messages']").length,
+ 0,
+ 'it should not show messages tab if user is not a group user or admin'
+ );
+
ok(find(".nav-stacked li a[title='Edit Group']").length === 0, 'it should not show messages tab if user is not admin');
ok(find(".nav-stacked li a[title='Logs']").length === 0, 'it should not show Logs tab if user is not admin');
ok(count('.user-stream .item') > 0, "it lists stream items");
@@ -55,10 +62,19 @@ test("Admin Viewing Group", () => {
visit("/groups/discourse");
andThen(() => {
- ok(find(".nav-stacked li a[title='Messages']").length === 1, 'it should show messages tab if user is admin');
- ok(find(".nav-stacked li a[title='Edit Group']").length === 1, 'it should show edit group tab if user is admin');
- ok(find(".nav-stacked li a[title='Logs']").length === 1, 'it should show Logs tab if user is admin');
- equal(find('.group-title').text(), 'Awesome Team', 'it should display the group title');
- equal(find('.group-name').text(), '@discourse', 'it should display the group name');
+ ok(find(".nav-pills li a[title='Edit Group']").length === 1, 'it should show edit group tab if user is admin');
+ ok(find(".nav-pills li a[title='Logs']").length === 1, 'it should show Logs tab if user is admin');
+
+ equal(find('.group-info-name').text(), 'Awesome Team', 'it should display the group name');
+ });
+
+ click(".nav-pills li a[title='Activity']");
+
+ andThen(() => {
+ equal(
+ find(".group-activity li a[href='/groups/discourse/activity/messages']").length,
+ 1,
+ 'it should show messages tab if user is admin'
+ );
});
});
diff --git a/test/javascripts/acceptance/plugin-outlet-connector-class-test.js.es6 b/test/javascripts/acceptance/plugin-outlet-connector-class-test.js.es6
new file mode 100644
index 0000000000..82b34f7ca7
--- /dev/null
+++ b/test/javascripts/acceptance/plugin-outlet-connector-class-test.js.es6
@@ -0,0 +1,47 @@
+import { acceptance } from "helpers/qunit-helpers";
+import { extraConnectorClass } from 'discourse/lib/plugin-connectors';
+
+const PREFIX = "javascripts/single-test/connectors";
+acceptance("Plugin Outlet - Connector Class", {
+ setup() {
+ extraConnectorClass('user-profile-primary/hello', {
+ actions: {
+ sayHello() {
+ this.set('hello', 'hello!');
+ }
+ }
+ });
+
+ extraConnectorClass('user-profile-primary/dont-render', {
+ shouldRender(args) {
+ return args.model.get('username') !== 'eviltrout';
+ }
+ });
+
+ Ember.TEMPLATES[`${PREFIX}/user-profile-primary/hello`] = Ember.HTMLBars.compile(
+ `{{model.username}}
+
+ {{hello}}`
+ );
+ Ember.TEMPLATES[`${PREFIX}/user-profile-primary/dont-render`] = Ember.HTMLBars.compile(
+ `I'm not rendered!`
+ );
+ },
+
+ teardown() {
+ delete Ember.TEMPLATES[`${PREFIX}/user-profile-primary/hello`];
+ delete Ember.TEMPLATES[`${PREFIX}/user-profile-primary/dont-render`];
+ }
+});
+
+test("Renders a template into the outlet", assert => {
+ visit("/users/eviltrout");
+ andThen(() => {
+ assert.ok(find('.user-profile-primary-outlet.hello').length === 1, 'it has class names');
+ assert.ok(!find('.user-profile-primary-outlet.dont-render').length, "doesn't render");
+ });
+ click('.say-hello');
+ andThen(() => {
+ assert.equal(find('.hello-result').text(), 'hello!', 'actions delegate properly');
+ });
+});
diff --git a/test/javascripts/acceptance/plugin-outlet-multi-template-test.js.es6 b/test/javascripts/acceptance/plugin-outlet-multi-template-test.js.es6
index 34d5bc0045..0379b2d8e5 100644
--- a/test/javascripts/acceptance/plugin-outlet-multi-template-test.js.es6
+++ b/test/javascripts/acceptance/plugin-outlet-multi-template-test.js.es6
@@ -1,5 +1,5 @@
import { acceptance } from "helpers/qunit-helpers";
-import { clearCache } from 'discourse/helpers/plugin-outlet';
+import { clearCache } from 'discourse/lib/plugin-connectors';
const HELLO = 'javascripts/multi-test/connectors/user-profile-primary/hello';
const GOODBYE = 'javascripts/multi-test/connectors/user-profile-primary/goodbye';
diff --git a/test/javascripts/acceptance/plugin-outlet-single-template-test.js.es6 b/test/javascripts/acceptance/plugin-outlet-single-template-test.js.es6
index 228506e27c..ee236ed851 100644
--- a/test/javascripts/acceptance/plugin-outlet-single-template-test.js.es6
+++ b/test/javascripts/acceptance/plugin-outlet-single-template-test.js.es6
@@ -4,9 +4,7 @@ const CONNECTOR = 'javascripts/single-test/connectors/user-profile-primary/hello
acceptance("Plugin Outlet - Single Template", {
setup() {
Ember.TEMPLATES[CONNECTOR] = Ember.HTMLBars.compile(
- `{{model.username}}
-
- {{model.email}}`
+ `{{model.username}}`
);
},
@@ -21,8 +19,4 @@ test("Renders a template into the outlet", assert => {
assert.ok(find('.user-profile-primary-outlet.hello').length === 1, 'it has class names');
assert.equal(find('.hello-username').text(), 'eviltrout', 'it renders into the outlet');
});
- click('.hello-check-email');
- andThen(() => {
- assert.equal(find('.hello-email').text(), 'eviltrout@example.com', 'actions delegate properly');
- });
});
diff --git a/test/javascripts/acceptance/search-full-test.js.es6 b/test/javascripts/acceptance/search-full-test.js.es6
index 99820e7d9d..47fdbc8bf6 100644
--- a/test/javascripts/acceptance/search-full-test.js.es6
+++ b/test/javascripts/acceptance/search-full-test.js.es6
@@ -71,27 +71,29 @@ test("open advanced search", assert => {
andThen(() => assert.ok(visible('.search-advanced .search-advanced-options'), '"search-advanced-options" is visible'));
});
-test("validate population of advanced search", assert => {
- visit("/search");
- fillIn('.search input.full-page-search', 'test user:admin #bug group:moderators badge:Reader tags:monkey in:likes in:private in:wiki in:bookmarks status:open after:2016-10-05 min_post_count:10');
- click('.search-advanced-btn');
+// these tests are screwy with the runloop
- andThen(() => {
- assert.ok(exists('.search-advanced-options span:contains("admin")'), 'has "admin" pre-populated');
- assert.ok(exists('.search-advanced-options .badge-category:contains("bug")'), 'has "bug" pre-populated');
- //assert.ok(exists('.search-advanced-options span:contains("moderators")'), 'has "moderators" pre-populated');
- //assert.ok(exists('.search-advanced-options span:contains("Reader")'), 'has "Reader" pre-populated');
- assert.ok(exists('.search-advanced-options .tag-chooser .tag-monkey'), 'has "monkey" pre-populated');
- assert.ok(exists('.search-advanced-options .in-likes:checked'), 'has "I liked" pre-populated');
- assert.ok(exists('.search-advanced-options .in-private:checked'), 'has "are in my messages" pre-populated');
- assert.ok(exists('.search-advanced-options .in-wiki:checked'), 'has "are wiki" pre-populated');
- assert.ok(exists('.search-advanced-options .combobox .select2-choice .select2-chosen:contains("I\'ve bookmarked")'), 'has "I\'ve bookmarked" pre-populated');
- assert.ok(exists('.search-advanced-options .combobox .select2-choice .select2-chosen:contains("are open")'), 'has "are open" pre-populated');
- assert.ok(exists('.search-advanced-options .combobox .select2-choice .select2-chosen:contains("after")'), 'has "after" pre-populated');
- assert.equal(find('.search-advanced-options #search-post-date').val(), "2016-10-05", 'has "2016-10-05" pre-populated');
- assert.equal(find('.search-advanced-options #search-min-post-count').val(), "10", 'has "10" pre-populated');
- });
-});
+// test("validate population of advanced search", assert => {
+// visit("/search");
+// fillIn('.search input.full-page-search', 'test user:admin #bug group:moderators badge:Reader tags:monkey in:likes in:private in:wiki in:bookmarks status:open after:2016-10-05 min_post_count:10');
+// click('.search-advanced-btn');
+//
+// andThen(() => {
+// assert.ok(exists('.search-advanced-options span:contains("admin")'), 'has "admin" pre-populated');
+// assert.ok(exists('.search-advanced-options .badge-category:contains("bug")'), 'has "bug" pre-populated');
+// //assert.ok(exists('.search-advanced-options span:contains("moderators")'), 'has "moderators" pre-populated');
+// //assert.ok(exists('.search-advanced-options span:contains("Reader")'), 'has "Reader" pre-populated');
+// assert.ok(exists('.search-advanced-options .tag-chooser .tag-monkey'), 'has "monkey" pre-populated');
+// assert.ok(exists('.search-advanced-options .in-likes:checked'), 'has "I liked" pre-populated');
+// assert.ok(exists('.search-advanced-options .in-private:checked'), 'has "are in my messages" pre-populated');
+// assert.ok(exists('.search-advanced-options .in-wiki:checked'), 'has "are wiki" pre-populated');
+// assert.ok(exists('.search-advanced-options .combobox .select2-choice .select2-chosen:contains("I\'ve bookmarked")'), 'has "I\'ve bookmarked" pre-populated');
+// assert.ok(exists('.search-advanced-options .combobox .select2-choice .select2-chosen:contains("are open")'), 'has "are open" pre-populated');
+// assert.ok(exists('.search-advanced-options .combobox .select2-choice .select2-chosen:contains("after")'), 'has "after" pre-populated');
+// assert.equal(find('.search-advanced-options #search-post-date').val(), "2016-10-05", 'has "2016-10-05" pre-populated');
+// assert.equal(find('.search-advanced-options #search-min-post-count').val(), "10", 'has "10" pre-populated');
+// });
+// });
test("escape search term", (assert) => {
visit("/search");
diff --git a/test/javascripts/admin/controllers/admin-user-badges-test.js.es6 b/test/javascripts/admin/controllers/admin-user-badges-test.js.es6
index e4a7aaceb4..f58845ecfc 100644
--- a/test/javascripts/admin/controllers/admin-user-badges-test.js.es6
+++ b/test/javascripts/admin/controllers/admin-user-badges-test.js.es6
@@ -20,6 +20,6 @@ test("grantableBadges", function() {
});
- not(badgeNames.contains(badgeDisabled), "excludes disabled badges");
+ not(badgeNames.includes(badgeDisabled), "excludes disabled badges");
deepEqual(badgeNames, sortedNames, "sorts badges by name");
});
diff --git a/test/javascripts/controllers/group-index-test.js.es6 b/test/javascripts/components/group-membership-button-test.js.es6
similarity index 92%
rename from test/javascripts/controllers/group-index-test.js.es6
rename to test/javascripts/components/group-membership-button-test.js.es6
index 361439154c..ceeeee29e4 100644
--- a/test/javascripts/controllers/group-index-test.js.es6
+++ b/test/javascripts/components/group-membership-button-test.js.es6
@@ -1,8 +1,8 @@
import { currentUser } from "helpers/qunit-helpers";
-moduleFor("controller:group-index");
+moduleFor('component:group-membership-button');
-test("canJoinGroup", function() {
+test('canJoinGroup', function() {
this.subject().setProperties({
model: { public: false }
});
diff --git a/test/javascripts/helpers/create-pretender.js.es6 b/test/javascripts/helpers/create-pretender.js.es6
index c7f2f8cbce..809aec596b 100644
--- a/test/javascripts/helpers/create-pretender.js.es6
+++ b/test/javascripts/helpers/create-pretender.js.es6
@@ -113,7 +113,7 @@ export default function() {
return response({});
});
- this.put('/users/eviltrout', () => response({ user: {} }));
+ this.put('/users/eviltrout.json', () => response({ user: {} }));
this.get("/t/280.json", () => response(fixturesByUrl['/t/280/1.json']));
this.get("/t/28830.json", () => response(fixturesByUrl['/t/28830/1.json']));
diff --git a/test/javascripts/helpers/qunit-helpers.js.es6 b/test/javascripts/helpers/qunit-helpers.js.es6
index d8351405f0..1fdc796b69 100644
--- a/test/javascripts/helpers/qunit-helpers.js.es6
+++ b/test/javascripts/helpers/qunit-helpers.js.es6
@@ -5,8 +5,10 @@ import siteFixtures from 'fixtures/site-fixtures';
import HeaderComponent from 'discourse/components/site-header';
import { forceMobile, resetMobile } from 'discourse/lib/mobile';
import { resetPluginApi } from 'discourse/lib/plugin-api';
-import { clearCache as clearOutletCache } from 'discourse/helpers/plugin-outlet';
+import { clearCache as clearOutletCache, resetExtraClasses } from 'discourse/lib/plugin-connectors';
import { clearHTMLCache } from 'discourse/helpers/custom-html';
+import { flushMap } from 'discourse/models/store';
+
function currentUser() {
return Discourse.User.create(sessionFixtures['/session/current.json'].current_user);
@@ -44,6 +46,7 @@ function acceptance(name, options) {
// For now don't do scrolling stuff in Test Mode
HeaderComponent.reopen({examineDockHeader: Ember.K});
+ resetExtraClasses();
const siteJson = siteFixtures['site.json'].site;
if (options) {
if (options.setup) {
@@ -77,9 +80,11 @@ function acceptance(name, options) {
if (options && options.teardown) {
options.teardown.call(this);
}
+ flushMap();
Discourse.User.resetCurrent();
Discourse.Site.resetCurrent(Discourse.Site.create(jQuery.extend(true, {}, fixtures['site.json'].site)));
+ resetExtraClasses();
clearOutletCache();
clearHTMLCache();
resetPluginApi();
diff --git a/test/javascripts/models/composer-test.js.es6 b/test/javascripts/models/composer-test.js.es6
index 86208aa584..d7bcf53af7 100644
--- a/test/javascripts/models/composer-test.js.es6
+++ b/test/javascripts/models/composer-test.js.es6
@@ -248,3 +248,11 @@ test("title placeholder depends on what you're doing", function() {
composer = createComposer({action: Composer.PRIVATE_MESSAGE});
equal(composer.get('titlePlaceholder'), 'composer.title_placeholder', "placeholder for private message with topic links enabled");
});
+
+test("allows featured link before choosing a category", function() {
+ Discourse.SiteSettings.topic_featured_link_enabled = true;
+ Discourse.SiteSettings.allow_uncategorized_topics = false;
+ let composer = createComposer({action: Composer.CREATE_TOPIC});
+ equal(composer.get('titlePlaceholder'), 'composer.title_or_link_placeholder', "placeholder invites you to paste a link");
+ ok(composer.get('canEditTopicFeaturedLink'), "can paste link");
+});
diff --git a/test/javascripts/models/post-stream-test.js.es6 b/test/javascripts/models/post-stream-test.js.es6
index 5f825d9fbc..b0c455e8fa 100644
--- a/test/javascripts/models/post-stream-test.js.es6
+++ b/test/javascripts/models/post-stream-test.js.es6
@@ -170,7 +170,7 @@ test("toggleParticipant", function() {
equal(postStream.get('userFilters.length'), 0, "by default no participants are toggled");
postStream.toggleParticipant(participant.username);
- ok(postStream.get('userFilters').contains('eviltrout'), 'eviltrout is in the filters');
+ ok(postStream.get('userFilters').includes('eviltrout'), 'eviltrout is in the filters');
postStream.toggleParticipant(participant.username);
blank(postStream.get('userFilters'), "toggling the participant again removes them");
@@ -283,7 +283,7 @@ test("identity map", function() {
});
test("loadIntoIdentityMap with no data", () => {
- buildStream(1234).loadIntoIdentityMap([]).then(result => {
+ return buildStream(1234).loadIntoIdentityMap([]).then(result => {
equal(result.length, 0, 'requesting no posts produces no posts');
});
});
@@ -291,7 +291,7 @@ test("loadIntoIdentityMap with no data", () => {
test("loadIntoIdentityMap with post ids", function() {
const postStream = buildStream(1234);
- postStream.loadIntoIdentityMap([10]).then(function() {
+ return postStream.loadIntoIdentityMap([10]).then(function() {
present(postStream.findLoadedPost(10), "it adds the returned post to the store");
});
});
@@ -327,7 +327,7 @@ test("staging and undoing a new post", function() {
equal(stagedPost.get('topic'), topic, "it assigns the topic reference");
equal(stagedPost.get('post_number'), 2, "it is assigned the probable post_number");
present(stagedPost.get('created_at'), "it is assigned a created date");
- ok(postStream.get('posts').contains(stagedPost), "the post is added to the stream");
+ ok(postStream.get('posts').includes(stagedPost), "the post is added to the stream");
equal(stagedPost.get('id'), -1, "the post has a magical -1 id");
// Undoing a created post (there was an error)
@@ -337,7 +337,7 @@ test("staging and undoing a new post", function() {
equal(topic.get('highest_post_number'), 1, "it reverts the highest_post_number");
equal(topic.get('posts_count'), 1, "it reverts the post count");
equal(postStream.get('filteredPostsCount'), 1, "it retains the filteredPostsCount");
- ok(!postStream.get('posts').contains(stagedPost), "the post is removed from the stream");
+ ok(!postStream.get('posts').includes(stagedPost), "the post is removed from the stream");
ok(postStream.get('lastAppended'), original, "it doesn't consider undid post lastAppended");
});
@@ -367,7 +367,7 @@ test("staging and committing a post", function() {
ok(postStream.get('lastAppended'), original, "staging a post doesn't change the lastAppended");
postStream.commitPost(stagedPost);
- ok(postStream.get('posts').contains(stagedPost), "the post is still in the stream");
+ ok(postStream.get('posts').includes(stagedPost), "the post is still in the stream");
ok(!postStream.get('loading'), "it is no longer loading");
equal(postStream.get('filteredPostsCount'), 2, "it increases the filteredPostsCount");
diff --git a/test/javascripts/models/result-set-test.js.es6 b/test/javascripts/models/result-set-test.js.es6
index c846fd8872..18c9aa0c80 100644
--- a/test/javascripts/models/result-set-test.js.es6
+++ b/test/javascripts/models/result-set-test.js.es6
@@ -15,7 +15,7 @@ test('defaults', function() {
test('pagination support', function() {
const store = createStore();
- store.findAll('widget').then(function(rs) {
+ return store.findAll('widget').then(function(rs) {
equal(rs.get('length'), 2);
equal(rs.get('totalRows'), 4);
ok(rs.get('loadMoreUrl'), 'has a url to load more');
@@ -36,7 +36,7 @@ test('pagination support', function() {
test('refresh support', function() {
const store = createStore();
- store.findAll('widget').then(function(rs) {
+ return store.findAll('widget').then(function(rs) {
equal(rs.get('refreshUrl'), '/widgets?refresh=true', 'it has the refresh url');
const promise = rs.refresh();
diff --git a/test/javascripts/test_helper.js b/test/javascripts/test_helper.js
index 6985595014..f82d4b7065 100644
--- a/test/javascripts/test_helper.js
+++ b/test/javascripts/test_helper.js
@@ -30,9 +30,9 @@
//= require sinon-1.7.1
//= require sinon-qunit-1.0.0
-//= require helpers/qunit-helpers
//= require helpers/assertions
+//= require helpers/qunit-helpers
//= require_tree ./fixtures
//= require_tree ./lib
//= require_tree .
diff --git a/test/javascripts/widgets/actions-summary-test.js.es6 b/test/javascripts/widgets/actions-summary-test.js.es6
index 9b7f9cea23..6542d17b12 100644
--- a/test/javascripts/widgets/actions-summary-test.js.es6
+++ b/test/javascripts/widgets/actions-summary-test.js.es6
@@ -23,7 +23,7 @@ widgetTest('listing actions', {
});
widgetTest('undo', {
- template: '{{mount-widget widget="actions-summary" args=args undoPostAction="undoPostAction"}}',
+ template: '{{mount-widget widget="actions-summary" args=args undoPostAction=undoPostAction}}',
setup() {
this.set('args', {
actionsSummary: [
@@ -31,7 +31,7 @@ widgetTest('undo', {
]
});
- this.on('undoPostAction', () => this.undid = true);
+ this.set('undoPostAction', () => this.undid = true);
},
test(assert) {
assert.equal(this.$('.post-actions .post-action').length, 1);
diff --git a/vendor/assets/javascripts/ember-qunit.js b/vendor/assets/javascripts/ember-qunit.js
index 759edca9be..cf41920e2e 100644
--- a/vendor/assets/javascripts/ember-qunit.js
+++ b/vendor/assets/javascripts/ember-qunit.js
@@ -111,81 +111,82 @@ var define, requireModule, require, requirejs;
};
})();
-define('ember-qunit', ['exports', 'ember-qunit/module-for', 'ember-qunit/module-for-component', 'ember-qunit/module-for-model', 'ember-qunit/test', 'ember-qunit/only', 'ember-test-helpers'], function (exports, moduleFor, moduleForComponent, moduleForModel, test, only, ember_test_helpers) {
-
+define('ember-qunit', ['exports', 'ember-qunit/module-for', 'ember-qunit/module-for-component', 'ember-qunit/module-for-model', 'ember-qunit/adapter', 'ember-test-helpers', 'qunit'], function (exports, _emberQunitModuleFor, _emberQunitModuleForComponent, _emberQunitModuleForModel, _emberQunitAdapter, _emberTestHelpers, _qunit) {
'use strict';
-
-
- exports.moduleFor = moduleFor['default'];
- exports.moduleForComponent = moduleForComponent['default'];
- exports.moduleForModel = moduleForModel['default'];
- exports.test = test['default'];
- exports.only = only['default'];
- exports.setResolver = ember_test_helpers.setResolver;
-
+ exports.module = _qunit.module;
+ exports.test = _qunit.test;
+ exports.skip = _qunit.skip;
+ exports.only = _qunit.only;
+ exports.moduleFor = _emberQunitModuleFor['default'];
+ exports.moduleForComponent = _emberQunitModuleForComponent['default'];
+ exports.moduleForModel = _emberQunitModuleForModel['default'];
+ exports.setResolver = _emberTestHelpers.setResolver;
+ exports.QUnitAdapter = _emberQunitAdapter['default'];
});
-define('ember-qunit/module-for-component', ['exports', 'ember-qunit/qunit-module', 'ember-test-helpers'], function (exports, qunit_module, ember_test_helpers) {
-
+define('ember-qunit/adapter', ['exports', 'ember', 'qunit'], function (exports, _ember, _qunit) {
+ 'use strict';
+
+ exports['default'] = _ember['default'].Test.Adapter.extend({
+ init: function init() {
+ this.doneCallbacks = [];
+ },
+
+ asyncStart: function asyncStart() {
+ this.doneCallbacks.push(_qunit['default'].config.current.assert.async());
+ },
+
+ asyncEnd: function asyncEnd() {
+ this.doneCallbacks.pop()();
+ },
+
+ exception: function exception(error) {
+ _qunit['default'].config.current.assert.ok(false, _ember['default'].inspect(error));
+ }
+ });
+});
+define('ember-qunit/module-for-component', ['exports', './qunit-module', 'ember-test-helpers'], function (exports, _qunitModule, _emberTestHelpers) {
'use strict';
- function moduleForComponent(name, description, callbacks) {
- qunit_module.createModule(ember_test_helpers.TestModuleForComponent, name, description, callbacks);
- }
exports['default'] = moduleForComponent;
+ function moduleForComponent(name, description, callbacks) {
+ _qunitModule.createModule(_emberTestHelpers.TestModuleForComponent, name, description, callbacks);
+ }
});
-define('ember-qunit/module-for-model', ['exports', 'ember-qunit/qunit-module', 'ember-test-helpers'], function (exports, qunit_module, ember_test_helpers) {
-
+define('ember-qunit/module-for-model', ['exports', './qunit-module', 'ember-test-helpers'], function (exports, _qunitModule, _emberTestHelpers) {
'use strict';
- function moduleForModel(name, description, callbacks) {
- qunit_module.createModule(ember_test_helpers.TestModuleForModel, name, description, callbacks);
- }
exports['default'] = moduleForModel;
+ function moduleForModel(name, description, callbacks) {
+ _qunitModule.createModule(_emberTestHelpers.TestModuleForModel, name, description, callbacks);
+ }
});
-define('ember-qunit/module-for', ['exports', 'ember-qunit/qunit-module', 'ember-test-helpers'], function (exports, qunit_module, ember_test_helpers) {
-
+define('ember-qunit/module-for', ['exports', './qunit-module', 'ember-test-helpers'], function (exports, _qunitModule, _emberTestHelpers) {
'use strict';
- function moduleFor(name, description, callbacks) {
- qunit_module.createModule(ember_test_helpers.TestModule, name, description, callbacks);
- }
exports['default'] = moduleFor;
-});
-define('ember-qunit/only', ['exports', 'ember-qunit/test-wrapper', 'qunit'], function (exports, testWrapper, qunit) {
-
- 'use strict';
-
- function only(/* testName, expected, callback, async */) {
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; ++_key) {
- args[_key] = arguments[_key];
- }
- args.unshift(qunit.only);
- testWrapper['default'].apply(null, args);
+ function moduleFor(name, description, callbacks) {
+ _qunitModule.createModule(_emberTestHelpers.TestModule, name, description, callbacks);
}
- exports['default'] = only;
-
});
-define('ember-qunit/qunit-module', ['exports', 'qunit'], function (exports, qunit) {
-
+define('ember-qunit/qunit-module', ['exports', 'ember', 'qunit'], function (exports, _ember, _qunit) {
'use strict';
exports.createModule = createModule;
function beforeEachCallback(callbacks) {
- if (typeof callbacks !== 'object') { return; }
- if (!callbacks) { return; }
+ if (typeof callbacks !== 'object') {
+ return;
+ }
+ if (!callbacks) {
+ return;
+ }
var beforeEach;
- if (callbacks.setup) {
- beforeEach = callbacks.setup;
- delete callbacks.setup;
- }
-
if (callbacks.beforeEach) {
beforeEach = callbacks.beforeEach;
delete callbacks.beforeEach;
@@ -195,16 +196,15 @@ define('ember-qunit/qunit-module', ['exports', 'qunit'], function (exports, quni
}
function afterEachCallback(callbacks) {
- if (typeof callbacks !== 'object') { return; }
- if (!callbacks) { return; }
+ if (typeof callbacks !== 'object') {
+ return;
+ }
+ if (!callbacks) {
+ return;
+ }
var afterEach;
- if (callbacks.teardown) {
- afterEach = callbacks.teardown;
- delete callbacks.teardown;
- }
-
if (callbacks.afterEach) {
afterEach = callbacks.afterEach;
delete callbacks.afterEach;
@@ -214,129 +214,349 @@ define('ember-qunit/qunit-module', ['exports', 'qunit'], function (exports, quni
}
function createModule(Constructor, name, description, callbacks) {
- var beforeEach = beforeEachCallback(callbacks || description);
- var afterEach = afterEachCallback(callbacks || description);
+ var _beforeEach = beforeEachCallback(callbacks || description);
+ var _afterEach = afterEachCallback(callbacks || description);
var module = new Constructor(name, description, callbacks);
- qunit.module(module.name, {
- setup: function(assert) {
- var done = assert.async();
- return module.setup().then(function() {
- if (beforeEach) {
- beforeEach.call(module.context, assert);
+ _qunit.module(module.name, {
+ beforeEach: function beforeEach() {
+ var _this = this,
+ _arguments = arguments;
+
+ // provide the test context to the underlying module
+ module.setContext(this);
+
+ return module.setup.apply(module, arguments).then(function () {
+ if (_beforeEach) {
+ return _beforeEach.apply(_this, _arguments);
}
- })['finally'](done);
+ });
},
- teardown: function(assert) {
- if (afterEach) {
- afterEach.call(module.context, assert);
+ afterEach: function afterEach() {
+ var _arguments2 = arguments;
+
+ var result = undefined;
+
+ if (_afterEach) {
+ result = _afterEach.apply(this, arguments);
}
- var done = assert.async();
- return module.teardown()['finally'](done);
+
+ return _ember['default'].RSVP.resolve(result).then(function () {
+ return module.teardown.apply(module, _arguments2);
+ });
}
});
}
-
});
-define('ember-qunit/test-wrapper', ['exports', 'ember', 'ember-test-helpers'], function (exports, Ember, ember_test_helpers) {
-
+define('ember-test-helpers', ['exports', 'ember', 'ember-test-helpers/test-module', 'ember-test-helpers/test-module-for-acceptance', 'ember-test-helpers/test-module-for-integration', 'ember-test-helpers/test-module-for-component', 'ember-test-helpers/test-module-for-model', 'ember-test-helpers/test-context', 'ember-test-helpers/test-resolver'], function (exports, _ember, _emberTestHelpersTestModule, _emberTestHelpersTestModuleForAcceptance, _emberTestHelpersTestModuleForIntegration, _emberTestHelpersTestModuleForComponent, _emberTestHelpersTestModuleForModel, _emberTestHelpersTestContext, _emberTestHelpersTestResolver) {
'use strict';
- function testWrapper(qunit /*, testName, expected, callback, async */) {
- var callback;
- for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; ++_key) {
- args[_key - 1] = arguments[_key];
+ _ember['default'].testing = true;
+
+ exports.TestModule = _emberTestHelpersTestModule['default'];
+ exports.TestModuleForAcceptance = _emberTestHelpersTestModuleForAcceptance['default'];
+ exports.TestModuleForIntegration = _emberTestHelpersTestModuleForIntegration['default'];
+ exports.TestModuleForComponent = _emberTestHelpersTestModuleForComponent['default'];
+ exports.TestModuleForModel = _emberTestHelpersTestModuleForModel['default'];
+ exports.getContext = _emberTestHelpersTestContext.getContext;
+ exports.setContext = _emberTestHelpersTestContext.setContext;
+ exports.unsetContext = _emberTestHelpersTestContext.unsetContext;
+ exports.setResolver = _emberTestHelpersTestResolver.setResolver;
+});
+define('ember-test-helpers/-legacy-overrides', ['exports', 'ember', './has-ember-version'], function (exports, _ember, _hasEmberVersion) {
+ 'use strict';
+
+ exports.preGlimmerSetupIntegrationForComponent = preGlimmerSetupIntegrationForComponent;
+
+ function preGlimmerSetupIntegrationForComponent() {
+ var module = this;
+ var context = this.context;
+
+ this.actionHooks = {};
+
+ context.dispatcher = this.container.lookup('event_dispatcher:main') || _ember['default'].EventDispatcher.create();
+ context.dispatcher.setup({}, '#ember-testing');
+ context.actions = module.actionHooks;
+
+ (this.registry || this.container).register('component:-test-holder', _ember['default'].Component.extend());
+
+ context.render = function (template) {
+ // in case `this.render` is called twice, make sure to teardown the first invocation
+ module.teardownComponent();
+
+ if (!template) {
+ throw new Error("in a component integration test you must pass a template to `render()`");
+ }
+ if (_ember['default'].isArray(template)) {
+ template = template.join('');
+ }
+ if (typeof template === 'string') {
+ template = _ember['default'].Handlebars.compile(template);
+ }
+ module.component = module.container.lookupFactory('component:-test-holder').create({
+ layout: template
+ });
+
+ module.component.set('context', context);
+ module.component.set('controller', context);
+
+ _ember['default'].run(function () {
+ module.component.appendTo('#ember-testing');
+ });
+
+ context._element = module.component.element;
+ };
+
+ context.$ = function () {
+ return module.component.$.apply(module.component, arguments);
+ };
+
+ context.set = function (key, value) {
+ var ret = _ember['default'].run(function () {
+ return _ember['default'].set(context, key, value);
+ });
+
+ if (_hasEmberVersion['default'](2, 0)) {
+ return ret;
+ }
+ };
+
+ context.setProperties = function (hash) {
+ var ret = _ember['default'].run(function () {
+ return _ember['default'].setProperties(context, hash);
+ });
+
+ if (_hasEmberVersion['default'](2, 0)) {
+ return ret;
+ }
+ };
+
+ context.get = function (key) {
+ return _ember['default'].get(context, key);
+ };
+
+ context.getProperties = function () {
+ var args = Array.prototype.slice.call(arguments);
+ return _ember['default'].getProperties(context, args);
+ };
+
+ context.on = function (actionName, handler) {
+ module.actionHooks[actionName] = handler;
+ };
+
+ context.send = function (actionName) {
+ var hook = module.actionHooks[actionName];
+ if (!hook) {
+ throw new Error("integration testing template received unexpected action " + actionName);
+ }
+ hook.apply(module, Array.prototype.slice.call(arguments, 1));
+ };
+
+ context.clearRender = function () {
+ module.teardownComponent();
+ };
+ }
+});
+define('ember-test-helpers/abstract-test-module', ['exports', './wait', './test-context', 'ember'], function (exports, _wait, _testContext, _ember) {
+ 'use strict';
+
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+ // calling this `merge` here because we cannot
+ // actually assume it is like `Object.assign`
+ // with > 2 args
+ var merge = _ember['default'].assign || _ember['default'].merge;
+
+ var _default = (function () {
+ function _default(name, options) {
+ _classCallCheck(this, _default);
+
+ this.context = undefined;
+ this.name = name;
+ this.callbacks = options || {};
+
+ this.initSetupSteps();
+ this.initTeardownSteps();
}
- function wrapper() {
- var context = ember_test_helpers.getContext();
+ _default.prototype.setup = function setup(assert) {
+ var _this = this;
- var result = callback.apply(context, arguments);
+ return this.invokeSteps(this.setupSteps, this, assert).then(function () {
+ _this.contextualizeCallbacks();
+ return _this.invokeSteps(_this.contextualizedSetupSteps, _this.context, assert);
+ });
+ };
- function failTestOnPromiseRejection(reason) {
- var message;
- if (reason instanceof Error) {
- message = reason.stack;
- if (reason.message && message.indexOf(reason.message) < 0) {
- // PhantomJS has a `stack` that does not contain the actual
- // exception message.
- message = Ember['default'].inspect(reason) + "\n" + message;
- }
- } else {
- message = Ember['default'].inspect(reason);
- }
- ok(false, message);
+ _default.prototype.teardown = function teardown(assert) {
+ var _this2 = this;
+
+ return this.invokeSteps(this.contextualizedTeardownSteps, this.context, assert).then(function () {
+ return _this2.invokeSteps(_this2.teardownSteps, _this2, assert);
+ }).then(function () {
+ _this2.cache = null;
+ _this2.cachedCalls = null;
+ });
+ };
+
+ _default.prototype.initSetupSteps = function initSetupSteps() {
+ this.setupSteps = [];
+ this.contextualizedSetupSteps = [];
+
+ if (this.callbacks.beforeSetup) {
+ this.setupSteps.push(this.callbacks.beforeSetup);
+ delete this.callbacks.beforeSetup;
}
- Ember['default'].run(function(){
- QUnit.stop();
- Ember['default'].RSVP.Promise.resolve(result)['catch'](failTestOnPromiseRejection)['finally'](QUnit.start);
+ this.setupSteps.push(this.setupContext);
+ this.setupSteps.push(this.setupTestElements);
+ this.setupSteps.push(this.setupAJAXListeners);
+
+ if (this.callbacks.setup) {
+ this.contextualizedSetupSteps.push(this.callbacks.setup);
+ delete this.callbacks.setup;
+ }
+ };
+
+ _default.prototype.invokeSteps = function invokeSteps(steps, context, assert) {
+ steps = steps.slice();
+
+ function nextStep() {
+ var step = steps.shift();
+ if (step) {
+ // guard against exceptions, for example missing components referenced from needs.
+ return new _ember['default'].RSVP.Promise(function (resolve) {
+ resolve(step.call(context, assert));
+ }).then(nextStep);
+ } else {
+ return _ember['default'].RSVP.resolve();
+ }
+ }
+ return nextStep();
+ };
+
+ _default.prototype.contextualizeCallbacks = function contextualizeCallbacks() {};
+
+ _default.prototype.initTeardownSteps = function initTeardownSteps() {
+ this.teardownSteps = [];
+ this.contextualizedTeardownSteps = [];
+
+ if (this.callbacks.teardown) {
+ this.contextualizedTeardownSteps.push(this.callbacks.teardown);
+ delete this.callbacks.teardown;
+ }
+
+ this.teardownSteps.push(this.teardownContext);
+ this.teardownSteps.push(this.teardownTestElements);
+ this.teardownSteps.push(this.teardownAJAXListeners);
+
+ if (this.callbacks.afterTeardown) {
+ this.teardownSteps.push(this.callbacks.afterTeardown);
+ delete this.callbacks.afterTeardown;
+ }
+ };
+
+ _default.prototype.setupTestElements = function setupTestElements() {
+ var testEl = document.querySelector('#ember-testing');
+ if (!testEl) {
+ var element = document.createElement('div');
+ element.setAttribute('id', 'ember-testing');
+
+ document.body.appendChild(element);
+ this.fixtureResetValue = '';
+ } else {
+ this.fixtureResetValue = testEl.innerHTML;
+ }
+ };
+
+ _default.prototype.setupContext = function setupContext(options) {
+ var context = this.getContext();
+
+ merge(context, {
+ dispatcher: null,
+ inject: {}
});
- }
+ merge(context, options);
- if (args.length === 2) {
- callback = args.splice(1, 1, wrapper)[0];
- } else {
- callback = args.splice(2, 1, wrapper)[0];
- }
+ this.setToString();
+ _testContext.setContext(context);
+ this.context = context;
+ };
- qunit.apply(null, args);
- }
- exports['default'] = testWrapper;
+ _default.prototype.setContext = function setContext(context) {
+ this.context = context;
+ };
+ _default.prototype.getContext = function getContext() {
+ if (this.context) {
+ return this.context;
+ }
+
+ return this.context = _testContext.getContext() || {};
+ };
+
+ _default.prototype.setToString = function setToString() {
+ var _this3 = this;
+
+ this.context.toString = function () {
+ if (_this3.subjectName) {
+ return 'test context for: ' + _this3.subjectName;
+ }
+
+ if (_this3.name) {
+ return 'test context for: ' + _this3.name;
+ }
+ };
+ };
+
+ _default.prototype.setupAJAXListeners = function setupAJAXListeners() {
+ _wait._setupAJAXHooks();
+ };
+
+ _default.prototype.teardownAJAXListeners = function teardownAJAXListeners() {
+ _wait._teardownAJAXHooks();
+ };
+
+ _default.prototype.teardownTestElements = function teardownTestElements() {
+ document.getElementById('ember-testing').innerHTML = this.fixtureResetValue;
+
+ // Ember 2.0.0 removed Ember.View as public API, so only do this when
+ // Ember.View is present
+ if (_ember['default'].View && _ember['default'].View.views) {
+ _ember['default'].View.views = {};
+ }
+ };
+
+ _default.prototype.teardownContext = function teardownContext() {
+ var context = this.context;
+ this.context = undefined;
+ _testContext.unsetContext();
+
+ if (context && context.dispatcher && !context.dispatcher.isDestroyed) {
+ _ember['default'].run(function () {
+ context.dispatcher.destroy();
+ });
+ }
+ };
+
+ return _default;
+ })();
+
+ exports['default'] = _default;
});
-define('ember-qunit/test', ['exports', 'ember-qunit/test-wrapper', 'qunit'], function (exports, testWrapper, qunit) {
-
- 'use strict';
-
- function test(/* testName, expected, callback, async */) {
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; ++_key) {
- args[_key] = arguments[_key];
- }
- args.unshift(qunit.test);
- testWrapper['default'].apply(null, args);
- }
- exports['default'] = test;
-
-});
-define('ember-test-helpers', ['exports', 'ember', 'ember-test-helpers/test-module', 'ember-test-helpers/test-module-for-component', 'ember-test-helpers/test-module-for-model', 'ember-test-helpers/test-context', 'ember-test-helpers/test-resolver'], function (exports, Ember, TestModule, TestModuleForComponent, TestModuleForModel, test_context, test_resolver) {
-
- 'use strict';
-
- Ember['default'].testing = true;
-
- exports.TestModule = TestModule['default'];
- exports.TestModuleForComponent = TestModuleForComponent['default'];
- exports.TestModuleForModel = TestModuleForModel['default'];
- exports.getContext = test_context.getContext;
- exports.setContext = test_context.setContext;
- exports.setResolver = test_resolver.setResolver;
-
-});
-define('ember-test-helpers/build-registry', ['exports', 'ember'], function (exports, Ember) {
+define('ember-test-helpers/build-registry', ['exports', 'ember'], function (exports, _ember) {
+ /* globals global, self, requirejs, require */
'use strict';
function exposeRegistryMethodsWithoutDeprecations(container) {
- var methods = [
- 'register',
- 'unregister',
- 'resolve',
- 'normalize',
- 'typeInjection',
- 'injection',
- 'factoryInjection',
- 'factoryTypeInjection',
- 'has',
- 'options',
- 'optionsForType'
- ];
+ var methods = ['register', 'unregister', 'resolve', 'normalize', 'typeInjection', 'injection', 'factoryInjection', 'factoryTypeInjection', 'has', 'options', 'optionsForType'];
function exposeRegistryMethod(container, method) {
if (method in container) {
- container[method] = function() {
+ container[method] = function () {
return container._registry[method].apply(container._registry, arguments);
};
}
@@ -347,18 +567,20 @@ define('ember-test-helpers/build-registry', ['exports', 'ember'], function (expo
}
}
- var Owner = (function() {
- if (Ember['default']._RegistryProxyMixin && Ember['default']._ContainerProxyMixin) {
- return Ember['default'].Object.extend(Ember['default']._RegistryProxyMixin, Ember['default']._ContainerProxyMixin);
+ var Owner = (function () {
+ if (_ember['default']._RegistryProxyMixin && _ember['default']._ContainerProxyMixin) {
+ return _ember['default'].Object.extend(_ember['default']._RegistryProxyMixin, _ember['default']._ContainerProxyMixin);
}
- return Ember['default'].Object.extend();
+ return _ember['default'].Object.extend();
})();
- exports['default'] = function(resolver) {
+ exports['default'] = function (resolver) {
var fallbackRegistry, registry, container;
- var namespace = Ember['default'].Object.create({
- Resolver: { create: function() { return resolver; } }
+ var namespace = _ember['default'].Object.create({
+ Resolver: { create: function create() {
+ return resolver;
+ } }
});
function register(name, factory) {
@@ -369,14 +591,18 @@ define('ember-test-helpers/build-registry', ['exports', 'ember'], function (expo
}
}
- if (Ember['default'].Application.buildRegistry) {
- fallbackRegistry = Ember['default'].Application.buildRegistry(namespace);
- fallbackRegistry.register('component-lookup:main', Ember['default'].ComponentLookup);
+ if (_ember['default'].Application.buildRegistry) {
+ fallbackRegistry = _ember['default'].Application.buildRegistry(namespace);
+ fallbackRegistry.register('component-lookup:main', _ember['default'].ComponentLookup);
- registry = new Ember['default'].Registry({
+ registry = new _ember['default'].Registry({
fallback: fallbackRegistry
});
+ if (_ember['default'].ApplicationInstance && _ember['default'].ApplicationInstance.setupRegistry) {
+ _ember['default'].ApplicationInstance.setupRegistry(registry);
+ }
+
// these properties are set on the fallback registry by `buildRegistry`
// and on the primary registry within the ApplicationInstance constructor
// but we need to manually recreate them since ApplicationInstance's are not
@@ -395,8 +621,8 @@ define('ember-test-helpers/build-registry', ['exports', 'ember'], function (expo
exposeRegistryMethodsWithoutDeprecations(container);
} else {
- container = Ember['default'].Application.buildContainer(namespace);
- container.register('component-lookup:main', Ember['default'].ComponentLookup);
+ container = _ember['default'].Application.buildContainer(namespace);
+ container.register('component-lookup:main', _ember['default'].ComponentLookup);
}
// Ember 1.10.0 did not properly add `view:toplevel` or `view:default`
@@ -404,18 +630,26 @@ define('ember-test-helpers/build-registry', ['exports', 'ember'], function (expo
//
// Ember 2.0.0 removed Ember.View as public API, so only do this when
// Ember.View is present
- if (Ember['default'].View) {
- register('view:toplevel', Ember['default'].View.extend());
+ if (_ember['default'].View) {
+ register('view:toplevel', _ember['default'].View.extend());
}
// Ember 2.0.0 removed Ember._MetamorphView from the Ember global, so only
// do this when present
- if (Ember['default']._MetamorphView) {
- register('view:default', Ember['default']._MetamorphView);
+ if (_ember['default']._MetamorphView) {
+ register('view:default', _ember['default']._MetamorphView);
}
var globalContext = typeof global === 'object' && global || self;
- if (globalContext.DS) {
+ if (requirejs.entries['ember-data/setup-container']) {
+ // ember-data is a proper ember-cli addon since 2.3; if no 'import
+ // 'ember-data'' is present somewhere in the tests, there is also no `DS`
+ // available on the globalContext and hence ember-data wouldn't be setup
+ // correctly for the tests; that's why we import and call setupContainer
+ // here; also see https://github.com/emberjs/data/issues/4071 for context
+ var setupContainer = require('ember-data/setup-container')['default'];
+ setupContainer(registry || container);
+ } else if (globalContext.DS) {
var DS = globalContext.DS;
if (DS._setupContainer) {
DS._setupContainer(registry || container);
@@ -434,30 +668,26 @@ define('ember-test-helpers/build-registry', ['exports', 'ember'], function (expo
registry: registry,
container: container
};
- }
-
+ };
});
-define('ember-test-helpers/has-ember-version', ['exports', 'ember'], function (exports, Ember) {
-
+define('ember-test-helpers/has-ember-version', ['exports', 'ember'], function (exports, _ember) {
'use strict';
- function hasEmberVersion(major, minor) {
- var numbers = Ember['default'].VERSION.split('-')[0].split('.');
- var actualMajor = parseInt(numbers[0], 10);
- var actualMinor = parseInt(numbers[1], 10);
- return actualMajor > major || (actualMajor === major && actualMinor >= minor);
- }
exports['default'] = hasEmberVersion;
+ function hasEmberVersion(major, minor) {
+ var numbers = _ember['default'].VERSION.split('-')[0].split('.');
+ var actualMajor = parseInt(numbers[0], 10);
+ var actualMinor = parseInt(numbers[1], 10);
+ return actualMajor > major || actualMajor === major && actualMinor >= minor;
+ }
});
-define('ember-test-helpers/test-context', ['exports'], function (exports) {
-
- 'use strict';
+define("ember-test-helpers/test-context", ["exports"], function (exports) {
+ "use strict";
exports.setContext = setContext;
exports.getContext = getContext;
exports.unsetContext = unsetContext;
-
var __test_context__;
function setContext(context) {
@@ -471,16 +701,82 @@ define('ember-test-helpers/test-context', ['exports'], function (exports) {
function unsetContext() {
__test_context__ = undefined;
}
-
});
-define('ember-test-helpers/test-module-for-component', ['exports', 'ember-test-helpers/test-module', 'ember', 'ember-test-helpers/test-resolver'], function (exports, TestModule, Ember, test_resolver) {
-
+define('ember-test-helpers/test-module-for-acceptance', ['exports', './abstract-test-module', 'ember', './test-context'], function (exports, _abstractTestModule, _ember, _testContext) {
'use strict';
- exports['default'] = TestModule['default'].extend({
- isComponentTestModule: true,
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+ var _default = (function (_AbstractTestModule) {
+ _inherits(_default, _AbstractTestModule);
+
+ function _default() {
+ _classCallCheck(this, _default);
+
+ _AbstractTestModule.apply(this, arguments);
+ }
+
+ _default.prototype.setupContext = function setupContext() {
+ _AbstractTestModule.prototype.setupContext.call(this, { application: this.createApplication() });
+ };
+
+ _default.prototype.teardownContext = function teardownContext() {
+ _ember['default'].run(function () {
+ _testContext.getContext().application.destroy();
+ });
+
+ _AbstractTestModule.prototype.teardownContext.call(this);
+ };
+
+ _default.prototype.createApplication = function createApplication() {
+ var _callbacks = this.callbacks;
+ var Application = _callbacks.Application;
+ var config = _callbacks.config;
+
+ var application = undefined;
+
+ _ember['default'].run(function () {
+ application = Application.create(config);
+ application.setupForTesting();
+ application.injectTestHelpers();
+ });
+
+ return application;
+ };
+
+ return _default;
+ })(_abstractTestModule['default']);
+
+ exports['default'] = _default;
+});
+define('ember-test-helpers/test-module-for-component', ['exports', './test-module', 'ember', './has-ember-version', './-legacy-overrides'], function (exports, _testModule, _ember, _hasEmberVersion, _legacyOverrides) {
+ 'use strict';
+
+ exports.setupComponentIntegrationTest = _setupComponentIntegrationTest;
+
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+ var ACTION_KEY = undefined;
+ if (_hasEmberVersion['default'](2, 0)) {
+ ACTION_KEY = 'actions';
+ } else {
+ ACTION_KEY = '_actions';
+ }
+
+ var isPreGlimmer = !_hasEmberVersion['default'](1, 13);
+
+ var getOwner = _ember['default'].getOwner;
+
+ var _default = (function (_TestModule) {
+ _inherits(_default, _TestModule);
+
+ function _default(componentName, description, callbacks) {
+ _classCallCheck(this, _default);
- init: function(componentName, description, callbacks) {
// Allow `description` to be omitted
if (!callbacks && typeof description === 'object') {
callbacks = description;
@@ -489,30 +785,21 @@ define('ember-test-helpers/test-module-for-component', ['exports', 'ember-test-h
callbacks = {};
}
+ var integrationOption = callbacks.integration;
+
+ _TestModule.call(this, 'component:' + componentName, description, callbacks);
+
this.componentName = componentName;
- if (callbacks.needs || callbacks.unit || callbacks.integration === false) {
+ if (callbacks.needs || callbacks.unit || integrationOption === false) {
this.isUnitTest = true;
- } else if (callbacks.integration) {
+ } else if (integrationOption) {
this.isUnitTest = false;
} else {
- Ember['default'].deprecate(
- "the component:" + componentName + " test module is implicitly running in unit test mode, " +
- "which will change to integration test mode by default in an upcoming version of " +
- "ember-test-helpers. Add `unit: true` or a `needs:[]` list to explicitly opt in to unit " +
- "test mode.",
- false,
- { id: 'ember-test-helpers.test-module-for-component.test-type', until: '0.6.0' }
- );
+ _ember['default'].deprecate("the component:" + componentName + " test module is implicitly running in unit test mode, " + "which will change to integration test mode by default in an upcoming version of " + "ember-test-helpers. Add `unit: true` or a `needs:[]` list to explicitly opt in to unit " + "test mode.", false, { id: 'ember-test-helpers.test-module-for-component.test-type', until: '0.6.0' });
this.isUnitTest = true;
}
- if (description) {
- this._super.call(this, 'component:' + componentName, description, callbacks);
- } else {
- this._super.call(this, 'component:' + componentName, callbacks);
- }
-
if (!this.isUnitTest && !this.isLegacy) {
callbacks.integration = true;
}
@@ -520,35 +807,40 @@ define('ember-test-helpers/test-module-for-component', ['exports', 'ember-test-h
if (this.isUnitTest || this.isLegacy) {
this.setupSteps.push(this.setupComponentUnitTest);
} else {
- this.callbacks.subject = function() {
- throw new Error("component integration tests do not support `subject()`.");
+ this.callbacks.subject = function () {
+ throw new Error("component integration tests do not support `subject()`. Instead, render the component as if it were HTML: `this.render('');`. For more information, read: http://guides.emberjs.com/v2.2.0/testing/testing-components/");
};
this.setupSteps.push(this.setupComponentIntegrationTest);
this.teardownSteps.unshift(this.teardownComponent);
}
- if (Ember['default'].View && Ember['default'].View.views) {
+ if (_ember['default'].View && _ember['default'].View.views) {
this.setupSteps.push(this._aliasViewRegistry);
this.teardownSteps.unshift(this._resetViewRegistry);
}
- },
+ }
- _aliasViewRegistry: function() {
- this._originalGlobalViewRegistry = Ember['default'].View.views;
+ _default.prototype.initIntegration = function initIntegration(options) {
+ this.isLegacy = options.integration === 'legacy';
+ this.isIntegration = options.integration !== 'legacy';
+ };
+
+ _default.prototype._aliasViewRegistry = function _aliasViewRegistry() {
+ this._originalGlobalViewRegistry = _ember['default'].View.views;
var viewRegistry = this.container.lookup('-view-registry:main');
if (viewRegistry) {
- Ember['default'].View.views = viewRegistry;
+ _ember['default'].View.views = viewRegistry;
}
- },
+ };
- _resetViewRegistry: function() {
- Ember['default'].View.views = this._originalGlobalViewRegistry;
- },
+ _default.prototype._resetViewRegistry = function _resetViewRegistry() {
+ _ember['default'].View.views = this._originalGlobalViewRegistry;
+ };
- setupComponentUnitTest: function() {
+ _default.prototype.setupComponentUnitTest = function setupComponentUnitTest() {
var _this = this;
- var resolver = test_resolver.getResolver();
+ var resolver = this.resolver;
var context = this.context;
var layoutName = 'template:components/' + this.componentName;
@@ -561,114 +853,51 @@ define('ember-test-helpers/test-module-for-component', ['exports', 'ember-test-h
thingToRegisterWith.injection(this.subjectName, 'layout', layoutName);
}
- context.dispatcher = this.container.lookup('event_dispatcher:main') || Ember['default'].EventDispatcher.create();
+ context.dispatcher = this.container.lookup('event_dispatcher:main') || _ember['default'].EventDispatcher.create();
context.dispatcher.setup({}, '#ember-testing');
- this.callbacks.render = function() {
+ context._element = null;
+
+ this.callbacks.render = function () {
var subject;
- Ember['default'].run(function(){
+ _ember['default'].run(function () {
subject = context.subject();
subject.appendTo('#ember-testing');
});
- _this.teardownSteps.unshift(function() {
- Ember['default'].run(function() {
- Ember['default'].tryInvoke(subject, 'destroy');
+ context._element = subject.element;
+
+ _this.teardownSteps.unshift(function () {
+ _ember['default'].run(function () {
+ _ember['default'].tryInvoke(subject, 'destroy');
});
});
};
- this.callbacks.append = function() {
- Ember['default'].deprecate(
- 'this.append() is deprecated. Please use this.render() or this.$() instead.',
- false,
- { id: 'ember-test-helpers.test-module-for-component.append', until: '0.6.0' }
- );
+ this.callbacks.append = function () {
+ _ember['default'].deprecate('this.append() is deprecated. Please use this.render() or this.$() instead.', false, { id: 'ember-test-helpers.test-module-for-component.append', until: '0.6.0' });
return context.$();
};
- context.$ = function() {
+ context.$ = function () {
this.render();
var subject = this.subject();
return subject.$.apply(subject, arguments);
};
- },
+ };
- setupComponentIntegrationTest: function() {
- var module = this;
- var context = this.context;
+ _default.prototype.setupComponentIntegrationTest = function setupComponentIntegrationTest() {
+ if (isPreGlimmer) {
+ return _legacyOverrides.preGlimmerSetupIntegrationForComponent.apply(this, arguments);
+ } else {
+ return _setupComponentIntegrationTest.apply(this, arguments);
+ }
+ };
- this.actionHooks = {};
-
- context.dispatcher = this.container.lookup('event_dispatcher:main') || Ember['default'].EventDispatcher.create();
- context.dispatcher.setup({}, '#ember-testing');
- context.actions = module.actionHooks;
-
- (this.registry || this.container).register('component:-test-holder', Ember['default'].Component.extend());
-
- context.render = function(template) {
- if (!template) {
- throw new Error("in a component integration test you must pass a template to `render()`");
- }
- if (Ember['default'].isArray(template)) {
- template = template.join('');
- }
- if (typeof template === 'string') {
- template = Ember['default'].Handlebars.compile(template);
- }
- module.component = module.container.lookupFactory('component:-test-holder').create({
- layout: template
- });
-
- module.component.set('context' ,context);
- module.component.set('controller', context);
-
- Ember['default'].run(function() {
- module.component.appendTo('#ember-testing');
- });
- };
-
- context.$ = function() {
- return module.component.$.apply(module.component, arguments);
- };
-
- context.set = function(key, value) {
- Ember['default'].run(function() {
- Ember['default'].set(context, key, value);
- });
- };
-
- context.setProperties = function(hash) {
- Ember['default'].run(function() {
- Ember['default'].setProperties(context, hash);
- });
- };
-
- context.get = function(key) {
- return Ember['default'].get(context, key);
- };
-
- context.getProperties = function() {
- var args = Array.prototype.slice.call(arguments);
- return Ember['default'].getProperties(context, args);
- };
-
- context.on = function(actionName, handler) {
- module.actionHooks[actionName] = handler;
- };
- context.send = function(actionName) {
- var hook = module.actionHooks[actionName];
- if (!hook) {
- throw new Error("integration testing template received unexpected action " + actionName);
- }
- hook.apply(module, Array.prototype.slice.call(arguments, 1));
- };
- },
-
- setupContext: function() {
- this._super.call(this);
+ _default.prototype.setupContext = function setupContext() {
+ _TestModule.prototype.setupContext.call(this);
// only setup the injection if we are running against a version
// of Ember that has `-view-registry:main` (Ember >= 1.12)
@@ -677,35 +906,409 @@ define('ember-test-helpers/test-module-for-component', ['exports', 'ember-test-h
}
if (!this.isUnitTest && !this.isLegacy) {
- this.context.factory = function() {};
+ this.context.factory = function () {};
}
- },
+ };
- teardownComponent: function() {
+ _default.prototype.teardownComponent = function teardownComponent() {
var component = this.component;
if (component) {
- Ember['default'].run(function() {
+ _ember['default'].run(component, 'destroy');
+ this.component = null;
+ }
+ };
+
+ return _default;
+ })(_testModule['default']);
+
+ exports['default'] = _default;
+
+ function _setupComponentIntegrationTest() {
+ var module = this;
+ var context = this.context;
+
+ this.actionHooks = context[ACTION_KEY] = {};
+ context.dispatcher = this.container.lookup('event_dispatcher:main') || _ember['default'].EventDispatcher.create();
+ context.dispatcher.setup({}, '#ember-testing');
+
+ var hasRendered = false;
+ var OutletView = module.container.lookupFactory('view:-outlet');
+ var OutletTemplate = module.container.lookup('template:-outlet');
+ var toplevelView = module.component = OutletView.create();
+ var hasOutletTemplate = !!OutletTemplate;
+ var outletState = {
+ render: {
+ owner: getOwner ? getOwner(module.container) : undefined,
+ into: undefined,
+ outlet: 'main',
+ name: 'application',
+ controller: module.context,
+ ViewClass: undefined,
+ template: OutletTemplate
+ },
+
+ outlets: {}
+ };
+
+ var element = document.getElementById('ember-testing');
+ var templateId = 0;
+
+ if (hasOutletTemplate) {
+ _ember['default'].run(function () {
+ toplevelView.setOutletState(outletState);
+ });
+ }
+
+ context.render = function (template) {
+ if (!template) {
+ throw new Error("in a component integration test you must pass a template to `render()`");
+ }
+ if (_ember['default'].isArray(template)) {
+ template = template.join('');
+ }
+ if (typeof template === 'string') {
+ template = _ember['default'].Handlebars.compile(template);
+ }
+
+ var templateFullName = 'template:-undertest-' + ++templateId;
+ this.registry.register(templateFullName, template);
+ var stateToRender = {
+ owner: getOwner ? getOwner(module.container) : undefined,
+ into: undefined,
+ outlet: 'main',
+ name: 'index',
+ controller: module.context,
+ ViewClass: undefined,
+ template: module.container.lookup(templateFullName),
+ outlets: {}
+ };
+
+ if (hasOutletTemplate) {
+ stateToRender.name = 'index';
+ outletState.outlets.main = { render: stateToRender, outlets: {} };
+ } else {
+ stateToRender.name = 'application';
+ outletState = { render: stateToRender, outlets: {} };
+ }
+
+ _ember['default'].run(function () {
+ toplevelView.setOutletState(outletState);
+ });
+
+ if (!hasRendered) {
+ _ember['default'].run(module.component, 'appendTo', '#ember-testing');
+ hasRendered = true;
+ }
+
+ // ensure the element is based on the wrapping toplevel view
+ // Ember still wraps the main application template with a
+ // normal tagged view
+ context._element = element = document.querySelector('#ember-testing > .ember-view');
+ };
+
+ context.$ = function (selector) {
+ // emulates Ember internal behavor of `this.$` in a component
+ // https://github.com/emberjs/ember.js/blob/v2.5.1/packages/ember-views/lib/views/states/has_element.js#L18
+ return selector ? _ember['default'].$(selector, element) : _ember['default'].$(element);
+ };
+
+ context.set = function (key, value) {
+ var ret = _ember['default'].run(function () {
+ return _ember['default'].set(context, key, value);
+ });
+
+ if (_hasEmberVersion['default'](2, 0)) {
+ return ret;
+ }
+ };
+
+ context.setProperties = function (hash) {
+ var ret = _ember['default'].run(function () {
+ return _ember['default'].setProperties(context, hash);
+ });
+
+ if (_hasEmberVersion['default'](2, 0)) {
+ return ret;
+ }
+ };
+
+ context.get = function (key) {
+ return _ember['default'].get(context, key);
+ };
+
+ context.getProperties = function () {
+ var args = Array.prototype.slice.call(arguments);
+ return _ember['default'].getProperties(context, args);
+ };
+
+ context.on = function (actionName, handler) {
+ module.actionHooks[actionName] = handler;
+ };
+
+ context.send = function (actionName) {
+ var hook = module.actionHooks[actionName];
+ if (!hook) {
+ throw new Error("integration testing template received unexpected action " + actionName);
+ }
+ hook.apply(module.context, Array.prototype.slice.call(arguments, 1));
+ };
+
+ context.clearRender = function () {
+ _ember['default'].run(function () {
+ toplevelView.setOutletState({
+ render: {
+ owner: module.container,
+ into: undefined,
+ outlet: 'main',
+ name: 'application',
+ controller: module.context,
+ ViewClass: undefined,
+ template: undefined
+ },
+ outlets: {}
+ });
+ });
+ };
+ }
+});
+define('ember-test-helpers/test-module-for-integration', ['exports', 'ember', './abstract-test-module', './test-resolver', './build-registry', './has-ember-version', './-legacy-overrides', './test-module-for-component'], function (exports, _ember, _abstractTestModule, _testResolver, _buildRegistry, _hasEmberVersion, _legacyOverrides, _testModuleForComponent) {
+ 'use strict';
+
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+ var ACTION_KEY = undefined;
+ if (_hasEmberVersion['default'](2, 0)) {
+ ACTION_KEY = 'actions';
+ } else {
+ ACTION_KEY = '_actions';
+ }
+
+ var isPreGlimmer = !_hasEmberVersion['default'](1, 13);
+
+ var _default = (function (_AbstractTestModule) {
+ _inherits(_default, _AbstractTestModule);
+
+ function _default() {
+ _classCallCheck(this, _default);
+
+ _AbstractTestModule.apply(this, arguments);
+ this.resolver = this.callbacks.resolver || _testResolver.getResolver();
+ }
+
+ _default.prototype.initSetupSteps = function initSetupSteps() {
+ this.setupSteps = [];
+ this.contextualizedSetupSteps = [];
+
+ if (this.callbacks.beforeSetup) {
+ this.setupSteps.push(this.callbacks.beforeSetup);
+ delete this.callbacks.beforeSetup;
+ }
+
+ this.setupSteps.push(this.setupContainer);
+ this.setupSteps.push(this.setupContext);
+ this.setupSteps.push(this.setupTestElements);
+ this.setupSteps.push(this.setupAJAXListeners);
+ this.setupSteps.push(this.setupComponentIntegrationTest);
+
+ if (_ember['default'].View && _ember['default'].View.views) {
+ this.setupSteps.push(this._aliasViewRegistry);
+ }
+
+ if (this.callbacks.setup) {
+ this.contextualizedSetupSteps.push(this.callbacks.setup);
+ delete this.callbacks.setup;
+ }
+ };
+
+ _default.prototype.initTeardownSteps = function initTeardownSteps() {
+ this.teardownSteps = [];
+ this.contextualizedTeardownSteps = [];
+
+ if (this.callbacks.teardown) {
+ this.contextualizedTeardownSteps.push(this.callbacks.teardown);
+ delete this.callbacks.teardown;
+ }
+
+ this.teardownSteps.push(this.teardownContainer);
+ this.teardownSteps.push(this.teardownContext);
+ this.teardownSteps.push(this.teardownAJAXListeners);
+ this.teardownSteps.push(this.teardownComponent);
+
+ if (_ember['default'].View && _ember['default'].View.views) {
+ this.teardownSteps.push(this._resetViewRegistry);
+ }
+
+ this.teardownSteps.push(this.teardownTestElements);
+
+ if (this.callbacks.afterTeardown) {
+ this.teardownSteps.push(this.callbacks.afterTeardown);
+ delete this.callbacks.afterTeardown;
+ }
+ };
+
+ _default.prototype.setupContainer = function setupContainer() {
+ var resolver = this.resolver;
+ var items = _buildRegistry['default'](resolver);
+
+ this.container = items.container;
+ this.registry = items.registry;
+
+ if (_hasEmberVersion['default'](1, 13)) {
+ var thingToRegisterWith = this.registry || this.container;
+ var router = resolver.resolve('router:main');
+ router = router || _ember['default'].Router.extend();
+ thingToRegisterWith.register('router:main', router);
+ }
+ };
+
+ _default.prototype.setupContext = function setupContext() {
+ var subjectName = this.subjectName;
+ var container = this.container;
+
+ var factory = function factory() {
+ return container.lookupFactory(subjectName);
+ };
+
+ _AbstractTestModule.prototype.setupContext.call(this, {
+ container: this.container,
+ registry: this.registry,
+ factory: factory,
+ register: function register() {
+ var target = this.registry || this.container;
+ return target.register.apply(target, arguments);
+ }
+ });
+
+ var context = this.context;
+
+ if (_ember['default'].setOwner) {
+ _ember['default'].setOwner(context, this.container.owner);
+ }
+
+ if (_ember['default'].inject) {
+ var keys = (Object.keys || _ember['default'].keys)(_ember['default'].inject);
+ keys.forEach(function (typeName) {
+ context.inject[typeName] = function (name, opts) {
+ var alias = opts && opts.as || name;
+ _ember['default'].run(function () {
+ _ember['default'].set(context, alias, context.container.lookup(typeName + ':' + name));
+ });
+ };
+ });
+ }
+
+ // only setup the injection if we are running against a version
+ // of Ember that has `-view-registry:main` (Ember >= 1.12)
+ if (this.container.lookupFactory('-view-registry:main')) {
+ (this.registry || this.container).injection('component', '_viewRegistry', '-view-registry:main');
+ }
+ };
+
+ _default.prototype.setupComponentIntegrationTest = function setupComponentIntegrationTest() {
+ if (isPreGlimmer) {
+ return _legacyOverrides.preGlimmerSetupIntegrationForComponent.apply(this, arguments);
+ } else {
+ return _testModuleForComponent.setupComponentIntegrationTest.apply(this, arguments);
+ }
+ };
+
+ _default.prototype.teardownComponent = function teardownComponent() {
+ var component = this.component;
+ if (component) {
+ _ember['default'].run(function () {
component.destroy();
});
}
- }
- });
+ };
+ _default.prototype.teardownContainer = function teardownContainer() {
+ var container = this.container;
+ _ember['default'].run(function () {
+ container.destroy();
+ });
+ };
+
+ // allow arbitrary named factories, like rspec let
+
+ _default.prototype.contextualizeCallbacks = function contextualizeCallbacks() {
+ var callbacks = this.callbacks;
+ var context = this.context;
+
+ this.cache = this.cache || {};
+ this.cachedCalls = this.cachedCalls || {};
+
+ var keys = (Object.keys || _ember['default'].keys)(callbacks);
+ var keysLength = keys.length;
+
+ if (keysLength) {
+ for (var i = 0; i < keysLength; i++) {
+ this._contextualizeCallback(context, keys[i], context);
+ }
+ }
+ };
+
+ _default.prototype._contextualizeCallback = function _contextualizeCallback(context, key, callbackContext) {
+ var _this = this;
+ var callbacks = this.callbacks;
+ var factory = context.factory;
+
+ context[key] = function (options) {
+ if (_this.cachedCalls[key]) {
+ return _this.cache[key];
+ }
+
+ var result = callbacks[key].call(callbackContext, options, factory());
+
+ _this.cache[key] = result;
+ _this.cachedCalls[key] = true;
+
+ return result;
+ };
+ };
+
+ _default.prototype._aliasViewRegistry = function _aliasViewRegistry() {
+ this._originalGlobalViewRegistry = _ember['default'].View.views;
+ var viewRegistry = this.container.lookup('-view-registry:main');
+
+ if (viewRegistry) {
+ _ember['default'].View.views = viewRegistry;
+ }
+ };
+
+ _default.prototype._resetViewRegistry = function _resetViewRegistry() {
+ _ember['default'].View.views = this._originalGlobalViewRegistry;
+ };
+
+ return _default;
+ })(_abstractTestModule['default']);
+
+ exports['default'] = _default;
});
-define('ember-test-helpers/test-module-for-model', ['exports', 'ember-test-helpers/test-module', 'ember'], function (exports, TestModule, Ember) {
+define('ember-test-helpers/test-module-for-model', ['exports', './test-module', 'ember'], function (exports, _testModule, _ember) {
+ /* global DS, require, requirejs */ // added here to prevent an import from erroring when ED is not present
'use strict';
- exports['default'] = TestModule['default'].extend({
- init: function(modelName, description, callbacks) {
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+ var _default = (function (_TestModule) {
+ _inherits(_default, _TestModule);
+
+ function _default(modelName, description, callbacks) {
+ _classCallCheck(this, _default);
+
+ _TestModule.call(this, 'model:' + modelName, description, callbacks);
+
this.modelName = modelName;
- this._super.call(this, 'model:' + modelName, description, callbacks);
-
this.setupSteps.push(this.setupModel);
- },
+ }
- setupModel: function() {
+ _default.prototype.setupModel = function setupModel() {
var container = this.container;
var defaultSubject = this.defaultSubject;
var callbacks = this.callbacks;
@@ -713,38 +1316,57 @@ define('ember-test-helpers/test-module-for-model', ['exports', 'ember-test-helpe
var adapterFactory = container.lookupFactory('adapter:application');
if (!adapterFactory) {
- adapterFactory = DS.JSONAPIAdapter || DS.FixtureAdapter;
+ if (requirejs.entries['ember-data/adapters/json-api']) {
+ adapterFactory = require('ember-data/adapters/json-api')['default'];
+ }
+
+ // when ember-data/adapters/json-api is provided via ember-cli shims
+ // using Ember Data 1.x the actual JSONAPIAdapter isn't found, but the
+ // above require statement returns a bizzaro object with only a `default`
+ // property (circular reference actually)
+ if (!adapterFactory || !adapterFactory.create) {
+ adapterFactory = DS.JSONAPIAdapter || DS.FixtureAdapter;
+ }
var thingToRegisterWith = this.registry || this.container;
thingToRegisterWith.register('adapter:application', adapterFactory);
}
- callbacks.store = function(){
+ callbacks.store = function () {
var container = this.container;
- var store = container.lookup('service:store') || container.lookup('store:main');
- return store;
+ return container.lookup('service:store') || container.lookup('store:main');
};
if (callbacks.subject === defaultSubject) {
- callbacks.subject = function(options) {
+ callbacks.subject = function (options) {
var container = this.container;
- return Ember['default'].run(function() {
+ return _ember['default'].run(function () {
var store = container.lookup('service:store') || container.lookup('store:main');
return store.createRecord(modelName, options);
});
};
}
- }
- });
+ };
+ return _default;
+ })(_testModule['default']);
+
+ exports['default'] = _default;
});
-define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helpers/test-context', 'klassy', 'ember-test-helpers/test-resolver', 'ember-test-helpers/build-registry', 'ember-test-helpers/has-ember-version', 'ember-test-helpers/wait'], function (exports, Ember, test_context, klassy, test_resolver, buildRegistry, hasEmberVersion, wait) {
-
+define('ember-test-helpers/test-module', ['exports', 'ember', './abstract-test-module', './test-resolver', './build-registry', './has-ember-version'], function (exports, _ember, _abstractTestModule, _testResolver, _buildRegistry, _hasEmberVersion) {
'use strict';
- exports['default'] = klassy.Klass.extend({
- init: function(subjectName, description, callbacks) {
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
+
+ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+ var _default = (function (_AbstractTestModule) {
+ _inherits(_default, _AbstractTestModule);
+
+ function _default(subjectName, description, callbacks) {
+ _classCallCheck(this, _default);
+
// Allow `description` to be omitted, in which case it should
// default to `subjectName`
if (!callbacks && typeof description === 'object') {
@@ -752,53 +1374,50 @@ define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helper
description = subjectName;
}
+ _AbstractTestModule.call(this, description || subjectName, callbacks);
+
this.subjectName = subjectName;
this.description = description || subjectName;
- this.name = description || subjectName;
- this.callbacks = callbacks || {};
+ this.resolver = this.callbacks.resolver || _testResolver.getResolver();
if (this.callbacks.integration && this.callbacks.needs) {
throw new Error("cannot declare 'integration: true' and 'needs' in the same module");
}
if (this.callbacks.integration) {
- if (this.isComponentTestModule) {
- this.isLegacy = (callbacks.integration === 'legacy');
- this.isIntegration = (callbacks.integration !== 'legacy');
- } else {
- if (callbacks.integration === 'legacy') {
- throw new Error('`integration: \'legacy\'` is only valid for component tests.');
- }
- this.isIntegration = true;
- }
-
+ this.initIntegration(callbacks);
delete callbacks.integration;
}
this.initSubject();
this.initNeeds();
- this.initSetupSteps();
- this.initTeardownSteps();
- },
+ }
- initSubject: function() {
+ _default.prototype.initIntegration = function initIntegration(options) {
+ if (options.integration === 'legacy') {
+ throw new Error('`integration: \'legacy\'` is only valid for component tests.');
+ }
+ this.isIntegration = true;
+ };
+
+ _default.prototype.initSubject = function initSubject() {
this.callbacks.subject = this.callbacks.subject || this.defaultSubject;
- },
+ };
- initNeeds: function() {
+ _default.prototype.initNeeds = function initNeeds() {
this.needs = [this.subjectName];
if (this.callbacks.needs) {
this.needs = this.needs.concat(this.callbacks.needs);
delete this.callbacks.needs;
}
- },
+ };
- initSetupSteps: function() {
+ _default.prototype.initSetupSteps = function initSetupSteps() {
this.setupSteps = [];
this.contextualizedSetupSteps = [];
if (this.callbacks.beforeSetup) {
- this.setupSteps.push( this.callbacks.beforeSetup );
+ this.setupSteps.push(this.callbacks.beforeSetup);
delete this.callbacks.beforeSetup;
}
@@ -808,17 +1427,17 @@ define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helper
this.setupSteps.push(this.setupAJAXListeners);
if (this.callbacks.setup) {
- this.contextualizedSetupSteps.push( this.callbacks.setup );
+ this.contextualizedSetupSteps.push(this.callbacks.setup);
delete this.callbacks.setup;
}
- },
+ };
- initTeardownSteps: function() {
+ _default.prototype.initTeardownSteps = function initTeardownSteps() {
this.teardownSteps = [];
this.contextualizedTeardownSteps = [];
if (this.callbacks.teardown) {
- this.contextualizedTeardownSteps.push( this.callbacks.teardown );
+ this.contextualizedTeardownSteps.push(this.callbacks.teardown);
delete this.callbacks.teardown;
}
@@ -829,203 +1448,176 @@ define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helper
this.teardownSteps.push(this.teardownAJAXListeners);
if (this.callbacks.afterTeardown) {
- this.teardownSteps.push( this.callbacks.afterTeardown );
+ this.teardownSteps.push(this.callbacks.afterTeardown);
delete this.callbacks.afterTeardown;
}
- },
+ };
- setup: function() {
- var self = this;
- return self.invokeSteps(self.setupSteps).then(function() {
- self.contextualizeCallbacks();
- return self.invokeSteps(self.contextualizedSetupSteps, self.context);
- });
- },
-
- teardown: function() {
- var self = this;
- return self.invokeSteps(self.contextualizedTeardownSteps, self.context).then(function() {
- return self.invokeSteps(self.teardownSteps);
- }).then(function() {
- self.cache = null;
- self.cachedCalls = null;
- });
- },
-
- invokeSteps: function(steps, _context) {
- var context = _context;
- if (!context) {
- context = this;
- }
- steps = steps.slice();
- function nextStep() {
- var step = steps.shift();
- if (step) {
- // guard against exceptions, for example missing components referenced from needs.
- return new Ember['default'].RSVP.Promise(function(ok) {
- ok(step.call(context));
- }).then(nextStep);
- } else {
- return Ember['default'].RSVP.resolve();
- }
- }
- return nextStep();
- },
-
- setupContainer: function() {
+ _default.prototype.setupContainer = function setupContainer() {
if (this.isIntegration || this.isLegacy) {
this._setupIntegratedContainer();
} else {
this._setupIsolatedContainer();
}
- },
+ };
- setupContext: function() {
+ _default.prototype.setupContext = function setupContext() {
var subjectName = this.subjectName;
var container = this.container;
- var factory = function() {
+ var factory = function factory() {
return container.lookupFactory(subjectName);
};
- test_context.setContext({
- container: this.container,
+ _AbstractTestModule.prototype.setupContext.call(this, {
+ container: this.container,
registry: this.registry,
- factory: factory,
- dispatcher: null,
- register: function() {
+ factory: factory,
+ register: function register() {
var target = this.registry || this.container;
return target.register.apply(target, arguments);
- },
- inject: {}
+ }
});
- var context = this.context = test_context.getContext();
-
- if (Ember['default'].setOwner) {
- Ember['default'].setOwner(context, this.container.owner);
+ if (_ember['default'].setOwner) {
+ _ember['default'].setOwner(this.context, this.container.owner);
}
- if (Ember['default'].inject) {
- var keys = (Object.keys || Ember['default'].keys)(Ember['default'].inject);
- keys.forEach(function(typeName) {
- context.inject[typeName] = function(name, opts) {
- var alias = (opts && opts.as) || name;
- Ember['default'].set(context, alias, context.container.lookup(typeName + ':' + name));
+ this.setupInject();
+ };
+
+ _default.prototype.setupInject = function setupInject() {
+ var module = this;
+ var context = this.context;
+
+ if (_ember['default'].inject) {
+ var keys = (Object.keys || _ember['default'].keys)(_ember['default'].inject);
+
+ keys.forEach(function (typeName) {
+ context.inject[typeName] = function (name, opts) {
+ var alias = opts && opts.as || name;
+ _ember['default'].run(function () {
+ _ember['default'].set(context, alias, module.container.lookup(typeName + ':' + name));
+ });
};
});
}
- },
+ };
- setupTestElements: function() {
- if (Ember['default'].$('#ember-testing').length === 0) {
- Ember['default'].$('').appendTo(document.body);
- }
- },
-
- setupAJAXListeners: function() {
- wait._setupAJAXHooks();
- },
-
- teardownSubject: function() {
+ _default.prototype.teardownSubject = function teardownSubject() {
var subject = this.cache.subject;
if (subject) {
- Ember['default'].run(function() {
- Ember['default'].tryInvoke(subject, 'destroy');
+ _ember['default'].run(function () {
+ _ember['default'].tryInvoke(subject, 'destroy');
});
}
- },
+ };
- teardownContainer: function() {
+ _default.prototype.teardownContainer = function teardownContainer() {
var container = this.container;
- Ember['default'].run(function() {
+ _ember['default'].run(function () {
container.destroy();
});
- },
+ };
- teardownContext: function() {
- var context = this.context;
- this.context = undefined;
- test_context.unsetContext();
-
- if (context.dispatcher && !context.dispatcher.isDestroyed) {
- Ember['default'].run(function() {
- context.dispatcher.destroy();
- });
- }
- },
-
- teardownTestElements: function() {
- Ember['default'].$('#ember-testing').empty();
-
- // Ember 2.0.0 removed Ember.View as public API, so only do this when
- // Ember.View is present
- if (Ember['default'].View && Ember['default'].View.views) {
- Ember['default'].View.views = {};
- }
- },
-
- teardownAJAXListeners: function() {
- wait._teardownAJAXHooks();
- },
-
- defaultSubject: function(options, factory) {
+ _default.prototype.defaultSubject = function defaultSubject(options, factory) {
return factory.create(options);
- },
+ };
// allow arbitrary named factories, like rspec let
- contextualizeCallbacks: function() {
- var _this = this;
+
+ _default.prototype.contextualizeCallbacks = function contextualizeCallbacks() {
var callbacks = this.callbacks;
- var context = this.context;
- var factory = context.factory;
+ var context = this.context;
this.cache = this.cache || {};
this.cachedCalls = this.cachedCalls || {};
- var keys = (Object.keys || Ember['default'].keys)(callbacks);
+ var keys = (Object.keys || _ember['default'].keys)(callbacks);
+ var keysLength = keys.length;
- for (var i = 0, l = keys.length; i < l; i++) {
- (function(key) {
-
- context[key] = function(options) {
- if (_this.cachedCalls[key]) { return _this.cache[key]; }
-
- var result = callbacks[key].call(_this, options, factory());
-
- _this.cache[key] = result;
- _this.cachedCalls[key] = true;
-
- return result;
- };
-
- })(keys[i]);
+ if (keysLength) {
+ var deprecatedContext = this._buildDeprecatedContext(this, context);
+ for (var i = 0; i < keysLength; i++) {
+ this._contextualizeCallback(context, keys[i], deprecatedContext);
+ }
}
- },
+ };
- _setupContainer: function(isolated) {
- var resolver = test_resolver.getResolver();
+ _default.prototype._contextualizeCallback = function _contextualizeCallback(context, key, callbackContext) {
+ var _this = this;
+ var callbacks = this.callbacks;
+ var factory = context.factory;
- var items = buildRegistry['default'](!isolated ? resolver : Object.create(resolver, {
+ context[key] = function (options) {
+ if (_this.cachedCalls[key]) {
+ return _this.cache[key];
+ }
+
+ var result = callbacks[key].call(callbackContext, options, factory());
+
+ _this.cache[key] = result;
+ _this.cachedCalls[key] = true;
+
+ return result;
+ };
+ };
+
+ /*
+ Builds a version of the passed in context that contains deprecation warnings
+ for accessing properties that exist on the module.
+ */
+
+ _default.prototype._buildDeprecatedContext = function _buildDeprecatedContext(module, context) {
+ var deprecatedContext = Object.create(context);
+
+ var keysForDeprecation = Object.keys(module);
+
+ for (var i = 0, l = keysForDeprecation.length; i < l; i++) {
+ this._proxyDeprecation(module, deprecatedContext, keysForDeprecation[i]);
+ }
+
+ return deprecatedContext;
+ };
+
+ /*
+ Defines a key on an object to act as a proxy for deprecating the original.
+ */
+
+ _default.prototype._proxyDeprecation = function _proxyDeprecation(obj, proxy, key) {
+ if (typeof proxy[key] === 'undefined') {
+ Object.defineProperty(proxy, key, {
+ get: function get() {
+ _ember['default'].deprecate('Accessing the test module property "' + key + '" from a callback is deprecated.', false, { id: 'ember-test-helpers.test-module.callback-context', until: '0.6.0' });
+ return obj[key];
+ }
+ });
+ }
+ };
+
+ _default.prototype._setupContainer = function _setupContainer(isolated) {
+ var resolver = this.resolver;
+
+ var items = _buildRegistry['default'](!isolated ? resolver : Object.create(resolver, {
resolve: {
- value: function() {}
+ value: function value() {}
}
}));
this.container = items.container;
this.registry = items.registry;
- if (hasEmberVersion['default'](1, 13)) {
+ if (_hasEmberVersion['default'](1, 13)) {
var thingToRegisterWith = this.registry || this.container;
var router = resolver.resolve('router:main');
- router = router || Ember['default'].Router.extend();
+ router = router || _ember['default'].Router.extend();
thingToRegisterWith.register('router:main', router);
}
- },
+ };
- _setupIsolatedContainer: function() {
- var resolver = test_resolver.getResolver();
+ _default.prototype._setupIsolatedContainer = function _setupIsolatedContainer() {
+ var resolver = this.resolver;
this._setupContainer(true);
var thingToRegisterWith = this.registry || this.container;
@@ -1037,24 +1629,24 @@ define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helper
}
if (!this.registry) {
- this.container.resolver = function() {};
+ this.container.resolver = function () {};
}
- },
+ };
- _setupIntegratedContainer: function() {
+ _default.prototype._setupIntegratedContainer = function _setupIntegratedContainer() {
this._setupContainer();
- }
+ };
- });
+ return _default;
+ })(_abstractTestModule['default']);
+ exports['default'] = _default;
});
define('ember-test-helpers/test-resolver', ['exports'], function (exports) {
-
'use strict';
exports.setResolver = setResolver;
exports.getResolver = getResolver;
-
var __resolver__;
function setResolver(resolver) {
@@ -1062,17 +1654,23 @@ define('ember-test-helpers/test-resolver', ['exports'], function (exports) {
}
function getResolver() {
- if (__resolver__ == null) throw new Error('you must set a resolver with `testResolver.set(resolver)`');
+ if (__resolver__ == null) {
+ throw new Error('you must set a resolver with `testResolver.set(resolver)`');
+ }
+
return __resolver__;
}
-
});
-define('ember-test-helpers/wait', ['exports', 'ember'], function (exports, Ember) {
+define('ember-test-helpers/wait', ['exports', 'ember'], function (exports, _ember) {
+ /* globals self */
'use strict';
exports._teardownAJAXHooks = _teardownAJAXHooks;
exports._setupAJAXHooks = _setupAJAXHooks;
+ exports['default'] = wait;
+
+ var jQuery = _ember['default'].$;
var requests;
function incrementAjaxPendingRequests(_, xhr) {
@@ -1080,7 +1678,7 @@ define('ember-test-helpers/wait', ['exports', 'ember'], function (exports, Ember
}
function decrementAjaxPendingRequests(_, xhr) {
- for (var i = 0;i < requests.length;i++) {
+ for (var i = 0; i < requests.length; i++) {
if (xhr === requests[i]) {
requests.splice(i, 1);
}
@@ -1088,6 +1686,10 @@ define('ember-test-helpers/wait', ['exports', 'ember'], function (exports, Ember
}
function _teardownAJAXHooks() {
+ if (!jQuery) {
+ return;
+ }
+
jQuery(document).off('ajaxSend', incrementAjaxPendingRequests);
jQuery(document).off('ajaxComplete', decrementAjaxPendingRequests);
}
@@ -1095,18 +1697,44 @@ define('ember-test-helpers/wait', ['exports', 'ember'], function (exports, Ember
function _setupAJAXHooks() {
requests = [];
+ if (!jQuery) {
+ return;
+ }
+
jQuery(document).on('ajaxSend', incrementAjaxPendingRequests);
jQuery(document).on('ajaxComplete', decrementAjaxPendingRequests);
}
+ var _internalCheckWaiters;
+ if (_ember['default'].__loader.registry['ember-testing/test/waiters']) {
+ _internalCheckWaiters = _ember['default'].__loader.require('ember-testing/test/waiters').checkWaiters;
+ }
+
+ function checkWaiters() {
+ if (_internalCheckWaiters) {
+ return _internalCheckWaiters();
+ } else if (_ember['default'].Test.waiters) {
+ if (_ember['default'].Test.waiters.any(function (_ref) {
+ var context = _ref[0];
+ var callback = _ref[1];
+ return !callback.call(context);
+ })) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
function wait(_options) {
var options = _options || {};
var waitForTimers = options.hasOwnProperty('waitForTimers') ? options.waitForTimers : true;
var waitForAJAX = options.hasOwnProperty('waitForAJAX') ? options.waitForAJAX : true;
+ var waitForWaiters = options.hasOwnProperty('waitForWaiters') ? options.waitForWaiters : true;
- return new Ember['default'].RSVP.Promise(function(resolve) {
- var watcher = self.setInterval(function() {
- if (waitForTimers && (Ember['default'].run.hasScheduledTimers() || Ember['default'].run.currentRunLoop)) {
+ return new _ember['default'].RSVP.Promise(function (resolve) {
+ var watcher = self.setInterval(function () {
+ if (waitForTimers && (_ember['default'].run.hasScheduledTimers() || _ember['default'].run.currentRunLoop)) {
return;
}
@@ -1114,188 +1742,34 @@ define('ember-test-helpers/wait', ['exports', 'ember'], function (exports, Ember
return;
}
+ if (waitForWaiters && checkWaiters()) {
+ return;
+ }
+
// Stop polling
self.clearInterval(watcher);
// Synchronously resolve the promise
- Ember['default'].run(null, resolve);
+ _ember['default'].run(null, resolve);
}, 10);
});
}
- exports['default'] = wait;
-
});
-define('klassy', ['exports'], function (exports) {
+define("qunit", ["exports"], function (exports) {
+ /* globals QUnit */
- 'use strict';
+ "use strict";
- /**
- Extend a class with the properties and methods of one or more other classes.
-
- When a method is replaced with another method, it will be wrapped in a
- function that makes the replaced method accessible via `this._super`.
-
- @method extendClass
- @param {Object} destination The class to merge into
- @param {Object} source One or more source classes
- */
- var extendClass = function(destination) {
- var sources = Array.prototype.slice.call(arguments, 1);
- var source;
-
- for (var i = 0, l = sources.length; i < l; i++) {
- source = sources[i];
-
- for (var p in source) {
- if (source.hasOwnProperty(p) &&
- destination[p] &&
- typeof destination[p] === 'function' &&
- typeof source[p] === 'function') {
-
- /* jshint loopfunc:true */
- destination[p] =
- (function(destinationFn, sourceFn) {
- var wrapper = function() {
- var prevSuper = this._super;
- this._super = destinationFn;
-
- var ret = sourceFn.apply(this, arguments);
-
- this._super = prevSuper;
-
- return ret;
- };
- wrapper.wrappedFunction = sourceFn;
- return wrapper;
- })(destination[p], source[p]);
-
- } else {
- destination[p] = source[p];
- }
- }
- }
- };
-
- // `subclassing` is a state flag used by `defineClass` to track when a class is
- // being subclassed. It allows constructors to avoid calling `init`, which can
- // be expensive and cause undesirable side effects.
- var subclassing = false;
-
- /**
- Define a new class with the properties and methods of one or more other classes.
-
- The new class can be based on a `SuperClass`, which will be inserted into its
- prototype chain.
-
- Furthermore, one or more mixins (object that contain properties and/or methods)
- may be specified, which will be applied in order. When a method is replaced
- with another method, it will be wrapped in a function that makes the previous
- method accessible via `this._super`.
-
- @method defineClass
- @param {Object} SuperClass A base class to extend. If `mixins` are to be included
- without a `SuperClass`, pass `null` for SuperClass.
- @param {Object} mixins One or more objects that contain properties and methods
- to apply to the new class.
- */
- var defineClass = function(SuperClass) {
- var Klass = function() {
- if (!subclassing && this.init) {
- this.init.apply(this, arguments);
- }
- };
-
- if (SuperClass) {
- subclassing = true;
- Klass.prototype = new SuperClass();
- subclassing = false;
- }
-
- if (arguments.length > 1) {
- var extendArgs = Array.prototype.slice.call(arguments, 1);
- extendArgs.unshift(Klass.prototype);
- extendClass.apply(Klass.prototype, extendArgs);
- }
-
- Klass.constructor = Klass;
-
- Klass.extend = function() {
- var args = Array.prototype.slice.call(arguments, 0);
- args.unshift(Klass);
- return defineClass.apply(Klass, args);
- };
-
- return Klass;
- };
-
- /**
- A base class that can be extended.
-
- @example
-
- ```javascript
- var CelestialObject = Klass.extend({
- init: function(name) {
- this._super();
- this.name = name;
- this.isCelestialObject = true;
- },
- greeting: function() {
- return 'Hello from ' + this.name;
- }
- });
-
- var Planet = CelestialObject.extend({
- init: function(name) {
- this._super.apply(this, arguments);
- this.isPlanet = true;
- },
- greeting: function() {
- return this._super() + '!';
- },
- });
-
- var earth = new Planet('Earth');
-
- console.log(earth instanceof Klass); // true
- console.log(earth instanceof CelestialObject); // true
- console.log(earth instanceof Planet); // true
-
- console.log(earth.isCelestialObject); // true
- console.log(earth.isPlanet); // true
-
- console.log(earth.greeting()); // 'Hello from Earth!'
- ```
-
- @class Klass
- */
- var Klass = defineClass(null, {
- init: function() {}
- });
-
- exports.Klass = Klass;
- exports.defineClass = defineClass;
- exports.extendClass = extendClass;
-
-});
-define('qunit', ['exports'], function (exports) {
-
- 'use strict';
-
- /* globals test:true */
-
- var module = QUnit.module;
- var test = QUnit.test;
- var skip = QUnit.skip;
- var only = QUnit.only;
-
- exports['default'] = QUnit;
-
- exports.module = module;
- exports.test = test;
- exports.skip = skip;
- exports.only = only;
+ var _module = QUnit.module;
+ exports.module = _module;
+ var test = QUnit.test;
+ exports.test = test;
+ var skip = QUnit.skip;
+ exports.skip = skip;
+ var only = QUnit.only;
+ exports.only = only;
+ exports["default"] = QUnit;
});
define("ember", ["exports"], function(__exports__) {
__exports__["default"] = window.Ember;
| | | | |