From 21b9da6418dabdefbe9628b83ebf3fe18fbf02d7 Mon Sep 17 00:00:00 2001 From: Branko Kokanovic Date: Tue, 2 Jan 2018 11:39:12 +0000 Subject: Adding Serbian latin translations (#6146) Serbian latin (sr-Latn) is generated automatically from Serbian (sr) translation. Also changed some wording in original (Serbian) translation. --- config/locales/activerecord.sr-Latn.yml | 13 + config/locales/devise.sr-Latn.yml | 63 +++ config/locales/doorkeeper.sr-Latn.yml | 119 ++++++ config/locales/simple_form.sr-Latn.yml | 75 ++++ config/locales/simple_form.sr.yml | 4 +- config/locales/sr-Latn.yml | 723 ++++++++++++++++++++++++++++++++ config/locales/sr.yml | 14 +- 7 files changed, 1002 insertions(+), 9 deletions(-) create mode 100644 config/locales/activerecord.sr-Latn.yml create mode 100644 config/locales/devise.sr-Latn.yml create mode 100644 config/locales/doorkeeper.sr-Latn.yml create mode 100644 config/locales/simple_form.sr-Latn.yml create mode 100644 config/locales/sr-Latn.yml (limited to 'config/locales') diff --git a/config/locales/activerecord.sr-Latn.yml b/config/locales/activerecord.sr-Latn.yml new file mode 100644 index 000000000..1527a0d8c --- /dev/null +++ b/config/locales/activerecord.sr-Latn.yml @@ -0,0 +1,13 @@ +--- +sr-Latn: + activerecord: + errors: + models: + account: + attributes: + username: + invalid: samo slova, brojevi i donje crte + status: + attributes: + reblog: + taken: statusa već postoji diff --git a/config/locales/devise.sr-Latn.yml b/config/locales/devise.sr-Latn.yml new file mode 100644 index 000000000..21ddbd726 --- /dev/null +++ b/config/locales/devise.sr-Latn.yml @@ -0,0 +1,63 @@ +--- +sr-Latn: + devise: + confirmations: + confirmed: Adresa Vaše e-pošte je uspešno potvrđena. + send_instructions: U roku od nekoliko minuta primićete e-poštu sa uputstvom za potvrdu Vašeg naloga. Molimo proverite i spam fasciklu ako niste primili poruku. + send_paranoid_instructions: Ukoliko se adresa Vaše e-pošte nalazi u našoj bazi, u roku od nekoliko minuta primićete poruku sa uputstvom kako da potvrdite Vaš nalog. Molimo proverite i spam fasciklu ako niste primili poruku. + failure: + already_authenticated: Već ste prijavljeni. + inactive: Vaš nalog još nije aktiviran. + invalid: Neispravan %{authentication_keys} ili lozinka. + last_attempt: Imate još jedan pokušaj pre nego što Vaš nalog bude zaključan. + locked: Vaš nalog je zaključan. + not_found_in_database: Neispravan %{authentication_keys} ili lozinka. + timeout: Vreme trajanja Vaše sesije je isteklo. Za nastavak prijavite se ponovo. + unauthenticated: Za nastavak se morate prijaviti ili registrovati. + unconfirmed: Pre nastavka morate potvrditi svoj nalog. + mailer: + confirmation_instructions: + subject: 'Mastodont: Uputstvo za potvrdu korisničkog naloga na instanci %{instance}' + password_change: + subject: 'Mastodont: Lozinka promenjena' + reset_password_instructions: + subject: 'Mastodont: Uputstvo za resetovanje lozinke' + unlock_instructions: + subject: 'Mastodont: Uputstvo za otključavanje korisničkog naloga' + omniauth_callbacks: + failure: Nismo u mogućnosti autorizovati Vas sa %{kind} nalogom zbog "%{reason}". + success: Uspešna autorizacija sa %{kind} naloga. + passwords: + no_token: Ne možete pristupiti ovoj stranici ako niste pratili vezu u imejlu za resetovanje lozinke. Ukoliko ste pratili vezu za resetovanje lozinke u poruci, molimo Vas da proverite da li ste koristili punu adresu. + send_instructions: U roku od nekoliko minuta primitićete poruku sa uputstvom za promenu Vaše lozinke. Molimo proverite i spam fasciklu ako niste primili poruku. + send_paranoid_instructions: Ukoliko se adresa Vaše e-pošte nalazi u našoj bazi, u roku od nekoliko minuta primićete poruku sa uputstvom za promenu Vaše lozinke. Molimo proverite i spam fasciklu ako niste primili poruku. + updated: Vaša lozinka je uspešno promenjena. Sada ste prijavljeni. + updated_not_active: Vaša lozinka nije uspešno promenjena. + registrations: + destroyed: Ćao! Vaš nalog je uspešno obrisan. Nadamo se da ćete se uskoro vratiti. + signed_up: Dobrodošli! Uspešno ste se registrovali. + signed_up_but_inactive: Uspešno ste se registrovali. Nažalost ne možete se prijaviti zato što Vaš nalog još nije aktiviran. + signed_up_but_locked: Uspešno ste se registrovali. Nažalost ne možete se prijaviti zato što je Vaš nalog zaključan. + signed_up_but_unconfirmed: Poruka za potvrdu Vašeg naloga je poslata na Vašu imejl adresu. Kliknite na vezu u imejlu da potvrdite svoj nalog. Molimo proverite i spam fasciklu ako niste primili poruku. + update_needs_confirmation: Uspešno ste ažurirali svoj nalog, ali treba da potvrdimo novu adresu Vaše e-pošte. Molimo Vas da proverite e-poštu i pratite link za potvrdu nove adrese Vaše e-pošte. + updated: Vaš nalog je uspešno ažuriran. + sessions: + already_signed_out: Uspešno ste se odjavili. + signed_in: Uspešno ste se prijavili. + signed_out: Uspešno ste se odjavili. + unlocks: + send_instructions: U roku od nekoliko minuta primićete imejl sa uputstvom za otključavanje Vašeg naloga. Molimo proverite i spam fasciklu ako niste primili poruku. + send_paranoid_instructions: koliko se adresa Vaše e-pošte nalazi u našoj bazi, u roku od nekoliko minuta primićete poruku sa uputstvom kako da otključate Vaš nalog. Molimo proverite i spam fasciklu ako niste primili poruku. + unlocked: Vaš nalog je uspešno otključan. Molimo Vas da se prijavite da biste nastavili. + errors: + messages: + already_confirmed: je već potvrđen, molimo Vas da se prijavite + confirmation_period_expired: je trebao biti potvrđen tokom perioda %{period}, molimo Vas da zatražite novi + expired: je istekao, molimo Vas da zatražite novi + not_found: nije pronađeno + not_locked: nije zaključan + not_saved: + few: "%{count} greške sprečavaju %{resource}a:" + many: "%{count} grešaka sprečavaju %{resource}a:" + one: '1 greška sprečava %{resource}a:' + other: "%{count} grešaka sprečavaju %{resource}a:" diff --git a/config/locales/doorkeeper.sr-Latn.yml b/config/locales/doorkeeper.sr-Latn.yml new file mode 100644 index 000000000..8e96f8b93 --- /dev/null +++ b/config/locales/doorkeeper.sr-Latn.yml @@ -0,0 +1,119 @@ +--- +sr-Latn: + activerecord: + attributes: + doorkeeper/application: + name: Ime aplikacije + redirect_uri: Adresa za preusmeravanje + scopes: Opseg važenja + website: Veb sajt aplikacije + errors: + models: + doorkeeper/application: + attributes: + redirect_uri: + fragment_present: ne može da sadrži fragment. + invalid_uri: mora biti ispravan URI. + relative_uri: mora biti apsolutni URI. + secured_uri: mora biti HTTPS/SSL URI. + doorkeeper: + applications: + buttons: + authorize: Autorizuj + cancel: Poništi + destroy: Uništi + edit: Izmeni + submit: Pošalji + confirmations: + destroy: Da li ste sigurni? + edit: + title: Izmeni aplikaciju + form: + error: Ops! Proverite formular za eventualne greške + help: + native_redirect_uri: Koristite %{native_redirect_uri} za lokalno testiranje + redirect_uri: Koristite jednu liniju po URI-ju + scopes: Odvojite opsege važenja sa belinama. Ostavite prazno za podrazumevane opsege važenja. + index: + application: Aplikacija + callback_url: Adresa za povratni poziv + delete: Obriši + name: Ime + new: Nova aplikacija + scopes: Opsezi važenja + show: Prikaži + title: Vaše aplikacije + new: + title: Nova aplikacija + show: + actions: Akcije + application_id: Klijentski ključ + callback_urls: Adrese za povratne pozive + scopes: Opseg važenja + secret: Klijentska tajna + title: 'Aplikacija: %{name}' + authorizations: + buttons: + authorize: Autorizuj se + deny: Odbij + error: + title: Dogodila se greška + new: + able_to: Biće u mogućnosti da + prompt: Aplikacija %{client_name} zahteva pristup Vašem nalogu + title: Potrebna autorizacija + show: + title: Kopirajte ovaj autorizacioni kod i nalepite ga u aplikaciju. + authorized_applications: + buttons: + revoke: Opozovi + confirmations: + revoke: Da li ste sigurni? + index: + application: Aplikacija + created_at: Autorizovana + date_format: "%d.%m.%Y %H:%M:%S" + scopes: Opsezi važenja + title: Vaše autorizovane aplikacije + errors: + messages: + access_denied: Vlasnik resursa ili autorizacioni server su odbili zahtev. + credential_flow_not_configured: Tok Resource Owner Password Credentials nije uspeo pošto je Doorkeeper.configure.resource_owner_from_credentials neiskonfigurisan. + invalid_client: Klijentska identifikacija nije uspela zbog nepoznatog klijenta, zato što klijent nije uključio identifikaciju ili zato što je iskorišćen nepodržani identifikacioni metod. + invalid_grant: Zadata identifikaciona dozvola je neispravna, istekla, opozvana, ne poklapa se sa adresom preusmeravanja ili je izdata nekog drugom klijentu. + invalid_redirect_uri: Uključena adresa preusmeravanja nije ispravna. + invalid_request: Obavezni parametar fali u zahtevu, zahtev uključuje nepodržanu vrednost parametra ili je parametar na neki drugi način pogrešan. + invalid_resource_owner: Zadati kredencijali vlasnika resursa nisu ispravni ili vlasnik resursa ne može biti nađen + invalid_scope: Zahtevani opseg važenja nije ispravan, nepoznat je ili je na neki drugi način pogrešan. + invalid_token: + expired: Pristupni token je istekao + revoked: Pristupni token je opozvan + unknown: Pristupni token nije ispravan + resource_owner_authenticator_not_configured: Greška u pronalaženju vlasnika resursa pošto Doorkeeper.configure.resource_owner_authenticator nije konfigurisan. + server_error: Identifikacioni server je naišao na neočekivanu situaciju zbog koje nije ispunio upućeni zahtev. + temporarily_unavailable: Identifikacioni server trenutno ne može da obradi zahtev jer je privremeno preopterećen ili je u režimu održavanja. + unauthorized_client: Klijent nije ovlašćen da izvrši ovaj zahtev ovim metodom. + unsupported_grant_type: Tip autorizacione dozvole nije podržan od strane autorizacionog servera. + unsupported_response_type: Autorizacioni server ne podržava ovaj tip odgovora. + flash: + applications: + create: + notice: Aplikacija napravljena. + destroy: + notice: Aplikacija obrisana. + update: + notice: Aplikacija ažurirana. + authorized_applications: + destroy: + notice: Aplikacija opozvana. + layouts: + admin: + nav: + applications: Aplikacije + oauth2_provider: OAuth2 provajder + application: + title: OAuth autorizacija potrebna + scopes: + follow: prati, blokira, odblokira i otprati naloge + read: čita podatke Vašeg naloga + write: objavljuje statuse u Vaše ime diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml new file mode 100644 index 000000000..d811377c3 --- /dev/null +++ b/config/locales/simple_form.sr-Latn.yml @@ -0,0 +1,75 @@ +--- +sr-Latn: + simple_form: + hints: + defaults: + avatar: PNG, GIF ili JPG. Najviše 2MB. Biće smanjena na 120x120px + digest: Poslato posle dužeg perioda neaktivnosti sa pregledom svih bitnih stvari koje ste dobili dok ste bili odsutni + display_name: + few: %{count} karaktera preostala + many: %{count} karaktera preostalo + one: 1 karakter preostao + other: %{count} karaktera preostalo + header: PNG, GIF ili JPG. Najviše 2MB. Biće smanjena na 700x335px + locked: Zahteva da pojedinačno odobrite pratioce + note: + few: %{count} karaktera preostal + many: %{count} karaktera preostalo + one: 1 karakter preostao + other: %{count} karaktera preostalo + setting_noindex: Utiče na Vaš javni profil i statusne strane + setting_theme: Utiče kako će Mastodont izgledati kada ste prijavljeni sa bilo kog uređaja. + imports: + data: CSV fajl izvezen sa druge Mastodont instance + sessions: + otp: Unesite dvofaktorski kod sa Vašeg telefona ili koristite jedan od kodova za oporavak. + user: + filtered_languages: Označeni jezici će za Vas biti isfiltrirani sa javnih lajni + labels: + defaults: + avatar: Avatar + confirm_new_password: Potvrdite novu lozinku + confirm_password: Potvrdite lozinku + current_password: Trenutna lozinka + data: Podaci + display_name: Ime za prikaz + email: Adresa e-pošte + expires_in: Ističe nakon + filtered_languages: Filtrirani jezici + header: Zaglavlje + locale: Jezik + locked: Zaključaj nalog + max_uses: Maksimalni broj korišćenja + new_password: Nova lozinka + note: Biografija + otp_attempt: Dvofaktorski kod + password: Lozinka + setting_auto_play_gif: Automatski puštaj animirane GIF-ove + setting_boost_modal: Prikaži dijalog za potvrdu pre davanja podrške + setting_default_privacy: Privatnost objava + setting_default_sensitive: Uvek označi multimediju kao osetljivu + setting_delete_modal: Prikaži dijalog za potvrdu pre brisanja tuta + setting_noindex: Odjavi se od indeksiranja search engine-a + setting_reduce_motion: Smanji pokrete u animacijama + setting_system_font_ui: Koristi sistemski font + setting_theme: Tema sajta + setting_unfollow_modal: Prikaži dijalog za potvrdu pre nego što otpratite nekoga + severity: Oštrina + type: Tip uvoza + username: Korisničko ime + interactions: + must_be_follower: Blokiraj obaveštenja od korisnika koji me ne prate + must_be_following: Blokiraj obaveštenja od ljudi koje ne pratim + must_be_following_dm: Blokiraj direktne poruke od ljudi koje ne pratim + notification_emails: + digest: Šalji e-poštu sa sažetkom + favourite: Šalji e-poštu kada neko stavi da mu je Vaš status omiljen + follow: Šalji e-poštu kada Vas neko zaprati + follow_request: Šalji e-poštu kada neko zatraži da Vas zaprati + mention: Šalji e-poštu kada Vas neko pomene + reblog: Šalji e-poštu kada neko podrži Vaš status + 'no': Ne + required: + mark: "*" + text: obavezno + 'yes': Da diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index 41dada77b..4e3599e5f 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -45,7 +45,7 @@ sr: otp_attempt: Двофакторски код password: Лозинка setting_auto_play_gif: Аутоматски пуштај анимиране GIF-ове - setting_boost_modal: Прикажи дијалог за потврду пре погуравања + setting_boost_modal: Прикажи дијалог за потврду пре давања подршке setting_default_privacy: Приватност објава setting_default_sensitive: Увек означи мултимедију као осетљиву setting_delete_modal: Прикажи дијалог за потврду пре брисања тута @@ -67,7 +67,7 @@ sr: follow: Шаљи е-пошту када Вас неко запрати follow_request: Шаљи е-пошту када неко затражи да Вас запрати mention: Шаљи е-пошту када Вас неко помене - reblog: Шаљи е-пошту када неко погура Ваш статус + reblog: Шаљи е-пошту када неко подржи Ваш статус 'no': Не required: mark: "*" diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml new file mode 100644 index 000000000..45fb1c1ba --- /dev/null +++ b/config/locales/sr-Latn.yml @@ -0,0 +1,723 @@ +--- +sr-Latn: + about: + about_hashtag_html: Ovo su javni statusi tagovani sa #%{hashtag}. Možete odgovarati na njih ako imate nalog bilo gde u fediversu. + about_mastodon_html: Mastodont je društvena mreža bazirana na otvorenim protokolima i slobodnom softveru otvorenog koda. Decentralizovana je kao što je decentralizovana e-pošta. + about_this: O instanci + closed_registrations: Registracije su trenutno zatvorene na ovoj instanci. Ipak! Možete naći drugu instancu na kojoj ćete napraviti nalog i odatle dobiti pristup istoj ovoj mreži. + contact: Kontakt + contact_missing: Nije postavljeno + contact_unavailable: N/A + description_headline: Šta je %{domain}? + domain_count_after: ostale instance + domain_count_before: Povezan na + extended_description_html: | +

Dobro mesto za pravila

+

Prošireni opis koji još nije postavljen.

+ features: + humane_approach_body: Učeći od grešaka sa ostalih mreža, a da bi se borio protiv zloupotreba na društvenim mrežama, Mastodont pokušava da pravi što etičkije odluke prilikom razvoja. + humane_approach_title: Humaniji pristup + not_a_product_body: Mastodont nije komercijalna mreža. Nema reklama, nema skupljanja privatnih podataka, nema zaštićenih delova. Nema centralnog autoriteta. + not_a_product_title: Vi ste osoba, ne proizvod + real_conversation_body: Sa 500 karaktera na raspolaganju i podrškom za granularniji sadržaj i upozorenja na osetljiviji sadržaj, možete se izraziti kako god želite. + real_conversation_title: Pravljen za pravi razgovor + within_reach_body: Više aplikacija za iOS, Android, kao i druge platforme zahvaljujući ekosistemu dobrih API-ja će Vam omogućiti da ostanete u kontaktu sa prijateljima svuda. + within_reach_title: Uvek u kontaktu + find_another_instance: Nađite drugu instancu + generic_description: "%{domain} je server na mreži" + hosted_on: Mastodont hostovan na %{domain} + learn_more: Saznajte više + other_instances: Lista instanci + source_code: Izvorni kod + status_count_after: statusa + status_count_before: Koji su napisali + user_count_after: korisnika + user_count_before: Dom za + what_is_mastodon: Šta je Mastodont? + accounts: + follow: Follow + followers: Followers + following: Following + media: Multimedija + moved_html: "%{name} je pomeren na %{new_profile_link}:" + nothing_here: Ovde nema ništa! + people_followed_by: Ljudi koje %{name} prati + people_who_follow: Ljudi koji prate %{name} + posts: Tutovi + posts_with_replies: Tutovi i odgovori + remote_follow: Udaljena praćenja + reserved_username: Korisničko ime je rezervisano + roles: + admin: Administrator + moderator: Moderator + unfollow: Otprati + admin: + account_moderation_notes: + account: Moderator + create: Napravi + created_at: Datum + created_msg: Moderatorska beleška uspešno napravljena! + delete: Obriši + destroyed_msg: Moderatorska beleška uspešno obrisana! + accounts: + are_you_sure: Da li ste sigurni? + by_domain: Domen + confirm: Potvrdi + confirmed: Potvrđeno + demote: Ražaluj + disable: Isključi + disable_two_factor_authentication: Isključi 2FA + disabled: Isključena + display_name: Prikazano ime + domain: Domen + edit: Izmeni + email: E-pošta + enable: Uključi + enabled: Uključeno + feed_url: Adresa dovoda + followers: Pratioci + followers_url: Adresa pratioca + follows: Praćeni + inbox_url: Adresa sandučeta + ip: IP + location: + all: Sve + local: Lokalne + remote: Udaljene + title: Lokacija + login_status: Status prijave + media_attachments: Multimedijalni prilozi + memorialize: Prebaci u in memoriam + moderation: + all: Svi + silenced: Ućutkani + suspended: Suspendovani + title: Moderacija + moderation_notes: Moderatorske beleške + most_recent_activity: Najskorija aktivnost + most_recent_ip: Najskorija IP adresa + not_subscribed: Nije pretplaćen + order: + alphabetic: Abecedni + most_recent: Najskoriji + title: Redosled + outbox_url: Odlazno sanduče + perform_full_suspension: Izvrši kompletno isključenje + profile_url: Adresa profila + promote: Unapredi + protocol: Protokol + public: Javno + push_subscription_expires: PuSH subscription expires + redownload: Osveži avatar + reset: Resetuj + reset_password: Resetuj lozinku + resubscribe: Ponovo se pretplati + role: Ovlašćenja + roles: + admin: Administrator + moderator: Moderator + staff: Osoblje + user: Korisnik + salmon_url: Salmon adresa + search: Pretraga + shared_inbox_url: Adresa deljenog sandučeta + show: + created_reports: Prijave koje je napravio ovaj nalog + report: prijava + targeted_reports: Prijave napravljene o ovom nalogu + silence: Ućutkaj + statuses: Statusi + subscribe: Pretplati se + title: Nalozi + undo_silenced: Ukini ćutanje + undo_suspension: Ukini suspenziju + unsubscribe: Ukini pretplatu + username: Korisničko ime + web: Veb + action_logs: + actions: + confirm_user: "%{name} je potvrdio adresu e-pošte korisnika %{target}" + create_custom_emoji: "%{name} je otpremio novi emotikon %{target}" + create_domain_block: "%{name} je blokirao domen %{target}" + create_email_domain_block: "%{name} je stavio na crnu listu domen e-pošte %{target}" + demote_user: "%{name} je ražalovao korisnika %{target}" + destroy_domain_block: "%{name} je odblokirao domen %{target}" + destroy_email_domain_block: "%{name} je stavio na belu listu domen e-pošte %{target}" + destroy_status: "%{name} je uklonio status korisnika %{target}" + disable_2fa_user: "%{name} je isključio obaveznu dvofaktorsku identifikaciju za korisnika %{target}" + disable_custom_emoji: "%{name} je onemogućio emotikon %{target}" + disable_user: "%{name} je onemogućio prijavljivanje korisniku %{target}" + enable_custom_emoji: "%{name} je omogućio emotikon %{target}" + enable_user: "%{name} je omogućio prijavljivanje za korisnika %{target}" + memorialize_account: "%{name} je pretvorio stranu naloga %{target} kao in memoriam stranu" + promote_user: "%{name} je unapredio korisnika %{target}" + reset_password_user: "%{name} je resetovao lozinku korisniku %{target}" + resolve_report: "%{name} je odbacio prijavu %{target}" + silence_account: "%{name} je ućutkao nalog %{target}" + suspend_account: "%{name} je suspendovao nalog %{target}" + unsilence_account: "%{name} je ukinuo ćutanje nalogu %{target}" + unsuspend_account: "%{name} je ukinuo suspenziju nalogu %{target}" + update_custom_emoji: "%{name} je izmenio emotikon %{target}" + update_status: "%{name} je izmenio status korisnika %{target}" + title: Zapisnik + custom_emojis: + by_domain: Domen + copied_msg: Uspešno napravljena lokalna kopija emotikona + copy: Kopiraj + copy_failed_msg: Ne mogu da napravim lokalnu kopiju tog emotikona + created_msg: Emotikon uspešno napravljen! + delete: Obriši + destroyed_msg: Emotikon uspešno obrisan! + disable: Onemogući + disabled_msg: Emotikon uspešno onemogućen + emoji: Emotikon + enable: Omogući + enabled_msg: Emotikon uspešno omogućen + image_hint: PNG do 50KB + listed: Izlistan + new: + title: Dodaj novi proizvoljni emotikon + overwrite: Prepiši + shortcode: Prečica + shortcode_hint: Najmanje 2 karaktera, dozvoljeni su samo slova, brojevi i donje crte + title: Proizvoljni emotikoni + unlisted: Neizlistan + update_failed_msg: Ne mogu da ažuriram ovaj emotikon + updated_msg: emotikon uspešno ažuriran! + upload: Otpremi + domain_blocks: + add_new: Dodaj novi + created_msg: Blokiranje domena se obrađuje + destroyed_msg: Blokiranje domena je opozvano + domain: Domen + new: + create: Napravi blokadu + hint: Blokiranje domena neće sprečiti pravljenje naloga u bazi, ali će retroaktivno i automatski primeniti određene moderatorske metode nad tim nalozima. + severity: + desc_html: "Ućutkavanje će sve statuse ovog naloga učiniti nevidiljivim za sve, osim za one koji nalog već prate. Suspenzija će ukloniti sav sadržaj naloga, svu multimediju, i profilne podatke. Koristite Ništa ako samo želite da odbacite multimedijalne fajlove." + noop: Ništa + silence: Ućutkavanje + suspend: Suspenzija + title: Novo blokiranje domena + reject_media: Odbaci multimediju + reject_media_hint: Uklanja lokalno uskladištene multimedijske fajlove i odbija da ih skida na dalje. Nebitno je za suspenziju. + severities: + noop: Ništa + silence: Ućutkavanje + suspend: Suspenzija + severity: Oštrina + show: + affected_accounts: + few: Utiče na %{count} naloga u bazi + many: Utiče na %{count} naloga u bazi + one: Utiče na jedan nalog u bazi + other: Utiče na %{count} naloga u bazi + retroactive: + silence: Ugasi ućutkivanje za sve postojeće naloge sa ovog domena + suspend: Ugasi suspenzije za sve postojeće naloge sa ovog domena + title: Poništi blokadu domena za domen %{domain} + undo: Poništi + title: Blokade domena + undo: Poništi + email_domain_blocks: + add_new: Dodaj novuAdd new + created_msg: Uspešno dodao domen e-pošte na crnu listu + delete: Ukloni + destroyed_msg: Uspešno uklonjen domen e-pošte sa crne liste + domain: Domen + new: + create: Dodaj domen + title: Nova stavka u crnoj listi e-pošti + title: Crna lista adresa e-pošte + instances: + account_count: Poznati nalozi + domain_name: Domen + reset: Resetuj + search: Pretraga + title: Poznate instance + invites: + filter: + all: Sve + available: Aktivne + expired: Istekle + title: Filter + title: Pozivnice + reports: + action_taken_by: Akciju izveo + are_you_sure: Da li ste sigurni? + comment: + label: Komentar + none: Ništa + delete: Obriši + id: ID + mark_as_resolved: Označi kao rešen + nsfw: + 'false': Otkrij medijske priloge + 'true': Sakrij medijske priloge + report: 'Prijava #%{id}' + report_contents: Sadržaj + reported_account: Prijavljeni nalog + reported_by: Prijavio + resolved: Rešeni + silence_account: Ućutkaj nalog + status: Status + suspend_account: Suspenduj nalog + target: Cilj + title: Prijave + unresolved: Nerešeni + view: Pogledaj + settings: + bootstrap_timeline_accounts: + desc_html: Odvojite više korisničkih imena zarezom. Radi samo za lokalne i otključane naloge. Ako je prazno, onda se odnosi na sve lokalne administratore. + title: Nalozi za automatsko zapraćivanje za nove korisnike + contact_information: + email: Poslovna e-pošta + username: Kontakt korisničko ime + registrations: + closed_message: + desc_html: Prikazuje se na glavnoj strani kada je instanca zatvorena za registracije. Možete koristiti HTML tagove + title: Poruka o zatvorenoj registraciji + deletion: + desc_html: Dozvoli svima da mogu da obrišu svoj nalog + title: Otvori brisanje naloga + min_invite_role: + disabled: Niko + title: Samo preko pozivnice + open: + desc_html: Dozvoli svakome da kreira nalog + title: Otvorena registracija + show_staff_badge: + desc_html: Prikaži bedž osoblja na korisničkoj strani + title: Prikaži bedž osoblja + site_description: + desc_html: Uvodni pasus na naslovnoj strani i u meta HTML tagovima. Možete koristiti HTML tagove, konkretno <a> i <em>. + title: Opis instance + site_description_extended: + desc_html: Dobro mesto za vaš kod ponašanja, pravila, smernice i druge stvari po kojima se Vaša instanca razlikuje. Možete koristiti HTML tagove + title: Proizvoljne dodatne informacije + site_terms: + desc_html: Možete pisati Vašu politiku privatnosti, uslove korišćenja i ostale legalne stvari. Možete koristiti HTML tagove + title: Proizvoljni uslovi korišćenja + site_title: Ime instance + thumbnail: + desc_html: Koristi se za preglede kroz OpenGraph i API. Preporučuje se 1200x630px + title: Sličica instance + timeline_preview: + desc_html: Prikaži javnu lajnu na početnoj strani + title: Pregled lajne + title: Postavke sajta + statuses: + back_to_account: Nazad na stranu naloga + batch: + delete: Obriši + nsfw_off: NSFW isključen + nsfw_on: NSFW uključen + execute: Izvrši + failed_to_execute: Neuspelo izvršavanje + media: + hide: Sakrij multimediju + show: Prikaži multimediju + title: Multimedija + no_media: Bez multimedije + title: Statusi naloga + with_media: Sa multimedijom + subscriptions: + callback_url: Callback URL + confirmed: Potvrđeno + expires_in: Ističe za + last_delivery: Poslednja dostava + title: WebSub + topic: Topic + title: Administracija + admin_mailer: + new_report: + body: "%{reporter} je prijavio %{target}" + subject: Nova prijava za %{instance} (#%{id}) + application_mailer: + salutation: "%{name}," + settings: 'Promeni podešavanja e-pošte: %{link}' + signature: Mastodont obaveštenje sa instance %{instance} + view: 'Pogledaj:' + applications: + created: Aplikacija uspešno napravljena + destroyed: Aplikacija uspešno obrisana + invalid_url: Data adresa nije ispravna + regenerate_token: Rekreiraj pristupni token + token_regenerated: Pristupni token uspešno rekreiran + warning: Oprezno sa ovim podacima. Nikad je ne delite ni sa kim! + your_token: Vaš pristupni token + auth: + agreement_html: Pristupanjem instanci se slažete sa pravilima instance i uslovima korišćenja. + change_password: Bezbednost + delete_account: Obriši nalog + delete_account_html: Ako želite da obrišete Vaš nalog, možete nastaviti ovde. Bićete upitani da potvrdite. + didnt_get_confirmation: Niste dobili poruku sa uputstvima za potvrdu naloga? + forgot_password: Zaboravili ste lozinku? + invalid_reset_password_token: Token za resetovanje lozinke je neispravan ili je istekao. Zatražite novi. + login: Prijavi se + logout: Odjava + migrate_account: Pomeri u drugi nalog + migrate_account_html: Ako želite da preusmerite ovaj nalog na neki drugi, možete to podesiti ovde. + register: Registruj se + resend_confirmation: Pošalji poruku sa uputstvima o potvrdi naloga ponovo + reset_password: Resetuj lozinku + set_new_password: Postavi novu lozinku + authorize_follow: + error: Nažalost, desila se greška pri traženju udaljenog naloga + follow: Zaprati + follow_request: 'Poslali ste zahtev za praćenjen za:' + following: 'Sjajno! Sada pratite:' + post_follow: + close: Ili možete zatvoriti ovaj prozor. + return: Vrati se na profil ovog korisnika + web: Idi na veb + title: Zaprati %{acct} + datetime: + distance_in_words: + about_x_hours: "%{count}h" + about_x_months: "%{count}mesec" + about_x_years: "%{count}god" + almost_x_years: "%{count}god" + half_a_minute: Upravo sad + less_than_x_minutes: "%{count}m" + less_than_x_seconds: Upravo sad + over_x_years: "%{count}god" + x_days: "%{count}d" + x_minutes: "%{count}m" + x_months: "%{count}mesec" + x_seconds: "%{count}s" + deletes: + bad_password_msg: Dobar pokušaj, hakeri! Neispravna lozinka + confirm_password: Unesite trenutnu lozinku da bismo proverili Vaš identitet + description_html: Ovo će trajno, bespovratno ukloniti sadržaj sa Vašef naloga i deaktivirati ga. Vaše korisničko ime će ostati rezervisano da se spreči da se neko ne predstavlja kao Vi sutra. + proceed: Obriši nalog + success_msg: Vaš nalog je uspešno obrisan + warning_html: Garantovano je samo brisanje sadržaja sa ove instance. Sadržaj koji je deljen dalje će verovatno da ostavi neke tragove. Nedostupni i ugašeni serveri, kao i serveri koji su odjavljeni od primanja statusa od Vas, neće ažurirati svoje baze. + warning_title: Dostupnost rasejanog sadržaja + errors: + '403': Nemate dozvola da vidite ovu stranu. + '404': Strana koju ste tražili ne postoji. + '410': Strana koju ste tražili više ne postoji. + '422': + content: Security verification failed. Are you blocking cookies? + title: Security verification failed + '429': Uspored + '500': + content: Izvinjavamo se, nešto je pošlo po zlu sa ove strane. + title: Strana nije ispravna + noscript_html: Da biste koristili Mastodont veb aplikaciju, omogućite JavaScript. U suprotnom, probajte neku od originalnih aplikacija za Mastodont za Vašu platformu. + exports: + blocks: Blokirali ste + csv: CSV + follows: PRatite + mutes: Mutirali ste + storage: Multimedijalno skladište + followers: + domain: Domen + explanation_html: Ako želite da osigurate privatnost Vaših statusa, morate biti svesni ko Vas prati. Vaši privatni statusi se šalju na sve instance na kojima imate pratioce. Možda želite da ih pregledate i da uklonite one pratioce na onim instancama za koje nemate poverenja da će poštovati Vašu privatnost. + followers_count: Broj pratilaca + lock_link: Zaključajte nalog + purge: Ukloni iz pratioca + success: + few: U procesu blokiranja pratioca sa %{count} domena... + many: U procesu blokiranja pratioca sa %{count} domena... + one: U procesu blokiranja pratioca sa jednog domena... + other: U procesu blokiranja pratioca sa %{count} domena... + true_privacy_html: Zapamtite da se prava privatnost može postići samo šifrovanjem sa kraja na kraj. + unlocked_warning_html: Svako može da Vas zaprati da odmah vidi Vaše privatne statuse. %{lock_link} da biste pregledali i odbacili pratioce. + unlocked_warning_title: Vaš nalog nije zaključan + generic: + changes_saved_msg: Izmene uspešno sačuvane! + powered_by: omogućio %{link} + save_changes: Snimi izmene + validation_errors: + few: Nešto nije baš kako treba! Pregledajte %{count} greške ispod + many: Nešto nije baš kako treba! Pregledajte %{count} grešaka ispod + one: Nešto nije baš kako treba! Pregledajte greške ispod + other: Nešto nije baš kako treba! Pregledajte %{count} grešaka ispod + imports: + preface: Možete uvesti podatke koje ste izvezli sa druge instance, kao što su liste ljudi koje ste pratili ili blokirali. + success: Vaši podaci su uspešno otpremljeni i biće obrađeni uskoro + types: + blocking: Lista blokiranja + following: Lista pratilaca + muting: Lista mutiranih + upload: Otpremi + in_memoriam_html: In Memoriam. + invites: + delete: Deaktiviraj + expired: Isteklo + expires_in: + '1800': 30 minuta + '21600': 6 sati + '3600': 1 sad + '43200': 12 sati + '86400': 1 dan + expires_in_prompt: Nikad + generate: Generiši + max_uses: + few: "%{count} korišćenja" + many: "%{count} korišćenja" + one: 1 korišćenje + other: "%{count} korišćenja" + max_uses_prompt: Bez ograničenja + prompt: Generiši i podeli linkove sa drugima da im odobrite pristup ovoj instanci + table: + expires_at: Ističe + uses: Korišćenja + title: Pozovi ljude + landing_strip_html: "%{name} je korisnik na %{link_to_root_path}. Možete ga zapratiti ili komunicirati sa njim ako imte nalog bilo gde u fediversu." + landing_strip_signup_html: Ako nemate, možete se registrovati ovde. + lists: + errors: + limit: Dostigli ste limit broja listi + media_attachments: + validations: + images_and_video: Ne može da se prikači video na status koji već ima slike + too_many: Ne može se prikačiti više od 4 fajla + migrations: + acct: korisnik@domen novog naloga + currently_redirecting: 'Profil Vam je podešen da preusmerava na :' + proceed: Sačuvaj + updated_msg: Prebacivanje postavki Vašeg naloga uspešno izmenjeno! + moderation: + title: Moderacija + notification_mailer: + digest: + body: 'Evo kratak pregled šta ste propustili na instanci %{instance} od poslednje posete od %{since}:' + mention: "%{name} Vas je pomenuo u:" + new_followers_summary: + few: Dobili ste %{count} nova pratioca! Sjajno! + many: Dobili ste %{count} novih pratioca! Sjajno! + one: Dobili ste jednog novog pratioca! Jeee! + other: Dobili ste %{count} novih pratioca! Sjajno! + subject: + few: "%{count} nova obaveštenja od poslednje posete \U0001F418" + many: "%{count} novih obaveštenja od poslednje posete \U0001F418" + one: "1 novo obaveštenje od poslednje posete \U0001F418" + other: "%{count} novih obaveštenja od poslednje posete \U0001F418" + favourite: + body: "%{name} je postavio kao omiljen Vaš status:" + subject: "%{name} je postavio kao omiljen Vaš status" + follow: + body: "%{name} Vas je zapratio!" + subject: "%{name} Vas je zapratio" + follow_request: + body: "%{name} je zatražio da Vas zaprati" + subject: 'Pratioci na čekanju: %{name}' + mention: + body: "%{name} Vas je pomenuo u:" + subject: "%{name} Vas je pomenuo" + reblog: + body: "%{name} Vam je podržao(la) status:" + subject: "%{name} je podržao(la) Vaš status" + number: + human: + decimal_units: + format: "%n%u" + units: + billion: B + million: M + quadrillion: Q + thousand: K + trillion: T + unit: '' + pagination: + next: Sledeći + prev: Prethodni + truncate: "…" + preferences: + languages: Jezici + other: Ostali + publishing: Objavljivanje + web: Veb + push_notifications: + favourite: + title: "%{name} je stavio Vaš status za omiljeni" + follow: + title: "%{name} Vas je zapratio" + group: + title: "%{count} obaveštenja" + mention: + action_boost: Podrži + action_expand: Prikaži još + action_favourite: Omiljeni + title: "%{name} Vas je pomenuo" + reblog: + title: "%{name} je podržao(la) Vaš status" + remote_follow: + acct: Unesite Vaš korisnik@domen sa koga želite da pratite + missing_resource: Ne mogu da nađem zahtevanu adresu preusmeravanja za Vaš nalog + proceed: Nastavite da zapratite + prompt: 'Zapratite će:' + sessions: + activity: Poslednja aktivnost + browser: Veb čitač + browsers: + alipay: Alipay + blackberry: Blekberi + chrome: Hrom + edge: Microsoft Edge + firefox: Firefox + generic: Nepoznati veb čitač + ie: Internet Explorer + micro_messenger: MicroMessenger + nokia: Nokia S40 Ovi Browser + opera: Opera + phantom_js: PhantomJS + qq: QQ Browser + safari: Safari + uc_browser: UCBrowser + weibo: Weibo + current_session: Trenutna sesija + description: "%{browser} sa %{platform}" + explanation: Ovo su trenutno prijavljeni veb čitači na Vaš Mastodont nalog. + ip: IP + platforms: + adobe_air: Adobe Air-a + android: Androida + blackberry: Blekberija + chrome_os: Hrom OS-a + firefox_os: Fajerfoks OS-a + ios: iOS + linux: Linuksa + mac: Mac-a + other: nepoznate platforme + windows: Vindouza + windows_mobile: Vindouz mobilnog + windows_phone: Vindouz telefona + revoke: Opozovi + revoke_success: Sesija uspešno opozvana + title: Sesije + settings: + authorized_apps: Autorizovane aplikacije + back: Nazad na Mastodonta + delete: Brisanje naloga + development: Razvoj + edit_profile: Izmena profila + export: Izvoz podataka + followers: Autorizovani pratioci + import: Uvoz + migrate: Prebacivanje naloga + notifications: Obaveštenja + preferences: Podešavanja + settings: Postavke + two_factor_authentication: Dvofaktorska identifikacija + your_apps: Vaše aplikacije + statuses: + open_in_web: Otvori u vebu + over_character_limit: ograničenje od %{max} karaktera prekoračeno + pin_errors: + limit: Već imate prikačen najveći broj tutova + ownership: Tuđi tutovi ne mogu da se prikače + private: Tutovi koji nisu javni ne mogu da se prikače + reblog: Podrška ne može da se prikači + show_more: Prikaži još + title: '%{name}: "%{quote}"' + visibilities: + private: Samo pratioci + private_long: Samo prikaži pratiocima + public: Javno + public_long: Svako može da vidi + unlisted: Neizlistano + unlisted_long: Svako može da vidi, ali nije izlistano na javnim lajnama + stream_entries: + click_to_show: Klikni da vidiš + pinned: Prikačeni tut + reblogged: podržano + sensitive_content: Osetljiv sadržaj + terms: + body_html: | +

Privacy Policy

+ +

What information do we collect?

+ +

We collect information from you when you register on our site and gather data when you participate in the forum by reading, writing, and evaluating the content shared here.

+ +

When registering on our site, you may be asked to enter your name and e-mail address. You may, however, visit our site without registering. Your e-mail address will be verified by an email containing a unique link. If that link is visited, we know that you control the e-mail address.

+ +

When registered and posting, we record the IP address that the post originated from. We also may retain server logs which include the IP address of every request to our server.

+ +

What do we use your information for?

+ +

Any of the information we collect from you may be used in one of the following ways:

+ + + +

How do we protect your information?

+ +

We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information.

+ +

What is your data retention policy?

+ +

We will make a good faith effort to:

+ + + +

Do we use cookies?

+ +

Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow). These cookies enable the site to recognize your browser and, if you have a registered account, associate it with your registered account.

+ +

We use cookies to understand and save your preferences for future visits and compile aggregate data about site traffic and site interaction so that we can offer better site experiences and tools in the future. We may contract with third-party service providers to assist us in better understanding our site visitors. These service providers are not permitted to use the information collected on our behalf except to help us conduct and improve our business.

+ +

Do we disclose any information to outside parties?

+ +

We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety. However, non-personally identifiable visitor information may be provided to other parties for marketing, advertising, or other uses.

+ +

Third party links

+ +

Occasionally, at our discretion, we may include or offer third party products or services on our site. These third party sites have separate and independent privacy policies. We therefore have no responsibility or liability for the content and activities of these linked sites. Nonetheless, we seek to protect the integrity of our site and welcome any feedback about these sites.

+ +

Children's Online Privacy Protection Act Compliance

+ +

Our site, products and services are all directed to people who are at least 13 years old. If this server is in the USA, and you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site.

+ +

Online Privacy Policy Only

+ +

This online privacy policy applies only to information collected through our site and not to information collected offline.

+ + + +

By using our site, you consent to our web site privacy policy.

+ +

Changes to our Privacy Policy

+ +

If we decide to change our privacy policy, we will post those changes on this page.

+ +

This document is CC-BY-SA. It was last updated May 31, 2013.

+ +

Originally adapted from the Discourse privacy policy.

+ title: Uslovi korišćenja i politika privatnosti instance %{instance} + themes: + default: Mastodont + time: + formats: + default: "%b %d, %Y, %H:%M" + two_factor_authentication: + code_hint: Unesite kod sa Vaše aplikacije za proveru identiteta da potvrdite + description_html: Ako uključite dvofaktorsku identifikaciju, moraćete da imate telefon sa sobom da biste mogli da se prijavite. Telefon će onda generisati tokene za Vašu prijavu. + disable: Isključi + enable: Uključi + enabled: Dvofaktorska identifikacija je uključena + enabled_success: Dvofaktorska identifikacija je uspešno uključena + generate_recovery_codes: Generiši kodove za oporavak + instructions_html: "Skenirajte ovaj QR kod u Google Authenticator ili nekoj sličnoj TOTP aplikaciji na Vašem telefonu. Od sada, ta aplikacija će Vam generisati tokene koje morate uneti da biste se prijavili." + lost_recovery_codes: Kodovi za oporavak Vam omogućavaju da povratite pristup nalogu ako izgubite telefon. Ako izgubite kodove za oporavak, možete ih regenerisati ovde. Od tog trenutka, stari kodovi za oporavak više ne važe. + manual_instructions: 'Ukoliko ne možete da skenirate QR kod i morate ga unesete ručno, evo je ogoljena šifra:' + recovery_codes: Napravite rezervu kodova za oporavak + recovery_codes_regenerated: Kodovi za oporavak uspešno regenerisani + recovery_instructions_html: Ako ikada izgubite pristup telefonu, možete iskoristiti kodove za oporavak date ispod da povratite pristup nalogu. Držite kodove za oporavak na sigurnom. Na primer, odštampajte ih i čuvajte ih sa ostalim važnim dokumentima. + setup: Nameštanje + wrong_code: Uneseni kod nije ispravan! Da li su vremena na serveru i na uređaju ispravna? + users: + invalid_email: Adresa e-pošte nije ispravna + invalid_otp_token: Neispravni dvofaktorski kod + signed_in_as: 'Prijavljen kao:' diff --git a/config/locales/sr.yml b/config/locales/sr.yml index e59b5379c..6961ff841 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -1,7 +1,7 @@ --- sr: about: - about_hashtag_html: Ово су јавни статуси таговани са #%{hashtag}. Можете одговарати на њих ако имате налог било где у федиверзуму. + about_hashtag_html: Ово су јавни статуси таговани са #%{hashtag}. Можете одговарати на њих ако имате налог било где у федиверсу. about_mastodon_html: Мастодонт је друштвена мрежа базирана на отвореним протоколима и слободном софтверу отвореног кода. Децентрализована је као што је децентрализована е-пошта. about_this: О инстанци closed_registrations: Регистрације су тренутно затворене на овој инстанци. Ипак! Можете наћи другу инстанцу на којој ћете направити налог и одатле добити приступ истој овој мрежи. @@ -509,8 +509,8 @@ sr: body: "%{name} Вас је поменуо у:" subject: "%{name} Вас је поменуо" reblog: - body: "%{name} Вам је погурао статус:" - subject: "%{name} је погурао Ваш статус" + body: "%{name} Вам је подржао(ла) статус:" + subject: "%{name} је подржао(ла) Ваш статус" number: human: decimal_units: @@ -539,12 +539,12 @@ sr: group: title: "%{count} обавештења" mention: - action_boost: Погурај + action_boost: Подржи action_expand: Прикажи још action_favourite: Омиљени title: "%{name} Вас је поменуо" reblog: - title: "%{name} је погурао Ваш статус" + title: "%{name} је подржао(ла) Ваш статус" remote_follow: acct: Унесите Ваш корисник@домен са кога желите да пратите missing_resource: Не могу да нађем захтевану адресу преусмеравања за Ваш налог @@ -611,7 +611,7 @@ sr: limit: Већ имате прикачен највећи број тутова ownership: Туђи тутови не могу да се прикаче private: Тутови који нису јавни не могу да се прикаче - reblog: Погуравање не може да се прикачи + reblog: Подршка не може да се прикачи show_more: Прикажи још title: '%{name}: "%{quote}"' visibilities: @@ -624,7 +624,7 @@ sr: stream_entries: click_to_show: Кликни да видиш pinned: Прикачени тут - reblogged: погурано + reblogged: подржано sensitive_content: Осетљив садржај terms: body_html: | -- cgit From 04ecf44c2f78ae29911027352a3e9fb21187e20c Mon Sep 17 00:00:00 2001 From: Patrick Figel Date: Tue, 2 Jan 2018 16:55:00 +0100 Subject: Add confirmation step for email changes (#6071) * Add confirmation step for email changes This adds a confirmation step for email changes of existing users. Like the initial account confirmation, a confirmation link is sent to the new address. Additionally, a notification is sent to the existing address when the change is initiated. This message includes instruction to reset the password immediately or to contact the instance admin if the change was not initiated by the account owner. Fixes #3871 * Add review fixes --- Gemfile | 2 +- Gemfile.lock | 2 +- app/controllers/auth/registrations_controller.rb | 4 ++++ app/mailers/user_mailer.rb | 15 ++++++++++++- app/models/user.rb | 11 +++++---- app/views/user_mailer/email_changed.en.html.erb | 15 +++++++++++++ app/views/user_mailer/email_changed.en.text.erb | 13 +++++++++++ .../reconfirmation_instructions.en.html.erb | 15 +++++++++++++ .../reconfirmation_instructions.en.text.erb | 12 ++++++++++ config/initializers/devise.rb | 5 ++++- config/locales/devise.en.yml | 4 ++++ spec/mailers/user_mailer_spec.rb | 26 ++++++++++++++++++++++ 12 files changed, 116 insertions(+), 8 deletions(-) create mode 100644 app/views/user_mailer/email_changed.en.html.erb create mode 100644 app/views/user_mailer/email_changed.en.text.erb create mode 100644 app/views/user_mailer/reconfirmation_instructions.en.html.erb create mode 100644 app/views/user_mailer/reconfirmation_instructions.en.text.erb (limited to 'config/locales') diff --git a/Gemfile b/Gemfile index 16df1c376..a5bf2daff 100644 --- a/Gemfile +++ b/Gemfile @@ -28,7 +28,7 @@ gem 'browser' gem 'charlock_holmes', '~> 0.7.5' gem 'iso-639' gem 'cld3', '~> 3.2.0' -gem 'devise', '~> 4.2' +gem 'devise', '~> 4.3' gem 'devise-two-factor', '~> 3.0' gem 'doorkeeper', '~> 4.2' gem 'fast_blank', '~> 1.0' diff --git a/Gemfile.lock b/Gemfile.lock index 46c87d7f7..1b7af06a4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -561,7 +561,7 @@ DEPENDENCIES charlock_holmes (~> 0.7.5) cld3 (~> 3.2.0) climate_control (~> 0.2) - devise (~> 4.2) + devise (~> 4.3) devise-two-factor (~> 3.0) doorkeeper (~> 4.2) dotenv-rails (~> 2.2) diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index da0b6512f..b8ff4e54f 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -37,6 +37,10 @@ class Auth::RegistrationsController < Devise::RegistrationsController new_user_session_path end + def after_update_path_for(_resource) + edit_user_registration_path + end + def check_enabled_registrations redirect_to root_path if single_user_mode? || !allowed_registrations? end diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 5a062dc25..7821be32b 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -13,7 +13,9 @@ class UserMailer < Devise::Mailer return if @resource.disabled? I18n.with_locale(@resource.locale || I18n.default_locale) do - mail to: @resource.unconfirmed_email.blank? ? @resource.email : @resource.unconfirmed_email, subject: I18n.t('devise.mailer.confirmation_instructions.subject', instance: @instance) + mail to: @resource.unconfirmed_email.blank? ? @resource.email : @resource.unconfirmed_email, + subject: I18n.t(@resource.pending_reconfirmation? ? 'devise.mailer.reconfirmation_instructions.subject' : 'devise.mailer.confirmation_instructions.subject', instance: @instance), + template_name: @resource.pending_reconfirmation? ? 'reconfirmation_instructions' : 'confirmation_instructions' end end @@ -39,4 +41,15 @@ class UserMailer < Devise::Mailer mail to: @resource.email, subject: I18n.t('devise.mailer.password_change.subject') end end + + def email_changed(user, **) + @resource = user + @instance = Rails.configuration.x.local_domain + + return if @resource.disabled? + + I18n.with_locale(@resource.locale || I18n.default_locale) do + mail to: @resource.email, subject: I18n.t('devise.mailer.email_changed.subject') + end + end end diff --git a/app/models/user.rb b/app/models/user.rb index 3ce6517a6..a82a7d28a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -41,12 +41,15 @@ class User < ApplicationRecord ACTIVE_DURATION = 14.days - devise :registerable, :recoverable, - :rememberable, :trackable, :validatable, :confirmable, - :two_factor_authenticatable, :two_factor_backupable, - otp_secret_encryption_key: ENV['OTP_SECRET'], + devise :two_factor_authenticatable, + otp_secret_encryption_key: ENV['OTP_SECRET'] + + devise :two_factor_backupable, otp_number_of_backup_codes: 10 + devise :registerable, :recoverable, :rememberable, :trackable, :validatable, + :confirmable + belongs_to :account, inverse_of: :user, required: true belongs_to :invite, counter_cache: :uses accepts_nested_attributes_for :account diff --git a/app/views/user_mailer/email_changed.en.html.erb b/app/views/user_mailer/email_changed.en.html.erb new file mode 100644 index 000000000..c10680086 --- /dev/null +++ b/app/views/user_mailer/email_changed.en.html.erb @@ -0,0 +1,15 @@ +

Hello <%= @resource.email %>!

+ +<% if @resource&.unconfirmed_email? %> +

We're contacting you to notify you that the email you use on <%= @instance %> is being changed to <%= @resource.unconfirmed_email %>.

+<% else %> +

We're contacting you to notify you that the email you use on <%= @instance %> has been changed to <%= @resource.email %>.

+<% end %> + +

+ If you did not change your email, it is likely that someone has gained access to your account. Please change your password immediately or contact the instance admin if you're locked out of your account. +

+ +

Sincerely,

+ +

The <%= @instance %> team

diff --git a/app/views/user_mailer/email_changed.en.text.erb b/app/views/user_mailer/email_changed.en.text.erb new file mode 100644 index 000000000..971972461 --- /dev/null +++ b/app/views/user_mailer/email_changed.en.text.erb @@ -0,0 +1,13 @@ +Hello <%= @resource.email %>! + +<% if @resource&.unconfirmed_email? %> +We're contacting you to notify you that the email you use on <%= @instance %> is being changed to <%= @resource.unconfirmed_email %>. +<% else %> +We're contacting you to notify you that the email you use on <%= @instance %> has been changed to <%= @resource.email %>. +<% end %> + +If you did not change your email, it is likely that someone has gained access to your account. Please change your password immediately or contact the instance admin if you're locked out of your account. + +Sincerely, + +The <%= @instance %> team diff --git a/app/views/user_mailer/reconfirmation_instructions.en.html.erb b/app/views/user_mailer/reconfirmation_instructions.en.html.erb new file mode 100644 index 000000000..31866a3c8 --- /dev/null +++ b/app/views/user_mailer/reconfirmation_instructions.en.html.erb @@ -0,0 +1,15 @@ +

Hello <%= @resource.unconfirmed_email %>!

+ +

You requested a change to the email address you use on <%= @instance %>.

+ +

To confirm your new email, please click on the following link:
+<%= link_to 'Confirm my email address', confirmation_url(@resource, confirmation_token: @token) %>

+ +

If the above link did not work, copy and paste this URL into your address bar:
+<%= confirmation_url(@resource, confirmation_token: @token) %> + +

Please also check out our <%= link_to 'terms and conditions', terms_url %>.

+ +

Sincerely,

+ +

The <%= @instance %> team

diff --git a/app/views/user_mailer/reconfirmation_instructions.en.text.erb b/app/views/user_mailer/reconfirmation_instructions.en.text.erb new file mode 100644 index 000000000..c1c735b3a --- /dev/null +++ b/app/views/user_mailer/reconfirmation_instructions.en.text.erb @@ -0,0 +1,12 @@ +Hello <%= @resource.unconfirmed_email %>! + +You requested a change to the email address you use on <%= @instance %>. + +To confirm your new email, please click on the following link: +<%= confirmation_url(@resource, confirmation_token: @token) %> + +Please also check out our terms and conditions <%= terms_url %> + +Sincerely, + +The <%= @instance %> team diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 64c4e12ff..07912c28b 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -137,6 +137,9 @@ Devise.setup do |config| # Setup a pepper to generate the encrypted password. # config.pepper = '104d16705f794923e77c5e5167b52452d00646dc952a2d30b541c24086e647012c7b9625f253c51912e455981e503446772973d5f1638631196c819d7137fad4' + # Send a notification to the original email when the user's email is changed. + config.send_email_changed_notification = true + # Send a notification email when the user's password is changed config.send_password_change_notification = true @@ -160,7 +163,7 @@ Devise.setup do |config| # initial account confirmation) to be applied. Requires additional unconfirmed_email # db field (see migrations). Until confirmed, new email is stored in # unconfirmed_email column, and copied to email column on successful confirmation. - config.reconfirmable = false + config.reconfirmable = true # Defines which key will be used when confirming an account # config.confirmation_keys = [:email] diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml index 586c5349d..c5ae583ff 100644 --- a/config/locales/devise.en.yml +++ b/config/locales/devise.en.yml @@ -18,8 +18,12 @@ en: mailer: confirmation_instructions: subject: 'Mastodon: Confirmation instructions for %{instance}' + email_changed: + subject: 'Mastodon: Email changed' password_change: subject: 'Mastodon: Password changed' + reconfirmation_instructions: + subject: 'Mastodon: Confirm email for %{instance}' reset_password_instructions: subject: 'Mastodon: Reset password instructions' unlock_instructions: diff --git a/spec/mailers/user_mailer_spec.rb b/spec/mailers/user_mailer_spec.rb index 1f6d44015..9f17993e0 100644 --- a/spec/mailers/user_mailer_spec.rb +++ b/spec/mailers/user_mailer_spec.rb @@ -33,6 +33,20 @@ describe UserMailer, type: :mailer do instance: Rails.configuration.x.local_domain end + describe 'reconfirmation_instructions' do + let(:mail) { UserMailer.confirmation_instructions(receiver, 'spec') } + + it 'renders reconfirmation instructions' do + receiver.update!(email: 'new-email@example.com', locale: nil) + expect(mail.body.encoded).to include 'new-email@example.com' + expect(mail.body.encoded).to include 'spec' + expect(mail.body.encoded).to include Rails.configuration.x.local_domain + expect(mail.subject).to eq I18n.t('devise.mailer.reconfirmation_instructions.subject', + instance: Rails.configuration.x.local_domain, + locale: I18n.default_locale) + end + end + describe 'reset_password_instructions' do let(:mail) { UserMailer.reset_password_instructions(receiver, 'spec') } @@ -57,4 +71,16 @@ describe UserMailer, type: :mailer do include_examples 'localized subject', 'devise.mailer.password_change.subject' end + + describe 'email_changed' do + let(:mail) { UserMailer.email_changed(receiver) } + + it 'renders email change notification' do + receiver.update!(locale: nil) + expect(mail.body.encoded).to include receiver.email + end + + include_examples 'localized subject', + 'devise.mailer.email_changed.subject' + end end -- cgit