From 55611a5b801b37189350cfffbd2b967db4374148 Mon Sep 17 00:00:00 2001 From: Discourse Translator Bot Date: Tue, 18 May 2021 16:49:18 +0200 Subject: [PATCH 001/689] Update translations (#13089) --- config/locales/client.ar.yml | 92 ++++++++++++ config/locales/client.be.yml | 113 ++++++++++++++ config/locales/client.bg.yml | 107 +++++++++++++ config/locales/client.bs_BA.yml | 109 ++++++++++++++ config/locales/client.ca.yml | 111 ++++++++++++++ config/locales/client.cs.yml | 114 ++++++++++++++ config/locales/client.da.yml | 3 + config/locales/client.el.yml | 96 ++++++++++++ config/locales/client.et.yml | 88 +++++++++++ config/locales/client.fa_IR.yml | 42 ++++++ config/locales/client.gl.yml | 14 ++ config/locales/client.hu.yml | 89 +++++++++++ config/locales/client.hy.yml | 118 +++++++++++++++ config/locales/client.id.yml | 110 ++++++++++++++ config/locales/client.it.yml | 1 + config/locales/client.ja.yml | 89 +++++++++++ config/locales/client.ko.yml | 1 + config/locales/client.lt.yml | 117 +++++++++++++++ config/locales/client.lv.yml | 114 ++++++++++++++ config/locales/client.nb_NO.yml | 107 +++++++++++++ config/locales/client.pt.yml | 68 +++++++++ config/locales/client.pt_BR.yml | 58 +++++++ config/locales/client.ro.yml | 94 ++++++++++++ config/locales/client.sk.yml | 120 +++++++++++++++ config/locales/client.sl.yml | 55 +++++++ config/locales/client.sq.yml | 104 +++++++++++++ config/locales/client.sr.yml | 111 ++++++++++++++ config/locales/client.sw.yml | 108 ++++++++++++++ config/locales/client.te.yml | 83 +++++++++++ config/locales/client.th.yml | 118 +++++++++++++++ config/locales/client.tr_TR.yml | 57 +++++++ config/locales/client.uk.yml | 1 + config/locales/client.ur.yml | 113 ++++++++++++++ config/locales/client.vi.yml | 93 ++++++++++++ config/locales/client.zh_TW.yml | 141 ++++++++++++++++++ config/locales/server.ar.yml | 91 +++++++++++ config/locales/server.be.yml | 77 ++++++++++ config/locales/server.bg.yml | 23 +++ config/locales/server.bs_BA.yml | 87 +++++++++++ config/locales/server.ca.yml | 58 +++++++ config/locales/server.cs.yml | 48 ++++++ config/locales/server.da.yml | 10 ++ config/locales/server.de.yml | 6 +- config/locales/server.el.yml | 91 +++++++++++ config/locales/server.es.yml | 2 + config/locales/server.et.yml | 37 +++++ config/locales/server.fa_IR.yml | 35 +++++ config/locales/server.fi.yml | 37 +++++ config/locales/server.gl.yml | 2 + config/locales/server.hu.yml | 41 +++++ config/locales/server.hy.yml | 50 +++++++ config/locales/server.id.yml | 50 +++++++ config/locales/server.it.yml | 25 ++++ config/locales/server.ja.yml | 48 ++++++ config/locales/server.ko.yml | 1 + config/locales/server.lt.yml | 39 +++++ config/locales/server.lv.yml | 76 ++++++++++ config/locales/server.nb_NO.yml | 27 ++++ config/locales/server.nl.yml | 87 +++++++++++ config/locales/server.pl_PL.yml | 1 + config/locales/server.pt.yml | 46 ++++++ config/locales/server.pt_BR.yml | 52 +++++++ config/locales/server.ro.yml | 62 ++++++++ config/locales/server.sk.yml | 35 +++++ config/locales/server.sl.yml | 55 +++++++ config/locales/server.sq.yml | 28 ++++ config/locales/server.sr.yml | 128 ++++++++++++++++ config/locales/server.sw.yml | 82 ++++++++++ config/locales/server.te.yml | 14 ++ config/locales/server.th.yml | 65 ++++++++ config/locales/server.tr_TR.yml | 52 +++++++ config/locales/server.uk.yml | 33 ++++ config/locales/server.ur.yml | 54 +++++++ config/locales/server.vi.yml | 61 ++++++++ config/locales/server.zh_TW.yml | 56 +++++++ .../config/locales/client.cs.yml | 1 + .../config/locales/client.et.yml | 1 + .../config/locales/server.ar.yml | 3 + .../config/locales/server.ca.yml | 3 + .../config/locales/server.fa_IR.yml | 4 + .../config/locales/server.hy.yml | 3 + .../config/locales/server.id.yml | 2 + .../config/locales/server.ja.yml | 2 + .../config/locales/server.lt.yml | 2 + .../config/locales/server.lv.yml | 2 + .../config/locales/server.nb_NO.yml | 3 + .../config/locales/server.pt.yml | 1 + .../config/locales/server.pt_BR.yml | 3 + .../config/locales/server.ro.yml | 2 + .../config/locales/server.sw.yml | 3 + .../config/locales/server.th.yml | 2 + .../config/locales/server.tr_TR.yml | 3 + .../config/locales/server.uk.yml | 2 + .../config/locales/server.ur.yml | 3 + .../config/locales/server.vi.yml | 1 + .../config/locales/server.zh_TW.yml | 2 + .../config/locales/client.bs_BA.yml | 8 + .../config/locales/client.ca.yml | 6 + .../config/locales/client.cs.yml | 17 +++ .../config/locales/client.el.yml | 6 + .../config/locales/client.et.yml | 11 ++ .../config/locales/client.hy.yml | 6 + .../config/locales/client.id.yml | 4 + .../config/locales/client.lt.yml | 17 +++ .../config/locales/client.nb_NO.yml | 6 + .../config/locales/client.pt_BR.yml | 6 + .../config/locales/client.ro.yml | 8 + .../config/locales/client.sk.yml | 10 ++ .../config/locales/client.sr.yml | 14 ++ .../config/locales/client.sw.yml | 11 ++ .../config/locales/client.ur.yml | 6 + plugins/poll/config/locales/client.ar.yml | 1 + plugins/poll/config/locales/client.be.yml | 2 + plugins/poll/config/locales/client.bg.yml | 2 + plugins/poll/config/locales/client.bs_BA.yml | 1 + plugins/poll/config/locales/client.ca.yml | 3 + plugins/poll/config/locales/client.da.yml | 2 + plugins/poll/config/locales/client.el.yml | 1 + plugins/poll/config/locales/client.et.yml | 2 + plugins/poll/config/locales/client.fa_IR.yml | 1 + plugins/poll/config/locales/client.gl.yml | 3 + plugins/poll/config/locales/client.hu.yml | 2 + plugins/poll/config/locales/client.hy.yml | 2 + plugins/poll/config/locales/client.id.yml | 2 + plugins/poll/config/locales/client.ja.yml | 1 + plugins/poll/config/locales/client.lt.yml | 2 + plugins/poll/config/locales/client.lv.yml | 2 + plugins/poll/config/locales/client.nb_NO.yml | 2 + plugins/poll/config/locales/client.pt.yml | 3 + plugins/poll/config/locales/client.pt_BR.yml | 2 + plugins/poll/config/locales/client.ro.yml | 2 + plugins/poll/config/locales/client.sl.yml | 2 + plugins/poll/config/locales/client.sr.yml | 1 + plugins/poll/config/locales/client.tr_TR.yml | 1 + plugins/poll/config/locales/client.uk.yml | 3 + plugins/poll/config/locales/client.ur.yml | 2 + plugins/poll/config/locales/client.vi.yml | 2 + plugins/poll/config/locales/client.zh_TW.yml | 2 + .../styleguide/config/locales/client.be.yml | 19 +++ .../styleguide/config/locales/client.bg.yml | 17 +++ .../config/locales/client.bs_BA.yml | 17 +++ .../styleguide/config/locales/client.ca.yml | 21 +++ .../styleguide/config/locales/client.cs.yml | 21 +++ .../styleguide/config/locales/client.el.yml | 21 +++ .../config/locales/client.en_GB.yml | 5 + .../styleguide/config/locales/client.et.yml | 21 +++ .../styleguide/config/locales/client.hy.yml | 21 +++ .../styleguide/config/locales/client.id.yml | 9 ++ .../styleguide/config/locales/client.lt.yml | 19 +++ .../styleguide/config/locales/client.lv.yml | 13 ++ .../config/locales/client.nb_NO.yml | 21 +++ .../styleguide/config/locales/client.pt.yml | 14 ++ .../config/locales/client.pt_BR.yml | 14 ++ .../styleguide/config/locales/client.sk.yml | 17 +++ .../styleguide/config/locales/client.sl.yml | 17 +++ .../styleguide/config/locales/client.sq.yml | 15 ++ .../styleguide/config/locales/client.sr.yml | 13 ++ .../styleguide/config/locales/client.sw.yml | 21 +++ .../styleguide/config/locales/client.te.yml | 13 ++ .../styleguide/config/locales/client.th.yml | 15 ++ .../styleguide/config/locales/client.ur.yml | 21 +++ .../styleguide/config/locales/client.vi.yml | 12 ++ .../config/locales/client.zh_TW.yml | 21 +++ 163 files changed, 5481 insertions(+), 3 deletions(-) diff --git a/config/locales/client.ar.yml b/config/locales/client.ar.yml index 9a6bcac212bda..ce46d3d6532a9 100644 --- a/config/locales/client.ar.yml +++ b/config/locales/client.ar.yml @@ -246,6 +246,8 @@ ar: topic_admin_menu: "الإجراءات على الموضوع" wizard_required: "مرحبًا بك في دِسكورس! هيا بنا نبدأ من مُرشد الإعداد ✨" emails_are_disabled: "عطّل أحد المدراء البريد الصادر على عموم الموقع. لن تُرسل أيّة إخطارات بريد أيًا كان نوعها." + software_update_prompt: + dismiss: "تجاهل" bootstrap_mode_enabled: zero: "ضُبط الموقع على الوضع التمهيدي لتسهيل إطلاق موقعك الجديد. سيُمنح كلّ المستخدمين الجدد مستوى الثقة 1 كما وستُفعّل لهم رسائل الخُلاصة عبر البريد تلقائيًا. سيُلغى هذا الوضع تلقائيًا ما إن لا ينضمّ أيّ مستخدم." one: "ضُبط الموقع على الوضع التمهيدي لتسهيل إطلاق موقعك الجديد. سيُمنح كلّ المستخدمين الجدد مستوى الثقة 1 كما وستُفعّل لهم رسائل الخُلاصة عبر البريد تلقائيًا. سيُلغى هذا الوضع تلقائيًا ما إن ينضمّ مستخدم واحد." @@ -520,6 +522,7 @@ ar: email: "البريد الإلكتروني" name: "الاسم" fields: "الحقول" + reject_reason: "سبب" user_percentage: agreed: zero: "%{count}% مُوافق عليها" @@ -583,6 +586,7 @@ ar: created_at_asc: "تاريخ الإنشاء (بالعكس)" priority: title: "الحد الأدنى من الأولوية" + any: "(أي)" low: "منخفض" medium: "متوسّطة" high: "عالية" @@ -621,6 +625,8 @@ ar: title: "في قائمة الانتظار" reviewable_user: title: "المستخدم" + reviewable_post: + title: "مشاركة" approval: title: "المنشور يحتاج موافقة" description: "استلمنا مشاركتك ولكن يجب على أحد المشرفين الموافقة عليها قبل ظهورها. نرجو منك الصبر." @@ -633,6 +639,25 @@ ar: other: "%{count} مشاركة تنتظر الموافقة منك." ok: "حسنًا" example_username: "اسم المستخدم" + relative_time_picker: + days: + zero: "أيام" + one: "يوم" + two: "أيام" + few: "أيام" + many: "أيام" + other: "أيام" + time_shortcut: + later_today: "خلال هذا اليوم" + next_business_day: "يوم العمل التالي" + tomorrow: "غدًا" + next_week: "الأسبوع القادم" + post_local_date: "تاريخ المشاركة" + later_this_week: "خلال هذا الأسبوع" + start_of_next_business_week: "الاثنين" + start_of_next_business_week_alt: "الاثنين القادم" + next_month: "الشهر القادم" + custom: "تاريخ ووقت مخصّصين" user_action: user_posted_topic: "نشر %{user}الموضوع" you_posted_topic: "نشرتالموضوع" @@ -723,6 +748,8 @@ ar: imap_ssl: "استعمل SSL لِ‍ IMAP" username: "اسم المستخدم" password: "كلمة السر" + settings: + title: "إعدادات" mailboxes: synchronized: "صندوق البريد المتزامن" none_found: "لم توجد صناديق بريد في حساب البريد الإلكتروني هذا." @@ -910,6 +937,9 @@ ar: few: "%{count} مواضيع" many: "%{count} موضوعًا" other: "%{count} موضوع" + topic_stat_unit: + week: "أسبوع" + month: "شهر" topic_stat_sentence_week: zero: "ما من مواضيع جديدة خلال الأسبوع الماضي." one: "فُتح موضوع واحد جديد خلال الأسبوع الماضي." @@ -978,7 +1008,12 @@ ar: mute_option_title: "لن تتلقى أي إشعارات ذات صلة بهذا المستخدم." normal_option: "عادي" normal_option_title: "سنُرسل إليك إخطارًا إن ردّ هذا المستخدم عليك أو اقتبس كلامك أو أشار إليك." + notification_schedule: + none: "لا شيء" + monday: "الاثنين" + to: "إلى" activity_stream: "النشاط" + read: "المقروءة" preferences: "التفضيلات" feature_topic_on_profile: open_search: "اختر موضوعًا جديدًا" @@ -1125,6 +1160,7 @@ ar: tags: "الوسوم" preferences_nav: account: "الحساب" + security: "الأمن" profile: "الملف الشخصي" emails: "البريد الإلكتروني" notifications: "التنبيهات" @@ -1411,6 +1447,12 @@ ar: pending_tab_with_count: "معلق (%{count})" redeemed_tab: "محررة" redeemed_tab_with_count: "(%{count}) محررة" + invited_via: "دعوة" + groups: "المجموعات" + topic: "موضوع" + expires_at: "تنتهي" + edit: "عدّل" + remove: "أزِل" reinvited: "اعادة ارسال الدعوة" search: "اكتب للبحث في الدعوات..." user: "المستخدمين المدعويين" @@ -1428,6 +1470,9 @@ ar: topics_entered: " موضوعات شُوهِدت" posts_read_count: "منشورات قرات" expired: "الدعوة انتهت صلاحيتها " + remove_all: "أزِل الدعوات المنقضية" + removed_all: "أُزيلت كلّ الدعوات المنقضية!" + remove_all_confirm: "أمتأكّد من إزالة كلّ الدعوات المنقضية؟" reinvite_all_confirm: "أمتأكّد من إعادة إرسال كلّ الدعوات؟" time_read: "وقت القراءة" days_visited: "أيام الزيارة" @@ -1648,6 +1693,7 @@ ar: trust_level: "مستوى الثقة" search_hint: "اسم المستخدم أو البريد إلكتروني أو عنوان الـ IP" create_account: + header_title: "مرحبًا!" disclaimer: "بالتسجيل، أنت توافق على سياسة الخصوصية و شروط الخدمة." failed: "حدث خطب ما. قد يكون البريد الإلكتروني مسجّلًا بالفعل. جرّب رابط نسيان كلمة السر" forgot_password: @@ -2054,6 +2100,8 @@ ar: few: "ثمّة %{count} طلبات عضوية إلى ”%{group_name}“" many: "ثمّة %{count} طلب عضوية إلى ”%{group_name}“" other: "ثمّة %{count} طلب عضوية إلى ”%{group_name}“" + reaction: "‏⁨%{username}⁩ ‏%{description}" + reaction_2: "%{username}, %{username2} %{description}" group_message_summary: zero: "ما من رسائل في بريد %{group_name} الوارد" one: "في بريد %{group_name} الوارد رسالة واحدة" @@ -2124,6 +2172,7 @@ ar: or_search_google: "او حاول البحث باستخدام google:" search_google: "حاول البحث باستخدام google:" search_google_button: "جوجل" + search_button: "البحث" context: user: "ابحث في منشورات @%{username}" category: "أبحث في قسم #%{category}" @@ -2175,6 +2224,8 @@ ar: label: نُشرت before: قبل after: بعد + views: + label: المشاهدات min_views: placeholder: الأدنى max_views: @@ -2204,6 +2255,7 @@ ar: change_category: "حدد القسم" close_topics: "إغلاق الموضوعات" archive_topics: "أرشفة الموضوعات" + move_messages_to_inbox: "انقلها إلى الوارد" notification_level: "الاشعارات" choose_new_category: "اختر القسم الجديد للموضوعات:" selected: @@ -2233,6 +2285,7 @@ ar: new: "ما من مواضيع أخرى جديدة." unread: "ما من مواضيع أخرى غير مقروءة." category: "ما من مواضيع أخرى في فئة ”%{category}“." + tag: "ما من مواضيع أخرى في فئة ”%{tag}“." top: "ما من مواضيع أخرى نشطة." bookmarks: "ما من مواضيع أخرى عليها علامة." topic: @@ -2331,17 +2384,29 @@ ar: slow_mode_update: title: "الوضع البطيء" select: "لا يمكن للمستخدمين نشر المشاركات في هذا الموضوع إلا مرّة كلّ:" + save: "فعّل" remove: "عطّل" + hours: "الساعات:" + minutes: "الدقائق:" + seconds: "الثواني:" durations: + 10_minutes: "10 دقيقة" 15_minutes: "15 دقيقة" + 30_minutes: "30 دقيقة" + 45_minutes: "45 دقيقة" 1_hour: "ساعة واحدة" + 2_hours: "2 ساعة" 4_hours: "4 ساعات" + 8_hours: "8 ساعات" + 12_hours: "12 ساعات" + 24_hours: "24 ساعات" topic_status_update: save: "ضع مؤقت" num_of_hours: "عدد الساعات:" remove: "ازل المؤقت" publish_to: "انشر في:" when: "متى:" + time_frame_required: "الرجاء تحديد إطار زمني" auto_update_input: none: "تحديد إطار زمني" now: "الآن" @@ -2378,6 +2443,7 @@ ar: auto_open: "سيُفتح هذا الموضوع آليًّا %{timeLeft}." auto_close: "سيُغلق هذا الموضوع آليًّا %{timeLeft}." auto_publish_to_category: "سيُنشر هذا الموضوع في#%{categoryName} %{timeLeft}." + auto_close_after_last_post: "سيُغلق هذا الموضوع %{duration} بعد آخر ردّ فيه." auto_delete: "هذا الموضوع سوف يحذف تلقائيا %{timeLeft}." auto_bump: "هذا الموضوع سوف يقطّع تلقائيا %{timeLeft}." auto_reminder: "سوف يتم تذكيرك بهذا الموضوع %{timeLeft}." @@ -2485,6 +2551,7 @@ ar: title: "مشاركة" extended_title: "شارِك رابطًا" help: "شارِك رابط هذا الموضوع" + invite_users: "دعوة" print: title: "اطبع" help: "افتح نسخة متوافقة مع الطابعة من هذا الموضوع" @@ -2552,11 +2619,13 @@ ar: username_placeholder: "اسم المستخدم" action: "أرسل دعوة" help: "دعوة الآخرين إلى هذا الموضوع عبر البريد الإلكتروني أو الإشعارات" + discourse_connect_enabled: "أدخِل اسم المستخدم لمَن تريد دعوته إلى هذا الموضوع." to_topic_blank: "أدخِل اسم المستخدم (أو عنوان بريده) لمَن تريد دعوته إلى هذا الموضوع." to_topic_email: "لقد أدخلت عنوان بريد إلكترونيّ. سنرسل بريدً إلكترونياً يحتوي دعوة تتيح لصديقك الرّد مباشرة على هذا الموضوع." to_topic_username: "لقد أدخلت اسم مستخدم. سنرسل إشعارًا يحتوي رابطًا يدعوهم إلى هذا الموضوع." to_username: "أدخِل اسم المستخدم لمَن تريد دعوته. سنُرسل إليه إخطارًا بالرابط الذي يدعوه إلى هذا الموضوع." email_placeholder: "name@example.com" + success_email: "أرسلنا دعوة إلى %{invitee} بالبريد. سنُرسل إليك إخطارًا متى قَبِل الدعوة. طالِع لسان الدعوات في صفحة المستخدم عندك لتتابع دعواتك المُرسلة." success_username: "دعونا هذا العضو للمشاركة في هذا الموضوع." error: "معذرةً، لم نستطع دعوة هذا الشخص. لربّما دعيته من قبل؟ (معدّل إرسال الدعوات محدود)" success_existing_email: "العضو ذو عنوان البريد الإلكتروني %{emailOrUsername} مسجل بالفعل. لقد قمنا بدعوتة للمشاركة بهذا الموضوع." @@ -3650,6 +3719,8 @@ ar: installed_version: "المثبتة" latest_version: "الحديثة" problems_found: "بعض النصائح بناءً على إعدادات موقعك الحالي" + new_features: + dismiss: "تجاهل" last_checked: "آخر فحص" refresh_problems: "تحديث" no_problems: "لا مشاكل." @@ -3675,6 +3746,7 @@ ar: show_traffic_report: "عرض تقرير مرور مفصل" whats_new_in_discourse: ما جديد دِسكورس؟ general_tab: "عام" + moderation_tab: "مشرف" security_tab: "الأمن" report_filter_any: "أي" too_many_requests: لقد نفّذت هذا الإجراء مرّات كثيرة جدًا. من فضلك انتظر قليلًا قبل معاودة المحاولة. @@ -3690,6 +3762,9 @@ ar: view_table: "جدول" view_graph: "رسم بياني" refresh_report: "تحديث التقرير " + daily: اليومية + monthly: الشهرية + weekly: الأسبوعية groups: "كل المجموعات" disabled: "هذا التقرير معطّل" total: "مجموع الوقت الكلي" @@ -3757,6 +3832,7 @@ ar: user: "الاعضاء" title: "API" created: أُنشئ في + updated: تاريخ التحديث generate: "إنشاء" revoke: "الغاء" all_users: "جميع الاعضاء" @@ -3930,6 +4006,7 @@ ar: save: "احفظ" new: "جديد" new_style: "واجهة جديدة" + install: "ثبّت" delete: "أحذف" delete_confirm: 'أمتأكّد من حذف ”%{theme_name}“؟' color: "لون" @@ -4288,6 +4365,7 @@ ar: censor: "راقب (ضلل)" require_approval: "يحتاج لموافقة" flag: "علم" + replace: "غير" action_descriptions: require_approval: "المنشورات التي تحتوي على هذه الكلمات تحتاج الى موافقة الطاقم قبل ان يتم رؤيتهم." flag: "اسمح للمنشورات التي تحتوي على هذه الكلمات, ولكن علمهم كـ غير مناسب لكي يتمكن المشرف من مراجعتهم." @@ -4316,6 +4394,7 @@ ar: active: "النشطون" staff: "الطاقم" suspended: "موقوف" + staged: "مهيأ" approved: "موافقة؟" titles: active: "الأعضاء النشطون" @@ -4334,6 +4413,8 @@ ar: check_email: title: "اكشف عنوان البريد الإلكتروني لهذا العضو" text: "إظهار" + check_sso: + text: "إظهار" user: suspend_failed: "حدث خطب ما أثناء إيقاف هذا المستخدم %{error}" unsuspend_failed: "حدث خطب ما أثناء إلغاء إيقاف هذا المستخدم %{error}" @@ -4341,10 +4422,12 @@ ar: suspend_reason_label: "لماذا هل أنت عالق؟ هذا النص سيكون ظاهراً للكل على صفحة تعريف هذا العضو, وسيكون ظاهراً للعضو عندما يحاول تسجل الدخول. احفظها قصيرة." suspend_reason_hidden_label: "لماذا انت موقوف؟ هذا النص سيظهر للعضو حين يحاول الولوج. اجعله قصيراً." suspend_reason: "سبب" + suspend_reason_title: "سبب التوقيف" suspend_message: "رسالة بريد الكتروني" suspend_message_placeholder: "اختياري. وفر المزيد من المعلومات حول التوقيف و سيتم ارساله عبر البريد الالكتروني الى العضو." suspended_by: "محظور من قبل" silence_reason: "السبب" + silence_modal_title: "كتم المستخدم" silence_message: "رسالة بريد الكتروني" suspended_until: "(حتى %{until})" cant_suspend: "لا يمكن ايقاف هذا العضو" @@ -4496,6 +4579,12 @@ ar: on_grace_period: "حاليا في فترة مهلة ترقية، لن يتم تخفيض رتب." locked_will_not_be_promoted: "مستوى الثفة هذا لن يتم الترقية له نهائيا" locked_will_not_be_demoted: "مستوى الثفة هذا لن يتم الخفض له نهائيا" + discourse_connect: + external_id: "ID الخارجي" + external_username: "اسم المستخدم" + external_name: "الاسم" + external_email: "البريد الإلكتروني" + external_avatar_url: "رابط الملف الشخصي" user_fields: title: "حقول المستخدم" help: "أضف حقولا يمكن للمستخدمين ملئها." @@ -4689,6 +4778,9 @@ ar: embed_by_username: "اسم العضو للموضوع المنشأ" embed_post_limit: "أقصى عدد مشاركات مضمنة" embed_truncate: "بتر المشاركات المضمنة" + allowed_embed_selectors: "منتقي CSS للعناصر التي تسمح في التضمينات." + blocked_embed_selectors: "منتقي CSS للعناصر التي حذفت من التضمينات." + allowed_embed_classnames: "اسماء اصناف المظاهر الجمالية المسموح بها" save: "أحفظ الإعدادات المضمنة" permalink: title: "الرابط الثابت" diff --git a/config/locales/client.be.yml b/config/locales/client.be.yml index fc852a20f16b9..8dfff29d16243 100644 --- a/config/locales/client.be.yml +++ b/config/locales/client.be.yml @@ -168,6 +168,9 @@ be: not_bookmarked: "закладка гэты пост" remove: "выдаліць закладку" save: "Захаваць" + no_user_bookmarks: "У вас няма закладак паведамлення; закладкі дазваляюць хутка спасылацца на канкрэтныя пасады." + auto_delete_preference: + never: "ніколі" search: "Пошук" drafts: remove: "выдаліць" @@ -209,6 +212,7 @@ be: username: "Імя карыстальніка" email: "Электронная пошта" name: "Імя" + reject_reason: "прычына" topics: topic: "Тэма" reviewable_count: "падлічваць" @@ -238,9 +242,20 @@ be: types: reviewable_user: title: "Карыстальнік" + reviewable_post: + title: "Паведамленне" approval: title: "Паведамленне мае патрэбу ў падцверджанні" ok: "Добра" + example_username: "username" + relative_time_picker: + days: + one: "дзень" + few: "дзён" + many: "дзён" + other: "дзён" + time_shortcut: + tomorrow: "заўтра" user_action: user_posted_topic: " %{user} <" you_posted_topic: " Вы <" @@ -256,6 +271,7 @@ be: sent_by_user: "Адпраўлена карыстальнікам %{user} <" sent_by_you: "Адпраўлена Вамі <" directory: + username: "Імя карыстальніка" filter_name: "фільтраваць па імені карыстальніка" title: "Карыстальнікі" likes_received: "атрымана" @@ -297,10 +313,16 @@ be: credentials: username: "Імя карыстальніка" password: "Пароль" + settings: + title: "Налады" mailboxes: disabled: "адключана" membership: access: доступ + categories: + title: Катэгорыі + tags: + title: Цэтлікі logs: title: "Логі" when: "калі" @@ -309,6 +331,8 @@ be: details: "дэталі" from: "ад" to: "да" + permissions: + title: "дазволу" add: "Дадаць" request: "запыт" message: "паведамленне" @@ -380,6 +404,9 @@ be: latest: "Апошнія" toggle_ordering: "паказаць" subcategories: "Падкатэгорыі" + topic_stat_unit: + week: "тыдзень" + month: "месяц" n_more: "Катэгорыі (%{count} і больш)..." ip_lookup: title: Пошук IP адрасы @@ -411,7 +438,10 @@ be: ignore_duration_username: "Імя карыстальніка" ignore_duration_save: "ігнараваць" mute_option: "ігнараваць" + notification_schedule: + to: "да" activity_stream: "Актыўнасць" + read: "прачытаныя" preferences: "Налады" feature_topic_on_profile: save: "Захаваць" @@ -429,12 +459,16 @@ be: disable: "адключыць апавяшчэння" enable: "ўключыць абвесткі" dismiss_notifications_tooltip: "Адзначыць ўсё апавяшчэнні як прачытаныя" + color_schemes: + undo: "скінуць" + regular: "звычайны" tag_settings: "Цэтлікі" watched_tags_instructions: "Вы будзеце аўтаматычна адсочваць усе новыя тэмы па гэтых цэтліках. Таксама вам будуць прыходзіць паведамленні пра новыя пасты і тэмы, а падлік непрачытаных і новых пастоў адлюструюцца побач з тэмамі." tracked_tags_instructions: "Вы будзеце аўтаматычна адсочваць усе тэмы па гэтых цэтліках. Падлік непрачытаных і новых пастоў побач адлюструюцца побач з тэмамі." muted_tags: "ігнаруемай" muted_tags_instructions: "Вы ня будзеце атрымоўваць паведамленні аб новых тэмах па гэтых цэтліках і яны не адлюструюцца ў спісе апошніх тэмаў." muted_categories: "ігнаруемай" + regular_categories: "звычайны" unread_message_count: "Паведамленні" admin_delete: "Выдаліць" users: "Карыстальнікі" @@ -454,6 +488,7 @@ be: tags: "Тэгі" preferences_nav: account: "Аккаўнт" + security: "Бяспека" profile: "Профіль" emails: "Емейлы" notifications: "Натыфікацыі" @@ -581,6 +616,10 @@ be: title: "Запрашэнні" pending_tab: "прынята......" redeemed_tab: "прынята" + groups: "Групы" + topic: "Тэма" + edit: "Рэдагаваць" + remove: "выдаліць" search: "шукаць запрашэнні ..." user: "запрошаны карыстальнік" redeemed: "Адазваныя запрашэнні" @@ -693,6 +732,7 @@ be: trust_level: "ўзровень даверу" search_hint: "імя карыстальніка, email або IP-адрас" create_account: + header_title: "жаданы!" failed: "Нешта пайшло не так; хутчэй за ўсё, гэтую электронную пошту ўжо зарэгістравана, паспрабуйце спасылкі Забыўся пароль" forgot_password: title: "Скід пароля" @@ -798,6 +838,7 @@ be: link_dialog_title: "ўставіць гіперспасылку" link_optional_text: "неабавязкова назву" link_url_placeholder: "Устаўце URL адрас альбо тып для пошуку тэмаў" + blockquote_title: "цытата" blockquote_text: "цытата" code_title: "Папярэдне фарматаваны тэкст" paste_code_text: "увядзіце ці ўстаўце код тут" @@ -818,6 +859,7 @@ be: desc: Напісаць новае асабістае паведамленне create_topic: label: "Стварыць новую тэму" + ignore: "ігнараваць" notifications: popup: mentioned: '% {Імя карыстальніка} згадаў вас у "% {} тэме" -% {SITE_TITLE}' @@ -849,6 +891,7 @@ be: no_results: "Нічога не знойдзена." results_page: "Вынікі пошуку для '%{term}'" search_google_button: "Google" + search_button: "Пошук" context: topic: "Пошук у гэтай тэме" private_messages: "Пошук паведамленняў" @@ -859,9 +902,13 @@ be: in_group: label: У групе post: + count: + label: Паведамленні time: before: перад after: пасля + views: + label: прагляды hamburger_menu: "перайсці да іншага пераліку або катэгорыі тым" new_item: "новы" go_back: "вярнуцца назад" @@ -879,6 +926,7 @@ be: actions: "масавыя дзеянні" close_topics: "Закрыць тэму" archive_topics: "Заархіваваныя тэмы" + move_messages_to_inbox: "Перамясціць у тэчцы Уваходныя" notification_level: "Натыфікацыі" none: unread: "У вас няма непрачытаных тэм." @@ -895,6 +943,7 @@ be: new: "Больш няма новых тэм." unread: "Больш няма непрачытаных тэм." category: "Больш няма тым у катэгорыі %{category}." + tag: "Больш няма тым у катэгорыі %{tag}." top: "There are no more top topics." bookmarks: "Тэмы ў закладках адсутнічаюць." topic: @@ -931,6 +980,11 @@ be: jump_reply_up: перайсці да больш ранняй адказы jump_reply_down: перайсці да больш позняй адказы deleted: "Тэма была выдаленая" + slow_mode_update: + save: "Уключыць" + remove: "Адключыць" + topic_status_update: + when: "калі:" auto_update_input: tomorrow: "заўтра" auto_close: @@ -1013,6 +1067,11 @@ be: username_placeholder: "username" email_placeholder: "name@example.com" filters: + n_posts: + one: "%{count} запіс" + few: "%{count}запісаў" + many: "%{count}запісаў" + other: "%{count}запісаў" cancel: "прыбраць фільтр" split_topic: title: "Перанос новай тэмы" @@ -1031,17 +1090,25 @@ be: title: "Змяніць метку часу" action: "змяніць метку часу" post: + quote_share: "Падзяліцца тэмай" errors: upload: "Выбачайце, пры загрузцы гэтага файла адбылася памылка. Калі ласка, паспрабуйце яшчэ раз." upload_not_authorized: "Sorry, the file you are trying to upload is not authorized (authorized extensions: %{authorized_extensions})." archetypes: save: "Захаваць налады" controls: + like: "упадабаць гэты пост" edit_action: "Рэдагаваць" more: "Болей" grant_badge: "даць Значок" delete_topic: "выдаліць тэму" actions: + people: + like: + one: "гэта спадабалася" + few: "гэта спадабалася" + many: "гэта спадабалася" + other: "гэта спадабалася" by_you: notify_moderators: "Вы пазначылі гэта для мадэрацыі" revisions: @@ -1090,6 +1157,11 @@ be: change_in_category_topic: "рэдагаваць апісанне" already_used: "Гэты колер ўжо выкарыстоўваецца іншы катэгорыяй" security: "Бяспека" + permissions: + group: "Група" + see: "бачыць" + reply: "Адказаць" + create: "Стварыць" images: "Выява" email_in: "Custom incoming email address:" allow_badges_label: "Дазволіць ўзнагароджваць значкамі ў гэтай катэгорыі" @@ -1122,6 +1194,13 @@ be: email: "Электронная пошта" flagging: action: "Пазначыць запіс" + take_action_options: + default: + title: "прыняць меры" + suspend: + title: "прыпыніць карыстальніка" + silence: + title: "Silence Карыстальнік" notify_action: "паведамленне" delete_spammer: "выдаліць спамера" yes_delete_spammer: "Так, выдаліць спамера" @@ -1138,7 +1217,17 @@ be: replies: "адказы" activity: "актыўнасць" likes: "перавагі" + likes_lowercase: + one: "падабайка" + few: "перавагі" + many: "перавагі" + other: "перавагі" users: "Карыстальнікі" + users_lowercase: + one: "карыстальнік" + few: "карыстальнікі" + many: "карыстальнікі" + other: "карыстальнікі" category_title: "Катэгорыя" changed_by: "%{Author}" categories_list: "Спіс катэгорый" @@ -1234,6 +1323,7 @@ be: choose_for_topic: "дадатковыя тэгі" add_synonyms: "дадаць" sort_by: "Сартаваць па:" + sort_by_count: "падлічваць" sort_by_name: "Імя" cancel_delete_unused: "адмяніць" notifications: @@ -1285,6 +1375,7 @@ be: no_problems: "Не выяўлена ніякіх праблем." moderators: "мадэратары:" admins: "адміністратары:" + silenced: "глушыцелем:" suspended: "прыпыненыя:" private_messages_short: "Пвдмл" private_messages_title: "Паведамленні" @@ -1309,6 +1400,9 @@ be: 7_days_ago: "7 дзён таму" 30_days_ago: "30 дзён таму" all: "Усё" + daily: штодня + monthly: штомесяц + weekly: штотыдзень groups: "Усе групы" filters: group: @@ -1325,6 +1419,7 @@ be: manage: interaction: email: Электронная пошта + incoming_email: "Custom incoming email address" visibility_levels: public: "Усе" title: "Групы" @@ -1351,6 +1446,8 @@ be: description: Апісанне save: Захаваць continue: Працягнуць + scopes: + action: дзеянне web_hooks: create: "стварыць" save: "стварыць..." @@ -1444,6 +1541,7 @@ be: revert_confirm: "Ці ўпэўненыя вы, што хочаце вярнуць вашы змены?" theme: theme: "тэма" + customize_desc: "Кастамізаваць:" create: "стварыць" create_type: "тып" create_name: "Назва" @@ -1456,6 +1554,7 @@ be: installed: "устаноўленая" install_popular: "папулярны" about_theme: "Аб тэме" + version: "версія:" enable: "Уключыць" disable: "Адключыць" add: "Дадаць" @@ -1578,6 +1677,7 @@ be: delete_topic: "выдаліць тэму" recover_topic: "адмяніць выдаленне тэмы" delete_post: "выдаліць паведамленне" + impersonate: "ўвасобіцца" anonymize_user: "ананімны карыстальнік" change_category_settings: "змяніць налады катэгорыі" delete_category: "выдаліць катэгорыю" @@ -1648,11 +1748,13 @@ be: active: "Актыўныя карыстальнікі" new: "Новыя карыстальнікі" staff: "персанал" + moderators: "мадэратары" user: suspend_reason: "прычына" silence_reason: "прычына" silence_modal_title: "Silence Карыстальнік" delete_all_posts: "прычына..." + silenced: "глушыцелем?" moderator: "Мадэратар?" admin: "Адмін?" suspended: "Прыпынена?" @@ -1730,6 +1832,11 @@ be: flagged_posts: "абскарджаны паведамлення" likes_given: "упадабаныя" likes_received: "атрыманыя перавагі" + discourse_connect: + external_id: "знешні ID" + external_username: "Імя карыстальніка" + external_name: "Імя" + external_email: "Электронная пошта" user_fields: untitled: "без загалоўка" type: "тып поля" @@ -1739,6 +1846,8 @@ be: delete: "выдаліць" cancel: "адмяніць" options: "Налады" + required: + enabled: "абавязковыя" field_types: text: "тэкставае поле" confirm: "пацвярджэнне" @@ -1761,6 +1870,8 @@ be: uploaded_image_list: upload: label: "Загрузіць" + selectable_avatars: + title: "Спіс аватараў карыстальнікі могуць выбраць" categories: all_results: "усе" required: "абавязковыя" @@ -1839,6 +1950,8 @@ be: add_host: "дадаць Хост" embed_by_username: "Імя карыстальніка для стварэння тэмы" embed_post_limit: "Максімальную колькасць паведамленняў для ўстаўкі" + embed_truncate: "Абрэзаць укаранёныя паведамленні" + allowed_embed_classnames: "Дазволеныя імёны класаў CSS" permalink: title: "Сталыя спасылкі" url: "URL спасылка" diff --git a/config/locales/client.bg.yml b/config/locales/client.bg.yml index d2da4a1cc4afb..e441d7067cf78 100644 --- a/config/locales/client.bg.yml +++ b/config/locales/client.bg.yml @@ -153,6 +153,8 @@ bg: topic_admin_menu: "действия по темата" wizard_required: "Добре дошли във вашия нов Discourse! Нека започнем с съветника за настройка ✨" emails_are_disabled: "Всички изходящи имейли са изцяло забранени от администратора. Няма да бъдат изпращани никакви имейл известия." + software_update_prompt: + dismiss: "Отмени" bootstrap_mode_disabled: "Режимът на стартиране ще бъде изключен в следващите 24 часа. " themes: default_description: "По подразбиране" @@ -265,6 +267,8 @@ bg: no_timezone: 'Не може да получавате напомняния, защото не сте настроили своята часова зона. Може да го направите във Вашия профил.' invalid_custom_datetime: "Въведените дата и час не са валидни. Опитайте отново." list_permission_denied: "Нямате право да преглеждате отметките на този потребител." + auto_delete_preference: + never: "Никога" search: "Търсене" reminders: today_with_time: "днес в %{time}" @@ -342,6 +346,7 @@ bg: email: "Имейл" name: "Име" fields: "Полета" + reject_reason: "Причина" user_percentage: agreed: one: "%{count}% са съгласни" @@ -397,6 +402,8 @@ bg: types: reviewable_user: title: "Потребител" + reviewable_post: + title: "Публикация" approval: title: "Публикацията изисква одобрение" description: "Ние получихме вашата публикация, но тя трябва да бъде одобрена от модератора преди да бъде показана. Моля, проявете търпение." @@ -404,6 +411,20 @@ bg: one: "Имате %{count} чакаща публикация." other: "Имате %{count} чакащи публикации." ok: "Ок" + example_username: "потребителско име " + relative_time_picker: + days: + one: "ден" + other: "дни " + time_shortcut: + later_today: "По-късно днес" + next_business_day: "Следващия работен ден" + tomorrow: "Утре" + next_week: "Следваща седмица" + later_this_week: "По-късно тази седмица" + start_of_next_business_week_alt: "Следващия понеделник" + next_month: "Следващия месец" + custom: "Друга дата и час" user_action: user_posted_topic: "%{user} публикува тази тема" you_posted_topic: "Вие публикувахте тази тема" @@ -419,6 +440,7 @@ bg: sent_by_user: "Изпратено от %{user}" sent_by_you: "Изпратено от Вас" directory: + username: "Потребителско име" filter_name: "филтър по потребитилско име" title: "Потребители" likes_given: "Дадени" @@ -468,9 +490,15 @@ bg: credentials: username: "Потребителско име" password: "Парола" + settings: + title: "Настройки" membership: title: Членство access: Достъп + categories: + title: Категории + tags: + title: Етикети logs: title: "Логове" when: "Кога" @@ -481,6 +509,8 @@ bg: details: "Детайли " from: "От" to: "До" + permissions: + title: "Позволения " public_admission: "Разрешено е на потребителите да се присъединяват към групата свободно (Изисква се публично видима група)" public_exit: "Разрешено е на потребителите да напуската групата свободно" empty: @@ -603,6 +633,9 @@ bg: topic_sentence: one: "%{count} тема" other: "%{count} теми" + topic_stat_unit: + week: "седмица" + month: "месец" topic_stat_sentence_week: one: "%{count}нова тема през последната седмица." other: "%{count}нови теми през последната седмица." @@ -654,7 +687,11 @@ bg: add_ignored_user: "Добавете ..." mute_option: "Заглушен" normal_option: "Нормален" + notification_schedule: + none: "Без" + to: "до" activity_stream: "Активност" + read: "Прочетени" preferences: "Настройки" feature_topic_on_profile: open_search: "Изберете нова тема" @@ -687,6 +724,8 @@ bg: dismiss_notifications_tooltip: "Маркирайте всички непрочетени известия, като прочетени" first_notification: "Вашето първо известие! Изберете го за да започнете." theme_default_on_all_devices: "Направи тази тема стандарт на всичките ми устройства" + color_schemes: + regular: "Редовен" external_links_in_new_tab: "Отваряй всички външни връзки в нов раздел." enable_quoting: "Включи отговор с цитат при маркиран текст." change: "промени" @@ -721,6 +760,7 @@ bg: watched_first_post_tags: "Наблюдавайки Първа Публикация" watched_first_post_tags_instructions: "Ще бъдете уведомени за първата публикация във всяка нова тема с тези етикети." muted_categories: "Заглушен" + regular_categories: "Редовен" no_category_access: "Като модератор имате ограничен достъп до категориите, запазването е изключено." delete_account: "Изтрий моя профил" delete_account_confirm: "Сигурни ли сте, че искате да изтриете вашия акаунт? Акаунтът не може да бъде възстановен !" @@ -757,6 +797,7 @@ bg: tags: "Етикети" preferences_nav: account: "Профил" + security: "Сигурност" profile: "Профил" emails: "Имейли" notifications: "Известия" @@ -914,6 +955,11 @@ bg: pending_tab_with_count: "Чакащи (%{count})" redeemed_tab: "Взети" redeemed_tab_with_count: "Взети (%{count})" + invited_via: "Покана" + groups: "Групи" + topic: "Тема" + edit: "Редактирай" + remove: "Премахване" reinvited: "Поканата е изпратена отново" search: "търсете покани" user: "Поканени потребители" @@ -1062,6 +1108,7 @@ bg: private_message_info: title: "Съобщение" invite: "Поканете други..." + add: "Добавете ..." leave_message: "Сигурни ли сте, че искате да оставите това съобщение?" remove_allowed_user: "Сигурни ли сте, че искате да премахнете %{name} от това съобщение?" remove_allowed_group: "Сигурни ли сте, че искате да премахнете %{name} от това съобщение?" @@ -1205,6 +1252,7 @@ bg: link_description: "добави описание на връзката тук" link_dialog_title: "Добави хипервръзка" link_optional_text: "заглавие по избор" + blockquote_title: "Текстов блок" blockquote_text: "Текстов блок" code_title: "Форматиран текст" code_text: "Избутай текста с 4 интервала" @@ -1273,6 +1321,7 @@ bg: or_search_google: "Или вместо това опитайте търсене с Гугъл:" search_google: "Опитайте вместо това търсене с Гугъл:" search_google_button: "Google" + search_button: "Търсене" context: user: "Търсете публикация от @%{username}" category: "Търсене за категория #%{category}" @@ -1295,10 +1344,14 @@ bg: pinned: са закачени all_tags: Всички по-горни етикети post: + count: + label: Публикации time: label: Публикувано before: преди after: след + views: + label: Преглеждания hamburger_menu: "Отиди към друг списък с теми или друга категория " new_item: "нови" go_back: "Назад " @@ -1322,6 +1375,7 @@ bg: actions: "Групови действия " close_topics: "Затвори темите" archive_topics: "Архивирай темите" + move_messages_to_inbox: "Премести във входящи" notification_level: "Известия" choose_new_category: "Избери нова категория за тези теми:" selected: @@ -1347,6 +1401,7 @@ bg: new: "Няма повече нови теми." unread: "Няма повече непрочетени теми." category: "Няма повече теми в %{category}" + tag: "Няма повече теми в %{tag}" top: "Няма повече топ теми." bookmarks: "Няма теми в Отметки" topic: @@ -1407,6 +1462,11 @@ bg: jump_reply_up: към по ранен отговор jump_reply_down: към по-късен отговор deleted: "Темата беше изтрита" + slow_mode_update: + save: "Позволи" + remove: "Деактивиране" + topic_status_update: + when: "Кога:" auto_update_input: none: "Избери времева рамка" later_today: "По-късно днес" @@ -1421,6 +1481,7 @@ bg: based_on_last_post: "Не затваряйте преди последната публикация да бъде поне толкова стара." status_update_notice: auto_close: "Тази тема ще се затвори автоматично след %{timeLeft}." + auto_close_after_last_post: "Тази тема ще се затвори %{duration} след последния отговор. " auto_close_title: "Настройки за автоматично затваряне" timeline: back: "Назад" @@ -1505,6 +1566,7 @@ bg: title: "Споделяне" extended_title: "Сподели линк" help: "споделете връзка към тази тема" + invite_users: "Покана" print: title: "Печат" flag_topic: @@ -1550,11 +1612,13 @@ bg: username_placeholder: "потребителско име" action: "Изпрати покана" help: "поканете другите да се присъединят към тази тема чрез имейл или уведомление" + discourse_connect_enabled: "Въведете потребителското име на човека който желаете да поканите към в тема." to_topic_blank: "Въведете потребителско име или имейл адрес на човека който желаете да поканите към тази тема." to_topic_email: "Вие въведохте имейл адрес. Ние ще изпратим имейл чрез която вашият приятел може да отговори веднака на тази тема." to_topic_username: "Въведохте потребителско име. Ние ще изпратим напомняне с връзка която го кани в тази тема." to_username: "Въведете потребителското име на човека който искате да поканите. Ние ще му изпратим напомняне с връзка която го кани в тази тема." email_placeholder: "name@example.com" + success_email: "Изпратихте покана на %{invitee}. Ще Ви уведомим, когато поканата е използвана. Проверявайте раздела с покани на Вашата потребителска страница, за да следите на Вашите покани." success_username: "Ние поканихме този потребител да се присъедини темата." error: "Съжаляваме, не можем да поканим този човек. Вероятно вече е потребител? ( Поканите са ограничени)" login_reply: "Влезте, за да отговорите " @@ -1612,6 +1676,7 @@ bg: one: Вие избрахте %{count} публикация. other: "Вие избрахте %{count} публикации. " post: + quote_share: "Споделяне" edit_reason: "Причина: " post_number: "публикация %{number} " reply_as_new_topic: "Отговори като свързана тема" @@ -1621,6 +1686,7 @@ bg: deleted_by_author: one: "(публикация оттеглена от автора, ще бъде автоматично изтрита след %{count} час, освен, ако не бъде сигнализирана)" other: "(публикация оттеглена от автора, ще бъде автоматично изтрита след %{count} часа, освен, ако не бъде сигнализирана) " + collapse: "намали" expand_collapse: "разшири/намали " gap: one: "покажи %{count} скрит отговор" @@ -1775,6 +1841,10 @@ bg: change_in_category_topic: "Редактирай Описанието " already_used: "Този цвят вече е използван за друга категория. " security: "Сигурност" + permissions: + group: "Група" + see: "Виж" + reply: "Отговорете" special_warning: "Внимание: Тази категория е предварително семена категория и настройките й за сигурност не могат да се променят. Ако не искате да използвате тази категория, изтрийте темата си, вместо да я местите в категорията по предназначение." uncategorized_security_warning: "Тази категория е специална. Тя е предназначен като обща зона за теми, които нямат категория. Като такава, тя не може да има настройки за сигурност." images: "Изображения" @@ -1814,6 +1884,7 @@ bg: normal: "Нормален" high: "Висок" sort_options: + default: "по подразбиране" likes: "Харесвания" views: "Преглеждания" posts: "Публикации" @@ -1834,6 +1905,12 @@ bg: flagging: title: "Благодарим ви, че помагате да поддържаме дискусията цивилизована!" action: "Сигнализирай публикацията " + take_action_options: + default: + title: "Предприеми действие " + details: "Достигнете границата от сигнали веднага, вместо да чакате за още сигнали от общността" + suspend: + title: "Отстрани потребител" notify_action: "Съобщение" official_warning: "Официално предупреждение" delete_spammer: "Изтрий спамера " @@ -2065,8 +2142,13 @@ bg: choose_for_topic: "етикети по желание" add_synonyms: "Добави" delete_tag: "Изтрийте таг" + sort_by: "Сортирай по:" + sort_by_count: "брой" + sort_by_name: "име" manage_groups_description: "Дефинирай групи за организране на етикетите" cancel_delete_unused: "Отмени" + filters: + without_category: "%{filter} %{tag} теми" notifications: watching: title: "Наблюдаване" @@ -2106,6 +2188,9 @@ bg: back: "Назад" share: "Споделяне" dismiss: "Отмени" + do_not_disturb: + options: + custom: "По избор" admin_js: type_to_filter: "филтрирай..." admin: @@ -2127,6 +2212,8 @@ bg: version_check_pending: "Изглежда, че скоро сте обновили версията. Това е чудесно!" installed_version: "Инсталирани" latest_version: "Последни" + new_features: + dismiss: "Отмени" last_checked: "Последна проверка" refresh_problems: "Обнови" no_problems: "Не бяха открити проблеми." @@ -2153,6 +2240,9 @@ bg: all: "Всички" view_table: "таблица" refresh_report: "Обнови доклада" + daily: Дневно + monthly: Месечно + weekly: Седмично groups: "Всички групи" filters: group: @@ -2207,6 +2297,8 @@ bg: description: Описание save: Запази continue: Напред + scopes: + action: Действие web_hooks: save: "Запази" destroy: "Изтрий" @@ -2317,6 +2409,7 @@ bg: revert: "Върни промените" revert_confirm: "Сигурен ли си, че искаш да върнеш промените?" theme: + customize_desc: "Персонализация:" create_type: "Тип" create_name: "Име" edit: "Редактирай" @@ -2327,6 +2420,7 @@ bg: installed: "Инсталирани" install_popular: "Популярни" about_theme: "Относно" + version: "Версия:" enable: "Позволи" disable: "Деактивиране" add: "Добави" @@ -2405,6 +2499,7 @@ bg: delivery_method: "Метод за доставяне " preview_digest_desc: "Преглед на съдържанието на имейлите, изпратени до неактивните потребители." refresh: "Опресни" + sending_email: "Изпраща се имейл..." format: "Формат" html: "html" text: "текст" @@ -2458,6 +2553,7 @@ bg: do_nothing: "Не прави нищо " staff_actions: all: "всички подкатегории" + filter: "Филтер:" title: "Действия на персонала" clear_filters: "Покажи всичко " staff_user: "Потребител" @@ -2583,6 +2679,7 @@ bg: active: "Активни" staff: "Персонал" suspended: "Отстранени" + staged: "Поставен" approved: "Одобрен?" titles: active: "Активни потребители" @@ -2601,6 +2698,8 @@ bg: check_email: title: "Разкрий имейла на този потребител" text: "Покажи" + check_sso: + text: "Покажи " user: suspend_failed: "Нещо се обърка при отстраняването на този потребител %{error}" unsuspend_failed: "Нещо се обърка при отстраняването на този потребител %{error} " @@ -2711,6 +2810,12 @@ bg: on_grace_period: "В момента, в промоционален гратисен период, няма да бъде понижен. " locked_will_not_be_promoted: "Нивото на доверие е заключено. Никога няма да се насърчава. " locked_will_not_be_demoted: "Нивото на доверие е заключено. Никога няма да се понижават. " + discourse_connect: + external_id: "Външно ID " + external_username: "Потребителско име" + external_name: "Име" + external_email: "Имейл" + external_avatar_url: "URL до аватара" user_fields: title: "User Fields" help: "Добавете поле, което потребителите ще могат да попълват." @@ -2892,6 +2997,8 @@ bg: embed_by_username: "Потребител за създаване на темата" embed_post_limit: "Максимален брой публикации за вграждане." embed_truncate: "Изтрий вградените постове" + allowed_embed_selectors: "Избор на CSS елементи които са разрешени за вграждане" + blocked_embed_selectors: "Избор на CSS елементи които не са разрешени за вграждане" save: "Запамети настройките за вграждане" permalink: title: "Постоянни адреси" diff --git a/config/locales/client.bs_BA.yml b/config/locales/client.bs_BA.yml index d6ed86c031379..2537ef93c57e0 100644 --- a/config/locales/client.bs_BA.yml +++ b/config/locales/client.bs_BA.yml @@ -179,6 +179,8 @@ bs_BA: topic_admin_menu: "akcije u vezi teme" wizard_required: "Dobrodošli na vaš novi Discourse! Odpočnimo sa čarobnjakom za postavke ✨" emails_are_disabled: "Sve odlazeće email poruke su globalno onemogućene od strane administratora. Ni jedna notifikacija bilo koje vrste neće biti poslana." + software_update_prompt: + dismiss: "Odpusti" bootstrap_mode_disabled: "Bootstrap način rada će biti isključen u toku 24 sata." themes: default_description: "Uobičajen" @@ -240,6 +242,10 @@ bs_BA: now: "upravo sada" read_more: "pročitaj više" more: "Više" + x_more: + one: "Još %{count}" + few: "Još %{count}" + other: "Još %{count}" less: "Manje" never: "nikada" every_30_minutes: "svakih 30 minuta" @@ -415,6 +421,7 @@ bs_BA: topic: "Tema:" filtered_topic: "Filtrirali ste sadržaj koji se može pregledati u jednoj temi." filtered_user: "User" + filtered_reviewed_by: "Pregledao je" show_all_topics: "(pokaži sve teme)" deleted_post: "(post izbrisan)" deleted_user: "(korisnik izbrisan)" @@ -425,6 +432,7 @@ bs_BA: email: "Email" name: "Ime" fields: "Polja" + reject_reason: "Reason" user_percentage: agreed: one: "%{count}% slaže" @@ -473,6 +481,7 @@ bs_BA: created_at_asc: "Napravijeno kod (preokrenuti)" priority: title: "Minimalni prioritet" + any: "(bilo koji)" low: "Nisko" medium: "Srednije" high: "Visoko" @@ -511,6 +520,8 @@ bs_BA: title: "Post na čekanju" reviewable_user: title: "User" + reviewable_post: + title: "Objava" approval: title: "Post treba odobrenje" description: "Primili smo Vaš novi post ali on treba biti odobren od strane moderatora prije nego bude javno dostupan. Molimo za strpljenje." @@ -519,6 +530,22 @@ bs_BA: few: "Imate %{count} na čekanju." other: "Imate %{count} na čekanju." ok: "OK" + example_username: "korisničko ime" + relative_time_picker: + days: + one: "dan" + few: "days" + other: "days" + time_shortcut: + later_today: "Na kraju dana" + next_business_day: "Sljedeći radni dan" + tomorrow: "Sutra" + next_week: "Sljedeće sedmice" + later_this_week: "Kasnije ove sedmice" + start_of_next_business_week: "Ponedjeljak" + start_of_next_business_week_alt: "Sljedeći ponedjeljak" + next_month: "Sljedeći mjesec" + custom: "Precizirano vrijeme i datum" user_action: user_posted_topic: "%{user} je objavio/la temu" you_posted_topic: "Vi ste objavili temu" @@ -534,6 +561,7 @@ bs_BA: sent_by_user: "Poslao %{user}" sent_by_you: "Poslali vi" directory: + username: "Ime" filter_name: "filtiraj korisnike" title: "Korisnici" likes_given: "Dato" @@ -605,6 +633,8 @@ bs_BA: imap_ssl: "Koristi SSL za IMAP" username: "Ime" password: "Lozinka" + settings: + title: "Postavke" mailboxes: synchronized: "Sinkronizirani poštanski sandučić" none_found: "Na ovom računu e-pošte nisu pronađeni poštanski sandučići." @@ -786,6 +816,9 @@ bs_BA: one: "%{count} tema" few: "%{count} teme" other: "%{count} tema" + topic_stat_unit: + week: "sedmica" + month: "mjesec" topic_stat_sentence_week: one: "%{count} nova tema u protekloj sedmici." few: "%{count} nove teme u protekloj sedmici." @@ -848,7 +881,12 @@ bs_BA: mute_option_title: "Nećete primati nikakve obavijesti koje se odnose na ovog korisnika." normal_option: "Normalno" normal_option_title: "Bićete obaviješteni ako vam ovaj korisnik odgovori , citira vas ili vas spomene." + notification_schedule: + none: "Ništa" + monday: "Ponedjeljak" + to: "ka" activity_stream: "Aktivnost" + read: "Čitaj" preferences: "Postavke" feature_topic_on_profile: open_search: "Odaberi Novu temu" @@ -888,6 +926,9 @@ bs_BA: not_first_time: "Nije ti prvi put?" skip_link: "Preskoči ove savjete" theme_default_on_all_devices: "Postavi ovu temu kao zadanu na svim mojim uređajima" + color_schemes: + undo: "Resetovati" + regular: "Redovne" dark_mode: "Tamni način" dark_mode_enable: "Omogućite automatski tamnu šemu boja" text_size_default_on_all_devices: "Učinite ovo standardnom veličinom teksta na svim mojim uređajima" @@ -984,6 +1025,7 @@ bs_BA: tags: "Oznake" preferences_nav: account: "Račun" + security: "Security" profile: "Profil" emails: "Email-i" notifications: "Obavijesti" @@ -1236,6 +1278,12 @@ bs_BA: pending_tab_with_count: "Na čekanju (%{count})" redeemed_tab: "Iskorišteno" redeemed_tab_with_count: "Iskorišteno (%{count})" + invited_via: "Pozivnica" + groups: "Grupe" + topic: "Topic" + expires_at: "Ističe" + edit: "Izmijeni" + remove: "Ukloni" reinvited: "Pozivnica ponovo poslata" search: "kucaj da potražiš pozivnice..." user: "Pozvan korisnik" @@ -1250,6 +1298,9 @@ bs_BA: topics_entered: "Pogledane Teme" posts_read_count: "Pročitane objave" expired: "Ova pozivnica je istekla." + remove_all: "Ukloni istekle pozivnice" + removed_all: "Uklonjeni su svi istekli pozivi!" + remove_all_confirm: "Jeste li sigurni da želite ukloniti sve pozivnice koje su istekle?" reinvite_all_confirm: "Da li ste sigurni da želite poslati ponovno sve pozivnice?" time_read: "Vrijeme čitanja" days_visited: "Dani posjete" @@ -1418,6 +1469,7 @@ bs_BA: title: "Privatna poruka" invite: "Pozovi Ostale..." edit: "Dodaj ili ukloni..." + add: "Dodaj" leave_message: "Da li zaista želite da napustite ovu poruku?" remove_allowed_user: "Da li zaista želite da uklonite %{name} sa ove privatne poruke?" remove_allowed_group: "Da li zaista želite da uklonite %{name} sa ove poruke?" @@ -1429,6 +1481,7 @@ bs_BA: trust_level: "Nivo povjerenja" search_hint: "ime" create_account: + header_title: "Dobrodošao!" disclaimer: "Registracijom pristajete na politiku privatnosti i uvjete pružanja usluge ." failed: "Nešto je krenulo pogrešno, možda je ovaj email već iskorišten za registraciju, pokušajte sa Zaboravio šifru linkom" forgot_password: @@ -1659,6 +1712,7 @@ bs_BA: link_description: "ubaci opis linka" link_dialog_title: "Unesi Link" link_optional_text: "naslov neobavezan" + blockquote_title: "Citiranje" blockquote_text: "Citiranje" code_title: "Formatiran Tekst" code_text: "Unapred formatirani tekst za 4 razmaka" @@ -1707,6 +1761,7 @@ bs_BA: toggle_topic_bump: label: "Toggle topic bump" desc: "Odgovori bez izmjene zadnjeg datuma odgovora" + ignore: "Zanemari" notifications: tooltip: regular: @@ -1749,6 +1804,8 @@ bs_BA: granted_badge: "Zasluženo '%{description}'" topic_reminder: "%{username} %{description}" watching_first_post: "Nova tema %{description}" + reaction: "%{username} %{description}" + reaction_2: "%{username}, %{username2} %{description}" group_message_summary: one: "%{count} poruka u vašem %{group_name} sandučiću" few: "%{count} poruke u vašem %{group_name} sandučiću" @@ -1822,6 +1879,7 @@ bs_BA: or_search_google: "Ili umjesto toga probaj pretražiti pomoću Google-a:" search_google: "Probaj umjesto toga pretražiti pomoću Google-a:" search_google_button: "Google" + search_button: "Pretraži" context: user: "Traži postove od @%{username}" category: "Traži #%{category} kategoriju" @@ -1865,10 +1923,14 @@ bs_BA: noreplies: imaju nula odgovora single_user: sadrži jednog korisnika post: + count: + label: Objave time: label: Objavljeno before: prije after: poslije + views: + label: Pogledano hamburger_menu: "idi ka drugoj temi, listi ili kategoriji" new_item: "novo" go_back: "go back" @@ -1894,6 +1956,7 @@ bs_BA: change_category: "Postavi kategoriju" close_topics: "Zatvori teme" archive_topics: "Arhiviraj teme" + move_messages_to_inbox: "Idi u inbox" notification_level: "Obavijesti" choose_new_category: "Izaberi novu kategoriju za temu:" selected: @@ -1920,6 +1983,7 @@ bs_BA: new: "Nema više novih tema." unread: "Nema više nepročitanih tema." category: "Nema više %{category} tema." + tag: "Nema više %{tag} tema." top: "Nema više top tema." bookmarks: "U zabilješkama više nema spremljenih tema." topic: @@ -1992,6 +2056,9 @@ bs_BA: jump_reply_up: jump to earlier reply jump_reply_down: jump to later reply deleted: "Ova tema je obrisana" + slow_mode_update: + save: "Omogući" + remove: "Onemogući" topic_status_update: title: "Trajanje teme" save: "Podesi tajmer" @@ -2033,6 +2100,7 @@ bs_BA: auto_open: "Ova tema će biti automatski otvorena za %{timeLeft}" auto_close: "Ova tema će biti automatski zatvorena za %{timeLeft}" auto_publish_to_category: "Ova tema će biti objavljena u #%{categoryName} za %{timeLeft}." + auto_close_after_last_post: "Ova tema će se biti zatvorena %{duration} nakon zadnjeg odgovora." auto_delete: "Ova tema će biti automatski izbrisana za %{timeLeft}" auto_bump: "Ova tema će biti automatski bumped %{timeLeft}." auto_reminder: "Bit će te obaviješteni o ovoj temi za %{timeLeft}" @@ -2135,6 +2203,7 @@ bs_BA: title: "Dijeli" extended_title: "Dijeli link" help: "podjeli link do ove teme" + invite_users: "Invite" print: title: "Print" help: "Otvori printersku verziju ove teme" @@ -2188,11 +2257,13 @@ bs_BA: username_placeholder: "korisničko ime" action: "Email pozivnica" help: "pošalji pozivnicu svojim prijateljima tako da i oni mogu odgovoriti na ovu temu. Bey registracije." + discourse_connect_enabled: "Unesite korisničko ime osobe koju želite da pozovete u ovu temu." to_topic_blank: "Unesite korisničko ime ili e-mail adresu osobe koju želite da pozovete u ovu temu." to_topic_email: "Unijeli ste e-mail adresu. Poslat ćemo e-mailom pozivnicu koja će omogućiti vašem prijatelju da odmah odgovori na ovu temu." to_topic_username: "Unijeli ste korisničko ime. Na isto ćemo poslati obavještenje sa linkom pozivnice na ovu temu." to_username: "Unesite korisničko ime osobe koju želite pozvati. Poslati ćemo obavještenje sa linkom pozivnice na ovu temu." email_placeholder: "name@example.com" + success_email: "Poslali smo e-mailom pozivnicu ka %{invitee}. Obavjestiti ćemo vas kada pozivnica bude iskorištena. Provjerite tab pozivnica na vašoj profilnoj stranici kako bi ste upratili sve vaše pozivnice." success_username: "Pozvali smo tog korisnika da prisustvuje u ovoj temi." error: "Sorry, we couldn't invite that person. Perhaps they are already a user?" success_existing_email: "Korisnik sa emailom %{emailOrUsername} već postoji. Pozvali smo tog korisnika da se pridruži u raspravi na ovu temu." @@ -2295,6 +2366,7 @@ bs_BA: other: "(tema povučena od strane autora, automatski će biti obrisana u %{count} sati osim ako nije označena)" post: quote_reply: "Citiraj" + quote_share: "Dijeli" edit_reason: "Razlog: " post_number: "post %{number}" ignored: "Ignorisani sadržaj" @@ -2342,6 +2414,8 @@ bs_BA: image_upload_not_allowed_for_new_user: "Sorry, new users can not upload images." attachment_upload_not_allowed_for_new_user: "Sorry, new users can not upload attachments." attachment_download_requires_login: "Sorry, you need to be logged in to download attachments." + cancel_composer: + discard: "Odbaci" via_email: "this post arrived via email" via_auto_generated_email: "ova objava je došla preko automatski generisanog email-a" whisper: "ova objava je privatni šapat za moderatore " @@ -2509,6 +2583,11 @@ bs_BA: change_in_category_topic: "Edit Description" already_used: "This color has been used by another category" security: "Security" + permissions: + group: "Grupa" + see: "Vidi" + reply: "Odgovori" + create: "napravi" special_warning: "Upozorenje: Ova kategorija je pre-seeded kategorija i sigurnosne postavke se ne mogu uređivati. Ako ne želite koristiti ovu kategoriju, izbrišite je umjesto da je prenamijenite." images: "Images" email_in: "Custom incoming email address:" @@ -2584,6 +2663,14 @@ bs_BA: flagging: title: "Zašto prijavljujete ovaj post?" action: "Prijavi objavu" + take_action_options: + default: + title: "Poduzmi Akciju" + details: "Dođite odmah do praga za oznake, umjesto da čekate još oznaka od zajednice." + suspend: + title: "Suspend User" + silence: + title: "Stišaj korisnika" notify_action: "Privatna Poruka" official_warning: "Oficonalno upozorenje" delete_spammer: "Obriši Spamera" @@ -3012,6 +3099,10 @@ bs_BA: safe_mode: enabled: "Bezbedan režim je omogućen, da biste izašli iz bezbednog režima, zatvorite ovaj prozor pregledača" image_removed: "(slika uklonjena)" + do_not_disturb: + remaining: "%{remaining} preostalo" + options: + custom: "Custom" admin_js: type_to_filter: "kucaj da sortiraš..." admin: @@ -3039,6 +3130,8 @@ bs_BA: installed_version: "Installed" latest_version: "Zadnje" problems_found: "Neki saveti na osnovu vaših trenutnih postavki sajta" + new_features: + dismiss: "Odpusti" last_checked: "Zadnje pogledani" refresh_problems: "Osvježi" no_problems: "No problems were found." @@ -3196,9 +3289,11 @@ bs_BA: all_api_keys: Svi API ključevi user_mode: Korisnički nivo impersonate_all_users: Impersonaliziraj bilo kojeg korisnika + single_user: "Jedan korisnik" save: Sačuvaj continue: Nastavi scopes: + action: Djelo descriptions: users: bookmarks: Poredak korisničkih zabilješki. Ispostavlja podsjetnike za zabilješke koristeći ICS format. @@ -3824,6 +3919,7 @@ bs_BA: censor: "Censor" require_approval: "Zahtjeva Dozvolu" flag: "Prijava" + replace: "Zamijeni" action_descriptions: block: "Spriječite postavljanje postova koji sadrže ove riječi. Korisnik će vidjeti poruku o pogrešci kada pokuša da pošalje svoj post." censor: "Dopustite poruke koje sadrže te riječi, ali ih zamijenite znakovima koji kriju cenzurirane riječi." @@ -3879,6 +3975,8 @@ bs_BA: check_email: title: "Reveal this user's email address" text: "Show" + check_sso: + text: "Show" user: suspend_failed: "Something went wrong suspending this user %{error}" unsuspend_failed: "Something went wrong unsuspending this user %{error}" @@ -3886,6 +3984,7 @@ bs_BA: suspend_reason_label: "Why are you suspending? This text will be visible to everyone on this user's profile page, and will be shown to the user when they try to log in. Keep it short." suspend_reason_hidden_label: "Zašto suspendirate? Ovaj tekst će biti prikazan korisniku kada se pokušaju prijaviti." suspend_reason: "Reason" + suspend_reason_title: "Razlog suspenzije" suspend_message: "Email Message" suspend_message_placeholder: "Opciono, pružite više informacija o suspenziji i on će biti poslan e-poštom korisniku." suspended_by: "Suspended by" @@ -4035,6 +4134,12 @@ bs_BA: on_grace_period: "Currently in promotion grace period, will not be demoted." locked_will_not_be_promoted: "Trust level locked. Will never be promoted." locked_will_not_be_demoted: "Trust level locked. Will never be demoted." + discourse_connect: + external_id: "External ID" + external_username: "Ime" + external_name: "Ime" + external_email: "Email" + external_avatar_url: "Avatar URL" user_fields: title: "User Fields" help: "Add fields that your users can fill out." @@ -4226,8 +4331,12 @@ bs_BA: add_host: "Dodaj host" settings: "Postavke ugrađivanja" crawling_settings: "Postavke Crawlera" + embed_post_limit: "Maximum number of posts to embed" embed_title_scrubber: "Regular expression korišten za čistku naslova objava" embed_truncate: "Skrati embedovane objave" + allowed_embed_selectors: "CSS selector za elemente koji su dozvoljeni u embeds" + blocked_embed_selectors: "CSS selector za elemente koji su odstranjeni sa embeds" + allowed_embed_classnames: "Dopuštena CSS class imena" save: "Sačuvaj Embedding postavke" permalink: title: "Permalink-ovi" diff --git a/config/locales/client.ca.yml b/config/locales/client.ca.yml index 571edbc959a18..4eae0af18bfbd 100644 --- a/config/locales/client.ca.yml +++ b/config/locales/client.ca.yml @@ -157,6 +157,8 @@ ca: topic_admin_menu: "accions del tema" wizard_required: "Us donem la benvinguda al vostre nou Discourse! Comencem amb l'assistent de configuració ✨" emails_are_disabled: "Tots els correus sortints han estat globalment inhabilitats per un administrador. No s'enviarà cap notificació de cap mena per correu electrònic." + software_update_prompt: + dismiss: "Descarta-ho" bootstrap_mode_disabled: "El mode d'arrencada serà desactivat d'aquí a 24 hores." themes: default_description: "Per defecte" @@ -217,6 +219,9 @@ ca: now: "ara mateix" read_more: "llegeix més" more: "Més" + x_more: + one: "%{count} Més" + other: "%{count} Més" less: "Menys" never: "mai" every_30_minutes: "cada 30 minuts" @@ -265,6 +270,7 @@ ca: remove: "Elimina preferit" confirm_clear: "Esteu segur que voleu eliminar tots els preferits d'aquest tema?" save: "Desa" + no_user_bookmarks: "No teniu publicacions en els preferits. Els preferits us permeten referir-vos fàcilment a publicacions específiques. " auto_delete_preference: never: "Mai" when_reminder_sent: "Una vegada enviat el recordatori" @@ -381,6 +387,7 @@ ca: topic: "Tema:" filtered_topic: "Heu filtrat a contingut revisable en un sol tema." filtered_user: "Usuari" + filtered_reviewed_by: "Revisat per" show_all_topics: "mostra tots els temes" deleted_post: "(publicació suprimida)" deleted_user: "(usuari suprimit)" @@ -391,6 +398,7 @@ ca: email: "Correu electrònic" name: "Nom" fields: "Camps" + reject_reason: "Motiu" user_percentage: agreed: one: "El %{count}% hi està d'acord" @@ -434,6 +442,7 @@ ca: created_at_asc: "Creat (invers)" priority: title: "Prioritat mínima" + any: "(qualsevol)" low: "Baixa" medium: "Mitjana" high: "Alta" @@ -472,6 +481,8 @@ ca: title: "Publicació en cua" reviewable_user: title: "Usuari" + reviewable_post: + title: "Publicació" approval: title: "Cal aprovar la publicació" description: "Hem rebut la vostra nova publicació, però cal que sigui aprovada per un moderador abans d'aparèixer publicada. Tingueu una mica de paciència." @@ -479,6 +490,21 @@ ca: one: "Teniu %{count} publicació pendent." other: "Teniu %{count} publicacions pendents." ok: "D'acord" + example_username: "nom d'usuari" + relative_time_picker: + days: + one: "dia" + other: "dies" + time_shortcut: + later_today: "Més tard avui" + next_business_day: "El pròxim dia feiner" + tomorrow: "Demà" + next_week: "La setmana que ve" + later_this_week: "Més avant aquesta setmana" + start_of_next_business_week: "Dilluns" + start_of_next_business_week_alt: "Dilluns vinent" + next_month: "El mes que ve" + custom: "Data i hora personalitzades" user_action: user_posted_topic: "%{user} ha publicat el tema" you_posted_topic: "Vós heu publicat el tema" @@ -494,6 +520,7 @@ ca: sent_by_user: "Enviat per %{user}" sent_by_you: "Enviat per vós" directory: + username: "Nom d'usuari" filter_name: "filtra per usuari" title: "Usuaris" likes_given: "Lliurat" @@ -563,11 +590,17 @@ ca: imap_ssl: "Utilitza SSL per a SMTP" username: "Nom d'usuari" password: "Contrasenya" + settings: + title: "Configuració" mailboxes: disabled: "desactivat" membership: title: Membres access: Accés + categories: + title: Categories + tags: + title: Etiquetes logs: title: "Registres" when: "Quan" @@ -578,6 +611,8 @@ ca: details: "Detalls" from: "De" to: "A" + permissions: + title: "Permisos" public_admission: "Permet als usuaris d'unir-se al grup lliurement (cal que el grup sigui visible públicament)" public_exit: "Permet que els usuaris abandonin el grup lliurement" empty: @@ -712,6 +747,9 @@ ca: topic_sentence: one: "%{count} tema" other: "%{count} temes" + topic_stat_unit: + week: "setmana" + month: "mes" topic_stat_sentence_week: one: "%{count} tema nou la setmana passada." other: "%{count} temes nous la setmana passada. " @@ -769,7 +807,12 @@ ca: mute_option_title: "No rebreu cap notificació relacionada amb aquest usuari." normal_option: "Normal" normal_option_title: "Sereu notificat si l'usuari us respon, us cita o us menciona." + notification_schedule: + none: "Cap" + monday: "Dilluns" + to: "a" activity_stream: "Activitat" + read: "Llegit" preferences: "Preferències" feature_topic_on_profile: save: "Desa" @@ -897,6 +940,7 @@ ca: tags: "Etiquetes" preferences_nav: account: "Compte" + security: "Seguretat" profile: "Perfil" emails: "Correus" notifications: "Notificacions" @@ -1130,6 +1174,11 @@ ca: pending_tab_with_count: "Pendents (%{count})" redeemed_tab: "Acceptada" redeemed_tab_with_count: "Acceptades (%{count})" + invited_via: "Invitació" + groups: "Grups" + topic: "Tema" + edit: "Edita" + remove: "Elimina" reinvited: "Invitació reenviada" search: "escriu aquí per a cercar invitacions..." user: "Usuari convidat" @@ -1143,6 +1192,8 @@ ca: topics_entered: "Temes vists" posts_read_count: "Publicacions llegides" expired: "Aquesta invitació ha caducat." + removed_all: "Totes les invitacions expirades eliminades!" + remove_all_confirm: "Esteu segur que voleu eliminar totes les invitacions expirades?" reinvite_all_confirm: "Esteu segur que voleu reenviar totes les invitacions?" time_read: "Temps de lectura" days_visited: "Dies visitats" @@ -1293,6 +1344,7 @@ ca: disable: "Mostra publicacions suprimides" private_message_info: title: "Missatge" + add: "Afegeix..." leave_message: "Realment voleu deixar aquest missatge?" remove_allowed_user: "De debò voleu eliminar %{name} d'aquest missatge?" remove_allowed_group: "De debò voleu eliminar %{name} d'aquest missatge?" @@ -1304,6 +1356,7 @@ ca: trust_level: "Nivell de confiança" search_hint: "nom d'usuari, adreça electrònica o adreça IP" create_account: + header_title: "Benvingut!" disclaimer: "Registrant-vos, accepteu la política de privacitat i les condicions del servei." failed: "Alguna cosa ha anat malament. Potser aquest correu electrònic ja ha estat registrat; proveu-ho amb l'enllaç de contrasenya oblidada" forgot_password: @@ -1531,6 +1584,7 @@ ca: link_dialog_title: "Insereix un enllaç" link_optional_text: "títol opcional" link_url_placeholder: "Enganxeu un URL o escriviu per a cercar temes" + blockquote_title: "Bloc de citació" blockquote_text: "Bloc de citació" code_title: "Text preformatat" code_text: "Text amb sagnat preformatat de 4 espais" @@ -1579,6 +1633,7 @@ ca: toggle_topic_bump: label: "Commuta l'elevació del tema" desc: "Respon sense canviar la data més recent de resposta" + ignore: "Ignora" notifications: tooltip: regular: @@ -1618,6 +1673,8 @@ ca: topic_reminder: "%{username} %{description}" watching_first_post: "Tema nou %{description}" membership_request_accepted: "Membre acceptat en '%{group_name}'" + reaction: "%{username} %{description}" + reaction_2: "%{username}, %{username2} %{description}" group_message_summary: one: "%{count} missatge en la vostra bústia de %{group_name}" other: "%{count} missatges en la vostra bústia de %{group_name}" @@ -1689,6 +1746,7 @@ ca: or_search_google: "O proveu de cercar amb Google:" search_google: "Prova de cercar amb Google:" search_google_button: "Google" + search_button: "Cerca" context: user: "Cerca publicacions de @%{username}" category: "Cerca en la categoria #%{category} " @@ -1731,10 +1789,14 @@ ca: noreplies: tenen zero respostes single_user: contenen un únic usuari post: + count: + label: Publicacions time: label: Publicat before: abans de after: després de + views: + label: Vistes hamburger_menu: "vés a una altra llista de temes o categories" new_item: "nous" go_back: "vés enrere" @@ -1760,6 +1822,7 @@ ca: change_category: "Defineix categoria" close_topics: "Tanca temes" archive_topics: "Arxiva temes" + move_messages_to_inbox: "Mou a la safata d'entrada" notification_level: "Notificacions" choose_new_category: "Seleccioneu la categoria nova per als temes:" selected: @@ -1785,6 +1848,7 @@ ca: new: "No hi ha més temes nous." unread: "No hi ha més temes no llegits. " category: "No hi ha més temes de %{category}." + tag: "No hi ha més temes de %{tag}." top: "No hi ha més temes destacats." bookmarks: "No hi ha més temes marcats com a preferits." topic: @@ -1851,6 +1915,9 @@ ca: jump_reply_up: salta a la resposta anterior jump_reply_down: salta a la resposta posterior deleted: "El tema ha estat suprimit" + slow_mode_update: + save: "Activa" + remove: "Desactiva" topic_status_update: title: "Temporitzador de tema" save: "Estableix el temporitzador" @@ -1892,6 +1959,7 @@ ca: auto_open: "Aquest tema s'obrirà automàticament %{timeLeft}" auto_close: "El tema es tancarà automàticament %{timeLeft}." auto_publish_to_category: "Aquest tema serà publicat en #%{categoryName}%{timeLeft}" + auto_close_after_last_post: "Aquest tema es tancarà %{duration} després de la darrera resposta." auto_delete: "Aquest tema serà suprimit automàticament %{timeLeft}" auto_bump: "Aquest tema serà elevat automàticament %{timeLeft}." auto_reminder: "Rebreu un recordatori sobre aquest tema %{timeLeft}" @@ -1993,6 +2061,7 @@ ca: title: "Comparteix" extended_title: "Comparteix un enllaç" help: "comparteix un enllaç a aquest tema" + invite_users: "Convida" print: title: "Imprimeix" help: "Obre una versió imprimible d'aquest tema" @@ -2044,11 +2113,13 @@ ca: username_placeholder: "nom d'usuari" action: "Envia la invitació" help: "Convida altres a aquest tema per correu o amb notificacions." + discourse_connect_enabled: "Introduïu el nom d'usuari de la persona a qui voleu convidar a aquest tema." to_topic_blank: "Escriviu el nom d'usuari o l'adreça electrònica de la persona a qui voleu convidar a aquest tema." to_topic_email: "Heu introduït una adreça de correu electrònic. Us enviarem una invitació que permetrà al vostre contacte respondre immediatament a aquest tema." to_topic_username: "Heu introduït un nom d'usuari. Li enviarem una notificació amb l'enllaç d'invitació a aquest tema." to_username: "Introduïu el nom d'usuari de la persona a qui voleu convidar. Li enviarem una notificació amb l'enllaç d'invitació a aquest tema." email_placeholder: "nom@exemple.com" + success_email: "Hem enviat una invitació a %{invitee}. Us notificarem quan s'accepti. Consulteu la pestanya d'invitacions de la vostra pàgina personal per a mantenir el seguiment de les invitacions." success_username: "Hem convidat aquest usuari a participar en aquest tema." error: "No hem pogut convidar aquesta persona. Potser ja ha estat convidada. (Les invitacions són restringides per freqüència.)" success_existing_email: "Ja existeix un usuari amb l'adreça %{emailOrUsername}. Hem convidat aquest usuari a participar en aquest tema." @@ -2143,6 +2214,7 @@ ca: other: "(tema abandonat per l'autor, serà suprimit automàticament en %{count} hores llevat que sigui senyalat amb bandera)" post: quote_reply: "Cita" + quote_share: "Comparteix" edit_reason: "Motiu:" post_number: "publicació %{number}" ignored: "Contingut ignorat" @@ -2185,6 +2257,8 @@ ca: image_upload_not_allowed_for_new_user: "Els usuaris nous no poden pujar imatges." attachment_upload_not_allowed_for_new_user: "Els usuaris nous no poden adjuntar fitxers." attachment_download_requires_login: "Heu d'iniciar la sessió per a descarregar fitxers adjunts." + cancel_composer: + discard: "Descarta" via_email: "aquesta publicació ha arribat per correu electrònic" via_auto_generated_email: "aquesta publicació ha arribat per correu electrònic generat automàticament" whisper: "aquesta publicació és un xiuxiueig privat per a moderadors" @@ -2339,6 +2413,11 @@ ca: change_in_category_topic: "Edita la descripció" already_used: "Aquest color ha estat utilitzat per una altra categoria" security: "Seguretat" + permissions: + group: "Grup" + see: "Mira" + reply: "Respon" + create: "Crea" special_warning: "Atenció: aquesta és una categoria preconfigurada i no se'n pot editar la configuració de seguretat. Si no voleu fer servir aquesta categoria, suprimiu-la en comptes de reutilitzar-la." uncategorized_security_warning: "Aquesta categoria és especial. Es tracta d'una àrea de manteniment per a temes que no tenen cap categoria; no pot tenir configuració de seguretat." uncategorized_general_warning: 'Aquesta categoria és especial. S''utilitza com a categoria per defecte per a temes nous que no tinguin una categoria seleccionada. Si voleu evitar aquest comportament i forçar la selecció de categories, desactiveu la configuració aquí. Si voleu canviar el nom o la descripció, aneu a Personalitza / Contingut de text .' @@ -2418,6 +2497,14 @@ ca: flagging: title: "Gràcies per ajudar a mantenir endreçada la comunitat!" action: "Marca la publicació amb bandera " + take_action_options: + default: + title: "Actua" + details: "Arriba al límit de banderes immediatament, més que no pas esperar més banderes de la comunitat" + suspend: + title: "Suspèn l'usuari" + silence: + title: "Usuari silenciat" notify_action: "Missatge" official_warning: "Avís oficial" delete_spammer: "Suprimeix generador de brossa" @@ -2778,6 +2865,10 @@ ca: dismiss: "Descarta-ho" safe_mode: enabled: "El mode segur està activat. Per a sortir-ne tanqueu aquesta finestra del navegador." + do_not_disturb: + remaining: "%{remaining} restant" + options: + custom: "Personalitzat" admin_js: type_to_filter: "escriu per a filtrar..." admin: @@ -2805,6 +2896,8 @@ ca: installed_version: "Instal·lat" latest_version: "Més recents" problems_found: "Uns quants consells basats en la configuració actual del lloc web." + new_features: + dismiss: "Descarta-ho" last_checked: "Comprovat per darrera vegada" refresh_problems: "Actualitza" no_problems: "No s'han trobat problemes." @@ -2857,6 +2950,9 @@ ca: view_table: "taula" view_graph: "gràfica" refresh_report: "Actualitza el report" + daily: Diàriament + monthly: Mensualment + weekly: Setmanalment groups: "Tots els grups" disabled: "Aquest report és desactivat." totals_for_sample: "Totals per mostra" @@ -2961,6 +3057,8 @@ ca: new_key: Nova clau d’API revoked: Revocat continue: Continua + scopes: + action: Acció web_hooks: title: "Webhooks" none: "Ara no hi ha webhooks." @@ -3589,6 +3687,7 @@ ca: censor: "Censura" require_approval: "Requereix aprovació" flag: "Bandera" + replace: "Reemplaça" action_descriptions: block: "Impedeix que es publiquin texts que continguin aquestes paraules. L'usuari veurà un missatge d'error quan intenti enviar la publicació. " censor: "Permet publicacions que contenen aquestes paraules, però reemplaça-les amb caràcters que amaguin les paraules censurades." @@ -3648,6 +3747,8 @@ ca: check_email: title: "Mostra l'adreça de correu d'aquest usuari" text: "Mostra" + check_sso: + text: "Mostra" user: suspend_failed: "Ha fallat alguna cosa en suspendre aquest usuari: %{error}" unsuspend_failed: "Alguna cosa ha fallat en desfer la suspensió de l'usuari %{error}" @@ -3655,6 +3756,7 @@ ca: suspend_reason_label: "Per què suspeneu aquest usuari? Aquest text serà visible per a tothom en el perfil de l'usuari, i es mostrarà a l'usuari quan vulgui iniciar la sessió. Sigueu breu." suspend_reason_hidden_label: "Per què suspeneu aquest usuari? Aquest text es mostrarà a l'usuari quan intenti iniciar la sessió. Sigueu breu. " suspend_reason: "Motiu" + suspend_reason_title: "Raó de la suspensió" suspend_message: "Missatge de correu" suspend_message_placeholder: "Opcionalment, doneu més informació sobre la suspensió i s'enviarà per correu a l'usuari." suspended_by: "Suspès per" @@ -3810,6 +3912,12 @@ ca: on_grace_period: "Actualment en període de gràcia de promoció. No serà degradat. " locked_will_not_be_promoted: "Nivell de confiança blocat. No serà promogut mai. " locked_will_not_be_demoted: "Nivell de confiança blocat. No es degradarà mai." + discourse_connect: + external_id: "ID extern" + external_username: "Nom d'usuari" + external_name: "Nom" + external_email: "Correu electrònic" + external_avatar_url: "URL de la imatge de perfil" user_fields: title: "Camps d'usuari" help: "Afegeix camps que els usuaris poden emplenar." @@ -4008,6 +4116,9 @@ ca: embed_post_limit: "Nombre màxim de publicacions que s'incrusten " embed_title_scrubber: "Expressió regular emprada per a depurar el títol de les publicacions" embed_truncate: "Trunca les publicacions incrustades" + allowed_embed_selectors: "Selector de CSS per a elements permesos en les incrustacions" + blocked_embed_selectors: "Selector de CSS per a elements que han estat eliminats de les incrustacions" + allowed_embed_classnames: "Noms permesos de classes de CSS" save: "Desa la configuració d'incrustacions" permalink: title: "Enllaços permanents" diff --git a/config/locales/client.cs.yml b/config/locales/client.cs.yml index 6da7d1f507ce5..e30634ffe2775 100644 --- a/config/locales/client.cs.yml +++ b/config/locales/client.cs.yml @@ -197,6 +197,13 @@ cs: topic_admin_menu: "Akce tématu." wizard_required: "Vítejte ve vašem novém Discourse! Začněte s nastavením pomocí průvodce ✨" emails_are_disabled: "Všechny odchozí emaily byly administrátorem vypnuty. Žádné odchozí emaily nebudou odeslány." + software_update_prompt: + dismiss: "Označit jako přečtené" + bootstrap_mode_enabled: + one: "Aby spuštění vaší webové stránky bylo jednodušší, tak se nachází v bootstrap režimu. Všichni noví uživatelé dostanou vernostní úroveň 1 a mohou mít zapnuté denní emailové shrnutí. Toto se automaticky vypne, když %{count} uživatelů se připojí." + few: "Aby se váš web jednodušeji rozjel, nachází se v režimu bootstrap. Všichni noví uživatelé začínají s důveryhodností 1 a mají povolené denní odesílání souhrnných emailů. Tento režim se automaticky vypne, jakmile se zaregistruje alespoň %{count} uživatelů." + many: "Aby se váš web jednodušeji rozjel, nachází se v režimu bootstrap. Všichni noví uživatelé začínají s důveryhodností 1 a mají povolené denní odesílání souhrnných emailů. Tento režim se automaticky vypne, jakmile se zaregistruje alespoň %{count} uživatelů." + other: "Aby se váš web jednodušeji rozjel, nachází se v režimu bootstrap. Všichni noví uživatelé začínají s důveryhodností 1 a mají povolené denní odesílání souhrnných emailů. Tento režim se automaticky vypne, jakmile se zaregistruje alespoň %{count} uživatelů." bootstrap_mode_disabled: "Režim bootstrap bude deaktivován v následujících 24 hodinách." themes: default_description: "Výchozí" @@ -260,6 +267,11 @@ cs: now: "právě teď" read_more: "číst dále" more: "Více" + x_more: + one: "%{count} Více" + few: "%{count} další" + many: "%{count} Více" + other: "%{count} Více" less: "Méně" never: "nikdy" every_30_minutes: "každých 30 minut" @@ -394,10 +406,12 @@ cs: moderation_history: "Historie moderování" topic: "Téma:" filtered_user: "Uživatel" + filtered_reviewed_by: "Zkontroloval" user: username: "Uživatelské jméno" email: "Email" name: "Jméno" + reject_reason: "Reason" topics: topic: "Témata" deleted: "[Téma smazáno]" @@ -433,6 +447,7 @@ cs: created_at_asc: "Vytvořeno v (obráceně)" priority: title: "Minimální priorita" + any: "(libovolný)" medium: "Střední" high: "Vysoká" conversation: @@ -470,6 +485,8 @@ cs: title: "Příspěvek ve frontě" reviewable_user: title: "Uživatel" + reviewable_post: + title: "Příspěvek" approval: title: "Příspěvek potřebuje schválení" description: "Obdrželi jsme váš příspěvek, ale musí být před zveřejněním schválen moderátorem. Buďte trpěliví." @@ -479,6 +496,11 @@ cs: title: "Proč odmítáte tohoto uživatele?" send_email: "Odeslat e-mail o odmítnutí" relative_time_picker: + days: + one: "den" + few: "dní" + many: "dní" + other: "dnů" relative: "Relativní" time_shortcut: later_today: "Později dnes" @@ -488,6 +510,9 @@ cs: post_local_date: "Datum v příspěvku" later_this_week: "Později tento týden" start_of_next_business_week: "Pondělí" + start_of_next_business_week_alt: "Příští pondělí" + next_month: "Další měsíc" + custom: "Vlastní datum a čas" user_action: user_posted_topic: "%{user} zaslal téma" you_posted_topic: "Zaslal jste téma" @@ -503,6 +528,7 @@ cs: sent_by_user: "Posláno uživatelem %{user}" sent_by_you: "Posláno vámi" directory: + username: "Uživatelské jméno" filter_name: "Filtrovat podle uživatelského jména" title: "Uživatelé" likes_given: "Rozdáno" @@ -553,9 +579,15 @@ cs: credentials: username: "Uživatelské jméno" password: "Heslo" + settings: + title: "Nastavení" membership: title: Členství access: Přístup + categories: + title: Kategorie + tags: + title: Štítky logs: title: "Logy" when: "Když" @@ -789,7 +821,11 @@ cs: notification_schedule: title: "Harmonogram oznámení" label: "Povolit vlastní harmonogram oznámení" + none: "Žádná" + monday: "Pondělí" + to: "komu" activity_stream: "Aktivita" + read: "Přečteno" preferences: "Nastavení" feature_topic_on_profile: save: "Uložit" @@ -817,6 +853,9 @@ cs: dismiss_notifications: "Označit vše jako přečtené" dismiss_notifications_tooltip: "Označit všechny nepřečtené notifikace jako přečtené" first_notification: "Vaše první notifikace! Klikněte zde a začněte." + color_schemes: + undo: "obnovit výchozí" + regular: "Běžný" allow_private_messages: "Povolit ostatním uživatelům, aby mi mohli zasílat osobní zprávy" external_links_in_new_tab: "Otevírat všechny externí odkazy do nové záložky" enable_quoting: "Povolit odpověď s citací z označeného textu" @@ -860,6 +899,7 @@ cs: watched_first_post_tags_instructions: "Budete informováni o prvním novém příspěvku v každém novém tématu s těmito štítky." muted_categories: "Ztišené" muted_categories_instructions: "Nebudete upozorněni na nic o nových tématech v těchto kategoriích ty se neobjeví v přehledu kategorií či v aktuálních," + regular_categories: "Běžný" no_category_access: "Jako moderátor máte omezený přístup ke kategorii bez možnosti ukládat změny." delete_account: "Smazat můj účet" delete_account_confirm: "Jste si jisti, že chcete trvale odstranit svůj účet? Tuto akci nelze vrátit zpět!" @@ -1140,6 +1180,11 @@ cs: pending_tab_with_count: "Nevyřízeno (%{count})" redeemed_tab: "Uplatněno" redeemed_tab_with_count: "Vyřízeno (%{count})" + invited_via: "Pozvání" + groups: "Skupiny" + topic: "Témata" + edit: "Upravit" + remove: "Odstranit" reinvited: "Pozvánka byla opětovně odeslána." search: "pište pro hledání v pozvánkách..." user: "Pozvaný uživatel" @@ -1318,6 +1363,7 @@ cs: disable: "Zobrazit smazané příspěvky" private_message_info: title: "Zpráva" + add: "Přidat..." leave_message: "Opravdu chcete opustit tuto zprávu?" remove_allowed_user: "Určitě chcete odstranit %{name} z této zprávy?" remove_allowed_group: "Opravdu chcete odstranit %{name} z této zprávy?" @@ -1329,6 +1375,7 @@ cs: trust_level: "Důvěryhodnost" search_hint: "uživatelské jméno, email nebo IP adresa" create_account: + header_title: "Vítejte!" failed: "Něco se nepovedlo, možná je tato e-mailová adresa již použita. Zkuste použít formulář pro obnovení hesla." forgot_password: title: "Obnovení hesla" @@ -1529,6 +1576,7 @@ cs: link_description: "sem vložte popis odkazu" link_dialog_title: "Vložit odkaz" link_optional_text: "volitelný popis" + blockquote_title: "Bloková citace" blockquote_text: "Bloková citace" code_title: "Ukázka kódu" code_text: "odsadit předformátovaný text o 4 mezery" @@ -1576,6 +1624,7 @@ cs: toggle_topic_bump: label: "Přepnout zvýraznění tématu" desc: "Odpovědět bez ovlivnění data poslední odpovědi" + ignore: "ignorovat" notifications: tooltip: regular: @@ -1615,6 +1664,8 @@ cs: granted_badge: "Získáno '%{description}'" topic_reminder: "%{username} %{description}" watching_first_post: "Nové téma %{description}" + reaction: "%{username} %{description}" + reaction_2: "%{username}, %{username2} %{description}" group_message_summary: one: "%{count} zpráva ve schránce skupiny %{group_name}" few: "%{count} zprávy ve schránce skupiny %{group_name}" @@ -1670,6 +1721,7 @@ cs: or_search_google: "Nebo zkuste vyhledávat pomocí Google:" search_google: "Zkuste vyhledávat pomocí Google:" search_google_button: "Google" + search_button: "Vyhledat" context: user: "Vyhledat příspěvky od @%{username}" category: "Hledat v kategorii #%{category}" @@ -1711,10 +1763,14 @@ cs: noreplies: jsou bez odpovědi single_user: obsahují jen jednoho uživatele post: + count: + label: Příspěvky time: label: Přidáno before: před after: po + views: + label: Zobrazení hamburger_menu: "jít na jiný seznam témat nebo kategorii" new_item: "nové" go_back: "jít zpět" @@ -1740,6 +1796,7 @@ cs: change_category: "Nastavit kategorii" close_topics: "Zavřít téma" archive_topics: "Archivovat témata" + move_messages_to_inbox: "Přesunout do doručených" notification_level: "Upozornění" choose_new_category: "Zvolte novou kategorii pro témata:" selected: @@ -1767,6 +1824,7 @@ cs: new: "Nejsou tu žádná další nová témata k přečtení." unread: "Nejsou tu žádná další nepřečtená témata." category: "V kategorii %{category} nejsou žádná další témata." + tag: "V kategorii %{tag} nejsou žádná další témata." top: "Nejsou tu žádná další populární témata." bookmarks: "Žádná další oblíbená témata nejsou k dispozici." topic: @@ -1845,6 +1903,9 @@ cs: jump_reply_up: přejít na předchozí odpověď jump_reply_down: přejít na následující odpověď deleted: "Téma bylo smazáno" + slow_mode_update: + save: "Zapnout" + remove: "Vypnout" topic_status_update: title: "Časovač tématu" save: "Nastavit časovač " @@ -1852,6 +1913,7 @@ cs: remove: "Odstranit časovač" publish_to: "Publikovat v:" when: "Když:" + time_frame_required: "Vyberte prosím časové období" auto_update_input: none: "Vyberte časové období" later_today: "Později během dnešního dne" @@ -1883,6 +1945,7 @@ cs: auto_open: "Toto téma se automaticky otevře %{timeLeft}." auto_close: "Toto téma se automaticky zavře %{timeLeft}." auto_publish_to_category: "Toto téma bude zveřejněno v %{categoryName}%{timeLeft}# ." + auto_close_after_last_post: "Toto téma se zavře %{duration} po poslední odpovědi." auto_delete: "Toto téma bude automaticky smazáno %{timeLeft}." auto_reminder: "Toto téma ti připomeneme %{timeLeft}." auto_close_title: "Nastavení automatického zavření" @@ -1902,6 +1965,7 @@ cs: go: "go" jump_bottom: "na poslední příspěvek" jump_prompt: "přejít na..." + jump_prompt_long: "Přejít na..." jump_bottom_with_number: "Skočit na příspěvěk %{post_number}" jump_prompt_to_date: "do data" jump_prompt_or: "nebo" @@ -1983,6 +2047,7 @@ cs: share: title: "Sdílet" help: "sdílet odkaz na toto téma" + invite_users: "Pozvat" print: title: "Tisk" help: "Otevři verzi tématu určenou k tisku" @@ -2035,11 +2100,13 @@ cs: username_placeholder: "uživatelské jméno" action: "Poslat pozvánku" help: "pozval ostatní do tohoto tématu pomocí emailu nebo notifikací" + discourse_connect_enabled: "Zadej uživatelské jméno člověka, kterého chceš pozvat do tohoto tématu." to_topic_blank: "Zadej uživatelské jméno a email člověka, kterého chceš pozvat do tohoto tématu." to_topic_email: "Zadal jste emailovou adresu. Pošleme na ni pozvánku, s jejíž pomocí bude moci váš kamarád ihned odpovědět do tohoto tématu." to_topic_username: "Zadali jste uživatelské jméno. Zašleme pozvánku s odkazem do tohoto tématu." to_username: "Zadejte uživatelské jméno člověka, kterého chcete pozvat. Zašleme pozvánku s odkazem do tohoto tématu." email_placeholder: "jmeno@priklad.cz" + success_email: "Zaslali jsme pozvánku na %{invitee}. Upozorníme vás až bude pozvánka použita. Své pozvánky můžete sledovat v tabulce pozvánek na svém uživatelském profilu." success_username: "Pozvali jsme zadaného uživatele, aby se zúčastnil tématu." error: "Bohužel se nepodařilo pozvat tuto osobu. Možná už byla pozvána? (Počet opakovaných pozvánek je omezen)." success_existing_email: "Uživatel s e-mailem%{emailOrUsername} již existuje. Pozvali jsme ho, aby se zúčastnil tohoto tématu." @@ -2120,6 +2187,7 @@ cs: other: "Máte označeno %{count} příspěvků." post: quote_reply: "Cituj" + quote_share: "Sdílet" edit_reason: "Důvod: " post_number: "příspěvek č. %{number}" reply_as_new_topic: "Odpovědět v propojeném tématu" @@ -2166,6 +2234,8 @@ cs: image_upload_not_allowed_for_new_user: "Bohužel, noví uživatelé nemohou nahrávat obrázky." attachment_upload_not_allowed_for_new_user: "Bohužel, noví uživatelé nemohou nahrávat přílohy." attachment_download_requires_login: "Omlouváme se, ale pro stáhnutí přílohy musíte být přihlášen." + cancel_composer: + discard: "Zahodit" via_email: "tento příspěvek byl přijat přes email" via_auto_generated_email: "tento příspěvek byl přijat přes automaticky generovaný email" whisper: "tento příspěvek je soukromé šeptání pro moderátory" @@ -2218,6 +2288,11 @@ cs: delete_topic: "smazat téma" actions: people: + like: + one: "se líbí" + few: "se líbí" + many: "se líbí" + other: "se líbí" like_capped: one: "a jednomu dalšímu se to líbí" few: "a %{count} dalším se to líbí" @@ -2314,6 +2389,11 @@ cs: change_in_category_topic: "navštivte téma kategorie pro editaci jejího popisu" already_used: "Tato barva je již použita jinou kategorií" security: "Zabezpečení" + permissions: + group: "Skupina" + see: "Prohlížet" + reply: "Odpovědět" + create: "Vytvořit" special_warning: "Varování: Tato kategorie je přednastavená a její nastavení bezpečnosti nelze změnit. Pokud tuto kategorii nechcete používat, tak ji smažte a nesnažte se ji měnit." images: "Obrázky" email_in: "Vlastní příchozí emailová adresa:" @@ -2358,6 +2438,7 @@ cs: options: normal: "Normální" ignore: "ignorovat" + high: "Vysoká" sort_options: default: "výchozí" likes: "Líbí se" @@ -2381,6 +2462,14 @@ cs: flagging: title: "Děkujeme, že pomáháte udržovat komunitu zdvořilou!" action: "Nahlásit příspěvek" + take_action_options: + default: + title: "Zakročit" + details: "Ihned dosáhni vlaječky prahu, než aby jsi čekal na více komunitních vlaječek" + suspend: + title: "Suspend User" + silence: + title: "ztišit uživatele" notify_action: "Zpráva" official_warning: "Oficiální varování" delete_spammer: "Odstranit spamera" @@ -2575,6 +2664,7 @@ cs: readonly: "Prohlížet" lightbox: download: "stáhnout" + counter: "%curr% z %total%" keyboard_shortcuts_help: title: "Klávesové zkratky" jump_to: @@ -2753,6 +2843,10 @@ cs: dismiss: "Označit jako přečtené" safe_mode: enabled: "Bezpečný režim je povolený, k jeho zakázání zavři toto okno prohlížeče" + do_not_disturb: + remaining: "%{remaining} zbývá" + options: + custom: "Přizpůsobené" admin_js: type_to_filter: "text pro filtrování..." admin: @@ -2776,6 +2870,8 @@ cs: version_check_pending: "Že tys nedávno provedl aktualizaci. Báječné!" installed_version: "Nainstalováno" latest_version: "Poslední verze" + new_features: + dismiss: "Označit jako přečtené" last_checked: "Naposledy zkontrolováno" refresh_problems: "Obnovit" no_problems: "Nenalezeny žádné problémy." @@ -2808,6 +2904,9 @@ cs: view_table: "tabulka" view_graph: "graf" refresh_report: "Obnovit hlášení" + daily: Denně + monthly: Měsíčně + weekly: Týdně groups: "Všechny skupiny" filters: group: @@ -2877,6 +2976,8 @@ cs: description: Popis save: Uložit continue: Pokračovat + scopes: + action: Akce web_hooks: title: "Webhooks" none: "Právě tu nejsou žádné webhooks." @@ -3092,6 +3193,7 @@ cs: install_popular: "Populární" about_theme: "O fóru" license: "Licence" + version: "Verze Discourse:" enable: "Zapnout" disable: "Vypnout" update_to_latest: "Aktualizovat na nejnovější" @@ -3420,6 +3522,8 @@ cs: check_email: title: "Odhal emailovou adresu tohoto uživatele" text: "Zobrazit" + check_sso: + text: "Zobrazit" user: suspend_failed: "Nastala chyba při zakazování uživatele %{error}" unsuspend_failed: "Nastala chyba při povolování uživatele %{error}" @@ -3427,6 +3531,7 @@ cs: suspend_reason_label: "Why are you suspending? This text will be visible to everyone on this user's profile page, and will be shown to the user when they try to log in. Keep it short." suspend_reason_hidden_label: "Důvod zablokování? Tento text se zobrazí uživateli ve chvíli, kdy se pokusí přihlásit. Udržuj ho krátký." suspend_reason: "Reason" + suspend_reason_title: "Důvod vyloučení" suspend_message: "e-mailová zpráva" suspend_message_placeholder: "Případě poskytněte více informací o pozastavení, které budou poslány na uživatelův email." suspended_by: "Suspended by" @@ -3579,6 +3684,12 @@ cs: on_grace_period: "Currently in promotion grace period, will not be demoted." locked_will_not_be_promoted: "Úroveň důvěryhodnosti uzamčena. Nikdy nebude povýšen." locked_will_not_be_demoted: "Úroveň důvěryhodnosti uzamčena. Nikdy nebude degradován." + discourse_connect: + external_id: "Externí ID" + external_username: "Uživatelské jméno" + external_name: "Jméno" + external_email: "Email" + external_avatar_url: "URL na profilový obrázek" user_fields: title: "User Fields" help: "Přidej fields, které tvoji uživatelé mohou vyplnit." @@ -3761,6 +3872,9 @@ cs: embed_post_limit: "Maximální počet příspěvků k zabudování" embed_title_scrubber: "Běžný výraz užívaný k vyčištění názvů příspěvků" embed_truncate: "Useknout zabudované příspěvky" + allowed_embed_selectors: "Volba CSS pro prvky, které jsou povoleny ve vložení." + blocked_embed_selectors: "Volba CSS pro prvky, které jsou odstraněny z vložení." + allowed_embed_classnames: "Povolená jména CSS tříd" save: "Uložit nastavení zabudování" permalink: title: "Trvalé odkazy" diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml index 38e02c947b703..a4e653ed6c77d 100644 --- a/config/locales/client.da.yml +++ b/config/locales/client.da.yml @@ -160,6 +160,7 @@ da: emails_are_disabled: "Alle udgående emails er blevet globalt deaktiveret af en administrator. Ingen email notifikationer af nogen slags vil blive sendt." software_update_prompt: message: "Vi har opdateret dette websted, genindlæs venligst siden, ellers vil du kunne opleve uventet opførsel eller begrændset funktionalitet." + dismiss: "Ignorer Alle" bootstrap_mode_enabled: one: "For at gøre lanceringen af dit nye forum lettere er du i \"bootstrap-tilstand\". Alle nye brugere tildeles tillidsniveau 1 og har dagligt email resume aktiveret. Dette deaktiveres automatisk, når %{count} bruger er tilsluttet." other: "For at gøre lanceringen af dit nye forum lettere er du i bootstrap-tilstand. Alle nye brugere tildeles tillidsniveau 1 og har dagligt email resume aktiveret. Dette deaktiveres automatisk, når %{count} brugere er tilsluttet." @@ -2441,6 +2442,7 @@ da: title: "Del" extended_title: "Del et link" help: "del et link til dette emne" + invite_users: "Invitér" print: title: "Print" help: "Åbn en printervenlig udgave at emnet" @@ -4347,6 +4349,7 @@ da: require_approval: "Kræv godkendelse" flag: "Rapportér" replace: "Erstat" + tag: "Mærke" action_descriptions: block: "Undgå, at indlæg, der indeholder disse ord, bliver sendt. Brugeren vil se en fejlmeddelelse, når de prøver at indsende deres post." censor: "Tillad indlæg, der indeholder disse ord, men erstat dem med tegn, der skjuler de censurerede ord." diff --git a/config/locales/client.el.yml b/config/locales/client.el.yml index 98cf8b48f7aa2..6ee705e7668eb 100644 --- a/config/locales/client.el.yml +++ b/config/locales/client.el.yml @@ -158,6 +158,8 @@ el: topic_admin_menu: "ρυθμίσεις θέματος" wizard_required: "Καλώς ήλθατε στο νέο σας Discourse! Ας αρχίσουμε με τον οδηγό εγκατάστασης ✨" emails_are_disabled: "Όλα τα εξερχόμενα emails έχουν απενεργοποιηθεί καθολικά από κάποιον διαχειριστή. Δε θα σταλεί καμία ειδοποίηση email." + software_update_prompt: + dismiss: "Απόρριψη" bootstrap_mode_disabled: "Η λειτουργία bootstrap θα απενεργοποιηθεί εντός 24 ωρών." themes: default_description: "Προεπιλογή" @@ -218,6 +220,9 @@ el: now: "μόλις τώρα" read_more: "διαβάστε περισσότερα" more: "Περισσότερα" + x_more: + one: "%{count} Περισσότερο" + other: "%{count} Περισσότερο" less: "Λιγότερα" never: "ποτέ" every_30_minutes: "κάθε 30 λεπτά" @@ -390,6 +395,7 @@ el: topic: "Νήμα:" filtered_topic: "Έχετε φιλτράρει σε περιεχόμενο με δυνατότητα ελέγχου σε ένα μόνο θέμα." filtered_user: "Χρήστης" + filtered_reviewed_by: "Αναθεωρήθηκε από" show_all_topics: "εμφάνιση όλων των θεμάτων" deleted_post: "(η ανάρτηση διαγράφηκε)" deleted_user: "(ο χρήστης διαγράφηκε)" @@ -400,6 +406,7 @@ el: email: "Διεύθυνση Email" name: "Όνομα" fields: "Πεδία" + reject_reason: "Αιτία" user_percentage: agreed: one: "%{count} συμφωνεί" @@ -443,6 +450,7 @@ el: created_at_asc: "Δημιουργήθηκε στις (αντίστροφα)" priority: title: "Ελάχιστη προτεραιότητα" + any: "(οποιοδήποτε)" low: "Χαμηλή" medium: "Μεσαία" high: "Υψηλή" @@ -481,6 +489,8 @@ el: title: "Ανάρτηση σε ουρά" reviewable_user: title: "Χρήστης" + reviewable_post: + title: "Ανάρτηση" approval: title: "Απαιτείται Έγκριση Ανάρτησης" description: "Λάβαμε την ανάρτησή σου, αλλά πρέπει πρώτα να εγκριθεί από έναν συντονιστή πριν εμφανιστεί. Παρακαλώ περιμένετε." @@ -488,6 +498,21 @@ el: one: "Έχετε %{count} ανάρτηση σε εκκρεμότητα." other: "Έχετε %{count} αναρτήσεις σε εκκρεμότητα." ok: "OK" + example_username: "όνομα χρήστη" + relative_time_picker: + days: + one: "ημέρα" + other: "ημέρες" + time_shortcut: + later_today: "Αργότερα σήμερα" + next_business_day: "Επόμενη εργάσιμη ημέρα" + tomorrow: "Αύριο" + next_week: "Την άλλη εβδομάδα" + later_this_week: "Αργότερα αυτήν την εβδομάδα" + start_of_next_business_week: "Τη Δευτέρα" + start_of_next_business_week_alt: "Την επόμενη Δευτέρα" + next_month: "Τον άλλο μήνα" + custom: "Προσαρμοσμένη ημερομηνία και ώρα" user_action: user_posted_topic: "%{user} ανάρτησε το νήμα " you_posted_topic: "Ανάρτησες αυτό το νήμα" @@ -574,6 +599,8 @@ el: imap_ssl: "Χρήση SSL για SMTP" username: "Όνομα Χρήστη" password: "Κωδικός Πρόσβασης" + settings: + title: "Ρυθμίσεις" mailboxes: synchronized: "Συγχρονισμένο γραμματοκιβώτιο" none_found: "Δε βρέθηκαν γραμματοκιβώτια σε αυτόν τον λογαριασμό email." @@ -753,6 +780,9 @@ el: topic_sentence: one: "%{count} θέμα" other: "%{count} νήματα" + topic_stat_unit: + week: "εβδομάδα" + month: "μήνας" topic_stat_sentence_week: one: "%{count} νέο θέμα την περασμένη εβδομάδα." other: "%{count} νέα θέματα την περασμένη εβδομάδα." @@ -812,7 +842,12 @@ el: mute_option_title: "Δε θα λάβετε ειδοποιήσεις σχετικά με αυτόν τον χρήστη." normal_option: "Φυσιολογικά" normal_option_title: "Θα ειδοποιηθείτε εάν αυτός ο χρήστης σας απαντήσει, σας παραθέσει ή σας αναφέρει." + notification_schedule: + none: "Κανένα" + monday: "Τη Δευτέρα" + to: "προς" activity_stream: "Δραστηριότητα" + read: "Διαβασμένο" preferences: "Προτιμήσεις" feature_topic_on_profile: open_search: "Επιλέξτε ένα νέο θέμα" @@ -960,6 +995,7 @@ el: tags: "Ετικέτες" preferences_nav: account: "Λογαριασμός" + security: "Ασφάλεια" profile: "Προφίλ" emails: "Emails" notifications: "Ειδοποιήσεις" @@ -1212,6 +1248,12 @@ el: pending_tab_with_count: "Εκρεμείς (%{count})" redeemed_tab: "Αποδεκτές" redeemed_tab_with_count: "Αποδεκτές (%{count})" + invited_via: "Πρόσκληση" + groups: "Ομάδες" + topic: "Νήμα" + expires_at: "Λήγει" + edit: "Επεξεργασία" + remove: "Αφαίρεση" reinvited: "Η πρόσκληση στάλθηκε ξανά" search: "γράψε για να αναζητήσεις προσκλήσεις..." user: "Προσκεκλημένος Χρήστης" @@ -1225,6 +1267,9 @@ el: topics_entered: "Προβεβλημένα Νήματα" posts_read_count: "Διαβασμένες Αναρτήσεις" expired: "Αυτή η πρόσκληση έχει λήξει." + remove_all: "Αφαίρεση ληγμένων προσκλήσεων" + removed_all: "Όλες οι ληγμένες προσκλήσεις αφαιρέθηκαν!" + remove_all_confirm: "Είστε βέβαιοι ότι θέλετε να αφαιρέσετε όλες τις ληγμένες προσκλήσεις;" reinvite_all_confirm: "Σίγουρα θέλετε να στείλετε ξανά όλες τις προσκλήσεις;" time_read: "Χρόνος Ανάγνωσης" days_visited: "Μέρες Επίσκεψης" @@ -1380,6 +1425,7 @@ el: title: "Μήνυμα" invite: "Προσκαλέστε άλλους..." edit: "Προσθέστε ή αφαιρέστε..." + add: "Προσθήκη..." leave_message: "Σίγουρα θελετε να αφήσετε αυτό το μήνυμα;" remove_allowed_user: "Θέλεις σίγουρα να αφαιρέσεις τον/την %{name} από αυτή τη συζήτηση;" remove_allowed_group: "Θέλεις σίγουρα να αφαιρέσεις τον/την %{name} από αυτό το μήνυμα;" @@ -1642,6 +1688,7 @@ el: link_dialog_title: "Εισαγωγή Υπερσύνδεσμου" link_optional_text: "προαιρετικός τίτλος" link_url_placeholder: "Επικολλήστε μια διεύθυνση URL ή πληκτρολογήστε για να αναζητήσετε θέματα" + blockquote_title: "Blockquote" blockquote_text: "Blockquote" code_title: "Προ-διαμορφωμένο κείμενο" code_text: "το προ-διαμορφωμένο κείμενο να μπει σε εσοχή με 4 κενά" @@ -1696,6 +1743,7 @@ el: label: "Εναλλαγή ώθησης θέματος" desc: "Απάντηση χωρίς αλλαγή της τελευταίας ημερομηνίας απάντησης" reload: "Ανανέωση" + ignore: "Αγνόηση" notifications: tooltip: regular: @@ -1817,6 +1865,7 @@ el: or_search_google: "Ή προσπαθήστε να κάνετε αναζήτηση με το Google:" search_google: "Προσπαθήστε να κάνετε αναζήτηση με το Google:" search_google_button: "Google" + search_button: "Αναζήτηση" context: user: "Ψάξε στις αναρτήσεις του χρήστη @%{username}" category: "Αναζήτηση στην κατηγορία #%{category} " @@ -1867,6 +1916,8 @@ el: label: Αναρτήθηκε before: πριν after: μετά + views: + label: Προβολές hamburger_menu: "πήγαινε σε άλλη καταχώρηση νήματος ή κατηγορία" new_item: "καινούριο" go_back: "επιστροφή" @@ -1892,6 +1943,7 @@ el: change_category: "Θέσε Κατηγορία" close_topics: "Κλείσιμο Νημάτων" archive_topics: "Αρχειοθέτηση Νημάτων" + move_messages_to_inbox: "Μετακίνηση στα Εισερχόμενα" notification_level: "Ειδοποιήσεις" choose_new_category: "Διάλεξε νέα κατηγορία για τα νήματα:" selected: @@ -1994,9 +2046,20 @@ el: jump_reply_down: μετάβαση στην απάντηση που ακολουθεί deleted: "Το νήμα έχει διαγραφεί " slow_mode_update: + save: "Ενεργοποίηση" + remove: "Απενεργοποίηση" + hours: "ώρες:" durations: + 10_minutes: "10 Λεπτά" + 15_minutes: "15 Λεπτά" + 30_minutes: "30 Λεπτά" + 45_minutes: "45 Λεπτά" 1_hour: "1 ώρα" + 2_hours: "2 Ώρες" 4_hours: "4 ώρες" + 8_hours: "8 ώρες" + 12_hours: "12 ώρες" + 24_hours: "24 ώρες" topic_status_update: title: "Χρονοδιακόπτης Νήματος" save: "Ρύθμιση Χρονοδιακόπτη" @@ -2042,6 +2105,7 @@ el: auto_open: "Αυτό το νήμα θα ανοίξει αυτόματα σε %{timeLeft}." auto_close: "Αυτό το νήμα θα κλείσει αυτόματα σε %{timeLeft}." auto_publish_to_category: "Αυτό το νήμα θα αναρτηθεί στην κατηγορία #%{categoryName} %{timeLeft}." + auto_close_after_last_post: "Αυτό το νήμα θα κλείσει σε %{duration} μετά την τελευταία απάντηση." auto_delete: "Αυτό το νήμα θα διαγραφεί αυτόματα σε %{timeLeft}." auto_bump: "Αυτό το θέμα θα ωθηθεί αυτόματα %{timeLeft}." auto_reminder: "Θα λάβεις υπενθύμιση σχετικά με αυτό το νήμα σε %{timeLeft}." @@ -2144,6 +2208,7 @@ el: title: "Κοινοποίηση" extended_title: "Μοιραστείτε έναν σύνδεσμο" help: "κοινοποίησε έναν σύνδεσμο προς αυτό το νήμα" + invite_users: "Πρόσκληση" print: title: "Εκτύπωση" help: "Άνοιξε μια φιλική έκδοση εκτυπωτή αυτού του νήματος" @@ -2196,11 +2261,13 @@ el: username_placeholder: "όνομα χρήστη" action: "Αποστολή Πρόσκλησης" help: "να προσκληθούν και άλλοι σε αυτό το νήμα με email ή με ειδοποίηση" + discourse_connect_enabled: "Δώσε το όνομα χρήστη του ατόμου που θα ήθελες να προσκαλέσεις σε αυτό το νήμα." to_topic_blank: "Δώσε το όνομα χρήστη ή το email του ατόμου που θα ήθελες να προσκαλέσεις σε αυτό το νήμα." to_topic_email: "Έδωσες μια διεύθυνση email. Θα στείλουμε μια πρόσκληση που θα επιτρέπει στον παραλήπτη να απαντήσει άμεσα σε αυτό το νήμα." to_topic_username: "Έδωσες όνομα χρήστη. Θα στείλουμε ειδοποίηση με ένα σύνδεσμο πρόσκλησης προς αυτό το νήμα." to_username: "Δώσε το όνομα χρήστη του ατόμου που θα ήθελες να προσκαλέσεις. Θα στείλουμε ειδοποίηση με ένα σύνδεσμο πρόσκλησης προς αυτό το νήμα." email_placeholder: "name@example.com" + success_email: "Στείλαμε μια πρόσκληση στον/στην %{invitee}. Θα σε ειδοποιήσουμε όταν η πρόσκληση γίνει αποδεκτή. Στη σελίδα του προφίλ σου μπορείς να παρακολουθήσεις την εξέλιξη όλων των προσκλήσεών σου." success_username: "Προσκαλέσαμε τον χρήστη να συμμετέχει σε αυτό το νήμα." error: "Λυπούμαστε αλλά δεν μπορέσαμε να προσκαλέσουμε αυτό το άτομο. Μήπως έχει ήδη προσκληθεί; (ο ρυθμός αποστολής προσκλήσεων είναι περιορισμένος)" success_existing_email: "Ο χρήστης με email %{emailOrUsername} υπάρχει ήδη. Προσκαλέσαμε αυτόν τον χρήστης να συμμετέχει στο νήμα." @@ -2354,6 +2421,8 @@ el: image_upload_not_allowed_for_new_user: "Λυπούμαστε, οι νέοι χρήστες δεν μπορούν να ανεβάσουν εικόνες." attachment_upload_not_allowed_for_new_user: "Λυπούμαστε, οι νέοι χρήστες δεν μπορούν να επισυνάψουν αρχεία." attachment_download_requires_login: "Λυπούμαστε, για να κατεβάσεις συνημμένα αρχεία, πρέπει πρώτα να συνδεθείς." + cancel_composer: + discard: "Απόρριψη" via_email: "αυτή η ανάρτηση ήρθε μέσω email" via_auto_generated_email: "αυτή η ανάρτηση ήρθε μέσω ενός email που δημιουργήθηκε αυτόματα" whisper: "αυτή η ανάρτηση είναι εμπιστευτική προς τους συντονιστές" @@ -2528,6 +2597,11 @@ el: change_in_category_topic: "Επεξεργασία Περιγραφής" already_used: "Αυτό το χρώμα έχει χρησιμοποιηθεί σε άλλη κατηγορία" security: "Ασφάλεια" + permissions: + group: "Ομάδα" + see: "Δες" + reply: "Απάντηση" + create: "Δημιουργία" special_warning: "Προσοχή: Αυτή η κατηγορία είναι pre-seeded και οι ρυθμίσεις προστασίας δεν μπορούν να επεξεργαστούν. Εάν δεν επιθυμείτε να χρησιμοποιήσετε αυτήν την κατηγορία, διαγράψτε την αντί να την επαναχρησιμοποιήσετε." uncategorized_security_warning: "Αυτή η κατηγορία είναι ξεχωριστή. Προορίζεται ως περιοχή διατήρησης για θέματα που δεν έχουν κατηγορία. Δε μπορεί να έχει ρυθμίσεις ασφαλείας." uncategorized_general_warning: 'Αυτή η κατηγορία είναι ξεχωριστή. Χρησιμοποιείται ως προεπιλεγμένη κατηγορία για νέα θέματα που δεν έχουν επιλεγμένη κατηγορία. Αν θέλετε να αποτρέψετε αυτήν τη συμπεριφορά και να επιβάλετε επιλογή κατηγορίας, παρακαλώ απενεργοποιήστε τη ρύθμιση εδώ. Εάν θέλετε να αλλάξετε το όνομα ή την περιγραφή, μεταβείτε στο Προσαρμογή/Περιεχόμενο κειμένου.' @@ -2613,6 +2687,14 @@ el: flagging: title: "Ευχαριστούμε για τη συνεισφορά σου!" action: "Επισήμανση Ανάρτησης" + take_action_options: + default: + title: "Λάβε Δράση" + details: "Να φτάσει αμέσως στο όριο των απαραίτητων ειδοποιήσεων, αντί να περιμένει και άλλες ειδοποιήσεις από την κοινότητα." + suspend: + title: "Αποβολή Χρήστη." + silence: + title: "Σίγαση Χρήστη" notify_action: "Μήνυμα" official_warning: "Επίσημη Προειδοποίηση" delete_spammer: "Διαγραφή Ανεπιθύμητου" @@ -3021,11 +3103,13 @@ el: do_not_disturb: title: "Μην ενοχλείτε για ..." label: "Μην ενοχλείτε" + remaining: "%{remaining} απομένει" options: half_hour: "30 λεπτά" one_hour: "1 ώρα" two_hours: "2 ώρες" tomorrow: "Μέχρι αύριο" + custom: "Προσαρμοσμένο" admin_js: type_to_filter: "γράψε εδώ για φιλτράρισμα..." admin: @@ -3053,6 +3137,8 @@ el: installed_version: "Εγκατεστημένα" latest_version: "Τελευταία" problems_found: "Μερικές συμβουλές με βάση τις τρέχουσες ρυθμίσεις του ιστότοπού σας" + new_features: + dismiss: "Απόρριψη" last_checked: "Τελευταίος έλεγχος" refresh_problems: "Ανανέωση" no_problems: "Δεν βρέθηκε κανένα πρόβλημα." @@ -3902,6 +3988,7 @@ el: censor: "Λογοκρισία" require_approval: "Απαιτεί Έγκριση" flag: "Σήμανση" + replace: "Αντικατάσταση" action_descriptions: block: "Αποτροπή της καταχώρησης αναρτήσεων που περιέχουν αυτές τις λέξεις. Ο χρήστης θα ενημερωθεί με μήνυμα λάθους όταν προσπαθήσει να καταχωρήσει την αναρτηση." censor: "Επίτρεψε τις αναρτήσεις με αυτές τις λέξεις, αλλά αντικατέστησε τις λογοκριμένες λέξεις με άλλους χαρακτήρες." @@ -3961,6 +4048,8 @@ el: check_email: title: "Εμφάνισε το email αυτού του χρήστη" text: "Εμφάνιση" + check_sso: + text: "Δείξε" user: suspend_failed: "Κάποιο λάθος εμφανίστηκε κατά την αποβολή αυτού του χρήστη %{error}" unsuspend_failed: "Κάτι πήγε στραβά κατά την αναίρεση της αποβολής αυτού του χρήστη %{error}" @@ -3968,6 +4057,7 @@ el: suspend_reason_label: "Γιατί αποβάλεις τον χρήστη; Αυτό το κείμενο θα είναι ορατό σε όλους στη σελίδα προφίλ αυτού του χρήστη και θα εμφανίζεται στο χρήστη όταν αυτός προσπαθήσει να συνδεθεί. Φρόντισε να είναι σύντομο." suspend_reason_hidden_label: "Ποιος είναι ο λόγος της αποβολής; Το κείμενο αυτό θα εμφανίζεται στον χρήστη όταν προσπαθήσει να συνδεθεί. Φροντίστε να είναι σύντομο." suspend_reason: "Αιτία" + suspend_reason_title: "Αιτιολόγηση Αποβολής" suspend_message: "Μήνυμα Email" suspend_message_placeholder: "Προεραιτικά συμπληρώστε αναλυτική αιτιολόγηση για τον λόγο αποβολής και αυτή θα σταλεί με email στον χρήστη." suspended_by: "Αποβλήθηκε από τον/την" @@ -4143,6 +4233,12 @@ el: on_grace_period: "Δεν θα υποβιβαστεί. Ισχύει ακόμη η περίοδος χάριτος του τελευταίου προβιβασμού." locked_will_not_be_promoted: "Το επίπεδο εμπιστοσύνης είναι κλειδωμένο. Δε θα προβιβαστεί ποτέ." locked_will_not_be_demoted: "Το επίπεδο εμπιστοσύνης είναι κλειδωμένο. Δεν θα υποβιβαστεί ποτέ. " + discourse_connect: + external_id: "External ID" + external_username: "Όνομα Χρήστη" + external_name: "Όνομα" + external_email: "Διεύθυνση Email" + external_avatar_url: "URL Εικόνας Προφίλ" user_fields: title: "Πεδία Χρήστη" help: "Προσθέστε πεδία που οι χρήστες μπορουν να συμπληρώσουν." diff --git a/config/locales/client.et.yml b/config/locales/client.et.yml index 28bdeb7e65800..752a35993956a 100644 --- a/config/locales/client.et.yml +++ b/config/locales/client.et.yml @@ -153,6 +153,8 @@ et: topic_admin_menu: "teema toimingud" wizard_required: "Tere tulemast uude Discourse’i! Alusta häälestusviisardiga ✨" emails_are_disabled: "Kõik väljuvad meilid on administraatori poolt blokeeritud. Ühtegi teavitust meili teel ei saadeta." + software_update_prompt: + dismiss: "Ignoreeri" themes: default_description: "Vaikimisi" s3: @@ -207,6 +209,9 @@ et: now: "just nüüd" read_more: "loe edasi" more: "Veel" + x_more: + one: "%{count} Veel" + other: "Veel %{count}" less: "Peida" never: "mitte kunagi" every_30_minutes: "iga 30 minuti järel" @@ -394,6 +399,8 @@ et: types: reviewable_user: title: "Kasutaja" + reviewable_post: + title: "Postitus" approval: title: "Postitus vajab kinnitust" description: "Oleme sinu uue postituse kätte saanud, kuid see vajab enne ilmumist moderaatori kinnitust. Palume veidi kannatust. " @@ -492,12 +499,15 @@ et: credentials: username: "Kasutajanimi" password: "Parool" + settings: + title: "Seaded" mailboxes: disabled: "välja lülitatud" membership: title: Liikmelisus access: Juurdepääs categories: + title: Kategooriad watching_first_post_categories_instructions: "Kaustajaid teavitatakse esimesest postitusest igas uues teemas nendes kategooriates." tags: title: Sildid @@ -586,6 +596,7 @@ et: remove_owners: "Eemalda omanikud" remove_owners_description: "Eemalda valitud kasutajad selle grupi omanike hulgast" make_all_primary: "Tee kõik primaarseks" + remove_all_primary: "Eemalda kui primaarne" owner: "Omanik" forbidden: "Sul pole lubatud liikmeid vaadata." topics: "Teemat" @@ -717,7 +728,12 @@ et: ignore_option: "Ignoreeritud" mute_option: "Vaigistatud" normal_option: "Normaalne" + notification_schedule: + none: "Pole" + monday: "Esmaspäev" + to: "kellele" activity_stream: "Tegevused" + read: "Loetud" preferences: "Eelistused" feature_topic_on_profile: save: "Salvesta" @@ -755,6 +771,8 @@ et: color_scheme: "Värviskeem" color_schemes: default_description: "Teema vaikimisi" + undo: "Lähtesta" + regular: "Tavaline" dark_mode: "Tume režiim" allow_private_messages: "Luba teistel kasutajatel mulle privaatsõnumeid saata" external_links_in_new_tab: "Ava kõik välisviited uuel sakil" @@ -797,6 +815,7 @@ et: watched_first_post_tags: "Vaatan esimest postitust" watched_first_post_tags_instructions: "Sind teavitatakse esimesest postitusest igas nende siltidega uues teemas." muted_categories: "Vaigistatud" + regular_categories: "Tavaline" delete_account: "Kustuta minu konto" delete_account_confirm: "Kas oled kindel, et soovid oma konto jäädavalt kustutada? Seda toimingut ei ole võimalik tagasi võtta!" deleted_yourself: "Konto on edukalt kustutatud." @@ -840,6 +859,7 @@ et: tags: "Sildid" preferences_nav: account: "Konto" + security: "Turve" profile: "Profiil" emails: "E-post" notifications: "Teavitused" @@ -1029,6 +1049,11 @@ et: pending_tab_with_count: "Ootel (%{count})" redeemed_tab: "Lunastatud" redeemed_tab_with_count: "Lunastatud (%{count})" + invited_via: "Kutse" + groups: "Grupid" + topic: "Teema" + edit: "Muuda" + remove: "Eemalda" reinvited: "Kutse uuesti saadetud" search: "kirjuta kutsete otsimiseks..." user: "Kutsutud kasutaja" @@ -1191,6 +1216,7 @@ et: trust_level: "Usaldustase" search_hint: "kasutajanimi, meil või IP-aadress" create_account: + header_title: "Tere tulemast!" failed: "Miski läks valesti - võimalik, et see meiliaadress on juba registreeritud. Proovi viidet unustatud parooli lehele" forgot_password: title: "Parooli uuendamine" @@ -1358,6 +1384,7 @@ et: link_description: "sisesta viite kirjeldus siia" link_dialog_title: "Lisa hüperlink" link_optional_text: "valikuline pealkiri" + blockquote_title: "Tsitaat" blockquote_text: "Tsitaat" code_title: "Eelvormindatud tekst" code_text: "taanda eelvormindatud tekst 4 tühiku võrra" @@ -1388,6 +1415,7 @@ et: label: "Uus teema" shared_draft: label: "Jagatud mustand" + ignore: "Ignoreeri" notifications: tooltip: regular: @@ -1417,6 +1445,8 @@ et: linked: "%{username} %{description}" topic_reminder: "%{username} %{description}" watching_first_post: "New Topic %{description}" + reaction: "%{username} %{description}" + reaction_2: "%{username}, %{username2} %{description}" popup: mentioned: '%{username} mainis Sind teemas "%{topic}" - %{site_title}' group_mentioned: '%{username} mainis Sind teemas "%{topic}" - %{site_title}' @@ -1452,6 +1482,7 @@ et: no_more_results: "Rohkem vasteid pole." post_format: "postituse nr%{post_number} tegi %{username}" search_google_button: "Google" + search_button: "Otsi" context: user: "Otsi kasutaja @%{username} postitusi" category: "Otsi #%{category} foorumist" @@ -1531,6 +1562,7 @@ et: change_category: "Määra kategooria" close_topics: "Sulge Teemad" archive_topics: "Arhiveeri Teemad" + move_messages_to_inbox: "Liiguta sisendkausta" notification_level: "Teavitus" change_notification_level: "Muuda teavituste taset" choose_new_category: "Vali teemadele uus foorum:" @@ -1653,9 +1685,16 @@ et: minutes: "Minuteid:" seconds: "Sekundeid:" durations: + 10_minutes: "10 minutit" 15_minutes: "15 minutit" + 30_minutes: "30 minutit" + 45_minutes: "45 minutit" 1_hour: "1 tund" + 2_hours: "2 tundi" 4_hours: "4 tundi" + 8_hours: "8 tundi" + 12_hours: "12 tundi" + 24_hours: "24 tundi" custom: "Muu kestvus" topic_status_update: title: "Teema taimer" @@ -1692,6 +1731,7 @@ et: title: "Tuleta mulle meelde" status_update_notice: auto_close: "See teema sulgub %{timeLeft} pärast ise." + auto_close_after_last_post: "See teema sulgub %{duration} peale viimast vastust." auto_close_title: "Automaatse sulgumise sätted" auto_close_immediate: one: "Viimane postitus selles teemas on juba %{count} tund aega vana, seega sulgub see teema nüüd." @@ -1707,6 +1747,7 @@ et: go: "mine" jump_bottom: "hüppa viimase postituse juurde" jump_prompt: "mine..." + jump_prompt_long: "Mine..." jump_bottom_with_number: "hüppa postituse %{post_number} juurde" jump_prompt_or: "või" total: postitusi kokku @@ -1783,6 +1824,7 @@ et: share: title: "Jaga" help: "jaga viidet sellele teemale" + invite_users: "Kutsu" print: title: "Trüki" help: "Ava selle teema prindikõlblik versioon" @@ -1831,11 +1873,13 @@ et: username_placeholder: "kasutajanimi" action: "Saada kutse" help: "kutsu teisi siia teemasse meili või teavitustega" + discourse_connect_enabled: "Sisesta selle isiku kasutajanimi, keda soovid siia teemasse kutsuda." to_topic_blank: "Sisesta selle isiku kasutajanimi või meiliaadress, keda soovid siia teemasse kutsuda." to_topic_email: "Sisestasid meiliaadressi. Saadame su sõbrale kutse, mis lubab tal kohe sellesse teemasse vastata." to_topic_username: "Sisestasid kasutajanime. Saadame su sõbrale kutse, mis lubab tal viivitamatult sellesse teemasse vastata." to_username: "Sisesta selle isiku kasutajanimi, keda soovid kutsuda. Saadame talle teavituse koos viitega, mis sisaldab kutset siia teemasse." email_placeholder: "nimi@kuskil.ee" + success_email: "Saatsime kutse kasutajale %{invitee}. Teatame sulle, kui kutse on aktsepteeritud. Vaata kutsete sakki sinu saadetud kutsete osas ülevaate saamiseks." success_username: "Oleme kutsunud selle kasutaja teemas osalema." error: "Vabanda, meil ei õnnestunud seda kasutajat kutsuda. Kas on võimalik et ta on juba kutsutud? (Kutsete saatmise sagedus on piiratud)" login_reply: "Vastamiseks logi sisse" @@ -2019,6 +2063,10 @@ et: lock_post: "Lukusta postitus" delete_topic: "kustuta teema" actions: + people: + like: + one: "laikis seda" + other: "laikis seda" by_you: off_topic: "Tähistasid selle kui teemavälise" spam: "Tähistasid selle kui spämmi" @@ -2062,6 +2110,7 @@ et: html_part: button: "HTML" bookmarks: + edit: "Muuda järjehoidjat" created: "Loodud" name: "Nimi" actions: @@ -2174,6 +2223,7 @@ et: options: normal: "Normaalne" ignore: "Ignoreeri" + high: "Kõrge" sort_options: default: "vaikimisi" likes: "Meeldimisi" @@ -2193,6 +2243,14 @@ et: flagging: title: "Täname, et aitad meie kogukonna viisakust säilitada!" action: "Tähista postitus" + take_action_options: + default: + title: "Tegutse" + details: "Liigu kohe tähise künniseni, ilma kogukonnalt täiendavaid tähiseid ootamata" + suspend: + title: "Peata kasutaja" + silence: + title: "Vaigista kasutaja" notify_action: "Sõnum" official_warning: "Ametlik hoiatus" delete_spammer: "Kustuta spämmija" @@ -2357,6 +2415,7 @@ et: readonly: "Vaata" lightbox: download: "lae alla" + counter: "%curr% %total%st" keyboard_shortcuts_help: title: "Klaviatuuri kiirvalikud" jump_to: @@ -2503,6 +2562,13 @@ et: dismiss: "Ignoreeri" safe_mode: enabled: "Kaitstud režiim on aktiivne, väljumiseks sulge see brauseri aken." + do_not_disturb: + remaining: "%{remaining} jäänud" + options: + half_hour: "30 minutit" + one_hour: "1 tund" + two_hours: "2 tundi" + custom: "Individuaalne" admin_js: type_to_filter: "filtreerimiseks trüki..." admin: @@ -2525,6 +2591,8 @@ et: version_check_pending: "Näib, et oled hiljuti uuendanud. Fantastiline!" installed_version: "Paigaldatud" latest_version: "Viimased" + new_features: + dismiss: "Ignoreeri" last_checked: "Viimati kontrollitud" refresh_problems: "Värskenda" no_problems: "Probleeme ei tuvastatud." @@ -2561,6 +2629,9 @@ et: view_table: "tabel" view_graph: "diagramm" refresh_report: "Värskenda raportit" + daily: Igapäevaselt + monthly: Igakuiselt + weekly: Iganädalaselt groups: "Kõik grupid" no_data: "Pole andmeid, mida näidata." filters: @@ -2629,6 +2700,8 @@ et: description: Kirjeldus save: Salvesta continue: Jätka + scopes: + action: Tegevus web_hooks: title: "Veebihaagid" none: "Hetkel veebihaagid puuduvad." @@ -2786,6 +2859,7 @@ et: copy: "Kopeeri" copy_to_clipboard: "Kopeeri lõikelauale" copied_to_clipboard: "Kopeeritud lõikelauale" + copy_to_clipboard_error: "Tõrge kopeerimisel" email_templates: title: "E-post" subject: "Teema" @@ -2825,6 +2899,7 @@ et: install_popular: "Populaarsed" about_theme: "Teave" license: "Litsents" + version: "Versioon:" enable: "Luba" disable: "Keela" updating: "Uuendamine..." @@ -3105,6 +3180,7 @@ et: staff: "Meeskond" suspended: "Peatatud" silenced: "Vaigistatud" + staged: "Ettevalmistamisel" approved: "Heakskiidetud?" titles: active: "Aktiivsed kasutajad" @@ -3124,12 +3200,15 @@ et: check_email: title: "Näita selle kasutaja meiliaadressi" text: "Näita" + check_sso: + text: "Näita" user: suspend_failed: "Selle kasutaja peatamisel tekkis viga %{error}" unsuspend_failed: "Selle kasutaja taaslubamisel tekkis viga %{error}" suspend_duration: "Kauaks see kasutaja peatatakse?" suspend_reason_label: "Peatamise põhjus? See tekst on nähtav kõigile selle kasutaja profiililehel, samuti kuvatakse kasutajale, kui ta üritab sisse logida. Tee lühidalt." suspend_reason: "Põhjus" + suspend_reason_title: "Peatamise põhjus" suspended_by: "Peatati kasutaja poolt" silence_reason: "Põhjus" silenced_by: "Vaigistaja" @@ -3255,6 +3334,12 @@ et: on_grace_period: "Hetkel edutamisel halastusperiood, madalamale ei viida." locked_will_not_be_promoted: "Usaldustase lukustatud. Ei edutata kunagi." locked_will_not_be_demoted: "Usaldustase lukustatud. Ei alandata kunagi." + discourse_connect: + external_id: "Väline ID" + external_username: "Kasutajanimi" + external_name: "Nimi" + external_email: "E-post" + external_avatar_url: "Profiili pildi URL" user_fields: title: "Kasutajaväljad" help: "Lisa välju, mida kasutajad saavad täita." @@ -3435,6 +3520,9 @@ et: embed_post_limit: "Maksimaalne postituste arv, mida sängitada" embed_title_scrubber: "Regex postituste päiste puhastamiseks" embed_truncate: "Lühenda sängitatud postitused" + allowed_embed_selectors: "CSS valik elementidele, mida lubada sängitamistes" + blocked_embed_selectors: "CSS valik elementidele, mida eemaldada sängitamistes" + allowed_embed_classnames: "CSS klasside lubatud nimed" save: "Salvesta sängitamise sätted" permalink: title: "Püsiviited" diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml index a0237fd677ae7..18aa4a5e318a6 100644 --- a/config/locales/client.fa_IR.yml +++ b/config/locales/client.fa_IR.yml @@ -222,6 +222,9 @@ fa_IR: now: "هم‌اکنون" read_more: "بیشتر بخوانید" more: "بیشتر" + x_more: + one: "%{count} بیشتر" + other: "بیش از %{count}" less: "کمتر" never: "هرگز" every_30_minutes: "هر 30 دقیقه" @@ -456,6 +459,7 @@ fa_IR: created_at_asc: "ساخته شده (برعکس)" priority: title: "کمترین اولویت" + any: "(هر چی)" low: "کم" medium: "متوسط" high: "بالا" @@ -520,6 +524,9 @@ fa_IR: months: one: "ماه" other: "ماه‌ها" + years: + one: "سال" + other: "سال" relative: "مرتبط" time_shortcut: later_today: "بعد از امروز" @@ -898,6 +905,8 @@ fa_IR: dynamic_favicon: "نمایش تعداد در ایکون بروسر" theme_default_on_all_devices: "این قالب، حالت پیش فرض در همه ی دستگاه های من باشد" color_schemes: + undo: "بازنشانی" + regular: "عادی" dark: "حالت تاریک" default_dark_scheme: "(پیش‌فرض سایت)" dark_mode: "حالت تاریک" @@ -1712,6 +1721,7 @@ fa_IR: link_description: "توضیحات لینک را اینجا وارد کنید." link_dialog_title: "افزودن پیوند" link_optional_text: "عنوان اختیاری" + blockquote_title: "نقل‌قول" blockquote_text: "نقل‌قول" code_title: "متن قالب‌بندی شده" code_text: "متن قالب‌بندی شده را با 4 فاصله دندانه‌دار کن" @@ -1760,6 +1770,7 @@ fa_IR: toggle_topic_bump: label: "فعالسازی بالا آوردن مبحث در لیست" desc: "بدون تغییر زمان اخرین پاسخ، پاسخ دهید." + ignore: "چشم پوشی" notifications: tooltip: regular: @@ -1915,6 +1926,10 @@ fa_IR: post: count: label: نوشته‌ها + min: + placeholder: حداقل + max: + placeholder: حداکثر time: label: ارسال شده before: قبل از @@ -1980,6 +1995,7 @@ fa_IR: new: "موضوع تازه‌ی دیگری وجود ندارد." unread: "موضوع خوانده نشده‌ی دیگری وجود ندارد." category: "هیچ موضوع دیگری در %{category} نیست." + tag: "هیچ موضوع دیگری در %{tag} نیست." top: "موضوع برتر دیگری وجود ندارد" bookmarks: "موضوع نشانک‌دار دیگری وجود ندارد." topic: @@ -2047,6 +2063,7 @@ fa_IR: jump_reply_down: رفتن به پاسخ بعدی deleted: "موضوع پاک شده است" slow_mode_update: + save: "فعال کردن" remove: "غیرفعال" hours: "ساعت:" minutes: "دقیقه:" @@ -2109,6 +2126,7 @@ fa_IR: auto_open: "این موضوع به صورت خودکار در %{timeLeft} باز خواهد شد." auto_close: "این موضوع به صورت خودکار در %{timeLeft} بسته خواهد شد." auto_publish_to_category: "این موضوع در #%{categoryName} منتشر می‌شود %{timeLeft}." + auto_close_after_last_post: "این موضوع در %{duration} بعد از آخرین پاسخ بسته خواهد شد." auto_delete: "این موضوع به صورت خودکار در %{timeLeft} حذف می‌شود" auto_bump: "این مطلب %{timeLeft} به صورت خودکار به صدر مطالب آورده می‌شود." auto_reminder: "درباره این موضوع به شما یادآوری خواهد شد %{timeLeft}." @@ -2213,6 +2231,7 @@ fa_IR: title: "اشتراک‌گذاری" extended_title: "اشتراک‌گذاری یک پیوند" help: "اشتراک‌گذاری پیوند این موضوع" + invite_users: "دعوت" print: title: "چاپ" help: "باز کردن حالت قابل چاپ موضوع" @@ -2270,6 +2289,7 @@ fa_IR: to_topic_username: "شما نام کاربری شخصی را وارد کرده‌اید. ما این امر را به اطلاع او رسانده و او را به این موضوع دعوت می‌کنیم." to_username: "نام کاربری شخصی که می‌خواهید او را دعوت کنید، وارد کنید. ما این امر را به اطلاع او رسانده و او را به این عنوان دعوت می‌کنیم." email_placeholder: "name@example.com" + success_email: "lما از طریق ایمیل دعوت نامه ارسال کردیم %{invitee} . هنگامی که به دعوت شما پاسخ داده شد ما به شما اطلاع خواهیم داد.برای پی گیری به تب دعوت ها در پنل کاربری مراجعه نمایید" success_username: "ما آن کاربر را برای شرکت در این جستار دعوت کردیم." error: "متاسفیم٬‌ ما آن شخص را نمی توانیم دعوت کنیم. شاید قبلا دعوت شده اند. (فراخوان ها تعداد محدودی دارند)" success_existing_email: "یک کاربر با رایانامه %{emailOrUsername} وجو دارد. ما آن کاربر را برای شرکت در این مبحث دعوت کردیم." @@ -2395,6 +2415,8 @@ fa_IR: image_upload_not_allowed_for_new_user: "با عرض پوزش، کاربران جدید نمی توانند تصویر بار‌گذاری کنند." attachment_upload_not_allowed_for_new_user: "با عرض پوزش، کاربران جدید نمی توانند فایل پیوست بار‌گذاری کنند." attachment_download_requires_login: "با عرض پوزش، شما برای دانلود فایل پیوست باید وارد سایت شوید." + cancel_composer: + discard: "دور انداختن" via_email: "این نوشته از طریق ایمیل ارسال شده است" via_auto_generated_email: "این نوشته با ایمیل خودکار ارسال شده" whisper: "این ارسال نجوای خصوصی برای مدیران است" @@ -2624,6 +2646,12 @@ fa_IR: flagging: title: "تشکر برای کمک به نگه داشتن جامعه ما بصورت مدنی !" action: "پرچم‌گذاری نوشته" + take_action_options: + default: + title: "اقدام" + details: "رسیدن سریع به آستانه پرچم، به جای انتظار برای پرچم انجمن" + suspend: + title: "کاربر تعلیق شده" notify_action: "پیام" official_warning: "اخطار رسمی" delete_spammer: "پاک کردن هرزنگار" @@ -2793,6 +2821,7 @@ fa_IR: download: "دانلود" previous: "قبلی (مکان‌نمای چپ)" next: "بعدی (مکان‌نمای راست)" + counter: "%curr% از %total%" close: "بستن (خروج)" cannot_render_video: این ویدیو قابل ارائه نیست، چون مرورگر شما از کدک پشتیبانی نمی‌کند. keyboard_shortcuts_help: @@ -3017,6 +3046,8 @@ fa_IR: installed_version: "نصب" latest_version: "آخرین" problems_found: "چند توصیه براثاث تنظیمات فعلی سایت شما" + new_features: + dismiss: "نخواستیم" last_checked: " آخرین بررسی" refresh_problems: "تازه کردن" no_problems: "هیچ مشکلات پیدا نشد." @@ -3147,6 +3178,8 @@ fa_IR: description: توضیح save: ذخیره continue: ادامه + scopes: + action: اقدام web_hooks: title: "webhook ها" none: "در حال حاضر webhook‌ی وجود ندارد" @@ -3409,6 +3442,7 @@ fa_IR: source_url: "منبع" enable: "فعال کردن" disable: "ازکاراندازی" + disabled: "این کامپوننت غیر فعال شده." update_to_latest: "به‌روز‌رسانی به آخرین نسخه" check_for_updates: "برررسی به‌روز‌رسانی‌ها" updating: "در حال به‌روز‌رسانی" @@ -3671,6 +3705,8 @@ fa_IR: censor: "سانسور" require_approval: "نیازمند تصویب" flag: "پرچم" + replace: "جایگزینی" + tag: "برچسب" action_descriptions: block: "از فرستادن فرسته‌هایی که دارای این واژه‌ها هستند جلوگیری کنید. کاربر هنگام ارسال فرسته با پیام خطا مواجه می‌شود." require_approval: "فرسته‌های دارای این واژه‌ها پیش از دیده شدن نیاز به تائید کارکنان دارند." @@ -3720,12 +3756,15 @@ fa_IR: check_email: title: "ایمیل این کاربران را قابل رویت کن" text: "نشان دادن" + check_sso: + text: "نمایش" user: suspend_failed: "در جریان به تعلیق درآوردن این کاربر اشتباهی رخ داد. %{error}" unsuspend_failed: "در جریان خارج کردن این کاربر از تعلیق، اشتباهی رخ داد %{error}" suspend_duration: "کاربر چه مدت در تعلیق خواهد بود؟" suspend_reason_label: "شما چرا معلق شده‌اید؟ این متن بر روی صفحه‌ی نمایه‌ی کاربر برای همه قابل مشاهده خواهد بود، و در هنگام ورود به سیستم نیز به خود کاربر نشان داده خواهد شد. لطفاً خلاصه بنویسید." suspend_reason: "دلیل" + suspend_reason_title: "دلیل تعلیق شدن" suspend_message_placeholder: "به صورت اختیاری اطلاعات بیشتری درمورد تعلیق ارائه دهید تا به رایانامه کاربر ارسال شود." suspended_by: "تعلیق شده توسط" silence_reason: "دلیل" @@ -4047,6 +4086,9 @@ fa_IR: embed_post_limit: "حداکثر تعداد نوشته‌هایی که میتوان جاساز کرد" embed_title_scrubber: "regular expression‌ی که برای بهینه‌سازی عنوان نوشته استفاده می‌شود" embed_truncate: "کوتاه کردن نوشته های جاسازی شده" + allowed_embed_selectors: "انتخاب کننده CSS برای المان هایی که اجازه دارند جاسازی شوند" + blocked_embed_selectors: "انتخاب کننده CSS برای المان هایی که از جاسازی پاک شده اند" + allowed_embed_classnames: " دسترسی به کلاس های CSS" save: "ذخیره تنظیمات کدهای جاساز" permalink: title: " پیوند دائمی" diff --git a/config/locales/client.gl.yml b/config/locales/client.gl.yml index f6a45fde34dba..8d1148b194d73 100644 --- a/config/locales/client.gl.yml +++ b/config/locales/client.gl.yml @@ -158,6 +158,8 @@ gl: topic_admin_menu: "accións do tema" wizard_required: "Este é o novo Discourse! Pode comezar co asistente de configuración ✨" emails_are_disabled: "Todos as mensaxes de correo saíntes foron desactivadas globalmente por un administrador. Non se enviará ningún tipo de notificación por correo electrónico." + software_update_prompt: + dismiss: "Desbotar" bootstrap_mode_enabled: one: "Para facilitar o lanzamento do seu novo sitio, está en modo de arranque. Todos os novos usuarios recibirán o nivel de confianza 1 e terán activadas as mensaxes de correo de resumo diario. Isto desactivarase automaticamente cando se una %{count} usuario." other: "Para facilitar o lanzamento do seu novo sitio, está en modo de arranque. Todos os novos usuarios recibirán nivel de confianza 1 e terán activadas as mensaxes de correo de resumo diario. Isto desactivarase automaticamente cando se unan %{count} usuarios." @@ -460,6 +462,7 @@ gl: created_at_asc: "Creado o (inverso)" priority: title: "Prioridade mínima" + any: "(calquera)" low: "Baixa" medium: "Media" high: "Alta" @@ -498,6 +501,8 @@ gl: title: "Publicación na fila de espera" reviewable_user: title: "Usuario" + reviewable_post: + title: "Publicación" approval: title: "A publicación necesita aprobación" description: "Recibimos a súa nova publicación pero cómpre que sexa aprobada por un moderador antes de aparecer. Teña paciencia." @@ -2248,9 +2253,16 @@ gl: minutes: "Minutos:" seconds: "Segundos:" durations: + 10_minutes: "10 minutos" 15_minutes: "15 minutos" + 30_minutes: "30 Minutos" + 45_minutes: "45 minutos" 1_hour: "1 hora" + 2_hours: "2 Horas" 4_hours: "4 horas" + 8_hours: "8 horas" + 12_hours: "12 horas" + 24_hours: "24 horas" custom: "Duración personalizada" topic_status_update: title: "Temporizador do tema" @@ -2418,6 +2430,7 @@ gl: title: "Compartir" extended_title: "Compartir unha ligazón" help: "compartir unha ligazón a este tema" + invite_users: "Convidar" print: title: "Imprimir" help: "Abrir unha versión imprimíbel deste tema" @@ -4322,6 +4335,7 @@ gl: require_approval: "Requirir aprobación" flag: "Sinalar" replace: "Substituír" + tag: "Etiqueta" action_descriptions: block: "Evitar as publicacións que conteñen estas palabras. O usuario verá unha mensaxe de erro cando tente enviar a publicación." censor: "Permitir publicacións que conteñan estas palabras pero substitúeas por caracteres que oculten as palabras censuradas." diff --git a/config/locales/client.hu.yml b/config/locales/client.hu.yml index aae2ccc62d9bb..2b9cd930a23c0 100644 --- a/config/locales/client.hu.yml +++ b/config/locales/client.hu.yml @@ -158,6 +158,8 @@ hu: topic_admin_menu: "témaműveletek" wizard_required: "Üdvözöljük az új Discourse-on. Kezdjük a beállításvarázslóval. ✨" emails_are_disabled: "Egy adminisztrátor letiltotta a kimenő e-maileket. Semmilyen értesítő e-mail nem lesz elküldve." + software_update_prompt: + dismiss: "Elvetés" bootstrap_mode_enabled: one: "Hogy könnyebbé tegyük az új oldala elindítását, most előkészítési módban van. Minden új felhasználó 1-es szintet kap és be lesz állítva, hogy napi kivonat e-mailt kapjanak. Ez a beállítás automatikusan kikapcsol, ha legalább %{count} felhasználó regisztrált." other: "Hogy könnyebbé tegyük az új oldala elindítását, most előkészítési módban van. Minden új felhasználó 1-es szintet kap és be lesz állítva, hogy napi kivonat e-mailt kapjanak. Ez a beállítás automatikusan kikapcsol, ha legalább %{count} felhasználó regisztrált." @@ -222,6 +224,9 @@ hu: now: "épp most" read_more: "olvasás tovább" more: "Több" + x_more: + one: "Még %{count}" + other: "Még %{count}" less: "Kevesebb" never: "soha" every_30_minutes: "30 percenként" @@ -383,6 +388,7 @@ hu: topic: "Téma:" filtered_topic: "A jóváhagyandó tartalmakra szűrt egyetlen témában." filtered_user: "Felhasználó" + filtered_reviewed_by: "Jóváhagyta" show_all_topics: "összes téma megjelenítése" deleted_post: "(bejegyzés törölve)" deleted_user: "(felhasználó törölve)" @@ -437,6 +443,7 @@ hu: created_at_asc: "Létrehozva (fordított)" priority: title: "Legalacsonyabb prioritás" + any: "(bármely)" low: "Alacsony" medium: "Közepes" high: "Magas" @@ -475,6 +482,8 @@ hu: title: "Sorban álló bejegyzés" reviewable_user: title: "Felhasználó" + reviewable_post: + title: "Hozzászólás" approval: title: "A bejegyzés jóváhagyásra vár." description: "Fogadtuk a bejegyzését, de egy moderátornak jóvá kell hagynia, mielőtt megjelenne. Köszönjük a türelmét." @@ -608,6 +617,10 @@ hu: membership: title: Tagság access: Hozzáférés + categories: + title: Kategóriák + tags: + title: Címkék logs: title: "Naplók" when: "Mikor" @@ -618,6 +631,8 @@ hu: details: "Részletek" from: "Feladó" to: "Címzett" + permissions: + title: "Jogok" public_admission: "A felhasználók szabadon csatlakozhatnak a csoporthoz (Nyilvánosan látható csoport szükséges)" public_exit: "A felhasználók szabadon elhagyhatják a csoportot" empty: @@ -757,6 +772,9 @@ hu: topic_sentence: one: "%{count} téma" other: "%{count} téma" + topic_stat_unit: + week: "hét" + month: "hónap" topic_stat_sentence_week: one: "%{count} új téma az elmúlt héten." other: "%{count} új téma az elmúlt héten." @@ -819,7 +837,10 @@ hu: normal_option_title: "Értesítést fog kapni, ha a felhasználó válaszol, idézi vagy megemlíti." notification_schedule: none: "Egyik sem" + monday: "Hétfő" + to: "címzett" activity_stream: "Tevékenység" + read: "Olvasott" preferences: "Beállítások" feature_topic_on_profile: open_search: "Válasszon egy új témát" @@ -862,6 +883,7 @@ hu: theme_default_on_all_devices: "Legyen ez az alapértelmezett téma az összes eszközén" color_schemes: undo: "Visszaállítás" + regular: "Átlagos" text_size_default_on_all_devices: "Legyen ez az alapértelmezett szövegméret az összes eszközén" allow_private_messages: "Engedélyezés a többi felhasználónak, hogy privát üzenetet küldjenek Önnek" external_links_in_new_tab: "Az összes külső hivatkozás megnyitása új lapon" @@ -908,6 +930,7 @@ hu: watched_first_post_tags_instructions: "Csak az új témakörök legelső hozzászólásáról fog értesítést kapni ezekben a címkékben." muted_categories: "Némított" muted_categories_instructions: "Semmilyen értesítést nem fog kapni a kategória témaköreiről, és a kategóriák vagy a legújabbak között sem fog megjelenni." + regular_categories: "Átlagos" no_category_access: "Moderátorként korlátozott kategória-hozzáférése van, a mentés tiltott." delete_account: "Saját fiók törlése" delete_account_confirm: "Biztos, hogy végleg törli a fiókját? Ez a művelet nem vonható vissza." @@ -953,6 +976,7 @@ hu: tags: "Címkék" preferences_nav: account: "Fiók" + security: "Biztonság" profile: "Profil" emails: "Emailek" notifications: "Értesítések" @@ -1180,7 +1204,13 @@ hu: expired_tab_with_count: "Lejárt (%{count})" redeemed_tab: "Felhasználva" redeemed_tab_with_count: "Felhasználva (%{count})" + invited_via: "Meghívás" + groups: "Csoportok" + topic: "Téma" sent: "Létrehozva / utoljára elküldve" + expires_at: "Lejár" + edit: "Szerkesztés" + remove: "Eltávolítás" reinvited: "Meghívó újraküldve" search: "írd be a keresett meghívottak nevét…" user: "Meghívott felhasználó" @@ -1191,6 +1221,7 @@ hu: topics_entered: "Megtekintett témák" posts_read_count: "Elolvasott bejegyzések" expired: "Ez a meghívó lejárt!" + remove_all_confirm: "Biztosan eltávolítod az összes lejárt meghívót?" reinvite_all_confirm: "Biztosan szeretnél újraküldeni minden meghívót?" time_read: "Olvasási idő" days_visited: "Látogatott napok" @@ -1581,6 +1612,7 @@ hu: link_description: "itt add meg a link leírását" link_dialog_title: "Hiperhivatkozás beszúrása" link_optional_text: "alternatív cím" + blockquote_title: "idézetblokk" blockquote_text: "idézetblokk" code_title: "Előformázott szöveg" code_text: "az előformázott szöveget 4 szóközzel beljebb kezdi" @@ -1657,6 +1689,8 @@ hu: granted_badge: "Új jelvény: '%{description}'" topic_reminder: "%{username} %{description}" watching_first_post: "Új téma%{description} " + reaction: "%{username}%{description}" + reaction_2: "%{username}, %{username2} %{description}" group_message_summary: one: "%{count} Üzenet a %{group_name} postaládában" other: "%{count} Üzenetek a %{group_name} postaládában" @@ -1712,6 +1746,7 @@ hu: or_search_google: "Vagy helyette próbálj meg a Googlén keresni:" search_google: "Helyette próbálj meg a Googlén keresni:" search_google_button: "Google" + search_button: "Keresés" context: user: "Keresés @%{username} bejegyzései között" category: "Keresés a #%{category}ban" @@ -1773,6 +1808,7 @@ hu: change_category: "Kategória beállítása" close_topics: "Témakörök lezárása" archive_topics: "Témakörök archíválása" + move_messages_to_inbox: "Áthelyezés a bejövő üzenetek közé" notification_level: "Értesítések" change_notification_level: "Értesítési szint módosítása" choose_new_category: "Válaszd ki az új kategóriát a témákhoz:" @@ -1800,6 +1836,7 @@ hu: new: "Nincs több új témakör." unread: "Nincs több olvasatlan témakör." category: "Nincs több %{category} téma." + tag: "Nincs több %{tag} téma." top: "Nincsenek több top témák" bookmarks: "Nincs több témakör a könyvjelzők között." topic: @@ -1862,6 +1899,21 @@ hu: jump_reply_up: ugrás régebbi válaszhoz jump_reply_down: ugrás újabb válaszhoz deleted: "Ez a témakör ki lett törölve" + slow_mode_update: + save: "Engedélyezés" + remove: "Letiltás" + hours: "Óráig:" + durations: + 10_minutes: "10 Percig" + 15_minutes: "15 Percig" + 30_minutes: "30 Percig" + 45_minutes: "45 Percig" + 1_hour: "1 Óráig" + 2_hours: "2 Óráig" + 4_hours: "4 Óráig" + 8_hours: "8 Óráig" + 12_hours: "12 Óráig" + 24_hours: "24 Óráig" topic_status_update: title: "Téma időzítése" save: "Időzítő beállítása" @@ -1908,6 +1960,7 @@ hu: go: "ugrás" jump_bottom: "Ugrás az utolsó bejegyzéshez" jump_prompt: "ugrás..." + jump_prompt_long: "Ugrás..." jump_bottom_with_number: "ugrás a következő bejegyzéshez: %{post_number}" jump_prompt_to_date: "Mostanáig" jump_prompt_or: "vagy" @@ -1986,6 +2039,7 @@ hu: title: "Megosztás" extended_title: "Link megosztása" help: "a témakör hivatkozásának megosztása" + invite_users: "Meghívás" print: title: "Nyomtatás" flag_topic: @@ -2019,6 +2073,7 @@ hu: action: "Meghívó küldése" help: "mások meghívása ebbe a témába e-mailben vagy értesítéssel" to_forum: "Küldünk egy rövid e-mailt, amely lehetővé teszi, hogy a barátod azonnal és egyszerűen csatlakozni tudjon egyetlen linkre kattintva." + discourse_connect_enabled: "Írd be annak a felhasználónevét, akit meg szeretnél hívni ebbe a témába." to_topic_blank: "Adja meg a témába meghívandó személy felhasználónevét vagy e-mail-címét." to_topic_email: "Megadtál egy e-mail címet. Erre küldünk egy rövid e-mailt, amely lehetővé teszi, hogy a barátod azonnal és egyszerűen csatlakozni tudjon egyetlen linkre kattintva." to_topic_username: "Megadtál egy felhasználónevet. Küldünk egy rövid e-mailt, amely lehetővé teszi, hogy a barátod azonnal és egyszerűen csatlakozni tudjon egyetlen linkre kattintva." @@ -2160,6 +2215,9 @@ hu: delete_topic: "témakör törlése" actions: people: + like: + one: "kedvelve" + other: "kedvelve" read: one: "olvasd ezt el" other: "olvasd ezt el" @@ -2259,6 +2317,9 @@ hu: security: "Biztonság" security_add_group: "Csoport hozzáadása" permissions: + group: "Csoport" + see: "Megtekintés" + reply: "Válasz" create: "Létrehozás" images: "Képek" email_in: "Egyéni e-mail-cím a bejövő üzeneteknek:" @@ -2316,6 +2377,13 @@ hu: flagging: title: "Köszönjük, hogy segítesz a közösségünket civilizáltan tartani!" action: "Bejegyzés megjelölése" + take_action_options: + default: + title: "Művelet megkezdése" + suspend: + title: "Felhasználó felfüggesztése" + silence: + title: "Felhasználó elnémítása" notify_action: "Üzenet" official_warning: "Hivatalos figyelmeztetés" delete_spammer: "Spammer törlése" @@ -2401,6 +2469,7 @@ hu: categories_list: "Kategóriák listája" filters: with_topics: "%{filter} témák" + with_category: "%{filter} %{category} Témák" latest: title: "Legújabb" title_with_count: @@ -2473,6 +2542,7 @@ hu: readonly: "Megtekintés" lightbox: download: "letöltés" + counter: "%curr% / %total%" keyboard_shortcuts_help: title: "Billentyűkombinációk" jump_to: @@ -2546,6 +2616,9 @@ hu: badge_count: one: "%{count} Jelvény" other: "%{count} jelvény" + more_badges: + one: "+Még %{count}" + other: "+Még %{count}" granted: one: "%{count} kiadva" other: "%{count} kiadva" @@ -2657,6 +2730,8 @@ hu: version_check_pending: "Úgy nézik nem rég frissítettél. Fantasztikus!" installed_version: "Telepítve" latest_version: "Legfrissebb" + new_features: + dismiss: "Elvetés" last_checked: "Utoljára ellenőrizve: " refresh_problems: "Újratöltés" no_problems: "Nem találtunk semmilyen problémát." @@ -2697,6 +2772,9 @@ hu: view_table: "asztal" view_graph: "Grafikon" refresh_report: "Jelentés frissítése" + daily: Napi + monthly: Havi + weekly: Heti groups: "Összes csoport" disabled: "Ez a bejelentés ki van kapcsolva" total: "Mindenkori összes" @@ -2760,6 +2838,7 @@ hu: user: "Felhasználó" title: "API" created: Létrehozott + updated: Frissítve generate: "Generálás" revoke: "Visszavonás" all_users: "Minden felhasználó" @@ -2770,6 +2849,7 @@ hu: continue: Folytatás scopes: resource: Forrás + action: Művelet descriptions: users: update: Felhasználói profil adatainak frissítése. @@ -2957,6 +3037,7 @@ hu: install_create: "Új létrehozása" about_theme: "About" license: "Licenc" + version: "Verzió:" creator: "Létrehozva:" enable: "Engedélyez" disable: "Kikapcsol" @@ -3262,6 +3343,8 @@ hu: check_email: title: "A felhasználó email címének megjelenítése" text: "Mutat" + check_sso: + text: "Megjelenítés" user: suspend_reason_label: "Miért függeszted fel? Ez a szöveg mindenki számára látható lesz ennek a felhasználónak a profiloldalán, és akkor jelenik meg a felhasználó számára, amikor megpróbál bejelentkezni. Fogalmazz röviden." suspend_reason: "oka" @@ -3293,6 +3376,7 @@ hu: moderator: "Moderátor?" admin: "Adminisztrátor?" suspended: "Felfüggesztett?" + staged: "Lépcsőzetes?" show_admin_profile: "Adminisztrátor" show_public_profile: "Publikus profil megjelenítése" impersonate: "Megszemélyesít" @@ -3355,6 +3439,10 @@ hu: likes_given: "Adott tetszésnyilvánítások" likes_received: "Kapott kedvelések" discourse_connect: + external_id: "Külső ID" + external_username: "Felhasználónév" + external_name: "Név" + external_email: "E-mail" external_avatar_url: "Profilkép URL-je" user_fields: title: "Felhasználói mezők" @@ -3507,6 +3595,7 @@ hu: embed_by_username: "Felhasználónév téma létrehozáshoz" embed_post_limit: "A bejegyzések maximális száma a beágyazásban" embed_truncate: "Beágyazott bejegyzések rövidítése" + allowed_embed_classnames: "Engedélyezett CSS-osztálynevek" save: "Beágyazás beállításainak mentése" permalink: title: "Közvetlen link" diff --git a/config/locales/client.hy.yml b/config/locales/client.hy.yml index 64c5c7b3c6207..1cb2ad4a7b358 100644 --- a/config/locales/client.hy.yml +++ b/config/locales/client.hy.yml @@ -154,6 +154,8 @@ hy: topic_admin_menu: "թեմայի ադմինի գործողություններ" wizard_required: "Բարի գալուստ Ձեր նոր Discourse! Սկսենք տեղակայման մասնագետ-ի հետ ✨" emails_are_disabled: "Բոլոր ելքային էլ. նամակները անջատվել են ադմինիստրատորի կողմից: Էլ. փոստով ոչ մի տեսակի ծանուցում չի ուղարկվի:" + software_update_prompt: + dismiss: "Չեղարկել" bootstrap_mode_disabled: "Սկզբնաբեռնման(Bootstrap) ռեժիմը կանջատվի 24 ժամվա ընթացքում:" themes: default_description: "Լռելյայն" @@ -214,6 +216,9 @@ hy: now: "հենց նոր" read_more: "կարդալ ավելին" more: "Ավելին" + x_more: + one: "ևս %{count}" + other: "ևս %{count}" less: "Կրճատ" never: "երբեք" every_30_minutes: "30 րոպեն մեկ" @@ -266,6 +271,9 @@ hy: no_timezone: 'Դուք դեռ չեք նշել ձեր ժամային գոտին: Դուք չեք կարողանա հիշեցումներ անել: Տեղադրեք ձեր պրոֆիլում:' invalid_custom_datetime: "Ամսաթիվը և ժամանակը ճիշտ չէ նշված, կրկին փորձեք:" list_permission_denied: "Դուք իրավունք չունեք դիտելու այս օգտատիրոջ էջանշանները: " + no_user_bookmarks: "Դուք էջանշած գրառումներ չունեք; էջանշումները թույլ են տալիս Ձեզ արագորեն տեղափոխվել դեպի որոշակի գրառում:" + auto_delete_preference: + never: "Երբեք" search: "Որոնում" reminders: today_with_time: "այսօր %{time}" @@ -371,6 +379,7 @@ hy: topic: "Թեմա՝" filtered_topic: "Դուք ֆիլտրել եք դիտման համար՝ միայն մեկ թեմայի բովանդակությունը " filtered_user: "Օգտատեր" + filtered_reviewed_by: "Վերանայվել է" show_all_topics: "ցուցադրել բոլոր թեմաները" deleted_post: "(գրառումը ջնջված է)" deleted_user: "(օգտատերը ջնջված է)" @@ -381,6 +390,7 @@ hy: email: "Էլ. հասցե" name: "Անուն" fields: "Դաշտեր" + reject_reason: "Պատճառ" topics: topic: "Թեմա" reviewable_count: "Քանակ" @@ -413,6 +423,7 @@ hy: created_at_asc: "Ստեղծվել է At (հետադարձ տեսակավորում)" priority: title: "Մինիմալ Գերակայություն" + any: "(ցանկացած)" low: "Բարձր" medium: "Միջին" high: "Կարևոր" @@ -451,10 +462,26 @@ hy: title: "Հաղորդագրությունը Հերթագրված է " reviewable_user: title: "Օգտատեր" + reviewable_post: + title: "Գրառում" approval: title: "Գրառումը Հաստատման Կարիք Ունի" description: "Մենք ստացել ենք Ձեր նոր գրառումը, սակայն այն պետք է հաստատվի մոդերատորի կողմից մինչև ցուցադրվելը: Խնդրում ենք սպասել:" ok: "ՕԿ" + example_username: "օգտանուն" + relative_time_picker: + days: + one: "օր" + other: "օր" + time_shortcut: + later_today: "Այսօր, մի փոքր ուշ" + next_business_day: "Հաջորդ աշխատանքային օրը: " + tomorrow: "Վաղը" + next_week: "Հաջորդ շաբաթ" + later_this_week: "Այս շաբաթ, մի փոքր ավելի ուշ" + start_of_next_business_week_alt: "Հաջորդ Երկուշաբթի: " + next_month: "Հաջորդ ամիս" + custom: "Սահմանել հիշեցումների ամսաթիվն ու ժամանակը:" user_action: user_posted_topic: "%{user}-ը հրապարակել է այս թեման" you_posted_topic: "Դուք հրապարակել եք այս թեման" @@ -470,6 +497,7 @@ hy: sent_by_user: "Ուղարկվել է%{user}-ի կողմից" sent_by_you: "Ուղարկվել է Ձերկողմից" directory: + username: "Օգտանուն" filter_name: "ֆիլտրել ըստ օգտանվան" title: "Օգտատերեր" likes_given: "Տրված" @@ -526,11 +554,17 @@ hy: credentials: username: "Օգտանուն" password: "Գաղտնաբառ" + settings: + title: "Կարգավորումներ" mailboxes: disabled: "անջատված" membership: title: Անդամակցություն access: Թույլտվություն + categories: + title: Կատեգորիաներ + tags: + title: Թեգեր logs: title: "Գրառումներ" when: "Երբ" @@ -541,6 +575,8 @@ hy: details: "Մանրամասներ" from: "Ումից" to: "Ում" + permissions: + title: "Թույլտվություններ" public_admission: "Թույլ տալ օգտատերերին ազատ կերպով միանալ խմբին (Խումբը պետք է լինի հրապարակային)" public_exit: "Թույլ տալ օգտատերերին ազատ կերպով լքել խումբը" empty: @@ -676,6 +712,9 @@ hy: topic_sentence: one: "%{count} թեմա" other: "%{count} թեմա" + topic_stat_unit: + week: "շաբաթ" + month: "ամիս" topic_stat_sentence_week: one: "%{count} նոր թեմա անցյալ շաբաթվա ընթացքում" other: "%{count} նոր թեմա անցյալ շաբաթվա ընթացքում:" @@ -733,7 +772,11 @@ hy: mute_option_title: "Դուք այս օգտատիրոջից որևէ ծանուցում չեք ստանա:" normal_option: "Նորմալ" normal_option_title: "Դուք ծանուցում կստանաք, եթե այդ օգտատերը պատասխանի ձեր հրապարակմանը, մեջբերում անի կամ հիշատակի ձեր անունը:" + notification_schedule: + none: "Ոչ մի" + to: "ում" activity_stream: "Ակտիվություն" + read: "Կարդացած" preferences: "Նախընտրություններ" feature_topic_on_profile: open_search: "Ընտրեք Նոր Թեմա" @@ -769,6 +812,9 @@ hy: first_notification: "Ձեր առաջին ծանուցումն է! Ընտրեք այն՝ սկսելու համար:" dynamic_favicon: "Ցուցադրել քանակը բրաուզերի պատկերակի վրա" theme_default_on_all_devices: "Դարձնել սա լռելյայն թեմա իմ բոլոր սարքավորումների համար" + color_schemes: + undo: "Զրոյացնել" + regular: "Սովորական" text_size_default_on_all_devices: "Դարձնել սա լռելյայն տեքստի չափ իմ բոլոր սարքավորում համար" allow_private_messages: "Թույլ տալ այլ օգտատերերին ուղարկել ինձ անձնական հաղորդագրություններ" external_links_in_new_tab: "Բացել բոլոր արտաքին հղումները նոր ներդիրում(tab)" @@ -815,6 +861,7 @@ hy: muted_categories: "Խլացված" muted_categories_instructions: "Դուք չեք ստանա որևէ ծանուցում այս կատեգորիաների նոր թեմաների մասին, և դրանք չեն հայտնվի կատեգորիաներում կամ վերջին էջերում:" muted_categories_instructions_dont_hide: "Դուք որևէ ծանուցում չեք ստանա այս կատեգորիայի նոր թեմաների վերաբերյալ:" + regular_categories: "Սովորական" no_category_access: "Որպես մոդերատոր՝ Դուք ունեք կատեգորիաների սահմանափակ թույլտվություն, պահպանելն անջատված է:" delete_account: "Ջնջել Իմ Հաշիվը" delete_account_confirm: "Դուք համոզվա՞ծ եք, որ ցանկանում եք մշտապես ջնջել Ձեր հաշիվը: Այս գործողությունը չի կարող ետարկվել!" @@ -856,6 +903,7 @@ hy: tags: "Թեգեր" preferences_nav: account: "Հաշիվ" + security: "Անվտանգություն" profile: "Պրոֆիլ" emails: "Էլ. հասցեներ" notifications: "Ծանուցումներ" @@ -1093,6 +1141,11 @@ hy: pending_tab_with_count: "Սպասող (%{count})" redeemed_tab: "Ընդունված" redeemed_tab_with_count: "Ընդունված (%{count})" + invited_via: "Հրավեր" + groups: "Խմբեր" + topic: "Թեմա" + edit: "Խմբագրել" + remove: "Ջնջել" reinvited: "Հրավերը կրկին է ուղարկված" search: "փնտրել հրավերներ..." user: "Հրավիրված Օգտատեր" @@ -1106,6 +1159,8 @@ hy: topics_entered: "Դիտված Թեմաները" posts_read_count: "Կարդացած Գրառում" expired: "Այս հրավերի ժամկետն անցել է:" + removed_all: "Բոլոր Ժամկետանց Հրավերները հեռացված են!" + remove_all_confirm: "Դուք համոզվա՞ծ եք, որ ցանկանում եք հեռացնել բոլոր ժամկետանց հրավերները:" reinvite_all_confirm: "Դուք համոզվա՞ծ եք, որ ցանկանում եք կրկին ուղարկել բոլոր հրավերները:" time_read: "Կարդացած Ժամանակը" days_visited: "Այցելության Օր" @@ -1255,6 +1310,7 @@ hy: title: "Հաղորդագրություն" invite: "Հրավիրել այլ Մարդկանց..." edit: "Ավելացնել կամ Հեռացնել..." + add: "Ավելացնել" leave_message: "Դուք իսկապե՞ս ցանկանում եք թողնել այս հաղորդագրությունը:" remove_allowed_user: "Դուք իսկապե՞ս ցանկանում եք հեռացնել %{name}-ը այս հաղորդագրությունից:" remove_allowed_group: "Դուք իսկապե՞ս ցանկանում եք հեռացնել %{name}-ը այս հաղորդագրությունից:" @@ -1266,6 +1322,7 @@ hy: trust_level: "Վստահության Մակարդակ" search_hint: "օգտանուն, էլ. հասցե կամ IP հասցե" create_account: + header_title: "Բարի գալուստ!" disclaimer: "Գրանցվելով դուք ընդունում եք գաղտնիության քաղաքականությունը և պայմանները :" failed: "Ինչ-որ սխալ է տեղի ունեցել, հնարավոր է՝ այս էլ. հասցեն արդեն գրանցված է, փորձեք կատարել գաղտնաբառի վերականգնում:" forgot_password: @@ -1494,6 +1551,7 @@ hy: link_dialog_title: "Տեղադրել Հիպերհղումը" link_optional_text: "ընտրովի վերնագիր" link_url_placeholder: "Տեղադրեք URL կամ տեքստը մուտքագրեք՝ թեմաները որոնելու համար" + blockquote_title: "Մեջբերել բաժինը" blockquote_text: "Մեջբերել բաժինը" code_title: "Ձևաչափված տեքստ" code_text: "Անջատել ձևաչափված տեքստը 4 բացատով" @@ -1543,6 +1601,7 @@ hy: toggle_topic_bump: label: "Փոխանջատել թեմայի բարձրացումը " desc: "Պատասխանել՝ առանց պատասխանի վերջին ամսաթիվը փոխելու" + ignore: "Անտեսել" notifications: tooltip: regular: @@ -1582,6 +1641,8 @@ hy: topic_reminder: "%{username} %{description}" watching_first_post: "Նոր Թեմա %{description}" membership_request_accepted: "Անդամակցության հարցումը ընդունվել է՝ '%{group_name}'" + reaction: "%{username} %{description}" + reaction_2: "%{username}, %{username2} %{description}" group_message_summary: one: "%{count} հաղորդագրություն Ձեր %{group_name} մուտքային արկղում" other: "%{count} հաղորդագրություն Ձեր %{group_name}-ի մուտքային արկղում" @@ -1656,6 +1717,7 @@ hy: or_search_google: "Կամ փորձեք որոնել Google-ում:" search_google: "Փորձեք որոնել Google-ում:" search_google_button: "Google" + search_button: "Որոնում" context: user: "Որոնել @%{username}-ի գրառումները" category: "Որոնել #%{category} կատեգորիայում" @@ -1700,10 +1762,14 @@ hy: noreplies: պատասխաններ չունեն single_user: պարունակում են մեկ օգտատեր post: + count: + label: Գրառում time: label: Հրապարակվել է before: մինչև after: հետո + views: + label: Դիտումների hamburger_menu: "գնալ այլ թեմաների ցանկ կամ կատեգորիա" new_item: "նոր" go_back: "ետ գնալ" @@ -1729,6 +1795,7 @@ hy: change_category: "Ավելացնել Կատեգորիա" close_topics: "Փակել Թեմաները" archive_topics: "Արխիվացնել Թեմաները" + move_messages_to_inbox: "Տեղափոխել Մուտքերի արկղ" notification_level: "Ծանուցումներ" choose_new_category: "Ընտրել նոր կատեգորիա թեմաների համար՝" selected: @@ -1754,6 +1821,7 @@ hy: new: "Նոր թեմաներ այլևս չկան:" unread: "Չկարդացած թեմաներ այլևս չկան:" category: "%{category}-ում թեմաներ այլևս չկան:" + tag: "%{tag}-ում թեմաներ այլևս չկան:" top: "Թոփ թեմաներ այլևս չկան:" bookmarks: "Էջանշված թեմաներ այլևս չկան:" topic: @@ -1828,6 +1896,9 @@ hy: jump_reply_up: ցատկել դեպի ավելի վաղ պատասխան jump_reply_down: ցատկել դեպի ավելի հին պատասխան deleted: "Թեման ջնջվել է" + slow_mode_update: + save: "Միացնել" + remove: "Անջատել" topic_status_update: title: "Թեմայի Ժամաչափիչ" save: "Ժամաչափիչ Դնել" @@ -1872,6 +1943,7 @@ hy: auto_open: "Այս թեման ավտոմատ կբացվի %{timeLeft}:" auto_close: "Այս թեման ավտոմատ կփակվի %{timeLeft}:" auto_publish_to_category: "Այս թեման կհրատարակվի #%{categoryName}-ում %{timeLeft}:" + auto_close_after_last_post: "Այս թեման կփակվի վերջին պատասխանից %{duration} հետո:" auto_delete: "Այս թեման ավտոմատ կերպով կջնջվի %{timeLeft}:" auto_bump: "Այս թեման ավտոմատ կբարձրացվի %{timeLeft}:" auto_reminder: "Ձեզ կհիշեցվի այս թեմայի մասին %{timeLeft}:" @@ -1974,6 +2046,7 @@ hy: title: "Կիսվել" extended_title: "Կիսվել հղումով" help: "կիսվել այս թեմայի հղումով" + invite_users: "Հրավիրել" print: title: "Տպել" help: "Բացել այս թեմայի տպման հարմար նախատեսված տարբերակը" @@ -2025,11 +2098,13 @@ hy: username_placeholder: "օգտանուն" action: "Ուղարկել Հրավեր" help: "Հրավիրել մյուսներին այս թեմային էլ. հասցեի կամ ծանուցումների միջոցով" + discourse_connect_enabled: "Մուտքագրեք այն անձի օգտանունը, ում ցանկանում եք հրավիրել այս թեմային:" to_topic_blank: "Մուտքագրեք այն անձի օգտանունը կամ էլ. հասցեն, ում ցանկանում եք հրավիրել այս թեմային:" to_topic_email: "Դուք մուտքագրել եք էլ. հասցե: Մենք կուղարկենք հրավեր, որը թույլ կտա Ձեր ընկերոջը անմիջապես պատասխանել այս թեմային:" to_topic_username: "Դուք մուտքագրել եք օգտանուն: Մենք կուղարկենք ծանուցում՝ այս թեմային հրավերի հղումով:" to_username: "Մուտքագրեք այն անձի օգտանունը, ում ցանկանում եք հրավիրել: Մենք կուղարկենք ծանուցում՝ այս թեմային հրավերի հղումով:" email_placeholder: "name@example.com" + success_email: "Մենք ուղարկել ենք հրավերի էլ. նամակ %{invitee}-ին: Մենք ծանուցում կուղարկենք Ձեզ, երբ հրավերն ընդունվի: Ստուգեք Ձեր էջի հրավերների ներդիրը՝ Ձեր հրավերներին հետևելու համար:" success_username: "Մենք հրավիրել ենք այդ օգտատիրոջը մասնակցելու այս թեմային:" error: "Ներողություն, մենք չկարողացանք հրավիրել այդ մարդուն: Միգուցե նա արդեն հրավիրվա՞ծ է: (Հրավերները սահմանափակ են)" success_existing_email: " %{emailOrUsername} էլ. հասցեով օգատեր արդեն գոյություն ունի: Մենք հրավիրել ենք նրան մասնակցելու այս թեմային:" @@ -2131,6 +2206,7 @@ hy: other: "Դուք ընտրել եք %{count} գրառում:" post: quote_reply: "Մեջբերել" + quote_share: "Կիսվել" edit_reason: "Պատճառը՝ " post_number: "գրառում %{number}" ignored: "Անտեսված բովանդակություն" @@ -2173,6 +2249,8 @@ hy: image_upload_not_allowed_for_new_user: "Ներողություն, նոր օգտատերերը չեն կարող վերբեռնել նկարներ:" attachment_upload_not_allowed_for_new_user: "Ներողություն, նոր օգտատերերը չեն կարող ֆայլեր կցել:" attachment_download_requires_login: "Ներողություն, Դուք պետք է մուտք գործեք՝ կցված ֆայլերը ներբեռնելու համար:" + cancel_composer: + discard: "Չեղարկել" via_email: "այս գրառումը եկել է էլ. նամակով" via_auto_generated_email: "այս գրառումը եկել է ավտոմատ գեներացված էլ. նամակով" whisper: "այս գրառումը գաղտնի շշուկ է մոդերատորների համար" @@ -2225,6 +2303,9 @@ hy: remove_timer: "հեռացնել ժամաչափիչը" actions: people: + like: + one: "հավանել է սա" + other: "հավանել է սա" like_capped: one: "և %{count} այլ անձ հավանել է սա" other: "և %{count} հոգի հավանել են սա" @@ -2337,6 +2418,11 @@ hy: change_in_category_topic: "Խմբագրել Նկարագրությունը" already_used: "Այս գույնը օգտագործվել է մեկ այլ կատեգորիայի կողմից" security: "Անվտանգություն" + permissions: + group: "Խումբ" + see: "Դիտել" + reply: "Պատասխանել" + create: "Ստեղծել" special_warning: "Ուշադրություն. Այս կատեգորիան նախապես ստեղծված կատեգորիա է, և անվտանգության կարգավորումները չեն կարող փոփոխվել: Եթե Դուք չեք ցանկանում օգտագործել այս կատեգորիան, ջնջեք այն՝ փոփոխելու փոխարեն:" uncategorized_security_warning: "Այս կատեգորիան հատուկ է: Այն նախատեսված է որպես կատեգորիա չունեցող թեմաների պահման տարածք; այն չի կարող ունենալ անվտանգության կարգավորումներ:" uncategorized_general_warning: 'Այս կատեգորիան հատուկ է: Այն օգտագործվում է որպես լռելյայն կատեգորիա նոր թեմաների համար, որոնք չունեն ընտրված կատեգորիա: Եթե Դուք ցանկանում եք կանխել սա և պարտադրել կատեգորիայի ընտրությունը, խնդրում ենք անջատել կարգավորումը այստեղ: Եթե ցանկանում եք փոփոխել անունը կամ նկարագրությունը, այցելեք Customize / Text Content:' @@ -2417,6 +2503,14 @@ hy: flagging: title: "Շնորհակալ ենք, որ օգնում եք պահել մեր համայնքը քաղաքակիրթ:" action: "Դրոշակավորել Գրառումը" + take_action_options: + default: + title: "Ձեռնարկել Գործողություն" + details: "Անմիջապես հասնել դրոշակների քանակի սահմանին՝ առանց սպասելու համայնքային ավելի շատ դրոշակների" + suspend: + title: "Սառեցնել Օգտատիրոջը" + silence: + title: "Լռեցնել Օգտատիրոջը" notify_action: "Հաղորդագրություն" official_warning: "Պաշտոնական Զգուշացում" delete_spammer: "Ջնջել Սպամ տարածողին" @@ -2809,6 +2903,10 @@ hy: dismiss: "Չեղարկել" safe_mode: enabled: "Անվտանգ ռեժիմը միացված է, փակեք բրաուզերի այս պատուհանը՝ անվտանգ ռեժիմից դուրս գալու համար:" + do_not_disturb: + remaining: "%{remaining}-ը մնում է" + options: + custom: "Մասնավոր" admin_js: type_to_filter: "գրեք ֆիլտրելու համար..." admin: @@ -2836,6 +2934,8 @@ hy: installed_version: "Տեղադրված է " latest_version: "Վերջինը" problems_found: "Որոշ խորհուրդներ՝ հիմնված Ձեր կայքի ընթացիկ կարգավորումների վրա" + new_features: + dismiss: "Չեղարկել" last_checked: "Վերջին ստուգումը՝ " refresh_problems: "Թարմացնել" no_problems: "Խնդիրներ չեն գտնվել:" @@ -2888,6 +2988,9 @@ hy: view_table: "աղյուսակ" view_graph: "գրաֆիկ" refresh_report: "Թարմացնել Հաշվետվությունը" + daily: Օրվա Ընթացքում + monthly: Ամսվա Ընթացքում + weekly: Շաբաթվա Ընթացքում dates: "Ամսաթվեր (UTC)" groups: "Բոլոր խմբերը" disabled: "Այս հաշվետվությունն անջատված է" @@ -2997,6 +3100,8 @@ hy: revoked: Հետկանչված not_shown_again: 'Այս բանալին՝ էլ երբեք չի ցուցադրվի: Համոզվեք, որ պատճենահանել եք՝ նախքան շարունակելը:' continue: Շարունակել + scopes: + action: Գործողություն web_hooks: title: "Webhook-ներ" none: "Այս պահին webhook-ներ չկան:" @@ -3644,6 +3749,7 @@ hy: censor: "Գրաքննել" require_approval: "Պահանջել Հաստատում" flag: "Դրոշակավորել" + replace: "Փոխարինել" action_descriptions: block: "Արգելել այս բառերը պարունակող գրառումների հրապարակումը: Օգտատերը կտեսնի սխալի հաղորդագրություն, երբ փորձի կատարել գրառում:" censor: "Թույլատրել այս բառերը պարունակող գրառումները, սակայն փոխարինել դրանք սիմվոլներով, որոնք կթաքցնեն գրաքննության ենթարկված բառերը:" @@ -3703,6 +3809,8 @@ hy: check_email: title: "Ցուցադրել այս օգտատիրոջ էլ. հասցեն" text: "Ցուցադրել" + check_sso: + text: "Ցուցադրել" user: suspend_failed: "Այս օգտատիրոջը սառեցնելիս ինչ-որ սխալ է տեղի ունեցել՝ %{error}" unsuspend_failed: "Այս օգտատիրոջը վերականգնելիս ինչ-որ սխալ է տեղի ունեցել՝ %{error}" @@ -3710,6 +3818,7 @@ hy: suspend_reason_label: "Ինչո՞ւ եք սառեցնում այս օգտատիրոջը: Այս տեքստը տեսանելի կլինի բոլորին այս օգտատիրոջ պրոֆիլի էջում և կցուցադրվի օգտատիրոջը, երբ նա փորձի մուտք գործել: Մուտքագրեք կարճ տեքստ:" suspend_reason_hidden_label: "Ինչո՞ւ եք սառեցնում այս օգտատիրոջը: Այս տեքստը կցուցադրվի օգտատիրոջը, երբ նա փորձի մուտք գործել: Մուտքագրեք կարճ տեքստ:" suspend_reason: "Պատճառ" + suspend_reason_title: "Սառեցման Պատճառը" suspend_message: "Էլ. նամակ" suspend_message_placeholder: "Ըստ ցանկության, տրամադրեք ավելի շատ տեղեկություններ սառեցման մասին, և այն կուղարկվի օգտատիրոջը էլ. նամակով:" suspended_by: "Սառեցնող՝ " @@ -3885,6 +3994,12 @@ hy: on_grace_period: "Ներկայումս գտնվում է մակարդակի բարձրացման փուլում, մակարդակը չի իջեցվի" locked_will_not_be_promoted: "Վստահության մակարդակը արգելափակված է: Մակարդակը երբեք չի բարձրացվի:" locked_will_not_be_demoted: "Վստահության մակարդակը արգելափակված է: Մակարդակը երբեք չի իջեցվի:" + discourse_connect: + external_id: "Արտաքին ID" + external_username: "Օգտանուն" + external_name: "Անուն" + external_email: "Էլ. հասցե" + external_avatar_url: "Պրոֆիլի Նկարի URL" user_fields: title: "Օգտատիրոջ Դաշտերը" help: "Ավելացրեք դաշտեր, որոնք Ձեր օգտատերերը կարող են լրացնել:" @@ -4095,6 +4210,9 @@ hy: embed_title_scrubber: "Գրառումների վերնագրի զտման համար օգտագործվող regular expression" embed_truncate: "Կրճատել զետեղված գրառումները" embed_unlisted: "Ներմուծվող թեմաները կցուցադրվեն թեմաների ցանկում միայն՝ պատասխանն ավելացնելուց հետո: " + allowed_embed_selectors: "CSS սելեկտոր այն տարրերի համար, որոնք թույլատրված են զետեղումների մեջ" + blocked_embed_selectors: "CSS սելեկտոր այն տարրերի համար, որոնք հեռացվում են զետեղումներից" + allowed_embed_classnames: "Թույլատրված CSS կլասների անվանումներ" save: "Պահպանել Զետեղման Կարգավորումները" permalink: title: "Մշտահղումներ" diff --git a/config/locales/client.id.yml b/config/locales/client.id.yml index bcd1f1455483f..0b0bd8432cb27 100644 --- a/config/locales/client.id.yml +++ b/config/locales/client.id.yml @@ -135,6 +135,10 @@ id: topic_admin_menu: "tindakan topik" wizard_required: "Selamat datang di Discourse baru Anda! Mari kita mulai dengan wizard pengaturan ✨" emails_are_disabled: "Semua surel yang keluar telah dinonaktifkan oleh administrator. Tidak ada pemberitahuan email yang akan dikirimkan." + software_update_prompt: + dismiss: "Bubar" + bootstrap_mode_enabled: + other: "Untuk lebih memudahkan peluncuran situs baru Anda, Anda berada di mode bootstrap. Semua pengguna baru akan mendapat level 1 dan mendapat ringkasan email harian diaktifkan. Hal ini akan otomatis dimatikan ketika pengguna %{count} sudah ikut." bootstrap_mode_disabled: "Mode bootstrap akan dinonaktifkan dalam 24 jam." themes: default_description: "Asal" @@ -336,6 +340,7 @@ id: topic: "Topik:" filtered_topic: "Anda telah menyaring ke konten yang dapat ditinjau dalam satu topik." filtered_user: "Pengguna" + filtered_reviewed_by: "Diperiksa Oleh" show_all_topics: "tampilkan semua topik" deleted_post: "(pos dihapus)" deleted_user: "(pengguna dihapus)" @@ -383,6 +388,7 @@ id: created_at_asc: "Dibuat Pada (terbalik)" priority: title: "Prioritas Minimum" + any: "(apa saja)" medium: "Sedang" high: "Tinggi" conversation: @@ -425,9 +431,16 @@ id: pending_posts: other: "Anda memiliki %{count} pos sedang menunggu." ok: "OK" + example_username: "username" time_shortcut: + later_today: "Nanti hari ini" + next_business_day: "Hari kerja berikutnya" + tomorrow: "Besok" + next_week: "Minggu depan" + start_of_next_business_week: "Senin" start_of_next_business_week_alt: "Senin Depan" next_month: "Bulan depan" + custom: "Tanggal dan waktu tersuai" user_action: user_posted_topic: "%{user} memposting topik" you_posted_topic: "Anda memposting the topic" @@ -443,6 +456,7 @@ id: sent_by_user: "Dikirim oleh %{user}" sent_by_you: "Dikirim oleh kamu" directory: + username: "Nama Pengguna" filter_name: "Menyaring dari nama pengguna" title: "Pengguna" likes_given: "Mendapatkan" @@ -510,6 +524,10 @@ id: membership: title: Keanggotaan access: Mengakses + categories: + title: Kategori + tags: + title: Label logs: title: "Log" when: "Ketika" @@ -648,6 +666,9 @@ id: subcategories: "Subkategori" topic_sentence: other: "%{count} topik" + topic_stat_unit: + week: "minggu" + month: "bulan" topic_stat_sentence_week: other: "%{count} topik baru dalam seminggu terakhir." topic_stat_sentence_month: @@ -696,7 +717,12 @@ id: add_ignored_user: "Tambahkan..." mute_option: "Bisukan" normal_option: "normal" + notification_schedule: + none: "Tidak ada" + monday: "Senin" + to: "kepada" activity_stream: "Activity" + read: "baca" preferences: "Preferensi" feature_topic_on_profile: open_search: "Pilih Topik Baru" @@ -963,6 +989,11 @@ id: title: "Undangan" pending_tab: "Tertunda" pending_tab_with_count: "Tertunda (%{count})" + invited_via: "Undangan" + groups: "Grup" + topic: "Topik" + edit: "Ubah" + remove: "Hapus" reinvited: "Undangan sudah dikirim ulang" search: "ketik untuk mecari undangan..." user: "Pengguna yang telah diundang" @@ -1079,6 +1110,8 @@ id: hide_session: "Ingat saya besok" hide_forever: "tidak, terima kasih" summary: + description: + other: "Terdapat %{count} balasan." enable: "Rangkum Topik Ini" disable: "Tampilkan Semua Postingan" deleted_filter: @@ -1087,6 +1120,7 @@ id: private_message_info: title: "Pesan" edit: "Tambah atau Hapus..." + add: "Tambahkan..." leave_message: "Apakah Anda yakin ingin meninggalkan pesan ini?" remove_allowed_user: "Apakah Anda yakin ingin menghapus %{name} dari pesan ini?" remove_allowed_group: "Apakah Anda yakin ingin menghapus %{name} dari pesan ini?" @@ -1170,6 +1204,9 @@ id: enter: "Enter" conditional_loading_section: loading: Diproses... + category_row: + topic_count: + other: "%{count} topik dalam kategori ini" select_kit: default_header_text: Pilih... no_content: Tidak ditemukan yang cocok @@ -1193,9 +1230,17 @@ id: reference_topic_title: "RE: %{title}" error: title_missing: "Judul harus ada" + title_too_short: + other: "Judul setidaknya %{count} karakter" + title_too_long: + other: "Judul tidak boleh lebih dari %{count} karakter" post_missing: "Tulisan tidak boleh kosong" + post_length: + other: "Tulisan setidaknya harus %{count} karakter" try_like: "Sudahkah Anda mencoba tombol %{heart}?" category_missing: "Anda harus memilih kategori" + tags_missing: + other: "Anda harus memilih setidaknya %{count} label" save_edit: "Simpah Ubahan" reply_original: "Balas pada Topik Asal" reply_here: "Balas Disini" @@ -1227,6 +1272,7 @@ id: link_dialog_title: "Sisipkan Tautan" link_optional_text: "judul opsional" link_url_placeholder: "Tempel URL atau ketik untuk mencari topik" + blockquote_title: "Blok Kutipan" blockquote_text: "Blok Kutipan" code_title: "Teks terformat" paste_code_text: "ketik atau tempel kode di sini" @@ -1254,6 +1300,7 @@ id: label: "Topik Baru" shared_draft: label: "Konsep Bersama" + ignore: "Abaikan" notifications: tooltip: message: @@ -1291,6 +1338,7 @@ id: title: "mencari topik, artikel, pengguna, atau kategori" full_page_title: "cari topik atau artikel" search_google_button: "Google" + search_button: "Cari" advanced: posted_by: label: Dibuat oleh @@ -1302,6 +1350,7 @@ id: bulk: select_all: "Pilih Semua" dismiss: "Bubar" + move_messages_to_inbox: "Pindah ke Kotak Masuk" notification_level: "Pemberitahuan" choose_new_tags: "Silahkan pilih tag baru untuk topik-topik ini:" none: @@ -1337,6 +1386,16 @@ id: browse_all_categories: Lihat semua kategori view_latest_topics: lihat topik terbaru jump_reply_up: lompat ke balasan sebelumnya + slow_mode_update: + save: "Aktifkan" + remove: "Nonaktifkan" + topic_status_update: + when: "Ketika:" + auto_update_input: + later_today: "Nanti hari ini" + tomorrow: "Besok" + next_week: "Minggu depan" + next_month: "Bulan depan" progress: jump_prompt_or: "atau" notifications: @@ -1370,9 +1429,13 @@ id: title: "Balas" share: help: "share link ke topik ini" + invite_private: + group_name: "nama grup" invite_reply: username_placeholder: "nama pengguna" filters: + n_posts: + other: "%{count} post" cancel: "Hapus filter" split_topic: title: "Pindahkan sebagai Topik Baru" @@ -1387,7 +1450,10 @@ id: placeholder: "username pemilik yang baru" post: edit_reason: "Alasan:" + collapse: "persempit" expand_collapse: "perluas/tutup" + has_replies: + other: "%{count} Balasan" errors: image_upload_not_allowed_for_new_user: "Maaf, pengguna baru belum diperbolehkan mengunggah gambar." attachment_upload_not_allowed_for_new_user: "Maaf, pengguna baru belum diperbolehkan mengunggah lampiran." @@ -1405,6 +1471,9 @@ id: settings: "Pengaturan" tags: "Label" name: "Nama Kategori" + permissions: + reply: "Balas" + review_group_name: "nama grup" notifications: watching: title: "Melihat" @@ -1423,6 +1492,7 @@ id: ignore: "Abaikan" high: "Tinggi" sort_options: + default: "asal" likes: "Suka" posts: "Pos" activity: "Aktifitas" @@ -1447,8 +1517,14 @@ id: replies: "Balasan" activity: "Aktifitas" likes: "Suka" + likes_lowercase: + other: "suka" users: "Pengguna" + users_lowercase: + other: "pengguna" category_title: "Kategori" + raw_email: + not_available: "Tidak tersedia!" filters: with_topics: "%{filter} topik" with_category: "%{filter} %{category} topik" @@ -1479,6 +1555,8 @@ id: lightbox: download: "unduh" keyboard_shortcuts_help: + jump_to: + new: "%{shortcut} Baru" navigation: title: "Navigasi" application: @@ -1499,6 +1577,7 @@ id: tagging: tags: "Label" add_synonyms: "Menambahkan" + sort_by_count: "menghitung" sort_by_name: "nama" cancel_delete_unused: "Batal" filters: @@ -1534,8 +1613,11 @@ id: never: "tidak pernah" dashboard: latest_version: "Terbaru" + new_features: + dismiss: "Bubar" last_checked: "Terakhir dicek" refresh_problems: "Segarkan" + moderators: "Moderator:" private_messages_title: "Pesan" report_filter_any: "apa saja" filter_reports: Filter laporan @@ -1576,6 +1658,8 @@ id: show_details: Detil save: Simpan continue: Lanjutkan + scopes: + action: Aksi web_hooks: save: "Simpan" destroy: "Hapus" @@ -1599,6 +1683,10 @@ id: operations: cancel: label: "Batal" + export_csv: + button_text: "Ekspor" + export_json: + button_text: "Ekspor" customize: preview: "pratinjau" save: "Simpan" @@ -1622,18 +1710,23 @@ id: enable: "Aktifkan" disable: "Nonaktifkan" add: "Menambahkan" + colors: + undo: "batalkan perintah" + revert: "dibalik" email: title: "Surel" settings: "Pengaturan" sent: "Mengirim" received: "Menerima" rejected: "Ditolak" + time: "Waktu" user: "Pengguna" to_address: "Kepada Alamat" test_email_address: "alamat email uji coba" sent_test: "terkirim!" delivery_method: "Metode Pengiriman" refresh: "Segarkan" + sending_email: "Mengirimkan surel..." html: "html" incoming_emails: from_address: "Dari" @@ -1680,7 +1773,9 @@ id: label: "Baru:" ip_address: "Alamat IP" add: "Menambahkan" + filter: "Cari" watched_words: + search: "cari" clear_filter: "Bersihkan" form: add: "Menambahkan" @@ -1694,6 +1789,7 @@ id: new: "Baru" active: "Aktif" staff: "Staf" + approved: "Disetujui?" titles: active: "Pengguna Aktif" new: "Pengguna Baru" @@ -1702,9 +1798,13 @@ id: check_email: title: "Tampilkan alamat email pengguna ini" text: "Tunjukkan" + check_sso: + text: "Tunjukkan" user: suspend_reason: "Alasan" silence_reason: "Alasan" + moderator: "Moderator?" + admin: "Admin?" show_admin_profile: "Admin" log_out: "Keluar" activity: Aktifitas @@ -1725,12 +1825,18 @@ id: posts_read: "Tulisan dilihat" likes_given: "Likes Diberikan" likes_received: "Likes Diterima" + discourse_connect: + external_username: "Nama Pengguna" + external_name: "Nama" + external_email: "Email" user_fields: save: "Simpan" edit: "Ubah" delete: "Hapus" cancel: "Batal" options: "Pilihan" + site_text: + edit: "ubah" settings: none: "Tak ada" site_settings: @@ -1746,6 +1852,7 @@ id: email: "Email" uncategorized: "Lainnya" tags: "Label" + search: "Cari" groups: "Grup" default_categories: modal_yes: "Ya" @@ -1761,6 +1868,8 @@ id: emoji: uploading: "Mengunggah..." name: "Nama" + embedding: + edit: "ubah" permalink: topic_title: "Topik" category_title: "Kategori" @@ -1776,6 +1885,7 @@ id: upload: "Unggah" uploading: "Mengunggah..." invites: + add_user: "menambahkan" roles: admin: "Admin" moderator: "Moderator" diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index a1cd4246439a2..a83d66bf020d0 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -4385,6 +4385,7 @@ it: require_approval: "Richiede Approvazione" flag: "Segnala" replace: "Sostituisci" + tag: "Etichetta" action_descriptions: block: "Impedisci che i messaggi contenenti queste parole siano pubblicati. L'utente visualizzerà un messaggio di errore quando cercherà di pubblicare il messaggio." censor: "Consenti i messaggi contenenti queste parole, ma sostituiscile con caratteri che nascondono le parole censurate." diff --git a/config/locales/client.ja.yml b/config/locales/client.ja.yml index 56f480e328960..ad632e398c1ce 100644 --- a/config/locales/client.ja.yml +++ b/config/locales/client.ja.yml @@ -136,6 +136,8 @@ ja: topic_admin_menu: "トピックアクション" wizard_required: "Discourseへようこそ! さあセットアップウィザードから始めましょう" emails_are_disabled: "メールアドレスの送信は管理者によって無効化されています。全てのメール通知は行われません" + software_update_prompt: + dismiss: "閉じる" bootstrap_mode_enabled: other: "簡単にサイトを立ち上げられるように、ブートストラップモードにしました。\nすべての新規ユーザーはトラストレベル1となり、毎日のサマリーメールが有効な状態です。この設定は%{count}名のユーザーが参加した時に自動的に無効になります。" bootstrap_mode_disabled: "ブートストラップモードは24時間以内に無効になります。" @@ -198,6 +200,8 @@ ja: now: "たった今" read_more: "もっと読む" more: "もっと読む" + x_more: + other: "%{count} リンク" less: "減らす" never: "決して" every_30_minutes: "30分毎" @@ -414,6 +418,7 @@ ja: created_at_asc: "作成日時 (昇順)" priority: title: "最小の優先度" + any: "(任意)" medium: "普通" high: "高い" conversation: @@ -451,6 +456,8 @@ ja: title: "キューに登録された投稿" reviewable_user: title: "ユーザー" + reviewable_post: + title: "投稿" approval: title: "この投稿は承認が必要です" description: "新しい投稿はモデレータによる承認が必要です。しばらくお待ち下さい。" @@ -674,6 +681,7 @@ ja: remove_owner_description: "%{username} をこのグループから削除します" make_primary: "優先にする" make_primary_description: "これを %{username}のプライマリグループにします" + remove_primary: "プライマリとして削除" remove_primary_description: "%{username}のプライマリグループとしてこれを削除" remove_members: "メンバーを削除する" remove_members_description: "このグループから選択したユーザーを削除する" @@ -836,6 +844,7 @@ ja: friday: "金曜日" saturday: "土曜日" sunday: "日曜日" + to: "宛先" activity_stream: "アクティビティ" read: "既読" read_help: "最近読んだトピック" @@ -986,6 +995,7 @@ ja: tags: "タグ" preferences_nav: account: "アカウント" + security: "セキュリティ" profile: "プロフィール" emails: "メール" notifications: "お知らせ" @@ -1258,6 +1268,12 @@ ja: pending_tab_with_count: "保留中 (%{count})" redeemed_tab: "確認済み" redeemed_tab_with_count: "確認済み (%{count})" + invited_via: "招待" + groups: "グループ" + topic: "トピック" + expires_at: "有効期限" + edit: "編集" + remove: "削除" reinvited: "再度招待しました" search: "招待履歴を検索" user: "招待したユーザ" @@ -1270,6 +1286,9 @@ ja: topics_entered: "閲覧したトピックの数" posts_read_count: "読んだ投稿" expired: "この招待の有効期限が切れました。" + remove_all: "期限切れの招待を削除" + removed_all: "期限切れの招待はすべて削除されました!" + remove_all_confirm: "期限切れの招待をすべて削除してもよろしいですか?" reinvite_all_confirm: "本当に全ての招待を再送したいですか?" time_read: "読んだ時間" days_visited: "閲覧された日数" @@ -1422,6 +1441,8 @@ ja: value_prop: "アカウントを作成した後、いま読んでいるページへ戻ります。また、新しい投稿があった場合はこことメールにてお知らせします。 いいね!を使って好きな投稿をみんなに教えましょう。 :heartbeat:" summary: enabled_description: "トピックのまとめを表示されています。" + description: + other: "%{count}件の返信があります。" enable: "このトピックを要約する" disable: "すべての投稿を表示する" deleted_filter: @@ -1780,6 +1801,8 @@ ja: granted_badge: "'%{description}'バッジをゲット!" topic_reminder: "%{username} %{description}" watching_first_post: "新しいトピック %{description}" + reaction: "%{username} %{description}" + reaction_2: "%{username}, %{username2} %{description}" votes_released: "%{description} - 完了" group_message_summary: other: "%{group_name} 宛のメッセージが %{count} 通あります" @@ -1841,6 +1864,7 @@ ja: or_search_google: "あるいは、Google検索で試してみてください:" search_google: "Google検索で試してみてください:" search_google_button: "Google" + search_button: "検索" context: user: "@%{username}の投稿を検索" category: "#%{category} から検索する" @@ -1887,6 +1911,8 @@ ja: label: 投稿されたタイミング before: より前 after: より後 + views: + label: 表示 hamburger_menu: "他のトピック一覧やカテゴリを見る" new_item: "新しい" go_back: "戻る" @@ -1912,6 +1938,7 @@ ja: change_category: "カテゴリを設定する" close_topics: "トピックをクローズする" archive_topics: "アーカイブトピック" + move_messages_to_inbox: "受信ボックスへ移動" notification_level: "通知" choose_new_category: "このトピックの新しいカテゴリを選択してください" selected: @@ -2011,12 +2038,21 @@ ja: slow_mode_update: select: "ユーザーは、このトピックに一度だけ投稿できます。" save: "有効" + remove: "無効にする" + durations: + 10_minutes: "10分" + 15_minutes: "15分" + 30_minutes: "30分" + 45_minutes: "45分" + 1_hour: "1時間" + 2_hours: "2時間" topic_status_update: save: "タイマーをセットする" num_of_hours: "時間数" remove: "タイマーをはずす" publish_to: "公開先:" when: "公開時間:" + time_frame_required: "時間枠を選択してください" auto_update_input: later_today: "今日中" tomorrow: "明日" @@ -2046,6 +2082,7 @@ ja: auto_open: "このトピックはあと%{timeLeft}で自動的にオープンします。" auto_close: "このトピックはあと%{timeLeft}で自動的にクローズします。" auto_publish_to_category: "このトピックはあと %{timeLeft} で、#%{categoryName} にて公開されます。" + auto_close_after_last_post: "このトピックは最後の返信から%{duration} 後にクローズされます" auto_delete: "このトピックはあと%{timeLeft}で自動的に削除されます。" auto_reminder: "このトピックについて、%{timeLeft} 後にリマインドします。" auto_close_title: "オートクローズの設定" @@ -2062,6 +2099,9 @@ ja: go: "へ" jump_bottom: "最後の投稿へ" jump_prompt: "ジャンプする..." + jump_prompt_of: + other: "%{count} 投稿" + jump_prompt_long: "ジャンプする..." jump_bottom_with_number: "%{post_number}番へジャンプ" jump_prompt_or: "または" total: 投稿の合計 @@ -2141,6 +2181,7 @@ ja: share: title: "シェア" help: "このトピックのリンクをシェアする" + invite_users: "招待" print: title: "印刷" help: "印刷用の表示にする" @@ -2159,6 +2200,8 @@ ja: already_pinned: other: "%{categoryLink}で固定表示されているトピック: %{count}" pin_globally: "このトピックをすべてのトピックリストのトップに表示する" + confirm_pin_globally: + other: "全体で既に %{count} トピックを固定表示しています。固定表示が多すぎると、新規あるいは匿名ユーザの負担になる場合があります。このカテゴリにおいてさらに固定表示設定してもよいですか?" unpin_globally: "トピック一覧のトップからこのトピックを削除します" unpin_globally_until: "このトピックをすべてのトピックリストのトップから削除するか、%{until} まで待つ。" global_pin_note: "ユーザはトピックを個別に固定表示解除することができます。" @@ -2187,6 +2230,7 @@ ja: username_placeholder: "ユーザ名" action: "招待を送る" help: "このトピックに他のユーザをメールまたは通知で招待する。" + discourse_connect_enabled: "このトピックに招待したい人のユーザ名を入れてください" to_topic_blank: "このトピックに招待したい人のユーザ名かメールアドレスを入れてください" to_topic_email: "あなたはメールアドレスを入力しました。フレンドがすぐにこのトピックへ返信できるようにメールで招待します。" to_topic_username: "ユーザ名を入力しました。このトピックへの招待リンクの通知を送信します。" @@ -2256,6 +2300,7 @@ ja: other: "%{count}個の投稿を選択中。" post: quote_reply: "引用" + quote_share: "シェア" edit_reason: "理由: " post_number: "投稿%{number}" ignored: "無視したコンテンツ" @@ -2267,6 +2312,7 @@ ja: show_hidden: "無視したコンテンツを見る" deleted_by_author: other: "(投稿は投稿者により削除されました。何らかの通報がされていない限り、%{count}時間後に自動的に削除されます)" + collapse: "折りたたむ" expand_collapse: "開く/折りたたむ" gap: other: "%{count}個の返信をすべて表示する" @@ -2321,6 +2367,9 @@ ja: grant_badge: "バッジを付与" delete_topic: "トピック削除" actions: + people: + like: + other: "「いいね!」する" by_you: off_topic: "関係のない話題として通報しました" spam: "スパム報告として通報しました" @@ -2403,6 +2452,10 @@ ja: change_in_category_topic: "カテゴリ内容を編集" already_used: "この色は他のカテゴリで利用しています" security: "セキュリティ" + permissions: + group: "グループ" + see: "閲覧できる" + reply: "返信" images: "画像" email_in: "カスタムメールアドレス:" email_in_allow_strangers: "登録されていないユーザからメールを受け取ります" @@ -2434,6 +2487,7 @@ ja: ignore: "無視する" high: "高い" sort_options: + default: "デフォルト" likes: "いいね!" views: "表示" posts: "投稿" @@ -2447,6 +2501,12 @@ ja: flagging: title: "報告していただきありがとうございます。" action: "投稿を通報" + take_action_options: + default: + title: "アクションをする" + details: "誰かが通報するのを待つのではなく、通報しましょう。" + suspend: + title: "凍結中のユーザ" notify_action: "メッセージ" official_warning: "運営スタッフからの警告" delete_spammer: "スパムの削除" @@ -2596,6 +2656,7 @@ ja: readonly: "閲覧できる" lightbox: download: "ダウンロード" + counter: "%curr% / %total%" keyboard_shortcuts_help: title: "ショートカットキー" jump_to: @@ -2654,6 +2715,8 @@ ja: title: バッジ badge_count: other: "%{count}個のバッジ" + more_badges: + other: "+%{count} リンク" select_badge_for_title: プロフィールの肩書きに付けるバッジを選んでください none: "(なし)" badge_grouping: @@ -2680,11 +2743,14 @@ ja: rename_tag: "タグの名前を変更" rename_instructions: "このタグの新しい名前を選択:" sort_by: "並べ替え:" + sort_by_count: "カウント" sort_by_name: "名前" manage_groups: "タグのグループを管理" upload_successful: "タグのアップロードに成功しました" delete_unused: "使われていないタグを削除" cancel_delete_unused: "キャンセル" + filters: + without_category: "%{filter} %{tag} トピック" notifications: watching: title: "ウォッチ中" @@ -2756,6 +2822,8 @@ ja: installed_version: "インストール済み" latest_version: "最新" problems_found: "現在のサイト設定に基づいたアドバイス" + new_features: + dismiss: "閉じる" last_checked: "最終チェック" refresh_problems: "更新" no_problems: "問題は見つかりませんでした。" @@ -2787,6 +2855,9 @@ ja: all: "全て" view_table: "table" refresh_report: "Refresh Report" + daily: 日ごと + monthly: 月ごと + weekly: 毎週 groups: "すべてのグループ" disabled: "このレポートは利用不可" filters: @@ -2806,6 +2877,7 @@ ja: manage: interaction: email: Eメール + incoming_email: "カスタムメールアドレス" incoming_email_placeholder: "メールアドレスを入力" visibility: 可視性 visibility_levels: @@ -2849,6 +2921,8 @@ ja: description: 説明 save: 保存 continue: 続く + scopes: + action: アクション web_hooks: title: "Webhooks" none: "現在、Webhooksはありません。" @@ -2957,6 +3031,7 @@ ja: color: "カラー" opacity: "透明度" copy: "コピー" + copy_to_clipboard: "クリップボードにコピー" copied_to_clipboard: "クリップボードにコピーしました" copy_to_clipboard_error: "クリップボードにコピーする際にエラーが発生しました" email_templates: @@ -2968,6 +3043,7 @@ ja: revert_confirm: "本当に変更を元に戻しますか?" theme: theme: "テーマ" + customize_desc: "カスタマイズ:" create_type: "タイプ" create_name: "名前" edit: "編集" @@ -2982,6 +3058,7 @@ ja: install_popular: "人気" about_theme: "このサイトについて" license: "ライセンス" + version: "Version:" enable: "利用できます" disable: "利用できません" check_for_updates: "アップデートを確認" @@ -3249,12 +3326,15 @@ ja: check_email: title: "メールアドレスを表示する" text: "表示する" + check_sso: + text: "詳しく見る" user: suspend_failed: "ユーザの凍結に失敗しました: %{error}" unsuspend_failed: "ユーザの凍結解除に失敗しました: %{error}" suspend_duration: "ユーザを何日間凍結しますか?" suspend_reason_label: "アカウントを凍結する理由を説明してください。ここに書いた理由は、このユーザのプロファイルページにおいて全員が閲覧可能な状態で公開されます。またこのユーザがログインを試みた際にも表示されます。" suspend_reason: "理由" + suspend_reason_title: "凍結理由" suspend_message: "メールメッセージ" suspended_by: "凍結したユーザ" silence_reason: "理由" @@ -3375,6 +3455,12 @@ ja: on_grace_period: "現在の昇格期間中は、降格されません" locked_will_not_be_promoted: "トラストレベルはロックされています。昇格することはありません" locked_will_not_be_demoted: "トラストレベルはロックされています。降格することはありません" + discourse_connect: + external_id: "External ID" + external_username: "ユーザー名" + external_name: "名前" + external_email: "Eメール" + external_avatar_url: "プロフィール画像URL" user_fields: title: "ユーザフィールド" help: "ユーザが記入する項目(フィールド)を追加します" @@ -3547,6 +3633,9 @@ ja: add_host: "ホストの追加" settings: "埋め込みの設定" embed_truncate: "埋め込まれた投稿を削除する" + allowed_embed_selectors: "埋め込みで許可される要素のCSSセレクタ" + blocked_embed_selectors: "埋め込みから削除された要素のCSSセレクタ" + allowed_embed_classnames: "許可されたCSSクラス名" save: "埋め込みの設定を保存" permalink: title: "パーマリンク" diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index 8d2604d659f45..01a7e07a3d101 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -2578,6 +2578,7 @@ ko: attachment_download_requires_login: "죄송합니다. 첨부 파일을 받으려면 로그인이 필요합니다." cancel_composer: confirm: "사용자님의 게시물에 대해 무엇을하고 싶습니까?" + discard: "포기" save_draft: "나중을 위해 초안 저장" keep_editing: "편집 유지" via_email: "이 주제는 이메일을 통해 등록되었습니다." diff --git a/config/locales/client.lt.yml b/config/locales/client.lt.yml index 14fbb7c8ae818..ef8924a82e312 100644 --- a/config/locales/client.lt.yml +++ b/config/locales/client.lt.yml @@ -197,6 +197,8 @@ lt: topic_admin_menu: "temos veiksmai" wizard_required: "Sveiki, tai jūsų naujasis Discourse! Pradėkime nuoInstliacijos✨" emails_are_disabled: "Visos išeinančios elektroninės žinutės buvo uždraustos administratoriaus. Jokių papildų įspėjamųjų žinučių nebus išsiųsta" + software_update_prompt: + dismiss: "Praleisti" bootstrap_mode_disabled: "Paleidimo režimas bus išjungtas per 24 valandas." themes: default_description: "Numatytasis" @@ -259,6 +261,11 @@ lt: now: "Ką tik" read_more: "skaityti daugiau" more: "Daugiau" + x_more: + one: "%{count} Daugiau" + few: "%{count} Daugiau" + many: "%{count} Daugiau" + other: "%{count} Daugiau" less: "Mažiau" never: "niekada" every_30_minutes: "kas 30 minučių" @@ -372,6 +379,7 @@ lt: username: "Slapyvardis" email: "Epaštas" name: "Vardas" + reject_reason: "Priežastis" topics: topic: "Tema" reviewable_count: "Skaičiuoti" @@ -425,10 +433,26 @@ lt: title: "Pažymėtas pranešimas" reviewable_user: title: "Narys" + reviewable_post: + title: "Įrašai" approval: title: "Įrašui reikalingas patvirtinimas" description: "Mes gavome tavo naują įrašą, tačiau jis turi būti patvirtintas moderatoriaus. Ačiū už kantrybę!" ok: "GERAI" + example_username: "Vartotojo vardas" + relative_time_picker: + days: + one: "diena" + few: "dienos" + many: "dienos" + other: "dienos" + time_shortcut: + later_today: "Šiandien vėliau" + tomorrow: "Rytoj" + next_week: "Kitą savaitę" + later_this_week: "Šia savaitę vėliau" + start_of_next_business_week: "Pirmadienis" + next_month: "Kitą mėnesį" user_action: user_posted_topic: "%{user} paskelbė temą" you_posted_topic: "Tu paskelbei temą" @@ -444,6 +468,7 @@ lt: sent_by_user: "Išsiuntė %{user}" sent_by_you: "Išsiųsta nuo jūsų" directory: + username: "Slapyvardis" filter_name: "rušiuoti pagal vartotojus" title: "Vartotojai" likes_given: "Duota" @@ -494,11 +519,17 @@ lt: credentials: username: "Slapyvardis" password: "Slaptažodis" + settings: + title: "Nustatymai" mailboxes: disabled: "uždrausta" membership: title: Narystė access: Prieiga + categories: + title: Kategorijos + tags: + title: Etiketės logs: title: "Atąskaita" when: "Kada" @@ -509,6 +540,8 @@ lt: details: "Detalės" from: "Nuo" to: "Kam" + permissions: + title: "Leidimai" public_admission: "Leisti vartotojams laisvai prisijungti prie grupės (reikalauja viešai matomos grupės)" public_exit: "Leisti vartotojams laisvai išeiti iš grupės" empty: @@ -631,6 +664,9 @@ lt: few: "%{count} temos" many: "%{count}temų" other: "%{count}temos" + topic_stat_unit: + week: "savaitė" + month: "mėnesis" ip_lookup: title: IP adreso peržiųra hostname: Adresas @@ -672,7 +708,12 @@ lt: ignore_option: "Nepaisoma" mute_option: "Nutildyta" normal_option: "Įprastas" + notification_schedule: + none: "Nieko" + monday: "Pirmadienis" + to: "kam" activity_stream: "Aktyvumas" + read: "Perskaityti" preferences: "Nustatymai" feature_topic_on_profile: save: "Saugoti" @@ -699,6 +740,8 @@ lt: dismiss_notifications: "Atmesti visus" dismiss_notifications_tooltip: "Pažymėkite visus pranešimus kaip Perskaitytus." first_notification: "Asmeniniai perspėjimai. Jūs galite atlikti jums reikiamą užklausą pasirinkdami atitinkamus nustatymus." + color_schemes: + regular: "Nuolatinės" allow_private_messages: "Leisti kitiems vartotojams siųsti man asmeninius pranešimus" external_links_in_new_tab: "Atidaryti visas pridėtas nuorodas naujame lange" enable_quoting: "Įjungti citatų atsakymus pabrėžtam tekstui" @@ -739,6 +782,7 @@ lt: watched_first_post_tags: "Stebime Pirmą Įrašą" watched_first_post_tags_instructions: "Jūs būsite perspėjami apie įrašus kėkvienoje naujoje temoje su pasirinktomis etiketėmis." muted_categories: "Nutildytos" + regular_categories: "Nuolatinės" delete_account: "Ištrinti mano vartotoją" delete_account_confirm: "Ar tikrai norite visam laikui ištrinti savo paskyrą? Šis veiksmas yra galutinis." deleted_yourself: "Jūsų paskyra sėkmingai ištrinta." @@ -776,6 +820,7 @@ lt: tags: "Gairės" preferences_nav: account: "Paskyra" + security: "Saugumo" profile: "Profilis" emails: "Epaštai" notifications: "Pranešimai" @@ -946,6 +991,10 @@ lt: pending_tab_with_count: "Neperskaityti (%{count})" redeemed_tab: "Atstatyta" redeemed_tab_with_count: "Atstatyta (%{count})" + groups: "Grupės" + topic: "Tema" + edit: "Redaguoti" + remove: "Pašalinti" reinvited: "Pakvietimas persiųstas" search: "įveskite, kad ieškotumete pakvietim" user: "Pakviestas vartotojas" @@ -1103,6 +1152,7 @@ lt: trust_level: "Patikimumo lygis" search_hint: "vartotojo vardas, el. paštas arba IP adresas" create_account: + header_title: "Sveiki!" failed: "Įvyko kažkas blogai, gali būti, kad šis el. paštas jau yra užregistruotas, pameginkite pasinaudoti slaptažodžio priminimo nuoroda" forgot_password: title: "Slaptažodžio atkūrimas" @@ -1252,6 +1302,7 @@ lt: link_description: "įveskite čia nuorodos aprašymą" link_dialog_title: "Įkelti nuorodą" link_optional_text: "papildoma antraštė" + blockquote_title: "Blokuoti citatą" blockquote_text: "Blokuoti citatą" code_title: "Tekstas kodui" code_text: "Tekstą kodui atitraukite per 4 tarpelius " @@ -1282,6 +1333,7 @@ lt: label: "Nauja tema" shared_draft: label: "Bendrinami juodraščiai" + ignore: "Ignoruoti" notifications: tooltip: regular: @@ -1321,6 +1373,8 @@ lt: granted_badge: "Gavote '%{description}'" topic_reminder: "%{username} %{description}" watching_first_post: "Nauja tema %{description}" + reaction: "%{username} %{description}" + reaction_2: "%{username}, %{username2} %{description}" group_message_summary: one: "%{count} žinutė, jūsų %{group_name}pato dėžutėje" few: "%{count} žinutės, jūsų %{group_name}pato dėžutėje" @@ -1372,6 +1426,7 @@ lt: results_page: "Paieškos rezultatai ir '%{term}'" start_new_topic: "Galbūt pradėkite naują temą?" search_google_button: "Google" + search_button: "Paieška" context: user: "Ieškoti įrašų nuo @%{username}" category: "Ieškoti #%{category}kategorijoje" @@ -1413,6 +1468,8 @@ lt: label: Paskelbta before: anksčiau after: po to + views: + label: Peržiūros hamburger_menu: "Eiti į kitą temų sąrašą ar kategoriją" new_item: "Nauja" go_back: "grįžti atgal" @@ -1437,6 +1494,7 @@ lt: change_category: "Nustatyti kategoriją" close_topics: "Uždaryti temas" archive_topics: "Archyvuoti temas" + move_messages_to_inbox: "Perkelti į Pranešimų dėžutę" notification_level: "Pranešimai" choose_new_category: "Pasirinkti naują kategoriją temoms:" selected: @@ -1459,6 +1517,7 @@ lt: new: "Daugiau nėra jokių naujų temų." unread: "Daugiau nėra jokių neperskaitytų temų." category: "Daugiau nėra jokių temų kategorijoje %{category}." + tag: "Daugiau nėra jokių temų kategorijoje %{tag}." top: "Daugiau nėra jokių populiarių temų." bookmarks: "Daugiau pažymėtų temų nėra" topic: @@ -1536,6 +1595,9 @@ lt: jump_reply_up: Pereiti į ankstesnį atsakymą jump_reply_down: Pereitį į sekantį atsakymą deleted: "Tema buvo ištrinta" + slow_mode_update: + save: "Įjungti" + remove: "Išjungti" topic_status_update: title: "Temos laikmatis" save: "Nustatyti laikmatį" @@ -1564,6 +1626,7 @@ lt: status_update_notice: auto_open: "Ši tema automatiškai atsidarys po %{timeLeft} ." auto_close: "Ši tema automatiškai užsidarys po %{timeLeft}." + auto_close_after_last_post: "Ši tema užsidarys po %{duration} po paskutinio atsakymo." auto_close_title: "Automatinio uždarymo nustatymai" timeline: back: "Atgal" @@ -1575,6 +1638,7 @@ lt: go: "eiti" jump_bottom: "Pereiti į sekantį įrašą" jump_prompt: "peršokti į..." + jump_prompt_long: "Peršokti į..." jump_bottom_with_number: "pereiti į įrašą %{post_number}" jump_prompt_or: "arba" total: visi įrašai @@ -1645,6 +1709,7 @@ lt: share: title: "Pasidalinti" help: "Pasidalink šios temos nuoroda" + invite_users: "Kviesti" print: title: "Spausdinti" help: "Atverti spausdinimui draugišką šios temos versiją" @@ -1695,11 +1760,13 @@ lt: username_placeholder: "Slapyvardis" action: "Siųsti pakvietimą" help: "pakviesk kitus į šią temą el. laišku ar pranešimu" + discourse_connect_enabled: "Įveskite vartotojo vardą žmogaus, kurį norite pakviesti į šią temą." to_topic_blank: "Įrašykite vartotojo vardą ar el. paštą žmogaus, kurį norite pakviesti į šią temą." to_topic_email: "El. paštas įvestas. Mes išsiųsime trumpą el. laišką, kuris suteiks galimybę iš karto atsakyti į temą." to_topic_username: "Vartotojo vardas įvestas. Mes išsiųsime pranešimą su nuoroda į šią temą." to_username: "Įveskite vartotojo vardą žmogaus, kurį norite pakviesti. Mes išsiųsime pranešima su nuoroda į šią temą." email_placeholder: "vardas@pavizdys.lt" + success_email: "Mes išsiuntėme pakvietimą į %{invitee}. Mes pranešime, kai pakvietimas bus patvirtintas. Stebėk pakvietimų kortelę savo paskyroje, kad žinotum pakvietimo statusą." success_username: "Vartotojas buvo pakviestas dalyvauti temoje." error: "Atsiprašome, tačiau nepavyko pakviesti šio žmogaus. Gal būt jis jau buvo pakviestas?" login_reply: "Prisijunk, kad atsakytum" @@ -1769,6 +1836,7 @@ lt: other: "Jūs pasirinkote %{count} įrašus." post: quote_reply: "Citata" + quote_share: "Pasidalinti" edit_reason: "Priežastis:" post_number: "įrašas %{number}" reply_as_new_topic: "Atsakyti naujoje temoje" @@ -1780,6 +1848,7 @@ lt: few: "(autoriaus išimtas įrašas automatiškai bus ištrintas per %{count} valandas, nebent turėjo vėliavą)" many: "(autoriaus išimtas įrašas automatiškai bus ištrintas per %{count} valandas, nebent turėjo vėliavą)" other: "(autoriaus išimtas įrašas automatiškai bus ištrintas per %{count} valandas, nebent turėjo vėliavą)" + collapse: "suskleisti" expand_collapse: "išskleisti/suskleisti" gap: one: "Peržiūrėti %{count} paslėptą atsakymą" @@ -1856,6 +1925,11 @@ lt: delete_topic: "ištrinti temą" actions: people: + like: + one: "mėgstate" + few: "mėgstate" + many: "mėgstate" + other: "mėgstate" like_capped: one: "ir %{count}kitas mėgsta tai" few: "ir %{count}kitų mėgsta tai" @@ -1931,6 +2005,11 @@ lt: change_in_category_topic: "Redaguoti aprašyma" already_used: "Ši spalva jau priskirta prie kitos kategorijos" security: "Saugumo" + permissions: + group: "Grupė" + see: "Peržiūrėti" + reply: "Atsakyti" + create: "Sukurti" special_warning: "Įspėjimas: Ši kategorija yra iš anksto numatyta kategorija ir saugumo nustatymai negali būti keičiami. Jeigu nenorite naudoti šios kategorijos, ištrinkie ją vietoj pakartotino naudojimo." images: "Paveiksliukai" email_in: " papildomas naujas el. pašto adresas:" @@ -1962,6 +2041,7 @@ lt: options: normal: "Įprastas" ignore: "Ignoruoti" + high: "Aukštas" sort_options: default: "numatytasis" likes: "Mėgsta" @@ -1981,6 +2061,14 @@ lt: flagging: title: "Ačiū, kad padedi padedi išlaikyti forumą civilizuotu!" action: "Uždėti Įrašui Vėliavą" + take_action_options: + default: + title: "Imtis Veiksmų" + details: "Prieiti prie vėliavų ribos tuoj pat, o ne laukti daugiau vartotojų vėliavų" + suspend: + title: "Sustabdyti vartotoją" + silence: + title: "Nutildyti narį" notify_action: "Žinutės" official_warning: "Oficialus įspėjimas" delete_spammer: "Ištrinti Vartotoją" @@ -2169,6 +2257,7 @@ lt: readonly: "Peržiūrėti" lightbox: download: "atsisiųsti" + counter: "%curr% iš %total%" keyboard_shortcuts_help: title: "Klaviatūros trumpiniai" jump_to: @@ -2295,6 +2384,9 @@ lt: back: "Atgal" share: "Dalintis" dismiss: "Praleisti" + do_not_disturb: + options: + custom: "Išskirtinės" admin_js: type_to_filter: "įrašyk kažką dėl filtro..." admin: @@ -2316,11 +2408,14 @@ lt: version_check_pending: "Matomai jūs nesenai atsinaujinote. Nuostabu!" installed_version: "Įrašyta" latest_version: "Naujausia" + new_features: + dismiss: "Praleisti" last_checked: "Paskutinį kartą tikrinta" refresh_problems: "Atnaujinti" no_problems: "Nerasta jokių problemų" moderators: "Moderatoriai:" admins: "Administratoriai:" + silenced: "Nutildytas:" suspended: "Sustabdyti:" private_messages_short: "Msgs" private_messages_title: "Žinutės" @@ -2354,6 +2449,9 @@ lt: all: "Visi" view_table: "table" refresh_report: "Refresh Report" + daily: Kasdien + monthly: Kas mėnesį + weekly: Kas savaitę groups: "Visos grupės" trending_search: more: 'Paieškos įrašai' @@ -2422,6 +2520,8 @@ lt: description: Aprašymas save: Saugoti continue: Tęsti + scopes: + action: Veiksmas web_hooks: create: "Sukurti" save: "Saugoti" @@ -2535,6 +2635,7 @@ lt: revert_confirm: "Ar tikrai nori atstatyti pakeitimus?" theme: theme: "Tema" + customize_desc: "Pakeisti:" title: "Temos" create: "Sukurti" create_type: "Tipas" @@ -2554,6 +2655,7 @@ lt: install_popular: "Populiaros" about_theme: "Apie" license: "Licensija" + version: "Versija:" enable: "Įgalinti" disable: "Išjungti" component_of: "Komponentas:" @@ -2782,6 +2884,7 @@ lt: title: "Klaidų įrašai" watched_words: title: "Peržiūrėti Žodžiai" + search: "paieška" clear_filter: "Išvalyti" download: Atsisiųsti clear_all: Išvalyti viską @@ -2812,6 +2915,8 @@ lt: active: "Aktyvūs" staff: "Komanda" suspended: "Sustabdyti" + silenced: "Nutildytas" + staged: "Inscenizuotas" approved: "Patvirtinta?" titles: active: "Aktyvūs vartotojai" @@ -2831,12 +2936,15 @@ lt: check_email: title: "Atskleisk šio vartotojo el. pašto adresą" text: "Rodyti" + check_sso: + text: "Rodyti" user: suspend_failed: "Įvyko klaida sustabdant vartotoją %{error}" unsuspend_failed: "Įvyko klaida atkuriant vartotoją %{error}" suspend_duration: "Kuriam laikui vartotojas bus sustabdytas?" suspend_reason_label: "Kodėl sustabdote? Šis tekstas bus matomas visiems vartotojo profilyje ir vartotojui bandant prisijungti. Stenkitės aprašyti trumpai." suspend_reason: "Priežastis" + suspend_reason_title: "Suspendavimo priežastis" suspend_message: "E-pašto žinutė" suspended_by: "Sustabdė" silence_reason: "Priežastis" @@ -2960,6 +3068,12 @@ lt: on_grace_period: "Šiuo metu yra paaukštinimo laikotarpyje, nebus pažemintas." locked_will_not_be_promoted: "Užrakintas pasitikėjimo lygis. Niekada nebus paaukštintas." locked_will_not_be_demoted: "Užrakintas pasitikėjimo lygis. Niekada nebus pažemintas." + discourse_connect: + external_id: "Išorinis ID" + external_username: "Slapyvardis" + external_name: "Vardas" + external_email: "Epaštas" + external_avatar_url: "Profilio Nuotraukos URL" user_fields: title: "Vartotojo laukeliai" help: "Pridėti lauką, kurį vartotojai gali užpildyti" @@ -3138,6 +3252,9 @@ lt: embed_by_username: "Vartotojo vardas skirtas temų sukūrimui" embed_post_limit: "Maskimalus įterpiamų įrašų skaičius" embed_truncate: "Truncate the embedded posts" + allowed_embed_selectors: "CSS selector for elements that are allowed in embeds" + blocked_embed_selectors: "CSS selector for elements that are removed from embeds" + allowed_embed_classnames: "Leidžiamos CSS klasės" save: "Išsaugoti Įterpimo Nustatymus" permalink: title: "Laikinos Nuorodos" diff --git a/config/locales/client.lv.yml b/config/locales/client.lv.yml index b61f8689b13d9..47f4d2c2385c5 100644 --- a/config/locales/client.lv.yml +++ b/config/locales/client.lv.yml @@ -156,6 +156,8 @@ lv: disabled: "noņēma šo baneri %{when}. Tas vairs neparādīsies katras lapas augšā." wizard_required: "Laipni lūgti jūsu jaunajā Discourse! Sāksim ar uzstādīšanas palīgu ✨" emails_are_disabled: "Administrators ir globāli izslēdzis visus izejošos e-pastus. Netiks nosūtīti nekāda veida paziņojumi." + software_update_prompt: + dismiss: "Nerādīt" themes: default_description: "Noklusējums" s3: @@ -206,6 +208,10 @@ lv: now: "tikko" read_more: "lasīt vairāk" more: "Vairāk" + x_more: + zero: "Vēl %{count}" + one: "Vēl %{count}" + other: "Vēl %{count}" less: "Mazāk" never: "nekad" every_30_minutes: "katras 30 minūtes" @@ -250,6 +256,8 @@ lv: bookmarks: remove: "Noņemt grāmatzīmi" save: "Saglabāt" + auto_delete_preference: + never: "Nekad" search: "Meklēt" drafts: resume: "Turpināt" @@ -295,6 +303,7 @@ lv: email: "E-pasts" name: "Vārds" fields: "Lauki" + reject_reason: "Iemesls" topics: topic: "Tēmas" reviewable_count: "Skaits" @@ -329,10 +338,24 @@ lv: types: reviewable_user: title: "Lietotājs" + reviewable_post: + title: "Ieraksts" approval: title: "Ieraksts gaida apstiprinājumu" description: "Mēs saņēmām jūsu ierakstu, taču vispirms to jāapstiprina moderatoram. Lūdzu, esiet pacietīgi." ok: "OK" + example_username: "lietotājvārds" + relative_time_picker: + days: + zero: "dienas" + one: "diena" + other: "dienas" + time_shortcut: + later_today: "Vēlāk šodien" + tomorrow: "Rītdien" + next_week: "Nākamā nedēļā" + later_this_week: "Vēlāk šonedēļ" + next_month: "Nākamā mēnesī" user_action: user_posted_topic: "%{user} pievienoja ierakstus tēmai" you_posted_topic: "Jūs pievienojāt ierakstu tēmai" @@ -348,6 +371,7 @@ lv: sent_by_user: "Nosūtīja %{user}" sent_by_you: "Nosūtījāt Jūs" directory: + username: "Lietotājvārds" filter_name: "atlasīt pēc lietotājvārda" title: "Lietotāji" likes_given: "Dots" @@ -392,8 +416,14 @@ lv: credentials: username: "Lietotājvārds" password: "Parole" + settings: + title: "Iestatījumi" membership: title: Piederība + categories: + title: Sadaļas + tags: + title: Tagi logs: title: "Žurnāls" when: "Kad" @@ -404,6 +434,8 @@ lv: details: "Detaļas" from: "No" to: "Kam" + permissions: + title: "Atļaujas / Pieejas" public_admission: "Atļaut lietotājiem brīvi pievienoties grupai (šai grupai jābūt publiski redzamai)" public_exit: "Ļaut lietotājiem brīvi pamest grupu" empty: @@ -508,6 +540,9 @@ lv: zero: "Nav tēmu" one: "%{count} tēma" other: "%{count} tēmas" + topic_stat_unit: + week: "nedēļa" + month: "mēnesis" ip_lookup: title: IP adreses meklēšana hostname: Resursdatora nosaukums @@ -549,7 +584,11 @@ lv: add_ignored_user: "Pievienot..." mute_option: "Noklusināts" normal_option: "Normāls" + notification_schedule: + none: "Nav" + to: "kam" activity_stream: "Aktivitāte" + read: "Lasīts" preferences: "Iestatījumi" feature_topic_on_profile: save: "Saglabāt" @@ -574,6 +613,9 @@ lv: dismiss_notifications: "Vairs nerādīt visus" dismiss_notifications_tooltip: "Atzīmēt visus nelasītos paziņojumus kā izlasītus" first_notification: "Jūsu pirmais paziņojums! Izvēlieties to, lai sāktu." + color_schemes: + undo: "Atlikt" + regular: "Regulārs" external_links_in_new_tab: "Atvērt visas saites jaunā cilnē" enable_quoting: "Ieslēgt atbildi ar iezīmētā teksta citēšanu" change: "mainīt" @@ -611,6 +653,7 @@ lv: watched_first_post_tags: "Seko pirmajam ierakstam" watched_first_post_tags_instructions: "Jums paziņos par pirmo ierakstu katrā jaunajā tēmā ar šiem tagiem." muted_categories: "Klusināts" + regular_categories: "Regulārs" no_category_access: "Kā moderatoram jums ir ierobežota kategoriju piekļuve, saglabāšana ir atspējota." delete_account: "Izdzēst manu profilu" delete_account_confirm: "Vai esat drošs, ka vēlaties neatgriezeniski dzēst savu profilu? Šo darbību nevar atcelt!" @@ -647,6 +690,7 @@ lv: tags: "Birkas" preferences_nav: account: "Konts" + security: "Drošība" profile: "Profils" emails: "E-pasti" notifications: "Paziņojumi" @@ -809,6 +853,11 @@ lv: pending_tab_with_count: "Gaidošie (%{count})" redeemed_tab: "Pieņemti" redeemed_tab_with_count: "Pieņemti (%{count})" + invited_via: "Ielūgums" + groups: "Grupas" + topic: "Tēmas" + edit: "Labot" + remove: "Atcelt" reinvited: "Ielūgums atkārtots" search: "raksti, lai meklētu ielūgumos..." user: "Ielūgtie lietotāji" @@ -964,6 +1013,7 @@ lv: disable: "Rādīt dzēstos ierakstus" private_message_info: title: "Ziņa" + add: "Pievienot..." remove_allowed_user: "Vai jūs tiešām gribat dzēst %{name} no šīs ziņas?" remove_allowed_group: "Vai jūs tiešām gribat dzēst %{name} no šīs ziņas?" email: "E-pasts" @@ -1133,6 +1183,7 @@ lv: link_description: "ievadiet saites aprakstu šeit" link_dialog_title: "Ievietojiet saiti" link_optional_text: "neobligāts nosaukums" + blockquote_title: "Bloka citāts" blockquote_text: "Bloka citāts" code_title: "Formatēts teksts" code_text: "piešķirt formatētajam tekstam 4 atstarpju atkāpi" @@ -1155,6 +1206,7 @@ lv: edit: Labot create_topic: label: "Jauna tēma" + ignore: "Ignorēt" notifications: title: "paziņojumi par @vārda pieminēšanu, atbildēm uz jūsu ierakstiem un tēmām, ziņām, utt." none: "Pašlaik neizdodas ielādēt paziņojumus." @@ -1195,6 +1247,7 @@ lv: post_format: "#%{post_number} - %{username}" more_results: "Ir vēl vairāk rezultātu. Lūdzu precizējiet meklēšanas kritērijus." search_google_button: "Google" + search_button: "Meklēt" context: user: "Meklēt ierakstus ar @%{username}" category: "Meklēt #%{category} sadaļā" @@ -1231,6 +1284,8 @@ lv: label: Ierakstīts before: līdz after: pēc + views: + label: Skatījumi hamburger_menu: "iet uz citu tēmu sarakstu vai sadaļu" new_item: "jauns" go_back: "atgriezties" @@ -1256,6 +1311,7 @@ lv: change_category: "Norādīt sadaļu" close_topics: "Slēgt tēmas" archive_topics: "Arhivēt tēmas" + move_messages_to_inbox: "Pārvietot uz iesūtni" notification_level: "Paziņojumi" choose_new_category: "Izvēlēties jaunu sadaļu šīm tēmām:" selected: @@ -1282,6 +1338,7 @@ lv: new: "Vairāk jauno tēmu nav. " unread: "Vairāk nelasīto tēmu nav. " category: "Vairāk sadaļās %{category} tēmu nav. " + tag: "Vairāk sadaļās %{tag} tēmu nav. " top: "Vairāk svarīgu tēmu nav. " bookmarks: "Vairāk grāmatzīmēs ievietoto tēmu nav. " topic: @@ -1351,6 +1408,9 @@ lv: jump_reply_up: pāriet uz agrāku atbildi jump_reply_down: pāriet uz vēlāku atbildi deleted: "Tēma ir dzēsta " + slow_mode_update: + save: "Ieslēgt" + remove: "Atslēgt" topic_status_update: save: "Uzstādīt taimeri " num_of_hours: "Stundu skaits:" @@ -1386,6 +1446,7 @@ lv: auto_open: "Šo tēmu automātiski atvērs %{timeLeft}." auto_close: "Šo tēmu automātiski slēgs %{timeLeft}." auto_publish_to_category: "Šo tēmu publicēs #%{categoryName} %{timeLeft}." + auto_close_after_last_post: "Šo tēmu slēgs %{duration} pēc pēdējās atbildes." auto_delete: "Šo tēmu automātiski dzēsīs pēc %{timeLeft}." auto_reminder: "Jums atgādinās par šo tēmu pēc %{timeLeft}." auto_close_title: "Automātiskās slēgšanas iestatījumi" @@ -1404,6 +1465,7 @@ lv: go: "doties" jump_bottom: "pāriet pie pēdējā ieraksta" jump_prompt: "pāriet pie..." + jump_prompt_long: "Pāriet pie..." jump_bottom_with_number: "pāriet pie ieraksta %{post_number}" jump_prompt_or: "vai" total: kopējais ierakstu skaits @@ -1482,6 +1544,7 @@ lv: share: title: "Dalīties" help: "dalīties ar saiti uz so tēmu" + invite_users: "Ielūgt" print: title: "Drukāt" help: "Atvērt šīs tēmas drukas versiju" @@ -1532,11 +1595,13 @@ lv: username_placeholder: "lietotājvārds" action: "Nosūtīt ielūgumu" help: "Ielūgt citus uz šo tēmu, izmantojot e-pastu vai paziņojumus" + discourse_connect_enabled: "Ievadiet personas, ko vēlētos ielūgt šai tēmā, lietotājvārdu." to_topic_blank: "Ievadiet personas, ko vēlētos ielūgt šai tēmā, lietotājvārdu vai e-pastu." to_topic_email: "Jūs esat ievadījis e-pasta adresi. Mēs nosūtīsim e-pastā ielūgumu, kas ļaus jūsu draugam nekavējoties atbildēt šai tēmā." to_topic_username: "Jūs esat ievadījis lietotājvārdu. Mēs nosūtīsim paziņojumu ar saiti, kas ļaus pievienoties šai tēmai." to_username: "Ievadiet personas, ko vēlētos ielūgt, lietotājvārdu. Mēs nosūtīsim paziņojumu ar saiti, kas ļaus pievienoties šai tēmai." email_placeholder: "vards@piemers.com" + success_email: "Mēs nosūtījām ielūguma e-pastu uz %{invitee}. Mēs paziņosim jums, kad ielūgums būs izmantots. Pārbaudiet ielūgumu cilni jūsu lietotāja lapā, lai sekotu līdzi savu ielūgumu statusiem." success_username: "Mēs ielūdzām šo lietotāju piedalīties šai tēmā." error: "Atvainojiet, mēs nevarējām ielūgt šo cilvēku. Varbūt jau ir nosūtīts ielūgums?" success_existing_email: "Jau pastāv lietotājs ar e-pastu %{emailOrUsername}. Mēs ielūdzām šo lietotāju piedalīties šai tēmā." @@ -1599,6 +1664,7 @@ lv: other: "Jūs esat izvēlējies %{count} ierakstus." post: quote_reply: "Citāts" + quote_share: "Dalīties" edit_reason: "Iemesls:" post_number: "ieraksts %{number}" reply_as_new_topic: "Atbildēt jaunā saistītā tēmā" @@ -1610,6 +1676,7 @@ lv: zero: "(autors atcēlis ierakstu, tas tiks automātiski dzēsts pēc %{count} stundām, ja neviens nav ziņojis par to)" one: "(autors atcēlis ierakstu, tas tiks automātiski dzēsts pēc %{count} stundas, ja neviens nav ziņojis par to)" other: "(autors atcēlis ierakstu, tas tiks automātiski dzēsts pēc %{count} stundām, ja neviens nav ziņojis par to)" + collapse: "sakļaut" expand_collapse: "paplašināt/minimizēt" gap: zero: "apslēpt %{count} slēptās atbildes" @@ -1674,6 +1741,11 @@ lv: grant_badge: "Piešķirt Žetonu" delete_topic: "Dzēst tēmu" actions: + people: + like: + zero: "patika ieraksts" + one: "patika ieraksts" + other: "patika ieraksts" by_you: off_topic: "Jūs ziņojāt par šo kā novirzīšanos no tēmas" spam: "Jūs ziņojāt par šo kā spamu" @@ -1748,8 +1820,14 @@ lv: change_in_category_topic: "Rediģēt aprakstu" already_used: "Šī krāsa ir izmantota citai sadaļai" security: "Drošība" + permissions: + group: "Grupa" + see: "Skatīt" + reply: "Atbildēt" + create: "Izveidot" special_warning: "Brīdinājums: šī sadaļa ir automātiski izveidota un tās drošības uzstādījumi nav maināmi. Ja jūs nevēlaties šo sadaļu izmantot, izdzēsiet to, nevis pielietojiet citiem mērķiem." images: "Attēli" + email_in: "Īpašas ienākošā e-pasta adreses:" email_in_allow_strangers: "Pieņemt e-pastus no anonīmiem lietotājiem bez profiliem" email_in_disabled: "Jaunu tēmu ievietošana, izmantojot e-pastu, ir atcelta foruma iestatījumos. Lai atļautu ievietot jaunas tēmas, izmantojot e-pastu," show_subcategory_list: "Rādīt apakšsadaļu sarakstu virs tēmām šai sadaļā." @@ -1805,6 +1883,11 @@ lv: flagging: title: "Paldies, ka palīdzat uzturēt mūsu forumu civilizētu!" action: "Ziņot par ierakstu" + take_action_options: + default: + details: "Sasniegt ziņojumu robežu uzreiz, nevis gaidīt vēl ziņojumus no lietotājiem" + suspend: + title: "Apturētie lietotāji" notify_action: "Ziņa" official_warning: "Oficiāls brīdinājums" delete_spammer: "Dzēst spamotāju" @@ -1983,6 +2066,7 @@ lv: readonly: "Skatīt" lightbox: download: "lejuplādēt" + counter: "%curr% no %total%" keyboard_shortcuts_help: title: "Klaviatūras saīsnes" jump_to: @@ -2047,6 +2131,10 @@ lv: zero: "%{count} žetoni" one: "%{count} žetons" other: "%{count} žetoni" + more_badges: + zero: "+Vēl %{count}" + one: "+Vēl %{count}" + other: "+Vēl %{count}" granted: zero: "%{count} piešķirti" one: "%{count} piešķirts" @@ -2128,6 +2216,8 @@ lv: dismiss: "Nerādīt" safe_mode: enabled: "Ir ieslēgts drošais režīms; lai pamestu drošo režīmu, aizveriet šo pārlūkprogrammas logu" + do_not_disturb: + remaining: "palicis %{remaining}" admin_js: type_to_filter: "ievadiet, lai atlasītu..." admin: @@ -2149,6 +2239,8 @@ lv: version_check_pending: "Izskatās, ka nesen esat veicies atjauninājumus. Lieliski!" installed_version: "Uzinstalēts" latest_version: "Pēdējais" + new_features: + dismiss: "Nerādīt" last_checked: "Pēdējā pārbaude" refresh_problems: "Pārlādēt" no_problems: "Problēmas nav atrastas." @@ -2177,6 +2269,9 @@ lv: view_table: "tabula" view_graph: "grafiks" refresh_report: "Pārlādēt ziņojumu" + daily: Dienas + monthly: Mēneša + weekly: Nedēļas groups: "Visas grupas" filters: group: @@ -2235,6 +2330,8 @@ lv: description: Apraksts save: Saglabāt continue: Turpināt + scopes: + action: Darbība web_hooks: detailed_instruction: "Ja būs signāls par izvēlēto notikumu, uz norādīto URL tiks nosūtīts POST pieprasījums." create: "Izveidot" @@ -2414,6 +2511,7 @@ lv: install_popular: "Populāri" about_theme: "Par" license: "Licence" + version: "Versija:" enable: "Ieslēgt" disable: "Atslēgt" update_to_latest: "Atjaunināt uz pēdējo" @@ -2424,6 +2522,10 @@ lv: scss: text: "CSS" colors: + undo: "atsaukt" + revert: "atgriezt" + success: + name: "veiksmīgi" love: description: "Atzinības pogas krāsa." email_style: @@ -2629,6 +2731,7 @@ lv: active: "Aktīvi" staff: "Personāls" suspended: "Apturēts" + staged: "Izveidots" approved: "Apstiprināt?" titles: active: "Aktīvi lietotāji" @@ -2647,6 +2750,8 @@ lv: check_email: title: "Atklāt šī lietotāja e-pasta adresi" text: "Parādīt" + check_sso: + text: "Parādīt" user: suspend_failed: "Kaut kas nenostrādāj apturot šo lietotāju %{error}" unsuspend_failed: "Kaut kas nenostrādāj atjaunojot šo lietotāju %{error}" @@ -2775,6 +2880,12 @@ lv: on_grace_period: "Currently in promotion grace period, will not be demoted." locked_will_not_be_promoted: "Uzticības līmenis noslēgts. Nevar tikt paaugstināts." locked_will_not_be_demoted: "Uzticības līmenis noslēgts. Nevar tikt pazemināts." + discourse_connect: + external_id: "Ārējs ID" + external_username: "Lietotājvārds" + external_name: "Vārds" + external_email: "E-pasts" + external_avatar_url: "Profila attēla URL" user_fields: title: "Lietotāja lauki" help: "Pievienot lauku, kuru lietotāji var aizpildīt." @@ -2956,6 +3067,9 @@ lv: embed_post_limit: "Maksimālais iegulto ierakstu skaits" embed_title_scrubber: "(Regular expression used to scrub the title of posts)" embed_truncate: "Saīsināt iegultos ierakstus" + allowed_embed_selectors: "(CSS selector for elements that are allowed in embeds)" + blocked_embed_selectors: "(CSS selector for elements that are removed from embeds)" + allowed_embed_classnames: "Atļautie CSS nosaukumi (Allowed CSS class names)" save: "Saglabāt iegulšanas iestatījumus" permalink: title: "Patstāvīgā saite" diff --git a/config/locales/client.nb_NO.yml b/config/locales/client.nb_NO.yml index d5d370e1c2759..8e8966f752bef 100644 --- a/config/locales/client.nb_NO.yml +++ b/config/locales/client.nb_NO.yml @@ -151,6 +151,8 @@ nb_NO: topic_admin_menu: "handlinger for tråd" wizard_required: "Velkommen til ditt nye Discourse! Kom i gang med oppstartsveiviseren ✨" emails_are_disabled: "All utgående e-post har blitt deaktivert globalt av en administrator. Ingen e-postvarslinger vil bli sendt." + software_update_prompt: + dismiss: "Avslå" bootstrap_mode_disabled: "Oppstartsmodus vil bli deaktivert i løpet av 24 timer." themes: default_description: "Forvalg" @@ -252,6 +254,9 @@ nb_NO: confirm_clear: "Er du sikker på at du vil fjerne alle favoritter fra dette emnet?" save: "Lagre" no_timezone: 'Du har ikke ennå satt tidssone. Du vil ikke kunne sette påminnelser. Sett tidssone i profilen din.' + no_user_bookmarks: "Du har ingen bokmerkede innlegg; bokmerker lar deg raskt slå opp spesifike innlegg." + auto_delete_preference: + never: "Aldri" search: "Søk" drafts: resume: "Fortsett" @@ -344,6 +349,7 @@ nb_NO: email: "E-post" name: "Navn" fields: "Felter" + reject_reason: "Begrunnelse" topics: topic: "Emne" reviewable_count: "Antall" @@ -382,10 +388,24 @@ nb_NO: types: reviewable_user: title: "Bruker" + reviewable_post: + title: "Innlegg" approval: title: "Innlegg trenger godkjenning" description: "Vi har mottatt ditt nye innlegg men det krever godkjenning av en moderator før det vises. Ha tålmod." ok: "OK" + example_username: "brukernavn" + relative_time_picker: + days: + one: "dag" + other: "dager" + time_shortcut: + later_today: "Senere i dag" + tomorrow: "I morgen" + next_week: "Neste uke" + later_this_week: "Senere denne uken" + next_month: "Neste måned" + custom: "Egendefinert dato og tid" user_action: user_posted_topic: "%{user} opprettet emnet" you_posted_topic: "Du opprettet emnet" @@ -401,6 +421,7 @@ nb_NO: sent_by_user: "Sendt av %{user}" sent_by_you: "Sendt av deg" directory: + username: "Brukernavn" filter_name: "filtrer etter brukernavn" title: "Brukere" likes_given: "Gitt" @@ -450,11 +471,17 @@ nb_NO: credentials: username: "Brukernavn" password: "Passord" + settings: + title: "Innstillinger" mailboxes: disabled: "deaktivert" membership: title: Medlemskap access: Tilgang + categories: + title: Kategorier + tags: + title: Stikkord logs: title: "Logger" when: "Når" @@ -465,6 +492,8 @@ nb_NO: details: "Detaljer" from: "Fra" to: "Til" + permissions: + title: "Tillatelser" public_admission: "Tillat brukere å ta del i gruppen fritt (krever offentlig synlig gruppe)" public_exit: "Tillat brukere å fritt forlate gruppen" empty: @@ -595,6 +624,9 @@ nb_NO: topic_sentence: one: "%{count} emne" other: "%{count} emner" + topic_stat_unit: + week: "uke" + month: "måned" n_more: "Kategorier (ytterligere%{count})..." ip_lookup: title: Slå opp IP-adresse @@ -636,7 +668,11 @@ nb_NO: add_ignored_user: "Legg til …" mute_option: "Ignorert" normal_option: "Normal" + notification_schedule: + none: "Ingen" + to: "til" activity_stream: "Aktivitet" + read: "Lest" preferences: "Innstillinger" feature_topic_on_profile: save: "Lagre" @@ -663,6 +699,9 @@ nb_NO: dismiss_notifications: "Forkast alle" dismiss_notifications_tooltip: "Merk alle uleste varslinger som lest" first_notification: "Ditt første varsel! Velg det for å komme i gang." + color_schemes: + undo: "Tilbakestill" + regular: "Aktivt medlem" allow_private_messages: "Tillat andre brukere å sende meg personlige meldinger" external_links_in_new_tab: "Åpne alle eksterne lenker i ny fane" enable_quoting: "Aktiver svar med sitat for uthevet tekst" @@ -704,6 +743,7 @@ nb_NO: 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: "Ignorert" + regular_categories: "Aktivt medlem" no_category_access: "Som moderator har du begrenset kategoritilgang, lagring er avskrudd." delete_account: "Slett kontoen min" delete_account_confirm: "Er du sikker på at du vil slette kontoen din permanent? Denne handlingen kan ikke angres!" @@ -742,6 +782,7 @@ nb_NO: tags: "Stikkord" preferences_nav: account: "Konto" + security: "Sikkerhet" profile: "Profil" emails: "E-poster" notifications: "Varsler" @@ -917,6 +958,11 @@ nb_NO: pending_tab_with_count: "Ventende (%{count})" redeemed_tab: "Brukt" redeemed_tab_with_count: "Innløste (%{count})" + invited_via: "Invitasjon" + groups: "Grupper" + topic: "Emne" + edit: "Rediger" + remove: "Fjern" reinvited: "Invitasjon sendt igjen" search: "skriv for å søke etter invitasjoner…" user: "Invitert bruker" @@ -1073,6 +1119,7 @@ nb_NO: disable: "Vis slettede innlegg" private_message_info: title: "Send" + add: "Legg til …" leave_message: "Ønsker du virkelig å legge igjen denne meldingen?" remove_allowed_user: "Er du sikker på at du vil fjerne %{name} fra denne meldingen?" remove_allowed_group: "Vil du virkelig fjerne %{name} fra denne meldingen?" @@ -1084,6 +1131,7 @@ nb_NO: trust_level: "Tillitsnivå" search_hint: "brukernavn, e-post eller IP-adresse" create_account: + header_title: "Velkommen!" failed: "Noe gikk galt, kanskje denne e-postadressen allerede er registrert. Prøv lenke for glemt passord" forgot_password: title: "Nullstill Passord" @@ -1271,6 +1319,7 @@ nb_NO: link_description: "beskriv lenken her" link_dialog_title: "Sett inn hyperlenke" link_optional_text: "valgfri tittel" + blockquote_title: "Sitatramme" blockquote_text: "Sitatramme" code_title: "Kodeutsnitt" code_text: "Skriv inn preformattert tekst med 4 mellomroms innrykk." @@ -1315,6 +1364,7 @@ nb_NO: label: "Delt kladd" toggle_topic_bump: label: "Slå på/av at emnet flyttes øverst" + ignore: "Ignorer" notifications: tooltip: regular: @@ -1348,6 +1398,8 @@ nb_NO: granted_badge: "Gjorde seg fortjent til '%{description}'" topic_reminder: "%{username} %{description}" watching_first_post: "Nytt emne %{description}" + reaction: "%{username} %{description}" + reaction_2: "%{username}, %{username2} %{description}" group_message_summary: one: "%{count} melding i din %{group_name} innboks" other: "%{count} meldinger i din innboks for %{group_name}" @@ -1400,6 +1452,7 @@ nb_NO: or_search_google: "Eller prøv å søke på Google istedenfor:" search_google: "Prøv å søke på Google istedenfor:" search_google_button: "Google" + search_button: "Søk" context: user: "Søk i innleggene av @%{username}" category: "Søk i kategorien #%{category}" @@ -1447,6 +1500,8 @@ nb_NO: label: Skrevet before: før after: etter + views: + label: Visninger hamburger_menu: "gå til en annen liste over emner eller en annen kategori" new_item: "ny" go_back: "gå tilbake" @@ -1472,6 +1527,7 @@ nb_NO: change_category: "Velg kategori" close_topics: "Lukk emner" archive_topics: "Arkiver emner" + move_messages_to_inbox: "Flytt til innboks" notification_level: "Varsler" choose_new_category: "Velg den nye kategorien for emnene:" selected: @@ -1497,6 +1553,7 @@ nb_NO: new: "Det finnes ingen flere nye emner." unread: "Det finnes ingen flere uleste emner." category: "Det finnes ingen %{category}-emner igjen." + tag: "Det finnes ingen %{tag}-emner igjen." top: "Det finnes ingen flere populære emner." bookmarks: "Det finnes ingen flere bokmerkede emner." topic: @@ -1561,6 +1618,9 @@ nb_NO: jump_reply_up: hopp til tidligere svar jump_reply_down: hopp til senere svar deleted: "Emnet ble slettet" + slow_mode_update: + save: "Aktiver" + remove: "Deaktiver" topic_status_update: title: "Tidsbestemt handling for emne" save: "Sett opp tidsbestemt handling" @@ -1601,6 +1661,7 @@ nb_NO: auto_open: "Dette emnet vil åpnes automatisk %{timeLeft}." auto_close: "Dette emnet vil lukkes automatisk %{timeLeft}." auto_publish_to_category: "Dette emnet vil bli opprettet i #%{categoryName} %{timeLeft}." + auto_close_after_last_post: "Dette emnet vil bli lukket %{duration} etter det siste innlegget." auto_delete: "Dette emnet vil bli automatisk slettet %{timeLeft}." auto_bump: "Dette emnet vil automatisk bli flyttet øverst om %{timeLeft}." auto_reminder: "Du vil bli påminnet om dette emnet %{timeLeft}." @@ -1619,6 +1680,7 @@ nb_NO: go: "gå" jump_bottom: "Hopp til nyeste innlegg" jump_prompt: "hopp til…" + jump_prompt_long: "Hopp til…" jump_bottom_with_number: "hopp til innlegg %{post_number}" jump_prompt_to_date: "til dato" jump_prompt_or: "eller" @@ -1700,6 +1762,7 @@ nb_NO: share: title: "Del" help: "del en lenke til dette emnet" + invite_users: "Inviter" print: title: "Skriv ut" help: "Åpne en utskriftsvennlig utgave av dette emnet" @@ -1748,11 +1811,13 @@ nb_NO: username_placeholder: "brukernavn" action: "Send Invitasjon" help: "Inviter andre til dette emnet via e-post eller varsler" + discourse_connect_enabled: "Oppgi brukernavnet til personen du ønsker å invitere til dette emnet." to_topic_blank: "Oppgi brukernavnet eller e-postadressen til personen du ønsker å invitere til dette emnet." to_topic_email: "Du har oppgitt en e-postadresse. Vi vil sende en invitasjon som lar vennen din svare på dette emnet umiddelbart." to_topic_username: "Du har oppgitt et brukernavn. Vi sender et varsel med en lenke som inviterer dem til dette emnet." to_username: "Oppgi brukernavnet til personen du ønsker å invitere. Vi sender et varsel med en lenke som inviterer vedkommende til dette emnet." email_placeholder: "navn@example.com" + success_email: "Vi har sendt ut en invitasjon til %{invitee}. Vi varsler deg når invitasjonen er godtatt. Sjekk invitiasjonsfanen på brukersiden din for å beholde oversikten over invitasjonene dine." success_username: "Vi har invitert den valgte brukeren til å delta i dette emnet." error: "Beklager, vi kunne ikke invitere den brukeren. Vedkommende har muligens allerede blitt invitert? (Antall invitasjoner er begrenset)" success_existing_email: "En bruker med e-postadressen %{emailOrUsername} finnes allerede. Vi har invitert brukeren til å delta i dette emnet." @@ -1819,6 +1884,7 @@ nb_NO: other: "Du har valgt %{count} innlegg." post: quote_reply: "Sitat" + quote_share: "Del" edit_reason: "Begrunnelse:" post_number: "innlegg %{number}" reply_as_new_topic: "Svar med lenket mne" @@ -1903,6 +1969,9 @@ nb_NO: delete_topic: "slett emne" actions: people: + like: + one: "likte dette" + other: "likte dette" like_capped: one: "og %{count} annen likte dette" other: "og %{count} andre likte dette" @@ -1993,6 +2062,11 @@ nb_NO: change_in_category_topic: "Rediger beskrivelse" already_used: "Denne fargen er i bruk av en annen kategori" security: "Sikkerhet" + permissions: + group: "Gruppe" + see: "Se" + reply: "Svar" + create: "Opprett" special_warning: "Advarsel: Denne kategorien er en forhåndsbestemt kategori og dens sikkerhetsinnstillinger kan ikke endres. Hvis du ikke vil bruke denne kategorien, slett den i stedet for å bruke den til noe annet." images: "Bilder" email_in: "Egendefinert innkommende e-postadresse:" @@ -2061,6 +2135,14 @@ nb_NO: flagging: title: "Takk for at du hjelper å holde forumet ryddig!" action: "Rapporter innlegg" + take_action_options: + default: + title: "Ta handling" + details: "Oppnå rapporteringsterskel umiddelbart, i stedet for å vente på flere rapporteringer." + suspend: + title: "Steng ute bruker" + silence: + title: "Demp bruker" notify_action: "Melding" official_warning: "Offisiell advarsel" delete_spammer: "Slett spammer" @@ -2225,6 +2307,7 @@ nb_NO: readonly: "Se" lightbox: download: "last ned" + counter: "%curr% av %total%" keyboard_shortcuts_help: title: "Tastatursnarveier" jump_to: @@ -2392,6 +2475,10 @@ nb_NO: dismiss: "Avslå" safe_mode: enabled: "Sikkert modus er påskrudd, for å skru av sikkert modus, lukk dette nettleservinduet" + do_not_disturb: + remaining: "%{remaining} gjenstående" + options: + custom: "Egendefinert" admin_js: type_to_filter: "skriv for å filtrere…" admin: @@ -2415,6 +2502,8 @@ nb_NO: version_check_pending: "Ser ut som om du oppgraderte nylig. Fantastisk!" installed_version: "Installert" latest_version: "Siste" + new_features: + dismiss: "Avslå" last_checked: "Sist sjekket" refresh_problems: "Last inn siden på nytt" no_problems: "Ingen problemer ble funnet." @@ -2458,6 +2547,9 @@ nb_NO: view_table: "tabell" view_graph: "graf" refresh_report: "Refresh Rapport" + daily: Daglig + monthly: Månedlig + weekly: Ukentlig groups: "Alle grupper" disabled: "Denne rapporten er deaktivert" totals_for_sample: "Totalt for tidsrom" @@ -2536,6 +2628,8 @@ nb_NO: description: Beskrivelse save: Lagre continue: Fortsett + scopes: + action: Handling web_hooks: title: "Webhooker" none: "Det finnes ingen webhooker for tiden." @@ -2761,6 +2855,7 @@ nb_NO: install_popular: "Populært" about_theme: "Om" license: "Lisens" + version: "Versjon:" enable: "Aktiver" disable: "Deaktiver" update_to_latest: "Oppdater til seneste" @@ -3103,6 +3198,8 @@ nb_NO: check_email: title: "Vis denne brukerens e-postadresse" text: "Vis" + check_sso: + text: "Vis" user: suspend_failed: "Noe gikk galt ved utestenging av denne brukeren %{error}" unsuspend_failed: "Noe gikk galt ved opphevelse av utestenging av denne brukeren %{error}" @@ -3110,6 +3207,7 @@ nb_NO: suspend_reason_label: "Hvorfor stenger du ute brukeren? Denne teksten vil være synlig for alle på denne brukerens profilside og vil bli vist til brukeren når vedkommende forsøker å logge inn. Fatt deg i korthet." suspend_reason_hidden_label: "Hvorfor stenger du ute brukeren? Denne teksten vil bli vist til brukeren når vedkommende prøver å logge inn. Fatt deg i korthet." suspend_reason: "Begrunnelse" + suspend_reason_title: "Bannlysningsgrunn" suspend_message: "E-postmelding" suspend_message_placeholder: "Alternativt, kan du detaljere bannlysningen og det vil bli sendt per e-post til brukeren." suspended_by: "Utestengt av" @@ -3259,6 +3357,12 @@ nb_NO: on_grace_period: "For tiden i prøvetid for forfremmelse, vil ikke degraderes" locked_will_not_be_promoted: "Tillitsnivå låst. Vil aldri bli forfremmet." locked_will_not_be_demoted: "Tillitsnivå låst. Vil aldri bli degradert." + discourse_connect: + external_id: "Ekstern-ID" + external_username: "Brukernavn" + external_name: "Navn" + external_email: "E-post" + external_avatar_url: "Profilbilde URL" user_fields: title: "Brukerfelter" help: "Legg til felter som dine brukere kan fylle ut." @@ -3445,6 +3549,9 @@ nb_NO: embed_post_limit: "Maksimalt antall innlegg å bygge inn" embed_title_scrubber: "Regulære uttrykk brukt til å finne og korrigere feil i titler" embed_truncate: "Forkort de innebygde innleggene" + allowed_embed_selectors: "CSS-velger for elementer som tillates i innbygginger" + blocked_embed_selectors: "CSS-velger for element som fjernes fra innbygginger" + allowed_embed_classnames: "Tillatte navn for CSS-klasser" save: "Lagre innbyggingsinnstillinger" permalink: title: "Permalenker" diff --git a/config/locales/client.pt.yml b/config/locales/client.pt.yml index f544600cd970c..5ed55a7d1d5fb 100644 --- a/config/locales/client.pt.yml +++ b/config/locales/client.pt.yml @@ -158,6 +158,8 @@ pt: topic_admin_menu: "ações do tópico" wizard_required: "Bem-vindo ao seu novo Discourse! Vamos começar com o assistente de configuração ✨" emails_are_disabled: "Todos os envios de e-mail foram globalmente desativados por um administrador. Nenhum e-mail de notificação será enviado." + software_update_prompt: + dismiss: "Marcar como visto" bootstrap_mode_enabled: one: "Para que o início do teu Site seja o mais simples possível, estás agora em modo de inicialização simples. A todos os novos utilizadores será concedido o Nível de Confiança 1 e o resumo por e-mail enviado diariamente estará ativado. Isto será automaticamente desligado quando %{count} utilizador se tiver juntado ao fórum." other: "Para que o início do teu Site seja o mais simples possível, estás agora em modo de inicialização simples. A todos os novos utilizadores será concedido o Nível de Confiança 1 e o resumo por e-mail enviado diariamente estará ativado. Isto será automaticamente desligado quando %{count} utilizadores se tiverem juntado ao fórum." @@ -459,6 +461,7 @@ pt: created_at_asc: "Criado em (reverso)" priority: title: "Prioridade Mínima" + any: "(qualquer)" medium: "Médio" high: "Elevado" conversation: @@ -496,6 +499,8 @@ pt: title: "Post na fila" reviewable_user: title: "Utilizador" + reviewable_post: + title: "Mensagem" approval: title: "A Publicação Necessita de Aprovação" description: "Recebemos a sua nova publicação mas necessita de ser aprovada pelo moderador antes de aparecer. Por favor seja paciente." @@ -520,6 +525,9 @@ pt: months: one: "mês" other: "meses" + years: + one: "ano" + other: "anos" relative: "Relativo" time_shortcut: later_today: "Hoje, mais tarde" @@ -1530,6 +1538,7 @@ pt: title: "Mensagem" invite: "Convidar Outros..." edit: "Adicionar ou Remover..." + add: "Adicionar..." leave_message: "Quer mesmo deixar esta mensagem?" remove_allowed_user: "Deseja mesmo remover %{name} desta mensagem?" remove_allowed_group: "Deseja mesmo remover %{name} desta mensagem?" @@ -1754,6 +1763,7 @@ pt: link_description: "insira aqui a descrição da hiperligação" link_dialog_title: "Inserir Hiperligação" link_optional_text: "título opcional" + blockquote_title: "Bloco de Citação" blockquote_text: "Bloco de Citação" code_title: "Texto pré-formatado" code_text: "Indentar texto pré-formatado até 4 espaços" @@ -1802,6 +1812,7 @@ pt: toggle_topic_bump: label: "Alterar possibilidade de bump de tópico" desc: "Responder sem alterar a data de última resposta" + ignore: "Ignorar" notifications: tooltip: regular: @@ -1838,6 +1849,8 @@ pt: granted_badge: "Ganhou '%{description}'" topic_reminder: "%{username} %{description}" watching_first_post: "Novo Tópico %{description}" + reaction: "%{username} %{description}" + reaction_2: "%{username}, %{username2} %{description}" group_message_summary: one: "%{count} mensagem no seu grupo %{group_name}" other: "%{count} mensagens no seu grupo %{group_name}" @@ -1891,6 +1904,7 @@ pt: or_search_google: "Ou experimente pesquisar com o Google:" search_google: "Experimente pesquisar com o Google:" search_google_button: "Google" + search_button: "Pesquisar" context: user: "Procurar publicações por @%{username}" category: "Pesquise na categoria #%{category}" @@ -1938,6 +1952,8 @@ pt: label: Publicada before: antes after: depois + views: + label: Vistas hamburger_menu: "ir para outra lista de tópicos ou categorias" new_item: "novo" go_back: "voltar atrás" @@ -2055,6 +2071,9 @@ pt: jump_reply_up: avançar para resposta mais recente jump_reply_down: avançar para resposta mais antiga deleted: "Este tópico foi eliminado" + slow_mode_update: + save: "Ativar " + remove: "Desativar" topic_status_update: title: "Temporizador do Tópico" save: "Definir Temporizador" @@ -2096,6 +2115,7 @@ pt: auto_open: "Este tópico vai abrir automaticamente %{timeLeft}." auto_close: "Este tópico vai fechar automaticamente %{timeLeft}." auto_publish_to_category: "Este tópico vai ser publicado em #%{categoryName} %{timeLeft}." + auto_close_after_last_post: "Este tópico vai fechar %{duration} depois da última resposta." auto_delete: "Este tópico vai ser automaticamente eliminado %{timeLeft}." auto_bump: "Este tópico vai ser automaticamente bumped %{timeLeft}." auto_reminder: "Irá ser relembrado acerca deste tópico %{timeLeft}." @@ -2114,6 +2134,7 @@ pt: go: "ir" jump_bottom: "ir para a última publicação" jump_prompt: "ir para..." + jump_prompt_long: "Ir para..." jump_bottom_with_number: "ir para a mensagem %{post_number}" jump_prompt_to_date: "ir para data" jump_prompt_or: "ou" @@ -2196,6 +2217,7 @@ pt: title: "Partilhar" extended_title: "Partilhar uma ligação" help: "Partilhar uma ligação para este tópico" + invite_users: "Convidar" print: title: "Imprimir" help: "Abrir uma versão para impressão deste tópico" @@ -2250,6 +2272,7 @@ pt: to_topic_username: "Você informou um nome de usuário. Enviaremos uma notificação com um link convidando-o para este tópico." to_username: "Introduza o nome de utilizador da pessoa que deseja convidar. Iremos enviar-lhe uma notificação com uma ligação convidando-o para este tópico." email_placeholder: "nome@exemplo.com" + success_email: "Enviámos por email um convite para %{invitee}. Iremos notificá-lo quando o convite for utilizado. Verifique o separador de convites na sua página de utilizador para acompanhar os seus convites." success_username: "Convidámos esse utilizador para participar neste tópico." error: "Pedimos desculpa, não conseguimos convidar essa pessoa. Talvez já tenha sido convidado? (Os convites são limitados)" success_existing_email: "Já existe um utilizador com o email %{emailOrUsername}. Convidámos esse utilizador a participar neste tópico." @@ -2325,6 +2348,7 @@ pt: other: "Selecionou %{count} publicações." post: quote_reply: "Citar" + quote_share: "Partilhar" edit_reason: "Motivo:" post_number: "publicação %{number}" reply_as_new_topic: "Responder com novo Tópico" @@ -2334,6 +2358,7 @@ pt: deleted_by_author: one: "(publicação retraída pelo autor, será removida automaticamente em %{count} hora a não ser que esteja denunciada)" other: "(publicação retraída pelo autor, será eliminada automaticamente em %{count} horas a não ser que esteja denunciada)" + collapse: "colapsar" expand_collapse: "expandir/colapsar" gap: one: "ver %{count} resposta oculta" @@ -2400,6 +2425,10 @@ pt: delete_post_notice: "Apagar Aviso da Equipa" edit_timer: "editar temporizador" actions: + people: + like: + one: "gostou disto" + other: "gostou disto" by_you: off_topic: "Denunciou isto como fora de contexto" spam: "Denunciou isto como spam" @@ -2472,6 +2501,11 @@ pt: change_in_category_topic: "Editar Descrição" already_used: "Esta cor já foi usada para outra categoria" security: "Segurança" + permissions: + group: "Grupo" + see: "Ver" + reply: "Responder" + create: "Criar" special_warning: "Aviso: Esta categoria é uma categoria pré-preenchida e as configurações de segurança não podem ser editadas. Se não deseja utilizar esta categoria, elimine-a em vez de lhe dar um novo propósito." images: "Imagens" email_in: "Endereço de email personalizado para emails recebidos:" @@ -2502,6 +2536,7 @@ pt: options: normal: "Normal" ignore: "Ignorar" + high: "Elevado" sort_options: default: "predefinida" likes: "Gostos" @@ -2520,6 +2555,12 @@ pt: flagging: title: "Obrigado por ajudar a manter a nossa comunidade cívica!" action: "Denunciar Publicação" + take_action_options: + default: + title: "Acionar" + details: "Atingir imediatamente o limite de denúncias, em vez de esperar por mais denúncias da comunidade" + suspend: + title: "Utilizador Suspenso" notify_action: "Mensagem" official_warning: "Aviso Oficial" delete_spammer: "Eliminar Spammer" @@ -2680,6 +2721,7 @@ pt: readonly: "Ver" lightbox: download: "transferir" + counter: "%curr% de %total%" keyboard_shortcuts_help: title: "Atalhos de Teclado" jump_to: @@ -2830,6 +2872,10 @@ pt: dismiss: "Marcar como visto" safe_mode: enabled: "O modo de segurança está activado, para sair do modo de segurança feche esta janela do navegador" + do_not_disturb: + remaining: "%{remaining} restante" + options: + custom: "Personalizar" admin_js: type_to_filter: "digite para filtrar..." admin: @@ -2851,6 +2897,8 @@ pt: version_check_pending: "Parece que atualizou recentemente. Fantástico!" installed_version: "Instalado" latest_version: "Recentes" + new_features: + dismiss: "Marcar como visto" last_checked: "Última verificação" refresh_problems: "Atualizar" no_problems: "Nenhum problema encontrado." @@ -2879,6 +2927,9 @@ pt: view_table: "tabela" view_graph: "grafo" refresh_report: "Atualizar relatório" + daily: Diário + monthly: Mensal + weekly: Semanal groups: "Todos os grupos" filters: group: @@ -2936,6 +2987,8 @@ pt: description: Descrição save: Guardar continue: Continuar + scopes: + action: Ação web_hooks: title: "Webhooks" none: "Não existem webhooks neste momento." @@ -3091,6 +3144,7 @@ pt: color: "Cor" opacity: "Opacidade" copy: "Copiar" + copy_to_clipboard: "Copiar para a Área de Transferência" copied_to_clipboard: "Copiado para a Área de Transferência" copy_to_clipboard_error: "Erro a copiar dados para a Área de Transferência" email_templates: @@ -3102,6 +3156,7 @@ pt: revert_confirm: "Tem a certeza que quer reverter as suas alterações?" theme: theme: "Tema" + customize_desc: "Personalizar:" create: "Criar" create_type: "Tipo" create_name: "Nome" @@ -3111,10 +3166,12 @@ pt: preview: "Pré-visualização" collapse: Colapsar upload: "Carregar" + discard: "Descartar" direct_install_tip: "Tem a certeza que pretende instalar %{name} do repositório listado abaixo?" installed: "Instalado" install_popular: "Popular" about_theme: "Sobre" + version: "Versão:" enable: "Ativar" disable: "Desativar" add: "Adicionar" @@ -3251,6 +3308,7 @@ pt: do_nothing: "não fazer nada" staff_actions: all: "todos" + filter: "Filtrar:" title: "Ações do Pessoal" clear_filters: "Mostrar Tudo" staff_user: "Utilizador" @@ -3336,6 +3394,7 @@ pt: title: "Registo de Erros em Logs" watched_words: title: "Palavras Vigiadas" + search: "pesquisar" clear_filter: "Remover" download: Transferir clear_all: Remover Tudo @@ -3526,6 +3585,12 @@ pt: on_grace_period: "Atualmente no período de carência da promoção, não será despromovido." locked_will_not_be_promoted: "Nível de Confiança bloqueado. Nunca será promovido." locked_will_not_be_demoted: "Nível de Confiança bloqueado. Nunca será despromovido." + discourse_connect: + external_id: "ID Externo" + external_username: "Nome de utilizador" + external_name: "Nome" + external_email: "E-mail" + external_avatar_url: "URL da Fotografia de Perfil" user_fields: title: "Campos de utilizador" help: "Adicione campos que os seus utilizadores poderão preencher." @@ -3712,6 +3777,9 @@ pt: embed_post_limit: "Número máximo de publicações a incorporar" embed_title_scrubber: "Expressão regular usada para filtrar o título de publicações" embed_truncate: "Omitir as mensagens incorporadas" + allowed_embed_selectors: "Seletor CSS para elementos que são permitidos nas incorporações" + blocked_embed_selectors: "Seletor CSS para elementos que são removidos das incorporações" + allowed_embed_classnames: "Nomes de classes CSS permitidas" save: "Guardar Configurações de Incorporação" permalink: title: "Hiperligações Permanentes" diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml index bb3be1d17c006..361f78f37f337 100644 --- a/config/locales/client.pt_BR.yml +++ b/config/locales/client.pt_BR.yml @@ -161,6 +161,9 @@ pt_BR: software_update_prompt: message: "Nós atualizamos este site, por favor recarregue a página, ou você poderá enfrentar um comportamento inesperado." dismiss: "Dispensar" + bootstrap_mode_enabled: + one: "Para facilitar o lançamento do seu novo site, você está no modo de bootstrap. Todos os novos usuários receberão o nível de confiança 1 e terão os e-mails diários de resumo ativados. Isso será desativado automaticamente quando %{count} usuários se registrarem." + other: "Para facilitar o lançamento do seu novo site, você está no modo de bootstrap. Todos os novos usuários receberão o nível de confiança 1 e terão os e-mails diários de resumo ativados. Isso será desativado automaticamente quando %{count} usuários se registrarem." bootstrap_mode_disabled: "O modo bootstrap será desativado em 24 horas." themes: default_description: "Padrão" @@ -887,6 +890,7 @@ pt_BR: normal_option_title: "Você será notificado se este usuário responder a você, citá-lo ou mencioná-lo." notification_schedule: midnight: "Meia-noite" + none: "Nenhum" monday: "Segunda-feira" tuesday: "Terça-feira" wednesday: "Quarta-feira" @@ -894,6 +898,7 @@ pt_BR: friday: "Sexta-feira" saturday: "Sábado" sunday: "Domingo" + to: "para" activity_stream: "Atividade" read: "Lidos" read_help: "Tópicos lidos recentemente" @@ -934,6 +939,9 @@ pt_BR: first_notification: "Sua primeira notificação! Selecione-a para começar." dynamic_favicon: "Mostrar contagens no ícone do navegador" theme_default_on_all_devices: "Definir este tema como padrão em todos os meus dispositivos" + color_schemes: + undo: "Redefinir" + regular: "Normal" text_size_default_on_all_devices: "Definir este tamanho de texto como padrão em todos os meus dispositivos" allow_private_messages: "Permitir que outros usuários me enviem mensagens pessoais" external_links_in_new_tab: "Abrir todos os links externos em uma nova aba" @@ -980,6 +988,7 @@ pt_BR: muted_categories: "Silenciadas" muted_categories_instructions: "Você não será notificado de nada sobre novos tópicos nestas categorias, e eles não aparecerão nas categorias ou nas últimas páginas." muted_categories_instructions_dont_hide: "Você não será notificado de nada sobre novos tópicos nestas categorias." + regular_categories: "Normal" regular_categories_instructions: "Você verá essas categorias nas listas de tópicos “Recentes” e “Melhores”." no_category_access: "Como um moderador, você tem acesso limitado à categorias, salvar está desabilitado." delete_account: "Excluir Minha Conta" @@ -1025,6 +1034,7 @@ pt_BR: tags: "Etiquetas" preferences_nav: account: "Conta" + security: "Segurança" profile: "Perfil" emails: "E-mails" notifications: "Notificações" @@ -1277,8 +1287,11 @@ pt_BR: pending_tab_with_count: "Pendentes (%{count})" redeemed_tab: "Usados" redeemed_tab_with_count: "Usados (%{count})" + invited_via: "Convite" groups: "Grupos" topic: "Tópico" + edit: "Editar" + remove: "Remova" reinvite: "Reenviar e-mail" reinvited: "Convite reenviado" search: "digite para pesquisar convites..." @@ -1293,6 +1306,9 @@ pt_BR: topics_entered: "Tópicos Visualizados" posts_read_count: "Postagens Lidas" expired: "Este convite expirou." + remove_all: "Remova Convites Vencidos" + removed_all: "Todos os Convites Expirados removidos!" + remove_all_confirm: "Você tem certeza de que deseja remover todos os convites expirados?" reinvite_all_confirm: "Você tem certeza de que deseja reenviar todos os convites?" time_read: "Tempo de Leitura" days_visited: "Dias Visitados" @@ -1455,6 +1471,7 @@ pt_BR: title: "Mensagem" invite: "Convidar Outros..." edit: "Adicionar ou Remover..." + add: "Adicionar..." leave_message: "Você quer mesmo sair desta mensagem?" remove_allowed_user: "Você quer mesmo remover %{name} desta mensagem?" remove_allowed_group: "Você quer mesmo remover %{name} desta mensagem?" @@ -1466,6 +1483,7 @@ pt_BR: trust_level: "Nível de Confiança" search_hint: "nome de usuário, e-mail ou endereço IP" create_account: + header_title: "Bem-Vindo!" disclaimer: "Ao se registrar, você concorda com a política de privacidade e os termos de serviço." failed: "Algo deu errado, talvez este e-mail já esteja cadastrado, tente usar o link de esqueci a senha." forgot_password: @@ -1700,6 +1718,7 @@ pt_BR: link_dialog_title: "Inserir Hyperlink" link_optional_text: "título opcional" link_url_placeholder: "Cole uma URL ou digite para pesquisar tópicos" + blockquote_title: "Bloco de Citação" blockquote_text: "Bloco de Citação" code_title: "Texto pré-formatado" code_text: "recuar o texto pré-formatado em 4 espaços" @@ -1793,6 +1812,8 @@ pt_BR: topic_reminder: "%{username} %{description}" watching_first_post: "Novo Tópico %{description}" membership_request_accepted: "Afiliação aceita em '%{group_name}'" + reaction: "%{username} %{description}" + reaction_2: "%{username}, %{username2} %{description}" group_message_summary: one: "%{count} mensagem na caixa de entrada de %{group_name}" other: "%{count} mensagens na caixa de entrada de %{group_name}" @@ -1869,6 +1890,7 @@ pt_BR: or_search_google: "Ou tente pesquisar com o Google:" search_google: "Tente pesquisar com o Google em vez disso:" search_google_button: "Google" + search_button: "Pesquisar" context: user: "Pesquisar postagens por @%{username}" category: "Pesquisar a categoria #%{category}" @@ -1923,6 +1945,8 @@ pt_BR: label: Postado before: antes after: depois + views: + label: Visualizações min_views: placeholder: mínimo max_views: @@ -1978,6 +2002,7 @@ pt_BR: new: "Não há mais tópicos novos." unread: "Não há mais tópicos não lidos." category: "Não há mais tópicos na categoria %{category}." + tag: "Não há mais tópicos na categoria %{tag}." top: "Não há mais melhores tópicos." bookmarks: "Não há mais tópicos favoritos." topic: @@ -2053,6 +2078,8 @@ pt_BR: jump_reply_down: pular para a última resposta deleted: "Este tópico foi excluído" slow_mode_update: + save: "Habilitar" + remove: "Desabilitar" hours: "Horas:" minutes: "Minutos:" seconds: "Segundos:" @@ -2119,6 +2146,7 @@ pt_BR: auto_open: "Este tópico abrirá automaticamente em %{timeLeft}." auto_close: "Este tópico fechará automaticamente %{timeLeft}." auto_publish_to_category: "Este tópico será publicado em #%{categoryName} %{timeLeft}." + auto_close_after_last_post: "Este tópico fechará %{duration} após a última resposta." auto_delete: "Este tópico será automaticamente excluído %{timeLeft}." auto_bump: "Este tópico será automaticamente promovido %{timeLeft}." auto_reminder: "Você será lembrado sobre este tópico %{timeLeft}." @@ -2224,6 +2252,7 @@ pt_BR: title: "Compartilhar" extended_title: "Compartilhar um link" help: "compartilhar um link deste tópico" + invite_users: "Convite" print: title: "Imprimir" help: "Abrir uma versão imprimível deste tópico" @@ -2275,11 +2304,13 @@ pt_BR: username_placeholder: "nome de usuário" action: "Enviar Convite" help: "Convidar outros para este tópico por e-mail ou notificação" + discourse_connect_enabled: "Entrar o nome de usuário da pessoa que você gostaria de convidar para este tópico." to_topic_blank: "Entrar o nome de usuário ou endereço de e-mail da pessoa que você gostaria de convidar para este tópico." to_topic_email: "Você digitou um endereço de e-mail. Nós enviaremos um convite por e-mail que permite seu amigo responder imediatamente a este tópico." to_topic_username: "Você inseriu um nome de usuário. Nós vamos enviar uma notificação com um link convidando-o para este tópico." to_username: "Insira o nome de usuário da pessoa que você gostaria de convidar. Nós vamos enviar uma notificação com um link convidando-o para este tópico." email_placeholder: "nome@exemplo.com" + success_email: "Enviamos um convite para %{invitee}. Nós notificaremos você quando este convite for resgatado. Verifique a aba de convites na página de seu usuário para acompanhar seus convites." success_username: "Nós convidamos o usuário para participar neste tópico." error: "Desculpe, nós não pudemos convidar esta pessoa. Talvez já seja usuário? (convites têm taxa limitada)" success_existing_email: "Um usuário com e-mail %{emailOrUsername} já existe. Convidamos este usuário a participar deste tópico." @@ -2388,6 +2419,7 @@ pt_BR: other: "(tópico retirado pelo autor, será automaticamente excluído em %{count} horas a menos que seja sinalizado)" post: quote_reply: "Citação" + quote_share: "Compartilhar" edit_reason: "Motivo:" post_number: "resposta %{number}" ignored: "Conteúdo ignorado" @@ -2617,6 +2649,11 @@ pt_BR: change_in_category_topic: "Editar Descrição" already_used: "Esta cor já foi usada para outra categoria" security: "Segurança" + permissions: + group: "Grupo" + see: "Ver" + reply: "Responder" + create: "Criar" special_warning: "Atenção: Esta categoria é uma categoria padrão e as configurações de segurança e não podem ser editadas. Se você não quer usar esta categoria, apague-a ao invés de reaproveitá-la." uncategorized_security_warning: "Esta categoria é especial. Ela é destinada para tópicos que não têm categoria; ela não pode ter configurações de segurança." uncategorized_general_warning: 'Esta categoria é especial. Ela é usada como a categoria padrão para novos tópicos que não possuem uma categoria selecionada. Se você quiser evitar este comportamento e forçar a seleção de categoria, desative a configuração aqui. Se você quiser alterar o nome ou a descrição, vá para Personalização / Conteúdo de Texto.' @@ -2706,6 +2743,8 @@ pt_BR: details: "Atingir o limiar de denuncias imediatamente, ao invés de esperar para mais denuncias da comunidade" suspend: title: "Suspender usuário" + silence: + title: "Silenciar Usuário" notify_action: "Mensagem" official_warning: "Aviso Oficial" delete_spammer: "Apagar Spammer" @@ -3118,6 +3157,7 @@ pt_BR: one_hour: "1 hora" two_hours: "2 horas" tomorrow: "Até amanhã" + custom: "Definidos" admin_js: type_to_filter: "escreva para filtrar..." admin: @@ -3200,6 +3240,9 @@ pt_BR: view_table: "tabela" view_graph: "gráfico" refresh_report: "Atualizar Relatório" + daily: Diariamente + monthly: Mensalmente + weekly: Semanalmente dates: "Datas (UTC)" groups: "Todos os grupos" disabled: "Este relatório está desativado" @@ -3309,6 +3352,8 @@ pt_BR: revoked: Revogada not_shown_again: Esta chave não será exibida novamente. Certifique-se de tirar uma cópia antes de continuar. continue: Continuar + scopes: + action: Ação web_hooks: title: "Webhooks" none: "Não existem webhooks no momento." @@ -3960,6 +4005,7 @@ pt_BR: censor: "Censor" require_approval: "Requerer aprovação" flag: "Bandeira,Sinalização" + replace: "Substituir" action_descriptions: block: "Impedir que postagens contendo estas palavras sejam postadas. O usuário verá uma mensagem de erro quando tentar enviar a postagem." censor: "Permitir postagens contendo estas palavras, mas substituí-las por caracteres que ocultem as palavras censuradas." @@ -4019,6 +4065,8 @@ pt_BR: check_email: title: "Mostrar endereço de e-mail deste usuário" text: "Mostrar" + check_sso: + text: "Exibir" user: suspend_failed: "Algo deu errado suspendendo este usuário %{error}" unsuspend_failed: "Algo deu errado reativando este usuário %{error}" @@ -4026,6 +4074,7 @@ pt_BR: suspend_reason_label: "Por que você está suspendendo? Este texto será visível para todos na página de perfil deste usuário, e será mostrado ao usuário quando ele tentar se logar. Seja breve." suspend_reason_hidden_label: "Por que você está suspendendo? Este texto será exibido para o usuário quando ele tentar efetuar login. Mantenha-o curto." suspend_reason: "Motivo" + suspend_reason_title: "Razão de Suspensão" suspend_message: "Mensagem de e-mail" suspend_message_placeholder: "Opcionalmente, forneça mais informações sobre a suspensão e ela será enviada para o usuário por e-mail." suspended_by: "Suspenso por" @@ -4204,6 +4253,12 @@ pt_BR: on_grace_period: "Atualmente em período de aprovação da promoção, não será demovido." locked_will_not_be_promoted: "Nível de confiança travado. Nunca será promovido." locked_will_not_be_demoted: "Nível de confiança travado. Nunca será demovido." + discourse_connect: + external_id: "ID Externo" + external_username: "Nome de Usuário" + external_name: "Nome" + external_email: "E-mail" + external_avatar_url: "URL da Imagem de Perfil" user_fields: title: "Campos de Usuários" help: "Adicionar campos que seus usuários podem preencher." @@ -4418,6 +4473,9 @@ pt_BR: embed_title_scrubber: "Expressão regular usada para higienizar o título das publicações" embed_truncate: "Truncar as postagens incorporadas" embed_unlisted: "Os tópicos importados não serão listados até que haja uma resposta." + allowed_embed_selectors: "Seletor de CSS para elementos que são permitidos na incorporação" + blocked_embed_selectors: "Seletor de CSS para elementos que são removidos da incorporação" + allowed_embed_classnames: "Nomes de classes CSS permitidas" save: "Salvar Configurações de Incorporação" permalink: title: "Links permanentes" diff --git a/config/locales/client.ro.yml b/config/locales/client.ro.yml index 46f5f4ddc2470..963c8f49a26f6 100644 --- a/config/locales/client.ro.yml +++ b/config/locales/client.ro.yml @@ -179,6 +179,10 @@ ro: software_update_prompt: message: "Site-ul a fost actualizat! Reîmprospătează pagina." dismiss: "Renunță" + bootstrap_mode_enabled: + one: "Pentru a simplifica lansarea noului site, sunteți în modul bootstrap. Toți utilizatorii noi vor primi nivelul 1 de încredere și vor avea activată primirea zilnică de e-mail-uri rezumat. Această funcționalitate va fi oprită automat după ce se înregistrează primii %{count} membri." + few: "Pentru a simplifica lansarea noului dv. site, sunteți în modul bootstrap. Toți utilizatorii noi vor primi nivelul 1 de încredere și vor avea activată primirea zilnică de e-mail-uri rezumat. Această funcționalitate va fi oprită automat după ce se înregistrează primii %{count} membri." + other: "Pentru a simplifica lansarea noului dv. site, sunteți în modul bootstrap. Toți utilizatorii noi vor primi nivelul 1 de încredere și vor avea activată primirea zilnică de e-mail-uri rezumat. Această funcționalitate va fi oprită automat după ce se înregistrează primii %{count} membri." bootstrap_mode_disabled: "Modul bootstrap va fi dezactivat în următoarele 24 de ore" themes: default_description: "Implicit" @@ -241,6 +245,10 @@ ro: now: "Acum" read_more: "Citește mai mult" more: "Mai mult" + x_more: + one: "Mai e %{count}" + few: "Mai e %{count}" + other: "Mai e %{count}" less: "Mai puțin" never: "Niciodată" every_30_minutes: "La fiecare 30 de minute" @@ -481,6 +489,7 @@ ro: created_at_asc: "Creat la (invers)" priority: title: "Prioritate minimă" + any: "(oricare)" medium: "Medie" high: "Ridicată" conversation: @@ -518,6 +527,8 @@ ro: title: "Postare în așteptare" reviewable_user: title: "Utilizatori" + reviewable_post: + title: "Postare" approval: title: "Necesită aprobare" description: "Am primit noua postare dar trebuie să fie aprobată de un moderator înainte că ea să apară pe site. Te rugăm să ai răbdare." @@ -529,6 +540,21 @@ ro: example_username: "nume de utilizator" reject_reason: send_email: "Trimite un e-mail de respingere" + relative_time_picker: + days: + one: "zi" + few: "Zile" + other: "zile" + time_shortcut: + later_today: "Mai târziu azi" + next_business_day: "Următoarea zi lucrătoare" + tomorrow: "Mâine" + next_week: "Săptămâna viitoare" + later_this_week: "Mai târziu săptămâna asta" + start_of_next_business_week: "Luni" + start_of_next_business_week_alt: "Lunea viitoare" + next_month: "Luna viitoare" + custom: "Data și ora personalizată" user_action: user_posted_topic: "%{user} a postat discuția" you_posted_topic: "ai postat subiectul" @@ -616,6 +642,8 @@ ro: imap_ssl: "Folosește SSL pentru IMAP" username: "Nume utilizator" password: "Parolă" + settings: + title: "Setări" mailboxes: synchronized: "Cutie poștală sincronizată" none_found: "Nu au fost găsite cutii poștale în acest cont de e-mail." @@ -790,6 +818,9 @@ ro: one: "Un subiect" few: "%{count} subiecte" other: "%{count} de subiecte" + topic_stat_unit: + week: "săptămană" + month: "lună" ip_lookup: title: Căutare adresă IP hostname: Nume gazdă @@ -843,6 +874,7 @@ ro: normal_option: "Normal" normal_option_title: "Vei fi notificat dacă acest utilizator îți răspunde, te citează sau te menționează." notification_schedule: + none: "Nimeni" monday: "Luni" tuesday: "Marţi" wednesday: "Miercuri" @@ -850,7 +882,9 @@ ro: friday: "Vineri" saturday: "Sâmbătă" sunday: "Duminică" + to: "către" activity_stream: "Activitate" + read: "Citite" preferences: "Preferințe" feature_topic_on_profile: open_search: "Selectează un subiect nou" @@ -892,6 +926,7 @@ ro: default_description: "Tema implicită" disable_dark_scheme: "La fel ca de obicei" undo: "Resetare" + regular: "Utilizator frecvent" dark: "Mod întunecat" dark_mode: "Mod întunecat" allow_private_messages: "Permite altor utilizatori să îmi trimită mesaje private" @@ -935,6 +970,7 @@ ro: watched_first_post_tags: "Urmărire activă prima postare" watched_first_post_tags_instructions: "Vei fi notificat cu privire la prima postare din fiecare nou subiect cu aceste etichete." muted_categories: "Setat pe silențios" + regular_categories: "Utilizator frecvent" no_category_access: "În calitate de moderator ai acces limitat la categorii, salvarea este dezactivată." delete_account: "Șterge-mi contul" delete_account_confirm: "Ești sigur că vrei să ștergi contul? Această acțiune este ireversibilă!" @@ -977,6 +1013,7 @@ ro: tags: "Etichete" preferences_nav: account: "Cont" + security: "Securitate" profile: "Profil" emails: "Adrese de email" notifications: "Notificări" @@ -1190,6 +1227,11 @@ ro: pending_tab_with_count: "În așteptare: (%{count})" redeemed_tab: "Acceptate" redeemed_tab_with_count: "(%{count}) Acceptate" + invited_via: "Initație" + groups: "Grupuri" + topic: "Discuție" + edit: "Editează" + remove: "Eliminați" reinvited: "Invitaţia a fost retrimisă" search: "Scrie pentru a căuta invitații..." user: "Utilizator invitat" @@ -1357,6 +1399,7 @@ ro: disable: "Arată postările șterse" private_message_info: title: "Mesaj" + add: "Adaugă..." leave_message: "Sigur părăsești acest mesaj?" remove_allowed_user: "Chiar dorești să îl elimini pe %{name} din acest mesaj privat?" remove_allowed_group: "Ești sigur că vrei să îl scoți pe %{name} din acest mesaj?" @@ -1368,6 +1411,7 @@ ro: trust_level: "Nivel de încredere" search_hint: "Numele de utilizator, email sau adresă IP" create_account: + header_title: "Bun venit!" subheader_title: "Să-ți creăm contul" disclaimer: "Prin înregistrare, ești de acord cu politica de confidențialitate și termenii de utilizare." title: "Creează-ți contul" @@ -1556,6 +1600,7 @@ ro: link_description: "adaugă aici descrierea link-ului" link_dialog_title: "Introdu link" link_optional_text: "titlu opțional" + blockquote_title: "Bloc citat" blockquote_text: "Bloc citat" code_title: "Text preformatat" code_text: "indentează textul preformatat cu 4 spații" @@ -1623,6 +1668,8 @@ ro: granted_badge: "Ai câștigat '%{description}'" topic_reminder: "%{username} %{description}" watching_first_post: "Subiect nou %{description}" + reaction: "%{username} %{description}" + reaction_2: "%{username}, %{username2} %{description}" popup: mentioned: '%{username} te-a menţionat în "%{topic}" - %{site_title}' group_mentioned: '%{username} te-a menţionat în "%{topic}" - %{site_title}' @@ -1663,6 +1710,7 @@ ro: start_new_topic: "Creează un nou subiect?" or_search_google: "Sau încearcă să cauți cu Google:" search_google_button: "Google" + search_button: "Caută" context: user: "Caută postări după @%{username}" category: "Caută în categoria #%{category} " @@ -1742,6 +1790,7 @@ ro: change_category: "Alege categoria" close_topics: "Închide subiectele" archive_topics: "Arhivează subiectele" + move_messages_to_inbox: "Mută în „Primite”" notification_level: "Notificări" choose_new_category: "Alege o nouă categorie pentru acest subiect" selected: @@ -1771,6 +1820,7 @@ ro: new: "Nu mai există subiecte noi." unread: "Nu mai există subiecte necitite." category: "Nu mai există subiecte din categoria %{category}." + tag: "Nu mai există subiecte din categoria %{tag}." top: "Nu mai există subiecte de top." bookmarks: "Nu mai sunt semne de carte." topic: @@ -1841,6 +1891,9 @@ ro: jump_reply_up: sări la un răspuns mai vechi jump_reply_down: sări la un răspuns mai nou deleted: "Subiectul a fost șters" + slow_mode_update: + save: "Activează" + remove: "Dezactivează" topic_status_update: title: "Temporizator subiect" save: "Setează temporizator" @@ -1896,6 +1949,7 @@ ro: go: "mergi" jump_bottom: "sari la ultimul mesaj" jump_prompt: "sari la..." + jump_prompt_long: "Sari la..." jump_bottom_with_number: "sari la mesajul %{post_number}" jump_prompt_or: "sau" total: toate postările @@ -1973,6 +2027,7 @@ ro: share: title: "Distribuie" help: "distribuie un link cu acest subiect" + invite_users: "Invită" print: title: "Tipărire" help: "Deschide o versiune pentru imprimare a acestui subiect" @@ -2023,11 +2078,13 @@ ro: username_placeholder: "nume utilizator" action: "Trimite o invitație" help: "invită alţi utilizatori la această discuţie via email sau notificare" + discourse_connect_enabled: "Introdu numele de utilizator al persoanei pe care dorești să o inviți la acest subiect." to_topic_blank: "Introdu numele de utilizator sau adresa de email a persoanei pe care dorești să o inviți la acest subiect." to_topic_email: "Ai introdus o adresă de email. Vom trimite către ea un email cu o invitație ce îi va permite prietenului tău să răspundă imediat la acest subiect." to_topic_username: "Ai introdus un nume utilizator. Îi vom trimite o notificare cu link pentru a-l invita la acest subiect." to_username: "Introdu numele de utilizator al persoanei pe care dorești să o inviți. Îi vom trimite o notificare cu link pentru a o invita la acest subiect." email_placeholder: "nume@exemplu.com" + success_email: "Am trimis o invitație către %{invitee}.. Te vom anunţa când invitația este folosită. Verifică tab-ul de invitații pe pagina ta de utilizator pentru a monitoriza invitațiile. " success_username: "Am invitat acest utilizator să participe la această discuţie." error: "Ne pare rău, nu am putut invita persoana indicată. Poate că a fost deja invitată? (Invitaţiile sunt limitate)" login_reply: "Autentifică-te pentru a răspunde." @@ -2095,6 +2152,7 @@ ro: other: "Ai selectat %{count} de mesaje." post: quote_reply: "Citează" + quote_share: "Distribuie" edit_reason: "Motivul edit[rii: " post_number: "postarea %{number}" reply_as_new_topic: "Răspunde cu link către subiect" @@ -2139,6 +2197,7 @@ ro: attachment_download_requires_login: "Ne pare rău, dar trebuie să fii autentificat pentru a descărca ataşamente." cancel_composer: confirm: "Ce ai vrea să faci cu postarea ta?" + discard: "Renunță" save_draft: "Salvează schița pentru mai târziu" keep_editing: "Continuă editarea" via_email: "această postare a sosit via email" @@ -2189,6 +2248,10 @@ ro: delete_topic: "șterge subiectul" actions: people: + like: + one: "a apreciat asta" + few: "a apreciat asta" + other: "a apreciat asta" like_capped: one: "și %{count} altul au apreciat asta" few: "și %{count} alții au apreciat asta" @@ -2294,6 +2357,11 @@ ro: change_in_category_topic: "Editează descrierea" already_used: "Această culoare este folosită la o altă categorie" security: "Securitate" + permissions: + group: "Grup" + see: "Doar citire" + reply: "Răspunde" + create: "Creează" special_warning: "Atenție: Această categorie este pre-instalată și setările de securitate nu pot fi editate. Dacă nu dorești să folosești această categorie, va trebui să o ștergi în loc să-i schimbi destinația." images: "Imagini" email_in: "Adresa email de primire preferențială:" @@ -2329,6 +2397,7 @@ ro: options: normal: "Normal" ignore: "Ignoră" + high: "Ridicată" sort_options: default: "implicit" likes: "Aprecieri" @@ -2538,6 +2607,7 @@ ro: readonly: "Doar citire" lightbox: download: "descărcare" + counter: "%curr% din %total%" keyboard_shortcuts_help: title: "Scurtături de tastatură" jump_to: @@ -2706,6 +2776,10 @@ ro: dismiss: "Înlătură" safe_mode: enabled: "Modul sigur este activat, pentru a ieși din modul sigur închide această fereastră de browser" + do_not_disturb: + remaining: "a mai rămas %{remaining} ..." + options: + custom: "Personalizat" admin_js: type_to_filter: "tastează pentru a filtra..." admin: @@ -2727,6 +2801,8 @@ ro: version_check_pending: "Se pare că ai actualizat recent. Fantastic!" installed_version: "Instalată" latest_version: "Ultima" + new_features: + dismiss: "Înlătură" last_checked: "Ultima verificare" refresh_problems: "Reîmprospătează" no_problems: "Nu a apărut nicio problemă." @@ -2758,6 +2834,9 @@ ro: view_table: "tabel" view_graph: "grafic" refresh_report: "Reactualizează raportul" + daily: Zilnic + monthly: Lunar + weekly: Săptămânal groups: "Toate grupurile" filters: group: @@ -2810,6 +2889,7 @@ ro: user: "Utilizator" title: "API" created: Creat + updated: Actualizat generate: "Generare" revoke: "Revocă" all_users: "Toți utilizatorii" @@ -2817,6 +2897,8 @@ ro: description: Descriere save: Salvează continue: Continuă + scopes: + action: țiune web_hooks: title: "Webhooks" none: "Momentan nu există nici un webhook" @@ -3010,6 +3092,7 @@ ro: uploads: "Urcări" variable_name: "Numele variabilei SCSS:" upload: "Urcă" + discard: "Renunță" css_html: "CSS/HTML personalizat" edit_css_html: "Modifică CSS/HTML" edit_css_html_help: "Nu ai modificat CSS sau HTML" @@ -3017,6 +3100,7 @@ ro: install_popular: "Populare" about_theme: "Despre" license: "Licență" + version: "Versiune:" enable: "Activează" disable: "Dezactivează" update_to_latest: "Actualizat la ultima" @@ -3322,6 +3406,8 @@ ro: check_email: title: "Arată adresa de email a acestui utilizator" text: "Arată" + check_sso: + text: "Arată" user: suspend_failed: "Ceva nu a funcționat la suspendarea acestui utilizator %{error}" unsuspend_failed: "Ceva nu a funcționat la activarea acestui utilizator %{error}" @@ -3331,6 +3417,7 @@ ro: suspend_message: "Mesaj email" suspended_by: "Suspendat de" silence_reason: "Motiv" + silence_modal_title: "Suspendă utilizatorul" silence_message: "Mesaj email" silence_message_placeholder: "(lăsați necompletat pentru a trimite mesajul implicit)" suspended_until: "(până la %{until})" @@ -3461,7 +3548,11 @@ ro: locked_will_not_be_promoted: "Nivelul de încredere blocat. Nu va fi niciodată promovat." locked_will_not_be_demoted: "Nivelul de încredere blocat. Nu va fi niciodată retrogradat." discourse_connect: + external_id: "ID Extern" external_username: "Nume utilizator" + external_name: "Nume" + external_email: "Email" + external_avatar_url: "URL poză de profil" user_fields: title: "Câmpuri utilizator" help: "Adaugă câmpuri pe care utilizatorii le pot completa." @@ -3643,6 +3734,9 @@ ro: embed_post_limit: "Numărul maxim de postări de încorporat." embed_title_scrubber: "Expresie obișnuită pentru a curăța titlurile postărilor" embed_truncate: "Scurtează postările embedded." + allowed_embed_selectors: "Selector CSS pentru elemente care nu sunt permise în embeds." + blocked_embed_selectors: "Selector CSS pentru elemente care sunt șterse din emebds." + allowed_embed_classnames: "Nume de clase CSS permise" save: "Salvați setările pentru embeding" permalink: title: "Adrese permanente" diff --git a/config/locales/client.sk.yml b/config/locales/client.sk.yml index c418a4e854710..6e0a26bb808d4 100644 --- a/config/locales/client.sk.yml +++ b/config/locales/client.sk.yml @@ -187,6 +187,8 @@ sk: disabled: "odstránil(a) tento oznam %{when}. Už sa viac nebude zobrazovať navrchu každej stránky." wizard_required: "Vitajte vo vašom novom Discourse! Začnime so sprievodcom nastavením✨ " emails_are_disabled: "Odosielanie emailov bolo globálne vypnuté administrátorom. Žiadne emailové notifikácie nebudú odoslané." + software_update_prompt: + dismiss: "Zahodiť" bootstrap_mode_disabled: "Zavádzací režim bude zrušený v priebehu nasledujúcich 24 hodín." themes: default_description: "Predvolené" @@ -242,6 +244,11 @@ sk: now: "práve teraz" read_more: "čítaj ďalej" more: "Viac" + x_more: + one: "%{count} Ďalší" + few: "%{count} Ďalší" + many: "%{count} Ďalší" + other: "%{count} Ďalší" less: "Menej" never: "nikdy" every_30_minutes: "každých 30 mintút" @@ -288,6 +295,8 @@ sk: remove: "Odstrániť záložku" confirm_clear: "Ste si istý, že chcete odstrániť všetky záložky z tejto témy?" save: "Uložiť" + auto_delete_preference: + never: "Nikdy" search: "Hľadať" drafts: resume: "Pokračovať" @@ -350,6 +359,7 @@ sk: username: "Používateľské meno" email: "Email" name: "Meno" + reject_reason: "Dôvod" topics: topic: "Témy" details: "detaily" @@ -385,10 +395,23 @@ sk: types: reviewable_user: title: "Používateľ" + reviewable_post: + title: "Príspevok" approval: title: "Príspevok vyžaduje schválenie" description: "Váš príspevok sme obdžali, ale skôr než bude zverejnený musí byť schválený moderátorom. Prosíme o trpezlivosť." ok: "OK" + example_username: "používateľské meno" + relative_time_picker: + days: + one: "deň" + few: "dní" + many: "dní" + other: "dní" + time_shortcut: + tomorrow: "Zajtra" + next_week: "Budúci týždeň" + next_month: "Budúci mesiac" user_action: user_posted_topic: "%{user} založil tému" you_posted_topic: "Vy ste založili tému" @@ -404,6 +427,7 @@ sk: sent_by_user: "Poslané od %{user}" sent_by_you: "Poslané Vami" directory: + username: "Používateľské meno" filter_name: "filtrovať podľa používateľského mena" title: "Používatelia" likes_given: "Rozdané" @@ -453,11 +477,17 @@ sk: credentials: username: "Používateľské meno" password: "Heslo" + settings: + title: "Nastavenia" mailboxes: disabled: "vypnuté" membership: title: Členstvo access: Prístup + categories: + title: Kategórie + tags: + title: Štítky logs: title: "Záznamy" when: "Kedy" @@ -468,6 +498,8 @@ sk: details: "Detaily" from: "Od" to: "Komu" + permissions: + title: "Práva" public_admission: "Povoliť používateľom slobodne sa stať člen skupiny (kupina musí byť verejne viditeľná)" public_exit: "Povoliť používateľom slobodne opustiť skupinu." empty: @@ -600,6 +632,9 @@ sk: few: "%{count} témy" many: "%{count} tém" other: "%{count} tém" + topic_stat_unit: + week: "týždeň" + month: "mesiac" n_more: "Kategórie (%{count} viac)..." ip_lookup: title: Vyhľadávanie podľa IP adresy @@ -641,7 +676,11 @@ sk: ignore_duration_username: "Používateľské meno" mute_option: "Ignorované" normal_option: "Normálne" + notification_schedule: + none: "Žiadny" + to: "komu" activity_stream: "Aktivita" + read: "Prečítané" preferences: "Nastavenia" feature_topic_on_profile: save: "Uložiť" @@ -669,6 +708,8 @@ sk: dismiss_notifications: "Zahodiť všetko" dismiss_notifications_tooltip: "Označiť všetky neprečítané upozornenia ako prečítané" first_notification: "Vaša prvé upozornenie! Vyberte ho ak chcete začať." + color_schemes: + regular: "Bežné" allow_private_messages: "Umožniť iným používateľom, aby mi posielali osobné správy" external_links_in_new_tab: "Otvárať všekty externé odkazy na novej karte" enable_quoting: "Umožniť odpoveď s citáciou z označeného textu" @@ -711,6 +752,7 @@ sk: watched_first_post_tags: "Sledovaný prvý príspevok" watched_first_post_tags_instructions: "Budete upozornený na prvý príspevok v každej novej téme s týmito štítkami." muted_categories: "Ignorované" + regular_categories: "Bežné" no_category_access: "Ako moderátor máte obmedzený prístup ku kategóriám. Ukladanie nie je povolené." delete_account: "Vymazať môj účet" delete_account_confirm: "Ste si istý, že chcete permanentne vymazať váš účet? Táto akcia je nenávratná." @@ -750,6 +792,7 @@ sk: tags: "Štítky" preferences_nav: account: "Účet" + security: "Bezpečnosť" profile: "Profil" emails: "Emaily" notifications: "Upozornenia" @@ -928,6 +971,11 @@ sk: pending_tab_with_count: "Čakajúce (%{count})" redeemed_tab: "Využité" redeemed_tab_with_count: "Využité (%{count})" + invited_via: "Pozvánka" + groups: "Skupiny" + topic: "Témy" + edit: "Upraviť" + remove: "Odstrániť" reinvited: "Poslať pozvánku znovu" search: "začni písať pre hľadanie pozvánok" user: "Pozvaný používateľ" @@ -1105,6 +1153,7 @@ sk: trust_level: "Stupeň dôvery" search_hint: "používateľské meno, email alebo IP adresa" create_account: + header_title: "Vitajte!" failed: "Niečo sa pokazilo, možno je tento e-mail už registrovaný, vyskúšajte odkaz pre zabudnuté heslo" forgot_password: title: "Obnovenie hesla" @@ -1243,6 +1292,7 @@ sk: link_description: "tu zadaj popis odkazu" link_dialog_title: "Vložte hyperlink" link_optional_text: "nepovinný názov" + blockquote_title: "Úvodzovky" blockquote_text: "Úvodzovky" code_title: "Preformátovaný text" code_text: "Odsaďte preformátovaný text 4 medzerami" @@ -1306,6 +1356,7 @@ sk: post_format: "#%{post_number} podľa %{username}" cant_find: "Nemôžete nájsť to čo hľadáte?" search_google_button: "Google" + search_button: "Hľadať" context: user: "Vyhľadávanie podľa @%{username}" category: "Vyhľadať kategóriu #%{category}" @@ -1339,6 +1390,8 @@ sk: label: Odoslané before: pred after: po + views: + label: Zobrazenia hamburger_menu: "prejsť na iné témy, alebo kategórie" new_item: "nový" go_back: "späť" @@ -1362,6 +1415,7 @@ sk: actions: "Hromadné akcie" close_topics: "Uzavrieť tému" archive_topics: "Archivuj témy" + move_messages_to_inbox: "Presuň do prijatej pošty" notification_level: "Upozornenia" choose_new_category: "Vyberte pre tému novú kategóriu:" selected: @@ -1386,6 +1440,7 @@ sk: new: "Žiadne nové témy." unread: "Žiadne ďalšie neprečítané témy." category: "Žiadne ďalšie témy v %{category}." + tag: "Žiadne ďalšie témy v %{tag}." top: "Nie je už viac poulárnych tém" bookmarks: "Žiadne ďalšie témy v záložkách." topic: @@ -1462,6 +1517,9 @@ sk: jump_reply_up: prejsť na predchádzajúcu odpoveď jump_reply_down: prejsť na nasledujúcu odpoveď deleted: "Téma bola vymazaná" + slow_mode_update: + save: "Zapnúť" + remove: "Vypnúť" topic_status_update: num_of_hours: "Počet hodín:" when: "Kedy:" @@ -1481,6 +1539,7 @@ sk: title: "Upozorni ma" status_update_notice: auto_close: "Táto téma bude automaticky uzavretá o %{timeLeft}." + auto_close_after_last_post: "Táto téma bude uzavretá %{duration} po poslednej odpovedi." auto_close_title: "Nastavenia automatického zatvárania" auto_close_immediate: one: "Posledný príspevok k téme je starý už %{count} hodinu, takže téma bude okamžite uzavretá. " @@ -1496,6 +1555,7 @@ sk: go: "Choď" jump_bottom: "choď na posledný príspevok" jump_prompt: "choď na..." + jump_prompt_long: "Choď na..." jump_bottom_with_number: "choď na príspevok číslo %{post_number}" jump_prompt_or: "alebo" total: Všetkých príspevkov @@ -1569,6 +1629,7 @@ sk: share: title: "Zdieľaj" help: "zdieľaj odkaz na túto tému" + invite_users: "Pozvi" print: title: "Tlačiť" flag_topic: @@ -1619,11 +1680,13 @@ sk: username_placeholder: "používateľské meno" action: "Pošli pozvánku" help: "pozvite ostatných k tejto téme prostredníctvom emailu, alebo upozornení" + discourse_connect_enabled: "Zadajte používateľské meno osoby, ktorú by ste radi pozvali k tejto téme" to_topic_blank: "Zadajte používateľské meno alebo email osoby, ktorú by ste radi pozvali k tejto téme" to_topic_email: "Zadali ste emailovú adresu. Pošleme pozvánku ktorá umožní Vášmu priateľovi okamžitú odpoveď k tejto téme." to_topic_username: "Zadali ste používateľské meno. Pošleme mu pozvánku s odkazom na túto tému." to_username: "Zadajte používateľské meno osoby, ktorú chcete pozvať. Pošleme mu pozvánku s odkazom na túto tému." email_placeholder: "name@example.com" + success_email: "Poslali sme email s pozvánkou na %{invitee}. Upozorníme vas keď bude pozvánka použítá. Svoje pozvánky môžete sledovať na karte pozvánok vo svojom používateľskom profile." success_username: "Pozvali sme tohoto používateľa aby sa podieľal na tejto téme." error: "Ľutujeme, nepodarilo sa nám pozvať túto osobu. Nebola už náhodou pozvaná? (Počet opakovaných pozvánok je obmedzený)" login_reply: "Príhláste sa ak chcete odpovedať" @@ -1689,6 +1752,7 @@ sk: other: "Označili ste %{count} príspevkov" post: quote_reply: "Citácia" + quote_share: "Zdieľaj" edit_reason: "Dôvod:" post_number: "príspevok %{number}" reply_as_new_topic: "Odpoveď ako súvisiaca téma" @@ -1700,6 +1764,7 @@ sk: few: "(príspevky stiahnuté autorom budú automaticky zmazané za %{count} hodiny pokiaľ nie sú označené)" many: "(príspevky stiahnuté autorom budú automaticky zmazané za %{count} hodín pokiaľ nie sú označené)" other: "(príspevky stiahnuté autorom budú automaticky zmazané za %{count} hodín pokiaľ nie sú označené)" + collapse: "zbaliť" expand_collapse: "rozbaliť/zbaliť" gap: one: "zobraziť skrytú odpoveď" @@ -1732,6 +1797,8 @@ sk: image_upload_not_allowed_for_new_user: "Ľutujeme, noví použivatelia nemôžu nahrávať obrázky." attachment_upload_not_allowed_for_new_user: "Ľutujeme, noví používatelia nemôžu nahrávať prílohy." attachment_download_requires_login: "Ľutujeme, pre stiahnutie príloh musíte byť prihlásený." + cancel_composer: + discard: "Zahodiť" via_email: "tento príspevok prišiel emailom" whisper: "tento príspevok je súkromným šepotom pre moderátorov" wiki: @@ -1766,6 +1833,12 @@ sk: unlock_post: "Odblokovať príspevok" delete_topic: "odstrániť tému" actions: + people: + like: + one: "páčilo sa" + few: "páčilo sa" + many: "páčilo sa" + other: "páčilo sa" by_you: off_topic: "Označíli ste to ako mimo tému" spam: "Označíli ste to ako spam" @@ -1831,6 +1904,11 @@ sk: change_in_category_topic: "Uprav popis" already_used: "Táto farba je už použitá inou kategóriou" security: "Bezpečnosť" + permissions: + group: "Skupina" + see: "Zobraz" + reply: "Odpovedať" + create: "Vytvoriť:" special_warning: "Upozornenie: Toto je preddefinovaná kategória a jej bezpečnostné nastavenia sa nedajú upraviť. Pokiaľ si neželáte použiť túto kategóriu, neupravujte ju, ale zmažte." images: "Obrázky" email_in: "Vlastná e-mailová adresa pre príchodziu poštu:" @@ -1861,6 +1939,7 @@ sk: options: normal: "Normálne" sort_options: + default: "predvolené" likes: "Páči sa mi" views: "Zobrazenia" posts: "Príspevky" @@ -1873,6 +1952,14 @@ sk: flagging: title: "Ďakujeme, že pomáhate udržiavať slušnosť v našej komunite!" action: "Označ príspevok" + take_action_options: + default: + title: "Vykonať akciu" + details: "Dosiahnuť okamžite limit označení, namiesto čakania na ďalšie označenia od komunity" + suspend: + title: "Zruš práva používateľovi" + silence: + title: "Tichý užívateľ" notify_action: "Správa" official_warning: "Oficiálne varovanie" delete_spammer: "Zmazať spammera" @@ -2055,6 +2142,7 @@ sk: readonly: "Zobraz" lightbox: download: "stiahnuť" + counter: "%curr% z %total%" keyboard_shortcuts_help: title: "Klávesové skratky" jump_to: @@ -2114,6 +2202,11 @@ sk: granted_on: "Udelený dňa %{date}" others_count: "Ostatní s týmto odznakom (%{count})" title: Odznaky + more_badges: + one: "+%{count} Ďalší" + few: "+%{count} Ďalší" + many: "+%{count} Ďalší" + other: "+%{count} Ďalší" granted: one: "%{count} udelený" few: "%{count} udelené" @@ -2189,6 +2282,10 @@ sk: back: "Späť" share: "Zdieľať" dismiss: "Zahodiť" + do_not_disturb: + remaining: "%{remaining} zostáva" + options: + custom: "Vlastné" admin_js: type_to_filter: "zadajte, čo chcete filtrovať ..." admin: @@ -2210,6 +2307,8 @@ sk: version_check_pending: "Zdá sa že ste nedávno aktualizovali. Fantastické!" installed_version: "Nainštalované" latest_version: "Najnovšie" + new_features: + dismiss: "Zahodiť" last_checked: "Naposledy overené" refresh_problems: "Obnoviť" no_problems: "Nenašli sa žiadne problémy." @@ -2242,6 +2341,9 @@ sk: view_table: "tabuľka" view_graph: "graf" refresh_report: "Obnoviť report" + daily: Denne + monthly: Mesačne + weekly: Týždenne groups: "Všetky skupiny" filters: group: @@ -2308,6 +2410,8 @@ sk: description: Popis save: Uložiť continue: Pokračovať + scopes: + action: Akcia web_hooks: create: "Vytvoriť" save: "Uložiť" @@ -2426,6 +2530,7 @@ sk: components: "Komponenty" theme_name: "Názov témy" component_name: "Názov komponentu" + customize_desc: "Upraviť:" create: "Vytvoriť:" create_type: "Typ" create_name: "Meno" @@ -2445,6 +2550,7 @@ sk: installed: "Nainštalované" install_popular: "Populárne" about_theme: "O stránke" + version: "Verzia:" enable: "Povoliť" disable: "Zakázať" check_for_updates: "Skontrolovať aktualizácie" @@ -2527,6 +2633,7 @@ sk: delivery_method: "Spôsob doručenia" preview_digest_desc: "Náhľad obsahu súhrnných emailov zaslaných neaktívnym používateľom." refresh: "Obnoviť" + sending_email: "Email sa odosiela..." format: "Formát" html: "html" text: "text" @@ -2577,6 +2684,7 @@ sk: do_nothing: "nerob nič" staff_actions: all: "všetko" + filter: "Filter:" title: "Akcie personálu" clear_filters: "Ukázať všetko" staff_user: "Používateľ" @@ -2659,6 +2767,7 @@ sk: logster: title: "Chybové Logy" watched_words: + search: "hľadať" clear_filter: "Vyčistiť" download: Stiahnuť clear_all: Odznač všetky @@ -2707,6 +2816,8 @@ sk: check_email: title: "Odhaliť emailovú adresu tohto používateľa" text: "Zobraziť" + check_sso: + text: "Zobraziť" user: suspend_failed: "Niečo sa pokazilo pri odoberaní práv tomuto používateľovi %{error}" unsuspend_failed: "Niečo sa pokazilo pri obnovovaní práv tomuto používateľovi %{error}" @@ -2824,6 +2935,12 @@ sk: on_grace_period: "V súčastnosti je v povyšovacej skúšobnej dobe, nebude degradovaný." locked_will_not_be_promoted: "Stupeň dôvery je zamknutý. Nikdy nebude povýšený." locked_will_not_be_demoted: "Stupeň dôvery je zamknutý. Nikdy nebude degradovaný." + discourse_connect: + external_id: "Externé ID" + external_username: "Používateľské meno" + external_name: "Meno" + external_email: "Email" + external_avatar_url: "URL profilovej fotky" user_fields: title: "Používateľské polia" help: "Pridaj polia, ktoré môžu užívatelia vyplniť" @@ -2997,6 +3114,9 @@ sk: embed_by_username: "Používateľské meno pre vytváranie tém" embed_post_limit: "Maximálny počet vložených príspevkov" embed_truncate: "Skrátiť vložené príspevky" + allowed_embed_selectors: "CSS selector pre elementy ktoré je možné vkladať" + blocked_embed_selectors: "CSS selector pre elementy ktoré nie je možné vkladať" + allowed_embed_classnames: "Dovolené názvy CSS tried" save: "Uložiť Nastavenia vkladania" permalink: title: "Trvalé odkazy" diff --git a/config/locales/client.sl.yml b/config/locales/client.sl.yml index 31e4211e3b025..83178b3b7e313 100644 --- a/config/locales/client.sl.yml +++ b/config/locales/client.sl.yml @@ -202,6 +202,8 @@ sl: topic_admin_menu: "dejanja teme" wizard_required: "Dobrodošli v vašem novem Discoursu! Začnimo s čarovnikom za nastavitve ✨" emails_are_disabled: "Vsa odhodna e-pošta je bila globalno onemogočena iz strani administratorja. E-poštna obvestila ne bodo poslana." + software_update_prompt: + dismiss: "Opusti" bootstrap_mode_disabled: "Zagonski način bo onemogočen v 24 urah." themes: default_description: "Privzeto" @@ -265,6 +267,11 @@ sl: now: "ravnokar" read_more: "preberi več" more: "Več" + x_more: + one: "%{count} Več" + two: "%{count} Več" + few: "%{count} Več" + other: "%{count} Več" less: "Manj" never: "nikoli" every_30_minutes: "vsakih 30 minut" @@ -474,6 +481,7 @@ sl: created_at_asc: "Ustvarjeno (obratno)" priority: title: "Minimalna prednost" + any: "(katerikoli)" low: "Nizka" medium: "Srednja" high: "Visoka" @@ -512,6 +520,8 @@ sl: title: "Prispevek za potrditev" reviewable_user: title: "Uporabnik" + reviewable_post: + title: "Prispevek" approval: title: "Prispevek za odobritev." description: "Prejeli smo vaš nov prispevek, vendar potrebuje odobritev s strani moderatorja preden bo objavljen. Prosimo za potrpežljivost." @@ -1360,7 +1370,12 @@ sl: expired_tab: "Poteklo" redeemed_tab: "Sprejeto" redeemed_tab_with_count: "Sprejeto (%{count})" + invited_via: "Povabilo" + groups: "Skupine" + topic: "Tema" expires_at: "Poteče" + edit: "Uredi" + remove: "Odstrani" reinvited: "Povabilo ponovno poslano" search: "išči povabila..." user: "Povabljen uporabnik" @@ -1376,6 +1391,9 @@ sl: topics_entered: "Ogledanih tem" posts_read_count: "Prebranih prispevkov" expired: "To povabilo je poteklo." + remove_all: "Odstranite potekla povabila" + removed_all: "Vsa pretečena povabila odstranjena!" + remove_all_confirm: "Ali ste prepričani, da hočete odstraniti vsa pretečena povabila?" reinvite_all_confirm: "Ste prepričani, da želite ponovno poslati vsa povabila?" time_read: "Čas branja" days_visited: "Dni prisotnosti" @@ -1849,6 +1867,7 @@ sl: link_dialog_title: "Vstavi povezavo" link_optional_text: "neobvezen naslov" link_url_placeholder: "Za iskanje po temah prilepite ali vpišite URL" + blockquote_title: "Citirano" blockquote_text: "Citirano" code_title: "Predoblikovano besedilo" code_text: "zamakni predoblikovano besedilo s 4 presledki" @@ -1901,6 +1920,7 @@ sl: toggle_topic_bump: label: "Preklopi izpostavljanje teme" desc: "Odgovori brez da spremeniš čas zadnjega odgovora" + ignore: "Prezri" notifications: tooltip: regular: @@ -1948,6 +1968,8 @@ sl: topic_reminder: "%{username} %{description}" watching_first_post: "Nova tema %{description}" membership_request_accepted: "Sprejeti v članstvo v '%{group_name}'" + reaction: "%{username} %{description}" + reaction_2: "%{username}, %{username2} %{description}" group_message_summary: one: "%{count} sporočilo v%{group_name} predalu" two: "%{count} sporočili v %{group_name} predalu" @@ -2108,6 +2130,7 @@ sl: change_category: "Določi kategorijo" close_topics: "Zapri teme" archive_topics: "Arhiviraj teme" + move_messages_to_inbox: "Prestavi v Prejeto" notification_level: "Obvestila" change_notification_level: "Spremeni raven obveščanja" choose_new_category: "Izberi novo kategorijo za temo:" @@ -2245,9 +2268,16 @@ sl: minutes: "Minute:" seconds: "Sekunde:" durations: + 10_minutes: "10 minut" 15_minutes: "15 minut" + 30_minutes: "30 Minut" + 45_minutes: "45 minut" 1_hour: "1 ura" + 2_hours: "2 Uri" 4_hours: "4 ure" + 8_hours: "8 ure" + 12_hours: "12 ure" + 24_hours: "24 ure" custom: "Trajanje po meri" topic_status_update: title: "Opomnik teme" @@ -2409,6 +2439,7 @@ sl: title: "Deli" extended_title: "Deli povezavo" help: "deli povezavo do te teme" + invite_users: "Povabi" print: title: "Natisni" help: "Odpri tiskalniku prilagojeno verzijo te teme" @@ -2476,6 +2507,7 @@ sl: to_topic_username: "Vnesli ste uporabniško ime. Poslali mu bomo obvestilo s povezavo na to temo." to_username: "Vnesite uporabniško ime osebe, ki bi jo povabili v to temo. Poslali mu bomo obvestilo s povezavo na to temo." email_placeholder: "name@example.com" + success_email: "Poslali smo povabilo na %{invitee}. Obvestili vas bomo, ko se bo uporabnik prvič prijavil. Na vaši uporabniški strani lahko v zavihku Povabila spremljate stanje vaših povabil." success_username: "Povabili smo uporabnika, da sodeluje v tej temi." error: "Nismo mogli povabiti to osebo. Mogoče je ta oseba že povabljena? (povabila so omejena)" success_existing_email: "Uporabnik z e-naslovom %{emailOrUsername} že obstaja. Tega uporabnika smo povabili, da sodeluje v tej temi." @@ -2590,6 +2622,7 @@ sl: other: "(tema umaknjena s strani avtorja bo samodejno izbrisana v %{count} urah - razen če je prijavljena moderatorju)" post: quote_reply: "Citiraj" + quote_share: "Deli" edit_reason: "Razlog: " post_number: "prispevek %{number}" ignored: "Prezrta vsebina" @@ -2695,6 +2728,7 @@ sl: convert_to_moderator: "Dodaj barvo osebja" revert_to_regular: "Odstrani barvo osebja" rebake: "Obnovi HTML" + publish_page: "Objavljanje strani" unhide: "Ponovni prikaži" change_owner: "Spremeni lastnika" grant_badge: "Podeli značko" @@ -2717,6 +2751,11 @@ sl: edit_timer: "uredi časovnik" actions: people: + like: + one: "je všeč" + two: "je všeč" + few: "je všeč" + other: "je všeč" like_capped: one: "in %{count} drugemu uporabniku je prispevek všeč" two: "in %{count} drugima uporabnikoma je prispevek všeč" @@ -2916,6 +2955,11 @@ sl: title: "Hvala, da pomagate ohraniti prijazno skupnost!" action: "Prijavi prispevek" take_action_options: + default: + title: "Ukrepaj" + details: "Doseži zahtevan nivo prijav takoj in ne čakaj na več prijav s strani uporabnikov" + suspend: + title: "Suspendiraj uporabnika" silence: title: "Utišaj uporabnika" notify_action: "Opozorilo" @@ -3567,6 +3611,7 @@ sl: continue: Nadaljuj use_global_key: Globalni ključ (omogoča vsa dejanja) scopes: + action: Dejanje descriptions: topics: write: Ustvarite novo temo ali objavite v obstoječi. @@ -3699,6 +3744,7 @@ sl: duplicate_remote_theme: "Komponenta teme »%{name}« je že nameščena. Ali ste prepričani, da želite namestiti dodatno kopijo?" about_theme: "O nas" license: "Licenca" + version: "Verzija:" enable: "Omogoči" disable: "Onemogoči" updating: "Posodabljam..." @@ -3718,6 +3764,9 @@ sl: title: "Barve" copy_name_prefix: "Kopija od" undo: "razveljavi" + revert: "povrni" + primary: + name: "primarni" highlight: name: "izpostavljeno" danger: @@ -3738,7 +3787,10 @@ sl: sent_at: "Poslano" time: "Čas" user: "Uporabnik" + sent_test: "poslano!" refresh: "Osveži" + sending_email: "Pošiljanje e-sporočila..." + text: "besedilo" incoming_emails: from_address: "Od" to_addresses: "Za" @@ -4145,6 +4197,7 @@ sl: settings: show_overriden: "Prikaži samo preglašene/spremenjene" history: "Ogled zgodovine sprememb" + reset: "ponastavi" none: "brez" site_settings: title: "Nastavitve" @@ -4243,6 +4296,7 @@ sl: other: "%{count} značk za podelitev." sample: "Primer:" grant: + with: %{username} with_post: %{username} za prispevek v %{link} with_post_time: %{username} za prispevek v %{link} ob %{time} with_time: %{username} ob %{time} @@ -4282,6 +4336,7 @@ sl: modal: categories: "Kategorije" topics: "Tem" + replace: "Zamenjaj" wizard_js: wizard: done: "Končano" diff --git a/config/locales/client.sq.yml b/config/locales/client.sq.yml index 399a8ca14a93a..405f75b48ad84 100644 --- a/config/locales/client.sq.yml +++ b/config/locales/client.sq.yml @@ -139,6 +139,8 @@ sq: disabled: "çlistuar %{when}" wizard_required: "Mirseerdhët tek faqja juaj e re Discourse! Le t'ia nisim me \"setup wizard\" ✨" emails_are_disabled: "Emailat janë çaktivizuar globalisht nga administratori i faqes. Asnjë njoftim me email nuk do të dërgohet. " + software_update_prompt: + dismiss: "Hiqe" themes: default_description: "Paracaktuar" s3: @@ -185,6 +187,9 @@ sq: now: "tani" read_more: "lexo më shumë" more: "Më shumë" + x_more: + one: "Edhe %{count}" + other: "Edhe %{count}" less: "Më pak" never: "asnjëherë" every_30_minutes: "çdo 30 minuta" @@ -225,6 +230,8 @@ sq: not_bookmarked: "shto postimin tek të preferuarat" remove: "Hiqeni nga të prefereruarat" save: "Ruaj" + auto_delete_preference: + never: "Asnjëherë" search: "Kërko" drafts: remove: "Hiq" @@ -263,6 +270,7 @@ sq: username: "Emri i përdoruesit" email: "Email" name: "Emri" + reject_reason: "Arsye" topics: topic: "Topic" details: "detaje" @@ -292,10 +300,17 @@ sq: types: reviewable_user: title: "User" + reviewable_post: + title: "Postim" approval: title: "Postimi ka nevojë për aprovim" description: "Postimi juaj u morr, por duhet të aprovohet nga një moderator para se të shfaqet në faqe. Kini pak durim. " ok: "OK" + example_username: "username" + relative_time_picker: + days: + one: "ditë" + other: "ditë" user_action: user_posted_topic: "%{user} postoi temën" you_posted_topic: "Ju postuat temën" @@ -311,6 +326,7 @@ sq: sent_by_user: "Dërguar nga %{user}" sent_by_you: "Dërguar nga ju" directory: + username: "Emri i përdoruesit" filter_name: "filtro sipas emrit të anëtarit" title: "Anëtarët" likes_given: "Dhënë" @@ -354,6 +370,12 @@ sq: credentials: username: "Emri i përdoruesit" password: "Fjalëkalimi" + settings: + title: "Rregullimet" + categories: + title: Kategoritë + tags: + title: Etiketat logs: title: "Logs" when: "Kur" @@ -364,6 +386,8 @@ sq: details: "Detaje" from: "Nga" to: "Për" + permissions: + title: "Të drejtat" public_admission: "Lejo që përdoruesit të bashkohen lirisht ne grupin (Kërkon grupin e dukshëm publik)" public_exit: "Lejo përdoruesit të largohen nga grupi lirshëm" empty: @@ -450,6 +474,9 @@ sq: topic_sentence: one: "%{count} temë" other: "%{count} tema" + topic_stat_unit: + week: "javë" + month: "muaj" ip_lookup: title: Shiko adresën IP hostname: Hostname @@ -487,7 +514,11 @@ sq: ignore_duration_username: "Emri i përdoruesit" mute_option: "Pa njoftime" normal_option: "Normal" + notification_schedule: + none: "Asnjë" + to: "për" activity_stream: "Aktiviteti" + read: "Lexuar" preferences: "Preferencat" feature_topic_on_profile: save: "Ruaj" @@ -511,6 +542,9 @@ sq: dismiss_notifications: "Hiqini të gjitha" dismiss_notifications_tooltip: "Shëno njoftimet e palexuara si të lexuara" first_notification: "Njoftimi juaj i parë! Zgjidheni për të filluar. " + color_schemes: + undo: "Rivendos" + regular: "Normal" external_links_in_new_tab: "Hap të gjitha lidhjet e jashtme në një tab të ri" enable_quoting: "Aktivizo citimin në përgjigje për tekstin e përzgjedhur" change: "ndrysho" @@ -541,6 +575,7 @@ sq: watched_first_post_tags: "Postimi i parë nën vëzhgim" watched_first_post_tags_instructions: "Ju do të njoftoheni vetëm për postimin e parë të çdo teme nën këto etiketa." muted_categories: "Pa njoftime" + regular_categories: "Normal" delete_account: "Fshi llogarinë time" delete_account_confirm: "Jeni i sigurtë që dëshironi ta mbyllni përgjithmonë llogarinë tuaj? Ky veprim nuk mund të zhbëhet!" deleted_yourself: "Llogaria juaj u fshi me sukses." @@ -576,6 +611,7 @@ sq: tags: "Etiketat" preferences_nav: account: "Llogaria" + security: "Siguria" profile: "Profili" emails: "Emailat" notifications: "Njoftimet" @@ -728,6 +764,11 @@ sq: pending_tab_with_count: "Në pritje (%{count})" redeemed_tab: "Shlyer" redeemed_tab_with_count: "Shlyer (%{count})" + invited_via: "Ftesë" + groups: "Grupet" + topic: "Topic" + edit: "Redakto" + remove: "Hiq" reinvited: "Ftesa u ri-dërgua" search: "shkruaj për të kërkuar ftesat..." user: "Anëtari i ftuar" @@ -880,6 +921,7 @@ sq: trust_level: "Niveli i besimit" search_hint: "emri i anëtarit, email ose adresë IP" create_account: + header_title: "Mirë se vini!" failed: "Diçka nuk funksionoi siç duhet, mbase kjo adresë emaili është e regjistruar në faqe. Provoni butonin e fjalëkalimit të humbur. " forgot_password: title: "Rivendos fjalëkalimin" @@ -1013,6 +1055,7 @@ sq: link_description: "shkruaj përshkrimin e lidhjes këtu" link_dialog_title: "Vendosni një lidhje" link_optional_text: "titull fakultativ" + blockquote_title: "Citim" blockquote_text: "Citim" code_title: "Tekst i paraformatuar" code_text: "shkruani 4 hapësira (space) për të filluar tekstin e paraformatuar" @@ -1074,6 +1117,7 @@ sq: no_more_results: "Nuk gjetëm rezultate të tjera. " post_format: "#%{post_number} nga %{username}" search_google_button: "Google" + search_button: "Kërko" context: user: "Kërko postime nga @%{username}" category: "Kërkoni kategorinë #%{category}" @@ -1087,6 +1131,11 @@ sq: label: Në grupin with_badge: label: Me stemën + post: + count: + label: Postime + views: + label: Shikimet hamburger_menu: "shko tek një kategori ose një listë e re temash" new_item: "e re" go_back: "kthehu mbrapa" @@ -1110,6 +1159,7 @@ sq: actions: "Veprime në masë" close_topics: "Mbyll temat" archive_topics: "Arkivo temat" + move_messages_to_inbox: "Transfero në inbox" notification_level: "Njoftimet" choose_new_category: "Zgjidhni kategorinë e re për temat: " selected: @@ -1132,6 +1182,7 @@ sq: new: "Nuk ka më tema të reja." unread: "Nuk ka më tema të palexuara." category: "Nuk ka më tema nga %{category}." + tag: "Nuk ka më tema nga %{tag}." top: "Nuk ka më tema popullore." bookmarks: "Nuk ka më tema të preferuara." topic: @@ -1194,11 +1245,17 @@ sq: jump_reply_up: hidhe tek përgjigja paraardhëse jump_reply_down: hidhu tek përgjigja pasardhëse deleted: "Tema është fshirë" + slow_mode_update: + save: "Aktivizo" + remove: "Çaktivizo" + topic_status_update: + when: "Kur:" auto_close: error: "Ju lutem shkruani një vlerë të vlefshme." based_on_last_post: "Mos e mbyll derisa postimi i fundit brenda temës të jetë të paktën kaq i vjetër. " status_update_notice: auto_close: "Kjo temë do të mbyllet automatikisht %{timeLeft}." + auto_close_after_last_post: "Kjo temë do të mbyllet %{duration} pas përgjigjes së fundit. " auto_close_title: "Rregullimet e Mbylljes Automatike" timeline: back: "Kthehu mbrapa" @@ -1286,6 +1343,7 @@ sq: share: title: "Shpërndaje" help: "shpërndani një lidhje mbi temën" + invite_users: "Fto" flag_topic: title: "Sinjalizo" help: "sinjalizo privatisht këtë temë ose dërgo një njoftim privat" @@ -1330,11 +1388,13 @@ sq: username_placeholder: "emri i përdoruesit" action: "Dërgoni ftesën" help: "fto të tjerë në këtë temë nëpërmjet emailit ose njoftimeve" + discourse_connect_enabled: "Vendosni emrin e përdoruesit që dëshironi të ftoni në këtë temë" to_topic_blank: "Vendosni emrin e përdoruesit ose adresën email të personit që dëshironi të ftoni në këtë temë" to_topic_email: "Ju keni shtuar një adresë email. Ne do t'i dërgojmë një ftesë në email që do ta lejojë mikun tuaj t'i përgjigjet menjëherë kësaj teme." to_topic_username: "Ju shtuat një emër përdoruesi. Ne do t'i dërgojmë një njoftim me një lidhje duke i ftuar ata në këtë temë." to_username: "Vendosni emrin e përdoruesit që dëshironi të ftoni. Sistemi do i dërgojë një njoftim me një lidhje drejt kësaj teme. " email_placeholder: "emri@adresa.com" + success_email: "Sistemi dërgoi një ftesë për %{invitee}. Do t'ju njoftojmë kur ftesa të jetë pranuar. Shikoni edhe faqen Ftesat nën profilin tuaj të anëtarit për të parë statusin e ftesave. " success_username: "Ky anëtar u ftua të marrë pjesë në këtë temë. " error: "Nuk e ftuam dot këtë person. A ka mundësi që të jetë ftuar më parë?" login_reply: "Identifikohu për t'u Përgjigjur" @@ -1388,6 +1448,7 @@ sq: one: Keni përzgjedhur %{count} postim. other: "Keni përzgjedhur %{count} postime." post: + quote_share: "Shpërndaje" edit_reason: "Arsyeja:" post_number: "postimi %{number}" reply_as_new_topic: "Përgjigju në një temë të re të ndërlidhur" @@ -1455,6 +1516,10 @@ sq: grant_badge: "Dhuroni Stemë" delete_topic: "fshi temën" actions: + people: + like: + one: "pëlqeu këtë" + other: "pëlqeu këtë" by_you: off_topic: "Ti sinjalizove këtë postim si jashtë teme" spam: "Ti sinjalizove këtë postim si spam" @@ -1524,6 +1589,10 @@ sq: change_in_category_topic: "Redakto përshkrimin" already_used: "Kjo ngjyrë është përdorur nga një kategori tjetër" security: "Siguria" + permissions: + group: "Grupi" + see: "Shiko" + reply: "Përgjigju" special_warning: "Warning: This category is a pre-seeded category and the security settings cannot be edited. If you do not wish to use this category, delete it instead of repurposing it." images: "Imazhet" email_in: "Custom incoming email address:" @@ -1554,6 +1623,7 @@ sq: options: normal: "Normal" sort_options: + default: "paracaktuar" likes: "Pëlqime" views: "Shikimet" posts: "Postime" @@ -1566,6 +1636,12 @@ sq: flagging: title: "Faleminderit për ndihmën që i jepni këtij komuniteti!" action: "Sinjalizo postimin" + take_action_options: + default: + title: "Vepro" + details: "Kaloni direkt tek pragu i sinjalizimeve (dmth, mos prisni për sinjalizime të tjera nga komuniteti)" + suspend: + title: "Pezullo anëtarin" notify_action: "Mesazh" official_warning: "Paralajmërim zyrtar" delete_spammer: "Elimino Spammer" @@ -1726,6 +1802,7 @@ sq: readonly: "Shiko" lightbox: download: "shkarko" + counter: "%curr% nga %total%" keyboard_shortcuts_help: title: "Shkurtimet e tastierës " jump_to: @@ -1868,6 +1945,10 @@ sq: back: "Kthehu mbrapa" share: "Shpërndaje" dismiss: "Hiqe" + do_not_disturb: + remaining: "edhe %{remaining} gërmë" + options: + custom: "Grupet e krijuara" admin_js: type_to_filter: "shkruaj për kërkim" admin: @@ -1889,6 +1970,8 @@ sq: version_check_pending: "Me sa shohim keni rinovuar faqen se fundmi. Fantastike!" installed_version: "Instaluar" latest_version: "Të fundit" + new_features: + dismiss: "Hiqe" last_checked: "Verifikimi i fundit" refresh_problems: "Rifresko" no_problems: "Nuk u gjet asnjë gabim." @@ -1915,6 +1998,9 @@ sq: view_table: "tabelë" view_graph: "grafik" refresh_report: "Rifresko raportin" + daily: Ditore + monthly: Mujore + weekly: Javore groups: "Të gjitha grupet" filters: group: @@ -1969,6 +2055,8 @@ sq: show_details: Detaje description: Përshkrimi save: Ruaj + scopes: + action: Veprimi web_hooks: title: "Webhooks" save: "Ruaj" @@ -2078,6 +2166,7 @@ sq: revert_confirm: "A jeni i sigurtë që doni të riktheni ndryshimet?" theme: theme: "Tema" + customize_desc: "Personalizo:" create_type: "Lloji" create_name: "Emri" edit: "Redakto" @@ -2088,6 +2177,7 @@ sq: installed: "Instaluar" install_popular: "Popullore" about_theme: "Rreth" + version: "Versioni:" enable: "Aktivizo" disable: "Çaktivizo" add: "Shto" @@ -2165,6 +2255,7 @@ sq: sent_test: "u dërgua!" delivery_method: "Metoda e dorëzimit" refresh: "Rifresko" + sending_email: "Duke dërguar emailin..." format: "Formati" html: "html" text: "tekst" @@ -2217,6 +2308,7 @@ sq: do_nothing: "mos bëj asgjë" staff_actions: all: "të gjitha" + filter: "Filtro:" title: "Veprime Stafi" clear_filters: "Trego gjithshka" staff_user: "User" @@ -2298,6 +2390,7 @@ sq: logster: title: "Ditar Gabimesh" watched_words: + search: "kërko" clear_filter: "Pastro" download: Shkarko clear_all: Pastro kriteret @@ -2323,6 +2416,7 @@ sq: active: "Aktiv" staff: "Stafi" suspended: "Të pezulluar" + staged: "Staged" approved: "Aprovuar?" titles: active: "Përdorues Aktivë" @@ -2341,6 +2435,8 @@ sq: check_email: title: "Shfaq adresën email të këtij përdoruesi." text: "Shfaq" + check_sso: + text: "Shfaq" user: suspend_failed: "Pati një problem gjatë pezullimit të anëtarit. %{error}" unsuspend_failed: "Pati një problem gjatë çpezullimit të anëtarit. %{error}" @@ -2453,6 +2549,12 @@ sq: on_grace_period: "Currently in promotion grace period, will not be demoted." locked_will_not_be_promoted: "Niveli i besimit i kyçur. Nuk do të promovohet kurrë. " locked_will_not_be_demoted: "Niveli i besimit i kyçur. Nuk do të rikthehet kurrë. " + discourse_connect: + external_id: "ID i jashtëm" + external_username: "Emri i përdoruesit" + external_name: "Emri" + external_email: "Email" + external_avatar_url: "URL e fotos së profilit" user_fields: title: "Fushat e përdoruesit" help: "Shto fusha që përdoruesit mund të plotësojnë." @@ -2618,6 +2720,8 @@ sq: embedding: title: "Embedding" edit: "redakto" + embed_post_limit: "Maximum number of posts to embed" + embed_truncate: "Truncate the embedded posts" permalink: title: "Permalinks" url: "URL" diff --git a/config/locales/client.sr.yml b/config/locales/client.sr.yml index 5e20cc409f1eb..2542abdc16f26 100644 --- a/config/locales/client.sr.yml +++ b/config/locales/client.sr.yml @@ -395,6 +395,7 @@ sr: username: "Korisničko ime" email: "E-mail" name: "Ime foruma" + reject_reason: "Razlog" topics: topic: "Tema" reviewable_count: "Broj" @@ -431,12 +432,28 @@ sr: title: "Potrebno odobrenje" description: "Primili smo tvoj novi post ali on najpre mora biti odobren od strane moderatora. Budi strpljiv." ok: "U redu" + example_username: "Korisničko ime" relative_time_picker: + days: + one: "dan" + few: "dana" + other: "dana" years: one: "godina" few: "godine" other: "godina" relative: "Povezano" + time_shortcut: + later_today: "Kasnije ovog dana" + next_business_day: "Naredni radni dan" + tomorrow: "Sutra" + next_week: "Sledeće sedmice" + post_local_date: "Datum u poruci" + later_this_week: "Kasnije ove sedmice" + start_of_next_business_week: "Ponedeljak" + start_of_next_business_week_alt: "Naredni ponedeljak" + next_month: "Naredni mesec" + custom: "Prilagođen datum i vreme" user_action: user_posted_topic: "%{user} je objavio temu" you_posted_topic: "Objavio si temu" @@ -452,6 +469,7 @@ sr: sent_by_user: "Poslao %{user}" sent_by_you: "Poslao ti" directory: + username: "Korisničko ime" filter_name: "filtriraj po korisničkom imenu" title: "Korisnici" likes_given: "Dato" @@ -497,12 +515,18 @@ sr: credentials: username: "Korisničko ime" password: "Šifra" + settings: + title: "Podešavanje" + categories: + title: Kategorije logs: title: "Logovi" when: "Kada" action: "Akcije" subject: "Predmet" details: "Detalji" + permissions: + title: "Dozvole" add: "Dodaj" message: "Privatna poruka" name: "Ime foruma" @@ -572,6 +596,9 @@ sr: latest: "Poslednje" toggle_ordering: "odredi kontrolu smera" subcategories: "Podkategorije" + topic_stat_unit: + week: "nedelja" + month: "mesec" ip_lookup: title: Pretraga po IP adresi hostname: Ime računara @@ -608,7 +635,11 @@ sr: ignore_duration_username: "Korisničko ime" mute_option: "Utišano" normal_option: "Normalno" + notification_schedule: + none: "Ništa" + monday: "Ponedeljak" activity_stream: "Aktivnost" + read: "Pročitano" preferences: "Postavke" feature_topic_on_profile: save: "Sačuvaj" @@ -622,6 +653,8 @@ sr: notifications: "Obaveštenja" statistics: "Statistike" dismiss_notifications_tooltip: "Označi sve nepročitana obavestenja kao pročitana" + color_schemes: + regular: "Stalni član" external_links_in_new_tab: "Otvori sve spoljne linkove u novom tabu" enable_quoting: "Omogući citirani odgovor označenog teksta" change: "promeni" @@ -638,6 +671,7 @@ sr: watched_categories: "Pregledano" tracked_categories: "Praćeno" muted_categories: "Utišano" + regular_categories: "Stalni član" delete_account: "Obriši moj Nalog" delete_account_confirm: "Jeste li sigurni da želite trajno obrisati svoj nalog? Ova se akcija ne može poništiti!" deleted_yourself: "Vaš nalog je uspešno obrisan." @@ -661,6 +695,7 @@ sr: move_to_archive: "Arhiviraj" select_all: "Izaberi sve" preferences_nav: + security: "Sigurnost" profile: "Profil" notifications: "Obaveštenja" categories: "Kategorije" @@ -787,6 +822,10 @@ sr: title: "Pozivnice" pending_tab: "U toku" redeemed_tab: "Nadoknadi" + groups: "Grupe" + topic: "Tema" + edit: "Izmeni" + remove: "Ukloni" reinvited: "Pozivnica ponovno poslata" search: "pišite da pregledate pozivnice" user: "Pozvani Korisnici" @@ -940,6 +979,7 @@ sr: trust_level: "Nivo poverenja" search_hint: "korisničko ime, e-mail ili IP adresa" create_account: + header_title: "Dobrodošao!" failed: "Nešto nije u redu, možda je ovaj e-mail već registrovan, pokušajte s linkom za zaboravljenu šifru." forgot_password: action: "Zaboravio/la sam šifru" @@ -1035,6 +1075,7 @@ sr: link_description: "Unesite opis linka ovde" link_dialog_title: "Ubacite Hiperlink" link_optional_text: "neobavezan naslov" + blockquote_title: "izdvojeni citat" blockquote_text: "izdvojeni citat" code_title: "Pred-formatirani tekst" code_text: "uvuci pred-formatirani tekst za 4 mesta" @@ -1080,6 +1121,7 @@ sr: no_more_results: "Nije pronađeno više rezultata" post_format: "#%{post_number} od %{username}" search_google_button: "Google" + search_button: "Pretraži" context: user: "Pretražite poruke od @%{username}" topic: "Pretražite ovu temu" @@ -1093,6 +1135,8 @@ sr: time: label: Pisao before: pre + views: + label: Pregledi hamburger_menu: "idi na drugi popis tema ili kategoriju" new_item: "novo" go_back: "idi nazad" @@ -1130,6 +1174,7 @@ sr: new: "Nema više novih tema." unread: "Nema više nepročitanih tema." category: "Nema više %{category} tema." + tag: "Nema više %{tag} tema." top: "Nema više glavnih tema." bookmarks: "Nema više markiranih tema." topic: @@ -1190,6 +1235,9 @@ sr: jump_reply_up: skoči na raniji odgovor jump_reply_down: skoči na kasniji odgovor deleted: "Tema je obrisana" + slow_mode_update: + save: "Omogući" + remove: "Onemogući" topic_status_update: when: "Kada:" auto_update_input: @@ -1203,6 +1251,7 @@ sr: based_on_last_post: "Nemoj zatvoriti dok poslednja poruka nije odprilike ovoliko stara." status_update_notice: auto_close: "Ova tema će se autmatski zatvoriti %{timeLeft}." + auto_close_after_last_post: "Ova tema će se zatvoriti %{duration} nakon zadnjeg odgovora." auto_close_title: "Postavke Automatskog Zatvaranja" timeline: back: "Nazad" @@ -1274,6 +1323,7 @@ sr: share: title: "Podeli" help: "podeli link ka ovoj temi" + invite_users: "Pozovi" print: title: "Štampaj" help: "Otvori verziju pogodnu za štampanje" @@ -1343,6 +1393,7 @@ sr: few: "Odabrali ste %{count} poruka." other: "Odabrali ste %{count} poruka." post: + quote_share: "Podeli" edit_reason: "Razlog:" post_number: "poruka %{number}" reply_as_new_topic: "Odgovori u linkovanoj Temi" @@ -1363,6 +1414,8 @@ sr: image_upload_not_allowed_for_new_user: "Žao nam je, novi korisnici ne mogu učitavati slike." attachment_upload_not_allowed_for_new_user: "Žao nam je, novi korisnici ne mogu učitavati priloge." attachment_download_requires_login: "Žao nam je, morate biti prijavljeni da biste preuzimali priloge." + cancel_composer: + discard: "Odbaci" via_email: "ova poruka stigla je preko e-maila" archetypes: save: "Sačuvaj postavke" @@ -1445,6 +1498,10 @@ sr: change_in_category_topic: "Izmena Opisa" already_used: "Ova boja se koristi u drugoj kategoriji." security: "Sigurnost" + permissions: + group: "Grupa" + see: "Pogledaj" + reply: "Odgovori" images: "Slike" email_in: "Prilagođena adresa dolaznog e-maila." email_in_allow_strangers: "Prihvati emailove anonimnih korisnika bez naloga" @@ -1471,7 +1528,9 @@ sr: search_priority: options: normal: "Normalno" + high: "Visoko" sort_options: + default: "zadato" likes: "Lajkovi" views: "Pregledi" posts: "Poruka" @@ -1484,6 +1543,12 @@ sr: flagging: title: "Hvala što pomažete u održavanju naše zajednice pristojnom." action: "Označi Poruku Zastavom" + take_action_options: + default: + title: "Preduzmi Akciju" + details: "Dođite odmah do praga za zastave, umesto da čekate još zastava od zajednice." + suspend: + title: "Suspenduj Korisnika" notify_action: "Privatna poruka" delete_spammer: "Obriši korisnika zbog nepoželjnih poruka" yes_delete_spammer: "Da, Obriši Korisnika" @@ -1508,6 +1573,11 @@ sr: one: "%{count} klik" few: "%{count} klikova" other: "%{count} klikova" + post_links: + title: + one: "još %{count} član" + few: "još %{count} član" + other: "još %{count} član" topic_statuses: warning: help: "Ovo je službeno upozorenje." @@ -1534,6 +1604,10 @@ sr: activity: "Aktivnosti" likes: "Lajkova" users: "Korisnici" + users_lowercase: + one: "korisnik" + few: "korisnici" + other: "korisnici" category_title: "Kategorija" changed_by: "od %{author}" raw_email: @@ -1615,6 +1689,7 @@ sr: readonly: "Pogledaj" lightbox: download: "preuzmi" + counter: "%curr% od %total%" keyboard_shortcuts_help: title: "Prečice na tastaturi" jump_to: @@ -1660,6 +1735,10 @@ sr: mark_watching: "%{shortcut} Posmatraj temu" badges: title: Značke + more_badges: + one: "+još %{count} član" + few: "+još %{count} član" + other: "+još %{count} član" select_badge_for_title: Odaberi značku koju češ koristit kao titulu badge_grouping: getting_started: @@ -1674,7 +1753,11 @@ sr: name: Poruke tagging: add_synonyms: "Dodaj" + sort_by_count: "broj" + sort_by_name: "ime foruma" cancel_delete_unused: "Odustani" + filters: + without_category: "%{filter} %{tag} teme" notifications: watching: title: "Posmatrano" @@ -1699,6 +1782,9 @@ sr: footer_nav: back: "Nazad" share: "Podeli" + do_not_disturb: + options: + custom: "Posebna" admin_js: type_to_filter: "upiši za filtriranje" admin: @@ -1733,12 +1819,17 @@ sr: reports: today: "Danas" yesterday: "Juče" + last_7_days: "Zadnjih 7" + last_30_days: "Zadnjih 30" all_time: "Oduvek" 7_days_ago: "Pre 7 Dana" 30_days_ago: "Pre 30 Dana" all: "Sve" view_table: "tablica" refresh_report: "Osveži Prijave" + daily: Top dnevne + monthly: Top mesečne + weekly: Top nedeljne filters: group: label: Grupa @@ -1783,6 +1874,9 @@ sr: show_details: Detalji description: Opis save: Sačuvaj + continue: Nastavi + scopes: + action: Akcije web_hooks: save: "Sačuvaj" destroy: "Obriši" @@ -1868,12 +1962,16 @@ sr: title: "E-mail" subject: "Predmet" theme: + customize_desc: "Prilagođavanje:" + create_type: "Tip" create_name: "Ime foruma" edit: "Izmeni" settings: "Podešavanje" upload: "Učitaj" + discard: "Odbaci" installed: "Instalirano" about_theme: "O nama" + version: "Verzija:" enable: "Omogući" disable: "Onemogući" add: "Dodaj" @@ -1946,6 +2044,7 @@ sr: sent_test: "poslato!" delivery_method: "Metoda dostave" refresh: "Osveži" + sending_email: "Email se šalje..." format: "Format" html: "html" text: "tekst" @@ -1985,6 +2084,7 @@ sr: do_nothing: "Ne čini ništa" staff_actions: all: "sve" + filter: "Filter:" title: "Akcije Osoblja" clear_filters: "Prikaži sve" staff_user: "Korisnik" @@ -2038,6 +2138,7 @@ sr: label: "Novo:" ip_address: "IP adrese" add: "Dodaj" + filter: "Pretraži" roll_up: text: "Zaokruži" title: "Otvori nove unose zabrana za podmreže ako ima barem 'min_ban_entries_for_roll_up' unosa." @@ -2047,6 +2148,7 @@ sr: logster: title: "Logovi Grešaka" watched_words: + search: "pretraži" clear_filter: "Čisto" download: Preuzmi actions: @@ -2087,6 +2189,8 @@ sr: check_email: title: "Otkrij korisnikovu email adresu" text: "Pokaži" + check_sso: + text: "Prikaži" user: suspend_failed: "Nešto nije pošlo kako treba pri suspenziji ovog korisnika %{error}" unsuspend_failed: "Nešto nije u redu, pri ukidanju suspenzije ovog korisnika %{error}" @@ -2193,6 +2297,12 @@ sr: on_grace_period: "Trenutno u periodu milosti zbog promocije, neće biti skinut." locked_will_not_be_promoted: "Nivo poverenja zaključan. Neće biti unapređivan." locked_will_not_be_demoted: "Nivo poverenja zaključan. Neće biti skinut." + discourse_connect: + external_id: "Spoljašni ID" + external_username: "Korisničko ime" + external_name: "Ime foruma" + external_email: "E-mail" + external_avatar_url: "URL Profilne Slike" user_fields: title: "Korisnička polja" help: "Dodaj polja koja korisnici mogu popuniti." @@ -2258,6 +2368,7 @@ sr: backups: "Sigurnosne kopije" login: "Prijava" plugins: "Dodatci" + search: "Pretraži" groups: "Grupe" dashboard: "Komandna Tabla" default_categories: diff --git a/config/locales/client.sw.yml b/config/locales/client.sw.yml index e1e9030904643..719157f9be790 100644 --- a/config/locales/client.sw.yml +++ b/config/locales/client.sw.yml @@ -141,6 +141,8 @@ sw: disabled: "aliondoa hili bango %{when}. Halitaonekana tena juu ya kila ukurasa." wizard_required: "Karibu Discourse! Tuanze na the setup wizard ✨" emails_are_disabled: "Utumaji wa barua pepe umezuiliwa na msimamizi. Hakuna taarifa za utumwaji wa barua pepe zitakazotumwa." + software_update_prompt: + dismiss: "Ondosha" bootstrap_mode_disabled: "Halitumizi ya Bootstrap itasitishwa baada ya masaa 24." themes: default_description: "Halisi" @@ -232,6 +234,8 @@ sw: remove: "Ondoa Alamisho" confirm_clear: "Una uhakika unataka kuondoa mialamisho ya mada hii?" save: "hifadhi" + auto_delete_preference: + never: "Kamwe" search: "Tafuta" drafts: remove: "Ondoa" @@ -284,6 +288,7 @@ sw: username: "Jina la mtumiaji" email: "Barua Pepe" name: "Jina" + reject_reason: "Sababu" topics: topic: "Mada" details: "maelezo" @@ -315,10 +320,23 @@ sw: types: reviewable_user: title: "Mtumiaji" + reviewable_post: + title: "Ujumbe" approval: title: "Chapisho Linahitaji Kibali" description: "Tumepokea chapisho lako jipya, lakini linahitaji kupata kibali kutoka kwa kiongozi kabla ya kuonyeshwa. Tafadhali kuwa na subira." ok: "Sawa" + example_username: "jinalamtumiaji" + relative_time_picker: + days: + one: "siku" + other: "siku" + time_shortcut: + later_today: "Baada ya mda leo" + tomorrow: "Kesho" + next_week: "Wiki Ijayo" + later_this_week: "Baada ya mda ndani ya wiki hii" + next_month: "Mwezi ujao" user_action: user_posted_topic: "%{mtumiaji} amechapisha mada" you_posted_topic: "Ume chapisha mada" @@ -334,6 +352,7 @@ sw: sent_by_user: "Imetumwa na %{mtumiaji}" sent_by_you: "Imetumwa na wewe" directory: + username: "Jina la mtumiaji" filter_name: "chuja kwa jina la mtumiaji" title: "Watumiaji" likes_given: "Imetolewa" @@ -381,11 +400,17 @@ sw: credentials: username: "Jina la mtumiaji" password: "Nywila" + settings: + title: "Mpangilio" mailboxes: disabled: "imezuiwa" membership: title: Uanachama access: Ufikivu + categories: + title: Vikundi + tags: + title: Lebo logs: title: "Batli" when: "Lini" @@ -396,6 +421,8 @@ sw: details: "Maelezo" from: "Kutoka kwa" to: "Kwenda" + permissions: + title: "Vibali" public_admission: "ruhusu watumiaji wajiunge kwenye kikundi bure (kikundi kinabidi kionwe na umma)" public_exit: "ruhusu watumiaji waache kikundi bure" empty: @@ -523,6 +550,9 @@ sw: topic_sentence: one: "%{count} topiki" other: "%{count} Topiki" + topic_stat_unit: + week: "wiki" + month: "mwezi" ip_lookup: title: Utafutaji wa Anwani ya Mtandao hostname: Hostname @@ -563,7 +593,11 @@ sw: ignore_duration_save: "Puuzia" mute_option: "Imenyamazishwa" normal_option: "Kawaida" + notification_schedule: + none: "Hakuna" + to: "kwenda" activity_stream: "Shughuli" + read: "Soma" preferences: "Mapendekezo" feature_topic_on_profile: save: "hifadhi" @@ -590,6 +624,9 @@ sw: dismiss_notifications: "Puuzia Zote" dismiss_notifications_tooltip: "Weka alama kuwa taarifa zote ambazo hazijasomwa kuwa zimesomwa" first_notification: "Umepata taarifa ya kwanza! Ichague kuanza." + color_schemes: + undo: "Anza Upya" + regular: "Kawaida" allow_private_messages: "Ruhusu watumiaji wengine wanitumie ujumbe binafsi" external_links_in_new_tab: "Fungua viungo vingine kwenye kichupo kingine" enable_quoting: "Ruhusu jibu nukulu kwenye neno lenye angaza" @@ -631,6 +668,7 @@ sw: watched_first_post_tags: "Chapisho la Kwanza Linaangaliwa" watched_first_post_tags_instructions: "Utajulishwa kuhusu chapisho la kwanza kwenye kila mada mpya yenye lebo hizi." muted_categories: "Imenyamazishwa" + regular_categories: "Kawaida" no_category_access: "Kama msimamizi una ufikivu kidogo wa kategoria, hifadhi imesitishwa." delete_account: "Futa Akaunti Yangu" delete_account_confirm: "Una uhakika unataka kufuta akaunti yako? Kitendo hiki hakiwezi kufanyika tena!" @@ -669,6 +707,7 @@ sw: tags: "Lebo" preferences_nav: account: "Akaunti" + security: "Ulinzi" profile: "Maelezo mafupi" emails: "Barua pepe" notifications: "Taarifa" @@ -837,6 +876,11 @@ sw: pending_tab_with_count: "(%{count}) zinasubiria" redeemed_tab: "Imepatikana" redeemed_tab_with_count: "(%{count}) zimepatikana" + invited_via: "Mialiko" + groups: "Vikundi" + topic: "Mada" + edit: "Hariri" + remove: "Ondoa" reinvited: "Mualiko umetumwa tena" search: "andika kutafuta mualiko..." user: "Mtumiaji Aliyekaribishwa" @@ -1004,6 +1048,7 @@ sw: trust_level: "Kipimo cha uaminifu" search_hint: "jina la mtumiaji, barua pepe au Anwani ya Mtandao" create_account: + header_title: "Karibu!" failed: "Tatizo limetokea, labda barua pepe imesajiliwa tayari, jaribu kiungo cha kusahau nywila." forgot_password: title: "Weka upa nywila" @@ -1192,6 +1237,7 @@ sw: link_description: "andika maelezo ya kiungo hapa" link_dialog_title: "Ingiza kiungo-wavuti" link_optional_text: "kichwa cha habari kisichokuwa cha muhimu" + blockquote_title: "Zuianukulu" blockquote_text: "Zuianukulu" code_title: "Maneno yaliyowekwa muundo" code_text: "Maneno yaliyowekwa muundo kwa kuacha nafasi 4 kuingia ndani" @@ -1233,6 +1279,7 @@ sw: label: "Mada Mpya" shared_draft: label: "Mswadajaribio Gawiza" + ignore: "Puuzia" notifications: tooltip: regular: @@ -1266,6 +1313,7 @@ sw: granted_badge: "Umepata '%{maelezo}'" topic_reminder: "%{jina la mtumiaji} %{maelezo}" watching_first_post: "Mada Mpya %{maelezo}" + reaction_2: "%{username}, %{username2} %{description}" group_message_summary: one: "Kuna meseji %{count} kwenye %{group_name} inbox" other: "kuna meseji %{count} kwenye %{group_name} inbox" @@ -1318,6 +1366,7 @@ sw: or_search_google: "Au jaribu kutafuta kwa kutumia Google kama njia mbadala:" search_google: "Jaribu kutafuta kwa kutumia Google kama njia mbadala:" search_google_button: "Google" + search_button: "Tafuta" context: user: "Tafuta machapisho kwa kutumia @%{jina la mtumiaji}" category: "Tafuta kategoria #%{category} " @@ -1365,6 +1414,8 @@ sw: label: Chapishwa before: kabla after: baada + views: + label: Imeonwa hamburger_menu: "nenda kwenye orodha ya mada au kategoria nyingine" new_item: "mpya" go_back: "rudi nyuma" @@ -1390,6 +1441,7 @@ sw: change_category: "Seti Kategoria" close_topics: "Funga Mada" archive_topics: "Hifadhi Mada kwenye nyaraka" + move_messages_to_inbox: "Hamishia kwenye kisanduku-pokezi" notification_level: "Taarifa" choose_new_category: "Chagua kategoria mpya kwa ajili ya mada:" selected: @@ -1415,6 +1467,7 @@ sw: new: "Hakuna mada mpya zingine." unread: "Hakuna mada zingine ambazo hazijasomwa." category: "Hakuna %{category} mada zingine." + tag: "Hakuna %{tag} mada zingine." top: "Hakuna mada za juu zingine." bookmarks: "Hakuna mada zingine zilizoalamishwa." topic: @@ -1477,6 +1530,9 @@ sw: jump_reply_up: fikia jibu la awali jump_reply_down: fikia jibu la baadaye deleted: "Mada imefutwa" + slow_mode_update: + save: "Ruhusu" + remove: "Zuia" topic_status_update: title: "Kipima Mda cha Mada" save: "Seti Kipima Mda" @@ -1515,6 +1571,7 @@ sw: auto_open: "Mada hii itafunguliwa otomatikali baada ya %{timeLeft}." auto_close: "Mada hii itafungwa otomatikali baada ya %{timeLeft}." auto_publish_to_category: "Mada hii itachapishwa kwenye #%{categoryName}%{timeLeft}." + auto_close_after_last_post: "Mada hii itafungwa baada ya jibu la mwisho %{duration}." auto_delete: "Mada hii itafutwa otomatikali %{timeLeft}." auto_reminder: "Utakumbushwa kuhusu mada hii %{timeLeft}." auto_close_title: "Funga Mada Otomatikali" @@ -1529,6 +1586,7 @@ sw: go: "nenda" jump_bottom: "fikia chapisho la mwisho" jump_prompt: "ruka kwenda..." + jump_prompt_long: "Ruka kwenda..." jump_bottom_with_number: "fikia chapisho %{post_number}" jump_prompt_or: "au" total: jumla ya machapisho @@ -1607,6 +1665,7 @@ sw: share: title: "Gawiza" help: "gawiza kiungo kwenye mada hii" + invite_users: "Mualiko" print: title: "Chapa" flag_topic: @@ -1647,11 +1706,13 @@ sw: username_placeholder: "jina la mtumiaji" action: "Tuma Mualiko" help: "Wakaribishe watu wengine kwenye mada kupitia barua pepe au taarifa" + discourse_connect_enabled: "Andika jina la mtumiaji la mtu ambaye ungependa kumualika kwenye mada hii." to_topic_blank: "Andika jina la mtumiaji au barua pepe ya mtu ambaye ungependa kumualika kwenye mada hii." to_topic_email: "Umeandika barua pepe. Tutatuma mualiko utakao mruhusu rafiki yako kujibu mada hii." to_topic_username: "Umeandika jina la mtumiaji. Tutamtumia taarifa zenye mualiko kwenye mada hii." to_username: "Umeandika jina la mtumiaji la mtu ambaye ungependa kumualika. Tutamtumia taarifa zenye kiungo tukimualika kwenye mada hii." email_placeholder: "name@example.com" + success_email: "Tumetuma barua kwenda kwa %{invitee}. Tutakutumia mualiko ukipatikana. Angalia kichupo cha mialiko kwenye ukurasa wa mtumiaji kufuatilia mialiko yako." success_username: "Tumemkaribisha mtumiaji kushiriki kwenye mada hii." error: "Samahani, tumeshindwa kumkaribisha mtu huyo. Labda ameshakaribishwa? (Mialiko ina kikomo cha kiwango)" success_existing_email: "Mtumiaji mwenye barua pepe %{emailOrUsername}tayari yupo.Tumemualika mtumiaji huyo ashiriki kwenye mada hii." @@ -1712,6 +1773,7 @@ sw: other: "Umechagua machapisho%{count}." post: quote_reply: "Nukulu" + quote_share: "Gawiza" edit_reason: "Sababu:" post_number: "%{namba} chapisho" reply_as_new_topic: "Jibu kama mada iliyounganishwa" @@ -1784,6 +1846,10 @@ sw: unlock_post_description: "mruhusu mchapishaji kuhariri chapisho hili" delete_topic: "futa mada" actions: + people: + like: + one: "ameipenda hii" + other: "ameipenda hii" by_you: off_topic: "Umeripoti hii kuwa haihusiki" spam: "Umeripoti hii kuwa ni taka" @@ -1863,7 +1929,13 @@ sw: change_in_category_topic: "Hariri Maelezo" already_used: "Rangi hii imetumika kwenye kategoria nyingine" security: "Ulinzi" + permissions: + group: "Kikundi" + see: "Angalia" + reply: "Jibu" + create: "Tengeneza" images: "Picha" + email_in: "Barua Pepe inayoingia:" email_in_allow_strangers: "Pokea barua pepe kutoka kwa watumiaji wasiojulikana ambao hawana akaunti" email_in_disabled: "Uchapishaji wa mada mpya kupitia barua pepe umesitishwa kwenye Mipangilio ya Tovuti. Kuruhusu uchapishaji wa mada mpya kupitia barua pepe," email_in_disabled_click: 'ruhusu mpangilio wa "barua pepe ndani"' @@ -1916,6 +1988,13 @@ sw: flagging: title: "Asante kwa kuendeleza ustaarabu kwenye jumuiya yetu!" action: "Ripoti Chapisho" + take_action_options: + default: + title: "Fanya Kitendo" + suspend: + title: "Simamisha Mtumiaji" + silence: + title: "Nyamazisha Mtumiaji" notify_action: "Ujumbe" official_warning: "Onyo Rasmi" delete_spammer: "Futa Muandishi wa Taka" @@ -1969,6 +2048,9 @@ sw: replies: "Majibu" activity: "Kitendo" likes: "Upendo" + likes_lowercase: + one: "penda" + other: "upendo" users: "Watumiaji" users_lowercase: one: "Mtumiaji" @@ -2001,6 +2083,9 @@ sw: one: "Haijasomwa (%{count})" other: "Hazijasomwa (%{count})" help: "mada unazo fuatilia au angalia zenye machapisho ambayo hayajasomwa" + lower_title_with_count: + one: "%{count} haijasomwa" + other: "%{count} haijasomwa" new: lower_title_with_count: one: "Mada mpya %{count}" @@ -2044,6 +2129,7 @@ sw: readonly: "Angalia" lightbox: download: "pakua" + counter: "%curr% chini ya %total%" keyboard_shortcuts_help: title: "Njia Mkato za Baobonye" jump_to: @@ -2191,6 +2277,9 @@ sw: back: "Nyuma" share: "Shirikisha" dismiss: "Ondosha" + do_not_disturb: + options: + custom: "Binafsi" admin_js: type_to_filter: "andika kuchuja..." admin: @@ -2214,6 +2303,8 @@ sw: version_check_pending: "Inaonekana umeweka toleo la sasa hivi karibuni. Vizuri!" installed_version: "Imesanikishwa" latest_version: "Hivi Karibuni" + new_features: + dismiss: "Ondosha" last_checked: "Mara ya Mwisho imeangaliwa" refresh_problems: "Rudisha Tena" no_problems: "Hakuna matatizo yaliyopatikana." @@ -2250,6 +2341,9 @@ sw: view_table: "jedwali" view_graph: "grafu" refresh_report: "Rudisha tena Ripoti" + daily: Kila siku + monthly: Klla mwezi + weekly: Kila wiki groups: "Vikundi vyote" disabled: "Hii ripoti imezuiwa" total: "Jumla ya wakati wote" @@ -2323,6 +2417,8 @@ sw: description: Maelezo save: hifadhi continue: Endelea + scopes: + action: Kitendo web_hooks: create: "Tengeneza" save: "Hifadhi" @@ -2520,6 +2616,7 @@ sw: install_popular: "Maarufu" about_theme: "Kuhusu" license: "Leseni" + version: "Toleo:" enable: "Wezesha" disable: "Sitisha" update_to_latest: "Sasisha iwe Toleo Jipya" @@ -2839,6 +2936,8 @@ sw: check_email: title: "Onyesha barua pepe ya mtumiaji" text: "Onyesha" + check_sso: + text: "Onesha" user: suspend_failed: "Hitilafu imetokea wakati wa kumsitisha mtumiaji %{hitilafu}" unsuspend_failed: "Hitilafu imetokea wakati wa kuruhusu mtumiaji aweze kujadiliana kwenye jamii %{hitilafu}" @@ -2846,6 +2945,7 @@ sw: suspend_reason_label: "Kwa nini umemsitisha kwa mda? Huu ujumbe utaonyeshwa kwa kila mtumiaji kwenye taarifa binafsi za huyo mtu na ataonyeshwa mtumiaji akijaribu kuingia. Andika ujumbe mfupi." suspend_reason_hidden_label: "Kwa nini umemsitisha kwa mda? Huu ujumbe utaonyeshwa kwa mtumiaji akijaribu kuingia. Andika ujumbe mfupi." suspend_reason: "Sababu" + suspend_reason_title: "Sababu ya kusitisha kwa mda mfupi" suspend_message: "Tuma Ujumbe kwa Barua Pepe" suspend_message_placeholder: "Sio lazima, ila unaweza kutoa sababu za ziada kuhusiana na sitisho na itatumwa kwa mtumiaji." suspended_by: "Amesitishwa kwa mda mfupi na" @@ -2870,6 +2970,7 @@ sw: moderator: "Msimamizi?" admin: "Kiongozi?" suspended: "Imesitishwa?" + staged: "Sehemu ya kujaribu?" show_admin_profile: "Msimamizi" show_public_profile: "Onyesha Taarifa za Umma" impersonate: "Chukua Utambulisho wa Mtu Mwingine" @@ -2984,6 +3085,12 @@ sw: on_grace_period: "Kwa sasa upo kwenye kipindi cha kupanda daraja, hautashushwa daraja." locked_will_not_be_promoted: "Kiwango cha Uaminifu kimefungwa. Hautawai kupanda daraja." locked_will_not_be_demoted: "Kiwango cha Uaminifu kimefungwa. Hautashushwa Daraja." + discourse_connect: + external_id: "Utambulisho wa kutoka nje" + external_username: "Jina la mtumiaji" + external_name: "Jina" + external_email: "Barua Pepe" + external_avatar_url: "Linki au kiungo cha Picha ya Mtumiaji" user_fields: title: "Sehemu za Watumiaji" help: "Ongeza sehemu za taarifa ambazo watumiaji wanahitaji kujaza." @@ -3161,6 +3268,7 @@ sw: embed_post_limit: "Kiwango cha Juu cha Kupachika machapisho" embed_title_scrubber: "Neno linalotumika kufuta vichwa vya machapisho" embed_truncate: "Fupisha machapisho yaliyopachikwa" + allowed_embed_classnames: "Ruhusu majina ya madarasa ya CSS " save: "Hifadhi Mipangilio Iliyopachikwa" permalink: title: "Anwani za mtandao" diff --git a/config/locales/client.te.yml b/config/locales/client.te.yml index dca34e141c270..5a3f6a2a59895 100644 --- a/config/locales/client.te.yml +++ b/config/locales/client.te.yml @@ -202,6 +202,7 @@ te: username: "వాడుకరి పేరు" email: "ఈమెయిల్" name: "పేరు" + reject_reason: "కారణం" topics: topic: "విషయం" details: "వివరాలు" @@ -224,6 +225,15 @@ te: title: "సభ్యుడు" approval: ok: "సరే" + example_username: "సభ్యనామం" + relative_time_picker: + days: + one: "రోజు" + other: "రోజులు" + time_shortcut: + tomorrow: "రేపు" + next_week: "వచ్చే వారం" + next_month: "వచ్చే నెల" user_action: user_posted_topic: "విషయాన్ని %{user} రాసారు " you_posted_topic: "మీరు విషయాన్ని రాసారు" @@ -239,6 +249,7 @@ te: sent_by_user: "%{user} పంపారు" sent_by_you: "మీరు పంపారు" directory: + username: "వాడుకరి పేరు" title: "వాడుకరులు" topics_entered_long: "సందర్శించిన విషయాలు " topic_count: "విషయాలు" @@ -263,14 +274,22 @@ te: credentials: username: "వాడుకరి పేరు" password: "సంకేతపదం" + settings: + title: "అమరికలు" membership: title: సభ్యత్వం + categories: + title: వర్గాలు + tags: + title: ట్యాగులు logs: title: "లాగ్స్" when: "ఎప్పుడు" action: "చర్య" subject: "సబ్జెక్టు" details: "వివరాలు" + permissions: + title: "అనుమతులు" add: "కలుపు" membership: "సభ్యత్వం" name: "పేరు" @@ -335,6 +354,9 @@ te: latest: "తాజా" toggle_ordering: "వరుస నియంత్రణను అటుఇటుచేయి" subcategories: "ఉప వర్గాలు" + topic_stat_unit: + week: "వారం" + month: "నెల" ip_lookup: title: ఐపీ చిరునామా లుకప్ hostname: అతిథిపేరు @@ -367,6 +389,7 @@ te: ignore_duration_username: "వాడుకరి పేరు" mute_option: "నిశ్శబ్దం" activity_stream: "కలాపం" + read: "చదివిన" preferences: "అభిరుచులు" feature_topic_on_profile: save: "భద్రపరచు" @@ -379,6 +402,8 @@ te: notifications: "ప్రకటనలు" statistics: "గణాంకాలు" dismiss_notifications_tooltip: "అన్ని చదవని ప్రకటనలూ చదివినట్టు గుర్తించు" + color_schemes: + regular: "రెగ్యులరు" external_links_in_new_tab: "అన్ని బాహ్య లంకెలనూ కొత్త ట్యాబులో తెరువు" enable_quoting: "హైలైట్ అయిన పాఠ్యానికి కోట్ జవాబు చేతనం చేయి" change: "మార్చు" @@ -395,6 +420,7 @@ te: watched_categories: "ఒకకన్నేసారు" tracked_categories: "గమనించారు" muted_categories: "నిశ్శబ్దం" + regular_categories: "రెగ్యులరు" delete_account: "నా ఖాతా తొలగించు" delete_account_confirm: "నిజ్జంగా మీరు మీ ఖాతాను శాస్వతంగా తొలగించాలనుకుంటున్నారా? ఈ చర్య రద్దుచేయలేరు సుమా! " deleted_yourself: "మీ ఖాతా విజయవంతంగా తొలగించబడింది. " @@ -417,6 +443,7 @@ te: tags: "ట్యాగులు" preferences_nav: account: "ఖాతా" + security: "సంరక్షణ" profile: "ప్రవర" notifications: "ప్రకటనలు" categories: "వర్గాలు" @@ -529,6 +556,11 @@ te: title: "ఆహ్వానాలు" pending_tab: "పెండింగు" redeemed_tab: "మన్నించిన" + invited_via: "ఆహ్వానం" + groups: "గుంపులు" + topic: "విషయం" + edit: "సవరించు" + remove: "తొలగించు" reinvited: "ఆహ్వానం మరలా పంపారు" search: "ఆహ్వానాలను వెతకడానికి రాయండి ... " user: "ఆహ్వానించిన సభ్యుడు" @@ -717,6 +749,7 @@ te: link_description: "లంకె వివరణ ఇక్కడ రాయండి" link_dialog_title: "హైపర్ లంకె చొప్పించండి" link_optional_text: "ఐచ్చిక శీర్షిక" + blockquote_title: "బ్లాక్ కోట్" blockquote_text: "బ్లాక్ కోట్" code_title: "ముందే అలంకరించిన పాఠ్యం" code_text: "ముందే అలంకరించిన పాఠ్యాన్ని 4 జాగాలు జరుపు" @@ -751,6 +784,7 @@ te: no_results: "ఎటువంటి ఫలితాలు దొరకలేదు." post_format: "%{username} నుండి #%{post_number}" search_google_button: "గూగుల్" + search_button: "వెతుకు" context: user: "@%{username} యొక్క విషయాలు వెతుకు" topic: "ఈ విషయంలో వెతుకు" @@ -760,6 +794,8 @@ te: post: count: label: టపాలు + views: + label: చూపులు hamburger_menu: "మరో విషయాల జాబితాకు లేదా వర్గానికి వెళ్లు" new_item: "కొత్త" go_back: "వెనక్కు మరలు" @@ -794,6 +830,7 @@ te: new: "కొత్త విషయాలు లేవు." unread: "ఇంకా చదవని విషయాలు లేవు." category: "ఇంకా %{category} విషయాలు లేవు." + tag: "ఇంకా %{tag} విషయాలు లేవు." top: "ఇంకా అగ్ర విషయాలు లేవు." bookmarks: "ఇంకా పేజీక విషయాలు లేవు." topic: @@ -846,6 +883,9 @@ te: jump_reply_up: పాత జవాబుకు వెళ్లు jump_reply_down: తరువాతి జవాబుకు వెళ్లు deleted: "ఈ విషయం తొలగించబడింది" + slow_mode_update: + save: "చేతనం" + remove: "అచేతనం" auto_update_input: tomorrow: "రేపు" this_weekend: "ఈ వారాంతం" @@ -856,6 +896,7 @@ te: based_on_last_post: "ఈ విషయంలో చివరి టపా కనీసం ఇంత వయసు వచ్చేంతవరకూ విషయాన్ని మూయకు." status_update_notice: auto_close: "ఈ విషయం %{timeLeft} తర్వాత స్వీయంగా మూయబడుతుంది." + auto_close_after_last_post: "చివరి జవాబు తర్వాత %{duration}కు ఈ విషయం స్వీయ మూయబడుతుంది" auto_close_title: "స్వీయ ముగింపు అమరికలు" timeline: back: "వెనుకకు" @@ -919,6 +960,7 @@ te: share: title: "పంచు" help: "ఈ విషయపులంకెను పంచు" + invite_users: "ఆహ్వానించు" flag_topic: title: "కేతనం" help: "ఈ విషయాన్ని ప్రైవేటుగా కేతనించు లేదా ప్రైవేటు ప్రకటన పంపు" @@ -976,6 +1018,7 @@ te: one: మీరు %{count} టపా ఎంచుకున్నారు other: "మీరు %{count} టపాలు ఎంచుకున్నారు" post: + quote_share: "పంచు" edit_reason: "కారణం:" post_number: "టపా %{number}" reply_as_new_topic: "లంకె విషయంగా జవాబివ్వు" @@ -1023,6 +1066,10 @@ te: grant_badge: "బ్యాడ్జి ఇవ్వు" delete_topic: "విషయం తొలగించు" actions: + people: + like: + one: "ఈ టపాను ఇష్టపడ్డారు" + other: "ఈ టపాను ఇష్టపడ్డారు" by_you: off_topic: "మీరు దీన్ని విషయాంతరంగా కేతనించారు" spam: "మీరు దీన్ని స్పాముగా కేతనించారు" @@ -1078,6 +1125,10 @@ te: change_in_category_topic: "వివరణ సవరించు" already_used: "ఈ రంగు వేరే వర్గం వాడింది" security: "సంరక్షణ" + permissions: + group: "సమూహం" + see: "చూడు" + reply: "జవాబు" images: "బొమ్మలు" email_in: "అనురూప లోపలికి వచ్చే ఈమెయిల్ చిరునామా:" email_in_allow_strangers: "ఎటువంటి ఖాతాలు లేని అనామక సభ్యుల నుండి వచ్చే ఈమెయిల్లు అంగీకరించు" @@ -1099,6 +1150,7 @@ te: muted: title: "నిశ్శబ్దం" sort_options: + default: "అప్రమేయ" likes: "ఇష్టాలు" views: "చూపులు" posts: "టపాలు" @@ -1111,6 +1163,12 @@ te: flagging: title: "మా కమ్యునిటీని నాగరికంగా ఉంచుటలో సహాయానికి ధన్యవాదములు" action: "టపాను కేతనించు" + take_action_options: + default: + title: "చర్య తీసుకో" + details: "మరిన్ని కమ్యునిటీ కేతనాల కోసం ఎదురు చూడకుండా ఇప్పుడే కేతన గట్టు చేరు" + suspend: + title: "సభ్యుడిని సస్పెండు చేయి" delete_spammer: "స్పామరును తొలగించు" yes_delete_spammer: "అవులు, స్పామరును తొలగించు" ip_address_missing: "వర్తించదు" @@ -1157,6 +1215,9 @@ te: replies: "జవాబులు" activity: "కలాపం" likes: "ఇష్టాలు" + likes_lowercase: + one: "ఇష్టం" + other: "ఇష్టాలు" users: "సభ్యులు" users_lowercase: one: "వాడుకరి" @@ -1182,6 +1243,9 @@ te: unread: title: "చదవని" help: "మీరు ప్రస్తుతం కన్నేసిన లేదా గమనిస్తున్న చదవని టపాలతో ఉన్న విషయాలు " + lower_title_with_count: + one: "%{count} చదవనవి" + other: "%{count} చదవనవి" new: lower_title: "కొత్త" title: "కొత్త" @@ -1269,6 +1333,8 @@ te: add_synonyms: "కలుపు" sort_by_name: "పేరు" cancel_delete_unused: "రద్దుచేయి" + filters: + without_category: "%{filter} %{tag} విషయాలు" notifications: watching: title: "కన్నేసారు" @@ -1293,6 +1359,9 @@ te: footer_nav: back: "వెనుకకు" share: "పంచు" + do_not_disturb: + options: + custom: "అనురూప" admin_js: type_to_filter: "జల్లించుటకు రాయి..." admin: @@ -1381,6 +1450,8 @@ te: show_details: వివరాలు description: వివరణ save: భద్రపరచు + scopes: + action: చర్య web_hooks: save: "భద్రపరచు" destroy: "తొలగించు" @@ -1485,6 +1556,7 @@ te: installed: "ప్రతిష్టించబడింది" install_popular: "ప్రముఖ" about_theme: "గురించి" + version: "సంచిక:" enable: "చేతనం" disable: "అచేతనం" add: "కలుపు" @@ -1596,6 +1668,7 @@ te: do_nothing: "ఏమీ చేయకు" staff_actions: all: "అన్నీ" + filter: "జల్లెడ:" title: "సిబ్బింది చర్యలు" clear_filters: "మొత్తం చూపు" staff_user: "సభ్యుడు" @@ -1657,6 +1730,7 @@ te: logster: title: "దోష లాగులు" watched_words: + search: "వెతుకు" clear_filter: "శుభ్రపరుచు" download: దిగుమతి actions: @@ -1697,6 +1771,8 @@ te: check_email: title: "ఈ సభ్యుని ఈమెయిల్ చూపు" text: "చూపు" + check_sso: + text: "చూపు" user: suspend_failed: "ఈ సభ్యుడిని సస్పెండ్ చేసేప్పుడు ఏదో తేడా జరిగింది. %{error}" unsuspend_failed: "ఈ వినియోగదారు వలన ఏదో తొలగింపబడని తప్పు జరిగింది %{error}" @@ -1792,6 +1868,12 @@ te: on_grace_period: "ప్రస్తుతం స్థాయి పెరుగుదల అదనపుకాలంలో ఉంది, స్థాయి తగ్గింపు జరగదు." locked_will_not_be_promoted: "నమ్మకపు స్థాయి బంధించబడి ఉంది. స్థాయి పెరుగుదల ఉండదు." locked_will_not_be_demoted: "నమ్మకపు స్థాయి బంధించబడి ఉంది.ఎప్పటికీ స్థానాన్ని తగ్గించలేరు." + discourse_connect: + external_id: "బాహ్య ఐడీ" + external_username: "వాడుకరి పేరు" + external_name: "పేరు" + external_email: "ఈమెయిల్" + external_avatar_url: "ప్రవర బొమ్మ యూఆర్ యల్" user_fields: title: "సభ్య క్షేత్రాలు" help: "వినియోగదారులు పూర్తి చేసిన వాటిని జోడించండి." @@ -1950,6 +2032,7 @@ te: uploading: "ఎగుమతవుతోంది..." upload_error: "క్షమించాలి. దస్త్రం ఎగుమతించుటలో దోషం. దయచేసి మరలా ప్రయత్నించండి. " invites: + add_user: "కలుపు" roles: admin: "అధికారి" moderator: "నిర్వాహకుడు" diff --git a/config/locales/client.th.yml b/config/locales/client.th.yml index 88fff56ae6993..bb3762e11dd90 100644 --- a/config/locales/client.th.yml +++ b/config/locales/client.th.yml @@ -129,6 +129,8 @@ th: disabled: "ลบแบนเนอร์นี้%{when} จะไม่ปรากฏที่ด้านบนของหน้าใดๆ" forwarded: "ส่งต่ออีเมลข้างต้นแล้ว" emails_are_disabled: "อีเมลขาออกทั้งหมดถูกปิดโดยผู้ดูแลระบบ จะไม่มีอีเมลแจ้งเตือนใดๆถูกส่งออกไป" + software_update_prompt: + dismiss: "ซ่อน" themes: default_description: "ค่าเริ่มต้น" s3: @@ -186,6 +188,8 @@ th: now: "ขณะนี้" read_more: "อ่านเพิ่มเติม" more: "เพิ่มเติม" + x_more: + other: "อีก %{count}" less: "น้อย" never: "ไม่เคย" every_30_minutes: "ทุก 30 นาที" @@ -311,6 +315,7 @@ th: title: "รีวิว" topic: "กระทู้:" filtered_user: "ผู้ใช้" + filtered_reviewed_by: "รีวิวโดย" show_all_topics: "แสดงกระทู้ทั้งหมด" deleted_post: "(โพสต์ถูกลบ)" deleted_user: "(ผู้ใช้ถูกลบ)" @@ -319,6 +324,7 @@ th: username: "ชื่อผู้ใช้" email: "อีเมล" name: "ชื่อ" + reject_reason: "เหตุผล" user_percentage: agreed: other: "%{count}% เห็นด้วย" @@ -384,12 +390,28 @@ th: flagged_by: "ถูกปักธงโดย" reviewable_user: title: "ผู้ใช้" + reviewable_post: + title: "โพสต์" approval: title: "โพสต์นี้ต้องได้รับการอนุมัติ" description: "เราได้รับโพสต์ใหม่ของคุณแล้ว แต่ต้องได้รับการอนุมัติจากผู้ดูแลก่อนถึงจะปรากฏขึ้น กรุณารอสักครู่" pending_posts: other: "คุณมี%{count}โพสต์ที่กำลังรอการยืนยัน" ok: "ตกลง" + example_username: "ผู้ใช้" + relative_time_picker: + days: + other: "วัน" + time_shortcut: + later_today: "ภายหลังในวันนี้" + next_business_day: "ในวันทำการถัดไป" + tomorrow: "พรุ่งนี้" + next_week: "สัปดาห์หน้า" + later_this_week: "ภายหลังในสัปดาห์นี้" + start_of_next_business_week: "วันจันทร์" + start_of_next_business_week_alt: "วันจันทร์หน้า" + next_month: "เดือนหน้า" + custom: "วันและเวลาที่กำหนดเอง" user_action: user_posted_topic: "%{user} โพสต์ กระทู้" you_posted_topic: "คุณ โพสต์ กระทู้" @@ -405,6 +427,7 @@ th: sent_by_user: "ถูกส่งโดย %{user}" sent_by_you: "ถูกส่งโดย คุณ" directory: + username: "ชื่อผู้ใช้" filter_name: "กรองด้วยชื่อผู้ใช้" title: "ผู้ใช้" likes_given: "ให้" @@ -456,11 +479,17 @@ th: credentials: username: "ชื่อผู้ใช้" password: "รหัสผ่าน" + settings: + title: "การตั้งค่า" mailboxes: disabled: "ปิดใช้งานแล้ว" membership: title: การเป็นสมาชิก access: การเข้าถึง + categories: + title: หมวดหมู่ + tags: + title: แท็ก logs: when: "เมื่อ" acting_user: "ผู้ใช้ชั่วคราว" @@ -595,6 +624,9 @@ th: subcategories: "หมวดหมู่ย่อย" topic_sentence: other: "%{count}กระทู้" + topic_stat_unit: + week: "สัปดาห์" + month: "เดือน" topic_stat_sentence_week: other: "%{count}กระทู้ใหม่ในสัปดาห์ที่ผ่านมา" topic_stat_sentence_month: @@ -650,7 +682,12 @@ th: mute_option_title: "คุณจะไม่ได้รับการแจ้งเตือนใดๆที่เกี่ยวกับผู้ใช้นี้" normal_option: "ปกติ" normal_option_title: "คุณจะได้รับการแจ้งเตือนเมื่อผู้ใช้นี้ตอบคุณ อ้างอิงถึงคุณ หรือกล่าวถึงคุณ" + notification_schedule: + none: "ไม่มี" + monday: "วันจันทร์" + to: "ถึง" activity_stream: "กิจกรรม" + read: "อ่าน" preferences: "การตั้งค่า" feature_topic_on_profile: open_search: "เลือกกระทู้ใหม่" @@ -686,6 +723,8 @@ th: first_notification: "การแจ้งเตือนแรกของคุณ! กดเลือกเพื่อเริ่มต้น" dynamic_favicon: "แสดงจำนวนบนไอคอนเบราว์เซอร์" theme_default_on_all_devices: "ทำให้ธีมนี้เป็นธีมเริ่มต้นบนทุกอุปกรณ์ของฉัน" + color_schemes: + regular: "ทั่วไป" text_size_default_on_all_devices: "ทำให้ขนาดฟอนต์นี้เป็นค่าเริ่มต้นบนทุกอุปกรณ์ของฉัน" allow_private_messages: "อนุญาตให้ผู้ใช้อื่นส่งข้อความส่วนตัวหาฉัน" external_links_in_new_tab: "เปิดลิงก์ภายนอกทั้งหมดในแท็บใหม่" @@ -720,6 +759,7 @@ th: watched_first_post_categories: "กำลังดูโพสต์แรก" watched_first_post_tags: "กำลังดูโพสต์แรก" muted_categories: "ปิดเสียง" + regular_categories: "ทั่วไป" delete_account: "ลบบัญชีของฉัน" delete_account_confirm: "คุณแน่ใจไหมที่จะลบบัญชีอย่างถาวร การดำเนินการนี้ไม่สามารถยกเลิกได้" deleted_yourself: "บัญชีของคุณถูกลบเรียบร้อยแล้ว" @@ -758,6 +798,7 @@ th: tags: "แท็ก" preferences_nav: account: "บัญชี" + security: "ความปลอดภัย" profile: "โปรไฟล์" emails: "อีเมล" notifications: "การแจ้งเตือน" @@ -956,6 +997,12 @@ th: pending_tab_with_count: "กำลังรอ (%{count})" redeemed_tab: "ยืนยัน" redeemed_tab_with_count: "ยืนยันแล้ว (%{count})" + invited_via: "คำเชิญ" + groups: "กลุ่ม" + topic: "หัวข้อ" + expires_at: "หมดอายุ" + edit: "แก้ไข" + remove: "ลบ" reinvited: "การเชิญชวนถูกส่งอีกครั้งแล้ว" search: "พิมพ์เพื่อค้นหาคำเชิญ..." user: "เชิญชวนผู้ใช้แล้ว" @@ -968,6 +1015,9 @@ th: topics_entered: "กระทู้ที่ดูแล้ว" posts_read_count: "โพสต์ที่อ่านแล้ว" expired: "การเชิญชวนนี้หมดอายุแล้ว" + remove_all: "ลบคำเชิญที่หมดอายุ" + removed_all: "คำเชิญที่หมดอายุทั้งหมดถูกลบแล้ว!" + remove_all_confirm: "คุณแน่ใจหรือว่าต้องการลบคำเชิญที่หมดอายุทั้งหมด" reinvite_all_confirm: "คุณแน่ใจหรือว่าต้องการส่งคำเชิญทั้งหมดอีกครั้ง" time_read: "เวลาอ่าน" days_visited: "วันที่เข้าชม" @@ -1098,6 +1148,8 @@ th: hide_forever: "ไม่เป็นไร" summary: enabled_description: "คุณกำลังดูสรุปของกระทู้นี้ : นี่คือโพสที่น่าสนใจที่สุดที่หลายๆคนแนะนำ" + description: + other: "มี %{count} คำตอบ" enable: "สรุปกระทู้นี้" disable: "แสดงโพสต์ทั้งหมด" deleted_filter: @@ -1109,6 +1161,7 @@ th: title: "ข้อความ" invite: "เชิญผู้อื่น..." edit: "เพิ่มหรือลบ..." + add: "เพิ่ม..." leave_message: "คุณต้องการละทิ้งข้อความนี้จริงๆใช่หรือไม่" remove_allowed_user: "คุณต้องการลบ %{name} จากข้อความนี้ใช่หรือไม่" remove_allowed_group: "คุณต้องการลบ %{name} จากข้อความนี้ใช่หรือไม่" @@ -1217,6 +1270,9 @@ th: enter: "เอ็นเทอร์" conditional_loading_section: loading: กำลังโหลด... + category_row: + topic_count: + other: "%{count}กระทู้ในหมวดหมู่นี้" select_kit: default_header_text: เลือก... no_content: ไม่พบผลลัพธ์ที่ตรงกัน @@ -1227,6 +1283,8 @@ th: other: "คุณสามารถเลือกได้ %{count} รายการเท่านั้น" min_content_not_reached: other: "เลือกอย่างน้อย %{count} รายการ" + invalid_selection_length: + other: "การเลือกต้องมีอย่างน้อย %{count} ตัวอักษร" date_time_picker: from: จาก to: ถึง @@ -1269,9 +1327,17 @@ th: reference_topic_title: "ตอบกลับ: %{title}" error: title_missing: "ต้องมีชื่อเรื่อง" + title_too_short: + other: "ชื่อเรื่องต้องมีอย่างน้อย %{count} ตัวอักษร" + title_too_long: + other: "ชื่อเรื่องต้องไม่ยาวเกิน %{count} ตัวอักษร" post_missing: "โพสต์ไม่สามารถว่างได้" + post_length: + other: "โพสต์ต้องมีอย่างน้อย %{count} ตัวอักษร" try_like: "คุณได้ลองปุ่ม %{heart} แล้วหรือยัง" category_missing: "คุณต้องเลือกหมวดหมู่" + tags_missing: + other: "คุณต้องเลือกอย่างน้อย %{count} แท็ก" save_edit: "บันทึกการแก้ไข" reply_original: "ตอบบนกระทู้ต้นฉบับ" reply_here: "ตอบที่นี่" @@ -1306,6 +1372,7 @@ th: link_dialog_title: "เพิ่มลิงค์" link_optional_text: "ชื่อเรื่องเพิ่มเติม" link_url_placeholder: "วาง URL หรือพิมพ์เพื่อค้นหากระทู้" + blockquote_title: "ส่วนอ้างถึง" blockquote_text: "ส่วนอ้างถึง" code_title: "ข้อความก่อนจัดรูปแบบ" code_text: "ข้อความก่อนจัดรูปแบบเยื้อง 4 เคาะ" @@ -1345,6 +1412,7 @@ th: label: "แบบร่างที่ถูกแบ่งปัน" toggle_topic_bump: desc: "ตอบกลับโดยไม่เปลี่ยนวันที่ตอบกลับล่าสุด" + ignore: "ไม่สนใจ" notifications: tooltip: regular: @@ -1380,6 +1448,8 @@ th: topic_reminder: "%{username}%{description}" watching_first_post: "กระทู้ใหม่%{description}" membership_request_accepted: "ถูกรับเป็นสมาชิกในกลุ่ม '%{group_name}'" + reaction: "%{username}%{description}" + reaction_2: "%{username}, %{username2}%{description}" group_message_summary: other: "%{count}ข้อความในกล่องขาเข้าของกลุ่ม %{group_name}" popup: @@ -1440,6 +1510,7 @@ th: or_search_google: "หรือลองค้นหาด้วยกูเกิล:" search_google: "ลองค้นหาด้วยกูเกิล:" search_google_button: "กูเกิล" + search_button: "ค้นหา" context: user: "ค้นหาโพสต์โดย @%{username}" category: "ค้นหาหมวด #%{category}" @@ -1485,6 +1556,8 @@ th: label: โพสต์แล้ว before: ก่อน after: หลังจาก + views: + label: ดู hamburger_menu: "ไปยังรายการกระทู้หรือหมวดหมู่อื่น" new_item: "ใหม่" go_back: "ย้อนกลับ" @@ -1509,6 +1582,7 @@ th: change_category: "ตั้งค่าหมวดหมู่" close_topics: "ปิดกระทู้" archive_topics: "คลังกระทู้" + move_messages_to_inbox: "ย้ายไปกล่องขาเข้า" notification_level: "การแจ้งเตือน" choose_new_category: "เลือกหมวดหมู่ใหม่ให้กระทู้" selected: @@ -1531,6 +1605,7 @@ th: new: "ไม่มีกระทู้ใหม่อีกแล้ว" unread: "ไม่มีกระทู้ที่ยังไม่อ่านอีกแล้ว" category: "ไม่มีกระทู้อื่นอีกใน %{category}" + tag: "ไม่มีกระทู้อื่นอีกใน %{tag}" top: "ไม่มีกระทู้ยอดนิยมอีกแล้ว" bookmarks: "ไม่มีกระทู้ที่บุ๊กมาร์กอีกแล้ว" topic: @@ -1589,6 +1664,9 @@ th: jump_reply_up: ข้ามไปยังคำตอบก่อนหน้านี้ jump_reply_down: ข้ามไปยังคำตอบหลังจากนี้ deleted: "กระทู้ถูกลบ" + slow_mode_update: + save: "เปิดใช้งาน" + remove: "ปิดใช้งาน" topic_status_update: num_of_hours: "จำนวนชั่วโมง:" num_of_days: "จำนวนวัน:" @@ -1624,6 +1702,7 @@ th: status_update_notice: auto_open: "กระทู้นี้จะเปิดโดยอัตโนมัติ%{timeLeft}" auto_close: "กระทู้นี้จะถูกปิดอัตโนมัติใน %{timeLeft}" + auto_close_after_last_post: "กระทู้นี้จะถูกปิด %{duration} หลังจากการตอบล่าสุด" auto_delete: "กระทู้นี้จะลบโดยอัตโนมัติ%{timeLeft}" auto_reminder: "คุณจะถูกเตือนเกี่ยวกับกระทู้นี้%{timeLeft}" auto_delete_replies: "คำตอบในกระทู้นี้จะถูกลบโดยอัตโนมัติหลังจาก%{duration}" @@ -1640,6 +1719,8 @@ th: go: "ไป" jump_bottom: "ข้ามไปยังโพสต์ล่าสุด" jump_prompt: "ข้ามไปยัง..." + jump_prompt_of: + other: "ของ %{count} โพสต์" jump_prompt_long: "ข้ามไปยัง..." jump_bottom_with_number: "ข้ามไปยังโพสต์ %{post_number}" jump_prompt_to_date: "ไปวันที่" @@ -1717,6 +1798,7 @@ th: title: "แบ่งปัน" extended_title: "แบ่งปันลิงก์" help: "แบ่งปันลิงก์ไปยังกระทู้นี้" + invite_users: "เชิญ" print: title: "พิมพ์เอกสาร" flag_topic: @@ -1735,6 +1817,8 @@ th: already_pinned: other: "ตอนนี้กระทู้ถูกปักหมุดใน %{categoryLink}: %{count}" pin_globally: "ทำให้กระทู้นี้ปรากฏด้านบนสุดของรายการกระทู้ทั้งหมดจนกระทั่ง" + confirm_pin_globally: + other: "คุณมีกระทู้ที่ปักหมุดทั้งหมด %{count} กระทู้ การมีกระทู้ที่ปักหมุดมากๆอาจสร้างปัญหาให้แก่ผู้ใช้ใหม่และผู้ใช้ที่ไม่ระบุชื่อได้ คุณแน่ใจหรือว่าจะปักหมุดกระทู้เพิ่มอีกในหมวดหมู่นี้" unpin_globally: "ลบกระทู้นี้ออกจากด้านบนสุดของรายการกระทู้ทั้งหมด" unpin_globally_until: "ลบกระทู้นี้ออกจากด้านบนสุดของรายการกระทู้ทั้งหมดหรือรอจนกระทั่ง %{until}" make_banner: "ทำให้กระทู้นี้เป็นแบนเนอร์ที่จะแสดงอยู่ด้านบนสุดของทุกหน้า" @@ -1758,6 +1842,7 @@ th: username_placeholder: "ชื่อผู้ใช้" action: "ส่งคำเชิญ" help: "เชิญคนอื่นมาที่กระทู้นี้โดยอีเมลหรือการแจ้งเตือน" + discourse_connect_enabled: "กรอกชื่อผู้ใช้ของคนที่คุณต้องการเชิญมายังกระทู้นี้" to_topic_blank: "กรอกชื่อผู้ใช้หรือที่อยู่อีเมลของคนที่คุณต้องการเชิญมายังกระทู้นี้" to_topic_email: "คุณได้กรอกที่อยู่อีเมลแล้ว เราจะส่งอีเมลคำเชิญเพื่ออนุญาตเพื่อนของคุณให้ตอบกลับกระทู้นี้ได้โดยทันที" to_topic_username: "คุณได้กรอกชื่อผู้ใช้แล้ว เราจะส่งการแจ้งเตือนพร้อมลิงก์เพื่อเชิญพวกเขามายังกระทู้นี้" @@ -1845,6 +1930,7 @@ th: other: "(กระทู้ถูกแจ้งลบโดยเจ้าของ และจะถูกลบโดยอัตโนมัติใน%{count}ชั่วโมง เว้นแต่จะถูกปักธง)" post: quote_reply: "อ้างอิง" + quote_share: "แบ่งปัน" edit_reason: "เหตุผล:" post_number: "โพสต์ %{number}" reply_as_new_topic: "ตอบด้วยหัวข้อที่ลิงค์ไว้" @@ -1853,6 +1939,7 @@ th: show_full: "แสดงโพสต์ทั้งหมด" deleted_by_author: other: "(โพสถูกแจ้งลบโดยเจ้าของ และจะถูกลบใน %{count} ชั่วโมงเว้นแต่จะถูกปักธง)" + collapse: "ย่อ" expand_collapse: "ขยาย/ย่อ" locked: "ทีมงานได้ปิดโพสต์นี้จากการแก้ไข" gap: @@ -1874,6 +1961,8 @@ th: edit: "ขออภัย เกิดความผิดพลาดขณะกำลังแก้ไขโพสต์ของคุณ กรุณาลองใหม่อีกครั้ง" upload: "ขออภัย เกิดความผิดพลาดขณะกำลังอัปโหลดไฟล์ของคุณ กรุณาลองใหม่อีกครั้ง" too_many_uploads: "ขออภัย คุณสามารถอัปโหลดได้ครั้งละหนึ่งไฟล์เท่านั้น" + too_many_dragged_and_dropped_files: + other: "ขออภัย คุณสามารถอัปโหลดได้ครั้งละ %{count}ไฟล์เท่านั้น" image_upload_not_allowed_for_new_user: "ขออภัย ผู้ใช้ใหม่ไม่สามารถอัปโหลดรูปภาพได้" attachment_upload_not_allowed_for_new_user: "ขออภัย ผู้ใช้ใหม่ไม่สามารถอัปโหลดไฟล์แนบได้" attachment_download_requires_login: "ขออภัย คุณต้องเข้าสู่ระบบเพื่อดาวน์โหลดไฟล์แนบ" @@ -1988,8 +2077,14 @@ th: change_in_category_topic: "แก้ไขรายละเอียด" already_used: "สีนี้ถูกใช้สำหรับหมวดหมู่อื่นแล้ว" security: "ความปลอดภัย" + permissions: + group: "กลุ่ม" + see: "ดู" + reply: "ตอบกลับ" + create: "สร้าง" pending_permission_change_alert: "คุณยังไม่ได้เพิ่ม %{group} ไปยังหมวดหมู่นี้ คลิกปุ่มนี้เพื่อเพิ่ม" images: "รูปภาพ" + email_in: "ตั้งที่อยู่สำหรับอีเมลขาเข้า:" email_in_allow_strangers: "ยอมรับอีเมลจากผู้ใช้ที่ไม่ระบุชื่อและไม่มีบัญชี" edit_permissions: "แก้ไขการอนุญาต" review_group_name: "ชื่อกลุ่ม" @@ -2018,6 +2113,7 @@ th: high: "สูง" very_high: "สูงมาก" sort_options: + default: "ค่าเริ่มต้น" likes: "ถูกใจ" views: "ดู" posts: "โพสต์" @@ -2331,6 +2427,8 @@ th: forward: "ส่งต่อ" share: "แบ่งปัน" dismiss: "ซ่อน" + do_not_disturb: + remaining: "เหลืออีก %{remaining}" admin_js: type_to_filter: "พิมพ์เพื่อกรอง..." admin: @@ -2349,6 +2447,8 @@ th: please_upgrade: "กรุณาอัปเกรด!" installed_version: "ติดตั้งแล้ว" latest_version: "ล่าสุด" + new_features: + dismiss: "ซ่อน" last_checked: "ตรวจล่าสุด" refresh_problems: "รีเฟรช" no_problems: "ไม่พบปัญหา" @@ -2380,6 +2480,9 @@ th: view_table: "ตาราง" view_graph: "กราฟ" refresh_report: "โหลดรายงานใหม่" + daily: รายวัน + monthly: รายเดือน + weekly: รายสัปดาห์ dates: "วัน (UTC)" groups: "กลุ่มทั้งหมด" no_data: "ไม่มีข้อมูลที่จะแสดง" @@ -2531,6 +2634,7 @@ th: theme: theme: "ธีม" theme_name: "ชื่อธีม" + customize_desc: "การปรับแต่ง:" title: "ธีม" create: "สร้าง" create_type: "ชนิด" @@ -2542,6 +2646,7 @@ th: add_all_themes: "เพิ่มธีมทั้งหมด" inactive_themes: "ธีมที่ไม่ได้ใช้งาน:" and_x_more: "และอีก%{count}" + collapse: ย่อ uploads: "อัปโหลด" upload: "อัปโหลด" add_all: "เพิ่มทั้งหมด" @@ -2575,8 +2680,11 @@ th: colors: title: "สี" undo: "เลิกทำ" + revert: "ย้อนกลับ" primary: name: "หลัก" + success: + name: "สำเร็จ" email_style: css: "CSS" save_error_with_reason: "การเปลี่ยนแปลงไม่ได้ถูกบันทึก %{error}" @@ -2723,6 +2831,8 @@ th: exists: "มีอยู่แล้ว" upload: "เพิ่มจากไฟล์" upload_successful: "อัปโหลดสำเร็จแล้ว เพิ่มคำเรียบร้อย" + test: + no_matches: "ไม่พบผลลัพธ์ที่ตรงกัน" impersonate: not_found: "ไม่พบผู้ใช้นั้น" users: @@ -2753,6 +2863,8 @@ th: check_email: title: "แสดงอีเมลของผู้ใช้งานนี้" text: "แสดง" + check_sso: + text: "แสดง" user: suspend_failed: "มีข้อผิดพลาดในการระงับผู้ใช้งานนี้ %{error}" unsuspend_failed: "มีข้อผิดพลาดในเปิดผู้ใช้งานนี้ %{error}" @@ -2837,6 +2949,12 @@ th: does_not_qualify: "คุณสมบัติไม่เพียงพอสำหรับระดับความไว้ใจที่ 3" locked_will_not_be_promoted: "ระดับความไว้ใจถูกล็อก จะไม่ถูกปรับระดับความไว้ใจขึ้น" locked_will_not_be_demoted: "ระดับความไว้ใจถูกล็อก จะไม่ถูกปรับระดับความไว้ใจลง" + discourse_connect: + external_id: "รหัสภายนอก" + external_username: "ชื่อผู้ใช้" + external_name: "ชื่อ" + external_email: "อีเมล" + external_avatar_url: "URL ของรูปโปรไฟล์" user_fields: title: "ช่องข้อมูลผู้ใช้" help: "เพิ่มช่องที่คุณสามารถใส่ข้อมูลเพิ่มได้" diff --git a/config/locales/client.tr_TR.yml b/config/locales/client.tr_TR.yml index 6851e3e393de7..ec439a7752daa 100644 --- a/config/locales/client.tr_TR.yml +++ b/config/locales/client.tr_TR.yml @@ -222,6 +222,9 @@ tr_TR: now: "hemen şimdi" read_more: "devamını oku" more: "Daha fazla" + x_more: + one: "%{count} Daha" + other: "%{count} Daha" less: "Daha az" never: "asla" every_30_minutes: "her 30 dakikada bir" @@ -455,6 +458,7 @@ tr_TR: created_at_asc: "İçinde Oluşturuldu (tersine)" priority: title: "En Düşük Öncelik" + any: "(hiç)" low: "Düşük" medium: "Orta" high: "Yüksek" @@ -506,6 +510,10 @@ tr_TR: reject_reason: title: "Bu kullanıcıyı neden reddediyorsunuz?" send_email: "Ret e-postası gönder" + relative_time_picker: + days: + one: "gün" + other: "günler" time_shortcut: later_today: "Bugün ilerleyen saatlerde" next_business_day: "Bir sonraki iş günü" @@ -1032,6 +1040,7 @@ tr_TR: tags: "Etiketler" preferences_nav: account: "Hesap" + security: "Güvenlik" profile: "Profil" emails: "E-postalar" notifications: "Bildirimler" @@ -1312,6 +1321,12 @@ tr_TR: expired_tab_with_count: "Süresi dolmuş (%{count})" redeemed_tab: "Kabul Edildi" redeemed_tab_with_count: "Kabul edildi (%{count})" + invited_via: "Davet" + groups: "Gruplar" + topic: "Konu" + expires_at: "Bitiş tarihi" + edit: "Düzenle" + remove: "Kaldır" reinvited: "Davet tekrar gönderildi" search: "davet etmek için yaz..." user: "Davet Edilen Kullanıcı" @@ -1325,6 +1340,9 @@ tr_TR: topics_entered: "Görüntülenen Konular" posts_read_count: "Okunmuş Gönderi" expired: "Bu davetin süresi doldu." + remove_all: "Süresi Dolan Davetleri Kaldır" + removed_all: "Tüm Süresi Dolmuş Davetiyeler kaldırıldı!" + remove_all_confirm: "Süresi dolmuş tüm davetiyeleri kaldırmak istediğinizden emin misiniz?" reinvite_all_confirm: "Tüm davetleri tekrar göndermek istediğine emin misin?" time_read: "Okunma Zamanı" days_visited: "Ziyaret Edilen Gün" @@ -1344,6 +1362,8 @@ tr_TR: invite: expires_in_time: "Süresi dolacak: %{time}." expired_at_time: "Süresi dolmuş: %{time}." + show_advanced: "Gelişmiş Seçenekleri Göster" + hide_advanced: "Gelişmiş Seçenekleri Gizle" bulk_invite: none: "Bu sayfada görüntülenecek davetiye yok." text: "Toplu Davet" @@ -1484,6 +1504,9 @@ tr_TR: value_prop: "Bir hesap oluşturduğunuzda, ne okuduğunuzu kaydediyoruz, böylece her zaman kaldığınız yerden okumaya devam edebiliyorsunuz. Ayrıca, burada ve e-posta yoluyla, biri size yanıt verdiğinde bildirim alıyorsunuz ve sediğinizi paylaşmak için gönderileri beğenebiliyorsunuz. :Heartpulse:" summary: enabled_description: "Bu konunun özetini görüntülüyorsun: Okuyucularımızın en çok ilgisini çeken gönderiler" + description: + one: "%{count} adet cevap var." + other: "%{count} adet cevap var." enable: "Bu Konuyu Özetle" disable: "Tüm Gönderileri Göster" deleted_filter: @@ -2176,6 +2199,7 @@ tr_TR: when: "Ne zaman:" time_frame_required: "Bir zaman dilimi seç" min_duration: "Süre sıfırdan büyük olmalıdır" + max_duration: "Süre 20 yıldan az olmalıdır" auto_update_input: none: "Zaman aralığı seç" now: "Şimdi" @@ -2323,6 +2347,7 @@ tr_TR: title: "Paylaş" extended_title: "Bağlantı paylaş" help: "bu konunun bağlantısını paylaş" + invite_users: "Davet" print: title: "Yazdır" help: "Bu konunun yazıcı dostu olan sürümünü aç" @@ -2374,11 +2399,13 @@ tr_TR: username_placeholder: "kullanıcı adı" action: "Davet Gönder" help: "e-posta veya bildiri aracılığıyla başkalarını bu konuya davet et" + discourse_connect_enabled: "Bu konuya davet etmek istediğin kişinin kullanıcı adını gir." to_topic_blank: "Bu konuya davet etmek istediğin kişinin kullanıcı adını veya e-posta adresini gir." to_topic_email: "Bir e-posta adresi girdin. Arkadaşının bu konuya hemen cevap verebilmesini sağlayacak bir davetiyeyi e-posta ile göndereceğiz. " to_topic_username: "Bir kullanıcı adı girdin. Kullanıcıya, bu konuya davet bağlantısı içeren bir bildirim göndereceğiz." to_username: "Davet etmek istediğin kişinin kullanıcı adını gir. Kullanıcıya, bu konuya davet bağlantısı içeren bir bildirim göndereceğiz." email_placeholder: "isim@örnek.com" + success_email: "%{invitee} kullanıcısına davet e-postalandı. Davet kabul edildiğinde sana bir bildirim göndereceğiz. Davetlerini takip etmek için kullanıcı sayfandaki davetler sekmesine göz atmalısın. " success_username: "Kullanıcıyı bu konuya katılması için davet ettik." error: "Üzgünüz, kullanıcıyı davet edemedik. Zaten davet edilmiş olabilir mi? (Davetler oran sınırlarına tabiidir.)" success_existing_email: "%{emailOrUsername} e-posta adresine sahip bir kullanıcı zaten var. Bu kullanıcıyı bu konuya katılmaya davet ettik." @@ -2431,6 +2458,7 @@ tr_TR: action: "seçili gönderileri birleştir" error: "Seçili gönderileri birleştirirken bir hata oluştu." publish_page: + title: "Sayfa Yayınlama" public: "Herkese Açık" change_owner: title: "Sahibini Değiştir" @@ -2813,6 +2841,14 @@ tr_TR: flagging: title: "Topluluğumuzun nezaket kuralları içerisinde kalmasına sağladığın destek için teşekkürler!" action: "Gönderiyi Bayrakla İşaretle" + take_action_options: + default: + title: "Harekete Geç" + details: "Grubundan daha fazla bayrak beklemek yerine bunu hızlıca yaparak alt sınıra erişebilirsin" + suspend: + title: "Kullanıcıyı Askıya Al" + silence: + title: "Kullanıcıyı Sustur" notify_action: "Mesaj" official_warning: "Resmi uyarı" delete_spammer: "İstenmeyen e-postayı göndereni sil" @@ -3198,6 +3234,12 @@ tr_TR: safe_mode: enabled: "Güvenli mod etkin, çıkmak için bu tarayıcı penceresini kapat" do_not_disturb: + remaining: "%{remaining} kaldı" + options: + half_hour: "30 dakika" + one_hour: "1 saat" + two_hours: "2 saat" + custom: "Özel ayarlar" set_schedule: "Bildirim zamanlaması ayarla" admin_js: type_to_filter: "filtrelemek için yaz..." @@ -3226,6 +3268,8 @@ tr_TR: installed_version: "Yüklendi" latest_version: "En son" problems_found: "Mevcut site ayarlarınıza göre bazı öneriler" + new_features: + dismiss: "Yoksay" last_checked: "Son kontrol" refresh_problems: "Yenile" no_problems: "Herhangi bir sorun bulunamadı." @@ -3278,6 +3322,8 @@ tr_TR: view_table: "tablo" view_graph: "grafik" refresh_report: "Raporu Yenile" + daily: Günlük + monthly: Aylık weekly: Haftalık groups: "Tüm gruplar" disabled: "Bu rapor devre dışı" @@ -3388,6 +3434,7 @@ tr_TR: continue: Devam et scopes: resource: Kaynak + action: Eylem web_hooks: title: "Web Kancaları" none: "Şu anda bir web kancası yok." @@ -4107,6 +4154,7 @@ tr_TR: suspend_reason_label: "Neden askıya alıyorsun? Bu metin bu kullanıcının profil sayfasında herkes tarafından görüntülenecek ve kullanıcı sisteme giriş yapmaya çalıştığında kullanıcı tarafından görüntülenecek. Metin lütfen kısa olsun. " suspend_reason_hidden_label: "Neden askıya alıyorsun? Kullanıcı giriş yapmaya çalıştığında yazdığın metni görecek. Metin lütfen kısa olsun." suspend_reason: "Sebep" + suspend_reason_title: "Askıya Alma Sebebi" suspend_message: "E Posta Mesajı" suspend_message_placeholder: "İsteğe bağlı olarak, askıya alma sebebini daha uzun yazabilirsin. Askıya alma sebebi kullanıcıya e-postayla gönderilecek." suspended_by: "Askıya alan" @@ -4262,6 +4310,12 @@ tr_TR: on_grace_period: "Şu an terfisi tolerans süresinde, seviyesi düşürülmeyecek" locked_will_not_be_promoted: "Güven seviyesi kilitlendi. Seviyesi hiçbir zaman yükseltilmeyecek." locked_will_not_be_demoted: "Güven seviyesi kilitlendi. Seviyesi hiçbir zaman düşürülmeyecek." + discourse_connect: + external_id: "Harici Kimlik" + external_username: "Kullanıcı Adı" + external_name: "İsim" + external_email: "Eposta" + external_avatar_url: "Profil URL Resmi" user_fields: title: "Kullanıcı Alanları" help: "Kullanıcıların doldurabileceği alanlar ekle" @@ -4482,6 +4536,9 @@ tr_TR: embed_post_limit: "Yerleştirmek için en fazla gönderi sayısı" embed_title_scrubber: "Gönderilerin başlığını temizlemek için kullanılan düzenli ifade" embed_truncate: "Saklı gönderileri kırp" + allowed_embed_selectors: "Gömülü olarak izin verilen öğeler için CSS seçici" + blocked_embed_selectors: "Gömülmüş öğelerden kaldırılan öğeler için CSS seçici" + allowed_embed_classnames: "İzin verilen CSS sınıfı isimleri" save: "Gömme Ayarlarını Kaydet" permalink: title: "Kalıcı Bağlantılar" diff --git a/config/locales/client.uk.yml b/config/locales/client.uk.yml index b89351cef0091..02caac70cbb06 100644 --- a/config/locales/client.uk.yml +++ b/config/locales/client.uk.yml @@ -203,6 +203,7 @@ uk: wizard_required: "Запрошуємо до вашого нового Discourse! Давайте розпочнемо з майстра налаштування ✨" emails_are_disabled: "Надсилання повідомлень електронною поштою було глобально вимкнено адміністратором. Жодне сповіщення електронною поштою не буде надіслано." software_update_prompt: + message: "Ми оновили цей сайт, оновіть, інакше у вас може виникнути неочікувана поведінка." dismiss: "Відкласти" bootstrap_mode_enabled: one: "Задля спрощення запуску вашого нового сайту, сайт зараз у режимі початкового спеціального режиму. Усі нові користувачі отримають рівень довіри 1 та увімкнена щоденна розсилка підсумків електронною поштою. Цей режим буде автоматично вимкнено, коли буде мінімально потрібна кількість зареєстрованих користувачів — %{count}." diff --git a/config/locales/client.ur.yml b/config/locales/client.ur.yml index 684e491512262..7f51f273f91d9 100644 --- a/config/locales/client.ur.yml +++ b/config/locales/client.ur.yml @@ -149,6 +149,8 @@ ur: disabled: "اِس بینر کو ہٹا دیا %{when}۔ یہ اب ہر صفحے کے سب سے اوپر دکھایا نہیں جائے گا۔" wizard_required: "اپنے نئے ڈِسکورس پر خوش آمدید! سیٹ اَپ وزرڈ سے آغاز کرتے ہیں۔✨" emails_are_disabled: " ای میل کو منتظم کی طرف سے غیر فعال کر دیا گیا ہے. کسی بھی قسم کی ای میل نہیں بھیجی جائیں گی۔" + software_update_prompt: + dismiss: "بر خاست کریں" bootstrap_mode_disabled: "بُوٹسٹرَیپ مَوڈ 24 گھنٹوں کے اندر غیر فعال کر دیا جائے گا۔" themes: default_description: "ڈِیفالٹ" @@ -209,6 +211,9 @@ ur: now: "ابھی " read_more: "مزید پڑھیں " more: "مزید " + x_more: + one: "%{count} مزید" + other: "%{count} مزید" less: "کم " never: "کبھی نہیں " every_30_minutes: "ہر 30 منٹ" @@ -255,6 +260,9 @@ ur: remove: "بُک مارک ہٹائیں" confirm_clear: "کیا آپ کو یقین ہے کہ آپ اِس ٹاپک سے اپنے تمام بُک مارکس ہٹانا چاہتے ہیں؟" save: "محفوظ کریں" + no_user_bookmarks: "آپ کے پاس کوئی بُک مارک کی ہوئی پوسٹس نہیں ہیں؛ بُک مارکس آپ کو مخصوص پوسٹس کے فوری حوالہ فراہم کرتے ہیں۔" + auto_delete_preference: + never: "کبھی نہیں " search: "تلاش کریں" drafts: resume: "جاری رکھیں" @@ -353,6 +361,7 @@ ur: topic: "ٹاپک:" filtered_topic: "آپ نے ایک ٹاپک میں قابل تجدید مواد کو فِلٹر کر دیا ہے۔" filtered_user: "صارف" + filtered_reviewed_by: "کی طرف سے جائزہ کردہ" show_all_topics: "تمام ٹاپکس دکھائیں" deleted_post: "(پوسٹ حذف کر دی گئی)" deleted_user: "(صارف حذف کر دیا گیا)" @@ -362,6 +371,7 @@ ur: email: "اِی میل" name: "نام" fields: "فیلڈز" + reject_reason: "وجہ" user_percentage: agreed: one: "%{count}٪ متفق" @@ -404,6 +414,7 @@ ur: created_at_asc: "کو بنایا گیا (ریوَرس)" priority: title: "کم از کم ترجیح" + any: "(کوئی بھی)" low: "کم" medium: "درمیانی" high: "زیادہ" @@ -442,6 +453,8 @@ ur: title: "قطار شدہ پوسٹ" reviewable_user: title: "صارف" + reviewable_post: + title: "پوسٹ" approval: title: "پوسٹ کو منظوری کی ضرورت ہے" description: "ہمیں آپ کی نئی پوسٹ موصول ہو چکی ہے لیکن یہ ظاہر ہونے سے پہلے ایک منتظم سے منظور ہونا ضروری ہے۔ براہ مہربانی صبر کریں۔" @@ -449,6 +462,17 @@ ur: one: "آپ کی %{count} پوسٹ زیرِاِلتوَاء ہے۔" other: "آپ کی %{count} پوسٹس زیرِاِلتوَاء ہیں۔" ok: "ٹھیک" + example_username: "صارف نام" + relative_time_picker: + days: + one: "دن" + other: "دن" + time_shortcut: + later_today: "آج بعد میں" + tomorrow: "کَل" + next_week: "اگلے ہفتے" + later_this_week: "اِس ہفتے بعد میں" + next_month: "اگلے ماہ" user_action: user_posted_topic: "%{user} نے ٹاپک پوسٹ کیا" you_posted_topic: "آپ نے ٹاپک پوسٹ کیا" @@ -464,6 +488,7 @@ ur: sent_by_user: "%{user} نے بھیجا" sent_by_you: "آپ نے بھیجا" directory: + username: "صارف کا نام" filter_name: "صارفین کے ناموں کے حساب سے فلٹر کریں" title: "صارفین" likes_given: "دیا گیا" @@ -519,11 +544,17 @@ ur: credentials: username: "صارف کا نام" password: "پاسورڈ" + settings: + title: "سیٹِنگ" mailboxes: disabled: "غیر فعال" membership: title: ممبرشپ access: رسائی + categories: + title: زُمرَہ جات + tags: + title: ٹیگز logs: title: "لاگز" when: "کب" @@ -534,6 +565,8 @@ ur: details: "تفصیلات" from: "سے" to: "کیلئے" + permissions: + title: "اجازتیں" public_admission: "صارفین کو آزادی سے گروپ میں شمولیت اختیار کرنے کی اجازت دیں (گروپ کا عوامی طور پر ظاہر ہونا لاذمی ہو)" public_exit: "صارفین کو آزادانہ طور پر گروپ چھوڑنے کی اجازت دیں" empty: @@ -667,6 +700,9 @@ ur: topic_sentence: one: "%{count} ٹاپک" other: "%{count} ٹاپک" + topic_stat_unit: + week: "ہفتہ" + month: "مہینہ" topic_stat_sentence_week: one: "%{count} نیا ٹاپک گزشتہ ہفتے میں۔" other: "%{count} نئے ٹاپک گزشتہ ہفتے میں۔" @@ -724,7 +760,11 @@ ur: mute_option_title: "آپ کو اِس صارف سے متعلق اطلاعات نہیں ملیں گی۔" normal_option: "عمومی" normal_option_title: " آپ کو مطلع کر دیا جائے گا اگر یہ صارف آپ کو جواب دیتا ہے، آپ کا اقتباس کرتا ہے، یا آپ کا ذکر کرتا ہے۔" + notification_schedule: + none: "کوئی نہیں" + to: "کیلئے" activity_stream: "سرگرمی" + read: "پڑھ لیا گیا" preferences: "ترجیحات" feature_topic_on_profile: save: "محفوظ کریں" @@ -755,6 +795,9 @@ ur: first_notification: "آپ کی پہلی نوٹیفکیشن! شروع کرنے کے لئے اسے منتخب کریں۔" dynamic_favicon: "براؤزر آئکن پر پر شمار دکھائیں" theme_default_on_all_devices: "میری تمام ڈیوائسز پر اِس کو ڈیفالٹ تھیم بنائیں" + color_schemes: + undo: "رِی سَیٹ" + regular: "معمولی" text_size_default_on_all_devices: "میری تمام ڈیوائسز پر اِس کو ڈیفالٹ ٹیکسٹ سائز بنائیں" allow_private_messages: "دوسرے صارفین کو مجھے ذاتی پیغامات بھیجنے کی اجازت دیں" external_links_in_new_tab: "تمام بیرونی ویب سائٹ کے لنکس ایک نئے ٹیب میں کھولیں" @@ -800,6 +843,7 @@ ur: muted_categories: "خاموش کِیا ہوا" muted_categories_instructions: "آپ کو اِن زمرہ جات میں موجود نئے ٹاپکس کی کسی بھی چیز کے بارے میں مطلع نہیں کیا جائے گا، اور یہ زمرہ جات یا تازہ ترین صفحات پر نظر نہیں آئیں گے۔" muted_categories_instructions_dont_hide: "آپ کو اِن زمرہ جات میں نئے ٹاپک کی کسی بھی چیز کے بارے میں مطلع نہیں کیا جائے گا۔" + regular_categories: "معمولی" no_category_access: "ایک ماڈریٹر کے طور پر آپ کو زمرہ پر محدود رسائی حاصل ہے، محفوظ کرنا غیر فعال ہے۔" delete_account: "میرا اکاؤنٹ حذف کریں" delete_account_confirm: "کیا آپ واقعی مستقل طور پر اپنا اکاؤنٹ حذف کرنا چاہتے ہیں؟ اس عمل کو کالعدم نہیں کیا جا سکتا!" @@ -840,6 +884,7 @@ ur: tags: "ٹیگز" preferences_nav: account: "اکاؤنٹ" + security: "سیکورٹی" profile: "پروفائل" emails: "اِی مَیل" notifications: "اطلاعات" @@ -1049,6 +1094,11 @@ ur: pending_tab_with_count: "زیرِاِلتوَاء (%{count})" redeemed_tab: "فائدہ اٹھا لیا گیا" redeemed_tab_with_count: "فائدہ اٹھا لیا گیا (%{count})" + invited_via: "دعوت نامہ" + groups: "گروپس" + topic: "ٹاپک" + edit: "ترمیم" + remove: "خارج کریں" reinvited: "دعوت دوبارہ بھیج دی گئی" search: "دعوتیں تلاش کرنے کے لئے ٹائپ کریں..." user: "مدعو کیا گیا صارف" @@ -1062,6 +1112,8 @@ ur: topics_entered: " دیکھ لیے گئے ٹاپک" posts_read_count: "پڑھی گئیں پوسٹس" expired: "اِس دعوت کی میعاد ختم ہو چکی ہے۔" + removed_all: "تمام میعاد ختم ہوئی دعوتیں منسوخ کر دی گئیں!" + remove_all_confirm: "کیا آپ واقعی تمام میعاد ختم ہوئی دعوتیں منسوخ کر دینا چاہتے ہیں؟" reinvite_all_confirm: "کیا آپ واقعی تمام دعوتیں دوبارہ بھیجنا چاہتے ہیں؟" time_read: "پڑھنے کیلئے اِستعمال ہونے والا وقت" days_visited: "دورہ کیے گئے دن" @@ -1209,6 +1261,7 @@ ur: title: "پیغام" invite: "دوسروں کو مدعو کریں..." edit: "شامل کریں یا ہٹائیں..." + add: "اضافہ کریں..." leave_message: "کیا آپ واقعی یہ پیغام بھیجنا چاہتے ہیں؟" remove_allowed_user: "کیا آپ واقعی اِس پیغام سے %{name} ہٹانا چاہتے ہیں؟" remove_allowed_group: "کیا آپ واقعی اِس پیغام سے %{name} ہٹانا چاہتے ہیں؟" @@ -1220,6 +1273,7 @@ ur: trust_level: "ٹرسٹ لَیول" search_hint: "صارف نام، ای میل یا IP ایڈریس" create_account: + header_title: "خوش آمدید!" disclaimer: "رجسٹر کرنے پر آپ پرائیوِیسی پالیسی اور سروس کی شرائط سے اتفاق کرتے ہیں۔" failed: "کچھ غلط ہو گیا، شاید یہ ای میل پہلے ہی سے رجسٹرڈ ہے، پاسورڈ بھول جانے والا لنک اِستعمال کر کے دیکھیں" forgot_password: @@ -1435,6 +1489,7 @@ ur: link_description: "یہاں لِنک کی تفصیل درج کریں" link_dialog_title: "ہائپرلِنک ڈالیں" link_optional_text: "اختیاری عنوان" + blockquote_title: "بلاک متن" blockquote_text: "بلاک متن" code_title: "پہلے سے فارمیٹ کیا گیا ٹَیکسٹ" code_text: "حاشیہ نے ٹَیکسٹ کو پہلے سے 4 خالی جگہوں سے فارمیٹ کر دیا" @@ -1483,6 +1538,7 @@ ur: toggle_topic_bump: label: "ٹاپک بَمپ ٹَوگل کریں" desc: "تازہ ترین جواب کی تاریخ تبدیل کیے بغیر جواب دیں" + ignore: "نظر انداز کریں" notifications: tooltip: regular: @@ -1522,6 +1578,8 @@ ur: topic_reminder: "%{username} %{description}" watching_first_post: "نیا ٹاپک %{description}" membership_request_accepted: "'%{group_name}' میں رکنیت قبول کر لی گئی" + reaction: "%{username} %{description}" + reaction_2: "%{username}, %{username2} %{description}" group_message_summary: one: "آپ کے %{group_name} اِن باکس میں %{count} پیغام" other: "آپ کے %{group_name} اِن باکس میں %{count} پیغامات" @@ -1593,6 +1651,7 @@ ur: or_search_google: "یا اس کے بجائے گُوگَل کے ساتھ تلاش کرنے کی کوشش کریں:" search_google: "اس کے بجائے گُوگَل کے ساتھ تلاش کرنے کی کوشش کریں:" search_google_button: "گُوگَل" + search_button: "تلاش کریں" context: user: "@%{username} کے حساب سے پوسٹس تلاش کریں" category: "#%{category} زُمرَہ میں تلاش کریں" @@ -1640,6 +1699,8 @@ ur: label: پوسٹ کیا before: سے پہلے after: کے بعد + views: + label: وِیوز hamburger_menu: "ایک اور ٹاپک فہرست یا زمرہ پر جائیں" new_item: "نیا" go_back: "واپس جائیں" @@ -1665,6 +1726,7 @@ ur: change_category: "زمرہ تبدیل کریں" close_topics: "ٹاپکس بند کریں" archive_topics: "ٹاپکس آر کائیو کریں" + move_messages_to_inbox: "اِنباکس میں منتقل کریں" notification_level: "اطلاعات" choose_new_category: "ٹاپکس کیلئے نئے زمرہ کا انتخاب کریں:" selected: @@ -1690,6 +1752,7 @@ ur: new: "کوئی مزید نئے ٹاپک موجود نہیں ہیں۔" unread: "کوئی مزید بغیر پڑھے ٹاپک موجود نہیں ہیں۔" category: "مزید کوئی %{category} کے ٹاپک موجود نہیں۔" + tag: "مزید کوئی %{tag} کے ٹاپک موجود نہیں۔" top: "مزید کوئی ٹاپ ٹاپک موجود نہیں۔" bookmarks: "مزید کوئی بک مارک کیے ہوئے ٹاپک موجود نہیں۔" topic: @@ -1756,6 +1819,9 @@ ur: jump_reply_up: اِس سے پرانے جواب پر جائیں jump_reply_down: اِس سے نئے جواب پر جائیں deleted: "ٹاپک حذف کردیا گیا ہے" + slow_mode_update: + save: "فعال کریں" + remove: "غیر فعال کریں" topic_status_update: title: "ٹاپک ٹائمر" save: "ٹائمر مقرر کریں" @@ -1797,6 +1863,7 @@ ur: auto_open: "یہ ٹاپک خود کار طریقے سے کھول دیا جائے گا %{timeLeft}۔" auto_close: "یہ ٹاپک خود کار طریقے سے بند کر دیا جائے گا %{timeLeft}۔" auto_publish_to_category: "یہ ٹاپک #%{categoryName} میں شائع کر دیا جائے گا %{timeLeft}۔" + auto_close_after_last_post: "یہ ٹاپک آخری جواب کے %{duration} بعد بند ہو جائے گا۔" auto_delete: "یہ ٹاپک خود کار طریقے سے حذف کر دیا جائے گا %{timeLeft}۔" auto_bump: "یہ ٹاپک خود کار طریقے سے بَمپ کر دیا جائے گا %{timeLeft}۔" auto_reminder: "آپ کو اس ٹاپک کے بارے میں یاد دہانی کرائی جائے گا %{timeLeft}۔" @@ -1898,6 +1965,7 @@ ur: title: "شیئر" extended_title: "لِنک شیئر کریں" help: "اِس ٹاپک کا لنک شئیر کریں" + invite_users: "دعوت دیں" print: title: "پرنٹ" help: "اس ٹاپک کا \"پرنٹر فرینڈلی\" ورژن کھولیں" @@ -1949,11 +2017,13 @@ ur: username_placeholder: "صارف نام" action: "دعوت بھیجیں" help: "اِی میل یا اطلاعات کے ذریعے اس ٹاپک کے لیے دوسروں کو مدعو کریں" + discourse_connect_enabled: "اُس شخص کا صارف نام درج کریں جسے آپ اِس ٹاپک میں مدعو کرنا چاہتے ہیں۔" to_topic_blank: "اُس شخص کا صارف نام یا اِیمیل ایڈریس درج کریں جسے آپ اِس ٹاپک میں مدعو کرنا چاہتے ہیں۔" to_topic_email: "آپ نے ایک اِیمیل ایڈریس درج کیا ہے۔ ہم ایک دعوت نامہ اِیمیل کریں گے جس سے آپ کے دوست کو فوری طور پر اِس ٹاپک پر جواب دینے کی اجازت مل جائے گی۔" to_topic_username: "آپ نے ایک صارف نام درج کیا ہے۔ ہم اِطلاع کے طور پر اُنہیں ایک لنک بھیجیں گے جس میں اِس ٹاپک کیلئے اُنہیں مدعو کیا جائے گا۔" to_username: "اُس شخص کا صارف نام درج کریں جسے آپ اِس ٹاپک میں مدعو کرنا چاہتے ہیں۔ ہم اِطلاع کے طور پر اُنہیں ایک لِنک بھیجیں گے جس میں اِس ٹاپک کیلئے اُنہیں مدعو کیا جائے گا۔" email_placeholder: "name@example.com" + success_email: "ہم نے %{invitee} کو ایک دعوت نامہ اِیمیل کیا ہے۔ جب دعوت نامہ اِستعمال ہو گا تو ہم آپ کو مطلع کریں گے۔ اپنی دعوتوں کا ٹریک رکھنے کیلئے اپنے صارف صفحہ پر دعوت ناموں والی ٹیب چیک کریں۔" success_username: "ہم نے اِس ٹاپک میں حصہ لینے کے لئے اُس صارف کو مدعو کیا ہے۔" error: "معزرت، ہم اس شخص کو دعوت نہ دے سکے۔ شاید وہ پہلے ہی مدعو کیے جا چکے ہیں؟ (دعوتیں شرح محدود ہیں)" success_existing_email: "آیک صارف %{emailOrUsername} والے ای میل کے ساتھ پہلے ہی موجود ہے۔ ہم نے اِس ٹاپک میں حصہ لینے کے لئے اُس صارف کو مدعو کر دیا ہے۔" @@ -2048,6 +2118,7 @@ ur: other: "(مصنف نے ٹاپک واپس لے لیا، %{count} گھنٹوں میں یہ خود کار طریقے سے حذف کر دیا جائے گا الا یہ کہ اِسے فلیگ کیا گیا ہو)" post: quote_reply: "اقتباس کریں" + quote_share: "شیئر" edit_reason: "وجہ:" post_number: "پوسٹ %{number}" ignored: "نظر انداز کردہ مواد" @@ -2090,6 +2161,8 @@ ur: image_upload_not_allowed_for_new_user: "معذرت، نئے صارفین تصاویر اَپ لوڈ نہیں کر سکتے۔" attachment_upload_not_allowed_for_new_user: "معذرت، نئے صارفین اٹیچمنٹس اَپ لوڈ نہیں کر سکتے۔" attachment_download_requires_login: "معذرت، اٹیچمنٹس ڈائونلوڈ کرنے کیلیے آپ کا لاگ اِن ہونا ضروری ہے۔" + cancel_composer: + discard: "منسوخ" via_email: "یہ پوسٹ بذریعہ اِی میل پہنچی" via_auto_generated_email: "یہ پوسٹ ایک خود کار طریقے سے تخلیق کردہ اِی میل کے ذریعے پہنچی" whisper: "یہ پوسٹ ماڈریٹرز کے لئے ایک نجی وِھسپر ہے" @@ -2141,6 +2214,9 @@ ur: remove_timer: "ٹائمر ہٹائیں" actions: people: + like: + one: "اِس کو لائیک کیا" + other: "اِس کو لائیک کیا" like_capped: one: "اور %{count} دوسرے شخص نے اِس کو لائیک کیا" other: "اور %{count} دوسرے لوگوں نے اِس کو لائیک کیا" @@ -2236,6 +2312,11 @@ ur: change_in_category_topic: "تفصیل ترمیم کریں" already_used: "یہ رنگ دوسرے زمرہ کیلیے استعمال ہو چکا ہے۔" security: "سیکورٹی" + permissions: + group: "گروپ" + see: "ملاحظہ کریں" + reply: "جواب" + create: "بنائیں" special_warning: "انتباہ: یہ زمرہ ایک پہلے سے بنایا ہوا زمرہ ہے اور اِس کی سیکورٹی سیٹِنگ میں ترمیم نہیں کی جا سکتی۔ اگر آپ اِس زمرہ کو استعمال کرنے کی خواہش نہیں رکھتے، تو اِسے کسی اور حوالے سے استعمال کرنے کی بجائے، حذف کردیں۔" uncategorized_security_warning: "یہ زمرہ خاص ہے۔ اِس کا مقصد بغیر زمرہ والے ٹاپکس کیلئے جگہ فراہم کرنا ہے؛ اِس میں سیکورٹی کی ترتیبات نہیں ہو سکتیں۔" uncategorized_general_warning: 'یہ زمرہ خاص ہے۔ یہ نئے ٹاپکس جن کیلئے کسی زمرہ کا انتخاب نہ ہوا ہو، اُن کیلئے پہلے سے طے شدہ زمرہ کے طور پر استعمال ہوتا ہے۔ اگر آپ اِس رویے کو روکنے اور کسی زمرہ کے انتخاب کو لازمی کرنا چاہتے ہیں، تو برائے مہربانی یہاں ترتیب کو غیر فعال کریں۔ اگر آپ نام یا تفصیل تبدیل کرنا چاہتے ہیں، تو مرضی کے مطابق / ٹَیکسٹ متن پر جائیں۔' @@ -2315,6 +2396,14 @@ ur: flagging: title: "ہماری کمیونٹی کو مہذب رکھنے کے لئے مدد کا شکریہ!" action: "پوسٹ فلَیگ کریں" + take_action_options: + default: + title: "کارروائی کریں" + details: "بجائے مزید کمیونٹی کی طرف سے فلَیگز کا انتظارکرنے کے، فوری طور پرفلَیگز کی حد تک پہنچ جائیں" + suspend: + title: "صارف معطل کریں" + silence: + title: "صارف خاموش کریں" notify_action: "پیغام" official_warning: "آفیشل انتباہ" delete_spammer: "سپیم کرنے والے کو حذف کریں" @@ -2673,6 +2762,10 @@ ur: dismiss: "بر خاست کریں" safe_mode: enabled: "سیف موڈ فعال ہے، سیف موڈ سے باہر نکلنے کے لئے اِس براؤزر وِنڈو کو بند کریں" + do_not_disturb: + remaining: "%{remaining} باقی رہتا ہے..." + options: + custom: "اپنی مرضی کا" admin_js: type_to_filter: "فِلٹر کرنے کے لئے ٹائپ کریں..." admin: @@ -2700,6 +2793,8 @@ ur: installed_version: "انسٹال کیا ہوا" latest_version: "تازہ ترین" problems_found: "آپ کی موجودہ سائٹ ترتیبات کے مطابق کچھ مشورے" + new_features: + dismiss: "بر خاست کریں" last_checked: "آخری دفعہ چیک کیا گیا" refresh_problems: "رِیفریش" no_problems: "کوئی مسائل نہیں پائے گئے۔" @@ -2752,6 +2847,9 @@ ur: view_table: "ٹیبل" view_graph: "گراف" refresh_report: "رپورٹ رِیفریش کریں" + daily: روزانہ + monthly: ماہانہ + weekly: ہفتہ وار groups: "تمام گروپس" disabled: "یہ رپورٹ غیر فعال ہے" totals_for_sample: "نمونہ کیلئے کل" @@ -2840,6 +2938,8 @@ ur: description: تفصیل save: محفوظ کریں continue: جاری رکھی + scopes: + action: عمل web_hooks: title: "وَیب ھُوک٘س٘" none: "اِس وقت کوئی وَیب ھُوک٘س٘ نہیں ہیں۔" @@ -3464,6 +3564,7 @@ ur: censor: "سَینسَر" require_approval: "منظوری کی ضرورت ہے" flag: "فلَیگ" + replace: "بدلیں" action_descriptions: block: "اِن الفاظ پر مشتمل پوسٹس شائع ہونے سے روکیں۔ جب صارف اپنی پوسٹ شائع کرنے کی کوشش کرے گا تو اُسے ایک خرابی کا پیغام دکھایا جائے گا۔" censor: "اِن الفاظ پر مشتمل پوسٹس کوشائع ہونے دیں، لیکن سینسر کیے گئے الفاظ کو چھپانے والے حروف کے ساتھ تبدیل کریں۔" @@ -3523,6 +3624,8 @@ ur: check_email: title: "اِس صارف کا اِیمیل ایڈریس ظاہر کریں" text: "دکھائیں" + check_sso: + text: "دکھائیں" user: suspend_failed: "اِس صارف کو معطل کرتے ہوے کچھ غلط ہو گیا %{error}" unsuspend_failed: "اِس صارف کی معطلی ختم کرتے ہوے کچھ غلط ہو گیا %{error}" @@ -3530,6 +3633,7 @@ ur: suspend_reason_label: "آپ معطل کیوں کر رہے ہیں؟ یہ ٹَیکسٹ اِس صارف کے پروفائل پیج پر ہر کسی کے لیے ظاہر ہو گا، اور جب صارف لاگ اِن کرنے کی کوشش کریں گے تو اُنہیں دکھایا جائے گا۔ اِسے مختصر رکھیں۔" suspend_reason_hidden_label: "آپ کیوں معطل کر رہے ہیں؟ صارف جب لاگ اِن کرنے کی کوشش کرے گا تو اُسے یہ ٹیکسٹ دکھایا جائے گا۔ اِسے مختصر رکھیں۔" suspend_reason: "وجہ" + suspend_reason_title: "وجہ معطلی" suspend_message: "اِی مَیل پیغام" suspend_message_placeholder: "اختیاریطور پر معطلی کے بارے میں مزید معلومات فراہم کریں اور یہ صارف کو ای میل کر دی جائیں گی۔" suspended_by: "کی طرف سے معطل کیا گیا" @@ -3685,6 +3789,12 @@ ur: on_grace_period: "فی الحال ترقی کے رعایتی مدت میں، تنزلی نہیں کی جائے گی۔" locked_will_not_be_promoted: "ٹرسٹ کی سطح مقفل۔ کبھی بھی ترقی نہیں دی جائے گی۔" locked_will_not_be_demoted: "ٹرسٹ کی سطح مقفل۔ کبھی بھی تنزلی نہیں کی جائے گی۔" + discourse_connect: + external_id: "بیرونی آئی ڈی" + external_username: "صارف کا نام" + external_name: "نام" + external_email: "اِی میل" + external_avatar_url: "پروفائل کی تصویر کا یوآرایل" user_fields: title: "صارف کے لیے دیئے گئے خانے" help: "خانے شامل کریں جو آپ کے صارفین پُر کر سکیں۔" @@ -3881,6 +3991,9 @@ ur: embed_post_limit: "پعسٹس اَیمبَیڈ کرنے کی زیادہ سے زیادہ تعداد۔" embed_title_scrubber: "پوسٹس کے عنوان صاف کرنے کیلئے استعمال ہونے والا رَیگولَر اَیکسپرَیشن" embed_truncate: "اَیمبَیڈ کی گئی پوسٹس کو تراشیں" + allowed_embed_selectors: "عناصر کیلئے CSS سلیکٹر جن کی اَیمبَیڈ میں اجازت ہے" + blocked_embed_selectors: "عناصر کیلئے CSS سلیکٹر جن کو اَیمبَیڈ سے ہٹایا گیا ہے" + allowed_embed_classnames: "اجازت یافتہ CSS کلاسوں کے نام" save: "اَیمبَیڈ کرنے کی سیٹِنگ محفوظ کریں" permalink: title: "دائمی لِنکس" diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml index 0dceaf981a7c2..7384f9b1eb1bc 100644 --- a/config/locales/client.vi.yml +++ b/config/locales/client.vi.yml @@ -136,6 +136,8 @@ vi: topic_admin_menu: "hành động cho chủ đề" wizard_required: "Chào mừng bạn đến với Discourse! Hãy bắt đầu với hướng dẫn cài đặt ✨" emails_are_disabled: "Ban quản trị đã tắt mọi email gửi đi. Sẽ không có bất kỳ thông báo nào qua email được gửi đi." + software_update_prompt: + dismiss: "Hủy bỏ" bootstrap_mode_enabled: other: "Để đơn giản hoá quá trình triển khai trang web, bạn đang ở trong chế độ bootstrap. Mọi người dùng mới đều có mức độ tin cậy 1 và sẽ nhận được email cập nhật thông tin mỗi ngày. Chế độ này sẽ tự động tắt khi số người dùng vượt qua %{count}" bootstrap_mode_disabled: "Chế độ bootstrap sẽ bị vô hiệu trong 24 giờ tới." @@ -197,6 +199,8 @@ vi: now: "ngay lúc này" read_more: "đọc thêm" more: "Nhiều hơn" + x_more: + other: "%{count} Thêm" less: "Ít hơn" never: "không bao giờ" every_30_minutes: "mỗi 30 phút" @@ -377,6 +381,7 @@ vi: email: "Email" name: "Tên" fields: "Trường tùy biến" + reject_reason: "Lý do" user_percentage: agreed: other: "%{count}đồng ý" @@ -415,6 +420,7 @@ vi: created_at_asc: "Tạo tại (đảo ngược)" priority: title: "Ưu tiên tối thiểu" + any: "(bất kỳ)" low: "Thấp" medium: "Trung bình" high: "Cao" @@ -453,6 +459,8 @@ vi: title: "Bài viết được xếp lịch" reviewable_user: title: "Người dùng" + reviewable_post: + title: "Bài viết" approval: title: "Bài viết cần phê duyệt" description: "Chúng tôi đã nhận được bài viết mới của bạn, nhưng nó cần phải được phê duyệt bởi admin trước khi được hiện. Xin hãy kiên nhẫn." @@ -460,6 +468,24 @@ vi: other: "Bạn có %{count} bài viết đang chờ." ok: "OK" example_username: "tên người dùng" + relative_time_picker: + minutes: + other: "phút" + hours: + other: "giờ" + days: + other: "ngày" + time_shortcut: + later_today: "Sau ngày hôm nay" + next_business_day: "Ngày làm việc tiếp theo" + tomorrow: "Ngày mai" + next_week: "Tuần tới" + post_local_date: "Ngày trong bài" + later_this_week: "Cuối tuần này" + start_of_next_business_week: "Thứ hai" + start_of_next_business_week_alt: "Thứ hai tới" + next_month: "Tháng t" + custom: "Ngày giờ tùy chỉnh" user_action: user_posted_topic: "%{user} đã đăng chủ đề" you_posted_topic: "Bạn đã đăng chủ đề" @@ -545,6 +571,8 @@ vi: imap_ssl: "Sử dụng SSL cho IMAP" username: "Tên đăng nhập" password: "Mật khẩu" + settings: + title: "Xác lập" mailboxes: synchronized: "Hộp thư được đồng bộ hóa" none_found: "Không tìm thấy hộp thư nào trong tài khoản email này." @@ -722,6 +750,9 @@ vi: muted: "Các danh mục bị ẩn" topic_sentence: other: "%{count} chủ đề" + topic_stat_unit: + week: "tuần" + month: "tháng" topic_stat_sentence_week: other: "%{count}chủ đề mới trong tuần qua." topic_stat_sentence_month: @@ -780,7 +811,12 @@ vi: mute_option_title: "Bạn sẽ không nhận được bất kỳ thông báo nào liên quan đến người dùng này." normal_option: "Bình thường" normal_option_title: "Bạn sẽ được thông báo nếu người dùng này trả lời bạn, trích dẫn bạn hoặc đề cập đến bạn." + notification_schedule: + none: "Không có gì" + monday: "Thứ hai" + to: "tới" activity_stream: "Hoạt động" + read: "Đã đọc" preferences: "Tùy chỉnh" feature_topic_on_profile: open_search: "Chọn chủ đề mới" @@ -929,6 +965,7 @@ vi: tags: "Thẻ" preferences_nav: account: "Tài khoản" + security: "Bảo mật" profile: "Hồ sơ" emails: "Email" notifications: "Thông báo" @@ -1200,6 +1237,12 @@ vi: pending_tab_with_count: "Đang xử lý (%{count})" redeemed_tab: "Làm lại" redeemed_tab_with_count: "Làm lại (%{count})" + invited_via: "Lời mời" + groups: "Nhóm" + topic: "Chủ đề" + expires_at: "Hết hạn" + edit: "Sửa" + remove: "Xoá" reinvited: "Gửi lại lời mời" search: "gõ để tìm kiếm thư mời " user: "User được mời" @@ -1212,6 +1255,9 @@ vi: topics_entered: "Bài viết được xem " posts_read_count: "Đọc bài viết" expired: "Thư mời này đã hết hạn." + remove_all: "Xóa lời mời đã hết hạn" + removed_all: "Tất cả lời mời đã hết hạn đã bị xóa!" + remove_all_confirm: "Bạn có chắc chắn muốn xóa tất cả các lời mời đã hết hạn không?" reinvite_all_confirm: "Bạn có chắc chắn gửi lại tất cả các lời mời?" time_read: "Đọc thời gian" days_visited: "Số ngày đã thăm" @@ -1363,6 +1409,8 @@ vi: value_prop: "Khi bạn tạo tài khoản, chúng tôi nhớ chính xác những gì bạn đã đọc, vì vậy bạn luôn quay lại ngay nơi bạn đã dừng lại. Bạn cũng nhận được thông báo, tại đây và qua email, bất cứ khi nào ai đó trả lời bạn. Và bạn có thể thích bài viết để chia sẻ. :heartpulse:" summary: enabled_description: "Bạn đang xem một bản tóm tắt của chủ đề này: các bài viết thú vị nhất được xác định bởi cộng đồng." + description: + other: "Có %{count} trả lời." enable: "Tóm tắt lại chủ đề" disable: "HIển thị tất cả các bài viết" deleted_filter: @@ -1387,6 +1435,7 @@ vi: trust_level: "Độ tin tưởng" search_hint: "username, email or IP address" create_account: + header_title: "Chào mừng!" disclaimer: "Bằng cách đăng ký, bạn đồng ý với chính sách bảo mậtđiều khoản dịch vụ." failed: "Có gì đó không đúng, có thể email này đã được đăng ký, thử liên kết quên mật khẩu" forgot_password: @@ -1589,7 +1638,13 @@ vi: reference_topic_title: "Trả lời đến: %{title}" error: title_missing: "Tiêu đề là bắt buộc" + title_too_short: + other: "Tiêu để phải có ít nhất %{count} ký tự" + title_too_long: + other: "Tiêu đề có tối đa %{count} ký tự" post_missing: "Bài đăng không được để trống" + post_length: + other: "Bài viết phải có ít nhất %{count} ký tự" try_like: "Bạn đã thử nút %{heart} chưa?" category_missing: "Bạn phải chọn một phân loại" tags_missing: @@ -1808,6 +1863,7 @@ vi: or_search_google: "Hoặc thử tìm kiếm bằng Google thay thế:" search_google: "Hãy thử tìm kiếm bằng Google để thay thế:" search_google_button: "G" + search_button: "Tìm kiếm" context: user: "Tìm bài viết của @%{username}" category: "Tìm kiếm danh mục #%{category}" @@ -1893,6 +1949,7 @@ vi: change_category: "Đặt danh mục" close_topics: "Đóng các chủ đề" archive_topics: "Chủ đề Lưu trữ" + move_messages_to_inbox: "Chuyển sang hộp thư" notification_level: "Thông báo" choose_new_category: "Chọn chuyên mục mới cho chủ đề này:" selected: @@ -2003,9 +2060,16 @@ vi: minutes: "Phút:" seconds: "Giây:" durations: + 10_minutes: "10 phút" 15_minutes: "15 phút" + 30_minutes: "30 Phút" + 45_minutes: "45 phút" 1_hour: "1 giờ" + 2_hours: "2 Tiếng" 4_hours: "4 giờ" + 8_hours: "8 giờ" + 12_hours: "12 giờ" + 24_hours: "24 giờ" custom: "Thời lượng tùy chỉnh" topic_status_update: title: "Bộ hẹn giờ chủ đề" @@ -2052,6 +2116,7 @@ vi: auto_open: "Chủ đề này sẽ tự động mở trong %{timeLeft}." auto_close: "Chủ đề này sẽ tự đóng trong %{timeLeft}." auto_publish_to_category: "Chủ đề này sẽ được xuất bản lên #%{categoryName} %{timeLeft}." + auto_close_after_last_post: "Chủ đề này sẽ đóng %{duration} sau trả lời cuối cùng." auto_delete: "Chủ đề này sẽ tự động bị xóa %{timeLeft}." auto_bump: "Chủ đề này sẽ tự động được đưa vào %{timeLeft}." auto_reminder: "Bạn sẽ được nhắc nhở về chủ đề này %{timeLeft}." @@ -2070,6 +2135,8 @@ vi: go: "đi tới" jump_bottom: "nhảy tới bài viết cuối cùng" jump_prompt: "Nhảy đến..." + jump_prompt_of: + other: "của %{count} bài viết" jump_prompt_long: "Chuyển đến ..." jump_bottom_with_number: "nhảy tới bài viết %{post_number}" jump_prompt_to_date: "đến nay" @@ -2154,6 +2221,7 @@ vi: title: "Chia sẻ" extended_title: "Chia sẻ một liên kết" help: "Chia sẻ một liên kết đến chủ đề này" + invite_users: "Mời" print: title: "In" help: "Mở phiên bản thân thiện với máy in của chủ đề này" @@ -2206,11 +2274,13 @@ vi: username_placeholder: "tên người dùng" action: "Gửi Lời Mời" help: "mời người khác tham gia chủ đề thông qua email hoặc thông báo" + discourse_connect_enabled: "Nhập tên đăng nhập hoặc địa chỉ email của người mà bạn muốn mời vào chủ đề này." to_topic_blank: "Nhập tên đăng nhập hoặc địa chỉ email của người bạn muốn mời đến chủ đề này." to_topic_email: "Bạn vừa điền địa chỉ email, website sẽ gửi lời mời cho phép bạn bè của bạn có thể trả lời chủ đề này." to_topic_username: "Bạn vừa điền tên thành viên, website sẽ gửi thông báo kèm theo lời mời họ tham gia chủ đề này." to_username: "Điền tên thành viên bạn muốn mời, website sẽ gửi thông báo kèm theo lời mời họ tham gia chủ đề này." email_placeholder: "name@example.com" + success_email: "Website vừa gửi lời mời tới %{invitee} và sẽ thông báo cho bạn khi lời mời đó được chấp nhận. Kiểm tra tab lời mời trên trang tài khoản để theo dõi lời mời của bạn." success_username: "Website đã mời người đó tham gia thảo luận này." error: "Xin lỗi, chúng tôi không thể mời người đó. Có lẽ họ đã được mời? (giới hạn lời mời)" success_existing_email: "Người dùng có email %{emailOrUsername} đã tồn tại. Chúng tôi đã mời người dùng đó tham gia vào chủ đề này." @@ -2358,6 +2428,8 @@ vi: image_upload_not_allowed_for_new_user: "Xin lỗi, tài khoản mới không thể tải lên ảnh." attachment_upload_not_allowed_for_new_user: "Xin lỗi, tài khoản mới không thể tải lên đính kèm." attachment_download_requires_login: "Xin lỗi, bạn cần đăng nhập để tải về đính kèm." + cancel_composer: + discard: "Hủy bỏ" via_email: "bài viết này đăng qua email" via_auto_generated_email: "bài đăng này đến qua một email được tạo tự động" whisper: "bài viết này là lời nhắn từ điều hành viên" @@ -2403,6 +2475,8 @@ vi: unlock_post_description: "cho phép người đăng chỉnh sửa bài đăng này" delete_topic_disallowed_modal: "Bạn không có quyền xóa chủ đề này. Nếu bạn thực sự muốn xóa nó, hãy gửi cờ để người kiểm duyệt chú ý cùng với lý do." delete_topic_disallowed: "bạn không có quyền xóa chủ đề này" + delete_topic_confirm_modal: + other: "Chủ đề này hiện có hơn %{count} lượt xem và có thể là điểm đến tìm kiếm phổ biến. Bạn có chắc chắn muốn xóa hoàn toàn chủ đề này thay vì chỉnh sửa để cải thiện chủ đề không?" delete_topic_confirm_modal_yes: "Có, xóa chủ đề này" delete_topic_confirm_modal_no: "Không, giữ chủ đề này" delete_topic_error: "Đã xảy ra lỗi khi xóa chủ đề này" @@ -3063,6 +3137,8 @@ vi: installed_version: "Đã cài đặt" latest_version: "Mới nhất" problems_found: "Một số lời khuyên dựa trên cài đặt trang web hiện tại của bạn" + new_features: + dismiss: "Hủy bỏ" last_checked: "Kiểm tra lần cuối" refresh_problems: "Làm mới" no_problems: "Không phát hiện vấn đề" @@ -3176,6 +3252,8 @@ vi: effects: Các hiệu ứng trust_levels_none: "Không có gì" automatic_membership_email_domains: "Các thành viên đã đăng ký với đuôi email khớp với một trong danh sách này sẽ được tự động thêm vào nhóm:" + automatic_membership_user_count: + other: "%{count} người dùng có domain email mới và sẽ được thêm vào nhóm." primary_group: "Tự động cài là nhóm chính" name_placeholder: "Tên nhóm, không có khoảng trắng, tương tự như luật đặt tên người dùng" primary: "Nhóm Chính" @@ -3926,6 +4004,8 @@ vi: active: "Kích hoạt" staff: "Nhân viên" suspended: "Đã tạm khóa" + silenced: "Im lặng" + staged: "Theo giai đoạn" approved: "Đã duyệt?" titles: active: "Thành viên kích hoạt" @@ -3944,6 +4024,8 @@ vi: check_email: title: "Khám phá email của tài khoản này" text: "Hiển thị" + check_sso: + text: "Hiển thị" user: suspend_failed: "Có gì đó đã sai khi đình chỉ tài khoản này %{error}" unsuspend_failed: "Có gì đó sai khi gỡ bỏ đình chỉ tài khoản này %{error}" @@ -4123,6 +4205,13 @@ vi: on_grace_period: "Hiện đang trong khoảng thời gian gia hạn thăng chức, sẽ không thể giáng chức." locked_will_not_be_promoted: "Mức độ tin cậy đang khóa, sẽ không thể thăng chức." locked_will_not_be_demoted: "Mức độ tin cậy đang khóa, sẽ không thể giáng chức." + discourse_connect: + external_id: "ID Bên ngoài" + external_username: "Tên đăng nhập" + external_name: "Tên" + external_email: "Email" + external_avatar_url: "URL Ảnh đại diện" + delete_sso_record: "Xóa bản ghi SSO" user_fields: title: "Trường tài khoản" help: "Thêm trường dữ liệu cho người dùng nhập." @@ -4330,6 +4419,8 @@ vi: embed_by_username: "Tên thành viên để tạo chủ đề" embed_post_limit: "Số lượng tối đa bài viết được nhúng" embed_truncate: "Cắt ngắn các bài viết được nhúng" + allowed_embed_selectors: "Bộ chọn các thành phần CSS được hỗ trợ khi nhúng" + blocked_embed_selectors: "CSS selector for elements that are removed from embeds" allowed_embed_classnames: "Tên lớp CSS được phép" save: "Lưu thiết lập nhúng" permalink: @@ -4351,12 +4442,14 @@ vi: action: label: "Thay thế Văn bản…" modal: + title: "Thay thế Văn bản" categories: "Thư mục" topics: "Chủ đề" wizard_js: wizard: done: "Hoàn tất" back: "Quay lại" + step: "%{current} trên %{total}" upload: "Tải lên" uploading: "Đang tải lên..." upload_error: "Xin lỗi, có lỗi xảy ra khi tải lên tập tin này. Vui lòng thử lại." diff --git a/config/locales/client.zh_TW.yml b/config/locales/client.zh_TW.yml index 84b5e5f543029..40cc1a991eb87 100644 --- a/config/locales/client.zh_TW.yml +++ b/config/locales/client.zh_TW.yml @@ -127,6 +127,10 @@ zh_TW: disabled: "已於 %{when} 移除該橫幅主題。將不再出現於任何頁面。" wizard_required: "是時候配置你的論壇啦!點擊開始設置嚮導!" emails_are_disabled: "管理員已停用了全域的外部信件功能。將不再寄出任何類型的電子郵件。" + software_update_prompt: + dismiss: "忽略" + bootstrap_mode_enabled: + other: "為了讓您更輕鬆地建設網站,您正處於初始模式。將會自動授予所有新註冊的使用者信任等級 1,並自動啟用每日摘要電子郵件。該功能將於 %{count} 個使用者註冊後自動關閉。" bootstrap_mode_disabled: "初始模式將會在 24 小時後自動禁用。" themes: default_description: "預設" @@ -185,6 +189,8 @@ zh_TW: now: "就在剛才" read_more: "閱讀更多" more: "更多" + x_more: + other: "%{count} 更多" less: "較少" never: "永不" every_30_minutes: "每 30 分鐘" @@ -233,7 +239,9 @@ zh_TW: confirm_clear: "確定要移除該話題上的所有書籤嗎?" save: "儲存" no_timezone: '您尚未設定時區。將無法設定提醒事項。在您的設定檔中設定一個 。' + no_user_bookmarks: "您沒有加入書籤的貼文,書籤能夠讓您快速的找到特定貼文。" auto_delete_preference: + never: "永不" on_owner_reply: "在我回复這個話題之後" search: "搜索" reminders: @@ -311,6 +319,7 @@ zh_TW: topic: "話題:" filtered_topic: "您已篩選到單個主題中的可審閱內容。" filtered_user: "使用者" + filtered_reviewed_by: "審核由" show_all_topics: "顯示所有話題" deleted_post: "(貼文已被刪除)" deleted_user: "(使用者已被刪除)" @@ -319,6 +328,7 @@ zh_TW: email: "電子信箱" name: "名稱" fields: "欄位" + reject_reason: "原因" user_percentage: agreed: other: "%{count}%同意" @@ -383,12 +393,28 @@ zh_TW: title: "排定的貼文" reviewable_user: title: "使用者" + reviewable_post: + title: "貼文" approval: title: "貼文需等待審核" description: "我們已收到您的貼文,但需要先經過版主審核後才會顯示出來。敬請稍後。" pending_posts: other: "你有 %{count} 篇貼文在等待審核中" ok: "確定" + example_username: "username" + relative_time_picker: + days: + other: "天" + time_shortcut: + later_today: "今日稍晚" + tomorrow: "明天" + next_week: "下週" + post_local_date: "張貼日期" + later_this_week: "本週稍晚" + start_of_next_business_week: "星期一" + start_of_next_business_week_alt: "下個星期一" + next_month: "下個月" + custom: "自定義日期和時間" user_action: user_posted_topic: "%{user} 開啟了 此話題" you_posted_topic: " 開啟了 此話題" @@ -404,6 +430,7 @@ zh_TW: sent_by_user: "由 %{user} 寄出" sent_by_you: "由 寄出" directory: + username: "使用者名稱" filter_name: "以使用者名稱過濾" title: "使用者" likes_given: "送出的" @@ -458,11 +485,17 @@ zh_TW: credentials: username: "使用者名稱" password: "密碼" + settings: + title: "設定" mailboxes: disabled: "停用" membership: title: 會員身份 access: 存取 + categories: + title: 分類 + tags: + title: 標籤 logs: title: "日誌" when: "時間" @@ -473,6 +506,8 @@ zh_TW: details: "詳情" from: "自" to: "至" + permissions: + title: "權限" public_admission: "允許使用者自由加入群組(需要將群組設為公開瀏覽)" public_exit: "允許使用者自由離開群組" empty: @@ -602,6 +637,9 @@ zh_TW: subcategories: "次分類" topic_sentence: other: "%{count} 個話題" + topic_stat_unit: + week: "週" + month: "月" topic_stat_sentence_week: other: "%{count}過去一週的新話題" topic_stat_sentence_month: @@ -656,7 +694,12 @@ zh_TW: mute_option_title: "您將不會收到與此使用者相關的任何通知。" normal_option: "一般" normal_option_title: "如果有人@你或回覆你的帖子,將通知你。" + notification_schedule: + none: "無" + monday: "星期一" + to: "至" activity_stream: "活動" + read: "已讀" preferences: "偏好設定" feature_topic_on_profile: save: "儲存" @@ -686,6 +729,9 @@ zh_TW: first_notification: "你的第一則通知!選擇以開始。" dynamic_favicon: "在瀏覽器小圖示上顯示計數\\bIcon" theme_default_on_all_devices: "在所有裝置上設為預設佈景主題" + color_schemes: + undo: "重置" + regular: "普通" text_size_default_on_all_devices: "在所有裝置上設為預設文字大小" allow_private_messages: "允許其他使用者寄送個人訊息給我" external_links_in_new_tab: "在新分頁中開啟所有外部連結" @@ -729,6 +775,7 @@ zh_TW: watched_first_post_tags_instructions: "你將會收到這些標籤中新話題的第一則貼文的通知。" muted_categories: "靜音" muted_categories_instructions: "你將不會在收到任何與這些分類中的新話題有關的通知。它們亦不會再出現於分類或最新頁面中。" + regular_categories: "普通" no_category_access: "板主權限不足,無法使用儲存功能" delete_account: "刪除我的帳號" delete_account_confirm: "你真的要刪除帳號嗎?刪除後將無法還原。" @@ -769,6 +816,7 @@ zh_TW: tags: "標籤" preferences_nav: account: "帳號" + security: "安全性" profile: "基本資料" emails: "電子郵件" notifications: "通知" @@ -793,6 +841,8 @@ zh_TW: copy_to_clipboard: "複製至剪貼簿" copy_to_clipboard_error: "複製至剪貼簿時發生錯誤" copied_to_clipboard: "複製至剪貼簿" + remaining_codes: + other: "你還剩下 %{count} 個可使用的備用碼" codes: title: "已產生備用碼" description: "每個備用碼僅可使用一次。請將它們保存在安全且可被找到的地方。" @@ -970,6 +1020,11 @@ zh_TW: pending_tab_with_count: "等待中 (%{count})" redeemed_tab: "接受日期" redeemed_tab_with_count: "接受日期 (%{count})" + invited_via: "邀請函" + groups: "群組" + topic: "話題" + edit: "編輯" + remove: "移除" reinvited: "邀請已經重送" search: "輸入要搜尋邀請的文字..." user: "受邀請的使用者" @@ -982,6 +1037,8 @@ zh_TW: topics_entered: "參與的話題" posts_read_count: "已讀的貼文" expired: "此邀請已過期" + removed_all: "已移除所有過期的邀請!" + remove_all_confirm: "您是否確定要移除所有過期的邀請?" reinvite_all_confirm: "您確定要重新寄出所有邀請嗎?" time_read: "閱讀時間" days_visited: "到訪天數" @@ -1109,6 +1166,8 @@ zh_TW: value_prop: "當你註冊帳號後,我們可以準確地記錄你的閲讀進度,這樣你能夠在下一次造訪時回到你上次閲讀到的地方。你也可以選擇接受新貼文的網頁和郵件通知,也可以按任何貼文讚來分享你的感謝。:heartbeat:" summary: enabled_description: "你正在檢視此話題的摘要:在這個社群裡最熱門的貼文。" + description: + other: "有 %{count} 個回覆。" enable: "以摘要檢視此話題" disable: "顯示所有貼文" deleted_filter: @@ -1118,6 +1177,7 @@ zh_TW: disable: "顯示已刪除的貼文" private_message_info: title: "訊息" + add: "加入..." leave_message: "確定要移除這個訊息嗎?" remove_allowed_user: "確定將 %{name} 從對話中移除?" remove_allowed_group: "確定將 %{name} 從對話中移除?" @@ -1129,6 +1189,7 @@ zh_TW: trust_level: "信任等級" search_hint: "使用者名稱、電子郵件、或是IP位址" create_account: + header_title: "歡迎!" failed: "發生了某些錯誤,可能此電子郵件地址已經註冊過,請試試看忘記密碼連結" forgot_password: title: "寄出密碼" @@ -1232,6 +1293,9 @@ zh_TW: alt: "Alt" conditional_loading_section: loading: 載入中... + category_row: + topic_count: + other: "%{count}個話題在此分類" select_kit: default_header_text: 選擇... no_content: 找不到符合的項目 @@ -1284,6 +1348,8 @@ zh_TW: similar_topics: "與你的話題類似的討論..." drafts_offline: "離線草稿" edit_conflict: "編輯衝突" + group_mentioned_limit: + other: "提醒你提及了%{group},但此群組的人數多於管理員配置的提及人數上限(%{count}位),因此不會有任何人收到通知。" group_mentioned: other: "提及 %{group} 時,你將通知 %{count} 人 - 確定嗎?" cannot_see_mention: @@ -1292,8 +1358,16 @@ zh_TW: duplicate_link: "您連到%{domain}的連結已被@%{username}於%{ago}前發在其他話題下的回覆,確定要再次發佈嗎?" error: title_missing: "標題為必填欄位" + title_too_short: + other: "標題必須至少 %{count} 個字" + title_too_long: + other: "標題不能超過 %{count} 個字" + post_length: + other: "貼文必須至少 %{count} 個字。" try_like: "您用過%{heart}了嗎?" category_missing: "你必須選擇一個分類。" + tags_missing: + other: "您至少必須選擇%{count}個標籤" save_edit: "儲存編輯" overwrite_edit: "覆寫編輯" reply_original: "回覆至原始的話題" @@ -1330,6 +1404,7 @@ zh_TW: link_description: "在此輸入超連結的描述" link_dialog_title: "插入超連結" link_optional_text: "標題 (可選填)" + blockquote_title: "塊引用" blockquote_text: "塊引用" code_title: "預先格式化文字" code_text: "以 4 格空白將文字縮排" @@ -1378,6 +1453,7 @@ zh_TW: toggle_topic_bump: label: "回應但不讓貼文浮上來" desc: "回覆而不改變最新回應日期" + ignore: "忽略" notifications: tooltip: regular: @@ -1412,6 +1488,8 @@ zh_TW: granted_badge: "得到 '%{description}'" topic_reminder: "%{username} %{description}" watching_first_post: "新話題 %{description}" + reaction: "%{username} %{description}" + reaction_2: "%{username}、%{username2} %{description}" group_message_summary: other: "您的收件匣中有%{count}則訊息" popup: @@ -1466,6 +1544,7 @@ zh_TW: or_search_google: "或是嘗試利用 Google 搜尋:" search_google: "嘗試利用 Google 搜尋:" search_google_button: "Google" + search_button: "搜索" context: user: "搜尋 @%{username} 的貼文" category: "搜索 #%{category} 分類" @@ -1507,10 +1586,14 @@ zh_TW: noreplies: 沒有回覆 single_user: 只有一個使用者參與 post: + count: + label: 貼文 time: label: 發表於 before: 之前 after: 之後 + views: + label: 瀏覽 hamburger_menu: "轉到另一個話題列表或分類" new_item: "新增" go_back: "返回" @@ -1536,6 +1619,7 @@ zh_TW: change_category: "設定分類" close_topics: "關閉話題" archive_topics: "已封存的話題" + move_messages_to_inbox: "移動到收件匣" notification_level: "通知" choose_new_category: "為話題選擇新類別:" selected: @@ -1560,6 +1644,7 @@ zh_TW: new: "已經沒有其它新話題了。" unread: "已經沒有其它未讀的話題了。" category: "%{category} 分類已經沒有其它話題了。" + tag: "%{tag} 分類已經沒有其它話題了。" top: "沒有更多精選話題。" bookmarks: "書籤裡沒有更多的話題了。" topic: @@ -1617,6 +1702,9 @@ zh_TW: jump_reply_up: 跳到更早的回覆 jump_reply_down: 跳到更晚的回覆 deleted: "此話題已被刪除" + slow_mode_update: + save: "啟用" + remove: "停用" topic_status_update: title: "話題計時器" save: "設定計時器" @@ -1658,6 +1746,7 @@ zh_TW: auto_open: "此話題將在%{timeLeft}後自動開啟" auto_close: "此話題將在%{timeLeft}後自動關閉" auto_publish_to_category: "這個話題會被發佈到#%{categoryName}%{timeLeft}。" + auto_close_after_last_post: "這個話題在最後一個回覆後%{duration}將關閉。" auto_delete: "這個話題將會被自動刪除%{timeLeft}。" auto_bump: "話題在%{timeLeft}後會自動浮上來" auto_reminder: "您會收到關於這個話題的提醒%{timeLeft}。" @@ -1675,6 +1764,9 @@ zh_TW: go: "前往" jump_bottom: "跳至最後一則貼文" jump_prompt: "跳到..." + jump_prompt_of: + other: "%{count} 貼文" + jump_prompt_long: "跳到..." jump_bottom_with_number: "跳至第 %{post_number} 篇貼文" jump_prompt_to_date: "至今" jump_prompt_or: "或" @@ -1757,6 +1849,7 @@ zh_TW: title: "分享" extended_title: "分享連結" help: "分享此話題的連結" + invite_users: "邀請" print: title: "列印" help: "打開此討論話題列印友善的版本" @@ -1775,6 +1868,8 @@ zh_TW: already_pinned: other: "%{categoryLink}分類的置頂話題數:%{count}" pin_globally: "將話題置於所有話題列表最上方至" + confirm_pin_globally: + other: "已有%{count}個全局置頂話題。太多的置頂話題可能會困擾新使用者和訪客。確定想再全局置頂一個話題?" unpin_globally: "將話題從所有話題列表的最上方移除。" unpin_globally_until: "從所有話題列表最上方移除話題或者移除於%{until}。" global_pin_note: "允許使用者取消全局置頂。" @@ -1803,11 +1898,13 @@ zh_TW: username_placeholder: "使用者名稱" action: "送出邀請" help: "通過電子郵件或通知邀請其他人到該話題" + discourse_connect_enabled: "輸入其使用者名,邀請其人到本話題。" to_topic_blank: "輸入你想邀請的使用者的使用者名稱或電子郵件地址到該話題" to_topic_email: "你輸入了郵箱地址。我們將發送一封郵件邀請,讓你的朋友可直接回覆該話題。" to_topic_username: "你輸入了使用者名。我們將發送一個至該話題連結的邀請通知。" to_username: "輸入你想邀請的人的使用者名。我們將發送一個至該話題連結的邀請通知。" email_placeholder: "電子郵件地址" + success_email: "我們發了一封郵件邀請%{invitee}。邀請被接受後你會收到通知。檢查使用者頁中的邀請標籤頁來追蹤你的邀請。" success_username: "我們已經邀請該使用者加入此話題討論" error: "抱歉,我們不能邀請這個人。可能他已經被邀請了?(邀請有頻率限制)" success_existing_email: "已經有一個有此電子郵件 %{emailOrUsername} 的使用者存在。我們已邀請那位使用者來參與這個話題。" @@ -1894,6 +1991,7 @@ zh_TW: other: "(主題已被作者撤回,將在%{count}小時內自動刪除,若有標記便不會刪除)" post: quote_reply: "引用" + quote_share: "分享" edit_reason: "原因: " post_number: "貼文 %{number}" ignored: "忽略內容" @@ -1927,10 +2025,14 @@ zh_TW: upload: "抱歉,上傳你的檔案時發生錯誤,請再試一次。" file_too_large: "檔案過大(最大 %{max_size_kb}KB)。為什麼不就大檔案上傳至雲存儲服務後再分享連結呢?" too_many_uploads: "抱歉,一次只能上傳一個檔案。" + too_many_dragged_and_dropped_files: + other: "抱歉,您一次最多只能上傳%{count}個檔案。" upload_not_authorized: "抱歉,你沒有上傳檔案的權限 (驗證擴展:%{authorized_extensions})。" image_upload_not_allowed_for_new_user: "抱歉,新使用者不可上傳圖片。" attachment_upload_not_allowed_for_new_user: "抱歉,新使用者不可上傳附件。" attachment_download_requires_login: "抱歉,您必須登入以下載附件。" + cancel_composer: + discard: "捨棄" via_email: "本貼文透過電子郵件送達" via_auto_generated_email: "通過自動生成郵件發表的貼文" whisper: "這貼文是版主私人密談" @@ -1978,6 +2080,8 @@ zh_TW: add_post_notice: "加入工作人員通知" actions: people: + like: + other: "已按讚" like_capped: other: "和其他%{count}人都說讚" by_you: @@ -2075,6 +2179,11 @@ zh_TW: change_in_category_topic: "編輯描述" already_used: "此顏色已經用於其它分類" security: "安全性" + permissions: + group: "群組" + see: "觀看" + reply: "回覆" + create: "建立" special_warning: "警告:這個分類是已經自動建立好的分類,它的安全設置不能被更改。如果你不想要使用這個分類,直接刪除它,而不是另作他用。" uncategorized_security_warning: "此為特殊分類,僅作為沒有分類的話題暫存區,無法有安全設定。" uncategorized_general_warning: '此為特殊分類,作為尚未選定分類的新話題的預設分類。若您要停用此行為並強制使用者選擇分類,請在停用此設定,若您要更改名稱或說明,請到自訂 / 文字內容。' @@ -2153,6 +2262,14 @@ zh_TW: flagging: title: "感謝幫助社群遠離邪惡!" action: "檢舉貼文" + take_action_options: + default: + title: "執行動作" + details: "使其立刻達到檢舉門檻,不用等待更多人檢舉" + suspend: + title: "將使用者停權" + silence: + title: "將使用者靜音" notify_action: "訊息" official_warning: "正式警告" delete_spammer: "刪除垃圾貼文發送者" @@ -2479,6 +2596,10 @@ zh_TW: dismiss: "忽略" safe_mode: enabled: "安全模式已經開啟,關閉該瀏覽器窗口以退出安全模式" + do_not_disturb: + remaining: "剩餘 %{remaining}" + options: + custom: "客製" admin_js: type_to_filter: "輸入要搜尋的文字..." admin: @@ -2503,6 +2624,8 @@ zh_TW: installed_version: "已安裝" latest_version: "最新版本" problems_found: "根據您現在網站設定的建議" + new_features: + dismiss: "忽略" last_checked: "上次檢查的時間" refresh_problems: "重新整理" no_problems: "未發現任何問題。" @@ -2554,6 +2677,9 @@ zh_TW: view_table: "表格" view_graph: "圖表" refresh_report: "重新整理報告" + daily: 日 + monthly: 月 + weekly: 周 groups: "所有群組" disabled: "該使用者已被禁言" totals_for_sample: "樣本總計" @@ -2634,6 +2760,8 @@ zh_TW: description: 描述 save: 儲存 continue: 繼續 + scopes: + action: 動作 web_hooks: title: "Webhooks" none: "當前沒有 Webhooks。" @@ -3234,6 +3362,7 @@ zh_TW: censor: "審核" require_approval: "需要審核" flag: "檢舉" + replace: "取代" action_descriptions: block: "防止含有這些文字的貼文被發佈,當使用者嘗試發送貼文時,會看見錯誤訊息。" censor: "允許貼文含有這些文字,但以符碼來取代被禁用的文字。" @@ -3288,6 +3417,8 @@ zh_TW: check_email: title: "顯示使用者 Email" text: "顯示" + check_sso: + text: "顯示" user: suspend_failed: "將此使用者停權時發生錯誤 %{error}" unsuspend_failed: "恢復此使用者的權限時發生錯誤 %{error}" @@ -3295,6 +3426,7 @@ zh_TW: suspend_reason_label: "你為什麼要將此使用者停權?你輸入的原因將在此使用者登入時顯示,及顯示在此使用者的基本資料頁面,且任何人都可以看見,請簡短說明原因。" suspend_reason_hidden_label: "您為何要將該使用者停權?使用者在登入時會看見這段文字,請簡短描述。" suspend_reason: "原因" + suspend_reason_title: "停權原因" suspend_message: "Email 訊息" suspend_message_placeholder: "提供更多停權使用者的原因,並且會以郵件發信給該使用者。(可選)" suspended_by: "將其停權者" @@ -3443,6 +3575,12 @@ zh_TW: on_grace_period: "目前在升級優惠階段,將不會被降級。" locked_will_not_be_promoted: "信任等級鎖定。將不會再被升級。" locked_will_not_be_demoted: "信任等級鎖定。將不會再被降級。" + discourse_connect: + external_id: "外部 ID" + external_username: "使用者名稱" + external_name: "名稱" + external_email: "電子信箱" + external_avatar_url: "個人資料圖片 URL" user_fields: title: "使用者欄位" help: "增加欄位讓你的使用者可以填寫" @@ -3637,6 +3775,9 @@ zh_TW: embed_post_limit: "嵌入的最大貼文數量。" embed_title_scrubber: "從貼文中提取標題的正則表達式 \"regular expression\"" embed_truncate: "截斷嵌入的貼文" + allowed_embed_selectors: "使用 CSS 選擇器選擇允許的嵌入元素" + blocked_embed_selectors: "使用 CSS 選擇器移除嵌入元素" + allowed_embed_classnames: "允許 CSS class 名稱" save: "儲存崁入設定" permalink: title: "固定連結" diff --git a/config/locales/server.ar.yml b/config/locales/server.ar.yml index 9f72050cacfe8..014524cad607c 100644 --- a/config/locales/server.ar.yml +++ b/config/locales/server.ar.yml @@ -183,6 +183,9 @@ ar: s3_backup_requires_s3_settings: "لا يمكنك استعمال S3 كمكان للنسخ الاحتياطي طالما لم تُقدّم ”%{setting_name}“." s3_bucket_reused: "لا يمكنك استعمال نفس الحاوية لِ‍ ”s3_upload_bucket“ و”s3_backup_bucket“ معًا. اختر حاويةً أخرى أو استعمل مسارًا مختلف لكلّ حاوية." secure_media_requirements: "عليك تفعيل ”الرفع إلى S3“ قبل تفعيل الوسائط الآمنة." + invite: + disabled_errors: + invalid_access: "ليس مسموحًا لك عرض المورد المطلوب." bulk_invite: file_should_be_csv: "الملف المرفوع يجب أن يكون بنسق csv . " error: "حدث عطل أثناء رفع الملفّ. رجاء أعد المحاولة لاحقًا." @@ -224,6 +227,13 @@ ar: permalink: "الرابط الثابت" imported_from: "هذا موضوع نقاش مصاحب للمدخل الأصلي على %{link}" in_reply_to: "◀ %{username}" + replies: + zero: "%{count} ردًا" + one: "ردّ واحد" + two: "%{count} ردّ" + few: "%{count} ردّ" + many: "%{count} ردّ" + other: "%{count} ردًا" last_reply: "آخر ردّ" created: "أُنشئ في" new_topic: "افتح موضوعًا جديدًا" @@ -263,6 +273,7 @@ ar: user_is_suspended: "غير مسموح للأعضاء المعلّقة عضويتهم النشر." topic_not_found: "حدث خطب ما. قد يكون الموضوع أُغلق أو حُذف وأنت تشاهده؟" not_accepting_pms: "نأسف، لا يقبل %{username} الرّسائل حاليًّا." + slow_mode_enabled: "هذا الموضوع يخضع للوضع البطيء." just_posted_that: "هذا مشابة جدا لما نشرتة مؤخراً" invalid_characters: "يحتوي احرف غير صالحة " is_invalid: "تبدو غير واضحة، هل هذه عبارة كاملة؟" @@ -273,6 +284,13 @@ ar: topics_in_category: "المواضيع في قسم '%{category}'" rss_posts_in_topic: "مغذي RSS لـ'%{topic}'" rss_topics_in_category: "تغذية RSS للموضوعات من قسم'%{category}'" + rss_num_posts: + zero: "%{count} مشاركة" + one: "مشاركة واحدة" + two: "مشاركتان" + few: "%{count} مشاركات" + many: "%{count} مشاركة" + other: "%{count} مشاركة" read_full_topic: "اقرأ كامل الموضوع" private_message_abbrev: "رسالة" rss_description: @@ -292,9 +310,11 @@ ar: reminders: at_desktop: "في المرة القادمة سأكون عند مكتبي" later_today: "في وقت لاحق اليوم" + next_business_day: "يوم العمل التالي" tomorrow: "غداً" next_week: "الاسبوع القادم" next_month: "الشهر القادم" + custom: "تاريخ ووقت مخصّصين" groups: errors: can_not_modify_automatic: "لا يمكنك تعديل مجموعة تم انشائها تلقائيا" @@ -698,6 +718,7 @@ ar: description: "أنت تُحرّر المسودّة في نافذة أخرى. من فضلك أعِد تحميل هذه الصفحة." user_activity: no_bookmarks: + self: "ما من مشاركات عليها علامة. تُتيح لك العلامات الرجوع إلى المشاركات التي تريد بسرعة." others: "لا علامات." no_likes_given: self: "لم تعجبك أيّة منشور." @@ -754,6 +775,8 @@ ar: description: '"%{application_name}": يطلب الصلاحيات التالية لحسابك' otp_confirmation: confirm_title: تابع إلى %{site_name} + logging_in_as: تسجيل الدخول باسم %{username} + confirm_button: إنهاء تسجيل الدخول no_trust_level: "نأسف، لست بمستوى الثّقة الكافي للوصول إلى واجهة برمجة التّطبيقات (API) للمستخدمين" generic_error: "نأسف، لا نستطيع إصدار مفاتيح API للمستخدمين؛ عطّل مدير الموقع هذه الميزة" scopes: @@ -765,6 +788,7 @@ ar: reports: default: labels: + count: العد day: اليوم post_edits: labels: @@ -775,6 +799,7 @@ ar: user_flagging_ratio: labels: user: مستخدم + score: نقاط moderators_activity: labels: moderator: مشرف @@ -817,6 +842,7 @@ ar: title: "اﻹعجابات" xaxis: "اليوم" yaxis: "عدد اﻹعجابات الجديدة" + description: "عدد اﻹعجابات الجديدة." flags: title: "الأبلاغ" xaxis: "يوم" @@ -829,6 +855,7 @@ ar: title: "الأعضاء في مستوى الثقة" xaxis: "مستوى الثقة" yaxis: "عدد المستخدمين" + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: xaxis: "النوع" yaxis: "عدد المستخدمين" @@ -1007,6 +1034,7 @@ ar: show_pinned_excerpt_mobile: "اظهر مقتطفات من المواضيع المثبتة فى منظر المحمول." show_pinned_excerpt_desktop: "اظهر مقتطفات من المواضيع المثبتة فى منظر سطح المكتب." post_onebox_maxlength: "الحد الأقصى بالاحرف لطول منشور هذا الموقع عندما يتم وضعة بلوحة مُعاينة." + blocked_onebox_domains: "قائمة بعناوين المواقع التي يمنع وضع روابطها بلوحة مُعاينة." notification_email: "عنوان البريد الالكتروني المُرسِل للرسائل الصادرة من الموقع, العنوان المحدد يجب ان يكون له SPF و DKIM و reverse PTR في سجلات الDNS" email_custom_headers: "قائمة قناة محددة لرؤوس بريد إلكتروني مخصص." force_https: "ارغام الموقع على استخدام HTTPS فقط. تحذير: لا تفعل هذا الاختيار الا بعد التأكد أن HTTPS مفعلة وتعمل بالكامل فى جميع أنحاء الموقع! هل اختبرت جميع الخوادم CDN، جميع تسجيلات الدخول من شبكات التواصل الاجتماعى، أية صور أو تبعيات خارجية للتأكد من أنها كلها متوافقه مع HTTPS؟" @@ -1029,6 +1057,7 @@ ar: pending_users_reminder_delay: "نبه المشرفين إذا وجد اعضاء ينتظرون الموافقة لمدة اطول من الساعات ، قم بوضع الخيار -1 لايقاف التنبيهات ." maximum_session_age: "سيظل المستخدم مسجل دخول لهذا العدد من الساعات منذ زيارته اﻷخيرة." cors_origins: "اسمح بالأصول للطلبات عبر المنشأ (CORS). كل أصل يجب أن يتضمن http:// أو https://. متغير env لـ DISCOURSE_ENABLE_CORS يجب أن يعين إلى true ليعمل CORS." + use_admin_ip_allowlist: "المدير فقط يمكنه تسجيل الدخول إذا كانت عناوين IP لهم معرفة في قائمة IP المحجوبة. (المدير > السجلات > IP المحجوبة)" top_menu: "حدد العناصر التي تظهر في قائمة ملاحة الصفحة الرئيسية، و ترتيبها." post_menu: "تحديد العناصر التي تظهر في القائمة المختصرة للمنشور، و ترتيبها. مثل ( اعجاب | تحرير | تبليغ | حذف | مشاركة | علّم | رد )" post_menu_hidden_items: "العناصر المخفية بشكل افتراضي في القائمة المختصره للمنشور مالم يتم الضغط علي زر الاظهار" @@ -1046,6 +1075,8 @@ ar: email_token_valid_hours: "أمارات نسيان كلمة السّرّ/تنشيط الحساب صالحة لمدّة (n) ساعة." enable_badges: "فعّل نظام الشارات." enable_whispers: "السماح للطاقم بعمل نقاشات سرية داخل الموضوعات." + blocked_email_domains: "قائمة pipe-delimited المجالات البريد الإلكتروني الذي لا يسمح للمستخدمين تسجيل حسابات مع. مثال: mailinator.com | trashmail.net" + allowed_email_domains: "قائمة pipe-delimited من مجالات البريد الإلكتروني التي يجب على المستخدمين تسجيل حسابات مع. تحذير: لن يسمح للمستخدمين مع مجالات البريد الإلكتروني الأخرى غير المذكورة هنا!" hide_email_address_taken: "لا تُخبر المستخدمين بوجود حساب بنفس عنوان البريد الإلكتروني أثناء تسجيل الحسابات وفي استمارة نسيان كلمة السر." log_out_strict: "عند الخروج، اخرج من كلّ جلسات المستخدم في كلّ الأجهزة" new_version_emails: "إرسال بريد إلكتروني إلى عنوان contact_email عندما نسخة جديدة من ديسكورس هو متاح." @@ -1056,6 +1087,7 @@ ar: min_password_length: "أدنى طول لكلمة السّرّ." min_admin_password_length: "أدنى طول لكلمة سرّ الإداريّ." block_common_passwords: "لا تسمح بكلمات السر الموجودة ضمن كلمات السر ال‍ ١٠٬٠٠٠ الشائعة." + discourse_connect_overrides_bio: "تخطى التعريف المبسط بالعضو، ولا تسمح له بتغييره." allow_new_registrations: "السماح بتسجيل حسابات جديدة. عطل هذه الخاصية إذا كنت تريد منع الكل من عمل حساب جديد علي الموقع." enable_signup_cta: "اعرض تنبية للزوار المجهولين المترددين يحثهم علي تسجيل حساب جديد." google_oauth2_client_id: "رقم التعريف لتطبيق جوجل الخاص بك" @@ -1130,6 +1162,7 @@ ar: desktop_category_page_style: "أسلوب العرض لصفحة الأقسام." category_colors: "قائمة الألوان المسموحة لتمييز الأقسام بترميز الhexadecimal." category_style: "أسلوب العرض لشارة القسم." + dark_mode_none: "لا شيء" max_attachment_size_kb: "أقصى حجم لتحميل المرفقات الملفات بالكيلوبايت. وهذا يجب أن يتم تكوينه في nginx (client_max_body_size) / أباتشي أو الوكيل. " authorized_extensions: "قائمة بالملفات المسموح رفعها (أستخدم '*' للسماح لجميع الأنواع)" max_similar_results: "عدد المواضيع المشابهة لتُعرض فوق المحرّر عند إنشاء موضوع جديد. المقارنة تعتمد عنوان الموضوع ومتنه." @@ -1149,6 +1182,7 @@ ar: faq_url: "إن كانت صفحة الأسئلة الشائعة موجودة في مكان آخر وتريد استعمالها، أدخِل هنا عنوانها كاملًا." tos_url: "إن كانت صفحة شروط الخدمة موجودة في مكان آخر وتريد استعمالها، أدخِل هنا عنوانها كاملًا." privacy_policy_url: "اذا كان لديك وثيقه سياسه خصوصيه مستضيفها في مكان ما و نريد استخدمها. وفر url الكامل هنا" + allowed_spam_host_domains: "قائمة النطاقات المستثناة من اختبار مضيف البريد المزعج. لن يتم تقييد المستخدمين الجدد من إنشاء المشاركات مع الروابط إلى هذه النطاقات." topic_view_duration_hours: "احسب عدد المواضيع التي تمت مشاهدتها مره واحده عبر ip/مستخدم كل N ساعات" user_profile_view_duration_hours: "احسب عدد ملفات التعريف للعضو التي تمت مشاهدتها مرة لكل IP/عضو في N ساعات." levenshtein_distance_spammer_emails: "عند ربط رسائل البريد الإلكتروني spammer، الأرقام والحروف تختلف التي ستبقى تسمح بربط غامض." @@ -1234,6 +1268,7 @@ ar: default_other_external_links_in_new_tab: "افتح الرّوابط الخارجيّة في ألسنة جديدة افتراضيًّا." default_other_enable_quoting: "فعل إقتباس الردود لتحديد النص إفتراضيا." default_other_dynamic_favicon: "إعرض عدد المواضيع الجديدة/الحديثة في أيقونة المتصفح إفتراضيا." + default_other_skip_new_user_tips: "تخطي نصائح وتهيئة المستخدم الجديد والشارات." default_other_like_notification_frequency: "اجعل تنبيه الأعضاء بالإعجابات الجديدة افتراضي. " default_topics_automatic_unpin: "تلقائياً قم إزالة تثبيت المواضيع عندما يصل العضو إلى الأسفل \"إفتراضيا\"." default_categories_watching: "قائمة الأقسام المضبوطة إفتراضيا علي الوضع \"مُراقب\"." @@ -1263,6 +1298,11 @@ ar: category: "الأقسام" topic: "نتائج " user: "مستخدمين " + results_page: "نتائج البحث عن ”%{term}“" + discourse_connect: + not_found: "تعذّر العثور على الحساب. رجاء تواصل مع مدير الموقع." + unknown_error: "ثمّة مشكلة بالحساب. رجاء تواصل مع مدير الموقع." + timeout_expired: "انتهت مهلة جلسة الولوج، رجاء جرّب الولوج ثانيةً." original_poster: "الكاتب الأصلي" most_posts: "معظم المشاركات" most_recent_poster: "معظم المشاركات الاخيرة " @@ -1323,6 +1363,12 @@ ar: autoclosed_disabled: "تم فتح هذا الموضوع الان ويسمح باضافة ردود جديدة " autoclosed_disabled_lastpost: "تم فتح هذا الموضوع الان ويسمح باضافة ردود جديدة " login: + security_key_description: "عند تجهيز مفتاح الأمان المادي، اضغط على زر المصادقة باستخدام مفتاح الأمان أدناه." + security_key_alternative: "جرب طريقة أخرى" + security_key_authenticate: "المصادقة باستخدام مفتاح الأمان" + security_key_not_allowed_error: "انتهت مهلة عملية تسجيل مفتاح الأمان أو تم إلغاؤها." + security_key_no_matching_credential_error: "لا يمكن العثور على بيانات اعتماد مطابقة في مفتاح الأمان المقدم." + security_key_support_missing_error: "جهازك الحالي أو متصفحك لا يدعم استخدام مفاتيح الأمان. يرجى استخدام طريقة مختلفة." not_approved: "لم تتم عملية الموافقة على حسابك حتى الآن. سيتم إعلامك عبر البريد الإلكتروني الخاص بك عندما يكون حسابك جاهزًا لتسجيل الدخول." incorrect_username_email_or_password: "اسم المستخدم او كلمة المرور او البريد الالكتروني غير صحيح" wait_approval: "شكرًا على التسجيل. سيتم إبلاغك عندما تتم عملية الموافقة على حسابك." @@ -1341,6 +1387,10 @@ ar: email_too_long: "عنوان البريد الإلكترونيّ الذي قدّمته طويل جدًّا. لا يجب أن يزيد طول أسماء صناديق البريد على 254 محرفًا، ولا يجب أن يزيد طول أسماء النّطاقات على 253 محرفًا." reserved_username: "اسم المستخدم ذلك غير مسموح." missing_user_field: "لم تُكمل كافة الحقول المطلوبة " + second_factor_title: "الاستيثاق بخطوتين" + second_factor_backup_description: "الرجاء إدخال أحد الرموز الاحتياطية الخاصة بك:" + second_factor_toggle: + backup_code: "استخدام رمز النسخ الاحتياطي بدلاً من ذلك" admin: email: sent_test: "أُرسلت!" @@ -1383,6 +1433,8 @@ ar: post_hidden: title: "المشاركة مخفية" subject_template: "المشاركة مخفية بتصويت الاعضاء" + queued_by_staff: + title: "المنشور يحتاج موافقة" welcome_user: title: "ترحيب المستخدم" subject_template: "مرحبا بك في %{site_name}!" @@ -1488,6 +1540,8 @@ ar: subject_template: "حسابك الجديد [%{email_prefix}]" confirm_new_email: subject_template: "أكّد عنوان بريد الإلكتروني الجديد %{email_prefix}" + confirm_new_email_via_admin: + subject_template: "أكّد عنوان بريد الإلكتروني الجديد %{email_prefix}" confirm_old_email: subject_template: "أكّد عنوان بريد الإلكتروني الحالي %{email_prefix}" confirm_old_email_add: @@ -1496,6 +1550,8 @@ ar: subject_template: "عنوان بريد الإلكتروني تم تغييرة %{email_prefix}" signup_after_approval: subject_template: "قد وافقت على %{site_name}!" + post_approved: + title: "حصلت مشاركتك على الموافقة" page_not_found: popular_topics: "نَشط" recent_topics: "الأحدث" @@ -1540,6 +1596,7 @@ ar: sender_body_blank: "محتوى فارغ " color_schemes: base_theme_name: "قاعدة" + default_theme_name: "المبدئي" edit_this_page: "تعديل هذه الصفحة" csv_export: boolean_yes: "نعم" @@ -1817,6 +1874,8 @@ ar: title: "الأوسمة" finish_installation: congratulations: "تهانينا على تثبيت دسكورس!" + register: + button: "تسجيل" resend_email: title: "اعد ارسال رسالة التفعيل" wizard: @@ -1825,12 +1884,27 @@ ar: title: "الإسم" privacy: title: "صلاحية" + fields: + privacy: + choices: + open: + label: "عامة" + restricted: + label: "خاص" contact: fields: contact_email: placeholder: "name@example.com" + contact_url: + placeholder: "https://www.example.com/contact-us" corporate: title: "منظمات" + colors: + title: "الألوان" + fonts: + fields: + font_preview: + label: "معاينة" icons: title: "أيقونة" homepage: @@ -1847,6 +1921,8 @@ ar: label: "أقسام ذات مواضيع مُميزة" categories_and_latest_topics: label: "الأقسام والمواضيع الأخيرة" + categories_and_top_topics: + label: "التصنيفات و أفضل المواضيع" invites: title: "ادعو للانظمام الى الطاقم" finished: @@ -1860,10 +1936,25 @@ ar: replied: 'ردّ %{username} عليك في "%{topic}" - %{site_title}' posted: 'نشر %{username} في "%{topic}" - %{site_title}' linked: '%{username} وضع رابطا لمنشورك في "%{topic}" - %{site_title}' + watching_first_post: 'فتح %{username} موضوعًا جديدًا: ”%{topic}“ -‏ %{site_title}' + confirm_title: "فُعّلت الإخطارات - %{site_title}" + staff_action_logs: + api_key: + revoked: سُحب reviewables: + priorities: + low: "منخفض" + medium: "متوسّطة" + high: "عالية" + sensitivity: + low: "منخفض" + medium: "متوسّطة" + high: "عالية" actions: agree_and_suspend: title: "عضو موقوف" + agree_and_silence: + title: "كتم المستخدم" delete_spammer: title: "احذف ناشر السبام" delete_single: diff --git a/config/locales/server.be.yml b/config/locales/server.be.yml index 9f3b424817342..90d727e1e69fd 100644 --- a/config/locales/server.be.yml +++ b/config/locales/server.be.yml @@ -39,6 +39,7 @@ be: title: "гаворка" topics: "тэмы" posts: "паведамленняў" + views: "прагляды" loading: "загрузка" powered_by_html: 'Працуе на Discourse. Не выключай JavaScript, боўдзіла.' sign_up: "рэгістрацыя" @@ -144,6 +145,8 @@ be: conflicting_google_user_id: 'Google Account ID для гэтага ўліковага запісу змяніўся; ўмяшанне персаналу патрабуецца па меркаваннях бяспекі.
Калі ласка, звяжыцеся з супрацоўнікамі і накіруйце іх да https://meta.discourse.org/t/76575' invite: confirm_email: "

Вы амаль скончылі! Мы даслалі ліст з кодам актывацыі на ваш адрас электроннай пошты.

Калі ласка, прытрымлівайцеся дасланым інструкцыям для актывацыі акаўнта.

" + disabled_errors: + invalid_access: "Вы не дазваляецца праглядаць запытаны рэсурс." bulk_invite: file_should_be_csv: "Загружаны файл павінен мець фармат CSV." error: "Была памылка загрузкі гэтага файла. Калі ласка паспрабуйце зноў пазней." @@ -205,6 +208,11 @@ be: page_num: "Старонка %{num}" home_title: "дома" topics_in_category: "Тэмы ў '%{category}' катэгорыі" + rss_num_posts: + one: "%{count} запіс" + few: "%{count}запісаў" + many: "%{count}запісаў" + other: "%{count}запісаў" read_full_topic: "Чытаць тэму цалкам" private_message_abbrev: "Паведамленне" rss_description: @@ -353,6 +361,9 @@ be: uncategorized_parent: "Без не можа мець бацькоўскую катэгорыю" self_parent: "Бацька падкатэгорыі не можа быць самім сабой" depth: "Вы не можаце укладваць падкатэгорыя пад іншым" + invalid_email_in: "'%{email}' не з'яўляецца дапушчальным адрасам электроннай пошты." + email_already_used_in_group: "'%{email}' ужо выкарыстоўваецца групай '%{group_name}'." + email_already_used_in_category: "'%{email}' ужо выкарыстоўваецца ў катэгорыі '%{category_name}'." description_incomplete: "Апісанне катэгорыі пост павінен мець па крайняй меры адзін пункт." disallowed_topic_tags: "Гэтая тэма мае тэгі не дазволеныя гэтай катэгорыяй: '%{tags}'" cannot_delete: @@ -396,11 +407,33 @@ be: datetime: distance_in_words: half_a_minute: "<1 хв" + less_than_x_minutes: + one: "< %{count}хв" + few: "< %{count}хв" + many: "< %{count}хв" + other: "< %{count}хв" + x_minutes: + one: "%{count}хв" + few: "%{count}хв" + many: "%{count}хв" + other: "%{count}хв" distance_in_words_verbose: half_a_minute: "толькі што" less_than_x_seconds: "толькі што" + about_x_hours: + one: "0%{count}:00 таму" + few: "гадзін таму: %{count}" + many: " %{Count} гадзін таму" + other: " %{Count} гадзін таму" + x_days: + one: "%{count} дзень таму" + few: "дзён таму: %{count}" + many: "%{Count} дзён таму" + other: " %{Count} дзён таму" password_reset: choose_new: "Абярыце новы пароль" + choose: "% Менш, чым {лік} хвілін таму........................................................." + save: "ўсталяваць пароль" title: "скінуць пароль" user_auth_tokens: browser: @@ -648,8 +681,10 @@ be: description: "Колькасць карыстальнікаў, якія спадабаліся або вывешаныя ў апошні дзень." profile_views: title: "Прагляды профілю карыстальніка" + xaxis: "дзень" topics: title: "тэмы" + xaxis: "дзень" yaxis: "Колькасць новых тэм" description: "Новыя тэмы створаны ў гэты перыяд." posts: @@ -716,6 +751,10 @@ be: system_private_messages: title: "сістэма" xaxis: "дзень" + yaxis: "Колькасць паведамленняў" + moderator_warning_private_messages: + xaxis: "дзень" + yaxis: "Колькасць паведамленняў" notify_moderators_private_messages: title: "Паведаміць мадэратарам" xaxis: "дзень" @@ -895,6 +934,8 @@ be: show_pinned_excerpt_mobile: "Паказаць ўрывак на ўскладалі тэмы ў мабільным рэжыме." show_pinned_excerpt_desktop: "Паказаць ўрывак на ўскладалі тэмы з улікам працоўнага стала." post_onebox_maxlength: "Максімальная даўжыня oneboxed дыскурсу паста у знаках." + blocked_onebox_domains: "Спіс даменаў, якія ніколі не будуць oneboxed." + allowed_inline_onebox_domains: "Спіс даменаў, якія будуць oneboxed ў мініятурным выглядзе, калі звязаныя без назвы" max_oneboxes_per_post: "Максімальную колькасць у раздзелах Onebox пасады." logo: "Малюнак лагатыпа ў левым верхнім куце сайта. Выкарыстоўвайце шырокае прамавугольнае малюнак з вышынёй 120 і суадносінамі бакоў больш, чым 3: 1. Калі пакінуць пустым, то назва сайта будзе паказаны тэкст." logo_small: "Невялікі лагатып малюнак у левым верхнім куце сайта, відаць пры прагортцы ўніз. Выкарыстоўвайце квадрат 120 × 120 малюнак. Калі пакінуць пустым, дом глиф будзе паказаны." @@ -935,6 +976,8 @@ be: post_undo_action_window_mins: "Колькасць хвілін карыстальнікаў дазволена адмяніць апошнія дзеянні на пасадзе (напрыклад, сцяг, і г.д.)." pending_users_reminder_delay: "Апавяшчаць мадэратараў, калі новыя карыстальнікі чакалі адабрэння даўжэй, чым гэта шмат гадзін. Усталюйце на -1, каб адключыць паведамлення." maximum_session_age: "Карыстальнік будзе заставацца ў сістэме для рускіх гадзін з моманту апошняга наведвання" + blocked_ip_blocks: "Спіс прыватных IP-блокаў, якія ніколі не павінны сканіравацца дыскурсе" + allowed_internal_hosts: "Спіс ўнутраных хастоў, дыскурс можа бяспечна паўзці для oneboxing і іншых мэтаў" allowed_iframes: "Спіс прэфіксаў дамена IFrame Src Дыскурс можа бяспечна дазволіць у паведамленнях" slow_down_crawler_user_agents: "Агенты карыстальнікаў вэб-робатаў, якія павінны быць абмежаваныя ў хуткасці robots.txt з дапамогай дырэктывы Crawl затрымкі" slow_down_crawler_rate: "Калі slow_down_crawler_user_agents паказаны гэтая стаўка будзе прымяняцца да ўсіх сканэра (колькасць секунд затрымкі паміж запытамі)" @@ -964,6 +1007,8 @@ be: email_token_valid_hours: "Забыліся на пароль" enable_badges: "Уключыць сістэму жэтона" enable_whispers: "Дазволіць супрацоўнік асабістых зносін у рамках тэмы." + blocked_email_domains: "Труба косак спіс паштовых даменаў, якія не могуць рэгістраваць ўліковыя запісы с. Прыклад: mailinator.com | trashmail.net" + allowed_email_domains: "Труба косак спіс паштовых даменаў, якія карыстальнікі павінны зарэгістраваць рахунку. УВАГА: Карыстальнікі з электроннымі, выдатнымі ад пералічаных даменаў не будуць дазволеныя!" hide_email_address_taken: "Не інфармаваць карыстальнікаў аб тым, што уліковы запіс існуе з паказаным адрасам электроннай пошты пры рэгістрацыі і ад формы забыліся пароль." log_out_strict: "Пры ўваходзе ў сістэму з, выйдзіце з усіх сеансаў для карыстальніка на ўсіх прыладах" version_checks: "Ping Дыскурс канцэнтратар для абнаўлення версій і паказаць новыя версіі паведамленняў на старонцы , za najbolje sučelje uključiti JavaScript' sign_up: "Registruj se" @@ -50,6 +51,8 @@ bs_BA: remove_posts_deleted_by_author: "Izbrisan od strane autora" redirect_warning: "Nismo bili u stanju da verifikujemo da je link koji ste označili zapravo bio objavljen na forumu. Ukoliko u svakom slučaju želite da nastavite dalje, označite link ispod." on_another_topic: "Na drugu temu" + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} od %{username}" themes: bad_color_scheme: "Ne može se ažurirati tema, nevažeća paleta boja" other_error: "Nešto je krenulo loše pri ažuriranju izgleda teme." @@ -155,9 +158,14 @@ bs_BA: next_page: "next page →" prev_page: "← previous page" page_num: "Page %{num}" + home_title: "Naslovnica" topics_in_category: "Topics in the '%{category}' category" rss_posts_in_topic: "RSS feed of '%{topic}'" rss_topics_in_category: "RSS feed of topics in the '%{category}' category" + rss_num_posts: + one: "%{count} objava" + few: "%{count} objave" + other: "%{count} objava" read_full_topic: "Read full topic" private_message_abbrev: "PM" rss_description: @@ -168,6 +176,7 @@ bs_BA: reminders: at_desktop: "Sljedeći put sam za svojim desktop kompjuterom" later_today: "Danas" + next_business_day: "Sljedeći radni dan" tomorrow: "Sutra" next_week: "Sljedeće sedmice" next_month: "Sljedeći mjesec" @@ -183,6 +192,11 @@ bs_BA: trust_level_2: "trust_level_2" trust_level_3: "trust_level_3" trust_level_4: "trust_level_4" + education: + until_posts: + one: "%{count} objava" + few: "%{count} objave" + other: "%{count} objava" activerecord: attributes: category: @@ -247,6 +261,14 @@ bs_BA: datetime: distance_in_words: half_a_minute: "< 1m" + less_than_x_seconds: + one: "< %{count}s" + few: "< %{count}s" + other: "< %{count}s" + x_seconds: + one: "%{count}s" + few: "%{count}s" + other: "%{count}s" less_than_x_minutes: one: "< %{count}m" few: "< %{count}m" @@ -255,6 +277,34 @@ bs_BA: one: "%{count}m" few: "%{count}m" other: "%{count}m" + about_x_hours: + one: "%{count}h" + few: "%{count}h" + other: "%{count}h" + x_days: + one: "%{count}d" + few: "%{count}d" + other: "%{count}d" + about_x_months: + one: "%{count} mjeseci" + few: "%{count} mjeseca" + other: "%{count} mjeseci" + x_months: + one: "%{count} mjeseci" + few: "%{count} mjeseca" + other: "%{count} mjeseci" + about_x_years: + one: "%{count} god." + few: "%{count} god." + other: "%{count} god." + over_x_years: + one: "> %{count} god." + few: "> %{count} god." + other: "> %{count} god." + almost_x_years: + one: "%{count} god." + few: "%{count} god." + other: "%{count} god." distance_in_words_verbose: half_a_minute: "just now" less_than_x_seconds: "upravo sada" @@ -262,6 +312,14 @@ bs_BA: one: "Pred %{count} sat" few: "Pred par sati" other: "Pred %{count} sata" + x_days: + one: "prije %{count} dan" + few: "Prije par dana " + other: "prije %{count} dana" + x_months: + one: "prije %{count} mjesec" + few: "prije %{count} mjeseca" + other: "prije %{count} mjeseci" password_reset: choose_new: "Izaberite novu šifru" choose: "Izaberite šifru" @@ -308,6 +366,8 @@ bs_BA: description: "Lajkuj ovaj post" short_description: "Lajkuj ovaj post" user_activity: + no_bookmarks: + self: "Nemate zabilježene postove; zabilješke omogućuju brzo pozivanje na određene postove." no_replies: others: "Nema odgovora." topic_flag_types: @@ -347,8 +407,10 @@ bs_BA: every_month: "svaki mjesec" every_six_months: "svakih šest mjeseci" user_api_key: + read: "čitaj" otp_confirmation: confirm_title: Nastavi ka %{site_name} + logging_in_as: Prijavite se kao %{username} confirm_button: Završi prijavu reports: default: @@ -406,6 +468,7 @@ bs_BA: title: "Likes" xaxis: "Day" yaxis: "Number of new likes" + description: "Number of new likes." flags: title: "Flags" xaxis: "Day" @@ -418,6 +481,7 @@ bs_BA: title: "Users per Trust Level" xaxis: "Trust Level" yaxis: "Number of Users" + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: xaxis: "Tip" yaxis: "Number of Users" @@ -594,6 +658,8 @@ bs_BA: redirect_users_to_top_page: "Automatically redirect new and long absent users to the top page." email_token_valid_hours: "Forgot password / activate account tokens are valid for (n) hours." enable_badges: "Enable the badge system" + blocked_email_domains: "A list of email domains that users are not allowed to register accounts with. Example: mailinator.com trashmail.net" + allowed_email_domains: "A list of email domains that users MUST register accounts with. WARNING: Users with email domains other than those listed will not be allowed!" new_version_emails: "Send an email to the contact_email address when a new version of Discourse is available." invite_expiry_days: "How long user invitation keys are valid, in days" login_required: "Require authentication to read content on this site, disallow anonymous access." @@ -624,6 +690,7 @@ bs_BA: purge_deleted_uploads_grace_period_days: "Grace period (in days) before a deleted upload is erased." enable_s3_uploads: "Place uploads on Amazon S3 storage. IMPORTANT: requires valid S3 credentials (both access key id & secret access key)." s3_upload_bucket: "The Amazon S3 bucket name that files will be uploaded into. WARNING: must be lowercase, no periods." + selectable_avatars: "Popis avatara koje korisnici mogu izabrati." default_invitee_trust_level: "Default trust level (0-4) for invited users." default_trust_level: "Default trust level (0-4) for all new users." tl1_requires_topics_entered: "How many topics a new user must enter before promotion to trust level 1." @@ -655,6 +722,7 @@ bs_BA: body_min_entropy: "The minimum entropy (unique characters, non-english count for more) required for a post body." min_title_similar_length: "The minimum length of a title before it will be checked for similar topics." category_colors: "A list of hexadecimal color values allowed for categories." + dark_mode_none: "Ništa" max_attachment_size_kb: "The maximum attachment files upload size in kB. This must be configured in nginx (client_max_body_size) / apache or proxy as well." authorized_extensions: "A list of file extensions allowed for upload (use '*' to enable all file types)" max_similar_results: "How many similar topics to show above the editor when composing a new topic. Comparison is based on title and body." @@ -671,6 +739,7 @@ bs_BA: faq_url: "If you have a FAQ hosted elsewhere that you want to use, provide the full URL here." tos_url: "If you have a Terms of Service document hosted elsewhere that you want to use, provide the full URL here." privacy_policy_url: "If you have a Privacy Policy document hosted elsewhere that you want to use, provide the full URL here." + allowed_spam_host_domains: "A list of domains excluded from spam host testing. New users will never be restricted from creating posts with links to these domains." levenshtein_distance_spammer_emails: "When matching spammer emails, number of characters difference that will still allow a fuzzy match." min_ban_entries_for_roll_up: "Kada kliknete tipku Roll up, stvorit ćete novi unos za subnet ban ako ima najmanje (N) unosa." reply_by_email_enabled: "Enable replying to topics via email." @@ -747,6 +816,7 @@ bs_BA: security_key_authenticate: "Prijava pomoću sigurnosnog ključa" security_key_not_allowed_error: "Ovaj proces prijave pomoću sigurnosnog ključa je ili vremenski istekao ili je odkazan." security_key_no_matching_credential_error: "Nisu pronađeni korisnički podatci koristeći navedeni sigurnosni ključ." + security_key_support_missing_error: "Vaš trenutni uređaj ili preglednik ne podržava korištenje sigurnosnih ključeva. Molimo koristite drugačiju metodu." not_approved: "Your account hasn't been approved yet. You will be notified by email when you are ready to log in." incorrect_username_email_or_password: "Netačan nadimak, email ili šifra" wait_approval: "Hvala vam što ste se prijavili. We will notify you when your account has been approved." @@ -764,6 +834,8 @@ bs_BA: missing_user_field: "You have not completed all the user fields" click_to_continue: "Klikni ovdje da nastavite dalje" second_factor_backup_description: "Molim ukucajte jedan od vaši rezevni kodova" + second_factor_toggle: + backup_code: "Umjesto toga koristite sigurnosni kod" admin: email: sent_test: "sent!" @@ -790,10 +862,14 @@ bs_BA: ignored: "Thanks for letting us know. We're looking into it." ignored_and_deleted: "Thanks for letting us know. We've removed the post." system_messages: + queued_by_staff: + title: "Post treba odobrenje" welcome_user: subject_template: "Dobrodošli na %{site_name}!" welcome_invite: subject_template: "Dobrodošli na %{site_name}!" + tl2_promotion_message: + subject_template: "Čestitamo na povišenju vašeg nivoa povjerenja!" backup_succeeded: subject_template: "Backup completed successfully" backup_failed: @@ -864,6 +940,8 @@ bs_BA: title: "Postavi šifru" signup_after_approval: subject_template: "You've been approved on %{site_name}!" + post_approved: + title: "Vaš post je odobren" page_not_found: popular_topics: "Popularno" recent_topics: "Nove" @@ -898,6 +976,7 @@ bs_BA: sender_body_blank: "body is blank" color_schemes: base_theme_name: "Base" + default_theme_name: "Uobičajen" edit_this_page: "Edit this page" csv_export: boolean_yes: "Da" @@ -988,8 +1067,16 @@ bs_BA: fields: contact_email: placeholder: "name@example.com" + contact_url: + placeholder: "https://www.example.com/contact-us" corporate: title: "Organizacija" + colors: + title: "Colors" + fonts: + fields: + font_preview: + label: "Pregled" homepage: fields: homepage_style: diff --git a/config/locales/server.ca.yml b/config/locales/server.ca.yml index 8c8e4ea59ecdf..5c840a7995993 100644 --- a/config/locales/server.ca.yml +++ b/config/locales/server.ca.yml @@ -39,6 +39,7 @@ ca: title: "Discourse" topics: "Temes" posts: "publicacions" + views: "vistes" loading: "Carregant" powered_by_html: 'Funciona gràcies a Discourse. Per a una millor experiència visiteu-nos amb JavaScript activat.' sign_up: "Registre" @@ -50,6 +51,8 @@ ca: remove_posts_deleted_by_author: "Suprimit per l'autor" redirect_warning: "No hem pogut comprovar que l'enllaç que heu seleccionat s'hagi enviat al fòrum. Si així i tot voleu continuar, feu clic en l'enllaç següent." on_another_topic: "Sobre un altre tema" + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} per %{username}" themes: bad_color_scheme: "No es pot actualitzar l'aparença, paleta de colors incorrecta" other_error: "S'ha produït un error mentre s'actualitzava l'aparença" @@ -179,6 +182,8 @@ ca: not_found_json: "El testimoni d'invitació no és vàlid. Poseu-vos en contacte amb l'equip responsable." user_exists: "No cal convidar %{email}, ja tenen un compte!" confirm_email: "

Gairebé heu acabat! Hem enviat un missatge d'activació a la vostra adreça de correu. Seguiu les instruccions en el missatge per a activar el compte.

Si no arriba, comproveu la carpeta de correu brossa.

" + disabled_errors: + invalid_access: "No teniu permís per a veure el recurs sol·licitat." bulk_invite: file_should_be_csv: "El fitxer carregat hauria de tenir format CSV." max_rows: "S'han enviat les primeres %{max_bulk_invites} invitacions. Proveu de dividir el fitxer en parts més petites." @@ -281,6 +286,9 @@ ca: topics_in_category: "Temes en la categoria '%{category}' " rss_posts_in_topic: "Sindicació RSS del tema '%{topic}'" rss_topics_in_category: "Sindicació RSS de temes de la categoria '%{category}' " + rss_num_posts: + one: "%{count} publicació" + other: "%{count} publicacions" read_full_topic: "Llegeix tot el tema" private_message_abbrev: "Missatge" rss_description: @@ -307,9 +315,11 @@ ca: bookmarks: reminders: later_today: "Més tard avui" + next_business_day: "El pròxim dia feiner" tomorrow: "Demà" next_week: "La setmana que ve" next_month: "El mes que ve" + custom: "Data i hora personalitzades" groups: success: bulk_add: @@ -975,6 +985,7 @@ ca: labels: level: Nivell description: "Nombre d'usuaris agrupats per nivell de confiança." + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: title: "Usuaris per tipus" xaxis: "Tipus" @@ -1242,6 +1253,8 @@ ca: show_pinned_excerpt_mobile: "Mostra l'extracte en els temes afixats en la vista per a mòbils." show_pinned_excerpt_desktop: "Mostra l'extracte en els temes afixats en la vista d'escriptori." post_onebox_maxlength: "Longitud màxima en caràcters d'una publicació en onebox de Discourse." + blocked_onebox_domains: "Llista de dominis que no es posaran mai en onebox." + allowed_inline_onebox_domains: "Llista de dominis que es mostraran en miniatura 'onebox' si s'enllacen sense títol" max_oneboxes_per_post: "Nombre màxim de onebox en una publicació" logo: "La imatge del logotip a la part superior esquerra del vostre lloc web. Utilitzeu una imatge rectangular ampla amb una alçada de 120 i una relació d'aspecte superior a 3: 1. Si es deixa en blanc, es mostrarà el text del títol del lloc web." logo_small: "Imatge petita del logotip a la part superior esquerra del lloc web, que es veu quan es fa un desplaçament cap avall. Utilitzeu una imatge quadrada de 120 × 120. Si es deixa en blanc, es mostrarà un glif d'estar per casa." @@ -1295,7 +1308,11 @@ ca: maximum_session_age: "L'usuari romandrà amb la sessió iniciada durant n hores des de la darrera visita" enable_escaped_fragments: "Torna a l'API Ajax-Crawling de Google si no es detecta cap rastrejador web. Consulteu https://developers.google.com/webmasters/ajax-crawling/docs/learn-more." cors_origins: "Orígens permesos per a peticions d'origen encreuat (CORS). Cada origen ha d'incloure http:// o https://. La variable DISCOURSE_ENABLE_CORS ha de ser \"true\" per a habilitar CORS." + use_admin_ip_allowlist: "Els administradors sols poden iniciar la sessió des d'una adreça IP definida en la llista d'IPs sota supervisió (Administració > Registres > IPs sota supervisió)." + blocked_ip_blocks: "Una llista de blocs d'IP privades que no han de ser rastrejats mai per Discourse" + allowed_internal_hosts: "Llista d'amfitrions interns que Discourse pot rastrejar de manera segura per a onebox i altres finalitats." allowed_iframes: "Llista dels prefixos de domini en el codi d'iframe que Discourse pot permetre de manera segura en les publicacions" + allowed_crawler_user_agents: "Agents d'usuari dels rastrejadors web als quals es permet accedir al lloc web. ATENCIÓ! ESTABLIR AIXÒ IMPEDIRÀ ACTUAR A TOTS ELS RASTREJADORS NO LLISTATS AQUÍ!" slow_down_crawler_user_agents: "Agents d'usuari dels rastrejadors web que haurien de ser limitats en robots.txt utilitzant la directiva de retard (Crawl-delay)." slow_down_crawler_rate: "Si s'especifica slow_down_crawler_user_agents, aquesta ràtio s'aplicarà a tots els rastrejadors (nombre de segons de retard entre les sol·licituds)." content_security_policy: "Activa Content-Security-Policy (CSP)" @@ -1326,6 +1343,8 @@ ca: enable_badges: "Activa el sistema d'insígnies." enable_whispers: "Permet la comunicació privada de l'equip responsable dins dels temes." allow_index_in_robots_txt: "Especifiqueu en robots.txt que els motors de cerca web poden indexar aquest lloc. En casos excepcionals, podeu substituir robots.txt de manera permanent." + blocked_email_domains: "Llista de dominis de correu delimitada amb barres verticals amb els quals els usuaris no poden registrar comptes. Exemple: mailinator.com|trashmail.net" + allowed_email_domains: "Llista de dominis de correu delimitada amb barres verticals amb els quals els usuaris HAN DE registrar els comptes. ATENCIÓ: Els usuaris amb dominis de correu diferents dels llistats no són autoritzats!" hide_email_address_taken: "No informis els usuaris que hi ha un compte amb una adreça de correu determinada durant el registre i des del formulari de contrasenya oblidada." log_out_strict: "Quan es tanca la sessió, tanca TOTES les sessions de l'usuari en tots els dispositius" version_checks: "Fes ping al Discourse Hub per a actualitzacions de versions i per a mostrar missatges de versió nova en el tauler /admin." @@ -1341,6 +1360,7 @@ ca: min_admin_password_length: "Longitud mínima de la contrasenya per a administrador" password_unique_characters: "Nombre mínim de caràcters únics que ha de tenir una contrasenya." block_common_passwords: "No permetis contrasenyes que siguin de les 10.000 més comunes." + discourse_connect_overrides_bio: "Sobreescriu la biografia d'usuari en el perfil i impedeix que es pugui canviar" enable_local_logins_via_email: "Permet als usuaris sol·licitar un enllaç d'inici de sessió d'un sol clic que se'ls enviarà per correu electrònic." allow_new_registrations: "Permet nous registres d'usuari. Desmarqueu-ho per a evitar que qualsevol pugui crear un compte nou." enable_signup_cta: "Mostra un avís als usuaris anònims que tornin convidant-los a registrar-se amb un compte." @@ -1456,6 +1476,7 @@ ca: min_trust_to_send_messages: "Nivell de confiança mínim necessari per a crear nous missatges personals." min_trust_to_flag_posts: "Nivell de confiança mínim necessari per a marcar amb bandera les publicacions" min_trust_to_post_links: "Nivell de confiança mínim necessari per a incloure enllaços en els missatges" + allowed_link_domains: "Dominis als quals els usuaris poden enllaçar fins i tot si no tenen el nivell de confiança adequat per a publicar enllaços" newuser_max_links: "Quants enllaços pot afegir un usuari nou a una publicació." newuser_max_attachments: "Quants adjunts pot afegir un usuari nou a una publicació" newuser_max_mentions_per_post: "Nombre màxim de mencions a @usuaris que un usuari nou pot usar en una publicació." @@ -1478,6 +1499,7 @@ ca: desktop_category_page_style: "Estil visual per a la pàgina /categories." category_colors: "Llista de valors de color hexadecimal permesos per a categories." category_style: "Estil visual per a insígnies de categoria." + dark_mode_none: "Cap" max_image_size_kb: "Mida màxima de càrrega d'imatge en kB. Cal configurar-ho en nginx (client_max_body_size) / apache o en el proxy també. Les imatges més grans que aquest límit i més petites que client_max_body_size es redimensionaran en la càrrega." max_attachment_size_kb: "Mida màxima de càrrega de fitxers adjunts en kB. Cal configurar-ho en nginx (client_max_body_size) / apache o en el proxy també." authorized_extensions: "Llista d'extensions de fitxer permeses per a carregar (feu servir '*' per a habilitar tota mena de fitxers)" @@ -1505,6 +1527,7 @@ ca: privacy_policy_url: "Si teniu un document de política de privacitat que voleu utilitzar allotjat en un altre lloc, faciliteu l'adreça URL completa aquí." log_anonymizer_details: "Si s'han de mantenir o no els detalls d'un usuari en el registre (log) després de ser anonimitzat. Si compliu amb GDPR, heu de desactivar-ho." newuser_spam_host_threshold: "Quantes vegades un usuari nou pot publicar un enllaç al mateix amfitrió dins de les seves `newuser_spam_host_threshold` publicacions abans de ser considerat brossa." + allowed_spam_host_domains: "Llista de dominis exclosos de la comprovació de brossa. No s'impedirà mai als usuaris nous crear publicacions amb enllaços a aquests dominis." topic_view_duration_hours: "Compta una nova vista de tema una vegada per IP/usuari cada N hores" user_profile_view_duration_hours: "Compta una nova vista de perfil d'usuari una vegada per IP/usuari cada N hores." levenshtein_distance_spammer_emails: "En cercar coincidències de correus brossa, diferència de nombre de caràcters que encara permetrà una coincidència difusa (fuzzy match)." @@ -1518,6 +1541,7 @@ ca: min_first_post_typing_time: "Nombre mínim de temps en mil·lisegons que un usuari ha d'escriure durant la primera publicació. Si no s'assoleix el límit, la publicació passarà automàticament a la cua de les que requereixen aprovació. Poseu a 0 per desactivar (no recomanat)." auto_silence_fast_typers_on_first_post: "Silencia automàticament els usuaris que no compleixin min_first_post_typing_time" auto_silence_fast_typers_max_trust_level: "Nivell de confiança sota el qual se silencien automàticament usuaris que escriguin massa de pressa" + auto_silence_first_post_regex: "Expressió regular insensible a les majúscules i minúscules que, si es compleix, silenciarà la primera publicació de l'usuari i l'enviarà a la cua d'aprovació. Exemple: \"enrabia(t|da|ts|des)\" farà que totes les publicacions que continguin \"enrabiat\", \"enrabiada\", \"enrabiats\" o \"enrabiades\" se silenciaran. Solament s'aplica a la primera publicació." reviewable_claiming: "Cal que es reclami el contingut revisable abans que s'hi pugui actuar?" reviewable_default_topics: "Per defecte, mostra el contingut revisable agrupat per temes" reviewable_default_visibility: "No mostris els elements revisables llevat que compleixin aquesta prioritat" @@ -1537,6 +1561,7 @@ ca: max_emails_per_day_per_user: "Nombre màxim de correus per a enviar als usuaris cada dia. 0 per a inhabilitar el límit" enable_staged_users: "Crea automàticament usuaris ficticis en processar correus entrants." maximum_staged_users_per_email: "Nombre màxim d'usuaris ficticis creats en processar un correu entrant." + auto_generated_allowlist: "Llista d'adreces de correu que no es revisaran per a contingut autogenerat. Per exemple: foo@bar.com|discourse@bar.com." block_auto_generated_emails: "Bloca correus entrants identificats com a autogenerats." ignore_by_title: "Ignora els correus entrants segons el títol." mailgun_api_key: "Clau API secreta de Mailgun emprada per a verificar els missatges webhook." @@ -1607,6 +1632,7 @@ ca: ignored_users_message_gap_days: "Quant de temps haureu d'esperar abans de notificar de nou als moderadors sobre un usuari ignorat per molts altres." clean_up_inactive_users_after_days: "Nombre de dies abans d'eliminar un usuari inactiu (nivell de confiança 0 sense publicacions). Per a desactivar la neteja, poseu 0." user_selected_primary_groups: "Permet als usuaris configurar el seu propi grup principal" + allowed_user_website_domains: "El lloc web de l'usuari serà verificat contra aquests dominis. Llista delimitada amb barres verticals." allow_profile_backgrounds: "Permet que els usuaris carreguin fons de perfil." sequential_replies_threshold: "Nombre de publicacions seguides que un usuari ha de fer en un tema abans de ser advertit de fer massa respostes seqüencials." get_a_room_threshold: "Nombre de publicacions que un usuari ha de fer al mateix usuari en el mateix tema abans de ser advertit." @@ -1641,6 +1667,7 @@ ca: embed_topics_list: "Permet incrustació HTML de llistes de temes" embed_truncate: "Trunca les publicacions incrustades." embed_support_markdown: "Admet el format de Markdown per a les publicacions incrustades." + allowed_embed_selectors: "Llista separada per comes d'elements CSS permesos en les incrustacions." allowed_href_schemes: "Esquemes permesos en enllaços a més de http i https." embed_post_limit: "Nombre màxim de publicacions que s'incrusten." embed_username_required: "Cal un nom d'usuari per a crear un tema." @@ -1757,8 +1784,14 @@ ca: max_username_length_exists: "No podeu establir la longitud màxima del nom d'usuari per sota del nom d'usuari més llarg (%{username})." max_username_length_range: "No podeu definir el màxim per sota del mínim." invalid_hex_value: "Els valors de color han de ser codis hexadecimals de 6 dígits." + allowed_unicode_usernames: + regex_invalid: "L'expressió regular no és vàlida: %{error}" + leading_trailing_slash: "L'expressió regular no ha de començar ni acabar amb una barra inclinada." unicode_usernames_avatars: "Els avatars de sistema interns no admeten noms d'usuari amb caràcters Unicode." list_value_count: "La llista ha de contenir exactament %{count} valors." + placeholder: + discourse_connect_provider_secrets: + key: "www.example.com" search: extreme_load_error: "El lloc web està sota una càrrega extrema, la cerca està desactivada, torneu-ho a provar més tard." within_post: "#%{post_number} per %{username}" @@ -1769,6 +1802,14 @@ ca: results_page: "Resultats de la cerca per a '%{term}'" audio: "[àudio]" video: "[vídeo]" + discourse_connect: + login_error: "Error d'inici de sessió" + not_found: "No s'ha trobat el vostre compte. Contacteu amb l'administrador del lloc web." + account_not_approved: "El vostre compte està pendent d'aprovació. Rebreu un correu d'avís quan sigui aprovat." + unknown_error: "Hi ha un problema amb el vostre compte. Contacteu amb l'administrador del lloc web." + timeout_expired: "La connexió del compte ha caducat. Torneu-ho a provar." + no_email: "No s'ha proporcionat cap adreça de correu electrònic. Poseu-vos en contacte amb l'administrador del lloc web." + email_error: "No s'ha pogut registrar un compte amb l'adreça %{email}. Poseu-vos en contacte amb l'administrador del lloc web." original_poster: "Autor original" most_posts: "La majoria de publicacions" most_recent_poster: "Qui ha publicat més recentment" @@ -2010,6 +2051,8 @@ ca: title: "Publicació amagada una altra vegada" subject_template: "Publicació amagada per les banderes de la comunitat. S'ha notificat l'equip responsable. " text_body_template: "Bon dia, \n\nAixò és un missatge automàtic de %{site_name} per a fer-vos saber que la vostra publicació ha estat amagada de nou. \n\n<%{base_url}%{url}>\n\n%{flag_reason} \n\nDiversos membres de la comunitat han marcat amb bandera aquesta publicació i ara és amagada. **Atès que la publicació ha estat amagada més d'una vegada, romandrà amagada fins que no sigui revisada per un membre de l'equip responsable.** \n\nPer a obtenir més informació, consulteu les nostres [directrius comunitàries](%{base_url}/guidelines).\n" + queued_by_staff: + title: "Cal aprovar la publicació" flags_disagreed: title: "Publicació marcada amb bandera restablerta per l'equip responsable" subject_template: "Publicació marcada amb bandera restablerta per l'equip responsable" @@ -2044,6 +2087,8 @@ ca: title: "Benvingut convidat" subject_template: "Benvingut a %{site_name}!" text_body_template: "Gràcies per acceptar la invitació a %{site_name}. Benvingut!\n\n- Us hem creat el compte **%{username}**. Canvieu el nom o la contrasenya visitant [el perfil d'usuari][prefs]. \n\n- Quan inicieu sessió, **utilitzeu la mateixa adreça de correu de la invitació original**. En cas contrari, no podrem dir que sou vós. \n\n%{new_user_tips} \n\nCreiem en un [comportament civilitzat de la comunitat](%{base_url}/guidelines) en tot moment. Gaudiu de l'estada!\n\n[prefs]: %{user_preferences_url}\n" + tl2_promotion_message: + subject_template: "Enhorabona per la vostra promoció de nivell de confiança!" backup_succeeded: title: "Còpia de seguretat reeixida" subject_template: "Còpia de seguretat completada amb èxit" @@ -2553,6 +2598,9 @@ ca: confirm_new_email: title: "Confirmeu l'adreça de correu nova" subject_template: "[%{email_prefix}] Confirmeu la vostra nova adreça de correu" + confirm_new_email_via_admin: + title: "Confirmeu l'adreça de correu nova" + subject_template: "[%{email_prefix}] Confirmeu la vostra nova adreça de correu" confirm_old_email: title: "Confirmeu l'adreça de correu antiga" subject_template: "[%{email_prefix}] Confirmeu la vostra adreça de correu actual" @@ -2579,6 +2627,8 @@ ca: title: "Notificació d'inici de sessió nou" subject_template: "[%{site_name}] Inici de sessió nou des de %{location}" text_body_template: "Bon dia, \n\nHem notat un inici de sessió des d'un dispositiu o una ubicació que normalment no utilitzeu. Heu estat vós? \n\n- Ubicació: %{location} (%{client_ip}) \n- Navegador: %{browser} \n- Dispositiu: %{device} - %{os} \n\nSi heu estat vós, perfecte! No cal fer res més. \n\nSi no heu estat vós, [reviseu les vostres sessions existents](%{base_url}/my/preferences/account) i considereu canviar la contrasenya.\n" + post_approved: + title: "La vostra publicació ha estat aprovada" page_not_found: title: "Ai! Aquesta pàgina no existeix o és privada." popular_topics: "Populars" @@ -2651,6 +2701,7 @@ ca: latte: "Latte" summer: "Estiu" dark_rose: "Rosa fosc" + default_theme_name: "Per defecte" light_theme_name: "Clar" dark_theme_name: "Fosc" neutral_theme_name: "Neutre" @@ -3036,6 +3087,12 @@ ca: city_for_disputes: label: "Ciutat per a les disputes" placeholder: "San Francisco, Califòrnia" + colors: + title: "Colors" + fonts: + fields: + font_preview: + label: "Previsualitza" logos: title: "Logos" fields: @@ -3127,6 +3184,7 @@ ca: trust_level: "Les respostes dels usuaris amb nivells baixos de confiança han de ser aprovades per l'equip responsable. Vegeu `approve_unless_trust_level`." new_topics_unless_trust_level: "Els temes dels usuaris amb nivells baixos de confiança han de ser aprovats per l'equip responsable. Vegeu `approve_new_topics_unless_trust_level`." fast_typer: "Un usuari nou ha escrit la seva primera publicació sospitosament de pressa. És un comportament sospitós de bot o de generador de brossa. Vegeu `min_first_post_typing_time`." + auto_silence_regexp: "Usuari nou el primer missatge del qual coincideix amb el paràmetre `auto_silence_first_post_regex`." staged: "Els temes i les publicacions noves per a usuaris ficticis han de ser aprovats per l'equip responsable. Vegeu `approve_unless_staged`." category: "Les publicacions d'aquesta categoria requereixen l'aprovació manual de l'equip responsable. Vegeu la configuració de la categoria." must_approve_users: "Tots els usuaris nous han de ser aprovats per l'equip responsable. Vegeu `must_approve_users`." diff --git a/config/locales/server.cs.yml b/config/locales/server.cs.yml index a6d1b32c43f96..e41b539e301ab 100644 --- a/config/locales/server.cs.yml +++ b/config/locales/server.cs.yml @@ -15,6 +15,7 @@ cs: short_no_year: "%-d. %B" date_only: "%-d %B %Y" long: "%B %-d, %Y, %l:%M%P" + no_day: "%B %Y" date: month_names: - null @@ -38,6 +39,7 @@ cs: title: "Discourse" topics: "Témata" posts: "příspěvky" + views: "zobrazení" loading: "Nahrávám" powered_by_html: 'Systém běží na Discourse, nejlépe funguje se zapnutým JavaScriptem' sign_up: "Registrovat se" @@ -47,6 +49,8 @@ cs: disable_remote_images_download_reason: "Stahování obrázků z cizích serverů bylo vypnuto protože na disku není dostatek místa." anonymous: "Anonymní" remove_posts_deleted_by_author: "Smazáno autorem" + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} od %{username}" themes: other_error: "Něco se pokazilo při aktualizaci skinu (theme)" emails: @@ -125,6 +129,8 @@ cs: s3_upload_bucket_is_required: "Nemůžete nahrávat na S3 dokud nezadáte 's3_upload_bucket'." invite: user_exists: "Netřeba posílat pozvánku na %{email}. Tento email je veden u tohoto účtu!" + disabled_errors: + invalid_access: "Nemáte oprávnění na zobrazení požadovaného zdroje." bulk_invite: file_should_be_csv: "Nahraný soubor by měl být ve formátu csv." error: "Nastala chyba při nahrávání souboru. Prosím opakujte akci později." @@ -162,6 +168,11 @@ cs: permalink: "Permalink" imported_from: "Diskuze k původnímu příspěvku na blogu: %{link}" in_reply_to: "▶ %{username}" + replies: + one: "%{count} odpověď" + few: "%{count} odpovědí" + many: "%{count} odpovědí" + other: "%{count} odpovědí" created: "Vytvořený" no_mentions_allowed: "Bohužel, nemůžete zmiňovat ostatní uživatele." too_many_mentions: @@ -203,6 +214,11 @@ cs: topics_in_category: "Témata v kategorii '%{category}'" rss_posts_in_topic: "RSS feed tématu '%{topic}'" rss_topics_in_category: "RSS feed témat z kategorie '%{category}'" + rss_num_posts: + one: "Je zobrazen pouze %{count} příspěvek" + few: "Jsou zobrazeny pouze %{count} příspěvky" + many: "Je zobrazeno pouze %{count} příspěvků" + other: "Je zobrazeno pouze %{count} příspěvků" read_full_topic: "Číst celé téma" private_message_abbrev: "Msg" rss_description: @@ -228,9 +244,11 @@ cs: bookmarks: reminders: later_today: "Později během dnešního dne" + next_business_day: "Následující pracovní den" tomorrow: "Zítra" next_week: "Další týden" next_month: "Další měsíc" + custom: "Vlastní datum a čas" groups: errors: can_not_modify_automatic: "Nelze měnit automatické skupiny" @@ -560,6 +578,7 @@ cs: short_description: "Tento příspěvek se mi líbí" user_activity: no_bookmarks: + self: "Nemáte žádné záložky; záložky vám umožňují rychle odkazovat na konkrétní příspěvky." others: "Žádné záložky." no_likes_given: self: "Zatím se ti nelíbil žádný příspěvek." @@ -599,6 +618,7 @@ cs: every_month: "každý měsíc" every_six_months: "každých šest měsíců" user_api_key: + read: "přečteno" otp_confirmation: confirm_title: Pokračovat na %{site_name} scopes: @@ -611,12 +631,14 @@ cs: day: Den post_edits: labels: + edited_at: Datum post: Příspěvek editor: Editor edit_reason: Reason user_flagging_ratio: labels: user: Uživatel + score: Skóre moderators_activity: labels: moderator: Moderátor @@ -672,6 +694,7 @@ cs: title: "Uživatelé podle věrohodnosti" xaxis: "Věrohodnost" yaxis: "Počet uživatelů" + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: title: "Uživatelé podle typu" xaxis: "Typ" @@ -817,6 +840,7 @@ cs: enable_long_polling: "'Message bus' smí používat dlouhé výzvy" anon_polling_interval: "Jak často se mají zasílat výzvy anonymním uživatelům v milisekundách" post_menu: "Určuje, které položky se zobrazí v menu u příspěvku a v jakém pořadí. Příklad: like|edit|flag|delete|share|bookmark|reply" + send_welcome_message: "Poslat všem novým uživatelům uvítací zprávu s rychlým návodem jak začít." enable_badges: "Povolit odznaky" invite_expiry_days: "Platnost uživatelských pozvánek ve dnech" min_password_length: "Minimální povolená délka hesla." @@ -833,6 +857,7 @@ cs: clean_orphan_uploads_grace_period_hours: "Grace period (in hours) before an orphan upload is removed." purge_deleted_uploads_grace_period_days: "Grace period (in days) before a deleted upload is erased." min_trust_to_create_topic: "The minimum trust level required to create a new topic." + dark_mode_none: "Žádná" title_prettify: "Zabrání běžným překlepům a chybám v názvu tématu, včetně psaní velkými písmeny, malé písmeno na začátku, vícenásobné vykřičníky a otazníky, atd." faq_url: "Pokud máte dokument FAQ hostovaný samostatně, napište sem jeho plnou URL." tos_url: "Pokud máte dokument 'Podmínky používání' hostovaný samostatně, napište sem jeho plnou URL." @@ -844,6 +869,8 @@ cs: digest_posts: "Maximální počet populárních příspěvků zařazených do email přehledu." enable_mobile_theme: "Používat na mobilních zařízeních verzi přizpůsobenou pro mobily s možností přejít na plnou verzi. Zruště pokud chcete používat vlastní plně responzivní kaskádový styl." short_progress_text_threshold: "After the number of posts in a topic goes above this number, the progress bar will only show the current post number. If you change the progress bar's width, you may need to change this value." + embed_truncate: "Useknout zabudované příspěvky." + embed_post_limit: "Maximální počet příspěvků k zabudování." tags_sort_alphabetically: "Zobrazit štítky dle abecedy. Standardně jsou setříděny dle popularity." errors: invalid_email: "Neplatná emailová adresa." @@ -884,6 +911,7 @@ cs: something_already_taken: "Nastala chyba při zpracování, zřejmě je dané uživatelské jméno nebo email již zaregistrován. Zkuste odkaz pro obnovení hesla." omniauth_confirm_button: "Pokračovat" click_to_continue: "Pro pokračování klikněte zde." + second_factor_title: "Dvoufaktorové ověření" second_factor_backup_description: "Prosíme zadejte jeden ze svých záložních kódů:" admin: email: @@ -896,6 +924,8 @@ cs: not_allowed: "není povolen od tohoto emailového poskytovatele. Prosím použijte jinou emailovou adresu." blocked: "není povolen." system_messages: + queued_by_staff: + title: "Příspěvek potřebuje schválení" welcome_user: subject_template: "Vítejte na %{site_name}!" text_body_template: | @@ -993,6 +1023,8 @@ cs: sender_message_to_blank: "message.to is blank" sender_text_part_body_blank: "text_part.body is blank" sender_body_blank: "body is blank" + color_schemes: + default_theme_name: "Výchozí" csv_export: boolean_yes: "Ano" boolean_no: "Ne" @@ -1079,6 +1111,8 @@ cs: tags: title: "Tagy" finish_installation: + register: + button: "Registrovat" resend_email: title: "Znovu odeslat aktivační email" wizard: @@ -1100,8 +1134,16 @@ cs: fields: contact_email: placeholder: "jmeno@priklad.cz" + contact_url: + placeholder: "https://www.example.com/contact-us" corporate: title: "Organizace" + colors: + title: "Barvy" + fonts: + fields: + font_preview: + label: "Náhled" logos: title: "Loga" fields: @@ -1143,6 +1185,12 @@ cs: confirm_title: "Upozornění zapnuta - %{site_title}" confirm_body: "Upozornění úspěšně zapnuta." reviewables: + priorities: + medium: "Střední" + high: "Vysoká" + sensitivity: + medium: "Střední" + high: "Vysoká" actions: agree_and_keep: title: "Uchovat příspěvek" diff --git a/config/locales/server.da.yml b/config/locales/server.da.yml index ef6ae36b88740..b822f74fda6ad 100644 --- a/config/locales/server.da.yml +++ b/config/locales/server.da.yml @@ -1684,6 +1684,7 @@ da: embed_topics_list: "Understøt HTML indlejring af emne lister" embed_truncate: "Afkort de indlejrede indlæg." embed_support_markdown: "Support markdown formatering af indlejrede indlæg." + allowed_embed_selectors: "En kommasepareret liste over CSS-elementer, der er tilladt i embeds." embed_post_limit: "Maksimum antal indlæg, der skal indlejres." embed_username_required: "Brugernavnet til oprettelse af emne er påkrævet." notify_about_flags_after: "Hvis der er anmeldelser, der ikke er blevet håndteret efter mange timer, skal der sendes en personlig besked til moderatorer. Sæt til 0 for at deaktivere." @@ -1705,6 +1706,7 @@ da: default_other_external_links_in_new_tab: "Åbn som standard links på et nyt faneblad." default_other_enable_quoting: "Slå som standard \"svar på den markerede tekst\" til." default_other_dynamic_favicon: "Vis som standard nyt / opdateret emnetal på browserikon" + default_other_skip_new_user_tips: "Spring nye bruger-onboarding tips og emblemer over." default_categories_watching: "Liste over kategorier der som standard overvåges." default_categories_tracking: "Liste over kategorier der som standard følges." default_categories_muted: "Liste over kategorier der som standard har tavshed." @@ -1819,8 +1821,12 @@ da: auto_deleted_by_timer: "Automatisk slettet af timeren." login: invalid_second_factor_method: "Den valgte to-faktor-metode er ugyldig." + security_key_description: "Når du har forberedt din fysiske sikkerhedsnøgle, skal du trykke på knappen Godkend med sikkerhedsnøgle nedenfor." security_key_alternative: "Prøv en anden måde" security_key_authenticate: "Godkend med sikkerhedsnøgle" + security_key_not_allowed_error: "Godkendelsesprocessen for sikkerhedsnøgle fik enten timeout eller blev annulleret." + security_key_no_matching_credential_error: "Ingen matchende legitimationsoplysninger kunne findes i den angivne sikkerhedsnøgle." + security_key_support_missing_error: "Din aktuelle enhed eller browser understøtter ikke brugen af sikkerhedsnøgler. Brug en anden metode." not_approved: "Din konto er ikke blevet godkendt endnu. Du vil blive underrettet via e-mail når du er klar til at logge ind." incorrect_username_email_or_password: "Ugyldigt brugernavn, e-mail eller adgangskode" incorrect_password: "Forkert adgangskode" @@ -2924,6 +2930,8 @@ da: %{base_url}/u/activate-account/%{email_token} Hvis ovenstående link ikke kan klikkes på, kan du prøve at kopiere og indsætte det i adresselinjen i din webbrowser. + post_approved: + title: "Dit indlæg blev godkendt" page_not_found: title: "Ups! Den side eksisterer ikke eller også er den privat." popular_topics: "Populære" @@ -3857,6 +3865,8 @@ da: title: "Slet..." delete_and_ignore: title: "Slet Indlæg og Ignorer" + disagree_and_restore: + description: "Gendan indlægget, så alle brugere kan se det." disagree: title: "Uenig" ignore: diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index dc478d614dec8..9e9b0c653a66e 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -2667,11 +2667,11 @@ de: tl2_promotion_message: subject_template: "Herzlichen Glückwunsch zur Beförderung deiner Vertrauensstufe!" text_body_template: | - Wir haben dich um eine weitere [Vertrauensstufe] befördert (https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/)! + Wir haben dich um eine weitere [Vertrauensstufe](https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/) befördert! - Als erfahrener Benutzer weisst du [diese Liste nützlicher Tipps und Tricks] vielleicht zu schätzen (https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/). + Als erfahrener Benutzer weißt du [diese Liste nützlicher Tipps und Tricks](https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/) vielleicht zu schätzen. - Wir laden dich ein, dich weiter zu engagieren - es ist schön, dass du da bist. + Wir laden dich ein, dich weiter zu engagieren – es ist schön, dass du da bist. backup_succeeded: title: "Backup erfolgreich" subject_template: "Sicherung erfolgreich abgeschlossen" diff --git a/config/locales/server.el.yml b/config/locales/server.el.yml index f0de2e2beaddd..14f992a082f6f 100644 --- a/config/locales/server.el.yml +++ b/config/locales/server.el.yml @@ -39,6 +39,7 @@ el: title: "Discourse" topics: "Νήματα" posts: "αναρτήσεις" + views: "προβολές" loading: "Φόρτωση" powered_by_html: 'Powered by Discourse, best viewed with JavaScript enabled' sign_up: "Εγγραφείτε" @@ -50,6 +51,8 @@ el: remove_posts_deleted_by_author: "Διαγράφηκε από τον συγγραφέα" redirect_warning: "Δε μπορέσαμε να επαληθεύσουμε ότι ο σύνδεσμος που επιλέξατε ήταν πράγματι αναρτημένος στο forum. Αν θέλετε να προχωρήσετε ούτως ή άλλως, επιλέξτε τον παρακάτω σύνδεσμο." on_another_topic: "Σε άλλο θέμα" + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} από %{username}" themes: bad_color_scheme: "Δεν είναι δυνατή η ενημέρωση του θέματος, μη έγκυρη παλέτα χρωμάτων" other_error: "Κάτι πήγε στραβά κατά την ενημέρωση του θέματος" @@ -184,6 +187,8 @@ el: user_exists: "Δεν υπάρχει λόγος να προσκαλέσετε τον/την %{email}, έχει ήδη λογαριασμό χρήστη!" confirm_email: "

Έχετε σχεδόν τελειώσει! Στείλαμε ένα email ενεργοποίησης στη διεύθυνση email σας. Παρακαλούμε ακολουθήστε τις οδηγίες στο μήνυμα για να ενεργοποιήσετε τον λογαριασμό σας.

Εάν δε φτάσει, ελέγξτε τον φάκελο ανεπιθύμητων μηνυμάτων.

" cant_invite_to_group: "Δεν επιτρέπεται να προσκαλέσετε χρήστες σε συγκεκριμένες ομάδες. Βεβαιωθείτε ότι είστε ιδιοκτήτης των ομάδων στις οποίες προσπαθείτε να προσκαλέσετε." + disabled_errors: + invalid_access: "Δεν έχεις δικαίωμα να δεις τους πόρους που ζήτησες." bulk_invite: file_should_be_csv: "To ανεβασμένο αρχείο πρέπει να έχει μορφή csv." max_rows: "Οι πρώτες %{max_bulk_invites} προσκλήσεις έχουν σταλεί. Δοκιμάστε να χωρίσετε το αρχείο σε μικρότερα μέρη." @@ -281,6 +286,9 @@ el: topics_in_category: "Νήματα στην κατηγορία '%{category}'" rss_posts_in_topic: "RSS feed του '%{topic}'" rss_topics_in_category: "Ροή RSS των νημάτων στην κατηγορία '%{category}'" + rss_num_posts: + one: "%{count} ανάρτηση" + other: "%{count} αναρτήσεις" read_full_topic: "Διαβάστε όλο το νήμα" private_message_abbrev: "Μνμ" rss_description: @@ -304,10 +312,13 @@ el: excerpt_image: "εικόνα" bookmarks: reminders: + at_desktop: "Την επόμενη φορά που θα είμαι στην επιφάνεια εργασίας μου" later_today: "Αργότερα σήμερα" + next_business_day: "Επόμενη εργάσιμη ημέρα" tomorrow: "Αύριο" next_week: "Την άλλη εβδομάδα" next_month: "Τον άλλο μήνα" + custom: "Προσαρμοσμένη ημερομηνία και ώρα" groups: errors: can_not_modify_automatic: "Δεν μπορείς να τροποποιήσεις μια αυτόματη ομάδα" @@ -471,6 +482,9 @@ el: post: image_placeholder: broken: "Η εικόνα είναι χαλασμένη" + has_likes: + one: "%{count} «Μου αρέσει»" + other: "%{count} «Μου αρέσει»" rate_limiter: hours: one: "%{count} ώρα" @@ -618,6 +632,7 @@ el: self: "Δεν έχετε ακόμη καμία δραστηριότητα." others: "Χωρίς δραστηριότητα." no_bookmarks: + self: "Δεν έχετε σελιδοδείκτες. Οι σελιδοδείκτες σας επιτρέπουν να ανατρέξετε γρήγορα σε συγκεκριμένες αναρτήσεις." others: "Κανένας σελιδοδείκτης." no_likes_given: self: "Δεν σου αρέσει καμία ανάρτηση." @@ -667,6 +682,7 @@ el: daily: "καθημερινά" weekly: "κάθε εβδομάδα" every_month: "κάθε μήνα" + every_six_months: "κάθε έξι μήνες" user_api_key: title: "Εξουσιοδότηση πρόσβασης στην εφαρμογή" authorize: "Εξουσιοδότηση" @@ -675,6 +691,8 @@ el: description: '"%{application_name}" ζητά την ακολόλουθη πρόσβαση στον λογαριασμό σου:' otp_confirmation: confirm_title: Συνεχίστε στην %{site_name} + logging_in_as: Σύνδεση ως %{username} + confirm_button: Ολοκληρώστε τη σύνδεση no_trust_level: "Συγγνώμη, δεν έχεις το απαιτούμενο επίπεδο εμπιστοσύνης για να έχεις πρόσβαση στο API χρήστη" generic_error: "Συγνώμη, δεν μπορούμε να εκδώσουμε σε χρήστη API keys, αυτή η πράξη μπορεί να μην είναι διαθέδιμη από τον διαχειριστή της ιστοσελίδας. " scopes: @@ -687,15 +705,18 @@ el: reports: default: labels: + count: Άθροισμα day: Ημέρα post_edits: labels: + edited_at: Ημερομηνία post: Ανάρτηση editor: Συντάκτης edit_reason: Αιτία user_flagging_ratio: labels: user: Χρήστης + score: Βαθμολογία moderators_activity: labels: moderator: Συντονιστής @@ -750,6 +771,7 @@ el: title: "Χρήστες ανάλογα με το Επίπεδο Εμπιστοσύνης" xaxis: "Επίπεδο Εμπιστοσύνης" yaxis: "Αριθμός χρηστών" + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: xaxis: "Τύπος" yaxis: "Αριθμός χρηστών" @@ -764,6 +786,7 @@ el: labels: term: Όρος searches: Αναζητήσεις + click_through: CTR emails: title: "Απεσταλμένα Emails" xaxis: "Ημέρα" @@ -941,6 +964,8 @@ el: show_pinned_excerpt_mobile: "Εμφάνιση περίληψης σε καρφιτσωμένα νήματα στην περιήγηση από κινητά τηλέφωνα." show_pinned_excerpt_desktop: "Εμφάνιση περίληψης σε καρφιτσωμένα νήματα στην περιήγηση από ηλεκτρονικούς υπολογιστές." post_onebox_maxlength: "Μέγιστο μέγεθος μιας oneboxed ανάρτησης σε χαρακτήρες." + blocked_onebox_domains: "Μία λίστα τομέων που δεν θα είναι ποτέ oneboxed." + allowed_inline_onebox_domains: "Μια λίστα από domains τα οποία θα γίνουν onebox σε σκίκρυνση αν αναφερθούν χωρίς τίτλο" max_oneboxes_per_post: "Ανώτατος αριθμός oneboxes σε μια ανάρτηση. " notification_email: "Η από: διεύθυνση email που χρησιμοποιείται για την αποστολή όλων των απαραιτήτων μηνυμάτων του συστήματος. Ο τομέας που καθορίζεται εδώ πρέπει να έχει SPF, DKIM και reverse PTR αρχεία ρυθμισμένα σωστά για να φθάσει το μήνυμα." email_custom_headers: "Μια pipe-delimited λίστα που περιέχει τις προσαρμοσμένες κεφαλίδες των μηνυμάτων email. " @@ -969,6 +994,9 @@ el: pending_users_reminder_delay: "Ειδοποίηση των συντονιστών αν υπάρχουν νέοι χρήστες που περιμένουν για αποδοχή του λογαριασμού τους για μεγαλύτερο απο αυτό το χρονικό διάστημα. Όρισέ το στο -1 για να απενεργοποιηθούν οι ειδοποιήσεις." maximum_session_age: "Ο χρήστης θα παραμείνει συνδεδεμένος για n ώρες από την τελευταία του επίσκεψη" cors_origins: "Επιτρεπόμενες πηγές για αιτήσεις πολλαπλής προέλευσης (cross-origin requests, CORS). Η κάθε προέλευση πρέπει να περιέχει http:// or https://. Η env μεταβλητή DISCOURSE_ENABLE_CORS πρέπει να οριστεί σε αληθινή για να ενεργοποιηθεί το CORS." + use_admin_ip_allowlist: "Οι διαχειριστές μπορούν να συνδέονται μόνο αν βρίσκονται σε μια διευθυνση IP καθορισμένη στη λίστα Screened IPs (Admin > Logs > Screened Ips)." + blocked_ip_blocks: "Μια λίστα από private IP blocks η οποία ποτέ δεν θα ανιχνεύεται από το Discourse" + allowed_internal_hosts: "Μια λίστα από internal hosts την οποία το discourse μπορεί να ανιχνεύει με ασφάλεια για oneboxing και άλλους λόγους" allowed_iframes: "Μία λίστα από iframe src domain prefixes τα οποία το discourse μπορεί με ασφάλεια να επιτρέπει στις αναρτήσεις." top_menu: "Καθόρισε ποια αντικείμενα θα εμφανίζονται στην πλοήγηση της αρχικής σελίδας και με ποια σειρά. Παράδειγμα τελευταία/νέα/μη αναγνωσμένα/κατηγορίες/κορυφαία/αναγνωσμένα/δημοσιευμένα/σελιδοδείκτες" post_menu: "Αποφάσισε ποια αντικείμενα θα εμφανίζονται στο μενού των δημοσιεύσεων, και με ποια σειρά. Παράδειγμα μου αρέσει/επεξεργασία/επισήμανση/διαγραφή/κοινοποίηση/σελιδοδείκτης/απάντηση" @@ -988,6 +1016,8 @@ el: email_token_valid_hours: "Τα tokens ανάκτησης κωδικού / ενεργοποίησης λογαριασμού παραμένουν έγκυρα για (ν) ώρες." enable_badges: "Ενεργοποίηση συστήματος παρασήμων" enable_whispers: "Επιτρέπεται στο προσωπικό η ιδιωτική επικοινωνία μεταξύ νημάτων" + blocked_email_domains: "Μία λίστα με διευθύνσεις email τις οποίες οι χρήστες δεν μπορούν να χρησιμοποιήσουν για να δημιουργήσουν λογαριασμό. Πχ: mailinator.com|trashmail.net" + allowed_email_domains: "Μία λίστα με διευθύνσεις email τις οποίες οι χρήστες ΘΑ ΠΡΕΠΕΙ να χρησιμοποιήσουν για να δημιουργήσουν λογαριασμό. ΠΡΟΣΟΧΗ: οι χρήστες με διευθύνσεις email οι οποίες δεν βρίσκονται σε αυτή τη λίστα δεν θα μπορούν να δημιουργήσουν λογαριασμό." hide_email_address_taken: "Μην ενημερώνεις του χρήστες ότι υπάρχει λογαριασμός χρήστη με αυτήν την διεύθυνση email κατά την εγγραφή και στην φόρμα επαναφοράς κωδικού." log_out_strict: "Όταν αποσυνδεθείτε, ΟΛΕΣ οι δραστηριότητες σας σε ΟΛΕΣ τις συσκευές θα αποσυνδεθούν" new_version_emails: "Αποστολή email στην contact_email διεύθυνση όταν μια νέα έκδοση του Discourse είναι διαθέσιμη." @@ -1000,6 +1030,7 @@ el: min_admin_password_length: "Ελάχιστο μήκος κωδικού πρόσβασης για το διαχειριστή" password_unique_characters: "Ελάχιστος αριθμός μοναδικών χαρακτήρων που πρέπει να έχει ένας κωδικός." block_common_passwords: "Μην επιτρέπεις τους κωδικούς πρόσβασης που είναι ανάμεσα στους 10,000 πιο κοινούς κωδικούς πρόσβασης." + discourse_connect_overrides_bio: "Παρακάμπτει την βιογραφία του χρήστη στο προφίλ του χρήστη και τον αποτρέπει να την αλλάξει. " allow_new_registrations: "Επιτρέψτε τις νέες εγγραφές χρηστών. Απενεργοποιήστε την επιλογή αυτή για να αποτρέψετε σε οποιονδήποτε να δημιουργήσει ένα νέο λογαριασμό" enable_signup_cta: "Δείξε μια ανακοίνωση στους ανώνυμους χρήστες που επιστρέφουν, η οποία να τους παροτρύνει να δημιουργήσουν λογαριασμό." google_oauth2_client_id: "Client ID της Google εφαρμογής σας." @@ -1044,6 +1075,7 @@ el: avatar_sizes: "Κατάλογος από αυτόματα δημιουργημένα μεγέθη άβαταρ." external_system_avatars_enabled: "Χρησιμοποιήσε εξωτερική υπηρεσία για avatars." external_system_avatars_url: "URL της εξωτερικής υπηρεσίας avatars. Επιτρεπτές αντικαταστάσεις είναι {username} {first_letter} {color} {size}" + selectable_avatars: "Λίστα των avatars που μπορούν να επιλέξουν οι χρήστες." allow_all_attachments_for_group_messages: "Επιτρέπονται όλοι οι τύποι συνημμένων αρχείων σε ομαδικά μηνύματα." png_to_jpg_quality: "Ποιότητα των αποθηκευμένων αρχείων JPG (1 χαμηλή ποιότητα, 99 μέγιστη ποιότητα, 100 για απενεργοποίηση)." allow_staff_to_upload_any_file_in_pm: "Επίτρεψε στο προσωπικό να ανεβάζει οποιοδήποτε τύπο αρχείου στα πμ" @@ -1096,6 +1128,7 @@ el: desktop_category_page_style: "Οπτικό στυλ για τη σελίδα /Categories." category_colors: "Μια λίστα με τιμές δεκαεξαδικού χρώματος, που επιτρέπεται για τις κατηγορίες." category_style: "Οπτικό στυλ για τα εμβλημάτα κατηγορίας ." + dark_mode_none: "Κανένα" max_attachment_size_kb: "Το μέγιστο μέγεθος συννημένων αρχείων για μεταφόρτωση σε kB. Αυτό πρέπει να ρυθμιστεί στο nginx (client_max_body_size) / apache ή και στο proxy." authorized_extensions: "Μια λίστα με επεκτάσεις αρχείου οι οποιες επιτρέπονται για ανέβασμα (use '*' to enable all file types)" theme_authorized_extensions: "Μια λίστα από επεκτάσεις οι οποίες επιτρέπονται για τις μεταφορτώσεις θεμάτων ('*' για ενεργοποίηση όλων των τύπων αρχείων)" @@ -1117,6 +1150,7 @@ el: tos_url: "Εάν έχετε ένα έγγραφο Όρων Χρήσης το οποίο φιλοξενείται αλλού και θέλετε να το χρησιμοποιήσετε, καταχωρήστε την πλήρη διεύθυνση URL εδώ." privacy_policy_url: "Εάν έχετε ένα έγγραφο πολιτικής προστασίας προσωπικών δεδομένων το οποίο φιλοξενείται αλλού και θέλετε να το χρησιμοποιήσετε, καταχωρήστε την πλήρη διεύθυνση URL εδώ." newuser_spam_host_threshold: "Πόσες φορές ένας νέος χρήστης μπορεί να αναρτήσει ένα σύνδεσμο προς την ίδια ιστοσελίδα εντός του ορίου 'newuser_spam_host_threshold' αναρτήσεων, πριν αυτές θεωρηθούν spam." + allowed_spam_host_domains: "Μια λίστα από domains που εξαιρούνται από τον έλεγχο spam. Οι νέοι χρήστες δεν θα περιορίζονται στη δημιουργία αναρτήσεων με συνδέσμους προς αυτά τα domains." topic_view_duration_hours: "Μετρήστε μια νέα προβολή νήματος μία φορά ανά IP/User κάθε N ώρες" user_profile_view_duration_hours: "Μετρήστε μια νέα προβολή προφίλ χρήστη μία φορά ανά IP/User κάθε N ώρες" levenshtein_distance_spammer_emails: "Στην αντιστοίχιση διευθύνσεων email των σπάμερ, η διαφορά στον αριθμό των χαρακτήρων η οποία θα επιτρέπει μια ασαφή αντιστοίχιση." @@ -1130,6 +1164,7 @@ el: min_first_post_typing_time: "Ελάχιστος χρόνος σε χιλιοστά του δευτερολέπτου που ένας χρήστης θα πρέπει να πληκτρολογεί κατά τη διάρκεια της πρώτης ανάρτησης, εάν το όριο δεν επιτευχθεί τότε η ανάρτηση αυτόματα εισέρχεται στην ουρά αυτών που απαιτούν έγκριση. Θέτοντας τον ίσο με 0 απενεργοποιείται το όριο (δεν συνιστάται) " auto_silence_fast_typers_on_first_post: "Αυτόματη σίγηση των χρηστών που δεν πληρούν το κριτήριο min_first_post_typing_time" auto_silence_fast_typers_max_trust_level: "Μέγιστο επίπεδο εμπιστοσύνης για την αυτόματη σίγηση σε περίπτωση γρήγορης πληκτρολόγησης" + auto_silence_first_post_regex: "Case insensitive regex το οποίο αν ισχύσει θα προκαλέσει την σιγή και την αποστολή για έλεγχο της πρώτης ανάρτησης ενός χρήστη. Παράδειγμα: raging|a[bc]a , θα προκαλέσει όλες τις αναρτήσεις που περιέχουν raging ή aba ή aca να σιγηθούν. Ισχύει μόνο για την πρώτη ανάρτηση." reply_by_email_enabled: "Ενεργοποίηση απάντησης στα νήματα μέσω email." reply_by_email_address: "Πρότυπο για την απάντηση μέσω email της διεύθυνσης email εισερχομένων μηνυμάτων, για παράδειγμα: %%{reply_key}@reply.example.com or replies+%%{reply_key}@example.com" alternative_reply_by_email_addresses: "Λίστα εναλλακτικών προτύπων για την απάντηση μέσω email της διεύθυνσης email εισερχομένων μηνυμάτων, πχ: %%{reply_key}@reply.example.com|replies+%%{reply_key}@example.com" @@ -1142,6 +1177,7 @@ el: max_emails_per_day_per_user: "Ο μέγιστος αριθμός email που θα στέλνονται στους χρήστες ανά μέρα. 0 για να απενεργοποιηθεί το όριο. " enable_staged_users: "Αυτόματη δημιουργία σταδιακών χρηστών όταν επεξεργάζεται ένα εισερχόμενο μήνυμα email." maximum_staged_users_per_email: "Μέγιστος αριθμός σταδιακών χρηστών που δημιουργούνται όταν επεξεργάζεται ένα εισερχόμενο μήνυμα email." + auto_generated_allowlist: "Κατάλογος διευθύνσεων email που δεν θα ελεγχθούν για αυτοπαραγόμενο περιεχόμενο. Παράδειγμα: foo@bar.com|discourse@bar.com" block_auto_generated_emails: "Αποκλεισμός εισερχόμενων μηνυμάτων email που ταυτοποιούνται ως αυτόματα δημιουργημένα." ignore_by_title: "Αγνόησε εισερχόμενα email σύμφωνα με τον τίτλο τους." mailgun_api_key: "Mailgun Secret API key το οποίο χρησιμοποιείται για να επιβεβαιωθούν τα μηνύματα του webhook." @@ -1191,6 +1227,7 @@ el: anonymous_account_duration_minutes: "Για να προστατευθεί η ανωνυμία δημιούργησε ένα νέο ανώνυμο λογαριασμό κάθε Ν λεπτά για κάθε χρήστη. Παράδειγμα: εάν τεθεί στο 600, μόλις περάσουν 600 λεπτά από την τελευταία ανάρτηση ΚΑΙ ο χρήστης αλλάξει σε ανώνυμος, ένας νέος ανώνυμος λογαριασμός δημιουργείται." hide_user_profiles_from_public: "Απενεργοποιήσε τις κάρτες χρηστών, τα προφίλ χρηστών και τον κατάλογο χρηστών για ανώνυμους χρήστες. " hide_suspension_reasons: "Να μην εμφανίζονται οι λόγοι αποβολής δημόσια στα προφίλ των χρηστών." + allowed_user_website_domains: "Ο ιστότοπος του χρήστη θα επιβεβαιώνεται με αυτά τα domains. Pipe-delimited λίστα" allow_profile_backgrounds: "Επίτρεψε στους χρήστες να μεταφορτώνουν εικόνες φόντου στο προφίλ." sequential_replies_threshold: "Ο αριθμός των αναρτήσεων που πρέπει να κάνει ένας χρήστης στη σειρά για το ίδιο θέμα πριν ειδοποιηθεί για παρα πολλές συνεχόμενες απαντήσεις." get_a_room_threshold: "Ο αριθμός των αναρτήσεων που πρέπει να κάνει ένας χρήστης στον ίδιο άνθρωπο και στο ίδιο θέμα προτού να προειδοποιηθεί. " @@ -1242,6 +1279,7 @@ el: default_other_external_links_in_new_tab: "Άνοιγε τους εξωτερικούς συνδέσμους σε νέα καρτέλα από προεπιλογή." default_other_enable_quoting: "Ενεργοποίηση απάντησης με παράθεση για επιλεγμένο κείμενο από προεπιλογή" default_other_dynamic_favicon: "Δείχνε τον αριθμό νέων/ενημερωμένων θεμάτων στο εικονίδιο του προγράμματος περιήγησης από προεπιλογή. " + default_other_skip_new_user_tips: "Παράλειψη συμβουλών και σημάτων για την ενσωμάτωση νέου χρήστη." default_other_like_notification_frequency: "Ειδοποίησε τους χρήστες όταν έχουν 'μου αρέσει' απο προεπιλογή. " default_topics_automatic_unpin: "Αυτόματο ξεκαρφίτσωμα των νημάτων, όταν ο χρήστης φτάνει στο κάτω μέρος από προεπιλογή." default_categories_watching: "Λίστα κατηγοριών που επιτηρούνται από προεπιλογή." @@ -1298,6 +1336,14 @@ el: topic: "Αποτελέσματα" user: "Χρήστες" results_page: "Αποτελέσματα αναζήτησης για '%{term}'" + discourse_connect: + login_error: "Σφάλμα Σύνδεσης" + not_found: "Ο λογαριασμός σου δεν ήταν δυνατόν να βρεθεί. Παρακαλώ επικοινώνησε με το διαχειριστή της ιστοσελίδας." + account_not_approved: "Ο λογαριασμός σας βρίσκεται σε αναμονή εγκρίσεως. Θα λάβετε ειδοποίηση με email όταν εγκριθεί. " + unknown_error: "Προέκυψε κάποιο πρόβλημα με το λογαριασμό σου. Παρακαλώ επικοινώνησε με το διαχειριστή της ιστοσελίδας." + timeout_expired: "Ο χρόνος σύνδεσης του λογαριασμού έληξε, παρακαλώ προσπάθησε να συνδεθείς ξανά." + no_email: "Δεν καταχωρήθηκε διεύθυνση email. Παρακαλούμε επικοινωνήστε με την διαχείριση." + email_error: "Ένας λογαριασμός δεν μπόρεσε να καταχωρηθεί με την διεύθυνση email %{email}. Παρακαλούμε επικοινωνήστε με την διαχείριση." original_poster: "Αρχικός Αναρτητής" most_posts: "Περισσότερες Αναρτήσεις" most_recent_poster: "Πιο Πρόσφατος Αναρτητής" @@ -1363,6 +1409,12 @@ el: autoclosed_disabled_lastpost: "Αυτό το νήμα είναι τώρα ανοικτό. Επιτρέπονται νέες απαντήσεις." auto_deleted_by_timer: "Διεγράφη αυτόματα με χρονοπρογραμματισμό." login: + security_key_description: "Όταν έχετε προετοιμάσει το φυσικό κλειδί ασφαλείας σας, πατήστε το κουμπί «Έλεγχος ταυτότητας με κλειδί ασφαλείας» παρακάτω." + security_key_alternative: "Δοκιμάστε με έναν άλλο τρόπο" + security_key_authenticate: "Έλεγχος ταυτότητας με κλειδί ασφαλείας" + security_key_not_allowed_error: "Η διαδικασία ελέγχου ταυτότητας κλειδιού ασφαλείας είτε έληξε είτε ακυρώθηκε." + security_key_no_matching_credential_error: "Δε βρέθηκαν διαπιστευτήρια που να ταιριάζουν στο παρεχόμενο κλειδί ασφαλείας." + security_key_support_missing_error: "Η τρέχουσα συσκευή ή το πρόγραμμα περιήγησής σας δεν υποστηρίζει τη χρήση κλειδιών ασφαλείας. Παρακαλώ χρησιμοποιήστε διαφορετική μέθοδο." not_approved: "Ο λογαριασμός σου δεν έχει εγκριθεί ακόμα. Θα λάβεις ειδοποίηση με email όταν θα είσαι έτοιμος να συνδεθείς." incorrect_username_email_or_password: "Λάθος όνομα χρήστη, διεύθυνση email ή κωδικός προσβασης" wait_approval: "Ευχαριστούμε για την εγγραφή σας. Θα σας ενημερώσουμε όταν ο λογαριασμός σας εγκριθεί." @@ -1376,6 +1428,7 @@ el: errors: "%{errors}" not_available: "Δεν είναι διαθέσιμο. Προσπάθησε %{suggestion};" something_already_taken: "Κάτι πήγε στραβά, ίσως το όνομα χρήστη ή η διεύθυνση email υπάρχει ήδη. Δοκίμασε τον σύνδεσμο \"ξέχασα τον κωδικό μου\"." + omniauth_confirm_button: "Συνεχίστε" authenticator_error_no_valid_email: "Δεν επιτρέπονται διευθύνσεις email σχετικές με %{account}. ίσως να χρειαστεί να διαμορφώσετε τον λογαριασμό σας με μια διαφορετική διεύθυνση email. " new_registrations_disabled: "Νέες εγγραφές λογαριασμών δεν επιτρέπονται αυτή τη στιγμή." password_too_long: "Οι κωδικοί πρόσβασης περιορίζονται σε 200 χαρακτήρες." @@ -1384,6 +1437,9 @@ el: missing_user_field: "Δεν έχετε συμπληρώσει όλα τα πεδία χρήστη" auth_complete: "Η ταυτοποιήση έχει ολοκληρωθεί." click_to_continue: "Κλικ εδώ για να συνεχίσετε." + second_factor_backup_description: "Παρακαλώ εισαγάγετε έναν από τους εφεδρικούς κωδικούς σας:" + second_factor_toggle: + backup_code: "Χρησιμοποιήστε αντ 'αυτού έναν εφεδρικό κωδικό" admin: email: sent_test: "στάλθηκε!" @@ -1486,6 +1542,8 @@ el: post_hidden: title: "Η ανάρτηση κρύφτηκε" subject_template: "Η ανάρτηση κρύφτηκε λόγω των επισημάνσεων της κοινότητας" + queued_by_staff: + title: "Απαιτείται Έγκριση Ανάρτησης" welcome_user: title: "Καλωσόρισμα Χρήστη" subject_template: "Καλώς ήλθατε στην %{site_name}!" @@ -1516,6 +1574,8 @@ el: Να περάσετε καλά! [prefs]: %{user_preferences_url} + tl2_promotion_message: + subject_template: "Συγχαρητήρια για τον προβιβασμό του επιπέδου εμπιστοσύνης σας!" backup_succeeded: title: "Το αντίγραφο ασφαλείας πέτυχε" subject_template: "Το αντίγραφο ασφαλείας ολοκληρώθηκε επιτυχώς" @@ -2056,6 +2116,9 @@ el: confirm_new_email: title: "Επιβεβαίωση νέας διεύθυνσης email" subject_template: "[%{email_prefix}] Επικυρώστε την νέα σας διεύθυνση email" + confirm_new_email_via_admin: + title: "Επιβεβαίωση νέας διεύθυνσης email" + subject_template: "[%{email_prefix}] Επικυρώστε την νέα σας διεύθυνση email" confirm_old_email: title: "Επιβεβαίωση παλιάς διεύθυνσης email" subject_template: "[%{email_prefix}] Επικυρώστε την νέα σας διεύθυνση email" @@ -2090,6 +2153,8 @@ el: %{base_url}/u/activate-account/%{email_token} Αν για κάποιο λόγο δεν μπορείτε να κάνετε κλικ στον παραπάνω σύνδεσμο, παρακαλούμε αντιγράψτε ολόκληρη την διεύθυνση και επικολλήστε την στην γραμμή διευθύνσεων του περιηγητή σας. + post_approved: + title: "Η ανάρτησή σας εγκρίθηκε" page_not_found: title: "Ουπς! Αυτή η σελίδα δεν υπάρχει ή είναι ιδιωτική." popular_topics: "Δημοφιλή" @@ -2152,6 +2217,7 @@ el: base_theme_name: "Βάση" light: "Ανοιχτό" dark: "Σκούρο" + default_theme_name: "Προεπιλογή" light_theme_name: "Ανοιχτό" dark_theme_name: "Σκούρο" edit_this_page: "Επεξεργασία αυτής της σελίδας" @@ -2616,12 +2682,19 @@ el: description: "Διεύθυνση email του ατόμου ή της ομάδας που είναι υπεύθυνα για αυτή την κοινότητα. Χρησιμοποιείται για σημαντικές ειδοποιήσεις όπως σημάνσεις χωρίς διαχείριση, ανανεώσεις ασφάλειας και στην σελίδα σχετικά για έκτακτη επικοινωνία με την κοινότητα." contact_url: label: "Ιστοσελίδα" + placeholder: "https://www.example.com/contact-us" description: "Ιστοσελίδα γενικής επικοινωνίας με εσάς και τον οργανισμό σας. Θα εμφανίζεται στην επιλογή σχετικά με τη σελίδα." site_contact: label: "Αυτόματα Μηνύματα" description: "Όλα τα αυτοματοποιημένα συστημικά μηνύματα, όπως οι προειδοποιήσεις σημάνσεων και η ειδοποίηση ολοκλήρωσης των αντιγράφων ασφαλείας, θα στέλνονται από αυτόν τον χρήστη." corporate: title: "Οργάνωση" + colors: + title: "Χρώματα" + fonts: + fields: + font_preview: + label: "Προεπισκόπηση" logos: title: "Λογότυπα" fields: @@ -2646,6 +2719,8 @@ el: label: "Κατηγορίες με Προτεινόμενα Νήματα" categories_and_latest_topics: label: "Κατηγορίες και Τελευταία Νήματα" + categories_and_top_topics: + label: "Κατηγορίες και κορυφαία θέματα" invites: title: "Πρόσκληση Συνεργάτη" description: "Έχεις σχεδόν τελειώσει! Ας προσκαλέσουμε μερικούς χρήστες να συμμετάσχουν στις συζητήσεις με ενδιαφέροντα νήματα και αναρτήσεις ώστε να ξεκινήσει να λειτουργεί η κοινότητα. " @@ -2660,7 +2735,23 @@ el: replied: '%{username} σου απάντησε στο "%{topic}" - %{site_title}' posted: '%{username} ανάρτησε στο "%{topic}" - %{site_title}' linked: '%{username} έκανε μια σύνδεση στην ανάρτηση που έκανες στο νήμα "%{topic}" - %{site_title}' + watching_first_post: 'Ο/Η %{username} δημιούργησε ένα νέο θέμα "%{topic}" - %{site_title}' + confirm_title: "Ενεργοποιημένες ειδοποιήσεις - %{site_title}" + confirm_body: "Επιτυχία! Οι ειδοποιήσεις έχουν ενεργοποιηθεί." + custom: "Ειδοποίηση από %{username} στο %{site_title}" + staff_action_logs: + api_key: + revoked: Ανακλήθηκε reviewables: + priorities: + low: "Χαμηλή" + medium: "Μεσαία" + high: "Υψηλή" + sensitivity: + disabled: "Απενεργοποιημένο" + low: "Χαμηλή" + medium: "Μεσαία" + high: "Υψηλή" actions: agree_and_keep: description: "Αποδοχή επισήμανσης και διατήρηση της ανάρτησης αμετάβλητης." diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml index e628329581149..bcecca7e77d24 100644 --- a/config/locales/server.es.yml +++ b/config/locales/server.es.yml @@ -1505,9 +1505,11 @@ es: enable_escaped_fragments: "Ir a la API Ajax-Crawling de Google si no se detecta ningún webcrawler. Visita https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" moderators_manage_categories_and_groups: "Permitir a los moderadores administrar categorías y grupos" cors_origins: "Orígenes permitidos para las solicitudes de origen cruzado (CORS). Cada origen debe incluir http:// or https://. La variable env DISCOURSE_ENABLE_CORS debe establecerse como verdadero para activar CORS." + use_admin_ip_allowlist: "Los administradores solo pueden iniciar sesión si están en una dirección IP definida en la lista de direcciones IP revisadas (Administrados > Registros > Direcciones IP)." blocked_ip_blocks: "Lista de direcciones IP privadas en las que Discourse no debería hacer crawling" allowed_internal_hosts: "Lista de hosts internos sobre los que discourse puede hacer crawl de forma segura para oneboxes y otras finalidades." allowed_iframes: "Una lista de prefijos de dominios para iframe src que discourse puede permitir de forma segura en publicaciones" + allowed_crawler_user_agents: "Agentes de usuario de crawlers a los que se debe permitir el acceso al sitio. ¡ADVERTENCIA! ¡CONFIGURAR ESTO INHABILITARÁ A TODOS LOS CRAWLERS QUE NO SE ENCUENTRAN AQUÍ!" slow_down_crawler_user_agents: "Agentes de usuario de crawlers a los que se debe aplicar una cuota limitada en robots.txt utilizando la directiva de retardo de rastreo" slow_down_crawler_rate: "Si slow_down_crawler_user_agents es especificado, esta proporción aplicará para todos los crawlers (número de segundos de demora entre solicitudes)" content_security_policy: "Activar la política de seguridad de contenido (CSP)" diff --git a/config/locales/server.et.yml b/config/locales/server.et.yml index 6206e463fc2b7..e95dac88ebdc0 100644 --- a/config/locales/server.et.yml +++ b/config/locales/server.et.yml @@ -15,6 +15,7 @@ et: short_no_year: "%-d. %B" date_only: "%-d. %B %Y" long: "%B %-d, %Y, %l:%M%P" + no_day: "%B. %Y" date: month_names: - null @@ -38,6 +39,7 @@ et: title: "Discourse" topics: "Teemad" posts: "postitused" + views: "vaatamisi" loading: "Laetakse" sign_up: "Liitu" log_in: "Logi sisse" @@ -46,6 +48,8 @@ et: disable_remote_images_download_reason: "Väliste piltide allalaadimine keelati, kuna polnud polnud piisavalt vaba ruumi." anonymous: "Anonüümne" remove_posts_deleted_by_author: "Autori poolt kustutatud" + inline_oneboxer: + topic_page_title_post_number_by_user: "postituse nr%{post_number} tegi %{username}" emails: incoming: default_subject: "See teema vajab pealkirja" @@ -114,6 +118,9 @@ et: site_settings: default_categories_already_selected: "Sa ei saa valida teises nimekirjas valitud liiki." s3_upload_bucket_is_required: "Ei saa aktiveerida S3 üleslaadimist, kui 's3_upload_bucket' ei ole määratud." + invite: + disabled_errors: + invalid_access: "Päritud ressursi vaatamiseks puuduvad õigused." bulk_invite: file_should_be_csv: "Üles laetav fail peab olema CSV vormingus." error: "Selle faili üleslaadimisel tekkis viga. Palun proovi hiljem uuesti." @@ -150,6 +157,9 @@ et: permalink: "Püsilink" imported_from: "See on kaasnev vestlusteema originaalsisestusele %{link}" in_reply_to: "▶ %{username}" + replies: + one: "%{count} vastus" + other: "%{count} vastust" created: "Loodud" no_mentions_allowed: "Vabandust, sa ei saa teisi kasutajaid mainida." too_many_mentions: @@ -181,6 +191,9 @@ et: topics_in_category: "Teemad '%{category}' liigis" rss_posts_in_topic: "'%{topic}' RSS-kanal" rss_topics_in_category: "Liigi '%{category}' teemade RSS-kanal" + rss_num_posts: + one: "%{count} postitus" + other: "%{count} postitust" read_full_topic: "Loe kogu teemat" private_message_abbrev: "PS" rss_description: @@ -198,9 +211,11 @@ et: bookmarks: reminders: later_today: "Täna hiljem" + next_business_day: "Järgmisel tööpäeval" tomorrow: "Homme" next_week: "Järgmisel nädalal" next_month: "Järgmisel kuul" + custom: "Vali kuupäev ja kellaaeg" groups: errors: can_not_modify_automatic: "Autommatset gruppi ei saa muuta" @@ -482,6 +497,7 @@ et: no_default: others: "Tegevusi pole." no_bookmarks: + self: "Sul pole järjehoidjatesse lisatud postitusi; järjehoidjad võimaldavad kiiresti konkreetsetele postitustele viidata." others: "Järjehoidjad puuduvad." no_likes_given: self: "Sa pole oma meeldimist ühelegi postitusele andnud." @@ -517,6 +533,8 @@ et: every_hour: "iga tund" daily: "iga päev" weekly: "iga nädal" + every_month: "iga kuu" + every_six_months: "iga kuue kuu tagant" user_api_key: title: "Autoriseeri rakenduse ligipääs" authorize: "Autoriseeri" @@ -542,6 +560,7 @@ et: user_flagging_ratio: labels: user: Kasutaja + score: Skoor moderators_activity: labels: moderator: Moderaator @@ -593,6 +612,7 @@ et: title: "Meeldimisi" xaxis: "Päev" yaxis: "Uute meeldimiste arv" + description: "Uute meeldimiste arv." flags: title: "Tähised" xaxis: "Päev" @@ -606,6 +626,7 @@ et: yaxis: "Kasutajate arv" labels: level: Tase + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: xaxis: "Liik" yaxis: "Kasutajate arv" @@ -735,6 +756,7 @@ et: max_topic_title_length: "Maksimaalne lubatud teema pealkirja pikkus tähemärkides" min_personal_message_title_length: "Minimaalne lubatud teema pealkirja pikkus tähemärkides" min_admin_password_length: "Minimaalne administraatori parooli pikkus." + dark_mode_none: "Pole" enable_staged_users: "Sissetulevate meilide töötlemisel loo kasutajad ettevalmistamiseks automaatselt." maximum_staged_users_per_email: "Ettevalmistamisel olevate kasutajate maksimaalne arv sai sissetuleva meili töötlemisel täis." dominating_topic_minimum_percent: "Mitu protsenti teema postitustest peab kasutaja tegema, et talle saadetaks meeldetuletus teema liigse domineerimise kohta." @@ -778,6 +800,8 @@ et: flags_dispositions: agreed: "Täname, et teada andsite. Tegeleme sellega." system_messages: + queued_by_staff: + title: "Postitus vajab kinnitust" welcome_user: subject_template: "Tere tulemast %{site_name}!" welcome_invite: @@ -859,6 +883,7 @@ et: dark: "Tume" neutral: "Neutraalne" summer: "Suvi" + default_theme_name: "Vaikimisi" light_theme_name: "Hele" dark_theme_name: "Tume" neutral_theme_name: "Neutraalne" @@ -1042,10 +1067,17 @@ et: placeholder: "nimi@kuskil.ee" contact_url: label: "Veebileht" + placeholder: "https://www.example.com/contact-us" site_contact: label: "Automaatsed sõnumid" corporate: title: "Organisatsioon" + colors: + title: "Värvid" + fonts: + fields: + font_preview: + label: "Eelvaade" logos: title: "Logod" fields: @@ -1086,8 +1118,13 @@ et: not_found: "ei leitud" unknown: "tundmatu" reviewables: + priorities: + medium: "Keskmine" + high: "Kõrge" sensitivity: disabled: "Välja lülitatud" + medium: "Keskmine" + high: "Kõrge" actions: agree_and_suspend: title: "Peata kasutaja" diff --git a/config/locales/server.fa_IR.yml b/config/locales/server.fa_IR.yml index 79d172e6aa5ef..20d25031efdbc 100644 --- a/config/locales/server.fa_IR.yml +++ b/config/locales/server.fa_IR.yml @@ -51,6 +51,8 @@ fa_IR: remove_posts_deleted_by_author: "پاک شده توسط نویسنده" redirect_warning: "ما قادر به تایید این پیوند نمی‌باشیم. پیوند انتخابی شما قبلا به انجمن پست شده است. اگر در هر‌صورت مایل به انجام این کار هستید بر روی پیوند زیر کلیک کنید." on_another_topic: "در یک مبحث دیگر" + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} توسط %{username}" themes: bad_color_scheme: "نمی‌توان پوسته را بروزرسانی کرد، جعبه رنگ نامعتبر" other_error: "در بروزرسانی قالب مشکلی پیش آمده" @@ -137,6 +139,8 @@ fa_IR: user_exists: "نیازی به دعوت %{email} نیست، در حال حاضر حساب کاربری دارند! " invite_exists: "شما قبلا %{email} را دعوت کرده‌اید." invalid_email: "آدرس ایمیل %{email} معتبر نیست." + disabled_errors: + invalid_access: "شما اجازه مشاهده منبع درخواست شده را ندارید." bulk_invite: file_should_be_csv: "فرمت فایل بارگذاری شده می بایست csv باشد." error: "خطایی هنگام آپلود فایل مربوطه رخ داده است. لطفا بعدا امتحان کنید." @@ -214,6 +218,9 @@ fa_IR: topics_in_category: "موضوعات دسته‌بندی '%{category}'" rss_posts_in_topic: "خوراک '%{topic}'" rss_topics_in_category: "خوارک موضوعات دسته‌‌بندی '%{category}'" + rss_num_posts: + one: "%{count} نوشته" + other: "%{count} نوشته" read_full_topic: "مشاهده متن کامل موضوع" private_message_abbrev: "پیام" rss_description: @@ -575,6 +582,7 @@ fa_IR: short_description: "پسندیدن این فرسته" user_activity: no_bookmarks: + self: "شما هیچ نوشته نشانک‌ شده‌ای ندارید؛ نشانک‌‌ها به شما اجازه می‌دهد به سرعت به نوشته‌های خاص مراجعه کنید." search: "هیچ نشانکی با درخواست جستجوی شده یافت نشد." others: "نشانه‌گذاری وجود ندارد" no_likes_given: @@ -633,6 +641,7 @@ fa_IR: description: '"%{application_name}" درخواست دسترسی به حساب کاربری شما را دارد:' otp_confirmation: confirm_title: ورود به %{site_name} + logging_in_as: ورود با %{username} confirm_button: اتمام ورود no_trust_level: "با عرض پوزش٬ شما سطح اعتماد مورد نیاز با برای دسترسی به api کاربر ندارید." generic_error: "با عرض پوزش، نمی‌توانیم کلید API کاربر را حل کنیم، شاید این ویژگی در قسمت مدیریت غیر‌فعال شده." @@ -700,6 +709,7 @@ fa_IR: title: "پسندها" xaxis: "روز" yaxis: "تعداد پسندهای تازه" + description: "تعداد پسندهای تازه." flags: title: "پرچم‌ها" xaxis: "روز" @@ -904,6 +914,7 @@ fa_IR: show_pinned_excerpt_mobile: "نمایش خلاصه موضوعات سنجاق شده در موبایل." show_pinned_excerpt_desktop: "نمایش خلاصه موضوعات سنجاق شده در کامپیوتر." post_onebox_maxlength: "حداکثر طول متن پیشنمایش لینک به نویسه." + blocked_onebox_domains: "لیست دامنه‌هایی که نباید پیش‌نمایش داشته باشند." max_oneboxes_per_post: "حداکثر تعداد پیش نمایش پیوند در یک نوشته" notification_email: "از: ایمیل آدرس زمان ارسال تمام ایمیل های ضروری سیستم استفاده شد. .دامنه مشخص شده در اینجا باید SPF, DKIM داشته باشد و سوابق PTR معکوس به درستی برای ورود ایمیل تنظیم شده باشد. " email_custom_headers: "فهرست pipe-delimited از سربرگ‌های ایمیل سفارشی " @@ -930,6 +941,7 @@ fa_IR: pending_users_reminder_delay: "اگر کاربر‌ها بیشتر از این مقدار ساعت منتظر تایید بودند به مدیران اعلام کن. مقدار -1 برای غیرفعال‌سازی." maximum_session_age: "کاربر برای n ساعت از آخرین بازدید در حالت وارد شده می‌ماند." cors_origins: "ریشه های مجاز برای cross-origin requests درخواست متقابل منشاء (CORS). هر منشاء باید دارای http:// or https://. The DISCOURSE_ENABLE_CORS env برای تنظیم به کارگیری CORS باید متغیر باشد." + use_admin_ip_allowlist: "مدیر‌ها فقط در صورتی می‌توانند وارد شوند که در لیست آیپی‌های نمایش داده شده باشند. (مدیریت > گزارش‌ها > آیپی‌های نمایش داده شده)" top_menu: "مشخص کنید کدام موارد و با چه ترتیبی در ناوبری صفحه خانگی نشان داده شوند. برای مثال: آخرین‌ها|تازه‌ها|نخوانده‌ها|دسته‌ها|خوانده‌ها|فرسته‌ها|نشانک‌ها" post_menu: "مشخص کنید کدام موارد بر روی فهرست نوشته ها نشان داده شوند٬ و بر اساس چه ترتیبی. برای مثال : پسند|ویرایش|پرچم|پاک کردن|همرسانی|نشانک|پاسخ" post_menu_hidden_items: "فهرست موارد مخفی شود بطور پیش فرض در فهرست نوشته مگر اینکه رفع گسترش به حالت روشن باشد." @@ -949,6 +961,8 @@ fa_IR: email_token_valid_hours: "رمز عبور فراموش شده/ حساب کاربری فعال تا (n) ساعت اعتبار دارد." enable_badges: "فعال سازی سیستم نشان‌دهی" enable_whispers: "به همکاران اجازه ارتباط خوصی در موضوعات داده شود" + blocked_email_domains: "لیست pipe-delimit دامنه های ایمیل که کاربران اجازه ندارند با آن حساب کاربری ثبت‌نام کنند. برای مثال: mailinator.com|trashmail.net" + allowed_email_domains: "لیست pipe-delimit دامنه های ایمیل که کاربران اجازه باید با آن حساب کاربری ثبت نام کنند. اخطار: کاربرانی با دامنه‌های ایمیلی به غیر از آن‌هایی که در لیست هستند اجازه ندارند. " log_out_strict: "وقتی از سیستم خارج می شود، کاربر را از تمام session‌ها بر روی تمام دستگاه‌ها خارج کن " new_version_emails: "ارسال ایمیل به contact_email address وقتی نسخه جدید Discourse موجود است. " invite_expiry_days: "کلید دعوتنامه فراخوان برای چه مدت اعتبار دارد، واحد روز" @@ -960,6 +974,7 @@ fa_IR: min_admin_password_length: "حداقل طول رمز عبور برای مدیریت" password_unique_characters: "حداقل تعداد نویسه یکتا برای یک رمز‌عبور" block_common_passwords: "رمز عبوری که جزء 10,000 رمز عبور رایج است را قبول نکنید. " + discourse_connect_overrides_bio: "بیوگرافی کاربر در پروفایل را از بین می‌برد و به کاربر اجازه تغییر نمی‌دهد." allow_new_registrations: "به کاربر جدید اجازه ثبت‌نام بده. لغو این انتخاب برای جلوگیری از ساخت حساب‌کاربری جدید. " enable_signup_cta: "نمایش اطلاعیه برای کاربران ناشناسی که سعی در ایجاد حساب کاربری دارند." google_oauth2_client_id: "Client ID برای نرم افزار گوگل شما. " @@ -1055,6 +1070,7 @@ fa_IR: desktop_category_page_style: "سبک بصری برای صفحه‌ی دسته‌بندی" category_colors: "لیست مقادیر رنگ هگزا دسیمال مجاز برای دسته‌بندی‌ها." category_style: "سبک بصری برای نشان دسته‌بندی" + dark_mode_none: "هیچ کدام" max_attachment_size_kb: "حداکثر سایز فایل پیوست شده به واحد کیلوبایت. این باید در پیکربندی nginx باشد (client_max_body_size) / همچنین apache یا proxy." authorized_extensions: "لیست پسوند‌های مجاز فایل برای بارگذاری ( از '*' برای اجازه به تمام فایل‌ها استفاده کنید)" theme_authorized_extensions: "لیست پسوند‌های قابل بارگذاری برای قالب (از '*' برای اجازه به تمامی فایل‌ها استفاده کنید)" @@ -1076,6 +1092,7 @@ fa_IR: tos_url: "اگر شرایط استفاده از خدمات را در میزبان دیگری قرار دادید و می‌خواهید از آن استفاده کنید، لینک کامل را در اینجا قرار دهید." privacy_policy_url: "اگر سیاست حفظ حریم خصوصی را در میزبان دیگری قرار دادید و می‌خواهید از آن استفاده کنید، لینک کامل را در اینجا قرار دهید." newuser_spam_host_threshold: "یک کاربر چند بار می‌تواند به یک هاست لینک دهد تا `newuser_spam_host_threshold` به عنوان هرزنامه شناخته شود." + allowed_spam_host_domains: "لیست دامنه‌ها محروم از میزبان تست هرزنامه. هرگز از ساخت نوشته‌ی جدید با پیوند‌هایی از این دامنه‌ها محدود نمی‌شوند. " topic_view_duration_hours: "بازدید‌های موضوعات را به ازای هر آیپی/کاربر در N ساعت محاسبه کن" user_profile_view_duration_hours: "بازدید‌های پروفایل کاربران را به ازای هر آیپی/کاربر در N ساعت محاسبه کن" levenshtein_distance_spammer_emails: "هنگامی که تطبیق ایمیل هرزنامه باشد٬ تعداد نویسه‌های متفاوت که هنوز هم به یک تطبق مبهم اجازه خواهد داد." @@ -1099,6 +1116,7 @@ fa_IR: max_emails_per_day_per_user: "حداکثر تعداد ایمیل ارسالی روزانه به کاربران. 0 برای نامحدود." enable_staged_users: "در زمان پردازش ایمیل های دریافتی به صورت خودکار کاربر نمایشی ایجاد کن." maximum_staged_users_per_email: "حداکثر تعداد کاربر خودکار در زمان پردازش ایمیل‌های ورودی" + auto_generated_allowlist: "فهرست ایمیل‌هایی که برای محتوای خودکار بررسی نمی‌شوند. مثال: foo@bar.com|discourse@bar.com" block_auto_generated_emails: "ایمیل‌های دریافتی خودکار را مسدود کن." ignore_by_title: "ایمیل‌های دریافتی را بر اساس عنوان نادیده بگیر." mailgun_api_key: "Secret API سرویس Mailgun برای تایید پیام‌های وب هوک" @@ -1144,6 +1162,7 @@ fa_IR: anonymous_posting_min_trust_level: "حداقل سطح اعتماد برای فعال‌سازی نوشته گذاشتن در حالت ناشناس" anonymous_account_duration_minutes: "برای محافظت از ناشناس ماندن هر N دقیقه برای هر کاربر یک حساب‌کاربری ناشناس بساز. برای مثال: اگر به 600 تنظیم شد٬‌ به محض اینکه 600 دقیقه از نوشته گذشت و کاربر سوئیچ شد چند لحظه بعد٬‌ حساب کاربری جدید ناشناس ساخته می شود. " hide_user_profiles_from_public: "غیر‌فعال‌سازی کارت کاربری، پروفایل کاربر و فهرست راهنمای کاربر برای کاربران ناشناس." + allowed_user_website_domains: "سایت کاربر بر خلاف این دامنه‌ها تایید می‌شود. فهرست مرز‌های مشخص." allow_profile_backgrounds: "به کاربر اجازه بده تا پس‌زمینه نمایه خود را بارگذاری کند." sequential_replies_threshold: "تعداد نوشته‌های کاربر که باید یکجا در موضوع انجام شود تا اخطار پاسخ زیاد پی در پی به او داده شود." get_a_room_threshold: "تعداد نوشته‌هایی که کاربر باید در یک موضوع ایجاد کند تا به او اخطار داده شود." @@ -1247,6 +1266,14 @@ fa_IR: topic: "نتایج" user: "کاربران" results_page: "نتایج جستجو برای '%{term}'" + discourse_connect: + login_error: "خطا در ورود" + not_found: "حساب کاربری پیدا نشد. لطفا با مدیریت سایت تماس بگیرید." + account_not_approved: "حساب کاربری شما در انتظار تایید است. با یک ایمیل به شما اطلاع رسانی خواهد شد." + unknown_error: "مشکلی در حساب کاربری شما وجود دارد. لطفا با مدیریت تماس بگیرید." + timeout_expired: "زمان ورود به پایان رسیده، لطفا دوباره وارد شوید." + no_email: "ایمیلی وجود ندارد. لطفا با مدیر سایت تماس بگیرید." + email_error: "با ایمیل %{email} نمی‌توانید عضو شوید. لطفا با مدیریت تماس بگیرید." original_poster: "نویسنده اصلی" most_posts: "بیشترین نوشته‌ها" most_recent_poster: "جدیدترین نویسنده‌ها" @@ -1323,9 +1350,12 @@ fa_IR: autoclosed_disabled_lastpost: "این موضوع در حال حاضر باز است. پاسخ‌های جدید اجازه‌ی ثبت دارند." auto_deleted_by_timer: "به صورت خودکار توسط زمان‌سنج حذف شده." login: + security_key_description: "وقتی کلید امنیتی فیزیکی خود را آماده کردید٬ دکمه تایید اعتبار زیر را فشار دهید." security_key_alternative: "روش دیگری را امتحان کنید" security_key_authenticate: "تأیید اعتبار با کلید امنیتی" security_key_not_allowed_error: "مراحل تأیید اعتبار کلید امنیتی به پایان رسیده است یا لغو شده است." + security_key_no_matching_credential_error: "هیچ اطلاعات کاربری منطبق با کلید امنیتی پیدا نشد." + security_key_support_missing_error: "دستگاه و یا مرورگر فعلی شما امکان استفاده از کلید امنیتی را ندارد. لطفا از روش ورود جایگزین استفاده شود." not_approved: "حساب کاربری شما هنوز تایید نشده است. وقتی شما آماده ورود به سیستم شوید به شما اطلاع داده می شود." incorrect_username_email_or_password: "نام کاربری، ایمیل یا رمز عبور نادرست است" wait_approval: "به تشکر از ثبت‌نام شما. وقتی حساب کاربری فعال شود به شما اطلاع خواهیم داد." @@ -1346,6 +1376,7 @@ fa_IR: email_too_long: "ایمیل شما بسیار طولانی است. ایمیل باکس ها نباید بیش از 254 نویسه و نام دامنه نباید بیش از 253 نویسه باشد." reserved_username: "این نام کاربری مجاز نیست." missing_user_field: "شما تمام فیلد‌های کاربری را تکمیل نکرده اید" + second_factor_title: "ورود دو مرحله ای" second_factor_backup_description: "لطفا یکی از کدهای پشتیبان را وارد کنید:" second_factor_toggle: backup_code: "به جای آن از یک کد پشتیبان استفاده کنید" @@ -1968,6 +1999,7 @@ fa_IR: base_theme_name: "پایه" light: "روشن" dark: "تیره" + default_theme_name: "پیش‌فرض" light_theme_name: "روشن" dark_theme_name: "تیره" edit_this_page: "ویرایش این صفحه" @@ -2265,11 +2297,14 @@ fa_IR: description: "ایمیل شخص یا گروه پاسخگوی انجمن. برای اطلاعات مهمی مانند پرچم‌های کنترل نشده، به‌روز‌رسانی‌های امنیتی و تماس‌های فوری در صفحه دباره‌ما " contact_url: label: "صفحه وب" + placeholder: "https://www.example.com/contact-us" description: "صفحه تماس عمومی شما در صفحه درباره ما نمایش داده می‌شود." site_contact: label: "پیام‌های خودکار" corporate: title: "سازمان" + colors: + title: "رنگ‌ها" fonts: fields: font_preview: diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml index 2d8b9b4ea76b4..35620dfe2359c 100644 --- a/config/locales/server.fi.yml +++ b/config/locales/server.fi.yml @@ -39,6 +39,7 @@ fi: title: "Discourse" topics: "Ketjut" posts: "viestit" + views: "katselua" loading: "Lataa" powered_by_html: 'Voimanlähteenä Discourse, toimii parhaiten, kun JavaScript on käytössä' sign_up: "Luo tili" @@ -1533,6 +1534,8 @@ fi: enable_badges: "Ota käyttöön ansiomerkkijärjestelmä" enable_whispers: "Salli henkilökunnan yksityiskeskustelu ketjujen sisällä." allow_index_in_robots_txt: "Määritä robots.txt -tiedostossa, että hakurobotit saavat indeksoida tätä sivustoa. Poikkeuksellisissa tapauksissa voit kokonaan kustomoida robots.txt:n." + blocked_email_domains: "Pystyviivalla eroteltu lista sähköposti-verkkotunnuksista, joista käyttäjät eivät voi luoda tiliä. Esimerkiksi mailinator.com|trashmail.net" + allowed_email_domains: "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!" hide_email_address_taken: "Älä kerro käyttäjälle, että käyttäjätili annetulla sähköpostiosoitteella on jo olemassa, kun hän liittyy palstalle tai kun hän pyytää salasanan palauttamista." log_out_strict: "Kun kirjaudutaan ulos, kirjaa käyttäjä ulos kaikilta laitteilta" version_checks: "Pingaa Discourse Hubia päivityksistä ja näytä ilmoitus /admin-hallintapaneelissa, kun uusi versio on saatavilla" @@ -1548,6 +1551,7 @@ fi: min_admin_password_length: "Ylläpitäjän salasanan vähimmäispituus." password_unique_characters: "Vähimmäismäärä eri merkkejä salasanassa." block_common_passwords: "Älä salli salasanoja, jotka ovat 10 000 yleisimmän salasanan joukossa." + discourse_connect_overrides_bio: "Syrjäyttää käyttäjän kuvauksen itsestään käyttäjäprofiilissa ja estää sen muokkaamisen" enable_local_logins_via_email: "Salli käyttäjän pyytää klikattava kirjautumislinkki, joka lähetetään hänen sähköpostiinsa." allow_new_registrations: "Salli uusien käyttäjien rekisteröityminen. Ota tämä asetus pois käytöstä estääksesi uusien käyttäjätilien luomisen." enable_signup_cta: "Näytä palaaville kirjautumattomille käyttäjille ilmoitus, jossa kehotetaan heitä luomaan tili." @@ -1660,6 +1664,7 @@ fi: min_trust_to_send_messages: "Vähimmäisluottamustaso, jolla voi aloittaa yksityisviestiketjuja." min_trust_to_flag_posts: "Vähimmäisluottamustaso, jolla voi liputtaa viestejä" min_trust_to_post_links: "Vähimmäisluottamustaso, jolla voi lisätä linkkejä viesteihin" + allowed_link_domains: "Verkkotunnukset, joihin voi linkittää vaikkei olisikaan riittävällä luottamustasolla, jotta muuten voisi lisätä linkkejä viesteihin" newuser_max_links: "Kuinka monta linkkiä uusi käyttäjä voi lisätä viestiin." newuser_max_attachments: "Kuinka monta liitettä uusi käyttäjä voi lisätä viestiin." newuser_max_mentions_per_post: "Kuinka monta @nimi mainintaa uusi käyttäjä voi lisätä viestiin." @@ -1709,6 +1714,7 @@ fi: privacy_policy_url: "Jos haluat ylläpitää tietosuojaselostetta sivuston ulkopuolella, syötä URL tähän." log_anonymizer_details: "Pidetäänkö käyttäjästä tietoa lokeissa anonymisoinnin jälkeen. Jos noudatat GDPR:ää sinun on kytkettävä tämä pois käytöstä." newuser_spam_host_threshold: "Kuinka monta kertaa uusi käyttäjä voi linkittää samalle sivustolle `newuser_spam_host_posts` viesteissään, ennen kuin se tulkitaan roskapostin lähettämiseksi." + allowed_spam_host_domains: "Lista verkkotunnuksista, joita ei oteta huomioon roskapostin tunnistamisessa. Uusilla käyttäjillä ei ole rajoituksia linkkaamisessa näihin tunnuksiin." topic_view_duration_hours: "Laske uusi ketjun katselu kerran per IP/käyttäjä joka N:s tunti" user_profile_view_duration_hours: "Laske uusi profiilin katselu kerran per IP/käyttäjä joka N:s tunti" levenshtein_distance_spammer_emails: "Verrattaessa sähköpostiosoitteita tunnettuihin roskapostittajiin, näin monen merkin ero saa vielä aikaan löydöksen." @@ -1722,6 +1728,7 @@ fi: min_first_post_typing_time: "Minimimäärä aikaa millisekunneissa, joka käyttäjän täytyy kirjoittaa ensimmäistä viestiään. Jos rajaa ei saavuteta, viesti lisätään automaattisesti hyväksyttävien jonoon. Aseta 0 ottaaksesi pois käytöstä (ei suositella)." auto_silence_fast_typers_on_first_post: "Hiljennä automaattisesti käyttäjät, joiden ensimmäisen viestin kirjoittamiseen ei kulu min_first_post_typing_time" auto_silence_fast_typers_max_trust_level: "Enimmäisluottamustaso, jolla nopea kirjoittaja voidaan hiljentää automaattisesti" + auto_silence_first_post_regex: "Isoista ja pienistä kirjaimista riippumaton säännöllinen lauseke, joka osuessaan aiheuttaa käyttäjän ensimmäisen viestin hiljennyksen ja viesti viedään arvioitavaksi. Esimerkki: hemmetti|a[bc]a aiheuttaa hiljennyksen, jos viesti sisältää sanan 'hemmetti', 'aba' tai 'aca'. Koskee vain käyttäjän ensimmäistä viestiä." reviewable_claiming: "Tarvitseeko arvioitava sisältö omia ennen kuin sen voi käsitellä?" reviewable_default_topics: "Oletuksena, näytä arvioitava sisältö ryhmiteltynä ketjuittain" reviewable_default_visibility: "Älä näytä arvioitavia asioita jollei niiden prioriteetti ole vähintään tämän verran" @@ -1741,6 +1748,7 @@ fi: max_emails_per_day_per_user: "Käyttäjälle päivässä lähetettävien sähköpostien enimmäismäärä. Aseta 0, jos et halua rajoittaa." enable_staged_users: "Luo automaattisesti esikäyttäjiä, kun saapuvia sähköposteja käsitellään." maximum_staged_users_per_email: "Enimmäismäärä automaattisesti luotuja esikäyttäjiä, kun käsitellään saapuvaa sähköpostia." + auto_generated_allowlist: "Lista sähköpostiosoitteista, joiden viestejä ei tarkasteta automaattisesti luodun sisällön osalta. Esimerkki: foo@bar.com|discourse@bar.com" block_auto_generated_emails: "Estä saapuvat sähköpostit, jotka tunnistetaan automaattisesti luoduiksi." ignore_by_title: "Jätä sähköpostit huomiotta niiden otsikon perusteella." mailgun_api_key: "Mailgunin Secret API key, jolla verifioidaan webhook-viestit." @@ -1809,6 +1817,7 @@ fi: ignored_users_message_gap_days: "Millaisin väliajoin henkilökuntaa huomautetaan käyttäjästä, jonka monet muut ovat estäneet." clean_up_inactive_users_after_days: "Kuinka monen päivän kuluttua epäaktiivinen käyttäjä (luottamustaso 0 eikä yhtään viestiä) poistetaan. Arvo 0 poistaa siivouksen käytöstä." user_selected_primary_groups: "Salli käyttäjän asettaa ensisijainen ryhmänsä itse" + allowed_user_website_domains: "Käyttäjän kotisivu voi olla näiden verkkotunnusten alainen. Pystyviivoin erotettu lista." allow_profile_backgrounds: "Salli käyttäjien ladata profiilin taustakuva." sequential_replies_threshold: "Kuinka monen peräkkäisen viestin jälkeen yhdessä ketjussa käyttäjää muistutetaan peräkkäisistä vastauksista." get_a_room_threshold: "Kuinka monta viestiä tulee kohdistaa samalle käyttäjälle samassa ketjussa, jotta näytetään varoitus." @@ -1842,6 +1851,7 @@ fi: embed_topics_list: "Tue ketjulistausten HTML-upottamista" embed_truncate: "Typistä upotetut viestit." embed_support_markdown: "Tue Markdown-muotoilua upotetuissa viesteissä." + allowed_embed_selectors: "Pilkuin eroteltu luettelo CSS-elementeistä, jotka on sallittu upotuksissa." allowed_href_schemes: "Linkeissä sallitut skeemat http:n ja https:n lisäksi." embed_post_limit: "Upotettavien viestien maksimimäärä." embed_username_required: "Käyttäjänimi vaaditaan ketjun luomiseksi." @@ -1884,6 +1894,7 @@ fi: default_other_enable_quoting: "Ota oletuksena käyttöön lainaaminen valitsemalla tekstiä." default_other_enable_defer: "Ota ketjun lykkäystoiminto käyttöön oletuksena." default_other_dynamic_favicon: "Näytä oletuksena uusien/päivittyneiden ketjujen määrä selaimen ikonissa." + default_other_skip_new_user_tips: "Ohita uuden käyttäjän aloittamisvinkit ja -ansiomerkit." default_other_like_notification_frequency: "Ilmoita käyttäjiä tykkäyksistä oletuksena" default_topics_automatic_unpin: "Aseta oletukseksi, että ketjun kiinnitys poistuu automaattisesti, jos käyttäjä selaa keskustelun loppuun" default_categories_watching: "Lista oletuksena tarkkailtavista alueista." @@ -1959,8 +1970,14 @@ fi: max_username_length_exists: "Käyttäjänimen enimmäispituus ei voi olla suurempi kuin pisin käyttäjänimi (%{username})." max_username_length_range: "Enimmäisarvo ei voi olla pienempi kuin vähimmäisarvo." invalid_hex_value: "Väriarvon täytyy olla kuusinumeroinen heksadesimaalikoodi." + allowed_unicode_usernames: + regex_invalid: "Säännöllinen lauseke ei kelpaa: %{error}" + leading_trailing_slash: "Säännöllinen lauseke ei voi alkaa eikä loppua kauttaviivalla." unicode_usernames_avatars: "Sisäinen avatarjärjestelmä ei tue Unicode-käyttäjänimiä." list_value_count: "Luettelon täytyy sisältää täsmälleen %{count} arvoa." + placeholder: + discourse_connect_provider_secrets: + key: "www.example.com" search: extreme_load_error: "Sivusto on erittäin raskaan kuormituksen alla, yritä myöhemmin uudelleen" within_post: "#%{post_number} käyttäjältä %{username}" @@ -1971,6 +1988,15 @@ fi: results_page: "Tulokset hakusanalle '%{term}'" audio: "[audio]" video: "[video]" + discourse_connect: + login_error: "Virhe kirjauduttaessa" + not_found: "Tiliäsi ei löydetty. Ota yhteyttä sivuston ylläpitäjään." + account_not_approved: "Tilisi odottaa hyväksyntää. Saat sähköpostin, kun tunnuksesi on hyväksytty." + unknown_error: "Tiliisi liittyen on tapahtunut virhe. Ota yhteyttä sivuston ylläpitäjään." + timeout_expired: "Kirjautuminen on vanhentunut, yritä kirjautua sisään uudestaan." + no_email: "Sähköpostiosoitetta ei annettu. Ota yhteyttä sivuston ylläpitäjään." + blank_id_error: " Vaaditaan `external_id` mutta se oli tyhjä" + email_error: "Tunnusta ei voitu luoda osoitteelle %{email}. Ota yhteyttä sivuston ylläpitäjään." original_poster: "Alkuperäinen kirjoittaja" most_posts: "Eniten viestejä" most_recent_poster: "Uusin kirjoittaja" @@ -2088,6 +2114,7 @@ fi: missing_user_field: "Et ole täyttänyt kaikkia kenttiä" auth_complete: "Todentaminen suoritettu." click_to_continue: "Jatka klikkaamalla tästä." + second_factor_title: "Kaksivaiheinen tunnistautuminen" second_factor_description: "Syötä vaadittava todennuskoodi sovelluksestasi:" second_factor_backup_description: "Syötä yksi varmuuskoodeistasi" invalid_second_factor_code: "Todennuskoodi ei kelpaa. Yhtä koodia voi käyttää vain kerran." @@ -2329,6 +2356,8 @@ fi: Yhteisö liputti viestin ja se on nyt piilotettu. **Koska viestisi on piilotettu useammin kuin kerran, se pysyy piilotettuna kunnes henkilökunnan jäsen selvittää tilanteen.** Saat lisätietoa [yhteisön säännöistä](%{base_url}/guidelines). + queued_by_staff: + title: "Viesti odottaa hyväksyntää" flags_disagreed: title: "Henkilökunta palautti viestin" subject_template: "Henkilökunta palautti viestin" @@ -2396,6 +2425,8 @@ fi: Toivottavasti viihdyt! [prefs]: %{user_preferences_url} + tl2_promotion_message: + subject_template: "Onnittelut luottamustasonoususta!" backup_succeeded: title: "Varmuuskopiointi onnistui" subject_template: "Varmuuskopiointi suoritettu onnistuneesti" @@ -3078,6 +3109,9 @@ fi: confirm_new_email: title: "Vahvista uusi sähköpostiosoite" subject_template: "[%{email_prefix}] Vahvista uusi sähköpostiosoite" + confirm_new_email_via_admin: + title: "Vahvista uusi sähköpostiosoite" + subject_template: "[%{email_prefix}] Vahvista uusi sähköpostiosoite" confirm_old_email: title: "Vahvista vanha sähköpostiosoite" subject_template: "[%{email_prefix}] Vahvista nykyinen sähköpostiosoitteesi" @@ -3160,6 +3194,8 @@ fi: Jos se olit sinä, hyvä! Sinun ei tarvitse reagoida mitenkään. Jollet se ollut sinä, [tarkastele käynnissä olevia istuntojasi](%{base_url}/my/preferences/account) ja harkitse salasanasi vaihtamista. + post_approved: + title: "Viestisi hyväksyttiin" page_forbidden: title: "Hups! Tämä sivu on yksityinen." site_setting_missing: "\"%{name}\" -asetus on pakollinen." @@ -3240,6 +3276,7 @@ fi: dark_rose: "Tumma ruusu" wcag_dark: "WCAG Tumma" wcag_dark_theme_name: "WCAG Tumma" + default_theme_name: "Oletus" light_theme_name: "Vaalea" dark_theme_name: "Tumma" neutral_theme_name: "Neutraali" diff --git a/config/locales/server.gl.yml b/config/locales/server.gl.yml index 97cde4cc0b812..2d800436fc087 100644 --- a/config/locales/server.gl.yml +++ b/config/locales/server.gl.yml @@ -3499,6 +3499,8 @@ gl: Se foi vostede, perfecto! Non ten que facer máis nada. Se non o foi, [revise a súa sesión actual](%{base_url}/my/preferences/account) e valore cambiar o de contrasinal. + post_approved: + title: "A súa publicación foi aprobada" page_forbidden: title: "Oopa! Esta páxina é privada." page_not_found: diff --git a/config/locales/server.hu.yml b/config/locales/server.hu.yml index 4f10755721c4c..337f1889d803b 100644 --- a/config/locales/server.hu.yml +++ b/config/locales/server.hu.yml @@ -51,6 +51,8 @@ hu: remove_posts_deleted_by_author: "Szerző által törölve" redirect_warning: "Nem tudtuk megerősíteni, hogy a kiválasztott hivatkozás tényleg közzé lett-e téve a fórumban. Ha mindenképp folytatni szeretné, akkor kattintson a lenti hivatkozásra." on_another_topic: "Egy másik témában" + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} általa: %{username}" themes: bad_color_scheme: "A téma nem frissíthető, érvénytelen színpaletta" other_error: "Hiba történt az oldal stílusának frissítésekor" @@ -156,6 +158,8 @@ hu: not_found_json: "A meghívási token érvénytelen. Lépjen kapcsolatba a stábbal." user_exists: "Nincs szükség %{email} meghívására, már rendelkezik fiókkal." confirm_email: "

Mindjárt készen is vagyunk! Elküldtünk egy megerősítő e-mailt a %{email} címre. Kérlek, kövesd a benne található instrukciókat, és aktiváld a fiókodat.

Ha pár percen belül nem érkezne meg, ne felejtsd el a SPAM és a Promóciók mappában is ellenőrizni!

" + disabled_errors: + invalid_access: "Nincs engedélye a kért erőforrás megtekintéséhez." topic_invite: receiver_does_not_allow_pm: "Sajnáljuk, de a felhasználó nem engedélyezi, hogy privát üzeneteket küldj nekik." sender_does_not_allow_pm: "Sajnáljuk, nem engedélyezed, hogy a felhasználó személyes üzeneteket küldjön neked." @@ -229,6 +233,9 @@ hu: topics_in_category: "Témák a(z) „%{category}” kategóriában" rss_posts_in_topic: "A(z) „%{topic}” RSS hírcsatornája" rss_topics_in_category: "A(z) „%{category}” témáinak RSS hírcsatornája" + rss_num_posts: + one: "%{count} bejegyzés" + other: "%{count} bejegyzés" read_full_topic: "Teljes téma elolvasása" private_message_abbrev: "Üzenet" rss_description: @@ -253,9 +260,11 @@ hu: bookmarks: reminders: later_today: "A mai nap folyamán" + next_business_day: "Következő munkanap" tomorrow: "Holnap" next_week: "Jövő héten" next_month: "Jövő hónapban" + custom: "Egyéni dátum és idő" groups: errors: can_not_modify_automatic: "Nem módosíthat egy automata csoportot" @@ -353,6 +362,7 @@ hu: staff_category_name: "Stáb" staff_category_description: "Privát kategória a stáb számára. Ezeket a témákat csak az adminisztrátorok és moderátorok látják." discourse_welcome_topic: + title: "Üdvözöljük a Discourse-ban" body: |2 A rögzített téma első bekezdése üdvözlő üzenetként fog megjelenni a kezdőlap összes új látogatója előtt. Ez fontos! @@ -524,6 +534,7 @@ hu: authorizing_new: title: "Erősítse meg az új e-mail címét" description: "Kérjük, erősítsd meg, hogy szeretnéd az e-mail címedet a következőre módosítani:" + description_add: "Kérjük, erősítsd meg, hogy alternatív e-mail címet szeretnél hozzáadni:" authorizing_old: title: "E-mail-cím módosítása" description: "Kérjük, erősítsd meg az e-mail címed megváltoztatását" @@ -641,6 +652,8 @@ hu: otp_description: 'Szeretné, hogy a(z) „%{application_name}” hozzáférjen ehhez az oldalhoz?' otp_confirmation: confirm_title: Tovább a(z) %{site_name} oldalra + logging_in_as: Bejelentkezés %{username}ként + confirm_button: Bejelentkezés befejezése scopes: one_time_password: "Hozzon létre egyszeri bejelentkezési tokent" reports: @@ -723,6 +736,7 @@ hu: yaxis: "Felhasználók száma" labels: level: Szint + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: xaxis: "Típus" yaxis: "Felhasználók száma" @@ -886,14 +900,18 @@ hu: limit_suggested_to_category: "Csak a javasolt kategóriákból származó témakörök jelenhetnek meg a javasolt témakörökben." suggested_topics_max_days_old: "A javasolt olvasatlan témák nem lehetnek több, mint n naposak." suggested_topics_unread_max_days_old: "A javasolt olvasatlan témák nem lehetnek több, mint n naposak." + selectable_avatars: "A felhasználó által választható avatarok listája." recompress_original_jpg_quality: "A feltöltött képfájlok minősége (1 – legalacsonyabb, 99 – legjobb, 100 – letiltás)." image_preview_jpg_quality: "Az átméretezett képfájlok minősége (1 – legalacsonyabb, 99 – legjobb, 100 – letiltás)." + dark_mode_none: "Egyik sem" cold_age_days_low: "Ennyi nap beszélgetés után az utolsó tevékenység dátuma kissé elhomályosul." reply_by_email_enabled: "E-mail válaszok engedélyezése." block_auto_generated_emails: "Az automatikusan generáltként azonosított bejövő e-mailek letiltása." email_editable: "Engedélyezi a felhasználóknak, hogy a regisztráció után megváltoztassák az e-mail címüket." suppress_digest_email_after_days: "Letiltja az összefoglaló e-maileket azon felhasználók számára, akik nem láttak a webhelyen (n) napnál hosszabb ideig." digest_suppress_categories: "Letiltom ezeket a kategóriákat az összefoglaló e-mailekből." + embed_truncate: "Beágyazott bejegyzések rövidítése." + embed_post_limit: "A bejegyzések maximális száma a beágyazásban." enable_emoji: "Emodzsi engedélyezése" enable_emoji_shortcuts: "A gyakori mosolyt jelző szövegek, mint a :) :p és :( emodzsikká lesznek alakítva" emoji_set: "Hogy szeretné az emodzsiját?" @@ -943,6 +961,7 @@ hu: login: invalid_second_factor_method: "A kiválasztott kéttényezős hitelesítés-módszer érvénytelen." not_enabled_second_factor_method: "A kiválasztott kéttényezős hitelesítés-módszer nincs engedélyezve a fiókjában." + security_key_no_matching_credential_error: "A megadott biztonsági kulcsban nem található megfelelő hitelesítő adat." not_approved: "A fiókját még nem engedélyezték. Értesítve lesz, amint bejelentkezhet." incorrect_username_email_or_password: "Hibás felhasználónév, e-mail vagy jelszó" wait_approval: "Köszönjük, hogy regisztrált! Értesíteni fogjuk, amint elfogadták a kérelmét." @@ -1033,6 +1052,8 @@ hu: A közösség megjelölte ezt a bejegyzést, és most el van rejtve. ** Mivel ez a bejegyzés már egynél többször lett problémásként megjelölve, a bejegyzés most már rejtve marad, amíg valamelyik admin személyesen meg nem nézi, és esetleg fel nem oldja a láthatatlanná tételt. ** További útmutatásért olvasd el a [fórumunk szabályzatát](%{base_url}/guidelines). + queued_by_staff: + title: "A bejegyzés jóváhagyásra vár." flags_disagreed: text_body_template: | Szia! @@ -1135,6 +1156,13 @@ hu: Ismeretlen e-mail címről válaszoltál. Kérünk, használd azt az e-mail címet, amit a regisztrációkor adtál meg! + Ha úgy gondolod, hogy ez egy hiba, [lépj kapcsolatba a személyzet tagjaial] (%{base_url}/about). + email_reject_screened_email: + text_body_template: | + Sajnáljuk, de az ide küldött %{destination} e-mail üzeneted (címe %{former_title}) nem ért célba. + + Az e-mail cím, amiről válaszoltál le van tiltva. + Ha úgy gondolod, hogy ez egy hiba, [lépj kapcsolatba a személyzet tagjaial] (%{base_url}/about). email_reject_not_allowed_email: text_body_template: | @@ -1596,6 +1624,8 @@ hu: Ha te voltál, nagyszerű! Nincsen további teendőd. Ha nem te voltál, kérlek [nézd át a meglévő munkameneteidet](%{base_url}/my/preferences/account), és változtasd meg a jelszavad! + post_approved: + title: "A bejegyzésedet jóváhagytuk" page_forbidden: title: "Hoppá! Az az oldal magánjellegű." page_not_found: @@ -1632,6 +1662,7 @@ hu: latte: "Tejeskávé" summer: "Nyár" dark_rose: "Sötét rózsa" + default_theme_name: "Alapértelmezett" light_theme_name: "Világos" dark_theme_name: "Sötét" neutral_theme_name: "Semleges" @@ -1915,6 +1946,7 @@ hu: placeholder: "name@example.com" contact_url: label: "Weboldal" + placeholder: "https://www.example.com/contact-us" site_contact: label: "Automatikus üzenetek" corporate: @@ -1923,6 +1955,12 @@ hu: company_name: label: "Cégnév" placeholder: "Példa szervezet" + colors: + title: "Színek" + fonts: + fields: + font_preview: + label: "Előnézet" logos: title: "Logók" fields: @@ -1961,6 +1999,8 @@ hu: replied: '%{username} válaszolt neked itt: "%{topic}" - %{site_title}' posted: '%{username} hozzászólt itt: "%{topic}" - %{site_title}' private_message: '%{username} küldött egy személyes üzenetet itt: "%{topic}" - %{site_title}' + linked: '%{username} válaszolt neked itt: "%{topic}" - %{site_title}' + watching_first_post: '%{username} új témát hozott létre: "%{topic}" - %{site_title}' confirm_title: "Értesítések bekapcsolva – %{site_title}" confirm_body: "Siker! Értesítések engedélyezve." custom: "Értesítés %{username} felhasználótól itt: %{site_title}" @@ -2012,6 +2052,7 @@ hu: description: "Bejegyzés törlése, és ha ez az első bejegyzés, akkor a téma törlése" delete_and_agree_replies: description: "Bejegyzés törlése a válaszokkal együtt, és ha ez az első bejegyzés, akkor a téma törlése" + confirm: "Biztos vagy benne, hogy törölni szeretnéd a hozzászólásra adott válaszokat is?" disagree_and_restore: description: "A bejegyzés visszaállítása, hogy minden felhasználó láthassa." disagree: diff --git a/config/locales/server.hy.yml b/config/locales/server.hy.yml index 20cfe16c26bd2..224a1aafdd6b2 100644 --- a/config/locales/server.hy.yml +++ b/config/locales/server.hy.yml @@ -39,6 +39,7 @@ hy: title: "Discourse" topics: "Թեմաներ" posts: "գրառումներ" + views: "դիտումների" loading: "Բեռնում" powered_by_html: 'Գործարկված է Discourse-ի կողմից, լավագույնս աշխատում է, երբ JavaScript-ը միացված է' sign_up: "Գրանցվել" @@ -50,6 +51,8 @@ hy: remove_posts_deleted_by_author: "Ջնջված է հեղինակի կողմից" redirect_warning: "Մենք չկարողացանք հաստատել, որ Ձեր ընտրած հղումը իրականում հրապարակվել է ֆորումում: Եթե ամեն դեպքում ցանկանում եք շարունակել, ընտրեք ներքևի հղումը:" on_another_topic: "Մեկ այլ թեմայում" + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} %{username}-ի կողմից" themes: bad_color_scheme: "Անհնար է թարմացնել թեման, անվավեր գունապնակ" other_error: "Թեման թարմացնելիս ինչ-որ բան այնպես չէ ընթացել" @@ -171,6 +174,8 @@ hy: invite: user_exists: "Կարիք չկա հրավիրել %{email} -ին, նա արդեն իսկ ունի հաշիվ!" confirm_email: "

Դուք գրեթե վերջացրել եք! Մենք ակտիվացման նամակ ենք ուղարկել Ձեր էլ. հասցեին: Խնդրում ենք հետևել նամակի հրահանգներին Ձեր հաշվի ակտիվացման համար:

Եթե այն չի հասնում, ստուգեք Ձեր սպամի թղթապանակը:

" + disabled_errors: + invalid_access: "Դուք թույլտվություն չունեք դիտելու հարցված ռեսուրսը:" bulk_invite: file_should_be_csv: "Վերբեռնվող ֆայլը պետք է լինի csv ֆորմատի:" error: "Այդ ֆայլը վերբեռնելիս տեղի է ունեցել սխալ: Խնդրում ենք փորձել կրկին ավելի ուշ: " @@ -258,6 +263,9 @@ hy: topics_in_category: "'%{category}' կատեգորիայի թեմաները" rss_posts_in_topic: "RSS լրահոս հետևյալի համար՝ '%{topic}'" rss_topics_in_category: "RSS լրահոս '%{category}' կատեգորիայի թեմաների համար" + rss_num_posts: + one: "%{count} հրապարակում" + other: "%{count} գրառում" read_full_topic: "Կարդալ ամբողջական թեման" private_message_abbrev: "Նմկ" rss_description: @@ -715,6 +723,7 @@ hy: instructions: 'Մենք հենց նոր գեներացրինք նոր օգտատիրոջ API key՝ "%{application_name}" -ի հետ պգտագործելու համար, խնդրում ենք տեղադրել հետևյալ key -ը Ձեր հավելվածում.' otp_confirmation: confirm_title: Շարունակել դեպի %{site_name} + logging_in_as: Մուտք գործել որպես %{username} confirm_button: Ավարտել Մուտքը no_trust_level: "Ներողություն, Դուք չունեք օգտատիրոջ API -ի համար պահանջվող վստահության մակարդակը " generic_error: "Ներողություն, մենք չկարողացանք թողարկել օգտատիրոջ API key-եր, հնարավոր է՝ այս հատկանիշը անջատված է կայքի ադմինի կողմից:" @@ -853,6 +862,7 @@ hy: labels: level: Մակարդակ description: "Ըստ վստահության մակարդակի խմբավորված օգտատերերի քանակ:" + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: title: "Օգտատերեր ըստ Տիպի" xaxis: "Տիպ" @@ -1113,6 +1123,8 @@ hy: show_pinned_excerpt_mobile: "Ցուցադրել հատվածը ամրագրված թեմաների վրա հեռախոսային տարբերակում:" show_pinned_excerpt_desktop: "Ցուցադրել հատվածը ամրագրված թեմաների վրա համակարգչային տարբերակում:" post_onebox_maxlength: "Սմարթ ներդիրի վերածված Discourse գրառման առավելագույն երկարությունը սիմվոլներով:" + blocked_onebox_domains: "Դոմենների ցանկը, որոնք երբեք չեն վերածվի սմարթ-ներդիրի:" + allowed_inline_onebox_domains: "Դոմենների ցանկ, որոնք կվերածվեն սմարթ-ներդիրի փոքրացված տեսքով՝ առանց վերնագրի կապակցված լինելու դեպքում" max_oneboxes_per_post: "Գրառման մեջ սմարթ-ներդիրների առավելագույն քանակը:" logo: "Ձեր կայքի վերևի ձախ կողմում գտնվող լոգոյի նկարը: Օգտագործեք լայն ուղղանկյուն նկար 120 երկարությամբ և 3:1 -ից բարձր հարաբերակցությամբ: Եթե թողնեք դատարկ, կցուցադրվի կայքի վերնագրի տեքստը:" logo_small: "Ձեր կայքի վերևի ձախ կողմում գտնվող փոքր լոգոյի նկարը, որը ցուցադրվում է ներքև իջնելիս: Օգտագործեք քառակուսի 120 × 120 նկար: Եթե թողնեք դատարկ, կցուցադրվի հիմնական նկարը:" @@ -1153,6 +1165,9 @@ hy: maximum_session_age: "Օգտատերը կմնա մուտքագրված վերջին այցելությունից n ժամ անց" enable_escaped_fragments: "Վերադարձ դեպի Google's Ajax-Crawling API , եթե ոչ մի ցանցային տվայլների հավաքագրիչ (webcrawler) հայտնաբերված չէ: Այցելեք https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" cors_origins: "Թույլատրելի origin-ներ խաչաձև origin հարցումների համար (CORS): Յուրաքանչյուր origin պետք է ներառի http:// կամ https://: DISCOURSE_ENABLE_CORS env փոփոխականը պետք է սահմանված լինի true ՝ CORS -ի միացման համար:" + use_admin_ip_allowlist: "Ադմինները կարող են մուտք գործել, եթե միայն ունեն Ցուցադրված IP-ների ցանկում սահմանված IP հասցե (Admin > Logs > Screened Ips):" + blocked_ip_blocks: "Մասնավոր IP արգելափակումների ցանկ, որոնք երբեք չպետք է ենթարկվեն տվյալների հավաքագրման Discourse-ի կողմից:" + allowed_internal_hosts: "Ներքին հոսթերի ցանկ, որը discourse-ը կարող է ապահով հավաքագրել սմարթ-ներդիրի և այլ նպատակների համար" allowed_iframes: "iframe src դոմենի նախամասնիկներ, որ discourse-ը կարող է ապահով թույլատրել գրառումներում" slow_down_crawler_user_agents: "Ցանցային տվյալների հավաքագրիչների օգտատերերի գործակալներ, որոնք պետք է սահմանափակված լինեն robots.txt-ով՝ օգտագործելով Crawl-delay ուղղորդիչը" slow_down_crawler_rate: "Եթե slow_down_crawler_user_agents -ը որոշված է, այս գնահատականը կկիրառվի տվյալների բոլոր հավաքագրիչների նկատմամբ (հարցումների միջև դադարի վայրկյանների քանակը)" @@ -1183,6 +1198,8 @@ hy: email_token_valid_hours: "Մոռացել եմ գաղտնաբառը / ակտիվացնել հաշիվը տոկենները վավեր են (n) ժամ: " enable_badges: "Միացնել կրծքանշանների համակարգը" enable_whispers: "Թույլատրել անձնակազմի մասնավոր հաղորդակցությունը թեմաների ներսում:" + blocked_email_domains: "Էլ. փոստի դոմենների ցանկ՝ բաժանված խողովակի սիմվոլով( | ), որոնցով օգտատերերին չի թույլատրվում գրանցել հաշիվ: Օրինակ՝ mailinator.com|trashmail.net" + allowed_email_domains: "Էլ. փոստի դոմենների ցանկ՝ բաժանված խողովակի սիմվոլով( | ), որոնցով օգտատերերը ՊԵՏՔ Է գրանցեն հաշիվներ: ՈՒՇԱԴՐՈՒԹՅՈՒՆ՝ այս ցանկի դոմեններից տարբեր էլ. հասցեներ ունեցող օգտատերերին չի թույլատրվի!" hide_email_address_taken: "Գրանցման ընթացքում և ՛մոռացել եմ գաղտնաբառը՛ էջում օգտատերերին ցույց չտալ, որ տրված էլ. հասցեով հաշիվ գոյություն ունի:" log_out_strict: "Ելքագրվելիս դուրս գալ օգտատիրոջ ԲՈԼՈՐ գործընթացներից բոլոր սարքերի վրա:" version_checks: "Ստուգել Discourse Hub -ը տարբերակի թարմացումների համար և ցուցադրել նոր տարբերակի հաղորդագրությունները /admin կառավարման հարթակում:" @@ -1196,6 +1213,7 @@ hy: min_admin_password_length: "Ադմինի գաղտնաբառի նվազագույն երկարությունը:" password_unique_characters: "Եզակի սիմվոլների նվազագույն քանակը, որ պետք է ունենա գաղտնաբառը:" block_common_passwords: "Չթույլատրել գաղտնաբառերը, որոնք գտնվում են 10000 ամենատարածված գաղտնաբառերի ցանկում:" + discourse_connect_overrides_bio: "Վերասահմանում է օգտատիրոջ կենսագրությունը իր պրոֆիլում և կանխարգելում է օգտատիրոջը այն փոփոխելուց" enable_local_logins_via_email: "Թույլատրել օգտատերերին պահանջել մեկ սեղմումով մուտքի հղում, որը կուղարկվի նրանց էլ. նամակի միջոցով:" allow_new_registrations: "Թույլատրել նոր օգտատերերի գրանցումները: Հանեք այս նշումը՝ արգելելու նոր հաշիվների ստեղծումը:" enable_signup_cta: "Վերադարձող անանուն օգտատերերին ցուցադրել նշում, որը կօգնի նրանց գրանցել հաշիվ:" @@ -1306,6 +1324,7 @@ hy: min_trust_to_send_messages: "Նոր անձնական նամակ ստեղծելու համար պահանջվող նվազագույն վստահության մակարդակը:" min_trust_to_flag_posts: "Գրառումների դրոշակավորման համար անհրաժեշտ նվազագույն վստահության մակարդակը" min_trust_to_post_links: "Գրառումներում հղումներ ներառելու համար պահանջվող նվազագույն վստահության մակարդակը:" + allowed_link_domains: "Դոմենները, որոնց օգտատերերը կարող են հղում կատարել, անգամ եթե չունեն հղում հրապարակելու համապատասխան վստահության մակարդակ:" newuser_max_links: "Քանի հղում կարող է նոր օգտատերը ավելացնել գրառմանը:" newuser_max_attachments: "Քանի կցորդ կարող է նոր օգտատերն ավելացնել գրառմանը:" newuser_max_mentions_per_post: "Maximum number of @անվան ծանուցումների առավելագույն քանակը, որ նոր օգտատերը կարող է օգտատործել գրառման մեջ:" @@ -1328,6 +1347,7 @@ hy: desktop_category_page_style: "Արտաքին ոճ /կատեգորիաներ էջի համար:" category_colors: "Կատեգորիաների համար թույլատրելի գույների տանսվեցերորդական արժեքների ցանկ:" category_style: "Կատեգորիայի կրծքանշանների համար արտաքին ոճը:" + dark_mode_none: "Ոչ մի" max_attachment_size_kb: "Կցված ֆայլերի վերբեռնման առավելագույն չափը կԲ-երով: Սա պետք էկլարգավորվի nginx-ում (client_max_body_size) / apache -ում, ինչպես նաև՝ proxy -ում:" authorized_extensions: "Վերբեռնման համար թույլատրելի ֆայլերի ընդլայնումների ցանկը (օգտագործեք '*' ֆայլերի բոլոր տիպերը միացնելու համար)" authorized_extensions_for_staff: "Ֆայլերի ընդլայնումների ցանկ, որոնք թույլատրելի են վերբեռնման համար անձնակազմի անդամ օգտատերերի համար, ի հավելումն `authorized_extensions` կայքի կարգավորման մեջ սահմանված ցանկի: (օգտագործեք '*' ֆայլերի բոլոր տիպերը միացնելու համար)" @@ -1351,6 +1371,7 @@ hy: privacy_policy_url: "Եթե ունեք այլ վայրում տեղադրված Գաղտնիության Քաղաքականության փաստաթուղթ, որը ցանկանում եք օգտագործել, տեղադրեք ամբողջական URL-ը այստեղ:" log_anonymizer_details: "Պահպանել արդյոք օգտատիրոջ տվյլաները գրառումներում անվանազրկումից հետո: GDPR -ի օգտագործման ժամանակ Դուք պետք է անջատեք սա:" newuser_spam_host_threshold: "Քանի անգամ նոր օգտատերը կարող է հրապարակել միևնույն հոսթի հղումը` ըստ իր `newuser_spam_host_threshold` գրառումների սահմանաչափի՝ մինչև սպամ համարվելը:" + allowed_spam_host_domains: "Սպամ հոսթի փորձարկումից բացառված դոմենների ցանկ: Նոր օգտատերերին երբեք չի արգելվի այս դոմենների հղումներով գրառումների ստեղծումը:" topic_view_duration_hours: "Հաշվարկել թեմայի նոր դիտում՝ ըստ յուրաքանչյուր IP-ի/Օգտատիրոջ յուրաքանչյուր N ժամը մեկ" user_profile_view_duration_hours: "Հաշվարկել օգտատիրոջ պրոֆիլի նոր դիտում՝ ըստ յուրաքանչյուր IP-ի/Օգտատիրոջ յուրաքանչյուր N ժամը մեկ" levenshtein_distance_spammer_emails: "Սպամմերի էլ. նամակների համապատասխանեցման ժամանակ սիմվոլների տարբերության քանակը, որը դեռևս թույլ կտա անորոշ համընկնում:" @@ -1364,6 +1385,7 @@ hy: min_first_post_typing_time: "Ժամանակի նվազագույն քանակը միլիվայրկյաններով, որքան օգտատերը պետք է գրի առաջին գրառման ընթացքում, եթե սահմանը չի հատվել, գրառումը ավտոմատ կերպով մուտք կգործի հաստատման կարիք ունեցողների հերթի մեջ: Սահմանեք 0 անջատելու համար (խորհուրդ չի տրվում)" auto_silence_fast_typers_on_first_post: "Ավտոմատ կերպով լռեցնել այն օգտատերերին, որոնք չեն համապատասխանում min_first_post_typing_time-ին" auto_silence_fast_typers_max_trust_level: "Առավելագույն վստահության մակարդակը՝ արագ գրողներին ավտոմատ լռեցնելու համար" + auto_silence_first_post_regex: "Աննշան կարգավորում, որը անցած լինելու դեպքում կառաջացնի օգտատիրոջ առաջին գրառման լռեցում և ուղարկում հաստատման հերթի: Օրինակ՝ raging|a[bc]a -ը կառաջացնի առաջին հերթին raging կամ aba կամ aca պարունակող բոլոր գրառումների լռեցում: Կիրառվում է միայն առաջին գրառման հանդեպ:" reply_by_email_enabled: "Միացնել էլ. փոստի միջոցով թեմաներին պատասխանելը:" reply_by_email_address: "Էլ. փոստի միջոցով պատասխանի մուտքային էլ. հասցեների ձևանմուշ, օրինակ՝ %%{reply_key}@reply.example.com կամ replies+%%{reply_key}@example.com" alternative_reply_by_email_addresses: "Էլ. նամակի միջոցով պատասխանի համար մուտքային հասցեների այլընտրանքային ձևանմուշների ցանկ: Օրինակ՝ %%{reply_key}@reply.example.com|replies+%%{reply_key}@example.com" @@ -1379,6 +1401,7 @@ hy: max_emails_per_day_per_user: "Օգտատերերին ամեն օր ուղարկվող էլ. նամակների առավելագույն քանակը: 0՝ սահմանափակումը անջատելու համար" enable_staged_users: "Ավտոմատ կերպով ստեղծել աստիճանավորված օգտատերեր՝ մուտքային նամակները մշակելիս:" maximum_staged_users_per_email: "Մուտքային էլ. նամակ մշակելիս ստեղծվող աստիճանավորված օգտատերերի առավելագույն քանակը:" + auto_generated_allowlist: "Էլ. հասցեների ցանկ, որոնք չեն ստուգվի ավտո-գեներացված բովանդակության նկատմամբ: Օրինակ՝ foo@bar.com|discourse@bar.com" block_auto_generated_emails: "Խոչընդոտել մուտքային էլ. նամակները, որոնք ճանաչվել են որպես ավտոմատ գեներացված:" ignore_by_title: "Անտեսել մուտքային էլ. նամակները՝ կախված վերնագրից:" mailgun_api_key: "Mailgun Գաղտնի API Key-ն, որը օգտագործվում է webhook հաղորդագրությունները հաստատելու համար:" @@ -1440,6 +1463,7 @@ hy: log_personal_messages_views: "Գրանցել անձնական նամակների դիտումները Ադմինի կողմից այլ օգտատերերի/խմբերի համար:" ignored_users_count_message_threshold: "Ծանուցել մոդերատորներին, եթե մասնավորապես որևէ օգտատեր անտեսվում է այսքան այլ օգտատերերի կողմից:" ignored_users_message_gap_days: "Որքան սպասել՝ մինչ մոդերատորներին կրկին ծանուցելը օգտատիրոջ մասին, որը անտեսվել է շատ այլոց կողմից:" + allowed_user_website_domains: "Օգտատիրոջ վեբ-կայքը կստուգվի այս դոմենների հանդեպ: Խողովակի սիմվոլով( | ) բաժանված ցանկ:" allow_profile_backgrounds: "Թույլատրել օգտատերերին վերբեռնել պրոֆիլի ֆոն:" sequential_replies_threshold: "Գրառումների քանակը, որ պետք է կատարի օգտատերը թեմայում անընդմեջ՝ մինչ չափազանց շատ հաջորդական պատասխանների մասին հիշեցում ստանալը:" get_a_room_threshold: "Գրառումների քանակը, որ օգտատերը պետք է կատարի նույն մարդուն նույն թեմայում՝ մինչ զգուշացում ստանալը:" @@ -1467,6 +1491,7 @@ hy: highlighted_languages: "Ներառված շարադասության ընդգծման կանոնները: (Ուշադրություն՝ չափազանց շատ լեզուների ներառումը կարող է ազդել կատարողականության վրա) այցելեք՝ https://highlightjs.org/static/demo դեմոյի համար:" embed_truncate: "Կտրել ներկառուցված գրառումները:" embed_support_markdown: "Ապահովել Markdown ֆորմատավորումը զետեղված գրառումների համար:" + allowed_embed_selectors: "ստորակետներով անջատված CSS տարրերի ցանկ, որոնք թույլատրված են ներկառուցումներում:" allowed_href_schemes: "Հղումներում http-ից և https -ից բացի թույլատրվող սխեմաները:" embed_post_limit: "Զետեղման ենթակա գրառումների առավելագույն քանակը" embed_username_required: "Թեմայի ստեղծման համար օգտանունը պարտադիր է:" @@ -1570,6 +1595,9 @@ hy: max_username_length_exists: "Դուք չեք կարող սահմանել օգտանվան առավելագույն երկարություն ամենաերկար օգտանունից ցածր (%{username}):" max_username_length_range: "Դուք չեք կարող սահմանել առավելագույնը նվազագույնից ցածր:" invalid_hex_value: "Գույների արժեքները պետք է լինեն 6-նիշանոց տասնվեցերորդական կոդեր:" + placeholder: + discourse_connect_provider_secrets: + key: "www.example.com" search: within_post: "#%{post_number} %{username} -ի կողմից" types: @@ -1577,6 +1605,14 @@ hy: topic: "Արդյունքներ" user: "Օգտատերեր" results_page: "Որոնման արդյունքներ '%{term}' -ի համար" + discourse_connect: + login_error: "Մուտքի Սխալ" + not_found: "Ձեր հաշիվը չի գտնվել: Խնդրում ենք կապվել կայքի ադմինիստրատորի հետ:" + account_not_approved: "Ձեր հաշիվը սպասում է հաստատման: Դուք կստանաք էլ. ծանուցում, երբ այն հաստատվի:" + unknown_error: "Ձեր հաշվի հետ խնդիր կա: Խնդրում ենք կապվել կայքի ադմինիստրատորի հետ:" + timeout_expired: "Հաշվի մուտքի ժամանակը սպառվել է, խնդրում ենք կրկին փորձել մուտք գործել:" + no_email: "Ոչ մի էլ. հասցե չի տրամադրվել: Խնդրում ենք կապվել կայքի ադմինիստրատորի հետ:" + email_error: "Հնարավոր չէ գրանցել հաշիվ %{email} էլ. հասցեով: Խնդրում ենք կապվել կայքի ադմինիստրատորի հետ:" original_poster: "Սկզբնական Հրապարակող" most_posts: "Գրառումների մեծ մասը" most_recent_poster: "Ամենավերջին Հրապարակողը" @@ -1848,6 +1884,8 @@ hy: post_hidden_again: title: "Գրառումը կրկին Թաքցված է" subject_template: "Գրառումը թաքցված է համայնքի դրոշակներով, անձնակազմը ծանուցված է" + queued_by_staff: + title: "Գրառումը Հաստատման Կարիք Ունի" flags_agreed_and_post_deleted: title: "Դրոշակավորված գրառումը հեռացված է անձնակազմի կողմից:" subject_template: "Դրոշակավորված գրառումը հեռացված է անձնակազմի կողմից:" @@ -2479,6 +2517,9 @@ hy: confirm_new_email: title: "Հաստատել Նոր Էլ. հասցեն" subject_template: "[%{email_prefix}] Հաստատեք Ձեր նոր էլ. հասցեն" + confirm_new_email_via_admin: + title: "Հաստատել Նոր Էլ. հասցեն" + subject_template: "[%{email_prefix}] Հաստատեք Ձեր նոր էլ. հասցեն" confirm_old_email: title: "Հաստատել Հին Էլ. Հասցեն" subject_template: "[%{email_prefix}] Հաստատել Ձեր ընթացիկ էլ. հասցեն" @@ -2538,6 +2579,8 @@ hy: Եթե դա Դուք էիք, հիանալի է! Այլևս ոչինչ պետք չէ անել: Եթե դա Դուք չէիք, խնդրում ենք [վերանայել Ձեր գոյություն ունեցող գործընթացները](%{base_url}/my/preferences/account) և ավելի լավ է՝ փոխեք Ձեր գաղնտաբառը: + post_approved: + title: "Ձեր գրառումը հաստատված է" page_not_found: title: "Օյ! Այդ էջը գոյություն չունի կամ մասնավոր է:" popular_topics: "Տարածված" @@ -2608,6 +2651,7 @@ hy: latte: "Լատտե" summer: "Ամառ" dark_rose: "Մուգ Վարդագույն" + default_theme_name: "Լռելյայն" light_theme_name: "Բաց" dark_theme_name: "Մուգ" neutral_theme_name: "Նեյտրալ" @@ -3047,6 +3091,12 @@ hy: city_for_disputes: label: "Վեճերի Քաղաք" placeholder: "Սան-Ֆրանցիսկո, Կալիֆորնիա" + colors: + title: "Գույներ" + fonts: + fields: + font_preview: + label: "Նախադիտում" logos: title: "Լոգոներ" fields: diff --git a/config/locales/server.id.yml b/config/locales/server.id.yml index a50841180230c..1ca3d97846871 100644 --- a/config/locales/server.id.yml +++ b/config/locales/server.id.yml @@ -15,6 +15,7 @@ id: short_no_year: "%B %-d" date_only: "%B %-d, %Y" long: "%B %-d, %Y, %l:%M%P" + no_day: "%Y %B" date: month_names: - null @@ -110,6 +111,9 @@ id: load_from_remote: "Ada kesalahan dalam memuat posting itu." site_settings: default_categories_already_selected: "Anda tidak boleh memilih kategori yang digunakan di daftar lainnya." + invite: + disabled_errors: + invalid_access: "Anda tidak diijinkan untuk melihat sumber yang diminta." 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." @@ -132,6 +136,8 @@ id: loading: "Sedang memuat diskusi..." imported_from: "Ini adalah topik diskusi tambahan untuk topik utama di %{link}" in_reply_to: "▶ %{username}" + replies: + other: "%{count} balasan" created: "Dibuat" no_mentions_allowed: "Maaf, Anda tidak dapat menyebut pengguna lain." too_many_mentions: @@ -158,6 +164,8 @@ id: topics_in_category: "Topik dalam kategori '%{category}'" rss_posts_in_topic: "RSS feed dari '%{topic}'" rss_topics_in_category: "RSS feed dari topik-topik pada kategori '%{category}'" + rss_num_posts: + other: "%{count} post" read_full_topic: "Baca topik sepenuhnya" private_message_abbrev: "Psn" rss_description: @@ -171,6 +179,11 @@ id: bookmarks: reminders: at_desktop: "Lain kali saat saya di depan komputer" + later_today: "Nanti hari ini" + next_business_day: "Hari kerja berikutnya" + tomorrow: "Besok" + next_week: "Minggu depan" + next_month: "Bulan depan" custom: "Tanggal dan waktu tersuai" groups: errors: @@ -258,6 +271,28 @@ id: datetime: distance_in_words: half_a_minute: "< 1m" + less_than_x_seconds: + other: "< %{count}s" + x_seconds: + other: "%{count}s" + less_than_x_minutes: + other: "%{count}m" + x_minutes: + other: "%{count}m" + about_x_hours: + other: "%{count}h" + x_days: + other: "%{count}d" + about_x_months: + other: "%{count}senin" + x_months: + other: "%{count}senin" + about_x_years: + other: "%{count}y" + over_x_years: + other: "> %{count}y" + almost_x_years: + other: "%{count}y" distance_in_words_verbose: half_a_minute: "baru saja" less_than_x_seconds: "baru saja" @@ -349,6 +384,7 @@ id: read_write: "baca/tulis" otp_confirmation: confirm_title: Lanjut ke %{site_name} + logging_in_as: Masuk sebagai %{username} reports: default: labels: @@ -400,6 +436,7 @@ id: title: "Suka" xaxis: "Hari" yaxis: "Jumlah suka baru" + description: "Jumlah suka baru." flags: title: "Flags" xaxis: "Haru" @@ -521,7 +558,9 @@ id: site_settings: allow_user_locale: "Perbolehkan pengguna untuk memilih bahasa sendiri" allow_duplicate_topic_titles: "Perbolehkan topik dengan judul yang sama." + send_welcome_message: "Kirim semua pengguna ucapan selamat datang dengan panduan awal singkat." maximum_backups: "Jumlah maksimum backup yang disimpan dalam disk. Backup lama akan dihapus secara otomatis." + dark_mode_none: "Tidak ada" email_editable: "Perbolehkan pengguna untuk mengganti alamat email setelah registrasi." emoji_set: "Bagaimana dengan emoji Anda?" errors: @@ -531,6 +570,7 @@ id: search: types: category: "Kategori" + topic: "Hasil" user: "Pengguna" publish_page: slug_errors: @@ -553,10 +593,14 @@ id: blocked: "Registrasi baru dari alamat IP Anda tidak diijinkan." max_new_accounts_per_registration_ip: "Registrasi baru dari alamat IP Anda tidak diijinkan (telah mencapai batas maksimum). Silahkan hubungi staff." system_messages: + queued_by_staff: + title: "Pesan Membutuhkan Persetujuan" welcome_user: subject_template: "Selamat datang ke %{site_name}!" welcome_invite: subject_template: "Selamat datang ke %{site_name}!" + tl2_promotion_message: + subject_template: "Selamat atas promosi tingkat kepercayaan Anda!" spam_post_blocked: subject_template: "Pengguna baru %{username} disuspensi atas penulisan tautan yang berulang-ulang kali" pending_users_reminder: @@ -572,8 +616,12 @@ id: title: "Lupa Password" set_password: title: "Atur Kata Sandi" + post_approved: + title: "Tulisan Anda telah disetujui" page_not_found: see_more: "Selengkapnya" + search_button: "Cari" + deleted: "dihapus" image: "gambar" upload: images: @@ -581,6 +629,8 @@ id: skipped_email_log: user_email_no_user: "Tidak dapat menemukan pengguna dengan id %{user_id}" user_email_post_not_found: "Tidak dapat menemukan post dengan id %{post_id}" + color_schemes: + default_theme_name: "Asal" csv_export: boolean_yes: "Ya" boolean_no: "Tidak" diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml index 5bd5124b02d6e..4a9043a57fe58 100644 --- a/config/locales/server.it.yml +++ b/config/locales/server.it.yml @@ -1497,6 +1497,7 @@ it: allowed_internal_hosts: "Un elenco di host interni che Discourse può eseguire in modo sicuro per la scansione onebox e altri scopi" allowed_onebox_iframes: "Un elenco dei domini iframe src permessi tramite gli incorporamenti di Onebox. `*` permetterà tutti i motori Onebox predefiniti." allowed_iframes: "Un elenco di prefissi di dominio src iframe che discourse può consentire in modo sicuro nei messaggi" + allowed_crawler_user_agents: "User Agent dei crawler Web che dovrebbero poter accedere al sito. AVVERTIMENTO! IMPOSTANDO QUESTO VERRÀ DISALLOW TUTTI CRAWLERS NON QUI ELENCATI!" slow_down_crawler_user_agents: "Agenti utente di crawler Web che devono essere limitati in frequenza in robots.txt utilizzando la direttiva di ritardo della scansione" slow_down_crawler_rate: "Se viene specificato slow_down_crawler_user_agents, tale frequenza verrà applicata a tutti i crawler (numero di secondi di ritardo tra le richieste)" content_security_policy: "Abilita Content-Security-Policy" @@ -1530,6 +1531,8 @@ it: enable_badges: "Attiva il sistema a distintivi" enable_whispers: "Consenti allo staff comunicazioni private all'interno degli argomenti." allow_index_in_robots_txt: "Specifica in robots.txt che questo sito permette l'indicizzazione da parte dei motori di ricerca. In casi eccezionali puoi permanentemente ignorare robots.txt." + blocked_email_domains: "Una lista di domini email separati dal carattere pipe \"|\" con cui gli utenti non possono registrare un account. Ad esempio: mailinator.com/trashmail.net" + allowed_email_domains: "Una lista di domini email delimitati da carattere pipe (|) che gli utenti DEVONO usare per poter registrare i propri account. ATTENZIONE: gli utenti con domini email differenti da questi non saranno accettati!" hide_email_address_taken: "Durante l'iscrizione e nel modulo per la password dimenticata, non informare gli utenti che già esiste un account con un dato indirizzo email." log_out_strict: "Quando ci si disconnette, esci da TUTTE le sessioni dell'utente su tutti i dispositivi" version_checks: "Controlla in Discourse Hub la presenza di aggiornamenti della versione e mostra i messaggi della nuova versione nel cruscotto / di amministrazione" @@ -1546,6 +1549,8 @@ it: min_admin_password_length: "Lunghezza minima password Amministratore." password_unique_characters: "Numero minimo di caratteri unici che una password deve avere." block_common_passwords: "Non permettere password che sono nelle 10.000 password più comuni." + auth_immediately: "Reindirizza automaticamente al sistema di login esterno senza l'interazione dell'utente. Questo ha effetto solo quando login_required è true e esiste un solo metodo di autenticazione esterno" + discourse_connect_overrides_bio: "Sovrascrive la biografia utente nel profilo utente ed impedisce agli utenti di cambiarla" enable_local_logins_via_email: "Consenti agli utenti di richiedere un collegamento di accesso usa e getta, che gli verrà inviato tramite email." allow_new_registrations: "Abilita la registrazione di nuovi utenti. Se deselezionato, non sarà possibile creare nuovi account." enable_signup_cta: "Mostra una notifica agli utenti anonimi che ritornano chiedendo loro di registrare un account." @@ -1731,6 +1736,7 @@ it: privacy_policy_url: "Se vuoi usare un documento sulle Politiche di Privacy ospitato da qualche altra parte, fornisci qui la sua URL completa." log_anonymizer_details: "Mantenere o meno i dettagli di un utente nel registro dopo essere stato reso anonimo. Per obbedire al GDPR, è necessario disattivarle questa opzione." newuser_spam_host_threshold: "Quante volte un nuovo utente può pubblicare un collegamento allo stesso host all'interno dei messaggi `newuser_spam_host_threshold` prima di essere considerato spam." + allowed_spam_host_domains: "Una lista di domini esclusi dal controllo antispam. Ai nuovi utenti non verrà mai impedito di creare messaggi con collegamenti a tali domini." topic_view_duration_hours: "Conteggia una nuova visita dell'argomento una volta per IP/Utente ogni N ore" user_profile_view_duration_hours: "Conteggia una nuova visita del profilo utente una volta per IP/Utente ogni N ore" levenshtein_distance_spammer_emails: "Quanti caratteri di differenza faranno comunque scattare una corrispondenza approssimativa nell'analisi delle email di spam. " @@ -1744,6 +1750,7 @@ it: min_first_post_typing_time: "Quantità minima di tempo in millisecondi che un utente deve impiegare per la digitazione del primo messaggio, se non viene raggiunta la soglia il messaggio verrà automaticamente inserito nella coda dei messaggi da approvare. Impostare su 0 per disabilitare (non consigliato)" auto_silence_fast_typers_on_first_post: "Silenzia automaticamente gli utenti che non soddisfano min_first_post_typing_time" auto_silence_fast_typers_max_trust_level: "Livello di esperienza massimo per silenziare automaticamente i digitatori veloci" + auto_silence_first_post_regex: "Regex senza distinzione tra maiuscole e minuscole che, se passato, causerà il silenziamento del primo messaggio dell'utente e che sarà inviato nella coda dei messaggi da approvare. Esempio: rabbia|a[bc]a, fa in modo che tutti i messaggi contenenti le parole rabbia o aba o aca siano silenziati in un primo momento. Si applica solo al primo messaggio." reviewable_claiming: "È necessario rivendicare il contenuto revisionabile prima che possa essere manipolato?" reviewable_default_topics: "Mostra contenuto revisionabile raggruppato per argomento per impostazione predefinita" reviewable_default_visibility: "Non mostrare elementi revisionabili a meno che non soddisfino questa priorità" @@ -1766,6 +1773,7 @@ it: max_emails_per_day_per_user: "Numero massimo di email da inviare agli utenti per giorno. 0 per disabilitare il limite" enable_staged_users: "Crea automaticamente utenti temporanei quando si elaborano le email in arrivo." maximum_staged_users_per_email: "Numero massimo di utenti temporanei creati quando si elaborano le email in arrivo." + auto_generated_allowlist: "Lista degli indirizzi email che non verranno verificati per i contenuti generati automaticamente. Esempio: foo@bar.com|discourse@bar.com" block_auto_generated_emails: "Bloccare le email in arrivo identificate come generate automaticamente." ignore_by_title: "Ignora le email in arrivo in base al loro titolo." mailgun_api_key: "Chiave API Segreta di Mailgun usata per verificare i messaggi webhook. " @@ -1836,6 +1844,7 @@ it: ignored_users_count_message_threshold: "Informare i moderatori se un determinato utente viene ignorato da molti altri utenti." ignored_users_message_gap_days: "Quanto a lungo attendere prima di informare nuovamente i moderatori di un utente che è stato ignorato da molti altri." clean_up_inactive_users_after_days: "Numero di giorni prima che un utente inattivo (Livello Esperienza 0 e senza messaggi= venga rimosso. Per disabilitare la pulizia, imposta a 0." + allowed_user_website_domains: "Verrà verificato il sito web dell'utente per questi domini. Lista delimitata dal carattere pipe." allow_profile_backgrounds: "Permetti agli utenti di caricare immagini di sfondo per il profilo." sequential_replies_threshold: "Numero di messaggi che un utente deve pubblicare di fila in un argomento prima che gli venga ricordato delle troppe risposte sequenziali." get_a_room_threshold: "Numero di messaggi che un utente deve inviare alla stessa persona nello stesso argomento prima di essere avvertito." @@ -1868,6 +1877,7 @@ it: embed_truncate: "Tronca i messaggi incorporati." embed_unlisted: "Gli argomenti importati non saranno in elenco finché un utente non risponderà." embed_support_markdown: "Supporta la formattazione Markdown per i messaggi incorporati." + allowed_embed_selectors: "Un elenco separato da virgole di elementi CSS consentiti negli incorporamenti." allowed_href_schemes: "Schemi consentiti nei collegamenti in aggiunta a http e https." embed_post_limit: "Numero massimo di messaggi da incorporare." embed_username_required: "E' richiesto il nome utente per la creazione di argomenti." @@ -1913,6 +1923,7 @@ it: default_other_enable_quoting: "Attiva rispondi citando per il testo evidenziato di default." default_other_enable_defer: "Abilita la funzionalità di rinvio dell'argomento per impostazione predefinita." default_other_dynamic_favicon: "Per impostazione predefinita mostra il conteggio degli argomenti nuovi/aggiornati sull'icona del browser." + default_other_skip_new_user_tips: "Salta i suggerimenti e i distintivi per l'inserimento dei nuovi utenti." default_other_like_notification_frequency: "Per impostazione predefinita invia una notifica agli utenti sui mi piace" default_topics_automatic_unpin: " Per impostazione predefinita spunta automaticamente gli argomenti quando l'utente arriva in fondo. " default_categories_watching: "Elenco di categorie osservate per default." @@ -1992,8 +2003,14 @@ it: max_username_length_exists: "Non è possibile impostare la lunghezza massima del nome utente se inferiore al nome utente più lungo (%{username})." max_username_length_range: "Non puoi impostare il massimo inferiore al minimo." invalid_hex_value: "I valori di colore devono essere codici esadecimali a 6 cifre." + allowed_unicode_usernames: + regex_invalid: "L'espressione regolare non è valida: %{error}" + leading_trailing_slash: "L'espressione regolare non può iniziare o terminare con una barra." unicode_usernames_avatars: "Gli avatar di sistema interni non supportano i nomi utente Unicode." list_value_count: "La lista contiene esattamente %{count} valori." + placeholder: + discourse_connect_provider_secrets: + key: "www.example.com" search: extreme_load_error: "Il sito è sovraccarico, la ricerca disabilitata, riprovare più tardi" within_post: "n°%{post_number} di %{username}" @@ -2005,6 +2022,13 @@ it: audio: "[audio]" video: "[video]" discourse_connect: + login_error: "Errore Login" + not_found: "Impossibile trovare il tuo account. Si prega di contattare l'amministratore del sito." + account_not_approved: "Il tuo account è in attesa di approvazione. Riceverai una notifica email una volta approvato. " + unknown_error: "C'è un problema con il tuo account. Si prega di contattare l'amministratore del sito." + timeout_expired: "Il tempo di connessione dell'account è scaduto, prova a connetterti di nuovo." + no_email: "Nessun indirizzo email è stato fornito. Si prega di contattare l'amministratore del sito." + email_error: "Non è possibile registrare un account con l'indirizzo email %{email}. Si prega di contattare l'amministratore del sito." invite_redeem_failed: "Riscatto dell'invito non riuscito. Contatta l'amministratore del sito." original_poster: "Autore iniziale" most_posts: "Maggioranza Messaggi" @@ -3869,6 +3893,7 @@ it: trust_level: "Le risposte degli utenti con un basso Livello di Esperienza devono essere approvate dallo Staff. Vedi `approve_unless_trust_level`." new_topics_unless_trust_level: "Gli Argomenti di utenti con basso Livello Esperienza devono essere approvati dallo staff. Vedi `approve_new_topics_unless_trust_level`." fast_typer: "Il nuovo utente ha digitato il suo primo messaggio in modo sospettosamente rapido, sembrerebbe il comportamento di un bot o di uno spammer. Vedi `min_first_post_typing_time`." + auto_silence_regexp: "Nuovo utente il cui primo post corrisponde all'impostazione `auto_silence_first_post_regex`." staged: "Nuovi argomenti e post per gli Utenti Temporanei devono essere approvati dallo staff. Vedi `approve_unless_staged`." category: "I post in questa Categoria richiedono l'approvazione manuale da parte dello staff. Vedi le impostazioni della categoria." must_approve_users: "Tutti i nuovi utenti devono essere approvati dallo staff. Vedi 'must_approve_users'." diff --git a/config/locales/server.ja.yml b/config/locales/server.ja.yml index cad834cca1f7a..87ebcef0c4cc7 100644 --- a/config/locales/server.ja.yml +++ b/config/locales/server.ja.yml @@ -39,6 +39,7 @@ ja: title: "Discourse" topics: "トピック" posts: "投稿" + views: " 閲覧" loading: "読み込み中" powered_by_html: 'Discourseにより提供されています。最適な表示のために、Javascriptを有効にしてください。' sign_up: "アカウントを作成" @@ -52,6 +53,7 @@ ja: on_another_topic: "別のトピックで" inline_oneboxer: topic_page_title_post_number: "#%{post_number}" + topic_page_title_post_number_by_user: "#%{post_number} %{username}から" themes: bad_color_scheme: "テーマを更新できません、無効なカラーパレットです" other_error: "サーバーに不具合があるので、テーマを更新してください。" @@ -165,6 +167,8 @@ ja: s3_upload_bucket_is_required: "'s3_upload_bucket'がない場合、S3にアップロードを有効にすることはできません。" invite: user_exists: "%{email}を招待する必要はありません。 すでにアカウントを持っています!" + disabled_errors: + invalid_access: "リクエストしたリソースの閲覧が許可されていません" bulk_invite: file_should_be_csv: "アップロードファイルはcsv形式である必要があります。" error: "アップロードファイルにエラーが発生しました。時間が経ってから再度お試しください。" @@ -228,6 +232,8 @@ ja: topics_in_category: "'%{category}' カテゴリ内のトピック" rss_posts_in_topic: "'%{topic}' の RSS フィード" rss_topics_in_category: "'%{category}' カテゴリ内のトピックの RSS フィード" + rss_num_posts: + other: "%{count} 件" read_full_topic: "完全なトピックを読む" private_message_abbrev: "メッセージ" rss_description: @@ -251,9 +257,11 @@ ja: bookmarks: reminders: later_today: "今日中" + next_business_day: "翌営業日" tomorrow: "明日" next_week: "来週" next_month: "来月" + custom: "カスタムの日付と時刻" groups: errors: invalid_incoming_email: "%{email}のメール認証に失敗しました\U0001F62D" @@ -547,6 +555,8 @@ ja: description: '"%{application_name}" があなたのアカウントへのアクセスを要求しています: ' otp_confirmation: confirm_title: '%{site_name}へ' + logging_in_as: '%{username} としてログイン' + confirm_button: ログイン完了 no_trust_level: "申し訳ありませんが、ユーザーAPIへのアクセスはできません。" generic_error: "申し訳ありませんが、この機能は管理者が使用できなくしています。" scopes: @@ -557,6 +567,7 @@ ja: reports: default: labels: + count: カウント day: 日 post_edits: labels: @@ -611,6 +622,7 @@ ja: title: "いいね" xaxis: "日" yaxis: "新規「いいね!」数" + description: "新規「いいね!」数." flags: title: "通報" xaxis: "日" @@ -833,6 +845,8 @@ ja: redirect_users_to_top_page: "新規ユーザーと長く不在のユーザーをトップページに自動的にリダイレクトさせる" email_token_valid_hours: "パスワードリマインダ、アカウントアクティベート時のトークンを何時間有効にするか" enable_badges: "バッジ機能を有効にする" + blocked_email_domains: "ユーザーがアカウント登録をすることができない、パイプ区切りのドメイン名のリスト。 例 : mailinator.com|trashmail.net" + allowed_email_domains: "ユーザー登録に必要なパイプ区切りのメールドメインのリスト。警告: 指定したメールドメイン以外のユーザは許可されません!" log_out_strict: "ログアウトした際に、そのユーザーの全デバイスのセッションをログアウトさせる" new_version_emails: "Discourseの新しいバージョンが利用可能になった際に contact_email アドレスにメールで通知する" invite_expiry_days: "招待キーの有効期間 (日)" @@ -905,6 +919,7 @@ ja: min_title_similar_length: "類似トピックのチェックに必要な最小タイトル長" category_colors: "カテゴリに利用可能な色 (16進数指定) のリスト" category_style: "カテゴリバッジのスタイル" + dark_mode_none: "なし" max_attachment_size_kb: "添付可能なファイルの最大サイズ (kB) nginx 側での設定 (client_max_body_size) / apache または proxy における設定も同時に行う必要があります" authorized_extensions: "アップロード可能なファイルの拡張子のリスト('*'で全ての拡張子が有効になります)" max_similar_results: "新規トピック編集中に類似トピックをいくつ表示するか。比較はタイトルと本文に基づきます" @@ -924,6 +939,7 @@ ja: faq_url: "FAQが他のサイトにある場合、URLをここに指定します。" tos_url: "他のサイトに利用規約を掲載している場合は、URLをここに指定してください。" privacy_policy_url: "他のサイトにプライバシーポリシーを掲載している場合は、URLをここに指定してください。" + allowed_spam_host_domains: "スパムホスト検査から除外するドメインのリスト。新規ユーザはこれらのドメインでポスト内にリンクを作成することを制限されません" levenshtein_distance_spammer_emails: "スパマーのメールアドレスとマッチさせるとき、数文字違いの曖昧な一致でも許可する" max_new_accounts_per_registration_ip: "もし既にトラストレベル0のユーザーがそのIPから(N)個作成されていたら、そのIPから登録できないようにする(スタッフメンバー、トラストレベル2以上は除く)" min_ban_entries_for_roll_up: "When clicking the Roll up button, will create a new subnet ban entry if there are at least (N) entries." @@ -981,6 +997,7 @@ ja: approve_unless_trust_level: "トラストレベル以下のユーザーの投稿には承認が必要" skip_auto_delete_reply_likes: "古い返信を自動的に削除する場合は、この数以上のいいねの投稿の削除をスキップしてください。" default_email_previous_replies: "デフォルトでメールの文章に以前の返信を含める" + default_other_skip_new_user_tips: "新規ユーザーのヒントとバッジをスキップする." tagging_enabled: "トピックでタグを有効にしますか?" tag_style: "カテゴリバッジのスタイル" errors: @@ -1004,6 +1021,8 @@ ja: category: "カテゴリ" topic: "結果" user: "ユーザ" + discourse_connect: + timeout_expired: "アカウントへのログインがタイムアウトになりました。もう一度トップページからログインしてください。" original_poster: "Original Poster" most_posts: "Most Posts" most_recent_poster: "Most Recent Poster" @@ -1038,6 +1057,12 @@ ja: autoclosed_disabled: "このトピックは再オープンされました。新しい回答が投稿できるようになりました。。" autoclosed_disabled_lastpost: "このトピックは再オープンされました。新しい回答が投稿できます" login: + security_key_description: "物理的なセキュリティキーを用意している場合は、以下のセキュリティキーで認証ボタンを押します。" + security_key_alternative: "別の方法を試してください" + security_key_authenticate: "セキュリティキーで認証" + security_key_not_allowed_error: "セキュリティキー認証プロセスがタイムアウトしたか、キャンセルされました。" + security_key_no_matching_credential_error: "提供されたセキュリティキーに一致する資格情報が見つかりませんでした。" + security_key_support_missing_error: "現在のデバイスまたはブラウザは、セキュリティキーの使用をサポートしていません。別の方法を使用してください。" not_approved: "あなたのアカウントはまだ承認されていません。ログイン可能になった際にメールで通知いたします。" incorrect_username_email_or_password: "ユーザ名、メールアドレス、またはパスワードが違います" incorrect_password: "パスワードが違います" @@ -1059,7 +1084,10 @@ ja: missing_user_field: "全てのユーザーフィールドの入力が終わっていません" auth_complete: "認証が完了しました。" click_to_continue: "クリックして続けてください。" + second_factor_title: "2段階認証" second_factor_backup_description: "バックアップコードを入力: " + second_factor_toggle: + backup_code: "代わりにバックアップコードを使用する" admin: email: sent_test: "送信完了!" @@ -1166,6 +1194,8 @@ ja: post_hidden_again: title: "再度非表示" subject_template: "コミュニティーフラッグにより非表示になりました。" + queued_by_staff: + title: "この投稿は承認が必要です" welcome_user: title: "ようこそ:ユーザー" subject_template: "%{site_name} へようこそ!" @@ -1295,6 +1325,9 @@ ja: confirm_new_email: title: "メールを確認してください" subject_template: "[%{email_prefix}]新しいメールアドレスを確認してください" + confirm_new_email_via_admin: + title: "メールを確認してください" + subject_template: "[%{email_prefix}]新しいメールアドレスを確認してください" confirm_old_email: title: "古いメールの確認" subject_template: "[%{email_prefix}]現在のメールアドレスの確認" @@ -1312,6 +1345,8 @@ ja: %{base_url}/u/activate-account/%{email_token} もし上のリンクがクリックできなければ、webサイトのアドレスバーに直接コピーして貼り付けてください。 + post_approved: + title: "あなたの投稿は承認されました" page_not_found: title: "ページが見つからないか、アクセス出来ない場所にあります。" popular_topics: "人気" @@ -1358,6 +1393,7 @@ ja: sender_topic_deleted: "トピックは削除されました" color_schemes: base_theme_name: "ベース" + default_theme_name: "デフォルト" edit_this_page: "ページを編集" csv_export: boolean_yes: "はい" @@ -1628,6 +1664,8 @@ ja: tags: title: "タグ" finish_installation: + register: + button: "登録" resend_email: title: "アクティベーションメールの再送" wizard: @@ -1649,6 +1687,14 @@ ja: placeholder: "name@example.com" corporate: title: "組織" + colors: + title: "カラー" + fonts: + fields: + font_preview: + label: "プレビュー" + icons: + title: "アイコン" homepage: description: "ホームページへは最新トピックの表示を推薦しますが、カテゴリー(トピックのまとまり)のみの表示も可能です。" title: "ホームページ" @@ -1674,6 +1720,8 @@ ja: replied: '%{username}が"%{topic}"へ返信しました - %{site_title}' posted: '%{username} が投稿しました "%{topic}" - %{site_title}' linked: '"%{topic}"にあるあなたの投稿に%{username}がリンクしました - %{site_title}' + watching_first_post: '%{username} が "%{topic}" - %{site_title}を投稿しました' + confirm_title: "通知を有効にしました - %{site_title}" confirm_body: "成功!通知を可能にしました!" reviewables: priorities: diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml index 4a42fde63f7e3..8d679bb09b4a9 100644 --- a/config/locales/server.ko.yml +++ b/config/locales/server.ko.yml @@ -1738,6 +1738,7 @@ ko: min_first_post_typing_time: "사용자가 첫번째 포스트를 작성할 때 타이핑에 소요해야 하는 밀리초. 설정값에 도달하지 않았을 때는 자동으로 승인 큐에 포함됩니다. 승인 0으로 설정하면 해제됩니다.(해제는 권장하지 않습니다)" auto_silence_fast_typers_on_first_post: "min_first_post_typing_time을 충족하지 않는 사용자를 자동으로 쓰기 금지 시킵니다." auto_silence_fast_typers_max_trust_level: "빠른 타이퍼를 자동으로 쓰기 금지 시키기 위한 최대 신뢰 수준" + auto_silence_first_post_regex: "대소 문자를 구분하지 않는 정규 표현식은 전달되면 사용자 별 첫 번째 게시물이 침묵되고 승인 대기열로 전송됩니다. 예 : raging | a [bc] a는 raging 또는 aba 또는 aca를 포함하는 모든 게시물이 먼저 침묵되도록합니다. 첫 번째 게시물에만 적용됩니다." reviewable_claiming: "검토 가능한 컨텐츠를 사용하려면 먼저 컨텐츠를 청구해야합니까?" reviewable_default_topics: "기본적으로 주제별로 그룹화 된 검토 가능한 컨텐츠 표시" reviewable_default_visibility: "이 우선 순위를 충족하지 않으면 검토 가능한 항목을 표시하지 않습니다." diff --git a/config/locales/server.lt.yml b/config/locales/server.lt.yml index 5f13fd6990bc2..ce235e5442548 100644 --- a/config/locales/server.lt.yml +++ b/config/locales/server.lt.yml @@ -15,6 +15,7 @@ lt: short_no_year: "%B %-d" date_only: "%B %-d, %Y" long: "%B %-d, %Y, %l:%M%P" + no_day: "%Y %B" date: month_names: - null @@ -38,6 +39,7 @@ lt: title: "Discourse" topics: "Temos" posts: "žinutės" + views: "peržiūros" loading: "Kraunama" powered_by_html: 'Sukurta Discourse, geriausias žiūrimumas su JavaScript igalinimu' sign_up: "Registruotis" @@ -48,6 +50,8 @@ lt: anonymous: "Anonimas" remove_posts_deleted_by_author: "Pašalinta autoriaus" redirect_warning: "Negalėjome patvirtinti, kad jūsų pasirinkta nuoroda buvo faktiškai paskelbta forume. Jei vis tiek norite tęsti, pasirinkite žemiau esančią nuorodą." + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} nuo %{username}" themes: other_error: "Įvyko klaida atnaujinant temą" import_error: @@ -114,6 +118,11 @@ lt: loading: "Kraunama diskusija..." permalink: "Nuoroda" in_reply_to: "▶ %{username}" + replies: + one: "%{count} atsakymas" + few: "%{count} atsakymai" + many: "%{count} atsakymai" + other: "%{count} atsakymai" created: "Sukurta" no_mentions_allowed: "Apgailestaujame, tačiau jūs negalite minėti kitų vartotojų." too_many_mentions: @@ -133,6 +142,11 @@ lt: home_title: "Pradinis" topics_in_category: "Temos kategorijoje '%{category}'" rss_posts_in_topic: "RSS iš '%{topic}'" + rss_num_posts: + one: "%{count} įrašas" + few: "%{count} įrašai" + many: "%{count}įrašų" + other: "%{count}įrašai" read_full_topic: "Skaityti pilną temą" private_message_abbrev: "Žinutė" rss_description: @@ -448,6 +462,8 @@ lt: every_hour: "kas valandą" daily: "kas dieną" weekly: "kas savaitę" + every_month: "kiekvieną mėnesį" + every_six_months: "kas šešis mėnesius" user_api_key: read: "skaityti" otp_confirmation: @@ -458,6 +474,7 @@ lt: reports: default: labels: + count: Skaičiuoti day: Diena post_edits: labels: @@ -469,6 +486,7 @@ lt: user_flagging_ratio: labels: user: Narys + score: Rezultatas moderators_activity: labels: moderator: Moderatorius @@ -535,6 +553,7 @@ lt: admin: Administratorius moderator: Moderatorius suspended: Suspenduotas + silenced: Nutildytas emails: xaxis: "Diena" user_to_user_private_messages: @@ -630,6 +649,10 @@ lt: filename: Dokumento pavadinimas author: Autorius site_settings: + send_welcome_message: "Siųskite visiems naujiems vartotojams sveikinimo pranešimą su greitu pradžios vadovu." + dark_mode_none: "Nieko" + embed_truncate: "Truncate the embedded posts." + embed_post_limit: "Maskimalus įterpiamų įrašų skaičius." enable_emoji: "Įgalinti Emoji" search: within_post: "#%{post_number} nuo %{username}" @@ -669,6 +692,8 @@ lt: private_topic_title: "Tema #%{id}" post_hidden: title: "Įrašas paslėptas" + queued_by_staff: + title: "Įrašui reikalingas patvirtinimas" welcome_user: title: "Sveikas narį" subject_template: "Sveiki atvykę į %{site_name}!" @@ -859,6 +884,8 @@ lt: subject_template: "[%{email_prefix}] Prisijungti" confirm_new_email: title: "Patvirtinti naują e-paštą" + confirm_new_email_via_admin: + title: "Patvirtinti naują e-paštą" signup: title: "Registruotis" page_not_found: @@ -877,6 +904,7 @@ lt: color_schemes: light: "Šviesi" dark: "Tamsi" + default_theme_name: "Numatytasis" light_theme_name: "Šviesi" dark_theme_name: "Tamsi" edit_this_page: "Redaguoti šį puslapį" @@ -1030,6 +1058,12 @@ lt: label: "Interneto svetainė" corporate: title: "Organizacija" + colors: + title: "Spalvos" + fonts: + fields: + font_preview: + label: "Peržiūrėti" logos: title: "Logotipas" fields: @@ -1071,8 +1105,13 @@ lt: not_found: "nerastas" unknown: "nežinoma" reviewables: + priorities: + medium: "Vidutinis" + high: "Aukštas" sensitivity: disabled: "Uždrausta" + medium: "Vidutinis" + high: "Aukštas" actions: agree_and_keep: title: "Palikti įrašą" diff --git a/config/locales/server.lv.yml b/config/locales/server.lv.yml index 3bca7d302e3f0..3a45a49ee1123 100644 --- a/config/locales/server.lv.yml +++ b/config/locales/server.lv.yml @@ -13,6 +13,7 @@ lv: formats: short: "%d-%m-%Y" short_no_year: "%B %-d" + no_day: "%Y %B" date: month_names: - null @@ -32,11 +33,14 @@ lv: title: "Discourse" topics: "Tēmas" posts: "raksti" + views: "skatījumi" loading: "Ielāde" sign_up: "Reģistrēties" log_in: "Ienākt" submit: "Iesniegt" anonymous: "Anonīmi" + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} - %{username}" emails: incoming: default_subject: "Šim ierakstam ir nepieciešams nosaukums" @@ -55,13 +59,22 @@ lv: other: "vel %{count} atbildes" loading: "Diskusijas Ielādēšana..." in_reply_to: "▶ %{username}" + replies: + zero: "%{count} atbildes" + one: "%{count} atbilde" + other: "%{count} atbildes" created: "Radīts" next_page: "nākošo lapu →" prev_page: "← iepriekšējo lapu" page_num: "Lapa %{num}" + rss_num_posts: + zero: "%{count} ieraksti" + one: "%{count} ieraksts" + other: "%{count} ieraksti" read_full_topic: "Lasīt pilnu tēmu" rss_description: latest: "Jaunākās tēmas" + excerpt_image: "bilde" bookmarks: reminders: later_today: "Vēlāk šodien" @@ -103,12 +116,63 @@ lv: title: "jauns lietotājs" member: title: "biedrs" + regular: + title: "regulārs" + rate_limiter: + hours: + zero: "%{count} stundas" + one: "%{count} stunda" + other: "%{count} stundas" datetime: distance_in_words: half_a_minute: "< 1 m" + less_than_x_seconds: + zero: "< %{count} s" + one: "< %{count} s" + other: "< %{count} s" + x_seconds: + zero: "%{count} s" + one: "%{count} s" + other: "%{count} s" + less_than_x_minutes: + zero: "< %{count} m" + one: "< %{count} m" + other: "< %{count} m" + x_minutes: + zero: "%{count} m" + one: "%{count} m" + other: "%{count} m" + about_x_hours: + zero: "%{count} h" + one: "%{count} h" + other: "%{count} h" + x_days: + zero: "%{count} d" + one: "%{count} d" + other: "%{count} d" + about_x_years: + zero: "%{count} g" + one: "%{count} g" + other: "%{count} g" + over_x_years: + zero: "> %{count} g" + one: "> %{count} g" + other: "> %{count} g" + almost_x_years: + zero: "%{count} g" + one: "%{count} g" + other: "%{count} g" distance_in_words_verbose: half_a_minute: "tikko" less_than_x_seconds: "tikko" + about_x_hours: + zero: "pirms %{count} stundām" + one: "pirms %{count} stundas" + other: "pirms %{count} stundām" + x_days: + zero: "pirms %{count} dienām" + one: "pirms %{count} dienas" + other: "pirms %{count} dienām" password_reset: choose_new: "Izvēlēties jaunu paroli" choose: "Izvēlēties paroli" @@ -288,6 +352,9 @@ lv: labels: filename: Faila nosaukums site_settings: + dark_mode_none: "Nav" + embed_truncate: "Saīsināt iegultos ierakstus." + embed_post_limit: "Maksimālais iegulto ierakstu skaits." errors: invalid_email: "Nepareiza e-pasta adrese." search: @@ -304,6 +371,8 @@ lv: email: sent_test: "nosūtīts!" system_messages: + queued_by_staff: + title: "Ieraksts gaida apstiprinājumu" welcome_user: subject_template: "Laipni lūdzam %{site_name}!" welcome_invite: @@ -321,8 +390,11 @@ lv: see_more: "Vairāk" search_title: "Meklēt šajā vietnē" search_button: "Meklēt" + image: "bilde" upload: unauthorized: "Atvainojiet, fails, ko mēģināt augšuplādēt, nav atļauts (atļautie paplašinājumi: %{authorized_extensions})." + color_schemes: + default_theme_name: "Noklusējums" csv_export: boolean_yes: "Jā" boolean_no: "Nē" @@ -359,6 +431,10 @@ lv: placeholder: "vards@piemers.com" corporate: title: "Organizācija" + fonts: + fields: + font_preview: + label: "Priekšskatījums" homepage: fields: homepage_style: diff --git a/config/locales/server.nb_NO.yml b/config/locales/server.nb_NO.yml index 96e827e6bc7bb..d46acff6cf354 100644 --- a/config/locales/server.nb_NO.yml +++ b/config/locales/server.nb_NO.yml @@ -15,6 +15,7 @@ nb_NO: short_no_year: "%B %-d" date_only: "%B %-d, %Y" long: "%B %-d, %Y, %l:%M%P" + no_day: "%Y %B" date: month_names: - null @@ -38,6 +39,7 @@ nb_NO: title: "Discourse" topics: "Emner" posts: "innlegg" + views: "visninger" loading: "Laster" powered_by_html: 'Drives av Discourse, og ser best ut med JavaScript aktivert' sign_up: "Registrer deg" @@ -48,6 +50,8 @@ nb_NO: anonymous: "Anonym" remove_posts_deleted_by_author: "Slettet av forfatter" redirect_warning: "Vi kunne ikke verifisere at lenken du valgte faktisk var publisert på forumet. Hvis du likevel ønsker å fortsette, velg lenken under." + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} av %{username}" themes: other_error: "Noe gikk galt under oppdateringen av drakten" import_error: @@ -154,6 +158,8 @@ nb_NO: conflicting_google_user_id: 'Google Account ID for denne kontoen har endret seg; staben må manuelt godkjenne endringen av sikkerhetshensyn. Vennligst kontakt staben og pek dem til
https://meta.discourse.org/t/76575' invite: user_exists: "Det er ikke nødvendig å invitere %{email}, de har allerede en konto!" + disabled_errors: + invalid_access: "Du har ingen tilgang til denne resurssen." bulk_invite: file_should_be_csv: "Filen som lastes opp burde være i csv format." error: "Det skjedde en feil når filen ble lastet opp. Prøv igjen senere. " @@ -194,6 +200,9 @@ nb_NO: permalink: "Permalink" imported_from: "Dette er en relatert diskusjon ved siden av det originale innlegget ved %{link}" in_reply_to: "▶ %{username}" + replies: + one: "%{count} svar" + other: "%{count} svar" created: "Opprettet" no_mentions_allowed: "Beklager, du kan ikke nevne andre brukere." too_many_mentions: @@ -228,6 +237,9 @@ nb_NO: topics_in_category: "Emner i '%{category}'-kategorien" rss_posts_in_topic: "RSS-strøm av '%{topic}'" rss_topics_in_category: "RSS-strøm av emner i '%{category}'-kategorien" + rss_num_posts: + one: "%{count} innlegg" + other: "%{count} innlegg" read_full_topic: "Les hele emnet" private_message_abbrev: "Mld" rss_description: @@ -756,6 +768,7 @@ nb_NO: title: "Likes" xaxis: "Dag" yaxis: "Antall nye likes" + description: "Antall nye likes." flags: title: "Flagg" xaxis: "Dag" @@ -977,6 +990,8 @@ nb_NO: show_pinned_excerpt_mobile: "Vis utdrag fra festede emner i mobil visning." show_pinned_excerpt_desktop: "Vis utdrag fra festede emner i desktop visning." post_onebox_maxlength: "Maksimal lengde på et onebox Discourse innlegg i antall tegn." + blocked_onebox_domains: "En liste over domener som aldri vil bli forsøkt oneboxet." + allowed_inline_onebox_domains: "En liste over domener hvor onebox brukes i miniatyrstørrelse hvis lenken ikke har en tittel" max_oneboxes_per_post: "Maksimalt antall oneboxer i hvert innlegg." notification_email: "Adressen som skal brukes som avsender: på alle viktige system e-poster. Domenet som spesifiseres her må ha SPF, DKIM og reverse PTR record satt korrekt for at e-post skal nå frem." email_custom_headers: "En liste over tilpassede e-posthoder med pipe-tegn mellom hvert element" @@ -1002,8 +1017,10 @@ nb_NO: max_likes_per_day: "Maximum antall likes per bruker per dag" max_invites_per_day: "Maksimalt antall invitasjoner en bruker kan sende hver dag." max_logins_per_ip_per_hour: "Maksimalt antall innlogginger som tillates for hver IP-adresse per time." + selectable_avatars: "Liste over avatarer brukere kan velge mellom." allow_staff_to_upload_any_file_in_pm: "Tillat medlemmer av staben å laste opp hvilken som helst fil i private samtaler" newuser_max_links: "Hvor mange linker en ny bruker kan legge til i et innlegg." + dark_mode_none: "Ingen" title_prettify: "Unngå vanlige skrivefeil i titler, sånn som store bokstaver, liten bokstav først, mange !, ? og punktum på slutten, osv." faq_url: "Hvis du har O-S-S på et annet nettsted du gjerne vil bruke, skriv inn nettadressen her." tos_url: "Dersom du har et bruksvilkår-dokument et annet sted som du vil bruke, skriv inn den fullstendige URL-en her." @@ -1023,6 +1040,7 @@ nb_NO: enable_mobile_theme: "Mobilenheter bruker et mobilvennlig drakt, 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." + embed_truncate: "Forkort de innebygde innleggene." embed_post_limit: "Maksimalt antall innlegg som skal bygges inn." embed_username_required: "Brukernavn kreves for opprettelse av emne." enable_emoji: "Aktiver emoji." @@ -1118,6 +1136,8 @@ nb_NO: ignored: "Takk for at du sier ifra. Vi skal se på det. " ignored_and_deleted: "Takk for at du sier ifra. Vi har fjernet innlegget. " system_messages: + queued_by_staff: + title: "Innlegg trenger godkjenning" welcome_user: subject_template: "Velkommen til %{site_name}!" welcome_invite: @@ -1205,6 +1225,7 @@ nb_NO: color_schemes: light: "Lys" dark: "Mørk" + default_theme_name: "Forvalg" light_theme_name: "Lys" dark_theme_name: "Mørk" edit_this_page: "Endre denne siden" @@ -1419,6 +1440,12 @@ nb_NO: label: "Automatiserte meldinger" corporate: title: "Organisasjon" + colors: + title: "Farger" + fonts: + fields: + font_preview: + label: "Forhåndsvis" logos: title: "Logoer" fields: diff --git a/config/locales/server.nl.yml b/config/locales/server.nl.yml index a7f9f32432510..9c51dd2cd3181 100644 --- a/config/locales/server.nl.yml +++ b/config/locales/server.nl.yml @@ -1355,6 +1355,7 @@ nl: show_pinned_excerpt_desktop: "Fragment tonen bij vastgemaakte topics in desktopweergave." post_onebox_maxlength: "Maximale lengte van een 'oneboxed Discourse'-bericht in tekens." blocked_onebox_domains: "Een lijst van domeinen die nooit in een onebox worden omgezet." + allowed_inline_onebox_domains: "Een lijst van domeinen die in een onebox als miniatuur worden omgezet wanneer gekoppeld zonder titel" enable_inline_onebox_on_all_domains: "Website-instelling inline_onebox_domain_allowlist negeren en inline onebox op alle domeinen toestaan." force_custom_user_agent_hosts: "Hosts waarvoor bij alle aanvragen de aangepaste onebox-useragent wordt gebruikt. (Met name handig voor hosts die toegang beperken via de useragent)." max_oneboxes_per_post: "Maximale aantal oneboxes in een bericht." @@ -1416,7 +1417,11 @@ nl: gtm_container_id: "Google Tag Manager-container-ID, bv. GTM-ABCDEF.
Opmerking: scripts van derden die door GTM worden geladen, dienen mogelijk op de acceptatielijst te worden geplaatst in 'content security policy script src'." enable_escaped_fragments: "Terugvallen naar Google's Ajax-Crawling-API als geen webcrawler wordt gedetecteerd. Zie https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" cors_origins: "Toegestane domeinen voor cross-origin-aanvragen (CORS). Elk domein moet http:// of https:// bevatten. De omgevingsvariabele DISCOURSE_ENABLE_CORS moet op true zijn ingesteld om CORS in te schakelen." + use_admin_ip_allowlist: "Beheerders kunnen zich alleen aanmelden vanaf een IP-adres dat in de lijst Gecontroleerde IP-nummers is gedefinieerd (Beheer > Logboeken > Gecontroleerde IP-adressen)." + blocked_ip_blocks: "Een lijst van private IP-blokken die nooit door Discourse mogen worden verkend" + allowed_internal_hosts: "Een lijst van interne hosts die Discourse veilig kan verkennen voor oneboxing en andere doeleinden" allowed_iframes: "Een lijst van 'iframe src'-domeinvoorvoegsels die Discourse veilig kan toestaan in berichten" + allowed_crawler_user_agents: "Useragents van webcrawlers die toegang tot de website dienen te hebben. WAARSCHUWING! INSTELLEN HIERVAN BLOKKEERT ALLE CRAWLERS DIE HIER NIET WORDEN VERMELD!" slow_down_crawler_user_agents: "Useragents van webcrawlers waarvan aanvragen beperkt moeten zijn in robots.txt via de Crawl-delay-instructie" slow_down_crawler_rate: "Als slow_down_crawler_user_agents is opgegeven, is deze beperking op alle crawlers van toepassing (aantal seconden vertraging tussen aanvragen)" content_security_policy: "Content-Security-Policy inschakelen" @@ -1468,6 +1473,7 @@ nl: min_admin_password_length: "Minimale wachtwoordlengte voor beheerders." password_unique_characters: "Minimale aantal unieke tekens dat een wachtwoord moet hebben." block_common_passwords: "Geen wachtwoorden toestaan die in de 10.000 meest gebruikte wachtwoorden voorkomen." + discourse_connect_overrides_bio: "Overschrijft biografie in gebruikersprofiel en voorkomt dat gebruiker deze kan wijzigen" enable_local_logins_via_email: "Gebruikers mogen vragen een koppeling voor aanmelding met één klik via e-mail te laten toesturen." allow_new_registrations: "Nieuwe gebruikersregistraties toestaan. Vink dit uit om te voorkomen dat iedereen een nieuwe account kan maken." enable_signup_cta: "Een melding tonen voor terugkerende anonieme gebruikers waarin wordt gevraagd zich voor een account te registreren" @@ -1595,6 +1601,7 @@ nl: min_trust_level_to_allow_user_card_background: "Het minimale vertrouwensniveau dat nodig is om een gebruikerskaartachtergrond te uploaden" min_trust_level_to_allow_invite: "Het minimale vertrouwensniveau dat nodig is om gebruikers uit te nodigen" min_trust_level_to_allow_ignore: "Het minimale vertrouwensniveau dat nodig is om gebruikers te negeren" + allowed_link_domains: "Domeinen waarnaar gebruikers mogen verwijzen, zelfs als ze niet het juiste vertrouwensniveau hebben om koppelingen te plaatsen" newuser_max_links: "Hoeveel koppelingen een nieuwe gebruiker aan een bericht kan toevoegen." newuser_max_attachments: "Hoeveel bijlagen een nieuwe gebruiker aan een bericht kan toevoegen." newuser_max_mentions_per_post: "Maximale aantal @naam-vermeldingen dat een nieuwe gebruiker in een bericht kan gebruiken." @@ -1646,6 +1653,7 @@ nl: privacy_policy_url: "Als u ergens anders een document met een Privacybeleid hebt gehost, geef hier dan de volledige URL op." log_anonymizer_details: "Of de details van een gebruiker in het logboek worden behouden nadat ze zijn geanonimiseerd. Om aan de GDPR te voldoen, dient u dit uit te schakelen." newuser_spam_host_threshold: "Hoe vaak een nieuwe gebruiker een koppeling naar dezelfde host kan plaatsen binnen de `newuser_spam_host_threshold` berichten ervan voordat deze als spam worden beschouwd." + allowed_spam_host_domains: "Een lijst met domeinen die niet op spam worden gecontroleerd. Nieuwe gebruikers kunnen onbeperkt koppelingen naar deze domeinen plaatsen." topic_view_duration_hours: "Elke N uur één keer per IP/Gebruiker een nieuw-topicweergave tellen." user_profile_view_duration_hours: "Elke N uur één keer per IP/Gebruiker een nieuw-gebruikersprofielweergave tellen." levenshtein_distance_spammer_emails: "Bij het vergelijken van spam-e-mails, het aantal verschillende tekens waarbij nog steeds een wazige overeenkomst kan bestaan." @@ -1659,6 +1667,7 @@ nl: min_first_post_typing_time: "Minimale tijd in milliseconden dat een gebruiker moet typen tijdens een eerste bericht. Als de drempelwaarde niet wordt bereikt, wordt het bericht automatisch in de wachtrij voor goedkeuring gezet. Stel dit in op 0 om uit te schakelen (niet aanbevolen)." auto_silence_fast_typers_on_first_post: "Automatisch gebruikers dempen die niet aan min_first_post_typing_time voldoen" auto_silence_fast_typers_max_trust_level: "Maximale vertrouwensniveau om snelle typers automatisch te dempen" + auto_silence_first_post_regex: "Hoofdlettergevoelige regex die bij overeenkomst het eerste bericht van een gebruiker dempt en in de wachtrij voor goedkeuring zet. Voorbeeld: raging|a[bc]a zorgt ervoor dat alle eerste berichten die raging, aba of aca bevatten worden gedempt. Alleen van toepassing op het eerste bericht." reviewable_claiming: "Dient beoordeelbare inhoud te worden opgeëist voordat er een handeling op kan worden uitgevoerd?" reviewable_default_topics: "Beoordeelbare inhoud standaard gegroepeerd op topic tonen" reviewable_default_visibility: "Geen beoordeelbare items tonen, tenzij ze aan deze prioriteit voldoen" @@ -1680,6 +1689,7 @@ nl: max_emails_per_day_per_user: "Maximale aantal e-mails dat per dag naar gebruikers wordt verzonden. 0 om de limiet uit te schakelen" enable_staged_users: "Automatisch staged gebruikers aanmaken bij het verwerken van inkomende e-mails." maximum_staged_users_per_email: "Maximale aantal staged gebruikers dat bij het verwerken van een inkomende e-mail wordt aangemaakt." + auto_generated_allowlist: "Lijst van e-mailadressen die niet op automatisch gegenereerde inhoud worden gecontroleerd. Voorbeeld: foo@bar.com|discourse@bar.com" block_auto_generated_emails: "Inkomende e-mails die als automatisch gegenereerd zijn herkend blokkeren." ignore_by_title: "Inkomende e-mails op basis van hun titel blokkeren." mailgun_api_key: "Geheime API-sleutel van Mailgun voor het verifiëren van webhookberichten." @@ -1765,6 +1775,7 @@ nl: clean_up_unused_staged_users_after_days: "Aantal dagen voordat een niet-gebruikte staged gebruiker (zonder berichten) wordt verwijderd. Stel 0 in om opschonen uit te schakelen." user_selected_primary_groups: "Gebruikers mogen hun eigen primaire groep instellen" max_notifications_per_user: "Maximale aantal meldingen per gebruiker. Als dit aantal wordt overschreden, worden oude meldingen verwijderd. Wekelijks afgedwongen. Stel dit in op 0 om uit te schakelen." + allowed_user_website_domains: "Website van gebruiker wordt op deze domeinen gecontroleerd. Door pipes gescheiden lijst." allow_profile_backgrounds: "Gebruikers mogen profielachtergronden uploaden." sequential_replies_threshold: "Aantal berichten dat een gebruiker achter elkaar in één topic moet plaatsen voordat deze aan te veel opeenvolgende reacties wordt herinnerd." get_a_room_threshold: "Aantal berichten dat een gebruiker aan dezelfde persoon in hetzelfde topic moet richten voordat deze wordt gewaarschuwd." @@ -1803,6 +1814,7 @@ nl: embed_truncate: "De ingebedde berichten inkorten." embed_unlisted: "Geïmporteerde topics zijn onzichtbaar totdat een gebruiker antwoordt." embed_support_markdown: "Markdown-opmaak voor ingebedde berichten ondersteunen." + allowed_embed_selectors: "Een door komma's gescheiden lijst van CSS-elementen die bij inbedding zijn toegestaan." allowed_href_schemes: "Toegestane schema's in koppelingen, naast http en https." embed_post_limit: "Maximale aantal in te bedden berichten." embed_username_required: "De gebruikersnaam voor het maken van topics is vereist." @@ -1850,6 +1862,7 @@ nl: default_other_enable_quoting: "Antwoord-met-citaat voor gemarkeerde tekst standaard inschakelen." default_other_enable_defer: "Topicnegeerfunctionaliteit standaard inschakelen." default_other_dynamic_favicon: "Aantal nieuwe / bijgewerkte topics standaard tonen op browserpictogram." + default_other_skip_new_user_tips: "Onboarding-tips en -badges voor nieuwe gebruikers overslaan." default_other_like_notification_frequency: "Gebruikers standaard informeren bij likes" default_topics_automatic_unpin: "Topics standaard automatisch losmaken wanneer de gebruiker de onderkant bereikt." default_categories_watching: "Lijst van categorieën die standaard in de gaten worden gehouden." @@ -1939,6 +1952,7 @@ nl: empty_selectable_avatars: "U moet eerst minstens twee selecteerbare avatars uploaden voordat u deze instelling inschakelt." allowed_unicode_usernames: regex_invalid: "De reguliere expressie is ongeldig: %{error}" + leading_trailing_slash: "De reguliere expressie mag niet met een schuine streep beginnen en eindigen." unicode_usernames_avatars: "De interne systeemavatars ondersteunen geen Unicode-gebruikersnamen." list_value_count: "De lijst moet precies %{count} waarden bevatten." placeholder: @@ -1957,6 +1971,13 @@ nl: video: "[video]" discourse_connect: login_error: "Aanmeldingsfout" + not_found: "Uw account kon niet worden gevonden. Neem contact op met de beheerder van de website." + account_not_approved: "Uw account wacht op goedkeuring. U ontvangt een e-mailmelding zodra deze is goedgekeurd." + unknown_error: "Er is een probleem met uw account. Neem contact op met de beheerder van de website." + timeout_expired: "Time-out bij accountaanmelding, probeer u opnieuw aan te melden." + no_email: "Er is geen e-mailadres opgegeven. Neem contact op met de beheerder van de website." + blank_id_error: "De `external_id` is vereist, maar was leeg" + email_error: "Er kon geen account met het e-mailadres %{email} worden geregistreerd. Neem contact op met de beheerder van de website." original_poster: "Oorspronkelijk geplaatst door" most_posts: "Meer berichten" most_recent_poster: "Meest recente schrijver" @@ -2237,6 +2258,8 @@ nl: subject_template: "Bericht verborgen door gemeenschapsmarkeringen" post_hidden_again: title: "Bericht opnieuw verborgen" + queued_by_staff: + title: "Bericht heeft goedkeuring nodig" flags_disagreed: title: "Gemarkeerd bericht teruggezet door staflid" subject_template: "Gemarkeerd bericht teruggezet door staflid" @@ -2361,6 +2384,7 @@ nl: subject_template: "Is uw e-mailadres correct?" too_many_spam_flags: title: "Te veel spammarkeringen" + subject_template: "Nieuwe account in wachtstand" too_many_tl3_flags: subject_template: "Nieuwe account in wachtstand" silenced_by_staff: @@ -2418,18 +2442,77 @@ nl: pm_participants: "Deelnemers: %{participants}" user_replied: title: "Gebruiker antwoordde" + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_replied_pm: subject_template: "[%{email_prefix}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} + user_quoted: + subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_linked: title: "Gebruiker gekoppeld" subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_mentioned: subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_mentioned_pm: subject_template: "[%{email_prefix}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_group_mentioned: title: "Gebruikersgroep genoemd" subject_template: "[%{email_prefix}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + %{respond_instructions} user_posted: title: "Een gebruiker heeft iets geplaatst" subject_template: "[%{email_prefix}] %{topic_title}" @@ -2559,6 +2642,7 @@ nl: title: "Waarschuwing voor nieuwe aanmelding" subject_template: "[%{site_name}] Nieuwe aanmelding vanaf %{location}" post_approved: + title: "Uw bericht is goedgekeurd" subject_template: "[%{site_name}] Uw bericht is goedgekeurd" page_forbidden: title: "Oeps! Die pagina is privé." @@ -2769,8 +2853,10 @@ nl: Deze badge wordt toegekend wanneer u 20 dagen lang alle %{max_likes_per_day} van uw dagelijkse likes gebruikt. Wow! U bent een rolmodel voor het aanmoedigen van uw medegemeenschapsleden! thank_you: name: Bedankt + description: Heeft 20 geliket en 10 likes gegeven gives_back: name: Geeft terug + description: Heeft 100 geliket en 100 likes gegeven empathetic: name: Empathisch description: Heeft 500 geliket en 1000 likes gegeven @@ -3083,6 +3169,7 @@ nl: topic_title_with_sequence: one: "%{topic_title} (Deel %{count})" other: "%{topic_title} (Deel %{count})" + post_raw: "De discussie wordt voortgezet vanaf %{parent_url}.\n\nEerdere discussies:\n\n%{previous_topics}" activemodel: errors: <<: *errors diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml index a1f7d831ac497..d9491bd4d47c3 100644 --- a/config/locales/server.pl_PL.yml +++ b/config/locales/server.pl_PL.yml @@ -1887,6 +1887,7 @@ pl_PL: min_first_post_typing_time: "Minimalny czas w milisekundach, w którym użytkownik musi napisać wpis, jeśli próg nie zostanie osiągnięty wpis zostanie automatycznie dostosowany w zależności od kolejki zatwierdzania potrzeb. Ustaw 0, aby wyłączyć (nie polecane)" auto_silence_fast_typers_on_first_post: "Automatycznie wyciszaj użytkowników, którzy nie dotrzymują czasu_pierwszego_poczęcia" auto_silence_fast_typers_max_trust_level: "Maksymalny poziom zaufania do automatycznego wyciszania szybkich maszyn do pisania" + auto_silence_first_post_regex: "Wyrażenie regularne bez rozróżniania wielkości liter, które jeśli zostanie przekazane, spowoduje wyciszenie pierwszego wpisu przez użytkownika i wysłanie go do kolejki zatwierdzania. Przykład: wściekły | a [bc] a spowoduje, że wszystkie wpisy zawierające wściekłe lub aba lub aca zostaną najpierw wyciszone. Dotyczy tylko pierwszego wpisu." reviewable_claiming: "Czy należy przejrzeć treść, którą można przeglądać, zanim będzie można z niej skorzystać?" reviewable_default_topics: "Domyślnie wyświetlaj zawartość do przeglądania pogrupowaną według tematów" reviewable_default_visibility: "Nie pokazuj elementów, które można przeglądać, chyba że spełniają ten priorytet" diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml index 284ed67346375..f7555b0c68be3 100644 --- a/config/locales/server.pt.yml +++ b/config/locales/server.pt.yml @@ -39,6 +39,7 @@ pt: title: "Discourse" topics: "Tópicos" posts: "mensagens" + views: "vistas" loading: "A carregar" powered_by_html: 'Desenvolvido por Discourse, e melhor visualização com o JavaScript ativado' sign_up: "Inscrever-se" @@ -50,6 +51,8 @@ pt: remove_posts_deleted_by_author: "Eliminado pelo autor" redirect_warning: "Nós não conseguimos verificar se a hiperligação que selecionou foi publicada no fórum. Se desejar continuar de qualquer maneira, selecione a hiperligação abaixo." on_another_topic: "Noutro tópico" + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} por %{username}" themes: bad_color_scheme: "Não é possível atualizar o tema, a paleta de cores é inválida" other_error: "Ocorreu algo de errado ao atualizar o tema" @@ -239,6 +242,9 @@ pt: permalink: "Hiperligação Permanente" imported_from: "Este é um tópico de discussão de acompanhamento para a entrada original em %{link}" in_reply_to: "▶ %{username}" + replies: + one: "%{count} resposta" + other: "%{count} respostas" created: "Criado" new_topic: "Criar novo tópico" no_mentions_allowed: "Pedimos desculpa, não pode mencionar outros utilizadores." @@ -275,6 +281,9 @@ pt: topics_in_category: "Tópicos na categoria '%{category}'" rss_posts_in_topic: "Feed RSS de '%{topic}'" rss_topics_in_category: "Feed RSS dos tópicos da categoria '%{category}'" + rss_num_posts: + one: "%{count} publicação" + other: "%{count} publicações" read_full_topic: "Ler tópico completo" private_message_abbrev: "Msg" rss_description: @@ -298,9 +307,11 @@ pt: bookmarks: reminders: later_today: "Hoje, mais tarde" + next_business_day: "Próximo dia útil" tomorrow: "Amanhã" next_week: "Próxima semana" next_month: "Próximo mês" + custom: "Data e hora personalizadas" groups: errors: can_not_modify_automatic: "Não pode modificar um grupo automático" @@ -561,6 +572,7 @@ pt: short_description: "Gostar desta publicação" user_activity: no_bookmarks: + self: "Você não tem posts marcados; os favoritos permitem-lhe consultar rapidamente posts específicos." others: "Sem marcadores." no_likes_given: self: "Ainda não gostou de nenhuma publicação." @@ -627,6 +639,7 @@ pt: reports: default: labels: + count: Contagem day: Dia post_edits: labels: @@ -637,6 +650,7 @@ pt: user_flagging_ratio: labels: user: Utilizador + score: Pontuação moderators_activity: title: "Atividade de Moderador" labels: @@ -686,6 +700,7 @@ pt: title: "Gostos" xaxis: "Dia" yaxis: "Número de novos gostos" + description: "Número de novos gostos." flags: title: "Sinalizações" xaxis: "Dia" @@ -698,6 +713,7 @@ pt: title: "Utilizadores por Nível de Confiança" xaxis: "Nível de Confiança" yaxis: "Número de Utilizadores" + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: xaxis: "Tipo" yaxis: "Número de Utilizadores" @@ -879,6 +895,7 @@ pt: show_pinned_excerpt_mobile: "Mostrar excerto em publicações afixadas na vista móvel." show_pinned_excerpt_desktop: "Mostar excerto em publicações afixadas na vista de desktop." post_onebox_maxlength: "Tamanho máximo de uma mensagem Discourse de caixa única, em caracteres." + blocked_onebox_domains: "Uma lista de domínios para a qual nunca serão geradas pré-visualizações." max_oneboxes_per_post: "Número máximo de pré-visualizações numa publicação." manifest_screenshots: "Capturas de tela que mostrem os recursos e a funcionalidade da instância na página de incentivo à instalação. Todas as imagens devem ser envios locais e das mesmas dimensões." notification_email: "Para: endereço de email usado ao enviar emails essenciais do sistema. O domínio especificado aqui deverá ter SPF, DKIM e registos PTR inversos configurados corretamente para a chegada do email." @@ -905,6 +922,7 @@ pt: pending_users_reminder_delay: "Notificar moderadores se novos utilizadores estiverem à espera de aprovação por mais que esta quantidade de horas. Configurar com -1 para desativar notificações." maximum_session_age: "Utilizador permanecerá ligado durante n horas desde a última visita" cors_origins: "Permitidos compartilhamentos de recursos de origem-cruzada (CORS). Cada origem deve incluir http:// ou https://. A variável de ambiente DISCOURSE_ENABLE_CORS tem que estar configurada a verdadeiro para ativar o CORS." + use_admin_ip_allowlist: "Os Administradores só podem iniciar sessão se estiverem num endereço IP definido na lista de IPs Rastreados (Admin > Logs > IPs Rastreados)." top_menu: "Determinar que elementos aparecem na navegação da página principal, e em que ordem. Exemplo últimos|novos|não lidos|categorias|topo|lidos|publicados|marcadores" post_menu: "Determine que itens irão aparecer no menu de mensagens, e em que ordem. Exemplo\ngostar|editar|sinalizar|eliminar|partilhar|marcar|responder" post_menu_hidden_items: "Os elementos do menu a serem escondidos por defeito no menu de mensagens a não ser que se clique na elipse de expansão." @@ -923,6 +941,8 @@ pt: email_token_valid_hours: "Os símbolos para palavra-passe esquecida /conta ativada são válidos por (n) horas." enable_badges: "Ativar o sistema de distintivos" enable_whispers: "Permitir à equipa de apio comunicar de forma privada dentro de tópicos." + blocked_email_domains: "Lista de domínios de email que os utilizadores não podem usar para registo de contas. Exemplo: mailinator.com|trashmail.net" + allowed_email_domains: "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!" log_out_strict: "Ao terminar sessão, saia de TODAS as sessões do utilizador em todos dispositivos" new_version_emails: "Enviar um email para o endereço 'contact_email' quando uma nova versão do Discourse estiver disponível." invite_expiry_days: "Durante quantos dias as chaves de convite são válidas." @@ -930,6 +950,7 @@ pt: min_password_length: "Tamanho mínimo da palavra-passe." min_admin_password_length: "Tamanho mínimo da palavra-passe para Administração." block_common_passwords: "Não permitir palavras-passe que estejam nas 10,000 palavras-passe mais comuns." + discourse_connect_overrides_bio: "Sobrepõe-se à biografia do utilizador e previne o utilizador de a mudar" allow_new_registrations: "Permitir registo de novos utilizadores. Desmarcar isto para prevenir que alguém crie uma nova conta." enable_signup_cta: "Mostrar um aviso a utilizadores anónimos que retornem levando-os a inscreverem-se para uma conta." google_oauth2_client_id: "ID do cliente da sua aplicação Google." @@ -1021,6 +1042,7 @@ pt: desktop_category_page_style: "Estilo visual para a página de categorias." category_colors: "Lista de valores hexadecimais das cores permitidas nas categorias." category_style: "Estilo visível para distintivos de categorias." + dark_mode_none: "Nenhum" max_attachment_size_kb: "Tamanho máximo dos anexos carregados em kB. Este deverá ser configurado em nginx (client_max_body_size) / apache ou também proxy." authorized_extensions: "Lista de extensões permitidas para carregamento (utilizar '*' para ativar todos os tipos de ficheiros)" max_similar_results: "Quantos tópicos semelhantes a serem exibidos acima do editor ao compor um novo tópico. A comparação é baseada no título e no corpo." @@ -1041,6 +1063,7 @@ pt: tos_url: "Se tem um documento de Termos de Serviço alojado noutro local e que queira usar, forneça a URL completa aqui." privacy_policy_url: "Se tem um documento de Política de Privacidade alojado noutro local e que queira usar, forneça a URL completa aqui." newuser_spam_host_threshold: "Quantas vezes um novo utilizador pode colocar um link para o mesmo endereço dentro do número de publicações `newuser_spam_host_threshold` , antes de ser considerado spam." + allowed_spam_host_domains: "Lista de domínios excluídos dos testes de spam. Novos utilizadores nunca irão ser restritos da criação de mensagens com hiperligações a esses domínios." topic_view_duration_hours: "Contar uma nova visualização do tópico uma vez por IP/Utilizador a cada N horas" user_profile_view_duration_hours: "Contar visualização de novo perfil de utilizador uma vez por IP/utilizador a cada N horas" levenshtein_distance_spammer_emails: "Ao fazer a correspondência de e-mails de spam, o número de caracteres de diferença que ainda permitirá uma correspondência difusa." @@ -1064,6 +1087,7 @@ pt: max_emails_per_day_per_user: "Número máximo de emails para enviar aos utilizadores por dia. 0 para desativar o limite" enable_staged_users: "Automaticamente criar utilizadores temporários ao processar emails recebidos." maximum_staged_users_per_email: "Número máximo de utilizadores temporários criados ao processar um email recebido." + auto_generated_allowlist: "Lista de endereços de email que não serão verificados para conteúdo gerado automaticamente. Exemplo: foo@bar.com|discourse@bar.com" block_auto_generated_emails: "Bloquear as mensagens a receber que sejam identificadas como tendo sido geradas automaticamente." ignore_by_title: "Ignorar emails recebidos com base no seu título." mailgun_api_key: "Chave de API secreta de Mailgun usada para verificar mensagens." @@ -1157,6 +1181,7 @@ pt: default_other_external_links_in_new_tab: "Por defeito, abrir hiperligações externas num novo separador." default_other_enable_quoting: "Por defeito, ativar resposta por citação para texto destacado." default_other_dynamic_favicon: "Mostrar contagem de tópicos novos / atualizados no ícone do browser." + default_other_skip_new_user_tips: "Ignorar dicas e emblemas de integração de novos usuários." default_other_like_notification_frequency: "Notificar, por omissão, os utilizadores quando alguém gostar" default_topics_automatic_unpin: "Desafixar automaticamente tópicos quando um utilizador chega ao final, por defeito." default_categories_watching: "Lista de categorias que por defeito são vigiadas." @@ -1210,6 +1235,12 @@ pt: topic: "Resultados" user: "Utilizadores" results_page: "Resultados da pesquisa por '%{term}'" + discourse_connect: + login_error: "Erro de Início de Sessão" + not_found: "A sua conta não foi encontrada. Por favor contacte o administrador do site." + account_not_approved: "A sua conta ainda não foi aprovada. Receberá uma notificação por email quando a sua conta for aprovada." + unknown_error: "Existe um problema com a sua conta. Por favor contacte o administrador do site." + timeout_expired: "Expirou o tempo de login, por favor tente entrar de novo." original_poster: "Participante Original" most_posts: "Maior parte das mensagens" most_recent_poster: "Participante Mais Recente" @@ -1275,6 +1306,7 @@ pt: email_too_long: "O email fornecido é demasiado longo. Nomes de caixas de email não devem ter mais que 254 caracteres, e nomes de domínio não devem ter mais que 253 caracteres." reserved_username: "Esse nome de utilizador não é permitido." missing_user_field: "Não completou todos os campos de utilizador." + second_factor_title: "Autenticação em Dois Passos" second_factor_backup_description: "Por favor introduza um dos seus códigos de reserva:" admin: email: @@ -1721,6 +1753,7 @@ pt: sender_body_blank: "corpo está em branco" color_schemes: base_theme_name: "Base" + default_theme_name: "Predefinição" edit_this_page: "Editar esta página" csv_export: boolean_yes: "Sim" @@ -2059,11 +2092,18 @@ pt: description: "Endereço de email da pessoa ou grupo responsáveis por esta comunidade. Usado para notificações críticas tais como denúncias não tratadas, actualizações de segurança, assim como na sua página de descrição para comunicações urgentes com a comunidade." contact_url: label: "Página da Internet" + placeholder: "https://www.example.com/contact-us" description: "Página da internet com informação geral sobre si ou a sua organização. Será mostrada na sua página de descrição." site_contact: label: "Mensagens Automatizadas" corporate: title: "Organização" + colors: + title: "Cores" + fonts: + fields: + font_preview: + label: "Pré-visualização" logos: title: "Logos" fields: @@ -2106,6 +2146,12 @@ pt: confirm_title: "Notificações ativas - %{site_title}" confirm_body: "Sucesso! As notificações foram ativadas." reviewables: + priorities: + medium: "Médio" + high: "Elevado" + sensitivity: + medium: "Médio" + high: "Elevado" reasons: queued_by_staff: "Um membro do pessoal considera que esta publicação necessita de ser revista. Ela permanecerá oculta até lá." actions: diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml index 14ee7138ec226..d78fcc6199e48 100644 --- a/config/locales/server.pt_BR.yml +++ b/config/locales/server.pt_BR.yml @@ -39,6 +39,7 @@ pt_BR: title: "Discourse" topics: "Tópicos" posts: "mensagens" + views: "visualizações" loading: "Carregando" powered_by_html: 'Desenvolvido por Discourse, melhor visualizado com JavaScript habilitado' sign_up: "Cadastrar-se" @@ -50,6 +51,8 @@ pt_BR: remove_posts_deleted_by_author: "Deletado pelo autor" redirect_warning: "Não foi possível confirmar se o link selecionado foi publicado no fórum. Se você deseja continuar mesmo assim, selecione o link abaixo." on_another_topic: "Em outro tópico" + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} por %{username}" themes: bad_color_scheme: "Não é possível atualizar o tema, paleta de cores inválida" other_error: "Algo de errado aconteceu ao atualizar o tema" @@ -193,6 +196,8 @@ pt_BR: user_exists: "Não há necessidade de convidar %{email}, eles já tem uma conta!" invalid_email: "%{email}' não é um endereço de e-mail válido." confirm_email: "

Você está quase pronto! Enviamos um e-mail de ativação para o seu endereço de e-mail. Por favor, siga as instruções no e-mail para ativar sua conta.

Se não chegar, verifique sua pasta de spam.

" + disabled_errors: + invalid_access: "Você não tem permissão para ver o recurso solicitado." bulk_invite: file_should_be_csv: "O arquivo atualizado deve ter o formato csv." max_rows: "Os primeiros %{max_bulk_invites} convites foram enviados. Tente dividir o arquivo em partes menores." @@ -296,6 +301,9 @@ pt_BR: topics_in_category: "Tópicos na categoria '%{category}'" rss_posts_in_topic: "RSS feed de '%{topic}'" rss_topics_in_category: "RSS feed dos tópicos da categoria '%{category}'" + rss_num_posts: + one: "%{count} mensagem" + other: "%{count} mensagens" read_full_topic: "Ler tópico completo" private_message_abbrev: "Msg" rss_description: @@ -1013,6 +1021,7 @@ pt_BR: labels: level: Nível description: "Número de usuários agrupados por nível de confiança." + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: title: "Usuários por tipo" xaxis: "Tipo" @@ -1277,6 +1286,8 @@ pt_BR: show_pinned_excerpt_mobile: "Mostrar excerto de tópicos fixos na exibição para celular." show_pinned_excerpt_desktop: "Mostrar excerto de tópicos fixos na exibição para desktop." post_onebox_maxlength: "Tamanho máximo para um Post em caracteres" + blocked_onebox_domains: "Uma lista de domínios que nunca serão transformados em oneboxes." + allowed_inline_onebox_domains: "Uma lista de domínios que serão colocados em miniatura se vinculados sem um título" max_oneboxes_per_post: "Número máximos de oneboxes em uma publicação." logo: "A imagem do logotipo no canto superior esquerdo do seu site. Use uma imagem retangular larga com uma altura de 120 e uma proporção maior que 3:1. Se deixado em branco, o texto do título do site será exibido." logo_small: "A pequena imagem do logotipo no canto superior esquerdo do site, vista ao rolar para baixo. Use uma imagem quadrada de 120 × 120. Se deixado em branco, um glifo de página inicial será exibido." @@ -1327,7 +1338,11 @@ pt_BR: maximum_session_age: "Usuário continuará logado por n horas desde a última visita" enable_escaped_fragments: "Voltar para a API do Google Ajax-Crawling se não for encontrado um webcrawler. Consulte https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" cors_origins: "Origens permitidas para pedidos de origem-cruzada (CORS). Cada origem deve incluir http:// ou https://. A variável de ambiente DISCOURSE_ENABLE_CORS deve ser definida como true para habilitar CORS." + use_admin_ip_allowlist: "Administradores só podem logar se estiverem na lista de IPs Filtrados (Administração > Logs > IPs Filtrados)." + blocked_ip_blocks: "Uma lista de blocos IP privados que nunca devem ser rastreados pelo Discourse" + allowed_internal_hosts: "Uma lista de hosts internos que o discurso pode rastrear com segurança para o oneboxing e outros fins" allowed_iframes: "Uma lista de prefixos de domínio iframe src que o discurso pode permitir com segurança em postagens" + allowed_crawler_user_agents: "Agentes de usuário de crawlers da Web que devem ter permissão para acessar o site. AVISO! ESTA CONFIGURAÇÃO NEGARÁ ACESSO A TODOS OS CRAWLERS NÃO LISTADOS AQUI!" slow_down_crawler_user_agents: "Agentes do usuário de rastreadores da web que devem ter uma taxa limitada em robots.txt usando a diretiva de rastreamento atrasado" slow_down_crawler_rate: "Se slow_down_crawler_user_agents for especificado, essa taxa será aplicada a todos os rastreadores (número de segundos de atraso entre as solicitações)" content_security_policy: "Habilitar Content-Security-Policy" @@ -1357,6 +1372,8 @@ pt_BR: email_token_valid_hours: "Tokens de Esqueceu senha / ativar conta são válidas por (n) horas." enable_badges: "Habilita o sistema de emblemas" enable_whispers: "Permitir a comunicação pessoal da equipe nos tópicos." + blocked_email_domains: "Lista delimitada por barras (|) de domínios de email que não são permitidos registros de contas. Exemplo: mailinator.com|trashmail.net" + allowed_email_domains: "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!" hide_email_address_taken: "Não informe os usuários de que existe uma conta com um determinado endereço de e-mail durante a inscrição e o formulário de senha esquecida." log_out_strict: "Quando deslogando, deslogar TODAS as sessões do usuário em todos os dispositivos" version_checks: "Verificar no Hub do Discourse por atualizações de versão e mostre novas mensagens de versão no painel /admin" @@ -1372,6 +1389,7 @@ pt_BR: min_admin_password_length: "Tamanho de senha mínima para Administradores." password_unique_characters: "Número mínimo de caracteres únicos que uma senha deve ter." block_common_passwords: "Não permitir senhas que estiverem entre as 10,000 senhas mais comuns." + discourse_connect_overrides_bio: "Sobrescreve a bio de usuário e impede o usuário de mudá-la." enable_local_logins_via_email: "Permitir que os usuários solicitem um link de login com um clique para serem enviados por e-mail." allow_new_registrations: "Permitir registro de novos usuários. Desmarque isso para prevenir quem quer que seja de criar uma nova conta." enable_signup_cta: "Mostra um aviso aos usuários anônimos que retornem, solicitando que criem uma conta." @@ -1485,6 +1503,7 @@ pt_BR: min_trust_to_flag_posts: "O nível de confiança mínimo necessário para sinalizar postagens" min_trust_to_post_links: "O nível de confiança mínimo necessário para incluir links em postagens" min_trust_level_to_allow_invite: "Nível mínimo de confiança necessário para convidar usuários" + allowed_link_domains: "Domínios aos quais os usuários podem vincular, mesmo que não tenham o nível de confiança apropriado para postar links" newuser_max_links: "Quandos links um usuário novo pode adicionar a um post." newuser_max_attachments: "Quantos arquivos anexos um usuário novo pode adicionar a um post." newuser_max_mentions_per_post: "Número máximo de notificações @nome que um usuário novo pode usar em um post." @@ -1507,6 +1526,7 @@ pt_BR: desktop_category_page_style: "Estilo visual para a página / categorias." category_colors: "Uma lista de valores hexadecimais de cor permitidos para categorias." category_style: "Estilo visual para emblemas de categoria." + dark_mode_none: "Nenhum" max_attachment_size_kb: "O tamanho máximo de upload de arquivos anexos em kB. Isso precisa ser configurado no nginx (client_max_body_size) / apache ou também proxy." authorized_extensions: "Uma lista de extensões de arquivo permitidas para upload (use '*' para permitir todos os tipos de arquivos)" authorized_extensions_for_staff: "Uma lista de extensões de arquivo permitidas para upload para usuários da equipe, além da lista definida na configuração do site `authorized_extensions`. (use '*' para ativar todos os tipos de arquivo)" @@ -1532,6 +1552,7 @@ pt_BR: privacy_policy_url: "Se você tem um documento de Política de Privacidade hospedado em algum outro local que você queira usar, forneça a URL completa aqui." log_anonymizer_details: "Se deseja manter os detalhes de um usuário no log depois de ser anonimizado. Ao cumprir com o GDPR, você precisará desativá-lo." newuser_spam_host_threshold: "Quantas vezes um novo usuário pode postar um link para o mesmo host em suas postagens `newuser_spam_host_threshold` antes de ser considerado spam." + allowed_spam_host_domains: "Uma lista de domínios excluídas do teste de spam. Usuários novos nunca serão restringidos de criar posts com links para estes domínios." topic_view_duration_hours: "Conte uma nova visualização de tópico uma vez por IP / Usuário a cada N horas" user_profile_view_duration_hours: "Conte uma nova visualização de perfil de usuário uma vez por IP / Usuário a cada N horas" levenshtein_distance_spammer_emails: "Ao equiparar emails de spammers, o número da diferença de caracteres que ainda assim irá permitir uma equiparação imprecisa." @@ -1545,6 +1566,7 @@ pt_BR: min_first_post_typing_time: "Quantidade mínima de tempo, em milissegundos, que um usuário deve digitar durante a primeira postagem; se o limite não for atingido, a postagem entrará automaticamente na fila de aprovação de necessidades. Defina como 0 para desativar (não recomendado)" auto_silence_fast_typers_on_first_post: "Silenciar automaticamente usuários que não atendem a min_first_post_typing_time" auto_silence_fast_typers_max_trust_level: "Nível máximo de confiança para silenciar automaticamente os tipos rápidos" + auto_silence_first_post_regex: "Regex insensitivo a maiúsculas e minúsculas que, se for transmitido, fará com que o primeiro post do usuário seja silenciado e enviado para a fila de aprovação. Exemplo: raging | a [bc] a, fará com que todas as mensagens contendo raging ou aba ou aca sejam silenciadas primeiro. Aplica-se apenas ao primeiro post." reviewable_claiming: "O conteúdo revisável precisa ser reivindicado antes que possa ser aplicado?" reviewable_default_topics: "Mostrar conteúdo revisável agrupado por tópico por padrão" reviewable_default_visibility: "Não mostrar itens revisáveis, a menos que eles atendam a esta prioridade" @@ -1564,6 +1586,7 @@ pt_BR: max_emails_per_day_per_user: "Número máximo de emails para enviar usuários por dia. 0 para desabilitar o limite" enable_staged_users: "Crie automaticamente usuários temporários durante o processamento de emails recebidos." maximum_staged_users_per_email: "Número máximo de usuários preparados usando o processamento de um e-mail recebido." + auto_generated_allowlist: "Lista de endereços de e-mail que não serão verificados quanto a conteúdo gerado automaticamente. Exemplo: foo@bar.com | discourse@bar.com" block_auto_generated_emails: "Bloqueie os e-mails recebidos identificados como gerados automaticamente." ignore_by_title: "Ignore os e-mails recebidos com base no título deles." mailgun_api_key: "A chave da API Secreta do Mailgun é usada para verificar as mensagens do webhook." @@ -1628,6 +1651,7 @@ pt_BR: ignored_users_count_message_threshold: "Notificar moderadores se um usuário específico for ignorado por muitos outros usuários." ignored_users_message_gap_days: "Quanto tempo esperar antes de notificar novamente moderadores sobre um usuário que foi ignorado por muitos outros." clean_up_inactive_users_after_days: "Número de dias antes de um usuário inativo (nível de confiança 0 sem nenhuma postagem) ser removido. Para desativar a limpeza, defina como 0." + allowed_user_website_domains: "O website do usuário será verificado em relação a esses domínios. Lista delimitada por pipe." allow_profile_backgrounds: "Permitir usuários de fazerem upload de backgrounds para o perfil" sequential_replies_threshold: "Número de postagens que um usuário precisa fazer em uma linha em um tópico antes de ser lembrado sobre muitas respostas sequenciais." get_a_room_threshold: "Número de postagens que um usuário precisa fazer para a mesma pessoa no mesmo tópico antes de ser avisado." @@ -1657,6 +1681,7 @@ pt_BR: highlighted_languages: "Regras de destaque de sintaxe incluídas. (Atenção: incluir muitos idiomas pode afetar o desempenho) veja: https://highlightjs.org/static/demo para uma demonstração" embed_truncate: "Cortar os posts embutidos." embed_support_markdown: "Suporte Markdown formatação para posts incorporados." + allowed_embed_selectors: "Uma lista de elementos CSS separados por vírgula permitidos em incorporações." allowed_href_schemes: "Esquemas permitidos em links, além de http e https." embed_post_limit: "Número máximo de respostas para embutir" embed_username_required: "Nome de usuário para criação do tópico é obrigatório." @@ -1770,7 +1795,13 @@ pt_BR: max_username_length_exists: "Você não pode definir o comprimento máximo de nome de usuário abaixo do nome de usuário mais longo (%{username})." max_username_length_range: "Você não pode definir o máximo abaixo no mínimo." invalid_hex_value: "Os valores das cores precisam ser códigos hexadecimais de 6 dígitos." + allowed_unicode_usernames: + regex_invalid: "A expressão regular é inválida: %{error}" + leading_trailing_slash: "A expressão regular não deve começar e terminar com uma barra." unicode_usernames_avatars: "Os avatares internos do sistema não suportam nomes de usuário Unicode." + placeholder: + discourse_connect_provider_secrets: + key: "www.exemplo.com.br" search: extreme_load_error: "O site está sob carga extrema, a busca está desabilitada, tente novamente mais tarde" within_post: "#%{post_number} por %{username}" @@ -1782,7 +1813,13 @@ pt_BR: audio: "[audio]" video: "[video]" discourse_connect: + login_error: "Erro de Login" + not_found: "Sua conta não pode ser encontrada. Por favor, entre em contato com o administrador do site." + account_not_approved: "Sua conta está aguardando aprovação. Você receberá uma notificação por email quando ela for aprovada." unknown_error: "Há um problema com sua conta. Por favor, entre em contato com o administrador do site." + timeout_expired: "O login de sua conta expirou, por favor tente logar novamente." + no_email: "Nenhum endereço de e-mail foi fornecido. Por favor, entre em contato com o administrador do site." + email_error: "Uma conta não pôde ser registrada com o endereço de e-mail %{email}. Por favor, entre em contato com o administrador do site." original_poster: "Autor Original" most_posts: "Maior parte das postagens" most_recent_poster: "Autor Mais Recente" @@ -2109,6 +2146,8 @@ pt_BR: A comunidade sinalizou esta postagem e agora está oculta. **Como esta postagem foi ocultada mais de uma vez, sua postagem permanecerá oculta até ser tratada por um membro da staff.** Para obter orientações adicionais, consulte nossas [diretrizes da comunidade](%{base_url}/guidelines). + queued_by_staff: + title: "Postagem Precisa de Aprovação" flags_disagreed: title: "Postagem sinalizada restaurada pela staff" subject_template: "Postagem sinalizada restaurada pela staff" @@ -2842,6 +2881,9 @@ pt_BR: confirm_new_email: title: "Confirmar novo e-mail" subject_template: "[%{email_prefix}] Confirme seu novo endereço de e-mail" + confirm_new_email_via_admin: + title: "Confirmar novo e-mail" + subject_template: "[%{email_prefix}] Confirme seu novo endereço de e-mail" confirm_old_email: title: "Confirmar Antigo e-mail" subject_template: "[%{email_prefix}] Confirme seu endereço de e-mail atual" @@ -2913,6 +2955,8 @@ pt_BR: Se foi você, ótimo! Não há mais nada que você precise fazer. Se não foi você, por favor [revise suas sessões existentes](%{base_url}/my/preferences/account) e considere alterar sua senha. + post_approved: + title: "Sua postagem foi aprovada" page_not_found: title: "Oops! Essa página não existe ou é privada." popular_topics: "Popular" @@ -2985,6 +3029,7 @@ pt_BR: latte: "Latte" summer: "Verão" dark_rose: "Rosa Escura" + default_theme_name: "Padrão" light_theme_name: "Claro" dark_theme_name: "Escuro" neutral_theme_name: "Neutro" @@ -3463,6 +3508,12 @@ pt_BR: city_for_disputes: label: "Cidade para Disputas" placeholder: "São Francisco, Califórnia" + colors: + title: "Cores" + fonts: + fields: + font_preview: + label: "Prévia" logos: title: "Logotipos" fields: @@ -3551,6 +3602,7 @@ pt_BR: trust_level: "Usuários com níveis de confiança baixos precisam ter respostas aprovadas pela staff. Veja `approve_unless_trust_level`." new_topics_unless_trust_level: "Usuários com níveis de confiança baixos precisam ter tópicos aprovados pela staff. Veja `approve_new_topics_unless_trust_level`." fast_typer: "Novo usuário digitou sua primeira postagem desconfiadamente rápido, suspeita de comportamento de bot ou spammer. Veja `min_first_post_typing_time`." + auto_silence_regexp: "Novo usuário cuja primeira postagem corresponde à configuração `auto_silence_first_post_regex`." staged: "Novos tópicos e postagens para usuários fictícios precisam ser aprovados pela staff. Veja `approve_unless_staged`." category: "Postagens nesta categoria exigem aprovação manual pela staff. Veja as configurações da categoria." must_approve_users: "Todos os novos usuários precisam ser aprovados pela staff. Veja `must_approve_users`." diff --git a/config/locales/server.ro.yml b/config/locales/server.ro.yml index 4c96039ae743e..cf5c1406461a7 100644 --- a/config/locales/server.ro.yml +++ b/config/locales/server.ro.yml @@ -48,6 +48,8 @@ ro: disable_remote_images_download_reason: "Descărcarea de imagini la distanță a fost dezactivată deoarece nu mai era spațiu suficient pe disc." anonymous: "Anonime" remove_posts_deleted_by_author: "Șters de către autor" + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} de %{username}" emails: incoming: default_subject: "Acest subiect are nevoie de un titlu" @@ -121,6 +123,8 @@ ro: s3_upload_bucket_is_required: "Nu poți activa încărcările pe S3 dacă nu ai introdus 's3_upload_bucket'." invite: expired: "Codul tău de invitație a expirat. Te rugăm contactezi personalul forumului." + disabled_errors: + invalid_access: "Nu ai permisiunea să vezi această resursă." bulk_invite: 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." @@ -158,6 +162,10 @@ ro: permalink: "Link permanent" imported_from: "Acesta este un subiect de discuție adăugat la discuția originală de la %{link}" in_reply_to: "▶ %{username}" + replies: + one: "%{count} răspuns" + few: "%{count} răspunsuri" + other: "%{count} răspunsuri" created: "Creat" no_mentions_allowed: "Ne pare rău, nu poți menționa alți utilizatori." too_many_mentions: @@ -193,6 +201,10 @@ ro: topics_in_category: "Subiecte în categoria '%{category}'" rss_posts_in_topic: "RSS din '%{topic}'" rss_topics_in_category: "RSS de subiecte din categoria '%{category}'" + rss_num_posts: + one: "O postare" + few: "%{count} postări" + other: "%{count} de postări" read_full_topic: "Citește întregul subiect" private_message_abbrev: "Msg" rss_description: @@ -304,6 +316,8 @@ ro: meta_category_description: "Discuții despre acest forum, organizare, funcționare și cum îl putem îmbunătăți." staff_category_name: "Echipa" staff_category_description: "Categorie privată pentru discuțiile personalului. Subiectele sunt vizibile numai pentru admini și moderatori." + discourse_welcome_topic: + title: "Bine ai venit la Discourse" lounge_welcome: title: "Bine ai venit în sufragerie" category: @@ -498,6 +512,7 @@ ro: short_description: "Apreciază această postare" user_activity: no_bookmarks: + self: "Nu ai link-uri de postări salvate; link-urile salvate îți permit revenirea la postări specifice" others: "Nu există semne de carte." no_likes_given: self: "Nu ai apreciat nicio postare." @@ -542,6 +557,8 @@ ro: every_hour: "În fiecare oră" daily: "Zilnic" weekly: "Săptămânal" + every_month: "în fiecare lună" + every_six_months: "la fiecare șase luni" user_api_key: title: "Autorizează accesul aplicației" authorize: "Autorizează" @@ -550,6 +567,8 @@ ro: description: '„%{application_name}” cere accesul la contul tău de:' otp_confirmation: confirm_title: Continuă la %{site_name} + logging_in_as: Autentificare ca %{username} + confirm_button: Finalizează autentificarea no_trust_level: "Ne pare rău, nu ai nivelul de încredere necesar pentru a accesa API utilizator" generic_error: "Ne pare rău, nu putem să emitem chei API utilizator: această funcționalitate este probabil dezactivată din administrarea site-ului" scopes: @@ -562,15 +581,18 @@ ro: reports: default: labels: + count: Număr day: Zi post_edits: labels: + edited_at: Dată post: Postare editor: Editor edit_reason: Motiv user_flagging_ratio: labels: user: Utilizatori + score: Scor moderators_activity: labels: moderator: Moderator @@ -614,6 +636,7 @@ ro: title: "Aprecieri" xaxis: "Zi" yaxis: "Număr de aprecieri noi" + description: "Număr de aprecieri noi." flags: title: "Marcaje de avertizare" xaxis: "Zi" @@ -626,6 +649,7 @@ ro: title: "Utilizatori pe nivel de încredre" xaxis: "Nivel de încredere" yaxis: "Număr de utilizatori" + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: xaxis: "Tip" yaxis: "Număr de utilizatori" @@ -814,6 +838,7 @@ ro: show_pinned_excerpt_mobile: "Arată fragmente din subiectele fixate în vizualizarea de mobil." show_pinned_excerpt_desktop: "Arată fragmente din subiectele fixate în vizualizarea de desktop." post_onebox_maxlength: "Lungimea maximă a unei postări afișate în Onebox (în caractere)" + blocked_onebox_domains: "O listă cu domenii care nu vor putea fi utilizate cu onebox." max_oneboxes_per_post: "Numărul maxim de utilizări onebox per post." notification_email: "Adresă expeditor: adresa de email folosită când se trimit toate emailurile esențiale ale sistemului. Domeniul specificat aici trebuie să aibă setate corect SPF, DKIM și reverse PTR pentru ca emailul să poată fi livrat." email_custom_headers: "O listă delimitată cu simbolul | (pipe) a header-elor personalizate de email" @@ -839,6 +864,7 @@ ro: pending_users_reminder_delay: "Notifică moderatorii dacă noii utilizatori sunt în așteptarea aprobării de mai mult de atâtea ore. Setează la -1 pentru a dezactiva notificările." maximum_session_age: "Utilizatorul va rămâne autentificat pentru n ore de la ultima vizită" cors_origins: "Origini permise pentru interogările inter-origini (CORS). Fiecare origine trebuie să includă http:// sau https://. Variabila env DISCOURSE_ENABLE_CORS trebuie setată pe true pentru a activa CORS." + use_admin_ip_allowlist: "Adminii se pot autentifica numai dacă au o adresă IP definită în lista de IP-uri verificate (Admin > Rapoarte > IP-uri verificate) " top_menu: "Determină ce elemente apar în navigare pe pagina principală și în ce ordine. Exemplu: ultimele|noi|necitite|categorii|top|citite|semnedecarte" post_menu: "Determină ce elemente apar în meniul de postare și în ce ordine . Exemplu: apreciere|editează|marchează|șterge|distribuie|semne de carte|răspunde" post_menu_hidden_items: "Elemente de meniu care să fie ascunse implicit în meniul de postări dacă nu se dă click pe partea de extindere a meniului." @@ -857,6 +883,8 @@ ro: email_token_valid_hours: "Tokenul uitat parolă / activează cont sunt valabili pentru (n) ore." enable_badges: "Activează sistemul de ecusoane" enable_whispers: "Permite membrilor echipei să comunice privat în cadrul subiectelor." + blocked_email_domains: "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" + allowed_email_domains: "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." log_out_strict: "La ieșire, închide TOATE sesiunile pentru utilizator, pe toate dispozitivele." new_version_emails: "Trimite un email la adresa contact_email când o nouă versiune de Discourse este disponibilă." invite_expiry_days: "Cât timp sunt valabile cheile de invitație ale utilizatorilor, în zile" @@ -864,6 +892,7 @@ ro: min_password_length: "Lungimea minimă a parolei." min_admin_password_length: "Lungimea maximă a parolei pentru Admin." block_common_passwords: "Nu permite parole ce sunt printre cele 10,000 cele mai cunoscute parole." + discourse_connect_overrides_bio: "Suprascrie biografia utilizatorului în profil utilizator și nu-i permite acestuia să o modifice" 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." google_oauth2_client_id: "ID client al aplicației tale Google." @@ -954,6 +983,7 @@ ro: desktop_category_page_style: "Stil vizual pentru pagina /categories ." category_colors: "O listă hexazecimală de valori de culori permise pentru categorii." category_style: "Stil vizual pentru categoria ecusoane." + dark_mode_none: "Nimeni" max_attachment_size_kb: "Mărimea maximă a unui atașament de fișiere încărcate în Kb. Aceasta trebuie configurata în nginx (client_max_body_size) / apache sau proxy." authorized_extensions: "O listă de extensii de fișiere permise la încărcare (folosiți '*' pentru activarea tuturor tipurilor de fișiere)" max_similar_results: "Câte subiecte similare vor fi afișate deasupra editorului atunci când se compune un subiect nou. Comparația se face după titlu și pe conținut." @@ -974,6 +1004,7 @@ ro: tos_url: "Dacă ai un document Condițiile generale de utilizare găzduit în altă parte pe care dorești să-l folosești, postează-i întregul URL aici." privacy_policy_url: "Dacă ai un document cu Politica de Confidențialitate găzduit în altă parte, pe care dorești să-l folosești, postează-i întregul URL aici." newuser_spam_host_threshold: "De câte ori poate un utilizator nou să posteze un link către aceeași gazdă în limita de `newuser_spam_host_threshold` postări înainte ca să fie considerat spam." + allowed_spam_host_domains: "O listă de domenii excluse de la testarea gazdelor spam. Noii utilizatori nu vor fi niciodată restricționați să creeze postări cu linkuri către aceste domenii." topic_view_duration_hours: "Contorizează încă o vizualizare a unui subiect nou o singură dată per IP/Utilizator la fiecare N ore." user_profile_view_duration_hours: "Contorizează câte vizualizare de profil utilizator o singură dată per IP/Utilizator la fiecare N ore" levenshtein_distance_spammer_emails: "Când se face detectarea spam pe bază de potrivire cu un set de criterii, care este diferența de numere de caractere care încă mai permite o potrivire aproximativă (fuzzy match)." @@ -996,6 +1027,7 @@ ro: max_emails_per_day_per_user: "Numărul maxim de emailuri de trimis utilizatorilor pe zi. 0 pentru a dezactiva limita" enable_staged_users: "Creează în mod automat utilizatori în așteptare pe parcursul procesării emailurilor primite." maximum_staged_users_per_email: "Numărul maxim de utilizatori în așteptare creați la procesarea unui email primit." + auto_generated_allowlist: "Lisă de adrese de email care nu vor fi verificate dacă au conținut autogenerat. Exemplu: foo@bar.com|discourse@bar.com" block_auto_generated_emails: "Blochează emailurile care sunt identificate ca fiind auto-generate." ignore_by_title: "Ignoră emailurile care sosesc, pe baza titlurilor lor." mailgun_api_key: "Cheie API secretă pentru Mailgun folosită la verificarea mesajelor webhook." @@ -1140,6 +1172,11 @@ ro: topic: "Rezultate" user: "Utilizatori" results_page: "Caută rezultate pentru '%{term}'" + discourse_connect: + not_found: "Contul tău nu a putut fi găsit. Te rugăm contactează administratorul site-ului." + account_not_approved: "Contul tău este în așteptarea aprobării. Vei primi un email de notificare imediat ce va fi aprobat." + unknown_error: "Există o problema legată de contul tău. Te rugăm contactează administratorul site-ului." + timeout_expired: "Autentificarea în cont a expirat, te rugăm să încerci din să te autentifici din nou." original_poster: "Creatorul unui subiect" most_posts: "Cele mai multe postări" most_recent_poster: "Cel mai recent autor" @@ -1256,6 +1293,8 @@ ro: subject_template: "Postare ascunsă din cauza marcajelor de avertizare ale comunității" post_hidden_again: subject_template: "Postare ascunsă de flagurile comunității, staff notificat" + queued_by_staff: + title: "Necesită aprobare" welcome_user: subject_template: "Bine ai venit pe %{site_name}!" welcome_tl1_user: @@ -1434,6 +1473,7 @@ ro: %{respond_instructions} user_replied: + subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1453,6 +1493,7 @@ ro: %{respond_instructions} user_quoted: + subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1462,6 +1503,7 @@ ro: %{respond_instructions} user_linked: + subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1471,6 +1513,7 @@ ro: %{respond_instructions} user_mentioned: + subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1490,6 +1533,7 @@ ro: %{respond_instructions} user_group_mentioned: + subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1499,6 +1543,7 @@ ro: %{respond_instructions} user_posted: + subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1508,6 +1553,7 @@ ro: %{respond_instructions} user_watching_first_post: + subject_template: "[%{email_prefix}] %{topic_title}" text_body_template: | %{header_instructions} @@ -1610,6 +1656,7 @@ ro: wcag_theme_name: "WCAG deschis" wcag_dark: "WCAG Închis" wcag_dark_theme_name: "WCAG Închis" + default_theme_name: "Implicit" edit_this_page: "Editează această pagină" csv_export: boolean_yes: "Da" @@ -1922,11 +1969,18 @@ ro: description: "Adresa de email a persoanei sau grupului responsabil de aceasta comunitate. Folosită pentru notificări critice cum ar fi marcaje de avertizare negestionate, actualizări de securitate și afișată pe pagina Despre noi pentru contactarea de urgență a comunității." contact_url: label: "Pagină web" + placeholder: "https://www.example.com/contact-us" description: "Pagina web generică cu date de contact pentru tine sau organizația ta. Se va afișa pe pagina despre noi. " site_contact: label: "Mesaje automate" corporate: title: "Organizație" + colors: + title: "Culori" + fonts: + fields: + font_preview: + label: "Previzualizează" logos: title: "Logo-uri" fields: @@ -1968,11 +2022,19 @@ ro: private_message: '%{username} ți-a trimis un mesaj privat în discuția "%{topic}" - %{site_title}' linked: '%{username} a creat o legătură către postarea ta din discuția "%{topic}" - %{site_title}' reviewables: + priorities: + medium: "Medie" + high: "Ridicată" + sensitivity: + medium: "Medie" + high: "Ridicată" actions: agree_and_keep: title: "Păstrează postarea" agree_and_suspend: title: "Suspendă utilizator" + agree_and_silence: + title: "Suspendă utilizatorul" agree_and_restore: description: "Restabilește postarea pentru astfel încât toți utilizatorii să o poată vedea." agree_and_hide: diff --git a/config/locales/server.sk.yml b/config/locales/server.sk.yml index d0e8cfe242d69..d59a9731ff905 100644 --- a/config/locales/server.sk.yml +++ b/config/locales/server.sk.yml @@ -14,6 +14,7 @@ sk: short: "%Y-%m-%d" short_no_year: "%B %-d" date_only: "%Y, %B %-d" + no_day: "%Y %B" date: month_names: - null @@ -37,6 +38,7 @@ sk: title: "DIscourse" topics: "Témy" posts: "príspevky" + views: "zobrazení" loading: "Načítava sa" powered_by_html: 'Beží na Discourse, najlepšie so zapnutým JavaScriptom' sign_up: "Registrovať sa" @@ -47,6 +49,8 @@ sk: anonymous: "Anonymný" remove_posts_deleted_by_author: "Zmazané autorom" redirect_warning: "Neboli sme schopní overiť, či vami vybraný link bol pridaný na fórum. Ak chcete aj tak pokračovať, vyberte link nižšie." + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} podľa %{username}" themes: other_error: "počas aktualizácie tému sa niečo nepodarilo" import_error: @@ -127,6 +131,9 @@ sk: site_settings: 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'." + invite: + disabled_errors: + invalid_access: "Nemáte oprávnenie na zobrazenie požadovaných údajov!" bulk_invite: file_should_be_csv: "Nahrávaný súbor by mal byť typu CSV." error: "Počas nahrávanie súboru sa vyskytla chyba. Prosím, vyskúšajte ho nahraď znovu neskôr." @@ -159,6 +166,11 @@ sk: permalink: "Trvalý odkaz" imported_from: "Toto je sprievodná diskusia k pôvodnej téme na %{link}" in_reply_to: "▶ %{username}" + replies: + one: "%{count} odpoveď" + few: "%{count} odpovede" + many: "%{count} odpovedí" + other: "%{count} odpovedí" created: "Vytvorené" no_mentions_allowed: "Ľutujeme, nesmiete zmieňovať iných používateľov" too_many_mentions: @@ -197,6 +209,11 @@ sk: topics_in_category: " '%{category}' tém v tejto kategórii" rss_posts_in_topic: "RSS kanál témy '%{topic}'" rss_topics_in_category: "RSS kanál tém v kategórii '%{category}'" + rss_num_posts: + one: "%{count} príspevok" + few: "%{count} príspevky" + many: "%{count} príspevkov" + other: "%{count} príspevkov" read_full_topic: "Čítať celý príspevok" private_message_abbrev: "Správa" rss_description: @@ -615,6 +632,7 @@ sk: title: "Páči sa mi" xaxis: "Deň" yaxis: "Počet nových páči sa mi" + description: "Počet nových páči sa mi." flags: title: "Označenia" xaxis: "Deň" @@ -627,6 +645,7 @@ sk: title: "Používatelia podľa stupňa dôvery" xaxis: "Stupeň dôvery" yaxis: "Počet použivateľov" + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: xaxis: "Typ" yaxis: "Počet použivateľov" @@ -804,6 +823,7 @@ sk: post_undo_action_window_mins: "Počet minút počas ktorých môžu používatelia zrušiť poslednú akciu na príspevku (\"Páči sa\", označenie, atď..)." pending_users_reminder_delay: "Upozorni moderátora ak nový používateľ čaká na schválenie dlhšie ako tento počet hodín. Nastavte -1 pre vypnutie upozornenia." cors_origins: "Povoľ prameňom/origins použitie cross-origin dotazov (CORS). Každý prameň/origin musí obsahovať http:// alebo https://. Aby ste umožnili CORS, systémové premenná DISCOURSE_ENABLE_CORS musí byť nastavená na true." + use_admin_ip_allowlist: "Správcovia sa môťu prihlásiť iba pokiaľ pristupujú z adresy uvedenej v zozname kontrolovaných IP adries (Admin > Logs > Screened Ips)" top_menu: "Určuje, ktoré položky sa zobrazia na navigácií na domovskej stránke a v akom poradí. Napríklad posledné|neprečítané|kategórie|naj|prečítané|záložky" post_menu: "Určuje, ktoré položky sa objavia v menu príspevku a v akom poradí. Napríklad páči sa mi|upraviť|označiť|vymazať|zdieľať|záložka|odpovedať" post_menu_hidden_items: "Položky vo východzích nastaveniach menu schované pri príspevkovom menu, dokiaľ neni kliknuté na rozbaľovaciu elipsu." @@ -820,6 +840,8 @@ sk: top_page_default_timeframe: "Východzí interval pre presmerovanie na hlavnú stránku." email_token_valid_hours: "Platnosť tokenov pre Zabudnuté heslo a aktiváciu účtu v (n) hodinách." enable_badges: "Povoliť systém odznakov" + blocked_email_domains: "Rúrou oddelený zoznam emailových domén, ktorých použitie nie je povolené pri registrácií. Napríklad: mailinator.com|trashmail.net" + allowed_email_domains: "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á!" log_out_strict: "Pri odhlasovaní odhlásiť VŠETKY sessiony používateľa, na všetkých zariadeniach." new_version_emails: "Poslať email na kontaktnú emailovú adresu ak je zistená nová verzia Discourse." invite_expiry_days: "Ako dlho je platná pozvánka pre používateľa, v dňoch" @@ -900,6 +922,7 @@ sk: min_title_similar_length: "Minimálna dĺžka nadpisu na spustenie kontroly na podobné témy." category_colors: "Zoznam hexadecimálnych hodnôt farieb povolených pre kategórie." category_style: "Vizuálny štýl pre odznaky za kategórie." + dark_mode_none: "Žiadny" max_attachment_size_kb: "Mmaximálna veľkosť vloženej prílohy v kB. Rovnako musí byť nastavená v nginx (client_max_body_size) / apache alebo na proxy." authorized_extensions: "Zoznam povolených príloh súborov ktoré je umožnené vkladať (použite '*' na vkladanie súborov všetkých typov)" max_similar_results: "Koľko podobných tém sa má zobraziť nad editorom ak vytvára novú tému. Porovnanie je založené na nadpise a tele správy." @@ -919,6 +942,7 @@ sk: faq_url: "Ak máte FAQ stránku uloženú na iných stránkach, napište sem plný odkaz na ňu." tos_url: "Ak máte stránku s Podmienkami uloženú na iných stránkach, napište sem plný odkaz na ne." privacy_policy_url: "Ak máte stránku s Podmienkami súkromia uloženú na iných stránkach, napište sem plný odkaz na ne." + allowed_spam_host_domains: "Zoznam domén vylúčených z testovania spamových zdrojov. Novým používateľom nebude nikdy zabránené vytvárať príspevky s odkazmi na tieto domény." topic_view_duration_hours: "Započítaj nové pozretie témy raz za IP/používateľa každých N hodín." user_profile_view_duration_hours: "Započítaj nové pozretie používateľského profilu raz za IP/používateľa každých N hodín." levenshtein_distance_spammer_emails: "Počet rozdielnych znakov, ktoré stále umožnia fuzzy zhodu, keď sa hľadájú emaily od spammerov." @@ -1134,6 +1158,8 @@ sk: ignored: "Ďakujeme za upozornenie. Práve to riešime." ignored_and_deleted: "Ďakujeme za upozornenie. Daný príspevok sme odstránili." system_messages: + queued_by_staff: + title: "Príspevok vyžaduje schválenie" welcome_user: subject_template: "Vitajte na %{site_name}!" welcome_invite: @@ -1265,6 +1291,7 @@ sk: sender_body_blank: "telo je prázdne" color_schemes: base_theme_name: "Základ" + default_theme_name: "Predvolené" edit_this_page: "Upraviť túto stránku" csv_export: boolean_yes: "Áno" @@ -1488,8 +1515,16 @@ sk: fields: contact_email: placeholder: "meno@príklad.com" + contact_url: + placeholder: "https://www.example.com/contact-us" corporate: title: "Organizácia" + colors: + title: "Farby" + fonts: + fields: + font_preview: + label: "Ukážka" homepage: fields: homepage_style: diff --git a/config/locales/server.sl.yml b/config/locales/server.sl.yml index c0928d6a3d463..4215abedc4f5a 100644 --- a/config/locales/server.sl.yml +++ b/config/locales/server.sl.yml @@ -39,6 +39,7 @@ sl: title: "Discourse" topics: "Teme" posts: "prispevkov" + views: "ogleda" loading: "Nalagam" powered_by_html: 'Uporablja tehnologijo Discourse, za ogled te strani se priporoča omogočen JavaScript.' sign_up: "Registracija" @@ -135,11 +136,17 @@ sl: few: "%{count} drugi odgovori" other: "%{count} drugih odgovorov" imported_from: "To je spremljevalna tema objave na %{link}" + in_reply_to: "▶ %{username}" replies: one: "%{count} odgovor" two: "%{count} odgovora" few: "%{count} odgovori" other: "%{count} odgovorov" + likes: + one: "%{count} všeček" + two: "%{count} všečka" + few: "%{count} všečke" + other: "%{count} všečkov" last_reply: "Zadnji odgovor" created: "Ustvarjeno" no_mentions_allowed: "Ne morete omenjati drugih uporabnikov." @@ -175,6 +182,11 @@ sl: prev_page: "← prejšnja stran" page_num: "Stran %{num}" home_title: "Domov" + rss_num_posts: + one: "%{count} prispevek" + two: "%{count} prispevka" + few: "%{count} prispevki" + other: "%{count} prispevkov" read_full_topic: "Preberi celo temo" private_message_abbrev: "Msg" rss_description: @@ -184,10 +196,13 @@ sl: excerpt_image: "slika" bookmarks: reminders: + at_desktop: "Naslednjič, ko bom za svojim računalnikom" later_today: "Kasneje v dnevu" + next_business_day: "Naslednji delovni dan" tomorrow: "Jutri" next_week: "Naslednji teden" next_month: "Naslednji mesec" + custom: "Izberi datum in čas" groups: errors: already_requested_membership: "Za članstvo v tej skupini ste že zaprosili." @@ -607,6 +622,7 @@ sl: every_month: "vsak mesec" every_six_months: "vsakih 6 mesecev" user_api_key: + read: "prebrano" otp_description: 'Hočete dovoliti "%{application_name}" da dostopa do te strani?' otp_confirmation: confirm_title: Nadaljujte na %{site_name} @@ -695,6 +711,10 @@ sl: title: "Anonimni" page_view_total_reqs: title: "Ogledov strani" + http_total_reqs: + title: "Skupaj" + topics_with_no_response: + yaxis: "Skupaj" web_crawlers: labels: page_views: "Ogledov strani" @@ -713,6 +733,7 @@ sl: s3_cdn_warning: 'Strežnik je konfiguriran za nalaganje datotek v S3, vendar hkrati ni konfiguriran tudi S3 CDN. To lahko privede do visokih stroškov uporabe S3 in počasnejšega delovanja strani. Če želite izvedeti več, glejte "Using Object Storage for Uploads".' out_of_date_themes: "Posodobitve so na voljo za naslednje prilagoditve:" site_settings: + send_welcome_message: "Pošlji sporočilo z dobrodošlico in kratkimi uvodnimi navodili vsem novim uporabnikom." auth_skip_create_confirm: Pri prijavi s pomočjo zunanjega overjanja preskočite pojavno okno za ustvarjanje računa. Priporočena uporaba skupaj z auth_overrides_email, auth_overrides_username in auth_overrides_name. auth_immediately: "Samodejno preusmeri na zunanji sistem za prijavo brez interakcije uporabnika. To začne veljati šele, ko je login_required vklopljen in ko obstaja samo en način zunanje overitve" enable_discourse_connect: "Omogoči vpis s pomočjo DiscourseConnect (prej »Discourse SSO«) (OPOZORILO: E-POŠTNI NASLOVI UPORABNIKOV *MORAJO* BITI OVERJENI PRI ZUNANJEM PONUDNIKU!)" @@ -720,7 +741,9 @@ sl: use_site_small_logo_as_system_avatar: "Uporabi mali logotip spletnega mesta za avatar sistemskega uporabnika. Deluje le, če je logotip na voljo." min_trust_level_to_allow_ignore: "Najmanjša raven zaupanja, potrebna za prezrtje uporabnikov" enable_filtered_replies_view: 'Gumb "(n) odgovorov" strne vse druge objave in prikaže samo trenutno objavo in njene odgovore.' + dark_mode_none: "Brez" skip_auto_delete_reply_likes: "Pri samodejnem brisanju starih odgovorov preskočite brisanje objav s tem ali večjim številom všečkov." + default_other_skip_new_user_tips: "Preskoči namige in značke za nove uporabnike." shared_drafts_min_trust_level: "Uporabnikom omogočite ogled in urejanje osnutkov v skupni rabi." search: within_post: "#%{post_number} od %{username}" @@ -836,6 +859,12 @@ sl: other: "Ta tema se je samodejno odprla %{count} minut po zadnjem odgovoru." auto_deleted_by_timer: "Samodejno izbrisana s strani opomnika." login: + security_key_description: "Ko imate pripravljen fizični varnostni ključ, pritisnite spodnji gumb Preveri pristnost z varnostnim ključem." + security_key_alternative: "Poskusite na drug način" + security_key_authenticate: "Preverite z varnostnim ključem" + security_key_not_allowed_error: "Postopek preverjanja z varnostnim ključem je potekel ali pa je bil preklican." + security_key_no_matching_credential_error: "V podanem varnostnem ključu ni bilo mogoče najti ustreznih poverilnic." + security_key_support_missing_error: "Vaša trenutna naprava ali brskalnik ne podpira uporabe varnostnih ključev. Uporabite drug način." not_approved: "Vaš račun še ni bil potrjen. Obveščeni boste preko e-sporočila ko bo račun pripravljen za prijavo." incorrect_username_email_or_password: "Napačno uporabniško ime, e-naslov ali geslo" incorrect_password: "Napačno geslo" @@ -859,12 +888,15 @@ sl: missing_user_field: "Niste vnesli vseh uporabniških podatkov." auth_complete: "Avtentikacija je končana." click_to_continue: "Kliknite tukaj za nadaljevanje." + second_factor_title: "Preverjanje v dveh korakih" second_factor_description: "Vnesite potrditveno kodo iz vaše aplikacije:" second_factor_backup_description: "Vnesite eno od vaših rezervnih potrditvenih kod:" invalid_second_factor_code: "Neustrezna potrditvena koda. Vsaka potrditvena koda je lahko uporabljena samo enkrat." second_factor_toggle: backup_code: "Namesto tega uporabite rezervno potrditveno kodo" admin: + email: + sent_test: "poslano!" user: merge_user: updating_username: "Posodabljanje uporabniškega imena ..." @@ -990,6 +1022,8 @@ sl: post_hidden_again: title: "Prispevek ponovno skrit" subject_template: "Prispevek je bil ponovno skrit zaradi prijav iz skupnosti zato smo obvestili osebje" + queued_by_staff: + title: "Prispevek za odobritev." flags_agreed_and_post_deleted: title: "Prijavljen prispevek odstranjen s strani osebja" subject_template: "Prijavljen prispevek odstranjen s strani osebja" @@ -1030,6 +1064,8 @@ sl: Lepo se imejte v naši družbi! [prefs]: %{user_preferences_url} + tl2_promotion_message: + subject_template: "Čestitamo vam za napredovanje na višjo raven zaupanja!" backup_succeeded: title: "Varnostna kopija uspela" subject_template: "Varnostna kopija uspela" @@ -1618,6 +1654,9 @@ sl: confirm_new_email: title: "Potrdite nov e-naslov" subject_template: "[%{email_prefix}] Potrdite vaš novi e-naslov" + confirm_new_email_via_admin: + title: "Potrdite nov e-naslov" + subject_template: "[%{email_prefix}] Potrdite vaš novi e-naslov" confirm_old_email: title: "Potrdite star e-naslov" subject_template: "[%{email_prefix}] Potrdite vaš trenutni e-naslov" @@ -1694,6 +1733,8 @@ sl: Če ste bili to vi, ni problema! Ne potrebujete storiti ničesar. Če to niste bili vi, potem [preverite nedavno uporabljene naprave](%{base_url}/my/preferences/account) in razmislite o zamenjavi gesla. + post_approved: + title: "Vaš prispevek je bil odobren" page_not_found: title: "Oops! Ta stran ne obstaja ali je zasebna." popular_topics: "Zanimivo" @@ -1708,12 +1749,15 @@ sl: welcome_message_invite_only: | ## [Dobrodošli na %{title}](#welcome) Za dostop potrebujete uporabniški račun. Prosite obstoječega uporabnika, da vas povabi ali pa se prijavite za nadaljevanje. + deleted: "izbrisano" image: "slika" upload: edit_reason: "prenos slik v lokalno kopijo" unauthorized: "Oprostite, datoteka ki ste jo hoteli naložiti ni podprta (podprte pripone:%{authorized_extensions})." flag_reason: sockpuppet: "Nov uporabnik je ustvaril temo in drugi novi uporabnik z enakim IP naslovom (%{ip_address}) je odgovoril. Preverite `flag_sockpuppets` nastavitev strani." + color_schemes: + default_theme_name: "Privzeto" edit_this_page: "Uredi to stran" csv_export: boolean_yes: "Da" @@ -1975,6 +2019,8 @@ sl: few: '"%{tag_name}" oznaka je omejena samo za naslednje kategorije: %{category_names}' other: '"%{tag_name}" oznaka je omejena samo za naslednje kategorije: %{category_names}' finish_installation: + register: + button: "Registracija" confirm_email: title: "Potrdite e-naslov" resend_email: @@ -2016,6 +2062,12 @@ sl: placeholder: "name@example.com" corporate: title: "Organizacija" + colors: + title: "Barve" + fonts: + fields: + font_preview: + label: "Predogled" homepage: fields: homepage_style: @@ -2049,6 +2101,8 @@ sl: unknown: "neznano" user_merged: "%{username} je bil združen v ta račun" user_delete_self: "Izbrisan s strani sebe preko %{url}" + api_key: + revoked: Preklican reviewables: priorities: low: "Nizka" @@ -2066,6 +2120,7 @@ sl: trust_level: "Uporabniki na nizkih nivojih zaupanja rabijo odobritev prispevka s strani osebja.Glej `approve_unless_trust_level`." new_topics_unless_trust_level: "Uporabniki na nizkih nivojih zaupanja potrebujejo odobritev teme s strani osebja. Glej `approve_new_topics_unless_trust_level`." fast_typer: "Nov uporabnik je svoj prvi prispevek natipkal sumljivo hitro zato sumimo bota ali spammerja. Glej `min_first_post_typing_time`." + auto_silence_regexp: "Nov uporabnik katerega prvi prispevek ustreza `auto_silence_first_post_regex` nastavitvi." staged: "Nove teme in prispevki prirejenih uporabnikov morajo biti odobreni s strani osebja. Glej `approve_unless_staged`." category: "Prispevki v tej kategoriji zahtevajo odobritev s strani osebja. Glej nastavitve kategorije." must_approve_users: "Vsi novi uporabniki morajo biti odobreni s strani osebja. Glej `must_approve_users`." diff --git a/config/locales/server.sq.yml b/config/locales/server.sq.yml index d8df3d33712d1..9b6ba7d7c8fbe 100644 --- a/config/locales/server.sq.yml +++ b/config/locales/server.sq.yml @@ -15,6 +15,7 @@ sq: short_no_year: "%B %-d" date_only: "%B %-d, %Y" long: "%B %-d, %Y, %l:%M%P" + no_day: "%Y %B" date: month_names: - null @@ -38,6 +39,7 @@ sq: title: "Discourse" topics: "Tema" posts: "postime" + views: "shikime" loading: "Loading" sign_up: "Regjistrohu" log_in: "Identifikohu" @@ -45,6 +47,8 @@ sq: disable_remote_images_download_reason: "Remote images download was disabled because there wasn't enough disk space available." anonymous: "Anonim" remove_posts_deleted_by_author: "Fshirë nga autori" + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} nga %{username}" emails: incoming: default_subject: "Duhet të shkruani titullin" @@ -93,6 +97,8 @@ sq: default_categories_already_selected: "Nuk mund të zgjidhni një kategori të përdorur në një tjetër listë." invite: user_exists: "Nuk keni nevojë të ftoni %{email}, ata kanë krijuar një llogari në faqe!" + disabled_errors: + invalid_access: "Ju nuk jeni të drejta për të parë burimin e kërkuar." 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." @@ -115,6 +121,9 @@ sq: permalink: "Permalink" imported_from: "This is a companion discussion topic for the original entry at %{link}" in_reply_to: "▶ %{username}" + replies: + one: "%{count} përgjigje" + other: "%{count} përgjigje" created: "Krijuar" no_mentions_allowed: "Na vjen keq, por s'mund të citosh anëtarë të tjerë." no_mentions_allowed_newuser: "Na vjen keq, anëtarët e rinj nuk mund të citojnë anëtarë të tjerë." @@ -135,6 +144,9 @@ sq: topics_in_category: "Topics in the '%{category}' category" rss_posts_in_topic: "Burimi RSS i '%{topic}'" rss_topics_in_category: "RSS feed of topics in the '%{category}' category" + rss_num_posts: + one: "%{count} postim" + other: "%{count} postime" read_full_topic: "Lexo temën e plotë" private_message_abbrev: "Msg" rss_description: @@ -448,6 +460,7 @@ sq: title: "Pëlqime" xaxis: "Ditë" yaxis: "Numri i pëlqimeve të reja" + description: "Numri i pëlqimeve të reja." flags: title: "Sinjalizime" xaxis: "Ditë" @@ -651,6 +664,8 @@ sq: redirect_users_to_top_page: "Automatically redirect new and long absent users to the top page." email_token_valid_hours: "Forgot password / activate account tokens are valid for (n) hours." enable_badges: "Aktivizo sistemin e targetave" + blocked_email_domains: "A pipe-delimited list of email domains that users are not allowed to register accounts with. Example: mailinator.com|trashmail.net" + allowed_email_domains: "A pipe-delimited list of email domains that users MUST register accounts with. WARNING: Users with email domains other than those listed will not be allowed!" log_out_strict: "When logging out, log out ALL sessions for the user on all devices" new_version_emails: "Send an email to the contact_email address when a new version of Discourse is available." invite_expiry_days: "How long user invitation keys are valid, in days" @@ -719,6 +734,7 @@ sq: min_title_similar_length: "The minimum length of a title before it will be checked for similar topics." category_colors: "A list of hexadecimal color values allowed for categories." category_style: "Visual style for category badges." + dark_mode_none: "Asnjë" max_attachment_size_kb: "The maximum attachment files upload size in kB. This must be configured in nginx (client_max_body_size) / apache or proxy as well." authorized_extensions: "A list of file extensions allowed for upload (use '*' to enable all file types)" max_similar_results: "How many similar topics to show above the editor when composing a new topic. Comparison is based on title and body." @@ -738,6 +754,7 @@ sq: faq_url: "If you have a FAQ hosted elsewhere that you want to use, provide the full URL here." tos_url: "If you have a Terms of Service document hosted elsewhere that you want to use, provide the full URL here." privacy_policy_url: "If you have a Privacy Policy document hosted elsewhere that you want to use, provide the full URL here." + allowed_spam_host_domains: "A list of domains excluded from spam host testing. New users will never be restricted from creating posts with links to these domains." levenshtein_distance_spammer_emails: "When matching spammer emails, number of characters difference that will still allow a fuzzy match." max_new_accounts_per_registration_ip: "If there are already (n) trust level 0 accounts from this IP (and none is a staff member or at TL2 or higher), stop accepting new signups from that IP." min_ban_entries_for_roll_up: "When clicking the Roll up button, will create a new subnet ban entry if there are at least (N) entries." @@ -906,6 +923,8 @@ sq: system_messages: post_hidden: subject_template: "Postimi u fsheh ngaqë u sinjalizua nga komuniteti" + queued_by_staff: + title: "Postimi ka nevojë për aprovim" welcome_user: subject_template: "Mirë se vini tek %{site_name}!" text_body_template: | @@ -1118,6 +1137,8 @@ sq: title: "Vendos Fjalëkalim" confirm_new_email: subject_template: "[%{email_prefix}] Konfirmoni adresën tuaj të re të emailit" + confirm_new_email_via_admin: + subject_template: "[%{email_prefix}] Konfirmoni adresën tuaj të re të emailit" confirm_old_email: subject_template: "[%{email_prefix}] Konfirmoni adresën e tanishme të emailit " confirm_old_email_add: @@ -1177,6 +1198,7 @@ sq: sender_body_blank: "përmbajtja është bosh" color_schemes: base_theme_name: "Baza" + default_theme_name: "Paracaktuar" edit_this_page: "Modifiko këtë faqe" csv_export: boolean_yes: "Po" @@ -1361,6 +1383,12 @@ sq: placeholder: "emri@adresa.com" corporate: title: "Organizata" + colors: + title: "Ngjyrat" + fonts: + fields: + font_preview: + label: "Parashikimi" homepage: fields: homepage_style: diff --git a/config/locales/server.sr.yml b/config/locales/server.sr.yml index eb25da0448e1a..c1e5d971a527e 100644 --- a/config/locales/server.sr.yml +++ b/config/locales/server.sr.yml @@ -14,6 +14,7 @@ sr: short: "%m-%d-%Y" short_no_year: "%B %-d" date_only: "%B %-d, %Y" + no_day: "%Y %B" date: month_names: - null @@ -33,12 +34,16 @@ sr: title: "Discourse" topics: "Teme" posts: "poruke" + views: "pregledi" loading: "Učitavanje" sign_up: "Registrujte se" log_in: "Prijava" + submit: "Potvrdi" disable_remote_images_download_reason: "Daljinske slike za download je onemogućeno zato što nije bilo dovoljno slobodnog prostora na disku." anonymous: "Anonimno" remove_posts_deleted_by_author: "Izbrisano od strane autora" + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} od %{username}" emails: incoming: default_subject: "Ovoj temi je potreban naslov" @@ -78,6 +83,7 @@ sr: embed: start_discussion: "Započnite diskusiju" continue: "Nastavite diskusiju" + in_reply_to: "▶ %{username}" created: "Napravljeno" no_links_allowed: "Žao nam je, novi korisnici ne mogu postavljati linkove u svoje postove." user_is_suspended: "Suspendovanim korisnicima nije dozvoljeno da objavljuju postove." @@ -90,6 +96,10 @@ sr: page_num: "Strana %{num}" home_title: "Home" topics_in_category: "Teme u '%{category}' kategoriji" + rss_num_posts: + one: "%{count} poruka" + few: "%{count} poruka" + other: "%{count} poruka" read_full_topic: "Pročitajte celu temu" rss_description: latest: "Poslednje teme" @@ -99,12 +109,25 @@ sr: tag: "Označene teme" revert_version_same: "Trenutna verzija je ista onoj na koju pokušavate da se vratite." excerpt_image: "slika" + bookmarks: + reminders: + later_today: "Kasnije ovog dana" + next_business_day: "Naredni radni dan" + tomorrow: "Sutra" + next_week: "Sledeće sedmice" + next_month: "Naredni mesec" + custom: "Prilagođen datum i vreme" groups: default_names: everyone: "svi" admins: "admini" moderators: "moderatori" staff: "osoblje" + education: + until_posts: + one: "%{count} poruka" + few: "%{count} poruka" + other: "%{count} poruka" activerecord: attributes: category: @@ -123,12 +146,80 @@ sr: same_as_username: "je ista kao vaše korisničko ime. Molimo Vas izaberite sigurniju šifru." <<: *errors staff_category_name: "Osoblje" + trust_levels: + member: + title: "član" + regular: + title: "stalni član" + leader: + title: "vođa" + rate_limiter: + hours: + one: "%{count} sat" + few: "%{count} sata" + other: "%{count} sati" datetime: distance_in_words: half_a_minute: "< 1m" + less_than_x_seconds: + one: "< %{count} s" + few: "< %{count} s" + other: "< %{count} s" + x_seconds: + one: "%{count} sek." + few: "%{count} sek." + other: "%{count} sek." + less_than_x_minutes: + one: "< %{count}m" + few: "< %{count}m" + other: "< %{count}m" + x_minutes: + one: "%{count} min" + few: "%{count} min" + other: "%{count} min" + about_x_hours: + one: "%{count} sat" + few: "%{count} sat" + other: "%{count} sat" + x_days: + one: "%{count} dan" + few: "%{count} dan" + other: "%{count} dan" + about_x_months: + one: "%{count}mes" + few: "%{count}mes" + other: "%{count}mes" + x_months: + one: "%{count}mes" + few: "%{count}mes" + other: "%{count}mes" + about_x_years: + one: "%{count} godina" + few: "%{count} godina" + other: "%{count} godina" + over_x_years: + one: "> %{count} godina" + few: "> %{count} godina" + other: "> %{count} godina" + almost_x_years: + one: "%{count} godina" + few: "%{count} godina" + other: "%{count} godina" distance_in_words_verbose: half_a_minute: "upravo sad" less_than_x_seconds: "upravo sad" + about_x_hours: + one: "pre %{count} sat" + few: "pre %{count} sata" + other: "pre %{count} sati" + x_days: + one: "pre %{count} dan" + few: "pre %{count} dana" + other: "pre %{count} dana" + x_months: + one: "pre %{count} mesec dana" + few: "pre %{count} mesec dana" + other: "pre %{count} mesec dana" password_reset: save: "Postavi Šifru" title: "Resetujte Šifru" @@ -144,6 +235,9 @@ sr: title: "Nepoželjno" bookmark: title: "Markiraj" + user_activity: + no_bookmarks: + self: "Nemate obeleženih poruka; obeleživači vam omogućavaju da se brzo uputite ka određenoj poruci." topic_flag_types: spam: title: "Nepoželjno" @@ -157,7 +251,14 @@ sr: every_30_minutes: "svakih 30 minuta" daily: "svakodnevno" weekly: "nedeljno" + every_month: "svaki mesec" + every_six_months: "svakih šest meseci" + user_api_key: + read: "pročitano" reports: + default: + labels: + count: Broj post_edits: labels: editor: Urednik @@ -168,6 +269,9 @@ sr: moderators_activity: labels: moderator: Moderator + flags_status: + labels: + flag: Tip consolidated_page_views: labels: editor: Urednik @@ -185,6 +289,9 @@ sr: users_by_trust_level: xaxis: "Nivo poverenja" users_by_type: + xaxis: "Tip" + labels: + type: Tip xaxis_labels: admin: Admin moderator: Moderator @@ -209,6 +316,10 @@ sr: topic: "Tema" page_view_anon_reqs: title: "Anonimno" + http_total_reqs: + title: "Ukupno" + topics_with_no_response: + yaxis: "Ukupno" suspicious_logins: labels: user: Korisnik @@ -228,6 +339,8 @@ sr: max_replies_in_first_day: "Maksimalan broj odgovora koje korisnik može da kreira u prvih 24 sata nakon kreiranja svoje prve poruke." pending_users_reminder_delay: "Obavesti moderatore ako novi korisnik čeka na odobrenje duže nego ovoliko časova. Podesiti na -1 da bi se onemogućile notifikacije." maximum_session_age: "Korisnik će ostati ulogovan n časova od prethodnog logovanja" + send_welcome_message: "Pošalji svim novim korisnicima poruku dobrodošlice sa kratkim uputstvom za početnike." + dark_mode_none: "Ništa" topic_views_heat_low: "Nakon ovoliko pregleda, polje pregleda je blago označeno." topic_views_heat_medium: "Nakon ovoliko pregleda, polje pregleda je umereno označeno." topic_views_heat_high: "Nakon ovoliko pregleda, polje pregleda je jako označeno." @@ -274,6 +387,7 @@ sr: within_post: "#%{post_number} od %{username}" types: category: "Kategorije" + topic: "Rezultati" user: "Korisnici" publish_page: slug_errors: @@ -281,10 +395,13 @@ sr: login: admin_not_allowed_from_ip_address: "Ne možete se prijaviti kao admin sa te IP adrese." not_available: "Nije dostupno. Pokušajte %{suggestion}?" + omniauth_confirm_button: "Nastavi" admin: email: sent_test: "poslato!" system_messages: + queued_by_staff: + title: "Potrebno odobrenje" welcome_user: subject_template: "Dobrodošao na %{site_name}!" welcome_invite: @@ -299,7 +416,10 @@ sr: title: "Postavi Šifru" page_not_found: see_more: "Više" + search_button: "Pretraži" image: "slika" + color_schemes: + default_theme_name: "zadato" csv_export: boolean_yes: "Da" boolean_no: "Ne" @@ -387,10 +507,18 @@ sr: placeholder: "ime@primer.com" corporate: title: "Organizacija" + colors: + title: "Boje" finished: title: "Vaš Discource je spreman!" joined: "Pridružen" reviewables: + priorities: + medium: "Srednje" + high: "Visoko" + sensitivity: + medium: "Srednje" + high: "Visoko" actions: agree_and_suspend: title: "Suspenduj Korisnika" diff --git a/config/locales/server.sw.yml b/config/locales/server.sw.yml index 21b6e8fbb2dc0..af3c6408ac80a 100644 --- a/config/locales/server.sw.yml +++ b/config/locales/server.sw.yml @@ -15,6 +15,7 @@ sw: short_no_year: "%B %-d" date_only: "%B %-d, %Y" long: "%B %-d, %Y, %l:%M%P" + no_day: "%Y %B" date: month_names: - null @@ -38,6 +39,7 @@ sw: title: "Discourse" topics: "Mada" posts: "machapisho" + views: "Imeonwa" loading: "Inapakuliwa" powered_by_html: 'Imetengenezwa na Discourse, inaonekana vizuri ukiruhusu JavaScript' sign_up: "Jiunge" @@ -48,6 +50,8 @@ sw: anonymous: "Mtumiaji Asiyejulikana" remove_posts_deleted_by_author: "Imefutwa na Mwandishi" redirect_warning: "Tumeshindwa kuthibitisha kua kiungo ulichokichagua kipo kwenye hii jamii. Kama ungependa kuendelea, chagua kiungo hapo chini." + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} za %{username}" themes: other_error: "Tatizo limetokea kwenye kusasisha mandhari" import_error: @@ -128,6 +132,8 @@ sw: conflicting_google_user_id: 'Utambulisho wa Akaunti ya Google imebadilishwa; msaidizi ataipitia kwa ajili ya sababu za ulinzi. Tafadhali wasiliana na msaidizi na waonyeshe
https://meta.discourse.org/t/76575' invite: user_exists: "Hakuna haja ya kumualika %{email}, tayaru wana miliki akaunti!" + disabled_errors: + invalid_access: "Hauna ruhusa kuona rasilimali uliyoomba kuona." bulk_invite: file_should_be_csv: "Faili unalopakia inabidi liwe na csv umbizo " error: "Tatizo limetokea wakati wa kupakia faili. Tafadhali jaribu tena." @@ -152,6 +158,9 @@ sw: loading: "Inapakua Majadiliano..." permalink: "Kiungo cha mtandao cha Mda Mrefu" in_reply_to: "▶ %{username}" + replies: + one: "%{count} jibu" + other: "%{count} majibu" created: "Imetengenezwa" no_mentions_allowed: "Samahani, hauwezi kutaja watumiaji wengine." no_mentions_allowed_newuser: "Samahani, watumiaji wapya hawawezi kutaja watumiaji wengine." @@ -174,6 +183,9 @@ sw: topics_in_category: "Mada ndani ya kategoria '%{category}'" rss_posts_in_topic: "Mlisho wavuti wa '%{topic}'" rss_topics_in_category: "Mlisho wavuti wa mada za kategoria '%{category}'" + rss_num_posts: + one: "%{count} chapisho" + other: "%{count} machapisho" read_full_topic: "Soma mada yote" private_message_abbrev: "Msg" rss_description: @@ -224,6 +236,9 @@ sw: request_membership_pm: title: "Ombi la Uanachama wa @%{group_name}" education: + until_posts: + one: "%{count} chapisho" + other: "%{count} machapisho" avatar: |2 ### Unaonaje ukiongeza picha kwenye akaunti yako? @@ -361,12 +376,51 @@ sw: by_type: live_post_counts: "Unaomba idadi ya chapisho zilizo hewani kwa haraka sana. Tafadhali subiri %{time_left} kabla ya kujaribu tena." unsubscribe_via_email: "Umefika kiwango cha juu cha kujitoa kupitia barua pepe. Tafadhali subiri %{time_left} kabla ya kujaribu tena." + hours: + one: "saa %{count}" + other: "masaa %{count}" datetime: distance_in_words: half_a_minute: "< 1d" + less_than_x_seconds: + one: "< %{count}s" + other: "< %{count}s" + x_seconds: + one: "%{count}s" + other: "%{count}s" + x_minutes: + one: "%{count}m" + other: "%{count}m" + about_x_hours: + one: "%{count}h" + other: "%{count}h" + x_days: + one: "%{count}d" + other: "%{count}d" + about_x_months: + one: "%{count} miezi" + other: "%{count} miezi" + x_months: + one: "%{count} miezi" + other: "%{count} miezi" + about_x_years: + one: "%{count}y" + other: "%{count}y" + over_x_years: + one: "> %{count}y" + other: "> %{count}y" + almost_x_years: + one: "%{count}y" + other: "%{count}y" distance_in_words_verbose: half_a_minute: "sasa hivi" less_than_x_seconds: "sasa hivi" + about_x_hours: + one: "saa %{count} iliyopita" + other: "masaa%{count} yaliyopita" + x_days: + one: "siku %{count} iliyopita" + other: "siku %{count} zilizopita" password_reset: no_token: "Samahani, kiungo hicho cha kuingia kupitia barua pepe ni cha mda sana. Bonyeza kitufe cha Kuingia na tumia 'Nimesahau nywila' ili upate kiungo kipya." choose_new: "Chagua nywila" @@ -562,6 +616,7 @@ sw: title: "Upendo" xaxis: "Siku" yaxis: "Idadi ya upendo mpya" + description: "Idadi ya upendo mpya." flags: title: "Bendera" xaxis: "Siku" @@ -574,6 +629,7 @@ sw: title: "Watumiaji kwenye Kila Kiwango cha Uaminifu" xaxis: "Kiwango cha Uaminifu" yaxis: "Idadi ya Watumiaji" + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: title: "Watumiaji wa kila aina" xaxis: "Aina" @@ -746,6 +802,8 @@ sw: max_image_width: "Kiwango cha juu cha upana wa kijipicha za picha kwenye chapisho" max_image_height: "Kiwango cha juu cha urefu wa kijipicha za picha kwenye chapisho" add_rel_nofollow_to_user_content: 'Ongeza rel nofollow kwenye maandishi yote mtumiaji aliyotoa, isipokuwa viungo vya ndani (pamoja na kikoa baba). Ukibadilisha hii, lazima urebake machapisho yote na: "rake machapishi:rebake"' + blocked_onebox_domains: "Orodha ya anwani za mitandao ambazo hazijawekwa kwenye boxi." + allowed_inline_onebox_domains: "Orodha za anwani za mtandao ambazo zitawekwa kwenye boxi kama zikiunganishwa bila kichwa cha habari" summary_score_threshold: "Alama ya chini ambayo mada inahitaji kabla ya kuwekwa ndani ya 'Fupisha Hii Mada' " summary_percent_filter: "Mtumiaji akibonyeza 'Fupisha Hii Mada', onyesha % machapisho ya juu" enable_personal_messages: "Ruhusu watumiaji wenye kiwango cha 1 cha uaminifu (inasanidiwa kwa kupitia kiwango cha chini cha uaminifu kutuma ujumbe) kutuma ujumbe wa barua pepe. Wasaidizi wataweza kutuma ujumbe mda kila wakati." @@ -839,6 +897,7 @@ sw: personal_email_time_window_seconds: "Subiria sekunde (n) kabla ya kutuma ujumbe binafsi barua pepe za taarifa, kuwapa watumiaji nafasi kuhariri na kumalizia ujumbe wao." title_max_word_length: "Kiwango cha juu cha urefu wa neno, kwenye herufi, kwenye kichwa cha mada inachoruhusiwa." allow_uppercase_posts: "Ruhusu herufi kubwa kwenye kichwa cha mada au mwili wa chapisho." + dark_mode_none: "Hakuna" topic_views_heat_low: "Baada ya kuangaliwa na namba fulani ya watu, namba ya watu walioiangalia itaangaza kwa kiasi kidogo." topic_views_heat_medium: "Baada ya kuangaliwa na namba fulani ya watu, namba ya watu walioiangalia itaangaza kwa wastani." topic_views_heat_high: "Baada ya kuangaliwa na namba fulani ya watu, namba ya watu walioiangalia itaangaza kwa kiasi kikubwa." @@ -846,11 +905,13 @@ sw: cold_age_days_medium: "Baada ya siku nyingi za majadiliano, tarehe ya mwisho ya shughuli itaangaza kiasi." cold_age_days_high: "Baada ya siku hizi nyingi za majadiliano, tarehe ya mwisho ya shughuli itaangaza kiasi." newuser_spam_host_threshold: "Mara ngapi mtumiaji mpya anaweza kuchapisha kiungo kwenye komputa mwenyeji ndani ya machapisho ya `newuser_spam_host_threshold` kabla ya taarifa kuitwa barua taka." + allowed_spam_host_domains: "Orodha ya vikoa vilivyotengwa kutoka kwenye majaribio ya komputa mwenyeji ya barua taka. Watumiaji wapya hawatazuiliwa kutengeneza machapisho yenye viungo kwenda kwenye vikoa hivi." topic_view_duration_hours: "Hesabu utembezi wa mada mpya mara moja kuendana na anwani ya mtandao/Mtumiaji kila baada ya masaa N" user_profile_view_duration_hours: "Hesabu utembezi wa mada mpya mara moja kuendana na anwani ya mtandao/Mtumiaji kila baada ya masaa N" max_new_accounts_per_registration_ip: "Kama kuna akaunti 0 zenye kiwango (n) cha uaminifu kutoka kwenye anwani hii ya mtandao (na hakuna hata mmoja ambaye ni msaidizi or kwenye kiwango cha 2 cha uaminifu au zaidi), kataa usajili kutoka kwenye anwani hiyo." num_hours_to_close_topic: "Mda wa masaa kusitisha mada ili kuingilia." auto_silence_fast_typers_max_trust_level: "Kiwango cha juu cha uaminifu kunyamazisha wanaochapa haraka sana otomatikali" + auto_silence_first_post_regex: "Taarifa zilizo ndani ya mabano hazitapewa kipaumbele kama herufi ni kubwa au ndogo, kama zikipitishwa zitasababisha chapisho la kwanza linyamazishwe na lisubirishwe. Mfano raging|a[bc]a , itasababisha machapisho yote yenye raging au aba au aca yamazishwe mara ya kwanza. Kanuni hii inatokea kwenye chapisho la kwanza tu." reply_by_email_enabled: "Ruhusu majibu ya mada kupitia barua pepe." delete_all_posts_max: "Kiwango cha juu cha machapisho yanayoweza kufutwa mara moja na kitufe cha Futa Machapisho Yote. Kama mtumiaji ana namba fulani ya machapisho, machapisho hayawezi kufutwa mara moja na mtumiaji hawezi kufutwa. " digest_topics: "Kiwango cha juu cha mada maarufu kuonyeshwa kwenye muhtasari wa barua pepe." @@ -925,6 +986,14 @@ sw: topic: "Majibu" user: "Watumiaji" results_page: "Majibu ya utafiti ya '%{term}'" + discourse_connect: + login_error: "Hitilafu Wakati wa Kuingia." + not_found: "Akaunti yako haijapatikana. Tafadhali wasiliana na msimamizi wa tovuti." + account_not_approved: "Akaunti yako inasubiria kuthibitishwa. Utapata taarifa kwa barua pepe ukithibitishwa." + unknown_error: "Kuna tatizo na akaunti yako. Tafadhali wasiliana na msimamizi wa tovuti." + timeout_expired: "Mda wa kuwa ndani ya akaunti yako umeisha, tafadhali jaribu kuingia tena." + no_email: "Hakuna barua pepe iliyoandikwa. Tafadhali wasiliana na msimamizi wa tovuti." + email_error: "Akaunti haijaweza kusajiliwa na barua pepe%{email}Tafadhali wasiliana na msimamizi wa tovuti." original_poster: "Muandishi wa Kwanza" most_posts: "Machapisho Mengi" most_recent_poster: "Mwandishi wa hivi karibuni" @@ -1117,6 +1186,8 @@ sw: post_hidden_again: title: "Chapisho Limefichwa tena" subject_template: "Chapisho limefichwa sababu ya ripoti nyingi za jumuiya, msaidizi amejulishwa" + queued_by_staff: + title: "Chapisho Linahitaji Kibali" welcome_user: title: "Karibu Mtumiaji" subject_template: "Karibu kwenye %{site_name}!" @@ -1628,6 +1699,9 @@ sw: confirm_new_email: title: "Thibitisha Barua Pepe Mpya" subject_template: "[%{email_prefix}] Thibitisha barua pepe mpya" + confirm_new_email_via_admin: + title: "Thibitisha Barua Pepe Mpya" + subject_template: "[%{email_prefix}] Thibitisha barua pepe mpya" confirm_old_email: title: "Thibitisha Barua pepe ya Zamani" subject_template: "[%{email_prefix}] Thibitisha barua pepe ya sasa" @@ -1729,6 +1803,7 @@ sw: color_schemes: light: "Hafifu" dark: "Nyeusi" + default_theme_name: "Halisi" light_theme_name: "Hafifu" dark_theme_name: "Nyeusi" edit_this_page: "Hariri ukurasa huu" @@ -2068,12 +2143,19 @@ sw: description: "Barua pepe ya mtu au kikundi anayesimamia jumuiya hii. Inatumika kwa ajili ya taarifa muhimu sana, mfano ripoti ambazo hazijashughulikiwa, masasisho ya ulinzi, na ukurasa kuhusu wewe kwa ajili ya mawasiliano muhimu /kuhusiana" contact_url: label: "Ukurasa wa Tovuti" + placeholder: "https://www.example.com/contact-us" description: "Ukurasa wa mawasiliano wa shirika lako. Utaonyeshwa kwenye kurasa wa kuhusu wewe." site_contact: label: "Ujumbe uliotomatiki" description: "Ujumbe wote wa kibinafsi utatumwa kutoka kwa mtumiaji huyu, kama ripoti za onyo na ilani ya umalizaji wa chelezo." corporate: title: "Shirika" + colors: + title: "Rangi" + fonts: + fields: + font_preview: + label: "Kihakiki" logos: title: "Nembo" fields: diff --git a/config/locales/server.te.yml b/config/locales/server.te.yml index f59471cb13319..8ab67d3709328 100644 --- a/config/locales/server.te.yml +++ b/config/locales/server.te.yml @@ -27,11 +27,14 @@ te: title: "డిస్కోర్స్" topics: "విషయాలు" posts: "టపాలు" + views: "చూపులు" loading: "లోడవుతోంది" sign_up: "సైన్ అప్" log_in: "లాగిన్" disable_remote_images_download_reason: "సుదూర బొమ్మల దిగుమతి అచేతనమైంది ఎందుకంటే డిస్క్ జాగా తక్కువగా ఉంది." anonymous: "అనామక" + inline_oneboxer: + topic_page_title_post_number_by_user: "%{username} నుండి #%{post_number}" errors: &errors format: ! "%{attribute} %{message}" messages: @@ -77,6 +80,9 @@ te: other: ! "%{count} దోషాల వల్ల %{model} భద్రపరుచుట వీలవలేదు" embed: load_from_remote: "ఈ టపా లోడింగులో దోషం" + invite: + disabled_errors: + invalid_access: "అభ్యర్థించిన వనరు వీక్షించడానికి మీకు అనుమతి లేదు." backup: operation_already_running: "ఒక పరిక్రియ ప్రస్తుతం జరుగుతోంది. కొత్త పని ఇప్పుడు మొదలుపెట్టవీలవదు." backup_file_should_be_tar_gz: "బ్యాకప్ దస్త్రం తప్పనిసరి .tar.gz కట్ట అయి ఉండాలి." @@ -114,6 +120,9 @@ te: page_num: "పుట %[num]" topics_in_category: "'%{category}' వర్గంలోని విషయాలు" rss_posts_in_topic: "'%{topic}' యొక్క ఆర్ యస్ యస్ వడ్డన" + rss_num_posts: + one: "%{count} టపా" + other: "%{count} టపాలు" read_full_topic: "పూర్తి విషయం చదువు" rss_description: latest: "తాజా విషయాలు" @@ -346,6 +355,7 @@ te: daily: "ప్రతిరోజూ" weekly: "ప్రతీవారం" user_api_key: + read: "చదివిన" otp_confirmation: confirm_title: '%{site_name} కు కొనసాగండి' reports: @@ -398,6 +408,7 @@ te: title: "ఇష్టాలు" xaxis: "రోజు" yaxis: "కొత్త ఇష్టాల సంఖ్య" + description: "కొత్త ఇష్టాల సంఖ్య." flags: title: "కేతనాలు" xaxis: "రోజు" @@ -649,6 +660,7 @@ te: sender_body_blank: "ముఖ్యభాగం ఖాళీగా ఉంది" color_schemes: base_theme_name: "ఆధారం" + default_theme_name: "అప్రమేయ" edit_this_page: "ఈ పేజిని సవరించు" csv_export: boolean_yes: "అవును" @@ -732,6 +744,8 @@ te: placeholder: "name@example.com" corporate: title: "సంస్థ" + colors: + title: "రంగులు" homepage: fields: homepage_style: diff --git a/config/locales/server.th.yml b/config/locales/server.th.yml index c7da48a6b3b4f..a1cb8cbade817 100644 --- a/config/locales/server.th.yml +++ b/config/locales/server.th.yml @@ -15,6 +15,7 @@ th: short_no_year: "%B %-d" date_only: "%B %-d, %Y" long: "%B %-d, %Y, %l:%M%P" + no_day: "%Y %B" date: month_names: - null @@ -38,6 +39,7 @@ th: title: "ดิสคอส" topics: "หัวข้อ" posts: "โพสต์" + views: "ดู" loading: "กำลังโหลด" powered_by_html: 'บอร์ดนี้ใช้Discourse จะแสดงได้สมบูรณ์เมื่อเปิดการใช้งาน JavaScript' sign_up: "สมัคร" @@ -46,6 +48,8 @@ th: disable_remote_images_download_reason: "ไม่สามารถดาวน์โหลดรูปได้เนื่องจากพื้นที่ไม่เพียงพอ" anonymous: "ไม่ระบุชื่อ" remove_posts_deleted_by_author: "ถูกลบโดยผู้โพส" + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} โดย %{username}" emails: incoming: errors: @@ -62,6 +66,9 @@ th: start_discussion: "เริ่มการสนทนา" continue: "ดำเนินการสนทนาต่อ" loading: "กำลังโหลดการสนทนา" + in_reply_to: "▶ %{username}" + replies: + other: "%{count} ตอบ" created: "สร้างเมื่อ" user_is_suspended: "ผู้ใช้ที่ถูกระงับการใช้งานไม่สามารถโพสได้" just_posted_that: "คล้ายกับสิ่งคุณเพิ่งโพสมากเกินไป" @@ -70,6 +77,8 @@ th: prev_page: "← หน้าก่อนหน้า" page_num: "หน้า %{num}" home_title: "หน้าแรก" + rss_num_posts: + other: "%{count} โพสต์" excerpt_image: "รูปภาพ" bookmarks: reminders: @@ -78,6 +87,7 @@ th: tomorrow: "พรุ่งนี้" next_week: "สัปดาห์หน้า" next_month: "เดือนหน้า" + custom: "วันและเวลาที่กำหนดเอง" groups: default_names: everyone: "ทุกคน" @@ -99,12 +109,48 @@ th: staff_category_name: "ทีมงาน" category: topic_prefix: "เกี่ยวกับหมวด %{category}" + trust_levels: + member: + title: "สมาชิก" + regular: + title: "ทั่วไป" + rate_limiter: + hours: + other: "%{count} ชั่วโมง" datetime: distance_in_words: half_a_minute: "< 1 นาที" + less_than_x_seconds: + other: "< %{count} วินาที" + x_seconds: + other: "%{count} วินาที" + less_than_x_minutes: + other: "%{count}นาที" + x_minutes: + other: "%{count} นาที" + about_x_hours: + other: "%{count} ชั่วโมง" + x_days: + other: "%{count} วัน" + about_x_months: + other: "%{count}เดือน" + x_months: + other: "%{count}เดือน" + about_x_years: + other: "%{count} ปี" + over_x_years: + other: "> %{count} ปี" + almost_x_years: + other: "%{count} ปี" distance_in_words_verbose: half_a_minute: "เมื่อสักครู่นี้" less_than_x_seconds: "เมื่อสักครู่นี้" + about_x_hours: + other: "%{count} ชั่วโมงที่แล้ว" + x_days: + other: "%{count} วันที่แล้ว" + x_months: + other: "%{count}เดือนที่แล้ว" password_reset: choose_new: "เลือกรหัสผู้ใช้ใหม่" choose: "เลือกรหัสผู้ใช้" @@ -143,8 +189,10 @@ th: every_month: "ทุกเดือน" every_six_months: "ทุกหกเดือน" user_api_key: + read: "อ่าน" otp_confirmation: confirm_title: ดำเนินการต่อไปยัง %{site_name} + logging_in_as: กำลังเข้าสู่ระบบด้วย %{username} confirm_button: เสร็จสิ้นการเข้าสู่ระบบ reports: post_edits: @@ -224,6 +272,8 @@ th: top_uploads: labels: filename: ชื่อไฟล์ + site_settings: + dark_mode_none: "ไม่มี" search: within_post: "#%{post_number} ด้วย %{username}" types: @@ -242,6 +292,8 @@ th: email: sent_test: "ส่งแล้ว!" system_messages: + queued_by_staff: + title: "โพสต์นี้ต้องได้รับการอนุมัติ" welcome_user: subject_template: "ยินดีต้อนรับสู่ %{site_name}!" welcome_invite: @@ -350,12 +402,17 @@ th: title: "ลืมรหัสผ่าน" set_password: title: "ตั้งรหัสผ่าน" + post_approved: + title: "โพสต์ของคุณได้รับการอนุมัติ" page_not_found: popular_topics: "ยอดนิยม" see_more: "อื่น" search_title: "ค้นหาเว็บไซต์นี้" search_button: "ค้นหา" + deleted: "ลบ" image: "รูปภาพ" + color_schemes: + default_theme_name: "ค่าเริ่มต้น" csv_export: boolean_yes: "ใช่" boolean_no: "ไม่ใช่" @@ -401,12 +458,20 @@ th: placeholder: "name@example.com" corporate: title: "องค์กร" + colors: + title: "สี" + fonts: + fields: + font_preview: + label: "แสดงตัวอย่าง" homepage: fields: homepage_style: choices: categories_only: label: "หมวดหมู่เท่านั้น" + categories_with_featured_topics: + label: "หมวดหมู่พร้อมด้วยกระทู้เด่น" categories_and_latest_topics: label: "หมวดหมู่และกระทู้ล่าสุด" categories_and_top_topics: diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml index fff4997d762de..ac9b4b4c42f65 100644 --- a/config/locales/server.tr_TR.yml +++ b/config/locales/server.tr_TR.yml @@ -51,6 +51,8 @@ tr_TR: remove_posts_deleted_by_author: "Yazar tarafından silindi" redirect_warning: "Seçtiğiniz bağlantının gerçekten foruma gönderildiğini doğrulayamadık. Yine de devam etmek istiyorsanız, aşağıdaki bağlantıyı seçin." on_another_topic: "Başka bir konuda" + inline_oneboxer: + topic_page_title_post_number_by_user: "%{username} tarafından #%{post_number}" themes: bad_color_scheme: "Tema güncellenemiyor, geçersiz renk paleti" other_error: "Temanın güncellenmesi sırasında bir sorun oluştu" @@ -191,6 +193,8 @@ tr_TR: user_exists: "%{email} kişisinin zaten bir hesabı var!" invite_exists: "%{email} adresini daha önce davet ettiniz." confirm_email: "

Neredeyse bitti! E-posta adresinize bir aktivasyon postası gönderdik. Lütfen hesabınızı etkinleştirmek için postadaki talimatları izleyin.

Gelmezse, spam klasörünüzü kontrol edin.

" + disabled_errors: + invalid_access: "İstenilen kaynağı görüntüleyebilmeniz için izniniz yok." bulk_invite: file_should_be_csv: "Yüklenen dosya csv formatında olmalıdır." max_rows: "İlk olarak %{max_bulk_invites} davetiyeleri gönderildi. Dosyayı daha küçük parçalara bölmeyi deneyin." @@ -297,6 +301,9 @@ tr_TR: topics_in_category: "'%{category}' kategorisindeki konular" rss_posts_in_topic: " '%{topic}' konusuna ait RSS akışı" rss_topics_in_category: "'%{category}' kategorisindeki konulara ait RSS akışı" + rss_num_posts: + one: "%{count} gönderi" + other: "%{count} gönderi" read_full_topic: "Konunun tamamını okuyun" private_message_abbrev: "İlt" rss_description: @@ -451,6 +458,7 @@ tr_TR: in_the_past: "gelecekte olmalı." duration_minutes: cannot_be_zero: "Sıfırdan büyük olmalıdır." + exceeds_maximum: "20 yıldan fazla olamaz." translation_overrides: attributes: value: @@ -1269,6 +1277,8 @@ tr_TR: show_pinned_excerpt_mobile: "Mobil görünümünde başa tutturulmuş konuların özetini göster." show_pinned_excerpt_desktop: "Masaüstü görünümünde başa tutturulmuş konuların özetini göster." post_onebox_maxlength: "Kutulanmış bir Discourse gönderisinin en fazla karakter uzunluğu" + blocked_onebox_domains: "Asla yayınlanmayacak alanların listesi." + allowed_inline_onebox_domains: "Başlıksız bağlanırsa minyatür formda yayınlanacak alanların listesi" force_custom_user_agent_hosts: "Tüm isteklerde özel onebox kullanıcı aracısını kullanacak ana makineler. (Özellikle kullanıcı aracısıyla erişimi sınırlayan ana bilgisayarlar için kullanışlıdır)." max_oneboxes_per_post: "Gönderide olabilecek en fazla kutulama sayısı" logo: "Sitenizin sol üst tarafındaki logo resmi. Yüksekliği 120 ve en boy oranı 3: 1 den büyük olan geniş dikdörtgen bir görüntü kullanın. Boş bırakılırsa, site başlığı metni gösterilir." @@ -1323,7 +1333,11 @@ tr_TR: maximum_session_age: "Kullanıcı son ziyaretinden bu yana n saat boyunca giriş yapmış olarak kalacak" enable_escaped_fragments: "Eğer bir ağ gezgini algılanmazsa Google'ın Ajax Crawling API'ına geri dönün. Bkz. Https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" cors_origins: "Cross-origin isteklerin (CORS) izin verilen originler. Her origin http:// veya https:// içermeli. CORS'u etkinleştirebilmek için DISCOURSE_ENABLE_CORS env değişkeni doğru olarak ayarlanmalı." + use_admin_ip_allowlist: "Yöneticiler, sadece Taranmış IP listesinde tanımlanmış bir IP adresinden erişim sağlıyorlarsa giriş yapabilirler. (Yönetici > Kayıtlar > Taranmış IP'ler)" + blocked_ip_blocks: "Hiçbir zaman Discourse tarafından taranmaması gereken özel IP bloklarının bir listesi" + allowed_internal_hosts: "Discourse ve diğer amaçlarla güvenli bir şekilde tarama yapabilen dahili ana bilgisayarların bir listesi" allowed_iframes: "Gönderilerde güvenli bir şekilde izin verebilecek iframe src alan adı öneklerinin listesi" + allowed_crawler_user_agents: "Siteye erişmesine izin verilmesi gereken ağ tarayıcılarının kullanıcı aracıları. UYARI! BU AYARLAR, BURADA LİSTEN OLMAYAN TÜM TARAYICILARI ÇIKARACAKTIR!" slow_down_crawler_user_agents: "Tarama gecikmesi yönergesi kullanılarak robots.txt dosyasında hız sınırlaması gereken ağ tarayıcılarının kullanıcı aracıları" slow_down_crawler_rate: "slow_down_crawler_user_agents belirtilirse, bu oran tüm tarayıcılara uygulanır (istekler arasında saniye cinsinden gecikme sayısı)." content_security_policy: "İçerik-Güvenlik-Politikasını Etkinleştir" @@ -1355,6 +1369,8 @@ tr_TR: enable_badges: "Rozet sistemini etkinleştir" enable_whispers: "Konular dahilinde yetkililerin özel iletişimine izin ver." allow_index_in_robots_txt: "Robots.txt dosyasında bu sitenin web arama motorları tarafından dizine eklenmesine izin verildiğini belirtin. İstisnai durumlarda kalıcı olarak robots.txt dosyasını geçersiz kılabilirsiniz ." + blocked_email_domains: "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" + allowed_email_domains: "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!" hide_email_address_taken: "Kullanıcıları, kayıt sırasında ve parolamı unuttum formunda o e-posta adresiyle bir hesap bulunduğunu bildirmeyin." log_out_strict: "Çıkış yapılırken, kullanıcının tüm cihazlardaki TÜM seanslarını sonlandır" version_checks: "Sürüm güncellemeleri için Discourse Hub'a ping atın ve / admin kontrol panelinde yeni sürüm mesajlarını gösterin" @@ -1370,6 +1386,7 @@ tr_TR: min_admin_password_length: "Yönetici için parolanın en az uzunluğu." password_unique_characters: "Bir parolanın olması gereken minimum benzersiz karakter sayısı." block_common_passwords: "En çok kullanılan 10,000 parola arasında yer alan parolalara izin verme." + discourse_connect_overrides_bio: "Kullanıcı profilindeki kullanıcı biyografisini geçersiz kılar ve kullanıcının bunu değiştirmesini önler" enable_local_logins_via_email: "Kullanıcıların e-posta yoluyla kendilerine tek tıklamayla giriş bağlantısı gönderilmesini istemesine izin ver." allow_new_registrations: "Yeni kayıtlara izin ver. Yeni hesap oluşturulmasını engellemek için burayı işaretlemeyin." enable_signup_cta: "Geri dönen anonim kullanıcılara hesap oluşturmaları için bir uyarı göster." @@ -1488,6 +1505,7 @@ tr_TR: min_trust_to_send_email_messages: "E-postayla kişisel mesaj göndermek için gereken minimum güven seviyesi." min_trust_to_flag_posts: "Gönderileri raporlamak için gereken minimum güven seviyesi" min_trust_to_post_links: "Gönderilere bağlantı eklemek için gereken minimum güven seviyesi" + allowed_link_domains: "Kullanıcıların bağlantı göndermek için uygun güven seviyesine sahip olmasalar bile bağlanabilecekleri alanlar" newuser_max_links: "Yeni bir kullanıcının bir gönderiye ekleyebileceği bağlantı sayısı." newuser_max_attachments: "Yeni bir kullanıcının bir gönderiye ekleyebileceği dosya sayısı." newuser_max_mentions_per_post: "Yeni bir kullanıcının bir gönderi içinde kullanabileceği en fazla @isim bildiri sayısı." @@ -1510,6 +1528,7 @@ tr_TR: desktop_category_page_style: "/categories sayfasının görsel biçimi." category_colors: "Kategoriler için izin verilen onaltılı renk değerlerinin listesi" category_style: "Kategori rozetleri için görsel biçim." + dark_mode_none: "Hiçbiri" max_attachment_size_kb: "Yüklenebilecek dosyaların KB cinsinden en fazla büyüklüğü. Bu nginx (client_max_body_size) / apache veya proxyde de ayarlanmalı." authorized_extensions: "Yüklenebilecek dosya uzantılarının listesi (tüm dosya türlerini etkinleştirmek için '*' kullanın)" authorized_extensions_for_staff: "`Yetkili_uzanımlar` site ayarında tanımlanan listeye ek olarak yetkili kullanıcılar için yüklenmeye izin verilen dosya uzantılarının listesi. (tüm dosya türlerini etkinleştirmek için '*' kullanın)" @@ -1535,6 +1554,7 @@ tr_TR: privacy_policy_url: "Başka yerde barındırılan bir Gizlilik İlkeleri dökümanını kullanmak istiyorsanız, ilgili URL adresini buraya eksiksiz şekilde girin." log_anonymizer_details: "Anonimleştirildikten sonra kullanıcının ayrıntılarını günlükte tutup tutmayacağı. GDPR'ye uyarken bunu kapatmanız gerekir." newuser_spam_host_threshold: "Yeni bir kullanıcı, `newuser_spam_host_threshold` gönderileri içerisinde aynı makineye, kaç kere bağlantı paylaşınca spam olarak algılansın." + allowed_spam_host_domains: "Spam barındırma testinden hariç tutulan alan adı listesi. Yeni kullanıcıların, bu alan adlarına bağlantı içeren gönderi oluşturmaları hiç bir zaman engellenmeyecek." topic_view_duration_hours: "Her N saatte IP/Kullanıcı başına bir kez yeni konu görüntülemesi say" user_profile_view_duration_hours: "Her N saatte IP/Kullanıcı başına bir kez yeni profil görüntülemesi say" levenshtein_distance_spammer_emails: "İstenmeyen e-postaları eşleştirilirken, bulanık eşleşme için tahammül edilecek karakter sayısı farklılığı." @@ -1568,6 +1588,7 @@ tr_TR: max_emails_per_day_per_user: "Kullanıcılara bir günde gönderilebilecek en fazla e-posta sayısı. Limiti kaldırmak için 0" enable_staged_users: "Gelen e-postaları işlerken otomatik olarak aşamalı kullanıcılar oluşturun." maximum_staged_users_per_email: "Gelen bir e-posta işlenirken oluşturulan maksimum aşamalı kullanıcı sayısı." + auto_generated_allowlist: "Otomatik olarak oluşturulan içerik için denetlenmeyecek e-posta adreslerinin listesi. Örnek: foo@bar.com | discourse@bar.com" block_auto_generated_emails: "Otomatik olarak oluşturulduğu belirlenen e-postaları engelleyin." ignore_by_title: "Gelen e-postaları başlıklarına göre yok sayın." mailgun_api_key: "Webhook mesajlarını doğrulamak için Mailgun Secret API anahtarı." @@ -1640,6 +1661,7 @@ tr_TR: ignored_users_message_gap_days: "Diğerleri tarafından görmezden gelinen bir kullanıcı hakkında moderatörlere tekrar bildirimde bulunmadan önce ne kadar bekleyeceği." clean_up_inactive_users_after_days: "Etkin olmayan bir kullanıcının (gönderiler olmadan 0 güven seviyesi) kaldırılmasından önceki gün sayısı. Temizlemeyi devre dışı bırakmak için 0 olarak ayarlayın." user_selected_primary_groups: "Kullanıcıların kendi birincil gruplarını ayarlamalarına izin ver" + allowed_user_website_domains: "Kullanıcı web sitesi bu alanlara karşı doğrulanacak. Sınırlandırılmış liste." allow_profile_backgrounds: "Kullanıcıların profillerine arkaplan eklemesine izin ver." sequential_replies_threshold: "Kullanıcının arka arkaya çok fazla cevap gönderdiğine dair uyarı alması için, kullanıcının bir konuda ve bir satırda yapması gereken gönderi sayısı." get_a_room_threshold: "Bir kullanıcının uyarılmadan önce aynı kişi ve aynı konuyla yapması gereken gönderi sayısı." @@ -1676,6 +1698,7 @@ tr_TR: embed_topics_list: "Konu listelerinin HTML yerleştirmesini destekleyin" embed_truncate: "Yerleştirilmiş gönderileri kırp." embed_support_markdown: "Gömülü gönderiler için Markdown formatlama desteği." + allowed_embed_selectors: "Gömme işlemlerinde izin verilen CSS öğelerinin virgülle ayrılmış listesi." allowed_href_schemes: "Http ve https'ye ek olarak bağlantılarda şemalara izin verilir." embed_post_limit: "Yerleştirilecek en fazla gönderi sayısı." embed_username_required: "Konu oluşturmak için kullanıcı adı gereklidir." @@ -1719,6 +1742,7 @@ tr_TR: default_other_enable_quoting: "Vurgulanmış yazılar için alıntı ile cevaplamayı, öntanımlı olarak, etkinleştir." default_other_enable_defer: "Varsayılan olarak erteleme konusu işlevini etkinleştir." default_other_dynamic_favicon: "Tarayıcı simgesinde, öntanımlı olarak, yeni/güncellenmiş konu sayısını göster." + default_other_skip_new_user_tips: "Yeni kullanıcı katılımı ipuçlarını ve rozetlerini atlayın." default_other_like_notification_frequency: "Beğenildiğinde öntanımlı olarak kullanıcılara bildir" default_topics_automatic_unpin: "Kullanıcı sayfa sonuna eriştiğinde tutturulmuş konuları otomatik olarak sayfadan ayır." default_categories_watching: "Öntanımlı olarak gözlenen kategorilerin listesi." @@ -1796,8 +1820,14 @@ tr_TR: max_username_length_exists: "Maksimum kullanıcı adı uzunluğunu en uzun kullanıcı adının (%{username}) altına ayarlayamazsınız." max_username_length_range: "En küçük değer altında en büyük değer ayarlayamazsınız." invalid_hex_value: "Renk değerleri 6 haneli onaltılık kodlar olmalıdır." + allowed_unicode_usernames: + regex_invalid: "Normal ifade geçersiz: %{error}" + leading_trailing_slash: "Normal ifade eğik çizgi ile başlamamalı ve bitmemelidir." unicode_usernames_avatars: "Dahili sistem avatarları Unicode kullanıcı adlarını desteklemez." list_value_count: "Liste tam olarak %{count} değerleri içermelidir." + placeholder: + discourse_connect_provider_secrets: + key: "www.örnek.com" search: extreme_load_error: "Site aşırı yük altında, arama devre dışı, daha sonra tekrar deneyin" within_post: "%{username} tarafından #%{post_number}" @@ -1809,6 +1839,14 @@ tr_TR: audio: "[ses]" video: "[video]" discourse_connect: + login_error: "Oturum açma Hatası" + not_found: "Hesabınız bulunamadı. Lütfen site yöneticisi ile iletişime geçin." + account_not_approved: "Hesabınız onaylanma bekliyor. Onaylandığınızda e-posta ile bilgilendirileceksiniz." + unknown_error: "Hesabınızda bir sorun var. Lütfen site yöneticisi ile iletişime geçin." + timeout_expired: "Hesabınız zaman aşımına uğradı, lütfen tekrar giriş yapmayı deneyin." + no_email: "Hiçbir e-posta adresi verilmedi. Lütfen sitenin yöneticisine başvurun." + blank_id_error: "`External_id` gerekli ancak boştu" + email_error: "%{email} e-posta adresiyle bir hesap kaydedilemedi. Lütfen sitenin yöneticisine başvurun." invite_redeem_failed: "Davet kullanımı başarısız oldu. Lütfen site yöneticisi ile iletişime geçin." original_poster: "Özgün Gönderici" most_posts: "En Çok Gönderi" @@ -1926,6 +1964,7 @@ tr_TR: missing_user_field: "Kullanıcı alanlarının tamamını doldurmadınız" auth_complete: "Kimlik doğrulama işlemi tamamlandı." click_to_continue: "Devam etmek için buraya tıklayın." + second_factor_title: "İki Faktörlü Kimlik Doğrulama" second_factor_description: "Lütfen uygulamanıza gerekli kimlik doğrulama kodunu girin:" second_factor_backup_description: "Lütfen yedek kodlarından birini gir:" invalid_second_factor_code: "Geçersiz kimlik doğrulama kodu. Her kod yalnızca bir kez kullanılabilir." @@ -2229,6 +2268,8 @@ tr_TR: Ziyaretinizin keyfini çıkarın! [tercihler]:%{user_preferences_url} + tl2_promotion_message: + subject_template: "Güven seviyesi terfiniz için tebrikler!" backup_succeeded: title: "Yedekleme Başarılı" subject_template: "Yedekleme başarıyla tamamlandı" @@ -2884,6 +2925,9 @@ tr_TR: confirm_new_email: title: "Yeni E-postayı Onayla" subject_template: "[%{email_prefix}] Yeni e-posta adresinizi onaylayın" + confirm_new_email_via_admin: + title: "Yeni E-postayı Onayla" + subject_template: "[%{email_prefix}] Yeni e-posta adresinizi onaylayın" confirm_old_email: title: "Eski E-postayı Onayla" subject_template: "[%{email_prefix}] Mevcut e-posta adresinizi onaylayın" @@ -3003,6 +3047,7 @@ tr_TR: latte: "Latte" summer: "Yaz" dark_rose: "Kara Gül" + default_theme_name: "Varsayılan " light_theme_name: "Aydınlık" dark_theme_name: "Karanlık" neutral_theme_name: "Nötr" @@ -3214,6 +3259,7 @@ tr_TR: 5 defa günlük %{max_likes_per_day} beğeni kullandığınız zaman bu rozet size verilir. Her gün en iyi sohbetleri aktif olarak teşvik etmek için zaman ayırdığınız için teşekkür ederiz! crazy_in_love: name: Beğeni Delisi + description: 20 defa günlük %{max_likes_per_day} beğeni kullanıldı long_description: | 20 gün boyunca günlük beğenilerinizin tümünü %{max_likes_per_day} kullandığınızda bu rozet size verilir. Vay canına! Topluluk üyelerini teşvik etmek için bir rol modelisiniz! thank_you: @@ -3399,6 +3445,12 @@ tr_TR: city_for_disputes: label: "Anlaşmazlıklar Şehri" placeholder: "San Francisco, Kaliforniya" + colors: + title: "Renkler" + fonts: + fields: + font_preview: + label: "Önizleme" logos: title: "Görseller" fields: diff --git a/config/locales/server.uk.yml b/config/locales/server.uk.yml index 1f30fcd21e698..916afcd705c84 100644 --- a/config/locales/server.uk.yml +++ b/config/locales/server.uk.yml @@ -1637,6 +1637,8 @@ uk: min_admin_password_length: "Мінімальна довжина пароля для адміністратора." password_unique_characters: "Мінімальна довжина пароля для адміністратора." block_common_passwords: "Не дозволяти використовувати паролі зі списку 10 000 самих часто використовуваних паролів." + auth_immediately: "Автоматично перенаправляти на зовнішню систему входу без взаємодії з користувачем. Це набуває чинності лише тоді, коли login_required має значення true, і існує лише один зовнішній метод автентифікації" + discourse_connect_overrides_bio: "Перезаписує інформацію в профіль користувача і не дозволяє користувачеві його змінювати" enable_local_logins_via_email: "Дозволити користувачам запитувати посилання для входу в один клік та надсилати їм електронною поштою цього посилання." allow_new_registrations: "Дозволити реєстрацію нових користувачів. Вимкніть, щоб заборонити відвідувачам створювати нові облікові записи." enable_signup_cta: "Покажіть повідомлення анонімним користувачам, які повернулися, з пропозицією зареєструвати обліковий запис." @@ -1911,6 +1913,7 @@ uk: ignored_users_message_gap_days: "Як довго чекати, перш ніж повторно повідомити модераторів про користувача, якого ігнорувало багато інших." clean_up_inactive_users_after_days: "Кількість днів до видалення неактивного користувача (рівень довіри 0 без жодних публікацій). Щоб вимкнути очищення, встановіть значення 0." user_selected_primary_groups: "Дозволити користувачам створювати власну групу" + allowed_user_website_domains: "Веб-сайт користувача треба підтверджувати для цих доменів. Список з розмежуванням." allow_profile_backgrounds: "Дозволити користувачам завантажувати фони профілю." sequential_replies_threshold: "Кількість публікацій, які користувач повинен робити підряд по темі, перш ніж нагадувати про занадто багато послідовних відповідей." get_a_room_threshold: "Кількість публікацій, які користувач повинен зробити до тієї самої особи в тій самій темі, перш ніж буде попереджений." @@ -1940,6 +1943,7 @@ uk: embed_topics_list: "Підтримка HTML-вбудовування зі списку тем" embed_truncate: "Обрізати вбудовані повідомлення. " embed_support_markdown: "Підтримка Markdown форматування для вбудованих дописів." + allowed_embed_selectors: "Список розділених комами елементів CSS, дозволених до вбудовування." allowed_href_schemes: "Схеми, дозволені у посиланнях, крім http та https." embed_post_limit: "Максимальна кількість дописів для вставки." embed_username_required: "Ім’я користувача для створення теми обов’язкове." @@ -1984,6 +1988,7 @@ uk: default_other_enable_quoting: "За замовчуванням включати у відповідь цитату для виділеного тексту." default_other_enable_defer: "Увімкнути функцію відкладення теми за замовчуванням." default_other_dynamic_favicon: "Показати кількість нових / оновлених тем на іконці браузера за замовчуванням." + default_other_skip_new_user_tips: "Пропустити поради щодо створення користувача та значків." default_other_like_notification_frequency: "Повідомлення користувачів про лайки за замовчуванням" default_topics_automatic_unpin: "Автоматично відкріпити теми, коли користувач досягає нижньої частини." default_categories_watching: "Список категорій, які переглядаються за замовчуванням." @@ -2055,8 +2060,14 @@ uk: max_username_length_exists: "Ви не можете встановити максимальну довжину імені користувача нижче найдовшого імені користувача (%{username})." max_username_length_range: "Не можна встановити максимум нижче мінімального." invalid_hex_value: "Значення кольорів мають бути шестизначними шістнадцятковими hex кодами." + allowed_unicode_usernames: + regex_invalid: "Регулярний вираз недійсний: %{error}" + leading_trailing_slash: "Регулярний вираз не повинен починатися і закінчуватися косою рисою." unicode_usernames_avatars: "Внутрішні аватари системи не підтримують імен користувачів Unicode." list_value_count: "Список повинен містити точно %{count} значення." + placeholder: + discourse_connect_provider_secrets: + key: "www.example.com" search: extreme_load_error: "Сайт перебуває під надзвичайним навантаженням, пошук вимкнено, повторіть спробу пізніше" within_post: "# %{post_number} від %{username}" @@ -2065,6 +2076,14 @@ uk: topic: "Результати" user: "Користувачі" results_page: "Результати пошуку для '%{term}'" + discourse_connect: + login_error: "Помилка входу" + not_found: "Ваш обліковий запис не вдалося знайти. Зверніться до адміністратора сайту." + account_not_approved: "Ваш обліковий запис очікує затвердження. Ви отримаєте сповіщення електронною поштою, коли буде отримане схвалення." + unknown_error: "Виникла проблема з вашим обліковим записом. Зверніться до адміністратора сайту." + timeout_expired: "Час входу в обліковий запис вийшов. Спробуйте знову увійти." + no_email: "Не вказано електронну адресу e-mail. Зверніться до адміністратора сайту." + email_error: "Не вдалося зареєструвати обліковий запис з електронною поштою %{email}. Зверніться до адміністратора сайту." original_poster: "Перший дописувач" most_posts: "Найбільше дописів" most_recent_poster: "Автор останнього допису" @@ -2219,6 +2238,7 @@ uk: missing_user_field: "Ви не заповнили всі поля користувача" auth_complete: "Автентифікація завершена." click_to_continue: "Натисніть тут, щоб продовжити." + second_factor_title: "Двофакторна автентифікація" second_factor_description: "Введіть необхідний код автентифікації у своєму додатку:" second_factor_backup_description: "Введіть один із резервних кодів:" invalid_second_factor_code: "Недійсний код аутентифікації Кожен код може бути використаний лише один раз." @@ -2341,6 +2361,8 @@ uk: post_hidden_again: title: "Допис знову приховано" subject_template: "Повідомлення приховано через скарги спільноти, персонал повідомлено" + queued_by_staff: + title: "Допис потребує схвалення" flags_disagreed: title: "Позначене повідомлення відновлено персоналом" subject_template: "Позначене повідомлення відновлено персоналом" @@ -2395,6 +2417,8 @@ uk: csv_export_failed: title: "Не вдалося експортувати CSV" subject_template: "Експорт даних не здійснено" + email_reject_screened_email: + subject_template: "[%{email_prefix}] Проблема з електронною поштою — заблокована електронна пошта" email_reject_not_allowed_email: title: "Email відхилено. Заборонена поштова скринька" subject_template: "[%{email_prefix}] Проблема з електронною поштою — заблокована електронна пошта" @@ -2706,6 +2730,9 @@ uk: confirm_new_email: title: "Підтвердіть нову електронну пошту" subject_template: "[%{email_prefix}] Підтвердіть свою нову електронну пошту" + confirm_new_email_via_admin: + title: "Підтвердіть нову електронну пошту" + subject_template: "[%{email_prefix}] Підтвердіть свою нову електронну пошту" confirm_old_email: title: "Підтвердіть стару електронну пошту" subject_template: "[%{email_prefix}] Підтвердіть свою поточну адресу електроної пошти" @@ -2726,6 +2753,8 @@ uk: suspicious_login: title: "Нове попередження про вхід" subject_template: "[%{site_name}] Новий вхід на сайт" + post_approved: + title: "Ваш пост був схвалений" site_setting_missing: "`%{name}` налаштування сайту потрібно встановити." page_not_found: title: "Упс! Сторінки не існує або вона приватна." @@ -2797,6 +2826,7 @@ uk: latte: "Latte" summer: "Літо" dark_rose: "Темна троянда" + default_theme_name: "За замовчуванням" light_theme_name: "Світла" dark_theme_name: "Темна" neutral_theme_name: "Нейтральна" @@ -3127,6 +3157,8 @@ uk: city_for_disputes: label: "Місто для суперечок" placeholder: "Сан-Франциско, Каліфорнія" + colors: + title: "Кольори" fonts: title: "Шрифти" fields: @@ -3229,6 +3261,7 @@ uk: trust_level: "Відповіді користувачів з низьким рівнем довіри повинні бути затверджені персоналом. Перегляньте розділ `approve_unless_trust_level`." new_topics_unless_trust_level: "Теми користувачів з низьким рівнем довіри повинні бути затверджені персоналом. Див. розділ `approve_new_topics_unless_trust_level`." fast_typer: "Новий користувач набрав своє перше повідомлення підозріло швидко, є підозра про поведінку бота чи спамера. Див. `min_first_post_typing_time`." + auto_silence_regexp: "Зареєстрований учасник, чиє перше повідомлення відповідає `auto_silence_first_post_regex` налаштуванням." staged: "Нові теми та публікації для проміжних користувачів повинні бути затверджені персоналом. Дивіться `approve_unless_staged`." category: "Дописи в цій категорії вимагають ручного схвалення персоналом. Дивіться налаштування категорії." must_approve_users: "Всіх нових користувачів потрібно схвалити персоналом. Дивіться `must_approve_users`." diff --git a/config/locales/server.ur.yml b/config/locales/server.ur.yml index 3f917fdc6b91a..b9ab3323563f0 100644 --- a/config/locales/server.ur.yml +++ b/config/locales/server.ur.yml @@ -39,6 +39,7 @@ ur: title: "ڈسکورس" topics: "ٹاپک" posts: "پوسٹ`" + views: "وِیوز" loading: "لوڈ ہو رہا ہے" powered_by_html: 'ڈِسکورسکے مرہونِ مِنَّت، جاوااسکرپٹ کے ساتھ بہترین نظر آئے گا' sign_up: "سائن اپ" @@ -50,6 +51,8 @@ ur: remove_posts_deleted_by_author: "مصنف کی طرف سے حذف کر دیا گیا" redirect_warning: "ہم تصدیق نہ کر سکے کہ آپ کا منتخب کردہ لِنک اصل میں فورم پر شائع کیا گیا تھا کہ نہیں۔ اگر آپ پھر بھی آگے بڑھنا چاہتے ہیں، تو نیچے دیئے گئے لِنک کو منتخب کریں۔" on_another_topic: "دوسرے ٹاپک پر" + inline_oneboxer: + topic_page_title_post_number_by_user: "%{username} کی طرف سے #%{post_number}" themes: bad_color_scheme: "تِھیم اَپ ڈَیٹ نہیں ہو سکتی، غلط رنگ پیلیٹ" other_error: "تِھیم اَپ ڈَیٹ کرتے ہوے کچھ غلط ہو گیا" @@ -176,6 +179,8 @@ ur: not_found_json: "آپ کا دعوتی ٹوکن غلط ہے۔ براہ کرم سٹاف سے رابطہ کریں۔" user_exists: "%{email}کو مدعو کرنے کی کوئی ضرورت نہیں ہے، اُن کا پہلے سے ہی ایک اکاؤنٹ ہے!" confirm_email: "

آپ تقریباً کام مکمل کر چکے ہیں! ہم نے آپ کے ایمیل پتہ پر ایک ایکٹیویشن میل بھیج دی ہے۔ براہ مہربانی اپنے اکاؤنٹ کو چالو کرنے کیلئے میل میں دی گئی ہدایات پر عمل کریں۔

اگر یہ آپ کو موصول نہ ہو، تو اپنا سپَیم فولڈر چیک کریں۔

" + disabled_errors: + invalid_access: "آپ کو درخواست کردہ ریسورس کو دیکھنے کی اجازت نہیں ہے۔" bulk_invite: file_should_be_csv: "اَپ لوڈ شدہ فائل CSV فارمیٹ میں ہونی چاہئے۔" max_rows: "پہلے %{max_bulk_invites} دعوت نامے بھیجے جا سکتے ہیں۔ فائل کو چھوٹے حصوں میں تقسیم کرنے کی کوشش کریں۔" @@ -274,6 +279,9 @@ ur: topics_in_category: "'%{category}' زُمرہ میں ٹاپک" rss_posts_in_topic: "'%{topic}' کی RSS فِیڈ" rss_topics_in_category: "'%{category}' زُمرہ میں ٹاپکس کی RSS فِیڈ" + rss_num_posts: + one: "%{count} پوسٹ" + other: "%{count} پوسٹس" read_full_topic: "مکمل ٹاپک پڑھیں" private_message_abbrev: "پغم" rss_description: @@ -935,6 +943,7 @@ ur: labels: level: لَیول description: "ٹرسٹ لَیول کے حساب سے گروپ کردہ صارفین کی تعداد۔" + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: title: "صارفین فی قسم" xaxis: "قِسم" @@ -1201,6 +1210,8 @@ ur: show_pinned_excerpt_mobile: "موبائل وِیو میں پِن ہوے ٹاپکس پر اقتباس دکھائیں۔" show_pinned_excerpt_desktop: "ڈیسک ٹاپ وِیو میں پِن ہوے ٹاپکس پر اقتباس دکھائیں۔" post_onebox_maxlength: "ایک وَن باکسڈ ڈِسکورس پوسٹ کے حروف کی زیادہ سے زیادہ لمبائی۔" + blocked_onebox_domains: "ڈومینز کی ایک فہرست جو کبھی بھی وَن باکسڈ نہیں کیے جائیں گے۔" + allowed_inline_onebox_domains: "ڈومینز کی ایک فہرست جو چھوٹے فارم میں وَن باکسڈ کیے جائیں گے اگر وہ عنوان کے بغیر لنک کیے جائیں" max_oneboxes_per_post: "ایک پوسٹ میں وَن باکس کی زیادہ سے زیادہ تعداد۔" logo: "آپ کی سائٹ کے سب سے اوپر بائیں پر لوگو کی تصویر۔ 120 کی اونچائی اور 3:1 سے زائد اَیسپَیکٹ رَیشو والی وسیع مستطیل تصویر کا استعمال کریں۔ اگر خالی چھوڑ دیا گیا ہو تو سائٹ کا عنوان دکھایا جائے گا۔" logo_small: "آپ کی سائٹ کے سب سے اوپر بائیں پر چھوٹی سی لوگو کی تصویر، نیچے سکرول کرنے پر نظر آتی ہے۔ ایک مربع 120 × 120 تصویر کا استعمال کریں۔ اگر خالی چھوڑ دیا گیا ہو تو ایک ہَوم گلِف دکھایا جائے گا۔" @@ -1252,7 +1263,11 @@ ur: maximum_session_age: "آخری وزٹ سے ن گھنٹوں بعد تک صارف کو لاگڈ اِن رکھا جائے گا" enable_escaped_fragments: "اگر کسی وَیب کرالر کا پتہ نہ لگے تو گُوگل اَیجَیکس-کرالِنگ API کا استعمال کریں۔ دیکھیے https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" cors_origins: "وہ اَوریجِن جن کیلئے کراس-اَوریجِن درخواستوں (CORS) کی اجازت ہے۔ ہراَوریجِن میں http:// یا https:// شامل ہونا ضروری ہے۔ CORS کو فعال کرنے کیلئے DISCOURSE_ENABLE_CORS کی وَیلِیو ٹرُو پر مقرر ہونا لاذمی ہے۔" + use_admin_ip_allowlist: "ایڈمن صرف اُس صورت میں لاگ ان کرسکتے ہیں اگر وہ ایسے IP ایڈریس میں ہیں جو اسکرین کردہ آئی پیز کی فہرست (ایڈمن > لاگز > اسکرین کردہ آئی پیز) میں بیان کیا گیا ہو۔" + blocked_ip_blocks: "نجی IP بلاکس کی فہرست جو ڈِسکَورس کی طرف سے کبھی کرال نہیں ہونی چاہئیں" + allowed_internal_hosts: "اندرونی ہَوسٹس کی فہرست جو ڈِسکَورس محفوظ طریقے سے وَن باکس اور دیگر مقاصد کیلئے کرال کر سکتا ہے" allowed_iframes: "iframe src ڈَومَین کے سابقوں کی ایک فہرست جو ڈِسکَورس محفوظ طریقے سے پوسٹس میں شامل ہونے کی اجازت دے سکتا ہے" + allowed_crawler_user_agents: "وَیب کرالرز کے صارف ایجنٹوں جن کو سائٹ تک رسائی کی اجازت دی جانی چاہیئے۔ انتباہ! اِس ترتیب کو فعال کرنے سے وہ تمام کرالرز جو یہاں فہرست کردہ نہیں ہیں رد کر دہے جائیں گے!" slow_down_crawler_user_agents: "crawl-delay ہدایت کا استعمال کرتے ہوئے، ویب کرالرز کے صارف ایجنٹ جو robots.txt میں شرح محدود ہونے چاہئیں" slow_down_crawler_rate: "اگر slow_down_crawler_user_agents کی وضاحت کی گئی ہے تو یہ شرح تمام کرالرز پر لاگو ہوگی (درخواستوں کے درمیان سیکنڈوں کی تاخیر)" content_security_policy: "کَنٹینٹ-سیکورٹی-پالیسی فعال کریں" @@ -1283,6 +1298,8 @@ ur: enable_badges: "بَیج سِسٹم فعال کریں" enable_whispers: "ٹاپک کے اندر سٹاف کے درمیان ذاتی مواصلات کی اجازت دیں۔" allow_index_in_robots_txt: "robots.txt فائل میں وضاحت کریں کہ یہ سائٹ وَیب سرچ اِنجنوں کی طرف سے انڈیکس کی جاسکتی ہے۔ غیر معمولی معاملات میں آپ مستقل طور پر robots.txt کو اَووَررائڈ کرسکتے ہیں۔" + blocked_email_domains: "ای میل ڈومینز کی پائپ سے علیحدہ کردہ فہرست جن کے ساتھ صارفین کو اکاؤنٹس رجسٹر کرنے کی اجازت نہیں ہے۔ مثال: mailinator.com|trashmail.net" + allowed_email_domains: "ای میل ڈومینز کی پائپ سے علیحدہ کردہ فہرست جن کے ساتھ صارفین کو اکاؤنٹس رجسٹر کرنا لاذمی ہے۔ انتباہ: اِس فہرست کے علاوہ ای میل ڈومینز والے صارفین کو روک دیا جائے گی!" hide_email_address_taken: "سائن اَپ کے دوران اور بھولا پاسورڈ فارم سے صارفین کو مطلع نہ کریں کہ فراہم کیے گئے ای میل ایڈریس کے ساتھ ایک اکاؤنٹ موجود ہے۔" log_out_strict: "لاگ آؤٹ ہونے پر، صارف کیلئے تمام ڈِیوائیسِز پر تمام سیشنوں کو لاگ آؤٹ کریں" version_checks: "ورژن اپ ڈیٹ کیلئے ڈِسکورس ہَب کو پِنگ کریں اور /admin ڈیش بورڈ پر نئے ورژن کا پیغام دکھائیں" @@ -1298,6 +1315,7 @@ ur: min_admin_password_length: "اَیڈمن کیلئے پاسورڈ کی کم از کم لمبائی۔" password_unique_characters: "منفرد حروف کی کم از کم تعداد جو پاسورڈ میں ہونا لاذمی ہے۔" block_common_passwords: "ایسا پاسورڈ جو 10،000 سب سے زیادہ عام پاسورڈز میںشامل ہو، اۃسے رکھنے کی اجازت نہ دیں۔" + discourse_connect_overrides_bio: "صارف پروفائل میں صارف کی بائیو کی جگہ لے لیتا ہے اور اِس کو تبدیل کرنے سے صارف کو روک دیتا ہے" enable_local_logins_via_email: "صارفین کو بذریعہ ای میل بھیجے جانے والے ایک کلِک لاگ اِن لِنک کی درخواست کرنے کی اجازت دیں۔" allow_new_registrations: "نئے صارف رجسٹریشنوں کی اجازت دیں۔ کسی کو نیا اکاؤنٹ بنانے سے روکنے کیلئے اس کو غیر چیک شدہ کریں۔" enable_signup_cta: "واپس آنے والے گمنام صارفین کو ایک نوٹس دکھائیں جو اُنہیں اکاؤنٹ بنانے کیلۓ قائل کرے۔" @@ -1412,6 +1430,7 @@ ur: min_trust_to_send_messages: "نئے ذاتی پیغامات بنانے کیلئے کم از کم مطلوبہ ٹرسٹ لَیول۔" min_trust_to_flag_posts: "پوسٹس فلَیگ کرنے کیلئے کم از کم مطلوبہ ٹرسٹ لَیول" min_trust_to_post_links: "پوسٹس میں لِنکس شامل کرنے کیلئے کم از کم مطلوبہ ٹرسٹ لَیول۔" + allowed_link_domains: "ڈَومَین جو صارفین لنک کر سکتے ہیہں اگرچہ اُن کے پاس لنکس پوسٹ کرنے کیلئے مناسب ٹرسٹ لَیول نہ ہو۔" newuser_max_links: "ایک نیا صارف ایک پوسٹ میں کتنے لِنکس شامل کر سکتا ہے۔" newuser_max_attachments: "ایک نیا صارف ایک پوسٹ میں کتنی اٹیچمنٹس شامل کر سکتا ہے۔" newuser_max_mentions_per_post: "@نام اطلاعات کی زیادہ سے زیادہ تعداد جو ایک نیا صارف ایک پوسٹ میں استعمال کر سکتا ہے۔" @@ -1434,6 +1453,7 @@ ur: desktop_category_page_style: " /categories صفحے کیلئے بصری سٹائل۔" category_colors: "زُمرہ جات کیلئے ہیکسا ڈَیسیمل رنگوں کے اقدار کی ایک فہرست۔" category_style: "زُمرہ بیَجوں کیلئے بصری سٹائل۔" + dark_mode_none: "کوئی نہیں" max_attachment_size_kb: "kB میں اٹیچمنٹ فائل اَپ لوڈ کا زیادہ سے زیادہ سائز۔ یہ اِنجَن٘ اَیکس (client_max_body_size) / اَپَیچی یا پراکسی میں بھی ترتیب دیا جانا لازمی ہے۔" authorized_extensions: "اپ لوڈ کیلئے اجازت یافتہ فائل اَیکسٹَینشَنز کی فہرست (تمام فائل اقسام کی اجازت دینے کیلئے '*' کا استعمال کریں)" authorized_extensions_for_staff: "سٹاف صارفین کیلئے `authorized_extensions` سائٹ ترتیب میں بیان کردہ فہرست کے علاوہ اَپ لوڈ کیلئے اجازت یافتہ فائل اَیکسٹَینشَنز کی فہرست۔ (تمام فائل اقسام کی اجازت دینے کیلئے '*' کا استعمال کریں)" @@ -1459,6 +1479,7 @@ ur: privacy_policy_url: "اگر آپ کے پاس ایک نجی معلومات کی حفاظتی پالیسی کی دستاویز کسی اور جگہ پر ہَوسٹ کی ہوئی ہے جو آپ استعمال کرنا چاہتے ہیں، تو یہاں مکمل URL فراہم کریں۔" log_anonymizer_details: "کیا آیک صارف کو گمنام بنانے کے بعد اُس کی تفصیلات رکھی جائیں کہ نہیں۔ GDPR کے ساتھ تعمیل کرتے وقت آپ کو اِسے بند کر دینے کی ضرورت ہوگی۔" newuser_spam_host_threshold: "ایک نیا صارف کتنی دفعہ ایک ہی ہَوسٹ کا لِنک اپنی `newuser_spam_host_threshold` پوسٹس کے اندر شائع کر سکتا ہے، اِس سے پہلے کہ وہ سپَیم سمجھا جائے۔" + allowed_spam_host_domains: "ڈومَینز کی فہرست جو سپیم ہَوسٹ کی جانچ پڑتال سے خارج ہے۔ نئے صارفین کو اِن ڈومینز کے لِنکس کے ساتھ پوسٹ بنانے سے کبھی روکا نہیں جائے گا۔" topic_view_duration_hours: "ہر ن گھنٹوں پر فی IP/صارف ایک نیا ٹاپک وِیو شمار کریں" user_profile_view_duration_hours: "ہر ن گھنٹوں پر فی IP/صارف ایک نیا صارف پروفائل وِیو شمار کریں" levenshtein_distance_spammer_emails: "سپَیمر ای میل کو مَیچ کرتے وقت، فرق حروف کی تعداد جس پر بھی ایک فزِّی میچ ہو سکے گا۔" @@ -1472,6 +1493,7 @@ ur: min_first_post_typing_time: "ایک صارف پہلی پوسٹ کے دوران ملی سیکنڈوں میں کم از کم کتنا وقت ٹائپ کرے، اگر حد پوری نہ ہو تو پوسٹ خود بخود منظوری کی ضرورت کی قطار میں داخل کر دی جائے گی۔ غیر فعال کرنے کیلئے 0 سَیٹ کریں (غیر تجویز کردہ)" auto_silence_fast_typers_on_first_post: "صارفین کو خود بخود خاموش کر دیں جو min_first_post_typing_time کو پورا نہیں کرتے" auto_silence_fast_typers_max_trust_level: "تیز رفتار ٹائپرز کو خود بخود خاموش کرنے کیلئے زیادہ سے زیادہ ٹرسٹ لَیول" + auto_silence_first_post_regex: "کَیس کے حساب سے غیر حساس رَیج اَیکس جو اگر مَیچ کر جائے تو صارف کی طرف سے پہلی پوسٹ خاموش کر دی جائے گی اور منظوری کی قطار میں بھیج دی جائے گی۔ مثال: raging|a[bc]a تمام raging یا aba یا aca پر مشتمل پوسٹس کو پہلے پر خاموش کر دیے جانے کا سبب بن جائے گا۔ صرف پہلی پوسٹ پر لاگو ہوتا ہے۔" reviewable_claiming: "قابل تجدید مواد پر عمل کیے جانے سے پہلے، کیا اُس کا کََلیم کیا جانا ضروری ہے؟" reviewable_default_topics: "ڈیفالٹ کے طور پر ٹاپک کے حساب سے گروپ کردہ قابل تجدید مواد دکھائیں" reviewable_default_visibility: "قابل تجدید اشیاء نہ دکھائیں جب تک کہ وہ اِس ترجیح کو پورا نہ کریں" @@ -1491,6 +1513,7 @@ ur: max_emails_per_day_per_user: "صارفین کو فی دن بھیجی گئی ای میلز کی زیادہ سے زیادہ تعداد۔ حد کو غیر فعال کرنے کیلئے 0" enable_staged_users: "آنے والی ای میلز سے نمٹتے وقت خود کار طریقے سے سٹَیجڈ صارفین بنائیں۔" maximum_staged_users_per_email: "آنے والی ایک ای میل سے نمٹتے وقت تشکیل کردہ سٹَیجڈ صارفین کی زیادہ سے زیادہ تعداد۔" + auto_generated_allowlist: "ای میل پتوں کی فہرست جو خود کار طریقہ سے تخلیق شدہ مواد کیلئے چیک نہیں کیے جائیں گے۔ مثال: foo@bar.com|discourse@bar.com" block_auto_generated_emails: "آنے والی ای میلز جو خود کار طریقہ سے تخلیق شدہ کے طور پر شناخت کی گئی ہوں، اُن کو خود بخود بلاک کریں۔" ignore_by_title: "اُن کے عنوان کی بَیس پر آنے والی ای میلز کو نظر انداز کریں۔" mailgun_api_key: "وَیب ھُوک٘ پیغامات کی توثیق کیلئے استعمال ہونے والی مَیلگَن سیکرٹ API کلید۔" @@ -1557,6 +1580,7 @@ ur: ignored_users_count_message_threshold: "اتنے صارفین کی طرف سے کسی خاص صارف کو نظر انداز کیے جانے پر ماڈریٹرز کو مطلع کریں۔" ignored_users_message_gap_days: "کئی صارفین کی طرف سے نظر انداز کیے جانے والے ایک صارف کے بارے میں ماڈریٹرز کو دوبارہ مطلع کرنے سے پہلے کتنا انتظار کریں۔" clean_up_inactive_users_after_days: "دنوں کی تعداد جس کے بعد غیر متحرک صارف (ٹرسٹ لَیول 0 کسی بھی اشاعت کے بغیر) ہٹا دیا جائے گا۔ ہٹا دینا غیر فعال کرنے کیلئے 0 پر سَیٹ کریں۔" + allowed_user_website_domains: "اِن ڈومینز کے ساتھ صارف ویب سائٹ کی تصدیق کی جائے گی۔ پائپ کے ساتھ الگ کی گئی فہرست۔" allow_profile_backgrounds: "صارفین کو پروفائل پسِ منظر اَپ لوڈ کرنے کی اجازت دیں۔" sequential_replies_threshold: "ایک ہی ٹاپک میں لگاتار کتنی پوسٹس ایک صارف شائع کرے اِس سے پہلے کہ اُسے بہت زیادہ لگاتار جوابات ہونے کی یاد دہانی کرائی جائے۔" get_a_room_threshold: "انتباہ کرا دینے سے پہلے صارف ایک ہی ٹاپک میں ایک ہی شخص کیلئے کتنی پوسٹس شائع کرے۔" @@ -1591,6 +1615,7 @@ ur: embed_topics_list: "ٹاپکس فہرستوں میں HTML شامل کرنے کی اجازت دیں" embed_truncate: "اَیمبَیڈ کی گئی پوسٹس کو تراشیں۔" embed_support_markdown: "اَیمبَیڈ کردہ پوسٹس کیلئے مارکڈائون کی اجازت دیں۔" + allowed_embed_selectors: "علاماتِ وقف سے علیحدہ کردہ CSS عنصروں کی ایک فہرست جن کی اَیمبَیڈز میں اجازت ہے۔" allowed_href_schemes: "http اور https کے علاوہ لِنکس میں اجازت دی گئی اسکیمز۔" embed_post_limit: "اَیمبَیڈ کیے جانے والی پوسٹس کی زیادہ سے زیادہ تعداد۔" embed_username_required: "ٹاپک کی تخلیق کیلئے صارف نام ضروری ہے۔" @@ -1702,8 +1727,14 @@ ur: max_username_length_exists: "آپ صارف نام کی زیادہ سے زیادہ لمبائی، سب سے طویل صارف نام کی لمبائی سے کم مقرر نہیں کرسکتے (%{username})۔" max_username_length_range: "آپ زیادہ سے زیادہ، کم از کم سے نیچے مقرر نہیں کرسکتے۔" invalid_hex_value: "رنگ اقدار کا 6-عددی ہیکسا ڈَیسیمل کوڈ ہونا ضروری ہے۔" + allowed_unicode_usernames: + regex_invalid: "رَیگولر اَیکسپرَیشَ غلط ہے: %{error}" + leading_trailing_slash: "رَیگولر اَیکسپرَیشَ ایک سلیش کے ساتھ شروع اور ختم نہیں ہونا چاہئیے۔" unicode_usernames_avatars: "اندرونی سسٹم کے اوتار یونیکَوڈ صارف ناموں کی کفالت نہیں کرتے۔" list_value_count: "فہرست میں بالکل %{count} قدر کا ہونا لاذمی ہے۔" + placeholder: + discourse_connect_provider_secrets: + key: "www.example.com" search: extreme_load_error: "سائٹ پر انتہائی بوجھ ہے، سرچ غیر فعال ہے، بعد میں دوبارہ کوشش کریں" within_post: "%{username} کی طرف سے #%{post_number}" @@ -1712,6 +1743,14 @@ ur: topic: "نتائج" user: "صارفین" results_page: "'%{term}' کیلئے سرچ کے نتائج" + discourse_connect: + login_error: "لاگ اِن خرابی" + not_found: "آپ کا اکاؤنٹ نہیں مل سکا۔ براہ مہربانی سائٹ کے ایڈمِنِسٹریٹر سے رابطہ کریں۔" + account_not_approved: "آپ کے اکاؤنٹ کی منظوری زیر التواء ہے۔ منظوری ملنے پر آپ کو ایک ای میل اطلاع موصول ہو گی۔" + unknown_error: "آپ کے اکاؤنٹ کے ساتھ ایک مسئلہ درپیش ہے۔ براہ مہربانی سائٹ کے ایڈمِنِسٹریٹر سے رابطہ کریں۔" + timeout_expired: "اکاؤنٹ لاگ اِن کا وقت ختم ہوگیا، براہ مہربانی دوبارہ لاگ اِن کرنے کی کوشش کریں۔" + no_email: "کوئی ای میل پتہ فراہم نہیں گیا تھا۔ براہ مہربانی سائٹ کے ایڈمِنِسٹریٹر سے رابطہ کریں۔" + email_error: "%{email} ای میل ایڈریس کے ساتھ اکاؤنٹ رجسٹر نہیں کیا جا سکا ۔ براہ مہربانی سائٹ کے ایڈمِنِسٹریٹر سے رابطہ کریں۔" original_poster: "اصل پوسٹ کرنے والا" most_posts: "سب سے زیادہ پوسٹس" most_recent_poster: "سب سے حالیہ پوسٹ کرنے والا" @@ -2026,6 +2065,8 @@ ur: کمیونٹی نے اِس پوسٹ کو فلَیگ کیا اور اب یہ چھپائی جا چکی ہے۔ **کیونکہ یہ پوسٹ ایک سے زائد مرتبہ چھپائی گئی ہے، اب آپ کی پوسٹ سٹاف کی طرف سے نمٹائے جانے تک چھپی رہے گی۔** اضافی رہنمائی کیلئے، براہ کرم ہماری [کمیونٹی کی رہنما ہدایات](%{base_url}/guidelines) دیکھیے۔ + queued_by_staff: + title: "پوسٹ کو منظوری کی ضرورت ہے" flags_disagreed: title: "فلَیگ کردہ پوسٹ سٹاف کی طرف سے بحال کر دی گئی" subject_template: "فلَیگ کردہ پوسٹ سٹاف کی طرف سے بحال کر دی گئی" @@ -2722,6 +2763,9 @@ ur: confirm_new_email: title: "نئے ای میل کی تصدیق کریں" subject_template: "[%{email_prefix}] اپنے نئے ای میل ایڈریس کی تصدیق کریں" + confirm_new_email_via_admin: + title: "نئے ای میل کی تصدیق کریں" + subject_template: "[%{email_prefix}] اپنے نئے ای میل ایڈریس کی تصدیق کریں" confirm_old_email: title: "پرانی ای میل تصدیق" subject_template: "[%{email_prefix}] اپنا موجودہ ای میل ایڈریس تصدیق کریں" @@ -2793,6 +2837,8 @@ ur: اگر یہ آپ ہی تھے، بہت خوب! آپ کو کچھ مزید کرنے کی ضرورت نہیں ہے۔ اگر یہ آپ نہیں تھے، تو براہ کرم [اپنے موجودہ سیشنوں کا جائزہ لیں](%{base_url}/my/preferences/account) اور اپنا پاسورڈ تبدیل کرنے پر غور کیجیے۔ + post_approved: + title: "آپ کی پوسٹ منظور ہو گئی تھی" page_not_found: title: "افوہ! وہ صفحہ موجود نہیں یا ذاتی ہے۔" popular_topics: "مقبول" @@ -2864,6 +2910,7 @@ ur: latte: "لا ٹَیے" summer: "موسمِ گرما" dark_rose: "گہرا گلابی" + default_theme_name: "ڈِیفالٹ" light_theme_name: "لائٹ" dark_theme_name: "ڈارک" neutral_theme_name: "نیوٹرل" @@ -3422,6 +3469,12 @@ ur: city_for_disputes: label: "تنازعات کیلئے شہر" placeholder: "سان فرانسِسکو، کَیلیفَورنیا" + colors: + title: "رنگ" + fonts: + fields: + font_preview: + label: "پیشگی دیکھیں" logos: title: "لَوگَو" fields: @@ -3507,6 +3560,7 @@ ur: trust_level: "کم ٹرسٹ لَیول پر صارفین کے جوابات کو سٹاف کی طرف سے منظور کیا جانا ضروری ہے۔ دیکھیے `approve_unless_trust_level`۔" new_topics_unless_trust_level: "کم ٹرسٹ لَیول پر صارفین کے ٹاپکس کو سٹاف کی طرف سے منظور کیا جانا ضروری ہے۔ دیکھیے `approve_new_topics_unless_trust_level`۔" fast_typer: "نِے صارف نے اپنی پہلی اشاعت مشکوک حد تک جلدی لکھی، مشتبہ بَوٹ یا سپَیمر رویہ۔ دیکھیے `min_first_post_typing_time`۔" + auto_silence_regexp: "نیا صارف جس کی پہلی اشاعت `auto_silence_first_post_regex` ترتیب سے ملتی ہے۔" staged: "سٹَیجڈ صارفین کیلئے نئے ٹاپکس اور پوسٹس کو سٹاف کی طرف سے منظور کیا جانا ضروری ہے۔ دیکھیے `approve_unless_staged`۔" category: "اِس زُمرہ میں پوسٹس کو سٹاف کی طرف سے دستی منظوری کی ضرورت ہوتی ہے۔ زُمرہ کی ترتیبات دیکھیے۔" must_approve_users: "تمام نئے صارفین کو سٹاف کی طرف سے منظور کیا جانا ضروری ہے۔ دیکھیے `must_approve_users`۔" diff --git a/config/locales/server.vi.yml b/config/locales/server.vi.yml index 0a815c03d4225..a1436e652d584 100644 --- a/config/locales/server.vi.yml +++ b/config/locales/server.vi.yml @@ -154,6 +154,8 @@ vi: other: "Xin lỗi, chúng tôi không thể tạo bản xem trước cho trang web này vì không thể tìm thấy các thẻ oEmbed / OpenGraph sau: %{missing_attributes}" invite: user_exists: "Không cần mời %{email}, họ đã có tài khoản!" + disabled_errors: + invalid_access: "Bạn không được phép xem tài nguyên đã yêu cầu." topic_invite: user_exists: "Xin lỗi, thành viên này đã được mời. Bạn chỉ có thể mời một người dùng đến một chủ đề một lần." backup: @@ -179,6 +181,8 @@ vi: permalink: "Liên kết cố định" imported_from: "Đây là cuộc thảo luận đi kèm chủ đề gốc tại %{link}" in_reply_to: "▶ %{username}" + replies: + other: "%{count} trả lời" created: "Tạo bởi" no_mentions_allowed: "Xin lỗi, bạn không thể nhắc tới thành viên khác." too_many_mentions: @@ -207,6 +211,8 @@ vi: topics_in_category: "Các chủ đề ở chuyên '%{category}'" rss_posts_in_topic: "Nguồn cấp dữ liệu RSS của '%{topic}'" rss_topics_in_category: "Nguồn cấp dữ liệu RSS của các chủ đề trong chuyên mục '%{category}'" + rss_num_posts: + other: "%{count} bài viết" read_full_topic: "Đọc toàn bộ chủ đề" private_message_abbrev: "Tin nhắn" rss_description: @@ -224,6 +230,8 @@ vi: bookmarks: reminders: at_desktop: "Lần sau tôi ở máy tính để bàn của tôi" + later_today: "Sau ngày hôm nay" + next_business_day: "Ngày làm việc tiếp theo" tomorrow: "Ngày mai" next_week: "Tuần tới" next_month: "Tháng t" @@ -237,6 +245,8 @@ vi: invalid_incoming_email: "'%{email}' không phải là email hợp lệ." email_already_used_in_group: "'%{email}' đã được sử dụng trong nhóm '%{group_name}'." email_already_used_in_category: "'%{email}' đã được sử dụng trong danh mục '%{category_name}'." + adding_too_many_users: + other: "Có thể thêm tối đa %{count} người dùng cùng một lúc" default_names: everyone: "Mọi người" admins: "quản trị" @@ -520,6 +530,9 @@ vi: title: "Thích" description: "Thích bài viết này" short_description: "Thích bài viết này" + user_activity: + no_bookmarks: + self: "Bạn không có bài viết nào được đánh dấu; dấu trang cho phép bạn nhanh chóng tham khảo các bài viết cụ thể." topic_flag_types: spam: title: "Rác" @@ -558,6 +571,7 @@ vi: every_month: "mỗi tháng" every_six_months: "mỗi sáu tháng" user_api_key: + read: "đã đọc" otp_confirmation: confirm_title: Tiếp tục tới %{site_name} logging_in_as: Đăng nhập bằng %{username} @@ -659,6 +673,7 @@ vi: title: "Lượt thích" xaxis: "Ngày" yaxis: "Số lượt thích mới" + description: "Số lượt thích mới." flags: title: "Dấu cờ - Flags" xaxis: "Ngày" @@ -672,6 +687,7 @@ vi: xaxis: "Bậc tin tưởng" yaxis: "Số thành viên" description: "Số lượng thành viên được nhóm theo mức độ tin cậy." + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: title: "Người dùng mỗi loại" xaxis: "Loại" @@ -682,6 +698,7 @@ vi: admin: Quản trị moderator: Điều hành suspended: Đã tạm khóa + silenced: Im lặng description: "Số thành viên được nhóm bởi quản trị viên, điều hành viên, đã tạm ngưng và im lặng." trending_search: title: Xu hướng tìm kiếm @@ -816,6 +833,7 @@ vi: top_uploads: labels: filename: Tên tập tin + author: Tác giả dashboard: rails_env_warning: "Máy chủ của bạn đang chạy trong chế độ %{env}." host_names_warning: "Cài đặt của bạn config/database.yml đang sử dụng hostname mặc định. Cập nhật lại để sử dụng hostname của bạn" @@ -889,6 +907,7 @@ vi: post_undo_action_window_mins: "Số phút thành viên được phép làm lại các hành động gần đây với bài viết (like, đánh dấu...)." pending_users_reminder_delay: "Thông báo cho quản trị viên nếu thành viên mới đã chờ duyệt lâu hơn số giờ được thiết lập ở đây, đặt là -1 để tắt thông báo." cors_origins: "Cho phép CORS (Cross-Origin Requests). Mỗi nguyên gốc phải kèm theo http:// hoặc https://. Biến env DISCOURSE_ENABLE_CORS phải được đặt là 'true' để bật CORS." + use_admin_ip_allowlist: "Admin chỉ có thể đăng nhập nếu có địa chỉ IP được định nghĩa trước trong danh sách Screened IPs (Admin > Logs > Screened Ips)." invalidate_inactive_admin_email_after_days: "Các tài khoản quản trị viên chưa truy cập trang web trong số ngày này sẽ cần xác thực lại địa chỉ email của họ trước khi đăng nhập. Đặt thành 0 để tắt." top_menu: "Xác định các mục nào hiển thị trong thanh điều hướng trang chủ, và theo thứ tự nào. Ví dụ latest|new|unread|categories|top|read|posted|bookmarks" post_menu: "Xác định các mục nào hiển thị trên menu bài viết, và theo thứ tự nào. Ví dụ like|edit|flag|delete|share|bookmark|reply" @@ -907,6 +926,8 @@ vi: prioritize_username_in_ux: "Hiển thị tên người dùng đầu tiên trên trang người dùng, thẻ người dùng và bài đăng (khi tên bị vô hiệu được hiển thị trước)" 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ờ." enable_badges: "Kích hoạt hệ thống huy hiệu" + blocked_email_domains: "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 \"|\"." + allowed_email_domains: "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ý!" log_out_strict: "Khi đăng xuất, đăng xuất TẤT CẢ session cho tất cả thiế bị" new_version_emails: "Gửi email đến địa chỉ contact_email khi có phiên bản Discourse mới." invite_expiry_days: "Key mời người dùng có giới hạn bao lâu? tính theo ngày" @@ -955,6 +976,7 @@ vi: s3_cdn_url: "CDN URL được sử dụng cho tất cả các tài nguyên S3 (vd: https://cdn.somewhere.com). CHÚ Ý: sau khi thay đổi thiết lập này bạn phải tạo lại các bài viết cũ." avatar_sizes: "Danh sách những kích thước hình đại diện tự động khởi tạo." external_system_avatars_enabled: "Sử dụng dịch vụ ảnh đại diện bên ngoài." + selectable_avatars: "Danh sách ảnh đại diện mà người dùng có thể chọn." allow_all_attachments_for_group_messages: "Cho phép các email có đính kèm trong tin nhắn nhóm." default_invitee_trust_level: "Bậc tin tưởng mặc định (0-4) cho thành viên được mời." default_trust_level: "Cấp độ tin cậy mặc định (0-4) cho tất cả các thành viên mới. CHÚ Ý! Thay đổi thiết lập này sẽ đặt bạn vào nguy cơ spam cao." @@ -1001,6 +1023,7 @@ vi: min_title_similar_length: "Chiều dài tối thiểu của tiêu đề trước khi kiểm tra trùng chủ đề." category_colors: "Danh sách mã màu hexa cho phép cho danh mục." category_style: "Style trực quan cho phù hiệu danh mục." + dark_mode_none: "Không có gì" max_attachment_size_kb: "Kích thước file tải lên tối đa tính theo kB. đã cấu hình trong nginx (client_max_body_size) / apache hoặc proxy." authorized_extensions: "Danh sách định dạng file cho phép tải lên (sử dụng '*' để cho phép tất cả loại tập tin)" max_similar_results: "Số lượng chủ đề tương tự hiển thị phía trên bộ soạn thảo khi soạn chủ đề mới, so sánh dựa trên tiêu đề và nội dung." @@ -1020,6 +1043,7 @@ vi: faq_url: "Nếu bạn có một địa chỉ FAQ muốn sử dụng, điền URL đầy đủ ở đây." tos_url: "Nếu bạn có một địa chỉ Quy Định Sử Dụng muốn sử dụng, điền URL đầy đủ ở đây." privacy_policy_url: "Nếu bạn có một địa chỉ Quyền Riêng Tư muốn sử dụng, điền URL đầy đủ ở đây." + allowed_spam_host_domains: "Danh sách tên miền sẽ được miễn trừ khỏi kiểm tra spam. Thành viên mới sẽ không bị giới hạn khi tạo bài viết có chứa liên kết từ các tên miền này." topic_view_duration_hours: "Đếm lượt xem chủ đề mới một lần cho mỗi IP/User trong N giờ" user_profile_view_duration_hours: "Đếm lượt xem hồ sơ mới một lần cho mỗi IP/User trong N giờ" levenshtein_distance_spammer_emails: "Khi phù hợp với thư rác, số ký tự khác biệt vẫn sẽ cho phép khả năng chính xác mờ." @@ -1111,6 +1135,7 @@ vi: default_other_external_links_in_new_tab: "Mặc định mở các liên kết ngoài trong thẻ mới " default_other_enable_quoting: "Bật trích dẫn trả lời để nổi bật nội dung theo mặc định." default_other_dynamic_favicon: "Hiện bộ đếm chủ đề mới/cập nhật trên icon trình duyệt theo mặc định." + default_other_skip_new_user_tips: "Bỏ qua các mẹo và huy hiệu giới thiệu người dùng mới." default_other_like_notification_frequency: "Thông báo thành viên khi like theo mặc định" default_topics_automatic_unpin: "Tự động bỏ ghim chủ đề khi thành viên xuống cuối trang theo mặc định." default_categories_watching: "Hiển thị danh sách chuyên mục đang xem theo mặc định." @@ -1149,6 +1174,11 @@ vi: topic: "Kết quả" user: "Thành viên" results_page: "Search results for '%{term}'" + discourse_connect: + not_found: "Không tìm thấy tài khoản của bạn, xin hãy liên hệ với BQT." + account_not_approved: "Tài khoản của bạn chưa được BQT chấp thuận, bạn sẽ nhận được email thông báo khi được chấp nhận." + unknown_error: "Đã có vấn đề xảy ra với tài khoản của bạn, xin hãy liên hệ với BQT." + timeout_expired: "Đăng nhập tài khoản hết hạn, xin hãy thử đăng nhập lại." original_poster: "Người viết gốc" most_posts: "Bài viết Phỏ biến" most_recent_poster: "Người Gửi Mới Đây" @@ -1193,6 +1223,12 @@ vi: autoclosed_disabled_lastpost: "Chủ đề này đã được mở. Bạn có thể bình luận" auto_deleted_by_timer: "Tự động xóa theo bộ hẹn giờ." login: + security_key_description: "Khi bạn đã chuẩn bị khóa bảo mật vật lý, hãy nhấn nút Xác thực bằng Khóa bảo mật bên dưới." + security_key_alternative: "Thử lại cách khác" + security_key_authenticate: "Xác thực bằng Khóa bảo mật" + security_key_not_allowed_error: "Quá trình xác thực khóa bảo mật đã hết thời gian chờ hoặc đã bị hủy." + security_key_no_matching_credential_error: "Không thể tìm thấy thông tin xác thực phù hợp trong khóa bảo mật được cung cấp." + security_key_support_missing_error: "Thiết bị hoặc trình duyệt hiện tại của bạn không hỗ trợ việc sử dụng khóa bảo mật. Vui lòng sử dụng một phương pháp khác." not_approved: "Tài khoản của bạn chưa được kiểm duyệt. Bạn sẽ nhận được email thông báo khi bạn được phép đăng nhập." incorrect_username_email_or_password: "Không đúng tài khoản, email hoặc mật khẩu" wait_approval: "Cảm ơn bạn đã đăng ký. Chúng tôi sẽ thông báo sau khi tài khoản của bạn được kiểm duyệt." @@ -1378,6 +1414,8 @@ vi: ignored: "Cảm ơn đã cho chúng tôi biết thông tin. Chúng tôi đang xem xét nó." ignored_and_deleted: "Cảm ơn bạn đã cho chúng tôi biết, chúng tôi đã gỡ bỏ bài viết." system_messages: + queued_by_staff: + title: "Bài viết cần phê duyệt" flags_disagreed: title: "Nhân viên đã khôi phục bài đăng bị gắn cờ" subject_template: "Nhân viên đã khôi phục bài đăng bị gắn cờ" @@ -1698,6 +1736,8 @@ vi: subject_template: "Bạn đã được kiểm duyệt ở %{site_name}!" suspicious_login: subject_template: "[%{site_name}] Đăng nhập mới từ %{location}" + post_approved: + title: "Bài đăng của bạn đã được phê duyệt" page_not_found: title: "Rất tiếc! Địa chỉ này không tồn tại hoặc riêng tư." popular_topics: "Phổ biến" @@ -1742,6 +1782,7 @@ vi: sender_body_blank: "nội dung rỗng" color_schemes: base_theme_name: "Cơ bản" + default_theme_name: "Mặc định" edit_this_page: "Sửa trang này" csv_export: boolean_yes: "Đồng ý" @@ -1915,6 +1956,8 @@ vi: tags: title: "Thẻ" finish_installation: + register: + button: "Đăng ký" resend_email: title: "Gửi lại email kích hoạt" wizard: @@ -1935,9 +1978,17 @@ vi: contact_email: placeholder: "name@example.com" description: "Địa chỉ email của người hoặc nhóm chịu trách nhiệm về cộng đồng này. Được sử dụng cho các thông báo quan trọng như cờ chưa được xử lý, cập nhật bảo mật và trên trang giới thiệu của bạn để liên hệ khẩn cấp với cộng đồng." + contact_url: + placeholder: "https://www.example.com/contact-us" corporate: title: "Công ty" description: "Thông tin này sẽ được nhập vào Điều khoản dịch vụ của bạn, đây là một chủ đề bạn có thể chỉnh sửa trong danh mục Nhân viên. Nếu bạn không có một công ty, hãy bỏ qua bước này ngay bây giờ." + colors: + title: "Màu sắc" + fonts: + fields: + font_preview: + label: "Xem trước" homepage: fields: homepage_style: @@ -1959,15 +2010,23 @@ vi: replied: '%{username} trả lời cho bạn trong "%{topic}" - %{site_title}' posted: '%{username} gửi bài trong "%{topic}" - %{site_title}' linked: '%{username} liên quan đến bài viết của bạn từ "%{topic}" - %{site_title}' + watching_first_post: '%{username} đã tạo một chủ đề mới "%{topic}" - %{site_title}' + confirm_title: "Đã bật thông báo - %{site_title}" + confirm_body: "Sự thành công! Thông báo đã được kích hoạt." custom: "Thông báo từ %{username} trên %{site_title}" staff_action_logs: user_merged: "%{username} đã được hợp nhất vào tài khoản này" webhook_deactivation_reason: "Webhook của bạn đã tự động bị vô hiệu hóa. Chúng tôi đã nhận được nhiều phản hồi lỗi trạng thái HTTP '%{status}'." + api_key: + revoked: Đã thu hồi reviewables: priorities: + low: "Thấp" medium: "Trung bình" high: "Cao" sensitivity: + disabled: "Khóa" + low: "Thấp" medium: "Trung bình" high: "Cao" conflict: "Đã có xung đột cập nhật ngăn bạn làm điều đó." @@ -1976,6 +2035,8 @@ vi: actions: agree_and_suspend: title: "Tạm khóa Thành viên" + agree_and_silence: + title: "Người dùng im lặng" delete_spammer: title: "Xóa người Spam" delete_single: diff --git a/config/locales/server.zh_TW.yml b/config/locales/server.zh_TW.yml index 038632279deed..ca643bde6d521 100644 --- a/config/locales/server.zh_TW.yml +++ b/config/locales/server.zh_TW.yml @@ -39,6 +39,7 @@ zh_TW: title: "論壇" topics: "討論話題" posts: "貼文" + views: "瀏覽" loading: "載入中" powered_by_html: 'Powered by Discourse, 建議開啟 JavaScript 瀏覽' sign_up: "註冊" @@ -50,6 +51,8 @@ zh_TW: remove_posts_deleted_by_author: "已由作者刪除" redirect_warning: "我們無法確認您選擇的連結是否已被發送到論壇上,若您想繼續此動作,選擇以下的連結。" on_another_topic: "在另一個話題中" + inline_oneboxer: + topic_page_title_post_number_by_user: "#%{post_number} %{username}" themes: bad_color_scheme: "無法更新佈景主題,無效的調色盤" other_error: "更新佈景主題時發生了錯誤" @@ -166,6 +169,8 @@ zh_TW: invite: user_exists: "無需邀請 %{email},他 已經有帳號了!" confirm_email: "

快完成了!我們發送了一封啟用帳號郵件到你的信箱。請按照信件中的步驟來啟用你的帳號。

如果你沒有收到郵件,請檢查你的垃圾郵件\\b匣。" + disabled_errors: + invalid_access: "你不允許查看所請求的資源。" bulk_invite: file_should_be_csv: "上傳的檔案必須是 CSV 格式。" error: "上傳檔案有錯誤,請再試一次。" @@ -217,6 +222,8 @@ zh_TW: in_reply_to: "▶ %{username}" replies: other: "%{count}個回覆" + likes: + other: "%{count}個讚" created: "已建立" no_mentions_allowed: "抱歉,您無法提及其他使用者。" too_many_mentions: @@ -249,6 +256,8 @@ zh_TW: topics_in_category: "分類 '%{category}' 中的討論話題" rss_posts_in_topic: "'%{topic}' 的 RSS feed" rss_topics_in_category: "分類 '%{category}' 中討論話題的 RSS feed" + rss_num_posts: + other: "%{count} 則貼文" read_full_topic: "閱讀整個話題" private_message_abbrev: "消息" rss_description: @@ -278,6 +287,7 @@ zh_TW: tomorrow: "明天" next_week: "下週" next_month: "下個月" + custom: "自定義日期和時間" groups: errors: grant_trust_level_not_valid: "'%{trust_level}' 不是有效的信任層級。" @@ -874,6 +884,7 @@ zh_TW: labels: level: 等級 description: "按信任層級分類的使用者數" + description_link: "https://blog.discourse.org/2018/06/understanding-discourse-trust-levels/" users_by_type: title: "每個類型的使用者" xaxis: "類型" @@ -1135,6 +1146,8 @@ zh_TW: show_pinned_excerpt_mobile: "在行動版置頂主題顯示摘要。" show_pinned_excerpt_desktop: "在桌面版置頂主題顯示摘要。" post_onebox_maxlength: "展開連結預覽後的 Discourse 貼文最大字數限制。" + blocked_onebox_domains: "不會展開成連結預覽的網域列表。" + allowed_inline_onebox_domains: "如果連結未包含 title,會被展開成連結預覽的網域白名單。" max_oneboxes_per_post: "貼文中允許的連結預覽數量上限。" logo: "網站左上角的Logo圖片,圖片高為120、寬高比大於3:1的寬矩形比例。 如果沒有設定 Logo,將顯示網站標題。" logo_small: "當你滾動頁面往下滑時,可看見在網站左上角的 Logo圖片,Logo 應為正方形 120x120尺寸。若無設定Logo,將顯示主頁圖片。" @@ -1182,7 +1195,11 @@ zh_TW: maximum_session_age: "使用者自訪問後可維持登錄 n 小時" enable_escaped_fragments: "如未偵測到爬蟲,將會使用 Google Ajax-Crawling API。參閱https://developers.google.com/webmasters/ajax-crawling/docs/learn-more" cors_origins: "允許跨來源資源共享(CORS)。每個來源必須包括 http:// 或 https://。DISCOURSE_ENABLE_CORS 環境選項必須設置為 true 才能啟用 CORS 。" + use_admin_ip_allowlist: "當目前的IP剛好處于IP段禁止名單(Admin > Logs > Screened Ips)中的時候,只有管理員才可登入。" + blocked_ip_blocks: "Discourse 將不會使用爬蟲爬私人IP黑名單清單。" + allowed_internal_hosts: "Discourse 可以安全抓取以用於 Onebox 與其他用途的內部主機列表" allowed_iframes: "允許 Discourse 可以在貼文中安全發布含有 iframe 及 src 網域前綴列表" + allowed_crawler_user_agents: "使用者代理(User Agents)的網路爬蟲(Web Crawlers)將允許存取網站。警告!設置此將取消未列出的所有網路爬蟲者(Web Crawlers)" slow_down_crawler_user_agents: "網路爬蟲的使用者代理,應使用 Crawl-delay 指令在 robots.txt 中進行速率限制" slow_down_crawler_rate: "如果指定了slow_down_crawler_user_agents,則此速率將適用於所有抓取工具(請求之間的延遲秒數)" content_security_policy: "啟用內容安全性政策" @@ -1212,6 +1229,8 @@ zh_TW: email_token_valid_hours: "\"忘記密碼\" / \"重啟帳號\" token 有效的小時數 (n)" enable_badges: "啟用勳章系統" enable_whispers: "允許工作人員在主題中私密交流。" + blocked_email_domains: "用管道符“|”分隔的郵箱域名黑名單列表,其中的域名將不能用來註冊賬戶,例如:mailinator.com|trashmail.net" + allowed_email_domains: "用管道符“|”分隔的電子郵箱域名的列表,使用者必須使用這些郵箱域名註冊。警告:使用者使用不包含在這個列表裡的郵箱域名,將無法成功註冊。" hide_email_address_taken: "註冊或忘記密碼時,不提示使用者帳號、Email 已存在" log_out_strict: "登出時,登出使用者所有設備上的所有時段" version_checks: "當 Discourse 有推新的版本需要更新時,顯示在 /admin/Dashboard 上以提示管理員" @@ -1227,6 +1246,7 @@ zh_TW: min_admin_password_length: "管理員最短密碼長度" password_unique_characters: "密碼必須包含英文字" block_common_passwords: "不允許使用 10,000 個最常用的密碼" + discourse_connect_overrides_bio: "在使用者頁面中覆蓋使用者的個人信息並禁止使用者修改" enable_local_logins_via_email: "允許使用者用電子郵件來快速登入,Email內會包含一鍵登入連結。" allow_new_registrations: "允許新使用者註冊,如果取消選取,則沒有人能夠註冊" enable_signup_cta: "顯示推薦創建賬戶的提示給那些回訪的未註冊使用者。" @@ -1338,6 +1358,7 @@ zh_TW: min_trust_to_send_messages: "建立新個人訊息所需的最低信任等級" min_trust_to_flag_posts: "投訴話題所需的最低信任等級" min_trust_to_post_links: "在貼文中加入連結的最低信任等級需求" + allowed_link_domains: "使用者可能會連結到的網域(Domains),即使他們沒有適當的信任等級來發布貼文連結" newuser_max_links: "新使用者可添加多少連結於一篇貼文中" newuser_max_attachments: "新使用者可添加多少附件於一篇貼文中" newuser_max_mentions_per_post: "新使用者可以在一個貼文裡使用@name提及的最大數量。" @@ -1360,6 +1381,7 @@ zh_TW: desktop_category_page_style: "/categories 頁面的視覺樣式。" category_colors: "設定分類顏色的十六進制色彩值列表。" category_style: "分類圖標的視覺樣式。" + dark_mode_none: "無" max_attachment_size_kb: "允許使用者上傳的最大文件大小(以kB為單位)。確保也在nginx(client_max_body_size),apache 或代理中進行限制文件大小的設定。" authorized_extensions: "允許上傳文件的副檔名列表('*' 表示允許所有文件類型)" authorized_extensions_for_staff: "除了在“authorized_extensions” 可以設定網站可允許上傳副檔名的清單之外,也允許管理員(有權限的員工)為使用者上載檔案副檔名清單。(使用 星字號 * 以啟用所有檔案類型)" @@ -1383,6 +1405,7 @@ zh_TW: privacy_policy_url: "如果你想要使用一個部署在某個地方的隱私政策文檔,那麼請在此填寫其完整URL地址。" log_anonymizer_details: "是否在匿名後將使用者的詳細資訊保留在系統日誌(log)中。 若網站遵守一般資料保護規範(GDPR)時,您需要關閉它。" newuser_spam_host_threshold: "新使用者能添加至指向同一主機的連結的 newuser_spam_host_threshold 次數。超過閾值後將使用者視為垃圾投遞者。" + allowed_spam_host_domains: "域名的白名單列表,新使用者可以任意連結到這些主機,而不會因防止廣告的測試過濾被檔下" topic_view_duration_hours: "按照每 IP/使用者每 N 小時來記錄一次新的主題訪問" user_profile_view_duration_hours: "按照每 IP/使用者每 N 小時來記錄使用者資料訪問數" levenshtein_distance_spammer_emails: "當比對廣告Email時,數字與文字將仍使用模糊比對" @@ -1396,6 +1419,7 @@ zh_TW: min_first_post_typing_time: "使用者發表第一帖時打字的最小時間(以毫秒計),如果沒有達到該閾值,貼文將自動進入需要批准隊列。設置為 0 禁用(不推薦)" auto_silence_fast_typers_on_first_post: "自動禁言不符合min_first_post_typing_time的使用者" auto_silence_fast_typers_max_trust_level: "自動封鎖輸入過於快速的使用者的最高信任等級" + auto_silence_first_post_regex: "大小寫不相關的正則表達式,如果匹配成功,會導致該使用者不能發表第一帖,而是進入審核隊列。例如:求下載|謝謝樓[主豬],會阻止包含求下載、謝謝樓主或謝謝樓豬的話題。該選項只適用於第一篇貼文。" reviewable_claiming: "是否需要審核內容後,才能對其進行操作?" reviewable_default_topics: "預設值為顯示按討論話題分類的已審核內容" reviewable_default_visibility: "除非符合此優先等級,否則不要顯示可審閱的項目" @@ -1415,6 +1439,7 @@ zh_TW: max_emails_per_day_per_user: "每日發送給使用者的最大貼文數量。設置為 0 禁止限制" enable_staged_users: "處理進站郵件時自動創建暫存使用者。" maximum_staged_users_per_email: "處理進站郵件時可創建的最大暫存使用者量。" + auto_generated_allowlist: "不會被檢查是否是自動生成內容的郵件地址列表。例如:foo@bar.com|discourse@bar.com" block_auto_generated_emails: "阻止被檢測為自動生成的進站郵件。" ignore_by_title: "使用正則表達式根據標題忽略進站郵件。" mailgun_api_key: "用來驗證 webhook 訊息 Mailgun API 密鑰。" @@ -1478,6 +1503,7 @@ zh_TW: ignored_users_count_message_threshold: "如果特定使用者被這麽多的其他使用者忽略,則通知版主。" ignored_users_message_gap_days: "被許多使用者忽略的使用者,再次通知版主此事件需要等待的時間。" clean_up_inactive_users_after_days: "刪除尚未認證電子郵件的使用者(沒有發表任何討論主題、信任級別為0)之前的天數。要禁用自動刪除,請設定為0。" + allowed_user_website_domains: "使用者網站要屬於這些域名中。用 | 分割。" allow_profile_backgrounds: "允許使用者上傳個人檔案背景圖片" sequential_replies_threshold: "在被提醒回覆了太多連續的回覆前,使用者在主題中可以連續回覆的貼文的數量。" get_a_room_threshold: "在收到警告之前,使用者必須向同一主題中的同一個人發佈的討論話題數。" @@ -1507,6 +1533,7 @@ zh_TW: highlighted_languages: "已包含語法突顯(Syntax Highlighting)規則。(警告:包含太多語言可能會影響論壇效能)請參閱:https://highlightjs.org/static/demo看更多範例。" embed_truncate: "截斷 embed 過的貼文" embed_support_markdown: "支持嵌入式討論話題的Markdown格式" + allowed_embed_selectors: "在 embeds 頁面允許 CSS 元素以逗號分隔清單" allowed_href_schemes: "除了 http 和 https 外允許的連結協議。" embed_post_limit: "貼文內 embed 的最大數量" embed_username_required: "創建主題需要使用者名。" @@ -1615,7 +1642,13 @@ zh_TW: max_username_length_exists: "您不能設置比現有使用者名稱短的「最大使用者名稱長度」。" max_username_length_range: "您不能將上限設定的低於下限。" invalid_hex_value: "顏色值必須是6位十六進制代碼(hex codes),例如:紅色,FF0000。" + allowed_unicode_usernames: + regex_invalid: "正則表達式無效:%{error}" + leading_trailing_slash: "正則表達式不能以斜杠(/)開頭和結尾" unicode_usernames_avatars: "內部系統頭像不支援Unicode使用者名稱" + placeholder: + discourse_connect_provider_secrets: + key: "www.範例.com" search: within_post: "#%{post_number} 由 %{username}" types: @@ -1623,6 +1656,14 @@ zh_TW: topic: "結果" user: "使用者" results_page: "「%{term}」的搜尋結果" + discourse_connect: + login_error: "登入錯誤" + not_found: "無法找到你的賬戶。請聯繫站點管理人員。" + account_not_approved: "你的帳號尚未被審核通過。一旦你的帳號獲得批准,你就會收到一封電子郵件提醒。" + unknown_error: "你的賬戶發生了問題。請聯繫站點管理人員。" + timeout_expired: "賬戶登錄超時,請重新嘗試登錄。" + no_email: "沒有 email 被提供,請聯繫網站的管理員。" + email_error: "無法使用此郵件地址:%{email}註冊帳號,請聯絡此網站管理員" original_poster: "原始作者" most_posts: "大部分貼文" most_recent_poster: "當前大部分貼文作者" @@ -1880,6 +1921,8 @@ zh_TW: post_hidden_again: title: "貼文再次被隱藏" subject_template: "因社群成員投訴的關係,貼文已隱藏,已通知管理員。" + queued_by_staff: + title: "貼文需等待審核" flags_agreed_and_post_deleted: title: "被投訴貼文已被版主移除" subject_template: "被投訴貼文已被版主移除" @@ -2530,6 +2573,9 @@ zh_TW: confirm_new_email: title: "確認新郵件地址" subject_template: "[%{email_prefix}] 確認你的新郵件地址" + confirm_new_email_via_admin: + title: "確認新郵件地址" + subject_template: "[%{email_prefix}] 確認你的新郵件地址" confirm_old_email: title: "確認原郵件地址" subject_template: "[%{email_prefix}] 確認你的現行郵件地址" @@ -2572,6 +2618,8 @@ zh_TW: title: "新登入提醒" subject_template: "[%{site_name}] 新登入來自%{location}" text_body_template: "您好,\n\n我們注意到您從未知的第三方設備登入。\n\n這是你嗎? \n- 位置:%{location}(%{client_ip}) \n- 瀏覽器:%{browser} \n- 設備:%{device} - %{os}\n\n如果這是你,太棒了!你不需要做任何其他事情。如果這不是您,請[查看帳號個人檔案](%{base_url}/my /preferences/account),並考慮更改您的密碼。\n" + post_approved: + title: "你的貼文已通過" page_not_found: title: "抱歉!這個頁面不存在或者是私密的。" popular_topics: "熱門" @@ -2642,6 +2690,7 @@ zh_TW: latte: "棕色" summer: "夏季" dark_rose: "暗紅" + default_theme_name: "預設" light_theme_name: "輕亮" dark_theme_name: "黑暗" neutral_theme_name: "中性" @@ -3195,6 +3244,12 @@ zh_TW: city_for_disputes: label: "爭議" placeholder: "舊金山,加洲(California)" + colors: + title: "顏色" + fonts: + fields: + font_preview: + label: "預覽" logos: title: "標誌" fields: @@ -3280,6 +3335,7 @@ zh_TW: trust_level: "低信任等級的使用者必須擁有管理員批准,更多資訊請參閱 `approve_unless_trust_level`。" new_topics_unless_trust_level: "低信任等級的使用者必須擁有管理員批准,才可發佈討論話題,更多資訊請參閱`approve_new_topics_unless_trust_level`。" fast_typer: "新使用者輸入他們的第一個貼文,由於發送速度過快,疑似機器人或垃圾郵件發送者的行為,更多資訊請參閱`min_first_post_typing_time`。" + auto_silence_regexp: "第一個貼文與`auto_silence_first_post_regex`設定匹配相符的新使用者" staged: "分階段使用者的新討論話題及貼文,必須得到管理員的批准,更多資訊請參閱`approve_unless_staged`。" category: "在這個分類的貼文需要管理員手動批准,更多資訊請參閱分類設定(category setting)。" must_approve_users: "所有新使用者必須得到管理員的批准,更多資訊請參閱`must_approve_users`。" diff --git a/plugins/discourse-local-dates/config/locales/client.cs.yml b/plugins/discourse-local-dates/config/locales/client.cs.yml index 15368b098a084..cab5bfb3ee1bb 100644 --- a/plugins/discourse-local-dates/config/locales/client.cs.yml +++ b/plugins/discourse-local-dates/config/locales/client.cs.yml @@ -9,4 +9,5 @@ cs: discourse_local_dates: create: form: + date_title: Datum time_title: Čas diff --git a/plugins/discourse-local-dates/config/locales/client.et.yml b/plugins/discourse-local-dates/config/locales/client.et.yml index e2cf9c7403e15..b3a1f76637db9 100644 --- a/plugins/discourse-local-dates/config/locales/client.et.yml +++ b/plugins/discourse-local-dates/config/locales/client.et.yml @@ -11,3 +11,4 @@ et: form: date_title: Date time_title: Aeg + timezone: Ajavöönd diff --git a/plugins/discourse-narrative-bot/config/locales/server.ar.yml b/plugins/discourse-narrative-bot/config/locales/server.ar.yml index 42292c59771e4..84f6a1240cfd9 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.ar.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.ar.yml @@ -138,6 +138,9 @@ ar: صورة رائعة - لقد قمت بالضغط علي زر اعجبني :heart: لجعلك تعرف كم انا احبها :heart_eyes: like_not_found: |- هل نسيت ان تعجب heart: [بمنشوري](%{url}) :crying_cat_face: + likes: + not_found: |- + هل نسيت ان تعجب heart: [بمنشوري](%{url}) :crying_cat_face: formatting: instructions: |- هل تستطيع عمل بعض الكلمات **غليطة** او _مائلة_ في ردك؟ diff --git a/plugins/discourse-narrative-bot/config/locales/server.ca.yml b/plugins/discourse-narrative-bot/config/locales/server.ca.yml index a24362b49e744..02f612a3337b2 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.ca.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.ca.yml @@ -180,6 +180,9 @@ ca: Excel·lent imatge. He premut el botó 'M'agrada' :heart: perquè sapigueu que m'ha agradat molt :heart_eyes: like_not_found: |- Us heu descuidat de fer clic en 'M'agrada' :heart: en la meva [publicació?](%{url}) :crying_cat_face: + likes: + not_found: |- + Us heu descuidat de fer clic en 'M'agrada' :heart: en la meva [publicació?](%{url}) :crying_cat_face: formatting: instructions: |- ¿Podeu convertir algunes paraules en **negreta** o _cursiva_ en la vostra resposta? diff --git a/plugins/discourse-narrative-bot/config/locales/server.fa_IR.yml b/plugins/discourse-narrative-bot/config/locales/server.fa_IR.yml index df87fc1ea1441..7a36c1daa747f 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.fa_IR.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.fa_IR.yml @@ -154,6 +154,10 @@ fa_IR: like_not_found: |- آیا یادت رفت که [نوشته](%{url}) من را بپسندی؟ :crying_cat_face: + likes: + not_found: |- + آیا یادت رفت که [نوشته](%{url}) من را بپسندی؟ + :crying_cat_face: formatting: instructions: |- آیا میتوانی تعدادی کلمه را در پاسخت **ضخیم** یا _ایتالیک_ بکنی؟ diff --git a/plugins/discourse-narrative-bot/config/locales/server.hy.yml b/plugins/discourse-narrative-bot/config/locales/server.hy.yml index 45db5920351a6..611f4e5bcacc5 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.hy.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.hy.yml @@ -155,6 +155,9 @@ hy: Հոյակապ նկար է – ես սեղմել եմ հավանման :heart: կոճակը՝ Ձեզ տեղեկացնելու համար, թե որքան է այն ինձ դուր եկել :heart_eyes: like_not_found: |- Դուք մոռացե՞լ եք հավանել :heart: իմ [գրառումը](%{url}) :crying_cat_face: + likes: + not_found: |- + Դուք մոռացե՞լ եք հավանել :heart: իմ [գրառումը](%{url}) :crying_cat_face: formatting: instructions: |- Կարո՞ղ եք Ձեր պատասխանում որոշ բառեր դարձնել **հաստ** կամ _շեղագիր_ : diff --git a/plugins/discourse-narrative-bot/config/locales/server.id.yml b/plugins/discourse-narrative-bot/config/locales/server.id.yml index 7e2a705f0e46c..016708522a3db 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.id.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.id.yml @@ -43,6 +43,8 @@ id: trigger: "lempar" invalid: |- Maafkan saya, secara matematis tidak mungkin untuk memutar kombinasi dadu. :confounded: + not_enough_dice: + other: "Saya hanya punya %{count} dadu. [Shameful](https://www.toplessrobot.com/2009/04/the_10_most_shameful_rpg_dice.php), Saya tahu!" out_of_range: |- Apakah Anda tahu [the maximum number of sides](https://www.wired.com/2016/05/mathematical-challenge-of-designing-the-worlds-most-complex-120-sided-dice) untuk sebuah dadu seimbang matematis adalah 120? results: |- diff --git a/plugins/discourse-narrative-bot/config/locales/server.ja.yml b/plugins/discourse-narrative-bot/config/locales/server.ja.yml index fa2edf3bd2606..63680ebe53aeb 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.ja.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.ja.yml @@ -75,6 +75,8 @@ ja: "18": "My sources say no" "19": "Outlook not so good" "20": "Very doubtful" + result: |- + > :crystal_ball: %{result} new_user_narrative: hello: message: |- diff --git a/plugins/discourse-narrative-bot/config/locales/server.lt.yml b/plugins/discourse-narrative-bot/config/locales/server.lt.yml index 2033709d76ca1..51afcdb44e132 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.lt.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.lt.yml @@ -8,6 +8,8 @@ lt: site_settings: discourse_narrative_bot_enabled: "Įgalinti Discourse Botą (discodot)" discourse_narrative_bot: + quote: + trigger: "citata" magic_8_ball: answers: "1": "It is certain" diff --git a/plugins/discourse-narrative-bot/config/locales/server.lv.yml b/plugins/discourse-narrative-bot/config/locales/server.lv.yml index 016f5623396ce..8d8c66f88df7c 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.lv.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.lv.yml @@ -6,6 +6,8 @@ lv: discourse_narrative_bot: + quote: + trigger: "citāts" magic_8_ball: answers: "1": "It is certain" diff --git a/plugins/discourse-narrative-bot/config/locales/server.nb_NO.yml b/plugins/discourse-narrative-bot/config/locales/server.nb_NO.yml index cc112fffef898..78bb14fc263bb 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.nb_NO.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.nb_NO.yml @@ -144,6 +144,9 @@ nb_NO: Et flott bilde - jeg trykket på :heart: knappen så du også skal få vite at jeg satte stor pris på det :heart_eyes: like_not_found: |- Glemte du å trykke :heart:? Liker du ikke [innlegget mitt?](%{url}) :crying_cat_face: + likes: + not_found: |- + Glemte du å trykke :heart:? Liker du ikke [innlegget mitt?](%{url}) :crying_cat_face: formatting: instructions: |- Klarer du å gjøre noen ord **uthevet** eller _kursiv_ i svaret ditt? diff --git a/plugins/discourse-narrative-bot/config/locales/server.pt.yml b/plugins/discourse-narrative-bot/config/locales/server.pt.yml index 9bfcbfc9cc049..24c1ca3e68976 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.pt.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.pt.yml @@ -26,6 +26,7 @@ pt: results: |- > :game_die: %{results} quote: + trigger: "citar" "1": quote: "Entre cada dificuldade há espaço para oportunidade." author: "Albert Einstein" diff --git a/plugins/discourse-narrative-bot/config/locales/server.pt_BR.yml b/plugins/discourse-narrative-bot/config/locales/server.pt_BR.yml index da9e06b41b3e0..a4f804db7e701 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.pt_BR.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.pt_BR.yml @@ -43,6 +43,9 @@ pt_BR: trigger: "rolar" invalid: |- Sinto muito, é matematicamente impossível rolar essa combinação de dados. :confounded: + not_enough_dice: + one: "Eu só tenho %{count} dado. [Vergonhoso](https://www.toplessrobot.com/2009/04/the_10_most_shameful_rpg_dice.php), eu sei!" + other: "Eu só tenho %{count} dados. [Vergonhoso](https://www.toplessrobot.com/2009/04/the_10_most_shameful_rpg_dice.php), eu sei!" out_of_range: |- Você sabia que [o número máximo de lados](https://www.wired.com/2016/05/mathematical-challenge-of-designing-the-worlds-most-complex-120-sided-dice) para um dado matematicamente justo é 120? results: |- diff --git a/plugins/discourse-narrative-bot/config/locales/server.ro.yml b/plugins/discourse-narrative-bot/config/locales/server.ro.yml index b4e9a39fb2941..3670306c8f650 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.ro.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.ro.yml @@ -6,6 +6,8 @@ ro: discourse_narrative_bot: + quote: + trigger: "citează" magic_8_ball: answers: "1": "It is certain" diff --git a/plugins/discourse-narrative-bot/config/locales/server.sw.yml b/plugins/discourse-narrative-bot/config/locales/server.sw.yml index fa5c8fb8eb026..13a7805615bb9 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.sw.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.sw.yml @@ -143,6 +143,9 @@ sw: Picha nzuri -- Nimebonyeza kitufe cha :moyo: kuonyesha shukrani yangu kwako :heart_eyes_: like_not_found: |- Je ulisahau kuipenda :heart: [taarifa] yangu?(%{url}) :crying_cate_face: + likes: + not_found: |- + Je ulisahau kuipenda :heart: [taarifa] yangu?(%{url}) :crying_cate_face: formatting: instructions: |- Unaweza **kukoza** au _italiki_kwenye jibu lako? diff --git a/plugins/discourse-narrative-bot/config/locales/server.th.yml b/plugins/discourse-narrative-bot/config/locales/server.th.yml index 9fb1cb389998f..053d65ca905f5 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.th.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.th.yml @@ -6,6 +6,8 @@ th: discourse_narrative_bot: + quote: + trigger: "อ้างอิง" magic_8_ball: answers: "1": "It is certain" diff --git a/plugins/discourse-narrative-bot/config/locales/server.tr_TR.yml b/plugins/discourse-narrative-bot/config/locales/server.tr_TR.yml index 910de7db09fec..b723deb21b559 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.tr_TR.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.tr_TR.yml @@ -166,6 +166,9 @@ tr_TR: Şık resim - :heart: :heart_eyes: like_not_found: |- Beğenmeyi unuttun mu? :heart: [post?] (%{url}) :crying_cat_face: + likes: + not_found: |- + Beğenmeyi unuttun mu? :heart: [post?] (%{url}) :crying_cat_face: formatting: instructions: |- Yanıtınızda bazı kelimeleri **kalın** veya _italic_ yapabilir misiniz? diff --git a/plugins/discourse-narrative-bot/config/locales/server.uk.yml b/plugins/discourse-narrative-bot/config/locales/server.uk.yml index 675aaec9e5450..e78e097ad7f35 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.uk.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.uk.yml @@ -175,6 +175,8 @@ uk: likes: reply: |- Дякую, що вподобали мій допис! + not_found: |- + Ви забули вподобати :heart: мій [допис?](%{url}) :crying_cat_face: quoting: reply: |- Чудова робота, ти вибрав мою улюблену цитату! : left_speech_bubble: diff --git a/plugins/discourse-narrative-bot/config/locales/server.ur.yml b/plugins/discourse-narrative-bot/config/locales/server.ur.yml index 11357fd54ab62..c37ac7e84b58c 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.ur.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.ur.yml @@ -165,6 +165,9 @@ ur: اچھی تصویر - آپ کو بتانے کیلئے کہ یہ مجھے کتنی پسند ائی ہے میں نے لائیک :heart: کا بٹن دبایا :heart_eyes: like_not_found: |- کیا آپ میری [پوسٹ](%{url}) کو لائیک :heart: کرنا بھول گئے؟ :crying_cat_face: + likes: + not_found: |- + کیا آپ میری [پوسٹ](%{url}) کو لائیک :heart: کرنا بھول گئے؟ :crying_cat_face: formatting: instructions: |- کیا آپ اپنے جواب میں کچھ الفاظ کو **بولڈ** یا _آئیٹیلک_ بنا سکتے ہیں؟ diff --git a/plugins/discourse-narrative-bot/config/locales/server.vi.yml b/plugins/discourse-narrative-bot/config/locales/server.vi.yml index 49426665d825a..b85f147434d44 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.vi.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.vi.yml @@ -20,6 +20,7 @@ vi: description: "Đã hoàn thành hướng dẫn nâng cao cho thành viên mới của chúng tôi" discourse_narrative_bot: quote: + trigger: "trích dẫn" "3": quote: "Đừng khóc vì nó đã qua, hãy cười vì điều đó đã xảy ra." "4": diff --git a/plugins/discourse-narrative-bot/config/locales/server.zh_TW.yml b/plugins/discourse-narrative-bot/config/locales/server.zh_TW.yml index c2ab4a588e3fd..8ee79cec4ab7b 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.zh_TW.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.zh_TW.yml @@ -8,6 +8,8 @@ zh_TW: site_settings: discourse_narrative_bot_enabled: "啟用 Discourse 機器人" discourse_narrative_bot: + quote: + trigger: "引用" magic_8_ball: answers: "1": "It is certain" diff --git a/plugins/discourse-presence/config/locales/client.bs_BA.yml b/plugins/discourse-presence/config/locales/client.bs_BA.yml index a433d4207dca3..e21d9053aa5b9 100644 --- a/plugins/discourse-presence/config/locales/client.bs_BA.yml +++ b/plugins/discourse-presence/config/locales/client.bs_BA.yml @@ -7,6 +7,14 @@ bs_BA: js: presence: + replying: + one: "odgovara" + few: "odgovara" + other: "odgovara" + editing: + one: "ispravlja" + few: "ispravlja" + other: "ispravlja" replying_to_topic: one: "piše" few: "piše" diff --git a/plugins/discourse-presence/config/locales/client.ca.yml b/plugins/discourse-presence/config/locales/client.ca.yml index d7c05f2d2fcb5..bf6533b84fa9a 100644 --- a/plugins/discourse-presence/config/locales/client.ca.yml +++ b/plugins/discourse-presence/config/locales/client.ca.yml @@ -7,6 +7,12 @@ ca: js: presence: + replying: + one: "responent" + other: "responent" + editing: + one: "editant" + other: "editant" replying_to_topic: one: "responent" other: "responent" diff --git a/plugins/discourse-presence/config/locales/client.cs.yml b/plugins/discourse-presence/config/locales/client.cs.yml index 041b2f0bd05cc..34f66ba0cd31d 100644 --- a/plugins/discourse-presence/config/locales/client.cs.yml +++ b/plugins/discourse-presence/config/locales/client.cs.yml @@ -5,3 +5,20 @@ # https://translate.discourse.org/ cs: + js: + presence: + replying: + one: "odpovídá" + few: "odpovídá" + many: "odpovídá" + other: "odpovídá" + editing: + one: "upravuje" + few: "upravuje" + many: "upravuje" + other: "upravuje" + replying_to_topic: + one: "odpovídá" + few: "odpovídá" + many: "odpovídá" + other: "odpovídá" diff --git a/plugins/discourse-presence/config/locales/client.el.yml b/plugins/discourse-presence/config/locales/client.el.yml index 54f960d3e5783..c578ef273ea56 100644 --- a/plugins/discourse-presence/config/locales/client.el.yml +++ b/plugins/discourse-presence/config/locales/client.el.yml @@ -7,6 +7,12 @@ el: js: presence: + replying: + one: "απαντά" + other: "απαντά" + editing: + one: "επεξεργάζεται" + other: "επεξεργάζεται" replying_to_topic: one: "απαντά" other: "απαντούν" diff --git a/plugins/discourse-presence/config/locales/client.et.yml b/plugins/discourse-presence/config/locales/client.et.yml index 0ea0b6d554bb4..989b50f72ac44 100644 --- a/plugins/discourse-presence/config/locales/client.et.yml +++ b/plugins/discourse-presence/config/locales/client.et.yml @@ -5,3 +5,14 @@ # https://translate.discourse.org/ et: + js: + presence: + replying: + one: "vastamine" + other: "vastamine" + editing: + one: "muutmine" + other: "muutmine" + replying_to_topic: + one: "vastamine" + other: "vastamine" diff --git a/plugins/discourse-presence/config/locales/client.hy.yml b/plugins/discourse-presence/config/locales/client.hy.yml index 39e699f0608e2..a36ce7ed63373 100644 --- a/plugins/discourse-presence/config/locales/client.hy.yml +++ b/plugins/discourse-presence/config/locales/client.hy.yml @@ -7,6 +7,12 @@ hy: js: presence: + replying: + one: "պատասխանում է" + other: "պատասխանում է" + editing: + one: "խմբագրում է" + other: "խմբագրում է" replying_to_topic: one: "պատասխանում է" other: "պատասխանում են" diff --git a/plugins/discourse-presence/config/locales/client.id.yml b/plugins/discourse-presence/config/locales/client.id.yml index ba7cd2256947f..a53afddae5303 100644 --- a/plugins/discourse-presence/config/locales/client.id.yml +++ b/plugins/discourse-presence/config/locales/client.id.yml @@ -7,5 +7,9 @@ id: js: presence: + replying: + other: "membalas" + editing: + other: "menyunting" replying_to_topic: other: "membalas" diff --git a/plugins/discourse-presence/config/locales/client.lt.yml b/plugins/discourse-presence/config/locales/client.lt.yml index 16bb19758dcaf..4fbe07e9348de 100644 --- a/plugins/discourse-presence/config/locales/client.lt.yml +++ b/plugins/discourse-presence/config/locales/client.lt.yml @@ -5,3 +5,20 @@ # https://translate.discourse.org/ lt: + js: + presence: + replying: + one: "atsakoma" + few: "atsakoma" + many: "atsakoma" + other: "atsakoma" + editing: + one: "redaguojama" + few: "redaguojama" + many: "redaguojama" + other: "redaguojama" + replying_to_topic: + one: "atsakoma" + few: "atsakoma" + many: "atsakoma" + other: "atsakoma" diff --git a/plugins/discourse-presence/config/locales/client.nb_NO.yml b/plugins/discourse-presence/config/locales/client.nb_NO.yml index 10f0fa26a6e03..11440eed7e867 100644 --- a/plugins/discourse-presence/config/locales/client.nb_NO.yml +++ b/plugins/discourse-presence/config/locales/client.nb_NO.yml @@ -7,6 +7,12 @@ nb_NO: js: presence: + replying: + one: "svarer" + other: "svarer" + editing: + one: "redigerer" + other: "redigerer" replying_to_topic: one: "svarer" other: "svarer" diff --git a/plugins/discourse-presence/config/locales/client.pt_BR.yml b/plugins/discourse-presence/config/locales/client.pt_BR.yml index e43625ed9b7b1..186170cd09c8a 100644 --- a/plugins/discourse-presence/config/locales/client.pt_BR.yml +++ b/plugins/discourse-presence/config/locales/client.pt_BR.yml @@ -7,6 +7,12 @@ pt_BR: js: presence: + replying: + one: "respondendo" + other: "respondendo" + editing: + one: "editando" + other: "editando" replying_to_topic: one: "respondendo" other: "respondendo" diff --git a/plugins/discourse-presence/config/locales/client.ro.yml b/plugins/discourse-presence/config/locales/client.ro.yml index b138344bd4804..81a2900930d58 100644 --- a/plugins/discourse-presence/config/locales/client.ro.yml +++ b/plugins/discourse-presence/config/locales/client.ro.yml @@ -7,6 +7,14 @@ ro: js: presence: + replying: + one: "răspunde" + few: "răspunde" + other: "răspunde" + editing: + one: "editează" + few: "editează" + other: "editează" replying_to_topic: one: "răspunde" few: "răspund" diff --git a/plugins/discourse-presence/config/locales/client.sk.yml b/plugins/discourse-presence/config/locales/client.sk.yml index dfe627bc8d6ff..e543f3a4fb7c6 100644 --- a/plugins/discourse-presence/config/locales/client.sk.yml +++ b/plugins/discourse-presence/config/locales/client.sk.yml @@ -7,6 +7,16 @@ sk: js: presence: + replying: + one: "odpovedanie" + few: "odpovedanie" + many: "odpovedanie" + other: "odpovedanie" + editing: + one: "upravovanie" + few: "upravovanie" + many: "upravovanie" + other: "upravovanie" replying_to_topic: one: "odpovedanie" few: "odpovedanie" diff --git a/plugins/discourse-presence/config/locales/client.sr.yml b/plugins/discourse-presence/config/locales/client.sr.yml index 88d63d6ae1a30..df4e1c05f12e1 100644 --- a/plugins/discourse-presence/config/locales/client.sr.yml +++ b/plugins/discourse-presence/config/locales/client.sr.yml @@ -5,3 +5,17 @@ # https://translate.discourse.org/ sr: + js: + presence: + replying: + one: "odgovara" + few: "odgovara" + other: "odgovara" + editing: + one: "menja" + few: "menja" + other: "menja" + replying_to_topic: + one: "odgovara" + few: "odgovara" + other: "odgovara" diff --git a/plugins/discourse-presence/config/locales/client.sw.yml b/plugins/discourse-presence/config/locales/client.sw.yml index 0d7cdd075bfd0..2e686fad151f0 100644 --- a/plugins/discourse-presence/config/locales/client.sw.yml +++ b/plugins/discourse-presence/config/locales/client.sw.yml @@ -5,3 +5,14 @@ # https://translate.discourse.org/ sw: + js: + presence: + replying: + one: "anajibu" + other: "anajibu" + editing: + one: "inarekebishwa/hariri" + other: "inarekebishwa/hariri" + replying_to_topic: + one: "anajibu" + other: "anajibu" diff --git a/plugins/discourse-presence/config/locales/client.ur.yml b/plugins/discourse-presence/config/locales/client.ur.yml index 7a261097cc74c..f6232b098cc0f 100644 --- a/plugins/discourse-presence/config/locales/client.ur.yml +++ b/plugins/discourse-presence/config/locales/client.ur.yml @@ -7,6 +7,12 @@ ur: js: presence: + replying: + one: "جواب دے رہے ہیں" + other: "جواب دے رہے ہیں" + editing: + one: "ترمیم کر رہے ہیں" + other: "ترمیم کر رہے ہیں" replying_to_topic: one: "جواب دیا جا رہا ہے" other: "جواب دیا جا رہا ہے" diff --git a/plugins/poll/config/locales/client.ar.yml b/plugins/poll/config/locales/client.ar.yml index 60c5e7849dd5b..007b1b3742ab7 100644 --- a/plugins/poll/config/locales/client.ar.yml +++ b/plugins/poll/config/locales/client.ar.yml @@ -58,6 +58,7 @@ ar: age: "أُغلق الاستطلاع %{age}." breakdown: title: "نتائج الاستطلاع" + count: "العد" error_while_toggling_status: "معذرةً، حدث عُطل أثناء تبديل حالة هذا الاستطلاع." error_while_casting_votes: "عذرا، حدث خطأ عند الإدلاء بأصواتكم." error_while_fetching_voters: "عذرا، حدث خطأ في عرض الناخبين." diff --git a/plugins/poll/config/locales/client.be.yml b/plugins/poll/config/locales/client.be.yml index a483a0887608b..f3b3af8a928cb 100644 --- a/plugins/poll/config/locales/client.be.yml +++ b/plugins/poll/config/locales/client.be.yml @@ -22,6 +22,8 @@ be: label: "экспарт" close: label: "зачыніць" + breakdown: + count: "падлічваць" ui_builder: poll_type: label: тып diff --git a/plugins/poll/config/locales/client.bg.yml b/plugins/poll/config/locales/client.bg.yml index 4ff46bf1a5394..57ba913b8ef34 100644 --- a/plugins/poll/config/locales/client.bg.yml +++ b/plugins/poll/config/locales/client.bg.yml @@ -37,6 +37,8 @@ bg: title: "Затвори гласуването" label: "Затвори" confirm: "Сигурни ли сте, че искате да затворите гласуването?" + breakdown: + count: "Брой" error_while_toggling_status: "Съжаляваме, получи се грешка при превключване статуса на тази анкета." error_while_casting_votes: "Получи се грешка при подаването на гласа ви." error_while_fetching_voters: "Получи се грешка при показването на гласовете." diff --git a/plugins/poll/config/locales/client.bs_BA.yml b/plugins/poll/config/locales/client.bs_BA.yml index e35e9096f6d56..498c74bf7a66b 100644 --- a/plugins/poll/config/locales/client.bs_BA.yml +++ b/plugins/poll/config/locales/client.bs_BA.yml @@ -82,6 +82,7 @@ bs_BA: title: Izgradi anketu insert: Umetni anketu help: + options_min_count: Unesite barem jednu opciju. invalid_values: Minimalna vrijednost mora biti manja od maksimalne. min_step_value: Minimalna vrijednost razmaka je 1 poll_type: diff --git a/plugins/poll/config/locales/client.ca.yml b/plugins/poll/config/locales/client.ca.yml index 21c4ff0577b8d..f65bea35ae854 100644 --- a/plugins/poll/config/locales/client.ca.yml +++ b/plugins/poll/config/locales/client.ca.yml @@ -60,6 +60,8 @@ ca: automatic_close: closes_in: "Es tanca en %{timeLeft} ." age: "Tancat %{age}" + breakdown: + count: "Recompte" error_while_toggling_status: "Ho sentim. S'ha produït un error en canviar l'estat d'aquesta enquesta." error_while_casting_votes: "Ho sentim. S'ha produït un error en l'emissió dels vostres vots." error_while_fetching_voters: "Hi ha hagut un error en mostrar els votants." @@ -68,6 +70,7 @@ ca: title: Crea una enquesta insert: Insereix una enquesta help: + options_min_count: Introduïu almenys una opció. invalid_values: El valor mínim ha de ser més petit que el valor màxim. min_step_value: L'increment mínim és 1 poll_type: diff --git a/plugins/poll/config/locales/client.da.yml b/plugins/poll/config/locales/client.da.yml index c28f118ff9c55..9763c079a681d 100644 --- a/plugins/poll/config/locales/client.da.yml +++ b/plugins/poll/config/locales/client.da.yml @@ -102,3 +102,5 @@ da: label: Titel (valgfrit) automatic_close: label: Luk afstemning automatisk + show_advanced: "Vis Avancerede Indstillinger" + hide_advanced: "Skjul Avancerede Indstillinger" diff --git a/plugins/poll/config/locales/client.el.yml b/plugins/poll/config/locales/client.el.yml index 773f72a233a26..c03334c44ff8f 100644 --- a/plugins/poll/config/locales/client.el.yml +++ b/plugins/poll/config/locales/client.el.yml @@ -77,6 +77,7 @@ el: title: Δημιουργία ψηφοφορίας insert: Εισαγωγή ψηφοφορίας help: + options_min_count: Επιλέξτε τουλάχιστον 1 επιλογή. invalid_values: Η ελάχιστη τιμή θα πρέπει να είναι μικρότερη από τη μέγιστη τιμή. min_step_value: Η ελάχιστη τιμή για το βήμα είναι 1 poll_type: diff --git a/plugins/poll/config/locales/client.et.yml b/plugins/poll/config/locales/client.et.yml index 0b37af02213c6..35a4d33ad5f64 100644 --- a/plugins/poll/config/locales/client.et.yml +++ b/plugins/poll/config/locales/client.et.yml @@ -32,6 +32,8 @@ et: title: "Sulge hääletus" label: "Sulge" confirm: "Kas sa oled kindel, et sa tahad antud hääletuse sulgeda?" + breakdown: + count: "Arv" error_while_toggling_status: "Kahjuks tekkis postituse staatuse ümberlülitamisel tõrge." error_while_casting_votes: "Kahjuks tekkis hääletamise käigus tõrge." error_while_fetching_voters: "Kahjuks tekkis hääletajate näitamise käigus tõrge." diff --git a/plugins/poll/config/locales/client.fa_IR.yml b/plugins/poll/config/locales/client.fa_IR.yml index b09e50f337691..744c65e00aed3 100644 --- a/plugins/poll/config/locales/client.fa_IR.yml +++ b/plugins/poll/config/locales/client.fa_IR.yml @@ -75,6 +75,7 @@ fa_IR: title: ساخت نظرسنجی insert: درج نظر سنجی help: + options_min_count: حداقل 1 گزینه را وارد کنید. invalid_values: مقدار حداقل می بایست کمتر از مقدار حداکثر باشد. min_step_value: حداقل مقدار مرحله 1 است poll_type: diff --git a/plugins/poll/config/locales/client.gl.yml b/plugins/poll/config/locales/client.gl.yml index a99f131850490..9166bf0af8ba6 100644 --- a/plugins/poll/config/locales/client.gl.yml +++ b/plugins/poll/config/locales/client.gl.yml @@ -77,6 +77,7 @@ gl: title: Construír a enquisa insert: Inserir enquisa help: + options_min_count: Introducir cando menos 1 opción. invalid_values: O valor mínimo ten de ser menor có valor máximo. min_step_value: O valor mínimo do paso é 1 poll_type: @@ -98,3 +99,5 @@ gl: label: Título (opcional) automatic_close: label: Pechar automaticamente a enquisa + show_advanced: "Amosar opcións avanzadas" + hide_advanced: "Agochar opcións avanzadas" diff --git a/plugins/poll/config/locales/client.hu.yml b/plugins/poll/config/locales/client.hu.yml index d06003ee6d398..ac3d49141955b 100644 --- a/plugins/poll/config/locales/client.hu.yml +++ b/plugins/poll/config/locales/client.hu.yml @@ -33,6 +33,8 @@ hu: title: "A szavazás lezárása" label: "Bezárás" confirm: "Biztosan lezárod ezt a szavazást?" + breakdown: + count: "Számláló" error_while_toggling_status: "Elnézést, a szavazat állapotának vizsgálatakor hiba lépett fel." error_while_casting_votes: "Sajnáljuk, hiba történt a szavazatod elküldésekor." error_while_fetching_voters: "Elnézést, a szavazatok kiírásakor hiba lépett fel." diff --git a/plugins/poll/config/locales/client.hy.yml b/plugins/poll/config/locales/client.hy.yml index 2b6f6cd7b70f0..5ed8e58a57870 100644 --- a/plugins/poll/config/locales/client.hy.yml +++ b/plugins/poll/config/locales/client.hy.yml @@ -42,6 +42,8 @@ hy: automatic_close: closes_in: "Փակվում է %{timeLeft} անց:" age: "Փակված է՝ %{age}" + breakdown: + count: "Քանակ" error_while_toggling_status: "Ներողություն, այս հարցման կարգավիճակը փոխելիս տեղի է ունեցել սխալ:" error_while_casting_votes: "Ներողություն, Ձեր քվեարկելիս տեղի է ունեցել սխալ:" error_while_fetching_voters: "Ներողություն, քվեարկողներին ցուցադրելիս տեղի է ունեցել սխալ:" diff --git a/plugins/poll/config/locales/client.id.yml b/plugins/poll/config/locales/client.id.yml index 1e84c82a4d028..433b9cd6db93a 100644 --- a/plugins/poll/config/locales/client.id.yml +++ b/plugins/poll/config/locales/client.id.yml @@ -54,6 +54,8 @@ id: error_while_toggling_status: "Maaf, telah terjadi kesalahan pengalihan status dari pemilihan ini." ui_builder: insert: Masukkan Poll + help: + options_min_count: Masukkan setidaknya 1 pilihan. poll_type: label: Tipe poll_result: diff --git a/plugins/poll/config/locales/client.ja.yml b/plugins/poll/config/locales/client.ja.yml index 4830c744f8ad8..177ad1a4a12d7 100644 --- a/plugins/poll/config/locales/client.ja.yml +++ b/plugins/poll/config/locales/client.ja.yml @@ -71,6 +71,7 @@ ja: title: 投票を作成 insert: 投票の挿入 help: + options_min_count: 少なくとも1つのオプションを入力してください. invalid_values: 最小値は最大値より小さくなければなりません。 min_step_value: 最小ステップ単位は 1 です poll_type: diff --git a/plugins/poll/config/locales/client.lt.yml b/plugins/poll/config/locales/client.lt.yml index a1b07caa4bb6f..7388517f2e32a 100644 --- a/plugins/poll/config/locales/client.lt.yml +++ b/plugins/poll/config/locales/client.lt.yml @@ -36,6 +36,8 @@ lt: title: "Uždaryti balsavimą" label: "Uždaryti" confirm: "Ar tikrai norite uždaryti šį balsavimą?" + breakdown: + count: "Skaičiuoti" ui_builder: poll_type: label: Tipas diff --git a/plugins/poll/config/locales/client.lv.yml b/plugins/poll/config/locales/client.lv.yml index 67617f3bf46fb..7440a3fe39b0d 100644 --- a/plugins/poll/config/locales/client.lv.yml +++ b/plugins/poll/config/locales/client.lv.yml @@ -22,3 +22,5 @@ lv: close: title: "Aizvērt aptauju" label: "Aizvērt" + breakdown: + count: "Skaits" diff --git a/plugins/poll/config/locales/client.nb_NO.yml b/plugins/poll/config/locales/client.nb_NO.yml index c9e23b313eb70..ffe4e94793072 100644 --- a/plugins/poll/config/locales/client.nb_NO.yml +++ b/plugins/poll/config/locales/client.nb_NO.yml @@ -32,6 +32,8 @@ nb_NO: title: "Lukk avstemning" label: "Lukk" confirm: "Er du sikker på at du vil lukke avstemningen?" + breakdown: + count: "Antall" error_while_toggling_status: "Beklager, det oppstod en feil ved endring av status på denne avstemningen." error_while_casting_votes: "Beklager, det oppstod en feil da du ga din stemme." error_while_fetching_voters: "Beklager, det oppstod en feil når stemmegivere skulle vises." diff --git a/plugins/poll/config/locales/client.pt.yml b/plugins/poll/config/locales/client.pt.yml index fbd4f6d36ec98..4a69be288115c 100644 --- a/plugins/poll/config/locales/client.pt.yml +++ b/plugins/poll/config/locales/client.pt.yml @@ -77,6 +77,7 @@ pt: title: Criar Sondagem insert: Inserir Sondagem help: + options_min_count: Insira pelo menos uma opção. invalid_values: O valor mínimo deve ser menor que o valor máximo. min_step_value: O valor mínimo é 1 poll_type: @@ -98,3 +99,5 @@ pt: label: Título (opcional) automatic_close: label: Fechar sondagem automaticamente + show_advanced: "Mostrar Opções Avançadas" + hide_advanced: "Ocultar Opções Avançadas" diff --git a/plugins/poll/config/locales/client.pt_BR.yml b/plugins/poll/config/locales/client.pt_BR.yml index 10b84b54e5298..cfb8032e0d159 100644 --- a/plugins/poll/config/locales/client.pt_BR.yml +++ b/plugins/poll/config/locales/client.pt_BR.yml @@ -51,6 +51,8 @@ pt_BR: automatic_close: closes_in: "Fecha em %{timeLeft}." age: "Fechou %{age}" + breakdown: + count: "Contagem" error_while_toggling_status: "Desculpe, houve um erro ao mudar a situação desta votação." error_while_casting_votes: "Desculpe, houve um erro ao registrar os seus votos." error_while_fetching_voters: "Desculpe, houve um erro ao mostrar os votantes." diff --git a/plugins/poll/config/locales/client.ro.yml b/plugins/poll/config/locales/client.ro.yml index 8e5a31bd87257..3988603e73204 100644 --- a/plugins/poll/config/locales/client.ro.yml +++ b/plugins/poll/config/locales/client.ro.yml @@ -57,6 +57,7 @@ ro: title: "Rezultatele sondajului" votes: "%{count} voturi" percentage: "Procent" + count: "Număr" error_while_toggling_status: "Ne pare rău, a apărut o eroare la schimbarea stării acestui sondaj." error_while_casting_votes: "Ne pare rău, a apărut o eroare la exercitarea voturilor tale." error_while_fetching_voters: "Ne pare rău, a apărut o eroare la afișarea votanților." @@ -65,6 +66,7 @@ ro: title: Creează sondaj insert: Introdu sondaj help: + options_min_count: Introduceți cel puțin o opțiune. invalid_values: Valoarea minimă trebuie să fie mai mică decât valoarea maximă. min_step_value: Valoarea minimă a pasului este 1 poll_type: diff --git a/plugins/poll/config/locales/client.sl.yml b/plugins/poll/config/locales/client.sl.yml index 942e77e81b27e..98ebc99a4bd5e 100644 --- a/plugins/poll/config/locales/client.sl.yml +++ b/plugins/poll/config/locales/client.sl.yml @@ -87,6 +87,7 @@ sl: title: Ustvari anketo insert: Vstavi anketo help: + options_min_count: Vnesite vsaj eno možnost. invalid_values: Najmanjša vrednost mora biti manjša od največje vrednosti. min_step_value: Najmanjša vrednost koraka je 1. poll_type: @@ -106,3 +107,4 @@ sl: label: Pokaži glasovalce automatic_close: label: Samodejno zapri anketo + show_advanced: "Pokaži dodatne možnosti" diff --git a/plugins/poll/config/locales/client.sr.yml b/plugins/poll/config/locales/client.sr.yml index c658ee35b5d04..00e0420d2a8a5 100644 --- a/plugins/poll/config/locales/client.sr.yml +++ b/plugins/poll/config/locales/client.sr.yml @@ -82,6 +82,7 @@ sr: title: Napravi anketu insert: Unesi anketu help: + options_min_count: Unesite najmanje 1 opciju. invalid_values: Minimalna vrednost mora biti manja od maksimalne. min_step_value: Minimalna vrednost koraka je 1 poll_type: diff --git a/plugins/poll/config/locales/client.tr_TR.yml b/plugins/poll/config/locales/client.tr_TR.yml index 691c6a9db28c0..0b36aa7243121 100644 --- a/plugins/poll/config/locales/client.tr_TR.yml +++ b/plugins/poll/config/locales/client.tr_TR.yml @@ -55,6 +55,7 @@ tr_TR: title: "Anket sonuçları" votes: "%{count} oy" percentage: "Yüzde" + count: "say" error_while_toggling_status: "Üzgünüz, anket durumunu değiştirme sırasında hata meydana geldi." error_while_casting_votes: "Üzgünüz, oylarınızı dönüştürme sırasında hata meydana geldi." error_while_fetching_voters: "Üzgünüz, oy verenleri görüntüleme sırasında hata meydana geldi" diff --git a/plugins/poll/config/locales/client.uk.yml b/plugins/poll/config/locales/client.uk.yml index 0e91ecf16a749..bd6b9ae895bd7 100644 --- a/plugins/poll/config/locales/client.uk.yml +++ b/plugins/poll/config/locales/client.uk.yml @@ -87,6 +87,7 @@ uk: title: Створити опитування insert: Вставити опитування help: + options_min_count: Введіть принаймні 1 варіант. invalid_values: Мінімальне значення має бути меншим, ніж максимальне. min_step_value: Мінімальне значення кроку 1 poll_type: @@ -108,3 +109,5 @@ uk: label: Заголовок (необов'язково) automatic_close: label: Автоматично закрити опитування + show_advanced: "Показати додаткові параметри" + hide_advanced: "Сховати додаткові параметри" diff --git a/plugins/poll/config/locales/client.ur.yml b/plugins/poll/config/locales/client.ur.yml index e7729964039a6..926f164291863 100644 --- a/plugins/poll/config/locales/client.ur.yml +++ b/plugins/poll/config/locales/client.ur.yml @@ -44,6 +44,8 @@ ur: automatic_close: closes_in: "بند ہو جائیگا %{timeLeft} میں۔" age: "بند %{age}" + breakdown: + count: "شمار" error_while_toggling_status: "معذرت، اِس پول کا سٹیٹس تبدیل کرتے وقت ایک تکنیکی خرابی کا سامنا کرنا پڑا۔" error_while_casting_votes: "معذرت، آپ کا ووٹ ڈالتے وقت ایک تکنیکی خرابی کا سامنا کرنا پڑا" error_while_fetching_voters: "معذرت، ووٹرز کو دکھاتے وقت ایک تکنیکی خرابی کا سامنا کرنا پڑا" diff --git a/plugins/poll/config/locales/client.vi.yml b/plugins/poll/config/locales/client.vi.yml index 74faf4bae3cb4..0ee3ae8408fe4 100644 --- a/plugins/poll/config/locales/client.vi.yml +++ b/plugins/poll/config/locales/client.vi.yml @@ -40,6 +40,8 @@ vi: title: "Đóng thăm dò" label: "Đóng" confirm: "Bạn có muốn đóng thăm dò này ?" + breakdown: + count: "Đếm" error_while_toggling_status: "Đã có lỗi xảy ra khi chuyển trạng thái của thăm dò." error_while_casting_votes: "Đã có lỗi xảy ra làm ảnh hưởng đến bình chọn của bạn." error_while_fetching_voters: "Đã có lỗi xảy ra khi hiển thị những người tham gia bình chọn." diff --git a/plugins/poll/config/locales/client.zh_TW.yml b/plugins/poll/config/locales/client.zh_TW.yml index 5dce9d40e74a6..fad08d802f806 100644 --- a/plugins/poll/config/locales/client.zh_TW.yml +++ b/plugins/poll/config/locales/client.zh_TW.yml @@ -30,6 +30,8 @@ zh_TW: title: "關閉投票" label: "關閉" confirm: "你確定要關閉這個投票?" + breakdown: + count: "次數" error_while_toggling_status: "對不起,改變投票狀態時出錯了。" error_while_casting_votes: "對不起,投票時出錯了。" error_while_fetching_voters: "對不起,顯示投票者時出錯了。" diff --git a/plugins/styleguide/config/locales/client.be.yml b/plugins/styleguide/config/locales/client.be.yml index 2ea77a0d35037..6dc0110caa843 100644 --- a/plugins/styleguide/config/locales/client.be.yml +++ b/plugins/styleguide/config/locales/client.be.yml @@ -5,3 +5,22 @@ # https://translate.discourse.org/ be: + js: + styleguide: + sections: + typography: + example: "Сардэчна запрашаем у дыскурсе" + colors: + title: "<......" + icons: + title: "абразкі" + categories: + title: "Катэгорыі" + navigation: + title: "рух" + categories_list: + title: "Спіс катэгорый" + post: + title: "Паведамленне" + suggested_topics: + title: "Прапанаваныя тэмы" diff --git a/plugins/styleguide/config/locales/client.bg.yml b/plugins/styleguide/config/locales/client.bg.yml index 52333529d3cac..62d9d785f9d9d 100644 --- a/plugins/styleguide/config/locales/client.bg.yml +++ b/plugins/styleguide/config/locales/client.bg.yml @@ -5,3 +5,20 @@ # https://translate.discourse.org/ bg: + js: + styleguide: + sections: + colors: + title: "Цветове" + icons: + title: "Икони" + categories: + title: "Категории" + navigation: + title: "Навигация" + categories_list: + title: "Списък с категории" + post: + title: "Публикация" + suggested_topics: + title: "Подобни теми" diff --git a/plugins/styleguide/config/locales/client.bs_BA.yml b/plugins/styleguide/config/locales/client.bs_BA.yml index 828a7e65af8ac..cdc6dbbee3a57 100644 --- a/plugins/styleguide/config/locales/client.bs_BA.yml +++ b/plugins/styleguide/config/locales/client.bs_BA.yml @@ -5,3 +5,20 @@ # https://translate.discourse.org/ bs_BA: + js: + styleguide: + sections: + colors: + title: "Colors" + categories: + title: "Kategorije" + navigation: + title: "Navigacija" + categories_list: + title: "Lista Kategorija" + topic_timer_info: + title: "Trajanje tema" + post: + title: "Objava" + suggested_topics: + title: "Preporučene teme" diff --git a/plugins/styleguide/config/locales/client.ca.yml b/plugins/styleguide/config/locales/client.ca.yml index ec737bc1a5b4e..2d57adee812a4 100644 --- a/plugins/styleguide/config/locales/client.ca.yml +++ b/plugins/styleguide/config/locales/client.ca.yml @@ -5,3 +5,24 @@ # https://translate.discourse.org/ ca: + js: + styleguide: + sections: + typography: + example: "Benvingut a Discourse" + colors: + title: "Colors" + icons: + title: "Icones" + categories: + title: "Categories" + navigation: + title: "Navegació" + categories_list: + title: "Llista de categories" + topic_timer_info: + title: "Temporitzadors de temes" + post: + title: "Publicació" + suggested_topics: + title: "Temes recomanats" diff --git a/plugins/styleguide/config/locales/client.cs.yml b/plugins/styleguide/config/locales/client.cs.yml index 041b2f0bd05cc..ec570e4f84554 100644 --- a/plugins/styleguide/config/locales/client.cs.yml +++ b/plugins/styleguide/config/locales/client.cs.yml @@ -5,3 +5,24 @@ # https://translate.discourse.org/ cs: + js: + styleguide: + sections: + typography: + example: "Vítejte v Discourse" + colors: + title: "Barvy" + icons: + title: "Ikony" + categories: + title: "Kategorie" + navigation: + title: "Navigace" + categories_list: + title: "Seznam kategorií" + topic_timer_info: + title: "Časovače tématu " + post: + title: "Příspěvek" + suggested_topics: + title: "Doporučená témata" diff --git a/plugins/styleguide/config/locales/client.el.yml b/plugins/styleguide/config/locales/client.el.yml index d872d0ecc405b..0240efbbfd4ae 100644 --- a/plugins/styleguide/config/locales/client.el.yml +++ b/plugins/styleguide/config/locales/client.el.yml @@ -5,3 +5,24 @@ # https://translate.discourse.org/ el: + js: + styleguide: + sections: + typography: + example: "Καλώς ήρθατε στο Discourse" + colors: + title: "Χρώματα" + icons: + title: "Εικονίδια" + categories: + title: "Κατηγορίες" + navigation: + title: "Πλοήγηση" + categories_list: + title: "Λίστα Κατηγοριών" + topic_timer_info: + title: "Χρονοδιακόπτες Νημάτων" + post: + title: "Ανάρτηση" + suggested_topics: + title: "Προτεινόμενα θέματα" diff --git a/plugins/styleguide/config/locales/client.en_GB.yml b/plugins/styleguide/config/locales/client.en_GB.yml index 2d4fa180ec739..63a70bdb43268 100644 --- a/plugins/styleguide/config/locales/client.en_GB.yml +++ b/plugins/styleguide/config/locales/client.en_GB.yml @@ -5,3 +5,8 @@ # https://translate.discourse.org/ en_GB: + js: + styleguide: + sections: + colors: + title: "Colours" diff --git a/plugins/styleguide/config/locales/client.et.yml b/plugins/styleguide/config/locales/client.et.yml index 0ea0b6d554bb4..2f153c736a6f4 100644 --- a/plugins/styleguide/config/locales/client.et.yml +++ b/plugins/styleguide/config/locales/client.et.yml @@ -5,3 +5,24 @@ # https://translate.discourse.org/ et: + js: + styleguide: + sections: + typography: + example: "Tere tulemast Discourse'i" + colors: + title: "Värvid" + icons: + title: "Ikoonid" + categories: + title: "Kategooriad" + navigation: + title: "Navigatsioon" + categories_list: + title: "Foorumite loend" + topic_timer_info: + title: "Teemade taimerid" + post: + title: "Postitus" + suggested_topics: + title: "Soovitatud teemad" diff --git a/plugins/styleguide/config/locales/client.hy.yml b/plugins/styleguide/config/locales/client.hy.yml index cb18f64d3565f..c2a028767a1c9 100644 --- a/plugins/styleguide/config/locales/client.hy.yml +++ b/plugins/styleguide/config/locales/client.hy.yml @@ -5,3 +5,24 @@ # https://translate.discourse.org/ hy: + js: + styleguide: + sections: + typography: + example: "Բարի գալուստ Discourse" + colors: + title: "Գույներ" + icons: + title: "Պատկերակներ" + categories: + title: "Կատեգորիաներ" + navigation: + title: "Նավիգացիա" + categories_list: + title: "Կատեգորիաների Ցանկ" + topic_timer_info: + title: "Թեմաների Ժամաչափիչներ" + post: + title: "Գրառում" + suggested_topics: + title: "Առաջարկվող Թեմաներ" diff --git a/plugins/styleguide/config/locales/client.id.yml b/plugins/styleguide/config/locales/client.id.yml index 596e36b2e137f..78b90bb913a70 100644 --- a/plugins/styleguide/config/locales/client.id.yml +++ b/plugins/styleguide/config/locales/client.id.yml @@ -5,3 +5,12 @@ # https://translate.discourse.org/ id: + js: + styleguide: + sections: + categories: + title: "Kategori" + navigation: + title: "Navigasi" + suggested_topics: + title: "Topik Yang Disarankan" diff --git a/plugins/styleguide/config/locales/client.lt.yml b/plugins/styleguide/config/locales/client.lt.yml index 16bb19758dcaf..7fb13fa29ad64 100644 --- a/plugins/styleguide/config/locales/client.lt.yml +++ b/plugins/styleguide/config/locales/client.lt.yml @@ -5,3 +5,22 @@ # https://translate.discourse.org/ lt: + js: + styleguide: + sections: + typography: + example: "Sveiki atvykę į Discourse" + colors: + title: "Spalvos" + categories: + title: "Kategorijos" + navigation: + title: "Navigacija" + categories_list: + title: "Kategorijų sąrašas" + topic_timer_info: + title: "Temos laikmačiai" + post: + title: "Įrašai" + suggested_topics: + title: "Siūlomos Temos" diff --git a/plugins/styleguide/config/locales/client.lv.yml b/plugins/styleguide/config/locales/client.lv.yml index 59e0ef6f4edaa..e3e228c10a0de 100644 --- a/plugins/styleguide/config/locales/client.lv.yml +++ b/plugins/styleguide/config/locales/client.lv.yml @@ -5,3 +5,16 @@ # https://translate.discourse.org/ lv: + js: + styleguide: + sections: + categories: + title: "Sadaļas" + navigation: + title: "Pārvietošanās" + categories_list: + title: "Sadaļu saraksts" + post: + title: "Ieraksts" + suggested_topics: + title: "Ieteiktās tēmas" diff --git a/plugins/styleguide/config/locales/client.nb_NO.yml b/plugins/styleguide/config/locales/client.nb_NO.yml index 2e2224d147285..72b3cc18d1f2d 100644 --- a/plugins/styleguide/config/locales/client.nb_NO.yml +++ b/plugins/styleguide/config/locales/client.nb_NO.yml @@ -5,3 +5,24 @@ # https://translate.discourse.org/ nb_NO: + js: + styleguide: + sections: + typography: + example: "Velkommen til Discourse" + colors: + title: "Farger" + icons: + title: "Ikoner" + categories: + title: "Kategorier" + navigation: + title: "Navigasjon" + categories_list: + title: "Kategoriliste" + topic_timer_info: + title: "Tidsbestemte handlinger for emne" + post: + title: "Innlegg" + suggested_topics: + title: "Anbefalte emner" diff --git a/plugins/styleguide/config/locales/client.pt.yml b/plugins/styleguide/config/locales/client.pt.yml index 229b9ca0ff780..e2f2db112f7f3 100644 --- a/plugins/styleguide/config/locales/client.pt.yml +++ b/plugins/styleguide/config/locales/client.pt.yml @@ -8,7 +8,21 @@ pt: js: styleguide: sections: + typography: + example: "Bem-vindo ao Discourse" colors: title: "Cores" icons: title: "Ícones" + categories: + title: "Categorias" + navigation: + title: "Navegação" + categories_list: + title: "Lista de Categorias" + topic_timer_info: + title: "Temporizadores de Tópico" + post: + title: "Mensagem" + suggested_topics: + title: "Tópicos Sugeridos" diff --git a/plugins/styleguide/config/locales/client.pt_BR.yml b/plugins/styleguide/config/locales/client.pt_BR.yml index 7f3a060be2f92..5032b7676e4a5 100644 --- a/plugins/styleguide/config/locales/client.pt_BR.yml +++ b/plugins/styleguide/config/locales/client.pt_BR.yml @@ -18,5 +18,19 @@ pt_BR: title: "Tipografia" example: "Bem-vindo ao Discourse" paragraph: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." + colors: + title: "Cores" + icons: + title: "Ícones" + categories: + title: "Categorias" + navigation: + title: "Navegação" + categories_list: + title: "Lista de categorias" + topic_timer_info: + title: "Temporizadores de Tópico" + post: + title: "Mensagem" suggested_topics: title: "Tópicos Sugeridos" diff --git a/plugins/styleguide/config/locales/client.sk.yml b/plugins/styleguide/config/locales/client.sk.yml index 6f815624081c2..870b4393a50e9 100644 --- a/plugins/styleguide/config/locales/client.sk.yml +++ b/plugins/styleguide/config/locales/client.sk.yml @@ -5,3 +5,20 @@ # https://translate.discourse.org/ sk: + js: + styleguide: + sections: + typography: + example: "Vitajte v Discourse" + colors: + title: "Farby" + categories: + title: "Kategórie" + navigation: + title: "Navigácia" + categories_list: + title: "Zoznam kategórií" + post: + title: "Príspevok" + suggested_topics: + title: "Odporúčané témy" diff --git a/plugins/styleguide/config/locales/client.sl.yml b/plugins/styleguide/config/locales/client.sl.yml index 23489a48b1fe0..6cdc2c7596e83 100644 --- a/plugins/styleguide/config/locales/client.sl.yml +++ b/plugins/styleguide/config/locales/client.sl.yml @@ -5,3 +5,20 @@ # https://translate.discourse.org/ sl: + js: + styleguide: + sections: + colors: + title: "Barve" + categories: + title: "Kategorije" + navigation: + title: "Navigacija" + categories_list: + title: "Seznam kategorij" + topic_timer_info: + title: "Opomniki teme" + post: + title: "Prispevek" + suggested_topics: + title: "Predlagane teme" diff --git a/plugins/styleguide/config/locales/client.sq.yml b/plugins/styleguide/config/locales/client.sq.yml index 7f051b7a7cfdf..be6919030ca88 100644 --- a/plugins/styleguide/config/locales/client.sq.yml +++ b/plugins/styleguide/config/locales/client.sq.yml @@ -5,3 +5,18 @@ # https://translate.discourse.org/ sq: + js: + styleguide: + sections: + colors: + title: "Ngjyrat" + categories: + title: "Kategoritë" + navigation: + title: "Shfletimi" + categories_list: + title: "Lista Kategorive" + post: + title: "Postim" + suggested_topics: + title: "Temat e sugjeruara" diff --git a/plugins/styleguide/config/locales/client.sr.yml b/plugins/styleguide/config/locales/client.sr.yml index 88d63d6ae1a30..8475d1a3806cb 100644 --- a/plugins/styleguide/config/locales/client.sr.yml +++ b/plugins/styleguide/config/locales/client.sr.yml @@ -5,3 +5,16 @@ # https://translate.discourse.org/ sr: + js: + styleguide: + sections: + colors: + title: "Boje" + categories: + title: "Kategorije" + navigation: + title: "Navigacija" + categories_list: + title: "Lista Kategorija" + suggested_topics: + title: "Predložene Teme" diff --git a/plugins/styleguide/config/locales/client.sw.yml b/plugins/styleguide/config/locales/client.sw.yml index 0d7cdd075bfd0..3de74492187f4 100644 --- a/plugins/styleguide/config/locales/client.sw.yml +++ b/plugins/styleguide/config/locales/client.sw.yml @@ -5,3 +5,24 @@ # https://translate.discourse.org/ sw: + js: + styleguide: + sections: + typography: + example: "Karibu kwenye Discourse" + colors: + title: "Rangi" + icons: + title: "Ikoni" + categories: + title: "Vikundi" + navigation: + title: "Abiri" + categories_list: + title: "Orodha ya Kategoria" + topic_timer_info: + title: "Vipima Mda vya Mada" + post: + title: "Ujumbe" + suggested_topics: + title: "Mada Zilizopendekezwa" diff --git a/plugins/styleguide/config/locales/client.te.yml b/plugins/styleguide/config/locales/client.te.yml index 03967bdbb071a..2bcb5340823ed 100644 --- a/plugins/styleguide/config/locales/client.te.yml +++ b/plugins/styleguide/config/locales/client.te.yml @@ -5,3 +5,16 @@ # https://translate.discourse.org/ te: + js: + styleguide: + sections: + colors: + title: "రంగులు" + categories: + title: "వర్గాలు" + navigation: + title: "నావిగేషను" + categories_list: + title: "వర్గాల జాబితా" + suggested_topics: + title: "సూచించే విషయాలు" diff --git a/plugins/styleguide/config/locales/client.th.yml b/plugins/styleguide/config/locales/client.th.yml index 7de85ff91c499..7d428c8b2a8b9 100644 --- a/plugins/styleguide/config/locales/client.th.yml +++ b/plugins/styleguide/config/locales/client.th.yml @@ -5,3 +5,18 @@ # https://translate.discourse.org/ th: + js: + styleguide: + sections: + colors: + title: "สี" + categories: + title: "หมวดหมู่" + navigation: + title: "การนำทาง" + categories_list: + title: "รายชื่อหมวดหมู่" + post: + title: "โพสต์" + suggested_topics: + title: "กระทู้แนะนำ" diff --git a/plugins/styleguide/config/locales/client.ur.yml b/plugins/styleguide/config/locales/client.ur.yml index b4a9c21ee2fbd..209bdf2cb66fb 100644 --- a/plugins/styleguide/config/locales/client.ur.yml +++ b/plugins/styleguide/config/locales/client.ur.yml @@ -5,3 +5,24 @@ # https://translate.discourse.org/ ur: + js: + styleguide: + sections: + typography: + example: "ڈسکورس میں خوش آمدید" + colors: + title: "رنگ" + icons: + title: "آئیکن" + categories: + title: "زُمرَہ جات" + navigation: + title: "نیویگیشن" + categories_list: + title: "زمرہ جات فہرست" + topic_timer_info: + title: "ٹاپک ٹائمر" + post: + title: "پوسٹ" + suggested_topics: + title: "تجویز کیے گئے ٹاپک" diff --git a/plugins/styleguide/config/locales/client.vi.yml b/plugins/styleguide/config/locales/client.vi.yml index 3d38b964501e4..a7e30b392a847 100644 --- a/plugins/styleguide/config/locales/client.vi.yml +++ b/plugins/styleguide/config/locales/client.vi.yml @@ -8,13 +8,25 @@ vi: js: styleguide: sections: + typography: + example: "Chào mừng đến với Discourse" date_time_inputs: title: "Ngày/giờ nhập" + colors: + title: "Màu sắc" + categories: + title: "Chuyên mục" + navigation: + title: "Điều hướng" navigation_stacked: title: "Điều hướng xếp chồng lên nhau" + categories_list: + title: "Danh sách Danh mục" topic_statuses: title: "Trạng thái chủ đề" post: title: "Bài đăng" + suggested_topics: + title: "Chủ đề tương tự" modal: title: "Phương thức" diff --git a/plugins/styleguide/config/locales/client.zh_TW.yml b/plugins/styleguide/config/locales/client.zh_TW.yml index 7e15fab0018c8..55bace1237813 100644 --- a/plugins/styleguide/config/locales/client.zh_TW.yml +++ b/plugins/styleguide/config/locales/client.zh_TW.yml @@ -5,3 +5,24 @@ # https://translate.discourse.org/ zh_TW: + js: + styleguide: + sections: + typography: + example: "歡迎來到 Discourse" + colors: + title: "顏色" + icons: + title: "表徵圖" + categories: + title: "分類" + navigation: + title: "導航" + categories_list: + title: "分類清單" + topic_timer_info: + title: "話題計時器" + post: + title: "貼文" + suggested_topics: + title: "推薦的話題" From 05c1d3c9cdd7f3e365bedc397dd92a7e7bc2c40f Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Tue, 18 May 2021 16:38:17 -0400 Subject: [PATCH 002/689] Version bump to v2.8.0.beta1 (#13092) --- lib/version.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/version.rb b/lib/version.rb index caf866bb4ed83..68d8fb035e077 100644 --- a/lib/version.rb +++ b/lib/version.rb @@ -8,9 +8,9 @@ module Discourse unless defined? ::Discourse::VERSION module VERSION #:nodoc: MAJOR = 2 - MINOR = 7 + MINOR = 8 TINY = 0 - PRE = 'beta9' + PRE = 'beta1' STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.') end From 0eecf8aaa57492a0bc575346a9341fc55328be9e Mon Sep 17 00:00:00 2001 From: Gerhard Schlager Date: Wed, 19 May 2021 03:09:50 +0200 Subject: [PATCH 003/689] Fix typo (#13087) --- .../javascripts/admin/addon/components/suspension-details.js | 2 +- config/locales/client.en.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/admin/addon/components/suspension-details.js b/app/assets/javascripts/admin/addon/components/suspension-details.js index e99a7e1c5b8ad..fe931ae12e7c4 100644 --- a/app/assets/javascripts/admin/addon/components/suspension-details.js +++ b/app/assets/javascripts/admin/addon/components/suspension-details.js @@ -13,7 +13,7 @@ export default Component.extend({ reasonKeys: [ "not_listening_to_staff", "consuming_staff_time", - "combatative", + "combative", "in_wrong_place", "no_constructive_purpose", CUSTOM_REASON_KEY, diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 5f6e18e5fde8a..9ecbdd6df410e 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -4359,7 +4359,7 @@ en: yaml: text: "YAML" title: "Define theme settings in YAML format" - scss_color_variables_warning: "Using core SCSS color variables in themes is deprecated. Please use CSS custom properties instead. See this guide for more details." + scss_color_variables_warning: 'Using core SCSS color variables in themes is deprecated. Please use CSS custom properties instead. See this guide for more details.' scss_warning_inline: "Using core SCSS color variables in themes is deprecated." colors: select_base: @@ -4786,7 +4786,7 @@ en: suspend_reasons: not_listening_to_staff: "Would not listen to staff feedback" consuming_staff_time: "Consumed disproportionate amounts of staff time" - combatative: "Too combative" + combative: "Too combative" in_wrong_place: "In the wrong place" no_constructive_purpose: "No constructive purpose to their actions other than creating dissent within the community" custom: "Custom..." From 76ec0c98c29a800f91c5c1793655899dfb6165a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 May 2021 16:07:24 +1000 Subject: [PATCH 004/689] Build(deps): Bump nokogiri from 1.11.3 to 1.11.4 (#13074) Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.11.3 to 1.11.4. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.11.3...v1.11.4) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 2bbc42e7d2819..477a2d131245e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -232,14 +232,14 @@ GEM multipart-post (2.1.1) mustache (1.1.1) nio4r (2.5.7) - nokogiri (1.11.3) + nokogiri (1.11.4) mini_portile2 (~> 2.5.0) racc (~> 1.4) - nokogiri (1.11.3-arm64-darwin) + nokogiri (1.11.4-arm64-darwin) racc (~> 1.4) - nokogiri (1.11.3-x86_64-darwin) + nokogiri (1.11.4-x86_64-darwin) racc (~> 1.4) - nokogiri (1.11.3-x86_64-linux) + nokogiri (1.11.4-x86_64-linux) racc (~> 1.4) nokogumbo (2.0.5) nokogiri (~> 1.8, >= 1.8.4) From 85b0bcfbdcdcf5ac66fcf715ee3c762f0e33eb10 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 May 2021 16:08:47 +1000 Subject: [PATCH 005/689] Build(deps): Bump rubocop from 1.14.0 to 1.15.0 (#13079) Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.14.0 to 1.15.0. - [Release notes](https://github.com/rubocop/rubocop/releases) - [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop/rubocop/compare/v1.14.0...v1.15.0) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 477a2d131245e..297a7a6adc8f8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -382,7 +382,7 @@ GEM json-schema (~> 2.2) railties (>= 3.1, < 7.0) rtlit (0.0.5) - rubocop (1.14.0) + rubocop (1.15.0) parallel (~> 1.10) parser (>= 3.0.0.0) rainbow (>= 2.2.2, < 4.0) From f96f534f3e45d78058d9bb9f0b2b7198cf217cc8 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 19 May 2021 11:45:24 +0530 Subject: [PATCH 006/689] FIX: do not include contact url & email in client site settings payload (#13004) --- .../discourse/app/controllers/about.js | 17 +++---- .../discourse/tests/fixtures/site-settings.js | 11 ----- app/serializers/about_serializer.rb | 34 +++++++++++-- config/site_settings.yml | 2 - lib/guardian.rb | 4 ++ spec/components/guardian_spec.rb | 30 ++++++++++++ spec/serializers/about_serializer_spec.rb | 48 +++++++++++++++++++ 7 files changed, 117 insertions(+), 29 deletions(-) create mode 100644 spec/serializers/about_serializer_spec.rb diff --git a/app/assets/javascripts/discourse/app/controllers/about.js b/app/assets/javascripts/discourse/app/controllers/about.js index 26f3761bfd80e..b22ce0d0cd505 100644 --- a/app/assets/javascripts/discourse/app/controllers/about.js +++ b/app/assets/javascripts/discourse/app/controllers/about.js @@ -6,20 +6,15 @@ import { gt } from "@ember/object/computed"; export default Controller.extend({ faqOverriden: gt("siteSettings.faq_url.length", 0), - @discourseComputed - contactInfo() { - if (this.siteSettings.contact_url) { + @discourseComputed("model.contact_url", "model.contact_email") + contactInfo(url, email) { + if (url) { return I18n.t("about.contact_info", { - contact_info: - "" + - this.siteSettings.contact_url + - "", + contact_info: `${url}`, }); - } else if (this.siteSettings.contact_email) { + } else if (email) { return I18n.t("about.contact_info", { - contact_info: this.siteSettings.contact_email, + contact_info: email, }); } else { return null; diff --git a/app/assets/javascripts/discourse/tests/fixtures/site-settings.js b/app/assets/javascripts/discourse/tests/fixtures/site-settings.js index c35e10b069ec8..f5fca9c6613e0 100644 --- a/app/assets/javascripts/discourse/tests/fixtures/site-settings.js +++ b/app/assets/javascripts/discourse/tests/fixtures/site-settings.js @@ -11,17 +11,6 @@ export default { secret: false, type: "string" }, - { - setting: "contact_email", - description: - "Email address of key contact responsible for this site. Used for critical notifications and displayed on the /about page for urgent matters.", - default: "", - value: "", - category: "required", - preview: null, - secret: false, - type: "email" - }, { setting: "site_contact_username", description: diff --git a/app/serializers/about_serializer.rb b/app/serializers/about_serializer.rb index 8230c590a4cef..f55bdd34767b1 100644 --- a/app/serializers/about_serializer.rb +++ b/app/serializers/about_serializer.rb @@ -22,11 +22,9 @@ class AboutCategoryModsSerializer < ApplicationSerializer :locale, :version, :https, - :can_see_about_stats - - def can_see_about_stats - scope.can_see_about_stats? - end + :can_see_about_stats, + :contact_url, + :contact_email def include_stats? can_see_about_stats @@ -35,4 +33,30 @@ def include_stats? def stats object.class.fetch_cached_stats || Jobs::AboutStats.new.execute({}) end + + def include_contact_url? + can_see_site_contact_details + end + + def contact_url + SiteSetting.contact_url + end + + def include_contact_email? + can_see_site_contact_details + end + + def contact_email + SiteSetting.contact_email + end + + private + + def can_see_about_stats + scope.can_see_about_stats? + end + + def can_see_site_contact_details + scope.can_see_site_contact_details? + end end diff --git a/config/site_settings.yml b/config/site_settings.yml index 8da736a7efb66..3cc158a0e3e71 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -33,11 +33,9 @@ required: default: "" client: true contact_email: - client: true default: "" type: email contact_url: - client: true default: "" notification_email: default: "noreply@unconfigured.discourse.org" diff --git a/lib/guardian.rb b/lib/guardian.rb index 8bb2566c10583..7e5a11cc8ab8a 100644 --- a/lib/guardian.rb +++ b/lib/guardian.rb @@ -530,6 +530,10 @@ def can_see_about_stats? true end + def can_see_site_contact_details? + !SiteSetting.login_required? || authenticated? + end + def auth_token if cookie = request&.cookies[Auth::DefaultCurrentUserProvider::TOKEN_COOKIE] UserAuthToken.hash_token(cookie) diff --git a/spec/components/guardian_spec.rb b/spec/components/guardian_spec.rb index 54735be65b19a..38478cea97d11 100644 --- a/spec/components/guardian_spec.rb +++ b/spec/components/guardian_spec.rb @@ -3836,4 +3836,34 @@ end end end + + describe "can_see_site_contact_details" do + context "login_required is enabled" do + before do + SiteSetting.login_required = true + end + + it "is false for anonymous users" do + expect(Guardian.new.can_see_site_contact_details?).to eq(false) + end + + it "is true for regular users" do + expect(Guardian.new(user).can_see_site_contact_details?).to eq(true) + end + end + + context "login_required is disabled" do + before do + SiteSetting.login_required = false + end + + it "is true for anonymous users" do + expect(Guardian.new.can_see_site_contact_details?).to eq(true) + end + + it "is true for regular users" do + expect(Guardian.new(user).can_see_site_contact_details?).to eq(true) + end + end + end end diff --git a/spec/serializers/about_serializer_spec.rb b/spec/serializers/about_serializer_spec.rb new file mode 100644 index 0000000000000..86f86b2175007 --- /dev/null +++ b/spec/serializers/about_serializer_spec.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe AboutSerializer do + + fab!(:user) { Fabricate(:user) } + + context "login_required is enabled" do + before do + SiteSetting.login_required = true + SiteSetting.contact_url = "https://example.com/contact" + SiteSetting.contact_email = "example@foobar.com" + end + + it "contact details are hidden from anonymous users" do + json = AboutSerializer.new(About.new(nil), scope: Guardian.new(nil), root: nil).as_json + expect(json[:contact_url]).to eq(nil) + expect(json[:contact_email]).to eq(nil) + end + + it "contact details are visible to regular users" do + json = AboutSerializer.new(About.new(user), scope: Guardian.new(user), root: nil).as_json + expect(json[:contact_url]).to eq(SiteSetting.contact_url) + expect(json[:contact_email]).to eq(SiteSetting.contact_email) + end + end + + context "login_required is disabled" do + before do + SiteSetting.login_required = false + SiteSetting.contact_url = "https://example.com/contact" + SiteSetting.contact_email = "example@foobar.com" + end + + it "contact details are visible to anonymous users" do + json = AboutSerializer.new(About.new(nil), scope: Guardian.new(nil), root: nil).as_json + expect(json[:contact_url]).to eq(SiteSetting.contact_url) + expect(json[:contact_email]).to eq(SiteSetting.contact_email) + end + + it "contact details are visible to regular users" do + json = AboutSerializer.new(About.new(user), scope: Guardian.new(user), root: nil).as_json + expect(json[:contact_url]).to eq(SiteSetting.contact_url) + expect(json[:contact_email]).to eq(SiteSetting.contact_email) + end + end +end From 98736e15f048e5aa98e0dbf04c65988f531494ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 May 2021 16:40:58 +1000 Subject: [PATCH 007/689] Build(deps): Bump faker from 2.17.0 to 2.18.0 (#13073) Bumps [faker](https://github.com/faker-ruby/faker) from 2.17.0 to 2.18.0. - [Release notes](https://github.com/faker-ruby/faker/releases) - [Changelog](https://github.com/faker-ruby/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/faker-ruby/faker/compare/v2.17.0...v2.18.0) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 297a7a6adc8f8..49af31047bf4b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -138,7 +138,7 @@ GEM execjs (2.8.1) exifr (1.3.9) fabrication (2.22.0) - faker (2.17.0) + faker (2.18.0) i18n (>= 1.6, < 2) fakeweb (1.3.0) faraday (1.4.1) From 3e0f72f57f6f4af21a9457484277fb22ce09f21b Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Wed, 19 May 2021 13:57:21 +0400 Subject: [PATCH 008/689] FEATURE: Increase daily edit limits proportionally to trust level (#13090) --- config/locales/server.en.yml | 4 +++ config/site_settings.yml | 3 ++ lib/edit_rate_limiter.rb | 10 +++++- spec/components/post_revisor_spec.rb | 48 ++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 1 deletion(-) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index feb1bc07557ab..57dffffcb1b36 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1582,6 +1582,10 @@ en: tl2_additional_likes_per_day_multiplier: "Increase limit of likes per day for tl2 (member) by multiplying with this number" tl3_additional_likes_per_day_multiplier: "Increase limit of likes per day for tl3 (regular) by multiplying with this number" tl4_additional_likes_per_day_multiplier: "Increase limit of likes per day for tl4 (leader) by multiplying with this number" + tl2_additional_edits_per_day_multiplier: "Increase limit of edits per day for tl2 (member) by multiplying with this number" + tl3_additional_edits_per_day_multiplier: "Increase limit of edits per day for tl3 (regular) by multiplying with this number" + tl4_additional_edits_per_day_multiplier: "Increase limit of edits per day for tl4 (leader) by multiplying with this number" + num_users_to_silence_new_user: "If a new user's posts get num_spam_flags_to_silence_new_user spam flags from this many different users, hide all their posts and prevent future posting. 0 to disable." num_tl3_flags_to_silence_new_user: "If a new user's posts get this many flags from num_tl3_users_to_silence_new_user different trust level 3 users, hide all their posts and prevent future posting. 0 to disable." num_tl3_users_to_silence_new_user: "If a new user's posts get num_tl3_flags_to_silence_new_user flags from this many different trust level 3 users, hide all their posts and prevent future posting. 0 to disable." diff --git a/config/site_settings.yml b/config/site_settings.yml index 3cc158a0e3e71..a1538e5085103 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -1746,6 +1746,9 @@ rate_limits: tl2_additional_likes_per_day_multiplier: 1.5 tl3_additional_likes_per_day_multiplier: 2 tl4_additional_likes_per_day_multiplier: 3 + tl2_additional_edits_per_day_multiplier: 1.5 + tl3_additional_edits_per_day_multiplier: 2 + tl4_additional_edits_per_day_multiplier: 3 alert_admins_if_errors_per_minute: client: true default: 0 diff --git a/lib/edit_rate_limiter.rb b/lib/edit_rate_limiter.rb index 04d095f66dc99..d9769f52621e7 100644 --- a/lib/edit_rate_limiter.rb +++ b/lib/edit_rate_limiter.rb @@ -3,7 +3,15 @@ require 'rate_limiter' class EditRateLimiter < RateLimiter def initialize(user) - super(user, "edit-post", SiteSetting.max_edits_per_day, 1.day.to_i) + limit = SiteSetting.max_edits_per_day + + if user.trust_level >= 2 + multiplier = SiteSetting.get("tl#{user.trust_level}_additional_edits_per_day_multiplier").to_f + multiplier = 1.0 if multiplier < 1.0 + limit = (limit * multiplier).to_i + end + + super(user, "edit-post", limit, 1.day.to_i) end def build_key(type) diff --git a/spec/components/post_revisor_spec.rb b/spec/components/post_revisor_spec.rb index 5d1fe8bb4a467..551c2bc440a54 100644 --- a/spec/components/post_revisor_spec.rb +++ b/spec/components/post_revisor_spec.rb @@ -485,10 +485,58 @@ describe 'rate limiter' do fab!(:changed_by) { Fabricate(:coding_horror) } + before do + RateLimiter.enable + RateLimiter.clear_all! + SiteSetting.editing_grace_period = 0 + end + it "triggers a rate limiter" do EditRateLimiter.any_instance.expects(:performed!) subject.revise!(changed_by, raw: 'updated body') end + + it "raises error when a user gets rate limited" do + SiteSetting.max_edits_per_day = 1 + user = Fabricate(:user, trust_level: 1) + + subject.revise!(user, raw: 'body (edited)') + + expect do + subject.revise!(user, raw: 'body (edited twice) ') + end.to raise_error(RateLimiter::LimitExceeded) + end + + it "edit limits scale up depending on user's trust level" do + SiteSetting.max_edits_per_day = 1 + SiteSetting.tl2_additional_edits_per_day_multiplier = 2 + SiteSetting.tl3_additional_edits_per_day_multiplier = 3 + SiteSetting.tl4_additional_edits_per_day_multiplier = 4 + + user = Fabricate(:user, trust_level: 2) + expect { subject.revise!(user, raw: 'body (edited)') }.to_not raise_error + expect { subject.revise!(user, raw: 'body (edited twice)') }.to_not raise_error + expect do + subject.revise!(user, raw: 'body (edited three times) ') + end.to raise_error(RateLimiter::LimitExceeded) + + user = Fabricate(:user, trust_level: 3) + expect { subject.revise!(user, raw: 'body (edited)') }.to_not raise_error + expect { subject.revise!(user, raw: 'body (edited twice)') }.to_not raise_error + expect { subject.revise!(user, raw: 'body (edited three times)') }.to_not raise_error + expect do + subject.revise!(user, raw: 'body (edited four times) ') + end.to raise_error(RateLimiter::LimitExceeded) + + user = Fabricate(:user, trust_level: 4) + expect { subject.revise!(user, raw: 'body (edited)') }.to_not raise_error + expect { subject.revise!(user, raw: 'body (edited twice)') }.to_not raise_error + expect { subject.revise!(user, raw: 'body (edited three times)') }.to_not raise_error + expect { subject.revise!(user, raw: 'body (edited four times)') }.to_not raise_error + expect do + subject.revise!(user, raw: 'body (edited five times) ') + end.to raise_error(RateLimiter::LimitExceeded) + end end describe "admin editing a new user's post" do From 6d3c97551942a0dae58e021d157aed1e3949717d Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Wed, 19 May 2021 14:01:23 +0400 Subject: [PATCH 009/689] FIX: backtracking re-render" assertion in future-date-input (#13075) > Backtracking re-render refers to a scenario where, in the middle of the rendering process, you have modified something that has already been rendered. See more details from the Ember team here https://github.com/emberjs/ember.js/issues/13948. We call _updateInput from init. _updateInput triggers onChangeInput which mutates a date that was given to future-date-input just a moment ago and a rendering cycle wasn't finished yet. --- .../javascripts/discourse/app/components/future-date-input.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/components/future-date-input.js b/app/assets/javascripts/discourse/app/components/future-date-input.js index 5dfed3af56603..b76c31d7ebb8c 100644 --- a/app/assets/javascripts/discourse/app/components/future-date-input.js +++ b/app/assets/javascripts/discourse/app/components/future-date-input.js @@ -24,7 +24,6 @@ export default Component.extend({ date: datetime.format("YYYY-MM-DD"), time: datetime.format("HH:mm"), }); - this._updateInput(); } }, From 9e4288a4ab8c7b176271c1c99b149b472c23854d Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Wed, 19 May 2021 14:26:15 +0400 Subject: [PATCH 010/689] FEATURE: constrain post_excerpt_maxlength (#13064) Too long excerpts don't make sense. They would make UI wonky. We already have a constraint for the `topic_excerpt_maxlength` setting. This adds the same constraint to `post_excerpt_maxlength`. It also changes the max value of `topic_excerpt_maxlength` from 999 to 1000. --- config/site_settings.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/site_settings.yml b/config/site_settings.yml index a1538e5085103..b79b92470ec8e 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -863,13 +863,14 @@ posting: default: 0 post_excerpt_maxlength: default: 300 + max: 1000 locale_default: ja: 120 zh_CN: 120 zh_TW: 120 topic_excerpt_maxlength: default: 220 - max: 999 + max: 1000 locale_default: ja: 120 zh_CN: 120 From 075cd07a0772936d1369a66c6643dd0d6d3e1873 Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Wed, 19 May 2021 16:04:35 +0400 Subject: [PATCH 011/689] No need to disable rate limiter after running tests (#13093) We disable rate limiter before running every test here https://github.com/discourse/discourse/blob/90ab3b1c7575772aed87755e302aea530909af9a/spec/rails_helper.rb#L109-L109 --- .../auth/default_current_user_provider_spec.rb | 12 ------------ spec/components/middleware/anonymous_cache_spec.rb | 4 ---- spec/components/middleware/request_tracker_spec.rb | 1 - spec/components/rate_limiter_spec.rb | 4 ---- spec/integration/rate_limiting_spec.rb | 4 ---- spec/models/category_spec.rb | 4 ---- spec/models/topic_spec.rb | 2 -- spec/requests/application_controller_spec.rb | 2 -- spec/requests/invites_controller_spec.rb | 2 -- spec/requests/users_controller_spec.rb | 1 - spec/requests/users_email_controller_spec.rb | 1 - 11 files changed, 37 deletions(-) diff --git a/spec/components/auth/default_current_user_provider_spec.rb b/spec/components/auth/default_current_user_provider_spec.rb index 94b34292d615c..1ff3e6e6f9ca3 100644 --- a/spec/components/auth/default_current_user_provider_spec.rb +++ b/spec/components/auth/default_current_user_provider_spec.rb @@ -195,10 +195,6 @@ def provider(url, opts = nil) RateLimiter.enable end - after do - RateLimiter.disable - end - it "rate limits api requests per api key" do global_setting :max_admin_api_reqs_per_key_per_minute, 3 @@ -424,10 +420,6 @@ def provider(url, opts = nil) RateLimiter.enable end - after do - RateLimiter.disable - end - it "can only try 10 bad cookies a minute" do token = UserAuthToken.generate!(user_id: user.id) @@ -627,10 +619,6 @@ def provider(url, opts = nil) RateLimiter.enable end - after do - RateLimiter.disable - end - it "rate limits api usage" do limiter1 = RateLimiter.new(nil, "user_api_day_#{api_key.key}", 10, 60) limiter2 = RateLimiter.new(nil, "user_api_min_#{api_key.key}", 10, 60) diff --git a/spec/components/middleware/anonymous_cache_spec.rb b/spec/components/middleware/anonymous_cache_spec.rb index e2beddc40a8fd..33089a2527846 100644 --- a/spec/components/middleware/anonymous_cache_spec.rb +++ b/spec/components/middleware/anonymous_cache_spec.rb @@ -178,10 +178,6 @@ def new_helper(opts = {}) RateLimiter.enable end - after do - RateLimiter.disable - end - it 'will revert to anonymous once we reach the limit' do RateLimiter.clear_all! diff --git a/spec/components/middleware/request_tracker_spec.rb b/spec/components/middleware/request_tracker_spec.rb index 459b9688f5ca5..c4ee17de29702 100644 --- a/spec/components/middleware/request_tracker_spec.rb +++ b/spec/components/middleware/request_tracker_spec.rb @@ -205,7 +205,6 @@ def warn(*args) end after do - RateLimiter.disable Rails.logger = @old_logger end diff --git a/spec/components/rate_limiter_spec.rb b/spec/components/rate_limiter_spec.rb index 2b32df750d65d..4802feac935f6 100644 --- a/spec/components/rate_limiter_spec.rb +++ b/spec/components/rate_limiter_spec.rb @@ -34,10 +34,6 @@ rate_limiter.clear! end - after do - RateLimiter.disable - end - context 'aggressive rate limiter' do it 'can operate correctly and totally stop limiting' do diff --git a/spec/integration/rate_limiting_spec.rb b/spec/integration/rate_limiting_spec.rb index 353569ef61dc3..e7bb8f3f35257 100644 --- a/spec/integration/rate_limiting_spec.rb +++ b/spec/integration/rate_limiting_spec.rb @@ -10,10 +10,6 @@ RateLimiter.clear_all! end - after do - RateLimiter.disable - end - it "will rate limit message bus requests once queueing" do freeze_time diff --git a/spec/models/category_spec.rb b/spec/models/category_spec.rb index 2454364d76664..63c384990303f 100644 --- a/spec/models/category_spec.rb +++ b/spec/models/category_spec.rb @@ -875,10 +875,6 @@ end describe 'auto bump' do - after do - RateLimiter.disable - end - it 'should correctly automatically bump topics' do freeze_time category = Fabricate(:category_with_definition, created_at: 1.minute.ago) diff --git a/spec/models/topic_spec.rb b/spec/models/topic_spec.rb index 07f4de9684271..57ff44c4f6283 100644 --- a/spec/models/topic_spec.rb +++ b/spec/models/topic_spec.rb @@ -629,7 +629,6 @@ def build_topic_with_title(title) after do RateLimiter.clear_all! - RateLimiter.disable end it "rate limits topic invitations" do @@ -2296,7 +2295,6 @@ def set_state!(group, user, state) after do RateLimiter.clear_all! - RateLimiter.disable end it "limits according to max_personal_messages_per_day" do diff --git a/spec/requests/application_controller_spec.rb b/spec/requests/application_controller_spec.rb index 0fde425c27ab6..2e76f30a8cde8 100644 --- a/spec/requests/application_controller_spec.rb +++ b/spec/requests/application_controller_spec.rb @@ -692,8 +692,6 @@ def parse(csp_string) RateLimiter.enable end - after { RateLimiter.disable } - it "serves a LimitExceeded error in the preferred locale" do SiteSetting.max_likes_per_day = 1 post1 = Fabricate(:post) diff --git a/spec/requests/invites_controller_spec.rb b/spec/requests/invites_controller_spec.rb index aecfa505caea1..6dc26b8a2402c 100644 --- a/spec/requests/invites_controller_spec.rb +++ b/spec/requests/invites_controller_spec.rb @@ -320,8 +320,6 @@ .to change { RateLimiter.new(user, 'resend-invite-per-hour', 10, 1.hour).remaining }.by(-1) expect(response.status).to eq(200) expect(Jobs::InviteEmail.jobs.size).to eq(1) - ensure - RateLimiter.disable end it 'cannot create duplicated invites' do diff --git a/spec/requests/users_controller_spec.rb b/spec/requests/users_controller_spec.rb index 4bbf1fdeac9d8..e7430a9a6caa9 100644 --- a/spec/requests/users_controller_spec.rb +++ b/spec/requests/users_controller_spec.rb @@ -324,7 +324,6 @@ context "rate limiting" do before { RateLimiter.clear_all!; RateLimiter.enable } - after { RateLimiter.disable } it "rate limits reset passwords" do freeze_time diff --git a/spec/requests/users_email_controller_spec.rb b/spec/requests/users_email_controller_spec.rb index ffb7b1f00e65e..046e6188573ec 100644 --- a/spec/requests/users_email_controller_spec.rb +++ b/spec/requests/users_email_controller_spec.rb @@ -134,7 +134,6 @@ context "rate limiting" do before { RateLimiter.clear_all!; RateLimiter.enable } - after { RateLimiter.disable } it "rate limits by IP" do freeze_time From 130160537c9f40a5012715435e579b2c1441604b Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 19 May 2021 20:54:52 +0530 Subject: [PATCH 012/689] FEATURE: add support for "skip_validations" option in UploadCreator (#13094) FIX: do not validate uploads when running `uploads:fix_missing_s3` task --- lib/tasks/uploads.rake | 2 +- lib/upload_creator.rb | 6 ++++-- spec/lib/upload_creator_spec.rb | 26 ++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/lib/tasks/uploads.rake b/lib/tasks/uploads.rake index 8d183a58a5f9f..99bbbe283034c 100644 --- a/lib/tasks/uploads.rake +++ b/lib/tasks/uploads.rake @@ -1024,7 +1024,7 @@ def fix_missing_s3 Upload.transaction do begin upload.update_column(:sha1, SecureRandom.hex) - fixed_upload = UploadCreator.new(tempfile, "temp.#{upload.extension}").create_for(Discourse.system_user.id) + fixed_upload = UploadCreator.new(tempfile, "temp.#{upload.extension}", skip_validations: true).create_for(Discourse.system_user.id) rescue => fix_error # invalid extension is the most common issue end diff --git a/lib/upload_creator.rb b/lib/upload_creator.rb index 63364e7b4f151..cd2f4c11da33f 100644 --- a/lib/upload_creator.rb +++ b/lib/upload_creator.rb @@ -24,11 +24,13 @@ class UploadCreator # - pasted (boolean) # - for_export (boolean) # - for_gravatar (boolean) + # - skip_validations (boolean) def initialize(file, filename, opts = {}) @file = file @filename = (filename || "").gsub(/[^[:print:]]/, "") @upload = Upload.new(original_filename: @filename, filesize: 0) @opts = opts + @opts[:validate] = opts[:skip_validations].present? ? !ActiveRecord::Type::Boolean.new.cast(opts[:skip_validations]) : true end def create_for(user_id) @@ -151,7 +153,7 @@ def create_for(user_id) @upload.assign_attributes(attrs) end - return @upload unless @upload.save + return @upload unless @upload.save(validate: @opts[:validate]) DiscourseEvent.trigger(:before_upload_creation, @file, is_image, @opts[:for_export]) @@ -161,7 +163,7 @@ def create_for(user_id) if url.present? @upload.url = url - @upload.save! + @upload.save!(validate: @opts[:validate]) else @upload.errors.add(:url, I18n.t("upload.store_failure", upload_id: @upload.id, user_id: user_id)) end diff --git a/spec/lib/upload_creator_spec.rb b/spec/lib/upload_creator_spec.rb index 69f24507ffab0..3fafb3225eacb 100644 --- a/spec/lib/upload_creator_spec.rb +++ b/spec/lib/upload_creator_spec.rb @@ -504,6 +504,32 @@ def expect_no_public_context_uploads_to_be_secure expect(FastImage.size(Discourse.store.path_for(upload))).to eq([320, 320]) end end + + describe 'skip validations' do + let(:filename) { "small.pdf" } + let(:file) { file_from_fixtures(filename, "pdf") } + + before do + SiteSetting.authorized_extensions = 'png|jpg' + end + + it 'creates upload when skip_validations is true' do + upload = UploadCreator.new(file, filename, + skip_validations: true + ).create_for(user.id) + + expect(upload.persisted?).to eq(true) + expect(upload.original_filename).to eq(filename) + end + + it 'does not create upload when skip_validations is false' do + upload = UploadCreator.new(file, filename, + skip_validations: false + ).create_for(user.id) + + expect(upload.persisted?).to eq(false) + end + end end describe '#clean_svg!' do From 1a620cb01fbebcc9273ad9025d0ce3cb1e78c6b3 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 20 May 2021 15:28:36 +1000 Subject: [PATCH 013/689] FEATURE: allow for notification of up to 20 group owners (#13081) The 5 limit appears to be too low. Limiting to 20 group owners, though high seems like a fairer limit. Also... spec cleanup --- app/controllers/groups_controller.rb | 6 ++++-- spec/requests/groups_controller_spec.rb | 7 +------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 9dc1c43a40154..576509eaaf97b 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -480,6 +480,8 @@ def remove_member ) end + MAX_NOTIFIED_OWNERS ||= 20 + def request_membership params.require(:reason) @@ -487,14 +489,14 @@ def request_membership begin GroupRequest.create!(group: group, user: current_user, reason: params[:reason]) - rescue ActiveRecord::RecordNotUnique => e + rescue ActiveRecord::RecordNotUnique return render json: failed_json.merge(error: I18n.t("groups.errors.already_requested_membership")), status: 409 end usernames = [current_user.username].concat( group.users.where('group_users.owner') .order("users.last_seen_at DESC") - .limit(5) + .limit(MAX_NOTIFIED_OWNERS) .pluck("users.username") ) diff --git a/spec/requests/groups_controller_spec.rb b/spec/requests/groups_controller_spec.rb index 1f35f3dad2ef2..817ef5c63d0b1 100644 --- a/spec/requests/groups_controller_spec.rb +++ b/spec/requests/groups_controller_spec.rb @@ -1405,10 +1405,7 @@ def expect_type_to_return_right_groups(type, expected_group_ids) it "will invite the user if their username and email are both invited" do new_user = Fabricate(:user) put "/groups/#{group.id}/members.json", params: { usernames: new_user.username, emails: new_user.email } - expect(response.status).to eq(200) - body = response.parsed_body - expect(new_user.reload.group_ids.include?(group.id)).to eq(true) end @@ -1471,8 +1468,6 @@ def expect_type_to_return_right_groups(type, expected_group_ids) it "raises an error if user to be removed is not found" do delete "/groups/#{group.id}/members.json", params: { user_id: -10 } - - response_body = response.parsed_body expect(response.status).to eq(400) end @@ -1627,7 +1622,7 @@ def expect_type_to_return_right_groups(type, expected_group_ids) end it "sends a private message when accepted" do - group_request = GroupRequest.create!(group: group, user: other_user) + GroupRequest.create!(group: group, user: other_user) expect { put "/groups/#{group.id}/handle_membership_request.json", params: { user_id: other_user.id, accept: true } } .to change { Topic.count }.by(1) .and change { Post.count }.by(1) From 626b8465baed15799b89135d79c9b8a00eda3bb7 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Thu, 20 May 2021 10:59:09 +0530 Subject: [PATCH 014/689] FIX: do not validate uploads when running `uploads:fix_missing_s3` task (#13096) --- lib/tasks/uploads.rake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/tasks/uploads.rake b/lib/tasks/uploads.rake index 99bbbe283034c..a085e0e1b5477 100644 --- a/lib/tasks/uploads.rake +++ b/lib/tasks/uploads.rake @@ -1036,7 +1036,8 @@ def fix_missing_s3 else # we do not fix sha, it may be wrong for arbitrary reasons, if we correct it # we may end up breaking posts - upload.update!(etag: fixed_upload.etag, url: fixed_upload.url, verification_status: Upload.verification_statuses[:unchecked]) + upload.assign_attributes(etag: fixed_upload.etag, url: fixed_upload.url, verification_status: Upload.verification_statuses[:unchecked]) + upload.save!(validate: false) OptimizedImage.where(upload_id: upload.id).destroy_all rebake_ids = PostUpload.where(upload_id: upload.id).pluck(:post_id) From a532e64389a30793a7aacf940c369c6f6453fcac Mon Sep 17 00:00:00 2001 From: Kris Date: Thu, 20 May 2021 02:00:45 -0400 Subject: [PATCH 015/689] DEV: Some select-box headers don't need a class (#12992) * DEV: Some select-box headers don't need a class * remove duplicate class --- .../select-kit/addon/components/composer-actions.js | 1 + .../dropdown-select-box/dropdown-select-box-header.js | 9 +++++++-- .../select-kit/addon/components/period-chooser.js | 1 + .../addon/components/toolbar-popup-menu-options.js | 1 + 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/select-kit/addon/components/composer-actions.js b/app/assets/javascripts/select-kit/addon/components/composer-actions.js index f3221e25aa758..b518602da7b10 100644 --- a/app/assets/javascripts/select-kit/addon/components/composer-actions.js +++ b/app/assets/javascripts/select-kit/addon/components/composer-actions.js @@ -37,6 +37,7 @@ export default DropdownSelectBoxComponent.extend({ filterable: false, showFullTitle: false, preventHeaderFocus: true, + customStyle: true, }, @discourseComputed("isEditing", "action", "whisper", "noBump", "isInSlowMode") diff --git a/app/assets/javascripts/select-kit/addon/components/dropdown-select-box/dropdown-select-box-header.js b/app/assets/javascripts/select-kit/addon/components/dropdown-select-box/dropdown-select-box-header.js index c8115d48500fa..1cb0ca1bace42 100644 --- a/app/assets/javascripts/select-kit/addon/components/dropdown-select-box/dropdown-select-box-header.js +++ b/app/assets/javascripts/select-kit/addon/components/dropdown-select-box/dropdown-select-box-header.js @@ -5,17 +5,22 @@ import { readOnly } from "@ember/object/computed"; export default SingleSelectHeaderComponent.extend({ layout, - classNames: ["btn-default", "dropdown-select-box-header"], + classNames: ["dropdown-select-box-header"], tagName: "button", - classNameBindings: ["btnClassName"], + classNameBindings: ["btnClassName", "btnStyleClass"], showFullTitle: readOnly("selectKit.options.showFullTitle"), attributeBindings: ["buttonType:type"], buttonType: "button", + customStyle: readOnly("selectKit.options.customStyle"), btnClassName: computed("showFullTitle", function () { return `btn ${this.showFullTitle ? "btn-icon-text" : "no-text btn-icon"}`; }), + btnStyleClass: computed("customStyle", function () { + return `${this.customStyle ? "" : "btn-default"}`; + }), + caretUpIcon: readOnly("selectKit.options.caretUpIcon"), caretDownIcon: readOnly("selectKit.options.caretDownIcon"), diff --git a/app/assets/javascripts/select-kit/addon/components/period-chooser.js b/app/assets/javascripts/select-kit/addon/components/period-chooser.js index b117b0f06c0b2..c09c8708148c9 100644 --- a/app/assets/javascripts/select-kit/addon/components/period-chooser.js +++ b/app/assets/javascripts/select-kit/addon/components/period-chooser.js @@ -18,6 +18,7 @@ export default DropdownSelectBoxComponent.extend({ filterable: false, autoFilterable: false, fullDay: "fullDay", + customStyle: true, headerComponent: "period-chooser/period-chooser-header", }, diff --git a/app/assets/javascripts/select-kit/addon/components/toolbar-popup-menu-options.js b/app/assets/javascripts/select-kit/addon/components/toolbar-popup-menu-options.js index ce8cb476a996d..250c906143ec2 100644 --- a/app/assets/javascripts/select-kit/addon/components/toolbar-popup-menu-options.js +++ b/app/assets/javascripts/select-kit/addon/components/toolbar-popup-menu-options.js @@ -10,6 +10,7 @@ export default DropdownSelectBoxComponent.extend({ filterable: false, autoFilterable: false, preventHeaderFocus: true, + customStyle: true, }, modifyContent(contents) { From 958b56dc6cb175172e7fcc55d6ab4fdb876233b3 Mon Sep 17 00:00:00 2001 From: Alan Guo Xiang Tan Date: Thu, 20 May 2021 14:01:54 +0800 Subject: [PATCH 016/689] PERF: Precompile child theme stylesheets. (#13040) Previously, we only precompiled the CSS for parent themes but not for the child themes. As a result, the CSS for child themes were being compiled during the first request which made the respond time high for that request. --- lib/stylesheet/manager.rb | 22 +++++++++++++----- spec/components/stylesheet/manager_spec.rb | 26 ++++++++++++++++++++-- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/lib/stylesheet/manager.rb b/lib/stylesheet/manager.rb index 91f449c06e3d1..86e2552d243a9 100644 --- a/lib/stylesheet/manager.rb +++ b/lib/stylesheet/manager.rb @@ -164,13 +164,23 @@ def self.precompile_css themes.each do |id, name, color_scheme_id| targets.each do |target| theme_id = id || SiteSetting.default_theme_id - next if target =~ THEME_REGEX && theme_id == -1 - cache_key = "#{target}_#{theme_id}" - STDERR.puts "precompile target: #{target} #{name}" - builder = self.new(target, theme_id) - builder.compile(force: true) - cache[cache_key] = nil + if target =~ THEME_REGEX + next if theme_id == -1 + + theme_ids = Theme.transform_ids([theme_id], extend: true) + + theme_ids.each do |t_id| + builder = self.new(target, t_id) + STDERR.puts "precompile target: #{target} #{builder.theme.name}" + next if builder.theme.component && !builder.theme.has_scss(target) + builder.compile(force: true) + end + else + STDERR.puts "precompile target: #{target} #{name}" + builder = self.new(target, theme_id) + builder.compile(force: true) + end end theme_color_scheme = ColorScheme.find_by_id(color_scheme_id) || ColorScheme.base diff --git a/spec/components/stylesheet/manager_spec.rb b/spec/components/stylesheet/manager_spec.rb index ef21907509049..b82d49f8ddac1 100644 --- a/spec/components/stylesheet/manager_spec.rb +++ b/spec/components/stylesheet/manager_spec.rb @@ -485,6 +485,27 @@ def write(x) Theme.update_all(user_selectable: false) user_theme = Fabricate(:theme, user_selectable: true, color_scheme: scheme1) default_theme = Fabricate(:theme, user_selectable: true, color_scheme: scheme2) + + child_theme = Fabricate(:theme).tap do |t| + t.component = true + t.save! + user_theme.add_relative_theme!(:child, t) + end + + child_theme_with_css = Fabricate(:theme).tap do |t| + t.component = true + + t.set_field( + target: :common, + name: :scss, + value: "body { background: green }" + ) + + t.save! + + user_theme.add_relative_theme!(:child, t) + end + default_theme.set_default! StylesheetCache.destroy_all @@ -492,7 +513,8 @@ def write(x) Stylesheet::Manager.precompile_css results = StylesheetCache.pluck(:target) - expect(results.size).to eq(22) # (2 themes x 8 targets) + 6 color schemes (2 custom theme schemes, 4 base schemes) + expect(results.size).to eq(24) # (2 themes x 8 targets) + (1 child Theme x 2 targets) + 6 color schemes (2 custom theme schemes, 4 base schemes) + core_targets.each do |tar| expect(results.count { |target| target =~ /^#{tar}_(#{scheme1.id}|#{scheme2.id})$/ }).to eq(2) end @@ -507,7 +529,7 @@ def write(x) Stylesheet::Manager.precompile_css results = StylesheetCache.pluck(:target) - expect(results.size).to eq(28) # (2 themes x 8 targets) + (1 no/default/core theme x 6 core targets) + 6 color schemes (2 custom theme schemes, 4 base schemes) + expect(results.size).to eq(30) # (2 themes x 8 targets) + (1 child Theme x 2 targets) + (1 no/default/core theme x 6 core targets) + 6 color schemes (2 custom theme schemes, 4 base schemes) core_targets.each do |tar| expect(results.count { |target| target =~ /^(#{tar}_(#{scheme1.id}|#{scheme2.id})|#{tar})$/ }).to eq(3) From 74ad2d369ece9eafb353bb8c3c098353088ebfbd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 May 2021 16:02:10 +1000 Subject: [PATCH 017/689] Build(deps-dev): Bump webmock from 3.12.2 to 3.13.0 (#13072) Bumps [webmock](https://github.com/bblimke/webmock) from 3.12.2 to 3.13.0. - [Release notes](https://github.com/bblimke/webmock/releases) - [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md) - [Commits](https://github.com/bblimke/webmock/compare/v3.12.2...v3.13.0) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 49af31047bf4b..c00bd4093da7d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -459,7 +459,7 @@ GEM raindrops (~> 0.7) uniform_notifier (1.14.2) uri_template (0.7.0) - webmock (3.12.2) + webmock (3.13.0) addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) From 28e201f3919e23d734a5414f18dbf83d1d52a5e0 Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Thu, 20 May 2021 10:06:38 +0400 Subject: [PATCH 018/689] DEV: add timezone to user fixtures (#13095) --- .../javascripts/discourse/tests/fixtures/user-fixtures.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/assets/javascripts/discourse/tests/fixtures/user-fixtures.js b/app/assets/javascripts/discourse/tests/fixtures/user-fixtures.js index 717142ebafa45..3fdf904693e67 100644 --- a/app/assets/javascripts/discourse/tests/fixtures/user-fixtures.js +++ b/app/assets/javascripts/discourse/tests/fixtures/user-fixtures.js @@ -294,6 +294,7 @@ export default { day_6_start_time: 480, day_6_end_time: 1020, }, + timezone: "Australia/Brisbane", }, }, "/u/eviltrout/card.json": { @@ -2680,6 +2681,7 @@ export default { text_size: "normal", text_size_seq: 0, }, + timezone: "America/Los_Angeles", }, }, "/u/charlie/card.json": { @@ -2994,6 +2996,7 @@ export default { text_size_seq: 0, title_count_mode: "notifications", }, + timezone: "Asia/Tokyo", }, }, "/u/%E3%83%A9%E3%82%A4%E3%82%AA%E3%83%B3/summary.json": { From f1b14a7f719815ba9913e79d02139b0150cac24b Mon Sep 17 00:00:00 2001 From: Kris Date: Thu, 20 May 2021 02:28:03 -0400 Subject: [PATCH 019/689] FIX: Specificity and other fixes for WCAG colors (#13082) --- app/assets/stylesheets/wcag.scss | 444 +++++++++++++++++-------------- 1 file changed, 242 insertions(+), 202 deletions(-) diff --git a/app/assets/stylesheets/wcag.scss b/app/assets/stylesheets/wcag.scss index ade65af9445ba..aac73ba06cce2 100644 --- a/app/assets/stylesheets/wcag.scss +++ b/app/assets/stylesheets/wcag.scss @@ -7,7 +7,7 @@ opacity: 1; } -.discourse-no-touch { +html.discourse-no-touch { .btn-default, .btn-icon { &.btn-default { @@ -37,271 +37,311 @@ } } -.nav-pills > li > a:not(.active):hover { - background: var(--tertiary-low); - color: var(--primary); -} - -// Composer +html { + // html parent adds some additional specificity to override core styles + .nav-pills > li > a:not(.active):hover { + background: var(--tertiary-low); + color: var(--primary); + } -#reply-control .reply-to .reply-details .d-icon { - opacity: 1; - color: var(--primary-low-mid); -} + // Composer -.d-editor-button-bar { - .btn-icon.btn-default .d-icon { + #reply-control .reply-to .reply-details .d-icon { + opacity: 1; color: var(--primary-low-mid); - .discourse-no-touch & { - &:hover { - color: var(--secondary); + } + + .d-editor-button-bar { + .btn-icon.btn-default .d-icon { + color: var(--primary-low-mid); + .discourse-no-touch & { + &:hover { + color: var(--secondary); + } } } } -} -// Site header + // Site header -.menu-panel li a.widget-link:hover, -.menu-panel li a.widget-link:focus, -.menu-panel li.heading a.widget-link:hover, -.menu-panel li.heading a.widget-link:focus { - color: var(--primary); - background-color: var(--highlight-medium); - .d-icon { + .menu-panel li a.widget-link:hover, + .menu-panel li a.widget-link:focus, + .menu-panel li.heading a.widget-link:hover, + .menu-panel li.heading a.widget-link:focus { color: var(--primary); + background-color: var(--highlight-medium); + .d-icon { + color: var(--primary); + } } -} -.menu-panel .panel-body-bottom .btn:hover { - .d-icon { - color: var(--primary); + div.menu-links-header button:hover, + div.menu-links-header button:focus { + background: var(--tertiary-high); } -} -.d-header-icons .d-icon { - color: var(--primary-low-mid); -} + .menu-panel .panel-body-bottom .btn:hover { + .d-icon { + color: var(--primary); + } + } -.d-header-icons .icon:hover .d-icon, -.d-header-icons .icon:focus .d-icon { - color: var(--primary-high); -} + .d-header-icons .d-icon { + color: var(--primary-low-mid); + } -.d-header-icons .unread-notifications { - background: var(--tertiary); -} + .d-header-icons .icon:hover .d-icon, + .d-header-icons .icon:focus .d-icon { + color: var(--primary-high); + } -// Topic list + .d-header-icons .unread-notifications { + background: var(--tertiary); + } -table th { - color: var(--primary-medium); -} + // Topic list -.coldmap { - &-high { - color: #6c77cc !important; + table th { + color: var(--primary-medium); } - &-med { - color: #548eaa !important; + .coldmap { + &-high { + color: #6c77cc !important; + } + + &-med { + color: #548eaa !important; + } + + &-low { + color: #32a1a5 !important; + } } - &-low { - color: #32a1a5 !important; + .heatmap-high, + .heatmap-high a { + color: #dc3249 !important; + } + .heatmap-med, + .heatmap-med a { + color: #ae5b54 !important; + } + .heatmap-low, + .heatmap-low a { + color: #8f6d5b !important; } -} -.heatmap-high, -.heatmap-high a { - color: #dc3249 !important; -} -.heatmap-med, -.heatmap-med a { - color: #ae5b54 !important; -} -.heatmap-low, -.heatmap-low a { - color: #8f6d5b !important; -} + .badge-notification { + background: var(--primary-medium); + } -.badge-notification { - background: var(--primary-medium); -} + .badge-notification.new-posts, + .badge-notification.unread-posts { + background: var(--tertiary); + } + .select-kit.dropdown-select-box.period-chooser + .period-chooser-header + h2.selected-name + .top-date-string, + .select-kit.dropdown-select-box.period-chooser + .period-chooser-row + .top-date-string { + color: var(--primary-high); + } -.badge-notification.new-posts, -.badge-notification.unread-posts { - background: var(--tertiary); -} -.select-kit.dropdown-select-box.period-chooser - .period-chooser-header - h2.selected-name - .top-date-string, -.select-kit.dropdown-select-box.period-chooser - .period-chooser-row - .top-date-string { - color: var(--primary-high); -} + // Posts -// Posts + .discourse-no-touch .topic-body .actions .fade-out { + opacity: 1; + } -.discourse-no-touch .topic-body .actions .fade-out { - opacity: 1; -} + .topic-body .reply-to-tab { + color: var(--primary-medium); + .d-icon { + color: var(--primary-low-mid); + } + } -.topic-body .reply-to-tab { - color: var(--primary-medium); - .d-icon { - color: var(--primary-low-mid); + .timeline-container .topic-timeline { + .timeline-scrollarea { + border-color: var(--primary-low-mid); + } + .timeline-handle { + background: var(--primary-low-mid); + } } -} -.timeline-container .topic-timeline { - .timeline-scrollarea { - border-color: var(--primary-low-mid); + .topic-map h4 { + color: var(--primary); } - .timeline-handle { - background: var(--primary-low-mid); + + .quote-controls, + .quote-controls .d-icon { + color: var(--primary-medium); } -} -.topic-map h4 { - color: var(--primary); -} + blockquote { + a, + a:visited { + color: var(--tertiary); + } + } + .meta .d-icon + .filename, + .meta .informations { + color: var(--secondary); + } -.quote-controls, -.quote-controls .d-icon { - color: var(--primary-medium); -} + #topic-footer-buttons .bookmark.bookmarked:hover .d-icon-bookmark { + color: var(--secondary); + } + + .gap { + color: var(--primary-medium); + } -blockquote { - a, - a:visited { - color: var(--tertiary); + .badge-notification.clicks { + color: var(--primary-high); } -} -.meta .d-icon + .filename, -.meta .informations { - color: var(--secondary); -} -#topic-footer-buttons .bookmark.bookmarked:hover .d-icon-bookmark { - color: var(--secondary); -} + .topic-map { + background: transparent; + } -.gap { - color: var(--primary-medium); -} + // Post controls -.badge-notification.clicks { - color: var(--primary-high); -} + .topic-admin-menu-button-container, + .timeline-controls { + .btn .d-icon { + // admin wrenches + color: var(--primary-medium); + } + } -.topic-map { - background: transparent; -} + nav.post-controls { + .actions { + .double-button { + &:hover { + button { + background: var(--primary-medium); + color: var(--secondary); + .d-icon { + color: var(--secondary); + } + &.has-like { + .d-icon { + color: var(--love-low); + } + } + } + } + button { + &.like { + // Like button with 0 likes + &.d-hover { + background: var(--love-low); + .d-icon { + color: var(--love-low); + } + } + } + &.has-like { + // Like button after I've liked + .d-icon { + color: var(--love); + } + &.d-hover { + background: var(--primary-medium); + .d-icon { + color: var(--secondary); + } + } + } -// Post controls + &.button-count { + &.d-hover { + background: var(--primary-medium); + color: var(--secondary); + } + + .toggle-like { + &.d-hover { + background: var(--primary-medium); + color: var(--secondary); + } + } + } + } + } + button.create { + color: var(--primary-high-or-secondary-low); -nav.post-controls { - // this is a bit tedious - a, - button { - color: var(--primary-medium); - .d-icon { - color: var(--primary-low-mid); - } - .discourse-no-touch & { - &:hover { - color: var(--secondary); - background: var(--primary-medium); .d-icon { - color: var(--secondary); + color: var(--primary-high-or-secondary-low); } } - } - &:focus { - background: var(--primary-medium); - } - } - .discourse-no-touch & { - .double-button:hover { button { - background: var(--primary-medium); - color: var(--secondary); - .d-icon { + &.d-hover, + &:focus, + &:active { + background: var(--primary-medium); color: var(--secondary); + .d-icon { + color: var(--secondary); + } } - &.has-like { + + &.delete.d-hover, + &.delete:hover, + &.delete:focus { + background: var(--danger); + color: var(--secondary); .d-icon { color: var(--secondary); } } + &.bookmark { + &.bookmarked { + .d-icon { + color: var(--tertiary); + } + &.d-hover { + .d-icon { + color: var(--tertiary-medium); + } + } + } + } } } - } - button.bookmark.bookmarked.d-hover .d-icon { - color: var(--secondary); - } - .double-button button.button-count + .toggle-like.d-hover { - background: var(--primary-medium); - .d-icon { - color: var(--love-low); - } - } - .discourse-no-touch & { - .double-button button.button-count.d-hover { - background: var(--primary-medium); - color: var(--secondary); - } - } - button.create { - .d-icon { - color: var(--primary-low-mid); - } - &.d-hover { - color: var(--secondary); - .d-icon { + + .show-replies { + color: var(--primary-medium); + &:hover, + &:focus { color: var(--secondary); + background: var(--primary-medium); + .d-icon { + color: var(--secondary); + } } } } - .actions a, - .actions button { - color: var(--primary-medium); - } -} -nav.post-controls - .actions - .double-button - button.button-count - + .toggle-like.d-hover { - background: var(--primary-medium); -} + // Categories -.topic-admin-menu-button-container, -.timeline-controls { - .btn .d-icon { - // admin wrenches + .list-cell, + .table-heading, + .category-list td, + .category-list th { color: var(--primary-medium); } -} -// Categories + // Admin -.list-cell, -.table-heading, -.category-list td, -.category-list th { - color: var(--primary-medium); -} - -// Admin - -.admin-controls { - .nav-pills > li > a:not(.active):hover { - background: var(--primary-medium); - color: var(--secondary); + .admin-controls { + .nav-pills > li > a:not(.active):hover { + background: var(--primary-medium); + color: var(--secondary); + } } } From 058b5310c1dabca6c9fe71e231069ed514456041 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 20 May 2021 16:58:27 +1000 Subject: [PATCH 020/689] FIX: Correctly publish messages unconditionally to admins (#13053) Under certain conditions admins would miss messages when posting action in topics where they have permission. This also fixes an error where we would sometimes explode when publishing to an empty group. --- app/models/user_action.rb | 6 +++--- spec/models/user_action_spec.rb | 23 ++++++++++++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/models/user_action.rb b/app/models/user_action.rb index 60b6002739df3..0ad0a3dc216ad 100644 --- a/app/models/user_action.rb +++ b/app/models/user_action.rb @@ -283,14 +283,14 @@ def self.log_action!(hash) update_like_count(user_id, hash[:action_type], 1) end - # move into Topic perhaps group_ids = nil if topic && topic.category && topic.category.read_restricted - group_ids = topic.category.groups.pluck("groups.id") + group_ids = [Group::AUTO_GROUPS[:admins]] + group_ids.concat(topic.category.groups.pluck("groups.id")) end if action.user - MessageBus.publish("/u/#{action.user.username.downcase}", action.id, user_ids: [user_id], group_ids: group_ids) + MessageBus.publish("/u/#{action.user.username_lower}", action.id, user_ids: [user_id], group_ids: group_ids) end action diff --git a/spec/models/user_action_spec.rb b/spec/models/user_action_spec.rb index f4485f1c4c35c..d1d781fd8805d 100644 --- a/spec/models/user_action_spec.rb +++ b/spec/models/user_action_spec.rb @@ -35,15 +35,18 @@ def log_test_action(opts = {}) }.merge(opts)) end - describe "integration" do - before do - # Create some test data using a helper - log_test_action - log_test_action(action_type: UserAction::GOT_PRIVATE_MESSAGE) - log_test_action(action_type: UserAction::NEW_TOPIC, target_topic_id: public_topic.id, target_post_id: public_post.id) - log_test_action(action_type: UserAction::BOOKMARK) + it "allows publishing when group is deleted" do + public_topic.category.update!(read_restricted: true) + + m = MessageBus.track_publish("/u/#{user.username_lower}") do + log_test_action(target_topic_id: public_topic.id, target_post_id: public_post.id) end + expect(m[0].group_ids).to eq([Group::AUTO_GROUPS[:admins]]) + expect(m[0].user_ids).to eq([user.id]) + end + + describe "integration" do def stats_for_user(viewer = nil) UserAction.stats(user.id, Guardian.new(viewer)).map { |r| r.action_type.to_i }.sort end @@ -53,6 +56,12 @@ def stream(viewer = nil) end it 'includes the events correctly' do + # Create some test data using a helper + log_test_action + log_test_action(action_type: UserAction::GOT_PRIVATE_MESSAGE) + log_test_action(action_type: UserAction::NEW_TOPIC, target_topic_id: public_topic.id, target_post_id: public_post.id) + log_test_action(action_type: UserAction::BOOKMARK) + Jobs.run_immediately! PostActionNotifier.enable From db7038e6c2d4690f14120a61400ab1a47f55f547 Mon Sep 17 00:00:00 2001 From: Kris Date: Thu, 20 May 2021 03:10:40 -0400 Subject: [PATCH 021/689] UX: Fix theme upload width, remove class clash, prettier (#13071) * UX: fix width & theme upload modal class clash * remove unneeded class * unprettier hbs * add back unicode emoji * add newline --- .../admin/addon/templates/modal/admin-install-theme.hbs | 2 +- app/assets/stylesheets/desktop/upload.scss | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/admin/addon/templates/modal/admin-install-theme.hbs b/app/assets/javascripts/admin/addon/templates/modal/admin-install-theme.hbs index 2fda0a1b0096f..78baeab2e6a14 100644 --- a/app/assets/javascripts/admin/addon/templates/modal/admin-install-theme.hbs +++ b/app/assets/javascripts/admin/addon/templates/modal/admin-install-theme.hbs @@ -1,4 +1,4 @@ -{{#d-modal-body class="upload-selector install-theme" title="admin.customize.theme.install"}} +{{#d-modal-body class="install-theme" title="admin.customize.theme.install"}} {{#unless directRepoInstall}}

{{install-theme-item value="popular" selection=selection label="admin.customize.theme.install_popular"}} diff --git a/app/assets/stylesheets/desktop/upload.scss b/app/assets/stylesheets/desktop/upload.scss index 5b7b349b42947..5efef681a1519 100644 --- a/app/assets/stylesheets/desktop/upload.scss +++ b/app/assets/stylesheets/desktop/upload.scss @@ -39,8 +39,7 @@ } } } - .radios:last-child:not(:nth-child(2)) { - // last child for composer modal, but not theme import modal + .radios:last-child { min-height: 20px; } } From e2f9da9795b96a751e0808d2e8f84806b0246ddc Mon Sep 17 00:00:00 2001 From: Dan Ungureanu Date: Thu, 20 May 2021 16:18:22 +0300 Subject: [PATCH 022/689] DEV: Remove reference to very old plugin (#13098) --- lib/plugin/instance.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb index 380a63e987599..784a028ce7ecb 100644 --- a/lib/plugin/instance.rb +++ b/lib/plugin/instance.rb @@ -86,10 +86,6 @@ def self.find_all(parent_path) [].tap { |plugins| # also follows symlinks - http://stackoverflow.com/q/357754 Dir["#{parent_path}/*/plugin.rb"].sort.each do |path| - - # tagging is included in core, so don't load it - next if path =~ /discourse-tagging/ - source = File.read(path) metadata = Plugin::Metadata.parse(source) plugins << self.new(metadata, path) From e1b99d3cad41ded64723fa58ca8bd8652816bc0f Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 20 May 2021 14:00:25 -0400 Subject: [PATCH 023/689] FIX: Review Queue Query parameters were not refreshing in Ember CLI builds (#13101) The problem was we were setting the properties then immediately calling `refreshRoute` which was being executed before the properties were settled via the runloop. --- .../discourse/app/controllers/review-index.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/app/controllers/review-index.js b/app/assets/javascripts/discourse/app/controllers/review-index.js index 2c70242dcd502..4c194415946ca 100644 --- a/app/assets/javascripts/discourse/app/controllers/review-index.js +++ b/app/assets/javascripts/discourse/app/controllers/review-index.js @@ -2,6 +2,7 @@ import Controller from "@ember/controller"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; import { isPresent } from "@ember/utils"; +import { next } from "@ember/runloop"; export default Controller.extend({ queryParams: [ @@ -93,6 +94,10 @@ export default Controller.extend({ this.setProperties(range); }, + refreshModel() { + next(() => this.send("refreshRoute")); + }, + actions: { remove(ids) { if (!ids) { @@ -104,7 +109,7 @@ export default Controller.extend({ }); if (newList.length === 0) { - this.send("refreshRoute"); + this.refreshModel(); } else { this.set("reviewables", newList); } @@ -112,7 +117,7 @@ export default Controller.extend({ resetTopic() { this.set("topic_id", null); - this.send("refreshRoute"); + this.refreshModel(); }, refresh() { @@ -165,7 +170,7 @@ export default Controller.extend({ additional_filters: JSON.stringify(this.additionalFilters), }); - this.send("refreshRoute"); + this.refreshModel(); }, loadMore() { From f165f98cf78b3e20e052f17358c22bc9d1b8a264 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 20 May 2021 14:30:22 -0400 Subject: [PATCH 024/689] DEV: Run `yarn install` when running `bin/ember-cli` (#13102) Some people have noticed that if we change the packages in package.json that they have to manually run `yarn install` or Discourse won't work. This adds `yarn install` to the `bin/ember-cli` helper we run. It seems quite fast if there is nothing to install so it shouldn't hurt to do this every time we start the server. --- bin/ember-cli | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/ember-cli b/bin/ember-cli index 3aa799e143272..1395ecc92415b 100755 --- a/bin/ember-cli +++ b/bin/ember-cli @@ -43,4 +43,5 @@ if !args.include?("--proxy") args << PROXY end +system "yarn install --cwd #{yarn_dir}" exec "yarn", *args.to_a.flatten From 29f3621f453797f2c98c71dd9c6ee0abe34bc1cf Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Thu, 20 May 2021 15:19:44 -0400 Subject: [PATCH 025/689] FIX: Disable lightboxing of animated images (#13099) --- lib/cooked_post_processor.rb | 12 ++++++------ spec/components/cooked_post_processor_spec.rb | 7 +++++-- spec/services/search_indexer_spec.rb | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/cooked_post_processor.rb b/lib/cooked_post_processor.rb index ed57f8b067a43..368d1d24e638d 100644 --- a/lib/cooked_post_processor.rb +++ b/lib/cooked_post_processor.rb @@ -353,13 +353,13 @@ def convert_to_link!(img) unless @disable_loading_image upload.create_thumbnail!(LOADING_SIZE, LOADING_SIZE, format: 'png', colors: LOADING_COLORS) end - end - if img.ancestors('.onebox, .onebox-body, .quote').blank? && !img.classes.include?("onebox") - add_lightbox!(img, original_width, original_height, upload, cropped: crop) - end + return if upload.animated? + + if img.ancestors('.onebox, .onebox-body, .quote').blank? && !img.classes.include?("onebox") + add_lightbox!(img, original_width, original_height, upload, cropped: crop) + end - if upload.present? optimize_image!(img, upload, cropped: crop) end end @@ -390,7 +390,7 @@ def optimize_image!(img, upload, cropped: false) w, h = img["width"].to_i, img["height"].to_i # note: optimize_urls cooks the src and data-small-upload further after this - thumbnail = !upload.animated && upload.thumbnail(w, h) + thumbnail = upload.thumbnail(w, h) if thumbnail && thumbnail.filesize.to_i < upload.filesize img["src"] = thumbnail.url diff --git a/spec/components/cooked_post_processor_spec.rb b/spec/components/cooked_post_processor_spec.rb index 7cffe18edff25..e0ecf37ee589a 100644 --- a/spec/components/cooked_post_processor_spec.rb +++ b/spec/components/cooked_post_processor_spec.rb @@ -973,7 +973,10 @@ expect(doc.css('img').first['srcset']).to_not eq(nil) end - it "does not optimize animated images but adds a class so animated images can be identified" do + it "processes animated images correctly" do + # skips optimization + # skips lightboxing + # adds "animated" class to element upload.update!(animated: true) post = Fabricate(:post, raw: "![image|1024x768, 50%](#{upload.short_url})") @@ -981,7 +984,7 @@ cpp.post_process doc = Nokogiri::HTML5::fragment(cpp.html) - expect(doc.css('.lightbox-wrapper').size).to eq(1) + expect(doc.css('.lightbox-wrapper').size).to eq(0) expect(doc.css('img').first['src']).to include(upload.url) expect(doc.css('img').first['srcset']).to eq(nil) expect(doc.css('img.animated').size).to eq(1) diff --git a/spec/services/search_indexer_spec.rb b/spec/services/search_indexer_spec.rb index 6774543c69b68..4fe3f1d9975fd 100644 --- a/spec/services/search_indexer_spec.rb +++ b/spec/services/search_indexer_spec.rb @@ -241,7 +241,7 @@ def scrub(html, strip_diacritics: false) post.rebake! post.reload - expect(post.cooked).to include( + expect(post.cooked).not_to include( CookedPostProcessor::LIGHTBOX_WRAPPER_CSS_CLASS ) From bd8c2b4615c2d44f473732a6bbd4cb42c1184b1a Mon Sep 17 00:00:00 2001 From: David Taylor Date: Thu, 20 May 2021 22:30:12 +0100 Subject: [PATCH 026/689] DEV: Correct theme:qunit help text (#13104) - Task name is themes:qunit, not themes:unit - Some shells try to expand the square brackets. The whole thing should be enclosed in quotes to avoid this --- lib/tasks/themes.rake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/tasks/themes.rake b/lib/tasks/themes.rake index 2de8b30a5a9ce..83c1038a85538 100644 --- a/lib/tasks/themes.rake +++ b/lib/tasks/themes.rake @@ -106,11 +106,11 @@ task "themes:qunit", :type, :value do |t, args| raise <<~MSG Wrong arguments type:#{type.inspect}, value:#{value.inspect}" Usage: - `bundle exec rake themes:unit[url,]` + `bundle exec rake "themes:qunit[url,]"` OR - `bundle exec rake themes:unit[name,]` + `bundle exec rake "themes:qunit[name,]"` OR - `bundle exec rake themes:unit[id,]` + `bundle exec rake "themes:qunit[id,]"` MSG end ENV["THEME_#{type.upcase}"] = value.to_s From 6421fabb02f9dca00af6fb331b358af13722c8df Mon Sep 17 00:00:00 2001 From: Joe Date: Fri, 21 May 2021 09:18:22 +0800 Subject: [PATCH 027/689] UX: Improve positioning of controls in lightboxes (#13108) This commit fixes an issue where controls scroll in lightboxes with large images (after zooming in) Before: https://d11a6trkgmumsb.cloudfront.net/original/3X/0/5/05024730b3b877c472dff5f4d63155121d370297.mp4 Notice how controls like the close button, the next and previous button, and the image metadata also scroll? This is an undesired behavior. After: https://d11a6trkgmumsb.cloudfront.net/original/3X/8/0/8047bab7351831e9b9df8c3cf0eb368c7529ae8a.mp4 This is the desired behavior; only the image should scroll. The changes in this PR apply to both desktop and mobile. --- app/assets/stylesheets/common/base/magnific-popup.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/assets/stylesheets/common/base/magnific-popup.scss b/app/assets/stylesheets/common/base/magnific-popup.scss index 0c2a9d5036e24..1f89e644bfcbe 100644 --- a/app/assets/stylesheets/common/base/magnific-popup.scss +++ b/app/assets/stylesheets/common/base/magnific-popup.scss @@ -623,6 +623,9 @@ button { overflow-y: auto !important; overflow-x: auto !important; } + .mfp-figure { + overflow: auto; + } .mfp-img { max-width: none; } From 59097b207f75eab1dd39281b55a91e678142b37b Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Thu, 20 May 2021 21:43:47 -0400 Subject: [PATCH 028/689] DEV: Correct typos and spelling mistakes (#12812) Over the years we accrued many spelling mistakes in the code base. This PR attempts to fix spelling mistakes and typos in all areas of the code that are extremely safe to change - comments - test descriptions - other low risk areas --- .github/pull_request_template.md | 2 +- .../app/components/composer-editor.js | 2 +- .../app/controllers/create-account.js | 2 +- .../second-factor-add-security-key.js | 2 +- .../discourse/app/controllers/topic.js | 2 +- .../discourse/app/helpers/user-avatar.js | 2 +- .../discourse/app/initializers/badging.js | 2 +- .../javascripts/discourse/app/lib/ajax.js | 2 +- .../discourse/app/lib/autocomplete.js | 2 +- .../javascripts/discourse/app/lib/eyeline.js | 2 +- .../javascripts/discourse/app/lib/hash.js | 2 +- .../discourse/app/lib/page-tracker.js | 2 +- .../javascripts/discourse/app/lib/url.js | 2 +- .../discourse/app/lib/user-search.js | 2 +- .../discourse/app/lib/utilities.js | 4 +-- .../javascripts/discourse/app/lib/webauthn.js | 2 +- .../discourse/app/models/category.js | 2 +- .../discourse/app/widgets/post-cooked.js | 2 +- .../discourse/lib/translation-plugin.js | 2 +- .../acceptance/admin-badges-show-test.js | 2 +- .../tests/acceptance/composer-test.js | 2 +- .../tests/acceptance/group-index-test.js | 4 +-- .../tests/fixtures/discovery-fixtures.js | 10 +++--- .../tests/fixtures/search-fixtures.js | 2 +- .../discourse/tests/fixtures/topic.js | 6 ++-- .../discourse/tests/fixtures/user-fixtures.js | 2 +- .../tests/integration/widgets/post-test.js | 4 +-- .../widgets/small-user-list-test.js | 2 +- .../tests/integration/widgets/widget-test.js | 2 +- .../discourse/tests/setup-tests.js | 2 +- .../tests/unit/controllers/topic-test.js | 2 +- .../tests/unit/lib/pretty-text-test.js | 6 ++-- .../tests/unit/lib/user-search-test.js | 2 +- .../tests/unit/models/composer-test.js | 4 +-- .../tests/unit/models/post-stream-test.js | 4 +-- .../tests/unit/models/rest-model-test.js | 6 ++-- app/assets/javascripts/locales/i18n.js | 2 +- .../pretty-text/addon/sanitizer.js | 2 +- .../engines/discourse-markdown/html-img.js | 2 +- .../engines/discourse-markdown/mentions.js | 2 +- .../engines/discourse-markdown/newline.js | 2 +- .../engines/discourse-markdown/onebox.js | 2 +- .../addon/components/composer-actions.js | 2 +- .../common/base/magnific-popup.scss | 4 +-- app/assets/stylesheets/common/d-editor.scss | 2 +- .../stylesheets/common/font-variables.scss | 2 +- .../common/foundation/variables.scss | 2 +- app/controllers/application_controller.rb | 4 +-- app/controllers/users_email_controller.rb | 2 +- app/helpers/user_notifications_helper.rb | 2 +- app/jobs/regular/close_topic.rb | 2 +- app/jobs/regular/open_topic.rb | 2 +- app/models/concerns/has_custom_fields.rb | 2 +- app/models/topic_embed.rb | 2 +- app/models/topic_link_click.rb | 2 +- app/models/topic_tracking_state.rb | 2 +- app/models/topic_user.rb | 2 +- app/models/user_auth_token.rb | 2 +- app/models/user_history.rb | 2 +- app/models/user_search.rb | 2 +- app/models/user_stat.rb | 2 +- .../topic_view_details_serializer.rb | 2 +- app/services/search_indexer.rb | 2 +- config/application.rb | 6 ++-- config/database.yml | 4 +-- config/discourse_defaults.conf | 6 ++-- config/environments/test.rb | 2 +- config/initializers/100-watch_for_restart.rb | 2 +- config/nginx.sample.conf | 4 +-- db/fixtures/001_refresh.rb | 2 +- docs/SECURITY.md | 4 +-- lib/autospec/manager.rb | 2 +- lib/autospec/simple_runner.rb | 2 +- lib/badge_queries.rb | 2 +- lib/base62.rb | 2 +- lib/discourse_tagging.rb | 2 +- lib/file_store/s3_store.rb | 2 +- .../active_record_attribute_methods.rb | 2 +- lib/guardian/category_guardian.rb | 2 +- lib/guardian/tag_guardian.rb | 2 +- lib/guardian/topic_guardian.rb | 2 +- lib/imap/sync.rb | 2 +- lib/javascripts/messageformat.js | 4 +-- lib/javascripts/widget-hbs-compiler.js | 2 +- lib/js_locale_helper.rb | 2 +- lib/letter_avatar.rb | 2 +- lib/middleware/enforce_hostname.rb | 2 +- lib/pbkdf2.rb | 2 +- lib/plugin/instance.rb | 4 +-- lib/post_action_creator.rb | 2 +- lib/post_creator.rb | 2 +- lib/post_jobs_enqueuer.rb | 2 +- lib/rate_limiter.rb | 2 +- lib/search.rb | 2 +- lib/tasks/admin.rake | 2 +- lib/tasks/autospec.rake | 2 +- lib/tasks/docker.rake | 2 +- lib/tasks/emails.rake | 2 +- lib/tasks/uploads.rake | 2 +- lib/text_cleaner.rb | 2 +- lib/text_sentinel.rb | 2 +- lib/topic_query_sql.rb | 4 +-- lib/url_helper.rb | 2 +- .../lib/date-with-zone-helper.js.es6 | 4 +-- .../new_user_narrative_spec.rb | 2 +- .../spec/requests/presence_controller_spec.rb | 6 ++-- .../lib/discourse-markdown/poll.js.es6 | 2 +- .../spec/controllers/posts_controller_spec.rb | 4 +-- plugins/poll/spec/models/poll_spec.rb | 2 +- .../templates/styleguide/atoms/02-buttons.hbs | 4 +-- script/benchmarks/markdown/most_features.md | 2 +- script/discourse | 2 +- script/import_scripts/answerhub.rb | 2 +- script/import_scripts/askbot.rb | 2 +- script/import_scripts/discuz_x.rb | 2 +- script/import_scripts/mbox/settings.yml | 2 +- .../quandora/test/test_quandora_api.rb | 2 +- .../socialcast/test/test_data.rb | 12 +++---- .../socialcast/test/test_socialcast_api.rb | 2 +- .../components/admin_user_index_query_spec.rb | 2 +- .../auth/github_authenticator_spec.rb | 2 +- .../concern/has_custom_fields_spec.rb | 2 +- .../concern/second_factor_manager_spec.rb | 6 ++-- spec/components/discourse_event_spec.rb | 4 +-- spec/components/email/receiver_spec.rb | 6 ++-- spec/components/email/styles_spec.rb | 6 ++-- spec/components/email_cook_spec.rb | 8 ++--- spec/components/file_store/s3_store_spec.rb | 2 +- .../components/guardian/user_guardian_spec.rb | 2 +- spec/components/guardian_spec.rb | 4 +-- spec/components/html_to_markdown_spec.rb | 4 +-- spec/components/image_sizer_spec.rb | 4 +-- spec/components/imap/imap_helper.rb | 2 +- spec/components/imap/sync_spec.rb | 2 +- spec/components/inline_oneboxer_spec.rb | 2 +- spec/components/json_error_spec.rb | 2 +- .../middleware/anonymous_cache_spec.rb | 2 +- spec/components/new_post_manager_spec.rb | 2 +- spec/components/onpdiff_spec.rb | 2 +- spec/components/post_action_creator_spec.rb | 4 +-- spec/components/post_creator_spec.rb | 4 +-- spec/components/pretty_text_spec.rb | 4 +-- spec/components/promotion_spec.rb | 2 +- spec/components/search_spec.rb | 12 +++---- .../components/site_setting_extension_spec.rb | 4 +-- spec/components/slug_spec.rb | 2 +- spec/components/topic_query_spec.rb | 6 ++-- spec/components/topic_retriever_spec.rb | 6 ++-- spec/components/unread_spec.rb | 2 +- .../validators/max_emojis_validator_spec.rb | 2 +- spec/fixtures/emails/paragraphs.eml | 2 +- spec/jobs/bulk_invite_spec.rb | 2 +- spec/jobs/jobs_spec.rb | 2 +- .../backup_restore/meta_data_handler_spec.rb | 4 +-- .../shared_examples_for_backup_store.rb | 2 +- spec/lib/bookmark_manager_spec.rb | 6 ++-- spec/lib/webauthn/challenge_generator_spec.rb | 2 +- spec/models/about_spec.rb | 2 +- spec/models/admin_dashboard_problem_spec.rb | 2 +- spec/models/category_list_spec.rb | 4 +-- spec/models/email_token_spec.rb | 2 +- spec/models/notification_spec.rb | 2 +- spec/models/post_action_spec.rb | 6 ++-- spec/models/report_spec.rb | 4 +-- spec/models/reviewable_user_spec.rb | 2 +- spec/models/site_setting_spec.rb | 2 +- spec/models/topic_spec.rb | 8 ++--- spec/models/user_spec.rb | 8 ++--- spec/models/username_validator_spec.rb | 8 ++--- spec/models/web_hook_spec.rb | 2 +- spec/rails_helper.rb | 2 +- .../requests/admin/reports_controller_spec.rb | 2 +- spec/requests/admin/users_controller_spec.rb | 4 +-- spec/requests/api/posts_spec.rb | 2 +- spec/requests/application_controller_spec.rb | 2 +- spec/requests/categories_controller_spec.rb | 4 +-- .../requests/extra_locales_controller_spec.rb | 2 +- spec/requests/groups_controller_spec.rb | 8 ++--- spec/requests/hashtags_controller_spec.rb | 2 +- spec/requests/permalinks_controller_spec.rb | 2 +- spec/requests/post_readers_controller_spec.rb | 2 +- spec/requests/posts_controller_spec.rb | 4 +-- spec/requests/reviewables_controller_spec.rb | 2 +- spec/requests/search_controller_spec.rb | 4 +-- spec/requests/session_controller_spec.rb | 6 ++-- spec/requests/tags_controller_spec.rb | 2 +- .../theme_javascripts_controller_spec.rb | 2 +- spec/requests/topics_controller_spec.rb | 34 +++++++++---------- spec/requests/users_controller_spec.rb | 6 ++-- .../post_revision_serializer_spec.rb | 2 +- .../serializers/topic_view_serializer_spec.rb | 2 +- spec/services/badge_granter_spec.rb | 2 +- spec/services/destroy_task_spec.rb | 2 +- spec/services/inline_uploads_spec.rb | 4 +-- spec/services/post_action_notifier_spec.rb | 2 +- spec/services/post_alerter_spec.rb | 4 +-- spec/services/search_indexer_spec.rb | 2 +- spec/services/site_settings_spec.rb | 2 +- spec/services/user_anonymizer_spec.rb | 2 +- spec/services/user_authenticator_spec.rb | 2 +- spec/services/user_merger_spec.rb | 2 +- ...er_notification_schedule_processor_spec.rb | 2 +- spec/services/user_updater_spec.rb | 2 +- spec/services/word_watcher_spec.rb | 2 +- .../shared_examples_for_stats_cacheable.rb | 2 +- test/run-qunit.js | 2 +- test/smoke_test.js | 2 +- 207 files changed, 315 insertions(+), 315 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index ba13bf1f29c6a..536a268e55dea 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1 +1 @@ - + diff --git a/app/assets/javascripts/discourse/app/components/composer-editor.js b/app/assets/javascripts/discourse/app/components/composer-editor.js index c1be68eda59d7..124cf210f9785 100644 --- a/app/assets/javascripts/discourse/app/components/composer-editor.js +++ b/app/assets/javascripts/discourse/app/components/composer-editor.js @@ -288,7 +288,7 @@ export default Component.extend({ // when adding two separate files with the same filename search for matching // placeholder already existing in the editor ie [Uploading: test.png...] - // and add order nr to the next one: [Uplodading: test.png(1)...] + // and add order nr to the next one: [Uploading: test.png(1)...] const escapedFilename = filename.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); const regexString = `\\[${I18n.t("uploading_filename", { filename: escapedFilename + "(?:\\()?([0-9])?(?:\\))?", diff --git a/app/assets/javascripts/discourse/app/controllers/create-account.js b/app/assets/javascripts/discourse/app/controllers/create-account.js index 6dc0fa372ebec..57b41f44493e4 100644 --- a/app/assets/javascripts/discourse/app/controllers/create-account.js +++ b/app/assets/javascripts/discourse/app/controllers/create-account.js @@ -268,7 +268,7 @@ export default Controller.extend( (isEmpty(this.accountUsername) || this.get("authOptions.email")) ) { // If email is valid and username has not been entered yet, - // or email and username were filled automatically by 3rd parth auth, + // or email and username were filled automatically by 3rd party auth, // then look for a registered username that matches the email. discourseDebounce(this, this.fetchExistingUsername, 500); } diff --git a/app/assets/javascripts/discourse/app/controllers/second-factor-add-security-key.js b/app/assets/javascripts/discourse/app/controllers/second-factor-add-security-key.js index d6b48db673c9a..48839d0bbb93e 100644 --- a/app/assets/javascripts/discourse/app/controllers/second-factor-add-security-key.js +++ b/app/assets/javascripts/discourse/app/controllers/second-factor-add-security-key.js @@ -87,7 +87,7 @@ export default Controller.extend(ModalFunctionality, { attestation: "none", authenticatorSelection: { // see https://chromium.googlesource.com/chromium/src/+/master/content/browser/webauth/uv_preferred.md for why - // default value of preferred is not necesarrily what we want, it limits webauthn to only devices that support + // default value of preferred is not necessarily what we want, it limits webauthn to only devices that support // user verification, which usually requires entering a PIN userVerification: "discouraged", }, diff --git a/app/assets/javascripts/discourse/app/controllers/topic.js b/app/assets/javascripts/discourse/app/controllers/topic.js index fcadfa4fefbc8..6699af2c5377d 100644 --- a/app/assets/javascripts/discourse/app/controllers/topic.js +++ b/app/assets/javascripts/discourse/app/controllers/topic.js @@ -1606,7 +1606,7 @@ export default Controller.extend(bufferedProperty("model"), { } // scroll to bottom is very specific to new posts from discobot - // hence the -2 check (dicobot id). We can shift all this code + // hence the -2 check (discobot id). We can shift all this code // to discobot plugin longer term if ( topic.get("isPrivateMessage") && diff --git a/app/assets/javascripts/discourse/app/helpers/user-avatar.js b/app/assets/javascripts/discourse/app/helpers/user-avatar.js index 20af1a2c02038..e0893b1089c5b 100644 --- a/app/assets/javascripts/discourse/app/helpers/user-avatar.js +++ b/app/assets/javascripts/discourse/app/helpers/user-avatar.js @@ -59,7 +59,7 @@ function renderAvatar(user, options) { const description = get(user, "description"); // if a description has been provided if (description && description.length > 0) { - // preprend the username before the description + // prepend the username before the description title = I18n.t("user.avatar.name_and_description", { name: displayName, description, diff --git a/app/assets/javascripts/discourse/app/initializers/badging.js b/app/assets/javascripts/discourse/app/initializers/badging.js index f5a73b6436615..73c90b0aa1951 100644 --- a/app/assets/javascripts/discourse/app/initializers/badging.js +++ b/app/assets/javascripts/discourse/app/initializers/badging.js @@ -1,4 +1,4 @@ -// Updates the PWA badging if avaliable +// Updates the PWA badging if available export default { name: "badging", after: "message-bus", diff --git a/app/assets/javascripts/discourse/app/lib/ajax.js b/app/assets/javascripts/discourse/app/lib/ajax.js index 36330cabf39f5..b7be9db2ec958 100644 --- a/app/assets/javascripts/discourse/app/lib/ajax.js +++ b/app/assets/javascripts/discourse/app/lib/ajax.js @@ -128,7 +128,7 @@ export function ajax() { Session.current().set("csrfToken", null); } - // If it's a parsererror, don't reject + // If it's a parser error, don't reject if (xhr.status === 200) { return args.success(xhr); } diff --git a/app/assets/javascripts/discourse/app/lib/autocomplete.js b/app/assets/javascripts/discourse/app/lib/autocomplete.js index d95cc46e527a6..99b77405a9750 100644 --- a/app/assets/javascripts/discourse/app/lib/autocomplete.js +++ b/app/assets/javascripts/discourse/app/lib/autocomplete.js @@ -99,7 +99,7 @@ export default function (options) { let div = null; let prevTerm = null; - // By default, when the autcomplete popup is rendered it has the + // By default, when the autocomplete popup is rendered it has the // first suggestion 'selected', and pressing enter key inserts // the first suggestion into the input box. // If you want to stop that behavior, i.e. have the popup renders diff --git a/app/assets/javascripts/discourse/app/lib/eyeline.js b/app/assets/javascripts/discourse/app/lib/eyeline.js index f7f318865d82d..f2ca4a8c375cd 100644 --- a/app/assets/javascripts/discourse/app/lib/eyeline.js +++ b/app/assets/javascripts/discourse/app/lib/eyeline.js @@ -67,7 +67,7 @@ Eyeline.prototype.update = function () { } // It's seen if... - // ...the element is vertically within the top and botom + // ...the element is vertically within the top and bottom if (elemTop <= docViewBottom && elemTop >= docViewTop) { markSeen = true; } diff --git a/app/assets/javascripts/discourse/app/lib/hash.js b/app/assets/javascripts/discourse/app/lib/hash.js index 71396274b9ea6..a4fd849a8808d 100644 --- a/app/assets/javascripts/discourse/app/lib/hash.js +++ b/app/assets/javascripts/discourse/app/lib/hash.js @@ -1,6 +1,6 @@ /*eslint no-bitwise:0 */ -// Note: before changing this be aware the same algo is used server side for avatars. +// Note: before changing this be aware the same algorithm is used server side for avatars. export function hashString(str) { let hash = 0; for (let i = 0; i < str.length; i++) { diff --git a/app/assets/javascripts/discourse/app/lib/page-tracker.js b/app/assets/javascripts/discourse/app/lib/page-tracker.js index be741139785ea..76a937f195a4f 100644 --- a/app/assets/javascripts/discourse/app/lib/page-tracker.js +++ b/app/assets/javascripts/discourse/app/lib/page-tracker.js @@ -23,7 +23,7 @@ export function startPageTracking(router, appEvents, documentTitle) { return; } router.on("routeDidChange", (transition) => { - // we ocassionally prevent tracking of replaced pages when only query params changed + // we occasionally prevent tracking of replaced pages when only query params changed // eg: google analytics const replacedOnlyQueryParams = transition.urlMethod === "replace" && transition.queryParamsOnly; diff --git a/app/assets/javascripts/discourse/app/lib/url.js b/app/assets/javascripts/discourse/app/lib/url.js index ec875d40331e6..e107bfef6f0bb 100644 --- a/app/assets/javascripts/discourse/app/lib/url.js +++ b/app/assets/javascripts/discourse/app/lib/url.js @@ -33,7 +33,7 @@ const SERVER_SIDE_ONLY = [ /^\/styleguide/, ]; -// The amount of height (in pixles) that we factor in when jumpEnd is called so +// The amount of height (in pixels) that we factor in when jumpEnd is called so // that we show a little bit of the post text even on mobile devices instead of // scrolling to "suggested topics". const JUMP_END_BUFFER = 250; diff --git a/app/assets/javascripts/discourse/app/lib/user-search.js b/app/assets/javascripts/discourse/app/lib/user-search.js index 980d92a417a15..1c90808b21b11 100644 --- a/app/assets/javascripts/discourse/app/lib/user-search.js +++ b/app/assets/javascripts/discourse/app/lib/user-search.js @@ -157,7 +157,7 @@ function organizeResults(r, options) { return results; } -// all punctuations except for -, _ and . which are allowed in usernames +// all punctuation except for -, _ and . which are allowed in usernames // note: these are valid in names, but will end up tripping search anyway so just skip // this means searching for `sam saffron` is OK but if my name is `sam$ saffron` autocomplete // will not find me, which is a reasonable compromise diff --git a/app/assets/javascripts/discourse/app/lib/utilities.js b/app/assets/javascripts/discourse/app/lib/utilities.js index 5cb6976d5d07a..9210d0607e058 100644 --- a/app/assets/javascripts/discourse/app/lib/utilities.js +++ b/app/assets/javascripts/discourse/app/lib/utilities.js @@ -452,9 +452,9 @@ const CODE_BLOCKS_REGEX = /^( |\t).*|`[^`]+`|^```[^]*?^```|\[code\][^]*?\[\/c // | | | | // | | | code blocks between [code] // | | | -// | | +--- code blocks between three backquote +// | | +--- code blocks between three backticks // | | -// | +----- inline code between backquotes +// | +----- inline code between backticks // | // +------- paragraphs starting with 4 spaces or tab diff --git a/app/assets/javascripts/discourse/app/lib/webauthn.js b/app/assets/javascripts/discourse/app/lib/webauthn.js index e33ffc20019dd..113ef3c06bb75 100644 --- a/app/assets/javascripts/discourse/app/lib/webauthn.js +++ b/app/assets/javascripts/discourse/app/lib/webauthn.js @@ -42,7 +42,7 @@ export function getWebauthnCredential( timeout: 60000, // see https://chromium.googlesource.com/chromium/src/+/master/content/browser/webauth/uv_preferred.md for why - // default value of preferred is not necesarrily what we want, it limits webauthn to only devices that support + // default value of preferred is not necessarily what we want, it limits webauthn to only devices that support // user verification, which usually requires entering a PIN userVerification: "discouraged", }, diff --git a/app/assets/javascripts/discourse/app/models/category.js b/app/assets/javascripts/discourse/app/models/category.js index 4de28e476d4d0..af65076dba41a 100644 --- a/app/assets/javascripts/discourse/app/models/category.js +++ b/app/assets/javascripts/discourse/app/models/category.js @@ -426,7 +426,7 @@ Category.reopenClass({ findBySlugPathWithID(slugPathWithID) { let parts = slugPathWithID.split("/").filter(Boolean); - // slugs found by star/glob pathing in emeber do not automatically url decode - ensure that these are decoded + // slugs found by star/glob pathing in ember do not automatically url decode - ensure that these are decoded if (this.slugEncoded()) { parts = parts.map((urlPart) => decodeURI(urlPart)); } diff --git a/app/assets/javascripts/discourse/app/widgets/post-cooked.js b/app/assets/javascripts/discourse/app/widgets/post-cooked.js index bbc669ac224b2..1526ec0874367 100644 --- a/app/assets/javascripts/discourse/app/widgets/post-cooked.js +++ b/app/assets/javascripts/discourse/app/widgets/post-cooked.js @@ -155,7 +155,7 @@ export default class PostCooked { valid = href.split("?")[0] === lc.url; } - // don't display badge counts on category badge & oneboxes (unless when explicitely stated) + // don't display badge counts on category badge & oneboxes (unless when explicitly stated) if (valid && isValidLink($link)) { const title = I18n.t("topic_map.clicks", { count: lc.clicks }); $link.append( diff --git a/app/assets/javascripts/discourse/lib/translation-plugin.js b/app/assets/javascripts/discourse/lib/translation-plugin.js index 5b9d06693e1ba..cc448934501c3 100644 --- a/app/assets/javascripts/discourse/lib/translation-plugin.js +++ b/app/assets/javascripts/discourse/lib/translation-plugin.js @@ -18,7 +18,7 @@ class TranslationPlugin extends Plugin { build() { // We could get fancy eventually and do this based on whether the yaml - // or vendor files change but in practice we should't need exact up to date + // or vendor files change but in practice we shouldn't need exact up to date // translations in admin. if (built) { return; diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-badges-show-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-badges-show-test.js index 3da3a7a480634..8670f9aeea088 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-badges-show-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-badges-show-test.js @@ -95,7 +95,7 @@ acceptance("Admin - Badges - Show", function (needs) { await click("input#badge-icon"); assert.ok(exists(".icon-picker"), "icon picker is becomes visible"); - assert.ok(!exists(".image-uploader"), "image uploader bcomes hidden"); + assert.ok(!exists(".image-uploader"), "image uploader becomes hidden"); assert.equal(query(".icon-picker").textContent.trim(), "fa-rocket"); }); }); diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-test.js index f60b38f3d67ed..45035e01fe833 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-test.js @@ -788,7 +788,7 @@ acceptance("Composer", function (needs) { "![test|690x313, 50%](upload://test.png)", // 3 No dimensions, should not work "![test](upload://test.jpeg)", - // 4 Wrapped in backquetes should not work + // 4 Wrapped in backticks should not work "`![test|690x313](upload://test.png)`", // 5 html image - should not work "", diff --git a/app/assets/javascripts/discourse/tests/acceptance/group-index-test.js b/app/assets/javascripts/discourse/tests/acceptance/group-index-test.js index f9a6ef32423ae..93a463a8d7a3c 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/group-index-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/group-index-test.js @@ -27,7 +27,7 @@ acceptance("Group Members - Anonymous", function () { assert.equal( queryAll(".group-username-filter").attr("placeholder"), I18n.t("groups.members.filter_placeholder"), - "it should display the right filter placehodler" + "it should display the right filter placeholder" ); }); }); @@ -65,7 +65,7 @@ acceptance("Group Members", function (needs) { assert.equal( queryAll(".group-username-filter").attr("placeholder"), I18n.t("groups.members.filter_placeholder_admin"), - "it should display the right filter placehodler" + "it should display the right filter placeholder" ); }); diff --git a/app/assets/javascripts/discourse/tests/fixtures/discovery-fixtures.js b/app/assets/javascripts/discourse/tests/fixtures/discovery-fixtures.js index 1a15885b8d0ff..5267a5b2bbc3f 100644 --- a/app/assets/javascripts/discourse/tests/fixtures/discovery-fixtures.js +++ b/app/assets/javascripts/discourse/tests/fixtures/discovery-fixtures.js @@ -129,7 +129,7 @@ export default { { id: 6680, username: "cdman", avatar_template: "/images/avatar.png" }, { id: 500, username: "aeid", avatar_template: "/images/avatar.png" }, { id: 8, username: "geek", avatar_template: "/images/avatar.png" }, - { id: 606, username: "Cafeine", avatar_template: "/images/avatar.png" } + { id: 606, username: "Caffeine", avatar_template: "/images/avatar.png" } ], topic_list: { can_create_topic: false, @@ -1272,7 +1272,7 @@ export default { { id: 6680, username: "cdman", avatar_template: "/images/avatar.png" }, { id: 500, username: "aeid", avatar_template: "/images/avatar.png" }, { id: 8, username: "geek", avatar_template: "/images/avatar.png" }, - { id: 606, username: "Cafeine", avatar_template: "/images/avatar.png" } + { id: 606, username: "Caffeine", avatar_template: "/images/avatar.png" } ], topic_list: { can_create_topic: false, @@ -3003,7 +3003,7 @@ export default { { id: 3681, username: "Ajarn", avatar_template: "/images/avatar.png" }, { id: 1621, username: "bnb", avatar_template: "/images/avatar.png" }, { id: 6266, username: "bragi", avatar_template: "/images/avatar.png" }, - { id: 5335, username: "masda70", avatar_template: "/images/avatar.png" }, + { id: 5335, username: "mazda70", avatar_template: "/images/avatar.png" }, { id: 6314, username: "rafaelfranca", @@ -4183,7 +4183,7 @@ export default { { id: 3681, username: "Ajarn", avatar_template: "/images/avatar.png" }, { id: 1621, username: "bnb", avatar_template: "/images/avatar.png" }, { id: 6266, username: "bragi", avatar_template: "/images/avatar.png" }, - { id: 5335, username: "masda70", avatar_template: "/images/avatar.png" }, + { id: 5335, username: "mazda70", avatar_template: "/images/avatar.png" }, { id: 6314, username: "rafaelfranca", @@ -5255,7 +5255,7 @@ export default { { id: 3681, username: "Ajarn", avatar_template: "/images/avatar.png" }, { id: 1621, username: "bnb", avatar_template: "/images/avatar.png" }, { id: 6266, username: "bragi", avatar_template: "/images/avatar.png" }, - { id: 5335, username: "masda70", avatar_template: "/images/avatar.png" }, + { id: 5335, username: "mazda70", avatar_template: "/images/avatar.png" }, { id: 6314, username: "rafaelfranca", diff --git a/app/assets/javascripts/discourse/tests/fixtures/search-fixtures.js b/app/assets/javascripts/discourse/tests/fixtures/search-fixtures.js index 9c6069291a1d1..0ece7ac630513 100644 --- a/app/assets/javascripts/discourse/tests/fixtures/search-fixtures.js +++ b/app/assets/javascripts/discourse/tests/fixtures/search-fixtures.js @@ -159,7 +159,7 @@ export default { uploaded_avatar_id: 3281, created_at: "2014-04-12T22:22:07.930Z", cooked: - '

So you want to set up Discourse on Ubuntu to hack on and develop with?

\n\n

We\'ll assume that you don\'t have Ruby/Rails/Postgre/Redis installed on your Ubuntu system. Let\'s begin!

\n\n

Although this guide assumes that you are using Ubuntu, but the set-up instructions will work fine for any Debian based ditribution.

\n\n

(If you want to install Discourse for production use, see our install guide)

\n\n

Install Discourse Dependencies

\n\n

Run this script in terminal, to setup Rails development environment:

\n\n
bash <(wget -qO- https://raw.githubusercontent.com/techAPJ/install-rails/master/linux)
\n\n

\n\n

This will install following new packages on your system:

\n\n\n\n

Install Phantomjs:

\n\n

For 32 bit macine:

\n\n
cd /usr/local/share\nsudo wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-i686.tar.bz2\nsudo tar xvf phantomjs-1.9.8-linux-i686.tar.bz2\nsudo rm phantomjs-1.9.8-linux-i686.tar.bz2\nsudo ln -s /usr/local/share/phantomjs-1.9.8-linux-i686/bin/phantomjs /usr/local/bin/phantomjs\ncd
\n\n

For 64 bit machine:

\n\n
cd /usr/local/share\nsudo wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2\nsudo tar xvf phantomjs-1.9.8-linux-x86_64.tar.bz2\nsudo rm phantomjs-1.9.8-linux-x86_64.tar.bz2\nsudo ln -s /usr/local/share/phantomjs-1.9.8-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs\ncd
\n\n

\n\n

In case you have any of this package pre-installed and don\'t want to run entire script, see the script and pick the packages you don\'t have currently installed. The script is fine-tuned for Discourse, and includes all the packages required for Discourse installation.

\n\n

Now that we have installed Discourse dependencies, let\'s move on to install Discourse itself.

\n\n

Clone Discourse

\n\n

Clone the Discourse repository in ~/discourse folder:

\n\n
git clone https://github.com/discourse/discourse.git ~/discourse
\n\n

\n\n

Setup Database

\n\n

Open psql prompt as postgre user

\n\n
sudo -u postgres psql postgres
\n\n

\n\n

Create role with the same name as your ubuntu system username with discourse as password:

\n\n
CREATE ROLE discourse WITH LOGIN ENCRYPTED PASSWORD \'discourse\' CREATEDB SUPERUSER;
\n\n

In the above command, I named the role as discourse, this means that my ubuntu system username is discourse. (It is necessary for role name to be same as system username, otherwise migrations will not run)

\n\n

Check that you have successfully created discourse role:

\n\n
\\du
\n\n

\n\n

Create discourse_development and discourse_test database:

\n\n
CREATE DATABASE discourse_development WITH OWNER discourse ENCODING \'UTF8\' TEMPLATE template0;\nCREATE DATABASE discourse_test WITH OWNER discourse ENCODING \'UTF8\' TEMPLATE template0;
\n\n

\n\n

Exit psql prompt by pressing ctrld

\n\n

Now access psql prompt in discourse_development database as discourse user:

\n\n
psql -d discourse_development -U discourse -h localhost
\n\n

When prompted for password, provide the password which you set at the time of creating role, if you followed the guide as is, the password is discourse

\n\n

Run following commands, separately:

\n\n
CREATE EXTENSION pg_trgm;\nCREATE EXTENSION hstore;
\n\n

\n\n

Exit psql prompt by pressing ctrld

\n\n

Now access psql prompt in discourse_test database as discourse user:

\n\n
psql -d discourse_test -U discourse -h localhost
\n\n

When prompted for password, provide the password which you set at the time of creating role, if you followed the guide as is, the password is discourse

\n\n

Run following commands, separately:

\n\n
CREATE EXTENSION pg_trgm;\nCREATE EXTENSION hstore;
\n\n

\n\n

Exit psql prompt by pressing ctrld

\n\n

You have set-up the database successfully!

\n\n

Bootstrap Discourse

\n\n

Switch to your Discourse folder:

\n\n
cd ~/discourse
\n\n

Install the needed gems

\n\n
bundle install
\n\n

\n\n

Now that you have successfully configured database connection, run this command:

\n\n
bundle exec rake db:migrate db:test:prepare db:seed_fu
\n\n

Now, try running the specs:

\n\n
bundle exec rake autospec
\n\n

\n\n

Start rails server:

\n\n
bundle exec rails server
\n\n

\n\n

You should now be able to connect to discourse app on http://localhost:3000 - try it out!

\n\n

\n\n

Configure Mail and Create New Account

\n\n

We will use MailCatcher to serve emails in development environment. Install and run MailCatcher:

\n\n
gem install mailcatcher\nmailcatcher --http-ip 0.0.0.0
\n\n

Create new account:

\n\n

\n\n

Check confirmation email by going to MailCatcher web interface at http://localhost:1080/

\n\n

\n\n

If you did not receive the email, try running this in console: bundle exec sidekiq -q default

\n\n

Click the confirmation link and your account will be activated!

\n\n

\n\n

Access Admin

\n\n

Now, to make your account as admin, run the following commands in rails console:

\n\n
RAILS_ENV=development bundle exec rails c\nu = User.last\nu.admin = true\nu.save
\n\n

\n\n

Once you execute the above commands successfully, check out your Discourse account again:

\n\n

\n\n

Congratulations! You are now the admin of your own Discourse installation!

\n\n

Happy hacking!

\n\n

If anything needs to be improved in this guide, feel free to ask on meta.discourse.org, or even better, submit a pull request.

', + '

So you want to set up Discourse on Ubuntu to hack on and develop with?

\n\n

We\'ll assume that you don\'t have Ruby/Rails/Postgre/Redis installed on your Ubuntu system. Let\'s begin!

\n\n

Although this guide assumes that you are using Ubuntu, but the set-up instructions will work fine for any Debian based distribution.

\n\n

(If you want to install Discourse for production use, see our install guide)

\n\n

Install Discourse Dependencies

\n\n

Run this script in terminal, to setup Rails development environment:

\n\n
bash <(wget -qO- https://raw.githubusercontent.com/techAPJ/install-rails/master/linux)
\n\n

\n\n

This will install following new packages on your system:

\n\n\n\n

Install Phantomjs:

\n\n

For 32 bit machine:

\n\n
cd /usr/local/share\nsudo wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-i686.tar.bz2\nsudo tar xvf phantomjs-1.9.8-linux-i686.tar.bz2\nsudo rm phantomjs-1.9.8-linux-i686.tar.bz2\nsudo ln -s /usr/local/share/phantomjs-1.9.8-linux-i686/bin/phantomjs /usr/local/bin/phantomjs\ncd
\n\n

For 64 bit machine:

\n\n
cd /usr/local/share\nsudo wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2\nsudo tar xvf phantomjs-1.9.8-linux-x86_64.tar.bz2\nsudo rm phantomjs-1.9.8-linux-x86_64.tar.bz2\nsudo ln -s /usr/local/share/phantomjs-1.9.8-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs\ncd
\n\n

\n\n

In case you have any of this package pre-installed and don\'t want to run entire script, see the script and pick the packages you don\'t have currently installed. The script is fine-tuned for Discourse, and includes all the packages required for Discourse installation.

\n\n

Now that we have installed Discourse dependencies, let\'s move on to install Discourse itself.

\n\n

Clone Discourse

\n\n

Clone the Discourse repository in ~/discourse folder:

\n\n
git clone https://github.com/discourse/discourse.git ~/discourse
\n\n

\n\n

Setup Database

\n\n

Open psql prompt as postgre user

\n\n
sudo -u postgres psql postgres
\n\n

\n\n

Create role with the same name as your ubuntu system username with discourse as password:

\n\n
CREATE ROLE discourse WITH LOGIN ENCRYPTED PASSWORD \'discourse\' CREATEDB SUPERUSER;
\n\n

In the above command, I named the role as discourse, this means that my ubuntu system username is discourse. (It is necessary for role name to be same as system username, otherwise migrations will not run)

\n\n

Check that you have successfully created discourse role:

\n\n
\\du
\n\n

\n\n

Create discourse_development and discourse_test database:

\n\n
CREATE DATABASE discourse_development WITH OWNER discourse ENCODING \'UTF8\' TEMPLATE template0;\nCREATE DATABASE discourse_test WITH OWNER discourse ENCODING \'UTF8\' TEMPLATE template0;
\n\n

\n\n

Exit psql prompt by pressing ctrld

\n\n

Now access psql prompt in discourse_development database as discourse user:

\n\n
psql -d discourse_development -U discourse -h localhost
\n\n

When prompted for password, provide the password which you set at the time of creating role, if you followed the guide as is, the password is discourse

\n\n

Run following commands, separately:

\n\n
CREATE EXTENSION pg_trgm;\nCREATE EXTENSION hstore;
\n\n

\n\n

Exit psql prompt by pressing ctrld

\n\n

Now access psql prompt in discourse_test database as discourse user:

\n\n
psql -d discourse_test -U discourse -h localhost
\n\n

When prompted for password, provide the password which you set at the time of creating role, if you followed the guide as is, the password is discourse

\n\n

Run following commands, separately:

\n\n
CREATE EXTENSION pg_trgm;\nCREATE EXTENSION hstore;
\n\n

\n\n

Exit psql prompt by pressing ctrld

\n\n

You have set-up the database successfully!

\n\n

Bootstrap Discourse

\n\n

Switch to your Discourse folder:

\n\n
cd ~/discourse
\n\n

Install the needed gems

\n\n
bundle install
\n\n

\n\n

Now that you have successfully configured database connection, run this command:

\n\n
bundle exec rake db:migrate db:test:prepare db:seed_fu
\n\n

Now, try running the specs:

\n\n
bundle exec rake autospec
\n\n

\n\n

Start rails server:

\n\n
bundle exec rails server
\n\n

\n\n

You should now be able to connect to discourse app on http://localhost:3000 - try it out!

\n\n

\n\n

Configure Mail and Create New Account

\n\n

We will use MailCatcher to serve emails in development environment. Install and run MailCatcher:

\n\n
gem install mailcatcher\nmailcatcher --http-ip 0.0.0.0
\n\n

Create new account:

\n\n

\n\n

Check confirmation email by going to MailCatcher web interface at http://localhost:1080/

\n\n

\n\n

If you did not receive the email, try running this in console: bundle exec sidekiq -q default

\n\n

Click the confirmation link and your account will be activated!

\n\n

\n\n

Access Admin

\n\n

Now, to make your account as admin, run the following commands in rails console:

\n\n
RAILS_ENV=development bundle exec rails c\nu = User.last\nu.admin = true\nu.save
\n\n

\n\n

Once you execute the above commands successfully, check out your Discourse account again:

\n\n

\n\n

Congratulations! You are now the admin of your own Discourse installation!

\n\n

Happy hacking!

\n\n

If anything needs to be improved in this guide, feel free to ask on meta.discourse.org, or even better, submit a pull request.

', post_number: 1, post_type: 1, updated_at: "2015-06-22T17:24:20.607Z", diff --git a/app/assets/javascripts/discourse/tests/fixtures/topic.js b/app/assets/javascripts/discourse/tests/fixtures/topic.js index 95debff3a2830..70d5b2ff5c44f 100644 --- a/app/assets/javascripts/discourse/tests/fixtures/topic.js +++ b/app/assets/javascripts/discourse/tests/fixtures/topic.js @@ -3091,11 +3091,11 @@ export default { { id: 27346, title: - 'Reply+{messagekey}@... optionaly in header "from" in addition to "reply-to"', + 'Reply+{messagekey}@... optionally in header "from" in addition to "reply-to"', fancy_title: - "Reply+{messagekey}@… optionaly in header “from” in addition to “reply-to”", + "Reply+{messagekey}@… optionally in header “from” in addition to “reply-to”", slug: - "reply-messagekey-optionaly-in-header-from-in-addition-to-reply-to", + "reply-messagekey-optionally-in-header-from-in-addition-to-reply-to", posts_count: 1, reply_count: 0, highest_post_number: 1, diff --git a/app/assets/javascripts/discourse/tests/fixtures/user-fixtures.js b/app/assets/javascripts/discourse/tests/fixtures/user-fixtures.js index 3fdf904693e67..da0e300420c82 100644 --- a/app/assets/javascripts/discourse/tests/fixtures/user-fixtures.js +++ b/app/assets/javascripts/discourse/tests/fixtures/user-fixtures.js @@ -1132,7 +1132,7 @@ export default { action_type: 6, created_at: "2014-01-13T21:58:28Z", excerpt: - "It looks uneeded, but you need to review a fair amount of code to confirm it is not needed. \n\nI am going to keep it for now cause its safer under some weird edge conditions.", + "It looks unneeded, but you need to review a fair amount of code to confirm it is not needed. \n\nI am going to keep it for now cause its safer under some weird edge conditions.", avatar_template: "//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon", acting_avatar_template: diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/post-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/post-test.js index 708c59101dc74..3e2cda1786ea9 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/post-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/post-test.js @@ -526,7 +526,7 @@ discourseModule("Integration | Component | Widget | post", function (hooks) { }, }); - componentTest("reply directly above (supressed)", { + componentTest("reply directly above (suppressed)", { template: hbs`{{mount-widget widget="post" args=args}}`, beforeEach() { this.set("args", { @@ -545,7 +545,7 @@ discourseModule("Integration | Component | Widget | post", function (hooks) { }, }); - componentTest("reply a few posts above (supressed)", { + componentTest("reply a few posts above (suppressed)", { template: hbs`{{mount-widget widget="post" args=args}}`, beforeEach() { this.set("args", { diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/small-user-list-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/small-user-list-test.js index 2cccac3306b50..ac8dbcdaefa56 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/small-user-list-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/small-user-list-test.js @@ -25,7 +25,7 @@ discourseModule( async test(assert) { assert.ok(queryAll('[data-user-card="eviltrout"]').length === 1); assert.ok(queryAll('[data-user-card="someone"]').length === 0); - assert.ok(queryAll(".unknown").length, "includes unkown user"); + assert.ok(queryAll(".unknown").length, "includes unknown user"); }, }); } diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/widget-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/widget-test.js index e31e82e83c0c5..6df1ef695a80d 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/widget-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/widget-test.js @@ -305,7 +305,7 @@ discourseModule("Integration | Component | Widget | base", function (hooks) { }, test(assert) { - // comin up + // coming up assert.equal(queryAll("span.string").text(), "evil"); assert.equal(queryAll("span.var").text(), "trout"); assert.equal(queryAll("a").prop("title"), "evil"); diff --git a/app/assets/javascripts/discourse/tests/setup-tests.js b/app/assets/javascripts/discourse/tests/setup-tests.js index 7742a30bb1547..12f93098ab199 100644 --- a/app/assets/javascripts/discourse/tests/setup-tests.js +++ b/app/assets/javascripts/discourse/tests/setup-tests.js @@ -247,7 +247,7 @@ function setupTestsCommon(application, container, config) { if (!setupApplicationTest) { // ensures any event not removed is not leaking between tests - // most likely in intialisers, other places (controller, component...) + // most likely in initializers, other places (controller, component...) // should be fixed in code clearAppEventsCache(getOwner(this)); } diff --git a/app/assets/javascripts/discourse/tests/unit/controllers/topic-test.js b/app/assets/javascripts/discourse/tests/unit/controllers/topic-test.js index 7d4c273281c07..6920e74a48569 100644 --- a/app/assets/javascripts/discourse/tests/unit/controllers/topic-test.js +++ b/app/assets/javascripts/discourse/tests/unit/controllers/topic-test.js @@ -538,7 +538,7 @@ discourseModule("Unit | Controller | topic", function (hooks) { post: placeholder, }), null, - "it should work with a post-placehodler" + "it should work with a post-placeholder" ); }); diff --git a/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js b/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js index f413ffea75404..f25c78ce879d9 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js @@ -1602,7 +1602,7 @@ var bar = 'bar'; assert.cookedOptions(" -->asd", enabledTypographer, "

–>asd

"); }); - test("default typhographic replacements", function (assert) { + test("default typographic replacements", function (assert) { const enabledTypographer = { siteSettings: { enable_markdown_typographer: true }, }; @@ -1628,7 +1628,7 @@ var bar = 'bar'; assert.cookedOptions("(pa) (PA)", enabledTypographer, "

¶ ¶

"); }); - test("default typhographic replacements - dashes", function (assert) { + test("default typographic replacements - dashes", function (assert) { const enabledTypographer = { siteSettings: { enable_markdown_typographer: true }, }; @@ -1663,7 +1663,7 @@ var bar = 'bar'; ); }); - test("disabled typhographic replacements", function (assert) { + test("disabled typographic replacements", function (assert) { const enabledTypographer = { siteSettings: { enable_markdown_typographer: true }, }; diff --git a/app/assets/javascripts/discourse/tests/unit/lib/user-search-test.js b/app/assets/javascripts/discourse/tests/unit/lib/user-search-test.js index 021fee33fc8b8..7e63f52ce7992 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/user-search-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/user-search-test.js @@ -129,7 +129,7 @@ module("Unit | Utility | user-search", function (hooks) { assert.equal(results[results.length - 1]["name"], "team"); }); - test("it skips a search depending on punctuations", async function (assert) { + test("it skips a search depending on punctuation", async function (assert) { let results; let skippedTerms = [ "@sam s", // double space is not allowed diff --git a/app/assets/javascripts/discourse/tests/unit/models/composer-test.js b/app/assets/javascripts/discourse/tests/unit/models/composer-test.js index 11be45dce166a..415988c24f6e9 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/composer-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/composer-test.js @@ -47,7 +47,7 @@ discourseModule("Unit | Model | composer", function () { 2, "handles nested quotes correctly" ); - replyLength("", 0, "remove comments"); + replyLength("", 0, "remove comments"); replyLength( "\n more text \n", @@ -333,7 +333,7 @@ discourseModule("Unit | Model | composer", function () { assert.equal( newComposer().get("replyDirty"), false, - "replyDirty is initally false with a quote" + "replyDirty is initially false with a quote" ); }); diff --git a/app/assets/javascripts/discourse/tests/unit/models/post-stream-test.js b/app/assets/javascripts/discourse/tests/unit/models/post-stream-test.js index 78151c335528b..4fd2db7af2127 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/post-stream-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/post-stream-test.js @@ -826,7 +826,7 @@ module("Unit | Model | post-stream", function () { assert.ok( postStream.get("lastAppended"), found, - "comitting a post changes lastAppended" + "committing a post changes lastAppended" ); }); @@ -885,7 +885,7 @@ module("Unit | Model | post-stream", function () { ); }); - test("comitting and triggerNewPostsInStream race condition", function (assert) { + test("committing and triggerNewPostsInStream race condition", function (assert) { const postStream = buildStream(4964); const store = postStream.store; diff --git a/app/assets/javascripts/discourse/tests/unit/models/rest-model-test.js b/app/assets/javascripts/discourse/tests/unit/models/rest-model-test.js index b549826f1adad..d444d275efe9c 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/rest-model-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/rest-model-test.js @@ -50,7 +50,7 @@ module("Unit | Model | rest-model", function () { const secondPromise = widget.update({ name: "new name" }); firstPromise.then(function () { - assert.ok(true, "the first promise succeeeds"); + assert.ok(true, "the first promise succeeds"); }); secondPromise.catch(function () { @@ -93,7 +93,7 @@ module("Unit | Model | rest-model", function () { const firstPromise = widget.save({ name: "Evil Widget" }); const secondPromise = widget.save({ name: "Evil Widget" }); firstPromise.then(function () { - assert.ok(true, "the first promise succeeeds"); + assert.ok(true, "the first promise succeeds"); }); secondPromise.catch(function () { @@ -127,7 +127,7 @@ module("Unit | Model | rest-model", function () { //Create const widget = store.createRecord("my-widget"); await widget.save({ name: "Evil Widget" }); - assert.equal(widget.id, 100, "it saved a new record successully"); + assert.equal(widget.id, 100, "it saved a new record successfully"); assert.equal(widget.get("name"), "Evil Widget"); // Update diff --git a/app/assets/javascripts/locales/i18n.js b/app/assets/javascripts/locales/i18n.js index 814e8ed8d9d44..24547305e3d5b 100644 --- a/app/assets/javascripts/locales/i18n.js +++ b/app/assets/javascripts/locales/i18n.js @@ -73,7 +73,7 @@ I18n.lookup = function(scope, options) { return messages; }; -// Merge serveral hash options, checking if value is set before +// Merge several hash options, checking if value is set before // overwriting any value. The precedence is from left to right. // // I18n.prepareOptions({name: "John Doe"}, {name: "Mary Doe", role: "user"}); diff --git a/app/assets/javascripts/pretty-text/addon/sanitizer.js b/app/assets/javascripts/pretty-text/addon/sanitizer.js index 66bdcbf4ce24f..45342882d56b8 100644 --- a/app/assets/javascripts/pretty-text/addon/sanitizer.js +++ b/app/assets/javascripts/pretty-text/addon/sanitizer.js @@ -97,7 +97,7 @@ export function sanitize(text, allowLister) { } if (tag === "video" && name === "autoplay") { - // This might give us duplicate 'muted' atttributes + // This might give us duplicate 'muted' attributes // but they will be deduped by later processing return "autoplay muted"; } diff --git a/app/assets/javascripts/pretty-text/engines/discourse-markdown/html-img.js b/app/assets/javascripts/pretty-text/engines/discourse-markdown/html-img.js index e876499a25277..ded425a743e93 100644 --- a/app/assets/javascripts/pretty-text/engines/discourse-markdown/html-img.js +++ b/app/assets/javascripts/pretty-text/engines/discourse-markdown/html-img.js @@ -1,4 +1,4 @@ -// special handling for IMG tags on a line by themeselves +// special handling for IMG tags on a line by themselves // we always have to handle it as so it is an inline // see: https://talk.commonmark.org/t/newline-and-img-tags/2511 diff --git a/app/assets/javascripts/pretty-text/engines/discourse-markdown/mentions.js b/app/assets/javascripts/pretty-text/engines/discourse-markdown/mentions.js index 3c5c7d1e92bc6..a9a7015bc5fb3 100644 --- a/app/assets/javascripts/pretty-text/engines/discourse-markdown/mentions.js +++ b/app/assets/javascripts/pretty-text/engines/discourse-markdown/mentions.js @@ -37,7 +37,7 @@ function mentionRegex(unicodeUsernames) { if (unicodeUsernames) { try { // Create the regex from a string, because Babel doesn't understand - // Unicode property escapes and completly mangles the regexp. + // Unicode property escapes and completely mangles the regexp. const alnum = "\\p{Alphabetic}\\p{Mark}\\p{Decimal_Number}"; return new RegExp( `@([${alnum}_][${alnum}._-]{0,58}[${alnum}])|@([${alnum}_])`, diff --git a/app/assets/javascripts/pretty-text/engines/discourse-markdown/newline.js b/app/assets/javascripts/pretty-text/engines/discourse-markdown/newline.js index 5781c9df2039b..e01b7bb082dfc 100644 --- a/app/assets/javascripts/pretty-text/engines/discourse-markdown/newline.js +++ b/app/assets/javascripts/pretty-text/engines/discourse-markdown/newline.js @@ -20,7 +20,7 @@ function newline(state, silent) { // ' \n' -> hardbreak // Lookup in pending chars is bad practice! Don't copy to other rules! // Pending string is stored in concat mode, indexed lookups will cause - // convertion to flat mode. + // conversion to flat mode. if (!silent) { if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) { if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) { diff --git a/app/assets/javascripts/pretty-text/engines/discourse-markdown/onebox.js b/app/assets/javascripts/pretty-text/engines/discourse-markdown/onebox.js index 173964f17c492..ee3965f399ece 100644 --- a/app/assets/javascripts/pretty-text/engines/discourse-markdown/onebox.js +++ b/app/assets/javascripts/pretty-text/engines/discourse-markdown/onebox.js @@ -62,7 +62,7 @@ function applyOnebox(state, silent) { let href = attrs[0][1]; - // edge case ... what if this is not http or protocoless? + // edge case ... what if this is not http or protocolless? if (!/^http|^\/\//i.test(href)) { continue; } diff --git a/app/assets/javascripts/select-kit/addon/components/composer-actions.js b/app/assets/javascripts/select-kit/addon/components/composer-actions.js index b518602da7b10..705c0002c14a5 100644 --- a/app/assets/javascripts/select-kit/addon/components/composer-actions.js +++ b/app/assets/javascripts/select-kit/addon/components/composer-actions.js @@ -225,7 +225,7 @@ export default DropdownSelectBoxComponent.extend({ } // Edge case: If personal messages are disabled, it is possible to have - // no items which stil renders a button that pops up nothing. In this + // no items which still renders a button that pops up nothing. In this // case, add an option for what you're currently doing. if (items.length === 0) { showCreateTopic = true; diff --git a/app/assets/stylesheets/common/base/magnific-popup.scss b/app/assets/stylesheets/common/base/magnific-popup.scss index 1f89e644bfcbe..29896ded017e5 100644 --- a/app/assets/stylesheets/common/base/magnific-popup.scss +++ b/app/assets/stylesheets/common/base/magnific-popup.scss @@ -6,7 +6,7 @@ // // 1. Default Settings // 2. General styles -// - Transluscent overlay +// - Translucent overlay // - Containers, wrappers // - Cursors // - Helper classes @@ -66,7 +66,7 @@ $use-visuallyhidden: false !default; // Hide content from browsers, but make it // 2. General styles //////////////////////// -// Transluscent overlay +// Translucent overlay .mfp-bg { top: 0; left: 0; diff --git a/app/assets/stylesheets/common/d-editor.scss b/app/assets/stylesheets/common/d-editor.scss index 68755aff33a30..935e0f9169fcf 100644 --- a/app/assets/stylesheets/common/d-editor.scss +++ b/app/assets/stylesheets/common/d-editor.scss @@ -260,7 +260,7 @@ opacity: 1; } -// d-editor bar button sizing for all editors - this is kept seprate to keep +// d-editor bar button sizing for all editors - this is kept separate to keep // everything in one place .d-editor-button-bar { margin: 0.25em; diff --git a/app/assets/stylesheets/common/font-variables.scss b/app/assets/stylesheets/common/font-variables.scss index 2ff960e7fcab2..c64ccfd220524 100644 --- a/app/assets/stylesheets/common/font-variables.scss +++ b/app/assets/stylesheets/common/font-variables.scss @@ -5,7 +5,7 @@ --base-font-size-larger: 1.063em; // eq. to 17px --base-font-size-largest: 1.118em; // eq. to 19px - // Font-size defintions, multiplier ^ (step / interval) + // Font-size definitions, multiplier ^ (step / interval) --font-up-6: 2.296em; --font-up-5: 2em; --font-up-4: 1.7511em; diff --git a/app/assets/stylesheets/common/foundation/variables.scss b/app/assets/stylesheets/common/foundation/variables.scss index 3f4ce8eaf4164..ff672beab2707 100644 --- a/app/assets/stylesheets/common/foundation/variables.scss +++ b/app/assets/stylesheets/common/foundation/variables.scss @@ -50,7 +50,7 @@ $base-font-size-larger: var(--base-font-size-larger) !default; $base-font-size-largest: var(--base-font-size-largest) !default; $heading-font-family: var(--heading-font-family) !default; -// Font-size defintions, multiplier ^ (step / interval) +// Font-size definitions, multiplier ^ (step / interval) $font-up-6: var(--font-up-6) !default; $font-up-5: var(--font-up-5) !default; $font-up-4: var(--font-up-4) !default; diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index cf444e8709e48..d75586a458fd3 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -326,7 +326,7 @@ def send_ember_cli_bootstrap end # If a controller requires a plugin, it will raise an exception if that plugin is - # disabled. This allows plugins to be disabled programatically. + # disabled. This allows plugins to be disabled programmatically. def self.requires_plugin(plugin_name) before_action do raise PluginDisabled.new if Discourse.disabled_plugin_names.include?(plugin_name) @@ -399,7 +399,7 @@ def store_preloaded(key, json) @preloaded ||= {} # I dislike that there is a gsub as opposed to a gsub! # but we can not be mucking with user input, I wonder if there is a way - # to inject this safty deeper in the library or even in AM serializer + # to inject this safety deeper in the library or even in AM serializer @preloaded[key] = json.gsub(" p:not(:empty), body > div:not(:empty), body > p > div.lightbox-wrapper img').first end diff --git a/app/jobs/regular/close_topic.rb b/app/jobs/regular/close_topic.rb index fc5f84c9a9244..3385d63c34326 100644 --- a/app/jobs/regular/close_topic.rb +++ b/app/jobs/regular/close_topic.rb @@ -22,7 +22,7 @@ def execute_timer_action(topic_timer, topic) return end - # this handles deleting the topic timer as wel, see TopicStatusUpdater + # this handles deleting the topic timer as well, see TopicStatusUpdater topic.update_status('autoclosed', true, user, { silent: silent }) MessageBus.publish("/topic/#{topic.id}", reload_topic: true) diff --git a/app/jobs/regular/open_topic.rb b/app/jobs/regular/open_topic.rb index 30bddfcb08c59..f1e9fe0d2ff6a 100644 --- a/app/jobs/regular/open_topic.rb +++ b/app/jobs/regular/open_topic.rb @@ -26,7 +26,7 @@ def execute_timer_action(topic_timer, topic) else # autoclosed, false is just another way of saying open. - # this handles deleting the topic timer as wel, see TopicStatusUpdater + # this handles deleting the topic timer as well, see TopicStatusUpdater topic.update_status('autoclosed', false, user) end diff --git a/app/models/concerns/has_custom_fields.rb b/app/models/concerns/has_custom_fields.rb index ee1eedb9f1da6..31b096dcee88c 100644 --- a/app/models/concerns/has_custom_fields.rb +++ b/app/models/concerns/has_custom_fields.rb @@ -257,7 +257,7 @@ def save_custom_fields(force = false) end end - # We support unique indexes on certain fields. In the event two concurrenct processes attempt to + # We support unique indexes on certain fields. In the event two concurrent processes attempt to # update the same custom field we should catch the error and perform an update instead. def create_singular(name, value, field_type = nil) write_value = value.is_a?(Hash) || field_type == :json ? value.to_json : value diff --git a/app/models/topic_embed.rb b/app/models/topic_embed.rb index d3ed0f1a31146..69279394d26b0 100644 --- a/app/models/topic_embed.rb +++ b/app/models/topic_embed.rb @@ -240,7 +240,7 @@ def self.first_paragraph_from(html) end return result unless result.blank? - # If there is no first paragaph, return the first div (onebox) + # If there is no first paragraph, return the first div (onebox) doc.css('div').first.to_s end diff --git a/app/models/topic_link_click.rb b/app/models/topic_link_click.rb index 32526189050fa..ab42037769ee8 100644 --- a/app/models/topic_link_click.rb +++ b/app/models/topic_link_click.rb @@ -78,7 +78,7 @@ def self.create_from(args = {}) # Find the forum topic link link = link.where(post_id: args[:post_id]) if args[:post_id].present? - # If we don't have a post, just find the first occurance of the link + # If we don't have a post, just find the first occurrence of the link link = link.where(topic_id: args[:topic_id]) if args[:topic_id].present? link = link.first diff --git a/app/models/topic_tracking_state.rb b/app/models/topic_tracking_state.rb index 75c2e9d974583..52dba4823d6e3 100644 --- a/app/models/topic_tracking_state.rb +++ b/app/models/topic_tracking_state.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true # this class is used to mirror unread and new status back to end users -# in JavaScript there is a mirror class that is kept in-sync using the mssage bus +# in JavaScript there is a mirror class that is kept in-sync using the massage bus # the allows end users to always know which topics have unread posts in them # and which topics are new diff --git a/app/models/topic_user.rb b/app/models/topic_user.rb index bcc24d979f6c1..f86d99ffac2e5 100644 --- a/app/models/topic_user.rb +++ b/app/models/topic_user.rb @@ -303,7 +303,7 @@ def update_last_read(user, topic_id, post_number, new_posts_read, msecs, opts = threshold: SiteSetting.default_other_auto_track_topics_after_msecs } - # In case anyone seens "highest_seen_post_number" and gets confused, like I do. + # In case anyone sees "highest_seen_post_number" and gets confused, like I do. # highest_seen_post_number represents the highest_post_number of the topic when # the user visited it. It may be out of alignment with last_read, meaning # ... user visited the topic but did not read the posts diff --git a/app/models/user_auth_token.rb b/app/models/user_auth_token.rb index 48079e351d761..99dc33978bab8 100644 --- a/app/models/user_auth_token.rb +++ b/app/models/user_auth_token.rb @@ -52,7 +52,7 @@ def self.is_suspicious(user_id, user_ip) return false unless User.find_by(id: user_id)&.staff? ips = UserAuthTokenLog.where(user_id: user_id).pluck(:client_ip) - ips.delete_at(ips.index(user_ip) || ips.length) # delete one occurance (current) + ips.delete_at(ips.index(user_ip) || ips.length) # delete one occurrence (current) ips.uniq! return false if ips.empty? # first login is never suspicious diff --git a/app/models/user_history.rb b/app/models/user_history.rb index 78b87c04ababb..c84b326653b2a 100644 --- a/app/models/user_history.rb +++ b/app/models/user_history.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true # UserHistory stores information about actions that users have taken, -# like deleting users, changing site settings, dimissing notifications, etc. +# like deleting users, changing site settings, dismissing notifications, etc. # Use other classes, like StaffActionLogger, to log records to this table. class UserHistory < ActiveRecord::Base belongs_to :acting_user, class_name: 'User' diff --git a/app/models/user_search.rb b/app/models/user_search.rb index 7498b230beb79..13d74df0690f3 100644 --- a/app/models/user_search.rb +++ b/app/models/user_search.rb @@ -68,7 +68,7 @@ def search_ids if @term.present? exact_matches = scoped_users.where(username_lower: @term) - # don't polute mentions with users who haven't shown up in over a year + # don't pollute mentions with users who haven't shown up in over a year exact_matches = exact_matches.where('last_seen_at > ?', 1.year.ago) if @topic_id || @category_id exact_matches diff --git a/app/models/user_stat.rb b/app/models/user_stat.rb index 2921233b2a261..d2963fba8d658 100644 --- a/app/models/user_stat.rb +++ b/app/models/user_stat.rb @@ -161,7 +161,7 @@ def self.update_view_counts(last_seen = 1.hour.ago) X.c <> topics_entered SQL - # Update denormalzied posts_read_count + # Update denormalized posts_read_count DB.exec(<<~SQL, seen_at: last_seen) UPDATE user_stats SET posts_read_count = X.c FROM diff --git a/app/serializers/topic_view_details_serializer.rb b/app/serializers/topic_view_details_serializer.rb index 0a3077c9ce5ae..02fd53bcdfd16 100644 --- a/app/serializers/topic_view_details_serializer.rb +++ b/app/serializers/topic_view_details_serializer.rb @@ -93,7 +93,7 @@ def include_can_remove_self_id? # NOTE: A Category Group Moderator moving a topic to a different category # may result in the 'can_edit?' result changing from `true` to `false`. - # Explictly returning a `false` value is required to update the client UI. + # Explicitly returning a `false` value is required to update the client UI. def can_edit scope.can_edit?(object.topic) end diff --git a/app/services/search_indexer.rb b/app/services/search_indexer.rb index d8a970f1bea8d..de3553daabaa7 100644 --- a/app/services/search_indexer.rb +++ b/app/services/search_indexer.rb @@ -103,7 +103,7 @@ def self.update_index(table: , id: , a_weight: nil, b_weight: nil, c_weight: nil end def self.update_topics_index(topic_id, title, cooked) - # a bit inconsitent that we use title as A and body as B when in + # a bit inconsistent that we use title as A and body as B when in # the post index body is D update_index( table: 'topic', diff --git a/config/application.rb b/config/application.rb index 3b38209571973..5f61cbbef5488 100644 --- a/config/application.rb +++ b/config/application.rb @@ -93,7 +93,7 @@ def config.database_configuration require_dependency 'lib/highlight_js/highlight_js' # we skip it cause we configure it in the initializer - # the railstie for message_bus would insert it in the + # the railtie for message_bus would insert it in the # wrong position config.skip_message_bus_middleware = true config.skip_multisite_middleware = true @@ -138,7 +138,7 @@ def watchable_args config.assets.paths += %W(#{config.root}/config/locales #{config.root}/public/javascripts) - # Allows us to skip minifincation on some files + # Allows us to skip minification on some files config.assets.skip_minification = [] # explicitly precompile any images in plugins ( /assets/images ) path @@ -292,7 +292,7 @@ def watchable_args # our setup does not use rack cache and instead defers to nginx config.action_dispatch.rack_cache = nil - # ember stuff only used for asset precompliation, production variant plays up + # ember stuff only used for asset precompilation, production variant plays up config.ember.variant = :development config.ember.ember_location = "#{Rails.root}/vendor/assets/javascripts/production/ember.js" config.ember.handlebars_location = "#{Rails.root}/vendor/assets/javascripts/handlebars.js" diff --git a/config/database.yml b/config/database.yml index be92da494ded9..456b8752f1890 100644 --- a/config/database.yml +++ b/config/database.yml @@ -6,7 +6,7 @@ development: pool: 5 timeout: 5000 checkout_timeout: <%= ENV['CHECKOUT_TIMEOUT'] || 5 %> - advisory_locks: false # Disable until https://github.com/rails/rails/issues/40029 has beeen resolved. + advisory_locks: false # Disable until https://github.com/rails/rails/issues/40029 has been resolved. host_names: ### Don't include the port number here. Change the "port" site setting instead, at /admin/site_settings. ### If you change this setting you will need to @@ -40,7 +40,7 @@ test: min_messages: warning pool: 5 timeout: 5000 - advisory_locks: false # Disable until https://github.com/rails/rails/issues/40029 has beeen resolved. + advisory_locks: false # Disable until https://github.com/rails/rails/issues/40029 has been resolved. host_names: - test.localhost diff --git a/config/discourse_defaults.conf b/config/discourse_defaults.conf index b7c10ed966862..fbca7c499b09c 100644 --- a/config/discourse_defaults.conf +++ b/config/discourse_defaults.conf @@ -173,7 +173,7 @@ message_bus_redis_skip_client_commands = false enable_cors = false cors_origin = '' -# enable if you really need to serve assets in prd +# enable if you really need to serve assets in prod serve_static_assets = false # number of sidekiq workers (launched via unicorn master) @@ -210,7 +210,7 @@ secret_key_base = fallback_assets_path = # S3 settings used for serving ALL public files -# be sure to configre a CDN as well per cdn_url +# be sure to configure a CDN as well per cdn_url s3_bucket = s3_region = s3_access_key_id = @@ -315,7 +315,7 @@ anon_cache_store_threshold = 2 # you may restrict it so only specific themes are approved # in allowlist mode all theme updates must happen via git repos # themes missing from the list are automatically disallowed -# list is a comma seperated list of git repos eg: +# list is a comma separated list of git repos eg: # https://github.com/discourse/discourse-custom-header-links.git,https://github.com/discourse/discourse-simple-theme.git allowed_theme_repos = diff --git a/config/environments/test.rb b/config/environments/test.rb index 0d753f4ed8b48..502ae6b376d5d 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -12,7 +12,7 @@ # Configure static asset server for tests with Cache-Control for performance config.public_file_server.enabled = true - # don't consider reqs local so we can properly handle exceptions like we do in prd + # don't consider reqs local so we can properly handle exceptions like we do in prod config.consider_all_requests_local = false # disable caching diff --git a/config/initializers/100-watch_for_restart.rb b/config/initializers/100-watch_for_restart.rb index bb18758cf9dd9..922380cf675a8 100644 --- a/config/initializers/100-watch_for_restart.rb +++ b/config/initializers/100-watch_for_restart.rb @@ -5,7 +5,7 @@ # It simply drains all the requests (waits up to 4 seconds) and issues a HUP # if you need a more sophisticated cycling restart for multiple thins it will need to be written # -# This works fine for Discourse.org cause we host our app accross multiple machines, if you hosting +# This works fine for Discourse.org cause we host our app across multiple machines, if you hosting # on a single machine you have a trickier problem at hand as you need to cycle the processes in order # diff --git a/config/nginx.sample.conf b/config/nginx.sample.conf index 3993ff8cc9ad6..278633933468b 100644 --- a/config/nginx.sample.conf +++ b/config/nginx.sample.conf @@ -9,7 +9,7 @@ upstream discourse { } # inactive means we keep stuff around for 1440m minutes regardless of last access (1 week) -# levels means it is a 2 deep heirarchy cause we can have lots of files +# levels means it is a 2 deep hierarchy cause we can have lots of files # max_size limits the size of the cache proxy_cache_path /var/nginx/cache inactive=1440m levels=1:2 keys_zone=one:10m max_size=600m; @@ -131,7 +131,7 @@ server { } # some minimal caching here so we don't keep asking - # longer term we should increas probably to 1y + # longer term we should increase probably to 1y location ~ ^/javascripts/ { expires 1d; add_header Cache-Control public,immutable; diff --git a/db/fixtures/001_refresh.rb b/db/fixtures/001_refresh.rb index 514789616dcec..3e0d603b93c73 100644 --- a/db/fixtures/001_refresh.rb +++ b/db/fixtures/001_refresh.rb @@ -9,7 +9,7 @@ def self.refresh! @mutex.synchronize do return if @refreshed # Fix any bust caches post initial migration - # Not that reset_column_information is not thread safe so we have to becareful + # Not that reset_column_information is not thread safe so we have to be careful # not to run it concurrently within the same process. ActiveRecord::Base.connection.tables.each do |table| table.classify.constantize.reset_column_information rescue nil diff --git a/docs/SECURITY.md b/docs/SECURITY.md index cd44bf92b4afc..29225d0c3e962 100644 --- a/docs/SECURITY.md +++ b/docs/SECURITY.md @@ -12,7 +12,7 @@ For a list of recent security commits, check [our GitHub commits prefixed with S Discourse uses the PBKDF2 algorithm to encrypt salted passwords. This algorithm is blessed by NIST. Security experts on the web [tend to agree that PBKDF2 is a secure choice](https://security.stackexchange.com/questions/4781/do-any-security-experts-recommend-bcrypt-for-password-storage). -**options you can customise in your production.rb file** +**options you can customize in your production.rb file** - `pbkdf2_algorithm`: the hashing algorithm used (default "sha256") - `pbkdf2_iterations`: the number of iterations to run (default 64000) @@ -43,7 +43,7 @@ Discourse extends the built-in Rails CSRF protection in the following ways: 2. API calls using the secret API bypass CSRF checks. -3. Certain pages are "cachable", we do not render the CSRF token (` 1 || specs == "spec" # Only paralellize multiple files + multiple_files = specs.split.count > 1 || specs == "spec" # Only parallelize multiple files if ENV["PARALLEL_SPEC"] == '1' && multiple_files && !line_specified "bin/turbo_rspec #{args.join(" ")} #{specs.split.join(" ")}" else diff --git a/lib/badge_queries.rb b/lib/badge_queries.rb index a8cf8a917116a..e59476c3f80a3 100644 --- a/lib/badge_queries.rb +++ b/lib/badge_queries.rb @@ -93,7 +93,7 @@ module BadgeQueries JOIN post_actions pa1 on pa1.id = x.id SQL - # Incorrect, but good enough - (earlies post edited vs first edit) + # Incorrect, but good enough - (earliest post edited vs first edit) Editor = <<~SQL SELECT p.user_id, min(p.id) post_id, min(p.created_at) granted_at FROM badge_posts p diff --git a/lib/base62.rb b/lib/base62.rb index 70728c6a52dec..e282f221a0056 100644 --- a/lib/base62.rb +++ b/lib/base62.rb @@ -14,7 +14,7 @@ def self.encode(num) str = "" while num > 0 - # prepend base62 charaters + # prepend base62 characters str = KEYS[num % BASE] + str num = num / BASE end diff --git a/lib/discourse_tagging.rb b/lib/discourse_tagging.rb index 4c9aa5c06ceae..0699cf7e3c35e 100644 --- a/lib/discourse_tagging.rb +++ b/lib/discourse_tagging.rb @@ -32,7 +32,7 @@ def self.tag_topic_by_names(topic, guardian, tag_names_arg, append: false) # tag names which are visible, but not usable, by *some users* readonly_tags = DiscourseTagging.readonly_tag_names(guardian) - # tags names which are not visibile or usuable by this user + # tags names which are not visible or usable by this user hidden_tags = DiscourseTagging.hidden_tag_names(guardian) # tag names which ARE permitted by *this user* diff --git a/lib/file_store/s3_store.rb b/lib/file_store/s3_store.rb index 968c673af438a..ab6e56bb69f58 100644 --- a/lib/file_store/s3_store.rb +++ b/lib/file_store/s3_store.rb @@ -93,7 +93,7 @@ def has_been_uploaded?(url) begin parsed_url = URI.parse(UrlHelper.encode(url)) rescue - # There are many exceptions possible here including Addressable::URI:: excpetions + # There are many exceptions possible here including Addressable::URI:: exceptions # and URI:: exceptions, catch all may seem wide, but it makes no sense to raise ever # on an invalid url here return false diff --git a/lib/freedom_patches/active_record_attribute_methods.rb b/lib/freedom_patches/active_record_attribute_methods.rb index 815159ff4ef1d..8144cba19b4b9 100644 --- a/lib/freedom_patches/active_record_attribute_methods.rb +++ b/lib/freedom_patches/active_record_attribute_methods.rb @@ -19,7 +19,7 @@ def enforce_raw_sql_whitelist(*args) BLANK_ARRAY = [].freeze - # this patch just allows everyting in Rails 6 + # this patch just allows everything in Rails 6 def disallow_raw_sql!(args, permit: nil) # we may consider moving to https://github.com/rails/rails/pull/33330 # once all frozen string hints are in place diff --git a/lib/guardian/category_guardian.rb b/lib/guardian/category_guardian.rb index 9f37b7cf99ca2..4e9050f29a36d 100644 --- a/lib/guardian/category_guardian.rb +++ b/lib/guardian/category_guardian.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -#mixin for all guardian methods dealing with category permisions +#mixin for all guardian methods dealing with category permissions module CategoryGuardian # Creating Method diff --git a/lib/guardian/tag_guardian.rb b/lib/guardian/tag_guardian.rb index e1b5a211e2783..59e370cc8f9cd 100644 --- a/lib/guardian/tag_guardian.rb +++ b/lib/guardian/tag_guardian.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -#mixin for all guardian methods dealing with tagging permisions +#mixin for all guardian methods dealing with tagging permissions module TagGuardian def can_create_tag? return is_admin? if SiteSetting.min_trust_to_create_tag.to_s == 'admin' diff --git a/lib/guardian/topic_guardian.rb b/lib/guardian/topic_guardian.rb index 81d36c02c28f5..8539138003cfe 100644 --- a/lib/guardian/topic_guardian.rb +++ b/lib/guardian/topic_guardian.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -#mixin for all guardian methods dealing with topic permisions +#mixin for all guardian methods dealing with topic permissions module TopicGuardian def can_remove_allowed_users?(topic, target_user = nil) diff --git a/lib/imap/sync.rb b/lib/imap/sync.rb index 96e85ba746df1..5f034270dccf4 100644 --- a/lib/imap/sync.rb +++ b/lib/imap/sync.rb @@ -42,7 +42,7 @@ def process(idle: false, import_limit: nil, old_emails_limit: nil, new_emails_li if @status[:uid_validity] != @group.imap_uid_validity # If UID validity changes, the whole mailbox must be synchronized (all # emails are considered new and will be associated to existent topics - # in Email::Reciever by matching Message-Ids). + # in Email::Receiver by matching Message-Ids). ImapSyncLog.warn("UIDVALIDITY = #{@status[:uid_validity]} does not match expected #{@group.imap_uid_validity}, invalidating IMAP cache and resyncing emails for mailbox #{@group.imap_mailbox_name}", @group) @group.imap_last_uid = 0 end diff --git a/lib/javascripts/messageformat.js b/lib/javascripts/messageformat.js index 04f5be94a7095..6626d51a168c8 100644 --- a/lib/javascripts/messageformat.js +++ b/lib/javascripts/messageformat.js @@ -10,7 +10,7 @@ */ (function ( root ) { - // Create the contructor function + // Create the constructor function function MessageFormat ( locale, pluralFunc ) { var fallbackLocale; @@ -133,7 +133,7 @@ var result = { /* - * Parses the input with a generated parser. If the parsing is successfull, + * Parses the input with a generated parser. If the parsing is successful, * returns a value explicitly or implicitly specified by the grammar from * which the parser was generated (see |PEG.buildParser|). If the parsing is * unsuccessful, throws |PEG.parser.SyntaxError| describing the error. diff --git a/lib/javascripts/widget-hbs-compiler.js b/lib/javascripts/widget-hbs-compiler.js index 58c911a19702a..e36aa3549c51e 100644 --- a/lib/javascripts/widget-hbs-compiler.js +++ b/lib/javascripts/widget-hbs-compiler.js @@ -125,7 +125,7 @@ function mustacheValue(node, state) { return `${useHelper(state, "iconNode")}(${valueOf(node.params[0])})`; break; default: - // Shortcut: If our mustach has hash arguments, we can assume it's attaching. + // Shortcut: If our mustache has hash arguments, we can assume it's attaching. // For example `{{home-logo count=123}}` can become `this.attach('home-logo, { "count": 123 });` let hash = node.hash; if (hash.pairs.length) { diff --git a/lib/js_locale_helper.rb b/lib/js_locale_helper.rb index fbf1fc1bdb3c3..c51a88122912f 100644 --- a/lib/js_locale_helper.rb +++ b/lib/js_locale_helper.rb @@ -242,7 +242,7 @@ def self.find_locale(locale_chain, path, type, fallback_to_english:) return locale_data if locale_data end - # English should alyways work + # English should always work ["en", File.join(path, "en.js")] if fallback_to_english end diff --git a/lib/letter_avatar.rb b/lib/letter_avatar.rb index 6c4aa1d2f9da0..cdd054626a26b 100644 --- a/lib/letter_avatar.rb +++ b/lib/letter_avatar.rb @@ -121,7 +121,7 @@ def cleanup_old end end - # palette of optimally disctinct colors + # palette of optimally distinct colors # cf. http://tools.medialab.sciences-po.fr/iwanthue/index.php # parameters used: # - H: 0 - 360 diff --git a/lib/middleware/enforce_hostname.rb b/lib/middleware/enforce_hostname.rb index c462e5b7bccd3..486753c7d7ff5 100644 --- a/lib/middleware/enforce_hostname.rb +++ b/lib/middleware/enforce_hostname.rb @@ -10,7 +10,7 @@ def call(env) # enforces hostname to match the hostname of our connection # this middleware lives after rails multisite so at this point # Discourse.current_hostname MUST be canonical, enforce it so - # all Rails helpers are guarenteed to use it unconditionally and + # all Rails helpers are guaranteed to use it unconditionally and # never generate incorrect links env[Rack::Request::HTTP_X_FORWARDED_HOST] = nil diff --git a/lib/pbkdf2.rb b/lib/pbkdf2.rb index 59317ed5cfb28..62551d052f45d 100644 --- a/lib/pbkdf2.rb +++ b/lib/pbkdf2.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -# Note: This logic was originaly extracted from the Pbkdf2 gem to fix Ruby 2.0 +# Note: This logic was originally extracted from the Pbkdf2 gem to fix Ruby 2.0 # issues, but that gem has gone stale so we won't be returning to it. require 'openssl' diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb index 784a028ce7ecb..6bf2fe0b53e3e 100644 --- a/lib/plugin/instance.rb +++ b/lib/plugin/instance.rb @@ -591,7 +591,7 @@ def automatic_assets end end - # note, we need to be able to parse seperately to activation. + # note, we need to be able to parse separately to activation. # this allows us to present information about a plugin in the UI # prior to activations def activate! @@ -816,7 +816,7 @@ def add_api_key_scope(resource, action) end # Register a new UserApiKey scope, and its allowed routes. Scope will be prefixed - # with the (parametetized) plugin name followed by a colon. + # with the (parameterized) plugin name followed by a colon. # # For example, if discourse-awesome-plugin registered this: # diff --git a/lib/post_action_creator.rb b/lib/post_action_creator.rb index a07c0e7b7dc54..559aaaf23ec57 100644 --- a/lib/post_action_creator.rb +++ b/lib/post_action_creator.rb @@ -127,7 +127,7 @@ def perform end rescue ActiveRecord::RecordNotUnique - # If the user already performed this action, it's proably due to a different browser tab + # If the user already performed this action, it's probably due to a different browser tab # or non-debounced clicking. We can ignore. result.success = true result.post_action = PostAction.find_by( diff --git a/lib/post_creator.rb b/lib/post_creator.rb index bb28f3cdd2433..abc8dc445b07c 100644 --- a/lib/post_creator.rb +++ b/lib/post_creator.rb @@ -32,7 +32,7 @@ class PostCreator # skip_jobs - Don't enqueue jobs when creation succeeds. This is needed if you # wrap `PostCreator` in a transaction, as the sidekiq jobs could # dequeue before the commit finishes. If you do this, be sure to - # call `enqueue_jobs` after the transaction is comitted. + # call `enqueue_jobs` after the transaction is committed. # hidden_reason_id - Reason for hiding the post (optional) # skip_validations - Do not validate any of the content in the post # draft_key - the key of the draft we are creating (will be deleted on success) diff --git a/lib/post_jobs_enqueuer.rb b/lib/post_jobs_enqueuer.rb index 1fbbe0183af66..4809fdc1e862c 100644 --- a/lib/post_jobs_enqueuer.rb +++ b/lib/post_jobs_enqueuer.rb @@ -10,7 +10,7 @@ def initialize(post, topic, new_topic, opts = {}) def enqueue_jobs # We need to enqueue jobs after the transaction. - # Otherwise they might begin before the data has been comitted. + # Otherwise they might begin before the data has been committed. enqueue_post_alerts unless @opts[:import_mode] feature_topic_users unless @opts[:import_mode] trigger_post_post_process diff --git a/lib/rate_limiter.rb b/lib/rate_limiter.rb index bea535b7facb0..12f565bf17bed 100644 --- a/lib/rate_limiter.rb +++ b/lib/rate_limiter.rb @@ -187,7 +187,7 @@ def is_under_limit? # number of events in buffer less than max allowed? OR (redis.llen(prefixed_key) < @max) || - # age bigger than silding window size? + # age bigger than sliding window size? (age_of_oldest(now) >= @secs) end diff --git a/lib/search.rb b/lib/search.rb index fdc064bfd3d15..4efdbff9cafea 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -76,7 +76,7 @@ def self.prepare_data(search_data, purpose = :query) data.force_encoding("UTF-8") if purpose != :topic # TODO cppjieba_rb is designed for chinese, we need something else for Japanese - # Korean appears to be safe cause words are already space seperated + # Korean appears to be safe cause words are already space separated # For Japanese we should investigate using kakasi if segment_cjk? require 'cppjieba_rb' unless defined? CppjiebaRb diff --git a/lib/tasks/admin.rake b/lib/tasks/admin.rake index 80c403616dc13..d730ed66fe31c 100644 --- a/lib/tasks/admin.rake +++ b/lib/tasks/admin.rake @@ -39,7 +39,7 @@ task "admin:create" => :environment do email = ask("Email: ") existing_user = User.find_by_email(email) - # check if user account already exixts + # check if user account already exists if existing_user # user already exists, ask for password reset admin = existing_user diff --git a/lib/tasks/autospec.rake b/lib/tasks/autospec.rake index 895eb6da20bff..0a6c9fadd5c8c 100644 --- a/lib/tasks/autospec.rake +++ b/lib/tasks/autospec.rake @@ -1,7 +1,7 @@ # frozen_string_literal: true # I like guard, don't get me wrong, but it is just not working right -# architectually it can not do what I want it to do, this is how I want +# architecturally it can not do what I want it to do, this is how I want # it to behave desc "Run all specs automatically as needed" diff --git a/lib/tasks/docker.rake b/lib/tasks/docker.rake index 0e6bd415929c0..feafbfc234382 100644 --- a/lib/tasks/docker.rake +++ b/lib/tasks/docker.rake @@ -8,7 +8,7 @@ # => SKIP_TESTS set to 1 to skip all tests # => SKIP_CORE set to 1 to skip core tests (rspec and qunit) # => SKIP_PLUGINS set to 1 to skip plugin tests (rspec and qunit) -# => SKIP_INSTALL_PLUGINS comma seperated list of plugins you want to skip installing +# => SKIP_INSTALL_PLUGINS comma separated list of plugins you want to skip installing # => INSTALL_OFFICIAL_PLUGINS set to 1 to install all core plugins before running tests # => RUBY_ONLY set to 1 to skip all qunit tests # => JS_ONLY set to 1 to skip all rspec tests diff --git a/lib/tasks/emails.rake b/lib/tasks/emails.rake index 1ea427a21a995..2cd3e8e4fd6d4 100644 --- a/lib/tasks/emails.rake +++ b/lib/tasks/emails.rake @@ -111,7 +111,7 @@ task 'emails:test', [:email] => [:environment] do |_, args| STR elsif e.to_s.match(/530.*STARTTLS/) - # We can't run a prelimary test with STARTTLS, we'll just try sending the test email. + # We can't run a preliminary test with STARTTLS, we'll just try sending the test email. message = "OK" elsif e.to_s.match(/535/) diff --git a/lib/tasks/uploads.rake b/lib/tasks/uploads.rake index a085e0e1b5477..42d089fcef603 100644 --- a/lib/tasks/uploads.rake +++ b/lib/tasks/uploads.rake @@ -46,7 +46,7 @@ def gather_uploads `cp --link '#{source}' '#{destination}'` end - # ensure file has been succesfuly copied over + # ensure file has been successfully copied over raise unless file_exists?(destination) # remap links in db diff --git a/lib/text_cleaner.rb b/lib/text_cleaner.rb index 179ec5f70d9c6..09160f3f3efcd 100644 --- a/lib/text_cleaner.rb +++ b/lib/text_cleaner.rb @@ -4,7 +4,7 @@ # Clean up a text # -# Whe use ActiveSupport mb_chars from here to properly support non ascii downcase +# We use ActiveSupport mb_chars from here to properly support non ascii downcase require 'active_support/core_ext/string/multibyte' class TextCleaner diff --git a/lib/text_sentinel.rb b/lib/text_sentinel.rb index f720e1b503207..1cd7e8d5913fd 100644 --- a/lib/text_sentinel.rb +++ b/lib/text_sentinel.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -# Whe use ActiveSupport mb_chars from here to properly support non ascii downcase +# We use ActiveSupport mb_chars from here to properly support non ascii downcase # TODO remove when ruby 2.4 lands require 'active_support/core_ext/string/multibyte' diff --git a/lib/topic_query_sql.rb b/lib/topic_query_sql.rb index 93a2b9a8625bc..c96f46c68c60b 100644 --- a/lib/topic_query_sql.rb +++ b/lib/topic_query_sql.rb @@ -14,7 +14,7 @@ def order_by_category_sql(dir) -"CASE WHEN categories.id = #{SiteSetting.uncategorized_category_id.to_i} THEN '' ELSE categories.name END #{dir}" end - # If you've clearned the pin, use bumped_at, otherwise put it at the top + # If you've cleared the pin, use bumped_at, otherwise put it at the top def order_with_pinned_sql -"CASE WHEN (COALESCE(topics.pinned_at, '#{lowest_date}') > COALESCE(tu.cleared_pinned_at, '#{lowest_date}')) @@ -23,7 +23,7 @@ def order_with_pinned_sql END DESC" end - # If you've clearned the pin, use bumped_at, otherwise put it at the top + # If you've cleared the pin, use bumped_at, otherwise put it at the top def order_nocategory_with_pinned_sql -"CASE WHEN topics.pinned_globally diff --git a/lib/url_helper.rb b/lib/url_helper.rb index be75c5d0a295d..4bbafe331f341 100644 --- a/lib/url_helper.rb +++ b/lib/url_helper.rb @@ -87,7 +87,7 @@ def self.cook_url(url, secure: false, local: nil) # to avoid asset_host mixups return schemaless(url) if secure - # PERF: avoid parsing url excpet for extreme conditions + # PERF: avoid parsing url except for extreme conditions # this is a hot path used on home page filename = url if url.include?("?") diff --git a/plugins/discourse-local-dates/assets/javascripts/lib/date-with-zone-helper.js.es6 b/plugins/discourse-local-dates/assets/javascripts/lib/date-with-zone-helper.js.es6 index d82cfa4d0d489..0f4abe2cd53d7 100644 --- a/plugins/discourse-local-dates/assets/javascripts/lib/date-with-zone-helper.js.es6 +++ b/plugins/discourse-local-dates/assets/javascripts/lib/date-with-zone-helper.js.es6 @@ -6,11 +6,11 @@ const { getProperties } = Ember; - add(count unit) adds a COUNT of UNITS to a date - subtract(count unit) subtracts a COUNT of UNITS to a date - - format(format) formats a date with zone in a consitent way, optional moment format + - format(format) formats a date with zone in a consistent way, optional moment format - isDST() allows to know if a date in a specified timezone is currently under DST - datetimeWithZone(timezone) returns a new moment object with timezone applied - datetime returns the moment object - - unitRepetitionsBetweenDates(duration, date) return the number of repertitions of + - unitRepetitionsBetweenDates(duration, date) return the number of repetitions of duration between two dates, eg for duration: "1.weeks", "2.months"... */ export default class DateWithZoneHelper { diff --git a/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/new_user_narrative_spec.rb b/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/new_user_narrative_spec.rb index 35b9c1e4b31f6..e249d98a441e3 100644 --- a/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/new_user_narrative_spec.rb +++ b/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/new_user_narrative_spec.rb @@ -637,7 +637,7 @@ end end - describe 'fomatting tutorial' do + describe 'formatting tutorial' do before do narrative.set_data(user, state: :tutorial_formatting, topic_id: topic.id) end diff --git a/plugins/discourse-presence/spec/requests/presence_controller_spec.rb b/plugins/discourse-presence/spec/requests/presence_controller_spec.rb index 8df3086aef874..9f374dbd40410 100644 --- a/plugins/discourse-presence/spec/requests/presence_controller_spec.rb +++ b/plugins/discourse-presence/spec/requests/presence_controller_spec.rb @@ -406,7 +406,7 @@ ) end - it 'publises the right message when closing composer in public topic' do + it 'publishes the right message when closing composer in public topic' do messages = MessageBus.track_publish do post '/presence/publish.json', params: { topic_id: public_topic.id, @@ -424,7 +424,7 @@ expect(message.user_ids).to eq(nil) end - it 'publises the right message when closing composer in private topic' do + it 'publishes the right message when closing composer in private topic' do messages = MessageBus.track_publish do post '/presence/publish.json', params: { topic_id: private_topic.id, @@ -442,7 +442,7 @@ expect(message.user_ids).to eq(nil) end - it 'publises the right message when closing composer in private message' do + it 'publishes the right message when closing composer in private message' do post = Fabricate(:post, topic: private_message, user: user) messages = MessageBus.track_publish do diff --git a/plugins/poll/assets/javascripts/lib/discourse-markdown/poll.js.es6 b/plugins/poll/assets/javascripts/lib/discourse-markdown/poll.js.es6 index e004aefa75966..061ccceaf9702 100644 --- a/plugins/poll/assets/javascripts/lib/discourse-markdown/poll.js.es6 +++ b/plugins/poll/assets/javascripts/lib/discourse-markdown/poll.js.es6 @@ -292,7 +292,7 @@ export function setup(helper) { /*! * Joseph Myer's md5() algorithm wrapped in a self-invoked function to prevent - * global namespace polution, modified to hash unicode characters as UTF-8. + * global namespace pollution, modified to hash unicode characters as UTF-8. * * Copyright 1999-2010, Joseph Myers, Paul Johnston, Greg Holt, Will Bond * http://www.myersdaily.org/joseph/javascript/md5-text.html diff --git a/plugins/poll/spec/controllers/posts_controller_spec.rb b/plugins/poll/spec/controllers/posts_controller_spec.rb index 805641a1882e2..37bcb45e75c1a 100644 --- a/plugins/poll/spec/controllers/posts_controller_spec.rb +++ b/plugins/poll/spec/controllers/posts_controller_spec.rb @@ -127,7 +127,7 @@ expect(Poll.find_by(post_id: json["id"]).name).to eq("<script>alert('xss')</script>") end - it "also works whe there is a link starting with '[poll'" do + it "also works when there is a link starting with '[poll'" do post :create, params: { title: title, raw: "[Polls are awesome](/foobar)\n[poll]\n- A\n- B\n[/poll]" }, format: :json @@ -138,7 +138,7 @@ expect(Poll.exists?(post_id: json["id"])).to eq(true) end - it "prevents pollception" do + it "prevents poll-inception" do post :create, params: { title: title, raw: "[poll name=1]\n- A\n[poll name=2]\n- B\n- C\n[/poll]\n- D\n[/poll]" }, format: :json diff --git a/plugins/poll/spec/models/poll_spec.rb b/plugins/poll/spec/models/poll_spec.rb index fed3310b84a3a..1b1f8e8c7f55f 100644 --- a/plugins/poll/spec/models/poll_spec.rb +++ b/plugins/poll/spec/models/poll_spec.rb @@ -56,7 +56,7 @@ expect(poll.can_see_results?(user)).to eq(true) end - it "only staff memebers can see results when results setting is staff_only" do + it "only staff members can see results when results setting is staff_only" do post = Fabricate(:post, raw: "[poll results=staff_only]\n- A\n- B\n[/poll]") user = Fabricate(:user) poll = post.polls.first diff --git a/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/atoms/02-buttons.hbs b/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/atoms/02-buttons.hbs index 9ffac0bd10ce3..c9dcb818cc4fa 100644 --- a/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/atoms/02-buttons.hbs +++ b/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/atoms/02-buttons.hbs @@ -80,12 +80,12 @@ {{#styleguide-example title=".btn-flat - sizes"}} {{#each dummy.buttonSizes as |bs|}} - {{flat-button icon="trash-alt" disabled=bs.disabled transaltedTitle=bs.title}} + {{flat-button icon="trash-alt" disabled=bs.disabled translatedTitle=bs.title}} {{/each}} {{/styleguide-example}} {{#styleguide-example title=".btn-flat - states"}} {{#each dummy.buttonStates as |bs|}} - {{flat-button icon="trash-alt" disabled=bs.disabled transaltedTitle=bs.title}} + {{flat-button icon="trash-alt" disabled=bs.disabled translatedTitle=bs.title}} {{/each}} {{/styleguide-example}} diff --git a/script/benchmarks/markdown/most_features.md b/script/benchmarks/markdown/most_features.md index 9f2924a6ec06c..5d037ecc0e667 100644 --- a/script/benchmarks/markdown/most_features.md +++ b/script/benchmarks/markdown/most_features.md @@ -150,7 +150,7 @@ The killer feature of `markdown-it` is very effective support of [syntax plugins](https://www.npmjs.org/browse/keyword/markdown-it-plugin). -### [Emojies](https://github.com/markdown-it/markdown-it-emoji) +### [Emojis](https://github.com/markdown-it/markdown-it-emoji) > Classic markup: :wink: :cry: :laughing: :yum: :surfing_woman:t4: > diff --git a/script/discourse b/script/discourse index fce25d81279d3..32b0bb302215f 100755 --- a/script/discourse +++ b/script/discourse @@ -4,7 +4,7 @@ require "thor" class DiscourseCLI < Thor - desc "remap [--global,--regex] FROM TO", "Remap a string sequence accross all tables" + desc "remap [--global,--regex] FROM TO", "Remap a string sequence across all tables" long_desc <<-LONGDESC Replace a string sequence FROM with TO across all tables. diff --git a/script/import_scripts/answerhub.rb b/script/import_scripts/answerhub.rb index 56670725b8f30..035d625c293e7 100644 --- a/script/import_scripts/answerhub.rb +++ b/script/import_scripts/answerhub.rb @@ -3,7 +3,7 @@ # AnswerHub Importer # # Based on having access to a mysql dump. -# Pass in the ENV variables listed below before runing the script. +# Pass in the ENV variables listed below before running the script. require_relative 'base' require 'mysql2' diff --git a/script/import_scripts/askbot.rb b/script/import_scripts/askbot.rb index 422c8fa311875..7bc7866a0ef1e 100644 --- a/script/import_scripts/askbot.rb +++ b/script/import_scripts/askbot.rb @@ -16,7 +16,7 @@ class ImportScripts::MyAskBot < ImportScripts::Base DB_PASS = 'yeah, right' # A list of categories to create. Any post with one of these tags will be - # assigned to that category. Ties are broken by list orer. + # assigned to that category. Ties are broken by list order. CATEGORIES = [ 'Nonconvex', 'TFOCS', 'MIDCP', 'FAQ' ] def initialize diff --git a/script/import_scripts/discuz_x.rb b/script/import_scripts/discuz_x.rb index 7b4679981f849..edced0e7ab31d 100644 --- a/script/import_scripts/discuz_x.rb +++ b/script/import_scripts/discuz_x.rb @@ -158,7 +158,7 @@ def import_users break if results.size < 1 - # TODO: breaks the scipt reported by some users + # TODO: breaks the script reported by some users # next if all_records_exist? :users, users.map {|u| u["id"].to_i} create_users(results, total: total_count, offset: offset) do |user| diff --git a/script/import_scripts/mbox/settings.yml b/script/import_scripts/mbox/settings.yml index 60322ec30585f..4c0a3acc11af1 100644 --- a/script/import_scripts/mbox/settings.yml +++ b/script/import_scripts/mbox/settings.yml @@ -43,7 +43,7 @@ tags: # announcement: ["ann", "announce", "announcement"] # "": ["foo", "bar"] -# These prefixes will be removed from the beginning of topic titles. You can use regular expessions. +# These prefixes will be removed from the beginning of topic titles. You can use regular expressions. # Prefixes are case-insensitive. You can add additional prefixes (e.g. localized prefixes from # https://en.wikipedia.org/wiki/List_of_email_subject_abbreviations#Abbreviations_in_other_languages). remove_subject_prefixes: diff --git a/script/import_scripts/quandora/test/test_quandora_api.rb b/script/import_scripts/quandora/test/test_quandora_api.rb index b7101053c2a4d..784ba4fb855c9 100644 --- a/script/import_scripts/quandora/test/test_quandora_api.rb +++ b/script/import_scripts/quandora/test/test_quandora_api.rb @@ -23,7 +23,7 @@ def setup @quandora = QuandoraApi.new @domain, @username, @password end - def test_intialize + def test_initialize assert_equal @domain, @quandora.domain assert_equal @username, @quandora.username assert_equal @password, @quandora.password diff --git a/script/import_scripts/socialcast/test/test_data.rb b/script/import_scripts/socialcast/test/test_data.rb index 3b0dc6e2adc03..5bdbf52cc9f6d 100644 --- a/script/import_scripts/socialcast/test/test_data.rb +++ b/script/import_scripts/socialcast/test/test_data.rb @@ -435,7 +435,7 @@ "custom_fields": [ { "id": "resume", - "value": "I currently assist the VP of Marketing in making sure that all marketing related activites are rolled out properly in the Americas market.", + "value": "I currently assist the VP of Marketing in making sure that all marketing related activities are rolled out properly in the Americas market.", "label": "Job Description" }, { @@ -2531,12 +2531,12 @@ { "id": 108, "url": "https://demo.socialcast.com/attachments/108", - "filename": "108-reverse-a-algorithm-refernece-V7.pdf", - "public_filename": "https://socialcast-demo.s3.amazonaws.com/tenants/5/attachments/108/108-reverse-a-algorithm-refernece-V7.pdf?AWSAccessKeyId=AKIAIV34WIEKJKCLRBBQ&Expires=1465128000&Signature=JP4%2BXB76kk%2BhCcuJQpZDSDx3NU4%3D", + "filename": "108-reverse-a-algorithm-reference-V7.pdf", + "public_filename": "https://socialcast-demo.s3.amazonaws.com/tenants/5/attachments/108/108-reverse-a-algorithm-reference-V7.pdf?AWSAccessKeyId=AKIAIV34WIEKJKCLRBBQ&Expires=1465128000&Signature=JP4%2BXB76kk%2BhCcuJQpZDSDx3NU4%3D", "external_host_type": null, "file_extension": "pdf", "content_type": "application/pdf", - "html_filename": "108-reverse-a-algorithm-refernece-V7.pdf" + "html_filename": "108-reverse-a-algorithm-reference-V7.pdf" } ], "media_files": [], @@ -8166,8 +8166,8 @@ "back_in_office_on": null, "company_login": null }, - "text": "After speaking with a number of our younger employees I think tutition reimbursement is really key to retaining them. Many of them are looking to earn advanced degrees. If we can setup a plan that accomplishes this effectively we can really grow our staff\'s ability and knowledge.", - "html_body": "

After speaking with a number of our younger employees I think tutition reimbursement is really key to retaining them. Many of them are looking to earn advanced degrees. If we can setup a plan that accomplishes this effectively we can really grow our staff\'s ability and knowledge.

", + "text": "After speaking with a number of our younger employees I think tuition reimbursement is really key to retaining them. Many of them are looking to earn advanced degrees. If we can setup a plan that accomplishes this effectively we can really grow our staff\'s ability and knowledge.", + "html_body": "

After speaking with a number of our younger employees I think tuition reimbursement is really key to retaining them. Many of them are looking to earn advanced degrees. If we can setup a plan that accomplishes this effectively we can really grow our staff\'s ability and knowledge.

", "created_at": "2016-05-21T20:48:41+00:00", "updated_at": "2016-05-21T20:48:41+00:00", "attachments": [], diff --git a/script/import_scripts/socialcast/test/test_socialcast_api.rb b/script/import_scripts/socialcast/test/test_socialcast_api.rb index 9f5430f1068c6..70ad038c8b45a 100644 --- a/script/import_scripts/socialcast/test/test_socialcast_api.rb +++ b/script/import_scripts/socialcast/test/test_socialcast_api.rb @@ -23,7 +23,7 @@ def setup @socialcast = SocialcastApi.new @domain, @username, @password end - def test_intialize + def test_initialize assert_equal @domain, @socialcast.domain assert_equal @username, @socialcast.username assert_equal @password, @socialcast.password diff --git a/spec/components/admin_user_index_query_spec.rb b/spec/components/admin_user_index_query_spec.rb index e41c7fc068a78..fb06da9f3013a 100644 --- a/spec/components/admin_user_index_query_spec.rb +++ b/spec/components/admin_user_index_query_spec.rb @@ -33,7 +33,7 @@ def real_users(query) expect(query.find_users_query.to_sql).to match("trust_level ASC") end - it "allows custom ordering for stats wtih default direction" do + it "allows custom ordering for stats with default direction" do query = ::AdminUserIndexQuery.new(order: "topics_viewed") expect(query.find_users_query.to_sql).to match("topics_entered DESC") end diff --git a/spec/components/auth/github_authenticator_spec.rb b/spec/components/auth/github_authenticator_spec.rb index 2a3a83cf29803..ee6917bfe3b69 100644 --- a/spec/components/auth/github_authenticator_spec.rb +++ b/spec/components/auth/github_authenticator_spec.rb @@ -38,7 +38,7 @@ def auth_token_for(user) expect(result.email).to eq(user.email) expect(result.email_valid).to eq(true) - # Authenticates again when user has Github user info + # Authenticates again when user has GitHub user info result = authenticator.after_authenticate(data) expect(result.email).to eq(user.email) diff --git a/spec/components/concern/has_custom_fields_spec.rb b/spec/components/concern/has_custom_fields_spec.rb index 51138c843f6ea..6fab074a08d46 100644 --- a/spec/components/concern/has_custom_fields_spec.rb +++ b/spec/components/concern/has_custom_fields_spec.rb @@ -146,7 +146,7 @@ class CustomFieldsTestItemCustomField < ActiveRecord::Base expect(db_item.custom_fields).to eq("a" => ["b", "10", "d"]) end - it "supportes type coersion" do + it "supports type coercion" do test_item = CustomFieldsTestItem.new CustomFieldsTestItem.register_custom_field_type("bool", :boolean) CustomFieldsTestItem.register_custom_field_type("int", :integer) diff --git a/spec/components/concern/second_factor_manager_spec.rb b/spec/components/concern/second_factor_manager_spec.rb index 865b1113bb4ee..1dd7bb47286ad 100644 --- a/spec/components/concern/second_factor_manager_spec.rb +++ b/spec/components/concern/second_factor_manager_spec.rb @@ -129,20 +129,20 @@ describe "#has_multiple_second_factor_methods?" do context "when security keys and totp are enabled" do - it "retrns true" do + it "returns true" do expect(user.has_multiple_second_factor_methods?).to eq(true) end end context "if the totp gets disabled" do - it "retrns false" do + it "returns false" do disable_totp expect(user.has_multiple_second_factor_methods?).to eq(false) end end context "if the security key gets disabled" do - it "retrns false" do + it "returns false" do disable_security_key expect(user.has_multiple_second_factor_methods?).to eq(false) end diff --git a/spec/components/discourse_event_spec.rb b/spec/components/discourse_event_spec.rb index 38a6de6d64ba5..4e87a07915526 100644 --- a/spec/components/discourse_event_spec.rb +++ b/spec/components/discourse_event_spec.rb @@ -67,7 +67,7 @@ context 'when multiple events exist' do let(:event_handler_2) do - Proc.new { |user| user.job = 'Supervillian' } + Proc.new { |user| user.job = 'Supervillain' } end before do @@ -80,7 +80,7 @@ end it 'triggers both events' do - expect(harvey.job).to eq('Supervillian') + expect(harvey.job).to eq('Supervillain') expect(harvey.name).to eq('Two Face') end diff --git a/spec/components/email/receiver_spec.rb b/spec/components/email/receiver_spec.rb index fcdc094058c9d..dec90fd99b812 100644 --- a/spec/components/email/receiver_spec.rb +++ b/spec/components/email/receiver_spec.rb @@ -414,7 +414,7 @@ def create_post_reply_key(value) it "handles multiple paragraphs" do expect { process(:paragraphs) }.to change { topic.posts.count } - expect(topic.posts.last.raw).to eq("Do you like liquorice?\n\nI really like them. One could even say that I am *addicted* to liquorice. Anf if\nyou can mix it up with some anise, then I'm in heaven ;)") + expect(topic.posts.last.raw).to eq("Do you like liquorice?\n\nI really like them. One could even say that I am *addicted* to liquorice. And if\nyou can mix it up with some anise, then I'm in heaven ;)") end it "handles invalid from header" do @@ -1167,7 +1167,7 @@ def create_post_reply_key(value) SiteSetting.alternative_reply_by_email_addresses = nil end - it "it maches nothing if there is not reply_by_email_address" do + it "it matches nothing if there is not reply_by_email_address" do expect(Email::Receiver.reply_by_email_address_regex).to eq(/$a/) end @@ -1366,7 +1366,7 @@ def create_post_reply_key(value) SiteSetting.forwarded_emails_behaviour = "create_replies" end - context "when a reply contains a forwareded email" do + context "when a reply contains a forwarded email" do include_examples "does not create staged users", :reply_and_forwarded end diff --git a/spec/components/email/styles_spec.rb b/spec/components/email/styles_spec.rb index 1520662dc50d9..d5767310e12c2 100644 --- a/spec/components/email/styles_spec.rb +++ b/spec/components/email/styles_spec.rb @@ -326,7 +326,7 @@ def strip_and_inline strip_and_inline expect(@frag.to_s).to include("cid:email/test.png") expect(@frag.to_s).to include("cid:email/test2.ico") - expect(@frag.css('[data-sripped-secure-media]')).not_to be_present + expect(@frag.css('[data-stripped-secure-media]')).not_to be_present expect(@frag.css('[data-embedded-secure-image]')[0].attr('style')).to eq('width: 16px; height: 16px;') expect(@frag.css('[data-embedded-secure-image]')[1].attr('style')).to eq('width: 60px; max-height: 80%; max-width: 20%; height: auto; float: left; margin-right: 10px;') end @@ -358,7 +358,7 @@ def strip_and_inline strip_and_inline expect(@frag.to_s).to include("cid:email/test.png") expect(@frag.to_s).to include("cid:email/test2.ico") - expect(@frag.css('[data-sripped-secure-media]')).not_to be_present + expect(@frag.css('[data-stripped-secure-media]')).not_to be_present expect(@frag.css('[data-embedded-secure-image]')[1].attr('style')).to eq('width: 60px; max-height: 80%; max-width: 20%; height: auto; float: left; margin-right: 10px;') end end @@ -410,7 +410,7 @@ def strip_and_inline it "keeps the special onebox styles" do strip_and_inline expect(@frag.to_s).to include("cid:email/test.png") - expect(@frag.css('[data-sripped-secure-media]')).not_to be_present + expect(@frag.css('[data-stripped-secure-media]')).not_to be_present expect(@frag.css('[data-embedded-secure-image]')[0].attr('style')).to eq('width: 20px; height: 20px; float: none; vertical-align: middle; max-height: 80%; max-width: 20%; height: auto; float: left; margin-right: 10px;') end end diff --git a/spec/components/email_cook_spec.rb b/spec/components/email_cook_spec.rb index b2fdc47801854..d47f5b91f8076 100644 --- a/spec/components/email_cook_spec.rb +++ b/spec/components/email_cook_spec.rb @@ -91,16 +91,16 @@ long = plaintext(<<~LONG_EMAIL) Lorem ipsum dolor sit amet, consectetur adipiscing elit. - this is indended by 4 spaces - this is indended by 1 space + this is intended by 4 spaces + this is intended by 1 space no indentation, but lots of spaces LONG_EMAIL long_cooked = (+<<~LONG_COOKED).strip! Lorem ipsum dolor sit amet, consectetur adipiscing elit.
-
#{nbsp}#{nbsp}#{nbsp}#{nbsp}this is indended by 4 spaces -
this is indended by 1 space +
#{nbsp}#{nbsp}#{nbsp}#{nbsp}this is intended by 4 spaces +
this is intended by 1 space
no indentation, but lots of spaces
LONG_COOKED diff --git a/spec/components/file_store/s3_store_spec.rb b/spec/components/file_store/s3_store_spec.rb index 8b6831219bc18..3b617cf523f83 100644 --- a/spec/components/file_store/s3_store_spec.rb +++ b/spec/components/file_store/s3_store_spec.rb @@ -16,7 +16,7 @@ let(:optimized_image_file) { file_from_fixtures("logo.png") } let(:uploaded_file) { file_from_fixtures("logo.png") } fab!(:upload) do - Fabricate(:upload, sha1: Digest::SHA1.hexdigest('secreet image string')) + Fabricate(:upload, sha1: Digest::SHA1.hexdigest('secret image string')) end before do diff --git a/spec/components/guardian/user_guardian_spec.rb b/spec/components/guardian/user_guardian_spec.rb index ef87af6399d9c..70c9ec1ba2fbf 100644 --- a/spec/components/guardian/user_guardian_spec.rb +++ b/spec/components/guardian/user_guardian_spec.rb @@ -273,7 +273,7 @@ expect(guardian.can_delete_user?(user)).to eq(true) end - it "is allowed when user created multiple posts in PMs to themself" do + it "is allowed when user created multiple posts in PMs to themselves" do topic = Fabricate(:private_message_topic, user: user, topic_allowed_users: [ Fabricate.build(:topic_allowed_user, user: user) ]) diff --git a/spec/components/guardian_spec.rb b/spec/components/guardian_spec.rb index 38478cea97d11..aa686bab3b022 100644 --- a/spec/components/guardian_spec.rb +++ b/spec/components/guardian_spec.rb @@ -664,7 +664,7 @@ end end - context "when PM has receached the maximum number of recipients" do + context "when PM has reached the maximum number of recipients" do before do SiteSetting.max_allowed_message_recipients = 2 end @@ -706,7 +706,7 @@ expect(Guardian.new(admin).can_invite_via_email?(topic)).to be_falsey end - it 'returns correct valuse when user approval is required' do + it 'returns correct values when user approval is required' do SiteSetting.must_approve_users = true expect(Guardian.new(trust_level_2).can_invite_via_email?(topic)).to be_falsey diff --git a/spec/components/html_to_markdown_spec.rb b/spec/components/html_to_markdown_spec.rb index b5db6e716cc71..ea24eb8e66a18 100644 --- a/spec/components/html_to_markdown_spec.rb +++ b/spec/components/html_to_markdown_spec.rb @@ -149,7 +149,7 @@ def html_to_markdown(html, opts = {}) expect(html_to_markdown(%Q{})).to eq("") end - it "keeps with src='cid:' whith 'keep_cid_imgs'" do + it "keeps with src='cid:' with 'keep_cid_imgs'" do expect(html_to_markdown(HTML_WITH_CID_IMG, keep_cid_imgs: true)).to eq(HTML_WITH_CID_IMG) end @@ -391,7 +391,7 @@ def html_to_markdown(html, opts = {}) end - it "supoorts " do + it "supports
" do html = <<~HTML
diff --git a/spec/components/image_sizer_spec.rb b/spec/components/image_sizer_spec.rb index 7ffe352a4c2fe..5c41afec22576 100644 --- a/spec/components/image_sizer_spec.rb +++ b/spec/components/image_sizer_spec.rb @@ -32,7 +32,7 @@ @w, @h = ImageSizer.resize(600, 123) end - it 'returns the maxmimum width if larger than the maximum' do + it 'returns the maximum width if larger than the maximum' do expect(@w).to eq(500) end @@ -48,7 +48,7 @@ @w, @h = ImageSizer.resize(123, 600) end - it 'returns the maxmimum height if larger than the maximum' do + it 'returns the maximum height if larger than the maximum' do expect(@h).to eq(500) end diff --git a/spec/components/imap/imap_helper.rb b/spec/components/imap/imap_helper.rb index 1248fa0cae7bb..6407a54b980ba 100644 --- a/spec/components/imap/imap_helper.rb +++ b/spec/components/imap/imap_helper.rb @@ -19,7 +19,7 @@ def EmailFabricator(options) email += "In-Reply-To: #{options[:in_reply_to]}\n" if options[:in_reply_to] email += "References: #{options[:in_reply_to]}\n" if options[:in_reply_to] email += "Message-ID: <#{options[:message_id]}>\n" if options[:message_id] - email += "Subject: #{options[:subject] || "This is a test email subhect"}\n" + email += "Subject: #{options[:subject] || "This is a test email subject"}\n" email += "Mime-Version: 1.0\n" email += "Content-Type: #{options[:content_type] || "text/plain;\n charset=UTF-8"}\n" email += "Content-Transfer-Encoding: 7bit\n" diff --git a/spec/components/imap/sync_spec.rb b/spec/components/imap/sync_spec.rb index da0ed74d250e6..7eac7ac6a33c5 100644 --- a/spec/components/imap/sync_spec.rb +++ b/spec/components/imap/sync_spec.rb @@ -530,7 +530,7 @@ end - context 'invaidated previous sync' do + context 'invalidated previous sync' do let(:subject) { 'Testing email post' } let(:first_from) { 'john@free.fr' } diff --git a/spec/components/inline_oneboxer_spec.rb b/spec/components/inline_oneboxer_spec.rb index 761e1c00d8f1b..6a5917af313f4 100644 --- a/spec/components/inline_oneboxer_spec.rb +++ b/spec/components/inline_oneboxer_spec.rb @@ -116,7 +116,7 @@ expect(onebox[:title]).to eq("Hello 🍕 with an emoji") end - it "will append the post number post auther's username to the title" do + it "will append the post number post author's username to the title" do topic = Fabricate(:topic, title: "Inline oneboxer") Fabricate(:post, topic: topic) # OP Fabricate(:post, topic: topic) diff --git a/spec/components/json_error_spec.rb b/spec/components/json_error_spec.rb index 3b064a6381dfe..fdeaa6ce83df0 100644 --- a/spec/components/json_error_spec.rb +++ b/spec/components/json_error_spec.rb @@ -42,7 +42,7 @@ end end - describe "an activerecord objec with errors" do + describe "an activerecord object with errors" do let(:invalid_user) { User.new } it "returns the errors correctly" do expect(invalid_user).not_to be_valid diff --git a/spec/components/middleware/anonymous_cache_spec.rb b/spec/components/middleware/anonymous_cache_spec.rb index 33089a2527846..c9ad5b558ad74 100644 --- a/spec/components/middleware/anonymous_cache_spec.rb +++ b/spec/components/middleware/anonymous_cache_spec.rb @@ -14,7 +14,7 @@ def new_helper(opts = {}) Middleware::AnonymousCache::Helper.new(env(opts)) end - context "cachable?" do + context "cacheable?" do it "true by default" do expect(new_helper.cacheable?).to eq(true) end diff --git a/spec/components/new_post_manager_spec.rb b/spec/components/new_post_manager_spec.rb index c7aa2415093c2..29ac3ca83b83a 100644 --- a/spec/components/new_post_manager_spec.rb +++ b/spec/components/new_post_manager_spec.rb @@ -713,7 +713,7 @@ def build_manager_with(raw) end context "private message via email" do - it "doesn't enqueue authentiation results failure" do + it "doesn't enqueue authentication results failure" do manager = NewPostManager.new( topic.user, raw: 'this is emailed content', diff --git a/spec/components/onpdiff_spec.rb b/spec/components/onpdiff_spec.rb index f59bd80cb0e72..56cacf75c13d9 100644 --- a/spec/components/onpdiff_spec.rb +++ b/spec/components/onpdiff_spec.rb @@ -33,7 +33,7 @@ expect(ONPDiff.new("abc", "acd").short_diff).to eq([["a", :common], ["b", :delete], ["c", :common], ["d", :add]]) end - it "returns an array with sequencially similar operations merged" do + it "returns an array with sequentially similar operations merged" do expect(ONPDiff.new("abcd", "abef").short_diff).to eq([["ab", :common], ["ef", :add], ["cd", :delete]]) end diff --git a/spec/components/post_action_creator_spec.rb b/spec/components/post_action_creator_spec.rb index 63e5117537a66..dd4ef73f94603 100644 --- a/spec/components/post_action_creator_spec.rb +++ b/spec/components/post_action_creator_spec.rb @@ -178,7 +178,7 @@ expect(reviewable.reviewable_scores.select(&:pending?).count).to eq(1) end - it "succesfully flags the post if it was reviewed more than 24 hours ago" do + it "successfully flags the post if it was reviewed more than 24 hours ago" do reviewable.update!(updated_at: 25.hours.ago) post.last_version_at = 30.hours.ago @@ -188,7 +188,7 @@ expect(result.reviewable).to be_present end - it "succesfully flags the post if it was edited after being reviewed" do + it "successfully flags the post if it was edited after being reviewed" do reviewable.update!(updated_at: 10.minutes.ago) post.last_version_at = 1.minute.ago diff --git a/spec/components/post_creator_spec.rb b/spec/components/post_creator_spec.rb index 3f4262a65aeb3..5827de6ad0c8b 100644 --- a/spec/components/post_creator_spec.rb +++ b/spec/components/post_creator_spec.rb @@ -674,7 +674,7 @@ SiteSetting.unique_posts_mins = 10 end - it "fails for dupe post accross topic" do + it "fails for dupe post across topic" do first = create_post(raw: "this is a test #{SecureRandom.hex}") second = create_post(raw: "this is a test #{SecureRandom.hex}") @@ -1233,7 +1233,7 @@ DiscourseEvent.off(:topic_created, &@increase_topics) end - it "fires boths event when creating a topic" do + it "fires both event when creating a topic" do pc = PostCreator.new(user, raw: 'this is the new content for my topic', title: 'this is my new topic title') _post = pc.create expect(@posts_created).to eq(1) diff --git a/spec/components/pretty_text_spec.rb b/spec/components/pretty_text_spec.rb index 1cc6baefaaacc..f884df702b489 100644 --- a/spec/components/pretty_text_spec.rb +++ b/spec/components/pretty_text_spec.rb @@ -1304,7 +1304,7 @@ def strip_image_wrapping(html) expect(cooked.split("img").length - 1).to eq(3) end - it "handles emoji boundries correctly" do + it "handles emoji boundaries correctly" do expect(PrettyText.cook(",:)")).to include("emoji") expect(PrettyText.cook(":-)\n")).to include("emoji") expect(PrettyText.cook("a :)")).to include("emoji") @@ -1798,7 +1798,7 @@ def expect_cooked_match(raw, expected_cooked) HTML end - it "has a proper data whitlist on div" do + it "has a proper data whitelist on div" do cooked = PrettyText.cook("
test
") expect(cooked).to include("data-theme-a") end diff --git a/spec/components/promotion_spec.rb b/spec/components/promotion_spec.rb index be60cbddca731..ca61fe3568e44 100644 --- a/spec/components/promotion_spec.rb +++ b/spec/components/promotion_spec.rb @@ -84,7 +84,7 @@ expect(job["args"][0]["message_type"]).to eq("welcome_tl1_user") end - it "does not not send when the user already has the tl1 badge when recalculcating" do + it "does not not send when the user already has the tl1 badge when recalculating" do SiteSetting.send_tl1_welcome_message = true BadgeGranter.grant(Badge.find(1), user) stat = user.user_stat diff --git a/spec/components/search_spec.rb b/spec/components/search_spec.rb index c6a52dcdd2f1a..be25dbd0e0683 100644 --- a/spec/components/search_spec.rb +++ b/spec/components/search_spec.rb @@ -135,7 +135,7 @@ expect(search.term).to eq('a b c okaylength') end - context 'query sanitizaton' do + context 'query sanitization' do let!(:post) { Fabricate(:post, raw: 'hello world') } it 'escapes backslash' do @@ -1406,7 +1406,7 @@ def search raw: 'Relevant Relevant Topic' ) - latest_irelevant_topic_post = Fabricate(:post, + latest_irrelevant_topic_post = Fabricate(:post, topic: latest_topic, created_at: today, raw: 'Not Relevant' @@ -1415,14 +1415,14 @@ def search # Expecting the default results expect(Search.execute('Topic').posts.map(&:id)).to eq([ old_relevant_topic_post.id, - latest_irelevant_topic_post.id, + latest_irrelevant_topic_post.id, category.topic.first_post.id ]) # Expecting the ordered by topic creation results expect(Search.execute('Topic order:latest_topic').posts.map(&:id)).to eq([ category.topic.first_post.id, - latest_irelevant_topic_post.id, + latest_irrelevant_topic_post.id, old_relevant_topic_post.id ]) end @@ -1667,7 +1667,7 @@ def indexed_post(*args) expect(ts_query).to include("baz") end - it 'esacpes the term correctly' do + it 'escapes the term correctly' do expect(Search.ts_query(term: 'Title with trailing backslash\\')) .to eq("TO_TSQUERY('english', '''Title with trailing backslash\\\\\\\\'':*')") @@ -1801,7 +1801,7 @@ def indexed_post(*args) Fabricate(:post, raw: '場サアマネ織企ういかせ竹域ヱイマ穂基ホ神3予読ずねいぱ松査ス禁多サウ提懸イふ引小43改こょドめ。深とつぐ主思料農ぞかル者杯検める活分えほづぼ白犠') end - it('does not include superflous spaces in blurbs') do + it('does not include superfluous spaces in blurbs') do results = Search.execute('ういかせ竹域', type_filter: 'topic') expect(results.posts.length).to eq(1) diff --git a/spec/components/site_setting_extension_spec.rb b/spec/components/site_setting_extension_spec.rb index 0180122715ef6..ba85686135ae6 100644 --- a/spec/components/site_setting_extension_spec.rb +++ b/spec/components/site_setting_extension_spec.rb @@ -5,11 +5,11 @@ describe SiteSettingExtension do # We disable message bus here to avoid a large amount - # of uneeded messaging, tests are careful to call refresh + # of unneeded messaging, tests are careful to call refresh # when they need to. # # DistributedCache used by locale handler can under certain - # cases take a tiny bit to stabalize. + # cases take a tiny bit to stabilize. # # TODO: refactor SiteSettingExtension not to rely on statics in # DefaultsProvider diff --git a/spec/components/slug_spec.rb b/spec/components/slug_spec.rb index 2ba8062d5e1c7..99941e0575bf3 100644 --- a/spec/components/slug_spec.rb +++ b/spec/components/slug_spec.rb @@ -159,7 +159,7 @@ before { SiteSetting.slug_generation_method = 'encoded' } after { SiteSetting.slug_generation_method = 'ascii' } - it 'generates precentage encoded string' do + it 'generates percentage encoded string' do expect(Slug.encoded_generator("뉴스피드")).to eq("%EB%89%B4%EC%8A%A4%ED%94%BC%EB%93%9C") expect(Slug.encoded_generator("آموزش اضافه کردن لینک اختیاری به هدر")).to eq("%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-%D9%84%DB%8C%D9%86%DA%A9-%D8%A7%D8%AE%D8%AA%DB%8C%D8%A7%D8%B1%DB%8C-%D8%A8%D9%87-%D9%87%D8%AF%D8%B1") expect(Slug.encoded_generator("熱帶風暴畫眉")).to eq("%E7%86%B1%E5%B8%B6%E9%A2%A8%E6%9A%B4%E7%95%AB%E7%9C%89") diff --git a/spec/components/topic_query_spec.rb b/spec/components/topic_query_spec.rb index ec6a2f26917e2..041f519cd60e1 100644 --- a/spec/components/topic_query_spec.rb +++ b/spec/components/topic_query_spec.rb @@ -598,7 +598,7 @@ class ::TopicQuery end - context 'after clearring a pinned topic' do + context 'after clearing a pinned topic' do before do pinned_topic.clear_pin_for(user) end @@ -926,7 +926,7 @@ def clear_cache! let!(:archived_topic) { Fabricate(:topic, user: creator, archived: true) } let!(:invisible_topic) { Fabricate(:topic, user: creator, visible: false) } - it "should omit the closed/archived/invisbiel topics from suggested" do + it "should omit the closed/archived/invisible topics from suggested" do expect(TopicQuery.new.list_suggested_for(topic).topics).to eq([regular_topic]) end end @@ -1158,7 +1158,7 @@ def suggested_for(topic) expect(topics).to contain_exactly(topic1, topic2, topic6) end - it 'should retun the right list for users in the same group' do + it 'should return the right list for users in the same group' do topics = TopicQuery.new(user).list_group_topics(group).topics expect(topics).to contain_exactly(topic1, topic2, topic3, topic6) diff --git a/spec/components/topic_retriever_spec.rb b/spec/components/topic_retriever_spec.rb index 3bc2ec81b7209..e14379f5cceba 100644 --- a/spec/components/topic_retriever_spec.rb +++ b/spec/components/topic_retriever_spec.rb @@ -25,7 +25,7 @@ end end - context "when topics have been retrieived recently" do + context "when topics have been retrieved recently" do before do topic_retriever.stubs(:retrieved_recently?).returns(true) end @@ -41,7 +41,7 @@ topic_retriever.stubs(:invalid_url?).returns(false) end - context "when topics have been retrieived recently" do + context "when topics have been retrieved recently" do before do topic_retriever.stubs(:retrieved_recently?).returns(true) end @@ -52,7 +52,7 @@ end end - context "when topics have not been retrieived recently" do + context "when topics have not been retrieved recently" do before do topic_retriever.stubs(:retrieved_recently?).returns(false) end diff --git a/spec/components/unread_spec.rb b/spec/components/unread_spec.rb index d820fb9fc761c..a7d4d4a65e07e 100644 --- a/spec/components/unread_spec.rb +++ b/spec/components/unread_spec.rb @@ -26,7 +26,7 @@ def unread end describe 'staff counts' do - it 'shoule correctly return based on staff post number' do + it 'should correctly return based on staff post number' do user.admin = true diff --git a/spec/components/validators/max_emojis_validator_spec.rb b/spec/components/validators/max_emojis_validator_spec.rb index f15a951db8a3c..d95bbe9997a37 100644 --- a/spec/components/validators/max_emojis_validator_spec.rb +++ b/spec/components/validators/max_emojis_validator_spec.rb @@ -21,7 +21,7 @@ def validate validate expect(record.errors[:title][0]).to eq(I18n.t("errors.messages.max_emojis", max_emojis_count: 3)) - record.title = ':joy: :blush: :smile: is not only about emojis: Happyness::start()' + record.title = ':joy: :blush: :smile: is not only about emojis: Happiness::start()' validate expect(record.valid?).to be true end diff --git a/spec/fixtures/emails/paragraphs.eml b/spec/fixtures/emails/paragraphs.eml index 7fb2bd3733e53..f8ee78061cc91 100644 --- a/spec/fixtures/emails/paragraphs.eml +++ b/spec/fixtures/emails/paragraphs.eml @@ -8,5 +8,5 @@ Content-Type: text/plain; charset=UTF-8 Do you like liquorice? -I really like them. One could even say that I am *addicted* to liquorice. Anf if +I really like them. One could even say that I am *addicted* to liquorice. And if you can mix it up with some anise, then I'm in heaven ;) diff --git a/spec/jobs/bulk_invite_spec.rb b/spec/jobs/bulk_invite_spec.rb index 676d93c8fa63b..bfaa49c920741 100644 --- a/spec/jobs/bulk_invite_spec.rb +++ b/spec/jobs/bulk_invite_spec.rb @@ -81,7 +81,7 @@ expect(existing_user.reload.groups).to eq([group1]) end - it 'can create staged users and prepulate user fields' do + it 'can create staged users and prepopulate user fields' do user_field = Fabricate(:user_field, name: "Location") user_field_color = Fabricate(:user_field, field_type: "dropdown", name: "Color") user_field_color.user_field_options.create!(value: "Red") diff --git a/spec/jobs/jobs_spec.rb b/spec/jobs/jobs_spec.rb index 5ee5ff09a776e..113f8e57889e7 100644 --- a/spec/jobs/jobs_spec.rb +++ b/spec/jobs/jobs_spec.rb @@ -42,7 +42,7 @@ end expect(jobs.length).to eq(2) - # Failed transation + # Failed transaction ActiveRecord::Base.transaction do Jobs.enqueue(:process_post, post_id: 1) raise ActiveRecord::Rollback diff --git a/spec/lib/backup_restore/meta_data_handler_spec.rb b/spec/lib/backup_restore/meta_data_handler_spec.rb index c9ba6cbaffc4a..7d6ddc8ad43fc 100644 --- a/spec/lib/backup_restore/meta_data_handler_spec.rb +++ b/spec/lib/backup_restore/meta_data_handler_spec.rb @@ -34,9 +34,9 @@ def validate_metadata(filename, tmp_directory) end it "raises an exception when the metadata file contains invalid JSON" do - currupt_metadata = '{"version":20160329101122' + corrupt_metadata = '{"version":20160329101122' - with_metadata_file(currupt_metadata) do |dir| + with_metadata_file(corrupt_metadata) do |dir| expect { validate_metadata(backup_filename, dir) } .to raise_error(BackupRestore::MetaDataError) end diff --git a/spec/lib/backup_restore/shared_examples_for_backup_store.rb b/spec/lib/backup_restore/shared_examples_for_backup_store.rb index f6d3fbab3d2c8..344fb17f2fb9c 100644 --- a/spec/lib/backup_restore/shared_examples_for_backup_store.rb +++ b/spec/lib/backup_restore/shared_examples_for_backup_store.rb @@ -266,7 +266,7 @@ def upload_file expect(url).to match(upload_url_regex("default", filename, multisite: false)) end - it "raises an exeption when a file with same filename exists" do + it "raises an exception when a file with same filename exists" do expect { store.generate_upload_url(backup1.filename) } .to raise_exception(BackupRestore::BackupStore::BackupFileExists) end diff --git a/spec/lib/bookmark_manager_spec.rb b/spec/lib/bookmark_manager_spec.rb index bf9f1d2f54e01..11cbf642b16bc 100644 --- a/spec/lib/bookmark_manager_spec.rb +++ b/spec/lib/bookmark_manager_spec.rb @@ -109,7 +109,7 @@ end end - context "when the post is inaccessable for the user" do + context "when the post is inaccessible for the user" do before do post.trash! end @@ -118,7 +118,7 @@ end end - context "when the topic is inaccessable for the user" do + context "when the topic is inaccessible for the user" do before do post.topic.update(category: Fabricate(:private_category, group: Fabricate(:group))) end @@ -182,7 +182,7 @@ def update_bookmark ) end - it "saves the time and new reminder type and new name sucessfully" do + it "saves the time and new reminder type and new name successfully" do update_bookmark bookmark.reload expect(bookmark.name).to eq(new_name) diff --git a/spec/lib/webauthn/challenge_generator_spec.rb b/spec/lib/webauthn/challenge_generator_spec.rb index a0b7609ecfc2a..74349356a1217 100644 --- a/spec/lib/webauthn/challenge_generator_spec.rb +++ b/spec/lib/webauthn/challenge_generator_spec.rb @@ -15,7 +15,7 @@ describe "#commit_to_session" do let(:user) { Fabricate(:user) } - it "stores the challenge, rpid, and name in the provided session object" do + it "stores the challenge, rp id, and rp name in the provided session object" do secure_session = {} generated_session = Webauthn::ChallengeGenerator.generate generated_session.commit_to_session(secure_session, user) diff --git a/spec/models/about_spec.rb b/spec/models/about_spec.rb index 4659ff7a20842..3b8ee597abc01 100644 --- a/spec/models/about_spec.rb +++ b/spec/models/about_spec.rb @@ -5,7 +5,7 @@ describe About do describe 'stats cache' do - include_examples 'stats cachable' + include_examples 'stats cacheable' end describe "#category_moderators" do diff --git a/spec/models/admin_dashboard_problem_spec.rb b/spec/models/admin_dashboard_problem_spec.rb index 84b596e17b324..b2d3a1c0ff8a0 100644 --- a/spec/models/admin_dashboard_problem_spec.rb +++ b/spec/models/admin_dashboard_problem_spec.rb @@ -221,7 +221,7 @@ def my_test_method end describe 'stats cache' do - include_examples 'stats cachable' + include_examples 'stats cacheable' end describe '#problem_message_check' do diff --git a/spec/models/category_list_spec.rb b/spec/models/category_list_spec.rb index ea5c839aa8e40..81a0fe331014b 100644 --- a/spec/models/category_list_spec.rb +++ b/spec/models/category_list_spec.rb @@ -120,7 +120,7 @@ def displayable_topics expect(category.notification_level).to eq(NotificationLevels.all[:regular]) end - it "returns the users notication level" do + it "returns the users notification level" do CategoryUser.set_notification_level_for_category(user, NotificationLevels.all[:watching], topic_category.id) category_list = CategoryList.new(Guardian.new(user)) category = category_list.categories.find { |c| c.id == topic_category.id } @@ -128,7 +128,7 @@ def displayable_topics expect(category.notification_level).to eq(NotificationLevels.all[:watching]) end - it "returns default notication level for anonymous users" do + it "returns default notification level for anonymous users" do category_list = CategoryList.new(Guardian.new(nil)) category = category_list.categories.find { |c| c.id == topic_category.id } diff --git a/spec/models/email_token_spec.rb b/spec/models/email_token_spec.rb index 46db9c98de03f..aa6dfac6d7050 100644 --- a/spec/models/email_token_spec.rb +++ b/spec/models/email_token_spec.rb @@ -11,7 +11,7 @@ context '#create' do fab!(:user) { Fabricate(:user, active: false) } let!(:original_token) { user.email_tokens.first } - let!(:email_token) { user.email_tokens.create(email: 'bubblegum@adevnturetime.ooo') } + let!(:email_token) { user.email_tokens.create(email: 'bubblegum@adventuretime.ooo') } it 'should create the email token' do expect(email_token).to be_present diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb index 138ca3d76e243..a97537a31aa3f 100644 --- a/spec/models/notification_spec.rb +++ b/spec/models/notification_spec.rb @@ -298,7 +298,7 @@ def process_alerts(post) expect(user.unread_notifications).to eq(0) expect(user.total_unread_notifications).to eq(3) # NOTE: because of deprecation this will be equal to unread_high_priority_notifications, - # to be remonved in 2.5 + # to be removed in 2.5 expect(user.unread_private_messages).to eq(2) expect(user.unread_high_priority_notifications).to eq(2) end diff --git a/spec/models/post_action_spec.rb b/spec/models/post_action_spec.rb index dc71f1e001fee..b81b73504b230 100644 --- a/spec/models/post_action_spec.rb +++ b/spec/models/post_action_spec.rb @@ -253,7 +253,7 @@ def value_for(user_id, dt) admin4 = Fabricate(:admin) PostActionCreator.like(admin4, post) - # first happend within the same day, no need to notify + # first happened within the same day, no need to notify expect(Notification.where(post_number: 1, topic_id: post.topic_id).count) .to eq(2) end @@ -419,7 +419,7 @@ def value_for(user_id, dt) end.to_not change { Notification.count } end - it "should generate a notification if liker is an admin irregardles of \ + it "should generate a notification if liker is an admin irregardless of \ muting" do MutedUser.create!(user_id: post.user.id, muted_user_id: admin.id) @@ -663,7 +663,7 @@ def value_for(user_id, dt) expect(result.reviewable.payload['targets_topic']).to eq(false) end - it "will unhide the post when a moderator undos the flag on which s/he took action" do + it "will unhide the post when a moderator undoes the flag on which s/he took action" do Discourse.stubs(:site_contact_user).returns(admin) post = create_post diff --git a/spec/models/report_spec.rb b/spec/models/report_spec.rb index 0b4c330af8283..36ffeb0aa3f19 100644 --- a/spec/models/report_spec.rb +++ b/spec/models/report_spec.rb @@ -224,7 +224,7 @@ end it 'returns a report with data' do - # expected number of recoords + # expected number of records expect(report.data.count).to eq 4 # sorts the data from oldest to latest dates @@ -724,7 +724,7 @@ post.revise(sam, raw: 'updated body') end - it "doesn't count a revison on your own post" do + it "doesn't count a revision on your own post" do expect(report.data[0][:revision_count]).to eq(1) expect(report.data[0][:username]).to eq('sam') end diff --git a/spec/models/reviewable_user_spec.rb b/spec/models/reviewable_user_spec.rb index b63c4901c950c..a16c6c2ac4b2e 100644 --- a/spec/models/reviewable_user_spec.rb +++ b/spec/models/reviewable_user_spec.rb @@ -135,7 +135,7 @@ def assert_require_reject_reason(id, expected) reviewable.perform(moderator, :reject_user_block, reject_reason: "reject reason") end - it "optionaly sends email with reject reason" do + it "optionally sends email with reject reason" do SiteSetting.must_approve_users = true Jobs::CriticalUserEmail.any_instance.expects(:execute).with(type: :signup_after_reject, user_id: reviewable.target_id, reject_reason: "reject reason").once reviewable.perform(moderator, :reject_user_block, reject_reason: "reject reason", send_email: true) diff --git a/spec/models/site_setting_spec.rb b/spec/models/site_setting_spec.rb index cf9b5174b4515..7a815848787be 100644 --- a/spec/models/site_setting_spec.rb +++ b/spec/models/site_setting_spec.rb @@ -196,7 +196,7 @@ end describe 'cached settings' do - it 'should recalcualte cached setting when dependent settings are changed' do + it 'should recalculate cached setting when dependent settings are changed' do SiteSetting.blocked_attachment_filenames = 'foo' expect(SiteSetting.blocked_attachment_filenames_regex).to eq(/foo/) diff --git a/spec/models/topic_spec.rb b/spec/models/topic_spec.rb index 57ff44c4f6283..b797e1cb07bac 100644 --- a/spec/models/topic_spec.rb +++ b/spec/models/topic_spec.rb @@ -2118,7 +2118,7 @@ def set_state!(group, user, state) expect(topic.all_allowed_users).to include moderator end - it 'includes moderators if offical warning' do + it 'includes moderators if official warning' do topic.stubs(:subtype).returns(TopicSubtype.moderator_warning) topic.stubs(:private_message?).returns(true) expect(topic.all_allowed_users).to include moderator @@ -2307,10 +2307,10 @@ def set_state!(group, user, state) end end - describe ".count_exceeds_minimun?" do + describe ".count_exceeds_minimum?" do before { SiteSetting.minimum_topics_similar = 20 } - context "when Topic count is geater than minimum_topics_similar" do + context "when Topic count is greater than minimum_topics_similar" do it "should be true" do Topic.stubs(:count).returns(30) expect(Topic.count_exceeds_minimum?).to be_truthy @@ -2334,7 +2334,7 @@ def set_state!(group, user, state) expect(topic.expandable_first_post?).to eq(false) end - describe 'with an emeddable host' do + describe 'with an embeddable host' do before do Fabricate(:embeddable_host) SiteSetting.embed_truncate = true diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 600d7f1c74658..2f5bdfc90dd18 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -679,7 +679,7 @@ def assert_good(username) expect(User.username_available?('tESt')).to eq(false) end - it 'returns true when reserved username is explicity allowed' do + it 'returns true when reserved username is explicitly allowed' do SiteSetting.reserved_usernames = 'test|donkey' expect(User.username_available?( @@ -727,7 +727,7 @@ def assert_good(username) expect(User.reserved_username?('test')).to eq(true) end - it 'should not allow usernames matched against an expession' do + it 'should not allow usernames matched against an expression' do SiteSetting.reserved_usernames = "test)|*admin*|foo*|*bar|abc.def|löwe|ka\u0308fer" expect(User.reserved_username?('test')).to eq(false) @@ -1901,7 +1901,7 @@ def hash(password, salt) expect(message.data[:unread_notifications]).to eq(1) # NOTE: because of deprecation this will be equal to unread_high_priority_notifications, - # to be remonved in 2.5 + # to be removed in 2.5 expect(message.data[:unread_private_messages]).to eq(2) expect(message.data[:unread_high_priority_notifications]).to eq(2) end @@ -2359,7 +2359,7 @@ def filter_by(method) expect(User.system_avatar_template("बहुत")).to match(%r|/letter_avatar_proxy/v\d/letter/%E0%A4%AC/ea5d25/{size}.png|) end - it "substitues {username} with the URL encoded username" do + it "substitutes {username} with the URL encoded username" do SiteSetting.external_system_avatars_url = "https://{hostname}/{username}.png" expect(User.system_avatar_template("बहुत")).to eq("https://#{Discourse.current_hostname}/%E0%A4%AC%E0%A4%B9%E0%A5%81%E0%A4%A4.png") end diff --git a/spec/models/username_validator_spec.rb b/spec/models/username_validator_spec.rb index 5bf5111996913..ab055ccacf6d0 100644 --- a/spec/models/username_validator_spec.rb +++ b/spec/models/username_validator_spec.rb @@ -37,7 +37,7 @@ def expect_invalid(*usernames, error_message:) error_message: I18n.t(:'user.username.short', min: 4)) end - it 'is valid when the username has the minimum lenght' do + it 'is valid when the username has the minimum length' do SiteSetting.min_username_length = 4 expect_valid('abcd') @@ -50,7 +50,7 @@ def expect_invalid(*usernames, error_message:) error_message: I18n.t(:'user.username.long', max: 8)) end - it 'is valid when the username has the maximum lenght' do + it 'is valid when the username has the maximum length' do SiteSetting.max_username_length = 8 expect_valid('abcdefgh') @@ -122,7 +122,7 @@ def expect_invalid(*usernames, error_message:) error_message: I18n.t(:'user.username.short', min: 3)) end - it 'is valid when the username has the minimum lenght' do + it 'is valid when the username has the minimum length' do SiteSetting.min_username_length = 2 expect_valid('পাখি', 'طائر') @@ -135,7 +135,7 @@ def expect_invalid(*usernames, error_message:) error_message: I18n.t(:'user.username.long', max: 8)) end - it 'is valid when the username has the maximum lenght' do + it 'is valid when the username has the maximum length' do SiteSetting.max_username_length = 9 expect_valid('Дровосек', 'چوب-لباسی', 'தமிழ்-தமிழ்') diff --git a/spec/models/web_hook_spec.rb b/spec/models/web_hook_spec.rb index 492cb83a7d8a4..570ba6a95c69f 100644 --- a/spec/models/web_hook_spec.rb +++ b/spec/models/web_hook_spec.rb @@ -40,7 +40,7 @@ fab!(:post_hook) { Fabricate(:web_hook, payload_url: " https://example.com ") } fab!(:topic_hook) { Fabricate(:topic_web_hook) } - it "removes whitspace from payload_url before saving" do + it "removes whitespace from payload_url before saving" do expect(post_hook.payload_url).to eq("https://example.com") end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 1c6c80d27d03d..fc996dabf36f1 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -97,7 +97,7 @@ module TestSetup # This is run before each test and before each before_all block def self.test_setup(x = nil) # TODO not sure about this, we could use a mock redis implementation here: - # this gives us really clean "flush" semantics, howere the side-effect is that + # this gives us really clean "flush" semantics, however the side-effect is that # we are no longer using a clean redis implementation, a preferable solution may # be simply flushing before tests, trouble is that redis may be reused with dev # so that would mean the dev would act weird diff --git a/spec/requests/admin/reports_controller_spec.rb b/spec/requests/admin/reports_controller_spec.rb index 1138b1be6fcc7..80f72176d60b8 100644 --- a/spec/requests/admin/reports_controller_spec.rb +++ b/spec/requests/admin/reports_controller_spec.rb @@ -32,7 +32,7 @@ end context "invalid params" do - context "inexisting report" do + context "nonexistent report" do it "returns not found reports" do get "/admin/reports/bulk.json", params: { reports: { diff --git a/spec/requests/admin/users_controller_spec.rb b/spec/requests/admin/users_controller_spec.rb index e756c6cbd2632..1fec5579b3cfc 100644 --- a/spec/requests/admin/users_controller_spec.rb +++ b/spec/requests/admin/users_controller_spec.rb @@ -32,7 +32,7 @@ end end - it "logs only 1 enty" do + it "logs only 1 entry" do expect do get "/admin/users/list.json", params: { show_emails: "true" } end.to change { UserHistory.where(action: UserHistory.actions[:check_email], acting_user_id: admin.id).count }.by(1) @@ -98,7 +98,7 @@ let(:evil_trout) { Fabricate(:evil_trout) } - it "does nothing without uesrs" do + it "does nothing without users" do put "/admin/users/approve-bulk.json" evil_trout.reload expect(response.status).to eq(200) diff --git a/spec/requests/api/posts_spec.rb b/spec/requests/api/posts_spec.rb index fd45f7997a3b9..a9e16cf834f2b 100644 --- a/spec/requests/api/posts_spec.rb +++ b/spec/requests/api/posts_spec.rb @@ -118,7 +118,7 @@ path '/posts/{id}.json' do - get 'Retreive a single post' do + get 'Retrieve a single post' do tags 'Posts' parameter name: 'Api-Key', in: :header, type: :string, required: true parameter name: 'Api-Username', in: :header, type: :string, required: true diff --git a/spec/requests/application_controller_spec.rb b/spec/requests/application_controller_spec.rb index 2e76f30a8cde8..fa2e8d15aa616 100644 --- a/spec/requests/application_controller_spec.rb +++ b/spec/requests/application_controller_spec.rb @@ -260,7 +260,7 @@ if (log.include? 'exception app middleware') # heisentest diagnostics puts - puts "EXTRA DIAGNOSTICS FOR INTERMITENT TEST FAIL" + puts "EXTRA DIAGNOSTICS FOR INTERMITTENT TEST FAIL" puts log puts ">> action_dispatch.exception" ex = request.env['action_dispatch.exception'] diff --git a/spec/requests/categories_controller_spec.rb b/spec/requests/categories_controller_spec.rb index fc1702469284f..ffbf60843c954 100644 --- a/spec/requests/categories_controller_spec.rb +++ b/spec/requests/categories_controller_spec.rb @@ -333,11 +333,11 @@ end it "returns 422 if email_in address is already in use for other category" do - _other_category = Fabricate(:category, name: "Other", email_in: "mail@examle.com") + _other_category = Fabricate(:category, name: "Other", email_in: "mail@example.com") put "/categories/#{category.id}.json", params: { name: "Email", - email_in: "mail@examle.com", + email_in: "mail@example.com", color: "ff0", text_color: "fff", } diff --git a/spec/requests/extra_locales_controller_spec.rb b/spec/requests/extra_locales_controller_spec.rb index 7d81ec890e8c5..4fad83de51984 100644 --- a/spec/requests/extra_locales_controller_spec.rb +++ b/spec/requests/extra_locales_controller_spec.rb @@ -57,7 +57,7 @@ "admin" => { "site_settings" => { "categories" => { - "github_badges" => "Github Badges" + "github_badges" => "GitHub Badges" } } } diff --git a/spec/requests/groups_controller_spec.rb b/spec/requests/groups_controller_spec.rb index 817ef5c63d0b1..fd5adca9fe5e1 100644 --- a/spec/requests/groups_controller_spec.rb +++ b/spec/requests/groups_controller_spec.rb @@ -1102,7 +1102,7 @@ def expect_type_to_return_right_groups(type, expected_group_ids) fab!(:group) { Fabricate(:group) } context 'when user is not signed in' do - it 'should be fobidden' do + it 'should be forbidden' do put "/groups/#{group.id}/members.json", params: { usernames: "bob" } expect(response).to be_forbidden @@ -1111,7 +1111,7 @@ def expect_type_to_return_right_groups(type, expected_group_ids) end context 'public group' do - it 'should be fobidden' do + it 'should be forbidden' do group.update!( public_admission: true, public_exit: true @@ -1447,7 +1447,7 @@ def expect_type_to_return_right_groups(type, expected_group_ids) expect(response.status).to eq(200) end - it 'should not allow an underprivilege user to add another user to a group' do + it 'should not allow an underprivileged user to add another user to a group' do sign_in(user) put "/groups/#{group.id}/members.json", @@ -1549,7 +1549,7 @@ def expect_type_to_return_right_groups(type, expected_group_ids) expect(response.status).to eq(200) end - it 'should not allow a underprivilege user to leave a group for another user' do + it 'should not allow a underprivileged user to leave a group for another user' do sign_in(user) delete "/groups/#{group.id}/members.json", diff --git a/spec/requests/hashtags_controller_spec.rb b/spec/requests/hashtags_controller_spec.rb index 16d736d5c25dc..fc67091e207d6 100644 --- a/spec/requests/hashtags_controller_spec.rb +++ b/spec/requests/hashtags_controller_spec.rb @@ -49,7 +49,7 @@ sign_in(admin) end - it "returns restricted categories and hidden tagss" do + it "returns restricted categories and hidden tags" do group.add(admin) get "/hashtags.json", params: { slugs: [private_category.slug, hidden_tag.name] } diff --git a/spec/requests/permalinks_controller_spec.rb b/spec/requests/permalinks_controller_spec.rb index 5f6c6efa92260..549ec647f2ef0 100644 --- a/spec/requests/permalinks_controller_spec.rb +++ b/spec/requests/permalinks_controller_spec.rb @@ -4,7 +4,7 @@ describe PermalinksController do fab!(:topic) { Fabricate(:topic) } - fab!(:permalink) { Fabricate(:permalink, url: "deadroutee/topic/546") } + fab!(:permalink) { Fabricate(:permalink, url: "deadroute/topic/546") } describe 'show' do it "should redirect to a permalink's target_url with status 301" do diff --git a/spec/requests/post_readers_controller_spec.rb b/spec/requests/post_readers_controller_spec.rb index 4916f54cac795..2b2dbe6ba716c 100644 --- a/spec/requests/post_readers_controller_spec.rb +++ b/spec/requests/post_readers_controller_spec.rb @@ -48,7 +48,7 @@ assert_reader_is_correctly_serialized(reader_data, reader, @post) end - it 'return an empty list when nodobody read unti that post' do + it 'return an empty list when nodobody read until that post' do TopicUser.create!(user: reader, topic: @group_message, last_read_post_number: 1) get '/post_readers.json', params: { id: @post.id } diff --git a/spec/requests/posts_controller_spec.rb b/spec/requests/posts_controller_spec.rb index a0dfe8366109b..68a0ce008e94e 100644 --- a/spec/requests/posts_controller_spec.rb +++ b/spec/requests/posts_controller_spec.rb @@ -577,7 +577,7 @@ before do Fabricate(:bookmark, user: user, post: Fabricate(:post, topic: post.topic), topic: post.topic) end - it "marks topic_bookmaked as true" do + it "marks topic_bookmarked as true" do delete "/posts/#{post.id}/bookmark.json" expect(response.parsed_body['topic_bookmarked']).to eq(true) end @@ -1903,7 +1903,7 @@ end describe '#cooked' do - it 'returns the cooked conent' do + it 'returns the cooked content' do post = Fabricate(:post, cooked: "WAt") get "/posts/#{post.id}/cooked.json" diff --git a/spec/requests/reviewables_controller_spec.rb b/spec/requests/reviewables_controller_spec.rb index 5a2abc2352880..c277a5eb2fe31 100644 --- a/spec/requests/reviewables_controller_spec.rb +++ b/spec/requests/reviewables_controller_spec.rb @@ -357,7 +357,7 @@ expect(response.code).to eq("404") end - it "validates the presenece of an action" do + it "validates the presence of an action" do put "/review/#{reviewable.id}/perform/nope.json?version=#{reviewable.version}" expect(response.code).to eq("403") end diff --git a/spec/requests/search_controller_spec.rb b/spec/requests/search_controller_spec.rb index 6af411832062b..be85a71a35410 100644 --- a/spec/requests/search_controller_spec.rb +++ b/spec/requests/search_controller_spec.rb @@ -534,7 +534,7 @@ expect(data["posts"][3]["id"]).to eq(very_low_priority_post.id) end - it "doesn't sort posts with search piority when query with order" do + it "doesn't sort posts with search priority when query with order" do get "/search.json", params: { q: 'status:open order:latest Priority Post' } expect(response.status).to eq(200) data = response.parsed_body @@ -601,7 +601,7 @@ SearchLog.clear_debounce_cache! end - it "doesn't work wthout the necessary parameters" do + it "doesn't work without the necessary parameters" do post "/search/click.json" expect(response.status).to eq(400) end diff --git a/spec/requests/session_controller_spec.rb b/spec/requests/session_controller_spec.rb index b065fd7e50e1e..6bf7b0e05a503 100644 --- a/spec/requests/session_controller_spec.rb +++ b/spec/requests/session_controller_spec.rb @@ -495,7 +495,7 @@ expect(session[:current_user_id]).to be_blank end - it "works in developmenet mode" do + it "works in development mode" do Rails.env.stubs(:development?).returns(true) get "/session/#{user.username}/become.json" expect(response).to be_redirect @@ -543,7 +543,7 @@ def get_sso(return_path) sso end - it 'does not create superflous auth tokens when already logged in' do + it 'does not create superfluous auth tokens when already logged in' do user = Fabricate(:user) sign_in(user) @@ -2188,7 +2188,7 @@ def post_login describe '#current' do context "when not logged in" do - it "retuns 404" do + it "returns 404" do get "/session/current.json" expect(response.status).to eq(404) end diff --git a/spec/requests/tags_controller_spec.rb b/spec/requests/tags_controller_spec.rb index 0232aa3c2b470..6c50a0539078d 100644 --- a/spec/requests/tags_controller_spec.rb +++ b/spec/requests/tags_controller_spec.rb @@ -105,7 +105,7 @@ end context "when user can admin tags" do - it "succesfully retrieve all tags" do + it "successfully retrieve all tags" do sign_in(admin) get "/tags.json" diff --git a/spec/requests/theme_javascripts_controller_spec.rb b/spec/requests/theme_javascripts_controller_spec.rb index d1d13a6dd9a1e..a8716b7536a25 100644 --- a/spec/requests/theme_javascripts_controller_spec.rb +++ b/spec/requests/theme_javascripts_controller_spec.rb @@ -24,7 +24,7 @@ def update_digest_and_get(digest) get "/theme-javascripts/#{digest}.js" end - it 'only accepts 40-char hexdecimal digest name' do + it 'only accepts 40-char hexadecimal digest name' do update_digest_and_get('0123456789abcdefabcd0123456789abcdefabcd') expect(response.status).to eq(200) diff --git a/spec/requests/topics_controller_spec.rb b/spec/requests/topics_controller_spec.rb index cfb00692221be..bd4e31e293817 100644 --- a/spec/requests/topics_controller_spec.rb +++ b/spec/requests/topics_controller_spec.rb @@ -1767,14 +1767,14 @@ def topic_user_post_timings_count(user, topic) let(:deleted_topic) { Fabricate(:deleted_topic) } let(:deleted_secure_topic) { Fabricate(:topic, category: secure_category, deleted_at: 1.day.ago) } let(:deleted_private_topic) { Fabricate(:private_message_topic, user: allowed_user, deleted_at: 1.day.ago) } - let!(:nonexist_topic_id) { Topic.last.id + 10000 } + let!(:nonexistent_topic_id) { Topic.last.id + 10000 } fab!(:secure_accessible_topic) { Fabricate(:topic, category: accessible_category) } shared_examples "various scenarios" do |expected| expected.each do |key, value| it "returns #{value} for #{key}" do - slug = key == :nonexist ? "garbage-slug" : send(key.to_s).slug - topic_id = key == :nonexist ? nonexist_topic_id : send(key.to_s).id + slug = key == :nonexistent ? "garbage-slug" : send(key.to_s).slug + topic_id = key == :nonexistent ? nonexistent_topic_id : send(key.to_s).id get "/t/#{slug}/#{topic_id}.json" expect(response.status).to eq(value) end @@ -1800,7 +1800,7 @@ def topic_user_post_timings_count(user, topic) deleted_topic: 404, deleted_secure_topic: 404, deleted_private_topic: 404, - nonexist: 404, + nonexistent: 404, secure_accessible_topic: 404 } include_examples "various scenarios", expected @@ -1817,7 +1817,7 @@ def topic_user_post_timings_count(user, topic) deleted_topic: 302, deleted_secure_topic: 302, deleted_private_topic: 302, - nonexist: 302, + nonexistent: 302, secure_accessible_topic: 302 } include_examples "various scenarios", expected @@ -1835,7 +1835,7 @@ def topic_user_post_timings_count(user, topic) deleted_topic: 404, deleted_secure_topic: 404, deleted_private_topic: 404, - nonexist: 404, + nonexistent: 404, secure_accessible_topic: 404 } include_examples "various scenarios", expected @@ -1853,7 +1853,7 @@ def topic_user_post_timings_count(user, topic) deleted_topic: 404, deleted_secure_topic: 404, deleted_private_topic: 404, - nonexist: 404, + nonexistent: 404, secure_accessible_topic: 404 } include_examples "various scenarios", expected @@ -1871,7 +1871,7 @@ def topic_user_post_timings_count(user, topic) deleted_topic: 200, deleted_secure_topic: 404, deleted_private_topic: 404, - nonexist: 404, + nonexistent: 404, secure_accessible_topic: 404 } include_examples "various scenarios", expected @@ -1889,7 +1889,7 @@ def topic_user_post_timings_count(user, topic) deleted_topic: 200, deleted_secure_topic: 200, deleted_private_topic: 200, - nonexist: 404, + nonexistent: 404, secure_accessible_topic: 200 } include_examples "various scenarios", expected @@ -1909,7 +1909,7 @@ def topic_user_post_timings_count(user, topic) deleted_topic: 410, deleted_secure_topic: 403, deleted_private_topic: 403, - nonexist: 404, + nonexistent: 404, secure_accessible_topic: 403 } include_examples "various scenarios", expected @@ -1926,7 +1926,7 @@ def topic_user_post_timings_count(user, topic) deleted_topic: 302, deleted_secure_topic: 302, deleted_private_topic: 302, - nonexist: 302, + nonexistent: 302, secure_accessible_topic: 302 } include_examples "various scenarios", expected @@ -1944,7 +1944,7 @@ def topic_user_post_timings_count(user, topic) deleted_topic: 410, deleted_secure_topic: 403, deleted_private_topic: 403, - nonexist: 404, + nonexistent: 404, secure_accessible_topic: 403 } include_examples "various scenarios", expected @@ -1962,7 +1962,7 @@ def topic_user_post_timings_count(user, topic) deleted_topic: 410, deleted_secure_topic: 410, deleted_private_topic: 410, - nonexist: 404, + nonexistent: 404, secure_accessible_topic: 403 } include_examples "various scenarios", expected @@ -1980,7 +1980,7 @@ def topic_user_post_timings_count(user, topic) deleted_topic: 200, deleted_secure_topic: 403, deleted_private_topic: 403, - nonexist: 404, + nonexistent: 404, secure_accessible_topic: 403 } include_examples "various scenarios", expected @@ -1998,7 +1998,7 @@ def topic_user_post_timings_count(user, topic) deleted_topic: 200, deleted_secure_topic: 200, deleted_private_topic: 200, - nonexist: 404, + nonexistent: 404, secure_accessible_topic: 200 } include_examples "various scenarios", expected @@ -3776,7 +3776,7 @@ def invite_group(topic, expected_status) freeze_time page3_time Fabricate(:post, topic: topic) - # ugly, but no inteface to set this and we don't want to create + # ugly, but no interface to set this and we don't want to create # 100 posts to test this thing TopicView.stubs(:chunk_size).returns(2) @@ -3852,7 +3852,7 @@ def invite_group(topic, expected_status) end end - it "should fail for non-existend topic" do + it "should fail for non-existent topic" do max_id = Topic.maximum(:id) sign_in(admin) put "/t/#{max_id + 1}/reset-bump-date.json" diff --git a/spec/requests/users_controller_spec.rb b/spec/requests/users_controller_spec.rb index e7430a9a6caa9..12aa1a9d7339a 100644 --- a/spec/requests/users_controller_spec.rb +++ b/spec/requests/users_controller_spec.rb @@ -633,7 +633,7 @@ def post_user(extra_params = {}) post "/u.json", params: { name: @user.name, username: @user.username, - password: 'tesing12352343' + password: 'testing12352343' } expect(response.status).to eq(400) end @@ -1369,7 +1369,7 @@ def post_user(extra_params = {}) end context 'while logged in' do - let(:old_username) { "OrigUsrname" } + let(:old_username) { "OrigUsername" } let(:new_username) { "#{old_username}1234" } let(:user) { Fabricate(:user, username: old_username) } @@ -2497,7 +2497,7 @@ def post_user(extra_params = {}) expect(user.user_avatar.reload.custom_upload_id).to eq(avatar1.id) end - it 'can succesfully select an avatar using a cooked URL' do + it 'can successfully select an avatar using a cooked URL' do events = DiscourseEvent.track_events do put "/u/#{user.username}/preferences/avatar/select.json", params: { url: UrlHelper.cook_url(avatar1.url) } end diff --git a/spec/serializers/post_revision_serializer_spec.rb b/spec/serializers/post_revision_serializer_spec.rb index 64013180fca9b..ea690df829ff8 100644 --- a/spec/serializers/post_revision_serializer_spec.rb +++ b/spec/serializers/post_revision_serializer_spec.rb @@ -47,7 +47,7 @@ expect(json[:tags_changes][:current]).to eq([public_tag2.name]) end - it 'does not show tag modificiatons if changes are not visible to the user' do + it 'does not show tag modifications if changes are not visible to the user' do json = PostRevisionSerializer.new(post_revision2, scope: Guardian.new(Fabricate(:user)), root: false).as_json expect(json[:tags_changes]).to_not be_present end diff --git a/spec/serializers/topic_view_serializer_spec.rb b/spec/serializers/topic_view_serializer_spec.rb index b9a9d03e250c2..c7515a8fd6427 100644 --- a/spec/serializers/topic_view_serializer_spec.rb +++ b/spec/serializers/topic_view_serializer_spec.rb @@ -467,7 +467,7 @@ def serialize_topic(topic, user_arg) end end - context 'Wwhen the slow mode is enabled' do + context 'When the slow mode is enabled' do before { topic.update!(slow_mode_seconds: 1000) } it 'returns nil if no user is given' do diff --git a/spec/services/badge_granter_spec.rb b/spec/services/badge_granter_spec.rb index 1679f06722348..fea28b4b19b91 100644 --- a/spec/services/badge_granter_spec.rb +++ b/spec/services/badge_granter_spec.rb @@ -391,7 +391,7 @@ expect(UserBadge.where(user_id: user.id, badge_id: Badge::Autobiographer).count).to eq(1) end - it "grants read guidlines" do + it "grants read guidelines" do user.user_stat.read_faq = Time.now user.user_stat.save diff --git a/spec/services/destroy_task_spec.rb b/spec/services/destroy_task_spec.rb index 5d41a73d0cc94..476cbff42002d 100644 --- a/spec/services/destroy_task_spec.rb +++ b/spec/services/destroy_task_spec.rb @@ -106,7 +106,7 @@ destroy_task = DestroyTask.new(StringIO.new) destroy_task.destroy_users expect(User.where(admin: false).count).to eq 0 - # admin does not get detroyed + # admin does not get destroyed expect(User.count).to eq before_count + 1 end end diff --git a/spec/services/inline_uploads_spec.rb b/spec/services/inline_uploads_spec.rb index c46b6d7b69a47..03c4fc5680134 100644 --- a/spec/services/inline_uploads_spec.rb +++ b/spec/services/inline_uploads_spec.rb @@ -681,13 +681,13 @@ it "should correct markdown references" do md = <<~MD - This is a [some reference] somethign + This is a [some reference] something [some reference]: https:#{upload.url} MD expect(InlineUploads.process(md)).to eq(<<~MD) - This is a [some reference] somethign + This is a [some reference] something [some reference]: #{Discourse.base_url}#{upload.short_path} MD diff --git a/spec/services/post_action_notifier_spec.rb b/spec/services/post_action_notifier_spec.rb index ed63971a3b0dd..f1bf3e08de94c 100644 --- a/spec/services/post_action_notifier_spec.rb +++ b/spec/services/post_action_notifier_spec.rb @@ -145,7 +145,7 @@ }.to change(post.user.notifications, :count).by(1) end - it 'does not notifiy a user of the revision made by the system user' do + it 'does not notify a user of the revision made by the system user' do expect { post.revise(Discourse.system_user, raw: "world is the new body of the message") }.not_to change(post.user.notifications, :count) diff --git a/spec/services/post_alerter_spec.rb b/spec/services/post_alerter_spec.rb index 86ca47e0187b3..a07ff60054077 100644 --- a/spec/services/post_alerter_spec.rb +++ b/spec/services/post_alerter_spec.rb @@ -442,7 +442,7 @@ def create_post_with_alerts(args = {}) expect(n.data_hash["original_username"]).to eq(admin.username) end - it "doesn't notify the last post editor if they mention themself" do + it "doesn't notify the last post editor if they mention themselves" do post = create_post_with_alerts(user: user, raw: 'Post without a mention.') expect { post.revise(evil_trout, raw: "O hai, @eviltrout!") @@ -1215,7 +1215,7 @@ def set_topic_notification_level(user, topic, level_name) post.topic.allowed_users << staged end - it "only notifes staff watching added tag" do + it "only notifies staff watching added tag" do expect(PostRevisor.new(post).revise!(Fabricate(:admin), tags: [other_tag.name])).to be true expect(Notification.where(user_id: staged.id).count).to eq(0) expect(PostRevisor.new(post).revise!(Fabricate(:admin), tags: [other_tag2.name])).to be true diff --git a/spec/services/search_indexer_spec.rb b/spec/services/search_indexer_spec.rb index 4fe3f1d9975fd..c890c430aa434 100644 --- a/spec/services/search_indexer_spec.rb +++ b/spec/services/search_indexer_spec.rb @@ -202,7 +202,7 @@ def scrub(html, strip_diacritics: false) post = Fabricate(:post, topic: topic, raw: <<~RAW) a https://abc.com?bob=1, http://efg.com.au?bill=1 b hij.net/xyz=1 - www.klm.net/?IGNORE=1 test + www.klm.net/?IGNORE=1 test RAW post.rebake! diff --git a/spec/services/site_settings_spec.rb b/spec/services/site_settings_spec.rb index 5cc546bcbc8bd..962c781bb988e 100644 --- a/spec/services/site_settings_spec.rb +++ b/spec/services/site_settings_spec.rb @@ -47,7 +47,7 @@ expect(counts[:not_found]).to eq 1 end - it "will log that an error has occured" do + it "will log that an error has occurred" do yml = "min_password_length: 0" log, counts = SiteSettingsTask.import(yml) expect(log[0]).to eq "ERROR: min_password_length: Value must be between 8 and 500." diff --git a/spec/services/user_anonymizer_spec.rb b/spec/services/user_anonymizer_spec.rb index d8ec0597ea7bc..1307990545576 100644 --- a/spec/services/user_anonymizer_spec.rb +++ b/spec/services/user_anonymizer_spec.rb @@ -198,7 +198,7 @@ expect(history.details).not_to match(orig_username) end - it "removes external auth assocations" do + it "removes external auth associations" do user.user_associated_accounts = [UserAssociatedAccount.create(user_id: user.id, provider_uid: "example", provider_name: "facebook")] user.single_sign_on_record = SingleSignOnRecord.create(user_id: user.id, external_id: "example", last_payload: "looks good") user.oauth2_user_infos = [Oauth2UserInfo.create(user_id: user.id, uid: "example", provider: "example")] diff --git a/spec/services/user_authenticator_spec.rb b/spec/services/user_authenticator_spec.rb index 8f2b86b686c64..718f779afb9f9 100644 --- a/spec/services/user_authenticator_spec.rb +++ b/spec/services/user_authenticator_spec.rb @@ -44,7 +44,7 @@ def github_auth(email_valid) context "#finish" do fab!(:group) { Fabricate(:group, automatic_membership_email_domains: "discourse.org") } - it "confirms email and adds the user to appropraite groups based on email" do + it "confirms email and adds the user to appropriate groups based on email" do user = Fabricate(:user, email: "user53@discourse.org") expect(group.usernames).not_to include(user.username) diff --git a/spec/services/user_merger_spec.rb b/spec/services/user_merger_spec.rb index ef77a76a5c195..55996ac52f0e0 100644 --- a/spec/services/user_merger_spec.rb +++ b/spec/services/user_merger_spec.rb @@ -837,7 +837,7 @@ def create_badge(badge, user, opts = {}) expect(UserEmail.where(user_id: source_user.id).count).to eq(0) end - it "skips merging email adresses when a secondary email address exists" do + it "skips merging email addresses when a secondary email address exists" do merge_users!(source_user, target_user) alice2 = Fabricate(:user, username: 'alice2', email: 'alice@foo.com') diff --git a/spec/services/user_notification_schedule_processor_spec.rb b/spec/services/user_notification_schedule_processor_spec.rb index 152667df94111..e835927af476a 100644 --- a/spec/services/user_notification_schedule_processor_spec.rb +++ b/spec/services/user_notification_schedule_processor_spec.rb @@ -28,7 +28,7 @@ UserNotificationScheduleProcessor.create_do_not_disturb_timings_for(standard_schedule) # The default schedule is 8am - 5pm. - # Expext DND timings to fill gaps before/after those times for 3 days. + # Expect DND timings to fill gaps before/after those times for 3 days. dnd_timings = user.do_not_disturb_timings offset = timezone_info[:offset] expect(dnd_timings[0].starts_at).to eq_time(Time.new(2020, 1, 4, 0, 0, 0, offset)) diff --git a/spec/services/user_updater_spec.rb b/spec/services/user_updater_spec.rb index ddc9371d66250..b9af1c7a95afe 100644 --- a/spec/services/user_updater_spec.rb +++ b/spec/services/user_updater_spec.rb @@ -173,7 +173,7 @@ expect(user.user_option.mailing_list_mode).to eq true end - it "filters theme_ids blank values before updating perferences" do + it "filters theme_ids blank values before updating preferences" do user = Fabricate(:user) user.user_option.update!(theme_ids: [1]) updater = UserUpdater.new(acting_user, user) diff --git a/spec/services/word_watcher_spec.rb b/spec/services/word_watcher_spec.rb index 5cf70b658398d..9c76c64aab85c 100644 --- a/spec/services/word_watcher_spec.rb +++ b/spec/services/word_watcher_spec.rb @@ -4,7 +4,7 @@ describe WordWatcher do - let(:raw) { "Do you like liquorice?\n\nI really like them. One could even say that I am *addicted* to liquorice. Anf if\nyou can mix it up with some anise, then I'm in heaven ;)" } + let(:raw) { "Do you like liquorice?\n\nI really like them. One could even say that I am *addicted* to liquorice. And if\nyou can mix it up with some anise, then I'm in heaven ;)" } after do Discourse.redis.flushdb diff --git a/spec/support/shared_examples_for_stats_cacheable.rb b/spec/support/shared_examples_for_stats_cacheable.rb index a2d77e47bc974..83b5fdae7dd7f 100644 --- a/spec/support/shared_examples_for_stats_cacheable.rb +++ b/spec/support/shared_examples_for_stats_cacheable.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -shared_examples_for 'stats cachable' do +shared_examples_for 'stats cacheable' do describe 'fetch_cached_stats' do after do Discourse.redis.del(described_class.stats_cache_key) diff --git a/test/run-qunit.js b/test/run-qunit.js index 9737efc35aa1d..67dbc8157bf99 100644 --- a/test/run-qunit.js +++ b/test/run-qunit.js @@ -168,7 +168,7 @@ runAllTests().catch((e) => { }); // The following functions are converted to strings -// And then sent to chrome to be evalaluated +// And then sent to chrome to be evaluated function logQUnit() { let testErrors = []; let assertionErrors = []; diff --git a/test/smoke_test.js b/test/smoke_test.js index abd1a4589b884..979d05d883f8d 100644 --- a/test/smoke_test.js +++ b/test/smoke_test.js @@ -16,7 +16,7 @@ const path = require("path"); (async () => { const browser = await puppeteer.launch({ - // when debugging localy setting the SHOW_BROWSER env variable can be very helpful + // when debugging locally setting the SHOW_BROWSER env variable can be very helpful headless: process.env.SHOW_BROWSER === undefined, args: ["--disable-local-storage", "--no-sandbox"] }); From afb2b4c6b90456d753dcf7af473f782028c0a74c Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Fri, 21 May 2021 13:32:32 +1000 Subject: [PATCH 029/689] FIX: Update upload secure status when revising posts (#13110) When uploads are created from the composer (editing or creating a post), for sites with secure uploads enabled we assume security by default and that new upload is set to secure. When the post is created, we then check whether the post uploads _actually_ need to be secure and adjust accordingly. We were not doing this when revising a post, so when a new upload was created when editing a post in a public topic, the secure status stayed true erroneously causing issues with image previews, among other things. --- lib/post_revisor.rb | 5 +++++ spec/components/post_revisor_spec.rb | 31 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/lib/post_revisor.rb b/lib/post_revisor.rb index 26c13b9219191..571cf94a5752d 100644 --- a/lib/post_revisor.rb +++ b/lib/post_revisor.rb @@ -226,6 +226,11 @@ def revise!(editor, fields, opts = {}) # it can fire events in sidekiq before the post is done saving # leading to corrupt state QuotedPost.extract_from(@post) + + # This must be done before post_process_post, because that uses + # post upload security status to cook URLs. + @post.update_uploads_secure_status(source: "post revisor") + post_process_post update_topic_word_counts diff --git a/spec/components/post_revisor_spec.rb b/spec/components/post_revisor_spec.rb index 551c2bc440a54..5d54fbd930ab8 100644 --- a/spec/components/post_revisor_spec.rb +++ b/spec/components/post_revisor_spec.rb @@ -1115,6 +1115,37 @@ expect(post.reload.post_uploads.pluck(:upload_id)).to contain_exactly(image2.id, image3.id, image4.id) end + + context "secure media uploads" do + let!(:image5) { Fabricate(:secure_upload) } + before do + setup_s3 + SiteSetting.authorized_extensions = "png|jpg|gif|mp4" + SiteSetting.secure_media = true + stub_upload(image5) + end + + it "updates the upload secure status, which is secure by default from the composer. set to false for a public topic" do + subject.revise!(user, raw: <<~RAW) + This is a post with a secure upload + ![image5](#{image5.short_url}) + RAW + + expect(image5.reload.secure).to eq(false) + expect(image5.security_last_changed_reason).to eq("access control post dictates security | source: post revisor") + end + + it "does not update the upload secure status, which is secure by default from the composer for a private" do + post.topic.update(category: Fabricate(:private_category, group: Fabricate(:group))) + subject.revise!(user, raw: <<~RAW) + This is a post with a secure upload + ![image5](#{image5.short_url}) + RAW + + expect(image5.reload.secure).to eq(true) + expect(image5.security_last_changed_reason).to eq("access control post dictates security | source: post revisor") + end + end end end From 13d40ead97481f711b696f2b2071ca5936f525ea Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Thu, 20 May 2021 23:37:17 -0400 Subject: [PATCH 030/689] DEV: Correct spelling mistakes in comments --- .../discourse/app/components/category-title-link.js | 2 +- app/assets/javascripts/discourse/app/lib/plugin-api.js | 2 +- .../discourse/app/lib/register-topic-footer-button.js | 2 +- app/assets/javascripts/discourse/app/models/user.js | 2 +- app/mailers/rejection_mailer.rb | 2 +- app/models/topic.rb | 2 +- config/initializers/200-first_middlewares.rb | 2 +- lib/auth/authenticator.rb | 2 +- lib/auth/managed_authenticator.rb | 2 +- lib/tasks/emails.rake | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/category-title-link.js b/app/assets/javascripts/discourse/app/components/category-title-link.js index afe11e3db430f..1ac2a2fbab34c 100644 --- a/app/assets/javascripts/discourse/app/components/category-title-link.js +++ b/app/assets/javascripts/discourse/app/components/category-title-link.js @@ -1,6 +1,6 @@ import Component from "@ember/component"; export default Component.extend({ tagName: "h3", - // icon name defined here so it can be easily overriden in theme components + // icon name defined here so it can be easily overridden in theme components lockIcon: "lock", }); diff --git a/app/assets/javascripts/discourse/app/lib/plugin-api.js b/app/assets/javascripts/discourse/app/lib/plugin-api.js index 21c7142637986..5778d700b86a8 100644 --- a/app/assets/javascripts/discourse/app/lib/plugin-api.js +++ b/app/assets/javascripts/discourse/app/lib/plugin-api.js @@ -757,7 +757,7 @@ class PluginApi { * * Example: * - * addPostClassesCallback((atts) => {if (atts.post_number == 1) return ["first"];}) + * addPostClassesCallback((attrs) => {if (attrs.post_number == 1) return ["first"];}) **/ addPostClassesCallback(callback) { addPostClassesCallback(callback); diff --git a/app/assets/javascripts/discourse/app/lib/register-topic-footer-button.js b/app/assets/javascripts/discourse/app/lib/register-topic-footer-button.js index cdafab891f295..ec3c0191722c2 100644 --- a/app/assets/javascripts/discourse/app/lib/register-topic-footer-button.js +++ b/app/assets/javascripts/discourse/app/lib/register-topic-footer-button.js @@ -33,7 +33,7 @@ export function registerTopicFooterButton(button) { ariaLabel: null, translatedAriaLabel: null, - // is this button disaplyed in the mobile dropdown or as an inline button ? + // is this button displayed in the mobile dropdown or as an inline button ? dropdown: false, // css class appended to the button diff --git a/app/assets/javascripts/discourse/app/models/user.js b/app/assets/javascripts/discourse/app/models/user.js index 6d09211cd1b9f..667f9153a4686 100644 --- a/app/assets/javascripts/discourse/app/models/user.js +++ b/app/assets/javascripts/discourse/app/models/user.js @@ -229,7 +229,7 @@ const User = RestModel.extend({ const allowedUsers = details && details.get("allowed_users"); const groups = details && details.get("allowed_groups"); - // directly targetted so go to inbox + // directly targeted so go to inbox if (!groups || (allowedUsers && allowedUsers.findBy("id", userId))) { return userPath(`${username}/messages`); } else { diff --git a/app/mailers/rejection_mailer.rb b/app/mailers/rejection_mailer.rb index 99d6feb310d4d..ecbf56fbf469f 100644 --- a/app/mailers/rejection_mailer.rb +++ b/app/mailers/rejection_mailer.rb @@ -26,7 +26,7 @@ class RejectionMailer < ActionMailer::Base # Send an email rejection message. # # template - i18n key under system_messages - # message_from - Who to send the rejection messsage to + # message_from - Who to send the rejection message to # template_args - arguments to pass to i18n for interpolation into the message # Certain keys are disallowed in template_args to avoid confusing the # BuildEmailHelper. You can see the list in DISALLOWED_TEMPLATE_ARGS. diff --git a/app/models/topic.rb b/app/models/topic.rb index 2e48bd8677b3e..3d82decb377e3 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -415,7 +415,7 @@ def is_official_warning? subtype == TopicSubtype.moderator_warning end - # all users (in groups or directly targetted) that are going to get the pm + # all users (in groups or directly targeted) that are going to get the pm def all_allowed_users moderators_sql = " UNION #{User.moderators.to_sql}" if private_message? && (has_flags? || is_official_warning?) User.from("(#{allowed_users.to_sql} UNION #{allowed_group_users.to_sql}#{moderators_sql}) as users") diff --git a/config/initializers/200-first_middlewares.rb b/config/initializers/200-first_middlewares.rb index bcb1b6d9cb991..ad383d6137b24 100644 --- a/config/initializers/200-first_middlewares.rb +++ b/config/initializers/200-first_middlewares.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -# we want MesageBus to be close to the front +# we want MessageBus to be close to the front # this is important cause the vast majority of web requests go to it # this allows us to avoid full middleware crawls each time # diff --git a/lib/auth/authenticator.rb b/lib/auth/authenticator.rb index cd6fd4fd5e6ba..2302d3bce00bc 100644 --- a/lib/auth/authenticator.rb +++ b/lib/auth/authenticator.rb @@ -52,7 +52,7 @@ def can_revoke? false end - # can exising discourse users connect this provider to their accounts + # can existing discourse users connect this provider to their accounts def can_connect_existing_user? false end diff --git a/lib/auth/managed_authenticator.rb b/lib/auth/managed_authenticator.rb index 7b07e063d9ca5..e82f1de96e1ee 100644 --- a/lib/auth/managed_authenticator.rb +++ b/lib/auth/managed_authenticator.rb @@ -19,7 +19,7 @@ def description_for_auth_hash(auth_token) info["email"] || info["nickname"] || info["name"] end - # These three methods are designed to be overriden by child classes + # These three methods are designed to be overridden by child classes def match_by_email true end diff --git a/lib/tasks/emails.rake b/lib/tasks/emails.rake index 2cd3e8e4fd6d4..55efcd49d4af3 100644 --- a/lib/tasks/emails.rake +++ b/lib/tasks/emails.rake @@ -11,7 +11,7 @@ def process_popmail(popmail) end end -desc "use this task to import a mailbox into Disourse" +desc "use this task to import a mailbox into Discourse" task "emails:import" => :environment do begin unless SiteSetting.email_in @@ -72,7 +72,7 @@ task 'emails:test', [:email] => [:environment] do |_, args| Sending mail with Gmail is a violation of their terms of service. Sending with G Suite might work, but it is not recommended. For information see: - https://meta.discourse.org/t/dscourse-aws-ec2-g-suite-troubleshoting/62931?u=pfaffman + https://meta.discourse.org/t/discourse-aws-ec2-g-suite-troubleshooting/62931?u=pfaffman ========================= CONTINUING TEST ============================ STR From 4ce854f21ca52783625b2be82b8bc0dff3cfeebd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 May 2021 13:46:09 +1000 Subject: [PATCH 031/689] Build(deps): Bump nokogiri from 1.11.4 to 1.11.5 (#13107) Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.11.4 to 1.11.5. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.11.4...v1.11.5) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index c00bd4093da7d..834d3b0221d1e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -232,14 +232,14 @@ GEM multipart-post (2.1.1) mustache (1.1.1) nio4r (2.5.7) - nokogiri (1.11.4) + nokogiri (1.11.5) mini_portile2 (~> 2.5.0) racc (~> 1.4) - nokogiri (1.11.4-arm64-darwin) + nokogiri (1.11.5-arm64-darwin) racc (~> 1.4) - nokogiri (1.11.4-x86_64-darwin) + nokogiri (1.11.5-x86_64-darwin) racc (~> 1.4) - nokogiri (1.11.4-x86_64-linux) + nokogiri (1.11.5-x86_64-linux) racc (~> 1.4) nokogumbo (2.0.5) nokogiri (~> 1.8, >= 1.8.4) From 38af28d58bd1652d524306e8fe170178115ce43e Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Fri, 21 May 2021 11:34:17 +0300 Subject: [PATCH 032/689] FIX: Allow add email to group if user can invite (#13097) It used to allow adding email addresses to a group even if invites were disabled for the site. This does not allow user to input email address if they cannot invite. The second thing this commit improves is the message that is displayed to the user when they hit the invite rate limit. --- .../app/templates/modal/group-add-members.hbs | 10 +++++++--- app/controllers/groups_controller.rb | 10 +++++++++- config/locales/client.en.yml | 8 ++++++-- config/locales/server.en.yml | 3 +++ lib/rate_limiter/limit_exceeded.rb | 6 ++++-- 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/discourse/app/templates/modal/group-add-members.hbs b/app/assets/javascripts/discourse/app/templates/modal/group-add-members.hbs index 5e0e9cd718f62..9a7427f876368 100644 --- a/app/assets/javascripts/discourse/app/templates/modal/group-add-members.hbs +++ b/app/assets/javascripts/discourse/app/templates/modal/group-add-members.hbs @@ -2,7 +2,11 @@

{{i18n "groups.add_members.description"}} @@ -14,8 +18,8 @@ id="group-add-members-user-selector" onChange=(action (mut usernamesAndEmails)) options=(hash - allowEmails=true - filterPlaceholder="groups.add_members.input_placeholder" + allowEmails=currentUser.can_invite_to_forum + filterPlaceholder=(if currentUser.can_invite_to_forum "groups.add_members.usernames_or_emails.input_placeholder" "groups.add_members.usernames.input_placeholder") ) }}

diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 576509eaaf97b..69dff9cf26dac 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -368,7 +368,15 @@ def add_members end emails.each do |email| - Invite.generate(current_user, email: email, group_ids: [group.id]) + begin + Invite.generate(current_user, email: email, group_ids: [group.id]) + rescue RateLimiter::LimitExceeded => e + return render_json_error(I18n.t( + "invite.rate_limit", + count: SiteSetting.max_invites_per_day, + time_left: e.time_left + )) + end end render json: success_json.merge!( diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 9ecbdd6df410e..ba78980f2c83f 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -660,8 +660,12 @@ en: add_members: title: "Add members to %{group_name}" description: "You can also paste in a comma separated list." - usernames: "Enter usernames or email addresses" - input_placeholder: "Usernames or emails" + usernames_or_emails: + title: "Enter usernames or email addresses" + input_placeholder: "Usernames or emails" + usernames: + title: "Enter usernames" + input_placeholder: "Usernames" notify_users: "Notify users" requests: title: "Requests" diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 57dffffcb1b36..977b2836ec122 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -243,6 +243,9 @@ en: user_exists: "There's no need to invite %{email}, they already have an account!" invite_exists: "You already invited %{email}." invalid_email: "%{email} isn't a valid email address." + rate_limit: + one: "You have already sent %{count} invite in the last day, please wait %{time_left} before trying again." + other: "You have already sent %{count} invites in the last day, please wait %{time_left} before trying again." confirm_email: "

You’re almost done! We sent an activation mail to your email address. Please follow the instructions in the mail to activate your account.

If it doesn’t arrive, check your spam folder.

" cant_invite_to_group: "You are not allowed to invite users to specified group(s). Make sure you are owner of the group(s) you are trying to invite to." disabled_errors: diff --git a/lib/rate_limiter/limit_exceeded.rb b/lib/rate_limiter/limit_exceeded.rb index 8b624a074ed34..8aa4532430e9f 100644 --- a/lib/rate_limiter/limit_exceeded.rb +++ b/lib/rate_limiter/limit_exceeded.rb @@ -11,8 +11,8 @@ def initialize(available_in, type = nil) @type = type end - def description - time_left = + def time_left + @time_left ||= if @available_in <= 3 I18n.t("rate_limiter.short_time") elsif @available_in < 1.minute.to_i @@ -22,7 +22,9 @@ def description else I18n.t("rate_limiter.hours", count: (@available_in / 1.hour.to_i)) end + end + def description if @type.present? type_key = @type.tr("-", "_") msg = I18n.t("rate_limiter.by_type.#{type_key}", time_left: time_left, default: "") From 0df6b0bc47439cedf1c0930f4cc60fd3a8cba368 Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Fri, 21 May 2021 18:13:14 +0400 Subject: [PATCH 033/689] FIX: slow mode dialog doesn't remember Enabled Until value (#13076) If reload a page after enabling slow mode and open the slow mode dialog again it would show a slow mode interval but wouldn't show Enabled Until value. This PR fixes it. --- .../app/controllers/edit-slow-mode.js | 13 ++++- .../app/templates/modal/edit-slow-mode.hbs | 4 +- .../tests/acceptance/topic-slow-mode-test.js | 58 +++++++++++++++++++ app/models/topic.rb | 5 ++ app/serializers/topic_view_serializer.rb | 7 ++- .../web_hook_topic_view_serializer.rb | 1 + 6 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 app/assets/javascripts/discourse/tests/acceptance/topic-slow-mode-test.js diff --git a/app/assets/javascripts/discourse/app/controllers/edit-slow-mode.js b/app/assets/javascripts/discourse/app/controllers/edit-slow-mode.js index 66a0a0a03825b..f06e9ce38ddcb 100644 --- a/app/assets/javascripts/discourse/app/controllers/edit-slow-mode.js +++ b/app/assets/javascripts/discourse/app/controllers/edit-slow-mode.js @@ -14,7 +14,6 @@ export default Controller.extend(ModalFunctionality, { minutes: null, seconds: null, saveDisabled: false, - enabledUntil: null, showCustomSelect: equal("selectedSlowMode", "custom"), durationIsSet: or("hours", "minutes", "seconds"), @@ -87,7 +86,11 @@ export default Controller.extend(ModalFunctionality, { } }, - @discourseComputed("saveDisabled", "durationIsSet", "enabledUntil") + @discourseComputed( + "saveDisabled", + "durationIsSet", + "model.slow_mode_enabled_until" + ) submitDisabled(saveDisabled, durationIsSet, enabledUntil) { return saveDisabled || !durationIsSet || !enabledUntil; }, @@ -121,7 +124,11 @@ export default Controller.extend(ModalFunctionality, { this._parseValue(this.seconds) ); - Topic.setSlowMode(this.model.id, seconds, this.enabledUntil) + Topic.setSlowMode( + this.model.id, + seconds, + this.model.slow_mode_enabled_until + ) .catch(popupAjaxError) .then(() => { this.set("model.slow_mode_seconds", seconds); diff --git a/app/assets/javascripts/discourse/app/templates/modal/edit-slow-mode.hbs b/app/assets/javascripts/discourse/app/templates/modal/edit-slow-mode.hbs index 19f54b2c0e9f5..8b6dbae97c2c0 100644 --- a/app/assets/javascripts/discourse/app/templates/modal/edit-slow-mode.hbs +++ b/app/assets/javascripts/discourse/app/templates/modal/edit-slow-mode.hbs @@ -33,8 +33,8 @@ labelClasses="slow-mode-label" includeFarFuture=false clearable=true - input=enabledUntil - onChangeInput=(action (mut enabledUntil)) + input=model.slow_mode_enabled_until + onChangeInput=(action (mut model.slow_mode_enabled_until)) }} {{/d-modal-body}} diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-slow-mode-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-slow-mode-test.js new file mode 100644 index 0000000000000..3324d7b15cd80 --- /dev/null +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-slow-mode-test.js @@ -0,0 +1,58 @@ +import { + acceptance, + exists, + query, + updateCurrentUser, +} from "discourse/tests/helpers/qunit-helpers"; +import { click, visit } from "@ember/test-helpers"; +import { test } from "qunit"; +import I18n from "I18n"; +import { cloneJSON } from "discourse-common/lib/object"; +import topicFixtures from "discourse/tests/fixtures/topic"; + +acceptance("Topic - Slow Mode - enabled", function (needs) { + needs.user(); + needs.pretender((server, helper) => { + server.get("/t/130.json", () => { + const json = cloneJSON(topicFixtures["/t/130.json"]); + json.slow_mode_seconds = 600; + json.slow_mode_enabled_until = "2040-01-01T04:00:00.000Z"; + + return helper.response(json); + }); + }); + + test("the slow mode dialog loads settings of currently enabled slow mode ", async function (assert) { + updateCurrentUser({ moderator: true }); + await visit("/t/slow-mode-testing/130"); + await click(".toggle-admin-menu"); + await click(".topic-admin-slow-mode button"); + + await click(".future-date-input-selector-header"); + + assert.equal( + query(".future-date-input-selector-header").getAttribute("aria-expanded"), + "true", + "selector is expanded" + ); + + assert.equal( + query("div.slow-mode-type span.name").innerText, + I18n.t("topic.slow_mode_update.durations.10_minutes"), + "slow mode interval is rendered" + ); + + // unfortunately we can't check exact date and time + // but at least we can make sure that components for choosing date and time are rendered + // (in case of inactive slow mode it would be only a combo box with text "Select a timeframe", + // and date picker and time picker wouldn't be rendered) + assert.equal( + query("div.enabled-until span.name").innerText, + I18n.t("topic.auto_update_input.pick_date_and_time"), + "enabled until combobox is switched to the option Pick Date and Time" + ); + + assert.ok(exists("input.date-picker"), "date picker is rendered"); + assert.ok(exists("input.time-input"), "time picker is rendered"); + }); +}); diff --git a/app/models/topic.rb b/app/models/topic.rb index 3d82decb377e3..35ca0a1de543f 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -538,6 +538,7 @@ def update_meta_data(data) def reload(options = nil) @post_numbers = nil @public_topic_timer = nil + @slow_mode_topic_timer = nil @is_category_topic = nil super(options) end @@ -1278,6 +1279,10 @@ def public_topic_timer @public_topic_timer ||= topic_timers.find_by(deleted_at: nil, public_type: true) end + def slow_mode_topic_timer + @slow_mode_topic_timer ||= topic_timers.find_by(deleted_at: nil, status_type: TopicTimer.types[:clear_slow_mode]) + end + def delete_topic_timer(status_type, by_user: Discourse.system_user) options = { status_type: status_type } options.merge!(user: by_user) unless TopicTimer.public_types[status_type] diff --git a/app/serializers/topic_view_serializer.rb b/app/serializers/topic_view_serializer.rb index da76ec24977cf..3a5e1d747dd36 100644 --- a/app/serializers/topic_view_serializer.rb +++ b/app/serializers/topic_view_serializer.rb @@ -75,7 +75,8 @@ def self.attributes_from_topic(*list) :requested_group_name, :thumbnails, :user_last_posted_at, - :is_shared_draft + :is_shared_draft, + :slow_mode_enabled_until ) has_one :details, serializer: TopicViewDetailsSerializer, root: false, embed: :objects @@ -298,4 +299,8 @@ def user_last_posted_at def include_user_last_posted_at? has_topic_user? && object.topic.slow_mode_seconds.to_i > 0 end + + def slow_mode_enabled_until + object.topic.slow_mode_topic_timer&.execute_at + end end diff --git a/app/serializers/web_hook_topic_view_serializer.rb b/app/serializers/web_hook_topic_view_serializer.rb index cadd50ebaf706..13159fdf2082a 100644 --- a/app/serializers/web_hook_topic_view_serializer.rb +++ b/app/serializers/web_hook_topic_view_serializer.rb @@ -21,6 +21,7 @@ class WebHookTopicViewSerializer < TopicViewSerializer details image_url slow_mode_seconds + slow_mode_enabled_until }.each do |attr| define_method("include_#{attr}?") do false From f700f3ef009d7a149cddb706b78c807b1469d2a9 Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Fri, 21 May 2021 17:50:24 +0300 Subject: [PATCH 034/689] FEATURE: Support tag and replace in watched words in test modal (#13100) The modal showed only the matches, without the replacement or tags. --- .../addon/components/admin-watched-word.js | 12 +++++- .../modals/admin-watched-word-test.js | 42 +++++++++++++++++-- .../components/admin-watched-word.hbs | 10 ++++- .../components/watched-word-form.hbs | 4 +- .../modal/admin-watched-word-test.hbs | 26 ++++++++++-- .../addon/templates/watched-words-action.hbs | 3 +- .../acceptance/admin-watched-words-test.js | 16 +++++++ .../tests/fixtures/watched-words-fixtures.js | 29 +++++++++++-- .../stylesheets/common/admin/staff_logs.scss | 16 +++++-- app/serializers/watched_word_serializer.rb | 10 ++++- config/locales/client.en.yml | 2 +- 11 files changed, 148 insertions(+), 22 deletions(-) diff --git a/app/assets/javascripts/admin/addon/components/admin-watched-word.js b/app/assets/javascripts/admin/addon/components/admin-watched-word.js index fb24a6f388fcb..1dcee049eb760 100644 --- a/app/assets/javascripts/admin/addon/components/admin-watched-word.js +++ b/app/assets/javascripts/admin/addon/components/admin-watched-word.js @@ -1,10 +1,20 @@ import Component from "@ember/component"; -import I18n from "I18n"; +import { equal } from "@ember/object/computed"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; +import I18n from "I18n"; export default Component.extend({ classNames: ["watched-word"], + isReplace: equal("actionKey", "replace"), + isTag: equal("actionKey", "tag"), + + @discourseComputed("word.replacement") + tags(replacement) { + return replacement.split(","); + }, + click() { this.word .destroy() diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-watched-word-test.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-watched-word-test.js index 215cc08a6d9d0..3dfbd278b56da 100644 --- a/app/assets/javascripts/admin/addon/controllers/modals/admin-watched-word-test.js +++ b/app/assets/javascripts/admin/addon/controllers/modals/admin-watched-word-test.js @@ -1,14 +1,48 @@ import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import discourseComputed from "discourse-common/utils/decorators"; +import { equal } from "@ember/object/computed"; export default Controller.extend(ModalFunctionality, { - @discourseComputed("value", "model.compiledRegularExpression") - matches(value, regexpString) { + isReplace: equal("model.nameKey", "replace"), + isTag: equal("model.nameKey", "tag"), + + @discourseComputed( + "value", + "model.compiledRegularExpression", + "model.words", + "isReplace", + "isTag" + ) + matches(value, regexpString, words, isReplace, isTag) { if (!value || !regexpString) { return; } - let censorRegexp = new RegExp(regexpString, "ig"); - return value.match(censorRegexp); + + const regexp = new RegExp(regexpString, "ig"); + const matches = value.match(regexp) || []; + + if (isReplace) { + return matches.map((match) => ({ + match, + replacement: words.find((word) => + new RegExp(word.regexp, "ig").test(match) + ).replacement, + })); + } else if (isTag) { + return matches.map((match) => { + const tags = new Set(); + + words.forEach((word) => { + if (new RegExp(word.regexp, "ig").test(match)) { + word.replacement.split(",").forEach((tag) => tags.add(tag)); + } + }); + + return { match, tags: Array.from(tags) }; + }); + } + + return matches; }, }); diff --git a/app/assets/javascripts/admin/addon/templates/components/admin-watched-word.hbs b/app/assets/javascripts/admin/addon/templates/components/admin-watched-word.hbs index cc03496510865..26f8a9ebbdaee 100644 --- a/app/assets/javascripts/admin/addon/templates/components/admin-watched-word.hbs +++ b/app/assets/javascripts/admin/addon/templates/components/admin-watched-word.hbs @@ -1 +1,9 @@ -{{d-icon "times"}} {{word.word}} {{#if word.replacement}}→ {{word.replacement}}{{/if}} +{{d-icon "times"}} {{word.word}} +{{#if isReplace}} + → {{word.replacement}} +{{else if isTag}} + → + {{#each tags as |tag|}} + {{tag}} + {{/each}} +{{/if}} diff --git a/app/assets/javascripts/admin/addon/templates/components/watched-word-form.hbs b/app/assets/javascripts/admin/addon/templates/components/watched-word-form.hbs index dbc7c8603f52c..8d10aeb14da03 100644 --- a/app/assets/javascripts/admin/addon/templates/components/watched-word-form.hbs +++ b/app/assets/javascripts/admin/addon/templates/components/watched-word-form.hbs @@ -6,14 +6,14 @@ {{#if canReplace}}
- {{text-field id="watched-replacement" value=replacement disabled=formSubmitted class="watched-word-input-replace" autocorrect="off" autocapitalize="off" placeholderKey="admin.watched_words.form.replacement_placeholder"}} + {{text-field id="watched-replacement" value=replacement disabled=formSubmitted class="watched-word-input-field" autocorrect="off" autocapitalize="off" placeholderKey="admin.watched_words.form.replacement_placeholder"}}
{{/if}} {{#if canTag}}
- {{text-field id="watched-tag" value=replacement disabled=formSubmitted class="watched-word-input" autocorrect="off" autocapitalize="off" placeholderKey="admin.watched_words.form.tag_placeholder"}} + {{text-field id="watched-tag" value=replacement disabled=formSubmitted class="watched-word-input-field" autocorrect="off" autocapitalize="off" placeholderKey="admin.watched_words.form.tag_placeholder"}}
{{/if}} diff --git a/app/assets/javascripts/admin/addon/templates/modal/admin-watched-word-test.hbs b/app/assets/javascripts/admin/addon/templates/modal/admin-watched-word-test.hbs index ef56567cdd6c9..2b2361bb35bc0 100644 --- a/app/assets/javascripts/admin/addon/templates/modal/admin-watched-word-test.hbs +++ b/app/assets/javascripts/admin/addon/templates/modal/admin-watched-word-test.hbs @@ -5,9 +5,29 @@

{{i18n "admin.watched_words.test.found_matches"}}

    - {{#each matches as |match|}} -
  • {{match}}
  • - {{/each}} + {{#if isReplace}} + {{#each matches as |match|}} +
  • + {{match.match}} + → + {{match.replacement}} +
  • + {{/each}} + {{else if isTag}} + {{#each matches as |match|}} +
  • + {{match.match}} + → + {{#each match.tags as |tag|}} + {{tag}} + {{/each}} +
  • + {{/each}} + {{else}} + {{#each matches as |match|}} +
  • {{match}}
  • + {{/each}} + {{/if}}

{{else}} diff --git a/app/assets/javascripts/admin/addon/templates/watched-words-action.hbs b/app/assets/javascripts/admin/addon/templates/watched-words-action.hbs index d17ce9e300fd2..e6b9c77224023 100644 --- a/app/assets/javascripts/admin/addon/templates/watched-words-action.hbs +++ b/app/assets/javascripts/admin/addon/templates/watched-words-action.hbs @@ -8,6 +8,7 @@ {{watched-word-uploader uploading=uploading actionKey=actionNameKey done=(action "uploadComplete")}} {{d-button + class="watched-word-test" label="admin.watched_words.test.button_label" icon="far-eye" action=(action "test")}} @@ -37,7 +38,7 @@ {{#if showWordsList}}
{{#each filteredContent as |word| }} -
{{admin-watched-word word=word action=(action "recordRemoved")}}
+
{{admin-watched-word actionKey=actionNameKey word=word action=(action "recordRemoved")}}
{{/each}}
{{/if}} diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-watched-words-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-watched-words-test.js index 1a3162e242a38..4094f6ba07917 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-watched-words-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-watched-words-test.js @@ -83,4 +83,20 @@ acceptance("Admin - Watched Words", function (needs) { assert.equal(queryAll(".watched-words-list .watched-word").length, 2); }); + + test("test modal - replace", async function (assert) { + await visit("/admin/customize/watched_words/action/replace"); + await click(".watched-word-test"); + await fillIn(".modal-body textarea", "Hi there!"); + assert.equal(find(".modal-body li .match").text(), "Hi"); + assert.equal(find(".modal-body li .replacement").text(), "hello"); + }); + + test("test modal - tag", async function (assert) { + await visit("/admin/customize/watched_words/action/tag"); + await click(".watched-word-test"); + await fillIn(".modal-body textarea", "Hello world!"); + assert.equal(find(".modal-body li .match").text(), "Hello"); + assert.equal(find(".modal-body li .tag").text(), "greeting"); + }); }); diff --git a/app/assets/javascripts/discourse/tests/fixtures/watched-words-fixtures.js b/app/assets/javascripts/discourse/tests/fixtures/watched-words-fixtures.js index 8fca803089e07..8a6ead382b6e9 100644 --- a/app/assets/javascripts/discourse/tests/fixtures/watched-words-fixtures.js +++ b/app/assets/javascripts/discourse/tests/fixtures/watched-words-fixtures.js @@ -1,14 +1,35 @@ export default { "/admin/customize/watched_words.json": { - actions: ["block", "censor", "require_approval", "flag"], + actions: ["block", "censor", "require_approval", "flag", "replace", "tag"], words: [ { id: 1, word: "liquorice", action: "block" }, { id: 2, word: "anise", action: "block" }, { id: 3, word: "pyramid", action: "flag" }, { id: 4, word: "scheme", action: "flag" }, { id: 5, word: "coupon", action: "require_approval" }, - { id: 6, word: '', action: "block" } + { id: 6, word: '', action: "block" }, + { + id: 7, + word: "hi", + regexp: "hi", + replacement: "hello", + action: "replace", + }, + { + id: 8, + word: "hello", + regexp: "hello", + replacement: "greeting", + action: "tag", + }, ], - compiled_regular_expressions: {} - } + compiled_regular_expressions: { + block: '(?:\\W|^)(liquorice|anise|)(?=\\W|$)', + censor: null, + require_approval: "(?:\\W|^)(coupon)(?=\\W|$)", + flag: "(?:\\W|^)(pyramid|scheme)(?=\\W|$)", + replace: "(?:\\W|^)(hi)(?=\\W|$)", + tag: "(?:\\W|^)(hello)(?=\\W|$)", + }, + }, }; diff --git a/app/assets/stylesheets/common/admin/staff_logs.scss b/app/assets/stylesheets/common/admin/staff_logs.scss index 4c9c9958470b9..8b5c1e37cc66a 100644 --- a/app/assets/stylesheets/common/admin/staff_logs.scss +++ b/app/assets/stylesheets/common/admin/staff_logs.scss @@ -330,9 +330,20 @@ table.screened-ip-addresses { width: 250px; margin-bottom: 1em; vertical-align: top; +} + +.watched-word-box, +.watched-words-test-modal { .replacement { white-space: pre; - background-color: var(--tertiary-low); + background: var(--tertiary-low); + } + + .tag { + background: var(--primary-low); + font-size: $font-down-1; + margin-right: 0.1em; + padding: 0.5em; } } @@ -385,9 +396,6 @@ table.screened-ip-addresses { input.watched-word-input-field { min-width: 300px; } - input.watched-word-input-replace { - min-width: 260px; - } } // Search logs diff --git a/app/serializers/watched_word_serializer.rb b/app/serializers/watched_word_serializer.rb index 0a73b4a2a3200..6cc7972f0c993 100644 --- a/app/serializers/watched_word_serializer.rb +++ b/app/serializers/watched_word_serializer.rb @@ -1,7 +1,15 @@ # frozen_string_literal: true class WatchedWordSerializer < ApplicationSerializer - attributes :id, :word, :replacement, :action + attributes :id, :word, :regexp, :replacement, :action + + def regexp + WordWatcher.word_to_regexp(word) + end + + def include_regexp? + WatchedWord.has_replacement?(action) + end def action WatchedWord.actions[object.action] diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index ba78980f2c83f..5d6f24931d787 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -4728,7 +4728,7 @@ en: upload_successful: "Upload successful. Words have been added." test: button_label: "Test" - modal_title: "Test '%{action}' Watched Words" + modal_title: "Test %{action} Watched Words" description: "Enter text below to check for matches with watched words" found_matches: "Found matches:" no_matches: "No matches found" From ab234121137d65ac9bf0f4defe3a1fbef703d081 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 21 May 2021 14:53:17 +0100 Subject: [PATCH 035/689] DEV: Only mount top-level plugin symlinks Sometimes plugins directories will end up with other symlinks (e.g. inside node_modules folders). This logic does not work with deeply nested symlinks, and they are unlikely to be necessary for the plugin to work. Therefore we should only look for symlinks in the top-level of the `plugins` directory --- bin/docker/boot_dev | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/docker/boot_dev b/bin/docker/boot_dev index 596e03f115c15..948c08a9cd521 100755 --- a/bin/docker/boot_dev +++ b/bin/docker/boot_dev @@ -66,7 +66,7 @@ echo "Using data in: ${DATA_DIR}" mkdir -p "${DATA_DIR}" mount_plugin_symlinks="" -for symlink in $(find $PLUGINS_DIR -type l); do +for symlink in $(find $PLUGINS_DIR -depth 1 -type l); do # `readlink -f` doesn't work on macOS, to fix it you need to override the `readlink` with `greadlink` # > brew install coreutils # > ln -s "$(which greadlink)" "$(dirname "$(which greadlink)")/readlink" From 73050d9049e4aab1a993ccb37855c9c9d08669f3 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 21 May 2021 16:24:09 +0100 Subject: [PATCH 036/689] DEV: Update docker development binstubs - Add `d/ember-cli`, and publish port 4200 - Remove `d/sidekiq`. Sidekiq is now started with the rails server - Move all `docker exec` logic into a single place, so we have one place to set environment variable pass-throughs - Use `exec` for all bash scripts, so that return statuses are passed back correctly - Avoid using `bin/bash -c` unnecessarily, because it makes escaping arguments difficult --- bin/docker/boot_dev | 1 + bin/docker/bundle | 4 +--- bin/docker/discourse | 4 +--- bin/docker/ember-cli | 3 +++ bin/docker/exec | 13 +++++++++++++ bin/docker/mailcatcher | 3 +-- bin/docker/migrate | 7 +++---- bin/docker/psql | 4 +--- bin/docker/rails | 9 +-------- bin/docker/rake | 4 +--- bin/docker/rspec | 4 +--- bin/docker/shell | 3 ++- bin/docker/shell_root | 3 ++- bin/docker/sidekiq | 5 ----- bin/docker/unicorn | 9 +-------- 15 files changed, 32 insertions(+), 44 deletions(-) create mode 100755 bin/docker/ember-cli create mode 100755 bin/docker/exec delete mode 100755 bin/docker/sidekiq diff --git a/bin/docker/boot_dev b/bin/docker/boot_dev index 948c08a9cd521..0eccb43484cdf 100755 --- a/bin/docker/boot_dev +++ b/bin/docker/boot_dev @@ -86,6 +86,7 @@ docker pull discourse/discourse_dev:release docker run -d \ -p $local_publish:1080:1080 \ -p $local_publish:3000:3000 \ + -p $local_publish:4200:4200 \ -p $local_publish:9292:9292 \ -p $local_publish:9405:9405 \ -v "$DATA_DIR:/shared/postgres_data:delegated" \ diff --git a/bin/docker/bundle b/bin/docker/bundle index 73d39aba5ff10..82b527d037386 100755 --- a/bin/docker/bundle +++ b/bin/docker/bundle @@ -1,5 +1,3 @@ #!/bin/bash -PARAMS="$@" -CMD="cd /src && USER=discourse RAILS_ENV=${RAILS_ENV:=development} bundle $PARAMS" -docker exec -it -u discourse:discourse discourse_dev /bin/bash -c "$CMD" +exec "$(dirname "$0")/exec" bundle "$@" diff --git a/bin/docker/discourse b/bin/docker/discourse index 3ae9852f6dc31..1ccafcfd0fd3b 100755 --- a/bin/docker/discourse +++ b/bin/docker/discourse @@ -1,5 +1,3 @@ #!/bin/bash -PARAMS="$@" -CMD="cd /src && USER=discourse RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 LD_PRELOAD=/usr/lib/libjemalloc.so RAILS_ENV=${RAILS_ENV:=development} script/discourse $PARAMS" -docker exec -it -u discourse:discourse discourse_dev /bin/bash -c "$CMD" +exec "$(dirname "$0")/exec" script/discourse "$@" diff --git a/bin/docker/ember-cli b/bin/docker/ember-cli new file mode 100755 index 0000000000000..7a843ee41088d --- /dev/null +++ b/bin/docker/ember-cli @@ -0,0 +1,3 @@ +#!/bin/bash + +exec "$(dirname "$0")/exec" bin/ember-cli "$@" diff --git a/bin/docker/exec b/bin/docker/exec new file mode 100755 index 0000000000000..cdd16a86984ad --- /dev/null +++ b/bin/docker/exec @@ -0,0 +1,13 @@ +#!/bin/bash + +exec docker exec \ + -it \ + -u discourse:discourse \ + -w '/src' \ + -e RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 \ + -e LD_PRELOAD=/usr/lib/libjemalloc.so \ + -e RAILS_ENV \ + -e NO_EMBER_CLI \ + -e QUNIT_RAILS_ENV \ + discourse_dev \ + "$@" diff --git a/bin/docker/mailcatcher b/bin/docker/mailcatcher index 385dcbb727e74..d94e5375c0a05 100755 --- a/bin/docker/mailcatcher +++ b/bin/docker/mailcatcher @@ -1,4 +1,3 @@ #!/bin/bash -CMD="USER=discourse mailcatcher --http-ip 0.0.0.0 -f" -docker exec -it discourse_dev /bin/bash -c "$CMD" +exec "$(dirname "$0")/exec" mailcatcher --http-ip 0.0.0.0 -f diff --git a/bin/docker/migrate b/bin/docker/migrate index be9e9ebd92a78..066e07f13d52a 100755 --- a/bin/docker/migrate +++ b/bin/docker/migrate @@ -1,6 +1,5 @@ #!/bin/bash +set -e -CMD="cd /src && USER=discourse RAILS_ENV=development rake db:migrate" -docker exec -it -u discourse:discourse discourse_dev /bin/bash -c "$CMD" -CMD="cd /src && USER=discourse RAILS_ENV=test rake db:migrate" -docker exec -it -u discourse:discourse discourse_dev /bin/bash -c "$CMD" +"$(dirname "$0")/exec" bin/rake db:migrate +RAILS_ENV=test "$(dirname "$0")/exec" bin/rake db:migrate diff --git a/bin/docker/psql b/bin/docker/psql index c25c840b79c14..43194cd250fd4 100755 --- a/bin/docker/psql +++ b/bin/docker/psql @@ -1,5 +1,3 @@ #!/bin/bash -PARAMS="$@" -CMD="USER=discourse psql $PARAMS" -docker exec -it -u postgres discourse_dev /bin/bash -c "$CMD" +exec "$(dirname "$0")/exec" psql "$@" diff --git a/bin/docker/rails b/bin/docker/rails index 4836d47eeb990..32dba7dd2da18 100755 --- a/bin/docker/rails +++ b/bin/docker/rails @@ -1,10 +1,3 @@ #!/bin/bash -PARAMS="$@" -if [[ $# = 1 ]] && [[ "$1" =~ "s" ]]; -then - PARAMS="$PARAMS -b 0.0.0.0" -fi - -CMD="cd /src && USER=discourse RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 LD_PRELOAD=/usr/lib/libjemalloc.so RACK_HANDLER=puma RAILS_ENV=${RAILS_ENV:=development} rails $PARAMS" -docker exec -it -u discourse:discourse discourse_dev /bin/bash -c "$CMD" +exec "$(dirname "$0")/exec" bin/rails "$@" diff --git a/bin/docker/rake b/bin/docker/rake index b1b73b7c95be6..95e030b9e79d7 100755 --- a/bin/docker/rake +++ b/bin/docker/rake @@ -1,5 +1,3 @@ #!/bin/bash -PARAMS="$@" -CMD="cd /src && USER=discourse RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 LD_PRELOAD=/usr/lib/libjemalloc.so RAILS_ENV=${RAILS_ENV:=development} bundle exec rake $PARAMS" -docker exec -it -u discourse:discourse discourse_dev /bin/bash -c "$CMD" +exec "$(dirname "$0")/exec" bin/rake "$@" diff --git a/bin/docker/rspec b/bin/docker/rspec index c1c616f069431..0dadb7c019a43 100755 --- a/bin/docker/rspec +++ b/bin/docker/rspec @@ -1,5 +1,3 @@ #!/bin/bash -PARAMS="$@" -CMD="cd /src && USER=discourse RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 LD_PRELOAD=/usr/lib/libjemalloc.so RAILS_ENV=${RAILS_ENV:=test} bin/rspec $PARAMS" -docker exec -it -u discourse:discourse discourse_dev /bin/bash -c "$CMD" +exec "$(dirname "$0")/exec" bin/rspec "$@" diff --git a/bin/docker/shell b/bin/docker/shell index 5f3d78cff2a9f..29030df7acd10 100755 --- a/bin/docker/shell +++ b/bin/docker/shell @@ -1,2 +1,3 @@ #!/bin/bash -docker exec -it -u discourse:discourse discourse_dev /bin/bash + +exec "$(dirname "$0")/exec" /bin/bash "$@" diff --git a/bin/docker/shell_root b/bin/docker/shell_root index 930cb78ed0c0b..a0b264894ecf9 100755 --- a/bin/docker/shell_root +++ b/bin/docker/shell_root @@ -1,2 +1,3 @@ #!/bin/bash -docker exec -it discourse_dev /bin/bash + +exec docker exec -it discourse_dev /bin/bash diff --git a/bin/docker/sidekiq b/bin/docker/sidekiq deleted file mode 100755 index 0919990713f93..0000000000000 --- a/bin/docker/sidekiq +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -PARAMS="$@" -CMD="cd /src && USER=discourse RAILS_ENV=${RAILS_ENV:=development} bundle exec sidekiq -q critical -q low -q default -q ultra_low" -docker exec -it -u discourse:discourse discourse_dev /bin/bash -c "$CMD" diff --git a/bin/docker/unicorn b/bin/docker/unicorn index ba615c0954948..6dd548e124272 100755 --- a/bin/docker/unicorn +++ b/bin/docker/unicorn @@ -1,10 +1,3 @@ #!/bin/bash -PARAMS="$@" -if [[ $# = 1 ]] && [[ "$1" =~ "s" ]]; -then - PARAMS="$PARAMS -b 0.0.0.0" -fi - -CMD="cd /src && USER=discourse RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 LD_PRELOAD=/usr/lib/libjemalloc.so RAILS_ENV=${RAILS_ENV:=development} bin/unicorn $PARAMS" -docker exec -it -u discourse:discourse discourse_dev /bin/bash -c "$CMD" +exec "$(dirname "$0")/exec" bin/unicorn "$@" From 78f9d47ab140b949398c3cabf425b65243494739 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 21 May 2021 16:01:59 +0100 Subject: [PATCH 037/689] DEV: Add non-x86_64 warning to `d/boot_dev` Running a development environment using Docker's qemu architecture emulation is currently not possible because `inotify` is not supported: https://github.com/docker/for-mac/issues/5321 --- bin/docker/boot_dev | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/bin/docker/boot_dev b/bin/docker/boot_dev index 0eccb43484cdf..52b6353809e44 100755 --- a/bin/docker/boot_dev +++ b/bin/docker/boot_dev @@ -60,6 +60,13 @@ while [ "${#@}" -ne "0" ]; do shift done +if [[ $(docker info -f "{{.Architecture}}") != *x86_64* ]]; then + echo "WARNING: Docker architecture is not x86_64." + echo "Discourse development is unlikely to work using Docker's architecture emulation." + echo "Please try a native development installation." + sleep 1 +fi + echo "Using source in: ${SOURCE_DIR}" echo "Using data in: ${DATA_DIR}" From a5dd24c4458edbe2ec28a7e367d4400202aa9586 Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Fri, 21 May 2021 19:58:18 +0400 Subject: [PATCH 038/689] DEV: fix warnings 'Hbs template must be compiled and not a string' in tests (#13116) These warnings appeared only when running tests using Ember CLI. --- .../tests/integration/components/slow-mode-info-test.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/discourse/tests/integration/components/slow-mode-info-test.js b/app/assets/javascripts/discourse/tests/integration/components/slow-mode-info-test.js index 632d2d6363b0d..25f302b0343ad 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/slow-mode-info-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/slow-mode-info-test.js @@ -6,6 +6,7 @@ import { exists, queryAll, } from "discourse/tests/helpers/qunit-helpers"; +import hbs from "htmlbars-inline-precompile"; discourseModule("Integration | Component | slow-mode-info", function (hooks) { setupRenderingTest(hooks); @@ -23,7 +24,7 @@ discourseModule("Integration | Component | slow-mode-info", function (hooks) { }); componentTest("doesn't render if the slow mode is disabled", { - template: "{{slow-mode-info topic=topic}}", + template: hbs`{{slow-mode-info topic=topic}}`, beforeEach() { this.set("topic", { slow_mode_seconds: 0, closed: false }); @@ -35,7 +36,7 @@ discourseModule("Integration | Component | slow-mode-info", function (hooks) { }); componentTest("renders if slow mode is enabled", { - template: "{{slow-mode-info topic=topic}}", + template: hbs`{{slow-mode-info topic=topic}}`, beforeEach() { this.set("topic", { slow_mode_seconds: 3600, closed: false }); @@ -47,7 +48,7 @@ discourseModule("Integration | Component | slow-mode-info", function (hooks) { }); componentTest("staff and TL4 users can disable slow mode", { - template: "{{slow-mode-info topic=topic user=user}}", + template: hbs`{{slow-mode-info topic=topic user=user}}`, beforeEach() { this.setProperties({ @@ -62,7 +63,7 @@ discourseModule("Integration | Component | slow-mode-info", function (hooks) { }); componentTest("regular users can't disable slow mode", { - template: "{{slow-mode-info topic=topic user=user}}", + template: hbs`{{slow-mode-info topic=topic user=user}}`, beforeEach() { this.setProperties({ From 292017dd25aa4bfe445239f6c3863b8ae2041b4d Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Mon, 24 May 2021 09:10:22 +1000 Subject: [PATCH 039/689] FIX: Do not call :post_edited webhook twice when editing OP (#13112) When editing the first post for the topic we do two AJAX requests to two separate controllers in this order: PUT /t/topic-name PUT /posts/2489523 This causes two post revisor calls, which end up triggering the :post_edited DiscourseEvent twice. This is then picked up and sent as a WebHook event twice. However we do not need to send a :post_edited webhook event if the first post is being edited and topic_changed is true from the :post_edited DiscourseEvent, because a second event will shortly come through for just the post. See https://meta.discourse.org/t/post-webhook-fires-two-times-on-post-edited-for-first-post-in-a-topic/162408 Continued on from https://github.com/discourse/discourse/pull/10590 --- config/initializers/012-web_hook_events.rb | 9 +++++- lib/post_revisor.rb | 2 +- spec/models/web_hook_spec.rb | 3 +- spec/requests/topics_controller_spec.rb | 34 +++++++++++++++++++++- 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/config/initializers/012-web_hook_events.rb b/config/initializers/012-web_hook_events.rb index 942260c85ce06..809967bbd11d3 100644 --- a/config/initializers/012-web_hook_events.rb +++ b/config/initializers/012-web_hook_events.rb @@ -27,10 +27,17 @@ DiscourseEvent.on(:post_edited) do |post, topic_changed| unless post.topic&.trashed? - WebHook.enqueue_post_hooks(:post_edited, post) + # if we are editing the OP and the topic is changed, do not send + # the post_edited event -- this event is sent separately because + # when we update the OP in the UI we send two API calls in this order: + # + # PUT /t/topic-name + # PUT /post/243552 if post.is_first_post? && topic_changed WebHook.enqueue_topic_hooks(:topic_edited, post.topic) + else + WebHook.enqueue_post_hooks(:post_edited, post) end end end diff --git a/lib/post_revisor.rb b/lib/post_revisor.rb index 571cf94a5752d..cbd5f71a5e5e6 100644 --- a/lib/post_revisor.rb +++ b/lib/post_revisor.rb @@ -170,7 +170,7 @@ def revise!(editor, fields, opts = {}) @validate_topic = true @validate_topic = @opts[:validate_topic] if @opts.has_key?(:validate_topic) - @validate_topic = !@opts[:validate_topic] if @opts.has_key?(:skip_validations) + @validate_topic = !@opts[:skip_validations] if @opts.has_key?(:skip_validations) @skip_revision = false @skip_revision = @opts[:skip_revision] if @opts.has_key?(:skip_revision) diff --git a/spec/models/web_hook_spec.rb b/spec/models/web_hook_spec.rb index 570ba6a95c69f..73ef8c913aefc 100644 --- a/spec/models/web_hook_spec.rb +++ b/spec/models/web_hook_spec.rb @@ -197,7 +197,8 @@ expect do PostRevisor.new(post, post.topic).revise!( post.user, - category_id: category.id, + { category_id: category.id }, + { skip_validations: true }, ) end.to change { Jobs::EmitWebHookEvent.jobs.length }.by(1) diff --git a/spec/requests/topics_controller_spec.rb b/spec/requests/topics_controller_spec.rb index bd4e31e293817..684a860849314 100644 --- a/spec/requests/topics_controller_spec.rb +++ b/spec/requests/topics_controller_spec.rb @@ -1268,12 +1268,44 @@ def topic_user_post_timings_count(user, topic) topic.reload expect(topic.title).to eq('This is a new title for the topic') + # emits a topic_edited event but not a post_edited web hook event + expect(Jobs::EmitWebHookEvent.jobs.length).to eq(1) + job_args = Jobs::EmitWebHookEvent.jobs[0]["args"].first + + expect(job_args["event_name"]).to eq("topic_edited") + payload = JSON.parse(job_args["payload"]) + expect(payload["title"]).to eq('This is a new title for the topic') + end + + it 'allows a change of then updating the OP' do + topic.update(user: user) + topic.first_post.update(user: user) + + put "/t/#{topic.slug}/#{topic.id}.json", params: { + title: 'This is a new title for the topic' + } + + topic.reload + expect(topic.title).to eq('This is a new title for the topic') + + update_params = { + post: { raw: 'edited body', edit_reason: 'typo' }, + } + put "/posts/#{topic.first_post.id}.json", params: update_params + + # emits a topic_edited event and a post_edited web hook event expect(Jobs::EmitWebHookEvent.jobs.length).to eq(2) job_args = Jobs::EmitWebHookEvent.jobs[0]["args"].first + expect(job_args["event_name"]).to eq("topic_edited") + payload = JSON.parse(job_args["payload"]) + expect(payload["title"]).to eq('This is a new title for the topic') + + job_args = Jobs::EmitWebHookEvent.jobs[1]["args"].first + expect(job_args["event_name"]).to eq("post_edited") payload = JSON.parse(job_args["payload"]) - expect(payload["topic_title"]).to eq('This is a new title for the topic') + expect(payload["raw"]).to eq("edited body") end it "returns errors with invalid titles" do From 5145a35ccca72684cd79c7005307b3c3723e4f6d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 May 2021 01:31:47 +0200 Subject: [PATCH 040/689] Build(deps): Bump puma from 5.3.1 to 5.3.2 (#13119) Bumps [puma](https://github.com/puma/puma) from 5.3.1 to 5.3.2. - [Release notes](https://github.com/puma/puma/releases) - [Changelog](https://github.com/puma/puma/blob/master/History.md) - [Commits](https://github.com/puma/puma/compare/v5.3.1...v5.3.2) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 834d3b0221d1e..923c2fb56a698 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -300,7 +300,7 @@ GEM pry-rails (0.3.9) pry (>= 0.10.4) public_suffix (4.0.6) - puma (5.3.1) + puma (5.3.2) nio4r (~> 2.0) r2 (0.2.7) racc (1.5.2) From 5a8cb8f2e91542f9e26dbd53d6d6d95bfd81efd4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 May 2021 01:31:58 +0200 Subject: [PATCH 041/689] Build(deps): Bump faraday from 1.4.1 to 1.4.2 (#13120) Bumps [faraday](https://github.com/lostisland/faraday) from 1.4.1 to 1.4.2. - [Release notes](https://github.com/lostisland/faraday/releases) - [Changelog](https://github.com/lostisland/faraday/blob/main/CHANGELOG.md) - [Commits](https://github.com/lostisland/faraday/compare/v1.4.1...v1.4.2) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 923c2fb56a698..00e8154c2463c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -141,12 +141,16 @@ GEM faker (2.18.0) i18n (>= 1.6, < 2) fakeweb (1.3.0) - faraday (1.4.1) + faraday (1.4.2) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) faraday-net_http (~> 1.0) faraday-net_http_persistent (~> 1.1) multipart-post (>= 1.2, < 3) ruby2_keywords (>= 0.0.4) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) faraday-excon (1.1.0) faraday-net_http (1.0.1) faraday-net_http_persistent (1.1.0) From a39debd7b026bcce5ea058c504d6e3e1c3969105 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 May 2021 01:32:04 +0200 Subject: [PATCH 042/689] Build(deps): Bump ffi from 1.15.0 to 1.15.1 (#13121) Bumps [ffi](https://github.com/ffi/ffi) from 1.15.0 to 1.15.1. - [Release notes](https://github.com/ffi/ffi/releases) - [Changelog](https://github.com/ffi/ffi/blob/master/CHANGELOG.md) - [Commits](https://github.com/ffi/ffi/compare/v1.15.0...v1.15.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 00e8154c2463c..02c9870dc0648 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -157,7 +157,7 @@ GEM fast_blank (1.0.0) fast_xs (0.8.0) fastimage (2.2.3) - ffi (1.15.0) + ffi (1.15.1) fspath (3.1.2) gc_tracer (1.5.1) globalid (0.4.2) From 7c29ff3d85606d55feb8fd0255a63283100d8678 Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Mon, 24 May 2021 05:38:42 +0300 Subject: [PATCH 043/689] FEATURE: Add tasks to export and import site structure (#12584) --- lib/tasks/site.rake | 491 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 491 insertions(+) create mode 100644 lib/tasks/site.rake diff --git a/lib/tasks/site.rake b/lib/tasks/site.rake new file mode 100644 index 0000000000000..4f168ada1320c --- /dev/null +++ b/lib/tasks/site.rake @@ -0,0 +1,491 @@ +# frozen_string_literal: true + +require 'yaml' +require 'zip' + +class ZippedSiteStructure + attr_reader :zip + + def initialize(path, create: false) + @zip = Zip::File.open(path, create) + end + + def close + @zip.close + end + + def set(name, data) + @zip.get_output_stream("#{name}.json") do |file| + file.write(data.to_json) + end + end + + def get(name) + data = @zip.get_input_stream("#{name}.json").read + JSON.parse(data) + end + + def set_upload(upload_or_id_or_url) + return nil if upload_or_id_or_url.blank? + + if Integer === upload_or_id_or_url + upload = Upload.find_by(id: upload_or_id_or_url) + elsif String === upload_or_id_or_url + upload = Upload.get_from_url(upload_or_id_or_url) + elsif Upload === upload_or_id_or_url + upload = upload_or_id_or_url + end + + if !upload + STDERR.puts "ERROR: Could not find upload #{upload_or_id_or_url.inspect}" + return nil + end + + local_path = upload.local? ? Discourse.store.path_for(upload) : Discourse.store.download(upload).path + zip_path = File.join('uploads', File.basename(local_path)) + + puts " - Exporting upload #{upload_or_id_or_url} to #{zip_path}" + @zip.add(zip_path, local_path) + + { filename: upload.original_filename, path: file_zip_path } + end + + def get_upload(upload, opts = {}) + return nil if upload.blank? + + puts " - Importing upload #{upload['filename']} from #{upload['path']}" + + tempfile = Tempfile.new(upload['filename'], binmode: true) + tempfile.write(@zip.get_input_stream(upload['path']).read) + tempfile.rewind + + UploadCreator.new(tempfile, upload['filename'], opts) + .create_for(Discourse::SYSTEM_USER_ID) + end +end + +desc 'Exports site structure (settings, groups, categories, tags, themes, etc) to a ZIP file' +task 'site:export_structure', [:zip_path] => :environment do |task, args| + if args[:zip_path].blank? + STDERR.puts "ERROR: rake site:export_structure[]" + exit 1 + elsif File.exists?(args[:zip_path]) + STDERR.puts "ERROR: File '#{args[:zip_path]}' already exists" + exit 2 + end + + data = ZippedSiteStructure.new(args[:zip_path], create: true) + + puts + puts "Exporting site settings" + puts + + settings = {} + + SiteSetting.all_settings(include_hidden: true).each do |site_setting| + next if site_setting[:default] == site_setting[:value] + + puts "- Site setting #{site_setting[:setting]} -> #{site_setting[:value].inspect}" + + settings[site_setting[:setting]] = if site_setting[:type] == 'upload' + data.set_upload(site_setting[:value]) + else + site_setting[:value] + end + end + + data.set('site_settings', settings) + + puts + puts "Exporting users" + puts + + users = [] + + User.real.where(admin: true).each do |u| + puts "- User #{u.username}" + + users << { + username: u.username, + name: u.name, + email: u.email, + active: u.active, + admin: u.admin, + } + end + + data.set('users', users) + + puts + puts "Exporting groups" + puts + + groups = [] + + Group.where(automatic: false).each do |g| + puts "- Group #{g.name}" + + groups << { + name: g.name, + automatic_membership_email_domains: g.automatic_membership_email_domains, + primary_group: g.primary_group, + title: g.title, + grant_trust_level: g.grant_trust_level, + incoming_email: g.incoming_email, + has_messages: g.has_messages, + flair_bg_color: g.flair_bg_color, + flair_color: g.flair_color, + bio_raw: g.bio_raw, + allow_membership_requests: g.allow_membership_requests, + full_name: g.full_name, + default_notification_level: g.default_notification_level, + visibility_level: g.visibility_level, + public_exit: g.public_exit, + public_admission: g.public_admission, + membership_request_template: g.membership_request_template, + messageable_level: g.messageable_level, + mentionable_level: g.mentionable_level, + publish_read_state: g.publish_read_state, + members_visibility_level: g.members_visibility_level, + flair_icon: g.flair_icon, + flair_upload_id: data.set_upload(g.flair_upload_id), + allow_unknown_sender_topic_replies: g.allow_unknown_sender_topic_replies, + } + end + + data.set('groups', groups) + + puts + puts "Exporting categories" + puts + + categories = [] + + Category.find_each do |c| + puts "- Category #{c.name} (#{c.slug})" + + categories << { + name: c.name, + color: c.color, + slug: c.slug, + description: c.description, + text_color: c.text_color, + read_restricted: c.read_restricted, + auto_close_hours: c.auto_close_hours, + parent_category: c.parent_category&.slug, + position: c.position, + email_in: c.email_in, + email_in_allow_strangers: c.email_in_allow_strangers, + allow_badges: c.allow_badges, + auto_close_based_on_last_post: c.auto_close_based_on_last_post, + topic_template: c.topic_template, + sort_order: c.sort_order, + sort_ascending: c.sort_ascending, + uploaded_logo_id: data.set_upload(c.uploaded_logo_id), + uploaded_background_id: data.set_upload(c.uploaded_background_id), + topic_featured_link_allowed: c.topic_featured_link_allowed, + all_topics_wiki: c.all_topics_wiki, + show_subcategory_list: c.show_subcategory_list, + default_view: c.default_view, + subcategory_list_style: c.subcategory_list_style, + default_top_period: c.default_top_period, + mailinglist_mirror: c.mailinglist_mirror, + minimum_required_tags: c.minimum_required_tags, + navigate_to_first_post_after_read: c.navigate_to_first_post_after_read, + search_priority: c.search_priority, + allow_global_tags: c.allow_global_tags, + read_only_banner: c.read_only_banner, + default_list_filter: c.default_list_filter, + permissions: c.permissions_params, + } + end + + data.set('categories', categories) + + puts + puts "Exporting tag groups" + puts + + tag_groups = [] + + TagGroup.all.each do |tg| + puts "- Tag group #{tg.name}" + + tag_groups << { + name: tg.name, + tag_names: tg.tags.map(&:name) + } + end + + data.set('tag_groups', tag_groups) + + puts + puts "Exporting tags" + puts + + tags = [] + + Tag.find_each do |t| + puts "- Tag #{t.name}" + + tag = { name: t.name } + tag[:target_tag] = t.target_tag.name if t.target_tag.present? + + tags << tag + end + + data.set('tags', tags) + + puts + puts "Exporting themes and theme components" + puts + + themes = [] + + Theme.find_each do |theme| + puts "- Theme #{theme.name}" + + if theme.remote_theme.present? + themes << { + name: theme.name, + url: theme.remote_theme.remote_url, + private_key: theme.remote_theme.private_key, + branch: theme.remote_theme.branch + } + else + exporter = ThemeStore::ZipExporter.new(theme) + file_path = exporter.package_filename + file_zip_path = File.join('themes', File.basename(file_path)) + data.zip.add(file_zip_path, file_path) + themes << { name: theme.name, filename: File.basename(file_path), path: file_zip_path } + end + end + + data.set('themes', themes) + + puts + puts "Exporting theme settings" + puts + + theme_settings = [] + + ThemeSetting.find_each do |theme_setting| + puts "- Theme setting #{theme_setting.name} -> #{theme_setting.value}" + + value = if theme_setting.data_type == ThemeSetting.types[:upload] + data.set_upload(theme_setting.value) + else + theme_setting.value + end + + theme_settings << { + name: theme_setting.name, + data_type: theme_setting.data_type, + value: value, + theme: theme_setting.theme.name, + } + end + + data.set('theme_settings', theme_settings) + + puts + puts "Done" + puts + + data.close +end + +desc 'Imports site structure from a ZIP file exported by site:export_structure' +task 'site:import_structure', [:zip_path] => :environment do |task, args| + if args[:zip_path].blank? + STDERR.puts "ERROR: rake site:import_structure[]" + exit 1 + elsif !File.exists?(args[:zip_path]) + STDERR.puts "ERROR: File '#{args[:zip_path]}' does not exist" + exit 2 + end + + data = ZippedSiteStructure.new(args[:zip_path]) + + puts + puts "Importing site settings" + puts + + settings = data.get('site_settings') + imported_settings = Set.new + + 3.times.each do |try| + puts "Loading site settings (try ##{try})" + + settings.each do |key, value| + next if imported_settings.include?(key) + + begin + if SiteSetting.type_supervisor.get_type(key) == :upload + value = data.get_upload(value, for_site_setting: true) + end + + if SiteSetting.public_send(key) != value + puts "- Site setting #{key} -> #{value}" + SiteSetting.set_and_log(key, value) + end + + imported_settings << key + rescue => e + next if try < 2 + + STDERR.puts "ERROR: Cannot set #{key} to #{value}" + puts e.backtrace + end + end + end + + puts + puts "Importing users" + puts + + data.get('users').each do |u| + puts "- User #{u['username']}" + + begin + user = User.find_or_initialize_by(username: u.delete('username')) + user.update!(u) + rescue => e + STDERR.puts "ERROR: Cannot import user: #{e.message}" + puts e.backtrace + end + end + + puts + puts "Importing groups" + puts + + data.get('groups').each do |g| + puts "- Group #{g['name']}" + + begin + group = Group.find_or_initialize_by(name: g.delete('name')) + group.update!(g) + rescue => e + STDERR.puts "ERROR: Cannot import group: #{e.message}" + puts e.backtrace + end + end + + puts + puts "Importing categories" + puts + + data.get('categories').each do |c| + puts "- Category #{c['name']} (#{c['slug']})" + + begin + category = Category.find_or_initialize_by(slug: c.delete('slug')) + category.user ||= Discourse.system_user + category.parent_category = Category.find_by(slug: c.delete('parent_category')) + category.permissions = c.delete('permissions') + category.update!(c) + rescue => e + STDERR.puts "ERROR: Cannot import category: #{e.message}" + puts e.backtrace + end + end + + puts + puts "Importing tag groups" + puts + + data.get('tag_groups').each do |tg| + puts "- Tag group #{tg['name']}" + + tag_group = TagGroup.find_or_initialize_by(name: tg.delete('name')) + tag_group.update!(tg) + end + + puts + puts "Importing tags" + puts + + data.get('tags').each do |t| + puts "- Tag #{t['name']}" + + if t['target_tag'].present? + begin + t['target_tag'] = Tag.find_or_create_by!(name: t.delete('target_tag')) + rescue => e + STDERR.puts "ERROR: Cannot import target tag: #{e.message}" + puts e.backtrace + end + end + + begin + tag = Tag.find_or_initialize_by(name: t.delete('name')) + tag.update!(t) + rescue => e + STDERR.puts "ERROR: Cannot import tag: #{e.message}" + puts e.backtrace + end + end + + puts + puts "Importing themes and theme components" + puts + + data.get('themes').each do |t| + puts "- Theme #{t['name']}" + + begin + if t['url'].present? + next if Theme.find_by(name: t['name']).present? + + RemoteTheme.import_theme( + t['url'], + Discourse.system_user, + private_key: t['private_key'], + branch: t['branch'] + ) + elsif t['filename'].present? + tempfile = Tempfile.new(t['filename'], binmode: true) + tempfile.write(data.zip.get_input_stream(t['path']).read) + tempfile.flush + + RemoteTheme.update_zipped_theme( + tempfile.path, + t['filename'], + user: Discourse.system_user, + theme_id: Theme.find_by(name: t['name'])&.id, + ) + end + rescue => e + STDERR.puts "ERROR: Cannot import theme: #{e.message}" + puts e.backtrace + end + end + + puts + puts "Importing theme settings" + puts + + data.get('theme_settings').each do |ts| + puts "- Theme setting #{ts['name']} -> #{ts['value']}" + + begin + if ts['data_type'] == ThemeSetting.types[:upload] + ts['value'] = data.get_upload(ts['value'], for_theme: true) + end + + ThemeSetting + .find_or_initialize_by(name: ts['name'], theme: Theme.find_by(name: ts['theme'])) + .update!(data_type: ts['data_type'], value: ts['value']) + rescue => e + STDERR.puts "ERROR: Cannot import theme setting: #{e.message}" + puts e.backtrace + end + end + + puts + puts "Done" + puts + + data.close +end From 567f9caf75e1cc1ad131e6c4fb832c553531edb0 Mon Sep 17 00:00:00 2001 From: Kris Date: Mon, 24 May 2021 04:10:01 -0400 Subject: [PATCH 044/689] A11Y: Fix post control and user-menu focus styles (#13118) --- .../stylesheets/common/base/menu-panel.scss | 15 +++++++++++++-- .../stylesheets/common/components/buttons.scss | 5 ++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/assets/stylesheets/common/base/menu-panel.scss b/app/assets/stylesheets/common/base/menu-panel.scss index 92b6058f7ec12..b94e1c03f11df 100644 --- a/app/assets/stylesheets/common/base/menu-panel.scss +++ b/app/assets/stylesheets/common/base/menu-panel.scss @@ -284,12 +284,23 @@ } } - &:hover, - &:focus { + &:hover { background-color: var(--highlight-medium); outline: none; } + &:focus-within { + background: var(--highlight-medium); + a { + // we don't need the link focus because we're styling the parent + outline: 0; + } + .btn-flat:focus { + // undo default btn-flat style + background: transparent; + } + } + a { display: flex; margin: 0.25em; diff --git a/app/assets/stylesheets/common/components/buttons.scss b/app/assets/stylesheets/common/components/buttons.scss index 0c6fd0789380b..82cc92e38c2de 100644 --- a/app/assets/stylesheets/common/components/buttons.scss +++ b/app/assets/stylesheets/common/components/buttons.scss @@ -299,10 +299,9 @@ &:focus { outline: none; - background: var(--primary-medium); - color: var(--secondary); + background: var(--primary-low); .d-icon { - color: var(--primary-low); + color: var(--primary); } } } From 332ae975556018a6a84cde5f741b3632b3bf84db Mon Sep 17 00:00:00 2001 From: Gerhard Schlager Date: Mon, 24 May 2021 10:13:30 +0200 Subject: [PATCH 045/689] FEATURE: Correctly convert topic title to uppercase and lowercase for Turkish default locale (#13115) --- lib/text_cleaner.rb | 30 ++++++++++++++++++++++++---- spec/components/text_cleaner_spec.rb | 8 ++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/lib/text_cleaner.rb b/lib/text_cleaner.rb index 09160f3f3efcd..0df1c099e13e2 100644 --- a/lib/text_cleaner.rb +++ b/lib/text_cleaner.rb @@ -20,7 +20,8 @@ def self.title_options remove_extraneous_space: SiteSetting.title_prettify && SiteSetting.title_remove_extraneous_space, fixes_interior_spaces: true, strip_whitespaces: true, - strip_zero_width_spaces: true + strip_zero_width_spaces: true, + case_option: SiteSetting.default_locale == "tr_TR" ? :turkic : nil } end @@ -33,27 +34,37 @@ def self.clean(text, opts = {}) # Remove invalid byte sequences text.scrub!("") + # Replace !!!!! with a single ! text.gsub!(/!+/, '!') if opts[:deduplicate_exclamation_marks] + # Replace ????? with a single ? text.gsub!(/\?+/, '?') if opts[:deduplicate_question_marks] + # Replace all-caps text with regular case letters - text = text.mb_chars.downcase.to_s if opts[:replace_all_upper_case] && (text == text.mb_chars.upcase) + text = downcase(text.mb_chars, opts).to_s if opts[:replace_all_upper_case] && (text == upcase(text.mb_chars, opts)) + # Capitalize first letter, but only when entire first word is lowercase first, rest = text.split(' ', 2) - if first && opts[:capitalize_first_letter] && first == first.mb_chars.downcase - text = +"#{first.mb_chars.capitalize}#{rest ? ' ' + rest : ''}" + if first && opts[:capitalize_first_letter] && first == downcase(first.mb_chars, opts) + text = +"#{capitalize(first.mb_chars, opts)}#{rest ? ' ' + rest : ''}" end + # Remove unnecessary periods at the end text.sub!(/([^.])\.+(\s*)\z/, '\1\2') if opts[:remove_all_periods_from_the_end] + # Remove extraneous space before the end punctuation text.sub!(/\s+([!?]\s*)\z/, '\1') if opts[:remove_extraneous_space] + # Fixes interior spaces text.gsub!(/ +/, ' ') if opts[:fixes_interior_spaces] + # Normalize whitespaces text = normalize_whitespaces(text) + # Strip whitespaces text.strip! if opts[:strip_whitespaces] + # Strip zero width spaces text.gsub!(/\u200b/, '') if opts[:strip_zero_width_spaces] @@ -66,4 +77,15 @@ def self.normalize_whitespaces(text) text&.gsub(@@whitespaces_regexp, ' ') end + def self.downcase(text, opts) + opts[:case_option] ? text.downcase(opts[:case_option]) : text.downcase + end + + def self.upcase(text, opts) + opts[:case_option] ? text.upcase(opts[:case_option]) : text.upcase + end + + def self.capitalize(text, opts) + opts[:case_option] ? text.capitalize(opts[:case_option]) : text.capitalize + end end diff --git a/spec/components/text_cleaner_spec.rb b/spec/components/text_cleaner_spec.rb index f529399170616..ad183a7011202 100644 --- a/spec/components/text_cleaner_spec.rb +++ b/spec/components/text_cleaner_spec.rb @@ -215,6 +215,14 @@ expect(TextCleaner.clean_title("épico encontro")).to eq("Épico encontro") end + it "correctly cleans Turkish characters" do + expect(TextCleaner.clean_title("GIDA")).to eq("Gida") + expect(TextCleaner.clean_title("istanbul")).to eq("Istanbul") + + SiteSetting.default_locale = "tr_TR" + expect(TextCleaner.clean_title("GIDA")).to eq("Gıda") + expect(TextCleaner.clean_title("istanbul")).to eq("İstanbul") + end end end From c62efc0f0fc08335bfe96350c91366426563f695 Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Mon, 24 May 2021 13:05:24 +0400 Subject: [PATCH 046/689] FIX: Ignore max excerpt length for div excerpts too (#13058) We support two types of custom excerpts. It can be
or : https://github.com/discourse/discourse/blob/b21f74060e865d809ba466cb52e6cb95c7b0cf1f/lib/excerpt_parser.rb#L120 We also ignore max excerpt length for custom excerpts. But we forgot to process div when ignoring max length. --- lib/excerpt_parser.rb | 4 ++-- spec/components/pretty_text_spec.rb | 14 ++++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/excerpt_parser.rb b/lib/excerpt_parser.rb index 27c78bc530e3e..d2708935de9be 100644 --- a/lib/excerpt_parser.rb +++ b/lib/excerpt_parser.rb @@ -4,7 +4,7 @@ class ExcerptParser < Nokogiri::XML::SAX::Document attr_reader :excerpt - SPAN_REGEX = /<\s*span[^>]*class\s*=\s*['|"]excerpt['|"][^>]*>/ + CUSTOM_EXCERPT_REGEX = /<\s*(span|div)[^>]*class\s*=\s*['"]excerpt['"][^>]*>/ def initialize(length, options = nil) @length = length @@ -29,7 +29,7 @@ def initialize(length, options = nil) def self.get_excerpt(html, length, options) html ||= '' - length = html.length if html.include?('excerpt') && SPAN_REGEX === html + length = html.length if html.include?('excerpt') && CUSTOM_EXCERPT_REGEX === html me = self.new(length, options) parser = Nokogiri::HTML::SAX::Parser.new(me) catch(:done) do diff --git a/spec/components/pretty_text_spec.rb b/spec/components/pretty_text_spec.rb index f884df702b489..0436849fe1a65 100644 --- a/spec/components/pretty_text_spec.rb +++ b/spec/components/pretty_text_spec.rb @@ -798,18 +798,24 @@ def extract_urls(text) expect(post.excerpt).to eq("hello site") end + it "handles div excerpt at the beginning of a post" do + expect(PrettyText.excerpt("
hi
test", 100)).to eq('hi') + end + it "handles span excerpt at the beginning of a post" do expect(PrettyText.excerpt("hi test", 100)).to eq('hi') - post = Fabricate(:post, raw: "hi test") - expect(post.excerpt).to eq("hi") + end + + it "ignores max excerpt length if a div excerpt is specified" do + two_hundred = "123456789 " * 20 + "." + text = two_hundred + "
#{two_hundred}
" + two_hundred + expect(PrettyText.excerpt(text, 100)).to eq(two_hundred) end it "ignores max excerpt length if a span excerpt is specified" do two_hundred = "123456789 " * 20 + "." text = two_hundred + "#{two_hundred}" + two_hundred expect(PrettyText.excerpt(text, 100)).to eq(two_hundred) - post = Fabricate(:post, raw: text) - expect(post.excerpt).to eq(two_hundred) end it "unescapes html entities when we want text entities" do From 93ae1b2b1ce866fe645552a316cbec7bb301fff6 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 24 May 2021 13:35:10 +0100 Subject: [PATCH 047/689] DEV: Default to `development` RAILS_ENV when running theme tests (#13106) When testing theme components in development, it doesn't make sense to use the `test` environment. The `test` environment almost certainly has 0 themes installed. This change still works fine when using the `themes:install_and_test` rake task, because that rake task explicitly specifies environment/database-config. --- lib/tasks/themes.rake | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/tasks/themes.rake b/lib/tasks/themes.rake index 83c1038a85538..f11a628bec5d6 100644 --- a/lib/tasks/themes.rake +++ b/lib/tasks/themes.rake @@ -114,6 +114,7 @@ task "themes:qunit", :type, :value do |t, args| MSG end ENV["THEME_#{type.upcase}"] = value.to_s + ENV["QUNIT_RAILS_ENV"] ||= 'development' # qunit:test will switch to `test` by default Rake::Task["qunit:test"].reenable Rake::Task["qunit:test"].invoke(1200000, "/theme-qunit") end From fc6e7dd3f1e62d07e4f96f96a0535af9ca4579d3 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 24 May 2021 17:35:51 +0100 Subject: [PATCH 048/689] DEV: Add `session` to `before_auth` and `after_auth` hooks (#13123) This allows plugins to store/modify things in the session (e.g. the destination_url). This change is backwards compatible with existing plugins. If they do not specify a third argument, they will just be passed the first two. --- app/controllers/users/omniauth_callbacks_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/users/omniauth_callbacks_controller.rb b/app/controllers/users/omniauth_callbacks_controller.rb index 2b702962c3829..7f17c3890c488 100644 --- a/app/controllers/users/omniauth_callbacks_controller.rb +++ b/app/controllers/users/omniauth_callbacks_controller.rb @@ -33,10 +33,10 @@ def complete Discourse.redis.setex "#{Users::AssociateAccountsController::REDIS_PREFIX}_#{current_user.id}_#{token}", 10.minutes, auth.to_json return redirect_to "#{Discourse.base_path}/associate/#{token}" else - DiscourseEvent.trigger(:before_auth, authenticator, auth) + DiscourseEvent.trigger(:before_auth, authenticator, auth, session) @auth_result = authenticator.after_authenticate(auth) @auth_result.user = nil if @auth_result&.user&.staged # Treat staged users the same as unregistered users - DiscourseEvent.trigger(:after_auth, authenticator, @auth_result) + DiscourseEvent.trigger(:after_auth, authenticator, @auth_result, session) end preferred_origin = request.env['omniauth.origin'] From ca809d2c40a75fa93b6a9a4d4dbc3b330b1aea13 Mon Sep 17 00:00:00 2001 From: Daniel Waterworth Date: Mon, 24 May 2021 11:46:57 -0500 Subject: [PATCH 049/689] FEATURE: Add on_preload for TopicView (#13122) This allows plugins to load data on fetched posts before each post is individually serialized. --- lib/topic_view.rb | 21 +++++++++++++++++++++ spec/components/topic_view_spec.rb | 17 +++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/lib/topic_view.rb b/lib/topic_view.rb index dcdec084bc790..160c504198606 100644 --- a/lib/topic_view.rb +++ b/lib/topic_view.rb @@ -4,6 +4,25 @@ class TopicView MEGA_TOPIC_POSTS_COUNT = 10000 MIN_POST_READ_TIME = 4.0 + def self.on_preload(&blk) + (@preload ||= Set.new) << blk + end + + def self.cancel_preload(&blk) + if @preload + @preload.delete blk + if @preload.length == 0 + @preload = nil + end + end + end + + def self.preload(topic_view) + if @preload + @preload.each { |preload| preload.call(topic_view) } + end + end + attr_reader( :topic, :posts, @@ -106,6 +125,8 @@ def initialize(topic_or_topic_id, user = nil, options = {}) end end + TopicView.preload(self) + @draft_key = @topic.draft_key @draft_sequence = DraftSequence.current(@user, @draft_key) diff --git a/spec/components/topic_view_spec.rb b/spec/components/topic_view_spec.rb index c4a104cd23ee8..d934128688e6d 100644 --- a/spec/components/topic_view_spec.rb +++ b/spec/components/topic_view_spec.rb @@ -15,6 +15,23 @@ let(:topic_view) { TopicView.new(topic.id, evil_trout) } + context "preload" do + it "allows preloading of data" do + preloaded_topic_view = nil + preloader = lambda do |view| + preloaded_topic_view = view + end + + TopicView.on_preload(&preloader) + + expect(preloaded_topic_view).to eq(nil) + topic_view + expect(preloaded_topic_view).to eq(topic_view) + + TopicView.cancel_preload(&preloader) + end + end + it "raises a not found error if the topic doesn't exist" do expect { TopicView.new(1231232, evil_trout) }.to raise_error(Discourse::NotFound) end From b66802ccf10ece7d8c983351f5a5975806b4567e Mon Sep 17 00:00:00 2001 From: Jeff Wong Date: Mon, 24 May 2021 09:33:21 -1000 Subject: [PATCH 050/689] DEV: add plugin hook to add topic participant classes (#13125) Allow plugins to add custom css classes to topic participants --- .../discourse/app/lib/plugin-api.js | 15 ++++++++++++- .../discourse/app/widgets/topic-map.js | 21 ++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/app/lib/plugin-api.js b/app/assets/javascripts/discourse/app/lib/plugin-api.js index 5778d700b86a8..5f8a2ff4c44cc 100644 --- a/app/assets/javascripts/discourse/app/lib/plugin-api.js +++ b/app/assets/javascripts/discourse/app/lib/plugin-api.js @@ -52,6 +52,7 @@ import { addPostSmallActionIcon } from "discourse/widgets/post-small-action"; import { addQuickAccessProfileItem } from "discourse/widgets/quick-access-profile"; import { addTagsHtmlCallback } from "discourse/lib/render-tags"; import { addToolbarCallback } from "discourse/components/d-editor"; +import { addTopicParticipantClassesCallback } from "discourse/widgets/topic-map"; import { addTopicTitleDecorator } from "discourse/components/topic-title"; import { addUserMenuGlyph } from "discourse/widgets/user-menu"; import { addUsernameSelectorDecorator } from "discourse/helpers/decorate-username-selector"; @@ -73,7 +74,7 @@ import { replaceTagRenderer } from "discourse/lib/render-tag"; import { setNewCategoryDefaultColors } from "discourse/routes/new-category"; // If you add any methods to the API ensure you bump up this number -const PLUGIN_API_VERSION = "0.11.3"; +const PLUGIN_API_VERSION = "0.11.4"; class PluginApi { constructor(version, container) { @@ -763,6 +764,18 @@ class PluginApi { addPostClassesCallback(callback); } + /** + * Adds a callback to be called before rendering a topic participant that + * that returns custom classes to add to the participant element + * + * Example: + * + * addTopicParticipantClassesCallback((attrs) => {if (attrs.primary_group_name == "moderator") return ["important-participant"];}) + **/ + addTopicParticipantClassesCallback(callback) { + addTopicParticipantClassesCallback(callback); + } + /** * * Adds a callback to be executed on the "transformed" post that is passed to the post diff --git a/app/assets/javascripts/discourse/app/widgets/topic-map.js b/app/assets/javascripts/discourse/app/widgets/topic-map.js index be9bf14d84eac..5db917edc74cd 100644 --- a/app/assets/javascripts/discourse/app/widgets/topic-map.js +++ b/app/assets/javascripts/discourse/app/widgets/topic-map.js @@ -40,11 +40,30 @@ createWidget("topic-map-show-links", { }, }); +let addTopicParticipantClassesCallbacks = null; +export function addTopicParticipantClassesCallback(callback) { + addTopicParticipantClassesCallbacks = + addTopicParticipantClassesCallbacks || []; + addTopicParticipantClassesCallbacks.push(callback); +} createWidget("topic-participant", { buildClasses(attrs) { + const classNames = []; if (attrs.primary_group_name) { - return `group-${attrs.primary_group_name}`; + classNames.push(`group-${attrs.primary_group_name}`); + } + if (addTopicParticipantClassesCallbacks) { + for (let i = 0; i < addTopicParticipantClassesCallbacks.length; i++) { + let pluginClasses = addTopicParticipantClassesCallbacks[i].call( + this, + attrs + ); + if (pluginClasses) { + classNames.push.apply(classNames, pluginClasses); + } + } } + return classNames; }, html(attrs, state) { From b8a08d21e0e9c73f3fdd1ef99c6b8dfe00f5c4f7 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Mon, 24 May 2021 15:09:01 -0700 Subject: [PATCH 051/689] minor refinements to the Universal Rules (#13127) .. of civilized discourse! --- config/locales/server.en.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 977b2836ec122..3a66d38b50016 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -4077,30 +4077,30 @@ en: Please treat this discussion forum with the same respect you would a public park. We, too, are a shared community resource — a place to share skills, knowledge and interests through ongoing conversation. - These are not hard and fast rules, merely guidelines to aid the human judgment of our community and keep this a clean and well-lighted place for civilized public discourse. + These are not hard and fast rules. They are guidelines to aid the human judgment of our community and keep this a kind, friendly place for civilized public discourse. ## [Improve the Discussion](#improve) - Help us make this a great place for discussion by always working to improve the discussion in some way, however small. If you are not sure your post adds to the conversation, think over what you want to say and try again later. - - The topics discussed here matter to us, and we want you to act as if they matter to you, too. Be respectful of the topics and the people discussing them, even if you disagree with some of what is being said. + Help us make this a great place for discussion by always adding something positive to the discussion, however small. If you are not sure your post adds to the conversation, think over what you want to say and try again later. One way to improve the discussion is by discovering ones that are already happening. Spend time browsing the topics here before replying or starting your own, and you’ll have a better chance of meeting others who share your interests. + The topics discussed here matter to us, and we want you to act as if they matter to you, too. Be respectful of the topics and the people discussing them, even if you disagree with some of what is being said. + ## [Be Agreeable, Even When You Disagree](#agreeable) - You may wish to respond to something by disagreeing with it. That’s fine. But remember to _criticize ideas, not people_. Please avoid: + You may wish to respond by disagreeing. That’s fine. But remember to _criticize ideas, not people_. Please avoid: * Name-calling * Ad hominem attacks * Responding to a post’s tone instead of its actual content * Knee-jerk contradiction - Instead, provide reasoned counter-arguments that improve the conversation. + Instead, provide thoughtful insights that improve the conversation. @@ -4108,7 +4108,7 @@ en: The conversations we have here set the tone for every new arrival. Help us influence the future of this community by choosing to engage in discussions that make this forum an interesting place to be — and avoiding those that do not. - Discourse provides tools that enable the community to collectively identify the best (and worst) contributions: bookmarks, likes, flags, replies, edits, and so forth. Use these tools to improve your own experience, and everyone else’s, too. + Discourse provides tools that enable the community to collectively identify the best (and worst) contributions: bookmarks, likes, flags, replies, edits, watching, muting and so forth. Use these tools to improve your own experience, and everyone else’s, too. Let’s leave our community better than we found it. @@ -4118,7 +4118,7 @@ en: Moderators have special authority; they are responsible for this forum. But so are you. With your help, moderators can be community facilitators, not just janitors or police. - When you see bad behavior, don’t reply. It encourages the bad behavior by acknowledging it, consumes your energy, and wastes everyone’s time. _Just flag it_. If enough flags accrue, action will be taken, either automatically or by moderator intervention. + When you see bad behavior, don’t reply. Replying encourages bad behavior by acknowledging it, consumes your energy, and wastes everyone’s time. _Just flag it_. If enough flags accrue, action will be taken, either automatically or by moderator intervention. In order to maintain our community, moderators reserve the right to remove any content and any user account for any reason at any time. Moderators do not preview new posts; the moderators and site operators take no responsibility for any content posted by the community. @@ -4133,7 +4133,7 @@ en: * Respect each other. Don’t harass or grief anyone, impersonate people, or expose their private information. * Respect our forum. Don’t post spam or otherwise vandalize the forum. - These are not concrete terms with precise definitions — avoid even the _appearance_ of any of these things. If you’re unsure, ask yourself how you would feel if your post was featured on the front page of the New York Times. + These are not concrete terms with precise definitions — avoid even the _appearance_ of any of these things. If you’re unsure, ask yourself how you would feel if your post was featured on the front page of a major news site. This is a public forum, and search engines index these discussions. Keep the language, links, and images safe for family and friends. @@ -4143,7 +4143,7 @@ en: Make the effort to put things in the right place, so that we can spend more time discussing and less cleaning up. So: - * Don’t start a topic in the wrong category. + * Don’t start a topic in the wrong category; please read the category definitions. * Don’t cross-post the same thing in multiple topics. * Don’t post no-content replies. * Don’t divert a topic by changing it midstream. @@ -4161,7 +4161,7 @@ en: ## [Powered by You](#power) - This site is operated by your [friendly local staff](%{base_path}/about) and *you*, the community. If you have any further questions about how things should work here, open a new topic in the [site feedback category](%{base_path}/c/site-feedback) and let's discuss! If there's a critical or urgent issue that can't be handled by a meta topic or flag, contact us via the [staff page](%{base_path}/about). + This site is operated by your [friendly local staff](%{base_path}/about) and *you*, the community. If you have any further questions about how things should work here, open a new topic in the [site feedback category](%{base_path}/c/site-feedback) and let’s discuss! If there’s a critical or urgent issue that can’t be handled by a meta topic or flag, contact us via the [staff page](%{base_path}/about). From fccf4d43759bf4976984a2bc2f76c410df18857e Mon Sep 17 00:00:00 2001 From: Blake Erickson Date: Mon, 24 May 2021 19:27:20 -0600 Subject: [PATCH 052/689] DEV: Switch off of our image_optim fork (#13124) The main image_optim gem now includes the timeout feature that we had in our fork. So it is now safe to switch off of our fork and back to the image_optim gem. This is the link to the commit in the image_optim repo that adds the timeout option: https://github.com/toy/image_optim/commit/ec3767dde0d9f9f3d18bd688645583d847ba2e13 One difference with the new timeout implementation is that image_optim now handles the timeout exceptions instead of bubbling them up: https://github.com/toy/image_optim/blob/1ed03285873078185c129c66007231469461e429/lib/image_optim.rb#L128-L129 ``` rescue Errors::TimeoutExceeded handler.result ``` So a timeout will just return `nil`, which is the same response if it couldn't optimize an image. I don't think we were really watching for or doing anything about these timeout warnings in our logs so I think this is an okay change to have and we will have less warnings in our logs now too. --- Gemfile | 4 +--- Gemfile.lock | 16 ++++++++-------- lib/upload_creator.rb | 2 -- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/Gemfile b/Gemfile index 71ee3f910c0ea..e54a9dc881960 100644 --- a/Gemfile +++ b/Gemfile @@ -90,9 +90,7 @@ gem 'unf', require: false gem 'email_reply_trimmer' -# Forked until https://github.com/toy/image_optim/pull/162 is merged -# https://github.com/discourse/image_optim -gem 'discourse_image_optim', require: 'image_optim' +gem 'image_optim' gem 'multi_json' gem 'mustache' gem 'nokogiri' diff --git a/Gemfile.lock b/Gemfile.lock index 02c9870dc0648..cba9b033d3694 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -117,12 +117,6 @@ GEM discourse-fonts (0.0.8) discourse_dev (0.2.1) faker (~> 2.16) - discourse_image_optim (0.26.2) - exifr (~> 1.2, >= 1.2.2) - fspath (~> 3.0) - image_size (~> 1.5) - in_threads (~> 1.3) - progress (~> 3.0, >= 3.0.1) docile (1.4.0) ecma-re-validator (0.3.0) regexp_parser (~> 2.0) @@ -172,7 +166,13 @@ GEM http_accept_language (2.1.1) i18n (1.8.10) concurrent-ruby (~> 1.0) - image_size (1.5.0) + image_optim (0.30.0) + exifr (~> 1.2, >= 1.2.2) + fspath (~> 3.0) + image_size (>= 1.5, < 3) + in_threads (~> 1.3) + progress (~> 3.0, >= 3.0.1) + image_size (2.1.0) in_threads (1.5.4) jmespath (1.4.0) jquery-rails (4.4.0) @@ -512,7 +512,6 @@ DEPENDENCIES discourse-ember-source (~> 3.12.2) discourse-fonts discourse_dev - discourse_image_optim email_reply_trimmer ember-handlebars-template (= 0.8.0) excon @@ -526,6 +525,7 @@ DEPENDENCIES highline htmlentities http_accept_language + image_optim json json_schemer listen diff --git a/lib/upload_creator.rb b/lib/upload_creator.rb index cd2f4c11da33f..9e4f9616034f1 100644 --- a/lib/upload_creator.rb +++ b/lib/upload_creator.rb @@ -424,8 +424,6 @@ def optimize! OptimizedImage.ensure_safe_paths!(@file.path) FileHelper.optimize_image!(@file.path) extract_image_info! - rescue ImageOptim::TimeoutExceeded - Rails.logger.warn("ImageOptim timed out while optimizing #{@filename}") end def filesize From 50926f614342336793f1b78672b387d545d48de3 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Mon, 24 May 2021 19:04:10 -0700 Subject: [PATCH 053/689] FIX: Simplify post and topic deletion language (#13128) Based on feedback from Matt Haughey, we don't need to use so many words when describing a deleted topic or post. Co-authored-by: Martin Brennan --- app/assets/javascripts/discourse/app/models/post.js | 10 +++------- config/locales/client.en.yml | 9 ++------- lib/post_destroyer.rb | 4 ++-- .../advanced_user_narrative_spec.rb | 2 +- spec/components/post_destroyer_spec.rb | 4 ++-- 5 files changed, 10 insertions(+), 19 deletions(-) diff --git a/app/assets/javascripts/discourse/app/models/post.js b/app/assets/javascripts/discourse/app/models/post.js index 77e1967f2eda9..610fa3dd43c78 100644 --- a/app/assets/javascripts/discourse/app/models/post.js +++ b/app/assets/javascripts/discourse/app/models/post.js @@ -208,13 +208,9 @@ const Post = RestModel.extend({ } else { const key = this.post_number === 1 - ? "topic.deleted_by_author" - : "post.deleted_by_author"; - promise = cookAsync( - I18n.t(key, { - count: this.siteSettings.delete_removed_posts_after, - }) - ).then((cooked) => { + ? "topic.deleted_by_author_simple" + : "post.deleted_by_author_simple"; + promise = cookAsync(I18n.t(key)).then((cooked) => { this.setProperties({ cooked: cooked, can_delete: false, diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 5d6f24931d787..6f95604b872bd 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -2877,10 +2877,7 @@ en: description: one: You have selected %{count} post. other: "You have selected %{count} posts." - - deleted_by_author: - one: "(topic withdrawn by author, will be automatically deleted in %{count} hour unless flagged)" - other: "(topic withdrawn by author, will be automatically deleted in %{count} hours unless flagged)" + deleted_by_author_simple: "(topic deleted by author)" post: quote_reply: "Quote" @@ -2896,9 +2893,7 @@ en: follow_quote: "go to the quoted post" show_full: "Show Full Post" show_hidden: "View ignored content." - deleted_by_author: - one: "(post withdrawn by author, will be automatically deleted in %{count} hour unless flagged)" - other: "(post withdrawn by author, will be automatically deleted in %{count} hours unless flagged)" + deleted_by_author_simple: "(post deleted by author)" collapse: "collapse" expand_collapse: "expand/collapse" locked: "a staff member has locked this post from being edited" diff --git a/lib/post_destroyer.rb b/lib/post_destroyer.rb index 21d7973986b16..750fa55a6e5b8 100644 --- a/lib/post_destroyer.rb +++ b/lib/post_destroyer.rb @@ -196,9 +196,9 @@ def mark_for_deletion(delete_removed_posts_after = SiteSetting.delete_removed_po I18n.with_locale(SiteSetting.default_locale) do # don't call revise from within transaction, high risk of deadlock - key = @post.is_first_post? ? 'js.topic.deleted_by_author' : 'js.post.deleted_by_author' + key = @post.is_first_post? ? 'js.topic.deleted_by_author_simple' : 'js.post.deleted_by_author_simple' @post.revise(@user, - { raw: I18n.t(key, count: delete_removed_posts_after) }, + { raw: I18n.t(key) }, force_new_version: true, deleting_post: true ) diff --git a/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/advanced_user_narrative_spec.rb b/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/advanced_user_narrative_spec.rb index 70ee377e76982..4774223b13207 100644 --- a/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/advanced_user_narrative_spec.rb +++ b/plugins/discourse-narrative-bot/spec/discourse_narrative_bot/advanced_user_narrative_spec.rb @@ -330,7 +330,7 @@ post = Post.last - expect(post.raw).to eq(I18n.t('js.post.deleted_by_author', count: 1)) + expect(post.raw).to eq(I18n.t('js.post.deleted_by_author_simple')) PostDestroyer.destroy_stubs diff --git a/spec/components/post_destroyer_spec.rb b/spec/components/post_destroyer_spec.rb index f4500c78e3bc3..18297c020b196 100644 --- a/spec/components/post_destroyer_spec.rb +++ b/spec/components/post_destroyer_spec.rb @@ -381,7 +381,7 @@ def changes_deleted_at_to_nil expect(post2.deleted_at).to be_blank expect(post2.deleted_by).to be_blank expect(post2.user_deleted).to eq(true) - expect(post2.raw).to eq(I18n.t('js.topic.deleted_by_author', count: 24)) + expect(post2.raw).to eq(I18n.t('js.topic.deleted_by_author_simple')) expect(post2.version).to eq(2) expect(called).to eq(1) expect(user_stat.reload.post_count).to eq(0) @@ -462,7 +462,7 @@ def changes_deleted_at_to_nil expect(post.deleted_at).to eq(nil) expect(post.user_deleted).to eq(true) - expect(post.raw).to eq(I18n.t('js.post.deleted_by_author', count: 1)) + expect(post.raw).to eq(I18n.t('js.post.deleted_by_author_simple')) end context "as a moderator" do From f21d50ebb6d9316ed97153ba0d54167b3ae0f358 Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Tue, 25 May 2021 13:33:39 +0400 Subject: [PATCH 054/689] UX: show Update button instead of Enable button when slow mode is already enabled (#13077) When slow mode is enabled it's possible to open the slow mode dialog again to disable it or to update slow mode settings. The problem is that in this case, the button for saving still has the label "Enable" which is confusing. This changes the text on the button from "Enable" to "Update" when slow mode is already enabled. --- .../app/controllers/edit-slow-mode.js | 12 ++++++ .../app/templates/modal/edit-slow-mode.hbs | 2 +- .../tests/acceptance/topic-slow-mode-test.js | 40 +++++++++++++++++-- config/locales/client.en.yml | 3 +- 4 files changed, 52 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/discourse/app/controllers/edit-slow-mode.js b/app/assets/javascripts/discourse/app/controllers/edit-slow-mode.js index f06e9ce38ddcb..254f65a1a7941 100644 --- a/app/assets/javascripts/discourse/app/controllers/edit-slow-mode.js +++ b/app/assets/javascripts/discourse/app/controllers/edit-slow-mode.js @@ -95,6 +95,18 @@ export default Controller.extend(ModalFunctionality, { return saveDisabled || !durationIsSet || !enabledUntil; }, + @discourseComputed("model.slow_mode_seconds") + slowModeEnabled(slowModeSeconds) { + return slowModeSeconds && slowModeSeconds !== 0; + }, + + @discourseComputed("slowModeEnabled") + saveButtonLabel(slowModeEnabled) { + return slowModeEnabled + ? "topic.slow_mode_update.update" + : "topic.slow_mode_update.enable"; + }, + _setFromSeconds(seconds) { this.setProperties(fromSeconds(seconds)); }, diff --git a/app/assets/javascripts/discourse/app/templates/modal/edit-slow-mode.hbs b/app/assets/javascripts/discourse/app/templates/modal/edit-slow-mode.hbs index 8b6dbae97c2c0..824dd2fec1ce7 100644 --- a/app/assets/javascripts/discourse/app/templates/modal/edit-slow-mode.hbs +++ b/app/assets/javascripts/discourse/app/templates/modal/edit-slow-mode.hbs @@ -43,7 +43,7 @@ {{d-button class="btn-primary" disabled=submitDisabled icon="hourglass-start" - label="topic.slow_mode_update.save" + label=saveButtonLabel action=(action "enableSlowMode")}} {{conditional-loading-spinner size="small" condition=loading}} diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-slow-mode-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-slow-mode-test.js index 3324d7b15cd80..b752e38fc4f52 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-slow-mode-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-slow-mode-test.js @@ -13,18 +13,28 @@ import topicFixtures from "discourse/tests/fixtures/topic"; acceptance("Topic - Slow Mode - enabled", function (needs) { needs.user(); needs.pretender((server, helper) => { - server.get("/t/130.json", () => { + server.get("/t/1.json", () => { const json = cloneJSON(topicFixtures["/t/130.json"]); json.slow_mode_seconds = 600; json.slow_mode_enabled_until = "2040-01-01T04:00:00.000Z"; + return helper.response(json); + }); + server.get("/t/2.json", () => { + const json = cloneJSON(topicFixtures["/t/130.json"]); + json.slow_mode_seconds = 0; + json.slow_mode_enabled_until = null; + return helper.response(json); }); }); - test("the slow mode dialog loads settings of currently enabled slow mode ", async function (assert) { + needs.hooks.beforeEach(() => { updateCurrentUser({ moderator: true }); - await visit("/t/slow-mode-testing/130"); + }); + + test("the slow mode dialog loads settings of currently enabled slow mode ", async function (assert) { + await visit("/t/a-topic-with-enabled-slow-mode/1"); await click(".toggle-admin-menu"); await click(".topic-admin-slow-mode button"); @@ -55,4 +65,28 @@ acceptance("Topic - Slow Mode - enabled", function (needs) { assert.ok(exists("input.date-picker"), "date picker is rendered"); assert.ok(exists("input.time-input"), "time picker is rendered"); }); + + test("'Enable' button changes to 'Update' button when slow mode is enabled", async function (assert) { + await visit("/t/a-topic-with-disabled-slow-mode/2"); + await click(".toggle-admin-menu"); + await click(".topic-admin-slow-mode button"); + await click(".future-date-input-selector-header"); + + assert.equal( + query("div.modal-footer button.btn-primary span").innerText, + I18n.t("topic.slow_mode_update.enable"), + "shows 'Enable' button when slow mode is disabled" + ); + + await visit("/t/a-topic-with-enabled-slow-mode/1"); + await click(".toggle-admin-menu"); + await click(".topic-admin-slow-mode button"); + await click(".future-date-input-selector-header"); + + assert.equal( + query("div.modal-footer button.btn-primary span").innerText, + I18n.t("topic.slow_mode_update.update"), + "shows 'Update' button when slow mode is enabled" + ); + }); }); diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 6f95604b872bd..6a4e859fd3603 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -2483,7 +2483,8 @@ en: title: "Slow Mode" select: "Users may only post in this topic once every:" description: "To promote thoughtful discussion in fast moving or contentious discussions, users must wait before posting again in this topic." - save: "Enable" + enable: "Enable" + update: "Update" enabled_until: "Enabled until:" remove: "Disable" hours: "Hours:" From 6e2ecf40c7456a1af7f6470d09921f0138fbd4bb Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 25 May 2021 20:58:13 +1000 Subject: [PATCH 055/689] UX: add ARIA region role to posts (#13130) NVDA does not detect HTML5 articles as regions. This explicitly sets a region with an aria-label denoting post numbers making it much easier to know where you are in a topic. Note role: article which is more semantically correct is not respected by NVDA d/D shortcut, hence the much more generic "region" role. --- app/assets/javascripts/discourse/app/widgets/post.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/assets/javascripts/discourse/app/widgets/post.js b/app/assets/javascripts/discourse/app/widgets/post.js index 9a02a73f2d049..f1afc5f61446e 100644 --- a/app/assets/javascripts/discourse/app/widgets/post.js +++ b/app/assets/javascripts/discourse/app/widgets/post.js @@ -596,6 +596,10 @@ createWidget("post-article", { buildAttributes(attrs) { return { + "aria-label": I18n.t("share.post", { + postNumber: attrs.post_number, + }), + role: "region", "data-post-id": attrs.id, "data-topic-id": attrs.topicId, "data-user-id": attrs.user_id, From e2e13a70f63605b92b4e521cc9f818061c1ccfb6 Mon Sep 17 00:00:00 2001 From: Discourse Translator Bot Date: Tue, 25 May 2021 15:29:11 +0200 Subject: [PATCH 056/689] Update translations (#13136) --- config/locales/client.ar.yml | 23 +-- config/locales/client.be.yml | 2 +- config/locales/client.bg.yml | 8 +- config/locales/client.bs_BA.yml | 17 +-- config/locales/client.ca.yml | 16 +- config/locales/client.cs.yml | 10 +- config/locales/client.da.yml | 40 +++-- config/locales/client.de.yml | 25 ++-- config/locales/client.el.yml | 14 +- config/locales/client.es.yml | 18 +-- config/locales/client.et.yml | 11 +- config/locales/client.fa_IR.yml | 13 +- config/locales/client.fi.yml | 25 ++-- config/locales/client.fr.yml | 20 +-- config/locales/client.gl.yml | 18 +-- config/locales/client.he.yml | 28 ++-- config/locales/client.hu.yml | 15 +- config/locales/client.hy.yml | 9 +- config/locales/client.id.yml | 4 +- config/locales/client.it.yml | 24 +-- config/locales/client.ja.yml | 11 +- config/locales/client.ko.yml | 65 ++++---- config/locales/client.lt.yml | 16 +- config/locales/client.lv.yml | 6 +- config/locales/client.nb_NO.yml | 8 +- config/locales/client.nl.yml | 18 +-- config/locales/client.pl_PL.yml | 21 +-- config/locales/client.pt.yml | 14 +- config/locales/client.pt_BR.yml | 16 +- config/locales/client.ro.yml | 14 +- config/locales/client.ru.yml | 32 ++-- config/locales/client.sk.yml | 10 +- config/locales/client.sl.yml | 20 +-- config/locales/client.sq.yml | 5 +- config/locales/client.sr.yml | 6 +- config/locales/client.sv.yml | 25 ++-- config/locales/client.sw.yml | 5 +- config/locales/client.te.yml | 5 +- config/locales/client.th.yml | 10 +- config/locales/client.tr_TR.yml | 21 +-- config/locales/client.uk.yml | 22 +-- config/locales/client.ur.yml | 12 +- config/locales/client.vi.yml | 13 +- config/locales/client.zh_CN.yml | 22 +-- config/locales/client.zh_TW.yml | 9 +- config/locales/server.be.yml | 2 - config/locales/server.ca.yml | 1 - config/locales/server.da.yml | 141 ++++-------------- config/locales/server.de.yml | 88 ++++++----- config/locales/server.el.yml | 111 -------------- config/locales/server.es.yml | 98 ------------ config/locales/server.fa_IR.yml | 45 ------ config/locales/server.fi.yml | 98 ------------ config/locales/server.fr.yml | 108 -------------- config/locales/server.gl.yml | 98 ------------ config/locales/server.he.yml | 116 +------------- config/locales/server.hy.yml | 1 - config/locales/server.it.yml | 104 +------------ config/locales/server.ko.yml | 27 ++++ config/locales/server.pl_PL.yml | 98 ------------ config/locales/server.pt_BR.yml | 1 - config/locales/server.ru.yml | 9 +- config/locales/server.sk.yml | 109 -------------- config/locales/server.sv.yml | 40 ++--- config/locales/server.sw.yml | 94 ------------ config/locales/server.tr_TR.yml | 1 - config/locales/server.ur.yml | 98 ------------ config/locales/server.zh_CN.yml | 108 +------------- config/locales/server.zh_TW.yml | 98 ------------ .../config/locales/server.ko.yml | 2 + .../config/locales/server.da.yml | 28 ++-- .../config/locales/server.ko.yml | 1 + plugins/poll/config/locales/client.da.yml | 1 + 73 files changed, 512 insertions(+), 1960 deletions(-) diff --git a/config/locales/client.ar.yml b/config/locales/client.ar.yml index ce46d3d6532a9..69cabd304dce4 100644 --- a/config/locales/client.ar.yml +++ b/config/locales/client.ar.yml @@ -711,8 +711,11 @@ ar: add_members: title: "أضِف الأعضاء إلى %{group_name}" description: "يمكنك أيضًا لصق قائمة مفصولة بفواصل إنكليزية." - usernames: "أدخِل أسماء المستخدمين أو عناوين البريد" - input_placeholder: "أسماء المستخدمين أو عناوين البريد" + usernames_or_emails: + title: "أدخِل أسماء المستخدمين أو عناوين البريد" + input_placeholder: "أسماء المستخدمين أو عناوين البريد" + usernames: + input_placeholder: "أسماء المستخدمين" notify_users: "إخطار المستخدمين" requests: title: "الطلبات" @@ -2384,7 +2387,7 @@ ar: slow_mode_update: title: "الوضع البطيء" select: "لا يمكن للمستخدمين نشر المشاركات في هذا الموضوع إلا مرّة كلّ:" - save: "فعّل" + enable: "فعّل" remove: "عطّل" hours: "الساعات:" minutes: "الدقائق:" @@ -2762,13 +2765,6 @@ ar: few: "حدّدت %{count} مشاركات." many: "حدّدت %{count} مشاركة." other: "حدّدت %{count} مشاركة." - deleted_by_author: - zero: "(سحب الكاتب موضوعه، وسيُحذف خلال أقلّ من ساعة ما لم يُوضع عليه إشارة)" - one: "(سحب الكاتب موضوعه، وسيُحذف خلال ساعة واحدة ما لم يُوضع عليه إشارة)" - two: "(سحب الكاتب موضوعه، وسيُحذف خلال ساعتين ما لم يُوضع عليه إشارة)" - few: "(سحب الكاتب موضوعه، وسيُحذف خلال %{count} ساعات ما لم يُوضع عليه إشارة)" - many: "(سحب الكاتب موضوعه، وسيُحذف خلال %{count} ساعة ما لم يُوضع عليه إشارة)" - other: "(سحب الكاتب موضوعه، وسيُحذف خلال %{count} ساعة ما لم يُوضع عليه إشارة)" post: quote_reply: "اقتبس" quote_share: "شارِك" @@ -2781,13 +2777,6 @@ ar: follow_quote: "انتقل إلى المشاركة المقتبسة هنا" show_full: "عرض كامل المنشور" show_hidden: "اعرض المحتوى الذي تم تجاهله." - deleted_by_author: - zero: "(سحب الكاتب مشاركته، وستُحذف خلال أقلّ من ساعة ما لم يُوضع عليها إشارة)" - one: "(سحب الكاتب مشاركته، وستُحذف خلال ساعة واحدة ما لم يُوضع عليها إشارة)" - two: "(سحب الكاتب مشاركته، وستُحذف خلال ساعتان ما لم يُوضع عليها إشارة)" - few: "(سحب الكاتب مشاركته، وستُحذف خلال %{count} ساعات ما لم يُوضع عليها إشارة)" - many: "(سحب الكاتب مشاركته، وستُحذف خلال %{count} ساعة ما لم يُوضع عليها إشارة)" - other: "(سحب الكاتب مشاركته، وستُحذف خلال %{count} ساعة ما لم يُوضع عليها إشارة)" collapse: "اطوِ" expand_collapse: "وسّع/اطوِ" locked: "قفل أحد أعضاء طاقم العمل تعديل هذه المشاركة" diff --git a/config/locales/client.be.yml b/config/locales/client.be.yml index 8dfff29d16243..c74823f027616 100644 --- a/config/locales/client.be.yml +++ b/config/locales/client.be.yml @@ -981,7 +981,7 @@ be: jump_reply_down: перайсці да больш позняй адказы deleted: "Тэма была выдаленая" slow_mode_update: - save: "Уключыць" + enable: "Уключыць" remove: "Адключыць" topic_status_update: when: "калі:" diff --git a/config/locales/client.bg.yml b/config/locales/client.bg.yml index e441d7067cf78..4beb634542bce 100644 --- a/config/locales/client.bg.yml +++ b/config/locales/client.bg.yml @@ -470,6 +470,9 @@ bg: remove_user_as_group_owner: "Премахни като собственик" groups: member_added: "Добавено" + add_members: + usernames: + input_placeholder: "Потебителско име" requests: title: "Заявки" reason: "Причина" @@ -1463,7 +1466,7 @@ bg: jump_reply_down: към по-късен отговор deleted: "Темата беше изтрита" slow_mode_update: - save: "Позволи" + enable: "Позволи" remove: "Деактивиране" topic_status_update: when: "Кога:" @@ -1683,9 +1686,6 @@ bg: continue_discussion: "Продължаване на дискусията от %{postLink}: " follow_quote: "отиди на цитираната публикация " show_full: "Покажи цялата публикация" - deleted_by_author: - one: "(публикация оттеглена от автора, ще бъде автоматично изтрита след %{count} час, освен, ако не бъде сигнализирана)" - other: "(публикация оттеглена от автора, ще бъде автоматично изтрита след %{count} часа, освен, ако не бъде сигнализирана) " collapse: "намали" expand_collapse: "разшири/намали " gap: diff --git a/config/locales/client.bs_BA.yml b/config/locales/client.bs_BA.yml index 2537ef93c57e0..8aca0a7890c36 100644 --- a/config/locales/client.bs_BA.yml +++ b/config/locales/client.bs_BA.yml @@ -596,8 +596,11 @@ bs_BA: add_members: title: "Dodaj članove u %{group_name}" description: "Također možete zalijepiti i kao listu/popis razdvojen zarezom." - usernames: "Unesite korisnička imena ili adrese e-pošte" - input_placeholder: "Korisnička imena ili e-adrese" + usernames_or_emails: + title: "Unesite korisnička imena ili adrese e-pošte" + input_placeholder: "Korisnička imena ili e-adrese" + usernames: + input_placeholder: "Korisnička imena" notify_users: "Obavijesti korisnike" requests: title: "Zahtjevi" @@ -2057,7 +2060,7 @@ bs_BA: jump_reply_down: jump to later reply deleted: "Ova tema je obrisana" slow_mode_update: - save: "Omogući" + enable: "Omogući" remove: "Onemogući" topic_status_update: title: "Trajanje teme" @@ -2360,10 +2363,6 @@ bs_BA: one: Označili ste %{count} objavu. few: "Označili ste %{count}objave." other: "Označili ste %{count} objava." - deleted_by_author: - one: "(tema povučena od strane autora, automatski će biti obrisana u %{count} satu osim ako nije označena)" - few: "(tema povučena od strane autora, automatski će biti obrisana u %{count} sati osim ako nije označena)" - other: "(tema povučena od strane autora, automatski će biti obrisana u %{count} sati osim ako nije označena)" post: quote_reply: "Citiraj" quote_share: "Dijeli" @@ -2376,10 +2375,6 @@ bs_BA: follow_quote: "idi na citiran post" show_full: "Prikaži cijelu objavu" show_hidden: "Prikaz zanemarenog sadržaja." - deleted_by_author: - one: "(objava povučena od strane autora, bit će automatski izbrisana za %{count} sat ukoliko u međuvremenu na nju nije stavljena prijava)" - few: "(objava povučena od strane autora, bit će automatski izbrisana za %{count} sata ukoliko u međuvremenu na nju nije stavljena prijava)" - other: "(objava povučena od strane autora, bit će automatski izbrisana za %{count} sati ukoliko u međuvremenu na nju nije stavljena prijava)" collapse: "spusti" expand_collapse: "digni/spusti" locked: "administrator je zaključao ovu objavu za nove izmjene" diff --git a/config/locales/client.ca.yml b/config/locales/client.ca.yml index 4eae0af18bfbd..9e60aec6e66c1 100644 --- a/config/locales/client.ca.yml +++ b/config/locales/client.ca.yml @@ -554,8 +554,11 @@ ca: add_members: title: "Afegeix membres a %{group_name}" description: "També podeu enganxar una llista separada per comes." - usernames: "Introduïu noms d’usuari o adreces de correu electrònic" - input_placeholder: "Noms d’usuari o correus electrònics" + usernames_or_emails: + title: "Introduïu noms d’usuari o adreces de correu electrònic" + input_placeholder: "Noms d’usuari o correus electrònics" + usernames: + input_placeholder: "Noms d'usuari" notify_users: "Notifiqueu els usuaris" requests: title: "Sol·licituds" @@ -1916,7 +1919,7 @@ ca: jump_reply_down: salta a la resposta posterior deleted: "El tema ha estat suprimit" slow_mode_update: - save: "Activa" + enable: "Activa" remove: "Desactiva" topic_status_update: title: "Temporitzador de tema" @@ -2209,9 +2212,6 @@ ca: description: one: Heu seleccionat %{count} publicació other: "Heu seleccionat %{count} publicacions." - deleted_by_author: - one: "(tema abandonat per l'autor, serà suprimit automàticament en %{count}hora llevat que sigui senyalat amb bandera)" - other: "(tema abandonat per l'autor, serà suprimit automàticament en %{count} hores llevat que sigui senyalat amb bandera)" post: quote_reply: "Cita" quote_share: "Comparteix" @@ -2224,9 +2224,6 @@ ca: follow_quote: "vés a la publicació citada" show_full: "Mostra la publicació sencera" show_hidden: "Mira el contingut ignorat" - deleted_by_author: - one: "(publicació retirada per l'autor, se suprimirà automàticament en %{count} hora, si no és marcada amb bandera)" - other: "(publicació retirada per l'autor, se suprimirà automàticament en %{count} hores, si no és marcada amb bandera)" collapse: "redueix" expand_collapse: "expandeix/contrau" locked: "un membre de l'equip responsable ha blocat l'edició d'aquesta publicació " @@ -3702,7 +3699,6 @@ ca: upload_successful: "Càrrega feta amb èxit. S'han afegit paraules." test: button_label: "Test" - modal_title: "Prova les paraules vigilades '%{action}'" description: "Introduïu un text per a comprovar coincidències amb paraules vigilades." found_matches: "Coincidències trobades:" no_matches: "No s'han trobat coincidències" diff --git a/config/locales/client.cs.yml b/config/locales/client.cs.yml index e30634ffe2775..51341edfc08b0 100644 --- a/config/locales/client.cs.yml +++ b/config/locales/client.cs.yml @@ -559,6 +559,9 @@ cs: remove_user_as_group_owner: "Odstraň vlastníka" groups: member_added: "Přidáno" + add_members: + usernames: + input_placeholder: "Uživatelská jména" requests: reason: "Reason" accepted: "přijato" @@ -1904,7 +1907,7 @@ cs: jump_reply_down: přejít na následující odpověď deleted: "Téma bylo smazáno" slow_mode_update: - save: "Zapnout" + enable: "Zapnout" remove: "Vypnout" topic_status_update: title: "Časovač tématu" @@ -2195,11 +2198,6 @@ cs: continue_discussion: "Pokračování diskuze z %{postLink}:" follow_quote: "přejít na citovaný příspěvek" show_full: "Zobrazit celý příspěvek" - deleted_by_author: - one: "(post withdrawn by author, will be automatically deleted in %{count} hour unless flagged)" - few: "(post withdrawn by author, will be automatically deleted in %{count} hours unless flagged)" - many: "(post withdrawn by author, will be automatically deleted in %{count} hours unless flagged)" - other: "(post withdrawn by author, will be automatically deleted in %{count} hours unless flagged)" collapse: "kolaps" expand_collapse: "rozbalit/sbalit" locked: "Personál znemožnil upravování na tomto příspěvku" diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml index a4e653ed6c77d..e24169cd3a9f0 100644 --- a/config/locales/client.da.yml +++ b/config/locales/client.da.yml @@ -172,6 +172,7 @@ da: regions: ap_northeast_1: "Asien (Tokyo)" ap_northeast_2: "Asien (Seoul)" + ap_east_1: "Asien (Hong Kong)" ap_south_1: "Asien og Stillehavsområdet (Mumbai)" ap_southeast_1: "Asien (Singapore)" ap_southeast_2: "Asien (Sydney)" @@ -308,6 +309,7 @@ da: new_private_message: "Ny kladde til privat besked" topic_reply: "Udkast til svar" abandon: + confirm: "Du har et udkast i gang for dette emne. Hvad vil du gerne gøre med den?" yes_value: "Kassér" no_value: "Genoptag redigering" topic_count_latest: @@ -328,6 +330,7 @@ da: upload: "Overfør" uploading: "Overfører…" uploading_filename: "Overfører: %{filename} ..." + processing_filename: "Behandler: %{filename}..." clipboard: "udklipsholder" uploaded: "Overført!" pasting: "Indsætter..." @@ -546,6 +549,7 @@ da: custom: "Brugerdefineret dato og tid" relative: "Relativ tid" none: "Ikke nødvendig" + last_custom: "Sidste brugerdefineret dato" user_action: user_posted_topic: "%{user} oprettede emnet" you_posted_topic: "Du oprettede emnet" @@ -595,8 +599,12 @@ da: add_members: title: "Tilføj medlemmer til %{group_name}" description: "Du kan også indsætte en kommasepareret liste." - usernames: "Indtast brugernavne eller e-mail adresser" - input_placeholder: "Brugernavne eller e-mail adresser" + usernames_or_emails: + title: "Indtast brugernavne eller e-mail adresser" + input_placeholder: "Brugernavne eller e-mails" + usernames: + title: "Indtast brugernavne" + input_placeholder: "Brugernavne" notify_users: "Giv brugerne besked" requests: title: "Anmodninger" @@ -856,7 +864,7 @@ da: other_accounts: "Andre konti med denne IP adresse" delete_other_accounts: "Slet %{count}" username: "brugernavn" - trust_level: "TL" + trust_level: "TN" read_time: "læse tid" topics_entered: "emner besøgt" post_count: "# indlæg" @@ -952,6 +960,10 @@ da: no_messages_title: "Du har ingen meddelelser" no_messages_body: > Har du brug for at have en direkte personlig samtale med nogen, uden for det normale samtale flow? Send dem en besked ved at vælge deres avatar og bruge %{icon} meddelelsesknappen.

Hvis du har brug for hjælp, kan du sende en besked til en medarbejder. + no_bookmarks_title: "Du har ikke lavet nogle bogmærker endnu" + no_bookmarks_body: > + Start med at bogmærke indlæg med %{icon} knappen, så bliver de vist her for at gøre det nemt at genfinde dem. Du kan også planlægge påmindelse! + no_notifications_title: "Du har ingen notifikationer endnu" first_notification: "Din første notifikation! Vælg den for at begynde." dynamic_favicon: "Vis tællinger på browser-ikonet" skip_new_user_tips: @@ -1325,7 +1337,7 @@ da: last_here: "oprettet siden jeg var her sidst" after_1_day: "oprettet indenfor den seneste dag" after_2_days: "oprettet i de seneste 2 dage" - after_1_week: "oprettet i seneste uge" + after_1_week: "oprettet i den seneste uge" after_2_weeks: "oprettet i de seneste 2 uger" auto_track_topics: "Følg automatisk emner jeg åbner" auto_track_options: @@ -1856,6 +1868,7 @@ da: saved: "Gemt!" saved_draft: "Indlægs udkast i gang. Tryk for at fortsætte." uploading: "Overfører…" + show_preview: "vis forhåndsvisning" quote_post_title: "Citér hele indlægget" bold_label: "F" bold_title: "Fed" @@ -1963,7 +1976,7 @@ da: invitee_accepted: "%{username} accepterede din invitation" moved_post: "%{username} flyttede %{description}" linked: "%{username} %{description}" - granted_badge: "Fortjente '%{description}'" + granted_badge: "Belønnet med '%{description}'" topic_reminder: "%{username} %{description}" watching_first_post: "Nyt emne %{description}" membership_request_accepted: "Medlemskab accepteret i '%{group_name}'" @@ -2258,7 +2271,8 @@ da: title: "Langsom Tilstand" select: "Brugere må kun skrive i dette emne en gang hver:" description: "For at fremme tankevækkende diskussioner i hurtige eller omstridte diskussioner, skal brugerne vente, før de poster igen i dette emne." - save: "Aktiver" + enable: "Aktivér" + update: "Opdater" enabled_until: "Aktiveret indtil:" remove: "Deaktiver" hours: "Timer:" @@ -2610,9 +2624,7 @@ da: description: one: Du har valgt %{count} indlæg. other: "Du har valgt %{count} indlæg." - deleted_by_author: - one: "(emne, der trækkes tilbage af forfatteren, slettes automatisk efter%{count} time, medmindre det markeres)" - other: "(emne, der trækkes tilbage af forfatteren, slettes automatisk efter %{count} timer, medmindre det markeres)" + deleted_by_author_simple: "(emne slettet af forfatteren)" post: quote_reply: "Citér" quote_share: "Del" @@ -2627,9 +2639,7 @@ da: follow_quote: "gå til det citerede indlæg" show_full: "Vis hele emnet" show_hidden: "Vis ignoreret indhold." - deleted_by_author: - one: "(indlæg trukket tilbage af forfatteren, slettes automatisk om %{count} time med mindre det bliver rapporteret)" - other: "(indlæg trukket tilbage af forfatteren, slettes automatisk om %{count} timer med mindre det bliver rapporteret)" + deleted_by_author_simple: "(indlæg slettet af forfatteren)" collapse: "fold sammen" expand_collapse: "fold ud/ind" locked: "Et hjælperteam medlem har låst dette indlæg fra at blive redigeret" @@ -4356,6 +4366,7 @@ da: require_approval: "Indlæg, der indeholder disse ord, kræver godkendelse af hjælperteam, før de kan ses." flag: "Tillad indlæg, der indeholder disse ord, men markér dem som upassende, så moderatorer kan gennemgå dem." replace: "Erstat ord i indlæg med andre ord eller links" + tag: "Mærk automatisk emner baseret på første indlæg" form: placeholder_regexp: "almindelig udtryk" replacement_label: "Erstatning" @@ -4369,7 +4380,6 @@ da: upload_successful: "Overførsel er vellykket. Der er tilføjet ord." test: button_label: "Test" - modal_title: "Test '%{action}' Overvågede Ord" description: "Indtast tekst nedenfor for at kontrollere, om den indeholder overvågede ord" found_matches: "Fundne resultater:" no_matches: "Ingen match fundet" @@ -4428,7 +4438,7 @@ da: suspend_reasons: not_listening_to_staff: "Ville ikke lytte til personale feedback" consuming_staff_time: "Forbrugte uforholdsmæssigt meget personaletid" - combatative: "For kombatativ" + combative: "For konfronterende" in_wrong_place: "På det forkerte sted" no_constructive_purpose: "Intet konstruktivt formål med deres handlinger andet end at skabe uenighed i fællesskabet" custom: "Tilpasset..." @@ -4828,7 +4838,7 @@ da: success: Din CSV-fil blev modtaget, og brugerne vil modtage deres emblem om kort tid. replace_owners: Fjern emblemet fra tidligere ejere emoji: - title: "Emoji" + title: "Humørikon" help: "Tilføj en ny emoji, som vil være tilgængelig for alle. (PROTIP: drag & drop flere filer på én gang)" add: "Tilføj ny emoji" uploading: "Overfører…" diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml index 43348c349e8d6..ffd041c4db85f 100644 --- a/config/locales/client.de.yml +++ b/config/locales/client.de.yml @@ -599,8 +599,12 @@ de: add_members: title: "Mitglieder zu %{group_name} hinzufügen" description: "Du kannst auch eine durch Kommas getrennte Liste einfügen." - usernames: "Benutzernamen oder E-Mail-Adressen eingeben" - input_placeholder: "Benutzernamen oder E-Mails" + usernames_or_emails: + title: "Benutzernamen oder E-Mail-Adressen eingeben" + input_placeholder: "Benutzernamen oder E-Mails" + usernames: + title: "Benutzernamen eingeben" + input_placeholder: "Benutzernamen" notify_users: "Benutzer benachrichtigen" requests: title: "Anfragen" @@ -2280,7 +2284,8 @@ de: title: "Langsamer Modus" select: "Benutzer dürfen nur einmal in diesem Thema schreiben:" description: "Um in schnellen oder umstrittenen Diskussionen eine durchdachte Diskussion zu fördern, müssen Benutzer warten, bevor sie in diesem Thema erneut einen Beitrag verfassen können." - save: "Aktivieren" + enable: "Aktivieren" + update: "Aktualisieren" enabled_until: "Aktiviert bis:" remove: "Deaktivieren" hours: "Stunden:" @@ -2645,9 +2650,7 @@ de: description: one: Du hast %{count} Beitrag ausgewählt. other: "Du hast %{count} Beiträge ausgewählt." - deleted_by_author: - one: "(Thema von Autor zurückgezogen, wird automatisch in %{count} Stunde gelöscht, außer es wird gemeldet)" - other: "(Thema von Autor zurückgezogen, wird automatisch in %{count}Stunden gelöscht, außer es wird gemeldet)" + deleted_by_author_simple: "(Thema vom Autor gelöscht)" post: quote_reply: "Zitat" quote_share: "Teilen" @@ -2662,9 +2665,7 @@ de: follow_quote: "springe zum zitierten Beitrag" show_full: "Zeige ganzen Beitrag" show_hidden: "Ignorierte Inhalte anzeigen." - deleted_by_author: - one: "(Beitrag wurde vom Autor zurückgezogen und wird automatisch in %{count} Stunde gelöscht, sofern dieser Beitrag nicht gemeldet wird)" - other: "(Beitrag wurde vom Autor zurückgezogen und wird automatisch in %{count} Stunden gelöscht, sofern dieser Beitrag nicht gemeldet wird)" + deleted_by_author_simple: "(Beitrag vom Autor gelöscht)" collapse: "zuklappen" expand_collapse: "erweitern/minimieren" locked: "Ein Teammitglied hat diesen Beitrag für die weitere Bearbeitung gesperrt" @@ -4062,7 +4063,7 @@ de: yaml: text: "YAML" title: "Definiere Theme-Einstellungen im YAML-Format" - scss_color_variables_warning: "Die Verwendung von Core-SCSS-Farbvariablen in Themes ist veraltet. Bitte verwende stattdessen CSS-benutzerdefinierte Eigenschaften. Siehe diese Anleitung für weitere Details." + scss_color_variables_warning: 'Die Verwendung von Core-SCSS-Farbvariablen in Themes ist veraltet. Bitte verwende stattdessen CSS-benutzerdefinierte Eigenschaften. Siehe diese Anleitung für weitere Details.' scss_warning_inline: "Die Verwendung von Core-SCSS-Farbvariablen in Themes ist veraltet." colors: select_base: @@ -4418,7 +4419,7 @@ de: upload_successful: "Hochladen erfolgreich. Wörter wurden hinzugefügt." test: button_label: "Test" - modal_title: "Teste '%{action}' beobachtete Wörter" + modal_title: "Teste %{action} beobachtete Wörter" description: "Füge unten Text ein, um auf Übereinstimmungen mit beobachteten Wörtern zu prüfen" found_matches: "Gefundene Übereinstimmungen:" no_matches: "Keine Treffer gefunden" @@ -4477,7 +4478,7 @@ de: suspend_reasons: not_listening_to_staff: "Würde nicht auf Team Feedback hören" consuming_staff_time: "Hat überproportional viel Zeit des Teams verbraucht" - combatative: "Zu kämpferisch" + combative: "Zu kämpferisch" in_wrong_place: "An der falschen Stelle" no_constructive_purpose: "Kein konstruktiver Zweck für ihre Handlungen, außer Dissens innerhalb der Gemeinschaft zu erzeugen" custom: "Benutzerdefiniert..." diff --git a/config/locales/client.el.yml b/config/locales/client.el.yml index 6ee705e7668eb..82b95b82ad074 100644 --- a/config/locales/client.el.yml +++ b/config/locales/client.el.yml @@ -562,8 +562,9 @@ el: add_members: title: "Προσθήκη μελών στο %{group_name}" description: "Μπορείτε επίσης να επικολλήσετε σε μια λίστα διαχωρισμένη με κόμμα." - usernames: "Εισαγάγετε ονόματα χρηστών ή διευθύνσεις email" - input_placeholder: "Ονόματα χρηστών ή email" + usernames_or_emails: + title: "Εισαγάγετε ονόματα χρηστών ή διευθύνσεις email" + input_placeholder: "Ονόματα χρηστών ή email" notify_users: "Ειδοποίηση χρηστών" requests: title: "Αιτήματα" @@ -2046,7 +2047,7 @@ el: jump_reply_down: μετάβαση στην απάντηση που ακολουθεί deleted: "Το νήμα έχει διαγραφεί " slow_mode_update: - save: "Ενεργοποίηση" + enable: "Ενεργοποίηση" remove: "Απενεργοποίηση" hours: "ώρες:" durations: @@ -2372,9 +2373,6 @@ el: description: one: Έχεις επιλέξει %{count} ανάρτηση. other: "Έχεις επιλέξει %{count} αναρτήσεις." - deleted_by_author: - one: "(το θέμα ανακλήθηκε από τον συντάκτη τοθ και θα σβηστεί αυτόματα σε %{count} ώρα, εκτός και αν κάποιος το επισημάνει στους συντονιστές)" - other: "(το θέμα ανακλήθηκε από τον συντάκτη του και θα σβηστεί αυτόματα σε %{count} ώρες, εκτός και αν κάποιος το επισημάνει στους συντονιστές)" post: quote_reply: "Παράθεση" quote_share: "Κοινοποίηση" @@ -2387,9 +2385,6 @@ el: follow_quote: "πήγαινε στην παρατεθειμένη ανάρτηση" show_full: "Δείξε Πλήρη Ανάρτηση " show_hidden: "Προβολή περιεχομένου που αγνοείται." - deleted_by_author: - one: "(η ανάρτηση ανακλήθηκε από το συγγραφέα της και θα σβηστεί αυτόματα σε %{count} ώρα, εκτός και αν κάποιος την επισημάνει στους συντοντιστές)" - other: "(η ανάρτηση ανακλήθηκε από το συγγραφέα της και θα σβηστεί αυτόματα σε %{count} ώρες, εκτός και αν κάποιος την επισημάνει στους συντοντιστές)" collapse: "σύμπτυξη" expand_collapse: "επέκταση/σύμπτυξη" locked: "ένα μέλος του προσωπικού έχει κλειδώσει αυτήν την ανάρτηση από την επεξεργασία" @@ -4003,7 +3998,6 @@ el: upload_successful: "Επιτυχημένη μεταφόρτωση. Οι λέξεις προστέθηκαν." test: button_label: "Δοκιμή" - modal_title: "Δοκιμάστε τις παρακολουθούμενες λέξεις της ενέργειας «%{action}»" description: "Εισαγάγετε κείμενο παρακάτω για να ελέγξετε για αντιστοιχίες με τις παρακολουθούμενες λέξεις" found_matches: "Βρέθηκαν αντιστοιχίες:" no_matches: "Δεν βρέθηκαν αποτελέσματα" diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml index 45fa1ab8557fd..6187cbbd10947 100644 --- a/config/locales/client.es.yml +++ b/config/locales/client.es.yml @@ -599,8 +599,11 @@ es: add_members: title: "Añadir miembros a %{group_name}" description: "También puedes pegar una lista separada por comas." - usernames: "Introduce nombres de usuario o direcciones de correo electrónico" - input_placeholder: "Nombres de usuario o correos electrónicos" + usernames_or_emails: + title: "Introduce nombres de usuario o direcciones de correo electrónico" + input_placeholder: "Nombres de usuario o correos electrónicos" + usernames: + input_placeholder: "Nombres de usuario" notify_users: "Notificar usuarios" requests: title: "Solicitudes" @@ -2277,7 +2280,8 @@ es: title: "Modo lento" select: "Los usuarios solo pueden publicar en este tema una vez cada:" description: "Para promover un debate considerado en temas con mucho tráfico o controvertidos, los usuarios deberán esperar antes de volver a publicar en este tema." - save: "Activar" + enable: "Activar" + update: "Actualizar" enabled_until: "Habilitado hasta:" remove: "Desactivar" hours: "Horas:" @@ -2639,9 +2643,6 @@ es: description: one: Has seleccionado %{count} publicación. other: "Has seleccionado %{count} publicaciones." - deleted_by_author: - one: "(tema retirado por su autor, se borrará automáticamente en %{count} hora, salvo que sea reportado)" - other: "(tema retirado por el autor, se eliminará automáticamente en %{count} horas a menos de que sea reportado)" post: quote_reply: "Citar" quote_share: "Compartir" @@ -2656,9 +2657,6 @@ es: follow_quote: "ir a la publicación citada" show_full: "Mostrar la publicación completa" show_hidden: "Ver contenido ignorado." - deleted_by_author: - one: "(post retirado por el autor. Será borrado automáticamente en %{count} hora si no es reportado)" - other: "(publicación retirada por el autor, se eliminará automáticamente en %{count} horas a menos de que sea reportada)" collapse: "contraer" expand_collapse: "expandir/contraer" locked: "un miembro del staff bloqueó la posibilidad de editar esta publicación" @@ -4407,7 +4405,6 @@ es: upload_successful: "Subida completada. Las palabras se han agregado." test: button_label: "Prueba" - modal_title: "Prueba '%{action}' Palabras Vigiladas" description: "Escribe el texto más abajo para buscar coincidencias con las palabras vigiladas" found_matches: "Coincidencias encontradas:" no_matches: "No se encontraron coincidencias" @@ -4466,7 +4463,6 @@ es: suspend_reasons: not_listening_to_staff: "No escucha indicaciones del personal" consuming_staff_time: "Hace perder el tiempo desproporcionadamente al personal" - combatative: "Demasiado combatiente" in_wrong_place: "No está en el sitio adecuado" no_constructive_purpose: "No hay otro propósito constructivo para sus acciones que crear conflictos dentro de la comunidad" custom: "Personalizado..." diff --git a/config/locales/client.et.yml b/config/locales/client.et.yml index 752a35993956a..9a2a44bd31a03 100644 --- a/config/locales/client.et.yml +++ b/config/locales/client.et.yml @@ -480,6 +480,9 @@ et: remove_user_as_group_owner: "Eemalda omanik" groups: member_added: "Lisatud" + add_members: + usernames: + input_placeholder: "Kasutajanimed" requests: reason: "Põhjus" accepted: "aktsepteeritud" @@ -1679,7 +1682,7 @@ et: title: "Aeglane režiim" select: "Kasutajad saavad sellesse teemasse postitada ainult sagedusega:" description: "Väga aktiivsete või vaidlusaluste arutelude läbimõeldud arutelu edendamiseks peavad kasutajad enne siia teemasse uuesti postitamist ootama." - save: "Lülita sisse" + enable: "Võimalda" remove: "Lülita välja" hours: "Tunde:" minutes: "Minuteid:" @@ -1965,9 +1968,6 @@ et: description: one: Oled valinud %{count} postituse. other: "Oled valinud %{count} postitust." - deleted_by_author: - one: "(teema autori poolt tagasi võetud, eemaldatakse %{count} tunni pärast, kui seda enne lipuga ei märgistata)" - other: "(teema autori poolt tagasi võetud, eemaldatakse %{count} tunni pärast, kui seda enne lipuga ei märgistata)" post: quote_reply: "Tsitaat" quote_share: "Jaga" @@ -1982,9 +1982,6 @@ et: follow_quote: "mine tsiteeritud postituse juurde" show_full: "Näita kogu postitust" show_hidden: "Vaata eiratud sisu." - deleted_by_author: - one: "(autori poolt tagasivõetud postitus kustutatakse automaatselt %{count} tunni pärast, kui ei ole tähistatud)" - other: "(autori poolt tagasivõetud postitus kustutatakse automaatselt %{count} tunni pärast, kui ei ole tähistatud)" collapse: "ahenda" expand_collapse: "laienda/ahenda" locked: "Meeskonnaliige on selle sõnumi muutmise keelanud." diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml index 18aa4a5e318a6..d14ecf299d1f0 100644 --- a/config/locales/client.fa_IR.yml +++ b/config/locales/client.fa_IR.yml @@ -590,8 +590,12 @@ fa_IR: add_members: title: "اعضا را به %{group_name} اضافه کنید" description: "شما همچنین قابلیت جداسازی در لیست با کاما را دارید." - usernames: "نام های کاربری یا آدرس ایمیل ها را وارد کنید" - input_placeholder: "نام‌کاربری یا ایمیل" + usernames_or_emails: + title: "نام های کاربری یا آدرس ایمیل ها را وارد کنید" + input_placeholder: "نام‌کاربری یا ایمیل" + usernames: + title: "نام‌کاربری را وارد کنید" + input_placeholder: "نام های کاربری" notify_users: "اطلاع رسانی به کاربران" requests: title: "درخواست ها" @@ -2063,7 +2067,7 @@ fa_IR: jump_reply_down: رفتن به پاسخ بعدی deleted: "موضوع پاک شده است" slow_mode_update: - save: "فعال کردن" + enable: "فعال کردن" remove: "غیرفعال" hours: "ساعت:" minutes: "دقیقه:" @@ -2385,9 +2389,6 @@ fa_IR: follow_quote: "برو به نوشته ای که نقل‌قول شده" show_full: "نمایش کامل نوشته" show_hidden: "دیدن محتوای نادیده گرفته‌شد" - deleted_by_author: - one: "(نوشته های ارسال شده توسط نویسنده،بصورت خودکار در %{count} ساعت حذف می شود مگر اینکه پرچم شود)" - other: "(نوشته های ارسال شده توسط نویسنده،بصورت خودکار در %{count} ساعت حذف می شود مگر اینکه پرچم شود)" collapse: "جمع کردن" expand_collapse: "باز کردن/بستن" locked: "یکی از دست‌اندرکاران انجمن این پست را جهت جلوگیری از ویرایش قفل کرده است" diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml index 6978156f75a21..29c1ad4304bc2 100644 --- a/config/locales/client.fi.yml +++ b/config/locales/client.fi.yml @@ -599,8 +599,12 @@ fi: add_members: title: "Lisää jäseniä ryhmään %{group_name}" description: "Voit myös liittää pilkuin erotellun luettelon." - usernames: "Anna käyttäjätunnukset tai sähköpostiosoitteet" - input_placeholder: "Käyttäjätunnukset tai sähköpostit" + usernames_or_emails: + title: "Anna käyttäjätunnukset tai sähköpostiosoitteet" + input_placeholder: "Käyttäjätunnukset tai sähköpostit" + usernames: + title: "Syötä käyttäjänimet" + input_placeholder: "Käyttäjänimet" notify_users: "Ilmoita käyttäjille" requests: title: "Pyynnöt" @@ -2280,7 +2284,8 @@ fi: title: "Hidas tila" select: "Käyttäjän tulee odottaa ennen toisen viestin lähettämistä:" description: "Jotta keskustelu kiivaasti etenevästä tai tulenarasta aiheesta olisi harkitumpaa, viestin lähettänyt käyttäjä voi lähettää toisen viestin aikaisintaan %{duration} päästä." - save: "Ota käyttöön" + enable: "Ota käyttöön" + update: "Päivitä" enabled_until: "Aktiivisena tähän asti:" remove: "Poista käytöstä" hours: "Tuntia:" @@ -2645,9 +2650,7 @@ fi: description: one: Olet valinnut %{count} viestin. other: "Olet valinnut %{count} viestiä." - deleted_by_author: - one: "(kirjoittaja perui ketjun, poistetaan automaattisesti %{count} tunnin kuluttua, paitsi jos liputetaan)" - other: "(kirjoittaja perui ketjun, poistetaan automaattisesti %{count} tunnin kuluttua, paitsi jos liputetaan)" + deleted_by_author_simple: "(kirjoittajan poistama ketju)" post: quote_reply: "Lainaa" quote_share: "Jaa" @@ -2662,9 +2665,7 @@ fi: follow_quote: "siirry lainattuun viestiin" show_full: "Näytä koko viesti" show_hidden: "Katso sivuutettu sisältö." - deleted_by_author: - one: "(kirjoittaja on perunut viestin ja se poistetaan automaattisesti tunnin kuluttua, paitsi jos se liputetaan)" - other: "(kirjoittaja on perunut viestin ja se poistetaan automaattisesti %{count} tunnin kuluttua, paitsi jos se liputetaan)" + deleted_by_author_simple: "(kirjoittajan poistama viesti)" collapse: "kutista" expand_collapse: "laajenna/pienennä" locked: "henkilökunnan jäsen on estänyt tämän viestin muokkaamisen" @@ -4061,7 +4062,7 @@ fi: yaml: text: "YAML" title: "Määritä teeman asetukset YAML-muodossa" - scss_color_variables_warning: "Ydinsovelluksen SCSS-värimuuttujien käyttäminen teemoissa on vanhentunutta. Suosittelemme käyttämään mukautettuja CSS-ominaisuuksia niiden sijasta. Lue lisää aiheesta tästä oppaasta." + scss_color_variables_warning: 'Ydinsovelluksen SCSS-värimuuttujien käyttäminen teemoissa on vanhentunutta. Suosittelemme käyttämään mukautettuja CSS-ominaisuuksia niiden sijasta. Lue lisää aiheesta tästä oppaasta.' scss_warning_inline: "Ydinsovelluksen SCSS-värimuuttujien käyttäminen teemoissa on vanhentunutta." colors: select_base: @@ -4417,7 +4418,7 @@ fi: upload_successful: "Lataus onnistui. Sanoja lisättiin." test: button_label: "Testi" - modal_title: "Testaa '%{action}' -tyypin tarkkailtuja sanoja" + modal_title: "Testaa %{action} -tyypin tarkkailtuja sanoja" description: "Tarkastele tekstin osuvuutta tarkkailtuihin sanoihin kirjoittamalla alle" found_matches: "Löytyneitä osumia:" no_matches: "Ei osumia" @@ -4476,7 +4477,7 @@ fi: suspend_reasons: not_listening_to_staff: "Ei kuunnellut henkilökunnan palautetta" consuming_staff_time: "Kulutti suhteettomasti henkilökunnan aikaa" - combatative: "Riidanhaluinen" + combative: "Riidanhaluinen" in_wrong_place: "Väärässä paikassa" no_constructive_purpose: "Toiminta ei ole rakentavaa, aiheuttaa eripuraa yhteisössä" custom: "Mukautettu..." diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml index 9c30248c75d1b..c8167adfec0b6 100644 --- a/config/locales/client.fr.yml +++ b/config/locales/client.fr.yml @@ -599,8 +599,11 @@ fr: add_members: title: "Ajouter des membres à %{group_name}" description: "Vous pouvez également insérer une liste séparée par des virgules." - usernames: "Entrez les noms d'utilisateur ou courriels" - input_placeholder: "Noms d'utilisateur ou courriels" + usernames_or_emails: + title: "Entrez les noms d'utilisateur ou courriels" + input_placeholder: "Noms d'utilisateur ou courriels" + usernames: + input_placeholder: "Noms d'utilisateurs" notify_users: "Notifications aux utilisateurs" requests: title: "Demandes" @@ -2280,7 +2283,8 @@ fr: title: "Mode ralenti" select: "Les utilisateurs ne peuvent publier dans ce sujet qu'une fois tous les :" description: "Afin de favoriser une discussion réfléchie dans des discussions rapides ou controversées, les utilisateurs doivent attendre avant de publier à nouveau dans ce sujet." - save: "Activer" + enable: "Activer" + update: "Mettre à jour" enabled_until: "Activé jusqu'au :" remove: "Désactiver" hours: "Heures :" @@ -2645,9 +2649,6 @@ fr: description: one: vous avez sélectionné %{count} message. other: "Vous avez sélectionné %{count} messages." - deleted_by_author: - one: "(sujet supprimé par son auteur, sera supprimé automatiquement dans %{count} heure à moins qu'il ne soit signalé)" - other: "(sujet supprimé par son auteur, sera supprimé automatiquement dans %{count} heures à moins qu'il ne soit signalé)" post: quote_reply: "Citer" quote_share: "Partager" @@ -2662,9 +2663,6 @@ fr: follow_quote: "aller au message cité" show_full: "Afficher le message complet" show_hidden: "Afficher le contenu ignoré." - deleted_by_author: - one: "(message retiré par son auteur, il sera supprimé automatiquement dans %{count} heure à moins qu'il ne soit signalé)" - other: "(message retiré par son auteur, il sera supprimé automatiquement dans %{count} heures à moins qu'il ne soit signalé)" collapse: "réduire" expand_collapse: "développer/réduire" locked: "un responsable a verrouillé ce message pour empêcher sa modification" @@ -4062,7 +4060,7 @@ fr: yaml: text: "YAML" title: "Définir les paramètres du thème en format YAML" - scss_color_variables_warning: "L'utilisation de variables SCSS standard pour définir des couleurs dans un thème est dépréciée, ces variables ne seront plus prises en charge dans des versions ultérieures. Pour obtenir davantage d'informations, nous vous invitons à consulter ce guide (en anglais)." + scss_color_variables_warning: 'L''utilisation de variables SCSS standard pour définir des couleurs dans un thème est dépréciée, ces variables ne seront plus prises en charge dans des versions ultérieures. Pour obtenir davantage d''informations, nous vous invitons à consulter ce guide (en anglais).' scss_warning_inline: "L'utilisation de variables SCSS standard pour définir des couleurs dans un thème est dépréciée." colors: select_base: @@ -4418,7 +4416,6 @@ fr: upload_successful: "Envoi réussi. Les mots ont été ajoutés." test: button_label: "Tester" - modal_title: "Tester les mots observés pour l'action « %{action} »" description: "Entrez le texte ci-dessous pour vérifier les correspondances avec les mots surveillés" found_matches: "Correspondances trouvées :" no_matches: "Aucune correspondance trouvée" @@ -4477,7 +4474,6 @@ fr: suspend_reasons: not_listening_to_staff: "N'écoute pas les remarques des responsables" consuming_staff_time: "A fait perdre un temps excessif aux responsables" - combatative: "Trop agressif" in_wrong_place: "Au mauvais endroit" no_constructive_purpose: "Aucun but constructif à ses actions autre que de créer une dissidence au sein de la communauté" custom: "Personnalisé…" diff --git a/config/locales/client.gl.yml b/config/locales/client.gl.yml index 8d1148b194d73..af55a7310ab45 100644 --- a/config/locales/client.gl.yml +++ b/config/locales/client.gl.yml @@ -593,8 +593,11 @@ gl: add_members: title: "Engadir membros a %{group_name}" description: "Tamén pode pegalos nunha lista separada por comas." - usernames: "Escriba nomes de usuario e enderezos de correo" - input_placeholder: "Nomes de usuario ou enderezos de correo" + usernames_or_emails: + title: "Escriba nomes de usuario e enderezos de correo" + input_placeholder: "Nomes de usuario ou enderezos de correo" + usernames: + input_placeholder: "Nomes de usuario" notify_users: "Notificar os usuarios" requests: title: "Peticións" @@ -2247,7 +2250,8 @@ gl: title: "Modo lento" select: "Os usuarios só poden publicar neste tema unha vez cada:" description: "Para promover unha discusión reflexiva en discusións rápidas ou polémicas, os usuarios deben esperar antes de publicar de novo neste tema." - save: "Activar" + enable: "Activar" + update: "Actualizar" remove: "Desactivar" hours: "Horas:" minutes: "Minutos:" @@ -2598,9 +2602,6 @@ gl: description: one: Seleccionou %{count} publicación. other: "Seleccionou %{count} publicacións." - deleted_by_author: - one: "(tema retirado polo autor, eliminarase automaticamente en %{count} hora, agás no caso de que sexa sinalado)" - other: "(tema retirado polo autor, eliminarase automaticamente en %{count} horas, agás no caso de que sexa sinalado)" post: quote_reply: "Cita" quote_share: "Compartir" @@ -2615,9 +2616,6 @@ gl: follow_quote: "ir á publicación citada" show_full: "Amosar a publicación completa" show_hidden: "Ver o contido ignorado." - deleted_by_author: - one: "(as publicacións retiradas polo autor serán automaticamente eliminadas en %{count} hora, agás que fosen sinaladas)" - other: "(as publicacións retiradas polo autor serán automaticamente eliminadas en %{count} horas, agás que fosen sinaladas)" collapse: "reducir" expand_collapse: "ampliar/reducir" locked: "un membro do equipo bloqueou a edición nesta publicación" @@ -4355,7 +4353,6 @@ gl: upload_successful: "Carga realizada correctamente. Engadíronse palabras." test: button_label: "Proba" - modal_title: "Probar as palabras observadas na acción «%{action}»" description: "Escriba texto a continuación para comprobar coincidencias con palabras observadas" found_matches: "Coincidencias atopadas:" no_matches: "Non se atoparon coincidencias" @@ -4414,7 +4411,6 @@ gl: suspend_reasons: not_listening_to_staff: "Preferiría non escoitar comentarios do equipo" consuming_staff_time: "Consumiu cantidades desproporcionadas de tempo do equipo" - combatative: "Demasiado combativo" in_wrong_place: "No lugar equivocado" no_constructive_purpose: "Non ten ningún propósito construtivo nas súas accións que non sexa crear disensión dentro da comunidade" custom: "Personalizar..." diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml index 6f0a8531ab3b9..d48c9360827da 100644 --- a/config/locales/client.he.yml +++ b/config/locales/client.he.yml @@ -684,8 +684,12 @@ he: add_members: title: "הוספת חברים אל %{group_name}" description: "ניתן גם להדביק ברשימה מופרדת בפסיקים" - usernames: "נא למלא שמות משתמשים או כתובות דוא״ל" - input_placeholder: "שמות משתמשים או כתובות דוא״ל" + usernames_or_emails: + title: "נא למלא שמות משתמשים או כתובות דוא״ל" + input_placeholder: "שמות משתמשים או כתובות דוא״ל" + usernames: + title: "נא להקליד שמות משתמשים" + input_placeholder: "שמות משתמשים" notify_users: "להודיע למשתמשים" requests: title: "בקשות" @@ -2456,7 +2460,8 @@ he: title: "מצב אטי" select: "משתמשים יכולים לפרסם לנושא הזה רק פעם אחת בכל:" description: "כדי לקדם דיון מתחשב במהלך דיונים מהירים או וכחניים, משתמשים חייבים להמתין בטרם פרסום פעם נוספת לנושא הזה." - save: "הפעלה" + enable: "הפעלה" + update: "עדכון" enabled_until: "מופעל עד:" remove: "השבתה" hours: "שעות:" @@ -2851,11 +2856,7 @@ he: two: "בחרתם %{count} פוסטים." many: "בחרתם %{count} פוסטים." other: "בחרתם %{count} פוסטים." - deleted_by_author: - one: "(הנושא הוסר עקב חרטת המפרסם, הוא ימחק אוטומטית בעוד שעה אלמלא יסומן בדגל)" - two: "(הנושא הוסר עקב חרטת המפרסם, הוא ימחק אוטומטית בעוד שעתיים אלמלא יסומן בדגל)" - many: "(הנושא הוסר עקב חרטת המפרסם, הוא ימחק אוטומטית בעוד %{count} שעות אלמלא יסומן בדגל)" - other: "(הנושא הוסר עקב חרטת המפרסם, הוא ימחק אוטומטית בעוד %{count} שעות אלמלא יסומן בדגל)" + deleted_by_author_simple: "(הנושא נמחק על ידי הכותב)" post: quote_reply: "ציטוט" quote_share: "שיתוף" @@ -2870,11 +2871,7 @@ he: follow_quote: "מעבר לפוסט המצוטט" show_full: "הצגת פוסט מלא" show_hidden: "צפייה בתוכן שמיועד להתעלמות." - deleted_by_author: - one: "(הפוסט נמשך על ידי המחבר, הוא יימחק אוטומטית בעוד שעה (%{count}) אלא אם כן הוא יסומן בדגל)" - two: "(הפוסט נמשך על ידי המחבר, הוא יימחק אוטומטית בעוד שעתיים (%{count}) אלא אם כן הוא יסומן בדגל)" - many: "(הפוסט נמשך על ידי המחבר, הוא יימחק אוטומטית בעוד %{count} שעות אלא אם כן הוא יסומן בדגל)" - other: "(הפוסט נמשך על ידי המחבר, הוא יימחק אוטומטית בעוד %{count} שעות אלא אם כן הוא יסומן בדגל)" + deleted_by_author_simple: "(הפוסט נמחק על ידי הכותב)" collapse: "צמצום" expand_collapse: "הרחב/צמצם" locked: "חבר סגל נעל את האפשרות לערוך את הפוסט הזה" @@ -4368,7 +4365,7 @@ he: yaml: text: "YAML" title: "עריכת הגדרות ערכת העיצוב בתצורת YAML" - scss_color_variables_warning: "השימוש במשתני צבע ליבת SCSS בערכות עיצוב הושמט. נא להשתמש במאפייני CSS מותאמים אישית במקום. במדריך הזה יש פרטים נוספים." + scss_color_variables_warning: 'השימוש במשתני צבע ליבת SCSS בערכות עיצוב הושמט. נא להשתמש במאפייני CSS מותאמים אישית במקום. במדריך הזה יש פרטים נוספים.' scss_warning_inline: "השימוש במשתני צבע ליבת SCSS בערכות עיצוב הושמט." colors: select_base: @@ -4726,7 +4723,6 @@ he: upload_successful: "העלאה הצליחה. מילים נוספו." test: button_label: "נסיון" - modal_title: "בדיקת מילים במעקב ‚%{action}’" description: "נא להקליד טקסט להלן כדי לבדוק התאמות מול מילים שבמעקב" found_matches: "נמצאו התאמות:" no_matches: "לא נמצאו התאמות" @@ -4785,7 +4781,7 @@ he: suspend_reasons: not_listening_to_staff: "סירוב להתייחס למשוב הסגל" consuming_staff_time: "גזילת זמן רב מהסגל" - combatative: "לוחמניות מוגזמת" + combative: "לוחמניות מוגזמת" in_wrong_place: "במקום הלא נכון" no_constructive_purpose: "אין תרומה בונה לקהילה מלבד יצירת מחלוקות" custom: "התאמה אישית…" diff --git a/config/locales/client.hu.yml b/config/locales/client.hu.yml index 2b9cd930a23c0..b34d78f2da48f 100644 --- a/config/locales/client.hu.yml +++ b/config/locales/client.hu.yml @@ -572,8 +572,11 @@ hu: member_requested: "Kérve" add_members: title: "Tagok hozzáadása a %{group_name} csoporthoz" - usernames: "Add meg a felhasználóneveket vagy email-címeket" - input_placeholder: "Felhasználónév vagy e-mail-cím" + usernames_or_emails: + title: "Add meg a felhasználóneveket vagy email-címeket" + input_placeholder: "Felhasználónév vagy e-mail-cím" + usernames: + input_placeholder: "Felhasználónevek" notify_users: "Felhasználók értesítése" requests: title: "Kérelmek" @@ -1900,7 +1903,7 @@ hu: jump_reply_down: ugrás újabb válaszhoz deleted: "Ez a témakör ki lett törölve" slow_mode_update: - save: "Engedélyezés" + enable: "Engedélyezés" remove: "Letiltás" hours: "Óráig:" durations: @@ -2133,9 +2136,6 @@ hu: description: one: Kijelöltél %{count} hozzászólást. other: "Kijelöltél %{count} hozzászólást." - deleted_by_author: - one: "(a szerző által visszavont téma automatikusan törlődik az %{count} órában, hacsak nincs megjelölve)" - other: "(a szerző által visszavont hozzászólás - amennyiben nincs megjelölve - automatikusan törlődik %{count} óra után)" post: quote_reply: "Idézet" quote_share: "Megosztás" @@ -2147,9 +2147,6 @@ hu: follow_quote: "ugrás az idézett bejegyzéshez" show_full: "Teljes bejegyzés megtekintése" show_hidden: "Letiltott tartalom megtekintése" - deleted_by_author: - one: "(a szerző által visszavont hozzászólás automatikusan törlődik az %{count} órában, hacsak nincs megjelölve)" - other: "(a szerző által visszavont hozzászólás - amennyiben nincs megjelölve - automatikusan törlődik %{count} óra után)" collapse: "Összeomlás" expand_collapse: "kinyitás/bezárás" gap: diff --git a/config/locales/client.hy.yml b/config/locales/client.hy.yml index 1cb2ad4a7b358..91513c55c3e4e 100644 --- a/config/locales/client.hy.yml +++ b/config/locales/client.hy.yml @@ -528,6 +528,9 @@ hy: groups: member_added: "Ավելացված" member_requested: "Հարցով " + add_members: + usernames: + input_placeholder: "Օգտանուններ" requests: title: "Հարցումներ " reason: "Պատճառ" @@ -1897,7 +1900,7 @@ hy: jump_reply_down: ցատկել դեպի ավելի հին պատասխան deleted: "Թեման ջնջվել է" slow_mode_update: - save: "Միացնել" + enable: "Միացնել" remove: "Անջատել" topic_status_update: title: "Թեմայի Ժամաչափիչ" @@ -2216,9 +2219,6 @@ hy: follow_quote: "գնալ դեպի մեջբերված գրառումը" show_full: "Ցուցադրել Գրառումն Ամբողջությամբ" show_hidden: "Դիտել անտեսված բովանդակությունը " - deleted_by_author: - one: "(հեղինակի կողմից հեռացված հրապարակում, ավտոմատ կերպով կջնջվի %{count} ժամից, եթե դրոշակավորված չէ)" - other: "(եթե հեղինակի կողմից հեռացված գրառումը չդրոշակավորվի, ապա ավտոմատ կերպով կջնջվի %{count} ժամից)" collapse: "կրճատել" expand_collapse: "ընդլայնել/կրճատել" locked: "անձնակազմի որևէ ներկայացուցիչ արգելափակել է այս գրառման խմբագրումը" @@ -3764,7 +3764,6 @@ hy: upload_successful: "Վերբեռնումը հաջող էր: Բառերն ավելացվել են:" test: button_label: "Փորձարկել" - modal_title: "Թեստ '%{action}' Դիտված Բառեր" description: "Մուտքագրեք տեքստը ներքևում՝ դիտված բառերի համընկնումները ստուգելու համար" found_matches: "Գտնված համընկնումներ՝ " no_matches: "Համընկնումներ չեն գտնվել" diff --git a/config/locales/client.id.yml b/config/locales/client.id.yml index 0b0bd8432cb27..9b1ed2a80123d 100644 --- a/config/locales/client.id.yml +++ b/config/locales/client.id.yml @@ -488,6 +488,8 @@ id: member_requested: "Diminta pada" add_members: title: "Tambahkan anggota ke %{group_name}" + usernames: + input_placeholder: "Nama Pengguna" notify_users: "Beritahu pengguna" requests: title: "Permintaan" @@ -1387,7 +1389,7 @@ id: view_latest_topics: lihat topik terbaru jump_reply_up: lompat ke balasan sebelumnya slow_mode_update: - save: "Aktifkan" + enable: "Aktifkan" remove: "Nonaktifkan" topic_status_update: when: "Ketika:" diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index a83d66bf020d0..65c4e7fbcf85e 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -598,8 +598,12 @@ it: add_members: title: "Aggiungi membri a %{group_name}" description: "Puoi anche incollare in un elenco separato da virgole." - usernames: "Inserisci nomi utente o indirizzi email" - input_placeholder: "Nomi utente o email" + usernames_or_emails: + title: "Inserisci nomi utente o indirizzi email" + input_placeholder: "Nomi utente o email" + usernames: + title: "Immettere i nomi utente" + input_placeholder: "Nome utente" notify_users: "Notifica gli utenti" requests: title: "Richieste" @@ -2275,7 +2279,8 @@ it: title: "Modalità lenta" select: "Gli utenti possono pubblicare in questo argomento solo una volta ogni:" description: "Per promuovere discussioni ponderate in argomenti in rapida evoluzione o controversi, gli utenti devono attendere prima di pubblicare nuovamente in questo argomento." - save: "Abilita" + enable: "Attiva" + update: "Aggiorna" enabled_until: "Abilitato fino a:" remove: "Disattiva" hours: "Ore:" @@ -2636,9 +2641,7 @@ it: description: one: Hai selezionato %{count} messaggio. other: "Hai selezionato %{count} messaggi." - deleted_by_author: - one: "(Argomento eliminato dall'autore, verrà automaticamente cancellato in %{count} ora, se non segnalato)" - other: "(Argomento eliminato dall'autore, verrà automaticamente cancellato in %{count} ore, se non segnalato)" + deleted_by_author_simple: "(argomento eliminato dall'autore)" post: quote_reply: "Cita" quote_share: "Condividi" @@ -2653,9 +2656,7 @@ it: follow_quote: "vai al messaggio citato" show_full: "Mostra Messaggio Completo" show_hidden: "Visualizza contenuto ignorato" - deleted_by_author: - one: "(post eliminato dall'autore, sarà automaticamente cancellato in %{count} ore se non contrassegnato)" - other: "(messaggio eliminato dall'autore, verrà automaticamente cancellato in %{count} ore se non segnalato)" + deleted_by_author_simple: "(messaggio eliminato dall'autore)" collapse: "raggruppa" expand_collapse: "espandi/raggruppa" locked: "un membro dello Staff ha bloccato le modifiche a questo messaggio" @@ -4052,7 +4053,7 @@ it: yaml: text: "YAML" title: "Definisci le impostazioni del tema in formato YAML" - scss_color_variables_warning: "L'utilizzo delle variabili di colore SCSS di base nei temi è deprecato. Utilizzare invece le proprietà personalizzate CSS. Vedi questa guida per maggiori dettagli." + scss_color_variables_warning: 'L''utilizzo delle variabili di colore SCSS di base nei temi è deprecato. Utilizzare invece le proprietà personalizzate CSS. Vedi questa guida per maggiori dettagli.' scss_warning_inline: "L'utilizzo delle variabili di colore SCSS di base nei temi è deprecato." colors: select_base: @@ -4405,7 +4406,6 @@ it: upload_successful: "Caricamento andato a buon fine. Le parole sono state aggiunte." test: button_label: "Test" - modal_title: "Testa Parole Osservate '%{action}'" description: "Inserisci il testo qui sotto per verificare la corrispondenza con le parole osservate" found_matches: "Trovate corrispondenze:" no_matches: "Nessun risultato trovato" @@ -4464,7 +4464,7 @@ it: suspend_reasons: not_listening_to_staff: "Non ascoltava le raccomandazioni dello staff" consuming_staff_time: "Ha fatto sprecare troppo tempo allo staff" - combatative: "Troppo veemente" + combative: "Troppo veemente" in_wrong_place: "Al posto sbagliato" no_constructive_purpose: "Azioni senza fini costruttivi se non creare disaccordo nella comunità" custom: "Personalizzato..." diff --git a/config/locales/client.ja.yml b/config/locales/client.ja.yml index ad632e398c1ce..7d5fed10bce2b 100644 --- a/config/locales/client.ja.yml +++ b/config/locales/client.ja.yml @@ -538,8 +538,11 @@ ja: add_members: title: "メンバーを %{group_name}に追加" description: "カンマ区切りのリストに貼り付けることもできます。" - usernames: "ユーザー名またはメールアドレスを入力してください" - input_placeholder: "ユーザー名またはメール" + usernames_or_emails: + title: "ユーザー名またはメールアドレスを入力してください" + input_placeholder: "ユーザー名またはメール" + usernames: + input_placeholder: "ユーザー名" notify_users: "ユーザーに通知" requests: title: "リクエスト" @@ -2037,7 +2040,7 @@ ja: deleted: "トピックは削除されました" slow_mode_update: select: "ユーザーは、このトピックに一度だけ投稿できます。" - save: "有効" + enable: "有効にする" remove: "無効にする" durations: 10_minutes: "10分" @@ -2310,8 +2313,6 @@ ja: follow_quote: "引用した投稿に移動" show_full: "全て表示" show_hidden: "無視したコンテンツを見る" - deleted_by_author: - other: "(投稿は投稿者により削除されました。何らかの通報がされていない限り、%{count}時間後に自動的に削除されます)" collapse: "折りたたむ" expand_collapse: "開く/折りたたむ" gap: diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index 01a7e07a3d101..d81b3156551fa 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -529,7 +529,7 @@ ko: likes_given: "줌" likes_received: "받음" topics_entered: "읽음" - topics_entered_long: "글 조회" + topics_entered_long: "읽은 글" time_read: "읽은 시간" topic_count: "글" topic_count_long: "글 작성됨" @@ -556,8 +556,12 @@ ko: add_members: title: "%{group_name}에 구성원 추가" description: "쉼표로 구분해 붙여 넣을 수도 있습니다." - usernames: "사용자 이름 또는 이메일 주소를 입력하세요." - input_placeholder: "사용자 이름 또는 이메일" + usernames_or_emails: + title: "사용자 이름 또는 이메일 주소를 입력하세요." + input_placeholder: "사용자 이름 또는 이메일" + usernames: + title: "아이디를 입력하세요" + input_placeholder: "아이디" notify_users: "사용자에게 알림" requests: title: "요청" @@ -698,7 +702,9 @@ ko: remove_owner: "소유자로 제거" remove_owner_description: "%{username}님을 이 그룹의 소유자에서 제거" make_primary: "기본으로 설정" + make_primary_description: "이 그룹의 %{username}님의 기본 그룹으로 설정합니다" remove_primary: "기본에서 제거" + remove_primary_description: "이 그룹을 %{username}님의 기본 그룹에서 제거 합니다" remove_members: "회원 삭제" remove_members_description: "이 그룹에서 선택한 사용자 제거" make_owners: "소유자로 만들기" @@ -909,6 +915,8 @@ ko: no_bookmarks_body: > %{icon} 버튼으로 게시물 북마크를 시작하면 쉽게 참조 할 수 있도록 여기에 나열됩니다. 알림을 예약 할 수도 있습니다! no_notifications_title: "아직 알림이 없습니다." + no_notifications_body: > + 이 패널에서는 글 및 댓글에 대한 답글을 포함하여 직접적으로 관련된 활동에 대한 알림을 받게됩니다. 누군가 사용자님을 @멘션 또는 인용하고 사용자님이 팔로우중인 글에 댓글을 올릴 때. 한동안 로그인하지 않은 경우에도 알림이 이메일로 전송됩니다.

알림을받을 특정 주제, 카테고리 및 태그를 살펴보세요 %{icon}. 자세한 내용은 알림 기본 설정을 참조하십시오. first_notification: "첫 번째 알림! 시작하려면 선택하세요." dynamic_favicon: "브라우저 아이콘에 수 표시" skip_new_user_tips: @@ -940,7 +948,7 @@ ko: moderator_tooltip: "이 회원은 운영자 입니다" admin_tooltip: "이 회원은 관리자입니다." silenced_tooltip: "이 회원은 차단되었습니다" - suspended_notice: "이 회원은 %{date}까지 접근 금지 되었습니다." + suspended_notice: "이 사용자는 %{date}까지 계정이 일시 중지되었습니다." suspended_permanently: "이 회원은 일시정지 되었습니다." suspended_reason: "이유: " github_profile: "GitHub" @@ -1347,9 +1355,9 @@ ko: invite: new_title: "초대 링크 만들기" edit_title: "초대 수정" - instructions: "이 링크를 공유하면 이 사이트에 대한 액세스 권한을 즉시 부여할 수 있습니다." + instructions: "이 링크를 공유하여 이 사이트에 대한 사용 권한을 즉시 부여할 수 있습니다." copy_link: "링크 복사" - expires_in_time: "%{time}에 만료됩니다." + expires_in_time: "%{time}후 만료됩니다." expired_at_time: "%{time}에 만료됨." show_advanced: "고급 옵션 표시" hide_advanced: "고급 옵션 숨기기" @@ -1526,8 +1534,8 @@ ko: email: "이메일" username: "사용자명" last_seen: "마지막 접속" - created: "작성됨" - created_lowercase: "작성됨" + created: "생성됨" + created_lowercase: "생성됨" trust_level: "회원 레벨" search_hint: "사용자명, 이메일 또는 IP 주소" create_account: @@ -1823,6 +1831,8 @@ ko: yourself_confirm: title: "받는 사람 추가를 잊으셨나요?" body: "지금 이 메시지는 자신에게만 전송됩니다!" + slow_mode: + error: "이 항목은 느린 모드입니다. 최근에 이미 게시했습니다; %{timeLeft}후 다시 게시 할 수 있습니다." admin_options_title: "이 글에 대한 옵션 설정" composer_actions: reply: 댓글 @@ -2174,7 +2184,7 @@ ko: title: "느린 모드" select: "사용자는 이 글에 한 번 씩만 댓글을 작성 할 수 있습니다." description: "빠르게 진행되거나 논쟁이되는 대화에서 신중한 대화를 유도하기위해 사용자는이 글에 추가로 글을 작성하기 위해서는 기다려야합니다." - save: "활성화" + enable: "활성화" enabled_until: "다음까지 사용 가능:" remove: "비활성화" hours: "시간:" @@ -2284,7 +2294,9 @@ ko: reasons: mailing_list_mode: "메일링 리스트 모드가 활성화되어 있으므로 이 글의 댓글을 메일로 받게 됩니다." "3_10": "이 글에 대한 태그를 주시중이므로 알림을 받게됩니다." + "3_10_stale": "과거에 이 글의 태그를 팔로우했기 때문에 알림을 받게됩니다." "3_6": "이 카테고리를 주시중이므로 알림을 받게됩니다." + "3_6_stale": "과거에 이 카테고리를 팔로우했기 때문에 알림을 받게됩니다." "3_5": "이 글을 자동으로 주시하기 시작 했으므로 알림을 받게됩니다." "3_2": "이 글을 보고 있으므로 알림을 받게됩니다." "3_1": "이 글을 작성 했으므로 알림을 받게됩니다." @@ -2522,8 +2534,6 @@ ko: deselect_all: 전체 선택 해제 description: other: "%{count}개의 개시글을 선택하셨어요." - deleted_by_author: - other: "(작성자에 의해 취소된 글입니다. 글이 신고된 것이 아닌 한 %{count} 시간 뒤에 자동으로 삭제됩니다)" post: quote_reply: "인용하기" quote_share: "공유" @@ -2538,8 +2548,6 @@ ko: follow_quote: "인용 글로 이동" show_full: "전체 글 보기" show_hidden: "무시 된 내용을 봅니다." - deleted_by_author: - other: "(작성자에 의해 취소된 글입니다. 글이 신고된 것이 아닌 한 %{count} 시간 뒤에 자동으로 삭제됩니다)" collapse: "축소" expand_collapse: "확장/축소" locked: "이 글은 운영진에 의해 수정이 금지 되었습니다." @@ -3318,7 +3326,7 @@ ko: moderators: "운영자:" admins: "관리자:" silenced: "무음 :" - suspended: "접근금지:" + suspended: "차단:" private_messages_short: "메시지" private_messages_title: "메시지" mobile_title: "모바일" @@ -3882,6 +3890,7 @@ ko: yaml: text: "YAML" title: "YAML 형식으로 테마 설정 정의" + scss_color_variables_warning: '테마에서 핵심 SCSS 색상 변수를 사용하는 것은 더 이상 사용되지 않습니다. 대신 CSS 사용자 정의 속성을 사용하십시오. 자세한 내용은 이 가이드 을 참조하십시오.' scss_warning_inline: "테마에서 핵심 SCSS 색상 변수를 사용하는 것은 더 이상 사용되지 않습니다." colors: select_base: @@ -4236,7 +4245,7 @@ ko: upload_successful: "성공적으로 업로드되었습니다. 단어가 추가되었습니다." test: button_label: "테스트" - modal_title: "'%{action}'테스트 단어보기" + modal_title: "테스트 %{action} 감시된 단어" description: "시청 한 단어와 일치하는지 확인하려면 아래에 텍스트를 입력하십시오" found_matches: "일치하는 결과 :" no_matches: "일치하는 결과가 없습니다" @@ -4258,7 +4267,7 @@ ko: new: "새로운 사용자" active: "활성화 사용자" staff: "스태프" - suspended: "접근 금지 사용자" + suspended: "차단됨" silenced: "쓰기 금지" staged: "격리됨" approved: "승인?" @@ -4275,7 +4284,7 @@ ko: admins: "관리자" moderators: "운영자" silenced: "무음 사용자" - suspended: "접근 금지된 사용자들" + suspended: "차단된 사용자들" staged: "단계적 사용자" not_verified: "확인되지 않은" check_email: @@ -4285,9 +4294,9 @@ ko: title: "SSO 페이로드 표시" text: "보기" user: - suspend_failed: "이 사용자를 접근 금지하는데 오류 발생 %{error}" + suspend_failed: "이 사용자를 차단 하는중 오류 발생 %{error}" unsuspend_failed: "이 사용자를 접근 허용 하는데 오류 발생 %{error}" - suspend_duration: "사용자를 몇일 접근 금지 하시겠습니까?" + suspend_duration: "사용자의 계정을 언제까지 차단 하시겠습니까?" suspend_reason_label: "Why are you suspending? This text will be visible to everyone on this user's profile page, and will be shown to the user when they try to log in. Keep it short." suspend_reason_hidden_label: "이 사용자를 일시정지하는 사유는 무엇인가요? 이 텍스트는 해당 사용자가 로그인할 때 보이게 됩니다. 짧게 적어주세요." suspend_reason: "Reason" @@ -4295,13 +4304,13 @@ ko: suspend_reasons: not_listening_to_staff: "관리자의 조치를 따르지 않음" consuming_staff_time: "스태프의 불균형 한 시간 사용" - combatative: "분란 조장" + combative: "분란 조장" in_wrong_place: "잘못된 곳에서" no_constructive_purpose: "반대나 분란 조장의 목적 이외에는 다른 긍정적인 목적이 없습니다." custom: "사용자 지정..." suspend_message: "이메일 메시지" suspend_message_placeholder: "필요한 경우, 사용자에게 이메일을 통하여 일시정지에 대한 더 많은 정보를 제공할 수 있습니다." - suspended_by: "접근 금지자" + suspended_by: "차단 처리자" silence_reason: "사유" silenced_by: "사일런트" silence_modal_title: "무음 사용자" @@ -4330,7 +4339,7 @@ ko: silenced: "쓰기 금지?" moderator: "운영자?" admin: "관리자?" - suspended: "접근 금지?" + suspended: "차단되었나요?" staged: "격리조치?" show_admin_profile: "관리자" show_public_profile: "공개 프로필 보기" @@ -4345,7 +4354,7 @@ ko: revoke_moderation: "운영자 권한 회수" grant_moderation: "운영자 권한 부여" unsuspend: "접근 허용" - suspend: "접근 금지" + suspend: "차단됨" show_flags_received: "받은 신고 보기" flags_received_by: "%{username}님에 의해 신고 받음" flags_received_none: "이 사용자는 신고를 받은것이 없습니다." @@ -4355,10 +4364,10 @@ ko: like_count: 준/받은 '좋아요' last_100_days: "지난 100일간" private_topics_count: 비공개 토픽 - posts_read_count: 글 읽은 수 + posts_read_count: 읽은 댓글 post_count: 글 수 second_factor_enabled: 2단계 인증 사용 - topics_entered: 읽은 토픽 수 + topics_entered: 읽은 글 flags_given_count: 작성한 신고 flags_received_count: 받은 신고 warnings_received_count: 받은 경고 @@ -4433,7 +4442,7 @@ ko: title: "반송 스코어 0으로 리셋" visit_profile: "사용자 환경설정 페이지로 가서 프로필 수정하기" deactivate_explanation: "비활성화 사용자는 이메일 인증을 다시 받아야합니다." - suspended_explanation: "접근 금지된 유저는 로그인 할 수 없습니다." + suspended_explanation: "일시적으로 차단된 사용자는 로그인 할 수 없습니다." silence_explanation: "미활동 사용자는 글을 게시하거나 시작할 수 없습니다." staged_explanation: "격리조치된 회원은 특정 글에 한해서 이메일로만 글을 쓸 수 있습니다." bounce_score_explanation: @@ -4460,8 +4469,8 @@ ko: topics_replied_to: "댓글을 단 토픽 수" topics_viewed: "열어본 토픽 수" topics_viewed_all_time: "열어본 토픽 수 (전체 기간)" - posts_read: "읽은 글 갯수" - posts_read_all_time: "게시물 읽음 (전체 기간)" + posts_read: "읽은 댓글" + posts_read_all_time: "글 읽음 (전체 기간)" flagged_posts: "신고 된 게시물" flagged_by_users: "신고한 회원수" likes_given: "'좋아요' 선물한 횟수" diff --git a/config/locales/client.lt.yml b/config/locales/client.lt.yml index ef8924a82e312..715fa39b3c4d5 100644 --- a/config/locales/client.lt.yml +++ b/config/locales/client.lt.yml @@ -198,6 +198,7 @@ lt: wizard_required: "Sveiki, tai jūsų naujasis Discourse! Pradėkime nuoInstliacijos✨" emails_are_disabled: "Visos išeinančios elektroninės žinutės buvo uždraustos administratoriaus. Jokių papildų įspėjamųjų žinučių nebus išsiųsta" software_update_prompt: + message: "Mes atnaujinome šią svetainę. prašome perkrauti puslapį, kitaip galite patirti nenumatytas klaidas." dismiss: "Praleisti" bootstrap_mode_disabled: "Paleidimo režimas bus išjungtas per 24 valandas." themes: @@ -207,6 +208,7 @@ lt: regions: ap_northeast_1: "Asia Pacific (Tokyo)" ap_northeast_2: "Asia Pacific (Seoul)" + ap_east_1: "Azijos ir Ramiojo vandenyno regionas (Honkongas)" ap_south_1: "Azija ramaus vandenyno (Mumbajus)" ap_southeast_1: "Asia Pacific (Singapore)" ap_southeast_2: "Asia Pacific (Sydney)" @@ -225,6 +227,7 @@ lt: us_gov_west_1: "„AWS GovCloud“ (JAV ir Vakarai)" us_west_1: "US West (N. California)" us_west_2: "US West (Oregon)" + clear_input: "Išvalyti įvestį" edit: "redaguoti šios temos pavadinimą ir kateogoriją" expand: "Išplėsti" not_implemented: "Ši funkcija dar neveikia, atsiprašome!" @@ -296,6 +299,9 @@ lt: moderators: "Moderatoriai" stat: all_time: "Per visą laiką" + last_day: "Paskutinės 24 valandos" + last_7_days: "Paskutinės 7 dienos" + last_30_days: "Paskutinės 30 dienų" like_count: "Patinka" topic_count: "Temos" post_count: "Įrašai" @@ -499,6 +505,9 @@ lt: remove_user_as_group_owner: "Atšaukti valdytoją" groups: member_added: "Pridėta" + add_members: + usernames: + input_placeholder: "Slapyvardžiai" requests: reason: "Priežastis" accepted: "patvirtinta" @@ -1596,7 +1605,7 @@ lt: jump_reply_down: Pereitį į sekantį atsakymą deleted: "Tema buvo ištrinta" slow_mode_update: - save: "Įjungti" + enable: "Įjungti" remove: "Išjungti" topic_status_update: title: "Temos laikmatis" @@ -1843,11 +1852,6 @@ lt: continue_discussion: "Tęsiama %{postLink} diskusija:" follow_quote: "eiti į cituotą įrašą" show_full: "Rodyti Pilną Įrašą" - deleted_by_author: - one: "(autoriaus išimtas įrašas automatiškai bus ištrintas per %{count} valandą, nebent turėjo vėliavą)" - few: "(autoriaus išimtas įrašas automatiškai bus ištrintas per %{count} valandas, nebent turėjo vėliavą)" - many: "(autoriaus išimtas įrašas automatiškai bus ištrintas per %{count} valandas, nebent turėjo vėliavą)" - other: "(autoriaus išimtas įrašas automatiškai bus ištrintas per %{count} valandas, nebent turėjo vėliavą)" collapse: "suskleisti" expand_collapse: "išskleisti/suskleisti" gap: diff --git a/config/locales/client.lv.yml b/config/locales/client.lv.yml index 47f4d2c2385c5..755bff3eefbb0 100644 --- a/config/locales/client.lv.yml +++ b/config/locales/client.lv.yml @@ -1409,7 +1409,7 @@ lv: jump_reply_down: pāriet uz vēlāku atbildi deleted: "Tēma ir dzēsta " slow_mode_update: - save: "Ieslēgt" + enable: "Ieslēgt" remove: "Atslēgt" topic_status_update: save: "Uzstādīt taimeri " @@ -1672,10 +1672,6 @@ lv: continue_discussion: "Turpinot diskusiju no %{postLink}:" follow_quote: "doties uz citēto ierakstu" show_full: "Parādīt visu ierakstu" - deleted_by_author: - zero: "(autors atcēlis ierakstu, tas tiks automātiski dzēsts pēc %{count} stundām, ja neviens nav ziņojis par to)" - one: "(autors atcēlis ierakstu, tas tiks automātiski dzēsts pēc %{count} stundas, ja neviens nav ziņojis par to)" - other: "(autors atcēlis ierakstu, tas tiks automātiski dzēsts pēc %{count} stundām, ja neviens nav ziņojis par to)" collapse: "sakļaut" expand_collapse: "paplašināt/minimizēt" gap: diff --git a/config/locales/client.nb_NO.yml b/config/locales/client.nb_NO.yml index 8e8966f752bef..a7eb423ad1ebc 100644 --- a/config/locales/client.nb_NO.yml +++ b/config/locales/client.nb_NO.yml @@ -449,6 +449,9 @@ nb_NO: make_user_group_owner: "Gjør til eier" remove_user_as_group_owner: "Trekk tilbake eierstatus" groups: + add_members: + usernames: + input_placeholder: "Brukernavn" requests: title: "Forespørsler" reason: "Begrunnelse" @@ -1619,7 +1622,7 @@ nb_NO: jump_reply_down: hopp til senere svar deleted: "Emnet ble slettet" slow_mode_update: - save: "Aktiver" + enable: "Aktiver" remove: "Deaktiver" topic_status_update: title: "Tidsbestemt handling for emne" @@ -1892,9 +1895,6 @@ nb_NO: continue_discussion: "Fortsetter diskusjonen fra %{postLink}:" follow_quote: "gå til det siterte innlegget" show_full: "Vis hele innlegget" - deleted_by_author: - one: "(innlegg som er trukket tilbake av forfatter, blir automatisk slettet etter % {count} time, med mindre de blir flagget)" - other: "(innlegg trukket tilbake av forfatter, blir automatisk slettet etter %{count} timer, med mindre det blir rapportert)" collapse: "fold sammen" expand_collapse: "utvid/vis" locked: "et stabsmedlem har låst dette innlegget fra å bli endret" diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml index c94a991ea6429..d141fc1f1a7fc 100644 --- a/config/locales/client.nl.yml +++ b/config/locales/client.nl.yml @@ -599,8 +599,11 @@ nl: add_members: title: "Leden toevoegen aan %{group_name}" description: "U kunt ook in een door komma's gescheiden lijst plakken." - usernames: "Voer gebruikersnamen of e-mailadressen in" - input_placeholder: "Gebruikersnamen of e-mailadressen" + usernames_or_emails: + title: "Voer gebruikersnamen of e-mailadressen in" + input_placeholder: "Gebruikersnamen of e-mailadressen" + usernames: + input_placeholder: "Gebruikersnamen" notify_users: "Gebruikers een melding sturen" requests: title: "Aanvragen" @@ -2278,7 +2281,8 @@ nl: title: "Langzame modus" select: "Gebruikers mogen slechts een bericht in dit topic plaatsen om de:" description: "Om een doordachte discussie in snel bewegende of controversiële discussies te stimuleren, moeten gebruikers wachten voordat ze opnieuw een bericht in dit topic kunnen plaatsen." - save: "Inschakelen" + enable: "Inschakelen" + update: "Bijwerken" enabled_until: "Ingeschakeld tot:" remove: "Uitschakelen" hours: "Uren:" @@ -2640,9 +2644,6 @@ nl: description: one: U hebt %{count} bericht geselecteerd. other: "U hebt %{count} berichten geselecteerd." - deleted_by_author: - one: "(topic ingetrokken door schrijver, wordt over %{count} uur automatisch verwijderd, tenzij gemarkeerd)" - other: "(topic ingetrokken door schrijver, wordt over %{count} uur automatisch verwijderd, tenzij gemarkeerd)" post: quote_reply: "Citeren" quote_share: "Delen" @@ -2657,9 +2658,6 @@ nl: follow_quote: "naar het geciteerde bericht" show_full: "Volledige bericht tonen" show_hidden: "Genegeerde inhoud weergeven." - deleted_by_author: - one: "(bericht ingetrokken door de schrijver, wordt over %{count} uur automatisch verwijderd, tenzij gemarkeerd)" - other: "(bericht ingetrokken door de schrijver, wordt over %{count} uur automatisch verwijderd, tenzij gemarkeerd)" collapse: "samenvouwen" expand_collapse: "uitvouwen/samenvouwen" locked: "een staflid heeft dit bericht voor bewerking vergrendeld" @@ -4409,7 +4407,6 @@ nl: upload_successful: "Uploaden geslaagd. Woorden zijn toegevoegd." test: button_label: "Testen" - modal_title: "In de gaten gehouden woorden voor '%{action}' testen" description: "Voer hieronder tekst in voor controle op in de gaten gehouden woorden" found_matches: "Gevonden overeenkomsten:" no_matches: "Geen overeenkomsten gevonden" @@ -4468,7 +4465,6 @@ nl: suspend_reasons: not_listening_to_staff: "Wilde niet naar feedback van stafleden luisteren" consuming_staff_time: "Heeft onevenredig veel tijd van stafleden verbruikt" - combatative: "Te strijdlustig" in_wrong_place: "Op de verkeerde plek" no_constructive_purpose: "Geen constructief doel voor hun acties, anders dan het creëren van onenigheid binnen de gemeenschap" custom: "Aangepast..." diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml index 8cb24d4417c1a..a776f2038a393 100644 --- a/config/locales/client.pl_PL.yml +++ b/config/locales/client.pl_PL.yml @@ -685,8 +685,11 @@ pl_PL: add_members: title: "Dodaj członków do %{group_name}" description: "Możesz również wkleić listę oddzieloną przecinkami." - usernames: "Wprowadź nazwy użytkowników lub adresy e-mail" - input_placeholder: "Nazwy użytkowników lub e-maile" + usernames_or_emails: + title: "Wprowadź nazwy użytkowników lub adresy e-mail" + input_placeholder: "Nazwy użytkowników lub e-maile" + usernames: + input_placeholder: "Nazwy użytkowników" notify_users: "Powiadom użytkowników" requests: title: "Prośby" @@ -2459,7 +2462,7 @@ pl_PL: title: "Tryb powolny" select: "Użytkownicy mogą publikować w tym temacie tylko raz na:" description: "Aby promować przemyślaną dyskusję w popularnych lub spornych dyskusjach, użytkownicy muszą poczekać przed ponownym opublikowaniem odpowiedzi w tym temacie." - save: "Włącz" + enable: "Włącz" enabled_until: "Włączone do:" remove: "Wyłącz" hours: "Godziny:" @@ -2851,11 +2854,6 @@ pl_PL: few: "Wybrano %{count} wpisy." many: "Wybrano %{count} wpisów." other: "Wybrano %{count} wpisów." - deleted_by_author: - one: "(temat wycofany przez autora, zostanie automatycznie usunięty za %{count} godzinę, chyba że zostaną oflagowany)" - few: "(temat wycofany przez autora, zostanie automatycznie usunięty za %{count} godzin, chyba że zostaną oflagowany)" - many: "(temat wycofany przez autora, zostanie automatycznie usunięty za %{count} godzin, chyba że zostaną oflagowany)" - other: "(temat wycofany przez autora, zostanie automatycznie usunięty za %{count} godzin, chyba że zostaną oflagowany)" post: quote_reply: "Cytuj" quote_share: "Udostępnij" @@ -2870,11 +2868,6 @@ pl_PL: follow_quote: "idź do cytowanego wpisu" show_full: "Pokaż pełny wpis" show_hidden: "Wyświetl ignorowaną treść." - deleted_by_author: - one: "(wpis wycofany przez autora, zostanie automatycznie usunięty za %{count} godzinę, chyba że zostanie oflagowany) " - few: "(wpis wycofany przez autora, zostanie automatycznie usunięty za %{count} godziny, chyba że zostanie oflagowany) " - many: "(wpis wycofany przez autora, zostanie automatycznie usunięty za %{count} godzin, chyba że zostanie oflagowany) " - other: "(wpis wycofany przez autora, zostanie automatycznie usunięty za %{count} godzin, chyba że zostanie oflagowany) " collapse: "zawalić się" expand_collapse: "rozwiń/zwiń" locked: "członek zespołu zablokował edytowanie tego wpisu" @@ -4720,7 +4713,6 @@ pl_PL: upload_successful: "Przesyłanie zakończone sukcesem. Słowa zostały dodane." test: button_label: "Sprawdź" - modal_title: "Przetestuj '%{action}' obserwowanych słów" description: "Wpisz tekst poniżej, aby sprawdzić dopasowania z obserwowanymi słowami" found_matches: "Znalezione wyniki:" no_matches: "Nie znaleziono dopasowań" @@ -4779,7 +4771,6 @@ pl_PL: suspend_reasons: not_listening_to_staff: "Nie słuchał opinii personelu" consuming_staff_time: "Zużywał nieproporcjonalne ilości czasu personelu" - combatative: "Zbyt wojowniczy" in_wrong_place: "W złym miejscu" no_constructive_purpose: "Nie ma żadnego konstruktywnego celu dla swoich działań z wyjątkiem tworzenia kłótni wewnątrz społeczności." custom: "Niestandardowy..." diff --git a/config/locales/client.pt.yml b/config/locales/client.pt.yml index 5ed55a7d1d5fb..80a1c1f62cbaa 100644 --- a/config/locales/client.pt.yml +++ b/config/locales/client.pt.yml @@ -591,8 +591,11 @@ pt: add_members: title: "Adicionar membros a %{group_name}" description: "Você também pode colar numa lista separada por vírgulas." - usernames: "Digite nomes de utilizador ou endereços de e-mail" - input_placeholder: "Nomes de utilizador ou e-mails" + usernames_or_emails: + title: "Digite nomes de utilizador ou endereços de e-mail" + input_placeholder: "Nomes de utilizador ou e-mails" + usernames: + input_placeholder: "Nomes de Utilizador" notify_users: "Notificar utilizadores" requests: title: "Pedidos" @@ -2072,7 +2075,7 @@ pt: jump_reply_down: avançar para resposta mais antiga deleted: "Este tópico foi eliminado" slow_mode_update: - save: "Ativar " + enable: "Ativar " remove: "Desativar" topic_status_update: title: "Temporizador do Tópico" @@ -2355,9 +2358,6 @@ pt: continue_discussion: "Continuar a discussão de %{postLink}:" follow_quote: "ir para a publicação citada" show_full: "Mostrar Mensagem Completa" - deleted_by_author: - one: "(publicação retraída pelo autor, será removida automaticamente em %{count} hora a não ser que esteja denunciada)" - other: "(publicação retraída pelo autor, será eliminada automaticamente em %{count} horas a não ser que esteja denunciada)" collapse: "colapsar" expand_collapse: "expandir/colapsar" gap: @@ -3412,7 +3412,6 @@ pt: add: "Adicionar" test: button_label: "Testar" - modal_title: "Testar '%{action}' Palavras Vigiadas" description: "Insira o texto abaixo para verificar as correspondências com palavras vigiadas" no_matches: "Não foram encontradas correspondências" impersonate: @@ -3464,7 +3463,6 @@ pt: suspend_reasons: not_listening_to_staff: "Não quis ouvir o feedback da equipa" consuming_staff_time: "Quantidade desproporcional de tempo da equipa consumida" - combatative: "Demasiado conflituoso" in_wrong_place: "No lugar errado" no_constructive_purpose: "Sem qualquer propósito construtivo nas suas ações, a não ser gerar conflitos na comunidade" custom: "Personalizar..." diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml index 361f78f37f337..0e5c9ffb6d820 100644 --- a/config/locales/client.pt_BR.yml +++ b/config/locales/client.pt_BR.yml @@ -596,8 +596,11 @@ pt_BR: add_members: title: "Adicionar membros a %{group_name}" description: "Você também pode colocar aqui uma lista de usuários separados por vírgulas." - usernames: "Digite nomes de usuários ou endereços de email" - input_placeholder: "Nomes de usuário ou endereços de email" + usernames_or_emails: + title: "Digite nomes de usuários ou endereços de email" + input_placeholder: "Nomes de usuário ou endereços de email" + usernames: + input_placeholder: "Nomes de usuários" notify_users: "Notificar usuários" requests: title: "Solicitações" @@ -2078,7 +2081,7 @@ pt_BR: jump_reply_down: pular para a última resposta deleted: "Este tópico foi excluído" slow_mode_update: - save: "Habilitar" + enable: "Habilitar" remove: "Desabilitar" hours: "Horas:" minutes: "Minutos:" @@ -2414,9 +2417,6 @@ pt_BR: description: one: %{count} resposta selecionada. other: "%{count} respostas selecionadas." - deleted_by_author: - one: "(tópico retirado pelo autor, será automaticamente excluído em %{count} hora a menos que seja sinalizado)" - other: "(tópico retirado pelo autor, será automaticamente excluído em %{count} horas a menos que seja sinalizado)" post: quote_reply: "Citação" quote_share: "Compartilhar" @@ -2429,9 +2429,6 @@ pt_BR: follow_quote: "ir para a resposta citada" show_full: "Exibir mensagem completa" show_hidden: "Ver o conteúdo ignorado." - deleted_by_author: - one: "(postagem retirada pelo autor, será automaticamente excluída em %{count} hora a menos que seja sinalizada)" - other: "(postagem retirada pelo autor, será automaticamente excluída em %{count} horas a menos que seja sinalizada)" collapse: "colapso" expand_collapse: "expandir/encolher" locked: "um membro da equipe bloqueou este post de ser editado" @@ -4020,7 +4017,6 @@ pt_BR: upload_successful: "Upload successful. Words have been added." test: button_label: "Testar" - modal_title: "Teste '%{action}' palavras assistidas" description: "Digite o texto abaixo para verificar as correspondências com palavras observadas" found_matches: "Encontros encontrados:" no_matches: "Nenhuma correspondência encontrada" diff --git a/config/locales/client.ro.yml b/config/locales/client.ro.yml index 963c8f49a26f6..5e8deb8be7c03 100644 --- a/config/locales/client.ro.yml +++ b/config/locales/client.ro.yml @@ -605,8 +605,11 @@ ro: add_members: title: "Adaugă membri la %{group_name}" description: "De asemenea, poți insera o listă separată prin virgulă." - usernames: "Introdu nume de utilizator sau adrese de e-mail" - input_placeholder: "Nume de utilizator sau e-mailuri" + usernames_or_emails: + title: "Introdu nume de utilizator sau adrese de e-mail" + input_placeholder: "Nume de utilizator sau e-mailuri" + usernames: + input_placeholder: "Nume de utilizatori" notify_users: "Notifică utilizatorii" requests: title: "Cereri" @@ -916,6 +919,7 @@ ro: dismiss: "Înlătură" dismiss_notifications: "Elimină tot" dismiss_notifications_tooltip: "Marchează toate notificările ca citite" + no_messages_title: "Nu ai niciun mesaj" first_notification: "Prima notificare pe care ai primit-o! Selectează-o ca să continui. " skip_new_user_tips: skip_link: "Sări peste aceste sfaturi" @@ -1892,7 +1896,7 @@ ro: jump_reply_down: sări la un răspuns mai nou deleted: "Subiectul a fost șters" slow_mode_update: - save: "Activează" + enable: "Activează" remove: "Dezactivează" topic_status_update: title: "Temporizator subiect" @@ -2160,10 +2164,6 @@ ro: continue_discussion: "În continuarea discuției de la %{postLink}:" follow_quote: "mergi la postarea citată" show_full: "Arată postarea în întregime" - deleted_by_author: - one: "(post retras de autor, va fi şters automat într-o oră, cu excepţia cazului în care mesajul este marcat)" - few: "(postări retrase de autor, vor fi şterse automat în %{count} ore, cu excepţia cazului în care mesajele sunt marcate)" - other: "(postări retrase de autor, vor fi şterse automat în %{count} de ore, cu excepţia cazului în care mesajele sunt marcate)" collapse: "restrânge" expand_collapse: "extinde/restrânge" gap: diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml index dfa266bc7fec1..08f40317257c2 100644 --- a/config/locales/client.ru.yml +++ b/config/locales/client.ru.yml @@ -685,8 +685,12 @@ ru: add_members: title: "Добавить участников в группу %{group_name}" description: "Вы также можете вставить список участников (значения, разделённые запятыми)." - usernames: "Введите псевдонимы или адреса электронной почты" - input_placeholder: "Псевдонимы или электронные адреса" + usernames_or_emails: + title: "Введите псевдонимы или адреса электронной почты" + input_placeholder: "Псевдонимы или электронные адреса" + usernames: + title: "Введите псевдонимы" + input_placeholder: "Псевдонимы" notify_users: "Уведомить пользователей" requests: title: "Запросы" @@ -1078,7 +1082,7 @@ ru: dark: "Тёмный режим" default_dark_scheme: "(цветовая схема по умолчанию)" dark_mode: "Тёмный режим" - dark_mode_enable: "Включить тёмный режим" + dark_mode_enable: "Включать тёмный режим автоматически" text_size_default_on_all_devices: "Сделать это размер текста размером по умолчанию на всех моих устройствах" allow_private_messages: "Разрешить другим пользователям отправлять мне личные сообщения" external_links_in_new_tab: "Открывать все внешние ссылки в новой вкладке" @@ -2111,7 +2115,7 @@ ru: few: "%{count} непрочитанных уведомления с высоким приоритетом" many: "%{count} непрочитанных уведомлений с высоким приоритетом" other: "%{count} непрочитанных уведомлений с высоким приоритетом" - title: "уведомления об упоминании @псевдонима, об ответах на ваши сообщения, темы и т.д." + title: "уведомления об упоминании @name (псевдонима), об ответах на ваши сообщения, темы и т.д." none: "Уведомления в данный момент не могут быть загружены." empty: "Уведомления не найдены." post_approved: "Ваше сообщение было одобрено" @@ -2466,7 +2470,8 @@ ru: title: "Замедленный режим" select: "Пользователи могут публиковать сообщения в этой теме не чаще чем раз в:" description: "Чтобы способствовать вдумчивому обсуждению в активных или спорных дискуссиях, пользователи должны подождать определённое время, прежде чем публиковать очередное сообщение в этой теме." - save: "Включить" + enable: "Включить" + update: "Обновить" enabled_until: "Включён до:" remove: "Отключить" hours: "Часы:" @@ -2861,11 +2866,7 @@ ru: few: "Вы выбрали %{count} сообщения." many: "Вы выбрали %{count} сообщений." other: "Вы выбрали %{count} сообщений." - deleted_by_author: - one: "(тема отозвана автором и будет автоматически удалена через %{count} час, если только на неё не поступит жалоба)" - few: "(тема отозвана автором и будет автоматически удалена через %{count} часа, если только на неё не поступит жалоба)" - many: "(тема отозвана автором и будет автоматически удалена через %{count} часов, если только на неё не поступит жалоба)" - other: "(тема отозвана автором и будет автоматически удалена через %{count} часов, если только на неё не поступит жалоба)" + deleted_by_author_simple: "(тема удалена автором)" post: quote_reply: "Ответить с цитированием" quote_share: "Поделиться" @@ -2880,11 +2881,7 @@ ru: follow_quote: "Перейти к цитируемому сообщению" show_full: "Показать полный текст" show_hidden: "Просмотр игнорируемого содержимого." - deleted_by_author: - one: "(сообщение отозвано автором и будет автоматически удалено в течение %{count} часа, если только на сообщение не поступит жалоба)" - few: "(сообщение отозвано автором и будет автоматически удалено в течение %{count} часов, если только на сообщение не поступит жалоба)" - many: "(сообщение отозвано автором и будет автоматически удалено в течение %{count} часов, если только на сообщение не поступит жалоба)" - other: "(сообщение отозвано автором и будет автоматически удалено в течение %{count} часов, если только на сообщение не поступит жалоба)" + deleted_by_author_simple: "(тема удалена автором)" collapse: "Свернуть" expand_collapse: "Развернуть/Свернуть" locked: "Модератор заблокировал это сообщение для редактирования" @@ -4370,7 +4367,7 @@ ru: yaml: text: "YAML" title: "Определить настройки темы в формате YAML" - scss_color_variables_warning: "Использование в темах цветовых переменных SCSS является устаревшим. Вместо этого используйте пользовательские свойства CSS. См. это руководство для получения более подробной информации." + scss_color_variables_warning: 'Использование в темах цветовых переменных SCSS является устаревшим. Вместо этого используйте пользовательские свойства CSS. См. это руководство для получения более подробной информации.' scss_warning_inline: "Использование в темах цветовых переменных SCSS является устаревшим." colors: select_base: @@ -4728,7 +4725,6 @@ ru: upload_successful: "Загрузка прошла успешна. Слова добавлены." test: button_label: "Тестирование слов" - modal_title: "Тест контролируемых слов - '%{action}'" description: "Введите текст, чтобы проверить совпадения с контролируемыми словами:" found_matches: "Найденные совпадения:" no_matches: "Совпадений не найдено" @@ -4787,7 +4783,7 @@ ru: suspend_reasons: not_listening_to_staff: "Не прислушался к рекомендациям персонала" consuming_staff_time: "Потрачено слишком много времени персонала" - combatative: "Агрессивное поведение" + combative: "Агрессивное поведение" in_wrong_place: "Обсуждение не в том месте" no_constructive_purpose: "У действий пользователя нет никакой конструктивной цели, кроме внесения раскола в сообщество" custom: "Другое..." diff --git a/config/locales/client.sk.yml b/config/locales/client.sk.yml index 6e0a26bb808d4..753025e7d7871 100644 --- a/config/locales/client.sk.yml +++ b/config/locales/client.sk.yml @@ -458,6 +458,9 @@ sk: remove_user_as_group_owner: "Odobrať vlastníka" groups: member_added: "Pridané" + add_members: + usernames: + input_placeholder: "Používateľské mená" requests: reason: "Dôvod" manage: @@ -1518,7 +1521,7 @@ sk: jump_reply_down: prejsť na nasledujúcu odpoveď deleted: "Téma bola vymazaná" slow_mode_update: - save: "Zapnúť" + enable: "Zapnúť" remove: "Vypnúť" topic_status_update: num_of_hours: "Počet hodín:" @@ -1759,11 +1762,6 @@ sk: continue_discussion: "Pokračovanie diskusie z %{postLink}:" follow_quote: "prejsť na citovaný príspevok" show_full: "Zobraziť celý príspevok" - deleted_by_author: - one: "(príspevky stiahnuté autorom budú automaticky zmazané za jednu hodinu pokiaľ nie sú označené)" - few: "(príspevky stiahnuté autorom budú automaticky zmazané za %{count} hodiny pokiaľ nie sú označené)" - many: "(príspevky stiahnuté autorom budú automaticky zmazané za %{count} hodín pokiaľ nie sú označené)" - other: "(príspevky stiahnuté autorom budú automaticky zmazané za %{count} hodín pokiaľ nie sú označené)" collapse: "zbaliť" expand_collapse: "rozbaliť/zbaliť" gap: diff --git a/config/locales/client.sl.yml b/config/locales/client.sl.yml index 83178b3b7e313..f449cec08fae3 100644 --- a/config/locales/client.sl.yml +++ b/config/locales/client.sl.yml @@ -620,8 +620,11 @@ sl: add_members: title: "Dodaj člane v %{group_name}" description: "Sem lahko prilepite tudi seznam, ločen z vejicami." - usernames: "Vnesi uporabniška imena ali e-poštne naslove" - input_placeholder: "Uporabniki ali e-poštni naslovi" + usernames_or_emails: + title: "Vnesi uporabniška imena ali e-poštne naslove" + input_placeholder: "Uporabniki ali e-poštni naslovi" + usernames: + input_placeholder: "Uporabniška imena" notify_users: "Obvesti uporabnike" requests: title: "Zahtevki" @@ -2261,7 +2264,7 @@ sl: title: "Počasni način" select: "Uporabniki lahko v tej temi objavijo samo enkrat na:" description: "Za spodbujanje premišljene razprave v hitrih in burnih razpravah morajo uporabniki počakati, preden lahko ponovno objavijo v tej temi." - save: "Omogoči" + enable: "Omogoči" enabled_until: "Omogočeno do:" remove: "Onemogoči" hours: "Ure:" @@ -2615,11 +2618,6 @@ sl: two: "Izbrali ste %{count} prispevka." few: "Izbrali ste %{count} prispevke." other: "Izbrali ste %{count} prispevkov." - deleted_by_author: - one: "(tema umaknjena s strani avtorja bo samodejno izbrisana v %{count} uri - razen če je prijavljena moderatorju)" - two: "(tema umaknjena s strani avtorja bo samodejno izbrisana v %{count} urah - razen če je prijavljena moderatorju)" - few: "(tema umaknjena s strani avtorja bo samodejno izbrisana v %{count} urah - razen če je prijavljena moderatorju)" - other: "(tema umaknjena s strani avtorja bo samodejno izbrisana v %{count} urah - razen če je prijavljena moderatorju)" post: quote_reply: "Citiraj" quote_share: "Deli" @@ -2632,11 +2630,6 @@ sl: follow_quote: "pojdi na citiran prispevek" show_full: "Prikaži cel prispevek" show_hidden: "Prikaži prezrto vsebino." - deleted_by_author: - one: "(prispevek umaknjen s strani avtorja se bo samodejno izbrisal po %{count} uri, če ni prijavljen moderatorju)" - two: "(prispevek umaknjen s strani avtorja se bo samodejno izbrisal po %{count} urah, če ni prijavljen moderatorju)" - few: "(prispevek umaknjen s strani avtorja se bo samodejno izbrisal po %{count} urah, če ni prijavljen moderatorju)" - other: "(prispevek umaknjen s strani avtorja se bo samodejno izbrisal po %{count} urah - razen če je prijavljen moderatorju)" collapse: "skrči" expand_collapse: "razširi/skrči" locked: "član osebja je zaklenil ta prispevek za urejanje" @@ -4004,7 +3997,6 @@ sl: suspend_reasons: not_listening_to_staff: "Ni upošteval povratnih informacij osebja" consuming_staff_time: "Porabljal nesorazmerno količino časa osebja" - combatative: "Preveč konflikten" custom: "Po meri..." suspend_message: "E-sporočilo za uporabnika" suspend_message_placeholder: "Po potrebi napišite več informacij o razlogih za suspendiranje, ki bodo poslani uporabniku v e-sporočilu." diff --git a/config/locales/client.sq.yml b/config/locales/client.sq.yml index 405f75b48ad84..15ed636269e08 100644 --- a/config/locales/client.sq.yml +++ b/config/locales/client.sq.yml @@ -1246,7 +1246,7 @@ sq: jump_reply_down: hidhu tek përgjigja pasardhëse deleted: "Tema është fshirë" slow_mode_update: - save: "Aktivizo" + enable: "Aktivizo" remove: "Çaktivizo" topic_status_update: when: "Kur:" @@ -1455,9 +1455,6 @@ sq: continue_discussion: "Vazhdim i diskutimit nga tema %{postLink}:" follow_quote: "shko tek tema e cituar" show_full: "Shfaq postimin e plotë" - deleted_by_author: - one: "(post withdrawn by author, will be automatically deleted in %{count} hour unless flagged)" - other: "(postim i tërhequr nga autori, do të fshihet automatikisht në %{count} orë nëse nuk sinjalizohet)" expand_collapse: "zgjero/shkurto" gap: one: "shiko %{count} përgjigje të fshehur" diff --git a/config/locales/client.sr.yml b/config/locales/client.sr.yml index 2542abdc16f26..7dfe4bab180e1 100644 --- a/config/locales/client.sr.yml +++ b/config/locales/client.sr.yml @@ -1236,7 +1236,7 @@ sr: jump_reply_down: skoči na kasniji odgovor deleted: "Tema je obrisana" slow_mode_update: - save: "Omogući" + enable: "Omogući" remove: "Onemogući" topic_status_update: when: "Kada:" @@ -1400,10 +1400,6 @@ sr: continue_discussion: "Nastavak diskusije iz %{postLink}:" follow_quote: "idi na citiranu poruku" show_full: "Prikaži Celu Poruku" - deleted_by_author: - one: "(autor je povukao poruku, biće automatski obrisana za %{count} sati osim ako bude označena zastavicom)" - few: "(autor je povukao poruku, biće automatski obrisana za %{count} sati osim ako bude označena zastavicom)" - other: "(autor je povukao poruku, biće automatski obrisana za %{count} sati osim ako bude označena zastavicom)" expand_collapse: "proširi/sruši" unread: "Poruka je nepročitana" errors: diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml index f7e754f03e6fa..a81c452e44ea1 100644 --- a/config/locales/client.sv.yml +++ b/config/locales/client.sv.yml @@ -599,8 +599,12 @@ sv: add_members: title: "Lägg till medlemmar till %{group_name}" description: "Du kan även klistra in i en kommaseparerad lista." - usernames: "Ange användarnamn eller e-postadresser" - input_placeholder: "Användarnamn eller e-post" + usernames_or_emails: + title: "Ange användarnamn eller e-postadresser" + input_placeholder: "Användarnamn eller e-post" + usernames: + title: "Ange användarnamn" + input_placeholder: "Användarnamn" notify_users: "Meddela användare" requests: title: "Ansökningar" @@ -2280,7 +2284,8 @@ sv: title: "Långsamt läge" select: "Användare får bara publicera i detta ämne en gång varje:" description: "För att främja tankeväckande diskussioner i snabba eller omtvistade diskussioner måste användarna vänta innan de publicerar i det här ämnet igen." - save: "Aktivera" + enable: "Aktivera" + update: "Uppdatera" enabled_until: "Aktiverat till:" remove: "Inaktivera" hours: "Timmar:" @@ -2645,9 +2650,7 @@ sv: description: one: Du har markerat %{count} inlägg. other: "Du har markerat %{count} inlägg." - deleted_by_author: - one: "(ämne tillbakadraget av författaren, kommer att raderas automatiskt om %{count} timme om det inte flaggas)" - other: "(ämne tillbakadraget av författaren, kommer att raderas automatiskt om %{count} timmar om det inte flaggas)" + deleted_by_author_simple: "(ämne raderat av författaren)" post: quote_reply: "Citat" quote_share: "Dela" @@ -2662,9 +2665,7 @@ sv: follow_quote: "gå till det citerade inlägget" show_full: "Visa hela inlägget" show_hidden: "Visa ignorerat innehåll" - deleted_by_author: - one: "(inlägg tillbakadraget av skaparen, kommer att raderas automatiskt om %{count} timme om det inte flaggas)" - other: "(inlägg tillbakadraget av skaparen, kommer att raderas automatiskt om %{count} timmar om det inte flaggas)" + deleted_by_author_simple: "(inlägg raderat av författaren)" collapse: "förminska" expand_collapse: "utvidga/förminska" locked: "en i personalen har låst detta inlägg från att redigeras" @@ -4062,7 +4063,7 @@ sv: yaml: text: "YAML" title: "Definiera temainställningar i YAML-format" - scss_color_variables_warning: "Användning av grundläggande programvaras SCSS-färgvariabler i teman har utfasats. Använd anpassade CSS-egenskaper i stället. Se denna guide för mer information." + scss_color_variables_warning: 'Användning av grundläggande programvaras SCSS-färgvariabler i teman har utfasats. Använd anpassade CSS-egenskaper i stället. Se denna guide för mer information.' scss_warning_inline: "Användning av grundläggande programvaras SCSS-färgvariabler i teman har utfasats." colors: select_base: @@ -4418,7 +4419,7 @@ sv: upload_successful: "Uppladdning lyckades. Ord har lagts till." test: button_label: "Testa" - modal_title: "Testa '%{action}' bevakade ord" + modal_title: "Testa %{action} bevakade ord" description: "Ange text nedan för att leta efter matchningar med bevakade ord" found_matches: "Hittade matchande:" no_matches: "Hittades inga matchningar" @@ -4477,7 +4478,7 @@ sv: suspend_reasons: not_listening_to_staff: "Lyssnade inte på personalen" consuming_staff_time: "Förbrukade oproportionerligt mycket personaltid" - combatative: "För stridslysten" + combative: "Alltför stridslysten" in_wrong_place: "På fel plats" no_constructive_purpose: "Inget konstruktivt syfte med sina handlingar annat än att skapa oenighet inom forumet" custom: "Anpassad..." diff --git a/config/locales/client.sw.yml b/config/locales/client.sw.yml index 719157f9be790..437e16d89c66d 100644 --- a/config/locales/client.sw.yml +++ b/config/locales/client.sw.yml @@ -380,6 +380,9 @@ sw: make_user_group_owner: "Mfanye awe mmiliki" remove_user_as_group_owner: "Ondoa mmiliki" groups: + add_members: + usernames: + input_placeholder: "Majina la watumiaji" requests: reason: "Sababu" accepted: "imeruhusiwa" @@ -1531,7 +1534,7 @@ sw: jump_reply_down: fikia jibu la baadaye deleted: "Mada imefutwa" slow_mode_update: - save: "Ruhusu" + enable: "Ruhusu" remove: "Zuia" topic_status_update: title: "Kipima Mda cha Mada" diff --git a/config/locales/client.te.yml b/config/locales/client.te.yml index 5a3f6a2a59895..0284c951b2fe8 100644 --- a/config/locales/client.te.yml +++ b/config/locales/client.te.yml @@ -884,7 +884,7 @@ te: jump_reply_down: తరువాతి జవాబుకు వెళ్లు deleted: "ఈ విషయం తొలగించబడింది" slow_mode_update: - save: "చేతనం" + enable: "చేతనం" remove: "అచేతనం" auto_update_input: tomorrow: "రేపు" @@ -1025,9 +1025,6 @@ te: continue_discussion: "%{postLink} నుండి చర్చ కొనసాగుతుంది;" follow_quote: "కోటెడ్ టపాకు వెళ్లు" show_full: "పూర్తి టపా చూపు" - deleted_by_author: - one: " (టపా రచయిత ద్వారా తొలగింపబడింది , స్వతస్సిధ్దంగా తొలగింపబ[ది %{count} కాకపోతే సమయం కేతనించలేదు)" - other: "(టపా రచయిత ద్వారా ఉపసంహరించబడింది , స్వతసిధ్ధంగా తొలగించబడతాయి %{count} కాకపోతే సమయం కేతనించలేదు)" expand_collapse: "పెంచు/తుంచు" unread: "టపా చదవనిది" errors: diff --git a/config/locales/client.th.yml b/config/locales/client.th.yml index bb3762e11dd90..85869147bf016 100644 --- a/config/locales/client.th.yml +++ b/config/locales/client.th.yml @@ -456,6 +456,9 @@ th: groups: member_added: "เพิ่ม" member_requested: "ร้องขอเมื่อ" + add_members: + usernames: + input_placeholder: "ชื่อผู้ใช้" requests: title: "คำร้องขอ" reason: "เหตุผล" @@ -1665,7 +1668,8 @@ th: jump_reply_down: ข้ามไปยังคำตอบหลังจากนี้ deleted: "กระทู้ถูกลบ" slow_mode_update: - save: "เปิดใช้งาน" + enable: "เปิดใช้งาน" + update: "อัปเดต" remove: "ปิดใช้งาน" topic_status_update: num_of_hours: "จำนวนชั่วโมง:" @@ -1926,8 +1930,6 @@ th: deselect_all: ไม่เลือกทั้งหมด description: other: "คุณได้เลือก %{count} โพสต์" - deleted_by_author: - other: "(กระทู้ถูกแจ้งลบโดยเจ้าของ และจะถูกลบโดยอัตโนมัติใน%{count}ชั่วโมง เว้นแต่จะถูกปักธง)" post: quote_reply: "อ้างอิง" quote_share: "แบ่งปัน" @@ -1937,8 +1939,6 @@ th: reply_as_new_private_message: "ตอบกลับด้วยข้อความใหม่ไปยังผู้รับคนเดียวกัน" follow_quote: "ไปยังโพสต์ที่ถูกกล่าวถึง" show_full: "แสดงโพสต์ทั้งหมด" - deleted_by_author: - other: "(โพสถูกแจ้งลบโดยเจ้าของ และจะถูกลบใน %{count} ชั่วโมงเว้นแต่จะถูกปักธง)" collapse: "ย่อ" expand_collapse: "ขยาย/ย่อ" locked: "ทีมงานได้ปิดโพสต์นี้จากการแก้ไข" diff --git a/config/locales/client.tr_TR.yml b/config/locales/client.tr_TR.yml index ec439a7752daa..da623dd19665d 100644 --- a/config/locales/client.tr_TR.yml +++ b/config/locales/client.tr_TR.yml @@ -576,8 +576,12 @@ tr_TR: add_members: title: "%{group_name} grubuna üye ekleyin" description: "Ayrıca virgülle ayrılmış bir liste de yapıştırabilirsiniz." - usernames: "Kullanıcı adlarını veya e-posta adreslerini girin" - input_placeholder: "Kullanıcı adı ya da e-posta" + usernames_or_emails: + title: "Kullanıcı adlarını veya e-posta adreslerini girin" + input_placeholder: "Kullanıcı adı ya da e-posta" + usernames: + title: "Kullanıcı adlarını girin" + input_placeholder: "Kullanıcı adları" notify_users: "Kullanıcıları bilgilendir" requests: title: "İstekler" @@ -2172,7 +2176,7 @@ tr_TR: title: "Yavaş mod" select: "Kullanıcılar bu konuda yalnızca bir kez gönderi yapabilir:" description: "Hızlı cevaplanan veya ateşi yüksek tartışmalarda, mantıklı ve kaliteli cevaplar verilmesi amacıyla kullanıcıların bu konuya tekrar cevap yazabilmesi için beklemesi gerekir." - save: "Etkin" + enable: "Etkinleştir" remove: "Devredışı" hours: "Saat:" minutes: "Dakika:" @@ -2496,9 +2500,7 @@ tr_TR: description: one: %{count} gönderi seçtiniz. other: "%{count} gönderi seçtin." - deleted_by_author: - one: "(yazarı tarafından geri alınan konu, bildirilmiş hale gelmezse %{count} saat içinde otomatik olarak silinecek.)" - other: "(yazarı tarafından geri alınan konu, bildirilmiş hale gelmezse %{count} saat içinde otomatik olarak silinecek.)" + deleted_by_author_simple: "(konu yazarı tarafından silindi)" post: quote_reply: "Alıntı" quote_share: "Paylaş" @@ -2511,9 +2513,7 @@ tr_TR: follow_quote: "alıntılanan gönderiye git" show_full: "Gönderinin Tamamını Göster" show_hidden: "Yok sayılan içeriği görüntüleyin." - deleted_by_author: - one: "(yazarı tarafından geri alınan gönderi, bildirilmediği takdirde %{count} saat içinde otomatik olarak silinecek.)" - other: "(yazarı tarafından geri alınan gönderi, bildirilmediği takdirde %{count} saat içinde otomatik olarak silinecek.)" + deleted_by_author_simple: "(gönderi yazarı tarafından silindi)" collapse: "daralt" expand_collapse: "genişlet/daralt" locked: "personel bu yayının düzenlenmesini kilitledi" @@ -4099,7 +4099,6 @@ tr_TR: upload_successful: "Yükleme başarılı oldu. Kelimeler eklendi." test: button_label: "Deneme" - modal_title: "Deneme'%{action}' İzlenen Kelimeler" description: "İzlenen kelimelerle eşleşenleri kontrol etmek için aşağıya metin girin" found_matches: "Bulunan eşlemeler:" no_matches: "Hiçbir eşleşme bulunamadı" @@ -4155,6 +4154,8 @@ tr_TR: suspend_reason_hidden_label: "Neden askıya alıyorsun? Kullanıcı giriş yapmaya çalıştığında yazdığın metni görecek. Metin lütfen kısa olsun." suspend_reason: "Sebep" suspend_reason_title: "Askıya Alma Sebebi" + suspend_reasons: + combative: "Çok kavgacı" suspend_message: "E Posta Mesajı" suspend_message_placeholder: "İsteğe bağlı olarak, askıya alma sebebini daha uzun yazabilirsin. Askıya alma sebebi kullanıcıya e-postayla gönderilecek." suspended_by: "Askıya alan" diff --git a/config/locales/client.uk.yml b/config/locales/client.uk.yml index 02caac70cbb06..ad18ab22c3971 100644 --- a/config/locales/client.uk.yml +++ b/config/locales/client.uk.yml @@ -684,8 +684,11 @@ uk: add_members: title: "Додати учасників до %{group_name}" description: "Ви також можете додати список учасників – значення, розділені комами." - usernames: "Введіть імена користувачів або адреси електронної пошти" - input_placeholder: "Ім'я користувачів або адреси електронної пошти" + usernames_or_emails: + title: "Введіть імена користувачів або адреси електронної пошти" + input_placeholder: "Ім'я користувачів або адреси електронної пошти" + usernames: + input_placeholder: "Імена користувачів" notify_users: "Сповістити користувачів" requests: title: "Запити" @@ -2453,7 +2456,8 @@ uk: title: "Повільний режим" select: "Користувачі можуть дописувати в цій темі лише один раз на:" description: "Щоб сприяти продуманому обговоренню в активних або суперечливих дискусіях, користувачі повинні почекати, перш ніж знову публікувати дописи в цю тему." - save: "Увімкнути" + enable: "Увімкнути" + update: "Оновити" enabled_until: "Увімкнено до:" remove: "Вимкнути" hours: "Годин:" @@ -2845,11 +2849,6 @@ uk: few: "Ви обрали дописів: %{count}." many: "Ви обрали дописів: %{count}." other: "Ви обрали дописів: %{count}." - deleted_by_author: - one: "(Тема відкликана автором та буде автоматично видалена протягом %{count} години, якщо тільки на повідомлення не надійде скарга)" - few: "(Тема відкликана автором та буде автоматично видалена протягом %{count} години, якщо тільки на повідомлення не надійде скарга)" - many: "(Тема відкликана автором та буде автоматично видалена протягом %{count} годин, якщо тільки на повідомлення вступить скарга)" - other: "(Тема відкликана автором та буде автоматично видалена протягом %{count} годин, якщо тільки на повідомлення вступить скарга)" post: quote_reply: "Цитата" quote_share: "Поширити" @@ -2864,11 +2863,6 @@ uk: follow_quote: "перейти до цитованого допису" show_full: "Показати Увесь Допис" show_hidden: "Перегляд ігнорованого вмісту." - deleted_by_author: - one: "(повідомлення відкликано автором та буде автоматично видалено протягом %{count} години, якщо тільки на повідомлення не надійде скарга)" - few: "(повідомлення відкликано автором та буде автоматично видалено протягом %{count} годин, якщо тільки на повідомлення вступить скарга)" - many: "(повідомлення відкликано автором та буде автоматично видалено протягом %{count} годин, якщо тільки на повідомлення вступить скарга)" - other: "(повідомлення відкликано автором та буде автоматично видалено протягом %{count} годин, якщо тільки на повідомлення вступить скарга)" collapse: "згорнути" expand_collapse: "розгорнути/згорнути" locked: "співробітник заблокував це повідомлення для редагування" @@ -4715,7 +4709,6 @@ uk: upload_successful: "Завантаження пройшло успішно. Слова додані." test: button_label: "Тест" - modal_title: "Тест '%{action}' Відслідковувані Слова" description: "Введіть текст нижче, щоб перевірити збіги зі стоп словами" found_matches: "Знайдені збіги:" no_matches: "Збігів, не знайдено" @@ -4774,7 +4767,6 @@ uk: suspend_reasons: not_listening_to_staff: "Не послухав рекомендації персоналу" consuming_staff_time: "Витрачається забагато часу персоналу" - combatative: "Занадто агресивний" in_wrong_place: "Не в тому місці" no_constructive_purpose: "Немає конструктиву його дій, окрім створення розколу у спільноті" custom: "Власний..." diff --git a/config/locales/client.ur.yml b/config/locales/client.ur.yml index 7f51f273f91d9..33b018993af96 100644 --- a/config/locales/client.ur.yml +++ b/config/locales/client.ur.yml @@ -518,6 +518,9 @@ ur: groups: member_added: "شامل کر دیا گیا" member_requested: "درخواست کیا گیا" + add_members: + usernames: + input_placeholder: "صارف نام" requests: title: "درخواستیں" reason: "وجہ" @@ -1820,7 +1823,7 @@ ur: jump_reply_down: اِس سے نئے جواب پر جائیں deleted: "ٹاپک حذف کردیا گیا ہے" slow_mode_update: - save: "فعال کریں" + enable: "فعال کریں" remove: "غیر فعال کریں" topic_status_update: title: "ٹاپک ٹائمر" @@ -2113,9 +2116,6 @@ ur: description: one: آپ نے %{count} پوسٹ منتخب کی ہے۔ other: "آپ نے %{count} پوسٹس منتخب کی ہیں۔" - deleted_by_author: - one: "(مصنف نے ٹاپک واپس لے لیا، %{count} گھنٹے میں یہ خود کار طریقے سے حذف کر دیا جائے گا الا یہ کہ اِسے فلیگ کیا گیا ہو)" - other: "(مصنف نے ٹاپک واپس لے لیا، %{count} گھنٹوں میں یہ خود کار طریقے سے حذف کر دیا جائے گا الا یہ کہ اِسے فلیگ کیا گیا ہو)" post: quote_reply: "اقتباس کریں" quote_share: "شیئر" @@ -2128,9 +2128,6 @@ ur: follow_quote: "اقتباس کی گئی پوسٹ پر جائیں" show_full: "مکمل پوسٹ دکھائیں" show_hidden: "نظر انداز کردہ مواد دکھایں۔" - deleted_by_author: - one: "(مصنف نے پوسٹ واپس لے لی، %{count} گھنٹے میں یہ خود کار طریقے سے حذف کر دی جائے گی الا یہ کہ اِسے فلیگ کیا گیا ہو)" - other: "(مصنف نے پوسٹ واپس لے لی، %{count} گھنٹوں میں یہ خود کار طریقے سے حذف کر دی جائے گی الا یہ کہ اِسے فلیگ کیا گیا ہو)" collapse: "بند کریں" expand_collapse: "کھولیں/بند کریں" locked: "ایک اسٹاف کے رکن نے اِس پوسٹ کو ترمیم ہونے سے روک دیا ہے" @@ -3579,7 +3576,6 @@ ur: upload_successful: "اَپ لوڈ کامیاب ہوا۔ الفاظ شامل کردیے گئے ہیں۔" test: button_label: "ٹیسٹ" - modal_title: "ٹیسٹ '%{action}' نظر رکھے ہوئے الفاظ" description: "نظر رکھے ہوئے الفاظ کے ساتھ مَیچ چَیک کرنے کیلئے نیچے ٹَیکسٹ درج کریں۔" found_matches: "ملے مَیچ:" no_matches: "کوئی میل نہیں ملے" diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml index 7384f9b1eb1bc..6c495f94c9632 100644 --- a/config/locales/client.vi.yml +++ b/config/locales/client.vi.yml @@ -534,8 +534,11 @@ vi: add_members: title: "Thêm thành viên vào %{group_name}" description: "Bạn cũng có thể dán vào danh sách được phân tách bằng dấu phẩy." - usernames: "Nhập tên người dùng hoặc địa chỉ email" - input_placeholder: "Tên người dùng hoặc email" + usernames_or_emails: + title: "Nhập tên người dùng hoặc địa chỉ email" + input_placeholder: "Tên người dùng hoặc email" + usernames: + input_placeholder: "Tên người dùng" notify_users: "Thông báo cho người dùng" requests: title: "Những yêu cầu" @@ -2054,7 +2057,7 @@ vi: title: "Chế độ chậm" select: "Người dùng chỉ có thể đăng trong chủ đề này một lần mỗi lần:" description: "Người dùng phải đợi trước khi đăng lại chủ đề này để người khác có thời gian trả lời" - save: "Bật" + enable: "Kích hoạt" remove: "Tắt" hours: "Giờ:" minutes: "Phút:" @@ -2377,8 +2380,6 @@ vi: deselect_all: bỏ chọn tất cả description: other: "Bạn đã chọn %{count} bài viết." - deleted_by_author: - other: "(chủ đề bị tác giả thu hồi, sẽ tự động bị xóa sau %{count} giờ trừ khi bị gắn cờ)" post: quote_reply: "Trích dẫn" quote_share: "Chia sẻ" @@ -2391,8 +2392,6 @@ vi: follow_quote: "đến bài viết trích dẫn" show_full: "Hiển thị đầy đủ bài viết" show_hidden: "Xem nội dung bị bỏ qua." - deleted_by_author: - other: "(bài viết theo tác giả sẽ được xóa tự động sau %{count} giờ, trừ khi đã đánh dấu)" collapse: "Thu nhỏ" expand_collapse: "mở/đóng" locked: "MOD đã khóa bài đăng này không được chỉnh sửa" diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml index 9c3470bfcc8dc..e2152435d5ca1 100644 --- a/config/locales/client.zh_CN.yml +++ b/config/locales/client.zh_CN.yml @@ -556,8 +556,12 @@ zh_CN: add_members: title: "添加成员到 %{group_name}" description: "你也可以粘贴一个以逗号分隔的列表。" - usernames: "输入用户名或电子邮件地址" - input_placeholder: "用户名或电子邮件" + usernames_or_emails: + title: "输入用户名或电子邮件地址" + input_placeholder: "用户名或电子邮件" + usernames: + title: "输入用户名" + input_placeholder: "用户名" notify_users: "通知用户" requests: title: "请求" @@ -2185,7 +2189,8 @@ zh_CN: title: "慢速模式" select: "用户只能在这个话题中发言一次:" description: "为了提高回帖太快或有争议内容的话题的讨论质量,用户再次发言之前必须稍作等待。" - save: "启用" + enable: "启用" + update: "更新" enabled_until: "启用直到:" remove: "停用" hours: "小时:" @@ -2535,8 +2540,7 @@ zh_CN: deselect_all: 取消全选 description: other: "已选择 %{count} 个帖子。" - deleted_by_author: - other: "(话题被作者删除,如无标记将在 %{count} 小时后自动删除)" + deleted_by_author_simple: "(话题已被作者删除)" post: quote_reply: "引用" quote_share: "分享" @@ -2551,8 +2555,7 @@ zh_CN: follow_quote: "转到所引用的帖子" show_full: "显示完整帖子" show_hidden: "显示已忽略内容。" - deleted_by_author: - other: "(帖子被作者删除,如无标记将在 %{count} 小时后自动删除)" + deleted_by_author_simple: "(帖子已被作者删除)" collapse: "折叠" expand_collapse: "展开/折叠" locked: "一个管理人员锁定了该帖的编辑" @@ -3902,7 +3905,7 @@ zh_CN: yaml: text: "YAML" title: "用 YAML 格式定义主题设置" - scss_color_variables_warning: "不建议在主题中使用核心 SCSS 颜色变量,请改用 CSS 自定义属性,详细信息参见 本指南" + scss_color_variables_warning: '不建议在主题中使用核心 SCSS 颜色变量,请改用 CSS 自定义属性,详细信息参见 本指南' scss_warning_inline: "不建议在主题中使用核心 SCSS 颜色变量。" colors: select_base: @@ -4257,7 +4260,6 @@ zh_CN: upload_successful: "上传成功。敏感词已添加。" test: button_label: "测试" - modal_title: "测试“%{action}”敏感词" description: "在下方输入文本以检查匹配的敏感词" found_matches: "发现匹配:" no_matches: "无符合的结果" @@ -4316,7 +4318,7 @@ zh_CN: suspend_reasons: not_listening_to_staff: "不理会管理人员的反馈" consuming_staff_time: "消耗了过多的管理人员时间" - combatative: "太好斗了" + combative: "过于好斗" in_wrong_place: "在错误的地方" no_constructive_purpose: "除了在社区内引起异议外,他们的行动没有任何建设性的目的" custom: "自定义..." diff --git a/config/locales/client.zh_TW.yml b/config/locales/client.zh_TW.yml index 40cc1a991eb87..277c15116fab6 100644 --- a/config/locales/client.zh_TW.yml +++ b/config/locales/client.zh_TW.yml @@ -459,6 +459,9 @@ zh_TW: groups: member_added: "已新增" member_requested: "請求" + add_members: + usernames: + input_placeholder: "使用者名稱" requests: title: "請求" reason: "原因" @@ -1703,7 +1706,7 @@ zh_TW: jump_reply_down: 跳到更晚的回覆 deleted: "此話題已被刪除" slow_mode_update: - save: "啟用" + enable: "啟用" remove: "停用" topic_status_update: title: "話題計時器" @@ -1987,8 +1990,6 @@ zh_TW: deselect_all: 取消選取 description: other: "你已選擇了 %{count} 篇貼文。" - deleted_by_author: - other: "(主題已被作者撤回,將在%{count}小時內自動刪除,若有標記便不會刪除)" post: quote_reply: "引用" quote_share: "分享" @@ -2001,8 +2002,6 @@ zh_TW: follow_quote: "跳到引用的貼文" show_full: "顯示所有貼文" show_hidden: "查看忽略內容" - deleted_by_author: - other: "( 貼文已被作者撤回,除非被檢舉,否則在 %{count} 小時內將自動刪除。)" collapse: "收起" expand_collapse: "展開/收合" locked: "管理員已鎖定此貼文,目前無法編輯" diff --git a/config/locales/server.be.yml b/config/locales/server.be.yml index 90d727e1e69fd..1c76ed32b91b4 100644 --- a/config/locales/server.be.yml +++ b/config/locales/server.be.yml @@ -2106,8 +2106,6 @@ be: Змяніць першае паведамленне ў гэтай тэме, каб змяніць змесціва {PAGE_NAME} старонкі%. guidelines_topic: title: "часта задаюць пытанні" - body: | - < tos_topic: title: "Ўмовы абслугоўвання" body: | diff --git a/config/locales/server.ca.yml b/config/locales/server.ca.yml index 5c840a7995993..118bc52a7d6ae 100644 --- a/config/locales/server.ca.yml +++ b/config/locales/server.ca.yml @@ -2719,7 +2719,6 @@ ca: Edita la primera publicació en aquest tema per a canviar els continguts de la pàgina %{page_name}. guidelines_topic: title: "Guies/PMF" - body: " \n\n## [Aquest és un lloc web civilitzat per a la discussió pública](#civilized)\n\nTracteu aquest fòrum de discussió amb el mateix respecte amb què tractaríeu un parc públic. Nosaltres també som un recurs comunitari compartit: un lloc web per a compartir habilitats, coneixements i interessos mitjançant una conversa permanent. \n\nAquestes normes no són rígides i estrictes, sinó pautes per a ajudar el judici humà de la nostra comunitat i mantenir aquest lloc web net i endreçat per al debat públic civilitzat. \n\n\n\n## [Millorem la discussió](#improve)\n\nAjudeu-nos a fer d'aquest lloc web un lloc web ideal per a la discussió treballant sempre per millorar la discussió d'alguna manera, encara que sigui poca cosa. Si no esteu segur que la vostra publicació contribueix a la conversa d'alguna manera, penseu en el que voleu dir i torneu-ho a provar més tard.\n\nEls temes tractats aquí ens importen, i volem que actueu com si també us importessin. Sigueu respectuós amb els temes i les persones que els discuteixen, fins i tot si no esteu d'acord amb alguna cosa del que es diu.\n\nUna manera de millorar la discussió és descobrir les que ja estan en marxa. Dediqueu algun temps a navegar pels temes abans de respondre o de començar el vostre propi, i tindreu més possibilitats de conèixer altres persones que comparteixen els vostres interessos. \n\n\n\n## [Sigueu amable, fins i tot quan no esteu d'acord](#agreeable)\n\nPotser voleu respondre a alguna cosa mostrant-vos en desacord. Això està bé. Però no oblideu _criticar idees, no persones_. Eviteu:\n\n* els insults\n* els atacs _ad hominem_\n* respondre al to d'una publicació en comptes de respondre al seu contingut\n* la rèplica instintiva, reflexa\n\nEn lloc d'això, proporcioneu contraarguments raonats que millorin la conversa.\n\n\n\n## [Els vostres comptes de participació](#participate)\n\nLes converses que tenim aquí estableixen el to per a cada nouvingut. Ajudeu-nos a influir en el futur d'aquesta comunitat triant converses que facin d'aquest fòrum un lloc web interessant, i evitant les que no ho fan.\n\nDiscourse proporciona eines que permeten a la comunitat identificar col·lectivament les millors (i les pitjors) contribucions: adreces d'interès, gustos, banderes, respostes, edicions, etc. Utilitzeu aquestes eines per a millorar la vostra pròpia experiència i la de tothom.\n\nDeixem la comunitat millor que com l'hem trobada.\n\n\n\n## [Si veieu un problema, marqueu-ho amb una bandera](#flag-problems)\n\nEls moderadors tenen una autoritat especial; són els responsables del fòrum. Però vós també. Amb la vostra ajuda, els moderadors poden ser facilitadors de la comunitat, no sols els vigilants o els policies. \n\nQuan vegeu un mal comportament, no respongueu. Això fomenta el mal comportament reconeixent-lo, consumeix la vostra energia i fa perdre el temps de tothom. _Simplement marca-ho amb una bandera_. Si s'acumulen prou banderes, es durà a terme una acció, de manera automàtica o bé amb la intervenció del moderador. \n\nPer a mantenir la comunitat, els moderadors es reserven el dret d'eliminar qualsevol contingut i qualsevol compte d'usuari per qualsevol motiu en qualsevol moment. Els moderadors no previsualitzen les publicacions noves; els moderadors i els operadors del lloc web no es responsabilitzen dels continguts publicats per la comunitat. \n\n\n\n## [Sigeu sempre educat](#be-civil)\n\nNo hi ha res que espatlli una conversa sana com la grolleria: \n* Sigueu educat. No publiqueu res que una persona raonable consideri un discurs ofensiu, abusiu o d'odi.\n* Manteniu-ho net. No publiqueu res obscè o sexualment explícit.\n* Respecteu-vos mútuament. No assetgeu ni ofengueu a ningú, no suplanteu cap persona ni exposeu la seva informació privada. \n* Respecteu el nostre fòrum. No publiqueu correu brossa ni feu actes vandàlics en el fòrum. \n\nNo són termes concrets amb definicions precises: eviteu la mera _aparença_ de qualsevol d'aquestes coses. Si no esteu segur, pregunteu-vos com us sentiríeu si la vostra publicació aparegués a la primera pàgina del New York Times. \n\nAquest és un fòrum públic i els motors de cerca indexen aquestes discussions. Manteniu el llenguatge, els enllaços i les imatges segurs per a familiars i amics. \n\n\n\n## [Manteniu les coses endreçades](#keep-tidy)\n\nFeu l'esforç de posar les coses al lloc web adequat, de manera que puguem dedicar més temps a parlar i menys a netejar. Així: \n* No inicieu un tema en la categoria incorrecta. \n* No publiqueu el mateix de manera encreuada en diversos temes. \n* No publiqueu respostes sense contingut. \n* No desvieu un tema canviant-lo a mitjan conversa. \n* No signeu les vostres publicacions: cada entrada té la vostra informació de perfil adjunta. \n\nEn comptes de publicar \"+1\" o \"D'acord\", utilitzeu el botó 'M'agrada'. En comptes de portar un tema existent en una direcció radicalment diferent, utilitzeu 'Respon com a tema enllaçat'. \n\n\n\n## [Publiqueu sols les vostres coses](#stealing)\n\nNo podeu publicar res digital que pertanyi a algú sense permís. No podeu publicar descripcions, enllaços o mètodes per a robar la propietat intel·lectual d'algú (programari, vídeo, àudio, imatges) o per a violar qualsevol altra llei. \n\n\n\n## [Amb el vostre suport](#power)\n\nAquest lloc web és operat per l'[equip responsable](%{base_path}/about) i la comunitat. Si teniu més preguntes sobre com funcionen les coses aquí, obriu un tema nou a la [secció de comentaris sobre el lloc web](%{base_path}/c/site-feedback) i en parlem! Si hi ha un problema crític o urgent que no pot ser manejat per un metatema o una bandera, poseu-vos en contacte amb nosaltres en la [pàgina de l'equip responsable](%{base_path}/about). \n\n\n\n## [Condicions del servei](#tos) \n\nSí, el burocratès és avorrit, però hem de protegir-nos a nosaltres —i per extensió, a vosaltres i les vostres dades— contra gent poc amigable. Tenim unes [condicions del servei](%{base_path}/tos) que descriuen el vostre (i el nostre) comportament i els drets relacionats amb el contingut, la privacitat i les lleis. Per a utilitzar aquest servei, heu d'acceptar les nostres [condicions del servei](%{base_path}/tos).\n" tos_topic: title: "Condicions del servei" body: "Aquestes condicions regeixen l'ús del fòrum d'Internet en <%{base_url}>. Per a utilitzar el fòrum, heu d'acceptar aquests termes amb %{company_name}, la companyia que porta el fòrum. \n\nL'empresa pot oferir altres productes i serveis sota diferents condicions. Aquestes condicions solament s'apliquen a l'ús del fòrum. \n\nSalteu a: \n- [Condicions importants](#heading--permission)\n- [El vostre permís per a utilitzar el fòrum](#heading--permission) \n- [Condicions d'ús del fòrum](#heading--conditions) \n- [Ús acceptable](#heading--acceptable-use) \n- [Normes de contingut](#heading--content-standards) \n- [Aplicació](#heading-enforcement) \n- [El vostre compte](#heading--your-account) \n- [El vostre contingut](#heading--your-account) \n- [La vostra responsabilitat](#heading--your-responsibility) \n- [Exempció de responsabilitat](#heading--disclaimers) \n- [Límits de responsabilitat](#heading--liability) \n- [Comentaris](#heading--feedback)\n- [Terminació](#heading--termination) \n- [Disputes](#heading--disputes) \n- [Condicions generals](#heading--general) \n- [Contacte](#heading-contact) \n- [Canvis](#heading--changes) \n\n

Condicions importants

\n\n***Aquestes condicions inclouen una sèrie de disposicions importants que afecten els vostres drets i responsabilitats, com ara les renúncies a [exempcions de responsabilitat](#heading--disclaimers), límits en la responsabilitat de l'empresa respecte a vós en [Límit de responsabilitat](#heading--liability), el vostre consentiment a cobrir l'empresa per danys causats pel vostre ús indegut del fòrum en [La vostra responsabilitat](#heading--responsibility) i un acord d'arbitratge de controvèrsies en [Disputes](#header--disputes).***\n\n

El vostre permís per a utilitzar el fòrum

\n\nSegons aquestes condicions, l'empresa us dóna permís per a utilitzar el fòrum. Tothom ha d'acceptar aquestes condicions per a fer servir el fòrum. \n\n

Condicions d'ús del fòrum

\n\nEl permís que se us dóna per a utilitzar el fòrum està subjecte a les condicions següents: \n\n1. Heu de tenir almenys tretze anys. \n\n2. No podreu fer servir més el fòrum si l'empresa es posa en contacte directament amb vós per a dir-vos que no podeu. \n\n3. Heu d'utilitzar el fòrum d'acord amb l'[Ús acceptable](#heading--acceptable-use) i les [Normes de contingut](#heading--content-standards).\n\n

Ús acceptable

\n\n1. No heu d'infringir la llei fent servir el fòrum. \n\n2. No podeu utilitzar o intentar utilitzar el compte d'altres persones en el fòrum sense el seu permís específic. \n\n3. No podeu comprar, vendre o comerciar en noms d'usuari o altres identificadors únics en el fòrum. \n\n4. No podeu enviar anuncis, cartes en cadena ni altres sol·licituds per mitjà del fòrum ni utilitzar el fòrum per a recopilar adreces o altres dades personals per a llistes de correu comercials o bases de dades. \n\n5. No podeu automatitzar l'accés al fòrum ni monitorar el fòrum, com ara amb un rastrejador web, un complement o connector del navegador, o un altre programa d'ordinador que no sigui un navegador web. Podeu rastrejar el fòrum per a indexar-lo per a un motor de cerca disponible públicament, si en gestioneu un. \n\n6. No podeu fer servir el fòrum per a enviar correu electrònic a llistes de distribució, grups de notícies o àlies de correu de grup. \n\n7. No podeu induir a pensar falsament que esteu afiliats amb la companyia o que teniu el seu suport. \n\n8. No podeu enllaçar a imatges o altres continguts que no siguin hipertext del fòrum en altres pàgines web. \n\n9. No podeu suprimir cap marca que mostri la propietat propietària dels materials que baixeu del fòrum. \n\n10. No podeu mostrar cap part del fòrum a altres llocs web amb ` + RAW + end + + def article_html + layout.to_html end + def image_html + return if Onebox::Helpers.blank?(data[:image]) + + escaped_src = ::Onebox::Helpers.normalize_url_for_output(data[:image]) + + alt = data[:description] || data[:title] + width = data[:image_width] || data[:thumbnail_width] || data[:width] + height = data[:image_height] || data[:thumbnail_height] || data[:height] + + "#{alt}" + end + + def video_html + escaped_video_src = ::Onebox::Helpers.normalize_url_for_output(data[:video]) + escaped_image_src = ::Onebox::Helpers.normalize_url_for_output(data[:image]) + + <<-HTML + + HTML + end + + def embedded_html + fragment = Nokogiri::HTML5::fragment(data[:html]) + fragment.css("img").each { |img| img["class"] = "thumbnail" } + if iframe = fragment.at_css("iframe") + iframe.remove_attribute("style") + iframe["width"] = data[:width] || "100%" + iframe["height"] = data[:height] + iframe["scrolling"] = "no" + iframe["frameborder"] = "0" + end + fragment.to_html + end end end end diff --git a/lib/onebox/engine/amazon_onebox.rb b/lib/onebox/engine/amazon_onebox.rb new file mode 100644 index 0000000000000..4ea26aa9189e4 --- /dev/null +++ b/lib/onebox/engine/amazon_onebox.rb @@ -0,0 +1,198 @@ +# frozen_string_literal: true + +require 'json' +require "onebox/open_graph" + +module Onebox + module Engine + class AmazonOnebox + include Engine + include LayoutSupport + include HTML + + always_https + matches_regexp(/^https?:\/\/(?:www\.)?(?:smile\.)?(amazon|amzn)\.(?com|ca|de|it|es|fr|co\.jp|co\.uk|cn|in|com\.br|com\.mx|nl|pl|sa|sg|se|com\.tr|ae)\//) + + def url + @raw ||= nil + + # If possible, fetch the cached HTML body immediately so we can + # try to grab the canonical URL from that document, + # rather than guess at the best URL structure to use + if !@raw && has_cached_body + @raw = Onebox::Helpers.fetch_html_doc(@url, http_params, body_cacher) + end + + if @raw + canonical_link = @raw.at('//link[@rel="canonical"]/@href') + return canonical_link.to_s if canonical_link + end + + if match && match[:id] + id = Addressable::URI.encode_component(match[:id], Addressable::URI::CharacterClasses::PATH) + return "https://www.amazon.#{tld}/dp/#{id}" + end + + @url + end + + def tld + @tld ||= @@matcher.match(@url)["tld"] + end + + def http_params + if @options && @options[:user_agent] + { 'User-Agent' => @options[:user_agent] } + end + end + + private + + def has_cached_body + body_cacher&.respond_to?('cache_response_body?') && + body_cacher.cache_response_body?(uri.to_s) && + body_cacher.cached_response_body_exists?(uri.to_s) + end + + def match + @match ||= @url.match(/(?:d|g)p\/(?:product\/|video\/detail\/)?(?[A-Z0-9]+)(?:\/|\?|$)/mi) + end + + def image + if (main_image = raw.css("#main-image")) && main_image.any? + attributes = main_image.first.attributes + + if attributes["data-a-hires"] + return attributes["data-a-hires"].to_s + elsif attributes["data-a-dynamic-image"] + return ::JSON.parse(attributes["data-a-dynamic-image"].value).keys.first + end + end + + if (landing_image = raw.css("#landingImage")) && landing_image.any? + attributes = landing_image.first.attributes + + if attributes["data-old-hires"] + return attributes["data-old-hires"].to_s + else + return landing_image.first["src"].to_s + end + end + + if (ebook_image = raw.css("#ebooksImgBlkFront")) && ebook_image.any? + ::JSON.parse(ebook_image.first.attributes["data-a-dynamic-image"].value).keys.first + end + end + + def price + # get item price (Amazon markup is inconsistent, deal with it) + if raw.css("#priceblock_ourprice .restOfPrice")[0] && raw.css("#priceblock_ourprice .restOfPrice")[0].inner_text + "#{raw.css("#priceblock_ourprice .restOfPrice")[0].inner_text}#{raw.css("#priceblock_ourprice .buyingPrice")[0].inner_text}.#{raw.css("#priceblock_ourprice .restOfPrice")[1].inner_text}" + elsif raw.css("#priceblock_dealprice") && (dealprice = raw.css("#priceblock_dealprice span")[0]) + dealprice.inner_text + elsif !raw.css("#priceblock_ourprice").inner_text.empty? + raw.css("#priceblock_ourprice").inner_text + else + raw.css(".mediaMatrixListItem.a-active .a-color-price").inner_text + end + end + + def multiple_authors(authors_xpath) + raw + .xpath(authors_xpath) + .map { |a| a.inner_text.strip } + .join(", ") + end + + def data + og = ::Onebox::OpenGraph.new(raw) + + if raw.at_css('#dp.book_mobile') # printed books + title = raw.at("h1#title")&.inner_text + authors = raw.at_css('#byline_secondary_view_div') ? multiple_authors("//div[@id='byline_secondary_view_div']//span[@class='a-text-bold']") : raw.at("#byline")&.inner_text + rating = raw.at("#averageCustomerReviews_feature_div .a-icon")&.inner_text || raw.at("#cmrsArcLink .a-icon")&.inner_text + + table_xpath = "//div[@id='productDetails_secondary_view_div']//table[@id='productDetails_techSpec_section_1']" + isbn = raw.xpath("#{table_xpath}//tr[8]//td").inner_text.strip + + # if ISBN is misplaced or absent it's hard to find out which data is + # available and where to find it so just set it all to nil + if /^\d(\-?\d){12}$/.match(isbn) + publisher = raw.xpath("#{table_xpath}//tr[1]//td").inner_text.strip + published = raw.xpath("#{table_xpath}//tr[2]//td").inner_text.strip + book_length = raw.xpath("#{table_xpath}//tr[6]//td").inner_text.strip + else + isbn = publisher = published = book_length = nil + end + + result = { + link: url, + title: title, + by_info: authors, + image: og.image || image, + description: raw.at("#productDescription")&.inner_text, + rating: "#{rating}#{', ' if rating && (!isbn&.empty? || !price&.empty?)}", + price: price, + isbn_asin_text: "ISBN", + isbn_asin: isbn, + publisher: publisher, + published: "#{published}#{', ' if published && !price&.empty?}" + } + + elsif raw.at_css('#dp.ebooks_mobile') # ebooks + title = raw.at("#ebooksTitle")&.inner_text + authors = raw.at_css('#a-popover-mobile-udp-contributor-popover-id') ? multiple_authors("//div[@id='a-popover-mobile-udp-contributor-popover-id']//span[contains(@class,'a-text-bold')]") : (raw.at("#byline")&.inner_text&.strip || raw.at("#bylineInfo")&.inner_text&.strip) + rating = raw.at("#averageCustomerReviews_feature_div .a-icon")&.inner_text || raw.at("#cmrsArcLink .a-icon")&.inner_text || raw.at("#acrCustomerReviewLink .a-icon")&.inner_text + + table_xpath = "//div[@id='detailBullets_secondary_view_div']//ul" + asin = raw.xpath("#{table_xpath}//li[4]/span/span[2]").inner_text + + # if ASIN is misplaced or absent it's hard to find out which data is + # available and where to find it so just set it all to nil + if /^[0-9A-Z]{10}$/.match(asin) + publisher = raw.xpath("#{table_xpath}//li[2]/span/span[2]").inner_text + published = raw.xpath("#{table_xpath}//li[1]/span/span[2]").inner_text + else + asin = publisher = published = nil + end + + result = { + link: url, + title: title, + by_info: authors, + image: og.image || image, + description: raw.at("#productDescription")&.inner_text, + rating: "#{rating}#{', ' if rating && (!asin&.empty? || !price&.empty?)}", + price: price, + isbn_asin_text: "ASIN", + isbn_asin: asin, + publisher: publisher, + published: "#{published}#{', ' if published && !price&.empty?}" + } + + else + title = og.title || CGI.unescapeHTML(raw.css("title").inner_text) + result = { + link: url, + title: title, + image: og.image || image, + price: price + } + + result[:by_info] = raw.at("#by-line") + result[:by_info] = Onebox::Helpers.clean(result[:by_info].inner_html) if result[:by_info] + + summary = raw.at("#productDescription") + + description = og.description || summary&.inner_text + description ||= raw.css("meta[name=description]").first&.[]("content") + result[:description] = CGI.unescapeHTML(Onebox::Helpers.truncate(description, 250)) if description + end + + result[:price] = nil if result[:price].start_with?("$0") || result[:price] == 0 + + result + end + end + end +end diff --git a/lib/onebox/engine/asciinema_onebox.rb b/lib/onebox/engine/asciinema_onebox.rb new file mode 100644 index 0000000000000..f6c27108f1927 --- /dev/null +++ b/lib/onebox/engine/asciinema_onebox.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class AsciinemaOnebox + include Engine + include StandardEmbed + + always_https + matches_regexp(/^https?:\/\/asciinema\.org\/a\/[\p{Alnum}_\-]+$/) + + def to_html + "" + end + + def placeholder_html + "" + end + + private + + def match + @match ||= @url.match(/asciinema\.org\/a\/(?[\p{Alnum}_\-]+)$/) + end + end + end +end diff --git a/lib/onebox/engine/audio_onebox.rb b/lib/onebox/engine/audio_onebox.rb new file mode 100644 index 0000000000000..1ac09ce11d021 --- /dev/null +++ b/lib/onebox/engine/audio_onebox.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class AudioOnebox + include Engine + + matches_regexp(/^(https?:)?\/\/.*\.(mp3|ogg|opus|wav|m4a)(\?.*)?$/i) + + def always_https? + AllowlistedGenericOnebox.host_matches(uri, AllowlistedGenericOnebox.https_hosts) + end + + def to_html + escaped_url = ::Onebox::Helpers.normalize_url_for_output(@url) + + <<-HTML + + HTML + end + + def placeholder_html + ::Onebox::Helpers.audio_placeholder_html + end + end + end +end diff --git a/lib/onebox/engine/audioboom_onebox.rb b/lib/onebox/engine/audioboom_onebox.rb new file mode 100644 index 0000000000000..89986f46857b6 --- /dev/null +++ b/lib/onebox/engine/audioboom_onebox.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class AudioboomOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/audioboom\.com\/posts\/\d+/) + always_https + + def placeholder_html + oembed = get_oembed + + <<-HTML + + HTML + end + + def to_html + get_oembed.html + end + end + end +end diff --git a/lib/onebox/engine/band_camp_onebox.rb b/lib/onebox/engine/band_camp_onebox.rb new file mode 100644 index 0000000000000..a31e5890322ef --- /dev/null +++ b/lib/onebox/engine/band_camp_onebox.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class BandCampOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/.*\.bandcamp\.com\/(album|track)\//) + always_https + requires_iframe_origins "https://bandcamp.com" + + def placeholder_html + og = get_opengraph + "" + end + + def to_html + og = get_opengraph + escaped_src = og.video_secure_url || og.video + + <<-HTML + + HTML + end + end + end +end diff --git a/lib/onebox/engine/cloud_app_onebox.rb b/lib/onebox/engine/cloud_app_onebox.rb new file mode 100644 index 0000000000000..f1b985edf7c60 --- /dev/null +++ b/lib/onebox/engine/cloud_app_onebox.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class CloudAppOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/cl\.ly/) + always_https + + def to_html + og = get_opengraph + + if !og.image.nil? + image_html(og) + elsif og.title.to_s[/\.(mp4|ogv|webm)$/] + video_html(og) + else + link_html(og) + end + end + + private + + def link_html(og) + <<-HTML + + #{og.title} + + HTML + end + + def video_html(og) + direct_src = ::Onebox::Helpers.normalize_url_for_output("#{og.get(:url)}/#{og.title}") + + <<-HTML + + HTML + end + + def image_html(og) + <<-HTML + + CloudApp + + HTML + end + end + end +end diff --git a/lib/onebox/engine/coub_onebox.rb b/lib/onebox/engine/coub_onebox.rb new file mode 100644 index 0000000000000..7e57e45429622 --- /dev/null +++ b/lib/onebox/engine/coub_onebox.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class CoubOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/coub\.com\/view\//) + always_https + + def placeholder_html + oembed = get_oembed + "" + end + + def to_html + get_oembed.html + end + end + end +end diff --git a/lib/onebox/engine/facebook_media_onebox.rb b/lib/onebox/engine/facebook_media_onebox.rb new file mode 100644 index 0000000000000..903eccb131a0e --- /dev/null +++ b/lib/onebox/engine/facebook_media_onebox.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class FacebookMediaOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/.*\.facebook\.com\/(\w+)\/(videos|\?).*/) + always_https + requires_iframe_origins "https://www.facebook.com" + + def to_html + metadata = get_twitter + if metadata.present? && metadata[:card] == "player" && metadata[:player].present? + <<-HTML + + HTML + else + html = Onebox::Engine::AllowlistedGenericOnebox.new(@url, @timeout).to_html + return if Onebox::Helpers.blank?(html) + html + end + end + end + end +end diff --git a/lib/onebox/engine/five_hundred_px_onebox.rb b/lib/onebox/engine/five_hundred_px_onebox.rb new file mode 100644 index 0000000000000..806b5f9e6aff6 --- /dev/null +++ b/lib/onebox/engine/five_hundred_px_onebox.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class FiveHundredPxOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/500px\.com\/photo\/\d+\//) + always_https + + def to_html + og = get_opengraph + "" + end + end + end +end diff --git a/lib/onebox/engine/flickr_onebox.rb b/lib/onebox/engine/flickr_onebox.rb new file mode 100644 index 0000000000000..3ed26684a7602 --- /dev/null +++ b/lib/onebox/engine/flickr_onebox.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +require_relative './opengraph_image' + +module Onebox + module Engine + class FlickrOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/www\.flickr\.com\/photos\//) + always_https + + def to_html + og = get_opengraph + return album_html(og) if og.url =~ /\/sets\// + return image_html(og) if !og.image.nil? + nil + end + + private + + def album_html(og) + escaped_url = ::Onebox::Helpers.normalize_url_for_output(url) + album_title = "[Album] #{og.title}" + + <<-HTML + + HTML + end + + def image_html(og) + escaped_url = ::Onebox::Helpers.normalize_url_for_output(url) + + <<-HTML + + Imgur + + HTML + end + end + end +end diff --git a/lib/onebox/engine/flickr_shortened_onebox.rb b/lib/onebox/engine/flickr_shortened_onebox.rb new file mode 100644 index 0000000000000..1c1243050bc67 --- /dev/null +++ b/lib/onebox/engine/flickr_shortened_onebox.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require_relative './opengraph_image' + +module Onebox + module Engine + class FlickrShortenedOnebox + include Engine + include StandardEmbed + include OpengraphImage + + matches_regexp(/^https?:\/\/flic\.kr\/p\//) + always_https + end + end +end diff --git a/lib/onebox/engine/gfycat_onebox.rb b/lib/onebox/engine/gfycat_onebox.rb new file mode 100644 index 0000000000000..27fd4bf79e09e --- /dev/null +++ b/lib/onebox/engine/gfycat_onebox.rb @@ -0,0 +1,113 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class GfycatOnebox + include Engine + include JSON + + matches_regexp(/^https?:\/\/gfycat\.com\//) + always_https + + # This engine should have priority over AllowlistedGenericOnebox. + def self.priority + 1 + end + + def to_html + <<-HTML + + HTML + end + + def placeholder_html + <<-HTML + +
+ #{data[:name]} +
+ HTML + end + + private + + def match + @match ||= @url.match(/^https?:\/\/gfycat\.com\/(gifs\/detail\/)?(?.+)/) + end + + def og_data + return @og_data if defined?(@og_data) + + response = Onebox::Helpers.fetch_response(url, redirect_limit: 10) rescue nil + page = Nokogiri::HTML(response) + script = page.at_css('script[type="application/ld+json"]') + + if json_string = script&.text + @og_data = Onebox::Helpers.symbolize_keys(::MultiJson.load(json_string)) + else + @og_data = {} + end + end + + def data + return @data if defined?(@data) + + @data = { + name: match[:name], + title: og_data[:headline] || 'No Title', + author: og_data[:author], + url: @url, + } + + if keywords = og_data[:keywords]&.split(',') + @data[:keywords] = keywords + .map { |keyword| "##{keyword}" } + .join(' ') + end + + if og_data[:video] + content_url = ::Onebox::Helpers.normalize_url_for_output(og_data[:video][:contentUrl]) + video_url = Pathname.new(content_url) + @data[:webmUrl] = video_url.sub_ext(".webm").to_s + @data[:mp4Url] = video_url.sub_ext(".mp4").to_s + + thumbnail_url = ::Onebox::Helpers.normalize_url_for_output(og_data[:video][:thumbnailUrl]) + @data[:posterUrl] = thumbnail_url + + @data[:width] = og_data[:video][:width] + @data[:height] = og_data[:video][:height] + end + + @data + end + end + end +end diff --git a/lib/onebox/engine/giphy_onebox.rb b/lib/onebox/engine/giphy_onebox.rb new file mode 100644 index 0000000000000..569f423451dc3 --- /dev/null +++ b/lib/onebox/engine/giphy_onebox.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class GiphyOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/(giphy\.com\/gifs|gph\.is)\//) + always_https + + def to_html + oembed = get_oembed + + <<-HTML + + + + HTML + end + end + end +end diff --git a/lib/onebox/engine/github_blob_onebox.rb b/lib/onebox/engine/github_blob_onebox.rb new file mode 100644 index 0000000000000..fd70a4b2af117 --- /dev/null +++ b/lib/onebox/engine/github_blob_onebox.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require_relative '../mixins/git_blob_onebox' + +module Onebox + module Engine + class GithubBlobOnebox + def self.git_regexp + /^https?:\/\/(www\.)?github\.com.*\/blob\// + end + + def self.onebox_name + "githubblob" + end + + include Onebox::Mixins::GitBlobOnebox + + def raw_regexp + /github\.com\/(?[^\/]+)\/(?[^\/]+)\/blob\/(?[^\/]+)\/(?[^#]+)(#(L(?[^-]*)(-L(?.*))?))?/mi + end + + def raw_template(m) + "https://raw.githubusercontent.com/#{m[:user]}/#{m[:repo]}/#{m[:sha1]}/#{m[:file]}" + end + + def title + Sanitize.fragment(Onebox::Helpers.uri_unencode(link).sub(/^https?\:\/\/github\.com\//, '')) + end + end + end +end diff --git a/lib/onebox/engine/github_commit_onebox.rb b/lib/onebox/engine/github_commit_onebox.rb new file mode 100644 index 0000000000000..d584eb165ec71 --- /dev/null +++ b/lib/onebox/engine/github_commit_onebox.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require_relative '../mixins/github_body' + +module Onebox + module Engine + class GithubCommitOnebox + include Engine + include LayoutSupport + include JSON + include Onebox::Mixins::GithubBody + + matches_regexp(/^https?:\/\/(?:www\.)?(?:(?:\w)+\.)?(github)\.com(?:\/)?(?:.)*\/commit\//) + always_https + + def url + "https://api.github.com/repos/#{match[:owner]}/#{match[:repository]}/commits/#{match[:sha]}" + end + + private + + def match + return @match if defined?(@match) + + @match = @url.match(%{github\.com/(?[^/]+)/(?[^/]+)/commit/(?[^/]+)}) + @match ||= @url.match(%{github\.com/(?[^/]+)/(?[^/]+)/pull/(?[^/]+)/commit/(?[^/]+)}) + + @match + end + + def data + result = raw.clone + + lines = result['commit']['message'].split("\n") + result['title'] = lines.first + result['body'], result['excerpt'] = compute_body(lines[1..lines.length].join("\n")) + + committed_at = Time.parse(result['commit']['author']['date']) + result['committed_at'] = committed_at.strftime("%I:%M%p - %d %b %y %Z") + result['committed_at_date'] = committed_at.strftime("%F") + result['committed_at_time'] = committed_at.strftime("%T") + + result['link'] = link + ulink = URI(link) + result['domain'] = "#{ulink.host}/#{ulink.path.split('/')[1]}/#{ulink.path.split('/')[2]}" + + result + end + end + end +end diff --git a/lib/onebox/engine/github_folder_onebox.rb b/lib/onebox/engine/github_folder_onebox.rb new file mode 100644 index 0000000000000..a0c565f81b61a --- /dev/null +++ b/lib/onebox/engine/github_folder_onebox.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class GithubFolderOnebox + include Engine + include StandardEmbed + include LayoutSupport + + matches_regexp(/^https?:\/\/(?:www\.)?(?:(?:\w)+\.)?(github)\.com[\:\d]*(\/[^\/]+){2}/) + always_https + + def self.priority + # This engine should have lower priority than the other Github engines + 150 + end + + private + + def data + og = get_opengraph + + max_length = 250 + + display_path = extract_path(og.url, max_length) + display_description = clean_description(og.description, og.title, max_length) + + title = og.title + + fragment = Addressable::URI.parse(url).fragment + if fragment + fragment = Addressable::URI.unencode(fragment) + + if html_doc.css('.Box.md') + # For links to markdown docs + node = html_doc.css('a.anchor').find { |n| n['href'] == "##{fragment}" } + subtitle = node&.parent&.text + elsif html_doc.css('.Box.rdoc') + # For links to rdoc docs + node = html_doc.css('h3').find { |n| n['id'] == "user-content-#{fragment.downcase}" } + subtitle = node&.css('text()')&.first&.text + end + + title = "#{title} - #{subtitle}" if subtitle + end + + { + link: url, + image: og.image, + title: Onebox::Helpers.truncate(title, 250), + path: display_path, + description: display_description, + favicon: get_favicon + } + end + + def extract_path(root, max_length) + path = url.split('#')[0].split('?')[0] + path = path["#{root}/tree/".length..-1] + + return unless path + + path.length > max_length ? path[-max_length..-1] : path + end + + def clean_description(description, title, max_length) + return unless description + + desc_end = " - #{title}" + if description[-desc_end.length..-1] == desc_end + description = description[0...-desc_end.length] + end + + Onebox::Helpers.truncate(description, max_length) + end + end + end +end diff --git a/lib/onebox/engine/github_gist_onebox.rb b/lib/onebox/engine/github_gist_onebox.rb new file mode 100644 index 0000000000000..21561d85ffbb1 --- /dev/null +++ b/lib/onebox/engine/github_gist_onebox.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class GithubGistOnebox + include Engine + include LayoutSupport + include JSON + + MAX_FILES = 3 + + matches_regexp(/^http(?:s)?:\/\/gist\.(?:(?:\w)+\.)?(github)\.com(?:\/)?/) + always_https + + def url + "https://api.github.com/gists/#{match[:sha]}" + end + + private + + def data + @data ||= { + title: 'gist.github.com', + link: link, + gist_files: gist_files.take(MAX_FILES), + truncated_files?: truncated_files? + } + end + + def truncated_files? + gist_files.size > MAX_FILES + end + + def gist_files + return [] unless gist_api + + @gist_files ||= gist_api["files"].values.map do |file_json| + GistFile.new(file_json) + end + end + + def gist_api + @raw ||= raw.clone + rescue OpenURI::HTTPError + # The Gist API rate limit of 60 requests per hour was reached. + nil + end + + def match + @match ||= @url.match(%r{gist\.github\.com/([^/]+/)?(?[0-9a-f]+)}) + end + + class GistFile + attr_reader :filename + attr_reader :language + + MAX_LINES = 10 + + def initialize(json) + @json = json + @filename = @json["filename"] + @language = @json["language"] + end + + def content + lines.take(MAX_LINES).join("\n") + end + + def truncated? + lines.size > MAX_LINES + end + + private + + def lines + @lines ||= @json["content"].split("\n") + end + end + end + end +end diff --git a/lib/onebox/engine/github_issue_onebox.rb b/lib/onebox/engine/github_issue_onebox.rb new file mode 100644 index 0000000000000..0bb26b70ac2fe --- /dev/null +++ b/lib/onebox/engine/github_issue_onebox.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +require_relative '../mixins/github_body' + +module Onebox + module Engine + class GithubIssueOnebox + #Author Lidlanca 2014 + include Engine + include LayoutSupport + include JSON + include Onebox::Mixins::GithubBody + + matches_regexp(/^https?:\/\/(?:www\.)?(?:(?:\w)+\.)?github\.com\/(?.+)\/(?.+)\/issues\/([[:digit:]]+)/) + always_https + + def url + m = match + "https://api.github.com/repos/#{m["org"]}/#{m["repo"]}/issues/#{m["item_id"]}" + end + + private + + def match + @match ||= @url.match(/^http(?:s)?:\/\/(?:www\.)?(?:(?:\w)+\.)?github\.com\/(?.+)\/(?.+)\/(?issues)\/(?[\d]+)/) + end + + def data + created_at = Time.parse(raw['created_at']) + closed_at = Time.parse(raw['closed_at']) if raw['closed_at'] + body, excerpt = compute_body(raw['body']) + ulink = URI(link) + + { + link: @url, + title: raw["title"], + body: body, + excerpt: excerpt, + labels: raw["labels"], + user: raw['user'], + created_at: created_at.strftime("%I:%M%p - %d %b %y %Z"), + created_at_date: created_at.strftime("%F"), + created_at_time: created_at.strftime("%T"), + closed_at: closed_at&.strftime("%I:%M%p - %d %b %y %Z"), + closed_at_date: closed_at&.strftime("%F"), + closed_at_time: closed_at&.strftime("%T"), + closed_by: raw['closed_by'], + avatar: "https://avatars1.githubusercontent.com/u/#{raw['user']['id']}?v=2&s=96", + domain: "#{ulink.host}/#{ulink.path.split('/')[1]}/#{ulink.path.split('/')[2]}", + } + end + end + end +end diff --git a/lib/onebox/engine/github_pull_request_onebox.rb b/lib/onebox/engine/github_pull_request_onebox.rb new file mode 100644 index 0000000000000..090fddea66afb --- /dev/null +++ b/lib/onebox/engine/github_pull_request_onebox.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +require_relative '../mixins/github_body' + +module Onebox + module Engine + class GithubPullRequestOnebox + include Engine + include LayoutSupport + include JSON + include Onebox::Mixins::GithubBody + + GITHUB_COMMENT_REGEX = /(\r\n)/ + + matches_regexp(/^https?:\/\/(?:www\.)?(?:(?:\w)+\.)?(github)\.com(?:\/)?(?:.)*\/pull/) + always_https + + def url + "https://api.github.com/repos/#{match[:owner]}/#{match[:repository]}/pulls/#{match[:number]}" + end + + private + + def match + @match ||= @url.match(%r{github\.com/(?[^/]+)/(?[^/]+)/pull/(?[^/]+)}) + end + + def data + result = raw.clone + result['link'] = link + + created_at = Time.parse(result['created_at']) + result['created_at'] = created_at.strftime("%I:%M%p - %d %b %y %Z") + result['created_at_date'] = created_at.strftime("%F") + result['created_at_time'] = created_at.strftime("%T") + + ulink = URI(link) + result['domain'] = "#{ulink.host}/#{ulink.path.split('/')[1]}/#{ulink.path.split('/')[2]}" + + result['body'], result['excerpt'] = compute_body(result['body']) + + result + end + end + end +end diff --git a/lib/onebox/engine/gitlab_blob_onebox.rb b/lib/onebox/engine/gitlab_blob_onebox.rb new file mode 100644 index 0000000000000..d8ba19733813a --- /dev/null +++ b/lib/onebox/engine/gitlab_blob_onebox.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require_relative '../mixins/git_blob_onebox' + +module Onebox + module Engine + class GitlabBlobOnebox + def self.git_regexp + /^https?:\/\/(www\.)?gitlab\.com.*\/blob\// + end + + def self.onebox_name + "gitlabblob" + end + + include Onebox::Mixins::GitBlobOnebox + + def raw_regexp + /gitlab\.com\/(?[^\/]+)\/(?[^\/]+)\/blob\/(?[^\/]+)\/(?[^#]+)(#(L(?[^-]*)(-L(?.*))?))?/mi + end + + def raw_template(m) + "https://gitlab.com/#{m[:user]}/#{m[:repo]}/raw/#{m[:sha1]}/#{m[:file]}" + end + + def title + Sanitize.fragment(Onebox::Helpers.uri_unencode(link).sub(/^https?\:\/\/gitlab\.com\//, '')) + end + end + end +end diff --git a/lib/onebox/engine/google_calendar_onebox.rb b/lib/onebox/engine/google_calendar_onebox.rb new file mode 100644 index 0000000000000..b666df4d08038 --- /dev/null +++ b/lib/onebox/engine/google_calendar_onebox.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class GoogleCalendarOnebox + include Engine + + matches_regexp(/^(https?:)?\/\/((www|calendar)\.google\.[\w.]{2,}|goo\.gl)\/calendar\/.+$/) + always_https + requires_iframe_origins "https://calendar.google.com" + + def to_html + url = @url.split('&').first + src = ::Onebox::Helpers.normalize_url_for_output(url) + "" + end + + def placeholder_html + <<-HTML +
+
+
+ +

Google Calendar

+
+
+
+ HTML + end + end + end +end diff --git a/lib/onebox/engine/google_docs_onebox.rb b/lib/onebox/engine/google_docs_onebox.rb new file mode 100644 index 0000000000000..cc7872aebe429 --- /dev/null +++ b/lib/onebox/engine/google_docs_onebox.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class GoogleDocsOnebox + include Engine + include StandardEmbed + include LayoutSupport + + SUPPORTED_ENDPOINTS = %w(spreadsheets document forms presentation) + SHORT_TYPES = { + spreadsheets: :sheets, + document: :docs, + presentation: :slides, + forms: :forms, + } + + matches_regexp(/^(https?:)?\/\/(docs\.google\.com)\/(?(#{SUPPORTED_ENDPOINTS.join('|')}))\/d\/((?[\w-]*)).+$/) + always_https + + private + + def data + og_data = get_opengraph + short_type = SHORT_TYPES[match[:endpoint].to_sym] + + description = if Onebox::Helpers.blank?(og_data.description) + "This #{short_type.to_s.chop.capitalize} is private" + else + Onebox::Helpers.truncate(og_data.description, 250) + end + + { + link: link, + title: og_data.title || "Google #{short_type.to_s.capitalize}", + description: description, + type: short_type + } + end + + def match + @match ||= @url.match(@@matcher) + end + end + end +end diff --git a/lib/onebox/engine/google_drive_onebox.rb b/lib/onebox/engine/google_drive_onebox.rb new file mode 100644 index 0000000000000..82628228ea9f8 --- /dev/null +++ b/lib/onebox/engine/google_drive_onebox.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class GoogleDriveOnebox + include Engine + include StandardEmbed + include LayoutSupport + + matches_regexp(/^(https?:)?\/\/(drive\.google\.com)\/file\/d\/(?[\w-]*)\/.+$/) + always_https + + protected + + def data + og_data = get_opengraph + title = og_data.title || "Google Drive" + title = "#{og_data.title} (video)" if og_data.type =~ /^video[\/\.]/ + description = og_data.description || "Google Drive file." + + { + link: link, + title: title, + description: Onebox::Helpers.truncate(description, 250), + image: og_data.image + } + end + end + end +end diff --git a/lib/onebox/engine/google_maps_onebox.rb b/lib/onebox/engine/google_maps_onebox.rb new file mode 100644 index 0000000000000..bbf8e21c1be0a --- /dev/null +++ b/lib/onebox/engine/google_maps_onebox.rb @@ -0,0 +1,184 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class GoogleMapsOnebox + include Engine + + class << self + def ===(other) + if other.kind_of? URI + @@matchers && @@matchers.any? { |m| other.to_s =~ m[:regexp] } + else + super + end + end + + private + + def matches_regexp(key, regexp) + (@@matchers ||= []) << { key: key, regexp: regexp } + end + end + + always_https + requires_iframe_origins("https://maps.google.com", "https://google.com") + + # Matches shortened Google Maps URLs + matches_regexp :short, %r"^(https?:)?//goo\.gl/maps/" + + # Matches URLs for custom-created maps + matches_regexp :custom, %r"^(?:https?:)?//www\.google(?:\.(?:\w{2,}))+/maps/d/(?:edit|viewer|embed)\?mid=.+$" + + # Matches URLs with streetview data + matches_regexp :streetview, %r"^(?:https?:)?//www\.google(?:\.(?:\w{2,}))+/maps[^@]+@(?-?[\d.]+),(?-?[\d.]+),(?:\d+)a,(?[\d.]+)y,(?[\d.]+)h,(?[\d.]+)t.+?data=.*?!1s(?[^!]{22})" + + # Matches "normal" Google Maps URLs with arbitrary data + matches_regexp :standard, %r"^(?:https?:)?//www\.google(?:\.(?:\w{2,}))+/maps" + + # Matches URLs for the old Google Maps domain which we occasionally get redirected to + matches_regexp :canonical, %r"^(?:https?:)?//maps\.google(?:\.(?:\w{2,}))+/maps\?" + + def initialize(url, timeout = nil) + super + resolve_url! + rescue Net::HTTPServerException, Timeout::Error, Net::HTTPError, Errno::ECONNREFUSED, RuntimeError => err + raise ArgumentError, "malformed url or unresolveable: #{err.message}" + end + + def streetview? + !!@streetview + end + + def to_html + "
" + end + + def placeholder_html + ::Onebox::Helpers.map_placeholder_html + end + + private + + def data + { link: url, title: url } + end + + def resolve_url! + @streetview = false + type, match = match_url + + # Resolve shortened URL, if necessary + if type == :short + follow_redirect! + type, match = match_url + end + + # Try to get the old-maps URI, it is far easier to embed. + if type == :standard + retry_count = 10 + while (retry_count -= 1) > 0 + follow_redirect! + type, match = match_url + break if type != :standard + sleep 0.1 + end + end + + case type + when :standard + # Fallback for map URLs that don't resolve into an easily embeddable old-style URI + # Roadmaps use a "z" zoomlevel, satellite maps use "m" the horizontal width in meters + # TODO: tilted satellite maps using "a,y,t" + match = @url.match(/@(?[\d.-]+),(?[\d.-]+),(?\d+)(?[mz])/) + raise "unexpected standard url #{@url}" unless match + zoom = match[:mz] == "z" ? match[:zoom] : Math.log2(57280048.0 / match[:zoom].to_f).round + location = "#{match[:lon]},#{match[:lat]}" + url = "https://maps.google.com/maps?ll=#{location}&z=#{zoom}&output=embed&dg=ntvb" + url += "&q=#{$1}" if match = @url.match(/\/place\/([^\/\?]+)/) + url += "&cid=#{($1 + $2).to_i(16)}" if @url.match(/!3m1!1s0x(\h{16}):0x(\h{16})/) + @url = url + @placeholder = "https://maps.googleapis.com/maps/api/staticmap?maptype=roadmap¢er=#{location}&zoom=#{zoom}&size=690x400&sensor=false" + + when :custom + url = @url.dup + @url = rewrite_custom_url(url, "embed") + @placeholder = rewrite_custom_url(url, "thumbnail") + @placeholder_height = @placeholder_width = 120 + + when :streetview + @streetview = true + panoid = match[:pano] + lon = match[:lon].to_f.to_s + lat = match[:lat].to_f.to_s + heading = match[:heading].to_f.round(4).to_s + pitch = (match[:pitch].to_f / 10.0).round(4).to_s + fov = (match[:zoom].to_f / 100.0).round(4).to_s + zoom = match[:zoom].to_f.round + @url = "https://www.google.com/maps/embed?pb=!3m2!2sen!4v0!6m8!1m7!1s#{panoid}!2m2!1d#{lon}!2d#{lat}!3f#{heading}!4f#{pitch}!5f#{fov}" + @placeholder = "https://maps.googleapis.com/maps/api/streetview?size=690x400&location=#{lon},#{lat}&pano=#{panoid}&fov=#{zoom}&heading=#{heading}&pitch=#{pitch}&sensor=false" + + when :canonical + query = URI::decode_www_form(uri.query).to_h + if !query.has_key?("ll") + raise ArgumentError, "canonical url lacks location argument" unless query.has_key?("sll") + query["ll"] = query["sll"] + @url += "&ll=#{query["sll"]}" + end + location = query["ll"] + if !query.has_key?("z") + raise ArgumentError, "canonical url has incomplete query arguments" unless query.has_key?("spn") || query.has_key?("sspn") + if !query.has_key?("spn") + query["spn"] = query["sspn"] + @url += "&spn=#{query["sspn"]}" + end + angle = query["spn"].split(",").first.to_f + zoom = (Math.log(690.0 * 360.0 / angle / 256.0) / Math.log(2)).round + else + zoom = query["z"] + end + @url = @url.sub('output=classic', 'output=embed') + @placeholder = "https://maps.googleapis.com/maps/api/staticmap?maptype=roadmap&size=690x400&sensor=false¢er=#{location}&zoom=#{zoom}" + + else + raise "unexpected url type #{type.inspect}" + end + end + + def match_url + @@matchers.each do |matcher| + if m = matcher[:regexp].match(@url) + return matcher[:key], m + end + end + raise ArgumentError, "\"#{@url}\" does not match any known pattern" + end + + def rewrite_custom_url(url, target) + uri = URI(url) + uri.path = uri.path.sub(/(?<=^\/maps\/d\/)\w+$/, target) + uri.to_s + end + + def follow_redirect! + begin + http = Net::HTTP.start( + uri.host, + uri.port, + use_ssl: uri.scheme == 'https', + open_timeout: timeout, + read_timeout: timeout + ) + + response = http.head(uri.path) + raise "unexpected response code #{response.code}" unless %w(200 301 302).include?(response.code) + + @url = response.code == "200" ? uri.to_s : response["Location"] + @uri = URI(@url) + ensure + http.finish rescue nil + end + end + end + end +end diff --git a/lib/onebox/engine/google_photos_onebox.rb b/lib/onebox/engine/google_photos_onebox.rb new file mode 100644 index 0000000000000..3a07b7df69946 --- /dev/null +++ b/lib/onebox/engine/google_photos_onebox.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class GooglePhotosOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/(photos)\.(app\.goo\.gl|google\.com)/) + always_https + + def to_html + og = get_opengraph + return video_html(og) if og.video_secure_url + return album_html(og) if og.type == "google_photos:photo_album" + return image_html(og) if og.image + nil + end + + private + + def video_html(og) + escaped_url = ::Onebox::Helpers.normalize_url_for_output(url) + + <<-HTML + + HTML + end + + def album_html(og) + escaped_url = ::Onebox::Helpers.normalize_url_for_output(url) + album_title = og.description.nil? ? og.title : "[#{og.description}] #{og.title}" + + <<-HTML + + HTML + end + + def image_html(og) + escaped_url = ::Onebox::Helpers.normalize_url_for_output(url) + + <<-HTML + + Google Photos + + HTML + end + end + end +end diff --git a/lib/onebox/engine/google_play_app_onebox.rb b/lib/onebox/engine/google_play_app_onebox.rb new file mode 100644 index 0000000000000..1e2557d44226b --- /dev/null +++ b/lib/onebox/engine/google_play_app_onebox.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class GooglePlayAppOnebox + include Engine + include LayoutSupport + include HTML + + DEFAULTS = { + MAX_DESCRIPTION_CHARS: 500 + } + + matches_regexp(/^https?:\/\/play\.(?:(?:\w)+\.)?(google)\.com(?:\/)?\/store\/apps\//) + always_https + + private + + def data + price = raw.css("meta[itemprop=price]").first["content"] rescue "Free" + { + link: link, + title: raw.css("meta[property='og:title']").first["content"].gsub(" - Apps on Google Play", ""), + image: ::Onebox::Helpers.normalize_url_for_output(raw.css("meta[property='og:image']").first["content"]), + description: raw.css("meta[name=description]").first["content"][0..DEFAULTS[:MAX_DESCRIPTION_CHARS]].chop + "...", + price: price == "0" ? "Free" : price + } + end + end + end +end diff --git a/lib/onebox/engine/html.rb b/lib/onebox/engine/html.rb new file mode 100644 index 0000000000000..b0dfba21f17ad --- /dev/null +++ b/lib/onebox/engine/html.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module Onebox + module Engine + module HTML + private + + # Overwrite for any custom headers + def http_params + {} + end + + def raw + @raw ||= Onebox::Helpers.fetch_html_doc(url, http_params, body_cacher) + end + + def body_cacher + self.options&.[](:body_cacher) + end + + def html? + raw.respond_to(:css) + end + end + end +end diff --git a/lib/onebox/engine/image_onebox.rb b/lib/onebox/engine/image_onebox.rb new file mode 100644 index 0000000000000..91d64f69da322 --- /dev/null +++ b/lib/onebox/engine/image_onebox.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class ImageOnebox + include Engine + + matches_regexp(/^(https?:)?\/\/.+\.(png|jpg|jpeg|gif|bmp|tif|tiff)(\?.*)?$/i) + + def always_https? + AllowlistedGenericOnebox.host_matches(uri, AllowlistedGenericOnebox.https_hosts) + end + + def to_html + # Fix Dropbox image links + if @url[/^https:\/\/www.dropbox.com\/s\//] + @url.sub!("https://www.dropbox.com", "https://dl.dropboxusercontent.com") + end + + escaped_url = ::Onebox::Helpers.normalize_url_for_output(@url) + <<-HTML + + + + HTML + end + end + end +end diff --git a/lib/onebox/engine/imgur_onebox.rb b/lib/onebox/engine/imgur_onebox.rb new file mode 100644 index 0000000000000..26a90379dd151 --- /dev/null +++ b/lib/onebox/engine/imgur_onebox.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class ImgurOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/(www\.)?imgur\.com/) + always_https + + def to_html + og = get_opengraph + return video_html(og) if !og.video_secure_url.nil? + return album_html(og) if is_album? + return image_html(og) if !og.image.nil? + nil + end + + private + + def video_html(og) + <<-HTML + + HTML + end + + def album_html(og) + escaped_url = ::Onebox::Helpers.normalize_url_for_output(url) + album_title = "[Album] #{og.title}" + + <<-HTML + + HTML + end + + def is_album? + response = Onebox::Helpers.fetch_response("https://api.imgur.com/oembed.json?url=#{url}") rescue "{}" + oembed_data = Onebox::Helpers.symbolize_keys(::MultiJson.load(response)) + imgur_data_id = Nokogiri::HTML(oembed_data[:html]).xpath("//blockquote").attr("data-id") + imgur_data_id.to_s[/a\//] + end + + def image_html(og) + escaped_url = ::Onebox::Helpers.normalize_url_for_output(url) + + <<-HTML + + Imgur + + HTML + end + end + end +end diff --git a/lib/onebox/engine/instagram_onebox.rb b/lib/onebox/engine/instagram_onebox.rb new file mode 100644 index 0000000000000..21a8ae6c6ff55 --- /dev/null +++ b/lib/onebox/engine/instagram_onebox.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class InstagramOnebox + include Engine + include StandardEmbed + include LayoutSupport + + matches_regexp(/^https?:\/\/(?:www\.)?(?:instagram\.com|instagr\.am)\/?(?:.*)\/(?:p|tv)\/[a-zA-Z\d_-]+/) + always_https + + def clean_url + url.scan(/^https?:\/\/(?:www\.)?(?:instagram\.com|instagr\.am)\/?(?:.*)\/(?:p|tv)\/[a-zA-Z\d_-]+/).flatten.first + end + + def data + oembed = get_oembed + raise "No oEmbed data found. Ensure 'facebook_app_access_token' is valid" if oembed.data.empty? + + { + link: clean_url.gsub("/#{oembed.author_name}/", "/"), + title: "@#{oembed.author_name}", + image: oembed.thumbnail_url, + description: Onebox::Helpers.truncate(oembed.title, 250), + } + + end + + protected + + def access_token + (options[:facebook_app_access_token] || Onebox.options.facebook_app_access_token).to_s + end + + def get_oembed_url + if access_token != '' + "https://graph.facebook.com/v9.0/instagram_oembed?url=#{clean_url}&access_token=#{access_token}" + else + # The following is officially deprecated by Instagram, but works in some limited circumstances. + "https://api.instagram.com/oembed/?url=#{clean_url}" + end + end + end + end +end diff --git a/lib/onebox/engine/json.rb b/lib/onebox/engine/json.rb new file mode 100644 index 0000000000000..261dc0309cf6c --- /dev/null +++ b/lib/onebox/engine/json.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Onebox + module Engine + module JSON + private + + def raw + @raw ||= ::MultiJson.load(URI.open(url, read_timeout: timeout)) + end + end + end +end diff --git a/lib/onebox/engine/kaltura_onebox.rb b/lib/onebox/engine/kaltura_onebox.rb new file mode 100644 index 0000000000000..d94091a4f0ab3 --- /dev/null +++ b/lib/onebox/engine/kaltura_onebox.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class KalturaOnebox + include Engine + include StandardEmbed + + always_https + matches_regexp(/^https?:\/\/[a-z0-9]+\.kaltura\.com\/id\/[a-zA-Z0-9]+/) + requires_iframe_origins "https://*.kaltura.com" + + def preview_html + og = get_opengraph + + <<~HTML + + HTML + end + + def to_html + og = get_opengraph + + <<~HTML + + HTML + end + end + end +end diff --git a/lib/onebox/engine/mixcloud_onebox.rb b/lib/onebox/engine/mixcloud_onebox.rb new file mode 100644 index 0000000000000..a225ccf4bb7b3 --- /dev/null +++ b/lib/onebox/engine/mixcloud_onebox.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class MixcloudOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/www\.mixcloud\.com\//) + always_https + + def placeholder_html + oembed = get_oembed + "" + end + + def to_html + get_oembed.html + end + end + end +end diff --git a/lib/onebox/engine/opengraph_image.rb b/lib/onebox/engine/opengraph_image.rb new file mode 100644 index 0000000000000..a104db36ffbf5 --- /dev/null +++ b/lib/onebox/engine/opengraph_image.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Onebox + module Engine + module OpengraphImage + + def to_html + og = get_opengraph + "" + end + end + end +end diff --git a/lib/onebox/engine/pastebin_onebox.rb b/lib/onebox/engine/pastebin_onebox.rb new file mode 100644 index 0000000000000..d9b26467f3cca --- /dev/null +++ b/lib/onebox/engine/pastebin_onebox.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class PastebinOnebox + include Engine + include LayoutSupport + + MAX_LINES = 10 + + matches_regexp(/^http?:\/\/pastebin\.com/) + + private + + def data + @data ||= { + title: 'pastebin.com', + link: link, + content: content, + truncated?: truncated? + } + end + + def content + lines.take(MAX_LINES).join("\n") + end + + def truncated? + lines.size > MAX_LINES + end + + def lines + return @lines if defined?(@lines) + response = Onebox::Helpers.fetch_response("http://pastebin.com/raw/#{paste_key}", redirect_limit: 1) rescue "" + @lines = response.split("\n") + end + + def paste_key + regex = case uri + when /\/raw\// + /\/raw\/([^\/]+)/ + when /\/download\// + /\/download\/([^\/]+)/ + when /\/embed\// + /\/embed\/([^\/]+)/ + else + /\/([^\/]+)/ + end + + match = uri.path.match(regex) + match[1] if match && match[1] + end + end + end +end diff --git a/lib/onebox/engine/pdf_onebox.rb b/lib/onebox/engine/pdf_onebox.rb new file mode 100644 index 0000000000000..2a8d46f0d4a0a --- /dev/null +++ b/lib/onebox/engine/pdf_onebox.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class PdfOnebox + include Engine + include LayoutSupport + + matches_regexp(/^(https?:)?\/\/.*\.pdf(\?.*)?$/i) + always_https + + private + + def data + begin + size = Onebox::Helpers.fetch_content_length(@url) + rescue + raise "Unable to read pdf file: #{@url}" + end + + { + link: link, + title: File.basename(uri.path), + filesize: size ? Onebox::Helpers.pretty_filesize(size.to_i) : nil, + } + end + end + end +end diff --git a/lib/onebox/engine/pubmed_onebox.rb b/lib/onebox/engine/pubmed_onebox.rb new file mode 100644 index 0000000000000..1cf8a0ac9bb9d --- /dev/null +++ b/lib/onebox/engine/pubmed_onebox.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class PubmedOnebox + include Engine + include LayoutSupport + + matches_regexp(/^https?:\/\/(?:(?:\w)+\.)?(www.ncbi.nlm.nih)\.gov(?:\/)?\/pubmed\/\d+/) + + private + + def xml + return @xml if defined?(@xml) + doc = Nokogiri::XML(URI.open(URI.join(@url, "?report=xml&format=text"))) + pre = doc.xpath("//pre") + @xml = Nokogiri::XML("" + pre.text + "") + end + + def authors + initials = xml.css("Initials").map { |x| x.content } + last_names = xml.css("LastName").map { |x| x.content } + author_list = (initials.zip(last_names)).map { |i, l| i + " " + l } + if author_list.length > 1 then + author_list[-2] = author_list[-2] + " and " + author_list[-1] + author_list.pop + end + author_list.join(", ") + end + + def date + xml.css("PubDate") + .children + .map { |x| x.content } + .select { |s| !s.match(/^\s+$/) } + .map { |s| s.split } + .flatten + .sort + .reverse + .join(" ") # Reverse sort so month before year. + end + + def data + { + title: xml.css("ArticleTitle").text, + authors: authors, + journal: xml.css("Title").text, + abstract: xml.css("AbstractText").text, + date: date, + link: @url, + pmid: match[:pmid] + } + end + + def match + @match ||= @url.match(%r{www\.ncbi\.nlm\.nih\.gov/pubmed/(?[0-9]+)}) + end + end + end +end diff --git a/lib/onebox/engine/reddit_media_onebox.rb b/lib/onebox/engine/reddit_media_onebox.rb new file mode 100644 index 0000000000000..c9d6cdcbff4d5 --- /dev/null +++ b/lib/onebox/engine/reddit_media_onebox.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class RedditMediaOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/(www\.)?reddit\.com/) + + def to_html + if raw[:type] == "image" + <<-HTML + + HTML + elsif raw[:type] =~ /^video[\/\.]/ + <<-HTML + + HTML + else + html = Onebox::Engine::AllowlistedGenericOnebox.new(@url, @timeout).to_html + return if Onebox::Helpers.blank?(html) + html + end + end + end + end +end diff --git a/lib/onebox/engine/replit_onebox.rb b/lib/onebox/engine/replit_onebox.rb new file mode 100644 index 0000000000000..5a4fcc015243f --- /dev/null +++ b/lib/onebox/engine/replit_onebox.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class ReplitOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/repl\.it\/.+/) + always_https + + def placeholder_html + oembed = get_oembed + + <<-HTML + + HTML + end + + def to_html + get_oembed.html + end + end + end +end diff --git a/lib/onebox/engine/simplecast_onebox.rb b/lib/onebox/engine/simplecast_onebox.rb new file mode 100644 index 0000000000000..068c5301c8d62 --- /dev/null +++ b/lib/onebox/engine/simplecast_onebox.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class SimplecastOnebox + include Engine + include StandardEmbed + + matches_regexp(/https?:\/\/(.+)?simplecast.com\/(episodes|s)\/.*/) + always_https + requires_iframe_origins("https://embed.simplecast.com") + + def to_html + get_oembed.html + end + + def placeholder_html + oembed = get_oembed + return if Onebox::Helpers.blank?(oembed.thumbnail_url) + "" + end + + private + + def get_oembed_url + if id = url.scan(/([a-zA-Z0-9]*)\Z/).flatten.first + oembed_url = "https://simplecast.com/s/#{id}" + else + oembed_url = url + end + + "https://simplecast.com/oembed?url=#{oembed_url}" + end + end + end +end diff --git a/lib/onebox/engine/sketch_fab_onebox.rb b/lib/onebox/engine/sketch_fab_onebox.rb new file mode 100644 index 0000000000000..e45f6f0cf3410 --- /dev/null +++ b/lib/onebox/engine/sketch_fab_onebox.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class SketchFabOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/sketchfab\.com\/(?:models\/|3d-models\/(?:[^\/\s]+-)?)([a-z0-9]{32})/) + always_https + requires_iframe_origins("https://sketchfab.com") + + def to_html + og = get_opengraph + src = og.video_url.gsub("autostart=1", "") + + <<-HTML + + HTML + end + + def placeholder_html + "" + end + end + end +end diff --git a/lib/onebox/engine/slides_onebox.rb b/lib/onebox/engine/slides_onebox.rb new file mode 100644 index 0000000000000..3681b2faf90bd --- /dev/null +++ b/lib/onebox/engine/slides_onebox.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class SlidesOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/slides\.com\/[\p{Alnum}_\-]+\/[\p{Alnum}_\-]+$/) + requires_iframe_origins "https://slides.com" + + def to_html + <<-HTML + + HTML + end + + def placeholder_html + escaped_src = ::Onebox::Helpers.normalize_url_for_output(raw[:image]) + "" + end + end + end +end diff --git a/lib/onebox/engine/sound_cloud_onebox.rb b/lib/onebox/engine/sound_cloud_onebox.rb new file mode 100644 index 0000000000000..c257932c2cd02 --- /dev/null +++ b/lib/onebox/engine/sound_cloud_onebox.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class SoundCloudOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/soundcloud\.com/) + requires_iframe_origins "https://w.soundcloud.com" + always_https + + def to_html + oembed = get_oembed + oembed.html.gsub('visual=true', 'visual=false') + end + + def placeholder_html + oembed = get_oembed + return if Onebox::Helpers.blank?(oembed.thumbnail_url) + "" + end + + protected + + def get_oembed_url + oembed_url = "https://soundcloud.com/oembed.json?url=#{url}" + oembed_url += "&maxheight=166" unless url["/sets/"] + oembed_url + end + end + end +end diff --git a/lib/onebox/engine/stack_exchange_onebox.rb b/lib/onebox/engine/stack_exchange_onebox.rb new file mode 100644 index 0000000000000..c918ed93aac85 --- /dev/null +++ b/lib/onebox/engine/stack_exchange_onebox.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class StackExchangeOnebox + include Engine + include LayoutSupport + include JSON + + def self.domains + %w(stackexchange.com stackoverflow.com superuser.com serverfault.com askubuntu.com stackapps.com mathoverflow.net) + .map { |domain| Regexp.escape(domain) } + end + + matches_regexp(/^https?:\/\/(?:(?:(?\w*)\.)?(?\w*)\.)?(?#{domains.join('|')})\/((?:questions|q)\/(?\d*)(\/.*\/(?\d*))?|(a\/(?\d*)))/) + + def always_https? + uri.host.split('.').length <= 3 + end + + private + + def match + @match ||= @url.match(@@matcher) + end + + def url + domain = uri.host + question_id = match[:question_id] + answer_id = match[:answer_id2] || match[:answer_id1] + + if answer_id + "https://api.stackexchange.com/2.2/answers/#{answer_id}?site=#{domain}&filter=!.FjueITQdx6-Rq3Ue9PWG.QZ2WNdW" + else + "https://api.stackexchange.com/2.2/questions/#{question_id}?site=#{domain}&filter=!5-duuxrJa-iw9oVvOA(JNimB5VIisYwZgwcfNI" + end + end + + def data + return @data if defined?(@data) + + result = raw['items'][0] + if result + result['creation_date'] = + Time.at(result['creation_date'].to_i).strftime("%I:%M%p - %d %b %y %Z") + + result['tags'] = result['tags'].take(4).join(', ') + result['is_answer'] = result.key?('answer_id') + result['is_question'] = result.key?('question_id') + end + + @data = result + end + end + end +end diff --git a/lib/onebox/engine/standard_embed.rb b/lib/onebox/engine/standard_embed.rb new file mode 100644 index 0000000000000..f19f060cb2d4c --- /dev/null +++ b/lib/onebox/engine/standard_embed.rb @@ -0,0 +1,145 @@ +# frozen_string_literal: true + +require "cgi" +require "onebox/open_graph" +require 'onebox/oembed' + +module Onebox + module Engine + module StandardEmbed + def self.oembed_providers + @@oembed_providers ||= {} + end + + def self.add_oembed_provider(regexp, endpoint) + oembed_providers[regexp] = endpoint + end + + def self.opengraph_providers + @@opengraph_providers ||= [] + end + + def self.add_opengraph_provider(regexp) + opengraph_providers << regexp + end + + # Some oembed providers (like meetup.com) don't provide links to themselves + add_oembed_provider(/www\.meetup\.com\//, 'http://api.meetup.com/oembed') + add_oembed_provider(/www\.mixcloud\.com\//, 'https://www.mixcloud.com/oembed/') + # In order to support Private Videos + add_oembed_provider(/vimeo\.com\//, 'https://vimeo.com/api/oembed.json') + # NYT requires login so use oembed only + add_oembed_provider(/nytimes\.com\//, 'https://www.nytimes.com/svc/oembed/json/') + + def always_https? + AllowlistedGenericOnebox.host_matches(uri, AllowlistedGenericOnebox.https_hosts) || super + end + + def raw + return @raw if defined?(@raw) + + og = get_opengraph + twitter = get_twitter + oembed = get_oembed + + @raw = {} + + og.data.each do |k, v| + next if k == "title_attr" + v = og.send(k) + @raw[k] ||= v unless v.nil? + end + + twitter.each { |k, v| @raw[k] ||= v unless Onebox::Helpers::blank?(v) } + + oembed.data.each do |k, v| + v = oembed.send(k) + @raw[k] ||= v unless v.nil? + end + + favicon = get_favicon + @raw["favicon".to_sym] = favicon unless Onebox::Helpers::blank?(favicon) + + @raw + end + + protected + + def html_doc + return @html_doc if defined?(@html_doc) + + headers = nil + headers = { 'Cookie' => options[:cookie] } if options[:cookie] + + @html_doc = Onebox::Helpers.fetch_html_doc(url, headers) + end + + def get_oembed + @oembed ||= Onebox::Oembed.new(get_json_response) + end + + def get_opengraph + @opengraph ||= ::Onebox::OpenGraph.new(html_doc) + end + + def get_twitter + return {} unless html_doc + + twitter = {} + + html_doc.css('meta').each do |m| + if (m["property"] && m["property"][/^twitter:(.+)$/i]) || (m["name"] && m["name"][/^twitter:(.+)$/i]) + value = (m["content"] || m["value"]).to_s + twitter[$1.tr('-:' , '_').to_sym] ||= value unless (Onebox::Helpers::blank?(value) || value == "0 minutes") + end + end + + twitter + end + + def get_favicon + return nil unless html_doc + + favicon = html_doc.css('link[rel="shortcut icon"], link[rel="icon shortcut"], link[rel="shortcut"], link[rel="icon"]').first + favicon = favicon.nil? ? nil : (favicon['href'].nil? ? nil : favicon['href'].strip) + + Onebox::Helpers::get_absolute_image_url(favicon, url) + end + + def get_json_response + oembed_url = get_oembed_url + + return "{}" if Onebox::Helpers.blank?(oembed_url) + + Onebox::Helpers.fetch_response(oembed_url) rescue "{}" + rescue Errno::ECONNREFUSED, Net::HTTPError, Net::HTTPFatalError, MultiJson::LoadError + "{}" + end + + def get_oembed_url + oembed_url = nil + + StandardEmbed.oembed_providers.each do |regexp, endpoint| + if url =~ regexp + oembed_url = "#{endpoint}?url=#{url}" + break + end + end + + if html_doc + if Onebox::Helpers.blank?(oembed_url) + application_json = html_doc.at("//link[@type='application/json+oembed']/@href") + oembed_url = application_json.value if application_json + end + + if Onebox::Helpers.blank?(oembed_url) + text_json = html_doc.at("//link[@type='text/json+oembed']/@href") + oembed_url ||= text_json.value if text_json + end + end + + oembed_url + end + end + end +end diff --git a/lib/onebox/engine/steam_store_onebox.rb b/lib/onebox/engine/steam_store_onebox.rb new file mode 100644 index 0000000000000..e39ab843424a9 --- /dev/null +++ b/lib/onebox/engine/steam_store_onebox.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class SteamStoreOnebox + include Engine + include StandardEmbed + + always_https + matches_regexp(/^https?:\/\/store\.steampowered\.com\/app\/\d+/) + requires_iframe_origins "https://store.steampowered.com" + + def placeholder_html + og = get_opengraph + <<-HTML +
+
+

#{og.title}

+ +

#{og.description}

+
+
+ HTML + end + + def to_html + iframe_url = @url[/https?:\/\/store\.steampowered\.com\/app\/\d+/].gsub("/app/", "/widget/") + escaped_src = ::Onebox::Helpers.normalize_url_for_output(iframe_url) + + <<-HTML + + HTML + end + end + end +end diff --git a/lib/onebox/engine/trello_onebox.rb b/lib/onebox/engine/trello_onebox.rb new file mode 100644 index 0000000000000..c74b39f01acd3 --- /dev/null +++ b/lib/onebox/engine/trello_onebox.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class TrelloOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https:\/\/trello\.com\/[bc]\/\W*/) + requires_iframe_origins "https://trello.com" + always_https + + def to_html + src = "https://trello.com/#{match[:type]}/#{match[:key]}.html" + height = match[:type] == 'b' ? 400 : 200 + + <<-HTML + + HTML + end + + def placeholder_html + ::Onebox::Helpers.generic_placeholder_html + end + + private + + def match + return @match if defined?(@match) + @match = @url.match(%{trello\.com/(?[^/]+)/(?[^/]+)/?\W*}) + end + end + end +end diff --git a/lib/onebox/engine/twitch_clips_onebox.rb b/lib/onebox/engine/twitch_clips_onebox.rb new file mode 100644 index 0000000000000..8c4fb525b6358 --- /dev/null +++ b/lib/onebox/engine/twitch_clips_onebox.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +require_relative '../mixins/twitch_onebox' + +class Onebox::Engine::TwitchClipsOnebox + def self.twitch_regexp + /^https?:\/\/clips\.twitch\.tv\/([a-zA-Z0-9_]+\/?[^#\?\/]+)/ + end + + include Onebox::Mixins::TwitchOnebox + requires_iframe_origins "https://clips.twitch.tv" + + def query_params + "clip=#{twitch_id}" + end + + def base_url + "clips.twitch.tv/embed?" + end +end diff --git a/lib/onebox/engine/twitch_stream_onebox.rb b/lib/onebox/engine/twitch_stream_onebox.rb new file mode 100644 index 0000000000000..f0e1d5d346c4e --- /dev/null +++ b/lib/onebox/engine/twitch_stream_onebox.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require_relative '../mixins/twitch_onebox' + +class Onebox::Engine::TwitchStreamOnebox + def self.twitch_regexp + /^https?:\/\/(?:www\.|go\.)?twitch\.tv\/(?!directory)([a-zA-Z0-9_]{4,25})$/ + end + + include Onebox::Mixins::TwitchOnebox + + def query_params + "channel=#{twitch_id}" + end +end diff --git a/lib/onebox/engine/twitch_video_onebox.rb b/lib/onebox/engine/twitch_video_onebox.rb new file mode 100644 index 0000000000000..47fd2eefeb4a3 --- /dev/null +++ b/lib/onebox/engine/twitch_video_onebox.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require_relative '../mixins/twitch_onebox' + +class Onebox::Engine::TwitchVideoOnebox + def self.twitch_regexp + /^https?:\/\/(?:www\.)?twitch\.tv\/videos\/([0-9]+)/ + end + + include Onebox::Mixins::TwitchOnebox + + def query_params + "video=v#{twitch_id}" + end +end diff --git a/lib/onebox/engine/twitter_status_onebox.rb b/lib/onebox/engine/twitter_status_onebox.rb new file mode 100644 index 0000000000000..31fffadeb9514 --- /dev/null +++ b/lib/onebox/engine/twitter_status_onebox.rb @@ -0,0 +1,172 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class TwitterStatusOnebox + include Engine + include LayoutSupport + include HTML + + matches_regexp(/^https?:\/\/(mobile\.|www\.)?twitter\.com\/.+?\/status(es)?\/\d+(\/(video|photo)\/\d?+)?+(\/?\?.*)?\/?$/) + always_https + + def http_params + { 'User-Agent' => 'DiscourseBot/1.0' } + end + + private + + def get_twitter_data + response = Onebox::Helpers.fetch_response(url, headers: http_params) rescue nil + html = Nokogiri::HTML(response) + twitter_data = {} + html.css('meta').each do |m| + if m.attribute('property') && m.attribute('property').to_s.match(/^og:/i) + m_content = m.attribute('content').to_s.strip + m_property = m.attribute('property').to_s.gsub('og:', '') + twitter_data[m_property.to_sym] = m_content + end + end + twitter_data + end + + def match + @match ||= @url.match(%r{twitter\.com/.+?/status(es)?/(?\d+)}) + end + + def twitter_data + @twitter_data ||= get_twitter_data + end + + def client + Onebox.options.twitter_client + end + + def twitter_api_credentials_present? + client && !client.twitter_credentials_missing? + end + + def raw + if twitter_api_credentials_present? + @raw ||= OpenStruct.new(client.status(match[:id]).to_hash) + else + super + end + end + + def access(*keys) + keys.reduce(raw) do |memo, key| + next unless memo + memo[key] || memo[key.to_s] + end + end + + def tweet + if twitter_api_credentials_present? + client.prettify_tweet(raw)&.strip + else + twitter_data[:description].gsub(/“(.+?)”/im) { $1 } if twitter_data[:description] + end + end + + def timestamp + if twitter_api_credentials_present? + date = DateTime.strptime(access(:created_at), "%a %b %d %H:%M:%S %z %Y") + user_offset = access(:user, :utc_offset).to_i + offset = (user_offset >= 0 ? "+" : "-") + Time.at(user_offset.abs).gmtime.strftime("%H%M") + date.new_offset(offset).strftime("%-l:%M %p - %-d %b %Y") + else + attr_at_css(".tweet-timestamp", 'title') + end + end + + def title + if twitter_api_credentials_present? + "#{access(:user, :name)} (#{access(:user, :screen_name)})" + else + "#{attr_at_css('.tweet.permalink-tweet', 'data-name')} (#{attr_at_css('.tweet.permalink-tweet', 'data-screen-name')})" + end + end + + def avatar + if twitter_api_credentials_present? + access(:user, :profile_image_url_https).sub('normal', '400x400') + elsif twitter_data[:image] + twitter_data[:image] + end + end + + def likes + if twitter_api_credentials_present? + prettify_number(access(:favorite_count).to_i) + else + attr_at_css(".request-favorited-popup", 'data-compact-localized-count') + end + end + + def retweets + if twitter_api_credentials_present? + prettify_number(access(:retweet_count).to_i) + else + attr_at_css(".request-retweeted-popup", 'data-compact-localized-count') + end + end + + def quoted_full_name + if twitter_api_credentials_present? + access(:quoted_status, :user, :name) + else + raw.css('.QuoteTweet-fullname')[0]&.text + end + end + + def quoted_screen_name + if twitter_api_credentials_present? + access(:quoted_status, :user, :screen_name) + else + attr_at_css(".QuoteTweet-innerContainer", "data-screen-name") + end + end + + def quoted_tweet + if twitter_api_credentials_present? + access(:quoted_status, :full_text) + else + raw.css('.QuoteTweet-text')[0]&.text + end + end + + def quoted_link + if twitter_api_credentials_present? + "https://twitter.com/#{quoted_screen_name}/status/#{access(:quoted_status, :id)}" + else + "https://twitter.com#{attr_at_css(".QuoteTweet-innerContainer", "href")}" + end + end + + def prettify_number(count) + count > 0 ? client.prettify_number(count) : nil + end + + def attr_at_css(css_property, attribute_name) + raw.at_css(css_property)&.attr(attribute_name) + end + + def data + @data ||= { + link: link, + tweet: tweet, + timestamp: timestamp, + title: title, + avatar: avatar, + likes: likes, + retweets: retweets, + quoted_tweet: quoted_tweet, + quoted_full_name: quoted_full_name, + quoted_screen_name: quoted_screen_name, + quoted_link: quoted_link + } + end + end + end +end diff --git a/lib/onebox/engine/typeform_onebox.rb b/lib/onebox/engine/typeform_onebox.rb new file mode 100644 index 0000000000000..184aff5e02ee3 --- /dev/null +++ b/lib/onebox/engine/typeform_onebox.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class TypeformOnebox + include Engine + + matches_regexp(/^https?:\/\/[a-z0-9\-_]+\.typeform\.com\/to\/[a-zA-Z0-9]+/) + requires_iframe_origins "https://*.typeform.com" + always_https + + def to_html + typeform_src = build_typeform_src + + <<~HTML + + HTML + end + + def placeholder_html + ::Onebox::Helpers.generic_placeholder_html + end + + private + + def build_typeform_src + escaped_src = ::Onebox::Helpers.normalize_url_for_output(@url) + query_params = CGI::parse(URI::parse(escaped_src).query || '') + + return escaped_src if query_params.has_key?('typeform-embed') + + if query_params.empty? + escaped_src += '?' unless escaped_src.end_with?('?') + else + escaped_src += '&' + end + + escaped_src += 'typeform-embed=embed-widget' + end + end + end +end diff --git a/lib/onebox/engine/video_onebox.rb b/lib/onebox/engine/video_onebox.rb new file mode 100644 index 0000000000000..1fd60543ff903 --- /dev/null +++ b/lib/onebox/engine/video_onebox.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class VideoOnebox + include Engine + + matches_regexp(/^(https?:)?\/\/.*\.(mov|mp4|webm|ogv)(\?.*)?$/i) + + def always_https? + AllowlistedGenericOnebox.host_matches(uri, AllowlistedGenericOnebox.https_hosts) + end + + def to_html + # Fix Dropbox image links + if @url[/^https:\/\/www.dropbox.com\/s\//] + @url.sub!("https://www.dropbox.com", "https://dl.dropboxusercontent.com") + end + + escaped_url = ::Onebox::Helpers.normalize_url_for_output(@url) + <<-HTML +
+ +
+ HTML + end + + def placeholder_html + ::Onebox::Helpers.video_placeholder_html + end + end + end +end diff --git a/lib/onebox/engine/vimeo_onebox.rb b/lib/onebox/engine/vimeo_onebox.rb new file mode 100644 index 0000000000000..d35dc54b9641f --- /dev/null +++ b/lib/onebox/engine/vimeo_onebox.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class VimeoOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/(www\.)?vimeo\.com\/\d+/) + requires_iframe_origins "https://player.vimeo.com" + always_https + + WIDTH ||= 640 + HEIGHT ||= 360 + + def placeholder_html + ::Onebox::Helpers.video_placeholder_html + end + + def to_html + video_id = oembed_data[:video_id] + if video_id.nil? + # for private videos + video_id = uri.path[/\/(\d+)/, 1] + end + video_src = "https://player.vimeo.com/video/#{video_id}" + video_src = video_src.gsub('autoplay=1', '').chomp("?") + + <<-HTML + + HTML + end + + private + + def oembed_data + response = Onebox::Helpers.fetch_response("https://vimeo.com/api/oembed.json?url=#{url}") + @oembed_data = Onebox::Helpers.symbolize_keys(::MultiJson.load(response)) + rescue + "{}" + end + + def og_data + @og_data = get_opengraph + end + end + end +end diff --git a/lib/onebox/engine/wikimedia_onebox.rb b/lib/onebox/engine/wikimedia_onebox.rb new file mode 100644 index 0000000000000..c222f58bf918e --- /dev/null +++ b/lib/onebox/engine/wikimedia_onebox.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class WikimediaOnebox + include Engine + include LayoutSupport + include JSON + + matches_regexp(/^https?:\/\/commons\.wikimedia\.org\/wiki\/(File:.+)/) + always_https + + def self.priority + # Wikimedia links end in an image extension. + # E.g. https://commons.wikimedia.org/wiki/File:Stones_members_montage2.jpg + # This engine should have priority over the generic ImageOnebox. + + 1 + end + + def url + "https://en.wikipedia.org/w/api.php?action=query&titles=#{match[:name]}&prop=imageinfo&iilimit=50&iiprop=timestamp|user|url&iiurlwidth=500&format=json" + end + + private + + def match + @match ||= @url.match(/^https?:\/\/commons\.wikimedia\.org\/wiki\/(?File:.+)/) + end + + def data + first_page = raw['query']['pages'].first[1] + + { + link: first_page['imageinfo'].first['descriptionurl'], + title: first_page['title'], + image: first_page['imageinfo'].first['url'], + thumbnail: first_page['imageinfo'].first['thumburl'] + } + end + end + end +end diff --git a/lib/onebox/engine/wikipedia_onebox.rb b/lib/onebox/engine/wikipedia_onebox.rb new file mode 100644 index 0000000000000..e86a901433419 --- /dev/null +++ b/lib/onebox/engine/wikipedia_onebox.rb @@ -0,0 +1,97 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class WikipediaOnebox + include Engine + include LayoutSupport + include HTML + + matches_regexp(/^https?:\/\/.*\.wikipedia\.(com|org)/) + always_https + + private + + def data + paras = [] + text = "" + + # Detect section Hash in the url and retrive the related paragraphs. if no hash provided the first few paragraphs will be used + # Author Lidlanca + # Date 9/8/2014 + if (m_url_hash = @url.match(/#([^\/?]+)/)) # extract url hash + m_url_hash_name = m_url_hash[1] + end + + unless m_url_hash.nil? + section_header_title = raw.xpath("//span[@id='#{m_url_hash_name}']") + + if section_header_title.empty? + paras = raw.search("p") # default get all the paras + else + section_title_text = section_header_title.inner_text + section_header = section_header_title[0].parent # parent element of the section span element should be an

node + cur_element = section_header + + # p|text|div covers the general case. We assume presence of at least 1 P node. if section has no P node we may end up with a P node from the next section. + # div tag is commonly used as an assets wraper in an article section. often as the first element holding an image. + # ul support will imporve the output generated for a section with a list as the main content (for example: an Author Bibliography, A musician Discography, etc) + first_p_found = nil + while (((next_sibling = cur_element.next_sibling).name =~ /p|text|div|ul/) || first_p_found.nil?) do # from section header get the next sibling until it is a breaker tag + cur_element = next_sibling + if (cur_element.name == "p" || cur_element.name == "ul") #we treat a list as we detect a p to avoid showing + first_p_found = true + paras.push(cur_element) + end + end + end + else # no hash found in url + paras = raw.search("p") # default get all the paras + end + + unless paras.empty? + cnt = 0 + while text.length < Onebox::LayoutSupport.max_text && cnt <= 3 + break if cnt >= paras.size + text += " " unless cnt == 0 + + if paras[cnt].name == "ul" # Handle UL tag. Generate a textual ordered list (1.item | 2.item | 3.item). Unfortunately no newline allowed in output + li_index = 1 + list_items = [] + paras[cnt].children.css("li").each { |li| list_items.push "#{li_index}." + li.inner_text ; li_index += 1 } + paragraph = (list_items.join " |\n ")[0..Onebox::LayoutSupport.max_text] + else + paragraph = paras[cnt].inner_text[0..Onebox::LayoutSupport.max_text] + end + + paragraph.gsub!(/\[\d+\]/mi, "") + text += paragraph + cnt += 1 + end + end + + text = "#{text[0..Onebox::LayoutSupport.max_text]}..." if text.length > Onebox::LayoutSupport.max_text + + result = { + link: link, + title: raw.css("html body h1").inner_text + (section_title_text ? " | " + section_title_text : ""), #if a section sub title exists add it to the main article title + description: text + } + + img = raw.css(".image img") + + if img && img.size > 0 + img.each do |i| + src = i["src"] + if src !~ /Question_book/ + result[:image] = src + break + end + end + end + + result + end + end + end +end diff --git a/lib/onebox/engine/wistia_onebox.rb b/lib/onebox/engine/wistia_onebox.rb new file mode 100644 index 0000000000000..4abb2ff7fc4e3 --- /dev/null +++ b/lib/onebox/engine/wistia_onebox.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class WistiaOnebox + include Engine + include StandardEmbed + + matches_regexp(/https?:\/\/(.+)?(wistia.com|wi.st)\/(medias|embed)\/.*/) + requires_iframe_origins("https://fast.wistia.com", "https://fast.wistia.net") + always_https + + def to_html + get_oembed.html + end + + def placeholder_html + oembed = get_oembed + return if Onebox::Helpers.blank?(oembed.thumbnail_url) + "" + end + + private + + def get_oembed_url + "https://fast.wistia.com/oembed?embedType=iframe&url=#{url}" + end + end + end +end diff --git a/lib/onebox/engine/xkcd_onebox.rb b/lib/onebox/engine/xkcd_onebox.rb new file mode 100644 index 0000000000000..b16c25b098acc --- /dev/null +++ b/lib/onebox/engine/xkcd_onebox.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class XkcdOnebox + include Engine + include LayoutSupport + include JSON + + matches_regexp(/^https?:\/\/(www\.)?(m\.)?xkcd\.com\/\d+/) + + def url + "https://xkcd.com/#{match[:comic_id]}/info.0.json" + end + + private + + def match + @match ||= @url.match(%{xkcd\.com/(?\\d+)}) + end + + def data + { + link: @url, + title: raw['safe_title'], + image: raw['img'], + description: raw['alt'] + } + end + end + end +end diff --git a/lib/onebox/engine/youku_onebox.rb b/lib/onebox/engine/youku_onebox.rb new file mode 100644 index 0000000000000..2b9234fd93161 --- /dev/null +++ b/lib/onebox/engine/youku_onebox.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class YoukuOnebox + include Engine + include HTML + + matches_regexp(/^(https?:\/\/)?([\da-z\.-]+)(youku.com\/)(.)+\/?$/) + requires_iframe_origins "https://player.youku.com" + + # Try to get the video ID. Works for URLs of the form: + # * http://v.youku.com/v_show/id_XNjM3MzAxNzc2.html + # * http://v.youku.com/v_show/id_XMTQ5MjgyMjMyOA==.html?from=y1.3-tech-index3-232-10183.89969-89963.3-1 + def video_id + match = uri.path.match(/\/v_show\/id_([a-zA-Z0-9_=\-]+)(\.html)?.*/) + match && match[1] + rescue + nil + end + + def to_html + <<~HTML + + HTML + end + end + end +end diff --git a/lib/onebox/engine/youtube_onebox.rb b/lib/onebox/engine/youtube_onebox.rb new file mode 100644 index 0000000000000..81f822ce0bd4a --- /dev/null +++ b/lib/onebox/engine/youtube_onebox.rb @@ -0,0 +1,173 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class YoutubeOnebox + include Engine + include StandardEmbed + + matches_regexp(/^https?:\/\/(?:www\.)?(?:m\.)?(?:youtube\.com|youtu\.be)\/.+$/) + requires_iframe_origins "https://www.youtube.com" + always_https + + WIDTH ||= 480 + HEIGHT ||= 360 + + def parse_embed_response + return unless video_id + return @parse_embed_response if defined?(@parse_embed_response) + + embed_url = "https://www.youtube.com/embed/#{video_id}" + @embed_doc ||= Onebox::Helpers.fetch_html_doc(embed_url) + + begin + script_tag = @embed_doc.xpath('//script').find { |tag| tag.to_s.include?('ytcfg.set') }.to_s + match = script_tag.to_s.match(/ytcfg\.set\((?.*)\)/) + + yt_json = ::JSON.parse(match[:json]) + renderer = ::JSON.parse(yt_json['PLAYER_VARS']['embedded_player_response'])['embedPreview']['thumbnailPreviewRenderer'] + + title = renderer['title']['runs'].first['text'] + + image = "https://img.youtube.com/vi/#{video_id}/hqdefault.jpg" + rescue + return + end + + @parse_embed_response = { image: image, title: title } + end + + def placeholder_html + if video_id || list_id + result = parse_embed_response + result ||= get_opengraph.data + + "" + else + to_html + end + end + + def to_html + if video_id + <<-HTML + + HTML + elsif list_id + <<-HTML + + HTML + else + # for channel pages + html = Onebox::Engine::AllowlistedGenericOnebox.new(@url, @timeout).to_html + return if Onebox::Helpers.blank?(html) + html.gsub!(/['"]\/\//, "https://") + html + end + end + + def video_title + @video_title ||= begin + result = parse_embed_response || get_opengraph.data + result[:title] + end + end + + private + + def video_id + @video_id ||= begin + # http://youtu.be/afyK1HSFfgw + if uri.host["youtu.be"] + id = uri.path[/\/([\w\-]+)/, 1] + return id if id + end + + # https://www.youtube.com/embed/vsF0K3Ou1v0 + if uri.path["/embed/"] + id = uri.path[/\/embed\/([\w\-]+)/, 1] + return id if id + end + + # https://www.youtube.com/watch?v=Z0UISCEe52Y + params['v'] + end + end + + def list_id + @list_id ||= params['list'] + end + + def embed_params + p = { 'feature' => 'oembed', 'wmode' => 'opaque' } + + p['list'] = list_id if list_id + + # Parse timestrings, and assign the result as a start= parameter + start = if params['start'] + params['start'] + elsif params['t'] + params['t'] + elsif uri.fragment && uri.fragment.start_with?('t=') + # referencing uri is safe here because any throws were already caught by video_id returning nil + # remove the t= from the start + uri.fragment[2..-1] + end + + p['start'] = parse_timestring(start) if start + p['end'] = parse_timestring params['end'] if params['end'] + + # Official workaround for looping videos + # https://developers.google.com/youtube/player_parameters#loop + # use params.include? so that you can just add "&loop" + if params.include?('loop') + p['loop'] = 1 + p['playlist'] = video_id + end + + # https://developers.google.com/youtube/player_parameters#rel + p['rel'] = 0 if params.include?('rel') + + # https://developers.google.com/youtube/player_parameters#enablejsapi + p['enablejsapi'] = params['enablejsapi'] if params.include?('enablejsapi') + + URI.encode_www_form(p) + end + + def parse_timestring(string) + if string =~ /(\d+h)?(\d+m)?(\d+s?)?/ + ($1.to_i * 3600) + ($2.to_i * 60) + $3.to_i + end + end + + def params + return {} unless uri.query + # This mapping is necessary because CGI.parse returns a hash of keys to arrays. + # And *that* is necessary because querystrings support arrays, so they + # force you to deal with it to avoid security issues that would pop up + # if one day it suddenly gave you an array. + # + # However, we aren't interested. Just take the first one. + @params ||= begin + p = {} + CGI.parse(uri.query).each { |k, v| p[k] = v.first } + p + end + rescue + {} + end + end + end +end diff --git a/lib/onebox/file_type_finder.rb b/lib/onebox/file_type_finder.rb new file mode 100644 index 0000000000000..8ba4dc8c3f45a --- /dev/null +++ b/lib/onebox/file_type_finder.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +module Onebox + module FileTypeFinder + # In general, most of file extension names would be recognized + # by Highlights.js. However, some need to be checked in other + # ways, either because they just aren't included, because they + # are extensionless, or because they contain dots (they are + # multi-part). + # IMPORTANT: to prevent false positive matching, start all + # entries on this list with a "." + # + # For easy reference, keep these sorted in alphabetical order. + @long_file_types = { + ".bib" => "tex", + ".html.hbs" => "handlebars", + ".html.handlebars" => "handlebars", + ".latex" => "tex", + ".ru" => "rb", + ".simplecov" => "rb", # Not official, but seems commonly found + ".sty" => "tex" + } + + # Some extensionless files for which we know the type + # These should all be stored LOWERCASE, just for consistency. + # The ones that I know of also include the ".lock" fake extension. + # + # For easy reference, keep these sorted in alphabetical order, + # FIRST by their types and THEN by their names. + @extensionless_files = { + "cmake.in" => "cmake", + + "gruntfile" => "js", + "gulpfile" => "js", + + "artisan" => "php", + + "berksfile" => "rb", + "capfile" => "rb", + "cheffile" => "rb", + "cheffile.lock" => "rb", + "gemfile" => "rb", + "guardfile" => "rb", + "rakefile" => "rb", + "thorfile" => "rb", + "vagrantfile" => "rb", + + "boxfile" => "yaml" # Not currently (2014-11) in Highlight.js + } + + def self.from_file_name(file_name) + lower_name = file_name.downcase + # First check against the known lists of "special" files and extensions. + return @extensionless_files[lower_name] if @extensionless_files.has_key?(lower_name) + + @long_file_types.each { |extension, type| + return type if lower_name.end_with?(extension) + } + + # Otherwise, just split on the last ".", + # but add one so we don't return the "." itself. + dot_spot = lower_name.rindex(".") + return lower_name[(dot_spot + 1)..-1] if dot_spot + + # If we couldn't figure it out from the name, + # let the highlighter figure it out from the content. + "" + end + end +end diff --git a/lib/onebox/helpers.rb b/lib/onebox/helpers.rb new file mode 100644 index 0000000000000..a3df3f2a04260 --- /dev/null +++ b/lib/onebox/helpers.rb @@ -0,0 +1,252 @@ +# frozen_string_literal: true + +require "addressable" + +module Onebox + module Helpers + + class DownloadTooLarge < StandardError; end + + IGNORE_CANONICAL_DOMAINS ||= ['www.instagram.com', 'youtube.com'] + + def self.symbolize_keys(hash) + return {} if hash.nil? + + hash.inject({}) do |result, (key, value)| + new_key = key.is_a?(String) ? key.to_sym : key + new_value = value.is_a?(Hash) ? symbolize_keys(value) : value + result[new_key] = new_value + result + end + end + + def self.clean(html) + html.gsub(/<[^>]+>/, ' ').gsub(/\n/, '') + end + + def self.fetch_html_doc(url, headers = nil, body_cacher = nil) + response = (fetch_response(url, headers: headers, body_cacher: body_cacher) rescue nil) + doc = Nokogiri::HTML(response) + uri = Addressable::URI.parse(url) + + ignore_canonical_tag = doc.at('meta[property="og:ignore_canonical"]') + should_ignore_canonical = IGNORE_CANONICAL_DOMAINS.map { |hostname| uri.hostname.match?(hostname) }.any? + + unless (ignore_canonical_tag && ignore_canonical_tag['content'].to_s == 'true') || should_ignore_canonical + # prefer canonical link + canonical_link = doc.at('//link[@rel="canonical"]/@href') + canonical_uri = Addressable::URI.parse(canonical_link) + if canonical_link && "#{canonical_uri.host}#{canonical_uri.path}" != "#{uri.host}#{uri.path}" + response = (fetch_response(canonical_uri.to_s, headers: headers, body_cacher: body_cacher) rescue nil) + doc = Nokogiri::HTML(response) if response + end + end + + doc + end + + def self.fetch_response(location, redirect_limit: 5, domain: nil, headers: nil, body_cacher: nil) + redirect_limit = Onebox.options.redirect_limit if redirect_limit > Onebox.options.redirect_limit + + raise Net::HTTPError.new('HTTP redirect too deep', location) if redirect_limit == 0 + + uri = Addressable::URI.parse(location) + uri = Addressable::URI.join(domain, uri) if !uri.host + + use_body_cacher = body_cacher && body_cacher.respond_to?('fetch_cached_response_body') + if use_body_cacher + response_body = body_cacher.fetch_cached_response_body(uri.to_s) + + if response_body.present? + return response_body + end + end + + result = StringIO.new + Net::HTTP.start(uri.host, uri.port, use_ssl: uri.normalized_scheme == 'https') do |http| + http.open_timeout = Onebox.options.connect_timeout + http.read_timeout = Onebox.options.timeout + http.verify_mode = OpenSSL::SSL::VERIFY_NONE # Work around path building bugs + + headers ||= {} + + if Onebox.options.user_agent && !headers['User-Agent'] + headers['User-Agent'] = Onebox.options.user_agent + end + + request = Net::HTTP::Get.new(uri.request_uri, headers) + start_time = Time.now + + size_bytes = Onebox.options.max_download_kb * 1024 + http.request(request) do |response| + + if cookie = response.get_fields('set-cookie') + # HACK: If this breaks again in the future, use HTTP::CookieJar from gem 'http-cookie' + # See test: it "does not send cookies to the wrong domain" + redir_header = { 'Cookie' => cookie.join('; ') } + end + + redir_header = nil unless redir_header.is_a? Hash + + code = response.code.to_i + unless code === 200 + response.error! unless [301, 302, 303, 307, 308].include?(code) + + return fetch_response( + response['location'], + redirect_limit: redirect_limit - 1, + domain: "#{uri.scheme}://#{uri.host}", + headers: redir_header + ) + end + + response.read_body do |chunk| + result.write(chunk) + raise DownloadTooLarge.new if result.size > size_bytes + raise Timeout::Error.new if (Time.now - start_time) > Onebox.options.timeout + end + + if use_body_cacher && body_cacher.cache_response_body?(uri) + body_cacher.cache_response_body(uri.to_s, result.string) + end + + return result.string + end + end + end + + def self.fetch_content_length(location) + uri = URI(location) + + Net::HTTP.start(uri.host, uri.port, use_ssl: uri.is_a?(URI::HTTPS)) do |http| + http.open_timeout = Onebox.options.connect_timeout + http.read_timeout = Onebox.options.timeout + if uri.is_a?(URI::HTTPS) + http.use_ssl = true + http.verify_mode = OpenSSL::SSL::VERIFY_NONE + end + + http.request_head([uri.path, uri.query].join("?")) do |response| + code = response.code.to_i + unless code === 200 || Onebox::Helpers.blank?(response.content_length) + return nil + end + return response.content_length + end + end + end + + def self.pretty_filesize(size) + conv = [ 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB' ] + scale = 1024 + + ndx = 1 + if (size < 2 * (scale**ndx)) then + return "#{(size)} #{conv[ndx - 1]}" + end + size = size.to_f + [2, 3, 4, 5, 6, 7].each do |i| + if (size < 2 * (scale**i)) then + return "#{'%.2f' % (size / (scale**(i - 1)))} #{conv[i - 1]}" + end + end + ndx = 7 + "#{'%.2f' % (size / (scale**(ndx - 1)))} #{conv[ndx - 1]}" + end + + def self.click_to_scroll_div(width = 690, height = 400) + "
" + end + + def self.blank?(value) + if value.nil? + true + elsif String === value + value.empty? || !(/[[:^space:]]/ === value) + else + value.respond_to?(:empty?) ? !!value.empty? : !value + end + end + + def self.truncate(string, length = 50) + return string if string.nil? + string.size > length ? string[0...(string.rindex(" ", length) || length)] + "..." : string + end + + def self.get(meta, attr) + (meta && !blank?(meta[attr])) ? sanitize(meta[attr]) : nil + end + + def self.sanitize(value, length = 50) + return nil if blank?(value) + Sanitize.fragment(value).strip + end + + def self.normalize_url_for_output(url) + return "" unless url + url = url.dup + # expect properly encoded url, remove any unsafe chars + url.gsub!(' ', '%20') + url.gsub!("'", "'") + url.gsub!('"', """) + url.gsub!(/[^\w\-`.~:\/?#\[\]@!$&'\(\)*+,;=%\p{M}’]/, "") + + parsed = Addressable::URI.parse(url) + return "" unless parsed.host + + url + end + + def self.get_absolute_image_url(src, url) + if src && !!(src =~ /^\/\//) + uri = URI(url) + src = "#{uri.scheme}:#{src}" + elsif src && src.match(/^https?:\/\//i).nil? + uri = URI(url) + src = if !src.start_with?("/") && uri.path.present? + "#{uri.scheme}://#{uri.host.sub(/\/$/, '')}#{uri.path.sub(/\/$/, '')}/#{src.sub(/^\//, '')}" + else + "#{uri.scheme}://#{uri.host.sub(/\/$/, '')}/#{src.sub(/^\//, '')}" + end + end + src + end + + # Percent-encodes a URI string per RFC3986 - https://tools.ietf.org/html/rfc3986 + def self.uri_encode(url) + return "" unless url + + uri = Addressable::URI.parse(url) + + encoded_uri = Addressable::URI.new( + scheme: Addressable::URI.encode_component(uri.scheme, Addressable::URI::CharacterClasses::SCHEME), + authority: Addressable::URI.encode_component(uri.authority, Addressable::URI::CharacterClasses::AUTHORITY), + path: Addressable::URI.encode_component(uri.path, Addressable::URI::CharacterClasses::PATH + "\\%"), + query: Addressable::URI.encode_component(uri.query, "a-zA-Z0-9\\-\\.\\_\\~\\$\\&\\*\\,\\=\\:\\@\\?\\%"), + fragment: Addressable::URI.encode_component(uri.fragment, "a-zA-Z0-9\\-\\.\\_\\~\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=\\:\\/\\?\\%") + ) + + encoded_uri.to_s + end + + def self.uri_unencode(url) + Addressable::URI.unencode(url) + end + + def self.video_placeholder_html + "
" + end + + def self.audio_placeholder_html + "
" + end + + def self.map_placeholder_html + "
" + end + + def self.generic_placeholder_html + "
" + end + end +end diff --git a/lib/onebox/layout.rb b/lib/onebox/layout.rb new file mode 100644 index 0000000000000..a697ba24f0735 --- /dev/null +++ b/lib/onebox/layout.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +require_relative "template_support" + +module Onebox + class Layout < Mustache + include TemplateSupport + + VERSION = "1.0.0" + + attr_reader :record + attr_reader :view + + def initialize(name, record) + @record = Onebox::Helpers.symbolize_keys(record) + + # Fix any relative paths + if @record[:image] && @record[:image] =~ /^\/[^\/]/ + @record[:image] = "#{uri.scheme}://#{uri.host}/#{@record[:image]}" + end + + @md5 = Digest::MD5.new + @view = View.new(name, @record) + @template_name = "_layout" + @template_path = load_paths.last + end + + def to_html + render(details) + end + + private + + def uri + @uri ||= URI(::Onebox::Helpers.normalize_url_for_output(record[:link])) + end + + def details + { + link: record[:link], + title: record[:title], + favicon: record[:favicon], + domain: record[:domain] || uri.host.to_s.sub(/^www\./, ''), + article_published_time: record[:article_published_time], + article_published_time_title: record[:article_published_time_title], + metadata_1_label: record[:metadata_1_label], + metadata_1_value: record[:metadata_1_value], + metadata_2_label: record[:metadata_2_label], + metadata_2_value: record[:metadata_2_value], + subname: view.template_name, + view: view.to_html + } + end + end +end diff --git a/lib/onebox/layout_support.rb b/lib/onebox/layout_support.rb new file mode 100644 index 0000000000000..dcec7cf287c96 --- /dev/null +++ b/lib/onebox/layout_support.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Onebox + module LayoutSupport + + def self.max_text + 500 + end + + def layout + @layout ||= Layout.new(self.class.onebox_name, data) + end + + def to_html + layout.to_html + end + end +end diff --git a/lib/onebox/matcher.rb b/lib/onebox/matcher.rb new file mode 100644 index 0000000000000..2e337904e7e02 --- /dev/null +++ b/lib/onebox/matcher.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module Onebox + class Matcher + def initialize(url, options = {}) + begin + @uri = URI(url) + rescue URI::InvalidURIError + end + + @options = options + end + + def ordered_engines + @ordered_engines ||= Engine.engines.sort_by do |e| + e.respond_to?(:priority) ? e.priority : 100 + end + end + + def oneboxed + return if @uri.nil? + return if @uri.port && !Onebox.options.allowed_ports.include?(@uri.port) + return if @uri.scheme && !Onebox.options.allowed_schemes.include?(@uri.scheme) + ordered_engines.find { |engine| engine === @uri && has_allowed_iframe_origins?(engine) } + end + + def has_allowed_iframe_origins?(engine) + allowed_regexes = @options[:allowed_iframe_regexes] || [] + engine.iframe_origins.all? { |o| allowed_regexes.any? { |r| o =~ r } } + end + end +end diff --git a/lib/onebox/mixins/git_blob_onebox.rb b/lib/onebox/mixins/git_blob_onebox.rb new file mode 100644 index 0000000000000..cac7b2a764479 --- /dev/null +++ b/lib/onebox/mixins/git_blob_onebox.rb @@ -0,0 +1,228 @@ +# frozen_string_literal: true + +module Onebox + module Mixins + module GitBlobOnebox + def self.included(klass) + klass.include(Onebox::Engine) + klass.include(Onebox::LayoutSupport) + klass.matches_regexp(klass.git_regexp) + klass.always_https + klass.include(InstanceMethods) + end + + EXPAND_AFTER = 0b001 + EXPAND_BEFORE = 0b010 + EXPAND_NONE = 0b0 + + DEFAULTS = { + EXPAND_ONE_LINER: EXPAND_AFTER | EXPAND_BEFORE, #set how to expand a one liner. user EXPAND_NONE to disable expand + LINES_BEFORE: 10, + LINES_AFTER: 10, + SHOW_LINE_NUMBER: true, + MAX_LINES: 20, + MAX_CHARS: 5000 + } + + module InstanceMethods + def initialize(url, timeout = nil) + super url, timeout + # merge engine options from global Onebox.options interface + # self.options = Onebox.options["GithubBlobOnebox"] # self.class.name.split("::").last.to_s + # self.options = Onebox.options[self.class.name.split("::").last.to_s] #We can use this a more generic approach. extract the engine class name automatically + + self.options = DEFAULTS + + @selected_lines_array = nil + @selected_one_liner = 0 + @model_file = nil + + # Define constant after merging options set in Onebox.options + # We can define constant automatically. + options.each_pair do |constant_name, value| + constant_name_u = constant_name.to_s.upcase + if constant_name_u == constant_name.to_s + #define a constant if not already defined + unless self.class.const_defined? constant_name_u.to_sym + Onebox::Mixins::GitBlobOnebox.const_set constant_name_u.to_sym , options[constant_name_u.to_sym] + end + end + end + end + + private + + def calc_range(m, contents_lines_size) + truncated = false + from = /\d+/.match(m[:from]) #get numeric should only match a positive interger + to = /\d+/.match(m[:to]) #get numeric should only match a positive interger + range_provided = !(from.nil? && to.nil?) #true if "from" or "to" provided in URL + from = from.nil? ? 1 : from[0].to_i #if from not provided default to 1st line + to = to.nil? ? -1 : to[0].to_i #if to not provided default to undefiend to be handled later in the logic + + if to === -1 && range_provided #case "from" exists but no valid "to". aka ONE_LINER + one_liner = true + to = from + else + one_liner = false + end + + unless range_provided #case no range provided default to 1..MAX_LINES + from = 1 + to = MAX_LINES + truncated = true if contents_lines_size > MAX_LINES + #we can technically return here + end + + from, to = [from, to].sort #enforce valid range. [from < to] + from = 1 if from > contents_lines_size #if "from" out of TOP bound set to 1st line + to = contents_lines_size if to > contents_lines_size #if "to" is out of TOP bound set to last line. + + if one_liner + @selected_one_liner = from + if EXPAND_ONE_LINER != EXPAND_NONE + if (EXPAND_ONE_LINER & EXPAND_BEFORE != 0) # check if EXPAND_BEFORE flag is on + from = [1, from - LINES_BEFORE].max # make sure expand before does not go out of bound + end + + if (EXPAND_ONE_LINER & EXPAND_AFTER != 0) # check if EXPAND_FLAG flag is on + to = [to + LINES_AFTER, contents_lines_size].min # make sure expand after does not go out of bound + end + + from = contents_lines_size if from > contents_lines_size #if "from" is out of the content top bound + # to = contents_lines_size if to > contents_lines_size #if "to" is out of the content top bound + else + #no expand show the one liner solely + end + end + + if to - from > MAX_LINES && !one_liner #if exceed the MAX_LINES limit correct unless range was produced by one_liner which it expand setting will allow exceeding the line limit + truncated = true + to = from + MAX_LINES - 1 + end + + { + from: from, #calculated from + from_minus_one: from - 1, #used for getting currect ol>li numbering with css used in template + to: to, #calculated to + one_liner: one_liner, #boolean if a one-liner + selected_one_liner: @selected_one_liner, #if a one liner is provided we create a reference for it. + range_provided: range_provided, #boolean if range provided + truncated: truncated + } + end + + #minimize/compact leading indentation while preserving overall indentation + def removeLeadingIndentation(str) + min_space = 100 + a_lines = str.lines + a_lines.each do |l| + l = l.chomp("\n") # remove new line + m = l.match(/^[ ]*/) # find leading spaces 0 or more + unless m.nil? || l.size == m[0].size || l.size == 0 # no match | only spaces in line | empty line + m_str_length = m[0].size + if m_str_length <= 1 # minimum space is 1 or nothing we can break we found our minimum + min_space = m_str_length + break #stop iteration + end + if m_str_length < min_space + min_space = m_str_length + end + else + next # SKIP no match or line is only spaces + end + end + a_lines.each do |l| + re = Regexp.new "^[ ]{#{min_space}}" #match the minimum spaces of the line + l.gsub!(re, "") + end + a_lines.join + end + + def line_number_helper(lines, start, selected) + lines = removeLeadingIndentation(lines.join).lines # A little ineffeicent we could modify removeLeadingIndentation to accept array and return array, but for now it is only working with a string + hash_builder = [] + output_builder = [] + lines.map.with_index { |line, i| + lnum = (i.to_i + start) + hash_builder.push(line_number: lnum, data: line.gsub("\n", ""), selected: (selected == lnum) ? true : false) + output_builder.push "#{lnum}: #{line}" + } + { output: output_builder.join(), array: hash_builder } + end + + def raw + return @raw if defined?(@raw) + + m = @url.match(self.raw_regexp) + + if m + from = /\d+/.match(m[:from]) #get numeric should only match a positive interger + to = /\d+/.match(m[:to]) #get numeric should only match a positive interger + + @file = m[:file] + @lang = Onebox::FileTypeFinder.from_file_name(m[:file]) + + if @lang == "stl" && link.match?(/^https?:\/\/(www\.)?github\.com.*\/blob\//) + @model_file = @lang.dup + @raw = "https://render.githubusercontent.com/view/solid?url=" + self.raw_template(m) + else + contents = URI.open(self.raw_template(m), read_timeout: timeout).read + + contents_lines = contents.lines #get contents lines + contents_lines_size = contents_lines.size #get number of lines + + cr = calc_range(m, contents_lines_size) #calculate the range of lines for output + selected_one_liner = cr[:selected_one_liner] #if url is a one-liner calc_range will return it + from = cr[:from] + to = cr[:to] + @truncated = cr[:truncated] + range_provided = cr[:range_provided] + @cr_results = cr + + if range_provided #if a range provided (single line or more) + if SHOW_LINE_NUMBER + lines_result = line_number_helper(contents_lines[(from - 1)..(to - 1)], from, selected_one_liner) #print code with prefix line numbers in case range provided + contents = lines_result[:output] + @selected_lines_array = lines_result[:array] + else + contents = contents_lines[(from - 1)..(to - 1)].join() + end + + else + contents = contents_lines[(from - 1)..(to - 1)].join() + end + + if contents.length > MAX_CHARS #truncate content chars to limits + contents = contents[0..MAX_CHARS] + @truncated = true + end + + @raw = contents + end + end + end + + def data + @data ||= { + title: title, + link: link, + # IMPORTANT NOTE: All of the other class variables are populated + # as *side effects* of the `raw` method! They must all appear + # AFTER the call to `raw`! Don't get bitten by this like I did! + content: raw, + lang: "lang-#{@lang}", + lines: @selected_lines_array , + has_lines: !@selected_lines_array.nil?, + selected_one_liner: @selected_one_liner, + cr_results: @cr_results, + truncated: @truncated, + model_file: @model_file, + width: 480, + height: 360 + } + end + end + end + end +end diff --git a/lib/onebox/mixins/github_body.rb b/lib/onebox/mixins/github_body.rb new file mode 100644 index 0000000000000..22ee13ab3f531 --- /dev/null +++ b/lib/onebox/mixins/github_body.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module Onebox + module Mixins + module GithubBody + def self.included(klass) + klass.include(Onebox::Engine) + klass.include(InstanceMethods) + end + + module InstanceMethods + GITHUB_COMMENT_REGEX = /(\r\n)/ + MAX_BODY_LENGTH = 80 + def compute_body(body) + body = body.dup + excerpt = nil + + body = (body || '').gsub(GITHUB_COMMENT_REGEX, '') + body = body.length > 0 ? body : nil + if body && body.length > MAX_BODY_LENGTH + excerpt = body[MAX_BODY_LENGTH..body.length].rstrip + body = body[0..MAX_BODY_LENGTH - 1] + end + + [body, excerpt] + end + end + end + end +end diff --git a/lib/onebox/mixins/twitch_onebox.rb b/lib/onebox/mixins/twitch_onebox.rb new file mode 100644 index 0000000000000..ec3bc4a67423d --- /dev/null +++ b/lib/onebox/mixins/twitch_onebox.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module Onebox + module Mixins + module TwitchOnebox + def self.included(klass) + klass.include(Onebox::Engine) + klass.matches_regexp(klass.twitch_regexp) + klass.requires_iframe_origins "https://player.twitch.tv" + klass.include(InstanceMethods) + end + + module InstanceMethods + def twitch_id + @url.match(self.class.twitch_regexp)[1] + end + + def base_url + "player.twitch.tv/?" + end + + def placeholder_html + ::Onebox::Helpers.video_placeholder_html + end + + def to_html + <<~HTML + + HTML + end + end + end + end +end diff --git a/lib/onebox/oembed.rb b/lib/onebox/oembed.rb new file mode 100644 index 0000000000000..3068a161e23d7 --- /dev/null +++ b/lib/onebox/oembed.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module Onebox + class Oembed < OpenGraph + + def initialize(response) + @data = Onebox::Helpers.symbolize_keys(::MultiJson.load(response)) + + # never use oembed from WordPress 4.4 (it's broken) + data.delete(:html) if data[:html] && data[:html]["wp-embedded-content"] + end + + def html + get(:html, nil, false) + end + end +end diff --git a/lib/onebox/open_graph.rb b/lib/onebox/open_graph.rb new file mode 100644 index 0000000000000..f78e3d088dacd --- /dev/null +++ b/lib/onebox/open_graph.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: true + +module Onebox + class OpenGraph + + attr_reader :data + + def initialize(doc) + @data = extract(doc) + end + + def title + get(:title, 80) + end + + def title_attr + !title.nil? ? "title='#{title}'" : "" + end + + def secure_image_url + secure_url = URI(get(:image)) + secure_url.scheme = 'https' + secure_url.to_s + end + + def method_missing(attr, *args, &block) + value = get(attr, *args) + + return nil if Onebox::Helpers::blank?(value) + + method_name = attr.to_s + if method_name.end_with?(*integer_suffixes) + value.to_i + elsif method_name.end_with?(*url_suffixes) + result = Onebox::Helpers.normalize_url_for_output(value) + result unless Onebox::Helpers::blank?(result) + else + value + end + end + + def get(attr, length = nil, sanitize = true) + return nil if Onebox::Helpers::blank?(data) + + value = data[attr] + + return nil if Onebox::Helpers::blank?(value) + + value = html_entities.decode(value) + value = Sanitize.fragment(value) if sanitize + value.strip! + value = Onebox::Helpers.truncate(value, length) unless length.nil? + + value + end + + private + + def integer_suffixes + ['width', 'height'] + end + + def url_suffixes + ['url', 'image', 'video'] + end + + def html_entities + @html_entities ||= HTMLEntities.new + end + + def extract(doc) + return {} if Onebox::Helpers::blank?(doc) + + data = {} + + doc.css('meta').each do |m| + if (m["property"] && m["property"][/^(?:og|article|product):(.+)$/i]) || (m["name"] && m["name"][/^(?:og|article|product):(.+)$/i]) + value = (m["content"] || m["value"]).to_s + data[$1.tr('-:', '_').to_sym] ||= value unless Onebox::Helpers::blank?(value) + end + end + + # Attempt to retrieve the title from the meta tag + title_element = doc.at_css('title') + if title_element && title_element.text + data[:title] ||= title_element.text unless Onebox::Helpers.blank?(title_element.text) + end + + data + end + + end +end diff --git a/lib/onebox/preview.rb b/lib/onebox/preview.rb new file mode 100644 index 0000000000000..ada48e1b749d8 --- /dev/null +++ b/lib/onebox/preview.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true + +module Onebox + class Preview + # see https://bugs.ruby-lang.org/issues/14688 + client_exception = defined?(Net::HTTPClientException) ? Net::HTTPClientException : Net::HTTPServerException + WEB_EXCEPTIONS ||= [client_exception, OpenURI::HTTPError, Timeout::Error, Net::HTTPError, Errno::ECONNREFUSED] + + def initialize(url, options = Onebox.options) + @url = url + @options = options.dup + + allowed_origins = @options[:allowed_iframe_origins] || Onebox::Engine.all_iframe_origins + @options[:allowed_iframe_regexes] = Engine.origins_to_regexes(allowed_origins) + + @engine_class = Matcher.new(@url, @options).oneboxed + end + + def to_s + return "" unless engine + sanitize process_html engine_html + rescue *WEB_EXCEPTIONS + "" + end + + def placeholder_html + return "" unless engine + sanitize process_html engine.placeholder_html + rescue *WEB_EXCEPTIONS + "" + end + + def errors + return {} unless engine + engine.errors + end + + def data + return {} unless engine + engine.data + end + + def options + OpenStruct.new(@options) + end + + private + + def engine_html + engine.to_html + end + + def process_html(html) + return "" unless html + + if @options[:max_width] + doc = Nokogiri::HTML5::fragment(html) + if doc + doc.css('[width]').each do |e| + width = e['width'].to_i + + if width > @options[:max_width] + height = e['height'].to_i + if (height > 0) + ratio = (height.to_f / width.to_f) + e['height'] = (@options[:max_width] * ratio).floor + end + e['width'] = @options[:max_width] + end + end + return doc.to_html + end + end + + html + end + + def sanitize(html) + config = @options[:sanitize_config] || Sanitize::Config::ONEBOX + config = config.merge(allowed_iframe_regexes: @options[:allowed_iframe_regexes]) + + Sanitize.fragment(html, config) + end + + def engine + return nil unless @engine_class + return @engine if defined?(@engine) + + @engine = @engine_class.new(@url) + @engine.options = @options + @engine + end + + class InvalidURI < StandardError; end + end +end diff --git a/lib/onebox/sanitize_config.rb b/lib/onebox/sanitize_config.rb new file mode 100644 index 0000000000000..59cb48e040845 --- /dev/null +++ b/lib/onebox/sanitize_config.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +class Sanitize + module Config + + HTTP_PROTOCOLS ||= ['http', 'https', :relative].freeze + + ONEBOX ||= freeze_config merge(RELAXED, + elements: RELAXED[:elements] + %w[audio details embed iframe source video svg path], + + attributes: { + 'a' => RELAXED[:attributes]['a'] + %w(target), + 'audio' => %w[controls controlslist], + 'embed' => %w[height src type width], + 'iframe' => %w[allowfullscreen frameborder height scrolling src width data-original-href data-unsanitized-src], + 'source' => %w[src type], + 'video' => %w[controls height loop width autoplay muted poster controlslist playsinline], + 'path' => %w[d], + 'svg' => ['aria-hidden', 'width', 'height', 'viewbox'], + 'div' => [:data], # any data-* attributes, + 'span' => [:data], # any data-* attributes + }, + + add_attributes: { + 'iframe' => { + 'seamless' => 'seamless', + 'sandbox' => 'allow-same-origin allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox' \ + ' allow-presentation', + } + }, + + transformers: (RELAXED[:transformers] || []) + [ + lambda do |env| + next unless env[:node_name] == 'a' + a_tag = env[:node] + a_tag['href'] ||= '#' + if a_tag['href'] =~ %r{^(?:[a-z]+:)?//} + a_tag['rel'] = 'nofollow ugc noopener' + else + a_tag.remove_attribute('target') + end + end, + + lambda do |env| + next unless env[:node_name] == 'iframe' + + iframe = env[:node] + allowed_regexes = env[:config][:allowed_iframe_regexes] || [/.*/] + + allowed = allowed_regexes.any? { |r| iframe["src"] =~ r } + + if !allowed + # add a data attribute with the blocked src. This is not required + # but makes it much easier to troubleshoot onebox issues + iframe["data-unsanitized-src"] = iframe["src"] + iframe.remove_attribute("src") + end + end + ], + + protocols: { + 'embed' => { 'src' => HTTP_PROTOCOLS }, + 'iframe' => { 'src' => HTTP_PROTOCOLS }, + 'source' => { 'src' => HTTP_PROTOCOLS }, + }, + + css: { + properties: RELAXED[:css][:properties] + %w[--aspect-ratio] + } + ) + end +end diff --git a/lib/onebox/status_check.rb b/lib/onebox/status_check.rb new file mode 100644 index 0000000000000..73b3bca24e63c --- /dev/null +++ b/lib/onebox/status_check.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +module Onebox + class StatusCheck + def initialize(url, options = Onebox.options) + @url = url + @options = options + @status = -1 + end + + def ok? + status > 199 && status < 300 + end + + def status + check if @status == -1 + @status + end + + def human_status + case status + when 0 + :connection_error + when 200..299 + :success + when 400..499 + :client_error + when 500..599 + :server_error + else + :unknown_error + end + end + + private + + def check + res = URI.open(@url, read_timeout: (@options.timeout || Onebox.options.timeout)) + @status = res.status.first.to_i + rescue OpenURI::HTTPError => e + @status = e.io.status.first.to_i + rescue Timeout::Error, Errno::ECONNREFUSED, Net::HTTPError + @status = 0 + end + end +end diff --git a/lib/onebox/template_support.rb b/lib/onebox/template_support.rb new file mode 100644 index 0000000000000..4e09d41103e64 --- /dev/null +++ b/lib/onebox/template_support.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Onebox + module TemplateSupport + def load_paths + Onebox.options.load_paths.select(&method(:template?)) + end + + def template?(path) + File.exist?(File.join(path, "#{template_name}.#{template_extension}")) + end + end +end diff --git a/lib/onebox/templates/_layout.mustache b/lib/onebox/templates/_layout.mustache new file mode 100644 index 0000000000000..9075319f89171 --- /dev/null +++ b/lib/onebox/templates/_layout.mustache @@ -0,0 +1,25 @@ + diff --git a/lib/onebox/templates/allowlistedgeneric.mustache b/lib/onebox/templates/allowlistedgeneric.mustache new file mode 100644 index 0000000000000..abc700be933c0 --- /dev/null +++ b/lib/onebox/templates/allowlistedgeneric.mustache @@ -0,0 +1,16 @@ +{{#image}}{{/image}} + +

{{title}}

+ +{{#description}} +

{{description}}

+{{/description}} + +{{#data_1}} +

+ {{label_1}}: {{data_1}} + {{#data_2}} + {{label_2}}: {{data_2}} + {{/data_2}} +

+{{/data_1}} diff --git a/lib/onebox/templates/amazon.mustache b/lib/onebox/templates/amazon.mustache new file mode 100644 index 0000000000000..e5a3c61703dea --- /dev/null +++ b/lib/onebox/templates/amazon.mustache @@ -0,0 +1,15 @@ +{{#image}}{{/image}} + +

{{title}}

+ +{{#by_info}}{{by_info}}{{/by_info}} + +

{{description}}

+ +

+ {{#rating}}{{rating}}{{/rating}} + {{#isbn_asin}}{{isbn_asin_text}}: {{isbn_asin}}, {{/isbn_asin}} + {{#publisher}}{{publisher}}, {{/publisher}} + {{#published}}{{published}}{{/published}} + {{#price}}{{price}}{{/price}} +

diff --git a/lib/onebox/templates/github/github_body.mustache b/lib/onebox/templates/github/github_body.mustache new file mode 100644 index 0000000000000..dae9ba142e0a6 --- /dev/null +++ b/lib/onebox/templates/github/github_body.mustache @@ -0,0 +1,5 @@ +{{#body}} +
+

{{body}}{{#excerpt}}{{/excerpt}}{{#excerpt}}{{/excerpt}}

+
+{{/body}} diff --git a/lib/onebox/templates/githubblob.mustache b/lib/onebox/templates/githubblob.mustache new file mode 100644 index 0000000000000..810c9ce662252 --- /dev/null +++ b/lib/onebox/templates/githubblob.mustache @@ -0,0 +1,54 @@ +

{{title}}

+ +{{^has_lines}} + {{#model_file}} + + {{/model_file}} + + {{^model_file}} +
{{content}}
+ {{/model_file}} +{{/has_lines}} + +{{#has_lines}} + {{! This is a template comment | Sample rules for this box + + }} + +
+    
+      
    + {{#lines}} + {{data}} + {{/lines}} +
+
+
+{{/has_lines}} + +{{#truncated}} + This file has been truncated. show original +{{/truncated}} diff --git a/lib/onebox/templates/githubcommit.mustache b/lib/onebox/templates/githubcommit.mustache new file mode 100644 index 0000000000000..b9d15cb76f00e --- /dev/null +++ b/lib/onebox/templates/githubcommit.mustache @@ -0,0 +1,33 @@ +
+
+ +
+ +
+

+ {{title}} +

+ +
+
+ committed {{committed_at}} +
+ + + + +
+
+
+ +{{> github/github_body}} diff --git a/lib/onebox/templates/githubfolder.mustache b/lib/onebox/templates/githubfolder.mustache new file mode 100644 index 0000000000000..cac5d382ca060 --- /dev/null +++ b/lib/onebox/templates/githubfolder.mustache @@ -0,0 +1,11 @@ +{{#image}}{{/image}} + +

{{title}}

+ +{{#path}} +

{{path}}

+{{/path}} + +{{#description}} +

{{description}}

+{{/description}} diff --git a/lib/onebox/templates/githubgist.mustache b/lib/onebox/templates/githubgist.mustache new file mode 100644 index 0000000000000..eaad9530081d8 --- /dev/null +++ b/lib/onebox/templates/githubgist.mustache @@ -0,0 +1,15 @@ +

{{link}}

+ +{{#gist_files}} +
{{filename}}
+
{{content}}
+ {{#truncated?}} + This file has been truncated. show original + {{/truncated?}} +{{/gist_files}} + +

+ {{#truncated_files?}} + There are more than three files. show original + {{/truncated_files?}} +

diff --git a/lib/onebox/templates/githubissue.mustache b/lib/onebox/templates/githubissue.mustache new file mode 100644 index 0000000000000..f8766736b3468 --- /dev/null +++ b/lib/onebox/templates/githubissue.mustache @@ -0,0 +1,38 @@ +
+
+ +
+ +
+

+ {{title}} +

+ +
+
+ opened {{created_at}} +
+ + {{#closed_at}} +
+ closed {{closed_at}} +
+ {{/closed_at}} + + +
+ +
+ {{#labels}} + {{name}} + {{/labels}} +
+
+
+ +{{> github/github_body}} diff --git a/lib/onebox/templates/githubpullrequest.mustache b/lib/onebox/templates/githubpullrequest.mustache new file mode 100644 index 0000000000000..81eabb41afeee --- /dev/null +++ b/lib/onebox/templates/githubpullrequest.mustache @@ -0,0 +1,37 @@ +
+
+ +
+ +
+

+ {{title}} +

+ +
+ {{base.label}}{{head.label}} +
+ +
+
+ opened {{created_at}} +
+ + + + +
+
+
+ +{{> github/github_body}} diff --git a/lib/onebox/templates/gitlabblob.mustache b/lib/onebox/templates/gitlabblob.mustache new file mode 100644 index 0000000000000..a24ffdfb4c6f0 --- /dev/null +++ b/lib/onebox/templates/gitlabblob.mustache @@ -0,0 +1,21 @@ +

{{title}}

+ +{{^has_lines}} +
{{content}}
+{{/has_lines}} + +{{#has_lines}} +
+    
+      
    + {{#lines}} + {{data}} + {{/lines}} +
+
+
+{{/has_lines}} + +{{#truncated}} + This file has been truncated. show original +{{/truncated}} diff --git a/lib/onebox/templates/googledocs.mustache b/lib/onebox/templates/googledocs.mustache new file mode 100644 index 0000000000000..bc0f598a57aee --- /dev/null +++ b/lib/onebox/templates/googledocs.mustache @@ -0,0 +1,5 @@ + + +

{{title}}

+ +

{{description}}

diff --git a/lib/onebox/templates/googledrive.mustache b/lib/onebox/templates/googledrive.mustache new file mode 100644 index 0000000000000..09159143b7470 --- /dev/null +++ b/lib/onebox/templates/googledrive.mustache @@ -0,0 +1,9 @@ +{{^image}} + +{{/image}} + +{{#image}}{{/image}} + +

{{title}}

+ +

{{description}}

diff --git a/lib/onebox/templates/googleplayapp.mustache b/lib/onebox/templates/googleplayapp.mustache new file mode 100644 index 0000000000000..5958430bc25e9 --- /dev/null +++ b/lib/onebox/templates/googleplayapp.mustache @@ -0,0 +1,5 @@ +

{{title}}

+ + +

{{description}}

+{{price}} diff --git a/lib/onebox/templates/instagram.mustache b/lib/onebox/templates/instagram.mustache new file mode 100644 index 0000000000000..3f933b7cbfaa6 --- /dev/null +++ b/lib/onebox/templates/instagram.mustache @@ -0,0 +1,13 @@ +

{{title}}

+ +{{#image}} +
+ + + +
+{{/image}} + +{{#description}} +
{{description}}
+{{/description}} diff --git a/lib/onebox/templates/pastebin.mustache b/lib/onebox/templates/pastebin.mustache new file mode 100644 index 0000000000000..236b8d7b0a378 --- /dev/null +++ b/lib/onebox/templates/pastebin.mustache @@ -0,0 +1,7 @@ +

{{link}}

+ +
{{content}}
+ +{{#truncated?}} + This paste has been truncated. show original +{{/truncated?}} diff --git a/lib/onebox/templates/pdf.mustache b/lib/onebox/templates/pdf.mustache new file mode 100644 index 0000000000000..cc0b949072009 --- /dev/null +++ b/lib/onebox/templates/pdf.mustache @@ -0,0 +1,7 @@ + + +

{{title}}

+ +{{#filesize}} +

{{filesize}}

+{{/filesize}} diff --git a/lib/onebox/templates/pubmed.mustache b/lib/onebox/templates/pubmed.mustache new file mode 100644 index 0000000000000..72a593e3b4977 --- /dev/null +++ b/lib/onebox/templates/pubmed.mustache @@ -0,0 +1,12 @@ +

+ {{title}} +

+ +
+ {{authors}}, + {{journal}}, {{date}} +
+ +

+ {{abstract}} +

diff --git a/lib/onebox/templates/stackexchange.mustache b/lib/onebox/templates/stackexchange.mustache new file mode 100644 index 0000000000000..59bf881244935 --- /dev/null +++ b/lib/onebox/templates/stackexchange.mustache @@ -0,0 +1,22 @@ +{{#owner.profile_image}} + + {{owner.display_name}} + +{{/owner.profile_image}} + +

+ {{{title}}} +

+ +
+ {{tags}} +
+ +
+ {{#is_question}}asked by{{/is_question}} + {{#is_answer}}answered by{{/is_answer}} + + {{owner.display_name}} + + on {{creation_date}} +
diff --git a/lib/onebox/templates/twitterstatus.mustache b/lib/onebox/templates/twitterstatus.mustache new file mode 100644 index 0000000000000..67f1b60c4ea40 --- /dev/null +++ b/lib/onebox/templates/twitterstatus.mustache @@ -0,0 +1,38 @@ +{{#avatar}}{{/avatar}} + +

{{title}}

+ +
+ {{{tweet}}} + {{#quoted_tweet}} + + {{/quoted_tweet}} +
+ +
+ {{timestamp}} + + {{#likes}} + + {{/likes}} + + {{#retweets}} + + + {{retweets}} + + {{/retweets}} +
diff --git a/lib/onebox/templates/wikimedia.mustache b/lib/onebox/templates/wikimedia.mustache new file mode 100644 index 0000000000000..4b1ab487c0ef7 --- /dev/null +++ b/lib/onebox/templates/wikimedia.mustache @@ -0,0 +1,3 @@ +{{#image}}{{/image}} + +

{{title}}

diff --git a/lib/onebox/templates/wikipedia.mustache b/lib/onebox/templates/wikipedia.mustache new file mode 100644 index 0000000000000..8e8905fd73204 --- /dev/null +++ b/lib/onebox/templates/wikipedia.mustache @@ -0,0 +1,5 @@ +{{#image}}{{/image}} + +

{{title}}

+ +

{{description}}

diff --git a/lib/onebox/templates/xkcd.mustache b/lib/onebox/templates/xkcd.mustache new file mode 100644 index 0000000000000..1649b60976a60 --- /dev/null +++ b/lib/onebox/templates/xkcd.mustache @@ -0,0 +1,7 @@ +

{{title}}

+ +{{#image}} +
+{{/image}} + +

{{description}}

diff --git a/lib/onebox/view.rb b/lib/onebox/view.rb new file mode 100644 index 0000000000000..e50e7c17f12f4 --- /dev/null +++ b/lib/onebox/view.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +require_relative "template_support" + +module Onebox + class View < Mustache + include TemplateSupport + + attr_reader :record + + def initialize(name, record) + @record = record + self.template_name = name + self.template_path = load_paths.last + end + + def to_html + render(record) + end + end +end diff --git a/plugins/lazy-yt/plugin.rb b/plugins/lazy-yt/plugin.rb index c2756080b29ac..04d14d413e7c5 100644 --- a/plugins/lazy-yt/plugin.rb +++ b/plugins/lazy-yt/plugin.rb @@ -8,6 +8,8 @@ hide_plugin if self.respond_to?(:hide_plugin) +require "onebox" + # javascript register_asset "javascripts/lazyYT.js" diff --git a/spec/components/onebox/engine/allowlisted_generic_onebox_spec.rb b/spec/components/onebox/engine/allowlisted_generic_onebox_spec.rb deleted file mode 100644 index 1e9ac4c2b8b2f..0000000000000 --- a/spec/components/onebox/engine/allowlisted_generic_onebox_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' -require 'oneboxer' - -describe Onebox::Engine::AllowlistedGenericOnebox do - - describe ".===" do - - it "matches any domain" do - expect(described_class === URI('http://foo.bar/resource')).to be(true) - end - - it "doesn't match an IP address" do - expect(described_class === URI('http://1.2.3.4/resource')).to be(false) - expect(described_class === URI('http://1.2.3.4:1234/resource')).to be(false) - end - - end - -end diff --git a/spec/fixtures/onebox/amazon-ebook.response b/spec/fixtures/onebox/amazon-ebook.response new file mode 100644 index 0000000000000..68e327960e7b4 --- /dev/null +++ b/spec/fixtures/onebox/amazon-ebook.response @@ -0,0 +1,6170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers) 1, Bruce Tate, eBook - Amazon.com + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers) by [Tate, Bruce] +
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+ +
+
+
+ + +
+
+
+1st Edition +
+ + +
+ +
+
+
+
+
+ISBN-13: + 978-1934356593 +
+
+
+
+
+
+
+
+
+
+ +Print List Price: + +
+
+ +$34.95 + +
+
+
+
+ +Kindle Price: + +
+
+ +$25.00 + +
+
+
+
+ +You Save: + +
+
+ +$9.95 (28%) + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+ + + + +
+
+

+Select Format +

+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +Kindle price includes VAT + +
+ + + + + + + +
+
+
+ +
+ +
+
+
+

Deliver to your Kindle or other device

+
+ + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + +
+
+ + +
+
+ +
+ + +
+
+
+
+
+
+ +
+ +
+ +
+ + +
+ + +
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+ + + + + +
+ +
+ +
+
+Share this product with friends +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +
+

+Kindle Feature Spotlight +

+
+ + + + + +
+
+
+
+Page Flip + +
+
+ +
+ + +
+
+
+
+
+
+
+Notes & Highlights + +
+
+ +
+ + +
+
+
+
+
+
+
+Adjustable Type + +
+
+ +
+ + +
+
+
+
+
+
+
+Sharing + +
+
+ +
+ + +
+
+
+
+
+
+
+X-Ray for Textbooks + +
+
+ +
+ + +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+

About the Kindle Edition

+
+ +
+
+

Length: 330 pages

+Based on the print edition (ISBN 9781934356593). +
+
+
+

Screen Reader: Supported

+ +The text of this eBook can be read by many popular screen readers: VoiceView on Fire Tablets and Kindle E-readers, VoiceOver on iOS, TalkBack on Android, and NVDA on Windows. Descriptive text for images (known as “ALT text”) can be read using the Kindle for PC app if the publisher has included it. If this eBook contains other types of non-text content (for example, some charts and math equations), that content will not currently be read by screen readers. See the Kindle Accessibility page to learn more + +
+
+
+

Enhanced Typesetting: Enabled

+Enhanced typesetting improvements offer faster reading with less eye strain and beautiful page layouts, even at larger font sizes. +
+
+
+

Page Flip: Enabled

+ +Page Flip is a new way to explore your books without losing your place. + +
+
+ +
+
+

Text to Speech: Enabled

+Text-to-Speech is available for Kindle Touch, Kindle Keyboard, Kindle (2nd generation), and Kindle DX. +
+
+
+
+
+
+
+

About this item +

+
+
+
+

From the manufacturer

+
+ + + +
+
+
+
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Seven Languages in Seven Weeks + +Seven More Languages in Seven Weeks + +Seven Databases in Seven Weeks + +Seven Web Frameworks in Seven Weeks + +Seven Concurrency Models in Seven Weeks + +Seven Mobile Apps in Seven Weeks +
+Seven Languages in Seven Weeks + +Seven More Languages in Seven Weeks + +Seven Databases in Seven Weeks + +Seven Web Frameworks in Seven Weeks + +Seven Concurrency Models in Seven Weeks + +Seven Mobile Apps in Seven Weeks +
+ +Subtitle + + + +A Pragmatic Guide to Learning Programming Languages + + + +Languages That Are Shaping the Future + + + +A Guide to Modern Databases and the NoSQL Movement + + + +Adventures in Better Web Apps + + + +When Threads Unravel + + + +Native Apps, Multiple Platforms + +
+ +Content Coverage + + + +Clojure, Haskell, Io, Prolog, Scala, Erlang, and Ruby + + + +Lua, Factor, Elixir, Elm, Julia, MiniKanren, and Idris + + + +Redis, Neo4J, CouchDB, MongoDB, HBase, Riak and Postgres + + + +Sinatra, CanJS, AngularJS, Ring, Webmachine, Yesod, and Immutant + + + +Threads & locks, functional programming, separating identity & state, actors, sequential processes, data parallelism, and the lambda architecture + + + +iOS, Android, Windows, RubyMotion, React Native, and Xamarin + +
+ +Pages + + + +328 pages + + + +320 pages + + + +354 pages + + + +304 pages + + + +300 pages + + + +360 pages + +
+
+ + + + + + +
+
+
+ +
+

+Description +

+
+

+You should learn a programming language every year, as recommended by The Pragmatic Programmer. But if one per year is good, how about Seven Languages in Seven Weeks? In this book you'll get a hands-o ... +

+
+
+
+ +
+

+Description +

+
+

Product Description

+
+

You should learn a programming language every year, as recommended by The Pragmatic Programmer. But if one per year is good, how about Seven Languages in Seven Weeks? In this book you'll get a hands-on tour of Clojure, Haskell, Io, Prolog, Scala, Erlang, and Ruby. Whether or not your favorite language is on that list, you'll broaden your perspective of programming by examining these languages side-by-side. You'll learn something new from each, and best of all, you'll learn how to learn a language quickly.

Ruby, Io, Prolog, Scala, Erlang, Clojure, Haskell. With Seven Languages in Seven Weeks, by Bruce A. Tate, you'll go beyond the syntax-and beyond the 20-minute tutorial you'll find someplace online. This book has an audacious goal: to present a meaningful exploration of seven languages within a single book. Rather than serve as a complete reference or installation guide, Seven Languages hits what's essential and unique about each language. Moreover, this approach will help teach you how to grok new languages.

For each language, you'll solve a nontrivial problem, using techniques that show off the language's most important features. As the book proceeds, you'll discover the strengths and weaknesses of the languages, while dissecting the process of learning languages quickly--for example, finding the typing and programming models, decision structures, and how you interact with them.

Among this group of seven, you'll explore the most critical programming models of our time. Learn the dynamic typing that makes Ruby, Python, and Perl so flexible and compelling. Understand the underlying prototype system that's at the heart of JavaScript. See how pattern matching in Prolog shaped the development of Scala and Erlang. Discover how pure functional programming in Haskell is different from the Lisp family of languages, including Clojure.

Explore the concurrency techniques that are quickly becoming the backbone of a new generation of Internet applications. Find out how to use Erlang's let-it-crash philosophy for building fault-tolerant systems. Understand the actor model that drives concurrency design in Io and Scala. Learn how Clojure uses versioning to solve some of the most difficult concurrency problems.

It's all here, all in one place. Use the concepts from one language to find creative solutions in another-or discover a language that may become one of your favorites.

+
+

Review

+
+

""I have been programming for 25 years in a variety of hardware and software languages. After reading Seven Languages in Seven Weeks, I am starting to understand how to evaluate languages for their objective strengths and weaknesses. More importantly, I feel as if I could pick one of them to actually get some work done.""--Chris Kappler, Senior scientist Raytheon, BBN Technologies

""I spent most of my time as a computer sciences student saying I didn't want to be a software developer and then became one anyway. Seven Languages in Seven Weeks expanded my way of thinking about problems and reminded me what I love about programming.""--Travis Kaspar, Software engineer, Northrop Grumman

""Do you want seven kick starts into learning your "language of the year"? Do you want your thinking challenged about programming in general? Look no further than this book. I personally was taken back in time to my undergraduate computer science days, coasting through my programming languages survey course. The difference is that Bruce won't let you coast through this course! This isn't a leisurely read--you'll have to work this book. I believe you'll find it both mindblowing and intensely practical at the same time.""--Matt Stine Group leader, Research Application Development, St. Jude Children's Research Hospital

+
+

About the Author

+
+

Bruce Tate runs RapidRed, an Austin, TX-based practice that consults on lightweight development in Ruby. Previously he worked at IBM in roles ranging from a database systems programmer to Java consultant. He left IBM to work for several startups in roles ranging from Client Solutions Director to CTO. He speaks internationally and is the author of more than ten books, including From Java to Ruby, Deploying Rails Applications, the best-selling Bitter series, Beyond Java, and the Jolt-winning Better, Faster, Lighter Java.

+
+
+
+
+
+
+
+
+
+ +
+

+Features & details +

+
+ +
+
    +
  • + +Publication date: + +November 10, 2010 +
  • +
  • + +Publisher: + +Pragmatic Bookshelf +
  • +
  • + +Language: + +English +
  • +
+
+
+
+
+ +
+

+About this item +

+
+

+Product Details +

+ +
+
    +
  • + +Publication date: + +November 10, 2010 +
  • +
  • + +Publisher: + +Pragmatic Bookshelf +
  • +
  • + +Language: + +English +
  • +
  • + +ASIN: + +B00AYQNR46 +
  • +
  • + +Amazon.com Sales Rank: + +375493 +
  • +
+
+
+
+
+
+
+ + + + +
+
+
+
+
+
+ +
+
+ + +

Customer Reviews

58 customer reviews
4.2 out of 5 stars4.2 out of 5 stars
+
+
+
+
+ +Rated by customers interested in + +
+ +
+
+ + +
+ +
+
+ +

Top reviews

+
See all 58 reviews
Write a review
+
+
+
+
+
+
+
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/spec/fixtures/onebox/amazon-og.response b/spec/fixtures/onebox/amazon-og.response new file mode 100644 index 0000000000000..0b16d9c6a1896 --- /dev/null +++ b/spec/fixtures/onebox/amazon-og.response @@ -0,0 +1,3675 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Amazon.com: Christine: Rebecca Hall, Michael C. Hall, Antonio Campos, Craig Shilowich: Amazon Digital Services LLC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Amazon Vehicles + + + + + +Beauty + + + + + +Best Books of the Month + + + + + +STEM + + + + + +nav_sap_plcc_ascpsc + + + + + + + + + + + +Electronics Dads and Grads Gift Guide + + + + + +Starting at $39.99 + + + + + +Wickedly Prime + + + + + +Handmade Wedding Shop + + + + + +Home Gift Guide +Father's Day Gifts +Home Gift Guide + + + + + +Shop Popular Services + + + + + +ALongStrangeTrip +ALongStrangeTrip +ALongStrangeTrip + + + + + + Introducing Echo Show + + + + + +All-New Fire 7, starting at $49.99 + + + + + +Kindle Oasis + + + + + +AutoRip in CDs & Vinyl + + + + + +Shop Now + + + + + +toystl17_gno + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + +

+ Christine + 2017 + +

+ + + + + + + + + + + + + + + R + CC + + +
+ + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + 3.5 out of 5 stars + + + + (84) + + + + + + + + + + + + + + + + + + + + + IMDb + 7/10 + +
+
+ + + + + + +
+
+
+ +
+ +
+ + + +
+
+
+ + +
+
+ + + + + + +
+ + +

When renting, you have 30 days to start watching this video, and 48 hours to finish once started.

+ + +
+ + + +
Rent Movie HD $4.99
+
+
+ + + + +
+ + + + +
+ + + +
Buy Movie HD $12.99
+
+
+ + + + +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+

+ Rent +

+ + +

When renting, you have 30 days to start watching this video, and 48 hours to finish once started.

+ + +
+ + + +
Rent Movie HD $4.99
+
+
+ + + + +
+ + + + +
+ + + +
Rent Movie SD $3.99
+
+
+ + + + +
+ +
+ + +
+

+ Buy +

+ + + + +
+ + + +
Buy Movie HD $12.99
+
+
+ + + + +
+ + + + +
+ + + +
Buy Movie SD $9.99
+
+
+ + + + +
+ +
+ + + + + + + + + +
+ +
+ + + + + More Purchase Options + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + +
+ +
+ +
+

CHRISTINE is the story of an aspiring newswoman caught in the midst of a personal and professional life crisis. Between unrequited love, frustration at work, a tumultuous home, and self-doubt; she begins to spiral down a dark path.

+
+
+
Starring:
+
Rebecca Hall, Michael C. Hall
+
Runtime:
+
1 hour, 59 minutes
+
+

Available to watch on supported devices.

+
+ + +
+ + + +
+ + + +
+
+
+ +
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ + + +
+
+ By placing your order or playing a video, you agree to our Terms of Use. Sold by Amazon Digital Services LLC. Additional taxes may apply. +
+
+ + + + + +
+
+
+ +
+ + + + +
+ +
+
+
+ +
+ + + + + + + + + +
+
+ +

+ Product details +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Genres + + Drama + +
+ Director + + Antonio Campos + +
+ Starring + + Rebecca Hall, Michael C. Hall + +
+ Studio + + The Orchard + +
+ MPAA rating + + R (Restricted) + +
+ Captions and subtitles + + English + + + + Details + + + + +
+ Purchase rights + + Stream instantly + + + + Details + + + + +
+ Format + + Amazon Video (streaming online video) + +
+ +
+
+ + + + + + + + + + + + + + + + + +
+
+ +

+ Other formats +

+ + +
+
+ + + + + + + + + + + +
+ +
+
+
+
+ + +

Customer Reviews

Top Customer Reviews

on March 2, 2017
Format: Amazon Video|Verified Purchase
33 comments| + 13 people found this helpful. + + Was this review helpful to you?YesNoReport abuse
on January 26, 2017
Format: Amazon Video|Verified Purchase
0Comment| + 13 people found this helpful. + + Was this review helpful to you?YesNoReport abuse
on May 12, 2017
Format: Amazon Video|Verified Purchase
0Comment| + One person found this helpful. + + Was this review helpful to you?YesNoReport abuse
on January 26, 2017
Format: Amazon Video|Verified Purchase
0Comment| + 2 people found this helpful. + + Was this review helpful to you?YesNoReport abuse
on February 26, 2017
Format: Amazon Video|Verified Purchase
0Comment| + 3 people found this helpful. + + Was this review helpful to you?YesNoReport abuse
on March 6, 2017
Format: Amazon Video|Verified Purchase
0Comment| + 2 people found this helpful. + + Was this review helpful to you?YesNoReport abuse
on February 25, 2017
Format: Amazon Video|Verified Purchase
0Comment| + 2 people found this helpful. + + Was this review helpful to you?YesNoReport abuse
on February 23, 2017
Format: Amazon Video|Verified Purchase
0Comment| + One person found this helpful. + + Was this review helpful to you?YesNoReport abuse

Most Recent Customer Reviews

+
+
+ +
+
+
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/spec/fixtures/onebox/amazon.response b/spec/fixtures/onebox/amazon.response new file mode 100644 index 0000000000000..42d25aece7b46 --- /dev/null +++ b/spec/fixtures/onebox/amazon.response @@ -0,0 +1,3773 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers): Bruce Tate: 8601234653110: Amazon.com: Books + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+

Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers) + +

+
+
+
+
+
+1st Edition +
+
+
+ISBN-13: + 978-1934356593, +ISBN-10: + 193435659X +
+
+ +
+ +
+
+
+
+ + + +
+
+
+
+ +
    +
  • +
  • +
+
+
+ +
+ + +
Double-tap to zoom
+ +
+
+
+ +
+
+ + + + +
+
+

+Select Format +

+ +
+ +
+
+
+
+ +$ + + +21 + + +11 + +
+
+
+ + + + + + +
+
+ +Save $13.84 (40%) + +
+
+
+
+
+ + +
+
+ + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Save an extra $1.29 at checkout. +
+
+
+
+
+
+
+
+
+
+
+
+ +In Stock. + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +This item ships to Germany. Want it Monday, Feb. 19? Order within 4 hrs 42 mins and choose AmazonGlobal Priority Shipping at checkout. + + +
+ + + +
+
+
+
+Ships from and sold by Amazon.com. +Gift-wrap available. +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+FREE Shipping on orders over $25 +
+
+
+ + +
+
+
+ +Sold by Mayon Collectibles and fulfilled by Amazon. + +
+
+ +Access codes and supplements are not guaranteed with used items. + +
+
+ +
+
+ + + +Ship to: + + +Germany + + +
+
+
+ +To see addresses, please + +
+
+ +
+
or
+
+ +Use this location: + +
+
+
+
+
+ +
+
+
+ +Please enter a valid US zip code. + +
+ + +
+
or
+
+ +
+
+
+
+
+ +
+ + +
+
+
+
+ + + + + + +
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ + + +Ship to: + + +Germany + + +
+
+ + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ + +
+ + +
+
+
+
+ +
+
+
+ +
+ + + + + + + + + + + +
+ +
+
+Share this product with friends +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
+
+
+
+
+

+Frequently bought together +

+
+
+
Choose items to buy together.
+
    +
  • Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)
  • +
  • +Seven More Languages in Seven Weeks: Languages That Are Shaping the Future +
  • +
  • +Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement +
  • +
+
+
+ +
+ +
+
+

Frequently bought together

+
+
+
+
Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)
+
+ +
+
+
+$21.11 +
Paperback
+
FREE Shipping on orders over $25. Details
+
In Stock.
+
Ships from and sold by Amazon.com.
+
+
+
+
Seven More Languages in Seven Weeks: Languages That Are Shaping the Future
+
+ +
+
+
+$28.54 +
Paperback
+
FREE Shipping. Details
+
Only 16 left in stock (more on the way).
+
Ships from and sold by Amazon.com.
+
+
+
+
Seven Databases in Seven Weeks: A Guide to Modern Databases and the NoSQL Movement
+
+ +
+
+
+$26.28 +
Paperback
+
FREE Shipping. Details
+
Only 12 left in stock (more on the way).
+
Ships from and sold by Amazon.com.
+
+
+
+
+
+
+
+
+ +
+
+
+

About this item +

+
+
+
+

From the manufacturer

+
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Seven Languages in Seven Weeks + +Seven More Languages in Seven Weeks + +Seven Databases in Seven Weeks + +Seven Web Frameworks in Seven Weeks + +Seven Concurrency Models in Seven Weeks + +Seven Mobile Apps in Seven Weeks +
+Seven Languages in Seven Weeks + +Seven More Languages in Seven Weeks + +Seven Databases in Seven Weeks + +Seven Web Frameworks in Seven Weeks + +Seven Concurrency Models in Seven Weeks + +Seven Mobile Apps in Seven Weeks +
+ +Subtitle + + + +A Pragmatic Guide to Learning Programming Languages + + + +Languages That Are Shaping the Future + + + +A Guide to Modern Databases and the NoSQL Movement + + + +Adventures in Better Web Apps + + + +When Threads Unravel + + + +Native Apps, Multiple Platforms + +
+ +Content Coverage + + + +Clojure, Haskell, Io, Prolog, Scala, Erlang, and Ruby + + + +Lua, Factor, Elixir, Elm, Julia, MiniKanren, and Idris + + + +Redis, Neo4J, CouchDB, MongoDB, HBase, Riak and Postgres + + + +Sinatra, CanJS, AngularJS, Ring, Webmachine, Yesod, and Immutant + + + +Threads & locks, functional programming, separating identity & state, actors, sequential processes, data parallelism, and the lambda architecture + + + +iOS, Android, Windows, RubyMotion, React Native, and Xamarin + +
+ +Pages + + + +328 pages + + + +320 pages + + + +354 pages + + + +304 pages + + + +300 pages + + + +360 pages + +
+
+
+
+
+
+
+
+
+
+
+ +
+

+Description +

+
+

+You should learn a programming language every year, as recommended by The Pragmatic Programmer. But if one per year is good, how about Seven Languages in Seven Weeks? In this book you'll get a hands-o ... +

+
+
+
+ +
+

+Description +

+
+

Product description

+
+

+

You should learn a programming language every year, as recommended by The Pragmatic Programmer. But if one per year is good, how about Seven Languages in Seven Weeks? In this book you'll get a hands-on tour of Clojure, Haskell, Io, Prolog, Scala, Erlang, and Ruby. Whether or not your favorite language is on that list, you'll broaden your perspective of programming by examining these languages side-by-side. You'll learn something new from each, and best of all, you'll learn how to learn a language quickly.

Ruby, Io, Prolog, Scala, Erlang, Clojure, Haskell. With Seven Languages in Seven Weeks, by Bruce A. Tate, you'll go beyond the syntax-and beyond the 20-minute tutorial you'll find someplace online. This book has an audacious goal: to present a meaningful exploration of seven languages within a single book. Rather than serve as a complete reference or installation guide, Seven Languages hits what's essential and unique about each language. Moreover, this approach will help teach you how to grok new languages.

For each language, you'll solve a nontrivial problem, using techniques that show off the language's most important features. As the book proceeds, you'll discover the strengths and weaknesses of the languages, while dissecting the process of learning languages quickly--for example, finding the typing and programming models, decision structures, and how you interact with them.

Among this group of seven, you'll explore the most critical programming models of our time. Learn the dynamic typing that makes Ruby, Python, and Perl so flexible and compelling. Understand the underlying prototype system that's at the heart of JavaScript. See how pattern matching in Prolog shaped the development of Scala and Erlang. Discover how pure functional programming in Haskell is different from the Lisp family of languages, including Clojure.

Explore the concurrency techniques that are quickly becoming the backbone of a new generation of Internet applications. Find out how to use Erlang's let-it-crash philosophy for building fault-tolerant systems. Understand the actor model that drives concurrency design in Io and Scala. Learn how Clojure uses versioning to solve some of the most difficult concurrency problems.

It's all here, all in one place. Use the concepts from one language to find creative solutions in another-or discover a language that may become one of your favorites.

+

+
+

Review

+
+

+

""I have been programming for 25 years in a variety of hardware and software languages. After reading Seven Languages in Seven Weeks, I am starting to understand how to evaluate languages for their objective strengths and weaknesses. More importantly, I feel as if I could pick one of them to actually get some work done.""--Chris Kappler, Senior scientist Raytheon, BBN Technologies

+

""I spent most of my time as a computer sciences student saying I didn't want to be a software developer and then became one anyway. Seven Languages in Seven Weeks expanded my way of thinking about problems and reminded me what I love about programming.""--Travis Kaspar, Software engineer, Northrop Grumman

+

""Do you want seven kick starts into learning your "language of the year"? Do you want your thinking challenged about programming in general? Look no further than this book. I personally was taken back in time to my undergraduate computer science days, coasting through my programming languages survey course. The difference is that Bruce won't let you coast through this course! This isn't a leisurely read--you'll have to work this book. I believe you'll find it both mindblowing and intensely practical at the same time.""--Matt Stine Group leader, Research Application Development, St. Jude Children's Research Hospital

+

+
+

About the Author

+
+

+

+

Bruce Tate runs RapidRed, an Austin, TX-based practice that consults on lightweight development in Ruby. Previously he worked at IBM in roles ranging from a database systems programmer to Java consultant. He left IBM to work for several startups in roles ranging from Client Solutions Director to CTO. He speaks internationally and is the author of more than ten books, including From Java to Ruby, Deploying Rails Applications, the best-selling Bitter series, Beyond Java, and the Jolt-winning Better, Faster, Lighter Java.

+
+

+
+
+
+
+
+
+
+
+
+ +
+

+Features & details +

+
+

+Product information + + +

+
+

+ + + + + + + + + + + + + + +
+
+
+
+ +
+

+About this item +

+
+

+Product information + + +

+
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+
+
+
+
+ +Pricing: + + +Savings are based on the strikethrough price. This is either the previous Amazon price or the + +List Price. + + +
+
+
+
+
+
+
+
+ + +

Customer Reviews

58 customer reviews
4.2 out of 5 stars4.2 out of 5 stars
+
+
+
+
+ +Rated by customers interested in + +
+ +
+
+ + +
+ +
+
+ +

Top reviews

+
See all 58 reviews
Write a review
+
+
+
+
+
+
+ +
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
\ No newline at end of file diff --git a/spec/fixtures/onebox/cloudapp-gif.response b/spec/fixtures/onebox/cloudapp-gif.response new file mode 100644 index 0000000000000..a24ad59906d32 --- /dev/null +++ b/spec/fixtures/onebox/cloudapp-gif.response @@ -0,0 +1,66 @@ + + + + + giphy.gif + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/spec/fixtures/onebox/cloudapp-jpg.response b/spec/fixtures/onebox/cloudapp-jpg.response new file mode 100644 index 0000000000000..3718a31abb042 --- /dev/null +++ b/spec/fixtures/onebox/cloudapp-jpg.response @@ -0,0 +1,66 @@ + + + + + Image 2016-11-27 at 10.47.21 PM.jpg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/spec/fixtures/onebox/cloudapp-mp4.response b/spec/fixtures/onebox/cloudapp-mp4.response new file mode 100644 index 0000000000000..2a4d889691ce4 --- /dev/null +++ b/spec/fixtures/onebox/cloudapp-mp4.response @@ -0,0 +1,65 @@ + + + + + click-link.mp4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/spec/fixtures/onebox/cloudapp-others.response b/spec/fixtures/onebox/cloudapp-others.response new file mode 100644 index 0000000000000..f9f3914547132 --- /dev/null +++ b/spec/fixtures/onebox/cloudapp-others.response @@ -0,0 +1,66 @@ + + + + + + sample.pdf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/spec/fixtures/onebox/cnn.response b/spec/fixtures/onebox/cnn.response new file mode 100644 index 0000000000000..3c0e90f64f55a --- /dev/null +++ b/spec/fixtures/onebox/cnn.response @@ -0,0 +1,4 @@ +People are fostering and adopting pets during the pandemic + + + diff --git a/spec/fixtures/onebox/dailymail.response b/spec/fixtures/onebox/dailymail.response new file mode 100644 index 0000000000000..e5aa0c8f3e19b --- /dev/null +++ b/spec/fixtures/onebox/dailymail.response @@ -0,0 +1,5914 @@ + + + + + Brutality or justice? The truth behind the tarred and feathered drug dealer | Mail Online + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + + +
+
 
+ + + + + + + +
+
+
+ +
+ +
+
+
+
+
    + + +
  • + +
  • +
  • + + + +
  • +
  • + +
  • +
+
+ +
+
+ + + + +
+
+
+
+ +

Brutality or justice? The truth behind the tarred and feathered drug dealer

By ANDREW MALONE

Last updated at 00:47 01 September 2007


It was the most chilling image of the week ... a drug-dealer tarred and feathered in a medieval act of retribution. Sheer savagery? Or the desperate response of a community that decided to fight back?

The bar fell silent. Some drinkers put down their pints and walked out. Others suddenly became engrossed in newspapers, turning their stools around so that their faces couldn't be seen by anyone approaching through the only door.

"We don't know anything. Nothing at all," said one man in his 40s, looking up sharply from behind the pages of the Belfast Telegraph. "It's not a good idea to ask too many questions around here, ye know what I'm saying, my friend?"

Strangers are not welcome in the Taughmonagh Social Club, a working man's bar less than 100 yards from where a mess of tar and feathers still litter the pavement, following one of the most shocking acts of violence and public humiliation since the Troubles ended.

Scroll down for more ...

+ tarred feathered +

+

But an older man sitting alone had been studying me. He got up from his seat and called two of the other silent drinkers into a far corner of the bar. They stood in a huddle; nobody could hear what was being said. I waited.

After a short discussion between the three, I was ordered into an unlit backroom of the club, which is just two miles from the centre of Belfast now booming with upmarket restaurants, five-star hotels and non-stop construction as a result of the peace dividend after decades of civil war.

In the private room, under black and white photographs of famous moments in the history of Glasgow Rangers Football Club - which until recently was a Protestant-only team - the truth about the chilling events of last week was revealed for the first time.

The older man - measured, polite - had decided it was time the world was told why a man should be abducted, tied to a lamppost and have boiling tar poured over his head and body before being 'decorated' with feathers.

This show of "community justice" may have happened in Northern Ireland, but the professed reasons behind it may strike a chord with millions of law-abiding people in communities across the UK - where the police and courts are each day failing countless victims of violent crime.

Indeed, the man in the unlit backroom, who is happy to be called "William", but refuses to give his real name, insists this is simply the story of ordinary people driven to take the law into their own hands.

And whether you agree, or regard his words as a shameless attempt to defend the indefensible, his account gives a brutal insight into the grim reality of life in the harsher parts of "peaceful" Ulster.

"This man had been warned," he says. "This man was known to have been dealing drugs in our community. If you have kids rolling through the doors with their eyes all over their heads, you know that something is not right.

"It doesn't take Sherlock Holmes to work it out. Selling drugs to children is not on. The community wants drug dealers off the street, but they have no confidence in the police. If police catch these people dealing, they don't do anything.

"He was making money out of this. He was starting people off with drugs. What follows is that you have people breaking into houses, stealing cars, that sort of thing - just to pay for their drug habit.

"Then they start mugging people - old ladies and such like. The community goes to the dogs. We can't be standing for that. It's just not on."

And so it was that local man Jock Nelson was subjected to this most brutal form of public punishment.

Nelson had been living in the area for years. Indeed, until recently he could be found propping up the bar alongside "William" and his staunch Loyalist friends in the club.

But he had problems. He had recently lost his job as a doorman at Lavery's, a popular bar and nightclub near the centre of Belfast. Locals say he was sacked because of using and selling drugs - a charge denied by Lavery's.

Nelson also had marital problems with Julie, his wife and mother of their four children. He had moved out of the family home in the area, although his parents and sister had remained in Taughmonagh. But Nelson started coming back to the streets around the social club, dealing drugs, locals say, to teenage children.

He was repeatedly warned to keep away - but chose to ignore those words of wisdom. It was to prove a grave mistake.

Scroll down for more ...

+ +

+

+ +

+

Late last Saturday night, word swept the social club that Nelson was back - dealing drugs to children in a nearby park. Over drinks, a plan was hatched to put him out of business for good.

William says: "We are not stupid - we know that kids will smoke a bit of weed here and there. We don't want them to, but they do and it's probably not going to kill them in the long run. But this man [he refuses to use Nelson's name throughout the conversation] was selling hard drugs. We'd had enough."

The following night, Nelson was again spotted in the area. Children questioned by their parents had admitted he had been selling them drugs - not just "weed", but also crack cocaine and heroin.

Men with "woolly faces" - the local codeword for balaclavas - gathered nearby. After living through decades of violence between Catholic and Loyalist paramilitaries, the men of Taughmonagh questioned Nelson the only way they knew how: with extreme prejudice.

After savagely beating him and searching his pockets, William says they found five or six bags of crack cocaine. They dragged Nelson through the streets as women and children looked on.

The guilty man did not take his punishment well. Screaming for mercy, he was tied to a lamppost outside the local shops, opposite the park where he had been selling the drugs.

As locals watched in silence, another man in a balaclava appeared from near the social club. He was carrying a bucket of boiling tar and pillows. Nelson's shirt was pulled down over his shoulders, to ensure the tar burned his flesh.

Realising what was about to happen, Nelson "lost control of his bowels", through sheer terror, according to William. "But please don't write that. People might feel sorry for him."

The tar was poured over the offending drug dealer. Then the pillows were torn up and the feathers tipped over him - a punishment designed to ensure that he carried the "mark of justice" by the mob around with him for days.

A piece of cardboard with the words: "I'm a drug dealing scumbag" was strung round his neck. Then photographs were taken to serve as a warning to others that drug dealing will not be tolerated in Taughmonagh.

The pictures were sent to local newspapers - and subsequently beamed around the world. Belfast's politicians were horrified, saying it was a "barbaric act" that had "no place in a civilised society". Police appealed for witnesses; by last night, none had come forward.

Nothing, surely, can excuse such horrific savagery on our streets - and such casual contempt for the basic principles of justice. Yet, many people in areas across Britain will recognise the sense of impotence felt by the people of Taughmonagh, a rugged, working-class estate with the Union Jack hanging from virtually every house. There is a real sense of community in the area.

"Everybody here has grown up together," says Moira, a married woman with two children who works in a shop nearby. "We know everyone - the mums, the kids, the aunties, the dads. Here, we know everybody else's business. We look after each other."

The tarring and feathering certainly seems to have had the effect the community wanted: Jock Nelson fled the city soon after the attack.

"He's gone away to Scotland," Jean Nelson, the man's mother, said. "He's not here. He just wants to get away from everything for a while."

Asked what she felt about her son's involvement in drugs, she was furious. "That's slander. How dare you say that. Who told you where I live? Who told you my name? How would you like it if this was happening to you? We still have to live here. Get away! Just get away!"

A close friend of Jock Nelson's said he had gone away for a "few days" with his estranged wife and children until things calmed down. "There is no chance of him talking about this. It's too dangerous."

In many respects, Nelson was lucky: drug dealing and other anti-social behaviour often proves deadly in Belfast. Fedup with the lack of police action against criminals operating in their locality, there is a long tradition of summary justice being meted out on the streets.

First practised on informers and enemies from rival paramilitary groups, the technique of "knee-capping" - where the victim is shot in both legs, permanently disabling them - became synonymous with daily life during the Troubles.

But after the 1994 ceasefire between the warring Protestant and Catholic factions, many of the weapons were either decommissioned or hidden, forcing the paramilitaries to come up with fresh methods, or resurrect old ones, to deal with local troublemakers.

Once used against Catholic women caught having relationships with British soldiers during the Troubles, the first recorded incident of tarring and feathering came in 1191, when Richard I of England ordered soldiers to punish thieves in the Holy Land during the Crusades.

In America, this technique was used in the 18th century, when the criminal was covered in tar and feathers before being paraded through the town on the back of a horse-drawn cart. According to records from the time, the "aim was to hurt and humiliate a person enough to leave town and cause no more mischief".

The punishment rarely causes serious injury although it does cause minor burns. Tar boils at 60C rather than 100c for water and the tar has frequently cooled by the time it is poured over the victim. Jock Nelson was not taken to hospital after last week's incident.

While pictures of last week's tarring and feathering made international headlines, there is a relentless unreported wave of violence by vigilantes against known criminals in both north and south of the border each month.

With police either lacking the evidence to act, or too scared to enter streets which for decades were no-go areas, car thieves, paedophiles and drug dealers are regularly dealt with by the "men with woolly faces".

In one case, James O'Donoghue, a convicted rapist, was attacked by four men in balaclavas and stabbed repeatedly before being locked in the back of a van with four vicious pitbull terriers.

"I was kept there for an hour with those dogs," he said. "All I did was kept swinging and kicking, trying to defend myself. The men then dumped me at the side of the road. I got 216 stitches and went into cardiac arrest in hospital."

The son of Jonny "Mad Dog" Adair, the psychotic former leader of the Ulster Freedom Fighters' notorious "C" Company, was shot in both legs in 2002 after being named as a drug dealer, leaving him maimed for life.

Few in Belfast had any sympathy last week for criminals beaten or covered in tar and feathers as punishment. "They should just get shot," said Kevin Nolan, an office worker. "I'm not being nasty but they have made their choice and know the consequences."

Yet some experts suspect that these acts are not simply designed to prevent crime spiralling out of control. For decades, Loyalist gangs have had links to the criminal underworld, prompting speculation that they are simply trying to "take out" rivals in Northern Ireland's lucrative drugs trade.

Back at the Taughmonagh Social Club, William dismisses this notion. "This was nothing to do with paramilitaries," he says. "This was to do with a law-abiding community deciding to take action against a man who has been poisoning our children with drugs.

"This is a strong community. There's very little housebreaking or any other crime here. If we see anyone's children behaving badly, we let their parents know and they deal with it. That's how it works - we're all in this together."

Yet, on the streets of Belfast, which is successfully rebranding itself as a tourist destination, with guided tours up the Republican Falls and Loyalist Shankill Roads, there was little doubt about what would happen if anybody started dealing drugs on the streets.

A group of three drug users I met had no fear of the police, saying that they might know they were using drugs, but they would never get enough evidence because the drugs would just be thrown away before they were arrested.

"But there's no danger of us dealing drugs on the streets," said one man in his 20s, as a group of tourists walked past the Europa Hotel in the centre, marvelling at the fact it has been blown up more than any other hotel in the world.

Slurping furtively from a can of lager - drinking on the street is banned in many areas - the young man added: "The paramilitaries would come after us. Some people say it's because they want to deal all the drugs.

"I don't think it's because of that. I think it's just because they like violence - and I mean really like it. We wouldn't stand a chance if we sold drugs. We'd be dead within a week."

Certainly, the streets of Belfast are remarkably safe places to walk, with little petty crime, drug-dealing or gangs of drunken youths roaming the streets.

As a result of this curious by-product of the Northern Ireland peace process, it is no longer the law-abiding majority who are scared to go out after dark. These days, it seems, Belfast's criminals are the ones who live in mortal fear of being caught doing anything wrong.

The question is, at what price? Vigilante justice betrays all the values that were supposedly being defended in the long fight against terrorism. We tolerate it at our peril.

+ + + + + +
+
+ + + +
+
+ +
+ + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +

No comments have so far been submitted. Why not be the first to send us your thoughts, + or debate this issue live on our message boards. +

+ +
+ + + + + + + +

We are no longer accepting comments on this article.

+ + + +
+ + Who is this week's top commenter? + Find out now +
+ + +
+
+ + +
+ + + +
+ +
+
+ +
+
+
+ Bing +
+ + + + + + + + +
+ +
+ + + + +
+
+ +
+ +
+
+ +
+
+ + + +
+
+ +   +   +

DON'T MISS

+ + +
+ +
+ + + + + + + +
+
+ +
+
+ +
+
+ +   +   +

MORE DON'T MISS

+ + +
+ +
+ + +
+
+ +
+ +
+
+ +
+ + + + + +
+
+ +
+
+ +
+ + + + + +
+ +
+
+ + MailOnline iPad app + +
+
+ +
+ + + + +
+ +
+ + + + +
+ +
+ +
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + +
+
+
+
+

Next story

+

+ + 'America is coming to help': Obama to bomb Iraq to save thousands of non-Muslims trapped on mountains and forced to choose between starving to death and slaughter by ISIS fanatics + ISIS take hundreds of Yazidi women hostage in bid to call Obama's bluff as America begins bombing Iraq after Islamist fanatics reach the gates of former Kurdish safe haven where thousands have fled + +

+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+
+ + +
 
+ + + + + + + + + + + + + + + diff --git a/spec/fixtures/onebox/discourse_topic.response b/spec/fixtures/onebox/discourse_topic.response new file mode 100644 index 0000000000000..00a0e24fe999f --- /dev/null +++ b/spec/fixtures/onebox/discourse_topic.response @@ -0,0 +1,373 @@ + + + + + + Congratulations, most stars in 2013 GitHub Octoverse! - praise - Discourse Meta + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + diff --git a/spec/fixtures/onebox/discourse_topic_reply.response b/spec/fixtures/onebox/discourse_topic_reply.response new file mode 100644 index 0000000000000..d204320e713c7 --- /dev/null +++ b/spec/fixtures/onebox/discourse_topic_reply.response @@ -0,0 +1,369 @@ + + + + + + Congratulations, most stars in 2013 GitHub Octoverse! - praise - Discourse Meta + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + diff --git a/spec/fixtures/onebox/etsy.response b/spec/fixtures/onebox/etsy.response new file mode 100644 index 0000000000000..663dd727a9029 --- /dev/null +++ b/spec/fixtures/onebox/etsy.response @@ -0,0 +1,5389 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Personalized Word Pillow Case Letter Symbol Text Cushion | Etsy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ + +
+ + + + +
+ +
+ + + + + + + + + + + + + +
+ + +
+
+
+ + +
+
+
+
+ + + + + + + + + + + +
+ + + +
+ + + + + + + +
+ + + + + + + +
+
+ + +

Personalized Word Pillow Case | Letter, Symbol, Text Cushion Cover | 18x18 inch / 45x45 cm Decorative Pillow | Modern Home Decor

+
+ + + + + + + +
+
+
+
+ + +
+

+ Personalized Word Pillow Case | Letter, Symbol, Text Cushion Cover | 18x18 inch / 45x45 cm Decorative Pillow | Modern Home Decor +

+
+ + + + + +
+ +

+ + US$ 36.97+ + + + US$ 41.08+ + +

+

+ You save US$ 4.11 (10%) +

+ +
+ Local taxes included (where applicable) +
+
+ + +
+
+ +
+ +
+
Please select an option
+
+ +
+ +
+
Please select a colour
+
+ +

+ Last step: Enter the Fabric you want from options of the chart. Thank you!
- - -
Dernière étape: Entrez le Tissu désiré parmi les choix de la charte. Merci! +

+ +
+ 256 +
+
This item requires personalisation
+
You’ve reached the limit! Use 256 characters or less.
+
+ +
+ +
+
Please select a quantity
+
+
+ + + +
+ + +
+
+ + + + + + + + + +
+
+
+ + + +
+
+
+
+ +
+
+ Don't miss out. There's only 4 available and 3 other people have this in their basket right now. + +
+
+
+
+ + + + +
+ +
+
+

Item details

+ + +
+ +

Handmade

+
+ +
+
+
Materials
+ +

+ Natural fiber fabrics, Vinyl, Threads, YKK invisible zipper +

+ +
+
+
Dimensions
+ +

Length: 18 Inches; Width: 18 Inches

+
+
+
+ +
+
+ +
+
+ + - 15% off when you buy 2 items / 20% off when you buy 3 items -

Allow your personality to shine through your decor; this contemporary and modern accent will help you do just that. Personalize this 18" x 18" (45 x 45 cm) pillow cover with your favorite letter, symbol or word in the fabric and vinyl color of your choice, have fun!

>>> Here is how to create your own pillow cover (It's easy!): You just have to select the appliqué plus the primary color (vinyl for the appliqué) and write the fabric you want in the personalization box before adding the item to your cart.
▲*This item is made to order just for you in 2 to 4 business days!*

SPECIFICATIONS:
▲ Designed and handmade by us!
▲ 18" x 18" (45 x 45 cm) pillow cover {for same size pillow form or one size up}.
▲ 100% cotton, 50% cotton / 50% linen or 55% ramie / 45% cotton canvases {Pre-shrunk fabrics: the cover will keep its original shape after the first wash (No shrinkage!)}.
▲ Durable vinyl leather like sewn all around.
▲ Invisible zipper at the bottom {for an easy removal and clean finish}.
▲ Serged interior seams {makes it resistant to wash}.
▲ Pillow form is not included.

CARE:
Wash upside down and closed in cold water at gentle cycle or by hand with a gentle detergent. Do not use bleach. Dry flat or hang to dry. Iron *upside down* at medium high (cotton) temperature with medium steam.

▲ 12" x 18" (30 x 45 cm) lumbar size: http://www.etsy.com/listing/69325334
▲ 16" x 16" (40 x 40 cm) size: http://www.etsy.com/listing/103762611
▲ 20" x 20" (50 x 50 cm) size: http://www.etsy.com/listing/99807109

Contact us for any questions ;-) Thanks for visiting!

More from us, here on Etsy (!):
Digital art prints: http://www.etsy.com/shop/RocailArt
Vintage finds: http://www.etsy.com/shop/rocailoldandloved

All Designs & images © 2010-2020 ROCAIL / ROCAIL Studio. All rights reserved. +
+ +
+
+ +
+
+
+
+
+
+
+
+
+

Delivery & returns

+ +
+
+ + +
+ +
+ Ready to dispatch in 1–3 business days +
+
+ +
+ From Canada +
+
+
+ +
+
+
+ + + +
+
+
+
+ Sorry, this item doesn’t deliver to India. Contact the shop to find out about available delivery options. +
+ +
+
+ + +
+
+
+
+ +
No returns or exchanges
+
+ But please contact me if you have any problems with your order. +
+
+
+ +
+ +
+ +
+
+
+

+ Meet RocailStudio +

+ +
+
+ Melanie and Valerie +
+
+

Melanie and Valerie

+

+ Montreal, Canada +

+
+
+ +
This seller usually responds within 24 hours.
+
+ +
+ + +
+
+
+ +
+
+
+
+
+ +
+

Reviews

+ + + + + 5 out of 5 stars + + + + + + + (1,238) + + + +
+
+
+ + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+
+
+
+ + + +
+ +
+ + +
+
Montreal, Canada
+
6,634 Sales
+
On Etsy since 2010
+
+
+
+ + +
+ +
+
+ +
+ +
+ + + +
+
+
+ + + +
+ +
+ +
+
+ + +
+
+ +
+
+ +
+
+ + + + + + + + +
+
+ +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spec/fixtures/onebox/etsy_mobile.response b/spec/fixtures/onebox/etsy_mobile.response new file mode 100644 index 0000000000000..0b7953dae905c --- /dev/null +++ b/spec/fixtures/onebox/etsy_mobile.response @@ -0,0 +1,5389 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Personalized Word Pillow Case Letter Symbol Text Cushion | Etsy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ + +
+ + + + +
+ +
+ + + + + + + + + + + + + +
+ + +
+
+
+ + +
+
+
+
+ + + + + + + + + + + +
+ + + +
+ + + + + + + +
+ + + + + + + +
+
+ + +

Personalized Word Pillow Case | Letter, Symbol, Text Cushion Cover | 18x18 inch / 45x45 cm Decorative Pillow | Modern Home Decor

+
+ + + + + + + +
+
+
+
+ + +
+

+ Personalized Word Pillow Case | Letter, Symbol, Text Cushion Cover | 18x18 inch / 45x45 cm Decorative Pillow | Modern Home Decor +

+
+ + + + + +
+ +

+ + US$ 36.97+ + + + US$ 41.08+ + +

+

+ You save US$ 4.11 (10%) +

+ +
+ Local taxes included (where applicable) +
+
+ + +
+
+ +
+ +
+
Please select an option
+
+ +
+ +
+
Please select a colour
+
+ +

+ Last step: Enter the Fabric you want from options of the chart. Thank you!
- - -
Dernière étape: Entrez le Tissu désiré parmi les choix de la charte. Merci! +

+ +
+ 256 +
+
This item requires personalisation
+
You’ve reached the limit! Use 256 characters or less.
+
+ +
+ +
+
Please select a quantity
+
+
+ + + +
+ + +
+
+ + + + + + + + + +
+
+
+ + + +
+
+
+
+ +
+
+ Don't miss out. There's only 4 available and 3 other people have this in their basket right now. + +
+
+
+
+ + + + +
+ +
+
+

Item details

+ + +
+ +

Handmade

+
+ +
+
+
Materials
+ +

+ Natural fiber fabrics, Vinyl, Threads, YKK invisible zipper +

+ +
+
+
Dimensions
+ +

Length: 18 Inches; Width: 18 Inches

+
+
+
+ +
+
+ +
+
+ + - 15% off when you buy 2 items / 20% off when you buy 3 items -

Allow your personality to shine through your decor; this contemporary and modern accent will help you do just that. Personalize this 18" x 18" (45 x 45 cm) pillow cover with your favorite letter, symbol or word in the fabric and vinyl color of your choice, have fun!

>>> Here is how to create your own pillow cover (It's easy!): You just have to select the appliqué plus the primary color (vinyl for the appliqué) and write the fabric you want in the personalization box before adding the item to your cart.
▲*This item is made to order just for you in 2 to 4 business days!*

SPECIFICATIONS:
▲ Designed and handmade by us!
▲ 18" x 18" (45 x 45 cm) pillow cover {for same size pillow form or one size up}.
▲ 100% cotton, 50% cotton / 50% linen or 55% ramie / 45% cotton canvases {Pre-shrunk fabrics: the cover will keep its original shape after the first wash (No shrinkage!)}.
▲ Durable vinyl leather like sewn all around.
▲ Invisible zipper at the bottom {for an easy removal and clean finish}.
▲ Serged interior seams {makes it resistant to wash}.
▲ Pillow form is not included.

CARE:
Wash upside down and closed in cold water at gentle cycle or by hand with a gentle detergent. Do not use bleach. Dry flat or hang to dry. Iron *upside down* at medium high (cotton) temperature with medium steam.

▲ 12" x 18" (30 x 45 cm) lumbar size: http://www.etsy.com/listing/69325334
▲ 16" x 16" (40 x 40 cm) size: http://www.etsy.com/listing/103762611
▲ 20" x 20" (50 x 50 cm) size: http://www.etsy.com/listing/99807109

Contact us for any questions ;-) Thanks for visiting!

More from us, here on Etsy (!):
Digital art prints: http://www.etsy.com/shop/RocailArt
Vintage finds: http://www.etsy.com/shop/rocailoldandloved

All Designs & images © 2010-2020 ROCAIL / ROCAIL Studio. All rights reserved. +
+ +
+
+ +
+
+
+
+
+
+
+
+
+

Delivery & returns

+ +
+
+ + +
+ +
+ Ready to dispatch in 1–3 business days +
+
+ +
+ From Canada +
+
+
+ +
+
+
+ + + +
+
+
+
+ Sorry, this item doesn’t deliver to India. Contact the shop to find out about available delivery options. +
+ +
+
+ + +
+
+
+
+ +
No returns or exchanges
+
+ But please contact me if you have any problems with your order. +
+
+
+ +
+ +
+ +
+
+
+

+ Meet RocailStudio +

+ +
+
+ Melanie and Valerie +
+
+

Melanie and Valerie

+

+ Montreal, Canada +

+
+
+ +
This seller usually responds within 24 hours.
+
+ +
+ + +
+
+
+ +
+
+
+
+
+ +
+

Reviews

+ + + + + 5 out of 5 stars + + + + + + + (1,238) + + + +
+
+
+ + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+
+
+
+ + + +
+ +
+ + +
+
Montreal, Canada
+
6,634 Sales
+
On Etsy since 2010
+
+
+
+ + +
+ +
+
+ +
+ +
+ + + +
+
+
+ + + +
+ +
+ +
+
+ + +
+
+ +
+
+ +
+
+ + + + + + + + +
+
+ +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spec/fixtures/onebox/gfycat.response b/spec/fixtures/onebox/gfycat.response new file mode 100644 index 0000000000000..6e34867afbb17 --- /dev/null +++ b/spec/fixtures/onebox/gfycat.response @@ -0,0 +1,40 @@ + +Goal 11: Kerbal GIF by Gif Your Game (@gifyourgame) | Find, Make & Share Gfycat GIFs
diff --git a/spec/fixtures/onebox/githubblob.response b/spec/fixtures/onebox/githubblob.response new file mode 100644 index 0000000000000..9cf89bef5aaba --- /dev/null +++ b/spec/fixtures/onebox/githubblob.response @@ -0,0 +1,46 @@ +require_dependency 'oneboxer/handlebars_onebox' + +module Oneboxer + class GithubBlobOnebox < HandlebarsOnebox + + matcher /^https?:\/\/(?:www\.)?github\.com\/[^\/]+\/[^\/]+\/blob\/.*/ + favicon 'github.png' + + def translate_url + m = @url.match(/github\.com\/(?[^\/]+)\/(?[^\/]+)\/blob\/(?[^\/]+)\/(?[^#]+)(#(L(?[^-]*)(-L(?.*))?))?/mi) + if m + @from = (m[:from] || -1).to_i + @to = (m[:to] || -1).to_i + @file = m[:file] + return "https://raw.github.com/#{m[:user]}/#{m[:repo]}/#{m[:sha1]}/#{m[:file]}" + end + nil + end + + def parse(data) + + if @from > 0 + if @to < 0 + @from = @from - 10 + @to = @from + 20 + end + if @to > @from + data = data.split("\n")[@from..@to].join("\n") + end + end + + extension = @file.split(".")[-1] + @lang = extension + + truncated = false + if data.length > SiteSetting.onebox_max_chars + data = data[0..SiteSetting.onebox_max_chars-1] + truncated = true + end + + {content: data, truncated: truncated} + end + + end +end + diff --git a/spec/fixtures/onebox/githubcommit.response b/spec/fixtures/onebox/githubcommit.response new file mode 100644 index 0000000000000..46944600abc77 --- /dev/null +++ b/spec/fixtures/onebox/githubcommit.response @@ -0,0 +1,87 @@ +{ + "sha": "803d023e2307309f8b776ab3b8b7e38ba91c0919", + "commit": { + "author": { + "name": "Sam", + "email": "sam.saffron@gmail.com", + "date": "2013-08-02T02:03:53Z" + }, + "committer": { + "name": "Sam", + "email": "sam.saffron@gmail.com", + "date": "2013-08-02T02:16:44Z" + }, + "message": "Fixed GitHub auth, GitHub can provide us with a valid email - so automatically log in for those cases", + "tree": { + "sha": "8e0f3e17bb5ee3edc5701229dc1ad82dc5a41de6", + "url": "https://api.github.com/repos/discourse/discourse/git/trees/8e0f3e17bb5ee3edc5701229dc1ad82dc5a41de6" + }, + "url": "https://api.github.com/repos/discourse/discourse/git/commits/803d023e2307309f8b776ab3b8b7e38ba91c0919", + "comment_count": 0 + }, + "url": "https://api.github.com/repos/discourse/discourse/commits/803d023e2307309f8b776ab3b8b7e38ba91c0919", + "html_url": "https://github.com/discourse/discourse/commit/803d023e2307309f8b776ab3b8b7e38ba91c0919", + "comments_url": "https://api.github.com/repos/discourse/discourse/commits/803d023e2307309f8b776ab3b8b7e38ba91c0919/comments", + "author": { + "login": "SamSaffron", + "id": 5213, + "avatar_url": "https://2.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce?d=https%3A%2F%2Fidenticons.github.com%2F7d3010c11d08cf990b7614d2c2ca9098.png", + "gravatar_id": "3dcae8378d46c244172a115c28ca49ce", + "url": "https://api.github.com/users/SamSaffron", + "html_url": "https://github.com/SamSaffron", + "followers_url": "https://api.github.com/users/SamSaffron/followers", + "following_url": "https://api.github.com/users/SamSaffron/following{/other_user}", + "gists_url": "https://api.github.com/users/SamSaffron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SamSaffron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SamSaffron/subscriptions", + "organizations_url": "https://api.github.com/users/SamSaffron/orgs", + "repos_url": "https://api.github.com/users/SamSaffron/repos", + "events_url": "https://api.github.com/users/SamSaffron/events{/privacy}", + "received_events_url": "https://api.github.com/users/SamSaffron/received_events", + "type": "User" + }, + "committer": { + "login": "SamSaffron", + "id": 5213, + "avatar_url": "https://2.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce?d=https%3A%2F%2Fidenticons.github.com%2F7d3010c11d08cf990b7614d2c2ca9098.png", + "gravatar_id": "3dcae8378d46c244172a115c28ca49ce", + "url": "https://api.github.com/users/SamSaffron", + "html_url": "https://github.com/SamSaffron", + "followers_url": "https://api.github.com/users/SamSaffron/followers", + "following_url": "https://api.github.com/users/SamSaffron/following{/other_user}", + "gists_url": "https://api.github.com/users/SamSaffron/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SamSaffron/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SamSaffron/subscriptions", + "organizations_url": "https://api.github.com/users/SamSaffron/orgs", + "repos_url": "https://api.github.com/users/SamSaffron/repos", + "events_url": "https://api.github.com/users/SamSaffron/events{/privacy}", + "received_events_url": "https://api.github.com/users/SamSaffron/received_events", + "type": "User" + }, + "parents": [ + { + "sha": "cf333268d5b48946a659f173716aecc1096d7e66", + "url": "https://api.github.com/repos/discourse/discourse/commits/cf333268d5b48946a659f173716aecc1096d7e66", + "html_url": "https://github.com/discourse/discourse/commit/cf333268d5b48946a659f173716aecc1096d7e66" + } + ], + "stats": { + "total": 20, + "additions": 18, + "deletions": 2 + }, + "files": [ + { + "sha": "0edc93bbf3d28a5020ee8b2d44ed68d4e3706a1f", + "filename": "app/controllers/users/omniauth_callbacks_controller.rb", + "status": "modified", + "additions": 18, + "deletions": 2, + "changes": 20, + "blob_url": "https://github.com/discourse/discourse/blob/803d023e2307309f8b776ab3b8b7e38ba91c0919/app/controllers/users/omniauth_callbacks_controller.rb", + "raw_url": "https://github.com/discourse/discourse/raw/803d023e2307309f8b776ab3b8b7e38ba91c0919/app/controllers/users/omniauth_callbacks_controller.rb", + "contents_url": "https://api.github.com/repos/discourse/discourse/contents/app/controllers/users/omniauth_callbacks_controller.rb?ref=803d023e2307309f8b776ab3b8b7e38ba91c0919", + "patch": "@@ -210,6 +210,8 @@ def create_or_sign_on_user_using_openid(auth_token)\n \n if user_open_id.blank? && user = User.find_by_email(email)\n # we trust so do an email lookup\n+ # TODO some openid providers may not be trust worthy, allow for that\n+ # for now we are good (google, yahoo are trust worthy)\n user_open_id = UserOpenId.create(url: identity_url , user_id: user.id, email: email, active: true)\n end\n \n@@ -250,18 +252,32 @@ def create_or_sign_on_user_using_github(auth_token)\n \n data = auth_token[:info]\n screen_name = data[\"nickname\"]\n+ email = data[\"email\"]\n github_user_id = auth_token[\"uid\"]\n \n session[:authentication] = {\n github_user_id: github_user_id,\n- github_screen_name: screen_name\n+ github_screen_name: screen_name,\n+ email: email,\n+ email_valid: true\n }\n \n user_info = GithubUserInfo.where(github_user_id: github_user_id).first\n \n+ if !user_info && user = User.find_by_email(email)\n+ # we trust so do an email lookup\n+ user_info = GithubUserInfo.create(\n+ user_id: user.id,\n+ screen_name: screen_name,\n+ github_user_id: github_user_id\n+ )\n+ end\n+\n @data = {\n username: screen_name,\n- auth_provider: \"Github\"\n+ auth_provider: \"Github\",\n+ email: email,\n+ email_valid: true\n }\n \n process_user_info(user_info, screen_name)" + } + ] +} diff --git a/spec/fixtures/onebox/githubfolder-discourse-root.response b/spec/fixtures/onebox/githubfolder-discourse-root.response new file mode 100644 index 0000000000000..23075c565b43c --- /dev/null +++ b/spec/fixtures/onebox/githubfolder-discourse-root.response @@ -0,0 +1,2358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GitHub - discourse/discourse: A platform for community discussion. Free, open, simple. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Skip to content + + + + + + + + +
+ +
+ + + + + +
+ + + +
+ + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + +
+ +
+ +
+

+ + + / + + discourse + + +

+ + +
+ + + +
+
+

+ A platform for community discussion. Free, open, simple. +

+
+ + + www.discourse.org + +
+ + +
+ + +
+
+ + + +
+ + +
+
+ + + + +
+ +
+ + + + + +
+ +
+ + + + + + +
+ +
+
+ + + master + + + + +
+ + + +
+
+
+ +
+ + + + +
+ + + Go to file + + + + + + + +
+ + + Code + +
+ +
+
+
+ + + +
+
+ + + + +
+
+

Latest commit

+
+ +
+
 
+
+

Git stats

+ +
+
+
+

Files

+ + + + + Permalink + +
+ + + Failed to load latest commit information. + +
+
+
+
Type
+
Name
+
Latest commit message
+
Commit time
+
+ +
+
+ + +
+ +
+ .github +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ app +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ bin +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ config +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ db +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ docs +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ images +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ lib +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ log +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ plugins +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ public +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ script +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ spec +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ test +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ vendor +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ .eslintrc +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ .rspec +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ Brewfile +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ Gemfile +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ README.md +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ Rakefile +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ adminjs +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ config.ru +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ d +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ jsapp +
+ +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ + + +
+
 
+
+ +
+
 
+
+ +
+
+
+ + +
+ +
+ yarn.lock +
+ +
+
 
+
+ +
+
 
+
+ +
+
+ +
+ +
+ + +
+ +
+
+

+ README.md +

+
+ + +
+

+

Discourse is the 100% open source discussion platform built for the next decade of the Internet. Use it as a:

+
    +
  • mailing list
  • +
  • discussion forum
  • +
  • long-form chat room
  • +
+

To learn more about the philosophy and goals of the project, visit discourse.org.

+

Screenshots

+

Boing Boing + + +

+

Mobile

+

Browse lots more notable Discourse instances.

+

Development

+

To get your environment setup, follow the community setup guide for your operating system.

+
    +
  1. If you're on macOS, try the macOS development guide.
  2. +
  3. If you're on Ubuntu, try the Ubuntu development guide.
  4. +
  5. If you're on Windows, try the Windows 10 development guide.
  6. +
+

If you're familiar with how Rails works and are comfortable setting up your own environment, you can also try out the Discourse Advanced Developer Guide, which is aimed primarily at Ubuntu and macOS environments.

+

Before you get started, ensure you have the following minimum versions: Ruby 2.6+, PostgreSQL 10+, Redis 4.0+. If you're having trouble, please see our TROUBLESHOOTING GUIDE first!

+

Setting up Discourse

+

If you want to set up a Discourse forum for production use, see our Discourse Install Guide.

+

If you're looking for business class hosting, see discourse.org/buy.

+

Requirements

+

Discourse is built for the next 10 years of the Internet, so our requirements are high.

+

Discourse supports the latest, stable releases of all major browsers and platforms:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BrowsersTabletsPhones
Apple SafariiPadOSiOS
Google ChromeAndroidAndroid
Microsoft Edge
Mozilla Firefox
+

Built With

+
    +
  • Ruby on Rails — Our back end API is a Rails app. It responds to requests RESTfully in JSON.
  • +
  • Ember.js — Our front end is an Ember.js app that communicates with the Rails API.
  • +
  • PostgreSQL — Our main data store is in Postgres.
  • +
  • Redis — We use Redis as a cache and for transient data.
  • +
  • BrowserStack — We use BrowserStack to test on real devices and browsers.
  • +
+

Plus lots of Ruby Gems, a complete list of which is at /master/Gemfile.

+

Contributing

+

Build Status

+

Discourse is 100% free and open source. We encourage and support an active, healthy community that +accepts contributions from the public – including you!

+

Before contributing to Discourse:

+
    +
  1. Please read the complete mission statements on discourse.org. Yes we actually believe this stuff; you should too.
  2. +
  3. Read and sign the Electronic Discourse Forums Contribution License Agreement.
  4. +
  5. Dig into CONTRIBUTING.MD, which covers submitting bugs, requesting new features, preparing your code for a pull request, etc.
  6. +
  7. Always strive to collaborate with mutual respect.
  8. +
  9. Not sure what to work on? We've got some ideas.
  10. +
+

We look forward to seeing your pull requests!

+

Security

+

We take security very seriously at Discourse; all our code is 100% open source and peer reviewed. Please read our security guide for an overview of security measures in Discourse, or if you wish to report a security issue.

+

The Discourse Team

+

The original Discourse code contributors can be found in AUTHORS.MD. For a complete list of the many individuals that contributed to the design and implementation of Discourse, please refer to the official Discourse blog and GitHub's list of contributors.

+

Copyright / License

+

Copyright 2014 - 2020 Civilized Discourse Construction Kit, Inc.

+

Licensed under the GNU General Public License Version 2.0 (or later); +you may not use this work except in compliance with the License. +You may obtain a copy of the License in the LICENSE file, or at:

+

https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt

+

Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.

+

Discourse logo and “Discourse Forum” ®, Civilized Discourse Construction Kit, Inc.

+

Dedication

+

Discourse is built with love, Internet style.

+
+
+
+ + +
+
+ + +
+
+
+

About

+ +

+ A platform for community discussion. Free, open, simple. +

+
+ + + www.discourse.org + +
+ +

Topics

+ + +

Resources

+ + +

License

+ + +
+
+ +
+
+

+ + Contributors 794 +

+ + + +
    +
  • +
    +
  • +
  • +
    +
  • +
  • +
    +
  • +
  • +
    +
  • +
  • +
    +
  • +
  • +
    +
  • +
  • +
    +
  • +
  • +
    +
  • +
  • +
    +
  • +
  • +
    +
  • +
  • +
    +
  • +
+
+ + +
+
+ +
+ +
+ +
+
+ +
+
+ +
+ + + + + + +
+ + + You can’t perform that action at this time. +
+ + + + + + + + + + + + diff --git a/spec/fixtures/onebox/githubfolder.response b/spec/fixtures/onebox/githubfolder.response new file mode 100644 index 0000000000000..6e2ae42221324 --- /dev/null +++ b/spec/fixtures/onebox/githubfolder.response @@ -0,0 +1,1549 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + discourse/spec/fixtures at master · discourse/discourse · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Skip to content + + + + + + + + +
+ +
+ + + + + +
+ + + +
+ + + + + + + + + +
+
+
+ + + + + + + + + + + + + + +
+ +
+ +
+

+ + + / + + discourse + + +

+ + +
+ + + +
+ + +
+ + +
+
+ + + +
+ +
+
+ + + master + + + + +
+ + + +
+
+
+ +
+ + +
+
+ discourse/spec/fixtures/ +
+
+ + +
+ +
discourse/spec/fixtures/
+ + + +
+
+

Latest commit

+
+ +
+ +
+
+ + @jbrw +
+
+ +
+ +
+ + +
#11253)
+
+* FEATURE: display error if Oneboxing fails due to HTTP error
+
+- display warning if onebox URL is unresolvable
+- display warning if attributes are missing
+
+* FEATURE: Use new Instagram oEmbed endpoint if access token is configured
+
+Instagram requires an Access Token to access their oEmbed endpoint. The requirements (from https://developers.facebook.com/docs/instagram/oembed/) are as follows:
+
+- a Facebook Developer account, which you can create at developers.facebook.com
+- a registered Facebook app
+- the oEmbed Product added to the app
+- an Access Token
+- The Facebook app must be in Live Mode
+
+The generated Access Token, once added to SiteSetting.facebook_app_access_token, will be passed to onebox. Onebox can then use this token to access the oEmbed endpoint to generate a onebox for Instagram.
+
+* DEV: update user agent string
+
+* DEV: don’t do HEAD requests against news.yahoo.com
+
+* DEV: Bump onebox version from 2.1.5 to 2.1.6
+
+* DEV: Avoid re-reading templates
+
+* DEV: Tweaks to onebox mustache templates
+
+* DEV: simplified error message for missing onebox data
+
+* Apply suggestions from code review
+Co-authored-by: Gerhard Schlager <mail@gerhard-schlager.at>
+
+ 331236d +
+
+
+

Git stats

+ +
+
+
+

Files

+ + + + Permalink + +
+ + + Failed to load latest commit information. + +
+
+
+
Type
+
Name
+
Latest commit message
+
Commit time
+
+
+ +
+
+
+ +
+
+ + +
+ +
+ backups +
+ + + +
+ Aug 21, 2020 +
+ +
+
+
+ + +
+ +
+ csv +
+ + + +
+ Jul 29, 2020 +
+ +
+
+
+ + +
+ +
+ db +
+ + + +
+ Jun 16, 2020 +
+ +
+
+
+ + +
+ +
+ emails +
+ + + +
+ Jul 27, 2020 +
+ +
+
+
+ + +
+ +
+ encodings +
+ + + +
+ Aug 1, 2018 +
+ +
+
+
+ + +
+ +
+ feed +
+ + + +
+ Aug 1, 2018 +
+ +
+
+
+ + +
+ +
+ i18n +
+ + + +
+ Jun 5, 2019 +
+ +
+
+
+ + +
+ +
+ images +
+ + + +
+ Oct 26, 2020 +
+ +
+
+
+ + +
+ +
+ json +
+ + + +
+ Aug 24, 2020 +
+ +
+
+
+ + +
+ +
+ md +
+ + + +
+ Oct 8, 2019 +
+ +
+
+
+ + +
+ +
+ media +
+ + + +
+ Jun 17, 2020 +
+ +
+
+
+ + +
+ +
+ mmdb +
+ + + +
+ Oct 25, 2018 +
+ +
+
+
+ + +
+ +
+ multisite +
+ + + +
+ Aug 8, 2017 +
+ +
+
+
+ + +
+ +
+ onebox +
+ + + +
+ Nov 18, 2020 +
+ +
+
+
+ + +
+ +
+ pdf +
+ + + +
+ Jul 25, 2019 +
+ +
+
+
+ + +
+ +
+ plugins +
+ + + +
+ Nov 11, 2020 +
+ +
+
+
+ + +
+ +
+ scss +
+ + + +
+ Sep 21, 2018 +
+ +
+
+
+ + +
+ + + + + +
+ Aug 15, 2017 +
+ +
+
+
+ + +
+ + + + + +
+ Apr 15, 2020 +
+ +
+
+
+ + +
+ +
+ themes +
+ + + +
+ Oct 14, 2019 +
+ +
+
+
+ + +
+ +
+ woff2 +
+ + + +
+ May 10, 2017 +
+ +
+
+
+ + + + +
+ + + + + +
+
+ +
+
+ +
+ + + + + + +
+ + + You can’t perform that action at this time. +
+ + + + + + + + + + + + diff --git a/spec/fixtures/onebox/githubgist.response b/spec/fixtures/onebox/githubgist.response new file mode 100644 index 0000000000000..5975d952560cc --- /dev/null +++ b/spec/fixtures/onebox/githubgist.response @@ -0,0 +1,310 @@ +{ + "url": "https://api.github.com/gists/208fdd59fc4b4c39283b", + "forks_url": "https://api.github.com/gists/208fdd59fc4b4c39283b/forks", + "commits_url": "https://api.github.com/gists/208fdd59fc4b4c39283b/commits", + "id": "208fdd59fc4b4c39283b", + "git_pull_url": "https://gist.github.com/208fdd59fc4b4c39283b.git", + "git_push_url": "https://gist.github.com/208fdd59fc4b4c39283b.git", + "html_url": "https://gist.github.com/208fdd59fc4b4c39283b", + "files": { + "0.rb": { + "filename": "0.rb", + "type": "application/x-ruby", + "language": "Ruby", + "raw_url": "https://gist.githubusercontent.com/karreiro/208fdd59fc4b4c39283b/raw/42864e791652564ec50f773589df168998fbfdf7/0.rb", + "size": 384, + "truncated": false, + "content": "3.times { puts \"Gist API test.\" }\n\n3.times { puts \"Gist API test.\" }\n\n3.times { puts \"Gist API test.\" }\n\n3.times { puts \"Gist API test.\" }\n\n3.times { puts \"Gist API test.\" }\n\n3.times { puts \"Gist API test.\" }\n\n3.times { puts \"Gist API test.\" }\n\n3.times { puts \"Gist API test.\" }\n\n3.times { puts \"Gist API test.\" }\n\n3.times { puts \"Gist API test.\" }\n\n3.times { puts \"Gist API test.\" }\n" + }, + "1.js": { + "filename": "1.js", + "type": "application/javascript", + "language": "JavaScript", + "raw_url": "https://gist.githubusercontent.com/karreiro/208fdd59fc4b4c39283b/raw/767c3a1cec198cc2a9e6bf8a8043977cfcf3a469/1.js", + "size": 22, + "truncated": false, + "content": "console.log(\"Hey! ;)\")" + }, + "2.md": { + "filename": "2.md", + "type": "text/plain", + "language": "Markdown", + "raw_url": "https://gist.githubusercontent.com/karreiro/208fdd59fc4b4c39283b/raw/5da5715735f9d4d908003b4656426d53bfd69a96/2.md", + "size": 25, + "truncated": false, + "content": "#### Hey, this is a test!" + }, + "3.java": { + "filename": "3.java", + "type": "text/plain", + "language": "Java", + "raw_url": "https://gist.githubusercontent.com/karreiro/208fdd59fc4b4c39283b/raw/1a5f6d12fc557951f87b52f91c9cb8d6bdb2562d/3.java", + "size": 43, + "truncated": false, + "content": "System.out.println(\"Wow! This is a test!\");" + } + }, + "public": true, + "created_at": "2014-11-23T20:34:53Z", + "updated_at": "2014-11-26T01:06:05Z", + "description": "", + "comments": 0, + "user": null, + "comments_url": "https://api.github.com/gists/208fdd59fc4b4c39283b/comments", + "owner": { + "login": "karreiro", + "id": 1079279, + "avatar_url": "https://avatars.githubusercontent.com/u/1079279?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/karreiro", + "html_url": "https://github.com/karreiro", + "followers_url": "https://api.github.com/users/karreiro/followers", + "following_url": "https://api.github.com/users/karreiro/following{/other_user}", + "gists_url": "https://api.github.com/users/karreiro/gists{/gist_id}", + "starred_url": "https://api.github.com/users/karreiro/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/karreiro/subscriptions", + "organizations_url": "https://api.github.com/users/karreiro/orgs", + "repos_url": "https://api.github.com/users/karreiro/repos", + "events_url": "https://api.github.com/users/karreiro/events{/privacy}", + "received_events_url": "https://api.github.com/users/karreiro/received_events", + "type": "User", + "site_admin": false + }, + "forks": [ + + ], + "history": [ + { + "user": { + "login": "karreiro", + "id": 1079279, + "avatar_url": "https://avatars.githubusercontent.com/u/1079279?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/karreiro", + "html_url": "https://github.com/karreiro", + "followers_url": "https://api.github.com/users/karreiro/followers", + "following_url": "https://api.github.com/users/karreiro/following{/other_user}", + "gists_url": "https://api.github.com/users/karreiro/gists{/gist_id}", + "starred_url": "https://api.github.com/users/karreiro/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/karreiro/subscriptions", + "organizations_url": "https://api.github.com/users/karreiro/orgs", + "repos_url": "https://api.github.com/users/karreiro/repos", + "events_url": "https://api.github.com/users/karreiro/events{/privacy}", + "received_events_url": "https://api.github.com/users/karreiro/received_events", + "type": "User", + "site_admin": false + }, + "version": "e272e4f835e80f53fb61df2dca190fdc84b9077d", + "committed_at": "2014-11-26T01:06:05Z", + "change_status": { + "total": 4, + "additions": 2, + "deletions": 2 + }, + "url": "https://api.github.com/gists/208fdd59fc4b4c39283b/e272e4f835e80f53fb61df2dca190fdc84b9077d" + }, + { + "user": { + "login": "karreiro", + "id": 1079279, + "avatar_url": "https://avatars.githubusercontent.com/u/1079279?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/karreiro", + "html_url": "https://github.com/karreiro", + "followers_url": "https://api.github.com/users/karreiro/followers", + "following_url": "https://api.github.com/users/karreiro/following{/other_user}", + "gists_url": "https://api.github.com/users/karreiro/gists{/gist_id}", + "starred_url": "https://api.github.com/users/karreiro/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/karreiro/subscriptions", + "organizations_url": "https://api.github.com/users/karreiro/orgs", + "repos_url": "https://api.github.com/users/karreiro/repos", + "events_url": "https://api.github.com/users/karreiro/events{/privacy}", + "received_events_url": "https://api.github.com/users/karreiro/received_events", + "type": "User", + "site_admin": false + }, + "version": "3e26db8aae98340fce9d0eed3e0105c78dc440e9", + "committed_at": "2014-11-26T01:05:48Z", + "change_status": { + "total": 48, + "additions": 24, + "deletions": 24 + }, + "url": "https://api.github.com/gists/208fdd59fc4b4c39283b/3e26db8aae98340fce9d0eed3e0105c78dc440e9" + }, + { + "user": { + "login": "karreiro", + "id": 1079279, + "avatar_url": "https://avatars.githubusercontent.com/u/1079279?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/karreiro", + "html_url": "https://github.com/karreiro", + "followers_url": "https://api.github.com/users/karreiro/followers", + "following_url": "https://api.github.com/users/karreiro/following{/other_user}", + "gists_url": "https://api.github.com/users/karreiro/gists{/gist_id}", + "starred_url": "https://api.github.com/users/karreiro/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/karreiro/subscriptions", + "organizations_url": "https://api.github.com/users/karreiro/orgs", + "repos_url": "https://api.github.com/users/karreiro/repos", + "events_url": "https://api.github.com/users/karreiro/events{/privacy}", + "received_events_url": "https://api.github.com/users/karreiro/received_events", + "type": "User", + "site_admin": false + }, + "version": "4ad435c22f01aca33b6b9425505b257b8e79fe51", + "committed_at": "2014-11-26T01:05:16Z", + "change_status": { + "total": 22, + "additions": 21, + "deletions": 1 + }, + "url": "https://api.github.com/gists/208fdd59fc4b4c39283b/4ad435c22f01aca33b6b9425505b257b8e79fe51" + }, + { + "user": { + "login": "karreiro", + "id": 1079279, + "avatar_url": "https://avatars.githubusercontent.com/u/1079279?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/karreiro", + "html_url": "https://github.com/karreiro", + "followers_url": "https://api.github.com/users/karreiro/followers", + "following_url": "https://api.github.com/users/karreiro/following{/other_user}", + "gists_url": "https://api.github.com/users/karreiro/gists{/gist_id}", + "starred_url": "https://api.github.com/users/karreiro/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/karreiro/subscriptions", + "organizations_url": "https://api.github.com/users/karreiro/orgs", + "repos_url": "https://api.github.com/users/karreiro/repos", + "events_url": "https://api.github.com/users/karreiro/events{/privacy}", + "received_events_url": "https://api.github.com/users/karreiro/received_events", + "type": "User", + "site_admin": false + }, + "version": "766d913a9bbe70181944a7a74818db5a1531d7e2", + "committed_at": "2014-11-26T00:56:12Z", + "change_status": { + "total": 2, + "additions": 2, + "deletions": 0 + }, + "url": "https://api.github.com/gists/208fdd59fc4b4c39283b/766d913a9bbe70181944a7a74818db5a1531d7e2" + }, + { + "user": { + "login": "karreiro", + "id": 1079279, + "avatar_url": "https://avatars.githubusercontent.com/u/1079279?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/karreiro", + "html_url": "https://github.com/karreiro", + "followers_url": "https://api.github.com/users/karreiro/followers", + "following_url": "https://api.github.com/users/karreiro/following{/other_user}", + "gists_url": "https://api.github.com/users/karreiro/gists{/gist_id}", + "starred_url": "https://api.github.com/users/karreiro/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/karreiro/subscriptions", + "organizations_url": "https://api.github.com/users/karreiro/orgs", + "repos_url": "https://api.github.com/users/karreiro/repos", + "events_url": "https://api.github.com/users/karreiro/events{/privacy}", + "received_events_url": "https://api.github.com/users/karreiro/received_events", + "type": "User", + "site_admin": false + }, + "version": "0b66a247bcbcdaeaee33b43a3b8accd499f82c8d", + "committed_at": "2014-11-24T23:48:58Z", + "change_status": { + "total": 1, + "additions": 1, + "deletions": 0 + }, + "url": "https://api.github.com/gists/208fdd59fc4b4c39283b/0b66a247bcbcdaeaee33b43a3b8accd499f82c8d" + }, + { + "user": { + "login": "karreiro", + "id": 1079279, + "avatar_url": "https://avatars.githubusercontent.com/u/1079279?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/karreiro", + "html_url": "https://github.com/karreiro", + "followers_url": "https://api.github.com/users/karreiro/followers", + "following_url": "https://api.github.com/users/karreiro/following{/other_user}", + "gists_url": "https://api.github.com/users/karreiro/gists{/gist_id}", + "starred_url": "https://api.github.com/users/karreiro/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/karreiro/subscriptions", + "organizations_url": "https://api.github.com/users/karreiro/orgs", + "repos_url": "https://api.github.com/users/karreiro/repos", + "events_url": "https://api.github.com/users/karreiro/events{/privacy}", + "received_events_url": "https://api.github.com/users/karreiro/received_events", + "type": "User", + "site_admin": false + }, + "version": "310b5888a5ee830a38972f0fbace28055ab05759", + "committed_at": "2014-11-24T23:47:40Z", + "change_status": { + "total": 99, + "additions": 0, + "deletions": 99 + }, + "url": "https://api.github.com/gists/208fdd59fc4b4c39283b/310b5888a5ee830a38972f0fbace28055ab05759" + }, + { + "user": { + "login": "karreiro", + "id": 1079279, + "avatar_url": "https://avatars.githubusercontent.com/u/1079279?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/karreiro", + "html_url": "https://github.com/karreiro", + "followers_url": "https://api.github.com/users/karreiro/followers", + "following_url": "https://api.github.com/users/karreiro/following{/other_user}", + "gists_url": "https://api.github.com/users/karreiro/gists{/gist_id}", + "starred_url": "https://api.github.com/users/karreiro/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/karreiro/subscriptions", + "organizations_url": "https://api.github.com/users/karreiro/orgs", + "repos_url": "https://api.github.com/users/karreiro/repos", + "events_url": "https://api.github.com/users/karreiro/events{/privacy}", + "received_events_url": "https://api.github.com/users/karreiro/received_events", + "type": "User", + "site_admin": false + }, + "version": "dc19c6c9c36079f56363062eea81e448fe1f996e", + "committed_at": "2014-11-24T01:06:00Z", + "change_status": { + "total": 99, + "additions": 99, + "deletions": 0 + }, + "url": "https://api.github.com/gists/208fdd59fc4b4c39283b/dc19c6c9c36079f56363062eea81e448fe1f996e" + }, + { + "user": { + "login": "karreiro", + "id": 1079279, + "avatar_url": "https://avatars.githubusercontent.com/u/1079279?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/karreiro", + "html_url": "https://github.com/karreiro", + "followers_url": "https://api.github.com/users/karreiro/followers", + "following_url": "https://api.github.com/users/karreiro/following{/other_user}", + "gists_url": "https://api.github.com/users/karreiro/gists{/gist_id}", + "starred_url": "https://api.github.com/users/karreiro/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/karreiro/subscriptions", + "organizations_url": "https://api.github.com/users/karreiro/orgs", + "repos_url": "https://api.github.com/users/karreiro/repos", + "events_url": "https://api.github.com/users/karreiro/events{/privacy}", + "received_events_url": "https://api.github.com/users/karreiro/received_events", + "type": "User", + "site_admin": false + }, + "version": "9ec949557a17391117a30aebcd907a14d61eae88", + "committed_at": "2014-11-23T20:34:53Z", + "change_status": { + "total": 1, + "additions": 1, + "deletions": 0 + }, + "url": "https://api.github.com/gists/208fdd59fc4b4c39283b/9ec949557a17391117a30aebcd907a14d61eae88" + } + ] +} \ No newline at end of file diff --git a/spec/fixtures/onebox/githubpullrequest.response b/spec/fixtures/onebox/githubpullrequest.response new file mode 100644 index 0000000000000..01ad3e48bdd72 --- /dev/null +++ b/spec/fixtures/onebox/githubpullrequest.response @@ -0,0 +1,216 @@ +{ + "url": "https://api.github.com/repos/discourse/discourse/pulls/1253", + "id": 7186071, + "html_url": "https://github.com/discourse/discourse/pull/1253", + "diff_url": "https://github.com/discourse/discourse/pull/1253.diff", + "patch_url": "https://github.com/discourse/discourse/pull/1253.patch", + "issue_url": "https://github.com/discourse/discourse/pull/1253", + "number": 1253, + "state": "closed", + "title": "Add audio onebox", + "user": { + "login": "jamesaanderson", + "id": 2722987, + "avatar_url": "https://0.gravatar.com/avatar/b3e9977094ce189bbb493cf7f9adea21?d=https%3A%2F%2Fidenticons.github.com%2Fb4a68f5d10a482ee680e30f88540942a.png", + "gravatar_id": "b3e9977094ce189bbb493cf7f9adea21", + "url": "https://api.github.com/users/jamesaanderson", + "html_url": "https://github.com/jamesaanderson", + "followers_url": "https://api.github.com/users/jamesaanderson/followers", + "following_url": "https://api.github.com/users/jamesaanderson/following{/other_user}", + "gists_url": "https://api.github.com/users/jamesaanderson/gists{/gist_id}", + "starred_url": "https://api.github.com/users/jamesaanderson/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/jamesaanderson/subscriptions", + "organizations_url": "https://api.github.com/users/jamesaanderson/orgs", + "repos_url": "https://api.github.com/users/jamesaanderson/repos", + "events_url": "https://api.github.com/users/jamesaanderson/events{/privacy}", + "received_events_url": "https://api.github.com/users/jamesaanderson/received_events", + "type": "User" + }, + "body": "http://meta.discourse.org/t/audio-html5-tag/8168", + "created_at": "2013-07-26T02:05:53Z", + "updated_at": "2013-07-26T15:31:57Z", + "closed_at": "2013-07-26T15:30:57Z", + "merged_at": "2013-07-26T15:30:57Z", + "merge_commit_sha": null, + "assignee": null, + "milestone": null, + "commits_url": "https://github.com/discourse/discourse/pull/1253/commits", + "review_comments_url": "https://github.com/discourse/discourse/pull/1253/comments", + "review_comment_url": "/repos/discourse/discourse/pulls/comments/{number}", + "comments_url": "https://api.github.com/repos/discourse/discourse/issues/1253/comments", + "head": { + "label": "jamesaanderson:add-audio-onebox", + "ref": "add-audio-onebox", + "sha": "d7d3be1130c665cc7fab9f05dbf32335229137a6", + "user": { + "login": "jamesaanderson", + "id": 2722987, + "avatar_url": "https://0.gravatar.com/avatar/b3e9977094ce189bbb493cf7f9adea21?d=https%3A%2F%2Fidenticons.github.com%2Fb4a68f5d10a482ee680e30f88540942a.png", + "gravatar_id": "b3e9977094ce189bbb493cf7f9adea21", + "url": "https://api.github.com/users/jamesaanderson", + "html_url": "https://github.com/jamesaanderson", + "followers_url": "https://api.github.com/users/jamesaanderson/followers", + "following_url": "https://api.github.com/users/jamesaanderson/following{/other_user}", + "gists_url": "https://api.github.com/users/jamesaanderson/gists{/gist_id}", + "starred_url": "https://api.github.com/users/jamesaanderson/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/jamesaanderson/subscriptions", + "organizations_url": "https://api.github.com/users/jamesaanderson/orgs", + "repos_url": "https://api.github.com/users/jamesaanderson/repos", + "events_url": "https://api.github.com/users/jamesaanderson/events{/privacy}", + "received_events_url": "https://api.github.com/users/jamesaanderson/received_events", + "type": "User" + }, + "repo": null + }, + "base": { + "label": "discourse:master", + "ref": "master", + "sha": "cc79d22f82ede170dd86a05274eb3c2c5eb02912", + "user": { + "login": "discourse", + "id": 3220138, + "avatar_url": "https://0.gravatar.com/avatar/b30fff48d257cdd17c4437afac19fd30?d=https%3A%2F%2Fidenticons.github.com%2Fa42d8d01d12f7137e49e7c1ee1b2b3f0.png", + "gravatar_id": "b30fff48d257cdd17c4437afac19fd30", + "url": "https://api.github.com/users/discourse", + "html_url": "https://github.com/discourse", + "followers_url": "https://api.github.com/users/discourse/followers", + "following_url": "https://api.github.com/users/discourse/following{/other_user}", + "gists_url": "https://api.github.com/users/discourse/gists{/gist_id}", + "starred_url": "https://api.github.com/users/discourse/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/discourse/subscriptions", + "organizations_url": "https://api.github.com/users/discourse/orgs", + "repos_url": "https://api.github.com/users/discourse/repos", + "events_url": "https://api.github.com/users/discourse/events{/privacy}", + "received_events_url": "https://api.github.com/users/discourse/received_events", + "type": "Organization" + }, + "repo": { + "id": 7569578, + "name": "discourse", + "full_name": "discourse/discourse", + "owner": { + "login": "discourse", + "id": 3220138, + "avatar_url": "https://0.gravatar.com/avatar/b30fff48d257cdd17c4437afac19fd30?d=https%3A%2F%2Fidenticons.github.com%2Fa42d8d01d12f7137e49e7c1ee1b2b3f0.png", + "gravatar_id": "b30fff48d257cdd17c4437afac19fd30", + "url": "https://api.github.com/users/discourse", + "html_url": "https://github.com/discourse", + "followers_url": "https://api.github.com/users/discourse/followers", + "following_url": "https://api.github.com/users/discourse/following{/other_user}", + "gists_url": "https://api.github.com/users/discourse/gists{/gist_id}", + "starred_url": "https://api.github.com/users/discourse/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/discourse/subscriptions", + "organizations_url": "https://api.github.com/users/discourse/orgs", + "repos_url": "https://api.github.com/users/discourse/repos", + "events_url": "https://api.github.com/users/discourse/events{/privacy}", + "received_events_url": "https://api.github.com/users/discourse/received_events", + "type": "Organization" + }, + "private": false, + "html_url": "https://github.com/discourse/discourse", + "description": "A platform for community discussion. Free, open, simple.", + "fork": false, + "url": "https://api.github.com/repos/discourse/discourse", + "forks_url": "https://api.github.com/repos/discourse/discourse/forks", + "keys_url": "https://api.github.com/repos/discourse/discourse/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/discourse/discourse/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/discourse/discourse/teams", + "hooks_url": "https://api.github.com/repos/discourse/discourse/hooks", + "issue_events_url": "https://api.github.com/repos/discourse/discourse/issues/events{/number}", + "events_url": "https://api.github.com/repos/discourse/discourse/events", + "assignees_url": "https://api.github.com/repos/discourse/discourse/assignees{/user}", + "branches_url": "https://api.github.com/repos/discourse/discourse/branches{/branch}", + "tags_url": "https://api.github.com/repos/discourse/discourse/tags", + "blobs_url": "https://api.github.com/repos/discourse/discourse/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/discourse/discourse/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/discourse/discourse/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/discourse/discourse/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/discourse/discourse/statuses/{sha}", + "languages_url": "https://api.github.com/repos/discourse/discourse/languages", + "stargazers_url": "https://api.github.com/repos/discourse/discourse/stargazers", + "contributors_url": "https://api.github.com/repos/discourse/discourse/contributors", + "subscribers_url": "https://api.github.com/repos/discourse/discourse/subscribers", + "subscription_url": "https://api.github.com/repos/discourse/discourse/subscription", + "commits_url": "https://api.github.com/repos/discourse/discourse/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/discourse/discourse/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/discourse/discourse/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/discourse/discourse/issues/comments/{number}", + "contents_url": "https://api.github.com/repos/discourse/discourse/contents/{+path}", + "compare_url": "https://api.github.com/repos/discourse/discourse/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/discourse/discourse/merges", + "archive_url": "https://api.github.com/repos/discourse/discourse/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/discourse/discourse/downloads", + "issues_url": "https://api.github.com/repos/discourse/discourse/issues{/number}", + "pulls_url": "https://api.github.com/repos/discourse/discourse/pulls{/number}", + "milestones_url": "https://api.github.com/repos/discourse/discourse/milestones{/number}", + "notifications_url": "https://api.github.com/repos/discourse/discourse/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/discourse/discourse/labels{/name}", + "created_at": "2013-01-12T00:25:55Z", + "updated_at": "2013-09-28T16:44:54Z", + "pushed_at": "2013-09-27T19:08:59Z", + "git_url": "git://github.com/discourse/discourse.git", + "ssh_url": "git@github.com:discourse/discourse.git", + "clone_url": "https://github.com/discourse/discourse.git", + "svn_url": "https://github.com/discourse/discourse", + "homepage": "http://www.discourse.org", + "size": 48020, + "watchers_count": 7857, + "language": "JavaScript", + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "forks_count": 1876, + "mirror_url": null, + "open_issues_count": 38, + "forks": 1876, + "open_issues": 38, + "watchers": 7857, + "master_branch": "master", + "default_branch": "master" + } + }, + "_links": { + "self": { + "href": "https://api.github.com/repos/discourse/discourse/pulls/1253" + }, + "html": { + "href": "https://github.com/discourse/discourse/pull/1253" + }, + "issue": { + "href": "https://api.github.com/repos/discourse/discourse/issues/1253" + }, + "comments": { + "href": "https://api.github.com/repos/discourse/discourse/issues/1253/comments" + }, + "review_comments": { + "href": "https://api.github.com/repos/discourse/discourse/pulls/1253/comments" + } + }, + "merged": true, + "mergeable": null, + "mergeable_state": "unknown", + "merged_by": { + "login": "eviltrout", + "id": 17538, + "avatar_url": "https://0.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9?d=https%3A%2F%2Fidenticons.github.com%2Fba01baa4856d494a66a0d5eca39f5418.png", + "gravatar_id": "c6e17f2ae2a215e87ff9e878a4e63cd9", + "url": "https://api.github.com/users/eviltrout", + "html_url": "https://github.com/eviltrout", + "followers_url": "https://api.github.com/users/eviltrout/followers", + "following_url": "https://api.github.com/users/eviltrout/following{/other_user}", + "gists_url": "https://api.github.com/users/eviltrout/gists{/gist_id}", + "starred_url": "https://api.github.com/users/eviltrout/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/eviltrout/subscriptions", + "organizations_url": "https://api.github.com/users/eviltrout/orgs", + "repos_url": "https://api.github.com/users/eviltrout/repos", + "events_url": "https://api.github.com/users/eviltrout/events{/privacy}", + "received_events_url": "https://api.github.com/users/eviltrout/received_events", + "type": "User" + }, + "comments": 2, + "review_comments": 0, + "commits": 1, + "additions": 19, + "deletions": 1, + "changed_files": 4 +} diff --git a/spec/fixtures/onebox/gitlabblob.response b/spec/fixtures/onebox/gitlabblob.response new file mode 100644 index 0000000000000..9249619b61ed7 --- /dev/null +++ b/spec/fixtures/onebox/gitlabblob.response @@ -0,0 +1,21 @@ +require_relative '../mixins/git_blob_onebox' + +module Onebox + module Engine + class GitlabBlobOnebox + def self.git_regexp + /^https?:\/\/(www\.)?gitlab\.com.*\/blob\// + end + include Onebox::Mixins::GitBlobOnebox + def raw_regexp + /gitlab\.com\/(?[^\/]+)\/(?[^\/]+)\/blob\/(?[^\/]+)\/(?[^#]+)(#(L(?[^-]*)(-L(?.*))?))?/mi + end + def raw_template(m) + "https://gitlab.com/#{m[:user]}/#{m[:repo]}/raw/#{m[:sha1]}/#{m[:file]}" + end + def title + Sanitize.fragment(URI.unescape(link).sub(/^https?\:\/\/gitlab\.com\//, '')) + end + end + end +end diff --git a/spec/fixtures/onebox/googledocs.response b/spec/fixtures/onebox/googledocs.response new file mode 100644 index 0000000000000..be56d2cf1cdec --- /dev/null +++ b/spec/fixtures/onebox/googledocs.response @@ -0,0 +1,182 @@ +Lorem Ipsum! - Dokumenty Google
Lorem Ipsum
 Udostępnij
Używana przez Ciebie wersja przeglądarki nie jest już obsługiwana. Uaktualnij przeglądarkę do obsługiwanej wersji.Zamknij

diff --git a/spec/fixtures/onebox/googledrive.response b/spec/fixtures/onebox/googledrive.response new file mode 100644 index 0000000000000..caaff11360c9e --- /dev/null +++ b/spec/fixtures/onebox/googledrive.response @@ -0,0 +1,304 @@ +test.txt - Google Drive + +
Google Account
John Doe
xyz@gmail.com
Main menu
diff --git a/spec/fixtures/onebox/googlephotos.response b/spec/fixtures/onebox/googlephotos.response new file mode 100644 index 0000000000000..dd4898a5219ec --- /dev/null +++ b/spec/fixtures/onebox/googlephotos.response @@ -0,0 +1,800 @@ + +Mesmerizing Singapore - Google Photos

Press question mark to see available shortcut keys

Mesmerizing Singapore
Sep 23–29
 · 
Shared
Arpit Jalan (Owner)
Add photos
Automatically add photos of people & pets
Select photos
Tip: Drag photos & videos anywhere to upload
Google apps
Main menu
diff --git a/spec/fixtures/onebox/googleplayapp.response b/spec/fixtures/onebox/googleplayapp.response new file mode 100644 index 0000000000000..8c21dbacc2cf5 --- /dev/null +++ b/spec/fixtures/onebox/googleplayapp.response @@ -0,0 +1,2269 @@ +Hulu: Stream TV, Movies & more - Apps on Google Play

Hulu: Stream TV, Movies & more

Contains Ads

Enjoy all your TV in one place with a new Hulu experience – more personalized and intuitive than ever before.

The choice is yours - select a plan featuring Hulu’s entire streaming library or one that includes the entire library plus 50+ top Live and On Demand channels.

Access Hulu’s huge streaming library featuring current and past seasons from many popular shows exclusively streaming on Hulu including Seinfeld, Fargo, South Park and Fear the Walking Dead; bold Hulu Originals you can’t stream anywhere else including The Handmaid’s Tale, Harlots, The Mindy Project, and Casual; along with current shows, hit movies, kid’s series and more from many top channels including FOX, NBC, Disney Channel, ABC, Cartoon Network, FX and A&E. Limited and commercial-free options are available for Hulu plans without Live TV.

And now choose from an option to stream Hulu’s entire library, plus over 50 top Live and On Demand channels, including FOX, ABC, NBC, CBS, ESPN, FX, NBCSN, FS1, History Channel and TNT. Watch live sports from top pro and college leagues plus regional sports networks available in many areas. Plus, enjoy national news with local feeds available in select cities, popular kids shows and can’t-miss events.

Features

With any subscription, you’ll enjoy the following features that enhance how you watch TV:
• The more you watch, the better it gets. Enjoy a reimagined TV experience that adjusts to your tastes every time you use Hulu.
• Create up to 6 personalized profiles for the whole household. Enjoy your own collection of shows, movies, networks, and more.
• Track your favorites with My Stuff. Add shows, networks, and movies for quick access across your devices.
• Browse while you watch with Fliptray for recommendations of what to watch next.

Hulu with Live TV (Beta) provides access to additional features including:
• Record Live TV with your Cloud DVR to watch your favorites anytime.
• Watch concurrent streams on multiple devices.
• Track and record games from your favorite teams with My Teams.

Download the Hulu app now, and choose the Hulu with Live TV (Beta) plan which includes the entire Hulu streaming library plus over 50 Live and On Demand channels. Limited and No Commercials plans featuring Hulu’s streaming library without Live TV are also available – the choice is yours.

If you’re new to Hulu, your base Hulu subscription fee will be $7.99/month for the Limited Commercials plan or $11.99/month for the No Commercials plan, or starting at $39.99/month for a Hulu with Live TV (Beta) plan as a recurring transaction starting the end of your free trial (unless you cancel during the free trial). Payment will automatically renew unless you cancel your account at least 24 hours before the end of the current subscription month. You can manage your subscription, cancel anytime, or turn off auto-renewal by accessing your Hulu account via Settings. Hulu is available to US customers only.

Terms of Use: http://www.hulu.com/terms

Privacy Policy: http://www.hulu.com/privacy

This app features third party software, enabling third parties to calculate measurement statistics (e.g., Nielsen’s TV Ratings).

We may work with mobile advertising companies to help deliver online and in-app advertisements tailored to your interests based on your activities on our website and apps and on other, unaffiliated website and apps. To learn more, visit www.aboutads.info. To opt-out of online interest-based advertising, visit www.aboutads.info/choices. To opt-out of cross-app advertising, download the App Choices app at www.aboutads.info/appchoices. Hulu is committed to complying with the DAA’s Self-Regulatory Principles for Online Behavioral Advertising and the DAA’s Application of Self-Regulatory Principles for the Mobile Environment.

Hulu, LLC

Web Site: https://www.hulu.com/

Support: https://help.hulu.com/
Read more
4.0
325,156 total
5
4
3
2
1
Loading...

What's New

Various performance improvements and fixes
Read more

Additional Information

Updated
October 1, 2018
Size
Varies with device
Installs
10,000,000+
Current Version
Varies with device
Requires Android
5.0 and up
Content Rating
Rated for 12+
Parental Guidance Recommended
Interactive Elements
Shares Info
Permissions
Offered By
Hulu
©2018 GoogleSite Terms of ServicePrivacyDevelopersArtistsAbout Google|Location: IndiaLanguage: EnglishAll prices include GST.
By purchasing this item, you are transacting with Google Payments and agreeing to the Google Payments Terms of Service and Privacy Notice.
diff --git a/spec/fixtures/onebox/image.response b/spec/fixtures/onebox/image.response new file mode 100644 index 0000000000000000000000000000000000000000..03fdde670c3e4d2d91bcc29ec59d5746359caa9c GIT binary patch literal 266630 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⪻4T-lf_kd;mvaxMS^&8 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�*=HP*SH zqRZDlp@wYYDW%JuocN1VQUnl`9vommRFfeB$8Owo=wWDQW+JsmHH`(%64Sh1TH0-n z%SKW_&fpv}kk!lDZ?8>{q{fF-V}nD(V3D{MlJe&QOgW}v;tJz@$0^iZqdr|h+8<~7 zmn&SFsu-%;WQtmGBFE#w6xELLm3d1qiEY6HkO&|s!9xzpRmEH-64$h~(ptk&rGS=z zb2Y7TxF7;XU|8TRH4H@xrzJ{(%@Wcj!LBeGZI#*BC*nCtAm*J;-=n)Qhe^<9nwv;w znqcR3F;0}x(wH*U%Hsp~-sKk8Xrf5iMdFLU?+6^7*vpEn{97s3rDzA>4QsFcM3U&r z*AQF-r!fK?a~)La94ItuNz7Y!W_*i7NF))MfFebJC$a-p$EdVx>b%0AC5J`nY^s8m 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 QiU5lhqOCDJBi)z(*>Ky~VE_OC literal 0 HcmV?d00001 diff --git a/spec/fixtures/onebox/imgur.response b/spec/fixtures/onebox/imgur.response new file mode 100644 index 0000000000000..58cc2ec9a9eb0 --- /dev/null +++ b/spec/fixtures/onebox/imgur.response @@ -0,0 +1,836 @@ + + + + + + + + + + Did you <b>miss me</b>? - Album on Imgur + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + + + + + + + + + +
+
+ + + + +
+
+ +
+ +
+
+
+ +

Did you <b>miss me</b>?

+ +
+ +
+ + + + by + + + + 16h + + + + +
+
+ +
+ + + + + + + + + + +
+ +
+ + +
+ +
+ + + +
+ + + + + + +
+ + + + + + +
+ +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
TAKE ME UP
+
+
+
+
+
+
+ +
+ + +
+ + + +
+ +
+ +
+
+
+
+

Embed Code

+ +
+ +
+
+
+
+ +
+
+
+

Use old embed code

+
+
+
+ Copy and paste the HTML below into your website: +
+ +
+
+
+
+ +
+ +
+
+ + +

Preview

+
+
    +
  • + # +
  • +
  • + # +
  • +
  • + # +
  • +
  • + +
  • +
+
+

Hide old embed code

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spec/fixtures/onebox/instagram.response b/spec/fixtures/onebox/instagram.response new file mode 100644 index 0000000000000..f16dc1b5a7343 --- /dev/null +++ b/spec/fixtures/onebox/instagram.response @@ -0,0 +1,12 @@ +{ + "version":"1.0", + "author_name":"natgeo", + "provider_name":"Instagram", + "provider_url":"https:\/\/www.instagram.com\/", + "type":"rich", + "width":658, + "html":"\u003Cblockquote class=\"instagram-media\" data-instgrm-captioned data-instgrm-permalink=\"https:\/\/www.instagram.com\/p\/CARbvuYDm3Q\/?utm_source=ig_embed&utm_campaign=loading\" data-instgrm-version=\"13\" style=\" background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:658px; min-width:326px; padding:0; width:99.375\u0025; width:-webkit-calc(100\u0025 - 2px); width:calc(100\u0025 - 2px);\">\u003Cdiv style=\"padding:16px;\"> \u003Ca href=\"https:\/\/www.instagram.com\/p\/CARbvuYDm3Q\/?utm_source=ig_embed&utm_campaign=loading\" style=\" background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100\u0025;\" target=\"_blank\"> \u003Cdiv style=\" display: flex; flex-direction: row; align-items: center;\"> \u003Cdiv style=\"background-color: #F4F4F4; border-radius: 50\u0025; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;\">\u003C\/div> \u003Cdiv style=\"display: flex; flex-direction: column; flex-grow: 1; justify-content: center;\"> \u003Cdiv style=\" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;\">\u003C\/div> \u003Cdiv style=\" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;\">\u003C\/div>\u003C\/div>\u003C\/div>\u003Cdiv style=\"padding: 19\u0025 0;\">\u003C\/div> \u003Cdiv style=\"display:block; height:50px; margin:0 auto 12px; width:50px;\">\u003Csvg width=\"50px\" height=\"50px\" viewBox=\"0 0 60 60\" version=\"1.1\" xmlns=\"https:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"https:\/\/www.w3.org\/1999\/xlink\">\u003Cg stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\u003Cg transform=\"translate(-511.000000, -20.000000)\" fill=\"#000000\">\u003Cg>\u003Cpath d=\"M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631\">\u003C\/path>\u003C\/g>\u003C\/g>\u003C\/g>\u003C\/svg>\u003C\/div>\u003Cdiv style=\"padding-top: 8px;\"> \u003Cdiv style=\" color:#3897f0; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:550; line-height:18px;\"> View this post on Instagram\u003C\/div>\u003C\/div>\u003Cdiv style=\"padding: 12.5\u0025 0;\">\u003C\/div> \u003Cdiv style=\"display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;\">\u003Cdiv> \u003Cdiv style=\"background-color: #F4F4F4; border-radius: 50\u0025; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);\">\u003C\/div> \u003Cdiv style=\"background-color: #F4F4F4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;\">\u003C\/div> \u003Cdiv style=\"background-color: #F4F4F4; border-radius: 50\u0025; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);\">\u003C\/div>\u003C\/div>\u003Cdiv style=\"margin-left: 8px;\"> \u003Cdiv style=\" background-color: #F4F4F4; border-radius: 50\u0025; flex-grow: 0; height: 20px; width: 20px;\">\u003C\/div> \u003Cdiv style=\" width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg)\">\u003C\/div>\u003C\/div>\u003Cdiv style=\"margin-left: auto;\"> \u003Cdiv style=\" width: 0px; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);\">\u003C\/div> \u003Cdiv style=\" background-color: #F4F4F4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);\">\u003C\/div> \u003Cdiv style=\" width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);\">\u003C\/div>\u003C\/div>\u003C\/div> \u003Cdiv style=\"display: flex; flex-direction: column; flex-grow: 1; justify-content: center; margin-bottom: 24px;\"> \u003Cdiv style=\" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 224px;\">\u003C\/div> \u003Cdiv style=\" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 144px;\">\u003C\/div>\u003C\/div>\u003C\/a>\u003Cp style=\" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;\">\u003Ca href=\"https:\/\/www.instagram.com\/p\/CARbvuYDm3Q\/?utm_source=ig_embed&utm_campaign=loading\" style=\" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none;\" target=\"_blank\">A post shared by National Geographic (\u0040natgeo)\u003C\/a>\u003C\/p>\u003C\/div>\u003C\/blockquote>\n\u003Cscript async src=\"\/\/platform.instagram.com\/en_US\/embeds.js\">\u003C\/script>", + "thumbnail_url":"https:\/\/scontent.cdninstagram.com\/v\/t51.2885-15\/sh0.08\/e35\/s640x640\/97565241_163250548553285_9172168193050746487_n.jpg?_nc_ht=scontent.cdninstagram.com&_nc_cat=105&_nc_ohc=dnXCQ6urT_gAX9KlZ1l&_nc_tp=24&oh=b5fd90cdc61c5a8bba19b41e2f72040c&oe=5FDD8836", + "thumbnail_width":640, + "thumbnail_height":427 +} diff --git a/spec/fixtures/onebox/instagram_old_onebox.response b/spec/fixtures/onebox/instagram_old_onebox.response new file mode 100644 index 0000000000000..b0c0a9a5c4e18 --- /dev/null +++ b/spec/fixtures/onebox/instagram_old_onebox.response @@ -0,0 +1,17 @@ + +{ +"version": "1.0", +"title": "Photo by Pete McBride @pedromcbride | For the first time in three decades, inhabitants of northern India are able to see the Himalaya\u2014thanks to reduced air pollution over the last few weeks. Considering that India experiences some of the worst pollution in the world, this is a literal breath of fresh air. When I was there, the air was so thick you could taste the smoke and fumes.\n\nThe coronavirus pandemic that has led to India's temporary reduction in pollutants has also put the country on the world's largest lockdown, and it's too soon to tell what impact that has had on curbing the disease\u2014as well as what the long-term effects will be on attitudes toward fresh air once the population returns to business as usual. For more on India and the environment, follow @pedromcbride. #india #himalaya #covid19 #pollution", +"author_name": "natgeo", +"author_url": "https://www.instagram.com/natgeo", +"author_id": 787132, "media_id": "2310750110684704208_787132", +"provider_name": "Instagram", +"provider_url": "https://www.instagram.com", +"type": "rich", +"width": 658, +"height": null, +"html": "\u003cblockquote class=\"instagram-media\" data-instgrm-captioned data-instgrm-permalink=\"https://www.instagram.com/p/CARbvuYDm3Q/?utm_source=ig_embed\u0026amp;utm_campaign=loading\" data-instgrm-version=\"13\" style=\" background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:658px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);\"\u003e\u003cdiv style=\"padding:16px;\"\u003e \u003ca href=\"https://www.instagram.com/p/CARbvuYDm3Q/?utm_source=ig_embed\u0026amp;utm_campaign=loading\" style=\" background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;\" target=\"_blank\"\u003e \u003cdiv style=\" display: flex; flex-direction: row; align-items: center;\"\u003e \u003cdiv style=\"background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;\"\u003e\u003c/div\u003e \u003cdiv style=\"display: flex; flex-direction: column; flex-grow: 1; justify-content: center;\"\u003e \u003cdiv style=\" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;\"\u003e\u003c/div\u003e \u003cdiv style=\" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style=\"padding: 19% 0;\"\u003e\u003c/div\u003e \u003cdiv style=\"display:block; height:50px; margin:0 auto 12px; width:50px;\"\u003e\u003csvg width=\"50px\" height=\"50px\" viewBox=\"0 0 60 60\" version=\"1.1\" xmlns=\"https://www.w3.org/2000/svg\" xmlns:xlink=\"https://www.w3.org/1999/xlink\"\u003e\u003cg stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"\u003e\u003cg transform=\"translate(-511.000000, -20.000000)\" fill=\"#000000\"\u003e\u003cg\u003e\u003cpath d=\"M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631\"\u003e\u003c/path\u003e\u003c/g\u003e\u003c/g\u003e\u003c/g\u003e\u003c/svg\u003e\u003c/div\u003e\u003cdiv style=\"padding-top: 8px;\"\u003e \u003cdiv style=\" color:#3897f0; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:550; line-height:18px;\"\u003e View this post on Instagram\u003c/div\u003e\u003c/div\u003e\u003cdiv style=\"padding: 12.5% 0;\"\u003e\u003c/div\u003e \u003cdiv style=\"display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;\"\u003e\u003cdiv\u003e \u003cdiv style=\"background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);\"\u003e\u003c/div\u003e \u003cdiv style=\"background-color: #F4F4F4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;\"\u003e\u003c/div\u003e \u003cdiv style=\"background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);\"\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style=\"margin-left: 8px;\"\u003e \u003cdiv style=\" background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 20px; width: 20px;\"\u003e\u003c/div\u003e \u003cdiv style=\" width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg)\"\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style=\"margin-left: auto;\"\u003e \u003cdiv style=\" width: 0px; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);\"\u003e\u003c/div\u003e \u003cdiv style=\" background-color: #F4F4F4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);\"\u003e\u003c/div\u003e \u003cdiv style=\" width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e \u003cdiv style=\"display: flex; flex-direction: column; flex-grow: 1; justify-content: center; margin-bottom: 24px;\"\u003e \u003cdiv style=\" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 224px;\"\u003e\u003c/div\u003e \u003cdiv style=\" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 144px;\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/a\u003e\u003cp style=\" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;\"\u003e\u003ca href=\"https://www.instagram.com/p/CARbvuYDm3Q/?utm_source=ig_embed\u0026amp;utm_campaign=loading\" style=\" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none;\" target=\"_blank\"\u003eA post shared by National Geographic (@natgeo)\u003c/a\u003e\u003c/p\u003e\u003c/div\u003e\u003c/blockquote\u003e\n\u003cscript async src=\"//www.instagram.com/embed.js\"\u003e\u003c/script\u003e", +"thumbnail_url": "https://scontent-yyz1-1.cdninstagram.com/v/t51.2885-15/sh0.08/e35/s640x640/97565241_163250548553285_9172168193050746487_n.jpg?_nc_ht=scontent-yyz1-1.cdninstagram.com\u0026_nc_cat=105\u0026_nc_ohc=dnXCQ6urT_gAX99AO01\u0026_nc_tp=24\u0026oh=32b676a618164ab0248e2726767dae14\u0026oe=5FDD8836", +"thumbnail_width": 640, +"thumbnail_height": 427 +} diff --git a/spec/fixtures/onebox/kaltura.response b/spec/fixtures/onebox/kaltura.response new file mode 100644 index 0000000000000..9195ad4cb21cf --- /dev/null +++ b/spec/fixtures/onebox/kaltura.response @@ -0,0 +1,781 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Kaltura Overview - Kaltura Videos + + + + + + + + +
+
+
+
+
+
+
+ + + + + + +
+ + + + + +
+
+ +
+ + + + +
+ + + + +
+ + + + +
+
+
+
+
+
+

+ Kaltura Overview

+

+ + From Alon Finkelstein A year ago   + +

+
+
+ + + + + + likes + + + + + + + + views + + + + + + + comments + + + + + + + + + +
+
+
+
+ + +
+
+
+ +
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ + +
+ +
+
+ + + + + +
+
+
+ + + + +
+
+ +
+
+
+ + + + + + +
+ + \ No newline at end of file diff --git a/spec/fixtures/onebox/meetup.response.html b/spec/fixtures/onebox/meetup.response.html new file mode 100644 index 0000000000000..4e7099aed89e1 --- /dev/null +++ b/spec/fixtures/onebox/meetup.response.html @@ -0,0 +1,4419 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +February EmberTO Meet-up - +Toronto Ember.js Meetup (Toronto, ON) + + +| Meetup + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
addressalign-toparrow-leftarrow-rightbackbellblockcalendarcameraccwcheckchevron-downchevron-leftchevron-rightchevron-small-downchevron-small-leftchevron-small-rightchevron-small-upchevron-upcircle-with-checkcircle-with-crosscircle-with-pluscrossdots-three-verticaleditemptyheartexporteye-with-lineeyefacebookfolderfullheartglobegmailgooglegroupsimageimagesinstagramlinklocation-pinm-swarmSearchmailmessagesminusmoremuplabelShape 3 + Rectangle 1outlookpersonJoin Group on CardStartprice-ribbonImported LayersImported LayersImported Layersshieldstartickettrashtriangle-downtriangle-uptwitteruseryahoo
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + + +
+ + +
+ + +
+ + + +
+
+ + + + + + + + + + + + + +
+
+
+
+ + + + + + + +
+

+February EmberTO Meet-up +

+
+ + +
+ +
    +
  • + + + +Feb 5, 2015 · 6:30 PM + +
  • + +
  • +
    + + +

    This location is shown only to members

    + +
    +
  • + +
+ + +
+ +

Hey Folks, 

+

We're trying new (read: bigger) venues on for size in 2015, starting with the wonderful new ExChange space in the BrightLane building for our February meet-up. 

+

This month we have our own Jorge Villalobos waxing on building faux-dynamic, SEO-friendly sites with Ember + Middleman, Precision Nutrition's Justin Giancola will be giving a lightning talk on using redis as a proxy when developing ember applications, and Taras Mankovski will be sharing some tips and tricks regarding Ember Table. 

+

Also, special thanks to Brightlane (an awesome new co-working facility) for donating their gorgeous new space to us for the evening as well! Check them out at http://brightlane.ca  

+

See you soon! And as another aside, sign up for the mailing list at http://torontoemberjs.com/to start getting the 411 of our meet-ups directly, including more in-depth insights into our speaker content and more info. on Toronto Ember happenings in 2015. 

+ +
+ +
+
+
+ + +
+

+Join or login to comment. +

+
+ + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
  • Peter C.

    Sorry, can't make it to this meetup. I'll see you all at the next one!

    February 2, 2015

  • + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  • Gianni C.

    hello i used ember once and i plan to do it again in the future

    8 · January 21, 2015

  • + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + + + + + +
+
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 55 went + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + +
    + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Meghann O. + +
    + + + + + + + + + +
    Event Host
    + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Eric B. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Jesse B. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Aidan N. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Phil S. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Mike + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Andy T. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Tasveer S. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Misha P. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Emerson L. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Zeus G. + + +1 + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Mina S. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Kerry + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Andydrew + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Brian G. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + K M Rakibul I. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Carsten N. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Richard C. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Taras M. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Robin W. + +
    + + + + +
    + Co-Organizer +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Natalie P. + + +1 + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Brennan M. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Justin G. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Tessa T. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Dan O. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Ian I. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Jorge V. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Mattia G. + +
    + + + + +
    + Organizer +
    + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Christophe­r M. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Joshua G. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Nate S. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Brenna O. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Gianni C. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Jaron A. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Joshua K. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + alen + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Adib S. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Irene + + +1 + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    + Kenneth B. + +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
  • + + + + +
  • + + +
    +
    + +
    +
    + A former member + +
    +
    + + + + + + +
  • + + + + +
  • + + +
    +
    + +
    +
    + A former member + +
    +
    + + + + + + +
  • + + + + +
  • + + +
    +
    + +
    +
    + A former member + +
    +
    + + + + + + +
  • + + + + +
  • + + +
    +
    + +
    +
    + A former member + +
    +
    + + + + + + +
  • + + + + +
  • + + +
    +
    + +
    +
    + A former member + +
    +
    + + + + + + +
  • + + + + +
  • + + +
    +
    + +
    +
    + A former member + +
    +
    + + + + + + +
  • + + + + +
  • + + +
    +
    + +
    +
    + A former member + +
    +
    + + + + + + +
  • + + + + +
  • + + +
    +
    + +
    +
    + A former member + +
    +
    + + + + + + +
  • + + + + +
  • + + +
    +
    + +
    +
    + A former member + +
    +
    + + + + + + +
  • + + + + +
  • + + +
    +
    + +
    +
    + A former member + +
    +
    + + + + + + +
  • + + + + +
  • + + +
    +
    + +
    +
    + A former member + +
    + +2 + + + + guests + + +
    + +
    +
    + + + + + + +
  • + +
+ + + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + +

+ +Toronto, + +ON + + +

+
+Founded +Feb 12, 2014
+
+ + +
+ +
+ + + +
+ +
+ + + + +

+ + + +Organizers: + + + +

+
+
+ + + +
+ + +Mattia Gheda, +Robin Ward and 2 more… + + +
+ + + + Contact + +
+
+
+
We're about:
+ +
+ + + + + + + + + + + + + + + +
+ + + + Open Source + · + + + + JavaScript + · + + + + Web Development + · + + + + JavaScript Libraries + · + + + + JavaScript Frameworks + · + + + + Front-end Development + · + + + + nodeJS + · + + + + Backbone.js + · + + + + Ember JS + · + + + + AngularJS + · + + + + JavaScript Applications + · + + + + Ember Data + + +
+ + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +

People in this
Meetup are also in:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + +
+ +

Sign up

+ + + +

Meetup members, Log in

+ +
+ +
+ +
+ + +
+ +
+
+or +
+
+ +
+ + + + + + + + + + + +
+ +
+ +
+
+ +
+

+By clicking "Sign up" or "Sign up using Facebook", you confirm that you accept our Terms of Service & Privacy Policy +

+
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spec/fixtures/onebox/meetup_oembed.response b/spec/fixtures/onebox/meetup_oembed.response new file mode 100644 index 0000000000000..567890fea0f97 --- /dev/null +++ b/spec/fixtures/onebox/meetup_oembed.response @@ -0,0 +1 @@ +{"title":"February EmberTO Meet-up","height":397,"width":308,"html":" + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+
+
+
+
+
+

ECMAScript 2015 : Deep Dive

+
+
+
+
+ +
+
+
+
+ +
+
+
+

+ David Leonard +

+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+

+ What I do: +

+
+
+
+
+

 

+
    +
  • +

    + + Grad Student at CCNY + +

    +
  • +
  • +

    + + Game Developer + +

    +
  • +
  • +

    + + Yahoo! Developer Network + +

    +
  • +
+
+
+
+
+ +
+
+
+

Why ES6?

+
+
+
+
+ +
+
+
+
+
+

+ Deep Dive +

+
+
+
+
+ +
+
+
+
+
    +
  • +

    Tooling 

    +
  • +
  • +

    Variables and Scoping

    +
  • +
  • +

    Strings

    +
  • +
  • +

    Destructuring

    +
  • +
  • +

    Parameter Handling

    +
  • +
  • +

    Arrow Functions

    +
  • +
  • +

    Classes

    +
  • +
  • +

    Modules

    +
  • +
  • +

    Generators

    +
  • +
  • +

    Promises

    +
  • +
+
+
+
+
+ +
+
+
+

Running ES6

+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+

Variables and Scoping

+
+
+

+ var vs. let / const +

+
+
+
+
+ +
+
+
+
+
var snack = 'Meow Mix';
+
+function getFood(food) {
+    if (food) {
+        var snack = 'Friskies';
+        return snack;
+    }
+    return snack;
+}
+
+getFood(false);
+
+
+ +
+
+ +
+
+
+
+
+
// undefined
+
+
+
+
Credit: https://github.com/venegu
+
+
+

+ var vs. let / const +

+
+
+
+
+ +
+
+
+
+
var snack = 'Meow Mix';
+
+function getFood(food) {
+    var snack;
+    
+    if (food) {
+        snack = 'Friskies';
+        return snack;
+    }
+    return snack;
+}
+
+getFood(false); 
+
+
+ + + +
+
+ +
+
+
+
+
+
+
// undefined
+
+
+

+ var vs. let / const +

+
+
+
+
+ +
+
+
+
+
let snack = 'Meow Mix';
+
+function getFood(food) {
+
+    if (food) {
+        let snack = 'Friskies';
+        return snack;
+    }
+    return snack;
+}
+
+getFood(false); 
+
+
+ +
+
+ +
+
+
+
+
// A
+
+
+
+
// B
+
+
+
+
+
// 'Meow Mix'
+
+
+
+
Credit: https://github.com/venegu
+
+
+

+ var vs. let / const +

+
+
+
+
+ +
+
+
+
+
let snack = 'Meow Mix';
+
+function getFood(food) {
+
+    if (food) {
+        let snack = 'Friskies';
+        return snack;
+    }
+    return snack;
+}
+
+getFood(false); 
+
+
+ +
+
+ +
+
+
+
+
// A
+
+
+
+
// B
+
+
+
+
+
// 'Meow Mix'
+
+
+
+
Credit: https://github.com/venegu
+
+
+

IIFE   > Blocks

+
+
+
+
+ +
+
+
+
+
(function () {  
+    var food = 'Meow Mix';
+}());  
+console.log(food);
+
+
+ +
+
+
+ +
+
+
+
+
// Reference Error
+
+
+

IIFE  > Blocks

+
+
+
+
+ +
+
+
+
+
{  
+    let food = 'Meow Mix';
+} 
+console.log(food); 
+
+
+ +
+
+
+ +
+
+
+
+
// Reference Error
+
+
+

Scoping

+
+
+
+
+ +
+
+ + + + + + +
+
function Person(name) {
+    this.name = name;
+}
+
+Person.prototype.prefixName = function (arr) {
+    return arr.map(function (character) {
+        return this.name + character;
+    });
+};
+
+
+
+ +
+
+
+
+
+
// Cannot read property 'name' of undefined
+
+
+
+
// A
+
+
+
+
// B
+
+
+
+ +
+
+ + + + + + +
+
function Person(name) {
+    this.name = name;
+}
+
+Person.prototype.prefixName = function (arr) {
+    var that = this;
+    return arr.map(function (character) {
+        return that.name + character;
+    });
+};
+
+
+
+ +
+
+
+
+
// Store this
+
+
+
+
+

Scoping

+
+
+
+
+ +
+
+ + + + + + +
+
function Person(name) {
+    this.name = name;
+}
+
+Person.prototype.prefixName = function (arr) {
+    return arr.map(function (character) {
+        return this.name + character;
+    }, this);
+}
+
+
+
+ +
+
+
+
+
+

Scoping

+
+
+
+
+ +
+
+ + + + + + +
function Person(name) {
+    this.name = name;
+}
+
+Person.prototype.prefixName = function (arr) {
+    return arr.map(function (character) {
+        return this.name + character;
+    }.bind(this));
+}
+
+
+ +
+
+
+
+
+

Scoping

+
+
+
+

Arrow Functions

+
+
+
+
+ +
+
+ + + + + + + + +
+
+ +
+
+
+
function Person(name) {
+    this.name = name;
+}
+
+Person.prototype.prefixName = function (arr) {
+    return arr.map((character) => this.name + character );
+}
+
+
+
+

Arrow Functions

+
+
+
+
+ +
+
+ + + + + + +
+
const arr = [1, 2, 3, 4, 5];
+const squares = arr.map(x => x * x);
+
+
+
const squares = arr.map(function (x) { return x * x });
+
+
+
+ +
+
+
+
+
// Function Expression
+
+
+
+
// Terse 
+
+
+

Strings

+
+
+
+

String.prototype.includes

+
+
+
+
+ +
+
+
+
+
var string = 'food';
+var substring = 'foo';
+console.log(string.indexOf(substring) > -1);
+
+
+ +
+
+
const string = 'food';
+const substring = 'foo';
+console.log(string.includes(substring)); 
+
+
+ + +
+
+ +
+
+
+
+
+
// true
+
+
+
// true
+
+
+

String.prototype.repeat

+
+
+
+
+ +
+
+
+
+
function repeat(string, count) {
+    var strings = [];
+    while(strings.length < count) {
+        strings.push(string);
+    }
+    return strings.join('');
+}
+
+
+
+
+
'meow'.repeat(3); 
+
+
+ +
+
+ +
+
+
+
+
// meowmeowmow
+
+
+

Template Literals: Escaping Characters

+
+
+
+
+ +
+
+
+
+
var text = "This string contains \"double quotes\" which are escaped."
+
+
+
+
+
 
+ +
let text = `This string contains "double quotes" which are escaped.`
+
+ +

 

+
+
+
+
+ +
+
+
+

Template Literals: Interpolation

+
+
+
+
+ +
+
+
+
+
const name = 'Tiger';
+const age = 13;
+console.log(`My cat is named ${name} and is ${age} years old.`);
+
+
+
+
var name = 'Tiger';
+var age = 13;
+console.log('My cat is named ' + name + ' and is ' + age + ' years old.');
+
+ + +
+
+ +
+
+
+
+
+
+
Credit: https://github.com/venegu
+
+
+

Template Literals: Multi-line Strings

+
+
+
+
+ +
+
+
+
var text = (
+  'cat\n' +
+  'dog\n' +
+  'nickelodeon'
+)
+
+
+
var text = [
+  'cat',
+  'dog',
+  'nickelodeon'
+].join('\n')
+
+
+
var text = (
+  `cat
+  dog
+  nickelodeon`
+)
+
+ + + +
+
+ +
+
+
+
+
+

Template Literals: Expressions

+
+
+
+
+ +
+
+
+
+
let today = new Date()
+let text = `The time and date is ${today.toLocaleString()}`
+
+
+
+
+ +
+
+ +
+
+
+
+

Template Literals: Multi-line Strings

+
+
+
+
+ +
+
+ + + + + + +
+
let book = {
+  title: 'Harry Potter and The Sorcercers Stone',
+  summary: 'Much magic. Such depth.',
+  author: 'J.K. Rowling'
+}
+
+let html = `<header>
+  <h1>${book.title}</h1>
+</header>
+<section>
+  <div>${book.summary}</div>
+  <div>${book.author}</div>
+</section>`
+
+
+
+ +
+
+
+
+
+
+

Destructuring

+
+
+
+

Destructuring

+
+
+
+
+ +
+
+ + + + + + +
+

+
var luke = { occupation: 'jedi', father: 'anakin' }
+var {occupation, father} = luke;
+console.log(occupation); // 'jedi'
+console.log(father); // 'anakin'
+
+
+
var [a, b] = [10, 20]
+console.log(a); // 10
+
+ +
console.log(b); // 20
+
+
+
+ +
+
+
+
+
+
+

Destructuring

+
+
+
+
+ +
+
+ + + + + + +
+
function getCoords () {
+  return {
+    x: 10,
+    y: 22
+  }
+}
+
+var {x, y} = getCoords()
+console.log(x); // 10
+console.log(y); // 22
+
+
+
+ +
+
+
+
+

Modules

+
+
+
+

Credit: https://www.flickr.com/photos/lucaohman/3473867313

+
+
+

Exporting in CommonJS

+
+
+
+
+ +
+
+ + + + + + +
+
module.exports = 1
+module.exports = { foo: 'bar' }
+module.exports = ['foo', 'bar']
+module.exports = function bar () {}
+
+
+
export default 1
+export default { foo: 'bar' }
+export default ['foo', 'bar']
+export default function bar () {}
+
+
+
+ +
+
+
+

Named Exports

+
+
+
+
+ +
+
+ + + + + + +
+
module.exports.name = 'David';
+module.exports.age = 25;
+
+
+
export var name = 'David';
+export var age  = 25;​​
+
+
+
+ +
+
+
+

Exporting in ES6

+
+
+
+
+ +
+
+ + + + + + +
+
// math/addition.js
+function sumTwo(a, b) {
+    return a + b;
+}
+
+function sumThree(a, b) {
+    return a + b + c;
+}
+
+
+
+
+
+
+ +
+
+
+
export { sumTwo, sumThree };
+
+
+

Exporting in ES6

+
+
+
+
+ +
+
+ + + + + + +
+
export function sumTwo(a, b) {
+    return a + b;
+}
+
+export function sumThree(a, b) {
+    return a + b + c;
+}
+
+
+
+ +
+
+
+
+
+

Exporting default bindings

+
+
+
+
+ +
+
+ + + + + + +
+
function sumTwo(a, b) {
+    return a + b;
+}
+
+function sumThree(a, b) {
+    return a + b + c;
+}
+
+
+
+
+
+ +
+
+
+
var api = {
+    sumTwo  : sumTwo,
+    sumThree: sumThree
+}
+
+
+
export default api
+
+
+

Importing Modules

+
+
+
+
+ +
+
+ + + + + + +
+
var _ = require('underscore');​
+
+
+
import _ from 'underscore';
+
+
+
import { sumTwo, sumThree } from 'math/addition'
+
+
+
import { 
+  sumTwo as addTwoNumbers, 
+  sumThree as sumThreeNumbers} from
+} from 'math/addition'
+
+
+
import * as util from 'math/addition'
+
+
+
+ +
+
+
+
+
+
+

Parameters

+
+
+
+

Default Parameters

+
+
+
+
+ +
+
+ + + + + + +
+
function addTwoNumbers(x, y) {
+    x = x || 0;
+    y = y || 0;
+    return x + y;
+}
+
+
+
function addTwoNumbers(x=0, y=0) {
+    return x + y;
+}
+
+
+
+
+ +
+
+
+
+
+
+
addTwoNumbers(2, 4); // 6
+addTwoNumbers(2); // 2
+addTwoNumbers(); // 0
+
+
+

Rest Parameters

+
+
+
+
+ +
+
+ + + + + + +
+
function logArguments() {
+    for (var i=0; i < arguments.length; i++) {
+        console.log(arguments[i]);
+    }
+}
+
+
+
function logArguments(...args) {
+    for (let arg of args) {
+        console.log(arg);
+    }
+}
+
+
+
+ +
+
+
+
+
+

Named Parameters

+
+
+
+
+ +
+
+ + + + + + +
+
function initializeCanvas(options) {
+    var height = options.height || 600;
+    var width  = options.width  || 400;
+    var lineStroke = options.lineStroke || 'black';
+}
+
+
+
function initializeCanvas(
+    { height=600, width=400, lineStroke='black'}) {
+        ...
+    }
+
+
+
+ +
+
+
+
+
+
+
function initializeCanvas(
+    { height=600, width=400, lineStroke='black'} = {}) {
+        ...
+    }
+
+
+
+

Spread Operator

+
+
+
+
+ +
+
+ + + + + + +
+
Math.max(...[-1, 100, 9001, -32]) // 9001
+
+ +
+
var arr = [1, ...[2,3], 4];
+console.log(arr); // [1, 2, 3, 4]
+
+
+
+ +
+
+
+
+
var arr1 = [0, 1, 2];
+var arr2 = [3, 4, 5];
+arr1.push(...arr2);
+
+
+

Classes

+
+
+
+

Base Classes

+
+
+
+
+ +
+
+ + + + + + + + +
+
function Person(name, age, gender) {
+    this.name   = name;
+    this.age    = age;
+    this.gender = gender;
+}
+
+Person.prototype.incrementAge = function () {
+    return this.age += 1;
+};
+
+
+
+ +
+
+
+
+
+

Extended Classes

+
+
+
+
+ +
+
+ + + + + + + + +
+
function Personal(name, age, gender, occupation, hobby) {
+    Person.call(this, name, age, gender);
+    this.occupation = occupation;
+    this.hobby = hobby;
+}
+
+Personal.prototype = Object.create(Person.prototype);
+Personal.prototype.constructor = Personal;
+Personal.prototype.incrementAge = function () {
+    return Person.prototype.incrementAge.call(this) += 1;
+}
+
+
+
+ +
+
+
+
+
+
+
+
+
+

Base Classes in ES6

+
+
+
+
+ +
+
+ + + + + + + + +
+
class Person {
+    constructor(name, age, gender) {
+        this.name   = name;
+        this.age    = age;
+        this.gender = gender;
+    }
+    
+    incrementAge() {
+      this.age += 1;
+    }
+}
+
+
+
+ +
+
+
+
+
+

Extended Classes in ES6

+
+
+
+
+ +
+
+ + + + + + + + +
+
class Personal extends Person {
+    constructor(name, age, gender, occupation, hobby) {
+      super(name, age, gender);
+      this.occupation = occupation;
+      this.hobby = hobby;
+    }
+    
+    incrementAge() {
+      super.incrementAge();
+      this.age += 20;
+      console.log(this.age);
+    }
+}
+
+
+
+ +
+
+
+
+
+
+
+
// Calls parent incrementAge()
+
+
+

Symbols

+
+
+
+

Unique Property Keys

+
+
+
+
+ +
+
+ + + + + + + + +
+
const key = Symbol();
+const keyTwo = Symbol();
+const object = {};
+
+
+
+
+ +
+
+
+
>> key === keyTwo 
+>> false
+
+
+
object.key = 'Such magic.';
+object.keyTwo = 'Much Uniqueness'
+
+
+

Symbols as Concepts

+
+
+
+
+ +
+
+ + + + + + + + +
+
const anakin = 'jedi';
+const yoda   = 'jedi master';
+const luke   = 'jedi';
+
+
+
+
+ +
+
+
+
const anakin = Symbol();
+const yoda   = Symbol();
+const luke   = Symbol();
+
+
+

Maps

+
+
+
+

(Hash) Maps in ES5

+
+
+
+
+ +
+
+ + + + + + + + +
+
+ +
+
+
+
var map = new Object();
+map[key1] = 'value1';
+map[key2] = 'value2';
+
+

Seems functional, right...?

+
+
+

Get Own Properties

+
+
+
+
+ +
+
+ + + + + + + + +
+
+ +
+
+
+
function getOwnProperty(object, propertyKey) {
+    return (object.hasOwnProperty(propertyKey) ? object[propertyKey]: undefined);
+}
+
+
+
+

We should be safe...right?

+
+
+
+ +
+
+ + + + + + + + +
+
+ +
+
+
+
> getOwnProperty({ hasOwnProperty: 'Hah, overwritten'}, 'Pwned');
+> TypeError: Propery 'hasOwnProperty' is not a function
+
+
+
+
+
+

Credit: http://memesvault.com/nooo-meme-darth-vader/

+
+

Second time is the charm.

+
+
+
+ +
+
+ + + + + + + + +
+
+ +
+
+
+
function getOwnProperty(object, propertyKey) {
+    return (Object.prototype.hasOwnProperty(object, propertyKey) ? object[propertyKey]: undefined);
+}
+
+
+
+

credit: http://deloiz.blogspot.com/2014/01/Pusheen.html

+
+
+

Maps in ES6

+
+
+
+
+ +
+
+ + + + + + + + +
+
+ +
+
+
+
let map = new Map();
+> map.set('name', 'david');
+> map.get('name'); // david
+> map.has('name'); // true
+
+
+
+
+
+
+
+
// key
+
+
+
+
// value
+
+
+
+

Keys can be more than strings!

+
+
+

Arbitrary values as keys

+
+
+
+
+ +
+
+ + + + + + + + +
+
+ +
+
+
+
let map = new Map([
+    ['name', 'david'],
+    [true, 'false'],
+    [1, 'one'],
+    [{}, 'object'],
+    [function () {}, 'function']
+]);
+
+
+
+
+
+
+
+
+
for (let key of map.keys()) {
+    console.log(typeof key);
+    // > string, boolean, number, object, function
+};
+
+
+

.entries( )

+
+
+
+
+ +
+
+ + + + + + + + +
+
+ +
+
+
+
for (let entry of map.entries()) {
+  console.log(entry[0], entry[1]);
+}
+
+
+
for (let [key, value] of map.entries()) {
+  console.log(key, value);
+}
+
+
+
+
+

WeakMaps

+
+
+
+

Classes 101

+
+
+
+
+ +
+
+ + + + + + + + +
+
+ +
+
+
+
class Person {
+    constructor(age) {
+        this.age = age;
+    }
+    
+    incrementAge() {
+      this.age += 1;
+    }
+}
+
+

Private data?

+
+
+

Naming Conventions

+
+
+
+
+ +
+
+ + + + + + + + +
+
+ +
+
+
+
class Person {
+    constructor(age) {
+        this._age = age;
+    }
+    
+    _incrementAge() {
+      this._age += 1;
+    }
+}
+
+
+
+
+

WeakMaps to the rescue!

+
+
+

(Maybe they're not so weak)

+
+
+

WeakMaps for Privacy

+
+
+
+
+ +
+
+ + + + + + + + +
+
+ +
+
+
+
let _age = new WeakMap();
+class Person { 
+  constructor(age) {
+    _age.set(this, age);
+  }
+
+  incrementAge() {
+    let age = _age.get(this);
+      if(age > 90) {
+        console.log('Midlife crisis');
+      }
+  }
+}
+
+
+
> const person = new Person(90);
+> person.incrementAge(); // 'Midlife crisis'
+> Reflect.ownKeys(person); // []
+
+ +

 

+
+
+
+
+
+
+
credit: http://wildermuth.com/images/pinky-promise_2.jpg
+
+
+

Promises

+
+
+

Callback Hell

+
+
+
+
+ +
+
+ + + + + + + + +
+
func1(function (value1) {
+  func2(value1, function(value2) {
+    func3(value2, function(value3) {
+      func4(value3, function(value4) {
+        func5(value4, function(value5) {
+          // Do something with value 5
+        });
+      });
+    });
+  });
+});
+
+
+
+ +
+
+
+
+
+
+

D

+ +

O

+ +

O

+ +

M

+
+
+

Promises

+
+
+
+
+ +
+
+ + + + + + + + +
+
func1(value1)
+  .then(func2(value1) { })
+  .then(func3(value2) { })
+  .then(func4(value3) { })
+  .then(func5(value4) { 
+    // Do something with value 5 
+  });
+
+
+
+ +
+
+
+
+

Promises

+
+
+
+
+ +
+
+ + + + + + + + +
+
+
+
+ +
+
+
+

Promises

+
+
+
+
+ +
+
+ + + + + + + + +
+
new Promise(resolve => resolve(data))
+    .then(result => console.log(data));
+
+
+
+
+new Promise((resolve, reject) => 
+    reject(new Error('Failed to fufill Promise')))
+    .catch(reason => console.log(reason));
+
+
+
+ +
+
+
+
+
+
+
+

Promises

+
+
+
+
+ +
+
+ + + + + + + + +
+
+ +
+
+
+
+

Promises

+
+
+
+
+ +
+
+ + + + + + + + +
+
var fetchJSON = function(url) {  
+  return new Promise((resolve, reject) => {
+    $.getJSON(url)
+      .done((json) => resolve(json))
+      .fail((xhr, status, err) => reject(status + err.message));
+  });
+}
+
+
+
+ +
+
+
+
+
+
+
+
+
+

Parallelizing using Promises

+
+
+
+
+ +
+
+ + + + + + + + +
+
var urls = [ 
+  'http://www.api.com/items/1234',
+  'http://www.api.com/items/4567'
+];
+
+var urlPromises = urls.map(fetchJSON);
+
+Promise.all(urlPromises)  
+  .then(function(results) {
+     results.forEach(function(data) {
+     });
+  })
+  .catch(function(err) {
+    console.log("Failed: ", err);
+  });
+
+
+
+
+
+
+

Generators

+
+
+

Syntax

+
+
+
+
+ +
+
+ + + + + + + + +
+
function* sillyGenerator() {
+    yield 1;
+    yield 2;
+    yield 3;
+    yield 4;
+}
+
+
+
var generator = sillyGenerator();
+var value = generator.next();
+> console.log(value); // { value: 1, done: false }
+> console.log(value); // { value: 2, done: false }
+> console.log(value); // { value: 3, done: false }
+> console.log(value); // { value: 4, done: false }
+
+
+
+
+
+

What about using return?

+
+
+

Return in a Generator

+
+
+
+
+ +
+
+ + + + + + + + +
+
function* sillyGenerator() {
+    yield 1;
+    yield 2;
+    yield 3;
+    yield 4;
+    return 5;
+}
+
+for(let val of sillyGenerator()) {
+    console.log(val); // 1, 2, 3, 4
+} 
+
+
+
+
+

Real Generator Function

+
+
+
+
+ +
+
+ + + + + + + + +
+
function* factorial(){
+  let [current, total] = [0, 1];
+
+  while (true){
+    yield total;
+    current++;
+    total = total * current;
+  }
+}
+
+for (let n of factorial()) {
+  console.log(n); 
+  if(n >= 100000) {
+    break;
+  }
+}
+
+
+
+
+
+

Writing Sync-Async 

+
+
+
+
+ +
+
+ + + + + + + + +
+
function request(url) {
+    getJSON(url, function(response) {
+        generator.next(response);
+    });
+}
+
+function* getData() {
+    var entry1 = yield request('http://some_api/item1');
+    var data1  = JSON.parse(entry1);
+    var entry2 = yield request('http://some_api/item2');
+    var data2  = JSON.parse(entry2);
+}
+
+
+
+
+
+

Not without problems though...

+
+
+

 

+ +
    +
  • +

    How do we handle errors?

    +
  • +
  • +

    getJSON not in control

    +
  • +
  • +

    Parallelize?

    +
  • +
+
+
+
+
+ +
+
+
+

Generators & Promises

+
+
+
+
+ +
+
+ + + + + + + + +
+
function request(url) {
+    return new Promise((resolve, reject) => {
+        getJSON(url, resolve);
+    });
+}
+
+
+
+

Generators & Promises

+
+
+
+
+ +
+
+ + + + + + + + +
+
function iterateGenerator(gen) {
+    var generator = gen();
+    var ret;
+    (function iterate(val) {
+        ret = generator.next();
+        if(!ret.done) {
+            ret.value.then(iterate);
+        } else {
+            setTimeout(function() {
+                iterate(ret.value);
+            });
+        }
+    })(); 
+}
+
+
+
+
+
+
+

Generators & Promises

+
+
+
+
+ +
+
+ + + + + + + + +
+
iterateGenerator(function* getData() {
+  var entry1 = yield request('http://some_api/item1');
+  var data1  = JSON.parse(entry1);
+  var entry2 = yield request('http://some_api/item2');
+  var data2  = JSON.parse(entry2);
+});
+
+

Alternate Solution?

+
+
+

Beyond ES6

+
+
+

Async / Await (ES7)

+
+
+
+
+ +
+
+ + + + + + + + +
+
var request = require('request');
+ 
+function getJSON(url) {
+
+  request(url, function(error, response, body) {
+    return body;
+  });
+}
+ 
+function main() {
+  var data = getJSON('http://some_api/item1');
+  console.log(data); // Undefined
+}
+ 
+main();
+
+
+
+
+
+
+
+

Async / Await (ES7)

+
+
+
+
+ +
+
+ + + + + + + + +
+
var request = require('request');
+ 
+function getJSON(url) {
+  return new Promise(function(resolve, reject) {
+    request(url, function(error, response, body) {
+      resolve(body);
+    });
+  });
+}
+ 
+async function main() {
+  var data = await getJSON();
+  console.log(data); // NOT undefined!
+}
+ 
+main();
+console.log('The data is: ');
+
+
+
+
+
+
+

Thank you everyone!

+
+ + + + +
+
+
+
+
+ +
+ +
+ +
+
+
+

ECMAScript 2015

+

By David Leonard

+
+
+ +
+
+
+

+

+
+
+ +
+ +
+
+ + + + +
+ + + +
+ +
+
+

ECMAScript 2015

+

An overview of ES6 features.

+
    +
  • + + +
  • +
  • + + +
  • +
  • + + 3,451 +
  • +
+
+ + + +
+
+
+ +
+
Loading comments...
+
+ +
+

More from David Leonard

+ +
+ +
+ +
+ + +
+ + + + + + + + + + diff --git a/spec/fixtures/onebox/stackexchange-answer.response b/spec/fixtures/onebox/stackexchange-answer.response new file mode 100644 index 0000000000000..b3426fd2deb6a --- /dev/null +++ b/spec/fixtures/onebox/stackexchange-answer.response @@ -0,0 +1 @@ +{"items":[{"tags":["c","deobfuscation"],"owner":{"profile_image":"https://www.gravatar.com/avatar/4af3541c00d591e9a518b9c0b3b1190a?s=128&d=identicon&r=PG","display_name":"dasblinkenlight","link":"http://stackoverflow.com/users/335858/dasblinkenlight"},"last_activity_date":1461433376,"creation_date":1375356813,"answer_id":17992906,"link":"http://stackoverflow.com/questions/17992553/concept-behind-these-four-lines-of-tricky-c-code/17992906#17992906","title":"Concept behind these four lines of tricky C code"}],"has_more":false,"quota_max":300,"quota_remaining":291} \ No newline at end of file diff --git a/spec/fixtures/onebox/stackexchange-question.response b/spec/fixtures/onebox/stackexchange-question.response new file mode 100644 index 0000000000000..52bcff8b246e3 --- /dev/null +++ b/spec/fixtures/onebox/stackexchange-question.response @@ -0,0 +1 @@ +{"items":[{"tags":["c","deobfuscation"],"owner":{"profile_image":"https://www.gravatar.com/avatar/a19d396231d67d604c92866b90fe723d?s=128&d=identicon&r=PG","display_name":"codeslayer1","link":"http://stackoverflow.com/users/2547190/codeslayer1"},"last_activity_date":1461433376,"creation_date":1375355768,"question_id":17992553,"link":"http://stackoverflow.com/questions/17992553/concept-behind-these-four-lines-of-tricky-c-code","title":"Concept behind these four lines of tricky C code"}],"has_more":false,"quota_max":300,"quota_remaining":292} \ No newline at end of file diff --git a/spec/fixtures/onebox/twitterstatus.response b/spec/fixtures/onebox/twitterstatus.response new file mode 100644 index 0000000000000..8bb442d5d8edc --- /dev/null +++ b/spec/fixtures/onebox/twitterstatus.response @@ -0,0 +1,2814 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Vyki Englert on Twitter: "I'm a sucker for pledges. @Peers Pledge #sharingeconomy http://t.co/T4Sc47KAzh" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ +
    +
  • +

    Add a location to your Tweets

    +

    + When you tweet with a location, Twitter stores that location. + You can switch location on/off before each Tweet and always have the option to delete your location history. + Learn more +

    +
    + + +
    +
  • +
+
+ +
+ +
+
+ +
+
+ + +
+
+
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + diff --git a/spec/fixtures/onebox/twitterstatus_quoted.response b/spec/fixtures/onebox/twitterstatus_quoted.response new file mode 100644 index 0000000000000..e1c12efe70f94 --- /dev/null +++ b/spec/fixtures/onebox/twitterstatus_quoted.response @@ -0,0 +1,7199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Metallica en Twitter: "Thank you to everyone who came out for #MetInParis last night for helping us support @EMMAUSolidarite & @PompiersParis. #AWMH #MetalicaGivesBack… https://t.co/00ZbffUluP" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Saltar al contenido + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + +
    +
    + +
      +
    • +

      Twittear con la ubicación

      +

      + Puedes agregar la información de ubicación a tus Tweets, como tu ciudad o tu ubicación exacta, desde la web y a través de aplicaciones de terceros. Siempre tendrás la opción de eliminar el historial de ubicaciones de tus Tweets. + Más información +

      +
      + + +
      +
    • +
    +
    + +
    + +
    +
    + +
    +
    + + +
    +
    +
      +
      +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spec/fixtures/onebox/video.response b/spec/fixtures/onebox/video.response new file mode 100644 index 0000000000000000000000000000000000000000..abe11ec5c4e026cc6cf5dae9c0a55ddb8f274a06 GIT binary patch literal 617665 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

      Ejoq9!sG{HTbE^lNiz;t5N5HBqnSt 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 }8Q< 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
      HQ1FNN0^%jeMK`9`NU#4@3&}iN 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 AE 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Βy%$h_y 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 A1poj5 literal 0 HcmV?d00001 diff --git a/spec/fixtures/onebox/wikimedia.response b/spec/fixtures/onebox/wikimedia.response new file mode 100644 index 0000000000000..3481ce93a45d7 --- /dev/null +++ b/spec/fixtures/onebox/wikimedia.response @@ -0,0 +1 @@ +{"batchcomplete":"","query":{"normalized":[{"from":"File:Stones_members_montage2.jpg","to":"File:Stones members montage2.jpg"}],"pages":{"-1":{"ns":6,"title":"File:Stones members montage2.jpg","missing":"","known":"","imagerepository":"shared","imageinfo":[{"timestamp":"2010-12-07T23:13:30Z","user":"84user","thumburl":"https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Stones_members_montage2.jpg/500px-Stones_members_montage2.jpg","thumbwidth":500,"thumbheight":459,"url":"https://upload.wikimedia.org/wikipedia/commons/a/af/Stones_members_montage2.jpg","descriptionurl":"https://commons.wikimedia.org/wiki/File:Stones_members_montage2.jpg","descriptionshorturl":"https://commons.wikimedia.org/w/index.php?curid=12245228"}]}}}} \ No newline at end of file diff --git a/spec/fixtures/onebox/wikipedia.response b/spec/fixtures/onebox/wikipedia.response new file mode 100644 index 0000000000000..3eb69cadd58fd --- /dev/null +++ b/spec/fixtures/onebox/wikipedia.response @@ -0,0 +1,566 @@ + + + + +Billy Jack - Wikipedia, the free encyclopedia + + + + + + + + + + + + + + + + + + + + + + +
      +
      +
      +
      +

      Navigation menu

      +
      + +
      + + +
      +
      + + + +
      +
      + +
      + + + + + + + diff --git a/spec/fixtures/onebox/wikipediaredirected.response b/spec/fixtures/onebox/wikipediaredirected.response new file mode 100644 index 0000000000000..3c2f11c7c6ee1 --- /dev/null +++ b/spec/fixtures/onebox/wikipediaredirected.response @@ -0,0 +1,899 @@ + + + +Ruby - Wikipedia, the free encyclopedia + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      +

      Ruby

      +
      +
      From Wikipedia, the free encyclopedia
      +
      +
      + Jump to: navigation, search +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Ruby
      Ruby - Winza, Tanzania.jpg
      +
      Natural ruby crystals from Winza, Tanzania
      +
      General
      CategoryMineral variety
      Formula
      +(repeating unit)
      aluminium oxide with chromium, Al2O3:Cr
      Identification
      ColorRed, may be brownish, purplish, or pinkish
      Crystal habitVaries with locality. Terminated tabular hexagonal prisms.
      Crystal systemTrigonal (Hexagonal Scalenohedral), symbol (−3 2/m), space group R3c
      CleavageNo true cleavage
      FractureUneven or conchoidal
      Mohs scale hardness9.0
      LusterVitreous
      Streakwhite
      Diaphaneitytransparent
      Specific gravity4.0
      Refractive indexnω=1.768–1.772
      +nε=1.760–1.763
      Birefringence0.008
      PleochroismOrangey red, purplish red
      Ultraviolet fluorescencered under longwave
      Melting point2044 °C
      Solubilitynone
      Major varieties
      SapphireAny color except shades of red
      Corundumvarious colors
      EmeryGranular
      +

      A ruby is a pink to blood-red colored gemstone, a variety of the mineral corundum (aluminium oxide). The red color is caused mainly by the presence of the element chromium. Its name comes from ruber, Latin for red. Other varieties of gem-quality corundum are called sapphires. The ruby is considered one of the four precious stones, together with the sapphire, the emerald, and the diamond.[1]

      +

      Prices of rubies are primarily determined by color. The brightest and most valuable "red" called pigeon blood-red, commands a large premium over other rubies of similar quality. After color follows clarity: similar to diamonds, a clear stone will command a premium, but a ruby without any needle-like rutile inclusions may indicate that the stone has been treated. Cut and carat (weight) are also an important factor in determining the price.

      + +

      Physical properties[edit]

      +
      +
      +
      +
      +Crystal structure of ruby
      +
      +
      +

      Rubies have a hardness of 9.0 on the Mohs scale of mineral hardness. Among the natural gems only moissanite and diamond are harder, with diamond having a Mohs hardness of 10.0 and moissonite falling somewhere in between corundum (ruby) and diamond in hardness. Ruby is α-alumina (the most stable form of Al2O3) in which a small fraction of the aluminium3+ ions are replaced by chromium3+ ions. Each Cr3+ is surrounded octahedrally by six O2- ions. This crystallographic arrangement strongly affects each Cr3+, resulting in light absorption in the yellow-green region of the spectrum and thus in the red color of the gem. When yellow-green light is absorbed by Cr3+, it is re-emitted as red luminescence.[2] This red emission adds to the red color perceived by the subtraction of green and violet light from white light, and adds luster to the gem's appearance. When the optical arrangement is such that the emission is stimulated by 694-nanometer photons reflecting back and forth between two mirrors, the emission grows strongly in intensity. This effect was used by Theodore Maiman in 1960 to make the first successful laser, based on ruby.

      +

      All natural rubies have imperfections in them, including color impurities and inclusions of rutile needles known as "silk". Gemologists use these needle inclusions found in natural rubies to distinguish them from synthetics, simulants, or substitutes. Usually the rough stone is heated before cutting. Almost all rubies today are treated in some form, with heat treatment being the most common practice. However, rubies that are completely untreated but still of excellent quality command a large premium.

      +

      Some rubies show a three-point or six-point asterism or "star". These rubies are cut into cabochons to display the effect properly. Asterisms are best visible with a single-light source, and move across the stone as the light moves or the stone is rotated. Such effects occur when light is reflected off the "silk" (the structurally oriented rutile needle inclusions) in a certain way. This is one example where inclusions increase the value of a gemstone. Furthermore, rubies can show color changes—though this occurs very rarely—as well as chatoyancy or the "cat's eye" effect.

      +

      Color[edit]

      +

      Generally, gemstone-quality corundum in all shades of red, including pink, are called rubies.[3][4] However, in the United States, a minimum color saturation must be met to be called a ruby, otherwise the stone will be called a pink sapphire.[3] This distinction between rubies and pink sapphires is relatively new, having arisen sometime in the 20th century. If a distinction is made, the line separating a ruby from a pink sapphire is not clear and highly debated.[5] As a result of the difficulty and subjectiveness of such distinctions, trade organizations such as the International Colored Gemstone Association (ICA) have adopted the broader definition for ruby which encompasses its lighter shades, including pink.[6][7]

      +

      Natural occurrence[edit]

      +

      The Mogok Valley in Upper Myanmar (Burma) was for centuries the world's main source for rubies. That region has produced some of the finest rubies ever mined, but in recent years very few good rubies have been found there. The very best color in Myanmar rubies is sometimes described as "pigeon's blood." In central Myanmar, the area of Mong Hsu began producing rubies during the 1990s and rapidly became the world's main ruby mining area. The most recently found ruby deposit in Myanmar is in Namya (Namyazeik) located in the northern state of Kachin.

      +

      Rubies have historically been mined in Thailand, the Pailin and Samlout District of Cambodia, Burma, India, Afghanistan and in Pakistan. In Sri Lanka, lighter shades of rubies (often "pink sapphires") are more commonly found. After the Second World War ruby deposits were found in Tanzania, Madagascar, Vietnam, Nepal, Tajikistan, and Pakistan.

      +

      A few rubies have been found in the U.S. states of Montana, North Carolina, South Carolina and Wyoming. While searching for aluminous schists in Wyoming, geologist Dan Hausel noted an association of vermiculite with ruby and sapphire and located six previously undocumented deposits.[8]

      +

      More recently, large ruby deposits have been found under the receding ice shelf of Greenland.

      +

      Republic of Macedonia is the only country in mainland Europe to have naturally occurring rubies. They can mainly be found around the city of Prilep. Macedonian ruby has a unique raspberry color.

      +

      In 2002 rubies were found in the Waseges River area of Kenya. There are reports of a large deposit of rubies found in 2009 in Mozambique, in Nanhumbir in the Cabo Delgado district of Montepuez.[9]

      +

      Spinel, another red gemstone, is sometimes found along with rubies in the same gem gravel or marble. Red spinel may be mistaken for ruby by those lacking experience with gems. However, the finest red spinels can have a value approaching that of the average ruby.[10] The color of rubies varies from vermilion to red. The most desired color is "pigeon's blood", which is pure red with a hint of blue. If the color is too pink, the stone is a pink sapphire. The same is true if it is too violet – it is a violet sapphire. The best rubies and star rubies are bright red. Most rubies come from Burma and Thailand.

      +

      Factors affecting value[edit]

      +

      Diamonds are graded using criteria that have become known as the four Cs, namely color, cut, clarity and carat weight. Similarly natural rubies can be evaluated using the four Cs together with their size and geographic origin.

      +

      Color: In the evaluation of colored gemstones, color is the single most important factor. Color divides into three components; hue, saturation and tone. Hue refers to "color" as we normally use the term. Transparent gemstones occur in the following primary hues: red, orange, yellow, green, blue, violet. These are known as pure spectral hues.[11] In nature there are rarely pure hues so when speaking of the hue of a gemstone we speak of primary and secondary and sometimes tertiary hues. In ruby the primary hue must be red. All other hues of the gem species corundum are called sapphire. Ruby may exhibit a range of secondary hues. Orange, purple, violet and pink are possible.

      + +

      The finest ruby is best described as being a vivid medium-dark toned red. Secondary hues add an additional complication. Pink, orange, and purple are the normal secondary hues in ruby. Of the three, purple is preferred because, firstly, the purple reinforces the red making it appear richer.[11] Secondly, purple occupies a position on the color wheel halfway between red and blue. In Burma where the term pigeon blood originated, rubies are set in pure gold. Pure gold is itself a highly saturated yellow. Set a purplish-red ruby in yellow and the yellow neutralizes its complement blue leaving the stone appearing to be pure red in the setting.[citation needed]

      +

      Treatments and enhancements[edit]

      +

      Improving the quality of gemstones by treating them is common practice. Some treatments are used in almost all cases and are therefore considered acceptable. During the late 1990s, a large supply of low-cost materials caused a sudden surge in supply of heat-treated rubies, leading to a downward pressure on ruby prices.

      +

      Improvements used include color alteration, improving transparency by dissolving rutile inclusions, healing of fractures (cracks) or even completely filling them.

      +

      The most common treatment is the application of heat. Most, if not all, rubies at the lower end of the market are heat treated on the rough stones to improve color, remove purple tinge, blue patches and silk. These heat treatments typically occur around temperatures of 1800 °C (3300 °F).[12] Some rubies undergo a process of low tube heat, when the stone is heated over charcoal of a temperature of about 1300 °C (2400 °F) for 20 to 30 minutes. The silk is only partially broken as the color is improved.

      +

      Another treatment, which has become more frequent in recent years, is lead glass filling. Filling the fractures inside the ruby with lead glass (or a similar material) dramatically improves the transparency of the stone, making previously unsuitable rubies fit for applications in jewelry.[13] The process is done in four steps:

      +
        +
      1. The rough stones are pre-polished to eradicate all surface impurities that may affect the process
      2. +
      3. The rough is cleaned with hydrogen fluoride
      4. +
      5. The first heating process during which no fillers are added. The heating process eradicates impurities inside the fractures. Although this can be done at temperatures up to 1400 °C (2500 °F) it most likely occurs at a temperature of around 900 °C (1600 °F) since the rutile silk is still intact.
      6. +
      7. The second heating process in an electrical oven with different chemical additives. Different solutions and mixes have shown to be successful, however mostly lead-containing glass-powder is used at present. The ruby is dipped into oils, then covered with powder, embedded on a tile and placed in the oven where it is heated at around 900 °C (1600 °F) for one hour in an oxidizing atmosphere. The orange colored powder transforms upon heating into a transparent to yellow-colored paste, which fills all fractures. After cooling the color of the paste is fully transparent and dramatically improves the overall transparency of the ruby.[14]
      8. +
      +

      If a color needs to be added, the glass powder can be "enhanced" with copper or other metal oxides as well as elements such as sodium, calcium, potassium etc.

      +

      The second heating process can be repeated three to four times, even applying different mixtures.[15] When jewelry containing rubies is heated (for repairs) it should not be coated with boracic acid or any other substance, as this can etch the surface; it does not have to be "protected" like a diamond.

      +

      The treatment can easily be determined using a 10x loupe and determination focuses on finding bubbles either in the cavities or in the fractures that were filled with glass.[16]

      +

      Synthetic and imitation rubies[edit]

      +
      +
      +
      +
      +
      +
      +
      +
      Artificial ruby under a normal light (top) and under a green laser light (bottom). Red light is emitted
      +
      +
      +
      +

      In 1837 Gaudin made the first synthetic rubies by fusing potash alum at a high temperature with a little chromium as a pigment. In 1847 Ebelmen made white sapphire by fusing alumina in boric acid. In 1877 Frenic and Freil made crystal corundum from which small stones could be cut. Frimy and Auguste Verneuil manufactured artificial ruby by fusing BaF2 and Al2O3 with a little chromium at red heat. In 1903 Verneuil announced he could produce synthetic rubies on a commercial scale using this flame fusion process.[17] By 1910, Verneuil's laboratory had expanded into a 30 furnace production facility, with annual gemstone production having reached 1,000 kilograms (2,000 lb) in 1907.

      +

      Other processes in which synthetic rubies can be produced are through Czochralski's pulling process, flux process, and the hydrothermal process. Most synthetic rubies originate from flame fusion, due to the low costs involved. Synthetic rubies may have no imperfections visible to the naked eye but magnification may reveal curves, striae and gas bubbles. The fewer the number and the less obvious the imperfections, the more valuable the ruby is; unless there are no imperfections (i.e., a "perfect" ruby), in which case it will be suspected of being artificial. Dopants are added to some manufactured rubies so they can be identified as synthetic, but most need gemological testing to determine their origin.

      +

      Synthetic rubies have technological uses as well as gemological ones. Rods of synthetic ruby are used to make ruby lasers and masers. The first working laser was made by Theodore H. Maiman in 1960[18] at Hughes Research Laboratories in Malibu, California, beating several research teams including those of Charles H. Townes at Columbia University, Arthur Schawlow at Bell Labs,[19] and Gould at a company called TRG (Technical Research Group). Maiman used a solid-state light-pumped synthetic ruby to produce red laser light at a wavelength of 694 nanometers (nm). Ruby lasers are still in use. Rubies are also used in applications where high hardness is required such as at wear exposed locations in modern mechanical clockworks, or as scanning probe tips in a coordinate measuring machine.

      +

      Imitation rubies are also marketed. Red spinels, red garnets, and colored glass have been falsely claimed to be rubies. Imitations go back to Roman times and already in the 17th century techniques were developed to color foil red—by burning scarlet wool in the bottom part of the furnace—which was then placed under the imitation stone.[20] Trade terms such as balas ruby for red spinel and rubellite for red tourmaline can mislead unsuspecting buyers. Such terms are therefore discouraged from use by many gemological associations such as the Laboratory Manual Harmonisation Committee (LMHC).

      +

      Records and famous rubies[edit]

      + +
        +
      • The Smithsonian's National Museum of Natural History in Washington, D.C. has received one of the world's largest and finest ruby gemstones. The 23.1 carats (4.6 g) Burmese ruby, set in a platinum ring with diamonds, was donated by businessman and philanthropist Peter Buck in memory of his late wife Carmen Lúcia. This gemstone displays a richly saturated red color combined with an exceptional transparency. The finely proportioned cut provides vivid red reflections. The stone was mined from the Mogok region of Burma (now Myanmar) in the 1930s.[21]
      • +
      • In 2007 the London jeweler Garrard & Co featured on their website a heart-shaped 40.63-carat ruby.[22]
      • +
      • On December 13/14, 2011 Elizabeth Taylor's complete jewellery collection was auctioned by Christie's. Several ruby-set pieces were included in the sale, notably a ring set with an 8.24 ct gem that broke the 'price-per-carat' record for rubies ($512,925 per carat, i.e. over $4.2 million in total),[23] and a necklace[24] that sold for over $3.7 million.
      • +
      • The Liberty Bell Ruby is the largest mined ruby in the world. It was stolen in a heist in 2011.[25]
      • +
      +

      Historical and cultural references[edit]

      +
        +
      • An early recorded transport and trading of rubies arises in the literature on the North Silk Road of China, wherein about 200 BC rubies were carried along this ancient trackway moving westward from China.[26]
      • +
      • Rubies have always been held in high esteem in Asian countries. They were used to ornament armor, scabbards, and harnesses of noblemen in India and China. Rubies were laid beneath the foundation of buildings to secure good fortune to the structure.[27]
      • +
      +

      See also[edit]

      + +

      References[edit]

      +
      +
        +
      1. ^ Precious Stones, Max Bauer, p. 2
      2. +
      3. ^ "Ruby: causes of color". Retrieved 15 may 2009. 
      4. +
      5. ^ a b Matlins, Antoinette Leonard (2010). Colored Gemstones. Gemstone Press. p. 203. ISBN 0-943763-72-X. 
      6. +
      7. ^ Reed, Peter (1991). Gemmology. Butterworth-Heinemann. p. 337. ISBN 0-7506-6449-5. 
      8. +
      9. ^ Wise, Richard G. "Gemstone Connoisseurship; The Finer Points, Part II". 
      10. +
      11. ^ Hughes, Richard W. "Walking the line in ruby & sapphire". ruby-sapphire.com. 
      12. +
      13. ^ Federman, David. "Pink Sapphire". Modern Jeweler. 
      14. +
      15. ^ Hausel, W. Dan (2009). Gems, Minerals and Rocks of Wyoming. Book Surge. p. 176. ISBN 1-4392-1856-0. 
      16. +
      17. ^ Mozambique: Police Seize Boat With 96 Illegal Immigrants. AllAfrica. 4 November 2010
      18. +
      19. ^ Wenk, Hans-Rudolf; Bulakh, A. G. (2004). Minerals: their constitution and origin. Cambridge, U.K.: Cambridge University Press. pp. 539–541. ISBN 0-521-52958-1. 
      20. +
      21. ^ a b Wise, Richard W. (2006). Secrets Of The Gem Trade, The Connoisseur's Guide To Precious Gemstones. Brunswick House Press. pp. 18–22. ISBN 0-9728223-8-0. 
      22. +
      23. ^ The Heat Treatment of Ruby and Sapphire. Bangkok, Thailand: Gemlab Inc. 1992. ISBN 0940965100. 
      24. +
      25. ^ Vincent Pardieu Lead Glass Filled/Repaired Rubies. Asian Institute of Gemological Sciences Gem Testing Laboratory. February 2005
      26. +
      27. ^ Richard W. Hughes (1997), Ruby & Sapphire, Boulder, CO, RWH Publishing, ISBN 978-0-9645097-6-4
      28. +
      29. ^ Milisenda, C C (2005). "Rubine mit bleihaltigen Glasern gefullt". Zeitschrift der Deutschen Gemmologischen Gesellschaft (in German) (Deutschen Gemmologischen Gesellschaft) 54 (1): 35–41. 
      30. +
      31. ^ "Lead Glass-Filled Rubies". GIA Global Dispatch (Gemological Institute of America). 2012. 
      32. +
      33. ^ "Bahadur: a Handbook of Precious Stones". 1943. Retrieved 2007-08-19. 
      34. +
      35. ^ Maiman, T.H. (1960). "Stimulated optical radiation in ruby". Nature 187 (4736): 493–494. Bibcode:1960Natur.187..493M. doi:10.1038/187493a0. 
      36. +
      37. ^ Hecht, Jeff (2005). Beam: The Race to Make the Laser. Oxford University Press. ISBN 0-19-514210-1. 
      38. +
      39. ^ "Thomas Nicols: A Lapidary or History of Gemstones". 1652. Retrieved 2007-08-19. 
      40. +
      41. ^ "The Carmen Lúcia Ruby". Exhibitions. Retrieved 2008-02-28. 
      42. +
      43. ^ "Garrards – Treasures (large and important jewelry pieces)". Retrieved 2010-11-08. 
      44. +
      45. ^ The Legendary Jewels, Evening Sale & Jewelry (Sessions II and III) | Press Release | Christie's. Christies.com (2011-12-14). Retrieved on 2012-07-11.
      46. +
      47. ^ Elizabeth Taylor's ruby and diamond necklace. News.yahoo.com (2011-09-07). Retrieved on 2012-07-11.
      48. +
      49. ^ http://philadelphia.cbslocal.com/2012/01/09/irreplaceable-2-million-ruby-stolen-in-wilmington-jewelry-heist/
      50. +
      51. ^ C. Michael Hogan, Silk Road, North China, The Megalithic Portal. 19 November 2007
      52. +
      53. ^ Smith, Henry G. (1896). "Chapter 2, Sapphires, Rubies". Gems and Precious Stones. Charles Potter Government Printer, Australia. 
      54. +
      +
      +

      External links[edit]

      + + + + + + + +


      + + + + + + + + + + +
      +
      +
      +
      +
      +

      Navigation menu

      +
      + +
      + + +
      +
      + + + +
      +
      +
      + + + + + + +
      +
      + + + + + + + diff --git a/spec/fixtures/onebox/xkcd.response b/spec/fixtures/onebox/xkcd.response new file mode 100644 index 0000000000000..00c7bd6df5d6c --- /dev/null +++ b/spec/fixtures/onebox/xkcd.response @@ -0,0 +1 @@ +{"month": "10", "num": 327, "link": "", "year": "2007", "news": "", "safe_title": "Exploits of a Mom", "transcript": "[[A woman is talking on the phone, holding a cup]]\nPhone: Hi, this is your son's school. We're having some computer trouble.\nMom: Oh dear\u00c3\u00a2\u00c2\u0080\u00c2\u0094did he break something?\nPhone: In a way\u00c3\u00a2\u00c2\u0080\u00c2\u0094\nPhone: Did you really name your son \"Robert'); DROP TABLE Students;--\" ?\nMom: Oh, yes. Little Bobby Tables, we call him.\nPhone: Well, we've lost this year's student records. I hope you're happy.\nMom: And I hope you've learned to sanitize your database inputs.\n{{title-text: Her daughter is named Help I'm trapped in a driver's license factory.}}", "alt": "Her daughter is named Help I'm trapped in a driver's license factory.", "img": "http:\/\/imgs.xkcd.com\/comics\/exploits_of_a_mom.png", "title": "Exploits of a Mom", "day": "10"} \ No newline at end of file diff --git a/spec/fixtures/onebox/youku-meta.response b/spec/fixtures/onebox/youku-meta.response new file mode 100644 index 0000000000000..4948d1ab44af6 --- /dev/null +++ b/spec/fixtures/onebox/youku-meta.response @@ -0,0 +1 @@ +{"data":[{"ct":"f","cs":"2139","logo":"http:\/\/g2.ykimg.com\/1100641F46528C827D38F313B54FF057305EFD-1D91-46C5-821D-DC010415AC44","seed":6981,"tags":["\u674e\u5b97\u76db","\u5317\u4eac\u6f14\u5531\u4f1a","\u9ad8\u6e05"],"categories":"95","videoid":"159325444","vidEncoded":"XNjM3MzAxNzc2","username":"\u7f2a\u65af\u5de6\u53f3\u624b","userid":"330649584","title":"20131116\u674e\u5b97\u76db\u65e2\u7136\u9752\u6625\u7559\u4e0d\u4f4f\u5317\u4eac\u6f14\u5531\u4f1a_\u5c71\u4e18\u9ad8\u6e05","up":0,"down":0,"ts":"eCPhhDOr8KU0kcSeAbfYFkk","tsup":"eCPlljCr8KU0kcSeAqXcFkk","preview":{"thumbs":["05210001528C82AA6A074A508F0ED369"],"sectiontime":"6000","host":"http:\/\/g2.ykimg.com\/"},"key1":"b344b3f4","key2":"f502ea489c71b119","tt":"0","videoSource":"1","seconds":"426.46","streamfileids":{"flv":"38*15*38*38*38*40*38*40*38*38*53*40*30*57*7*0*2*43*53*0*25*57*43*15*48*53*2*63*63*38*38*43*38*40*25*57*32*49*60*32*32*2*58*60*30*48*58*32*60*63*63*0*58*60*38*32*15*63*40*58*63*57*43*2*40*57*","mp4":"38*15*38*38*38*30*38*40*38*38*53*40*30*57*7*25*48*43*53*0*25*57*43*15*48*53*2*63*63*38*38*43*38*40*25*57*32*49*60*32*32*2*58*60*30*48*58*32*60*63*63*0*58*60*38*32*15*63*40*58*63*57*43*2*40*57*","hd2":"38*15*38*38*38*43*38*15*38*38*53*40*30*57*30*40*7*49*53*0*25*57*43*15*48*53*2*63*63*38*38*43*38*40*25*57*32*49*60*32*32*2*58*60*30*48*58*32*60*63*63*0*58*60*38*32*15*63*40*58*63*57*43*2*40*57*"},"segs":{"flv":[{"no":"0","size":"6184613","seconds":205,"k":"37c1eef9d45943ef261e1651","k2":"143edcb51afd4d171"},{"no":"1","size":"9216438","seconds":222,"k":"220a2502b066ad2d24120d63","k2":"1139d718a87e8cc40"}],"mp4":[{"no":"0","size":"13698266","seconds":228,"k":"76da9c943b762c3724120d63","k2":"16661d1c25fdaee0c"},{"no":"1","size":"15953117","seconds":199,"k":"28efdc07f014982624120d63","k2":"13b9062ccfa57562d"}],"hd2":[{"no":"0","size":"27687337","seconds":205,"k":"29f6914d58f7f3a7282a1f3e","k2":"1bd4a6f687452e7fe"},{"no":"1","size":"16198622","seconds":119,"k":"524dd8fbfb7de533261e1651","k2":"163153a4deeaa0408"},{"no":"2","size":"21240220","seconds":102,"k":"e3cafd8cbe886d8e261e1651","k2":"1c4344748c6bdac6c"}]},"streamsizes":{"flv":"15401051","mp4":"29651383","hd2":"65126179"},"stream_ids":{"flv":"34575279","mp4":"34575265","hd2":"34575346"},"streamlogos":{"flv":1,"mp4":1,"hd2":1},"streamtypes":["flv","mp4","hd2"],"streamtypes_o":["hd2","flvhd","mp4"]}],"user":{"id":0},"controller":{"search_count":true,"mp4_restrict":1,"stream_mode":1,"video_capture":true,"hd3_enabled":false,"area_code":617,"dma_code":506,"continuous":0,"playmode":"normal","circle":false,"tsflag":false,"other_disable":false,"xplayer_disable":false,"app_disable":false,"share_disabled":false,"download_disabled":false,"pc_disabled":false,"pad_disabled":false,"mobile_disabled":false,"tv_disabled":false,"comment_disabled":false}} \ No newline at end of file diff --git a/spec/fixtures/onebox/youku.response b/spec/fixtures/onebox/youku.response new file mode 100644 index 0000000000000..e669e3fd9cbf3 --- /dev/null +++ b/spec/fixtures/onebox/youku.response @@ -0,0 +1,1443 @@ + + + + +20131116李宗盛既然青春留不住北京演唱会_山丘高清—在线播放—优酷网,视频高清在线观看 + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +
      +
      + + + +
      +
      +
      + +
      +
      + +
      +
      +
      +
      + + +
      +
      +
      + APP下载 +
      +
      +
      +
      + 会员 +
      +
      + +
      +
      + +
      +
      + +
      +
      + + + + +
      + +
      +
      +
      +
      +
      + 音乐频道 + > + 音乐列表 + > + + 演唱会 +
      +
      +

      视频: 20131116李宗盛既然青春留不住北京演唱会_山丘高清

      +
      + +
      +
      + + + +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      + +
      +
      +
      +
      +
      + +
      + +
      +
      +
      + +
      +
      +
      +
      + +
      +
      +
      +
      +
      + 00:00/00:00 +
      +
      +
      标屏
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      + +
      +
      +
      + +
      + +
      +
      + +
      + +
      +
      +
      +
      +
      +
      +
      +
      + Galaxy A 年轻正发声 +
      01:00
      +
      +
      + +
      + +
      5,105,100
      +
      +
      +
      +
      + 群星演绎为爱热牛奶 +
      04:55
      +
      +
      + +
      + +
      8,862,094
      +
      +
      + +
      +
      + +
      + +
      + +
      +
      +
      + + +
      +
      +
      +
      + +
      +
      +
      +
      +
      + +
      +
      + + +
      +
      + + +
      + +
      + +
      + + + +
      + +
      + +
      +
      +
      +
        +
      • +
      • +
      • +
      • +
      + 分享给好友 +
      +
      +
      +
      + + +
      + +
      + + + + + + +
      +
      + +
      +
      +
      +
      + +
      + +
      +
      订  阅
      +
      +
      +
      +
      +
      既然青春留不住,“爱的代价”“哭”“领悟”; +越过“山丘”“笑红尘”,“希望”“你走你的路”。 + +李宗盛“既然青春留不住” 北京演唱会(歌单) +part1人生的梦醒时分 +1.《爱情有什么道理》(张艾嘉) +2.《忙与盲》(张艾嘉) +3.《阿宗的三件事》(李宗盛) +4.《生命中的精灵》(李宗盛) +5....详情
      + +
      1年前 上传
      + +
      +
      + + +
      + +
      +
      + +
      + +
      +
      + +
      +
      + + + + +
      + +
      0/300
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      + + 稀饭 + + + 无语 + 难过 + + 搞笑 + + '+ +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      发表评论
      + +
      +
      + + + +
      +
      +
      +
      +
      +
      + + + +
      +
      + 发表评论 +
      +
      + +
      +
      + + +
      +
      + +
      + +
      +
      + +
      +
      + + +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spec/fixtures/onebox/youtube-channel.response b/spec/fixtures/onebox/youtube-channel.response new file mode 100644 index 0000000000000..3db11c8b6ecac --- /dev/null +++ b/spec/fixtures/onebox/youtube-channel.response @@ -0,0 +1,5446 @@ + + + + + + + + + + + + + + Google Chrome + - YouTube + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + +
      + + + + + + + + + + +
      +
      +
      +
      + +
      + +
      +
      +
      +
      Upload
      +
      + + Google Chrome + +
      + +
      + +
      +
      +
      + +
      + + +
      + +
      + + +
      + +
      + + +
      + +
      + + + +
      + +
      + + +
      + +
      + + +
      + +
      + + +
      + +
      + + +
      + +
      + + +
      + +
      + + +
      + +
      + + +
      + +
      + + +
      +
      +
      + +
      +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      + + + + + +
      + +
      +
      +
      + + + + +
      +
      +
      +
      + + +
      +
      +
      +
      + + + + Google Chrome + + +
      + +
      +
      +
      + 846,509 + +
      + +
      +
      + +
      +
      +
      +

      + Subscription preferences + + +

      +
      +
      +
      +
      Loading...
      +
      + +
      +
      +
      +
      +

      + Loading icon + + +Loading... + +

      + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      Working...
      +
      +
      + +
      +
      +
      +
      +
      + + +
      + +
      + +
      +

      + Google Chrome +

      +
      + +
      + +
      + + +
      + + + +
      + +
      +
      +
      +
      +
      + + + + + + + + + +
      +
      + +
      + + + + +
      + +
      +
      +
      + + + + + +
      +
      +
      +
      +
      + + +
      +
      + +
      +
      +
      +
      +
      Loading...
      +
      + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      Working...
      +
      +
      + +
      +
      +
      +
      +
      + + +
      + to add this to Watch Later + +
      +
      +
      +

      +Add to +

      +
      +
      +
      +
      +
      + + + + + + + + diff --git a/spec/fixtures/onebox/youtube-embed.response b/spec/fixtures/onebox/youtube-embed.response new file mode 100644 index 0000000000000..7395472b47ed6 --- /dev/null +++ b/spec/fixtures/onebox/youtube-embed.response @@ -0,0 +1,7 @@ +YouTube
      \ No newline at end of file diff --git a/spec/fixtures/onebox/youtube-playlist.response b/spec/fixtures/onebox/youtube-playlist.response new file mode 100644 index 0000000000000..1b67e5f95ed73 --- /dev/null +++ b/spec/fixtures/onebox/youtube-playlist.response @@ -0,0 +1,221 @@ + + + + + + + + The web is what you make of it - YouTube + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spec/fixtures/onebox/youtube.response b/spec/fixtures/onebox/youtube.response new file mode 100644 index 0000000000000..4915ea2ca0db9 --- /dev/null +++ b/spec/fixtures/onebox/youtube.response @@ -0,0 +1,1625 @@ + + + + + + + + +96neko - orange - YouTube + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      IN +
      Upload
      + +
      + + + + + + +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +

      + This video is unavailable. +

      +
      +
      +
      + + +
      + +
      + + + + + + + + + +
      + +
      + +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +
      +
      +
      +

      + + + + + + + + 96neko - orange + + +

      +
      + + +
      +
      +
      +

      Sign in to YouTube

      +
      + Sign in with your Google Account (YouTube, Google+, Gmail, Orkut, Picasa, or Chrome) to like korotto5810's video. + +
      +
        +
      • +
        +
      • +
      • +
        +
      • +
      • +
        +
      • +
      • +
        +
      • +
      • +
        +
      • +
      + +
      +
      +

      Sign in to YouTube

      +
      + Sign in with your Google Account (YouTube, Google+, Gmail, Orkut, Picasa, or Chrome) to dislike korotto5810's video. + +
      +
        +
      • +
        +
      • +
      • +
        +
      • +
      • +
        +
      • +
      • +
        +
      • +
      • +
        +
      • +
      + +
      +
      +
      +
      + + + + + + + + + + +
      +

      Sign in to YouTube

      +
      + Sign in with your Google Account (YouTube, Google+, Gmail, Orkut, Picasa, or Chrome) to add korotto5810's video to your playlist. + +
      +
        +
      • +
        +
      • +
      • +
        +
      • +
      • +
        +
      • +
      • +
        +
      • +
      • +
        +
      • +
      + +
      + +
      + + + + + + + + + + +
      +
      + +
      +
      +
      +
      +
      +

      + Uploaded on Apr 29, 2011 + +

      + +
      +

      From NicoNicoDouga
      http://nine.nicovideo.jp/watch/sm1423...

      MP3 download link
      http://nicosound.anyap.info/sound/sm1...
      「MP3 を 抽出」←click

      eng & romaji
      http://www.animelyrics.com/doujin/voc...

      +
      +
      + +
        +
      • +

        +Category +

        +
        +

        Music

        + +
        +
      • + + +
      • +

        License

        +
        +

        +Standard YouTube License +

        + +
        +
      • +
      +
      + +
      +
        + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      +
      +

      + Loading icon + + +Loading... + +

      + +
      +
      +
      + +
      + +
      +
      +

      + Loading icon + + +Loading... + +

      + +
      +
      + +
      +
      +

      + Loading icon + + +Loading... + +

      + +
      +
      + +
      +
      +

      + Loading icon + + +Loading... + +

      + +
      +
      + +
      + +
      + +
      +
      + Ratings have been disabled for this video. +
      + +
      + +
      +
      + Rating is available when the video has been rented. +
      + +
      + +
      +
      + This feature is not available right now. Please try again later. +
      +
      + + +
      + +
      + + + +
      + +
      +
      +
      +

      + Loading icon + + +Loading... + +

      + +
      +
      + + +
      + + +
      +
      +
      + +
      + + + +
      + +
      + +
      +
      + +
      +
      +
      + +
      +
      + +
      + +
      + + +
      +
      + +
      +
      +
      +
      +
      Loading...
      +
      + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      Working...
      +
      +
      + +
      +
      +
      +
      +
      + + + +
      + to add this to Watch Later + +
      + + + + + + + +
      + + diff --git a/spec/lib/onebox/engine/allowlisted_generic_onebox_spec.rb b/spec/lib/onebox/engine/allowlisted_generic_onebox_spec.rb new file mode 100644 index 0000000000000..b66c91c14fcf7 --- /dev/null +++ b/spec/lib/onebox/engine/allowlisted_generic_onebox_spec.rb @@ -0,0 +1,185 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe Onebox::Engine::AllowlistedGenericOnebox do + describe ".===" do + it "matches any domain" do + expect(described_class === URI('http://foo.bar/resource')).to be(true) + end + + it "doesn't match an IP address" do + expect(described_class === URI('http://1.2.3.4/resource')).to be(false) + expect(described_class === URI('http://1.2.3.4:1234/resource')).to be(false) + end + end + + describe 'html_providers' do + class HTMLOnebox < Onebox::Engine::AllowlistedGenericOnebox + def data + { + html: 'cool html', + height: 123, + provider_name: 'CoolSite', + } + end + end + + it "doesn't return the HTML when not in the `html_providers`" do + Onebox::Engine::AllowlistedGenericOnebox.html_providers = [] + expect(HTMLOnebox.new("http://coolsite.com").to_html).to be_nil + end + + it "returns the HMTL when in the `html_providers`" do + Onebox::Engine::AllowlistedGenericOnebox.html_providers = ['CoolSite'] + expect(HTMLOnebox.new("http://coolsite.com").to_html).to eq "cool html" + end + end + + describe 'rewrites' do + class DummyOnebox < Onebox::Engine::AllowlistedGenericOnebox + def generic_html + "" + end + end + + it "doesn't rewrite URLs that arent in the list" do + Onebox::Engine::AllowlistedGenericOnebox.rewrites = [] + expect(DummyOnebox.new("http://youtube.com").to_html).to eq "" + end + + it "rewrites URLs when allowlisted" do + Onebox::Engine::AllowlistedGenericOnebox.rewrites = %w(youtube.com) + expect(DummyOnebox.new("http://youtube.com").to_html).to eq "" + end + end + + describe 'oembed_providers' do + let(:url) { "http://www.meetup.com/Toronto-Ember-JS-Meetup/events/219939537" } + + before do + stub_request(:get, url).to_return(status: 200, body: onebox_response('meetup')) + stub_request(:get, "http://api.meetup.com/oembed?url=#{url}").to_return(status: 200, body: onebox_response('meetup_oembed')) + end + + it 'uses the endpoint for the url' do + onebox = described_class.new("http://www.meetup.com/Toronto-Ember-JS-Meetup/events/219939537") + expect(onebox.raw).not_to be_nil + expect(onebox.raw[:title]).to eq "February EmberTO Meet-up" + end + end + + describe "cookie support" do + let(:url) { "http://www.dailymail.co.uk/news/article-479146/Brutality-justice-The-truth-tarred-feathered-drug-dealer.html" } + + it "sends the cookie with the request" do + stub_request(:get, url) + .with(headers: { cookie: 'evil=trout' }) + .to_return(status: 200, body: onebox_response('dailymail')) + + onebox = described_class.new(url) + onebox.options = { cookie: "evil=trout" } + + expect(onebox.to_html).not_to be_empty + end + + it "fetches site_name and article_published_time tags" do + stub_request(:get, url).to_return(status: 200, body: onebox_response('dailymail')) + onebox = described_class.new(url) + + expect(onebox.to_html).to include("Mail Online – 8 Aug 14") + end + end + + describe 'canonical link' do + context 'uses canonical link if available' do + let(:mobile_url) { "https://m.etsy.com/in-en/listing/87673424/personalized-word-pillow-case-letter" } + let(:canonical_url) { "https://www.etsy.com/in-en/listing/87673424/personalized-word-pillow-case-letter" } + before do + stub_request(:get, mobile_url).to_return(status: 200, body: onebox_response('etsy_mobile')) + stub_request(:get, canonical_url).to_return(status: 200, body: onebox_response('etsy')) + end + + it 'fetches opengraph data and price from canonical link' do + onebox = described_class.new(mobile_url) + expect(onebox.to_html).not_to be_nil + expect(onebox.to_html).to include("images/favicon.ico") + expect(onebox.to_html).to include("Etsy") + expect(onebox.to_html).to include("Personalized Word Pillow Case") + expect(onebox.to_html).to include("Allow your personality to shine through your decor; this contemporary and modern accent will help you do just that.") + expect(onebox.to_html).to include("https://i.etsystatic.com/6088772/r/il/719b4b/1631899982/il_570xN.1631899982_2iay.jpg") + expect(onebox.to_html).to include("CAD 52.00") + end + end + + context 'does not use canonical link for Discourse topics' do + let(:discourse_topic_url) { "https://meta.discourse.org/t/congratulations-most-stars-in-2013-github-octoverse/12483" } + let(:discourse_topic_reply_url) { "https://meta.discourse.org/t/congratulations-most-stars-in-2013-github-octoverse/12483/2" } + before do + stub_request(:get, discourse_topic_url).to_return(status: 200, body: onebox_response('discourse_topic')) + stub_request(:get, discourse_topic_reply_url).to_return(status: 200, body: onebox_response('discourse_topic_reply')) + end + + it 'fetches opengraph data from original link' do + onebox = described_class.new(discourse_topic_reply_url) + expect(onebox.to_html).not_to be_nil + expect(onebox.to_html).to include("Congratulations, most stars in 2013 GitHub Octoverse!") + expect(onebox.to_html).to include("Thanks for that link and thank you – and everyone else who is contributing to the project!") + expect(onebox.to_html).to include("https://d11a6trkgmumsb.cloudfront.net/optimized/2X/d/d063b3b0807377d98695ee08042a9ba0a8c593bd_2_690x362.png") + end + end + end + + describe 'to_html' do + let(:original_link) { "http://www.dailymail.co.uk/pages/live/articles/news/news.html?in_article_id=479146&in_page_id=1770" } + let(:redirect_link) { 'http://www.dailymail.co.uk/news/article-479146/Brutality-justice-The-truth-tarred-feathered-drug-dealer.html' } + + before do + stub_request(:get, original_link).to_return( + status: 301, + headers: { + location: redirect_link, + } + ) + stub_request(:get, redirect_link).to_return(status: 200, body: onebox_response('dailymail')) + end + + around do |example| + previous_options = Onebox.options.to_h + example.run + Onebox.options = previous_options + end + + it "follows redirects and includes the summary" do + Onebox.options = { redirect_limit: 2 } + onebox = described_class.new(original_link) + expect(onebox.to_html).to include("It was the most chilling image of the week") + end + + it "recives an error with too many redirects" do + Onebox.options = { redirect_limit: 1 } + onebox = described_class.new(original_link) + expect(onebox.to_html).to be_nil + end + end + + describe 'missing description' do + context 'works without description if image is present' do + before do + stub_request(:get, "https://edition.cnn.com/2020/05/15/health/gallery/coronavirus-people-adopting-pets-photos/index.html") + .to_return(status: 200, body: onebox_response('cnn')) + + stub_request(:get, "https://www.cnn.com/2020/05/15/health/gallery/coronavirus-people-adopting-pets-photos/index.html") + .to_return(status: 200, body: onebox_response('cnn')) + end + + it 'shows basic onebox' do + onebox = described_class.new("https://edition.cnn.com/2020/05/15/health/gallery/coronavirus-people-adopting-pets-photos/index.html") + expect(onebox.to_html).not_to be_nil + expect(onebox.to_html).to include("https://edition.cnn.com/2020/05/15/health/gallery/coronavirus-people-adopting-pets-photos/index.html") + expect(onebox.to_html).to include("https://cdn.cnn.com/cnnnext/dam/assets/200427093451-10-coronavirus-people-adopting-pets-super-tease.jpg") + expect(onebox.to_html).to include("People are fostering and adopting pets during the pandemic") + end + end + end +end diff --git a/spec/lib/onebox/engine/amazon_onebox_spec.rb b/spec/lib/onebox/engine/amazon_onebox_spec.rb new file mode 100644 index 0000000000000..44479d189200f --- /dev/null +++ b/spec/lib/onebox/engine/amazon_onebox_spec.rb @@ -0,0 +1,196 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe Onebox::Engine::AmazonOnebox do + context "regular amazon page" do + before do + @link = "https://www.amazon.com/Knit-Noro-Accessories-Colorful-Little/dp/193609620X" + @uri = "https://www.amazon.com/dp/193609620X" + + stub_request(:get, "https://www.amazon.com/Seven-Languages-Weeks-Programming-Programmers/dp/193435659X") + .to_return(status: 200, body: onebox_response("amazon")) + end + + include_context "engines" + it_behaves_like "an engine" + + describe "works with international domains" do + def check_link(tdl, link) + onebox_cls = Onebox::Matcher.new(link).oneboxed + expect(onebox_cls).to_not be(nil) + expect(onebox_cls.new(link).url).to include("https://www.amazon.#{tdl}") + end + + it "matches canadian domains" do + check_link("ca", "https://www.amazon.ca/Too-Much-Happiness-Alice-Munro-ebook/dp/B0031TZ98K/") + end + + it "matches german domains" do + check_link("de", "https://www.amazon.de/Buddenbrooks-Verfall-einer-Familie-Roman/dp/3596294312/") + end + + it "matches uk domains" do + check_link("co.uk", "https://www.amazon.co.uk/Pygmalion-George-Bernard-Shaw/dp/1420925237/") + end + + it "matches japanese domains" do + check_link("co.jp", "https://www.amazon.co.jp/%E9%9B%AA%E5%9B%BD-%E6%96%B0%E6%BD%AE%E6%96%87%E5%BA%AB-%E3%81%8B-1-1-%E5%B7%9D%E7%AB%AF-%E5%BA%B7%E6%88%90/dp/4101001014/") + end + + it "matches chinese domains" do + check_link("cn", "https://www.amazon.cn/%E5%AD%99%E5%AD%90%E5%85%B5%E6%B3%95-%E5%AD%99%E8%86%91%E5%85%B5%E6%B3%95-%E5%AD%99%E6%AD%A6/dp/B0011C40FC/") + end + + it "matches french domains" do + check_link("fr", "https://www.amazon.fr/Les-Mots-autres-%C3%A9crits-autobiographiques/dp/2070114147/") + end + + it "matches italian domains" do + check_link("it", "https://www.amazon.it/Tutte-poesie-Salvatore-Quasimodo/dp/8804520477/") + end + + it "matches spanish domains" do + check_link("es", "https://www.amazon.es/familia-Pascual-Duarte-Camilo-Jos%C3%A9-ebook/dp/B00EJRTKTW/") + end + + it "matches brasilian domains" do + check_link("com.br", "https://www.amazon.com.br/A-p%C3%A1tria-chuteiras-Nelson-Rodrigues-ebook/dp/B00J2B414Y/") + end + + it "matches indian domains" do + check_link("in", "https://www.amazon.in/Fireflies-Rabindranath-Tagore/dp/9381523169/") + end + + it "matches mexican domains" do + check_link("com.mx", "https://www.amazon.com.mx/Legend-Zelda-Links-Awakening-Nintendo/dp/B07SG15148/") + end + end + + describe "#url" do + let(:long_url) { "https://www.amazon.ca/gp/product/B087Z3N428?pf_rd_r=SXABADD0ZZ3NF9Q5F8TW&pf_rd_p=05378fd5-c43e-4948-99b1-a65b129fdd73&pd_rd_r=0237fb28-7f47-49f4-986a-be0c78e52863&pd_rd_w=FfIoI&pd_rd_wg=Hw4qq&ref_=pd_gw_unk" } + + it "maintains the same http/https scheme as the requested URL" do + expect(described_class.new("https://www.amazon.fr/gp/product/B01BYD0TZM").url) + .to eq("https://www.amazon.fr/dp/B01BYD0TZM") + + expect(described_class.new("http://www.amazon.fr/gp/product/B01BYD0TZM").url) + .to eq("https://www.amazon.fr/dp/B01BYD0TZM") + end + + it "removes parameters from the URL" do + expect(described_class.new(long_url).url) + .not_to include("?pf_rd_r") + end + end + + describe "#to_html" do + it "includes image" do + expect(html).to include("https://images-na.ssl-images-amazon.com/images/I/51opYcR6kVL._SY400_.jpg") + end + + it "includes description" do + expect(html).to include("You should learn a programming language every year, as recommended by The Pragmatic Programmer.") + end + + it "includes price" do + expect(html).to include("$21.11") + end + + it "includes title" do + expect(html).to include("Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)") + end + end + end + + context "amazon with opengraph" do + let(:link) { "https://www.amazon.com/dp/B01MFXN4Y2" } + let(:html) { described_class.new(link).to_html } + + before do + stub_request(:get, "https://www.amazon.com/dp/B01MFXN4Y2") + .to_return(status: 200, body: onebox_response("amazon-og")) + + stub_request(:get, "https://www.amazon.com/Christine-Rebecca-Hall/dp/B01MFXN4Y2") + .to_return(status: 200, body: onebox_response("amazon-og")) + end + + describe "#to_html" do + it "includes image" do + expect(html).to include("https://images-na.ssl-images-amazon.com/images/I/51nOF2iBa6L._SX940_.jpg") + end + + it "includes description" do + expect(html).to include("CHRISTINE is the story of an aspiring newswoman caught in the midst of a personal and professional life crisis. Between unrequited love, frustration at work, a tumultuous home, and self-doubt; she begins to spiral down a dark path.") + end + + it "includes title" do + expect(html).to include("Watch Christine online - Amazon Video") + end + end + end + + context "amazon book page" do + let(:link) { "https://www.amazon.com/dp/B00AYQNR46" } + let(:html) { described_class.new(link).to_html } + + before do + stub_request(:get, "https://www.amazon.com/dp/B00AYQNR46") + .to_return(status: 200, body: onebox_response("amazon")) + + stub_request(:get, "https://www.amazon.com/Seven-Languages-Weeks-Programming-Programmers/dp/193435659X") + .to_return(status: 200, body: onebox_response("amazon")) + end + + describe "#to_html" do + it "includes title and author" do + expect(html).to include("Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)") + expect(html).to include("Bruce Tate") + end + + it "includes ISBN" do + expect(html).to include("978-1934356593") + end + + it "includes publisher" do + expect(html).to include("Pragmatic Bookshelf") + end + end + end + + context "amazon ebook page" do + let(:link) { "https://www.amazon.com/dp/193435659X" } + let(:html) { described_class.new(link).to_html } + + before do + stub_request(:get, "https://www.amazon.com/dp/193435659X") + .to_return(status: 200, body: onebox_response("amazon-ebook")) + + stub_request(:get, "https://www.amazon.com/Seven-Languages-Weeks-Programming-Programmers-ebook/dp/B00AYQNR46") + .to_return(status: 200, body: onebox_response("amazon-ebook")) + end + + describe "#to_html" do + it "includes title and author" do + expect(html).to include("Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Pragmatic Programmers)") + expect(html).to include("Bruce Tate") + end + + it "includes image" do + expect(html).to include("https://images-na.ssl-images-amazon.com/images/I/51LZT%2BtSrTL._SX133_.jpg") + end + + it "includes ASIN" do + expect(html).to include("B00AYQNR46") + end + + it "includes rating" do + expect(html).to include("4.2 out of 5 stars") + end + + it "includes publisher" do + expect(html).to include("Pragmatic Bookshelf") + end + end + end +end diff --git a/spec/lib/onebox/engine/audio_onebox_spec.rb b/spec/lib/onebox/engine/audio_onebox_spec.rb new file mode 100644 index 0000000000000..dbb12ad6de515 --- /dev/null +++ b/spec/lib/onebox/engine/audio_onebox_spec.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe Onebox::Engine::AudioOnebox do + it "supports ogg" do + expect(Onebox.preview('http://upload.wikimedia.org/wikipedia/commons/c/c8/Example.ogg').to_s).to match(/
      + + +
      +

      Billy Jack

      +
      +
      From Wikipedia, the free encyclopedia
      +
      +
      + Jump to: navigation, search +
      +
      +
      This article is about the 1971 film. For the wrestler of a similar name, see Billy Jack Haynes.
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Billy Jack
      Billy Jack poster.jpg
      +
      Theatrical release poster.
      +
      Directed byTom Laughlin
      +as T.C. Frank
      Produced byTom Laughlin
      +as Mary Rose Solti
      Written byTom Laughlin
      +(as Frank Christina)
      +Delores Taylor
      +(as Theresa Christina)
      StarringTom Laughlin
      +Delores Taylor
      Music byMundell Lowe, Dennis Lambert, Brian Potter
      CinematographyFred Koenekamp
      +John M. Stephens
      Editing byLarry Heath
      +Marion Rothman
      StudioNational Student Film Corporation
      Distributed byWarner Bros.
      Release datesMay 1, 1971
      Running time114 min.
      CountryUnited States
      LanguageEnglish
      Budget$800,000
      Box office$32,500,000[1]
      +

      Billy Jack is a 1971 action/drama independent film; the second of four films centering on a character of the same name which began with the movie The Born Losers (1967), played by Tom Laughlin, who directed and co-wrote the script. Filming began in Prescott, Arizona, in the fall of 1969, but the movie was not completed until 1971. American International Pictures pulled out, halting filming. 20th Century-Fox came forward and filming eventually resumed but when that studio refused to distribute the film, Warner Bros. stepped forward.

      +

      Still, the film lacked distribution, so Laughlin booked it in to theaters himself in 1971.[1] The film died at the box office in its initial run, but eventually took in more than $40 million in its 1973 re-release, with distribution supervised by Laughlin.

      +

      + +

      +

      Plot[edit]

      +

      Billy Jack is a "half-breed" American Navajo Indian[citation needed], a Green Beret Vietnam War veteran, and a hapkido master. The character made his début in The Born Losers (1967), a "biker film" about a motorcycle gang terrorizing a California town. Billy Jack rises to the occasion to defeat the gang when defending a college student with evidence against them for gang rape.

      +

      In the second film, Billy Jack, the hero defends the hippie-themed Freedom School and students from townspeople who do not understand or like the counterculture students. The school is organized by Jean Roberts (Delores Taylor).

      +

      In one scene, a group of Indian children from the school go to town for ice cream and are refused service and then abused and humiliated by Bernard Posner and his gang. This prompts a violent outburst by Billy. Later, Billy's girlfriend Jean is raped and an Indian student is murdered by Bernard (David Roya), the son of the county's corrupt political boss (Bert Freed). Billy confronts Bernard and sustains a gunshot wound before killing him with a hand strike to the throat, after Bernard was having sex with a 13-year-old girl. After a climactic shootout with the police, and pleading from Jean, Billy Jack surrenders to the authorities and is arrested. As he is driven away, a large crowd of supporters raise their fists as a show of defiance and support. The plot continues in the sequel, The Trial of Billy Jack.

      +

      Box-office and critical reception[edit]

      +

      The film was re-released in 1973 and earned an estimated $8,275,000 in North American rentals.[2]

      +

      Billy Jack holds a "Fresh" rating of 62% at Rotten Tomatoes.[3] As of February 2014 it has a score of 6.1 on IMDB.

      +

      In his Movie and Video Guide, film critic Leonard Maltin writes: "Seen today, its politics are highly questionable, and its 'message' of peace looks ridiculous, considering the amount of violence in the film."

      +

      Roger Ebert also saw the message of the film as self-contradictory, writing: "I'm also somewhat disturbed by the central theme of the movie. 'Billy Jack' seems to be saying the same thing as 'Born Losers,' that a gun is better than a constitution in the enforcement of justice."[4]

      +

      Delores Taylor received a Golden Globe nomination as Most Promising Newcoming Actress. Tom Laughlin won the grand prize for the film at the 1971 Taormina International Film Festival in Italy.

      +

      Soundtrack[edit]

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Billy Jack
      Soundtrack album by Mundell Lowe
      Released1972
      Recorded1971
      GenreFilm score
      LabelWarner Bros.
      +WS 1926
      ProducerMundell Lowe
      Mundell Lowe chronology
      + + + + + + +
      Satan in High Heels
      +(1961)
      Billy Jack
      +(1971)
      California Guitar
      +(1974)
      +
      +

      The film score was composed, arranged and conducted by Mundell Lowe and the soundtrack album was originally released on the Warner Bros. label.[5]

      +

      Reception[edit]

      +

      The Allmusic review states "a strange and striking combination of styles that somehow is effective... a listenable disc whose flaws only add to the warmth".[6] The film's theme song, "One Tin Soldier (The Legend of Billy Jack)" by the band Coven, became a Top 40 hit in 1971, and featured the chorus:

      +
      +

      Go ahead and hate your neighbor; go ahead and cheat a friend.
      +Do it in the name of heaven; you can justify it in the end.
      +There won't be any trumpets blowin' come the judgment day
      +On the bloody morning after, one tin soldier rides away

      +
      + + + + + + + + + + + + + + + +
      Professional ratings
      Review scores
      SourceRating
      Allmusic3.5/5 stars[6]
      +

      Track listing[edit]

      +

      All compositions by Mundell Lowe, except as indicated.

      +
        +
      1. "One Tin Soldier" (Dennis Lambert, Brian Potter) – 3:18
      2. +
      3. "Hello Billy Jack" – 0:45
      4. +
      5. "Old and the New" – 1:00
      6. +
      7. "Johnnie" (Teresa Kelly) – 2:35
      8. +
      9. "Look, Look to the Mountain" (Kelly) – 1:40
      10. +
      11. "When Will Billy Love Me" (Lynn Baker) – 3:24
      12. +
      13. "Freedom Over Me" (Gwen Smith) – 0:35
      14. +
      15. "All Forked Tongue Talk Alike" – 2:54
      16. +
      17. "Challenge" – 2:20
      18. +
      19. "Rainbow Made of Children" (Baker) – 3:50
      20. +
      21. "Most Beautiful Day" – 0:30
      22. +
      23. "An Indian Dance" – 1:15
      24. +
      25. "Ceremonial Dance" – 1:59
      26. +
      27. "Flick of the Wrist" – 2:15
      28. +
      29. "It's All She Left Me" – 1:56
      30. +
      31. "You Shouldn't Do That" – 3:21
      32. +
      33. "Ring Song" (Katy Moffatt) – 4:25
      34. +
      35. "Thy Loving Hand" – 1:35
      36. +
      37. "Say Goodbye 'Cause You're Leavin'" – 2:36
      38. +
      39. "The Theme from Billy Jack" – 2:21
      40. +
      41. "One Tin Soldier (End Title)" (Lambert, Potter) – 1:06
      42. +
      +

      Personnel[edit]

      +
        +
      • Mundell Lowe: arranger, conductor
      • +
      • Coven featuring Jinx Dawson (tracks 1 & 21), Teresa Kelly (tracks 4 & 5), Lynn Baker (tracks 6 & 10), Gwen Smith (track 7), Katy Moffatt (track 17): vocals
      • +
      • Other unidentified musicians
      • +
      +

      Influence[edit]

      +

      Marketed as an action film, the story focuses on the plight of Native Americans during the civil rights movement. It attained a cult following among younger audiences due to its youth-oriented, anti-authority message and the then-novel martial arts fight scenes which predate the Bruce Lee/kung fu movie trend that followed.[7] The centerpiece of the film features Billy Jack, enraged over the mistreatment of his Indian friends, fighting racist thugs using hapkido techniques.

      +

      Billy Jack's wardrobe (black T-shirt, blue denim jacket, blue jeans, and a black hat with a beadwork band) would become nearly as iconic as the character.

      +

      The second major movie to make use of the word "fuck" (MASH being the first). A black student says the words "fucked up" during the scene where the Freedom school students are talking about the "Second Coming".

      +

      Billy Jack in popular culture[edit]

      +
        +
      • In 1975 (release date 12/30/1974), Firesign Theater, an American comedy group, made reference to Billy Jack on their album, "In The Next World, You're on Your Own," in the form of "Billy Jack Dog Food", and "I'm not Billy Jacking you," among other thematic references.
      • +
      • In 1975, musician Curtis Mayfield recorded and released a song titled, "Billy Jack" on his album There's No Place Like America Today.
      • +
      • In 1976 musician Paul Simon played "Billy Paul" (a parody of Billy Jack, unrelated[8] to musician Billy Paul) in a sketch on the second season of the NBC comedy show Saturday Night Live, after the film Billy Jack aired earlier that evening on NBC.
      • +
      • In 1982, a professional wrestler, Billy Jack Haynes, debuted as "Billy Jack" wearing a hat like Billy Jack. He changed his wrestling name from "Billy Jack" to "Billy Jack Haynes" after Tom Laughlin threatened to sue.
      • +
      • In the series Mystery Science Theater 3000, at least two episodes reference Billy Jack: on the episode Werewolf, after a fight breaks out between a racist dig supervisor and his Indian help, Tom Servo says, "This is where Billy Jack should come riding up."; on the episode Track of the Moon Beast, after the Native American professor finishes telling a story, Crow says, "Uh huh...do you know Billy Jack?"
      • +
      • In an episode of The Simpsons ("Bart of War"), Bart joins a Boy Scouts of America-like group called the "Pre-Teen Braves", and they engage in a rivalry with "the Cavalry Kids". A montage of the two groups fighting each other is set to Coven's version of One Tin Soldier.
      • +
      • The song "Kooler than Jesus" by My Life with the Thrill Kill Kult features samples from the film.
      • +
      • Billy Jack is referenced in an episode of Gilmore Girls ("Red Light on the Wedding Night") while Lorelai and Rory are watching the movie in their living room. At the line "Billy Jack, I'm gonna kill you if it's the last thing I do!", Lorelai responds, "Ugh, he so jinxed himself with that one." Rory replies, "Yeah, he should've said 'Billy Jack, I'm gonna kill you or buy myself a lovely chenille sweater.'"
      • +
      • Upon meeting serial killer Cary Stayner—then considered a possible material witness to a 1999 murder in Yosemite National Park—FBI Agent Jeff Rinek asked if Stayner had ever seen the movie Billy Jack, noting Stayner's resemblance to the film's hero. Initially, Stayner denied seeing the movie.[9] However, 90 minutes later, after building rapport during the drive to the FBI headquarters in Sacramento from the nudist resort where he was picked up, Stayner surprised Rinek by reciting several of Billy Jack's lines.[10]
      • +
      • In the motion picture Major Payne, Damon Wayans as the title character references the iconic fight scene quote "Now, what I'm goin' do is take this right foot and I'm 'a put it 'cross the left side your face."
      • +
      • In season three of the television series Sabrina The Teenage Witch, principal Mr. Kraft reveals that Billy Jack is his favorite film.
      • +
      • Billy Jack was referenced by Jim Carrey in Yes Man.
      • +
      • Metal band Goblin Cock have a song entitled "Ode to Billy Jack" on their 2009 album Come With Me if You Want to Live, which is a tribute to him.
      • +
      • In the movie Drillbit Taylor, actor Owen Wilson references Billy Jack by saying to a cast mate "I am gonna Billy Jack your ass."
      • +
      • In the episode of the animated show Pinky and the Brain, titled "Brainy Jack," Brain assumes the role of the titular Brainy Jack to trick a commune of hippies into helping him take over the world. Brain's wardrobe is a direct reference to Billy Jack, especially the hat with a beaded hat-band. Likewise, the song Pinky sings in the episode is a parody of "One Tin Soldier."
      • +
      • British electro band Relaxed Muscle (fronted by Jarvis Cocker, from Pulp) released a song called "Billy Jack" on their only album A Heavy Nite With... in 2003. It was released as a single with a music video that featured Cocker (as alter ego, Darren Spooner) in Western garb reminiscent of Billy Jack's trademark outfit.
      • +
      • In the Warehouse 13 Season 2 episode "13.1", the brain damaged Hugo Miller shouts "Billy Jack!" excitedly after Myka Bering kicks a gas station attendant who had pulled a gun.
      • +
      • In the book "The Berlin Blues", a play by Drew Hayden Taylor, the character named Trailer references Billy Jack when he says on page 92, "No Cirque du Billy Jack?" when the plan for Ojibway World which was supposed to be opening on the reserve falls through.
      • +
      • Bill Maher referenced Billy Jack in a July 2012 blog post about fundamentalist Mormons.
      • +
      +

      References[edit]

      +
      +
        +
      1. ^ a b Waxman, Sharon (June 20, 2005). "Billy Jack Is Ready to Fight the Good Fight Again". The New York Times. Retrieved 2011-01-02. 
      2. +
      3. ^ "Big Rental Films of 1973", Variety, 9 January 1974 p 19
      4. +
      5. ^ Billy Jack - Rotten Tomatoes
      6. +
      7. ^ Billy Jack - Roger Ebert
      8. +
      9. ^ Mundell Lowe discography accessed August 23, 2012
      10. +
      11. ^ a b Viglione, J. Allmusic Review accessed August 23, 2012
      12. +
      13. ^ Stewart, Jocelyn Y. (January 14, 2007). "Bong Soo Han, 73; grand master of hapkido won film fans for martial arts". Los Angeles Times. Retrieved 2010-11-25. 
      14. +
      15. ^ "The Story of Billy Paul". November 20, 1976. Retrieved 2012-07-15. 
      16. +
      17. ^ Finz, Stacy (December 15, 2002). "The Case of a Lifetime, Part One (2002, December 15)". SFGate.com. Retrieved 2008-12-10. 
      18. +
      19. ^ "The Case of a Lifetime, Part Two (2002, December 15)". SFGate.com. December 14, 2002. Retrieved 2008-12-10. 
      20. +
      +
      +

      External links[edit]

      + + + + + + + + + + + +
      +
      +
      +

      +
      + + + + + + + + + + + New post + + + +
      + +
      +
      +