diff options
321 files changed, 3968 insertions, 2065 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml index 65f4e5df5..e968e8a07 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,6 +13,9 @@ aliases: ALLOW_NOPAM: true CONTINUOUS_INTEGRATION: true DISABLE_SIMPLECOV: true + PAM_ENABLED: true + PAM_DEFAULT_SERVICE: pam_test + PAM_CONTROLLED_SERVICE: pam_test_controlled working_directory: ~/projects/mastodon/ - &attach_workspace @@ -175,6 +178,8 @@ jobs: - *attach_workspace - run: bundle exec i18n-tasks check-normalized - run: bundle exec i18n-tasks unused + - run: bundle exec i18n-tasks missing -t plural + - run: bundle exec i18n-tasks check-consistent-interpolations workflows: version: 2 diff --git a/.env.test b/.env.test index 726351c5e..fa4e1d91f 100644 --- a/.env.test +++ b/.env.test @@ -3,7 +3,3 @@ NODE_ENV=test # Federation LOCAL_DOMAIN=cb6e6126.ngrok.io LOCAL_HTTPS=true -# test pam authentication -PAM_ENABLED=true -PAM_DEFAULT_SERVICE=pam_test -PAM_CONTROLLED_SERVICE=pam_test_controlled diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 46602fd2c..3890729e2 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,11 +1,17 @@ --- name: Feature Request -about: Suggest an idea for this project +about: I have a suggestion --- -[Issue text goes here]. +<!-- Please use a concise and distinct title for the issue --> -* * * * +<!-- Consider: Could it be implemented as a 3rd party app using the REST API instead? --> -- [ ] I searched or browsed the repo’s other issues to ensure this is not a duplicate. +### Pitch + +<!-- Describe your idea for a feature. Make sure it has not already been suggested/implemented/turned down before --> + +### Motivation + +<!-- Why do you think this feature is needed? Who would benefit from it? --> diff --git a/.github/ISSUE_TEMPLATE/support.md b/.github/ISSUE_TEMPLATE/support.md new file mode 100644 index 000000000..7fbc86ff1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/support.md @@ -0,0 +1,10 @@ +--- +name: Support +about: Ask for help with your deployment + +--- + +We primarily use GitHub as a bug and feature tracker. For usage questions, troubleshooting of deployments and other individual technical assistance, please use one of the resources below: + +- https://discourse.joinmastodon.org +- #mastodon on irc.freenode.net diff --git a/.ruby-version b/.ruby-version index 73462a5a1..aedc15bb0 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.5.1 +2.5.3 diff --git a/AUTHORS.md b/AUTHORS.md index abcc24384..b81b6d245 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -5,32 +5,35 @@ and provided thanks to the work of the following contributors: * [ykzts](https://github.com/ykzts) * [akihikodaki](https://github.com/akihikodaki) * [mjankowski](https://github.com/mjankowski) -* [unarist](https://github.com/unarist) * [ThibG](https://github.com/ThibG) +* [unarist](https://github.com/unarist) * [m4sk1n](https://github.com/m4sk1n) * [yiskah](https://github.com/yiskah) * [nolanlawson](https://github.com/nolanlawson) * [sorin-davidoi](https://github.com/sorin-davidoi) * [abcang](https://github.com/abcang) * [lynlynlynx](https://github.com/lynlynlynx) +* [dependabot[bot]](https://github.com/apps/dependabot) * [alpaca-tc](https://github.com/alpaca-tc) * [nclm](https://github.com/nclm) * [ineffyble](https://github.com/ineffyble) * [renatolond](https://github.com/renatolond) * [jeroenpraat](https://github.com/jeroenpraat) +* [mayaeh](https://github.com/mayaeh) * [blackle](https://github.com/blackle) * [Quent-in](https://github.com/Quent-in) * [JantsoP](https://github.com/JantsoP) * [nullkal](https://github.com/nullkal) * [yookoala](https://github.com/yookoala) -* [mayaeh](https://github.com/mayaeh) +* [mabkenar](https://github.com/mabkenar) * [ysksn](https://github.com/ysksn) * [shuheiktgw](https://github.com/shuheiktgw) * [ashfurrow](https://github.com/ashfurrow) +* [Kjwon15](https://github.com/Kjwon15) * [zunda](https://github.com/zunda) * [eramdam](https://github.com/eramdam) -* [Kjwon15](https://github.com/Kjwon15) * [masarakki](https://github.com/masarakki) +* [takayamaki](https://github.com/takayamaki) * [ticky](https://github.com/ticky) * [Quenty31](https://github.com/Quenty31) * [danhunsaker](https://github.com/danhunsaker) @@ -38,11 +41,10 @@ and provided thanks to the work of the following contributors: * [hcmiya](https://github.com/hcmiya) * [stephenburgess8](https://github.com/stephenburgess8) * [Wonderfall](https://github.com/Wonderfall) -* [takayamaki](https://github.com/takayamaki) * [matteoaquila](https://github.com/matteoaquila) * [rkarabut](https://github.com/rkarabut) -* [Artoria2e5](https://github.com/Artoria2e5) * [yukimochi](https://github.com/yukimochi) +* [Artoria2e5](https://github.com/Artoria2e5) * [marrus-sh](https://github.com/marrus-sh) * [krainboltgreene](https://github.com/krainboltgreene) * [patf](https://github.com/patf) @@ -56,7 +58,7 @@ and provided thanks to the work of the following contributors: * [MasterGroosha](https://github.com/MasterGroosha) * [JeanGauthier](https://github.com/JeanGauthier) * [kschaper](https://github.com/kschaper) -* [mabkenar](https://github.com/mabkenar) +* [MaciekBaron](https://github.com/MaciekBaron) * [MitarashiDango](mailto:mitarashidango@users.noreply.github.com) * [beatrix-bitrot](https://github.com/beatrix-bitrot) * [adbelle](https://github.com/adbelle) @@ -64,9 +66,9 @@ and provided thanks to the work of the following contributors: * [MightyPork](https://github.com/MightyPork) * [yhirano55](https://github.com/yhirano55) * [camponez](https://github.com/camponez) -* [MaciekBaron](https://github.com/MaciekBaron) * [SerCom-KC](https://github.com/SerCom-KC) * [aschmitz](https://github.com/aschmitz) +* [devkral](https://github.com/devkral) * [fpiesche](https://github.com/fpiesche) * [gandaro](https://github.com/gandaro) * [johnsudaar](https://github.com/johnsudaar) @@ -75,8 +77,6 @@ and provided thanks to the work of the following contributors: * [lindwurm](https://github.com/lindwurm) * [victorhck](mailto:victorhck@geeko.site) * [voidsatisfaction](https://github.com/voidsatisfaction) -* [valentin2105](https://github.com/valentin2105) -* [devkral](https://github.com/devkral) * [hikari-no-yume](https://github.com/hikari-no-yume) * [angristan](https://github.com/angristan) * [seefood](https://github.com/seefood) @@ -93,6 +93,7 @@ and provided thanks to the work of the following contributors: * [tsuwatch](https://github.com/tsuwatch) * [victorhck](https://github.com/victorhck) * [puckipedia](https://github.com/puckipedia) +* [fvh-P](https://github.com/fvh-P) * [contraexemplo](https://github.com/contraexemplo) * [hugogameiro](https://github.com/hugogameiro) * [kazu9su](https://github.com/kazu9su) @@ -102,11 +103,12 @@ and provided thanks to the work of the following contributors: * [Neetshin](mailto:neetshin@neetsh.in) * [rainyday](https://github.com/rainyday) * [ProgVal](https://github.com/ProgVal) +* [valentin2105](https://github.com/valentin2105) * [yuntan](https://github.com/yuntan) +* [ashleyhull-versent](https://github.com/ashleyhull-versent) * [goofy-bz](mailto:goofy@babelzilla.org) * [kadiix](https://github.com/kadiix) * [kodacs](https://github.com/kodacs) -* [fvh-P](https://github.com/fvh-P) * [rtucker](https://github.com/rtucker) * [KScl](https://github.com/KScl) * [sterdev](https://github.com/sterdev) @@ -116,6 +118,7 @@ and provided thanks to the work of the following contributors: * [cpytel](https://github.com/cpytel) * [northerner](https://github.com/northerner) * [fhemberger](https://github.com/fhemberger) +* [greysteil](https://github.com/greysteil) * [hnrysmth](https://github.com/hnrysmth) * [d6rkaiz](https://github.com/d6rkaiz) * [JMendyk](https://github.com/JMendyk) @@ -127,10 +130,12 @@ and provided thanks to the work of the following contributors: * [tcitworld](https://github.com/tcitworld) * [geta6](https://github.com/geta6) * [happycoloredbanana](https://github.com/happycoloredbanana) +* [kedamaDQ](https://github.com/kedamaDQ) * [leopku](https://github.com/leopku) * [SansPseudoFix](https://github.com/SansPseudoFix) * [tomfhowe](https://github.com/tomfhowe) * [noraworld](https://github.com/noraworld) +* [theboss](https://github.com/theboss) * [178inaba](https://github.com/178inaba) * [alyssais](https://github.com/alyssais) * [kodnaplakal](https://github.com/kodnaplakal) @@ -140,22 +145,24 @@ and provided thanks to the work of the following contributors: * [halkeye](https://github.com/halkeye) * [hinaloe](https://github.com/hinaloe) * [treby](https://github.com/treby) +* [Reverite](https://github.com/Reverite) * [jpdevries](https://github.com/jpdevries) -* [00x9d](https://github.com/00x9d) +* [H-C-F](https://github.com/H-C-F) * [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name) * [saper](https://github.com/saper) * [nevillepark](https://github.com/nevillepark) * [ornithocoder](https://github.com/ornithocoder) * [pierreozoux](https://github.com/pierreozoux) +* [qguv](https://github.com/qguv) * [Ram Lmn](mailto:ramlmn@users.noreply.github.com) * [harukasan](https://github.com/harukasan) * [stamak](https://github.com/stamak) -* [theboss](https://github.com/theboss) * [Technowix](mailto:technowix@users.noreply.github.com) * [Eychics](https://github.com/Eychics) * [Thor Harald Johansen](mailto:thj@thj.no) * [0x70b1a5](https://github.com/0x70b1a5) * [gled-rs](https://github.com/gled-rs) +* [Valentin_NC](mailto:valentin.ouvrard@nautile.sarl) * [R0ckweb](https://github.com/R0ckweb) * [caasi](https://github.com/caasi) * [esetomo](https://github.com/esetomo) @@ -168,6 +175,7 @@ and provided thanks to the work of the following contributors: * [vahnj](https://github.com/vahnj) * [ikuradon](https://github.com/ikuradon) * [AndreLewin](https://github.com/AndreLewin) +* [rinsuki](https://github.com/rinsuki) * [redtachyons](https://github.com/redtachyons) * [thurloat](https://github.com/thurloat) * [aaribaud](https://github.com/aaribaud) @@ -188,14 +196,13 @@ and provided thanks to the work of the following contributors: * [Fjoerfoks](https://github.com/Fjoerfoks) * [fmauNeko](https://github.com/fmauNeko) * [gloaec](https://github.com/gloaec) -* [greysteil](https://github.com/greysteil) +* [Gomasy](https://github.com/Gomasy) * [unstabler](https://github.com/unstabler) * [potato4d](https://github.com/potato4d) * [h-izumi](https://github.com/h-izumi) * [ErikXXon](https://github.com/ErikXXon) * [ian-kelling](https://github.com/ian-kelling) * [immae](https://github.com/immae) -* [Reverite](https://github.com/Reverite) * [foozmeat](https://github.com/foozmeat) * [jasonrhodes](https://github.com/jasonrhodes) * [Jason Snell](mailto:jason@newrelic.com) @@ -216,6 +223,7 @@ and provided thanks to the work of the following contributors: * [petzah](https://github.com/petzah) * [ignisf](https://github.com/ignisf) * [raymestalez](https://github.com/raymestalez) +* [sascha-sl](https://github.com/sascha-sl) * [u1-liquid](https://github.com/u1-liquid) * [sim6](https://github.com/sim6) * [stemid](https://github.com/stemid) @@ -232,6 +240,8 @@ and provided thanks to the work of the following contributors: * [zacanger](https://github.com/zacanger) * [amazedkoumei](https://github.com/amazedkoumei) * [anon5r](https://github.com/anon5r) +* [aus-social](https://github.com/aus-social) +* [imbsky](https://github.com/imbsky) * [bsky](mailto:me@imbsky.net) * [chr-1x](https://github.com/chr-1x) * [codl](https://github.com/codl) @@ -241,7 +251,6 @@ and provided thanks to the work of the following contributors: * [haoyayoi](https://github.com/haoyayoi) * [ik11235](https://github.com/ik11235) * [kawax](https://github.com/kawax) -* [kedamaDQ](https://github.com/kedamaDQ) * [007lva](https://github.com/007lva) * [matsurai25](https://github.com/matsurai25) * [mecab](https://github.com/mecab) @@ -249,12 +258,12 @@ and provided thanks to the work of the following contributors: * [oliverkeeble](https://github.com/oliverkeeble) * [pinfort](https://github.com/pinfort) * [rbaumert](https://github.com/rbaumert) +* [rhoio](https://github.com/rhoio) * [trwnh](https://github.com/trwnh) * [usagi-f](https://github.com/usagi-f) * [vidarlee](https://github.com/vidarlee) * [vjackson725](https://github.com/vjackson725) * [wxcafe](https://github.com/wxcafe) -* [rinsuki](https://github.com/rinsuki) * [新都心(Neet Shin)](mailto:nucx@dio-vox.com) * [cygnan](https://github.com/cygnan) * [Awea](https://github.com/Awea) @@ -267,6 +276,7 @@ and provided thanks to the work of the following contributors: * [Aditoo17](https://github.com/Aditoo17) * [unascribed](https://github.com/unascribed) * [Aguay-val](https://github.com/Aguay-val) +* [Akihiko Odaki](mailto:nekomanma@pixiv.co.jp) * [knu](https://github.com/knu) * [h3poteto](https://github.com/h3poteto) * [unleashed](https://github.com/unleashed) @@ -282,12 +292,14 @@ and provided thanks to the work of the following contributors: * [ameliavoncat](https://github.com/ameliavoncat) * [ilpianista](https://github.com/ilpianista) * [Andreas Drop](mailto:andy@remline.de) +* [andi1984](https://github.com/andi1984) * [schas002](https://github.com/schas002) * [abackstrom](https://github.com/abackstrom) * [jumbosushi](https://github.com/jumbosushi) * [ayumin](https://github.com/ayumin) * [BaptisteGelez](https://github.com/BaptisteGelez) * [bzg](https://github.com/bzg) +* [BenLubar](https://github.com/BenLubar) * [benediktg](https://github.com/benediktg) * [blakebarnett](https://github.com/blakebarnett) * [bradj](https://github.com/bradj) @@ -303,8 +315,9 @@ and provided thanks to the work of the following contributors: * [chriswk](https://github.com/chriswk) * [csu](https://github.com/csu) * [kklleemm](https://github.com/kklleemm) +* [colindean](https://github.com/colindean) * [dachinat](https://github.com/dachinat) -* [monsterpit-daggertooth](https://github.com/monsterpit-daggertooth) +* [multiple-creatures](https://github.com/multiple-creatures) * [watilde](https://github.com/watilde) * [daprice](https://github.com/daprice) * [dar5hak](https://github.com/dar5hak) @@ -328,6 +341,7 @@ and provided thanks to the work of the following contributors: * [espenronnevik](https://github.com/espenronnevik) * [Finariel](https://github.com/Finariel) * [siuying](https://github.com/siuying) +* [GenbuHase](https://github.com/GenbuHase) * [hattori6789](https://github.com/hattori6789) * [algernon](https://github.com/algernon) * [Fastbyte01](https://github.com/Fastbyte01) @@ -336,6 +350,7 @@ and provided thanks to the work of the following contributors: * [Fiaxhs](https://github.com/Fiaxhs) * [reedcourty](https://github.com/reedcourty) * [anneau](https://github.com/anneau) +* [lanodan](https://github.com/lanodan) * [Harmon758](https://github.com/Harmon758) * [HellPie](https://github.com/HellPie) * [Habu-Kagumba](https://github.com/Habu-Kagumba) @@ -353,13 +368,14 @@ and provided thanks to the work of the following contributors: * [Floppy](https://github.com/Floppy) * [loomchild](https://github.com/loomchild) * [jenkr55](https://github.com/jenkr55) -* [docjkl](https://github.com/docjkl) +* [press5](https://github.com/press5) * [TrollDecker](https://github.com/TrollDecker) * [jmontane](https://github.com/jmontane) * [jonathanklee](https://github.com/jonathanklee) * [jguerder](https://github.com/jguerder) * [Jehops](https://github.com/Jehops) * [joshuap](https://github.com/joshuap) +* [YuleZ](https://github.com/YuleZ) * [Tiwy57](https://github.com/Tiwy57) * [xuv](https://github.com/xuv) * [Jnsll](https://github.com/Jnsll) @@ -388,6 +404,7 @@ and provided thanks to the work of the following contributors: * [otsune](https://github.com/otsune) * [Mathias B](mailto:10813340+mathias-b@users.noreply.github.com) * [matt-auckland](https://github.com/matt-auckland) +* [webroo](https://github.com/webroo) * [matthiasbeyer](https://github.com/matthiasbeyer) * [mattjmattj](https://github.com/mattjmattj) * [mtparet](https://github.com/mtparet) @@ -400,6 +417,7 @@ and provided thanks to the work of the following contributors: * [mike-burns](https://github.com/mike-burns) * [verymilan](https://github.com/verymilan) * [milmazz](https://github.com/milmazz) +* [premist](https://github.com/premist) * [Mnkai](https://github.com/Mnkai) * [mitchhentges](https://github.com/mitchhentges) * [moritzheiber](https://github.com/moritzheiber) @@ -413,7 +431,7 @@ and provided thanks to the work of the following contributors: * [vonneudeck](https://github.com/vonneudeck) * [Ninetailed](https://github.com/Ninetailed) * [k24](https://github.com/k24) -* [Noiob](mailto:noiob@users.noreply.github.com) +* [noiob](https://github.com/noiob) * [kwaio](https://github.com/kwaio) * [norayr](https://github.com/norayr) * [joyeusenoelle](https://github.com/joyeusenoelle) @@ -425,7 +443,6 @@ and provided thanks to the work of the following contributors: * [Pangoraw](https://github.com/Pangoraw) * [peterkeen](https://github.com/peterkeen) * [pgate](https://github.com/pgate) -* [qguv](https://github.com/qguv) * [remram44](https://github.com/remram44) * [retokromer](https://github.com/retokromer) * [rfwatson](https://github.com/rfwatson) @@ -449,21 +466,21 @@ and provided thanks to the work of the following contributors: * [shouko](https://github.com/shouko) * [Sina Mashek](mailto:sina@mashek.xyz) * [sossii](https://github.com/sossii) -* [SpankyWorks](https://github.com/SpankyWorks) -* [StefOfficiel](https://github.com/StefOfficiel) -* [svetlik](https://github.com/svetlik) -* [dereckson](https://github.com/dereckson) -* [phaedryx](https://github.com/phaedryx) -* [takp](https://github.com/takp) -* [tkusano](https://github.com/tkusano) -* [TakesxiSximada](https://github.com/TakesxiSximada) -* [TheInventrix](https://github.com/TheInventrix) -* [shug0](https://github.com/shug0) -* [Fortyseven](https://github.com/Fortyseven) -* [tobypinder](https://github.com/tobypinder) -* [tomosm](https://github.com/tomosm) -* [TomoyaShibata](https://github.com/TomoyaShibata) -* [treyssatvincent](https://github.com/treyssatvincent) +* [Spanky](mailto:2788886+spankyworks@users.noreply.github.com) +* [StefOfficiel](mailto:pichard.stephane@free.fr) +* [Svetlozar Todorov](mailto:svetlik@users.noreply.github.com) +* [Sébastien Santoro](mailto:dereckson@espace-win.org) +* [Tad Thorley](mailto:phaedryx@users.noreply.github.com) +* [Takayoshi Nishida](mailto:takayoshi.nishida@gmail.com) +* [Takayuki KUSANO](mailto:github@tkusano.jp) +* [TakesxiSximada](mailto:takesxi.sximada@gmail.com) +* [TheInventrix](mailto:theinventrix@users.noreply.github.com) +* [Thomas Alberola](mailto:thomas@needacoffee.fr) +* [Toby Deshane](mailto:fortyseven@users.noreply.github.com) +* [Toby Pinder](mailto:gigitrix@gmail.com) +* [Tomonori Murakami](mailto:crosslife777@gmail.com) +* [TomoyaShibata](mailto:wind.of.hometown@gmail.com) +* [Treyssat-Vincent Nino](mailto:treyssatvincent@users.noreply.github.com) * [Udo Kramer](mailto:optik@fluffel.io) * [Una](mailto:una@unascribed.com) * [Ushitora Anqou](mailto:ushitora_anqou@yahoo.co.jp) @@ -489,6 +506,7 @@ and provided thanks to the work of the following contributors: * [benklop](mailto:benklop@gmail.com) * [bsky](mailto:git@imbsky.net) * [caesarologia](mailto:lopesgemelli.1@gmail.com) +* [cbayerlein](mailto:c.bayerlein@gmail.com) * [chrolis](mailto:chrolis@users.noreply.github.com) * [cormo](mailto:cormorant2+github@gmail.com) * [d0p1](mailto:dopi-sama@hush.com) @@ -500,19 +518,23 @@ and provided thanks to the work of the following contributors: * [hakoai](mailto:hk--76@qa2.so-net.ne.jp) * [haosbvnker](mailto:github@chaosbunker.com) * [isati](mailto:phil@juchnowi.cz) +* [jacob](mailto:jacobherringtondeveloper@gmail.com) * [jenn kaplan](mailto:me@jkap.io) * [jirayudech](mailto:jirayudech@gmail.com) +* [jooops](mailto:joops@autistici.org) * [jukper](mailto:jukkaperanto@gmail.com) * [jumoru](mailto:jumoru@mailbox.org) * [karlyeurl](mailto:karl.yeurl@gmail.com) * [kedama](mailto:32974885+kedamadq@users.noreply.github.com) * [kuro5hin](mailto:rusty@kuro5hin.org) +* [luzpaz](mailto:luzpaz@users.noreply.github.com) * [maxypy](mailto:maxime@mpigou.fr) * [mhe](mailto:mail@marcus-herrmann.com) * [mimikun](mailto:dzdzble_effort_311@outlook.jp) * [mshrtkch](mailto:mshrtkch@users.noreply.github.com) * [muan](mailto:muan@github.com) * [neetshin](mailto:neetshin@neetsh.in) +* [nightpool](mailto:nightpool@users.noreply.github.com) * [rch850](mailto:rich850@gmail.com) * [roikale](mailto:roikale@users.noreply.github.com) * [rysiekpl](mailto:rysiek@hackerspace.pl) @@ -524,6 +546,7 @@ and provided thanks to the work of the following contributors: * [tackeyy](mailto:mailto.takita.yusuke@gmail.com) * [tateisu](mailto:tateisu@gmail.com) * [tmyt](mailto:shigure@refy.net) +* [trevDev()](mailto:trev@trevdev.ca) * [utam0k](mailto:k0ma@utam0k.jp) * [vpzomtrrfrt](mailto:vpzomtrrfrt@gmail.com) * [walfie](mailto:walfington@gmail.com) diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..e5443a358 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,123 @@ +Changelog +========= + +All notable changes to this project will be documented in this file. + +## [Unreleased] +### Added + +- Add link ownership verification (#8703) +- Add conversations API (#8832) +- Add limit for the number of people that can be followed from one account (#8807) +- Add admin setting to customize mascot (#8766) +- Add support for more granular ActivityPub audiences from other software, i.e. circles (#8950, #9093) +- Add option to block all reports from a domain (#8830) +- Add user preference to always expand toots marked with content warnings (#8762) +- Add user preference to always hide all media (#8569) +- Add `force_login` param to OAuth authorize page (#8655) +- Add `tootctl accounts backup` (#8642, #8811) +- Add `tootctl accounts create` (#8642, #8811) +- Add `tootctl accounts cull` (#8642, #8811) +- Add `tootctl accounts delete` (#8642, #8811) +- Add `tootctl accounts modify` (#8642, #8811) +- Add `tootctl accounts refresh` (#8642, #8811) +- Add `tootctl feeds build` (#8642, #8811) +- Add `tootctl feeds clear` (#8642, #8811) +- Add `tootctl settings registrations open` (#8642, #8811) +- Add `tootctl settings registrations close` (#8642, #8811) +- Add `min_id` param to REST API to support backwards pagination (#8736) +- Add a confirmation dialog when hitting reply and the compose box isn't empty (#8893) +- Add PostgreSQL disk space growth tracking in PGHero (#8906) +- Add button for disabling local account to report quick actions bar (#9024) +- Add Czech language (#8594) +- Add `Clear-Site-Data` header when logging out (#8627) +- Add `same-site` (`lax`) attribute to cookies (#8626) +- Add support for styled scrollbars in Firefox Nightly (#8653) +- Add highlight to the active tab in web UI profiles (#8673) +- Add auto-focus for comment textarea in report modal (#8689) +- Add auto-focus for emoji picker's search field (#8688) +- Add nginx and systemd templates to `dist/` directory (#8770) +- Add support for `/.well-known/change-password` (#8828) +- Add option to override FFMPEG binary path (#8855) +- Add `dns-prefetch` tag when using different host for assets or uploads (#8942) +- Add `description` meta tag (#8941) +- Add `Content-Security-Policy` header (#8957) +- Add cache for the instance info API (#8765) +- Add suggested follows to search screen in mobile layout (#9010) +- Add CORS header to `/.well-known/*` routes (#9083) +- Add `card` attribute to statuses returned from REST API (#9120) +- Add in-stream link preview (#9120) +- Add support for ActivityPub `Page` objects (#9121) + +### Changed + +- Change forms design (#8703) +- Change reports overview to group by target account (#8674) +- Change web UI to show "read more" link on overly long in-stream statuses (#8205) +- Change design of direct messages column (#8832, #9022) +- Change home timelines to exclude DMs (#8940) +- Change list timelines to exclude all replies (#8683) +- Change admin accounts UI default sort to most recent (#8813) +- Change documentation URL in the UI (#8898) +- Change style of success and failure messages (#8973) +- Change DM filtering to always allow DMs from staff (#8993) +- Change recommended Ruby version to 2.5.3 (#9003) +- Change docker-compose default to persist volumes in current directory (#9055) +- Change character counters on edit profile page to input length limit (#9100) + +### Deprecated + +- `GET /api/v1/timelines/direct` → `GET /api/v1/conversations` (#8832) +- `POST /api/v1/notifications/dismiss` → `POST /api/v1/notifications/:id/dismiss` (#8905) +- `GET /api/v1/statuses/:id/card` → `card` attributed included in status (#9120) + +### Removed + +- Remove "on this device" label in column push settings (#8704) +- Remove rake tasks in favour of tootctl commands (#8675) + +### Fixed + +- Fix remote statuses using instance's default locale if no language given (#8861) +- Fix streaming API not exiting when port or socket is unavailable (#9023) +- Fix network calls being performed in database transaction in ActivityPub handler (#8951) +- Fix dropdown arrow position (#8637) +- Fix first element of dropdowns being focused even if not using keyboard (#8679) +- Fix tootctl requiring `bundle exec` invocation (#8619) +- Fix public pages not using animation preference for avatars (#8614) +- Fix OEmbed/OpenGraph cards not understanding relative URLs (#8669) +- Fix some dark emojis not having a white outline (#8597) +- Fix media description not being displayed in various media modals (#8678) +- Fix generated URLs of desktop notifications missing base URL (#8758) +- Fix RTL styles (#8764, #8767, #8823, #8897, #9005, #9007, #9018, #9021) +- Fix crash in streaming API when tag param missing (#8955) +- Fix hotkeys not working when no element is focused (#8998) +- Fix some hotkeys not working on detailed status view (#9006) +- Fix og:url on status pages (#9047) +- Fix upload option buttons only being visible on hover (#9074) +- Fix tootctl not returning exit code 1 on wrong arguments (#9094) +- Fix preview cards for appearing for profiles mentioned in toot (#6934) +- Fix local accounts sometimes being duplicated as faux-remote (#9109) +- Fix emoji search when the shortcode has multiple separators (#9124) +- Fix dropdowns sometimes being partially obscured by other elements (#9126) +- Fix cache not updating when reply/boost/favourite counters or media sensitivity update (#9119) + +## [2.5.2] - 2018-10-12 +### Security + +- Fix XSS vulnerability (#8959) + +## [2.5.1] - 2018-10-07 +### Fixed + +- Fix database migrations for PostgreSQL below 9.5 (#8903) +- Fix class autoloading issue in ActivityPub Create handler (#8820) +- Fix cache statistics not being sent via statsd when statsd enabled (#8831) +- Bump puma from 3.11.4 to 3.12.0 (#8883) + +### Security + +- Fix some local images not having their EXIF metadata stripped on upload (#8714) +- Fix being able to enable a disabled relay via ActivityPub Accept handler (#8864) +- Bump nokogiri from 1.8.4 to 1.8.5 (#8881) +- Fix being able to report statuses not belonging to the reported account (#8916) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ddf303103..8044d04f7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,60 +32,42 @@ You should also try to follow the guidelines set out in the original `CONTRIBUTI <blockquote> CONTRIBUTING -============ +======= +Contributing -There are three ways in which you can contribute to this repository: +Thank you for considering contributing to Mastodon 🐘 -1. By improving the documentation -2. By working on the back-end application -3. By working on the front-end application +You can contribute in the following ways: -Choosing what to work on in a large open source project is not easy. The list of [GitHub issues](https://github.com/tootsuite/mastodon/issues) may provide some ideas, but not every feature request has been greenlit. Likewise, not every change or feature that resolves a personal itch will be merged into the main repository. Some communication ahead of time may be wise. If your addition creates a new feature or setting, or otherwise changes how things work in some substantial way, please remember to submit a correlating pull request to document your changes in the [documentation](http://github.com/tootsuite/documentation). +- Finding and reporting bugs +- Translating the Mastodon interface into various languages +- Contributing code to Mastodon by fixing bugs or implementing features +- Improving the documentation -Below are the guidelines for working on pull requests: +## Bug reports -## General +Bug reports and feature suggestions can be submitted to [GitHub Issues](https://github.com/tootsuite/mastodon/issues). Please make sure that you are not submitting duplicates, and that a similar report or request has not already been resolved or rejected in the past using the search function. Please also use descriptive, concise titles. -- 2 spaces indentation +## Translations -## Documentation - -- No spelling mistakes -- No orthographic mistakes -- No Markdown syntax errors - -## Requirements - -- Ruby -- Node.js -- PostgreSQL -- Redis -- Nginx (optional) - -## Back-end application +You can submit translations via [Weblate](https://weblate.joinmastodon.org/). They are periodically merged into the codebase. -It is expected that you have a working development environment set up. The development environment includes [rubocop](https://github.com/bbatsov/rubocop), which checks your Ruby code for compliance with our style guide and best practices. Sublime Text, likely like other editors, has a [Rubocop plugin](https://github.com/pderichs/sublime_rubocop) that runs checks on files as you edit them. The codebase also has a test suite. - -* The codebase is not perfect, at the time of writing, but it is expected that you do not introduce new code style violations -* The rspec test suite must pass -* To the extent that it is possible, verify your changes. In the best case, by adding new tests to the test suite. At the very least, by running the server or console and checking it manually -* If you are introducing new strings to the user interface, they must be using localization methods +[![Mastodon translation statistics by language](https://weblate.joinmastodon.org/widgets/mastodon/-/multi-auto.svg)](https://weblate.joinmastodon.org/) -If your code has syntax errors that won't let it run, it's a good sign that the pull request isn't ready for submission yet. +## Pull requests -## Front-end application +Please use clean, concise titles for your pull requests. We use commit squashing, so the final commit in the master branch will carry the title of the pull request. -It is expected that you have a working development environment set up (see back-end application section). This project includes an ESLint configuration file, with which you can lint your changes. +The smaller the set of changes in the pull request is, the quicker it can be reviewed and merged. Splitting tasks into multiple smaller pull requests is often preferable. -* Avoid grave ESLint violations -* Verify that your changes work -* If you are introducing new strings, they must be using localization methods +**Pull requests that do not pass automated checks may not be reviewed**. In particular, you need to keep in mind: -If the JavaScript or CSS assets won't compile due to a syntax error, it's a good sign that the pull request isn't ready for submission yet. +- Unit and integration tests (rspec, jest) +- Code style rules (rubocop, eslint) +- Normalization of locale files (i18n-tasks) -## Translate +## Documentation -You can contribute to translating Mastodon via Weblate at [weblate.joinmastodon.org](https://weblate.joinmastodon.org/). -[![Mastodon translation statistics by language](https://weblate.joinmastodon.org/widgets/mastodon/-/multi-auto.svg)](https://weblate.joinmastodon.org/) +The [Mastodon documentation](https://docs.joinmastodon.org) is a statically generated site. You can [submit merge requests to mastodon/docs](https://source.joinmastodon.org/mastodon/docs). </blockquote> diff --git a/Dockerfile b/Dockerfile index 8209c7d47..da0898927 100644 --- a/Dockerfile +++ b/Dockerfile @@ -85,6 +85,6 @@ VOLUME /mastodon/public/system USER mastodon ENV LD_PRELOAD=/lib/stack-fix.so -RUN OTP_SECRET=_ SECRET_KEY_BASE=_ bundle exec rails assets:precompile +RUN OTP_SECRET=_ SECRET_KEY_BASE=_ bin/rails assets:precompile ENTRYPOINT ["/sbin/tini", "--"] diff --git a/Gemfile b/Gemfile index b417a8d2e..c818cba37 100644 --- a/Gemfile +++ b/Gemfile @@ -15,9 +15,9 @@ gem 'makara', '~> 0.4' gem 'pghero', '~> 2.2' gem 'dotenv-rails', '~> 2.5' -gem 'aws-sdk-s3', '~> 1.21', require: false -gem 'fog-core', '~> 2.1' -gem 'fog-openstack', '~> 1.0', require: false +gem 'aws-sdk-s3', '~> 1.23', require: false +gem 'fog-core', '<= 2.1.0' +gem 'fog-openstack', '~> 0.3', require: false gem 'paperclip', '~> 6.0' gem 'paperclip-av-transcoder', '~> 0.6' gem 'streamio-ffmpeg', '~> 3.0' @@ -64,7 +64,7 @@ gem 'oj', '~> 3.6' gem 'ostatus2', '~> 2.0' gem 'ox', '~> 2.10' gem 'posix-spawn', git: 'https://github.com/rtomayko/posix-spawn', ref: '58465d2e213991f8afb13b984854a49fcdcc980c' -gem 'pundit', '~> 1.1' +gem 'pundit', '~> 2.0' gem 'premailer-rails' gem 'rack-attack', '~> 5.4' gem 'rack-cors', '~> 1.0', require: 'rack/cors' @@ -73,7 +73,7 @@ gem 'rails-settings-cached', '~> 0.6' gem 'redis', '~> 4.0', require: ['redis', 'redis/connection/hiredis'] gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock' gem 'rqrcode', '~> 0.10' -gem 'sanitize', '~> 4.6' +gem 'sanitize', '~> 5.0' gem 'sidekiq', '~> 5.2' gem 'sidekiq-scheduler', '~> 3.0' gem 'sidekiq-unique-jobs', '~> 5.0' @@ -82,7 +82,7 @@ gem 'simple-navigation', '~> 4.0' gem 'simple_form', '~> 4.0' gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie' gem 'stoplight', '~> 2.1.3' -gem 'strong_migrations', '~> 0.2' +gem 'strong_migrations', '~> 0.3' gem 'tty-command', '~> 0.8', require: false gem 'tty-prompt', '~> 0.17', require: false gem 'twitter-text', '~> 1.14' @@ -96,7 +96,7 @@ gem 'rdf-normalize', '~> 0.3' group :development, :test do gem 'fabrication', '~> 2.20' gem 'fuubar', '~> 2.3' - gem 'i18n-tasks', '~> 0.9', require: false + gem 'i18n-tasks', '~> 0.9', require: false, git: 'https://github.com/glebm/i18n-tasks.git', branch: 'master', ref: 'a1c9089b4ffed4f33e3b3a1bb2378d7a23445c0f' gem 'pry-byebug', '~> 3.6' gem 'pry-rails', '~> 0.3' gem 'rspec-rails', '~> 3.8' @@ -107,7 +107,7 @@ group :production, :test do end group :test do - gem 'capybara', '~> 3.9' + gem 'capybara', '~> 3.10' gem 'climate_control', '~> 0.2' gem 'faker', '~> 1.9' gem 'microformats', '~> 4.0' @@ -115,7 +115,7 @@ group :test do gem 'rspec-sidekiq', '~> 3.0' gem 'simplecov', '~> 0.16', require: false gem 'webmock', '~> 3.4' - gem 'parallel_tests', '~> 2.23' + gem 'parallel_tests', '~> 2.26' end group :development do @@ -127,7 +127,7 @@ group :development do gem 'letter_opener', '~> 1.4' gem 'letter_opener_web', '~> 1.3' gem 'memory_profiler' - gem 'rubocop', '~> 0.59', require: false + gem 'rubocop', '~> 0.60', require: false gem 'brakeman', '~> 4.3', require: false gem 'bundler-audit', '~> 0.6', require: false gem 'scss_lint', '~> 0.57', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 13c1127b0..cacf3adf4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,4 +1,21 @@ GIT + remote: https://github.com/glebm/i18n-tasks.git + revision: a1c9089b4ffed4f33e3b3a1bb2378d7a23445c0f + ref: a1c9089b4ffed4f33e3b3a1bb2378d7a23445c0f + branch: master + specs: + i18n-tasks (0.9.27) + activesupport (>= 4.0.2) + ast (>= 2.1.0) + erubi + highline (>= 2.0.0) + i18n + parser (>= 2.2.3.0) + rails-i18n + rainbow (>= 2.2.2, < 4.0) + terminal-table (>= 1.5.1) + +GIT remote: https://github.com/rtomayko/posix-spawn revision: 58465d2e213991f8afb13b984854a49fcdcc980c ref: 58465d2e213991f8afb13b984854a49fcdcc980c @@ -76,16 +93,16 @@ GEM av (0.9.0) cocaine (~> 0.5.3) aws-eventstream (1.0.1) - aws-partitions (1.105.0) - aws-sdk-core (3.30.0) + aws-partitions (1.106.0) + aws-sdk-core (3.35.0) aws-eventstream (~> 1.0) aws-partitions (~> 1.0) aws-sigv4 (~> 1.0) jmespath (~> 1.0) - aws-sdk-kms (1.9.0) + aws-sdk-kms (1.11.0) aws-sdk-core (~> 3, >= 3.26.0) aws-sigv4 (~> 1.0) - aws-sdk-s3 (1.21.0) + aws-sdk-s3 (1.23.0) aws-sdk-core (~> 3, >= 3.26.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.0) @@ -126,13 +143,14 @@ GEM sshkit (~> 1.3) capistrano-yarn (2.0.2) capistrano (~> 3.0) - capybara (3.9.0) + capybara (3.10.0) addressable mini_mime (>= 0.1.3) nokogiri (~> 1.8) rack (>= 1.6.0) rack-test (>= 0.6.3) - xpath (~> 3.1) + regexp_parser (~> 1.2) + xpath (~> 3.2) case_transform (0.2) activesupport charlock_holmes (0.7.6) @@ -182,7 +200,7 @@ GEM docile (1.3.0) domain_name (0.5.20180417) unf (>= 0.0.5, < 1.0.0) - doorkeeper (5.0.0) + doorkeeper (5.0.2) railties (>= 4.2) dotenv (2.5.0) dotenv-rails (2.5.0) @@ -211,7 +229,7 @@ GEM fast_blank (1.0.0) fastimage (2.1.4) ffi (1.9.25) - fog-core (2.1.2) + fog-core (2.1.0) builder excon (~> 0.58) formatador (~> 0.2) @@ -219,8 +237,8 @@ GEM fog-json (1.2.0) fog-core multi_json (~> 1.10) - fog-openstack (1.0.3) - fog-core (~> 2.1) + fog-openstack (0.3.7) + fog-core (>= 1.45, <= 2.1.0) fog-json (>= 1.0) ipaddress (>= 0.8) formatador (0.2.5) @@ -271,17 +289,8 @@ GEM httplog (1.1.1) rack (>= 1.0) rainbow (>= 2.0.0) - i18n (1.1.0) + i18n (1.1.1) concurrent-ruby (~> 1.0) - i18n-tasks (0.9.25) - activesupport (>= 4.0.2) - ast (>= 2.1.0) - erubi - highline (>= 2.0.0) - i18n - parser (>= 2.2.3.0) - rainbow (>= 2.2.2, < 4.0) - terminal-table (>= 1.5.1) idn-ruby (0.1.0) ipaddress (0.8.3) iso-639 (0.2.8) @@ -353,14 +362,14 @@ GEM nio4r (2.3.1) nokogiri (1.8.5) mini_portile2 (~> 2.3.0) - nokogumbo (1.5.0) - nokogiri + nokogumbo (2.0.0) + nokogiri (~> 1.8, >= 1.8.4) nsa (0.2.4) activesupport (>= 4.2, < 6) concurrent-ruby (~> 1.0.0) sidekiq (>= 3.5.0) statsd-ruby (~> 1.2.0) - oj (3.6.11) + oj (3.6.12) omniauth (1.8.1) hashie (>= 3.4.6, < 3.6.0) rack (>= 1.6.2, < 3) @@ -387,7 +396,7 @@ GEM av (~> 0.9.0) paperclip (>= 2.5.2) parallel (1.12.1) - parallel_tests (2.23.0) + parallel_tests (2.26.0) parallel parser (2.5.1.2) ast (~> 2.4.0) @@ -417,7 +426,7 @@ GEM pry (>= 0.10.4) public_suffix (3.0.3) puma (3.12.0) - pundit (1.1.0) + pundit (2.0.0) activesupport (>= 3.0.0) raabro (1.1.6) rack (2.0.5) @@ -492,6 +501,7 @@ GEM redis-store (>= 1.2, < 2) redis-store (1.5.0) redis (>= 2.2, < 5) + regexp_parser (1.2.0) request_store (1.4.1) rack (>= 1.4) responders (2.4.0) @@ -503,13 +513,13 @@ GEM chunky_png (~> 1.0) rspec-core (3.8.0) rspec-support (~> 3.8.0) - rspec-expectations (3.8.1) + rspec-expectations (3.8.2) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.8.0) rspec-mocks (3.8.0) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.8.0) - rspec-rails (3.8.0) + rspec-rails (3.8.1) actionpack (>= 3.0) activesupport (>= 3.0) railties (>= 3.0) @@ -521,24 +531,24 @@ GEM rspec-core (~> 3.0, >= 3.0.0) sidekiq (>= 2.4.0) rspec-support (3.8.0) - rubocop (0.59.2) + rubocop (0.60.0) jaro_winkler (~> 1.5.1) parallel (~> 1.10) parser (>= 2.5, != 2.5.1.1) powerpack (~> 0.1) rainbow (>= 2.2.2, < 4.0) ruby-progressbar (~> 1.7) - unicode-display_width (~> 1.0, >= 1.0.1) - ruby-progressbar (1.9.0) + unicode-display_width (~> 1.4.0) + ruby-progressbar (1.10.0) ruby-saml (1.9.0) nokogiri (>= 1.5.10) rufus-scheduler (3.5.2) fugit (~> 1.1, >= 1.1.5) safe_yaml (1.0.4) - sanitize (4.6.6) + sanitize (5.0.0) crass (~> 1.0.2) - nokogiri (>= 1.4.4) - nokogumbo (~> 1.4) + nokogiri (>= 1.8.0) + nokogumbo (~> 2.0) sass (3.6.0) sass-listen (~> 4.0.0) sass-listen (4.0.0) @@ -587,7 +597,7 @@ GEM stoplight (2.1.3) streamio-ffmpeg (3.0.2) multi_json (~> 1.8) - strong_migrations (0.2.3) + strong_migrations (0.3.1) activerecord (>= 3.2.0) temple (0.8.0) terminal-table (1.8.0) @@ -618,7 +628,7 @@ GEM unf (~> 0.1.0) tzinfo (1.2.5) thread_safe (~> 0.1) - tzinfo-data (1.2018.5) + tzinfo-data (1.2018.7) tzinfo (>= 1.0.0) unf (0.1.4) unf_ext @@ -642,7 +652,7 @@ GEM websocket-extensions (>= 0.1.0) websocket-extensions (0.1.3) wisper (2.0.0) - xpath (3.1.0) + xpath (3.2.0) nokogiri (~> 1.8) PLATFORMS @@ -653,7 +663,7 @@ DEPENDENCIES active_record_query_trace (~> 1.5) addressable (~> 2.5) annotate (~> 2.7) - aws-sdk-s3 (~> 1.21) + aws-sdk-s3 (~> 1.23) better_errors (~> 2.5) binding_of_caller (~> 0.7) bootsnap (~> 1.3) @@ -665,7 +675,7 @@ DEPENDENCIES capistrano-rails (~> 1.4) capistrano-rbenv (~> 2.1) capistrano-yarn (~> 2.0) - capybara (~> 3.9) + capybara (~> 3.10) charlock_holmes (~> 0.7.6) chewy (~> 5.0) cld3 (~> 3.2.0) @@ -680,8 +690,8 @@ DEPENDENCIES faker (~> 1.9) fast_blank (~> 1.0) fastimage - fog-core (~> 2.1) - fog-openstack (~> 1.0) + fog-core (<= 2.1.0) + fog-openstack (~> 0.3) fuubar (~> 2.3) goldfinger (~> 2.1) hamlit-rails (~> 0.2) @@ -692,7 +702,7 @@ DEPENDENCIES http_accept_language (~> 2.1) http_parser.rb (~> 0.6)! httplog (~> 1.1) - i18n-tasks (~> 0.9) + i18n-tasks (~> 0.9)! idn-ruby iso-639 json-ld (~> 2.2) @@ -717,7 +727,7 @@ DEPENDENCIES ox (~> 2.10) paperclip (~> 6.0) paperclip-av-transcoder (~> 0.6) - parallel_tests (~> 2.23) + parallel_tests (~> 2.26) pg (~> 1.1) pghero (~> 2.2) pkg-config (~> 1.3) @@ -727,7 +737,7 @@ DEPENDENCIES pry-byebug (~> 3.6) pry-rails (~> 0.3) puma (~> 3.12) - pundit (~> 1.1) + pundit (~> 2.0) rack-attack (~> 5.4) rack-cors (~> 1.0) rails (~> 5.2.1) @@ -741,8 +751,8 @@ DEPENDENCIES rqrcode (~> 0.10) rspec-rails (~> 3.8) rspec-sidekiq (~> 3.0) - rubocop (~> 0.59) - sanitize (~> 4.6) + rubocop (~> 0.60) + sanitize (~> 5.0) scss_lint (~> 0.57) sidekiq (~> 5.2) sidekiq-bulk (~> 0.1.1) @@ -755,7 +765,7 @@ DEPENDENCIES stackprof stoplight (~> 2.1.3) streamio-ffmpeg (~> 3.0) - strong_migrations (~> 0.2) + strong_migrations (~> 0.3) thor (~> 0.20) tty-command (~> 0.8) tty-prompt (~> 0.17) @@ -766,7 +776,7 @@ DEPENDENCIES webpush RUBY VERSION - ruby 2.5.0p0 + ruby 2.5.3p105 BUNDLED WITH - 1.16.5 + 1.16.6 diff --git a/app/controllers/activitypub/inboxes_controller.rb b/app/controllers/activitypub/inboxes_controller.rb index af51e32d5..8f5e1887e 100644 --- a/app/controllers/activitypub/inboxes_controller.rb +++ b/app/controllers/activitypub/inboxes_controller.rb @@ -36,6 +36,6 @@ class ActivityPub::InboxesController < Api::BaseController end def process_payload - ActivityPub::ProcessingWorker.perform_async(signed_request_account.id, body.force_encoding('UTF-8')) + ActivityPub::ProcessingWorker.perform_async(signed_request_account.id, body.force_encoding('UTF-8'), @account&.id) end end diff --git a/app/controllers/admin/base_controller.rb b/app/controllers/admin/base_controller.rb index fc299f74c..f2190ddf9 100644 --- a/app/controllers/admin/base_controller.rb +++ b/app/controllers/admin/base_controller.rb @@ -9,6 +9,13 @@ module Admin before_action :require_staff! before_action :set_pack + before_action :set_body_classes + + private + + def set_body_classes + @body_classes = 'admin' + end def set_pack use_pack 'admin' diff --git a/app/controllers/admin/domain_blocks_controller.rb b/app/controllers/admin/domain_blocks_controller.rb index 64de2cbf0..90c70275a 100644 --- a/app/controllers/admin/domain_blocks_controller.rb +++ b/app/controllers/admin/domain_blocks_controller.rb @@ -46,7 +46,7 @@ module Admin end def resource_params - params.require(:domain_block).permit(:domain, :severity, :reject_media, :retroactive) + params.require(:domain_block).permit(:domain, :severity, :reject_media, :reject_reports, :retroactive) end def retroactive_unblock? diff --git a/app/controllers/admin/reports_controller.rb b/app/controllers/admin/reports_controller.rb index 5d7f43e00..e97ddb9b6 100644 --- a/app/controllers/admin/reports_controller.rb +++ b/app/controllers/admin/reports_controller.rb @@ -44,6 +44,14 @@ module Admin when 'resolve' @report.resolve!(current_account) log_action :resolve, @report + when 'disable' + @report.resolve!(current_account) + @report.target_account.user.disable! + + log_action :resolve, @report + log_action :disable, @report.target_account.user + + resolve_all_target_account_reports when 'silence' @report.resolve!(current_account) @report.target_account.update!(silenced: true) @@ -55,6 +63,7 @@ module Admin else raise ActiveRecord::RecordNotFound end + @report.reload end diff --git a/app/controllers/api/v1/conversations_controller.rb b/app/controllers/api/v1/conversations_controller.rb index 736cb21ca..b19f27ebf 100644 --- a/app/controllers/api/v1/conversations_controller.rb +++ b/app/controllers/api/v1/conversations_controller.rb @@ -3,9 +3,11 @@ class Api::V1::ConversationsController < Api::BaseController LIMIT = 20 - before_action -> { doorkeeper_authorize! :read, :'read:statuses' } + before_action -> { doorkeeper_authorize! :read, :'read:statuses' }, only: :index + before_action -> { doorkeeper_authorize! :write, :'write:conversations' }, except: :index before_action :require_user! - after_action :insert_pagination_headers + before_action :set_conversation, except: :index + after_action :insert_pagination_headers, only: :index respond_to :json @@ -14,8 +16,22 @@ class Api::V1::ConversationsController < Api::BaseController render json: @conversations, each_serializer: REST::ConversationSerializer end + def read + @conversation.update!(unread: false) + render json: @conversation, serializer: REST::ConversationSerializer + end + + def destroy + @conversation.destroy! + render_empty + end + private + def set_conversation + @conversation = AccountConversation.where(account: current_account).find(params[:id]) + end + def paginated_conversations AccountConversation.where(account: current_account) .paginate_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id)) diff --git a/app/controllers/api/v1/reports_controller.rb b/app/controllers/api/v1/reports_controller.rb index 726817927..e182a9c6c 100644 --- a/app/controllers/api/v1/reports_controller.rb +++ b/app/controllers/api/v1/reports_controller.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class Api::V1::ReportsController < Api::BaseController - before_action -> { doorkeeper_authorize! :read, :'read:reports' }, except: [:create] before_action -> { doorkeeper_authorize! :write, :'write:reports' }, only: [:create] before_action :require_user! diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index dca6c5a5a..983b116c9 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -201,6 +201,7 @@ class ApplicationController < ActionController::Base def respond_with_error(code) respond_to do |format| format.any { head code } + format.html do set_locale use_pack 'error' diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index fcfd1830a..0696dea86 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -9,7 +9,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController before_action :set_pack before_action :set_sessions, only: [:edit, :update] before_action :set_instance_presenter, only: [:new, :create, :update] - before_action :set_body_classes, only: [:new, :create] + before_action :set_body_classes, only: [:new, :create, :edit, :update] def destroy not_found @@ -86,7 +86,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController end def set_body_classes - @body_classes = 'lighter' + @body_classes = %w(edit update).include?(action_name) ? 'admin' : 'lighter' end def set_invite diff --git a/app/controllers/filters_controller.rb b/app/controllers/filters_controller.rb index 0d1200fcc..f1e110d87 100644 --- a/app/controllers/filters_controller.rb +++ b/app/controllers/filters_controller.rb @@ -8,6 +8,7 @@ class FiltersController < ApplicationController before_action :set_filters, only: :index before_action :set_filter, only: [:edit, :update, :destroy] before_action :set_pack + before_action :set_body_classes def index @filters = current_account.custom_filters @@ -59,4 +60,8 @@ class FiltersController < ApplicationController def resource_params params.require(:custom_filter).permit(:phrase, :expires_in, :irreversible, :whole_word, context: []) end + + def set_body_classes + @body_classes = 'admin' + end end diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb index 3dc934761..52cddc404 100644 --- a/app/controllers/invites_controller.rb +++ b/app/controllers/invites_controller.rb @@ -7,6 +7,7 @@ class InvitesController < ApplicationController before_action :authenticate_user! before_action :set_pack + before_action :set_body_classes def index authorize :invite, :create? @@ -49,4 +50,8 @@ class InvitesController < ApplicationController def resource_params params.require(:invite).permit(:max_uses, :expires_in, :autofollow) end + + def set_body_classes + @body_classes = 'admin' + end end diff --git a/app/controllers/settings/base_controller.rb b/app/controllers/settings/base_controller.rb index 7322d461b..34ef16568 100644 --- a/app/controllers/settings/base_controller.rb +++ b/app/controllers/settings/base_controller.rb @@ -5,8 +5,13 @@ class Settings::BaseController < ApplicationController before_action :authenticate_user! before_action :set_pack + before_action :set_body_classes def set_pack use_pack 'settings' end + + def set_body_classes + @body_classes = 'admin' + end end diff --git a/app/controllers/settings/follower_domains_controller.rb b/app/controllers/settings/follower_domains_controller.rb index 83945df52..8aae379aa 100644 --- a/app/controllers/settings/follower_domains_controller.rb +++ b/app/controllers/settings/follower_domains_controller.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require 'sidekiq-bulk' - class Settings::FollowerDomainsController < Settings::BaseController def show @account = current_account diff --git a/app/controllers/settings/sessions_controller.rb b/app/controllers/settings/sessions_controller.rb index 780ea64b4..f235dd477 100644 --- a/app/controllers/settings/sessions_controller.rb +++ b/app/controllers/settings/sessions_controller.rb @@ -3,6 +3,7 @@ # Intentionally does not inherit from BaseController class Settings::SessionsController < ApplicationController before_action :set_session, only: :destroy + before_action :set_body_classes def destroy @session.destroy! @@ -15,4 +16,8 @@ class Settings::SessionsController < ApplicationController def set_session @session = current_user.session_activations.find(params[:id]) end + + def set_body_classes + @body_classes = 'admin' + end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index e9b48fa98..5e7fdffb0 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -84,7 +84,7 @@ module ApplicationHelper end def cdn_host - ENV['CDN_HOST'].presence + Rails.configuration.action_controller.asset_host end def cdn_host? @@ -92,10 +92,10 @@ module ApplicationHelper end def storage_host - ENV['S3_ALIAS_HOST'].presence || ENV['S3_CLOUDFRONT_HOST'].presence + "https://#{ENV['S3_ALIAS_HOST'].presence || ENV['S3_CLOUDFRONT_HOST']}" end def storage_host? - storage_host.present? + ENV['S3_ALIAS_HOST'].present? || ENV['S3_CLOUDFRONT_HOST'].present? end end diff --git a/app/javascript/core/admin.js b/app/javascript/core/admin.js index 0c26dc18d..3f6f187bc 100644 --- a/app/javascript/core/admin.js +++ b/app/javascript/core/admin.js @@ -2,18 +2,6 @@ import { delegate } from 'rails-ujs'; -function handleDeleteStatus(event) { - const [data] = event.detail; - const element = document.querySelector(`[data-id="${data.id}"]`); - if (element) { - element.parentNode.removeChild(element); - } -} - -[].forEach.call(document.querySelectorAll('.trash-button'), (content) => { - content.addEventListener('ajax:success', handleDeleteStatus); -}); - const batchCheckboxClassName = '.batch-checkbox input[type="checkbox"]'; delegate(document, '#batch_checkbox_all', 'change', ({ target }) => { @@ -24,6 +12,7 @@ delegate(document, '#batch_checkbox_all', 'change', ({ target }) => { delegate(document, batchCheckboxClassName, 'change', () => { const checkAllElement = document.querySelector('#batch_checkbox_all'); + if (checkAllElement) { checkAllElement.checked = [].every.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked); checkAllElement.indeterminate = !checkAllElement.checked && [].some.call(document.querySelectorAll(batchCheckboxClassName), (content) => content.checked); @@ -43,8 +32,14 @@ delegate(document, '.media-spoiler-hide-button', 'click', () => { }); delegate(document, '#domain_block_severity', 'change', ({ target }) => { - const rejectMediaDiv = document.querySelector('.input.with_label.domain_block_reject_media'); + const rejectMediaDiv = document.querySelector('.input.with_label.domain_block_reject_media'); + const rejectReportsDiv = document.querySelector('.input.with_label.domain_block_reject_reports'); + if (rejectMediaDiv) { rejectMediaDiv.style.display = (target.value === 'suspend') ? 'none' : 'block'; } + + if (rejectReportsDiv) { + rejectReportsDiv.style.display = (target.value === 'suspend') ? 'none' : 'block'; + } }); diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js index af97c84f9..23a303747 100644 --- a/app/javascript/core/settings.js +++ b/app/javascript/core/settings.js @@ -1,30 +1,16 @@ // This file will be loaded on settings pages, regardless of theme. -const { length } = require('stringz'); const { delegate } = require('rails-ujs'); import emojify from '../mastodon/features/emoji/emoji'; delegate(document, '#account_display_name', 'input', ({ target }) => { - const nameCounter = document.querySelector('.name-counter'); - const name = document.querySelector('.card .display-name strong'); - - if (nameCounter) { - nameCounter.textContent = 30 - length(target.value); - } + const name = document.querySelector('.card .display-name strong'); if (name) { name.innerHTML = emojify(target.value); } }); -delegate(document, '#account_note', 'input', ({ target }) => { - const noteCounter = document.querySelector('.note-counter'); - - if (noteCounter) { - noteCounter.textContent = 500 - length(target.value); - } -}); - delegate(document, '#account_avatar', 'change', ({ target }) => { const avatar = document.querySelector('.card .avatar img'); const [file] = target.files || []; diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js index fb311fc0a..58f2b3786 100644 --- a/app/javascript/flavours/glitch/actions/compose.js +++ b/app/javascript/flavours/glitch/actions/compose.js @@ -120,6 +120,7 @@ export function submitCompose() { return function (dispatch, getState) { let status = getState().getIn(['compose', 'text'], ''); let media = getState().getIn(['compose', 'media_attachments']); + let spoilerText = getState().getIn(['compose', 'spoiler_text'], ''); if ((!status || !status.length) && media.size === 0) { return; @@ -133,8 +134,8 @@ export function submitCompose() { status, in_reply_to_id: getState().getIn(['compose', 'in_reply_to'], null), media_ids: media.map(item => item.get('id')), - sensitive: getState().getIn(['compose', 'sensitive']), - spoiler_text: getState().getIn(['compose', 'spoiler_text'], ''), + sensitive: getState().getIn(['compose', 'sensitive']) || spoilerText.length > 0, + spoiler_text: spoilerText, visibility: getState().getIn(['compose', 'privacy']), }, { headers: { diff --git a/app/javascript/flavours/glitch/components/display_name.js b/app/javascript/flavours/glitch/components/display_name.js index 4c65aaefa..d6ac4907d 100644 --- a/app/javascript/flavours/glitch/components/display_name.js +++ b/app/javascript/flavours/glitch/components/display_name.js @@ -15,7 +15,7 @@ export default function DisplayName ({ // The result. return account ? ( <span className={computedClass}> - <strong className='display-name__html' dangerouslySetInnerHTML={{ __html: account.get('display_name_html') }} /> + <bdi><strong className='display-name__html' dangerouslySetInnerHTML={{ __html: account.get('display_name_html') }} /></bdi> {inline ? ' ' : null} <span className='display-name__account'>@{account.get('acct')}</span> </span> diff --git a/app/javascript/flavours/glitch/components/media_gallery.js b/app/javascript/flavours/glitch/components/media_gallery.js index 613318102..e8dfd6f8e 100644 --- a/app/javascript/flavours/glitch/components/media_gallery.js +++ b/app/javascript/flavours/glitch/components/media_gallery.js @@ -215,6 +215,7 @@ export default class MediaGallery extends React.PureComponent { standalone: PropTypes.bool, letterbox: PropTypes.bool, fullwidth: PropTypes.bool, + hidden: PropTypes.bool, media: ImmutablePropTypes.list.isRequired, size: PropTypes.object, onOpenMedia: PropTypes.func.isRequired, @@ -235,6 +236,14 @@ export default class MediaGallery extends React.PureComponent { } } + componentDidUpdate (prevProps) { + if (this.node && this.node.offsetWidth) { + this.setState({ + width: this.node.offsetWidth, + }); + } + } + handleOpen = () => { this.setState({ visible: !this.state.visible }); } @@ -244,6 +253,7 @@ export default class MediaGallery extends React.PureComponent { } handleRef = (node) => { + this.node = node; if (node /*&& this.isStandaloneEligible()*/) { // offsetWidth triggers a layout, so only calculate when we need to this.setState({ diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js index 665aa457a..449532ea4 100644 --- a/app/javascript/flavours/glitch/components/status.js +++ b/app/javascript/flavours/glitch/components/status.js @@ -465,6 +465,7 @@ export default class Status extends ImmutablePureComponent { sensitive={status.get('sensitive')} letterbox={settings.getIn(['media', 'letterbox'])} fullwidth={settings.getIn(['media', 'fullwidth'])} + hidden={isCollapsed || !isExpanded} onOpenMedia={this.props.onOpenMedia} /> )} diff --git a/app/javascript/flavours/glitch/features/account_timeline/components/moved_note.js b/app/javascript/flavours/glitch/features/account_timeline/components/moved_note.js index 1c0e081cc..280389bba 100644 --- a/app/javascript/flavours/glitch/features/account_timeline/components/moved_note.js +++ b/app/javascript/flavours/glitch/features/account_timeline/components/moved_note.js @@ -34,7 +34,7 @@ export default class MovedNote extends ImmutablePureComponent { <div className='account__moved-note'> <div className='account__moved-note__message'> <div className='account__moved-note__icon-wrapper'><i className='fa fa-fw fa-suitcase account__moved-note__icon' /></div> - <FormattedMessage id='account.moved_to' defaultMessage='{name} has moved to:' values={{ name: <strong dangerouslySetInnerHTML={displayNameHtml} /> }} /> + <FormattedMessage id='account.moved_to' defaultMessage='{name} has moved to:' values={{ name: <bdi><strong dangerouslySetInnerHTML={displayNameHtml} /></bdi> }} /> </div> <a href={to.get('url')} onClick={this.handleAccountClick} className='detailed-status__display-name'> diff --git a/app/javascript/flavours/glitch/features/composer/index.js b/app/javascript/flavours/glitch/features/composer/index.js index 257797047..029b11a36 100644 --- a/app/javascript/flavours/glitch/features/composer/index.js +++ b/app/javascript/flavours/glitch/features/composer/index.js @@ -437,6 +437,7 @@ class Composer extends React.Component { intl={intl} onChange={handleChangeSpoiler} onSubmit={handleSubmit} + onSecondarySubmit={handleSecondarySubmit} text={spoilerText} ref={handleRefSpoilerText} /> diff --git a/app/javascript/flavours/glitch/features/composer/options/dropdown/index.js b/app/javascript/flavours/glitch/features/composer/options/dropdown/index.js index 8cfbac1bb..7817cc964 100644 --- a/app/javascript/flavours/glitch/features/composer/options/dropdown/index.js +++ b/app/javascript/flavours/glitch/features/composer/options/dropdown/index.js @@ -131,7 +131,7 @@ export default class ComposerOptionsDropdown extends React.PureComponent { this.state = { needsModalUpdate: false, open: false, - placement: null, + placement: 'bottom', }; } diff --git a/app/javascript/flavours/glitch/features/composer/spoiler/index.js b/app/javascript/flavours/glitch/features/composer/spoiler/index.js index a7fecbcf5..1c3c962f0 100644 --- a/app/javascript/flavours/glitch/features/composer/spoiler/index.js +++ b/app/javascript/flavours/glitch/features/composer/spoiler/index.js @@ -25,18 +25,31 @@ const handlers = { ctrlKey, keyCode, metaKey, + altKey, }) { - const { onSubmit } = this.props; + const { onSubmit, onSecondarySubmit } = this.props; // We submit the status on control/meta + enter. if (onSubmit && keyCode === 13 && (ctrlKey || metaKey)) { onSubmit(); } + + // Submit the status with secondary visibility on alt + enter. + if (onSecondarySubmit && keyCode === 13 && altKey) { + onSecondarySubmit(); + } }, handleRefSpoilerText (spoilerText) { this.spoilerText = spoilerText; }, + + // When the escape key is released, we focus the UI. + handleKeyUp ({ key }) { + if (key === 'Escape') { + document.querySelector('.ui').parentElement.focus(); + } + }, }; // The component. @@ -50,7 +63,7 @@ export default class ComposerSpoiler extends React.PureComponent { // Rendering. render () { - const { handleKeyDown, handleRefSpoilerText } = this.handlers; + const { handleKeyDown, handleKeyUp, handleRefSpoilerText } = this.handlers; const { hidden, intl, @@ -69,6 +82,7 @@ export default class ComposerSpoiler extends React.PureComponent { id='glitch.composer.spoiler.input' onChange={onChange} onKeyDown={handleKeyDown} + onKeyUp={handleKeyUp} placeholder={intl.formatMessage(messages.placeholder)} type='text' value={text} @@ -87,5 +101,6 @@ ComposerSpoiler.propTypes = { intl: PropTypes.object.isRequired, onChange: PropTypes.func, onSubmit: PropTypes.func, + onSecondarySubmit: PropTypes.func, text: PropTypes.string, }; diff --git a/app/javascript/flavours/glitch/features/composer/upload_form/item/index.js b/app/javascript/flavours/glitch/features/composer/upload_form/item/index.js index 5addccfb1..93fa4e39e 100644 --- a/app/javascript/flavours/glitch/features/composer/upload_form/item/index.js +++ b/app/javascript/flavours/glitch/features/composer/upload_form/item/index.js @@ -14,6 +14,7 @@ import IconButton from 'flavours/glitch/components/icon_button'; // Utils. import Motion from 'flavours/glitch/util/optional_motion'; import { assignHandlers } from 'flavours/glitch/util/react_helpers'; +import { isUserTouching } from 'flavours/glitch/util/is_mobile'; // Messages. const messages = defineMessages({ @@ -130,7 +131,7 @@ export default class ComposerUploadFormItem extends React.PureComponent { hovered, dirtyDescription, } = this.state; - const active = hovered || focused; + const active = hovered || focused || isUserTouching(); const computedClass = classNames('composer--upload_form--item', { active }); const x = ((focusX / 2) + .5) * 100; const y = ((focusY / -2) + .5) * 100; diff --git a/app/javascript/flavours/glitch/features/notifications/components/follow.js b/app/javascript/flavours/glitch/features/notifications/components/follow.js index 54506f67c..ea81d9ab4 100644 --- a/app/javascript/flavours/glitch/features/notifications/components/follow.js +++ b/app/javascript/flavours/glitch/features/notifications/components/follow.js @@ -63,13 +63,13 @@ export default class NotificationFollow extends ImmutablePureComponent { // Links to the display name. const displayName = account.get('display_name_html') || account.get('username'); const link = ( - <Permalink + <bdi><Permalink className='notification__display-name' href={account.get('url')} title={account.get('acct')} to={`/accounts/${account.get('id')}`} dangerouslySetInnerHTML={{ __html: displayName }} - /> + /></bdi> ); // Renders. diff --git a/app/javascript/flavours/glitch/features/status/index.js b/app/javascript/flavours/glitch/features/status/index.js index 4382748d5..cfa1450f6 100644 --- a/app/javascript/flavours/glitch/features/status/index.js +++ b/app/javascript/flavours/glitch/features/status/index.js @@ -127,7 +127,7 @@ export default class Status extends ImmutablePureComponent { if (status.get('favourited')) { this.props.dispatch(unfavourite(status)); } else { - if (e.shiftKey || !favouriteModal) { + if ((e && e.shiftKey) || !favouriteModal) { this.handleModalFavourite(status); } else { this.props.dispatch(openModal('FAVOURITE', { status, onFavourite: this.handleModalFavourite })); @@ -164,7 +164,7 @@ export default class Status extends ImmutablePureComponent { if (status.get('reblogged')) { this.props.dispatch(unreblog(status)); } else { - if (e.shiftKey || !boostModal) { + if ((e && e.shiftKey) || !boostModal) { this.handleModalReblog(status); } else { this.props.dispatch(openModal('BOOST', { status, onReblog: this.handleModalReblog })); diff --git a/app/javascript/flavours/glitch/features/video/index.js b/app/javascript/flavours/glitch/features/video/index.js index 227f298e4..4f95aea96 100644 --- a/app/javascript/flavours/glitch/features/video/index.js +++ b/app/javascript/flavours/glitch/features/video/index.js @@ -220,6 +220,11 @@ export default class Video extends React.PureComponent { } componentDidUpdate (prevProps) { + if (this.player && this.player.offsetWidth && !this.state.fullscreen) { + this.setState({ + containerWidth: this.player.offsetWidth, + }); + } if (this.video && this.state.revealed && this.props.preventPlayback && !prevProps.preventPlayback) { this.video.pause(); } diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss index be2bf7cea..8c4c934ea 100644 --- a/app/javascript/flavours/glitch/styles/forms.scss +++ b/app/javascript/flavours/glitch/styles/forms.scss @@ -427,7 +427,7 @@ code { &__append { position: absolute; - right: 1px; + right: 3px; top: 1px; padding: 10px; padding-bottom: 9px; @@ -460,9 +460,20 @@ code { border-radius: 4px; padding: 15px 10px; margin-bottom: 30px; - box-shadow: 0 0 5px rgba($base-shadow-color, 0.2); text-align: center; + &.notice { + border: 1px solid rgba($valid-value-color, 0.5); + background: rgba($valid-value-color, 0.25); + color: $valid-value-color; + } + + &.alert { + border: 1px solid rgba($error-value-color, 0.5); + background: rgba($error-value-color, 0.25); + color: $error-value-color; + } + p { margin-bottom: 15px; } @@ -551,12 +562,12 @@ code { .oauth-prompt, .follow-prompt { margin-bottom: 30px; - text-align: center; color: $darker-text-color; h2 { font-size: 16px; margin-bottom: 30px; + text-align: center; } strong { diff --git a/app/javascript/flavours/glitch/styles/rtl.scss b/app/javascript/flavours/glitch/styles/rtl.scss index 70aaa5bb1..d4618440d 100644 --- a/app/javascript/flavours/glitch/styles/rtl.scss +++ b/app/javascript/flavours/glitch/styles/rtl.scss @@ -73,7 +73,7 @@ body.rtl { float: left; } - .setting-toggle { + .setting-toggle__label { margin-left: 0; margin-right: 8px; } @@ -200,6 +200,10 @@ body.rtl { right: -2.14285714em; } + .admin-wrapper { + direction: rtl; + } + .admin-wrapper .sidebar ul a i.fa, a.table-action-link i.fa { margin-right: 0; @@ -218,22 +222,47 @@ body.rtl { right: 0; } + .simple_form .input.radio_buttons .radio { + left: auto; + right: 0; + } + + .simple_form .input.radio_buttons .radio > label { + padding-right: 28px; + padding-left: 0; + } + .simple_form .input-with-append .input input { padding-left: 142px; padding-right: 0; } - .simple_form .input-with-append .append { + .simple_form .input.boolean label.checkbox { + left: auto; + right: 0; + } + + .simple_form .input.boolean .label_input, + .simple_form .input.boolean .hint { + padding-left: 0; + padding-right: 28px; + } + + .simple_form .label_input__append { right: auto; - left: 0; + left: 3px; &::after { right: auto; left: 0; - background-image: linear-gradient(to left, rgba($ui-base-color, 0), $ui-base-color); + background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%)); } } + .simple_form select { + background: darken($ui-base-color, 10%) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>") no-repeat left 8px center / auto 16px; + } + .table th, .table td { text-align: right; @@ -249,6 +278,10 @@ body.rtl { left: auto; } + .landing-page__call-to-action .row__information-board { + direction: rtl; + } + .landing-page .header .hero .floats .float-1 { left: -120px; right: auto; @@ -312,4 +345,40 @@ body.rtl { margin-right: 20px; } } + + .landing-page__information { + .account__display-name { + margin-right: 0; + margin-left: 5px; + } + + .account__avatar-wrapper { + margin-left: 12px; + margin-right: 0; + } + } + + .card__bar .display-name { + margin-left: 0; + margin-right: 15px; + text-align: right; + } + + .fa-chevron-left::before { + content: "\F054"; + } + + .fa-chevron-right::before { + content: "\F053"; + } + + .column-back-button__icon { + margin-right: 0; + margin-left: 5px; + } + + .column-header__setting-arrows .column-header__setting-btn:last-child { + padding-left: 0; + padding-right: 10px; + } } diff --git a/app/javascript/flavours/glitch/styles/stream_entries.scss b/app/javascript/flavours/glitch/styles/stream_entries.scss index c458fcb79..80e2d0ca0 100644 --- a/app/javascript/flavours/glitch/styles/stream_entries.scss +++ b/app/javascript/flavours/glitch/styles/stream_entries.scss @@ -3,7 +3,6 @@ border-radius: 4px; overflow: hidden; margin-bottom: 10px; - text-align: left; @media screen and (max-width: $no-gap-breakpoint) { margin-bottom: 0; diff --git a/app/javascript/flavours/glitch/util/emoji/emoji_mart_search_light.js b/app/javascript/flavours/glitch/util/emoji/emoji_mart_search_light.js index 36351ec02..164fdcc0b 100644 --- a/app/javascript/flavours/glitch/util/emoji/emoji_mart_search_light.js +++ b/app/javascript/flavours/glitch/util/emoji/emoji_mart_search_light.js @@ -2,7 +2,7 @@ // https://github.com/missive/emoji-mart/blob/5f2ffcc/src/utils/emoji-index.js import data from './emoji_mart_data_light'; -import { getData, getSanitizedData, intersect } from './emoji_utils'; +import { getData, getSanitizedData, uniq, intersect } from './emoji_utils'; let originalPool = {}; let index = {}; @@ -103,7 +103,7 @@ function search(value, { emojisToShowFilter, maxResults, include, exclude, custo } } - allResults = values.map((value) => { + const searchValue = (value) => { let aPool = pool, aIndex = index, length = 0; @@ -150,15 +150,23 @@ function search(value, { emojisToShowFilter, maxResults, include, exclude, custo } return aIndex.results; - }).filter(a => a); + }; - if (allResults.length > 1) { - results = intersect.apply(null, allResults); - } else if (allResults.length) { - results = allResults[0]; + if (values.length > 1) { + results = searchValue(value); } else { results = []; } + + allResults = values.map(searchValue).filter(a => a); + + if (allResults.length > 1) { + allResults = intersect.apply(null, allResults); + } else if (allResults.length) { + allResults = allResults[0]; + } + + results = uniq(results.concat(allResults)); } if (results) { diff --git a/app/javascript/mastodon/actions/cards.js b/app/javascript/mastodon/actions/cards.js deleted file mode 100644 index baf04833a..000000000 --- a/app/javascript/mastodon/actions/cards.js +++ /dev/null @@ -1,52 +0,0 @@ -import api from '../api'; - -export const STATUS_CARD_FETCH_REQUEST = 'STATUS_CARD_FETCH_REQUEST'; -export const STATUS_CARD_FETCH_SUCCESS = 'STATUS_CARD_FETCH_SUCCESS'; -export const STATUS_CARD_FETCH_FAIL = 'STATUS_CARD_FETCH_FAIL'; - -export function fetchStatusCard(id) { - return (dispatch, getState) => { - if (getState().getIn(['cards', id], null) !== null) { - return; - } - - dispatch(fetchStatusCardRequest(id)); - - api(getState).get(`/api/v1/statuses/${id}/card`).then(response => { - if (!response.data.url) { - return; - } - - dispatch(fetchStatusCardSuccess(id, response.data)); - }).catch(error => { - dispatch(fetchStatusCardFail(id, error)); - }); - }; -}; - -export function fetchStatusCardRequest(id) { - return { - type: STATUS_CARD_FETCH_REQUEST, - id, - skipLoading: true, - }; -}; - -export function fetchStatusCardSuccess(id, card) { - return { - type: STATUS_CARD_FETCH_SUCCESS, - id, - card, - skipLoading: true, - }; -}; - -export function fetchStatusCardFail(id, error) { - return { - type: STATUS_CARD_FETCH_FAIL, - id, - error, - skipLoading: true, - skipAlert: true, - }; -}; diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js index 6d975cd1e..86d83122f 100644 --- a/app/javascript/mastodon/actions/compose.js +++ b/app/javascript/mastodon/actions/compose.js @@ -56,7 +56,7 @@ export function changeCompose(text) { }; }; -export function replyCompose(status, router) { +export function replyCompose(status, routerHistory) { return (dispatch, getState) => { dispatch({ type: COMPOSE_REPLY, @@ -64,7 +64,7 @@ export function replyCompose(status, router) { }); if (!getState().getIn(['compose', 'mounted'])) { - router.push('/statuses/new'); + routerHistory.push('/statuses/new'); } }; }; @@ -81,7 +81,7 @@ export function resetCompose() { }; }; -export function mentionCompose(account, router) { +export function mentionCompose(account, routerHistory) { return (dispatch, getState) => { dispatch({ type: COMPOSE_MENTION, @@ -89,12 +89,12 @@ export function mentionCompose(account, router) { }); if (!getState().getIn(['compose', 'mounted'])) { - router.push('/statuses/new'); + routerHistory.push('/statuses/new'); } }; }; -export function directCompose(account, router) { +export function directCompose(account, routerHistory) { return (dispatch, getState) => { dispatch({ type: COMPOSE_DIRECT, @@ -102,12 +102,12 @@ export function directCompose(account, router) { }); if (!getState().getIn(['compose', 'mounted'])) { - router.push('/statuses/new'); + routerHistory.push('/statuses/new'); } }; }; -export function submitCompose() { +export function submitCompose(routerHistory) { return function (dispatch, getState) { const status = getState().getIn(['compose', 'text'], ''); const media = getState().getIn(['compose', 'media_attachments']); @@ -133,21 +133,24 @@ export function submitCompose() { dispatch(insertIntoTagHistory(response.data.tags, status)); dispatch(submitComposeSuccess({ ...response.data })); - // To make the app more responsive, immediately get the status into the columns + // To make the app more responsive, immediately push the status + // into the columns - const insertIfOnline = (timelineId) => { + const insertIfOnline = timelineId => { if (getState().getIn(['timelines', timelineId, 'items', 0]) !== null) { dispatch(updateTimeline(timelineId, { ...response.data })); } }; - insertIfOnline('home'); + if (response.data.visibility === 'direct' && getState().getIn(['conversations', 'mounted']) <= 0 && routerHistory) { + routerHistory.push('/timelines/direct'); + } else if (response.data.visibility !== 'direct') { + insertIfOnline('home'); + } if (response.data.in_reply_to_id === null && response.data.visibility === 'public') { insertIfOnline('community'); insertIfOnline('public'); - } else if (response.data.visibility === 'direct') { - insertIfOnline('direct'); } }).catch(function (error) { dispatch(submitComposeFail(error)); diff --git a/app/javascript/mastodon/actions/conversations.js b/app/javascript/mastodon/actions/conversations.js index 3840d23ca..aefd2fef7 100644 --- a/app/javascript/mastodon/actions/conversations.js +++ b/app/javascript/mastodon/actions/conversations.js @@ -5,11 +5,33 @@ import { importFetchedStatus, } from './importer'; +export const CONVERSATIONS_MOUNT = 'CONVERSATIONS_MOUNT'; +export const CONVERSATIONS_UNMOUNT = 'CONVERSATIONS_UNMOUNT'; + export const CONVERSATIONS_FETCH_REQUEST = 'CONVERSATIONS_FETCH_REQUEST'; export const CONVERSATIONS_FETCH_SUCCESS = 'CONVERSATIONS_FETCH_SUCCESS'; export const CONVERSATIONS_FETCH_FAIL = 'CONVERSATIONS_FETCH_FAIL'; export const CONVERSATIONS_UPDATE = 'CONVERSATIONS_UPDATE'; +export const CONVERSATIONS_READ = 'CONVERSATIONS_READ'; + +export const mountConversations = () => ({ + type: CONVERSATIONS_MOUNT, +}); + +export const unmountConversations = () => ({ + type: CONVERSATIONS_UNMOUNT, +}); + +export const markConversationRead = conversationId => (dispatch, getState) => { + dispatch({ + type: CONVERSATIONS_READ, + id: conversationId, + }); + + api(getState).post(`/api/v1/conversations/${conversationId}/read`); +}; + export const expandConversations = ({ maxId } = {}) => (dispatch, getState) => { dispatch(expandConversationsRequest()); diff --git a/app/javascript/mastodon/actions/statuses.js b/app/javascript/mastodon/actions/statuses.js index 8d5e72bec..e7c89b4ba 100644 --- a/app/javascript/mastodon/actions/statuses.js +++ b/app/javascript/mastodon/actions/statuses.js @@ -3,7 +3,6 @@ import openDB from '../storage/db'; import { evictStatus } from '../storage/modifier'; import { deleteFromTimelines } from './timelines'; -import { fetchStatusCard } from './cards'; import { importFetchedStatus, importFetchedStatuses, importAccount, importStatus } from './importer'; export const STATUS_FETCH_REQUEST = 'STATUS_FETCH_REQUEST'; @@ -86,7 +85,6 @@ export function fetchStatus(id) { const skipLoading = getState().getIn(['statuses', id], null) !== null; dispatch(fetchContext(id)); - dispatch(fetchStatusCard(id)); if (skipLoading) { return; diff --git a/app/javascript/mastodon/actions/suggestions.js b/app/javascript/mastodon/actions/suggestions.js new file mode 100644 index 000000000..b15bd916b --- /dev/null +++ b/app/javascript/mastodon/actions/suggestions.js @@ -0,0 +1,52 @@ +import api from '../api'; +import { importFetchedAccounts } from './importer'; + +export const SUGGESTIONS_FETCH_REQUEST = 'SUGGESTIONS_FETCH_REQUEST'; +export const SUGGESTIONS_FETCH_SUCCESS = 'SUGGESTIONS_FETCH_SUCCESS'; +export const SUGGESTIONS_FETCH_FAIL = 'SUGGESTIONS_FETCH_FAIL'; + +export const SUGGESTIONS_DISMISS = 'SUGGESTIONS_DISMISS'; + +export function fetchSuggestions() { + return (dispatch, getState) => { + dispatch(fetchSuggestionsRequest()); + + api(getState).get('/api/v1/suggestions').then(response => { + dispatch(importFetchedAccounts(response.data)); + dispatch(fetchSuggestionsSuccess(response.data)); + }).catch(error => dispatch(fetchSuggestionsFail(error))); + }; +}; + +export function fetchSuggestionsRequest() { + return { + type: SUGGESTIONS_FETCH_REQUEST, + skipLoading: true, + }; +}; + +export function fetchSuggestionsSuccess(accounts) { + return { + type: SUGGESTIONS_FETCH_SUCCESS, + accounts, + skipLoading: true, + }; +}; + +export function fetchSuggestionsFail(error) { + return { + type: SUGGESTIONS_FETCH_FAIL, + error, + skipLoading: true, + skipAlert: true, + }; +}; + +export const dismissSuggestion = accountId => (dispatch, getState) => { + dispatch({ + type: SUGGESTIONS_DISMISS, + id: accountId, + }); + + api(getState).delete(`/api/v1/suggestions/${accountId}`); +}; diff --git a/app/javascript/mastodon/components/account.js b/app/javascript/mastodon/components/account.js index c021e3267..2bcea8b67 100644 --- a/app/javascript/mastodon/components/account.js +++ b/app/javascript/mastodon/components/account.js @@ -30,6 +30,9 @@ class Account extends ImmutablePureComponent { onMuteNotifications: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, hidden: PropTypes.bool, + actionIcon: PropTypes.string, + actionTitle: PropTypes.string, + onActionClick: PropTypes.func, }; handleFollow = () => { @@ -52,8 +55,12 @@ class Account extends ImmutablePureComponent { this.props.onMuteNotifications(this.props.account, false); } + handleAction = () => { + this.props.onActionClick(this.props.account); + } + render () { - const { account, intl, hidden } = this.props; + const { account, intl, hidden, onActionClick, actionIcon, actionTitle } = this.props; if (!account) { return <div />; @@ -70,7 +77,9 @@ class Account extends ImmutablePureComponent { let buttons; - if (account.get('id') !== me && account.get('relationship', null) !== null) { + if (onActionClick && actionIcon) { + buttons = <IconButton icon={actionIcon} title={actionTitle} onClick={this.handleAction} />; + } else if (account.get('id') !== me && account.get('relationship', null) !== null) { const following = account.getIn(['relationship', 'following']); const requested = account.getIn(['relationship', 'requested']); const blocking = account.getIn(['relationship', 'blocking']); diff --git a/app/javascript/mastodon/components/avatar_composite.js b/app/javascript/mastodon/components/avatar_composite.js new file mode 100644 index 000000000..4a9a73c51 --- /dev/null +++ b/app/javascript/mastodon/components/avatar_composite.js @@ -0,0 +1,96 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { autoPlayGif } from '../initial_state'; + +export default class AvatarComposite extends React.PureComponent { + + static propTypes = { + accounts: ImmutablePropTypes.list.isRequired, + animate: PropTypes.bool, + size: PropTypes.number.isRequired, + }; + + static defaultProps = { + animate: autoPlayGif, + }; + + renderItem (account, size, index) { + const { animate } = this.props; + + let width = 50; + let height = 100; + let top = 'auto'; + let left = 'auto'; + let bottom = 'auto'; + let right = 'auto'; + + if (size === 1) { + width = 100; + } + + if (size === 4 || (size === 3 && index > 0)) { + height = 50; + } + + if (size === 2) { + if (index === 0) { + right = '2px'; + } else { + left = '2px'; + } + } else if (size === 3) { + if (index === 0) { + right = '2px'; + } else if (index > 0) { + left = '2px'; + } + + if (index === 1) { + bottom = '2px'; + } else if (index > 1) { + top = '2px'; + } + } else if (size === 4) { + if (index === 0 || index === 2) { + right = '2px'; + } + + if (index === 1 || index === 3) { + left = '2px'; + } + + if (index < 2) { + bottom = '2px'; + } else { + top = '2px'; + } + } + + const style = { + left: left, + top: top, + right: right, + bottom: bottom, + width: `${width}%`, + height: `${height}%`, + backgroundSize: 'cover', + backgroundImage: `url(${account.get(animate ? 'avatar' : 'avatar_static')})`, + }; + + return ( + <div key={account.get('id')} style={style} /> + ); + } + + render() { + const { accounts, size } = this.props; + + return ( + <div className='account__avatar-composite' style={{ width: `${size}px`, height: `${size}px` }}> + {accounts.take(4).map((account, i) => this.renderItem(account, accounts.size, i))} + </div> + ); + } + +} diff --git a/app/javascript/mastodon/components/display_name.js b/app/javascript/mastodon/components/display_name.js index c3a9ab921..c2c40cb3f 100644 --- a/app/javascript/mastodon/components/display_name.js +++ b/app/javascript/mastodon/components/display_name.js @@ -1,25 +1,28 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import PropTypes from 'prop-types'; export default class DisplayName extends React.PureComponent { static propTypes = { account: ImmutablePropTypes.map.isRequired, - withAcct: PropTypes.bool, - }; - - static defaultProps = { - withAcct: true, + others: ImmutablePropTypes.list, }; render () { - const { account, withAcct } = this.props; + const { account, others } = this.props; const displayNameHtml = { __html: account.get('display_name_html') }; + let suffix; + + if (others && others.size > 1) { + suffix = `+${others.size}`; + } else { + suffix = <span className='display-name__account'>@{account.get('acct')}</span>; + } + return ( <span className='display-name'> - <bdi><strong className='display-name__html' dangerouslySetInnerHTML={displayNameHtml} /></bdi> {withAcct && <span className='display-name__account'>@{account.get('acct')}</span>} + <bdi><strong className='display-name__html' dangerouslySetInnerHTML={displayNameHtml} /></bdi> {suffix} </span> ); } diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js index 90c689a75..9fa8cc008 100644 --- a/app/javascript/mastodon/components/status.js +++ b/app/javascript/mastodon/components/status.js @@ -3,11 +3,13 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import Avatar from './avatar'; import AvatarOverlay from './avatar_overlay'; +import AvatarComposite from './avatar_composite'; import RelativeTimestamp from './relative_timestamp'; import DisplayName from './display_name'; import StatusContent from './status_content'; import StatusActionBar from './status_action_bar'; import AttachmentList from './attachment_list'; +import Card from '../features/status/components/card'; import { injectIntl, FormattedMessage } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { MediaGallery, Video } from '../features/ui/util/async-components'; @@ -45,6 +47,8 @@ class Status extends ImmutablePureComponent { static propTypes = { status: ImmutablePropTypes.map, account: ImmutablePropTypes.map, + otherAccounts: ImmutablePropTypes.list, + onClick: PropTypes.func, onReply: PropTypes.func, onFavourite: PropTypes.func, onReblog: PropTypes.func, @@ -60,6 +64,7 @@ class Status extends ImmutablePureComponent { onToggleHidden: PropTypes.func, muted: PropTypes.bool, hidden: PropTypes.bool, + unread: PropTypes.bool, onMoveUp: PropTypes.func, onMoveDown: PropTypes.func, }; @@ -74,6 +79,11 @@ class Status extends ImmutablePureComponent { ] handleClick = () => { + if (this.props.onClick) { + this.props.onClick(); + return; + } + if (!this.context.router) { return; } @@ -158,7 +168,7 @@ class Status extends ImmutablePureComponent { let media = null; let statusAvatar, prepend, rebloggedByText; - const { intl, hidden, featured } = this.props; + const { intl, hidden, featured, otherAccounts, unread } = this.props; let { status, account, ...other } = this.props; @@ -247,11 +257,21 @@ class Status extends ImmutablePureComponent { </Bundle> ); } + } else if (status.get('spoiler_text').length === 0 && status.get('card')) { + media = ( + <Card + onOpenMedia={this.props.onOpenMedia} + card={status.get('card')} + compact + /> + ); } - if (account === undefined || account === null) { + if (otherAccounts) { + statusAvatar = <AvatarComposite accounts={otherAccounts} size={48} />; + } else if (account === undefined || account === null) { statusAvatar = <Avatar account={status.get('account')} size={48} />; - }else{ + } else { statusAvatar = <AvatarOverlay account={status.get('account')} friend={account} />; } @@ -269,10 +289,10 @@ class Status extends ImmutablePureComponent { return ( <HotKeys handlers={handlers}> - <div className={classNames('status__wrapper', `status__wrapper-${status.get('visibility')}`, { 'status__wrapper-reply': !!status.get('in_reply_to_id'), focusable: !this.props.muted })} tabIndex={this.props.muted ? null : 0} data-featured={featured ? 'true' : null} aria-label={textForScreenReader(intl, status, rebloggedByText, !status.get('hidden'))}> + <div className={classNames('status__wrapper', `status__wrapper-${status.get('visibility')}`, { 'status__wrapper-reply': !!status.get('in_reply_to_id'), read: unread === false, focusable: !this.props.muted })} tabIndex={this.props.muted ? null : 0} data-featured={featured ? 'true' : null} aria-label={textForScreenReader(intl, status, rebloggedByText, !status.get('hidden'))}> {prepend} - <div className={classNames('status', `status-${status.get('visibility')}`, { 'status-reply': !!status.get('in_reply_to_id'), muted: this.props.muted })} data-id={status.get('id')}> + <div className={classNames('status', `status-${status.get('visibility')}`, { 'status-reply': !!status.get('in_reply_to_id'), muted: this.props.muted, read: unread === false })} data-id={status.get('id')}> <div className='status__info'> <a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener'><RelativeTimestamp timestamp={status.get('created_at')} /></a> @@ -281,7 +301,7 @@ class Status extends ImmutablePureComponent { {statusAvatar} </div> - <DisplayName account={status.get('account')} /> + <DisplayName account={status.get('account')} others={otherAccounts} /> </a> </div> diff --git a/app/javascript/mastodon/components/status_content.js b/app/javascript/mastodon/components/status_content.js index eda7d6ac3..5e3365618 100644 --- a/app/javascript/mastodon/components/status_content.js +++ b/app/javascript/mastodon/components/status_content.js @@ -159,7 +159,7 @@ export default class StatusContent extends React.PureComponent { } const readMoreButton = ( - <button className='status__content__read-more-button' onClick={this.props.onClick}> + <button className='status__content__read-more-button' onClick={this.props.onClick} key='read-more'> <FormattedMessage id='status.read_more' defaultMessage='Read more' /><i className='fa fa-fw fa-angle-right' /> </button> ); @@ -197,6 +197,7 @@ export default class StatusContent extends React.PureComponent { <div ref={this.setRef} tabIndex='0' + key='content' className={classNames} style={directionStyle} dangerouslySetInnerHTML={content} diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js index eec93fc28..4b56c7fdd 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.js +++ b/app/javascript/mastodon/features/compose/components/compose_form.js @@ -31,6 +31,10 @@ const messages = defineMessages({ export default @injectIntl class ComposeForm extends ImmutablePureComponent { + static contextTypes = { + router: PropTypes.object, + }; + static propTypes = { intl: PropTypes.object.isRequired, text: PropTypes.string.isRequired, @@ -85,7 +89,7 @@ class ComposeForm extends ImmutablePureComponent { return; } - this.props.onSubmit(); + this.props.onSubmit(this.context.router ? this.context.router.history : null); } onSuggestionsClearRequested = () => { diff --git a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js index 7b5482f05..5698765d9 100644 --- a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js +++ b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js @@ -164,7 +164,7 @@ class PrivacyDropdown extends React.PureComponent { state = { open: false, - placement: null, + placement: 'bottom', }; handleToggle = ({ target }) => { diff --git a/app/javascript/mastodon/features/compose/components/search_results.js b/app/javascript/mastodon/features/compose/components/search_results.js index c351b84bb..f0ddf6d71 100644 --- a/app/javascript/mastodon/features/compose/components/search_results.js +++ b/app/javascript/mastodon/features/compose/components/search_results.js @@ -1,19 +1,56 @@ import React from 'react'; +import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, defineMessages, injectIntl } from 'react-intl'; import AccountContainer from '../../../containers/account_container'; import StatusContainer from '../../../containers/status_container'; import ImmutablePureComponent from 'react-immutable-pure-component'; import Hashtag from '../../../components/hashtag'; -export default class SearchResults extends ImmutablePureComponent { +const messages = defineMessages({ + dismissSuggestion: { id: 'suggestions.dismiss', defaultMessage: 'Dismiss suggestion' }, +}); + +export default @injectIntl +class SearchResults extends ImmutablePureComponent { static propTypes = { results: ImmutablePropTypes.map.isRequired, + suggestions: ImmutablePropTypes.list.isRequired, + fetchSuggestions: PropTypes.func.isRequired, + dismissSuggestion: PropTypes.func.isRequired, + intl: PropTypes.object.isRequired, }; + componentDidMount () { + this.props.fetchSuggestions(); + } + render () { - const { results } = this.props; + const { intl, results, suggestions, dismissSuggestion } = this.props; + + if (results.isEmpty() && !suggestions.isEmpty()) { + return ( + <div className='search-results'> + <div className='trends'> + <div className='trends__header'> + <i className='fa fa-user-plus fa-fw' /> + <FormattedMessage id='suggestions.header' defaultMessage='You might be interested in…' /> + </div> + + {suggestions && suggestions.map(accountId => ( + <AccountContainer + key={accountId} + id={accountId} + actionIcon='times' + actionTitle={intl.formatMessage(messages.dismissSuggestion)} + onActionClick={dismissSuggestion} + /> + ))} + </div> + </div> + ); + } let accounts, statuses, hashtags; let count = 0; diff --git a/app/javascript/mastodon/features/compose/components/upload.js b/app/javascript/mastodon/features/compose/components/upload.js index e377da90c..a1e99dcbb 100644 --- a/app/javascript/mastodon/features/compose/components/upload.js +++ b/app/javascript/mastodon/features/compose/components/upload.js @@ -14,6 +14,10 @@ const messages = defineMessages({ export default @injectIntl class Upload extends ImmutablePureComponent { + static contextTypes = { + router: PropTypes.object, + }; + static propTypes = { media: ImmutablePropTypes.map.isRequired, intl: PropTypes.object.isRequired, @@ -37,14 +41,16 @@ class Upload extends ImmutablePureComponent { handleSubmit = () => { this.handleInputBlur(); - this.props.onSubmit(); + this.props.onSubmit(this.context.router.history); } - handleUndoClick = () => { + handleUndoClick = e => { + e.stopPropagation(); this.props.onUndo(this.props.media.get('id')); } - handleFocalPointClick = () => { + handleFocalPointClick = e => { + e.stopPropagation(); this.props.onOpenFocalPoint(this.props.media.get('id')); } @@ -64,6 +70,10 @@ class Upload extends ImmutablePureComponent { this.setState({ focused: true }); } + handleClick = () => { + this.setState({ focused: true }); + } + handleInputBlur = () => { const { dirtyDescription } = this.state; @@ -84,7 +94,7 @@ class Upload extends ImmutablePureComponent { const y = ((focusY / -2) + .5) * 100; return ( - <div className='compose-form__upload' onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> + <div className='compose-form__upload' tabIndex='0' onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} onClick={this.handleClick} role='button'> <Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12 }) }}> {({ scale }) => ( <div className='compose-form__upload-thumbnail' style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}> diff --git a/app/javascript/mastodon/features/compose/containers/compose_form_container.js b/app/javascript/mastodon/features/compose/containers/compose_form_container.js index 3822dd711..5d7fb8852 100644 --- a/app/javascript/mastodon/features/compose/containers/compose_form_container.js +++ b/app/javascript/mastodon/features/compose/containers/compose_form_container.js @@ -33,8 +33,8 @@ const mapDispatchToProps = (dispatch) => ({ dispatch(changeCompose(text)); }, - onSubmit () { - dispatch(submitCompose()); + onSubmit (router) { + dispatch(submitCompose(router)); }, onClearSuggestions () { diff --git a/app/javascript/mastodon/features/compose/containers/search_results_container.js b/app/javascript/mastodon/features/compose/containers/search_results_container.js index 16d95d417..f9637861a 100644 --- a/app/javascript/mastodon/features/compose/containers/search_results_container.js +++ b/app/javascript/mastodon/features/compose/containers/search_results_container.js @@ -1,8 +1,15 @@ import { connect } from 'react-redux'; import SearchResults from '../components/search_results'; +import { fetchSuggestions, dismissSuggestion } from '../../../actions/suggestions'; const mapStateToProps = state => ({ results: state.getIn(['search', 'results']), + suggestions: state.getIn(['suggestions', 'items']), }); -export default connect(mapStateToProps)(SearchResults); +const mapDispatchToProps = dispatch => ({ + fetchSuggestions: () => dispatch(fetchSuggestions()), + dismissSuggestion: account => dispatch(dismissSuggestion(account.get('id'))), +}); + +export default connect(mapStateToProps, mapDispatchToProps)(SearchResults); diff --git a/app/javascript/mastodon/features/compose/containers/upload_container.js b/app/javascript/mastodon/features/compose/containers/upload_container.js index 9f3aab4bc..b6d81f03a 100644 --- a/app/javascript/mastodon/features/compose/containers/upload_container.js +++ b/app/javascript/mastodon/features/compose/containers/upload_container.js @@ -22,8 +22,8 @@ const mapDispatchToProps = dispatch => ({ dispatch(openModal('FOCAL_POINT', { id })); }, - onSubmit () { - dispatch(submitCompose()); + onSubmit (router) { + dispatch(submitCompose(router)); }, }); diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js index cf1714b71..d76cd76e6 100644 --- a/app/javascript/mastodon/features/compose/index.js +++ b/app/javascript/mastodon/features/compose/index.js @@ -13,6 +13,7 @@ import spring from 'react-motion/lib/spring'; import SearchResultsContainer from './containers/search_results_container'; import { changeComposing } from '../../actions/compose'; import elephantUIPlane from '../../../images/elephant_ui_plane.svg'; +import { mascot } from '../../initial_state'; const messages = defineMessages({ start: { id: 'getting_started.heading', defaultMessage: 'Getting started' }, @@ -107,7 +108,7 @@ class Compose extends React.PureComponent { <ComposeFormContainer /> {multiColumn && ( <div className='drawer__inner__mastodon'> - <img alt='' draggable='false' src={elephantUIPlane} /> + <img alt='' draggable='false' src={mascot || elephantUIPlane} /> </div> )} </div>} diff --git a/app/javascript/mastodon/features/direct_timeline/components/conversation.js b/app/javascript/mastodon/features/direct_timeline/components/conversation.js index f9a8d4f72..ffcd6d281 100644 --- a/app/javascript/mastodon/features/direct_timeline/components/conversation.js +++ b/app/javascript/mastodon/features/direct_timeline/components/conversation.js @@ -2,12 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import StatusContent from '../../../components/status_content'; -import RelativeTimestamp from '../../../components/relative_timestamp'; -import DisplayName from '../../../components/display_name'; -import Avatar from '../../../components/avatar'; -import AttachmentList from '../../../components/attachment_list'; -import { HotKeys } from 'react-hotkeys'; +import StatusContainer from '../../../containers/status_container'; export default class Conversation extends ImmutablePureComponent { @@ -18,9 +13,11 @@ export default class Conversation extends ImmutablePureComponent { static propTypes = { conversationId: PropTypes.string.isRequired, accounts: ImmutablePropTypes.list.isRequired, - lastStatus: ImmutablePropTypes.map.isRequired, + lastStatusId: PropTypes.string, + unread:PropTypes.bool.isRequired, onMoveUp: PropTypes.func, onMoveDown: PropTypes.func, + markRead: PropTypes.func.isRequired, }; handleClick = () => { @@ -28,8 +25,13 @@ export default class Conversation extends ImmutablePureComponent { return; } - const { lastStatus } = this.props; - this.context.router.history.push(`/statuses/${lastStatus.get('id')}`); + const { lastStatusId, unread, markRead } = this.props; + + if (unread) { + markRead(); + } + + this.context.router.history.push(`/statuses/${lastStatusId}`); } handleHotkeyMoveUp = () => { @@ -41,44 +43,21 @@ export default class Conversation extends ImmutablePureComponent { } render () { - const { accounts, lastStatus, lastAccount } = this.props; + const { accounts, lastStatusId, unread } = this.props; - if (lastStatus === null) { + if (lastStatusId === null) { return null; } - const handlers = { - moveDown: this.handleHotkeyMoveDown, - moveUp: this.handleHotkeyMoveUp, - open: this.handleClick, - }; - - let media; - - if (lastStatus.get('media_attachments').size > 0) { - media = <AttachmentList compact media={lastStatus.get('media_attachments')} />; - } - return ( - <HotKeys handlers={handlers}> - <div className='conversation focusable' tabIndex='0' onClick={this.handleClick} role='button'> - <div className='conversation__header'> - <div className='conversation__avatars'> - <div>{accounts.map(account => <Avatar key={account.get('id')} size={36} account={account} />)}</div> - </div> - - <div className='conversation__time'> - <RelativeTimestamp timestamp={lastStatus.get('created_at')} /> - <br /> - <DisplayName account={lastAccount} withAcct={false} /> - </div> - </div> - - <StatusContent status={lastStatus} onClick={this.handleClick} /> - - {media} - </div> - </HotKeys> + <StatusContainer + id={lastStatusId} + unread={unread} + otherAccounts={accounts} + onMoveUp={this.handleHotkeyMoveUp} + onMoveDown={this.handleHotkeyMoveDown} + onClick={this.handleClick} + /> ); } diff --git a/app/javascript/mastodon/features/direct_timeline/components/conversations_list.js b/app/javascript/mastodon/features/direct_timeline/components/conversations_list.js index 4684548e0..635c03c1d 100644 --- a/app/javascript/mastodon/features/direct_timeline/components/conversations_list.js +++ b/app/javascript/mastodon/features/direct_timeline/components/conversations_list.js @@ -9,14 +9,14 @@ import { debounce } from 'lodash'; export default class ConversationsList extends ImmutablePureComponent { static propTypes = { - conversationIds: ImmutablePropTypes.list.isRequired, + conversations: ImmutablePropTypes.list.isRequired, hasMore: PropTypes.bool, isLoading: PropTypes.bool, onLoadMore: PropTypes.func, shouldUpdateScroll: PropTypes.func, }; - getCurrentIndex = id => this.props.conversationIds.indexOf(id) + getCurrentIndex = id => this.props.conversations.findIndex(x => x.get('id') === id) handleMoveUp = id => { const elementIndex = this.getCurrentIndex(id) - 1; @@ -41,22 +41,22 @@ export default class ConversationsList extends ImmutablePureComponent { } handleLoadOlder = debounce(() => { - const last = this.props.conversationIds.last(); + const last = this.props.conversations.last(); - if (last) { - this.props.onLoadMore(last); + if (last && last.get('last_status')) { + this.props.onLoadMore(last.get('last_status')); } }, 300, { leading: true }) render () { - const { conversationIds, onLoadMore, ...other } = this.props; + const { conversations, onLoadMore, ...other } = this.props; return ( <ScrollableList {...other} onLoadMore={onLoadMore && this.handleLoadOlder} scrollKey='direct' ref={this.setRef}> - {conversationIds.map(item => ( + {conversations.map(item => ( <ConversationContainer - key={item} - conversationId={item} + key={item.get('id')} + conversationId={item.get('id')} onMoveUp={this.handleMoveUp} onMoveDown={this.handleMoveDown} /> diff --git a/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js b/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js index 4166ee2ac..bd6f6bfb0 100644 --- a/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js +++ b/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js @@ -1,15 +1,19 @@ import { connect } from 'react-redux'; import Conversation from '../components/conversation'; +import { markConversationRead } from '../../../actions/conversations'; const mapStateToProps = (state, { conversationId }) => { const conversation = state.getIn(['conversations', 'items']).find(x => x.get('id') === conversationId); - const lastStatus = state.getIn(['statuses', conversation.get('last_status')], null); return { accounts: conversation.get('accounts').map(accountId => state.getIn(['accounts', accountId], null)), - lastStatus, - lastAccount: lastStatus === null ? null : state.getIn(['accounts', lastStatus.get('account')], null), + unread: conversation.get('unread'), + lastStatusId: conversation.get('last_status', null), }; }; -export default connect(mapStateToProps)(Conversation); +const mapDispatchToProps = (dispatch, { conversationId }) => ({ + markRead: () => dispatch(markConversationRead(conversationId)), +}); + +export default connect(mapStateToProps, mapDispatchToProps)(Conversation); diff --git a/app/javascript/mastodon/features/direct_timeline/containers/conversations_list_container.js b/app/javascript/mastodon/features/direct_timeline/containers/conversations_list_container.js index 81ea812ad..57e17d96f 100644 --- a/app/javascript/mastodon/features/direct_timeline/containers/conversations_list_container.js +++ b/app/javascript/mastodon/features/direct_timeline/containers/conversations_list_container.js @@ -3,7 +3,7 @@ import ConversationsList from '../components/conversations_list'; import { expandConversations } from '../../../actions/conversations'; const mapStateToProps = state => ({ - conversationIds: state.getIn(['conversations', 'items']).map(x => x.get('id')), + conversations: state.getIn(['conversations', 'items']), isLoading: state.getIn(['conversations', 'isLoading'], true), hasMore: state.getIn(['conversations', 'hasMore'], false), }); diff --git a/app/javascript/mastodon/features/direct_timeline/index.js b/app/javascript/mastodon/features/direct_timeline/index.js index 41ec73d98..d202f3bfd 100644 --- a/app/javascript/mastodon/features/direct_timeline/index.js +++ b/app/javascript/mastodon/features/direct_timeline/index.js @@ -3,7 +3,7 @@ import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import Column from '../../components/column'; import ColumnHeader from '../../components/column_header'; -import { expandConversations } from '../../actions/conversations'; +import { mountConversations, unmountConversations, expandConversations } from '../../actions/conversations'; import { addColumn, removeColumn, moveColumn } from '../../actions/columns'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { connectDirectStream } from '../../actions/streaming'; @@ -48,11 +48,14 @@ class DirectTimeline extends React.PureComponent { componentDidMount () { const { dispatch } = this.props; + dispatch(mountConversations()); dispatch(expandConversations()); this.disconnect = dispatch(connectDirectStream()); } componentWillUnmount () { + this.props.dispatch(unmountConversations()); + if (this.disconnect) { this.disconnect(); this.disconnect = null; diff --git a/app/javascript/mastodon/features/emoji/emoji_mart_search_light.js b/app/javascript/mastodon/features/emoji/emoji_mart_search_light.js index 36351ec02..164fdcc0b 100644 --- a/app/javascript/mastodon/features/emoji/emoji_mart_search_light.js +++ b/app/javascript/mastodon/features/emoji/emoji_mart_search_light.js @@ -2,7 +2,7 @@ // https://github.com/missive/emoji-mart/blob/5f2ffcc/src/utils/emoji-index.js import data from './emoji_mart_data_light'; -import { getData, getSanitizedData, intersect } from './emoji_utils'; +import { getData, getSanitizedData, uniq, intersect } from './emoji_utils'; let originalPool = {}; let index = {}; @@ -103,7 +103,7 @@ function search(value, { emojisToShowFilter, maxResults, include, exclude, custo } } - allResults = values.map((value) => { + const searchValue = (value) => { let aPool = pool, aIndex = index, length = 0; @@ -150,15 +150,23 @@ function search(value, { emojisToShowFilter, maxResults, include, exclude, custo } return aIndex.results; - }).filter(a => a); + }; - if (allResults.length > 1) { - results = intersect.apply(null, allResults); - } else if (allResults.length) { - results = allResults[0]; + if (values.length > 1) { + results = searchValue(value); } else { results = []; } + + allResults = values.map(searchValue).filter(a => a); + + if (allResults.length > 1) { + allResults = intersect.apply(null, allResults); + } else if (allResults.length) { + allResults = allResults[0]; + } + + results = uniq(results.concat(allResults)); } if (results) { diff --git a/app/javascript/mastodon/features/status/components/card.js b/app/javascript/mastodon/features/status/components/card.js index b52f3c4fa..743fe779a 100644 --- a/app/javascript/mastodon/features/status/components/card.js +++ b/app/javascript/mastodon/features/status/components/card.js @@ -59,10 +59,12 @@ export default class Card extends React.PureComponent { card: ImmutablePropTypes.map, maxDescription: PropTypes.number, onOpenMedia: PropTypes.func.isRequired, + compact: PropTypes.bool, }; static defaultProps = { maxDescription: 50, + compact: false, }; state = { @@ -118,7 +120,7 @@ export default class Card extends React.PureComponent { const content = { __html: addAutoPlay(card.get('html')) }; const { width } = this.state; const ratio = card.get('width') / card.get('height'); - const height = card.get('width') > card.get('height') ? (width / ratio) : (width * ratio); + const height = width / ratio; return ( <div @@ -131,25 +133,25 @@ export default class Card extends React.PureComponent { } render () { - const { card, maxDescription } = this.props; - const { width, embedded } = this.state; + const { card, maxDescription, compact } = this.props; + const { width, embedded } = this.state; if (card === null) { return null; } const provider = card.get('provider_name').length === 0 ? decodeIDNA(getHostname(card.get('url'))) : card.get('provider_name'); - const horizontal = card.get('width') > card.get('height') && (card.get('width') + 100 >= width) || card.get('type') !== 'link'; - const className = classnames('status-card', { horizontal }); + const horizontal = (!compact && card.get('width') > card.get('height') && (card.get('width') + 100 >= width)) || card.get('type') !== 'link' || embedded; const interactive = card.get('type') !== 'link'; + const className = classnames('status-card', { horizontal, compact, interactive }); const title = interactive ? <a className='status-card__title' href={card.get('url')} title={card.get('title')} rel='noopener' target='_blank'><strong>{card.get('title')}</strong></a> : <strong className='status-card__title' title={card.get('title')}>{card.get('title')}</strong>; const ratio = card.get('width') / card.get('height'); - const height = card.get('width') > card.get('height') ? (width / ratio) : (width * ratio); + const height = (compact && !embedded) ? (width / (16 / 9)) : (width / ratio); const description = ( <div className='status-card__content'> {title} - {!horizontal && <p className='status-card__description'>{trim(card.get('description') || '', maxDescription)}</p>} + {!(horizontal || compact) && <p className='status-card__description'>{trim(card.get('description') || '', maxDescription)}</p>} <span className='status-card__host'>{provider}</span> </div> ); @@ -174,7 +176,7 @@ export default class Card extends React.PureComponent { <div className='status-card__actions'> <div> <button onClick={this.handleEmbedClick}><i className={`fa fa-${iconVariant}`} /></button> - <a href={card.get('url')} target='_blank' rel='noopener'><i className='fa fa-external-link' /></a> + {horizontal && <a href={card.get('url')} target='_blank' rel='noopener'><i className='fa fa-external-link' /></a>} </div> </div> </div> @@ -184,7 +186,7 @@ export default class Card extends React.PureComponent { return ( <div className={className} ref={this.setRef}> {embed} - {description} + {!compact && description} </div> ); } else if (card.get('image')) { diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js index b4bbda161..b0dea8817 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.js +++ b/app/javascript/mastodon/features/status/components/detailed_status.js @@ -8,7 +8,7 @@ import MediaGallery from '../../../components/media_gallery'; import AttachmentList from '../../../components/attachment_list'; import { Link } from 'react-router-dom'; import { FormattedDate, FormattedNumber } from 'react-intl'; -import CardContainer from '../containers/card_container'; +import Card from './card'; import ImmutablePureComponent from 'react-immutable-pure-component'; import Video from '../../video'; @@ -80,7 +80,7 @@ export default class DetailedStatus extends ImmutablePureComponent { ); } } else if (status.get('spoiler_text').length === 0) { - media = <CardContainer onOpenMedia={this.props.onOpenMedia} statusId={status.get('id')} />; + media = <Card onOpenMedia={this.props.onOpenMedia} card={status.get('card', null)} />; } if (status.get('application')) { diff --git a/app/javascript/mastodon/features/status/containers/card_container.js b/app/javascript/mastodon/features/status/containers/card_container.js deleted file mode 100644 index a97404de1..000000000 --- a/app/javascript/mastodon/features/status/containers/card_container.js +++ /dev/null @@ -1,8 +0,0 @@ -import { connect } from 'react-redux'; -import Card from '../components/card'; - -const mapStateToProps = (state, { statusId }) => ({ - card: state.getIn(['cards', statusId], null), -}); - -export default connect(mapStateToProps)(Card); diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js index 2cd17b805..b36d82865 100644 --- a/app/javascript/mastodon/features/status/index.js +++ b/app/javascript/mastodon/features/status/index.js @@ -181,7 +181,7 @@ class Status extends ImmutablePureComponent { if (status.get('reblogged')) { this.props.dispatch(unreblog(status)); } else { - if (e.shiftKey || !boostModal) { + if ((e && e.shiftKey) || !boostModal) { this.handleModalReblog(status); } else { this.props.dispatch(openModal('BOOST', { status, onReblog: this.handleModalReblog })); diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js index fb6f675f4..662375a76 100644 --- a/app/javascript/mastodon/features/ui/index.js +++ b/app/javascript/mastodon/features/ui/index.js @@ -460,7 +460,7 @@ class UI extends React.PureComponent { }; return ( - <HotKeys keyMap={keyMap} handlers={handlers} ref={this.setHotkeysRef}> + <HotKeys keyMap={keyMap} handlers={handlers} ref={this.setHotkeysRef} attach={window} focused> <div className={classNames('ui', { 'is-composing': isComposing })} ref={this.setRef} style={{ pointerEvents: dropdownMenuIsOpen ? 'none' : null }}> <TabsBar /> diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js index 1d3d84f9d..05c209d8f 100644 --- a/app/javascript/mastodon/initial_state.js +++ b/app/javascript/mastodon/initial_state.js @@ -15,5 +15,6 @@ export const searchEnabled = getMeta('search_enabled'); export const maxChars = (initialState && initialState.max_toot_chars) || 500; export const invitesEnabled = getMeta('invites_enabled'); export const version = getMeta('version'); +export const mascot = getMeta('mascot'); export default initialState; diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index a74207db6..db2593afc 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -15,7 +15,7 @@ "account.follows.empty": "هذا المستخدِم لا يتبع أحدًا بعد.", "account.follows_you": "يتابعك", "account.hide_reblogs": "إخفاء ترقيات @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "تم التحقق مِن مالك هذا الرابط بتاريخ {date}", "account.media": "وسائط", "account.mention": "أُذكُر @{name}", "account.moved_to": "{name} إنتقل إلى :", @@ -91,6 +91,8 @@ "confirmations.mute.message": "هل أنت متأكد أنك تريد كتم {name} ؟", "confirmations.redraft.confirm": "إزالة و إعادة الصياغة", "confirmations.redraft.message": "هل أنت متأكد من أنك تريد حذف هذا المنشور و إعادة صياغته ؟ سوف تفقد جميع الإعجابات و الترقيات أما الردود المتصلة به فستُصبِح يتيمة.", + "confirmations.reply.confirm": "رد", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "إلغاء المتابعة", "confirmations.unfollow.message": "متأكد من أنك تريد إلغاء متابعة {name} ؟", "embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.", @@ -113,9 +115,9 @@ "empty_column.community": "الخط الزمني المحلي فارغ. أكتب شيئا ما للعامة كبداية !", "empty_column.direct": "لم تتلق أية رسالة خاصة مباشِرة بعد. سوف يتم عرض الرسائل المباشرة هنا إن قمت بإرسال واحدة أو تلقيت البعض منها.", "empty_column.domain_blocks": "ليس هناك نطاقات مخفية بعد.", - "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", - "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", - "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.favourited_statuses": "ليس لديك أية تبويقات مفضلة بعد. عندما ستقوم بالإعجاب بواحد، سيظهر هنا.", + "empty_column.favourites": "لم يقم أي أحد بالإعجاب بهذا التبويق بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.", + "empty_column.follow_requests": "ليس عندك أي طلب للمتابعة بعد. سوف تظهر طلباتك هنا إن قمت بتلقي البعض منها.", "empty_column.hashtag": "ليس هناك بعدُ أي محتوى ذو علاقة بهذا الوسم.", "empty_column.home": "إنّ الخيط الزمني لصفحتك الرئيسية فارغ. قم بزيارة {public} أو استخدم حقل البحث لكي تكتشف مستخدمين آخرين.", "empty_column.home.public_timeline": "الخيط العام", @@ -163,7 +165,7 @@ "keyboard_shortcuts.reply": "للردّ", "keyboard_shortcuts.requests": "لفتح قائمة طلبات المتابعة", "keyboard_shortcuts.search": "للتركيز على البحث", - "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.start": "لفتح عمود \"هيا نبدأ\"", "keyboard_shortcuts.toggle_hidden": "لعرض أو إخفاء النص مِن وراء التحذير", "keyboard_shortcuts.toot": "لتحرير تبويق جديد", "keyboard_shortcuts.unfocus": "لإلغاء التركيز على حقل النص أو نافذة البحث", @@ -280,7 +282,7 @@ "status.cancel_reblog_private": "إلغاء الترقية", "status.cannot_reblog": "تعذرت ترقية هذا المنشور", "status.delete": "إحذف", - "status.detailed_status": "Detailed conversation view", + "status.detailed_status": "تفاصيل المحادثة", "status.direct": "رسالة خاصة إلى @{name}", "status.embed": "إدماج", "status.favourite": "أضف إلى المفضلة", @@ -294,6 +296,7 @@ "status.open": "وسع هذه المشاركة", "status.pin": "تدبيس على الملف الشخصي", "status.pinned": "تبويق مثبَّت", + "status.read_more": "اقرأ المزيد", "status.reblog": "رَقِّي", "status.reblog_private": "القيام بالترقية إلى الجمهور الأصلي", "status.reblogged_by": "رقّاه {name}", @@ -311,6 +314,8 @@ "status.show_more_all": "توسيع الكل", "status.unmute_conversation": "فك الكتم عن المحادثة", "status.unpin": "فك التدبيس من الملف الشخصي", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "الموحَّد", "tabs_bar.home": "الرئيسية", "tabs_bar.local_timeline": "المحلي", diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index 147c5ad2a..d84774f34 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "¿De xuru que quies silenciar a {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -294,6 +296,7 @@ "status.open": "Espander esti estáu", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Boost", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} boosted", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federated", "tabs_bar.home": "Aniciu", "tabs_bar.local_timeline": "Local", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index 756c33393..a4366126f 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -294,6 +296,7 @@ "status.open": "Expand this status", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Споделяне", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} сподели", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federated", "tabs_bar.home": "Начало", "tabs_bar.local_timeline": "Local", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 4701c9316..2e766da6a 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -15,7 +15,7 @@ "account.follows.empty": "Aquest usuari encara no segueix a ningú.", "account.follows_you": "Et segueix", "account.hide_reblogs": "Amaga els impulsos de @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "La propietat d'aquest enllaç es va verificar el dia {date}", "account.media": "Media", "account.mention": "Esmentar @{name}", "account.moved_to": "{name} s'ha mogut a:", @@ -91,6 +91,8 @@ "confirmations.mute.message": "Estàs segur que vols silenciar {name}?", "confirmations.redraft.confirm": "Esborrar i refer", "confirmations.redraft.message": "Estàs segur que vols esborrar aquesta publicació i tornar a redactar-la? Perderàs totes els impulsos i favorits, i les respostes a la publicació original es quedaran orfes.", + "confirmations.reply.confirm": "Respon", + "confirmations.reply.message": "Responen ara es sobreescriurà el missatge que estàs editant. Estàs segur que vols continuar?", "confirmations.unfollow.confirm": "Deixa de seguir", "confirmations.unfollow.message": "Estàs segur que vols deixar de seguir {name}?", "embed.instructions": "Incrusta aquest estat al lloc web copiant el codi a continuació.", @@ -294,6 +296,7 @@ "status.open": "Ampliar aquest estat", "status.pin": "Fixat en el perfil", "status.pinned": "Toot fixat", + "status.read_more": "Llegir més", "status.reblog": "Impuls", "status.reblog_private": "Impulsar a l'audiència original", "status.reblogged_by": "{name} ha retootejat", @@ -311,6 +314,8 @@ "status.show_more_all": "Mostra més per a tot", "status.unmute_conversation": "Activar conversació", "status.unpin": "Deslliga del perfil", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federada", "tabs_bar.home": "Inici", "tabs_bar.local_timeline": "Local", diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json index 62976c98e..357ff0ac8 100644 --- a/app/javascript/mastodon/locales/co.json +++ b/app/javascript/mastodon/locales/co.json @@ -15,7 +15,7 @@ "account.follows.empty": "St'utilizatore ùn seguita nisunu.", "account.follows_you": "Vi seguita", "account.hide_reblogs": "Piattà spartere da @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "A prupietà di stu ligame hè stata verificata u {date}", "account.media": "Media", "account.mention": "Mintuvà @{name}", "account.moved_to": "{name} hè partutu nant'à:", @@ -91,6 +91,8 @@ "confirmations.mute.message": "Site sicuru·a che vulete piattà @{name}?", "confirmations.redraft.confirm": "Sguassà è riscrive", "confirmations.redraft.message": "Site sicuru·a chè vulete sguassà stu statutu è riscrivelu? I favuriti è spartere saranu persi, è e risposte diventeranu orfane.", + "confirmations.reply.confirm": "Risponde", + "confirmations.reply.message": "Risponde avà sguasserà u missaghju chì scrivite. Site sicuru·a chì vulete cuntinuà?", "confirmations.unfollow.confirm": "Disabbunassi", "confirmations.unfollow.message": "Site sicuru·a ch'ùn vulete più siguità @{name}?", "embed.instructions": "Integrà stu statutu à u vostru situ cù u codice quì sottu.", @@ -294,6 +296,7 @@ "status.open": "Apre stu statutu", "status.pin": "Puntarulà à u prufile", "status.pinned": "Statutu puntarulatu", + "status.read_more": "Leghje di più", "status.reblog": "Sparte", "status.reblog_private": "Sparte à l'audienza uriginale", "status.reblogged_by": "{name} hà spartutu", @@ -311,6 +314,8 @@ "status.show_more_all": "Slibrà tuttu", "status.unmute_conversation": "Ùn piattà più a cunversazione", "status.unpin": "Spuntarulà da u prufile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Glubale", "tabs_bar.home": "Accolta", "tabs_bar.local_timeline": "Lucale", diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json index 2c34fd34c..5f82dd8e0 100644 --- a/app/javascript/mastodon/locales/cs.json +++ b/app/javascript/mastodon/locales/cs.json @@ -8,14 +8,14 @@ "account.domain_blocked": "Doména skryta", "account.edit_profile": "Upravit profil", "account.endorse": "Představit na profilu", - "account.follow": "Sleduj", + "account.follow": "Sledovat", "account.followers": "Sledovatelé", "account.followers.empty": "Tohoto uživatele ještě nikdo nesleduje.", "account.follows": "Sleduje", "account.follows.empty": "Tento uživatel ještě nikoho nesleduje.", "account.follows_you": "Sleduje vás", "account.hide_reblogs": "Skrýt boosty od uživatele @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "Vlastnictví tohoto odkazu bylo zkontrolováno {date}", "account.media": "Média", "account.mention": "Zmínit uživatele @{name}", "account.moved_to": "{name} se přesunul/a na:", @@ -75,8 +75,8 @@ "compose_form.publish_loud": "{publish}!", "compose_form.sensitive.marked": "Mediální obsah je označen jako citlivý", "compose_form.sensitive.unmarked": "Mediální obsah není označen jako citlivý", - "compose_form.spoiler.marked": "Text je ukrytý za varováním", - "compose_form.spoiler.unmarked": "Text není ukrytý", + "compose_form.spoiler.marked": "Text je skrytý za varováním", + "compose_form.spoiler.unmarked": "Text není skrytý", "compose_form.spoiler_placeholder": "Sem napište vaše varování", "confirmation_modal.cancel": "Zrušit", "confirmations.block.confirm": "Blokovat", @@ -91,6 +91,8 @@ "confirmations.mute.message": "Jste si jistý/á, že chcete ignorovat uživatele {name}?", "confirmations.redraft.confirm": "Vymazat a přepsat", "confirmations.redraft.message": "Jste si jistý/á, že chcete vymazat a přepsat tento příspěvek? Oblíbení a boosty budou ztraceny a odpovědi na původní příspěvek budou opuštěny.", + "confirmations.reply.confirm": "Odpovědět", + "confirmations.reply.message": "Odpovězením nyní přepíšete zprávu, kterou aktuálně píšete. Jste si jistý/á, že chcete pokračovat?", "confirmations.unfollow.confirm": "Přestat sledovat", "confirmations.unfollow.message": "jste si jistý/á, že chcete přestat sledovat uživatele {name}?", "embed.instructions": "Pro přidání příspěvku na vaši webovou stránku zkopírujte níže uvedený kód.", @@ -112,7 +114,7 @@ "empty_column.blocks": "Ještě jste nezablokoval/a žádného uživatele.", "empty_column.community": "Místní časová osa je prázdná. Napište něco veřejně a rozhýbejte to tu!", "empty_column.direct": "Ještě nemáte žádné přímé zprávy. Pokud nějakou pošlete nebo dostanete, zobrazí se zde.", - "empty_column.domain_blocks": "Ještě zde nejsou žádné skryté domény.", + "empty_column.domain_blocks": "Ještě nejsou žádné skryté domény.", "empty_column.favourited_statuses": "Ještě nemáte žádné oblíbené tooty. Pokud si nějaký oblíbíte, zobrazí se zde.", "empty_column.favourites": "Tento toot si ještě nikdo neoblíbil. Pokud to někdo udělá, zobrazí se zde.", "empty_column.follow_requests": "Ještě nemáte žádné požadavky o sledování. Pokud nějaký obdržíte, zobrazí se zde.", @@ -127,7 +129,7 @@ "follow_request.authorize": "Autorizovat", "follow_request.reject": "Odmítnout", "getting_started.developers": "Vývojáři", - "getting_started.documentation": "Documentation", + "getting_started.documentation": "Dokumentace", "getting_started.find_friends": "Najděte si přátele z Twitteru", "getting_started.heading": "Začínáme", "getting_started.invite": "Pozvat lidi", @@ -163,7 +165,7 @@ "keyboard_shortcuts.reply": "k odpovězení", "keyboard_shortcuts.requests": "k otevření seznamu požadavků o sledování", "keyboard_shortcuts.search": "k zaměření na vyhledávání", - "keyboard_shortcuts.start": "k otevření sloupce \"začít\"", + "keyboard_shortcuts.start": "k otevření sloupce „začínáme“", "keyboard_shortcuts.toggle_hidden": "k zobrazení/skrytí textu za varováním o obsahu", "keyboard_shortcuts.toot": "k napsání úplně nového tootu", "keyboard_shortcuts.unfocus": "ke zrušení soustředění na psací prostor/hledání", @@ -241,15 +243,15 @@ "onboarding.page_three.search": "Pomocí vyhledávacího řádku najděte lidi a podívejte se na hashtagy jako {illustration} a {introductions}. Chcete-li najít někoho, kdo není na této instanci, použijte jeho celou adresu profilu.", "onboarding.page_two.compose": "Příspěvky pište z pole na komponování. Ikonami níže můžete nahrávat obrázky, změnit nastavení soukromí a přidat varování o obsahu.", "onboarding.skip": "Přeskočit", - "privacy.change": "Změnit viditelnost příspěvku", + "privacy.change": "Změnit soukromí příspěvku", "privacy.direct.long": "Odeslat pouze zmíněným uživatelům", - "privacy.direct.short": "Přímé", + "privacy.direct.short": "Přímý", "privacy.private.long": "Odeslat pouze sledovatelům", "privacy.private.short": "Pouze pro sledovatele", "privacy.public.long": "Odeslat na veřejné časové osy", - "privacy.public.short": "Veřejné", - "privacy.unlisted.long": "Do not show in public timelines", - "privacy.unlisted.short": "Nezobrazované", + "privacy.public.short": "Veřejný", + "privacy.unlisted.long": "Neodeslat na veřejné časové osy", + "privacy.unlisted.short": "Neuvedený", "regeneration_indicator.label": "Načítám…", "regeneration_indicator.sublabel": "Váš domovský proud se připravuje!", "relative_time.days": "{number} d", @@ -294,6 +296,7 @@ "status.open": "Rozbalit tento příspěvek", "status.pin": "Připnout na profil", "status.pinned": "Připnutý toot", + "status.read_more": "Číst více", "status.reblog": "Boostnout", "status.reblog_private": "Boostnout původnímu publiku", "status.reblogged_by": "{name} boostnul/a", @@ -311,6 +314,8 @@ "status.show_more_all": "Zobrazit více pro všechny", "status.unmute_conversation": "Přestat ignorovat konverzaci", "status.unpin": "Odepnout z profilu", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federovaná", "tabs_bar.home": "Domů", "tabs_bar.local_timeline": "Místní", diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json index 90f3f8e30..78c8d02f0 100644 --- a/app/javascript/mastodon/locales/cy.json +++ b/app/javascript/mastodon/locales/cy.json @@ -1,335 +1,341 @@ { - "account.badges.bot": "Bot", - "account.block": "Blociwch @{name}", - "account.block_domain": "Cuddiwch bopeth rhag {domain}", - "account.blocked": "Blociwyd", - "account.direct": "Neges breifat @{name}", - "account.disclaimer_full": "Gall y wybodaeth isod adlewyrchu darlun anghyflawn o broffil defnyddiwr.", - "account.domain_blocked": "Parth wedi ei guddio", - "account.edit_profile": "Golygu proffil", - "account.endorse": "Arddangos ar fy mhroffil", - "account.follow": "Dilyn", - "account.followers": "Dilynwyr", - "account.followers.empty": "Nid oes neb yn dilyn y defnyddiwr hwn eto.", - "account.follows": "Yn dilyn", - "account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.", - "account.follows_you": "Yn eich dilyn chi", - "account.hide_reblogs": "Cuddio bwstiau o @{name}", - "account.media": "Cyfryngau", - "account.mention": "Crybwyll @{name}", - "account.moved_to": "Mae @{name} wedi symud i:", - "account.mute": "Tawelu @{name}", - "account.mute_notifications": "Cuddio hysbysiadau o @{name}", - "account.muted": "Distewyd", - "account.posts": "Tŵtiau", - "account.posts_with_replies": "Tŵtiau ac atebion", - "account.report": "Adroddwch @{name}", - "account.requested": "Aros am gymeradwyaeth. Cliciwch er mwyn canslo cais dilyn", - "account.share": "Rhannwch broffil @{name}", - "account.show_reblogs": "Dangoswch bwstiau o @{name}", - "account.unblock": "Dadflociwch @{name}", - "account.unblock_domain": "Dadguddiwch {domain}", - "account.unendorse": "Peidwch a'i arddangos ar fy mhroffil", - "account.unfollow": "Daddilynwch", - "account.unmute": "Dad-dawelu @{name}", - "account.unmute_notifications": "Dad-dawelu hysbysiadau o @{name}", - "account.view_full_profile": "Gweld proffil llawn", - "alert.unexpected.message": "Digwyddodd gwall annisgwyl.", - "alert.unexpected.title": "Wps!", - "boost_modal.combo": "Mae modd gwasgu {combo} er mwyn sgipio hyn tro nesa", - "bundle_column_error.body": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.", - "bundle_column_error.retry": "Ceisiwch eto", - "bundle_column_error.title": "Gwall rhwydwaith", - "bundle_modal_error.close": "Cau", - "bundle_modal_error.message": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.", - "bundle_modal_error.retry": "Ceiswich eto", - "column.blocks": "Defnyddwyr a flociwyd", - "column.community": "Llinell amser lleol", - "column.direct": "Negeseuon preifat", - "column.domain_blocks": "Parthau cuddiedig", - "column.favourites": "Ffefrynnau", - "column.follow_requests": "Ceisiadau dilyn", - "column.home": "Hafan", - "column.lists": "Rhestrau", - "column.mutes": "Defnyddwyr a ddistewyd", - "column.notifications": "Hysbysiadau", - "column.pins": "Tŵtiau wedi eu pinio", - "column.public": "", - "column_back_button.label": "Nôl", - "column_header.hide_settings": "Cuddiwch dewisiadau", - "column_header.moveLeft_settings": "Symudwch y golofn i'r chwith", - "column_header.moveRight_settings": "Symudwch y golofn i'r dde", - "column_header.pin": "Piniwch", - "column_header.show_settings": "Dangos gosodiadau", - "column_header.unpin": "Dadbiniwch", - "column_subheading.settings": "Gosodiadau", - "community.column_settings.media_only": "Cyfryngau yn unig", - "compose_form.direct_message_warning": "Mi fydd y tŵt hwn ond yn cael ei anfon at y defnyddwyr sy'n cael eu crybwyll.", - "compose_form.direct_message_warning_learn_more": "Dysgwch fwy", - "compose_form.hashtag_warning": "Ni fydd y tŵt hwn wedi ei restru o dan unrhyw hashnod gan ei fod heb ei restru. Dim ond tŵtiau cyhoeddus gellid chwilota amdanynt drwy hashnod.", - "compose_form.lock_disclaimer": "Nid yw eich cyfri wedi'i {locked}. Gall unrhyw un eich dilyn i weld eich POSTS dilynwyr-yn-unig.", - "compose_form.lock_disclaimer.lock": "wedi ei gloi", - "compose_form.placeholder": "Be syd ar eich meddwl?", - "compose_form.publish": "Tŵt", - "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.marked": "", - "compose_form.sensitive.unmarked": "", - "compose_form.spoiler.marked": "Testun wedi ei guddio gan rybudd", - "compose_form.spoiler.unmarked": "Nid yw'r testun wedi ei guddio", - "compose_form.spoiler_placeholder": "Ysgrifenwch eich rhybudd yma", - "confirmation_modal.cancel": "Canslo", - "confirmations.block.confirm": "Blociwch", - "confirmations.block.message": "Ydych chi'n sicr eich bod eisiau blocio {name}?", - "confirmations.delete.confirm": "Dileu", - "confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y statws hwn?", - "confirmations.delete_list.confirm": "Dileu", - "confirmations.delete_list.message": "Ydych chi'n sicr eich bod eisiau dileu y rhestr hwn am byth?", - "confirmations.domain_block.confirm": "", - "confirmations.domain_block.message": "", - "confirmations.mute.confirm": "Tawelu", - "confirmations.mute.message": "Ydych chi'n sicr eich bod am ddistewi {name}?", - "confirmations.redraft.confirm": "Dilëwch & ailddrafftio", - "confirmations.redraft.message": "Ydych chi'n siwr eich bod eisiau dileu y statws hwn a'i ailddrafftio? Bydd ffefrynnau a bwstiau'n cael ei colli, a bydd ymatebion i'r statws gwreiddiol yn cael eu hamddifadu.", - "confirmations.unfollow.confirm": "Dad-ddilynwch", - "confirmations.unfollow.message": "Ydych chi'n sicr eich bod am ddad-ddilyn {name}?", - "embed.instructions": "Mewnblannwch y statws hwn ar eich gwefan drwy gopïo'r côd isod.", - "embed.preview": "Dyma sut olwg fydd arno:", - "emoji_button.activity": "Gweithgarwch", - "emoji_button.custom": "", - "emoji_button.flags": "Baneri", - "emoji_button.food": "Bwyd a Diod", - "emoji_button.label": "Mewnosodwch emoji", - "emoji_button.nature": "Natur", - "emoji_button.not_found": "Dim emojos!! (╯°□°)╯︵ ┻━┻", - "emoji_button.objects": "Gwrthrychau", - "emoji_button.people": "Pobl", - "emoji_button.recent": "Defnyddir yn aml", - "emoji_button.search": "Chwilio...", - "emoji_button.search_results": "Canlyniadau chwilio", - "emoji_button.symbols": "Symbolau", - "emoji_button.travel": "Teithio & Llefydd", - "empty_column.blocks": "Nid ydych wedi blocio unrhyw ddefnyddwyr eto.", - "empty_column.community": "", - "empty_column.direct": "Nid oes gennych unrhyw negeseuon preifat eto. Pan y byddwch yn anfon neu derbyn un, mi fydd yn ymddangos yma.", - "empty_column.domain_blocks": "Nid oes yna unrhyw barthau cuddiedig eto.", - "empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff dwtiau eto. Pan y byddwch yn hoffi un, mi fydd yn ymddangos yma.", - "empty_column.favourites": "Nid oes neb wedi hoffi'r tŵt yma eto. Pan bydd rhywun yn ei hoffi, mi fyddent yn ymddangos yma.", - "empty_column.follow_requests": "Nid oes gennych unrhyw geisiadau dilyn eto. Pan dderbyniwch chi un, bydd yn ymddangos yma.", - "empty_column.hashtag": "Nid oes dim ar yr hashnod hwn eto.", - "empty_column.home": "", - "empty_column.home.public_timeline": "y ffrwd cyhoeddus", - "empty_column.list": "Nid oes dim yn y rhestr yma eto. Pan y bydd aelodau'r rhestr yn cyhoeddi statws newydd, mi fydd yn ymddangos yma.", - "empty_column.lists": "Nid oes gennych unrhyw restrau eto. Pan grëwch chi un, mi fydd yn ymddangos yma.", - "empty_column.mutes": "Nid ydych wedi tawelu unrhyw ddefnyddwyr eto.", - "empty_column.notifications": "Nid oes gennych unrhyw hysbysiadau eto. Rhyngweithiwch ac eraill i ddechrau'r sgwrs.", - "empty_column.public": "Does dim byd yma! Ysgrifennwch rhywbeth yn gyhoeddus, neu dilynwch ddefnyddwyr o INSTANCES eraill i'w lenwi", - "follow_request.authorize": "Caniatau", - "follow_request.reject": "Gwrthod", - "getting_started.developers": "Datblygwyr", - "getting_started.documentation": "Dogfennaeth", - "getting_started.find_friends": "Canfod ffrindiau o Twitter", - "getting_started.heading": "Dechrau", - "getting_started.invite": "Gwahoddwch bobl", - "getting_started.open_source_notice": "Mae Mastodon yn feddalwedd côd agored. Mae modd cyfrannu neu adrodd materion ar GitHUb ar {github}.", - "getting_started.security": "Diogelwch", - "getting_started.terms": "Telerau Gwasanaeth", - "home.column_settings.basic": "Syml", - "home.column_settings.show_reblogs": "", - "home.column_settings.show_replies": "Dangoswch ymatebion", - "keyboard_shortcuts.back": "", - "keyboard_shortcuts.blocked": "i agor rhestr defnyddwyr a flociwyd", - "keyboard_shortcuts.boost": "", - "keyboard_shortcuts.column": "", - "keyboard_shortcuts.compose": "", - "keyboard_shortcuts.description": "Disgrifiad", - "keyboard_shortcuts.direct": "i agor colofn negeseuon preifat", - "keyboard_shortcuts.down": "i symud lawr yn y rhestr", - "keyboard_shortcuts.enter": "i agor statws", - "keyboard_shortcuts.favourite": "i hoffi", - "keyboard_shortcuts.favourites": "i agor rhestr hoffi", - "keyboard_shortcuts.federated": "", - "keyboard_shortcuts.heading": "", - "keyboard_shortcuts.home": "i agor ffrwd cartref", - "keyboard_shortcuts.hotkey": "Hotkey", - "keyboard_shortcuts.legend": "", - "keyboard_shortcuts.local": "i agor ffrwd lleol", - "keyboard_shortcuts.mention": "i grybwyll yr awdur", - "keyboard_shortcuts.muted": "i agor rhestr defnyddwyr a dawelwyd", - "keyboard_shortcuts.my_profile": "i agor eich proffil", - "keyboard_shortcuts.notifications": "i agor colofn hysbysiadau", - "keyboard_shortcuts.pinned": "", - "keyboard_shortcuts.profile": "i agor proffil yr awdur", - "keyboard_shortcuts.reply": "i ateb", - "keyboard_shortcuts.requests": "i agor rhestr ceisiadau dilyn", - "keyboard_shortcuts.search": "", - "keyboard_shortcuts.start": "", - "keyboard_shortcuts.toggle_hidden": "", - "keyboard_shortcuts.toot": "i ddechrau tŵt newydd sbon", - "keyboard_shortcuts.unfocus": "", - "keyboard_shortcuts.up": "i symud yn uwch yn y rhestr", - "lightbox.close": "Cau", - "lightbox.next": "Nesaf", - "lightbox.previous": "", - "lists.account.add": "Ychwanegwch at restr", - "lists.account.remove": "", - "lists.delete": "Dileu rhestr", - "lists.edit": "Golygwch restr", - "lists.new.create": "Ychwanegwch restr", - "lists.new.title_placeholder": "Teitl rhestr newydd", - "lists.search": "", - "lists.subheading": "Eich rhestrau", - "loading_indicator.label": "Llwytho...", - "media_gallery.toggle_visible": "", - "missing_indicator.label": "Heb ei ganfod", - "missing_indicator.sublabel": "Ni ellid canfod yr adnodd hwn", - "mute_modal.hide_notifications": "Cuddiwch hysbysiadau rhag y defnyddiwr hwn?", - "navigation_bar.apps": "Apiau symudol", - "navigation_bar.blocks": "Defnyddwyr wedi eu blocio", - "navigation_bar.community_timeline": "", - "navigation_bar.compose": "Cyfansoddwch dŵt newydd", - "navigation_bar.direct": "Negeseuon preifat", - "navigation_bar.discover": "Darganfyddwch", - "navigation_bar.domain_blocks": "Parthau cuddiedig", - "navigation_bar.edit_profile": "Golygu proffil", - "navigation_bar.favourites": "Ffefrynnau", - "navigation_bar.filters": "Geiriau a dawelwyd", - "navigation_bar.follow_requests": "Ceisiadau dilyn", - "navigation_bar.info": "", - "navigation_bar.keyboard_shortcuts": "", - "navigation_bar.lists": "Rhestrau", - "navigation_bar.logout": "Allgofnodi", - "navigation_bar.mutes": "Defnyddwyr a dawelwyd", - "navigation_bar.personal": "Personol", - "navigation_bar.pins": "Tŵtiau wedi eu pinio", - "navigation_bar.preferences": "Dewisiadau", - "navigation_bar.public_timeline": "", - "navigation_bar.security": "Diogelwch", - "notification.favourite": "hoffodd {name} eich statws", - "notification.follow": "dilynodd {name} chi", - "notification.mention": "Soniodd {name} amdanoch chi", - "notification.reblog": "", - "notifications.clear": "Clirio hysbysiadau", - "notifications.clear_confirmation": "", - "notifications.column_settings.alert": "", - "notifications.column_settings.favourite": "Ffefrynnau:", - "notifications.column_settings.follow": "Dilynwyr newydd:", - "notifications.column_settings.mention": "", - "notifications.column_settings.push": "Hysbysiadau push", - "notifications.column_settings.reblog": "", - "notifications.column_settings.show": "", - "notifications.column_settings.sound": "Chwarae sain", - "notifications.group": "{count} o hysbysiadau", - "onboarding.done": "Wedi'i wneud", - "onboarding.next": "Nesaf", - "onboarding.page_five.public_timelines": "", - "onboarding.page_four.home": "Mae'r ffrwd gartref yn dangos twtiau o bobl yr ydych yn dilyn.", - "onboarding.page_four.notifications": "", - "onboarding.page_one.federation": "", - "onboarding.page_one.full_handle": "", - "onboarding.page_one.handle_hint": "", - "onboarding.page_one.welcome": "Croeso i Mastodon!", - "onboarding.page_six.admin": "", - "onboarding.page_six.almost_done": "Bron a gorffen...", - "onboarding.page_six.appetoot": "Bon Apetŵt!", - "onboarding.page_six.apps_available": "Mae yna {apps} ar gael i iOS, Android a platfformau eraill.", - "onboarding.page_six.github": "Mae Mastodon yn feddalwedd côd agored rhad ac am ddim. Mae modd adrodd bygiau, gwneud ceisiadau am nodweddion penodol, neu gyfrannu i'r côd ar {github}.", - "onboarding.page_six.guidelines": "canllawiau cymunedol", - "onboarding.page_six.read_guidelines": "Darllenwch {guidelines} y {domain} os gwelwch yn dda!", - "onboarding.page_six.various_app": "apiau symudol", - "onboarding.page_three.profile": "", - "onboarding.page_three.search": "", - "onboarding.page_two.compose": "", - "onboarding.skip": "Sgipiwch", - "privacy.change": "", - "privacy.direct.long": "", - "privacy.direct.short": "Uniongyrchol", - "privacy.private.long": "Cyhoeddi i ddilynwyr yn unig", - "privacy.private.short": "Dilynwyr-yn-unig", - "privacy.public.long": "Cyhoeddi i ffrydiau cyhoeddus", - "privacy.public.short": "Cyhoeddus", - "privacy.unlisted.long": "Peidio a cyhoeddi i ffrydiau cyhoeddus", - "privacy.unlisted.short": "Heb ei restru", - "regeneration_indicator.label": "Llwytho…", - "regeneration_indicator.sublabel": "Mae eich ffrwd cartref yn cael ei baratoi!", - "relative_time.days": "{number}d", - "relative_time.hours": "{number}h", - "relative_time.just_now": "nawr", - "relative_time.minutes": "{number}m", - "relative_time.seconds": "{number}s", - "reply_indicator.cancel": "Canslo", - "report.forward": "", - "report.forward_hint": "", - "report.hint": "", - "report.placeholder": "Sylwadau ychwanegol", - "report.submit": "Cyflwyno", - "report.target": "", - "search.placeholder": "Chwilio", - "search_popout.search_format": "Fformat chwilio uwch", - "search_popout.tips.full_text": "", - "search_popout.tips.hashtag": "hashnod", - "search_popout.tips.status": "statws", - "search_popout.tips.text": "", - "search_popout.tips.user": "defnyddiwr", - "search_results.accounts": "Pobl", - "search_results.hashtags": "Hanshnodau", - "search_results.statuses": "Twtiau", - "search_results.total": "", - "standalone.public_title": "Golwg tu fewn...", - "status.block": "Blociwch @{name}", - "status.cancel_reblog_private": "", - "status.cannot_reblog": "", - "status.delete": "Dileu", - "status.detailed_status": "", - "status.direct": "Neges breifat @{name}", - "status.embed": "Plannu", - "status.favourite": "", - "status.filtered": "", - "status.load_more": "Llwythwch mwy", - "status.media_hidden": "", - "status.mention": "", - "status.more": "Mwy", - "status.mute": "Tawelu @{name}", - "status.mute_conversation": "", - "status.open": "", - "status.pin": "", - "status.pinned": "", - "status.reblog": "", - "status.reblog_private": "", - "status.reblogged_by": "", - "status.reblogs.empty": "", - "status.redraft": "Dilëwh & ailddrafftio", - "status.reply": "Ateb", - "status.replyAll": "Ateb i edefyn", - "status.report": "", - "status.sensitive_toggle": "", - "status.sensitive_warning": "Cynnwys sensitif", - "status.share": "Rhannwch", - "status.show_less": "Dangoswch lai", - "status.show_less_all": "Dangoswch lai i bawb", - "status.show_more": "Dangoswch fwy", - "status.show_more_all": "", - "status.unmute_conversation": "Dad-dawelu sgwrs", - "status.unpin": "", - "tabs_bar.federated_timeline": "", - "tabs_bar.home": "Hafan", - "tabs_bar.local_timeline": "Lleol", - "tabs_bar.notifications": "Hysbysiadau", - "tabs_bar.search": "Chwilio", - "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} yn siarad", - "ui.beforeunload": "Mi fyddwch yn colli eich drafft os gadewch Mastodon.", - "upload_area.title": "Llusgwch & gollwing i uwchlwytho", - "upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)", - "upload_form.description": "", - "upload_form.focus": "", - "upload_form.undo": "Dileu", - "upload_progress.label": "Uwchlwytho...", - "video.close": "Cau fideo", - "video.exit_fullscreen": "Gadael sgrîn llawn", - "video.expand": "Ymestyn fideo", - "video.fullscreen": "Sgrîn llawn", - "video.hide": "Cuddio fideo", - "video.mute": "Tawelu sain", - "video.pause": "Oedi", - "video.play": "Chwarae", - "video.unmute": "Dad-dawelu sain" + "account.badges.bot": "Bot", + "account.block": "Blocio @{name}", + "account.block_domain": "Cuddio popeth rhag {domain}", + "account.blocked": "Blociwyd", + "account.direct": "Neges breifat @{name}", + "account.disclaimer_full": "Gall y wybodaeth isod adlewyrchu darlun anghyflawn o broffil defnyddiwr.", + "account.domain_blocked": "Parth wedi ei guddio", + "account.edit_profile": "Golygu proffil", + "account.endorse": "Arddangos ar fy mhroffil", + "account.follow": "Dilyn", + "account.followers": "Dilynwyr", + "account.followers.empty": "Nid oes neb yn dilyn y defnyddiwr hwn eto.", + "account.follows": "Yn dilyn", + "account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.", + "account.follows_you": "Yn eich dilyn chi", + "account.hide_reblogs": "Cuddio bwstiau o @{name}", + "account.link_verified_on": "Gwiriwyd perchnogaeth y ddolen yma ar {date}", + "account.media": "Cyfryngau", + "account.mention": "Crybwyll @{name}", + "account.moved_to": "Mae @{name} wedi symud i:", + "account.mute": "Tawelu @{name}", + "account.mute_notifications": "Cuddio hysbysiadau o @{name}", + "account.muted": "Distewyd", + "account.posts": "Tŵtiau", + "account.posts_with_replies": "Tŵtiau ac atebion", + "account.report": "Adrodd @{name}", + "account.requested": "Aros am gymeradwyaeth. Cliciwch er mwyn canslo cais dilyn", + "account.share": "Rhannwch broffil @{name}", + "account.show_reblogs": "Dangos bwstiau o @{name}", + "account.unblock": "Dadflocio @{name}", + "account.unblock_domain": "Dadguddio {domain}", + "account.unendorse": "Peidio a'i arddangos ar fy mhroffil", + "account.unfollow": "Dad-ddilyn", + "account.unmute": "Dad-dawelu @{name}", + "account.unmute_notifications": "Dad-dawelu hysbysiadau o @{name}", + "account.view_full_profile": "Gweld proffil llawn", + "alert.unexpected.message": "Digwyddodd gwall annisgwyl.", + "alert.unexpected.title": "Wps!", + "boost_modal.combo": "Mae modd gwasgu {combo} er mwyn sgipio hyn tro nesa", + "bundle_column_error.body": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.", + "bundle_column_error.retry": "Ceisiwch eto", + "bundle_column_error.title": "Gwall rhwydwaith", + "bundle_modal_error.close": "Cau", + "bundle_modal_error.message": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.", + "bundle_modal_error.retry": "Ceiswich eto", + "column.blocks": "Defnyddwyr a flociwyd", + "column.community": "Llinell amser lleol", + "column.direct": "Negeseuon preifat", + "column.domain_blocks": "Parthau cuddiedig", + "column.favourites": "Ffefrynnau", + "column.follow_requests": "Ceisiadau dilyn", + "column.home": "Hafan", + "column.lists": "Rhestrau", + "column.mutes": "Defnyddwyr a ddistewyd", + "column.notifications": "Hysbysiadau", + "column.pins": "Tŵtiau wedi eu pinio", + "column.public": "Ffrwd y ffederasiwn", + "column_back_button.label": "Nôl", + "column_header.hide_settings": "Cuddio dewisiadau", + "column_header.moveLeft_settings": "Symud y golofn i'r chwith", + "column_header.moveRight_settings": "Symud y golofn i'r dde", + "column_header.pin": "Pinio", + "column_header.show_settings": "Dangos gosodiadau", + "column_header.unpin": "Dadbinio", + "column_subheading.settings": "Gosodiadau", + "community.column_settings.media_only": "Cyfryngau yn unig", + "compose_form.direct_message_warning": "Mi fydd y tŵt hwn ond yn cael ei anfon at y defnyddwyr sy'n cael eu crybwyll.", + "compose_form.direct_message_warning_learn_more": "Dysgu mwy", + "compose_form.hashtag_warning": "Ni fydd y tŵt hwn wedi ei restru o dan unrhyw hashnod gan ei fod heb ei restru. Dim ond tŵtiau cyhoeddus gellid chwilota amdanynt drwy hashnod.", + "compose_form.lock_disclaimer": "Nid yw eich cyfri wedi'i {locked}. Gall unrhyw un eich dilyn i weld eich tŵtiau dilynwyr-yn-unig.", + "compose_form.lock_disclaimer.lock": "wedi ei gloi", + "compose_form.placeholder": "Beth sydd ar eich meddwl?", + "compose_form.publish": "Tŵt", + "compose_form.publish_loud": "{publish}!", + "compose_form.sensitive.marked": "Cyfryngau wedi'u marcio'n sensitif", + "compose_form.sensitive.unmarked": "Nid yw'r cyfryngau wedi'u marcio'n sensitif", + "compose_form.spoiler.marked": "Testun wedi ei guddio gan rybudd", + "compose_form.spoiler.unmarked": "Nid yw'r testun wedi ei guddio", + "compose_form.spoiler_placeholder": "Ysgrifenwch eich rhybudd yma", + "confirmation_modal.cancel": "Canslo", + "confirmations.block.confirm": "Blocio", + "confirmations.block.message": "Ydych chi'n sicr eich bod eisiau blocio {name}?", + "confirmations.delete.confirm": "Dileu", + "confirmations.delete.message": "Ydych chi'n sicr eich bod eisiau dileu y statws hwn?", + "confirmations.delete_list.confirm": "Dileu", + "confirmations.delete_list.message": "Ydych chi'n sicr eich bod eisiau dileu y rhestr hwn am byth?", + "confirmations.domain_block.confirm": "Cuddio parth cyfan", + "confirmations.domain_block.message": "A ydych yn hollol, hollol sicr eich bod am flocio y {domain} cyfan? Yn y nifer helaeth o achosion mae blocio neu tawelu ambell gyfrif yn ddigonol ac yn well. Ni fyddwch yn gweld cynnwys o'r parth hwnnw mewn unrhyw ffrydiau cyhoeddus na chwaith yn eich hysbysiadau. Bydd hyn yn cael gwared o'ch dilynwyr o'r parth hwnnw.", + "confirmations.mute.confirm": "Tawelu", + "confirmations.mute.message": "Ydych chi'n sicr eich bod am ddistewi {name}?", + "confirmations.redraft.confirm": "Dileu & ailddrafftio", + "confirmations.redraft.message": "Ydych chi'n siwr eich bod eisiau dileu y statws hwn a'i ailddrafftio? Bydd ffefrynnau a bwstiau'n cael ei colli, a bydd ymatebion i'r statws gwreiddiol yn cael eu hamddifadu.", + "confirmations.reply.confirm": "Ateb", + "confirmations.reply.message": "Bydd ateb nawr yn cymryd lle y neges yr ydych yn cyfansoddi ar hyn o bryd. Ydych chi'n sicr yr ydych am barhau?", + "confirmations.unfollow.confirm": "Dad-ddilynwch", + "confirmations.unfollow.message": "Ydych chi'n sicr eich bod am ddad-ddilyn {name}?", + "embed.instructions": "Mewnblannwch y statws hwn ar eich gwefan drwy gopïo'r côd isod.", + "embed.preview": "Dyma sut olwg fydd arno:", + "emoji_button.activity": "Gweithgarwch", + "emoji_button.custom": "Unigryw", + "emoji_button.flags": "Baneri", + "emoji_button.food": "Bwyd a Diod", + "emoji_button.label": "Mewnosodwch emoji", + "emoji_button.nature": "Natur", + "emoji_button.not_found": "Dim emojo!! (╯°□°)╯︵ ┻━┻", + "emoji_button.objects": "Gwrthrychau", + "emoji_button.people": "Pobl", + "emoji_button.recent": "Defnyddir yn aml", + "emoji_button.search": "Chwilio...", + "emoji_button.search_results": "Canlyniadau chwilio", + "emoji_button.symbols": "Symbolau", + "emoji_button.travel": "Teithio & Llefydd", + "empty_column.blocks": "Nid ydych wedi blocio unrhyw ddefnyddwyr eto.", + "empty_column.community": "Mae'r ffrwd lleol yn wag. Ysgrifenwch rhywbeth yn gyhoeddus i gael dechrau arni!", + "empty_column.direct": "Nid oes gennych unrhyw negeseuon preifat eto. Pan y byddwch yn anfon neu derbyn un, mi fydd yn ymddangos yma.", + "empty_column.domain_blocks": "Nid oes yna unrhyw barthau cuddiedig eto.", + "empty_column.favourited_statuses": "Nid oes gennych unrhyw hoff dwtiau eto. Pan y byddwch yn hoffi un, mi fydd yn ymddangos yma.", + "empty_column.favourites": "Nid oes neb wedi hoffi'r tŵt yma eto. Pan bydd rhywun yn ei hoffi, byddent yn ymddangos yma.", + "empty_column.follow_requests": "Nid oes gennych unrhyw geisiadau dilyn eto. Pan dderbyniwch chi un, byddent yn ymddangos yma.", + "empty_column.hashtag": "Nid oes dim ar yr hashnod hwn eto.", + "empty_column.home": "Mae eich ffrwd gartref yn wag! Ymwelwch a {public} neu defnyddiwch y chwilotwr i ddechrau arni ac i gwrdd a defnyddwyr eraill.", + "empty_column.home.public_timeline": "y ffrwd gyhoeddus", + "empty_column.list": "Nid oes dim yn y rhestr yma eto. Pan y bydd aelodau'r rhestr yn cyhoeddi statws newydd, mi fydd yn ymddangos yma.", + "empty_column.lists": "Nid oes gennych unrhyw restrau eto. Pan grëwch chi un, mi fydd yn ymddangos yma.", + "empty_column.mutes": "Nid ydych wedi tawelu unrhyw ddefnyddwyr eto.", + "empty_column.notifications": "Nid oes gennych unrhyw hysbysiadau eto. Rhyngweithiwch ac eraill i ddechrau'r sgwrs.", + "empty_column.public": "Does dim byd yma! Ysgrifennwch rhywbeth yn gyhoeddus, neu dilynwch ddefnyddwyr o achosion eraill i'w lenwi", + "follow_request.authorize": "Caniatau", + "follow_request.reject": "Gwrthod", + "getting_started.developers": "Datblygwyr", + "getting_started.documentation": "Dogfennaeth", + "getting_started.find_friends": "Canfod ffrindiau o Twitter", + "getting_started.heading": "Dechrau", + "getting_started.invite": "Gwahodd pobl", + "getting_started.open_source_notice": "Mae Mastodon yn feddalwedd côd agored. Mae modd cyfrannu neu adrodd materion ar GitHUb ar {github}.", + "getting_started.security": "Diogelwch", + "getting_started.terms": "Telerau Gwasanaeth", + "home.column_settings.basic": "Syml", + "home.column_settings.show_reblogs": "Dangos bŵstiau", + "home.column_settings.show_replies": "Dangos ymatebion", + "keyboard_shortcuts.back": "i lywio nôl", + "keyboard_shortcuts.blocked": "i agor rhestr defnyddwyr a flociwyd", + "keyboard_shortcuts.boost": "i fŵstio", + "keyboard_shortcuts.column": "i ffocysu statws yn un o'r colofnau", + "keyboard_shortcuts.compose": "i ffocysu yr ardal cyfansoddi testun", + "keyboard_shortcuts.description": "Disgrifiad", + "keyboard_shortcuts.direct": "i agor colofn negeseuon preifat", + "keyboard_shortcuts.down": "i symud lawr yn y rhestr", + "keyboard_shortcuts.enter": "i agor statws", + "keyboard_shortcuts.favourite": "i hoffi", + "keyboard_shortcuts.favourites": "i agor rhestr hoffi", + "keyboard_shortcuts.federated": "i agor ffrwd y ffederasiwn", + "keyboard_shortcuts.heading": "Llwybrau byr allweddell", + "keyboard_shortcuts.home": "i agor ffrwd cartref", + "keyboard_shortcuts.hotkey": "Hotkey", + "keyboard_shortcuts.legend": "i ddangos yr arwr yma", + "keyboard_shortcuts.local": "i agor ffrwd lleol", + "keyboard_shortcuts.mention": "i grybwyll yr awdur", + "keyboard_shortcuts.muted": "i agor rhestr defnyddwyr a dawelwyd", + "keyboard_shortcuts.my_profile": "i agor eich proffil", + "keyboard_shortcuts.notifications": "i agor colofn hysbysiadau", + "keyboard_shortcuts.pinned": "i agor rhestr tŵtiau wedi'i pinio", + "keyboard_shortcuts.profile": "i agor proffil yr awdur", + "keyboard_shortcuts.reply": "i ateb", + "keyboard_shortcuts.requests": "i agor rhestr ceisiadau dilyn", + "keyboard_shortcuts.search": "i ffocysu chwilio", + "keyboard_shortcuts.start": "i agor colofn \"dechrau arni\"", + "keyboard_shortcuts.toggle_hidden": "i ddangos/cuddio testun tu ôl i CW", + "keyboard_shortcuts.toot": "i ddechrau tŵt newydd sbon", + "keyboard_shortcuts.unfocus": "i ddad-ffocysu ardal cyfansoddi testun/chwilio", + "keyboard_shortcuts.up": "i symud yn uwch yn y rhestr", + "lightbox.close": "Cau", + "lightbox.next": "Nesaf", + "lightbox.previous": "Blaenorol", + "lists.account.add": "Ychwanegwch at restr", + "lists.account.remove": "Dileu o'r rhestr", + "lists.delete": "Dileu rhestr", + "lists.edit": "Golygwch rhestr", + "lists.new.create": "Ychwanegu rhestr", + "lists.new.title_placeholder": "Teitl rhestr newydd", + "lists.search": "Chwilio ymysg pobl yr ydych yn ei ddilyn", + "lists.subheading": "Eich rhestrau", + "loading_indicator.label": "Llwytho...", + "media_gallery.toggle_visible": "Toglo gwelededd", + "missing_indicator.label": "Heb ei ganfod", + "missing_indicator.sublabel": "Ni ellid canfod yr adnodd hwn", + "mute_modal.hide_notifications": "Cuddio hysbysiadau rhag y defnyddiwr hwn?", + "navigation_bar.apps": "Apiau symudol", + "navigation_bar.blocks": "Defnyddwyr wedi eu blocio", + "navigation_bar.community_timeline": "Ffrwd leol", + "navigation_bar.compose": "Cyfansoddi tŵt newydd", + "navigation_bar.direct": "Negeseuon preifat", + "navigation_bar.discover": "Darganfod", + "navigation_bar.domain_blocks": "Parthau cuddiedig", + "navigation_bar.edit_profile": "Golygu proffil", + "navigation_bar.favourites": "Ffefrynnau", + "navigation_bar.filters": "Geiriau a dawelwyd", + "navigation_bar.follow_requests": "Ceisiadau dilyn", + "navigation_bar.info": "Ynghylch yr achos hwn", + "navigation_bar.keyboard_shortcuts": "Bysellau brys", + "navigation_bar.lists": "Rhestrau", + "navigation_bar.logout": "Allgofnodi", + "navigation_bar.mutes": "Defnyddwyr a dawelwyd", + "navigation_bar.personal": "Personol", + "navigation_bar.pins": "Tŵtiau wedi eu pinio", + "navigation_bar.preferences": "Dewisiadau", + "navigation_bar.public_timeline": "Ffrwd y ffederasiwn", + "navigation_bar.security": "Diogelwch", + "notification.favourite": "hoffodd {name} eich statws", + "notification.follow": "dilynodd {name} chi", + "notification.mention": "Soniodd {name} amdanoch chi", + "notification.reblog": "{name} boosted your status", + "notifications.clear": "Clirio hysbysiadau", + "notifications.clear_confirmation": "Ydych chi'n sicr eich bod am glirio'ch holl hysbysiadau am byth?", + "notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith", + "notifications.column_settings.favourite": "Ffefrynnau:", + "notifications.column_settings.follow": "Dilynwyr newydd:", + "notifications.column_settings.mention": "Crybwylliadau:", + "notifications.column_settings.push": "Hysbysiadau push", + "notifications.column_settings.reblog": "Boosts:", + "notifications.column_settings.show": "Dangos yn y golofn", + "notifications.column_settings.sound": "Chwarae sain", + "notifications.group": "{count} o hysbysiadau", + "onboarding.done": "Wedi'i wneud", + "onboarding.next": "Nesaf", + "onboarding.page_five.public_timelines": "Mae'r ffrwd leol yn dangos tŵtiau cyhoeddus o bawb ar y {domain}. Mae ffrwd y ffederasiwn yn dangos tŵtiau cyhoeddus o bawb y mae pobl ar y {domain} yn dilyn. Mae rhain yn Ffrydiau Cyhoeddus, ffordd wych o ddarganfod pobl newydd.", + "onboarding.page_four.home": "Mae'r ffrwd gartref yn dangos twtiau o bobl yr ydych yn dilyn.", + "onboarding.page_four.notifications": "Mae'r golofn hysbysiadau yn dangos pan mae rhywun yn ymwneud a chi.", + "onboarding.page_one.federation": "Mae mastodon yn rwydwaith o weinyddwyr anibynnol sy'n uno i greu un rhwydwaith gymdeithasol mwy. Yr ydym yn galw'r gweinyddwyr yma yn achosion.", + "onboarding.page_one.full_handle": "Eich enw Mastodon llawn", + "onboarding.page_one.handle_hint": "Dyma beth y bysech chi'n dweud wrth eich ffrindiau i chwilota amdano.", + "onboarding.page_one.welcome": "Croeso i Mastodon!", + "onboarding.page_six.admin": "Gweinyddwr eich achos yw {admin}.", + "onboarding.page_six.almost_done": "Bron a gorffen...", + "onboarding.page_six.appetoot": "Bon Apetŵt!", + "onboarding.page_six.apps_available": "Mae yna {apps} ar gael i iOS, Android a platfformau eraill.", + "onboarding.page_six.github": "Mae Mastodon yn feddalwedd côd agored rhad ac am ddim. Mae modd adrodd bygiau, gwneud ceisiadau am nodweddion penodol, neu gyfrannu i'r côd ar {github}.", + "onboarding.page_six.guidelines": "canllawiau cymunedol", + "onboarding.page_six.read_guidelines": "Darllenwch {guidelines} y {domain} os gwelwch yn dda!", + "onboarding.page_six.various_app": "apiau symudol", + "onboarding.page_three.profile": "Golygwch eich proffil i newid eich afatar, bywgraffiad, ac enw arddangos. Yno fe fyddwch hefyd yn canfod gosodiadau eraill.", + "onboarding.page_three.search": "Defnyddiwch y bar chwilio i ganfod pobl ac i edrych ar eu hashnodau, megis {illustration} ac {introductions}. I chwilio am rhywun nad ydynt ar yr achos hwn, defnyddiwch eu enw Mastodon llawn.", + "onboarding.page_two.compose": "Ysrgifenwch dŵtiau o'r golofn cyfansoddi. Mae modd uwchlwytho lluniau, newid gosodiadau preifatrwydd, ac ychwanegu rhybudd cynnwys gyda'r eiconau isod.", + "onboarding.skip": "Sgipio", + "privacy.change": "Addasu preifatrwdd y statws", + "privacy.direct.long": "Cyhoeddi i'r defnyddwyr sy'n cael eu crybwyll yn unig", + "privacy.direct.short": "Uniongyrchol", + "privacy.private.long": "Cyhoeddi i ddilynwyr yn unig", + "privacy.private.short": "Dilynwyr-yn-unig", + "privacy.public.long": "Cyhoeddi i ffrydiau cyhoeddus", + "privacy.public.short": "Cyhoeddus", + "privacy.unlisted.long": "Peidio a chyhoeddi i ffrydiau cyhoeddus", + "privacy.unlisted.short": "Heb ei restru", + "regeneration_indicator.label": "Llwytho…", + "regeneration_indicator.sublabel": "Mae eich ffrwd cartref yn cael ei baratoi!", + "relative_time.days": "{number}d", + "relative_time.hours": "{number}h", + "relative_time.just_now": "nawr", + "relative_time.minutes": "{number}m", + "relative_time.seconds": "{number}s", + "reply_indicator.cancel": "Canslo", + "report.forward": "Ymlaen i {target}", + "report.forward_hint": "Mae'r cyfrif o weinydd arall. Anfon copi anhysbys o'r adroddiad yno hefyd?", + "report.hint": "Bydd yr adroddiad yn cael ei anfon i arolygydd eich achos. Mae modd darparu esboniad o pam yr ydych yn cwyno am y cyfrif hwn isod:", + "report.placeholder": "Sylwadau ychwanegol", + "report.submit": "Cyflwyno", + "report.target": "Cwyno am {target}", + "search.placeholder": "Chwilio", + "search_popout.search_format": "Fformat chwilio uwch", + "search_popout.tips.full_text": "Mae testun syml yn dychwelyd tŵtiau yr ydych wedi ysgrifennu, hoffi, wedi'u bŵstio, neu wedi'ch crybwyll ynddynt, ynghyd a chyfateb a enwau defnyddwyr, enwau arddangos ac hashnodau.", + "search_popout.tips.hashtag": "hashnod", + "search_popout.tips.status": "statws", + "search_popout.tips.text": "Mae testun syml yn dychwelyd enwau arddangos, enwau defnyddwyr a hashnodau sy'n cyfateb", + "search_popout.tips.user": "defnyddiwr", + "search_results.accounts": "Pobl", + "search_results.hashtags": "Hanshnodau", + "search_results.statuses": "Tŵtiau", + "search_results.total": "{count, number} {count, plural, one {result} other {results}}", + "standalone.public_title": "Golwg tu fewn...", + "status.block": "Blocio @{name}", + "status.cancel_reblog_private": "Dadfŵstio", + "status.cannot_reblog": "Ni ellir sbarduno'r tŵt hwn", + "status.delete": "Dileu", + "status.detailed_status": "Golwg manwl o'r sgwrs", + "status.direct": "Neges breifat @{name}", + "status.embed": "Plannu", + "status.favourite": "Hoffi", + "status.filtered": "Filtered", + "status.load_more": "Llwythwch mwy", + "status.media_hidden": "Cyfryngau wedi'u cuddio", + "status.mention": "Crybwyll @{name}", + "status.more": "Mwy", + "status.mute": "Tawelu @{name}", + "status.mute_conversation": "Tawelu sgwrs", + "status.open": "Ehangu'r statws hwn", + "status.pin": "Pinio ar y proffil", + "status.pinned": "Pinio tŵt", + "status.read_more": "Darllen mwy", + "status.reblog": "Hybu", + "status.reblog_private": "Hybu i'r gynulleidfa wreiddiol", + "status.reblogged_by": "Bŵstio {name}", + "status.reblogs.empty": "Does neb wedi bŵstio'r tŵt yma eto. Pan y bydd rhywun yn gwneud, byddent yn ymddangos yma.", + "status.redraft": "Dileu & ailddrafftio", + "status.reply": "Ateb", + "status.replyAll": "Ateb i edefyn", + "status.report": "Adrodd @{name}", + "status.sensitive_toggle": "Clicio i weld", + "status.sensitive_warning": "Cynnwys sensitif", + "status.share": "Rhannu", + "status.show_less": "Dangos llai", + "status.show_less_all": "Dangos llai i bawb", + "status.show_more": "Dangos mwy", + "status.show_more_all": "Dangos mwy i bawb", + "status.unmute_conversation": "Dad-dawelu sgwrs", + "status.unpin": "Dadbinio o'r proffil", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", + "tabs_bar.federated_timeline": "Wedi'i ffedereiddio", + "tabs_bar.home": "Hafan", + "tabs_bar.local_timeline": "Lleol", + "tabs_bar.notifications": "Hysbysiadau", + "tabs_bar.search": "Chwilio", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} yn siarad", + "ui.beforeunload": "Mi fyddwch yn colli eich drafft os gadewch Mastodon.", + "upload_area.title": "Llusgwch & gollwing i uwchlwytho", + "upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)", + "upload_form.description": "Disgrifio i'r rheini a nam ar ei golwg", + "upload_form.focus": "Cropio", + "upload_form.undo": "Dileu", + "upload_progress.label": "Uwchlwytho...", + "video.close": "Cau fideo", + "video.exit_fullscreen": "Gadael sgrîn llawn", + "video.expand": "Ymestyn fideo", + "video.fullscreen": "Sgrîn llawn", + "video.hide": "Cuddio fideo", + "video.mute": "Tawelu sain", + "video.pause": "Oedi", + "video.play": "Chwarae", + "video.unmute": "Dad-dawelu sain" } diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index e3d040ea8..d76f4ac1f 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -15,7 +15,7 @@ "account.follows.empty": "Denne bruger følger endnu ikke nogen.", "account.follows_you": "Følger dig", "account.hide_reblogs": "Skjul fremhævelserne fra @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "Ejerskabet af dette link blev tjekket den %{date}", "account.media": "Medie", "account.mention": "Nævn @{name}", "account.moved_to": "{name} er flyttet til:", @@ -91,6 +91,8 @@ "confirmations.mute.message": "Er du sikker på, du vil dæmpe {name}?", "confirmations.redraft.confirm": "Slet & omskriv", "confirmations.redraft.message": "Er du sikker på, du vil slette denne status og omskrive den? Favoritter og fremhævelser vil gå tabt og svar til det oprindelige opslag vil blive forældreløse.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Følg ikke længere", "confirmations.unfollow.message": "Er du sikker på, du ikke længere vil følge {name}?", "embed.instructions": "Indlejre denne status på din side ved at kopiere nedenstående kode.", @@ -294,6 +296,7 @@ "status.open": "Udvid denne status", "status.pin": "Fastgør til profil", "status.pinned": "Fastgjort trut", + "status.read_more": "Read more", "status.reblog": "Fremhæv", "status.reblog_private": "Fremhæv til oprindeligt publikum", "status.reblogged_by": "{name} fremhævede", @@ -311,6 +314,8 @@ "status.show_more_all": "Vis mere for alle", "status.unmute_conversation": "Fjern dæmpningen fra samtale", "status.unpin": "Fjern som fastgjort fra profil", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Fælles", "tabs_bar.home": "Hjem", "tabs_bar.local_timeline": "Lokal", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index d798878fb..81b8ceedd 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -15,7 +15,7 @@ "account.follows.empty": "Dieses Profil folgt noch niemandem.", "account.follows_you": "Folgt dir", "account.hide_reblogs": "Geteilte Beiträge von @{name} verbergen", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "Besitz dieses Links wurde geprüft am {date}", "account.media": "Medien", "account.mention": "@{name} erwähnen", "account.moved_to": "{name} ist umgezogen auf:", @@ -91,6 +91,8 @@ "confirmations.mute.message": "Bist du dir sicher, dass du {name} stummschalten möchtest?", "confirmations.redraft.confirm": "Löschen und neu erstellen", "confirmations.redraft.message": "Bist du dir sicher, dass du diesen Status löschen und neu machen möchtest? Favoriten und Boosts werden verloren gehen und Antworten zu diesem Post werden verwaist sein.", + "confirmations.reply.confirm": "Antworten", + "confirmations.reply.message": "Wenn du jetzt antwortest wird es die gesamte Nachricht verwerfen, die du gerade schreibst. Möchtest du wirklich fortfahren?", "confirmations.unfollow.confirm": "Entfolgen", "confirmations.unfollow.message": "Bist du dir sicher, dass du {name} entfolgen möchtest?", "embed.instructions": "Du kannst diesen Beitrag auf deiner Webseite einbetten, indem du den folgenden Code einfügst.", @@ -127,7 +129,7 @@ "follow_request.authorize": "Erlauben", "follow_request.reject": "Ablehnen", "getting_started.developers": "Entwickler", - "getting_started.documentation": "Documentation", + "getting_started.documentation": "Dokumentation", "getting_started.find_friends": "Finde Freunde von Twitter", "getting_started.heading": "Erste Schritte", "getting_started.invite": "Leute einladen", @@ -141,7 +143,7 @@ "keyboard_shortcuts.blocked": "Liste blockierter Profile öffnen", "keyboard_shortcuts.boost": "boosten", "keyboard_shortcuts.column": "einen Status in einer der Spalten fokussieren", - "keyboard_shortcuts.compose": "fokussiere das Tröt-Eingabefeld", + "keyboard_shortcuts.compose": "fokussiere das Eingabefeld", "keyboard_shortcuts.description": "Beschreibung", "keyboard_shortcuts.direct": "Direct-Message-Spalte öffnen", "keyboard_shortcuts.down": "sich in der Liste hinunter bewegen", @@ -158,7 +160,7 @@ "keyboard_shortcuts.muted": "Liste stummgeschalteter Profile öffnen", "keyboard_shortcuts.my_profile": "Dein Profil öffnen", "keyboard_shortcuts.notifications": "Benachrichtigungsspalte öffnen", - "keyboard_shortcuts.pinned": "Liste angehefteter Tröts öffnen", + "keyboard_shortcuts.pinned": "Liste angehefteter Beiträge öffnen", "keyboard_shortcuts.profile": "Profil des Autors öffnen", "keyboard_shortcuts.reply": "antworten", "keyboard_shortcuts.requests": "Liste der Folge-Anfragen öffnen", @@ -280,7 +282,7 @@ "status.cancel_reblog_private": "Nicht mehr teilen", "status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden", "status.delete": "Löschen", - "status.detailed_status": "Detailed conversation view", + "status.detailed_status": "Detaillierte Ansicht der Konversation", "status.direct": "Direktnachricht @{name}", "status.embed": "Einbetten", "status.favourite": "Favorisieren", @@ -294,6 +296,7 @@ "status.open": "Diesen Beitrag öffnen", "status.pin": "Im Profil anheften", "status.pinned": "Angehefteter Beitrag", + "status.read_more": "Mehr lesen", "status.reblog": "Teilen", "status.reblog_private": "An das eigentliche Publikum teilen", "status.reblogged_by": "{name} teilte", @@ -311,6 +314,8 @@ "status.show_more_all": "Zeige mehr für alles", "status.unmute_conversation": "Stummschaltung von Thread aufheben", "status.unpin": "Vom Profil lösen", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Föderation", "tabs_bar.home": "Startseite", "tabs_bar.local_timeline": "Lokal", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index b2ed49309..737c55d37 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -873,6 +873,14 @@ { "descriptors": [ { + "defaultMessage": "Dismiss suggestion", + "id": "suggestions.dismiss" + }, + { + "defaultMessage": "You might be interested in…", + "id": "suggestions.header" + }, + { "defaultMessage": "People", "id": "search_results.accounts" }, diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 4e4b733ec..8e67e7f90 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -7,15 +7,15 @@ "account.disclaimer_full": "Οι παρακάτω πληροφορίες μπορει να μην αντανακλούν το προφίλ του χρήστη επαρκως.", "account.domain_blocked": "Κρυμμένος τομέας", "account.edit_profile": "Επεξεργάσου το προφίλ", - "account.endorse": "Feature on profile", + "account.endorse": "Προβολή στο προφίλ", "account.follow": "Ακολούθησε", "account.followers": "Ακόλουθοι", - "account.followers.empty": "No one follows this user yet.", + "account.followers.empty": "Κανείς δεν ακολουθεί αυτό τον χρήστη ακόμα.", "account.follows": "Ακολουθεί", - "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows.empty": "Αυτός ο χρήστης δεν ακολουθεί κανέναν ακόμα.", "account.follows_you": "Σε ακολουθεί", "account.hide_reblogs": "Απόκρυψη προωθήσεων από @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "Η ιδιοκτησία αυτού του συνδέσμου εκλέχθηκε την {date}", "account.media": "Πολυμέσα", "account.mention": "Ανάφερε @{name}", "account.moved_to": "{name} μεταφέρθηκε στο:", @@ -30,7 +30,7 @@ "account.show_reblogs": "Δείξε τις προωθήσεις του/της @{name}", "account.unblock": "Ξεμπλόκαρε τον/την @{name}", "account.unblock_domain": "Αποκάλυψε το {domain}", - "account.unendorse": "Don't feature on profile", + "account.unendorse": "Άνευ προβολής στο προφίλ", "account.unfollow": "Διακοπή παρακολούθησης", "account.unmute": "Διακοπή αποσιώπησης του/της @{name}", "account.unmute_notifications": "Διακοπή αποσιώπησης ειδοποιήσεων του/της @{name}", @@ -91,6 +91,8 @@ "confirmations.mute.message": "Σίγουρα θες να αποσιωπήσεις τον/την {name};", "confirmations.redraft.confirm": "Διαγραφή & ξαναγράψιμο", "confirmations.redraft.message": "Σίγουρα θέλεις να σβήσεις αυτή την κατάσταση και να την ξαναγράψεις; Οι αναφορές και τα αγαπημένα της θα χαθούν ενώ οι απαντήσεις προς αυτή θα μείνουν ορφανές.", + "confirmations.reply.confirm": "Απάντησε", + "confirmations.reply.message": "Απαντώντας τώρα θα αντικαταστήσεις το κείμενο που ήδη γράφεις. Σίγουρα θέλεις να συνεχίσεις;", "confirmations.unfollow.confirm": "Διακοπή παρακολούθησης", "confirmations.unfollow.message": "Σίγουρα θες να πάψεις να ακολουθείς τον/την {name};", "embed.instructions": "Ενσωματώστε αυτή την κατάσταση στην ιστοσελίδα σας αντιγράφοντας τον παρακάτω κώδικα.", @@ -109,19 +111,19 @@ "emoji_button.search_results": "Αποτελέσματα αναζήτησης", "emoji_button.symbols": "Σύμβολα", "emoji_button.travel": "Ταξίδια & Τοποθεσίες", - "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.blocks": "Δεν έχεις αποκλείσει κανέναν χρήστη ακόμα.", "empty_column.community": "Η τοπική ροή είναι κενή. Γράψε κάτι δημόσιο παραμύθι ν' αρχινίσει!", "empty_column.direct": "Δεν έχεις προσωπικά μηνύματα ακόμα. Όταν στείλεις ή λάβεις κανένα, θα εμφανιστεί εδώ.", - "empty_column.domain_blocks": "There are no hidden domains yet.", - "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", - "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", - "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.domain_blocks": "Δεν υπάρχουν αποκλεισμένοι τομείς ακόμα.", + "empty_column.favourited_statuses": "Δεν έχεις κανένα αγαπημένο τουτ ακόμα. Μόλις αγαπήσεις κάποιο, θα εμφανιστεί εδώ.", + "empty_column.favourites": "Κανείς δεν έχει αγαπήσει αυτό το τουτ ακόμα. Μόλις το κάνει κάποια, θα εμφανιστούν εδώ.", + "empty_column.follow_requests": "Δεν έχεις κανένα αίτημα παρακολούθησης ακόμα. Μόλις λάβεις κάποιο, θα εμφανιστεί εδώ.", "empty_column.hashtag": "Δεν υπάρχει ακόμα κάτι για αυτή την ταμπέλα.", "empty_column.home": "Η τοπική σου ροή είναι κενή! Πήγαινε στο {public} ή κάνε αναζήτηση για να ξεκινήσεις και να γνωρίσεις άλλους χρήστες.", "empty_column.home.public_timeline": "η δημόσια ροή", "empty_column.list": "Δεν υπάρχει τίποτα σε αυτή τη λίστα ακόμα. Όταν τα μέλη της δημοσιεύσουν νέες καταστάσεις, θα εμφανιστούν εδώ.", - "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.lists": "Δεν έχεις καμία λίστα ακόμα. Μόλις φτιάξεις μια, θα εμφανιστεί εδώ.", + "empty_column.mutes": "Δεν έχεις αποσιωπήσει κανένα χρήστη ακόμα.", "empty_column.notifications": "Δεν έχεις ειδοποιήσεις ακόμα. Αλληλεπίδρασε με άλλους χρήστες για να ξεκινήσεις την κουβέντα.", "empty_column.public": "Δεν υπάρχει τίποτα εδώ! Γράψε κάτι δημόσιο, ή ακολούθησε χειροκίνητα χρήστες από άλλα instances για να τη γεμίσεις", "follow_request.authorize": "Ενέκρινε", @@ -138,32 +140,32 @@ "home.column_settings.show_reblogs": "Εμφάνιση προωθήσεων", "home.column_settings.show_replies": "Εμφάνιση απαντήσεων", "keyboard_shortcuts.back": "για επιστροφή πίσω", - "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.blocked": "άνοιγμα λίστας αποκλεισμένων χρηστών", "keyboard_shortcuts.boost": "για προώθηση", "keyboard_shortcuts.column": "για εστίαση μιας κατάστασης σε μια από τις στήλες", "keyboard_shortcuts.compose": "για εστίαση στην περιοχή κειμένου συγγραφής", "keyboard_shortcuts.description": "Description", - "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.direct": "άνοιγμα κολώνας απευθείας μηνυμάτων", "keyboard_shortcuts.down": "για κίνηση προς τα κάτω στη λίστα", "keyboard_shortcuts.enter": "to open status", "keyboard_shortcuts.favourite": "για σημείωση αγαπημένου", - "keyboard_shortcuts.favourites": "to open favourites list", - "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.favourites": "άνοιγμα λίστας αγαπημένων", + "keyboard_shortcuts.federated": "άνοιγμα ομοσπονδιακής ροής", "keyboard_shortcuts.heading": "Keyboard Shortcuts", - "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.home": "άνοιγμα αρχικής ροής", "keyboard_shortcuts.hotkey": "Συντόμευση", "keyboard_shortcuts.legend": "για να εμφανίσεις αυτόν τον οδηγό", - "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.local": "άνοιγμα τοπικής ροής", "keyboard_shortcuts.mention": "για να αναφέρεις το συγγραφέα", - "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.pinned": "to open pinned toots list", - "keyboard_shortcuts.profile": "to open author's profile", + "keyboard_shortcuts.muted": "άνοιγμα λίστας αποσιωπημενων χρηστών", + "keyboard_shortcuts.my_profile": "άνοιγμα του προφίλ σου", + "keyboard_shortcuts.notifications": "άνοιγμα κολώνας ειδοποιήσεων", + "keyboard_shortcuts.pinned": "άνοιγμα λίστας καρφιτσωμένων τουτ", + "keyboard_shortcuts.profile": "άνοιγμα προφίλ συγγραφέα", "keyboard_shortcuts.reply": "για απάντηση", - "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.requests": "άνοιγμα λίστας αιτημάτων παρακολούθησης", "keyboard_shortcuts.search": "για εστίαση αναζήτησης", - "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.start": "άνοιγμα κολώνας \"Ξεκινώντας\"", "keyboard_shortcuts.toggle_hidden": "για εμφάνιση/απόκρυψη κειμένου πίσω από την προειδοποίηση", "keyboard_shortcuts.toot": "για δημιουργία ολοκαίνουριου τουτ", "keyboard_shortcuts.unfocus": "για την απο-εστίαση του πεδίου σύνθεσης/αναζήτησης", @@ -184,10 +186,10 @@ "missing_indicator.label": "Δε βρέθηκε", "missing_indicator.sublabel": "Αδύνατη η εύρεση αυτού του πόρου", "mute_modal.hide_notifications": "Απόκρυψη ειδοποιήσεων αυτού του χρήστη;", - "navigation_bar.apps": "Mobile apps", + "navigation_bar.apps": "Εφαρμογές φορητών συσκευών", "navigation_bar.blocks": "Αποκλεισμένοι χρήστες", "navigation_bar.community_timeline": "Τοπική ροή", - "navigation_bar.compose": "Compose new toot", + "navigation_bar.compose": "Γράψε νέο τουτ", "navigation_bar.direct": "Προσωπικά μηνύματα", "navigation_bar.discover": "Ανακάλυψη", "navigation_bar.domain_blocks": "Κρυμμένοι τομείς", @@ -274,13 +276,13 @@ "search_results.accounts": "Άνθρωποι", "search_results.hashtags": "Ταμπέλες", "search_results.statuses": "Τουτ", - "search_results.total": "{count, number} {count, plural, one {result} other {results}}", + "search_results.total": "{count, number} {count, plural, ένα {result} υπόλοιπα {results}}", "standalone.public_title": "Μια πρώτη γεύση...", "status.block": "Block @{name}", "status.cancel_reblog_private": "Ακύρωσε την προώθηση", "status.cannot_reblog": "Αυτή η δημοσίευση δεν μπορεί να προωθηθεί", "status.delete": "Διαγραφή", - "status.detailed_status": "Detailed conversation view", + "status.detailed_status": "Προβολή λεπτομερειών συζήτησης", "status.direct": "Προσωπικό μήνυμα προς @{name}", "status.embed": "Ενσωμάτωσε", "status.favourite": "Σημείωσε ως αγαπημένο", @@ -294,10 +296,11 @@ "status.open": "Διεύρυνε αυτή την κατάσταση", "status.pin": "Καρφίτσωσε στο προφίλ", "status.pinned": "Καρφιτσωμένο τουτ", + "status.read_more": "Περισσότερα", "status.reblog": "Προώθησε", "status.reblog_private": "Προώθησε στους αρχικούς παραλήπτες", "status.reblogged_by": "{name} προώθησε", - "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", + "status.reblogs.empty": "Κανείς δεν προώθησε αυτό το τουτ ακόμα. Μόλις το κάνει κάποια, θα εμφανιστούν εδώ.", "status.redraft": "Σβήσε & ξαναγράψε", "status.reply": "Απάντησε", "status.replyAll": "Απάντησε στην συζήτηση", @@ -311,6 +314,8 @@ "status.show_more_all": "Δείξε περισσότερα για όλα", "status.unmute_conversation": "Διέκοψε την αποσιώπηση της συζήτησης", "status.unpin": "Ξεκαρφίτσωσε από το προφίλ", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Ομοσπονδιακή", "tabs_bar.home": "Αρχική", "tabs_bar.local_timeline": "Τοπικά", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 0d85ec744..a45d762c1 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -319,6 +319,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federated", "tabs_bar.home": "Home", "tabs_bar.local_timeline": "Local", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index 86bee46b1..0522ce95b 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Ĉu vi certas, ke vi volas silentigi {name}?", "confirmations.redraft.confirm": "Forigi kaj reskribi", "confirmations.redraft.message": "Ĉu vi certas, ke vi volas forigi tiun mesaĝon kaj reskribi ĝin? Vi perdos ĉiujn respondojn, diskonigojn kaj stelumojn ligitajn al ĝi.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Ne plu sekvi", "confirmations.unfollow.message": "Ĉu vi certas, ke vi volas ĉesi sekvi {name}?", "embed.instructions": "Enkorpigu ĉi tiun mesaĝon en vian retejon per kopio de la suba kodo.", @@ -294,6 +296,7 @@ "status.open": "Grandigi", "status.pin": "Alpingli profile", "status.pinned": "Alpinglita mesaĝo", + "status.read_more": "Read more", "status.reblog": "Diskonigi", "status.reblog_private": "Diskonigi al la originala atentaro", "status.reblogged_by": "{name} diskonigis", @@ -311,6 +314,8 @@ "status.show_more_all": "Grandigi ĉiujn", "status.unmute_conversation": "Malsilentigi konversacion", "status.unpin": "Depingli de profilo", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Fratara tempolinio", "tabs_bar.home": "Hejmo", "tabs_bar.local_timeline": "Loka tempolinio", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 63f197c28..f06ac11a4 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?", "confirmations.redraft.confirm": "Borrar y volver a borrador", "confirmations.redraft.message": "Estás seguro de que quieres borrar este estado y volverlo a borrador? Perderás todas las respuestas, impulsos y favoritos asociados a él, y las respuestas a la publicación original quedarán huérfanos.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Dejar de seguir", "confirmations.unfollow.message": "¿Estás seguro de que quieres dejar de seguir a {name}?", "embed.instructions": "Añade este toot a tu sitio web con el siguiente código.", @@ -294,6 +296,7 @@ "status.open": "Expandir estado", "status.pin": "Fijar", "status.pinned": "Toot fijado", + "status.read_more": "Read more", "status.reblog": "Retootear", "status.reblog_private": "Implusar a la audiencia original", "status.reblogged_by": "Retooteado por {name}", @@ -311,6 +314,8 @@ "status.show_more_all": "Mostrar más para todo", "status.unmute_conversation": "Dejar de silenciar conversación", "status.unpin": "Dejar de fijar", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federado", "tabs_bar.home": "Inicio", "tabs_bar.local_timeline": "Local", diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json index e4b1154b7..300e7eae4 100644 --- a/app/javascript/mastodon/locales/eu.json +++ b/app/javascript/mastodon/locales/eu.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Ziur {name} mututu nahi duzula?", "confirmations.redraft.confirm": "Ezabatu eta berridatzi", "confirmations.redraft.message": "Ziur mezu hau ezabatu eta berridatzi nahi duzula? Gogokoak eta bultzadak galduko dira eta jaso dituen erantzunak umezurtz geratuko dira.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Utzi jarraitzeari", "confirmations.unfollow.message": "Ziur {name} jarraitzeari utzi nahi diozula?", "embed.instructions": "Txertatu mezu hau zure webgunean beheko kodea kopatuz.", @@ -294,6 +296,7 @@ "status.open": "Hedatu mezu hau", "status.pin": "Finkatu profilean", "status.pinned": "Finkatutako toot-a", + "status.read_more": "Read more", "status.reblog": "Bultzada", "status.reblog_private": "Bultzada jatorrizko hartzaileei", "status.reblogged_by": "{name}(r)en bultzada", @@ -311,6 +314,8 @@ "status.show_more_all": "Erakutsi denetarik gehiago", "status.unmute_conversation": "Desmututu elkarrizketa", "status.unpin": "Desfinkatu profiletik", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federatua", "tabs_bar.home": "Hasiera", "tabs_bar.local_timeline": "Lokala", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index fb4ded11c..7198931c4 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -15,7 +15,7 @@ "account.follows.empty": "این کاربر هنوز هیچ کسی را پی نمیگیرد.", "account.follows_you": "پیگیر شماست", "account.hide_reblogs": "پنهان کردن بازبوقهای @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "مالکیت این نشانی در تایخ {date} بررسی شد", "account.media": "عکس و ویدیو", "account.mention": "نامبردن از @{name}", "account.moved_to": "{name} منتقل شده است به:", @@ -58,8 +58,8 @@ "column.public": "نوشتههای همهجا", "column_back_button.label": "بازگشت", "column_header.hide_settings": "نهفتن تنظیمات", - "column_header.moveLeft_settings": "انتقال ستون به چپ", - "column_header.moveRight_settings": "انتقال ستون به راست", + "column_header.moveLeft_settings": "انتقال ستون به راست", + "column_header.moveRight_settings": "انتقال ستون به چپ", "column_header.pin": "ثابتکردن", "column_header.show_settings": "نمایش تنظیمات", "column_header.unpin": "رهاکردن", @@ -91,6 +91,8 @@ "confirmations.mute.message": "آیا واقعاً میخواهید {name} را بیصدا کنید؟", "confirmations.redraft.confirm": "پاککردن و بازنویسی", "confirmations.redraft.message": "آیا واقعاً میخواهید این نوشته را پاک کنید و آن را از نو بنویسید؟ با این کار بازبوقها و پسندیدهشدنهای آن از دست میرود و پاسخها به آن بیمرجع میشود.", + "confirmations.reply.confirm": "پاسخ", + "confirmations.reply.message": "اگر الان پاسخ دهید، چیزی که در حال نوشتنش بودید پاک خواهد شد. آیا همین را میخواهید؟", "confirmations.unfollow.confirm": "لغو پیگیری", "confirmations.unfollow.message": "آیا واقعاً میخواهید به پیگیری از {name} پایان دهید؟", "embed.instructions": "برای جاگذاری این نوشته در سایت خودتان، کد زیر را کپی کنید.", @@ -294,6 +296,7 @@ "status.open": "این نوشته را باز کن", "status.pin": "نوشتهٔ ثابت نمایه", "status.pinned": "بوق ثابت", + "status.read_more": "بیشتر بخوانید", "status.reblog": "بازبوقیدن", "status.reblog_private": "بازبوق به مخاطبان اولیه", "status.reblogged_by": "{name} بازبوقید", @@ -311,6 +314,8 @@ "status.show_more_all": "نمایش بیشتر همه", "status.unmute_conversation": "باصداکردن گفتگو", "status.unpin": "برداشتن نوشتهٔ ثابت نمایه", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "همگانی", "tabs_bar.home": "خانه", "tabs_bar.local_timeline": "محلی", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index caf949e8c..fc623dab8 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Haluatko varmasti mykistää käyttäjän {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Lakkaa seuraamasta", "confirmations.unfollow.message": "Haluatko varmasti lakata seuraamasta käyttäjää {name}?", "embed.instructions": "Upota statuspäivitys sivullesi kopioimalla alla oleva koodi.", @@ -294,6 +296,7 @@ "status.open": "Laajenna tilapäivitys", "status.pin": "Kiinnitä profiiliin", "status.pinned": "Kiinnitetty tuuttaus", + "status.read_more": "Read more", "status.reblog": "Buustaa", "status.reblog_private": "Buustaa alkuperäiselle yleisölle", "status.reblogged_by": "{name} buustasi", @@ -311,6 +314,8 @@ "status.show_more_all": "Näytä lisää kaikista", "status.unmute_conversation": "Poista keskustelun mykistys", "status.unpin": "Irrota profiilista", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Yleinen", "tabs_bar.home": "Koti", "tabs_bar.local_timeline": "Paikallinen", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index ff09a1402..d8b16672b 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -10,12 +10,12 @@ "account.endorse": "Figure sur le profil", "account.follow": "Suivre", "account.followers": "Abonné⋅e⋅s", - "account.followers.empty": "Personne ne suit cet utilisateur pour l'instant.", + "account.followers.empty": "Personne ne suit cet utilisateur pour l’instant.", "account.follows": "Abonnements", - "account.follows.empty": "Cet utilisateur ne suit personne pour l'instant.", + "account.follows.empty": "Cet utilisateur ne suit personne pour l’instant.", "account.follows_you": "Vous suit", "account.hide_reblogs": "Masquer les partages de @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "La propriété de ce lien a été vérifiée le {date}", "account.media": "Média", "account.mention": "Mentionner", "account.moved_to": "{name} a déménagé vers :", @@ -91,6 +91,8 @@ "confirmations.mute.message": "Confirmez-vous le masquage de {name} ?", "confirmations.redraft.confirm": "Effacer et ré-écrire", "confirmations.redraft.message": "Êtes-vous sûr·e de vouloir effacer ce statut pour le ré-écrire ? Ses partages ainsi que ses mises en favori seront perdu·e·s et ses réponses seront orphelines.", + "confirmations.reply.confirm": "Répondre", + "confirmations.reply.message": "Répondre maintenant écrasera le message que vous êtes en train de composer. Voulez-vous vraiment continuer ?", "confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.message": "Voulez-vous arrêter de suivre {name} ?", "embed.instructions": "Intégrez ce statut à votre site en copiant le code ci-dessous.", @@ -109,19 +111,19 @@ "emoji_button.search_results": "Résultats de la recherche", "emoji_button.symbols": "Symboles", "emoji_button.travel": "Lieux & Voyages", - "empty_column.blocks": "Vous n'avez bloqué aucun utilisateur pour le moment.", + "empty_column.blocks": "Vous n’avez bloqué aucun utilisateur pour le moment.", "empty_column.community": "Le fil public local est vide. Écrivez donc quelque chose pour le remplir !", "empty_column.direct": "Vous n’avez pas encore de messages directs. Lorsque vous en enverrez ou recevrez un, il s’affichera ici.", - "empty_column.domain_blocks": "Il n'y a aucun domaine caché pour le moment.", - "empty_column.favourited_statuses": "Vous n'avez aucun pouet favoris pour le moment. Lorsque vous en mettrez un en favori, il apparaîtra ici.", - "empty_column.favourites": "Personne n'a encore mis ce pouet en favori. Lorsque quelqu'un le fera, il apparaîtra ici.", - "empty_column.follow_requests": "Vous n'avez pas encore de demande de suivi. Lorsque vous en recevrez une, elle apparaîtra ici.", + "empty_column.domain_blocks": "Il n’y a aucun domaine caché pour le moment.", + "empty_column.favourited_statuses": "Vous n’avez aucun pouet favoris pour le moment. Lorsque vous en mettrez un en favori, il apparaîtra ici.", + "empty_column.favourites": "Personne n’a encore mis ce pouet en favori. Lorsque quelqu’un le fera, il apparaîtra ici.", + "empty_column.follow_requests": "Vous n’avez pas encore de demande de suivi. Lorsque vous en recevrez une, elle apparaîtra ici.", "empty_column.hashtag": "Il n’y a encore aucun contenu associé à ce hashtag.", "empty_column.home": "Vous ne suivez personne. Visitez {public} ou utilisez la recherche pour trouver d’autres personnes à suivre.", "empty_column.home.public_timeline": "le fil public", "empty_column.list": "Il n’y a rien dans cette liste pour l’instant. Dès que des personnes de cette liste publieront de nouveaux statuts, ils apparaîtront ici.", - "empty_column.lists": "Vous n'avez pas encore de liste. Lorsque vous en créerez une, elle apparaîtra ici.", - "empty_column.mutes": "Vous n'avez pas encore mis des utilisateurs en silence.", + "empty_column.lists": "Vous n’avez pas encore de liste. Lorsque vous en créerez une, elle apparaîtra ici.", + "empty_column.mutes": "Vous n’avez pas encore mis des utilisateurs en silence.", "empty_column.notifications": "Vous n’avez pas encore de notification. Interagissez avec d’autres personnes pour débuter la conversation.", "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres instances pour remplir le fil public", "follow_request.authorize": "Accepter", @@ -138,7 +140,7 @@ "home.column_settings.show_reblogs": "Afficher les partages", "home.column_settings.show_replies": "Afficher les réponses", "keyboard_shortcuts.back": "revenir en arrière", - "keyboard_shortcuts.blocked": "pour ouvrir une liste d'utilisateurs bloqués", + "keyboard_shortcuts.blocked": "pour ouvrir une liste d’utilisateurs bloqués", "keyboard_shortcuts.boost": "partager", "keyboard_shortcuts.column": "focaliser un statut dans l’une des colonnes", "keyboard_shortcuts.compose": "pour centrer la zone de rédaction", @@ -150,7 +152,7 @@ "keyboard_shortcuts.favourites": "pour ouvrir une liste de favoris", "keyboard_shortcuts.federated": "pour ouvrir le fil public global", "keyboard_shortcuts.heading": "Raccourcis clavier", - "keyboard_shortcuts.home": "pour ouvrir l'accueil", + "keyboard_shortcuts.home": "pour ouvrir l’accueil", "keyboard_shortcuts.hotkey": "Raccourci", "keyboard_shortcuts.legend": "pour afficher cette légende", "keyboard_shortcuts.local": "pour ouvrir le fil public local", @@ -294,10 +296,11 @@ "status.open": "Déplier ce statut", "status.pin": "Épingler sur le profil", "status.pinned": "Pouet épinglé", + "status.read_more": "En savoir plus", "status.reblog": "Partager", "status.reblog_private": "Booster vers l’audience originale", "status.reblogged_by": "{name} a partagé :", - "status.reblogs.empty": "Personne n'a encore partagé ce pouet. Lorsque quelqu'un le fera, il apparaîtra ici.", + "status.reblogs.empty": "Personne n’a encore partagé ce pouet. Lorsque quelqu’un le fera, il apparaîtra ici.", "status.redraft": "Effacer et ré-écrire", "status.reply": "Répondre", "status.replyAll": "Répondre au fil", @@ -311,6 +314,8 @@ "status.show_more_all": "Tout déplier", "status.unmute_conversation": "Ne plus masquer la conversation", "status.unpin": "Retirer du profil", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Fil public global", "tabs_bar.home": "Accueil", "tabs_bar.local_timeline": "Fil public local", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 6afa21c9f..2f8b76d3a 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -7,15 +7,15 @@ "account.disclaimer_full": "A información inferior podería mostrar un perfil incompleto da usuaria.", "account.domain_blocked": "Dominio agochado", "account.edit_profile": "Editar perfil", - "account.endorse": "Feature on profile", + "account.endorse": "Mostrado no perfil", "account.follow": "Seguir", "account.followers": "Seguidoras", - "account.followers.empty": "No one follows this user yet.", + "account.followers.empty": "Ninguén está a seguir esta usuaria por agora.", "account.follows": "Seguindo", - "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows.empty": "Esta usuaria aínda non segue a ninguén.", "account.follows_you": "Séguena", "account.hide_reblogs": "Ocultar repeticións de @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "A propiedade de esta ligazón foi comprobada en {date}", "account.media": "Medios", "account.mention": "Mencionar @{name}", "account.moved_to": "{name} marchou a:", @@ -30,7 +30,7 @@ "account.show_reblogs": "Mostrar repeticións de @{name}", "account.unblock": "Desbloquear @{name}", "account.unblock_domain": "Non ocultar {domain}", - "account.unendorse": "Don't feature on profile", + "account.unendorse": "Non mostrar no perfil", "account.unfollow": "Non seguir", "account.unmute": "Non acalar @{name}", "account.unmute_notifications": "Desbloquear as notificacións de @{name}", @@ -64,9 +64,9 @@ "column_header.show_settings": "Mostras axustes", "column_header.unpin": "Soltar", "column_subheading.settings": "Axustes", - "community.column_settings.media_only": "Media Only", + "community.column_settings.media_only": "Só medios", "compose_form.direct_message_warning": "Este toot enviarase só as usuarias mencionadas. Porén, a súa proveedora de internet e calquera das instancias receptoras poderían examinar esta mensaxe.", - "compose_form.direct_message_warning_learn_more": "Learn more", + "compose_form.direct_message_warning_learn_more": "Coñecer máis", "compose_form.hashtag_warning": "Esta mensaxe non será listada baixo ningunha etiqueta xa que está marcada como non listada. Só os toots públicos poden buscarse por etiquetas.", "compose_form.lock_disclaimer": "A súa conta non está {locked}. Calquera pode seguila para ver as súas mensaxes só-para-seguidoras.", "compose_form.lock_disclaimer.lock": "bloqueado", @@ -91,6 +91,8 @@ "confirmations.mute.message": "Está segura de que quere acalar a {name}?", "confirmations.redraft.confirm": "Eliminar e reescribir", "confirmations.redraft.message": "Está segura de querer eliminar este estado e voltalo a escribir? Perderá réplicas e favoritas, e as respostas ao orixinal quedarán orfas.", + "confirmations.reply.confirm": "Respostar", + "confirmations.reply.message": "Respostando agora sobreescribirá a mensaxe que está a compoñer. Segura de querer proceder?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Quere deixar de seguir a {name}?", "embed.instructions": "Copie o código inferior para incrustar no seu sitio web este estado.", @@ -109,61 +111,61 @@ "emoji_button.search_results": "Resultados da busca", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viaxes e Lugares", - "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.blocks": "Non bloqueou ningunha usuaria polo de agora.", "empty_column.community": "A liña temporal local está baldeira. Escriba algo de xeito público para que rule!", "empty_column.direct": "Aínda non ten mensaxes directas. Cando envíe ou reciba unha, aparecerá aquí.", - "empty_column.domain_blocks": "There are no hidden domains yet.", - "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", - "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", - "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.domain_blocks": "Aínda non ocultou ningún dominio.", + "empty_column.favourited_statuses": "Aínda non ten toots favoritos. Cando favoreza algún, aparecerá aquí.", + "empty_column.favourites": "Ninguén favoreceu este toot polo momento. Cando o faga alguén, aparecerán aquí.", + "empty_column.follow_requests": "Non ten peticións de seguimento. Cando reciba unha, mostrarase aquí.", "empty_column.hashtag": "Aínda non hai nada con esta etiqueta.", "empty_column.home": "A súa liña temporal de inicio está baldeira! Visite {public} ou utilice a busca para atopar outras usuarias.", "empty_column.home.public_timeline": "a liña temporal pública", "empty_column.list": "Aínda non hai nada en esta lista. Cando as usuarias incluídas na lista publiquen mensaxes, aparecerán aquí.", - "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.lists": "Aínda non ten listas. Cando cree unha, mostrarase aquí.", + "empty_column.mutes": "Non acalou ningunha usuaria polo de agora.", "empty_column.notifications": "Aínda non ten notificacións. Interactúe con outras para iniciar unha conversa.", "empty_column.public": "Nada por aquí! Escriba algo de xeito público, ou siga manualmente usuarias de outras instancias para ir enchéndoa", "follow_request.authorize": "Autorizar", "follow_request.reject": "Rexeitar", - "getting_started.developers": "Developers", + "getting_started.developers": "Desenvolvedoras", "getting_started.documentation": "Documentation", - "getting_started.find_friends": "Find friends from Twitter", + "getting_started.find_friends": "Atope amigos da Twitter", "getting_started.heading": "Comezando", - "getting_started.invite": "Invite people", + "getting_started.invite": "Convide a xente", "getting_started.open_source_notice": "Mastodon é software de código aberto. Pode contribuír ou informar de fallos en GitHub en {github}.", - "getting_started.security": "Security", - "getting_started.terms": "Terms of service", + "getting_started.security": "Seguridade", + "getting_started.terms": "Termos do servizo", "home.column_settings.basic": "Básico", "home.column_settings.show_reblogs": "Mostrar repeticións", "home.column_settings.show_replies": "Mostrar respostas", "keyboard_shortcuts.back": "voltar atrás", - "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.blocked": "abrir lista de usuarias bloqueadas", "keyboard_shortcuts.boost": "promover", "keyboard_shortcuts.column": "destacar un estado en unha das columnas", "keyboard_shortcuts.compose": "Foco no área de escritura", "keyboard_shortcuts.description": "Descrición", - "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.direct": "abrir columna de mensaxes directas", "keyboard_shortcuts.down": "ir hacia abaixo na lista", "keyboard_shortcuts.enter": "abrir estado", "keyboard_shortcuts.favourite": "marcar como favorito", - "keyboard_shortcuts.favourites": "to open favourites list", - "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.favourites": "abrir lista de favoritos", + "keyboard_shortcuts.federated": "abrir liña temporal federada", "keyboard_shortcuts.heading": "Atallos do teclado", - "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.home": "abrir liña temporal de inicio", "keyboard_shortcuts.hotkey": "Tecla de acceso directo", "keyboard_shortcuts.legend": "para mostrar esta lenda", - "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.local": "abrir liña temporal local", "keyboard_shortcuts.mention": "para mencionar o autor", - "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.pinned": "to open pinned toots list", - "keyboard_shortcuts.profile": "to open author's profile", + "keyboard_shortcuts.muted": "abrir lista de usuarias acaladas", + "keyboard_shortcuts.my_profile": "abrir o seu perfil", + "keyboard_shortcuts.notifications": "abrir columna de notificacións", + "keyboard_shortcuts.pinned": "abrir lista de toots fixados", + "keyboard_shortcuts.profile": "abrir perfil da autora", "keyboard_shortcuts.reply": "para responder", - "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.requests": "abrir lista de peticións de seguimento", "keyboard_shortcuts.search": "para centrar a busca", - "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.start": "abrir columna \"comezando\"", "keyboard_shortcuts.toggle_hidden": "mostrar/agochar un texto detrás do AC", "keyboard_shortcuts.toot": "escribir un toot novo", "keyboard_shortcuts.unfocus": "quitar o foco do área de escritura/busca", @@ -184,16 +186,16 @@ "missing_indicator.label": "Non atopado", "missing_indicator.sublabel": "Non se puido atopar o recurso", "mute_modal.hide_notifications": "Esconder notificacións deste usuario?", - "navigation_bar.apps": "Mobile apps", + "navigation_bar.apps": "Apps móbiles", "navigation_bar.blocks": "Usuarias bloqueadas", "navigation_bar.community_timeline": "Liña temporal local", - "navigation_bar.compose": "Compose new toot", + "navigation_bar.compose": "Escribir novo toot", "navigation_bar.direct": "Mensaxes directas", - "navigation_bar.discover": "Discover", + "navigation_bar.discover": "Descubrir", "navigation_bar.domain_blocks": "Dominios agochados", "navigation_bar.edit_profile": "Editar perfil", "navigation_bar.favourites": "Favoritas", - "navigation_bar.filters": "Muted words", + "navigation_bar.filters": "Palabras acaladas", "navigation_bar.follow_requests": "Peticións de seguimento", "navigation_bar.info": "Sobre esta instancia", "navigation_bar.keyboard_shortcuts": "Atallos", @@ -204,7 +206,7 @@ "navigation_bar.pins": "Mensaxes fixadas", "navigation_bar.preferences": "Preferencias", "navigation_bar.public_timeline": "Liña temporal federada", - "navigation_bar.security": "Security", + "navigation_bar.security": "Seguridade", "notification.favourite": "{name} marcou como favorito o seu estado", "notification.follow": "{name} está a seguila", "notification.mention": "{name} mencionoute", @@ -219,7 +221,7 @@ "notifications.column_settings.reblog": "Promocións:", "notifications.column_settings.show": "Mostrar en columna", "notifications.column_settings.sound": "Reproducir son", - "notifications.group": "{count} notifications", + "notifications.group": "{count} notificacións", "onboarding.done": "Feito", "onboarding.next": "Seguinte", "onboarding.page_five.public_timelines": "A liña de tempo local mostra as publicacións públicas de todos en {domain}. A liña de tempo federada mostra as publicacións públicas de todos os que as persoas en {domain} seguen. Estas son as Liñas de tempo públicas, unha boa forma de descubrir novas persoas.", @@ -280,11 +282,11 @@ "status.cancel_reblog_private": "Non promover", "status.cannot_reblog": "Esta mensaxe non pode ser promovida", "status.delete": "Eliminar", - "status.detailed_status": "Detailed conversation view", + "status.detailed_status": "Vista detallada da conversa", "status.direct": "Mensaxe directa @{name}", "status.embed": "Incrustar", "status.favourite": "Favorita", - "status.filtered": "Filtered", + "status.filtered": "Filtrado", "status.load_more": "Cargar máis", "status.media_hidden": "Medios ocultos", "status.mention": "Mencionar @{name}", @@ -294,11 +296,12 @@ "status.open": "Expandir este estado", "status.pin": "Fixar no perfil", "status.pinned": "Toot fixado", + "status.read_more": "Lea máis", "status.reblog": "Promover", "status.reblog_private": "Promover a audiencia orixinal", "status.reblogged_by": "{name} promoveu", - "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", - "status.redraft": "Delete & re-draft", + "status.reblogs.empty": "Ninguén promoveu este toot polo de agora. Cando alguén o faga, mostraránse aquí.", + "status.redraft": "Eliminar & reescribir", "status.reply": "Resposta", "status.replyAll": "Resposta a conversa", "status.report": "Informar @{name}", @@ -311,12 +314,14 @@ "status.show_more_all": "Mostrar máis para todas", "status.unmute_conversation": "Non acalar a conversa", "status.unpin": "Despegar do perfil", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federado", "tabs_bar.home": "Inicio", "tabs_bar.local_timeline": "Local", "tabs_bar.notifications": "Notificacións", "tabs_bar.search": "Buscar", - "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", + "trends.count_by_accounts": "{count} {rawCount, plural, one {person} outras {people}} conversando", "ui.beforeunload": "O borrador perderase se sae de Mastodon.", "upload_area.title": "Arrastre e solte para subir", "upload_button.label": "Engadir medios (JPEG, PNG, GIF, WebM, MP4, MOV)", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index d670d8a55..1ef20f231 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "להשתיק את {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "להפסיק מעקב", "confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?", "embed.instructions": "ניתן להטמיע את ההודעה באתרך ע\"י העתקת הקוד שלהלן.", @@ -294,6 +296,7 @@ "status.open": "הרחבת הודעה", "status.pin": "לקבע באודות", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "הדהוד", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "הודהד על ידי {name}", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "הסרת השתקת שיחה", "status.unpin": "לשחרר מקיבוע באודות", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "ציר זמן בין-קהילתי", "tabs_bar.home": "בבית", "tabs_bar.local_timeline": "ציר זמן מקומי", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index b76b82e1b..c9b8e7f75 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Jesi li siguran da želiš utišati {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -294,6 +296,7 @@ "status.open": "Proširi ovaj status", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Podigni", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} je podigao", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Poništi utišavanje razgovora", "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federalni", "tabs_bar.home": "Dom", "tabs_bar.local_timeline": "Lokalno", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index 57a8b7cfa..66a1d4c09 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Biztos benne, hogy némítani szeretné {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Követés visszavonása", "confirmations.unfollow.message": "Biztos benne, hogy vissza szeretné vonni {name} követését?", "embed.instructions": "Ágyazza be ezen státuszt weboldalába az alábbi kód másolásával.", @@ -294,6 +296,7 @@ "status.open": "Státusz kinagyítása", "status.pin": "Kitűzés a profilra", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Reblog", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} reblogolta", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Beszélgetés némításának elvonása", "status.unpin": "Kitűzés eltávolítása a profilról", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federált", "tabs_bar.home": "Kezdőlap", "tabs_bar.local_timeline": "Local", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 077748a0a..e7d251a35 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Վստա՞հ ես, որ ուզում ես {name}֊ին լռեցնել։", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Ապահետեւել", "confirmations.unfollow.message": "Վստա՞հ ես, որ ուզում ես այլեւս չհետեւել {name}֊ին։", "embed.instructions": "Այս թութը քո կայքում ներդնելու համար կարող ես պատճենել ներքոհիշյալ կոդը։", @@ -294,6 +296,7 @@ "status.open": "Ընդարձակել այս թութը", "status.pin": "Ամրացնել անձնական էջում", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Տարածել", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} տարածել է", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Ապալռեցնել խոսակցությունը", "status.unpin": "Հանել անձնական էջից", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Դաշնային", "tabs_bar.home": "Հիմնական", "tabs_bar.local_timeline": "Տեղական", diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 3d80c0949..1c84ed061 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Apa anda yakin ingin membisukan {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Berhenti mengikuti", "confirmations.unfollow.message": "Apakah anda ingin berhenti mengikuti {name}?", "embed.instructions": "Sematkan status ini di website anda dengan menyalin kode di bawah ini.", @@ -294,6 +296,7 @@ "status.open": "Tampilkan status ini", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Boost", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "di-boost {name}", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Gabungan", "tabs_bar.home": "Beranda", "tabs_bar.local_timeline": "Lokal", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index 9059b3a2b..9963a52a5 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -294,6 +296,7 @@ "status.open": "Detaligar ca mesajo", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Repetar", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} repetita", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federata", "tabs_bar.home": "Hemo", "tabs_bar.local_timeline": "Lokala", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 5d8e3fe4a..711a360a9 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -15,7 +15,7 @@ "account.follows.empty": "Questo utente non segue ancora nessuno.", "account.follows_you": "Ti segue", "account.hide_reblogs": "Nascondi condivisioni da @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "La proprietà di questo link è stata controllata il {date}", "account.media": "Media", "account.mention": "Menziona @{name}", "account.moved_to": "{name} si è trasferito su:", @@ -91,6 +91,8 @@ "confirmations.mute.message": "Sei sicuro di voler silenziare {name}?", "confirmations.redraft.confirm": "Cancella e riscrivi", "confirmations.redraft.message": "Sei sicuro di voler cancellare questo stato e riscriverlo? Perderai tutte le risposte, condivisioni e preferiti.", + "confirmations.reply.confirm": "Rispondi", + "confirmations.reply.message": "Se rispondi ora, il messaggio che stai componendo sarà sovrascritto. Sei sicuro di voler continuare?", "confirmations.unfollow.confirm": "Smetti di seguire", "confirmations.unfollow.message": "Sei sicuro che non vuoi più seguire {name}?", "embed.instructions": "Inserisci questo status nel tuo sito copiando il codice qui sotto.", @@ -294,6 +296,7 @@ "status.open": "Espandi questo post", "status.pin": "Fissa in cima sul profilo", "status.pinned": "Toot fissato in cima", + "status.read_more": "Leggi altro", "status.reblog": "Condividi", "status.reblog_private": "Condividi con i destinatari iniziali", "status.reblogged_by": "{name} ha condiviso", @@ -311,6 +314,8 @@ "status.show_more_all": "Mostra di più per tutti", "status.unmute_conversation": "Annulla silenzia conversazione", "status.unpin": "Non fissare in cima al profilo", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federazione", "tabs_bar.home": "Home", "tabs_bar.local_timeline": "Locale", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index ae2c7e3c4..4dcc18518 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -15,7 +15,7 @@ "account.follows.empty": "まだ誰もフォローしていません。", "account.follows_you": "フォローされています", "account.hide_reblogs": "@{name}さんからのブーストを非表示", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "このリンクの所有権は{date}に確認されました", "account.media": "メディア", "account.mention": "@{name}さんにトゥート", "account.moved_to": "{name}さんは引っ越しました:", @@ -319,6 +319,8 @@ "status.show_more_all": "全て見る", "status.unmute_conversation": "会話のミュートを解除", "status.unpin": "プロフィールの固定表示を解除", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "連合", "tabs_bar.home": "ホーム", "tabs_bar.local_timeline": "ローカル", diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json index 21cd7d644..9d6d0d66d 100644 --- a/app/javascript/mastodon/locales/ka.json +++ b/app/javascript/mastodon/locales/ka.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "დარწმუნებული ხართ, გსურთ გააჩუმოთ {name}?", "confirmations.redraft.confirm": "გაუქმება და გადანაწილება", "confirmations.redraft.message": "დარწმუნებული ხართ, გსურთ გააუქმოთ ეს სტატუსი და გადაანაწილოთ? დაკარგავთ ყველა პასუხს, ბუსტს და მასზედ არსებულ ფავორიტს.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "ნუღარ მიჰყვები", "confirmations.unfollow.message": "დარწმუნებული ხართ, აღარ გსურთ მიჰყვებოდეთ {name}-ს?", "embed.instructions": "ეს სტატუსი ჩასვით თქვენს ვებ-საიტზე შემდეგი კოდის კოპირებით.", @@ -294,6 +296,7 @@ "status.open": "ამ სტატუსის გაფართოება", "status.pin": "აპინე პროფილზე", "status.pinned": "აპინული ტუტი", + "status.read_more": "Read more", "status.reblog": "ბუსტი", "status.reblog_private": "დაიბუსტოს საწყის აუდიტორიაზე", "status.reblogged_by": "{name} დაიბუსტა", @@ -311,6 +314,8 @@ "status.show_more_all": "აჩვენე მეტი ყველაზე", "status.unmute_conversation": "საუბარზე გაჩუმების მოშორება", "status.unpin": "პროფილიდან პინის მოშორება", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "ფედერალური", "tabs_bar.home": "სახლი", "tabs_bar.local_timeline": "ლოკალური", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 8e0f9f59f..c779017f3 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -15,7 +15,7 @@ "account.follows.empty": "이 유저는 아직 아무도 팔로우 하고 있지 않습니다.", "account.follows_you": "날 팔로우합니다", "account.hide_reblogs": "@{name}의 부스트를 숨기기", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "{date}에 이 링크의 소유권이 확인 됨", "account.media": "미디어", "account.mention": "@{name}에게 글쓰기", "account.moved_to": "{name}는 계정을 이동했습니다:", @@ -91,6 +91,8 @@ "confirmations.mute.message": "정말로 {name}를 뮤트하시겠습니까?", "confirmations.redraft.confirm": "삭제하고 다시 쓰기", "confirmations.redraft.message": "정말로 이 포스트를 삭제하고 다시 쓰시겠습니까? 해당 포스트에 대한 부스트와 즐겨찾기를 잃게 되고 원본에 대한 답장은 연결 되지 않습니다.", + "confirmations.reply.confirm": "답글", + "confirmations.reply.message": "답글을 달기 위해 현재 작성 중인 메시지가 덮어 씌워집니다. 진행하시겠습니까?", "confirmations.unfollow.confirm": "언팔로우", "confirmations.unfollow.message": "정말로 {name}를 언팔로우하시겠습니까?", "embed.instructions": "아래의 코드를 복사하여 대화를 원하는 곳으로 공유하세요.", @@ -294,6 +296,7 @@ "status.open": "상세 정보 표시", "status.pin": "고정", "status.pinned": "고정 된 툿", + "status.read_more": "더 보기", "status.reblog": "부스트", "status.reblog_private": "원래의 수신자들에게 부스트", "status.reblogged_by": "{name}님이 부스트 했습니다", @@ -311,6 +314,8 @@ "status.show_more_all": "모두 펼치기", "status.unmute_conversation": "이 대화의 뮤트 해제하기", "status.unpin": "고정 해제", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "연합", "tabs_bar.home": "홈", "tabs_bar.local_timeline": "로컬", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index e6b85692c..7a8ff6868 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -15,7 +15,7 @@ "account.follows.empty": "Deze gebruiker volgt nog niemand.", "account.follows_you": "Volgt jou", "account.hide_reblogs": "Verberg boosts van @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "Eigendom van deze link is gecontroleerd op {date}", "account.media": "Media", "account.mention": "Vermeld @{name}", "account.moved_to": "{name} is verhuisd naar:", @@ -91,6 +91,8 @@ "confirmations.mute.message": "Weet je het zeker dat je {name} wilt negeren?", "confirmations.redraft.confirm": "Verwijderen en herschrijven", "confirmations.redraft.message": "Weet je zeker dat je deze toot wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en reacties op de originele toot zitten niet meer aan de nieuwe toot vast.", + "confirmations.reply.confirm": "Reageren", + "confirmations.reply.message": "Door nu te reageren overschrijf je de toot die je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?", "confirmations.unfollow.confirm": "Ontvolgen", "confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?", "embed.instructions": "Embed deze toot op jouw website, door de onderstaande code te kopiëren.", @@ -294,6 +296,7 @@ "status.open": "Toot volledig tonen", "status.pin": "Aan profielpagina vastmaken", "status.pinned": "Vastgemaakte toot", + "status.read_more": "Meer lezen", "status.reblog": "Boost", "status.reblog_private": "Boost naar oorspronkelijke ontvangers", "status.reblogged_by": "{name} boostte", @@ -311,6 +314,8 @@ "status.show_more_all": "Alles meer tonen", "status.unmute_conversation": "Conversatie niet langer negeren", "status.unpin": "Van profielpagina losmaken", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Globaal", "tabs_bar.home": "Start", "tabs_bar.local_timeline": "Lokaal", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 4a8176e82..7c7e7600e 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Er du sikker på at du vil dempe {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Slutt å følge", "confirmations.unfollow.message": "Er du sikker på at du vil slutte å følge {name}?", "embed.instructions": "Kopier koden under for å bygge inn denne statusen på hjemmesiden din.", @@ -294,6 +296,7 @@ "status.open": "Utvid denne statusen", "status.pin": "Fest på profilen", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Fremhev", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "Fremhevd av {name}", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Ikke demp samtale", "status.unpin": "Angre festing på profilen", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Felles", "tabs_bar.home": "Hjem", "tabs_bar.local_timeline": "Lokal", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 64cbaef55..64ada60da 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -15,7 +15,7 @@ "account.follows.empty": "Aqueste utilizaire sèc pas degun pel moment.", "account.follows_you": "Vos sèc", "account.hide_reblogs": "Rescondre los partatges de @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "La proprietat d’aqueste ligam foguèt verificada lo {date}", "account.media": "Mèdias", "account.mention": "Mencionar @{name}", "account.moved_to": "{name} a mudat los catons a :", @@ -91,6 +91,8 @@ "confirmations.mute.message": "Volètz vertadièrament rescondre {name} ?", "confirmations.redraft.confirm": "Escafar & tornar formular", "confirmations.redraft.message": "Volètz vertadièrament escafar aqueste estatut e lo reformular ? Tote sos partiments e favorits seràn perduts, e sas responsas seràn orfanèlas.", + "confirmations.reply.confirm": "Respondre", + "confirmations.reply.message": "Respondre remplaçarà lo messatge que sètz a escriure. Volètz vertadièrament contunhar ?", "confirmations.unfollow.confirm": "Quitar de sègre", "confirmations.unfollow.message": "Volètz vertadièrament quitar de sègre {name} ?", "embed.instructions": "Embarcar aqueste estatut per lo far veire sus un site Internet en copiar lo còdi çai-jos.", @@ -294,6 +296,7 @@ "status.open": "Desplegar aqueste estatut", "status.pin": "Penjar al perfil", "status.pinned": "Tut penjat", + "status.read_more": "Ne legir mai", "status.reblog": "Partejar", "status.reblog_private": "Partejar a l’audiéncia d’origina", "status.reblogged_by": "{name} a partejat", @@ -311,6 +314,8 @@ "status.show_more_all": "Los desplegar totes", "status.unmute_conversation": "Tornar mostrar la conversacion", "status.unpin": "Tirar del perfil", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Flux public global", "tabs_bar.home": "Acuèlh", "tabs_bar.local_timeline": "Flux public local", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 76b340af3..3f596bc37 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -319,6 +319,8 @@ "status.show_more_all": "Rozwiń wszystkie", "status.unmute_conversation": "Cofnij wyciszenie konwersacji", "status.unpin": "Odepnij z profilu", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Globalne", "tabs_bar.home": "Strona główna", "tabs_bar.local_timeline": "Lokalne", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 3e5b5da8e..061d10f4d 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -10,12 +10,12 @@ "account.endorse": "Destacar no perfil", "account.follow": "Seguir", "account.followers": "Seguidores", - "account.followers.empty": "No one follows this user yet.", + "account.followers.empty": "Ninguém segue esse usuário no momento.", "account.follows": "Segue", - "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows.empty": "Esse usuário não segue ninguém no momento.", "account.follows_you": "Segue você", "account.hide_reblogs": "Esconder compartilhamentos de @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "A posse desse link foi verificada em {date}", "account.media": "Mídia", "account.mention": "Mencionar @{name}", "account.moved_to": "{name} se mudou para:", @@ -90,7 +90,9 @@ "confirmations.mute.confirm": "Silenciar", "confirmations.mute.message": "Você tem certeza de que quer silenciar {name}?", "confirmations.redraft.confirm": "Apagar & usar como rascunho", - "confirmations.redraft.message": "Você tem certeza que deseja apagar esse status e usá-lo como rascunho? Você vai perder todas as respostas, compartilhamentos e favoritos relacionados a ele.", + "confirmations.redraft.message": "Você tem certeza que deseja apagar esse status e usá-lo como rascunho? Seus compartilhamentos e favoritos serão perdidos e as respostas ao toot original ficarão desconectadas.", + "confirmations.reply.confirm": "Responder", + "confirmations.reply.message": "Responder agora vai sobrescrever a mensagem que você está compondo. Você tem certeza que quer continuar?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "Você tem certeza de que quer deixar de seguir {name}?", "embed.instructions": "Incorpore esta postagem em seu site copiando o código abaixo.", @@ -109,19 +111,19 @@ "emoji_button.search_results": "Resultados da busca", "emoji_button.symbols": "Símbolos", "emoji_button.travel": "Viagens & Lugares", - "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.blocks": "Você ainda não bloqueou nenhum usuário.", "empty_column.community": "A timeline local está vazia. Escreva algo publicamente para começar!", "empty_column.direct": "Você não tem nenhuma mensagem direta ainda. Quando você enviar ou receber uma, as mensagens aparecerão por aqui.", - "empty_column.domain_blocks": "There are no hidden domains yet.", - "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", - "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", - "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", + "empty_column.domain_blocks": "Ainda não há nenhum domínio escondido.", + "empty_column.favourited_statuses": "Você ainda não tem nenhum toot favorito. Quando você favoritar um toot, ele aparecerá aqui.", + "empty_column.favourites": "Ninguém favoritou esse toot até agora. Quando alguém favoritar, a pessoa aparecerá aqui.", + "empty_column.follow_requests": "Você não tem nenhum pedido de seguir por agora. Quando você receber um, ele aparecerá aqui.", "empty_column.hashtag": "Ainda não há qualquer conteúdo com essa hashtag.", "empty_column.home": "Você ainda não segue usuário algum. Visite a timeline {public} ou use o buscador para procurar e conhecer outros usuários.", "empty_column.home.public_timeline": "global", "empty_column.list": "Ainda não há nada nesta lista. Quando membros dessa lista fizerem novas postagens, elas aparecerão aqui.", - "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven't muted any users yet.", + "empty_column.lists": "Você ainda não tem nenhuma lista. Quando você criar uma, ela aparecerá aqui.", + "empty_column.mutes": "Você ainda não silenciou nenhum usuário.", "empty_column.notifications": "Você ainda não possui notificações. Interaja com outros usuários para começar a conversar.", "empty_column.public": "Não há nada aqui! Escreva algo publicamente ou siga manualmente usuários de outras instâncias", "follow_request.authorize": "Autorizar", @@ -138,32 +140,32 @@ "home.column_settings.show_reblogs": "Mostrar compartilhamentos", "home.column_settings.show_replies": "Mostrar as respostas", "keyboard_shortcuts.back": "para navegar de volta", - "keyboard_shortcuts.blocked": "to open blocked users list", + "keyboard_shortcuts.blocked": "para abrir a lista de usuários bloqueados", "keyboard_shortcuts.boost": "para compartilhar", "keyboard_shortcuts.column": "Focar um status em uma das colunas", "keyboard_shortcuts.compose": "para focar a área de redação", "keyboard_shortcuts.description": "Descrição", - "keyboard_shortcuts.direct": "to open direct messages column", + "keyboard_shortcuts.direct": "para abrir a coluna de mensagens diretas", "keyboard_shortcuts.down": "para mover para baixo na lista", "keyboard_shortcuts.enter": "para expandir um status", "keyboard_shortcuts.favourite": "para adicionar aos favoritos", - "keyboard_shortcuts.favourites": "to open favourites list", - "keyboard_shortcuts.federated": "to open federated timeline", + "keyboard_shortcuts.favourites": "para abrir a lista de favoritos", + "keyboard_shortcuts.federated": "para abrir a timeline global", "keyboard_shortcuts.heading": "Atalhos de teclado", - "keyboard_shortcuts.home": "to open home timeline", + "keyboard_shortcuts.home": "para abrir a página inicial", "keyboard_shortcuts.hotkey": "Atalho", "keyboard_shortcuts.legend": "para mostrar essa legenda", - "keyboard_shortcuts.local": "to open local timeline", + "keyboard_shortcuts.local": "para abrir a timeline local", "keyboard_shortcuts.mention": "para mencionar o autor", - "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.pinned": "to open pinned toots list", + "keyboard_shortcuts.muted": "para abrir a lista de usuários silenciados", + "keyboard_shortcuts.my_profile": "para abrir o seu perfil", + "keyboard_shortcuts.notifications": "para abrir a coluna de notificações", + "keyboard_shortcuts.pinned": "para abrir a lista de toots fixados", "keyboard_shortcuts.profile": "para abrir o perfil do autor", "keyboard_shortcuts.reply": "para responder", - "keyboard_shortcuts.requests": "to open follow requests list", + "keyboard_shortcuts.requests": "para abrir a lista de seguidores pendentes", "keyboard_shortcuts.search": "para focar a pesquisa", - "keyboard_shortcuts.start": "to open \"get started\" column", + "keyboard_shortcuts.start": "para abrir a coluna \"primeiros passos\"", "keyboard_shortcuts.toggle_hidden": "mostrar/esconder o texto com aviso de conteúdo", "keyboard_shortcuts.toot": "para compor um novo toot", "keyboard_shortcuts.unfocus": "para remover o foco da área de composição/pesquisa", @@ -187,7 +189,7 @@ "navigation_bar.apps": "Apps", "navigation_bar.blocks": "Usuários bloqueados", "navigation_bar.community_timeline": "Local", - "navigation_bar.compose": "Compose new toot", + "navigation_bar.compose": "Compor um novo toot", "navigation_bar.direct": "Mensagens diretas", "navigation_bar.discover": "Descobrir", "navigation_bar.domain_blocks": "Domínios escondidos", @@ -280,7 +282,7 @@ "status.cancel_reblog_private": "Desfazer compartilhamento", "status.cannot_reblog": "Esta postagem não pode ser compartilhada", "status.delete": "Excluir", - "status.detailed_status": "Detailed conversation view", + "status.detailed_status": "Visão detalhada da conversa", "status.direct": "Enviar mensagem direta a @{name}", "status.embed": "Incorporar", "status.favourite": "Adicionar aos favoritos", @@ -294,10 +296,11 @@ "status.open": "Expandir", "status.pin": "Fixar no perfil", "status.pinned": "Toot fixado", + "status.read_more": "Ler mais", "status.reblog": "Compartilhar", "status.reblog_private": "Compartilhar com a audiência original", "status.reblogged_by": "{name} compartilhou", - "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", + "status.reblogs.empty": "Ninguém compartilhou esse toot até agora. Quando alguém o fizer, eles aparecerão aqui.", "status.redraft": "Apagar & usar como rascunho", "status.reply": "Responder", "status.replyAll": "Responder à sequência", @@ -311,6 +314,8 @@ "status.show_more_all": "Mostrar mais para todas as mensagens", "status.unmute_conversation": "Desativar silêncio desta conversa", "status.unpin": "Desafixar do perfil", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Global", "tabs_bar.home": "Página inicial", "tabs_bar.local_timeline": "Local", @@ -319,7 +324,7 @@ "trends.count_by_accounts": "{count} {rawCount, plural, one {pessoa} other {pessoas}} falando sobre", "ui.beforeunload": "Seu rascunho será perdido se você sair do Mastodon.", "upload_area.title": "Arraste e solte para enviar", - "upload_button.label": "Adicionar mídia", + "upload_button.label": "Adicionar mídia (JPEG, PNG, GIF, WebM, MP4, MOV)", "upload_form.description": "Descreva a imagem para deficientes visuais", "upload_form.focus": "Ajustar foco", "upload_form.undo": "Remover", diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json index e9d91f631..adb10dd07 100644 --- a/app/javascript/mastodon/locales/pt.json +++ b/app/javascript/mastodon/locales/pt.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "De certeza que queres silenciar {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Deixar de seguir", "confirmations.unfollow.message": "De certeza que queres deixar de seguir {name}?", "embed.instructions": "Publicar este post num outro site copiando o código abaixo.", @@ -294,6 +296,7 @@ "status.open": "Expandir", "status.pin": "Fixar no perfil", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Partilhar", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} partilhou", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Deixar de silenciar esta conversa", "status.unpin": "Não fixar no perfil", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Global", "tabs_bar.home": "Home", "tabs_bar.local_timeline": "Local", diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json index 1d6e73bfd..2a6479b91 100644 --- a/app/javascript/mastodon/locales/ro.json +++ b/app/javascript/mastodon/locales/ro.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Ești sigur că vrei să oprești {name}?", "confirmations.redraft.confirm": "Șterge și salvează ca ciornă", "confirmations.redraft.message": "Ești sigur că vrei să faci asta? Tot ce ține de această postare, inclusiv răspunsurile vor fi deconectate.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Nu mai urmări", "confirmations.unfollow.message": "Ești sigur că nu mai vrei să îl urmărești pe {name}?", "embed.instructions": "Inserează această postare pe site-ul tău adăugând codul de mai jos.", @@ -294,6 +296,7 @@ "status.open": "Extinde acest status", "status.pin": "Fixează pe profil", "status.pinned": "Postare fixată", + "status.read_more": "Read more", "status.reblog": "Redistribuie", "status.reblog_private": "Redistribuie către audiența originală", "status.reblogged_by": "{name} redistribuit", @@ -311,6 +314,8 @@ "status.show_more_all": "Arată mai mult pentru toți", "status.unmute_conversation": "Repornește conversația", "status.unpin": "Eliberează din profil", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Global", "tabs_bar.home": "Acasă", "tabs_bar.local_timeline": "Local", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 15fbfac3f..cd65adcb5 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Вы уверены, что хотите заглушить {name}?", "confirmations.redraft.confirm": "Удалить и исправить", "confirmations.redraft.message": "Вы уверены, что хотите удалить этот статус и превратить в черновик? Вы потеряете все ответы, продвижения и отметки 'нравится' к нему.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Отписаться", "confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?", "embed.instructions": "Встройте этот статус на Вашем сайте, скопировав код внизу.", @@ -294,6 +296,7 @@ "status.open": "Развернуть статус", "status.pin": "Закрепить в профиле", "status.pinned": "Закреплённый статус", + "status.read_more": "Read more", "status.reblog": "Продвинуть", "status.reblog_private": "Продвинуть для своей аудитории", "status.reblogged_by": "{name} продвинул(а)", @@ -311,6 +314,8 @@ "status.show_more_all": "Развернуть для всех", "status.unmute_conversation": "Снять глушение с треда", "status.unpin": "Открепить от профиля", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Глобальная", "tabs_bar.home": "Главная", "tabs_bar.local_timeline": "Локальная", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index 11a6b76c1..cca2e3c62 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Naozaj chcete ignorovať {name}?", "confirmations.redraft.confirm": "Vyčistiť a prepísať", "confirmations.redraft.message": "Si si istý/á, že chceš premazať a prepísať tento príspevok? Jeho nadobudnuté odpovede, povýšenia a obľúbenia, ale i odpovede na pôvodný príspevok budú odlúčené.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Nesledovať", "confirmations.unfollow.message": "Naozaj chcete prestať sledovať {name}?", "embed.instructions": "Umiestni kód uvedený nižšie pre pridanie tohto statusu na tvoju web stránku.", @@ -294,6 +296,7 @@ "status.open": "Otvoriť tento status", "status.pin": "Pripni na profil", "status.pinned": "Pripnutý príspevok", + "status.read_more": "Read more", "status.reblog": "Povýšiť", "status.reblog_private": "Povýš k pôvodnému publiku", "status.reblogged_by": "{name} povýšil/a", @@ -311,6 +314,8 @@ "status.show_more_all": "Všetkým ukáž viac", "status.unmute_conversation": "Prestať ignorovať konverzáciu", "status.unpin": "Odopnúť z profilu", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federovaná", "tabs_bar.home": "Domov", "tabs_bar.local_timeline": "Lokálna", diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json index f715abe85..175a34efd 100644 --- a/app/javascript/mastodon/locales/sl.json +++ b/app/javascript/mastodon/locales/sl.json @@ -7,15 +7,15 @@ "account.disclaimer_full": "Spodnje informacije lahko nepopolno prikazujejo profil uporabnika.", "account.domain_blocked": "Skrita domena", "account.edit_profile": "Uredi profil", - "account.endorse": "Feature on profile", + "account.endorse": "Zmožnost profila", "account.follow": "Sledi", "account.followers": "Sledilci", - "account.followers.empty": "No one follows this user yet.", + "account.followers.empty": "Nihče ne sledi tega uporabnika.", "account.follows": "Sledi", - "account.follows.empty": "This user doesn't follow anyone yet.", + "account.follows.empty": "Ta uporabnik še ne sledi nikomur.", "account.follows_you": "Ti sledi", "account.hide_reblogs": "Skrij napuhke od @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", + "account.link_verified_on": "Lastništvo te povezave je bilo preverjeno {date}", "account.media": "Mediji", "account.mention": "Omeni @{name}", "account.moved_to": "{name} se je premaknil na:", @@ -64,9 +64,9 @@ "column_header.show_settings": "Prikaži nastavitve", "column_header.unpin": "Odpni", "column_subheading.settings": "Nastavitve", - "community.column_settings.media_only": "Media Only", + "community.column_settings.media_only": "Samo mediji", "compose_form.direct_message_warning": "Ta tut bo viden le vsem omenjenim uporabnikom.", - "compose_form.direct_message_warning_learn_more": "Learn more", + "compose_form.direct_message_warning_learn_more": "Nauči se več", "compose_form.hashtag_warning": "Ta tut ne bo naveden pod nobenim hashtagom, ker ni dodan hashtag. Samo javne tute lahko iščete pod hashtagom.", "compose_form.lock_disclaimer": "Vaš račun ni {locked}. Vsakdo vam lahko sledi in si ogleda objave, ki so namenjene samo sledilcem.", "compose_form.lock_disclaimer.lock": "zaklenjen", @@ -89,8 +89,10 @@ "confirmations.domain_block.message": "Ali ste res, res prepričani, da želite blokirati celotno {domain}? V večini primerov je nekaj ciljnih blokiranj ali utišanj dovolj in boljše.", "confirmations.mute.confirm": "Utišanje", "confirmations.mute.message": "Ali ste prepričani, da želite utišati {name}?", - "confirmations.redraft.confirm": "Delete & redraft", + "confirmations.redraft.confirm": "Izbriši in preoblikuj", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Odgovarjanje bo prepisalo sporočilo, ki ga trenutno sestavljate. Ali ste prepričani, da želite nadaljevati?", "confirmations.unfollow.confirm": "Prenehaj slediti", "confirmations.unfollow.message": "Ali ste prepričani, da ne želite več slediti {name}?", "embed.instructions": "Vstavi ta status na svojo spletno stran tako, da kopirate spodnjo kodo.", @@ -109,10 +111,10 @@ "emoji_button.search_results": "Rezultati iskanja", "emoji_button.symbols": "Simboli", "emoji_button.travel": "Potovanja in Kraji", - "empty_column.blocks": "You haven't blocked any users yet.", + "empty_column.blocks": "Niste še blokirali nobenega uporabnika.", "empty_column.community": "Lokalna časovnica je prazna. Napišite nekaj javnega, da se bo žoga zakotalila!", "empty_column.direct": "Nimate še nobenih neposrednih sporočil. Ko ga pošljete ali prejmete, se prikaže tukaj.", - "empty_column.domain_blocks": "There are no hidden domains yet.", + "empty_column.domain_blocks": "Še vedno ni skritih domen.", "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.", "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.", "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.", @@ -294,6 +296,7 @@ "status.open": "Expand this status", "status.pin": "Pin on profile", "status.pinned": "Pripeti tut", + "status.read_more": "Read more", "status.reblog": "Suni", "status.reblog_private": "Suni v prvotno občinstvo", "status.reblogged_by": "{name} sunjen", @@ -311,6 +314,8 @@ "status.show_more_all": "Prikaži več za vse", "status.unmute_conversation": "Odtišaj pogovor", "status.unpin": "Odpni iz profila", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Združeno", "tabs_bar.home": "Domov", "tabs_bar.local_timeline": "Lokalno", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 7131d3044..6020512c4 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Da li stvarno želite da ućutkate korisnika {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Otprati", "confirmations.unfollow.message": "Da li ste sigurni da želite da otpratite korisnika {name}?", "embed.instructions": "Ugradi ovaj status na Vaš veb sajt kopiranjem koda ispod.", @@ -294,6 +296,7 @@ "status.open": "Proširi ovaj status", "status.pin": "Prikači na profil", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Podrži", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} podržao(la)", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Uključi prepisku", "status.unpin": "Otkači sa profila", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federisano", "tabs_bar.home": "Početna", "tabs_bar.local_timeline": "Lokalno", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index 806c0acb3..41d9e12b0 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Да ли стварно желите да ућуткате корисника {name}?", "confirmations.redraft.confirm": "Избриши и преправи", "confirmations.redraft.message": "Да ли сте сигурни да желите да избришете овај статус и да га преправите? Сва стављања у омиљене трубе, као и подршке ће бити изгубљене, а одговори на оригинални пост ће бити поништени.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Отпрати", "confirmations.unfollow.message": "Да ли сте сигурни да желите да отпратите корисника {name}?", "embed.instructions": "Угради овај статус на Ваш веб сајт копирањем кода испод.", @@ -294,6 +296,7 @@ "status.open": "Прошири овај статус", "status.pin": "Закачи на профил", "status.pinned": "Закачена труба", + "status.read_more": "Read more", "status.reblog": "Подржи", "status.reblog_private": "Подржи да види првобитна публика", "status.reblogged_by": "{name} подржао/ла", @@ -311,6 +314,8 @@ "status.show_more_all": "Прикажи више за све", "status.unmute_conversation": "Укључи преписку", "status.unpin": "Откачи са профила", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Федерисано", "tabs_bar.home": "Почетна", "tabs_bar.local_timeline": "Локално", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index f9129d368..dbe9f709a 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Är du säker du vill tysta ner {name}?", "confirmations.redraft.confirm": "Radera och gör om", "confirmations.redraft.message": "Är du säker på att du vill radera meddelandet och göra om det? Du kommer förlora alla svar, knuffar och favoriter som hänvisar till meddelandet.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Sluta följa", "confirmations.unfollow.message": "Är du säker på att du vill sluta följa {name}?", "embed.instructions": "Bädda in den här statusen på din webbplats genom att kopiera koden nedan.", @@ -294,6 +296,7 @@ "status.open": "Utvidga denna status", "status.pin": "Fäst i profil", "status.pinned": "Fäst toot", + "status.read_more": "Read more", "status.reblog": "Knuff", "status.reblog_private": "Knuffa till de ursprungliga åhörarna", "status.reblogged_by": "{name} knuffade", @@ -311,6 +314,8 @@ "status.show_more_all": "Visa mer för alla", "status.unmute_conversation": "Öppna konversation", "status.unpin": "Ångra fäst i profil", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Förenad", "tabs_bar.home": "Hem", "tabs_bar.local_timeline": "Lokal", diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json index 427e9a3dc..803e004cc 100644 --- a/app/javascript/mastodon/locales/ta.json +++ b/app/javascript/mastodon/locales/ta.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -294,6 +296,7 @@ "status.open": "Expand this status", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Boost", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} boosted", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federated", "tabs_bar.home": "Home", "tabs_bar.local_timeline": "Local", diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json index bc13b02f1..af036e300 100644 --- a/app/javascript/mastodon/locales/te.json +++ b/app/javascript/mastodon/locales/te.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "{name}ను మీరు ఖచ్చితంగా మ్యూట్ చేయాలనుకుంటున్నారా?", "confirmations.redraft.confirm": "తొలగించు & తిరగరాయు", "confirmations.redraft.message": "మీరు ఖచ్చితంగా ఈ స్టేటస్ ని తొలగించి తిరగరాయాలనుకుంటున్నారా? ఈ స్టేటస్ యొక్క బూస్ట్ లు మరియు ఇష్టాలు పోతాయి,మరియు ప్రత్యుత్తరాలు అనాధలు అయిపోతాయి.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "అనుసరించవద్దు", "confirmations.unfollow.message": "{name}ను మీరు ఖచ్చితంగా అనుసరించవద్దనుకుంటున్నారా?", "embed.instructions": "దిగువ కోడ్ను కాపీ చేయడం ద్వారా మీ వెబ్సైట్లో ఈ స్టేటస్ ని పొందుపరచండి.", @@ -294,6 +296,7 @@ "status.open": "ఈ స్టేటస్ ను విస్తరించు", "status.pin": "ప్రొఫైల్లో అతికించు", "status.pinned": "అతికించిన టూట్", + "status.read_more": "Read more", "status.reblog": "బూస్ట్", "status.reblog_private": "అసలు ప్రేక్షకులకు బూస్ట్ చేయి", "status.reblogged_by": "{name} బూస్ట్ చేసారు", @@ -311,6 +314,8 @@ "status.show_more_all": "అన్నిటికీ ఇంకా చూపించు", "status.unmute_conversation": "సంభాషణను అన్మ్యూట్ చేయి", "status.unpin": "ప్రొఫైల్ నుండి పీకివేయు", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "సమాఖ్య", "tabs_bar.home": "హోమ్", "tabs_bar.local_timeline": "స్థానిక", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 3114bca60..fe36a966c 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Are you sure you want to mute {name}?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -294,6 +296,7 @@ "status.open": "Expand this status", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Boost", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} boosted", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federated", "tabs_bar.home": "Home", "tabs_bar.local_timeline": "Local", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index a661b022b..323617f1d 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "{name} kullanıcısını sessize almak istiyor musunuz?", "confirmations.redraft.confirm": "Delete & redraft", "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Unfollow", "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", "embed.instructions": "Embed this status on your website by copying the code below.", @@ -294,6 +296,7 @@ "status.open": "Bu gönderiyi genişlet", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Boost'la", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} boost etti", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Unmute conversation", "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Federe", "tabs_bar.home": "Ana sayfa", "tabs_bar.local_timeline": "Yerel", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 116dfc489..cdc13c574 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "Ви впевнені, що хочете заглушити {name}?", "confirmations.redraft.confirm": "Видалити і перестворити", "confirmations.redraft.message": "Ви впевнені, що хочете видалити допис і перестворити його? Ви втратите всі відповіді, передмухи та вподобайки допису.", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "Відписатися", "confirmations.unfollow.message": "Ви впевнені, що хочете відписатися від {name}?", "embed.instructions": "Інтегруйте цей статус на вашому вебсайті, скопіювавши код нижче.", @@ -294,6 +296,7 @@ "status.open": "Розгорнути допис", "status.pin": "Pin on profile", "status.pinned": "Pinned toot", + "status.read_more": "Read more", "status.reblog": "Передмухнути", "status.reblog_private": "Boost to original audience", "status.reblogged_by": "{name} передмухнув(-ла)", @@ -311,6 +314,8 @@ "status.show_more_all": "Show more for all", "status.unmute_conversation": "Зняти глушення з діалогу", "status.unpin": "Unpin from profile", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "Глобальна", "tabs_bar.home": "Головна", "tabs_bar.local_timeline": "Локальна", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index 69ecd9431..9fee25e15 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "你确定要隐藏 {name} 吗?", "confirmations.redraft.confirm": "删除并重新编辑", "confirmations.redraft.message": "你确定要删除这条嘟文并重新编辑它吗?所有相关的回复、转嘟和收藏都会被清除。", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "取消关注", "confirmations.unfollow.message": "你确定要取消关注 {name} 吗?", "embed.instructions": "要在你的网站上嵌入这条嘟文,请复制以下代码。", @@ -294,6 +296,7 @@ "status.open": "展开嘟文", "status.pin": "在个人资料页面置顶", "status.pinned": "置顶嘟文", + "status.read_more": "Read more", "status.reblog": "转嘟", "status.reblog_private": "转嘟给原有关注者", "status.reblogged_by": "{name} 转嘟了", @@ -311,6 +314,8 @@ "status.show_more_all": "显示所有内容", "status.unmute_conversation": "不再隐藏此对话", "status.unpin": "在个人资料页面取消置顶", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "跨站", "tabs_bar.home": "主页", "tabs_bar.local_timeline": "本站", diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index fc5376699..26eba48f8 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "你確定要將{name}靜音嗎?", "confirmations.redraft.confirm": "刪除並編輯", "confirmations.redraft.message": "你確定要刪除並重新編輯嗎?所有相關的回覆、轉推與最愛都會被刪除。", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "取消關注", "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?", "embed.instructions": "要內嵌此文章,請將以下代碼貼進你的網站。", @@ -294,6 +296,7 @@ "status.open": "展開文章", "status.pin": "置頂到資料頁", "status.pinned": "置頂文章", + "status.read_more": "Read more", "status.reblog": "轉推", "status.reblog_private": "轉推到原讀者", "status.reblogged_by": "{name} 轉推", @@ -311,6 +314,8 @@ "status.show_more_all": "顯示更多這類文章", "status.unmute_conversation": "解禁對話", "status.unpin": "解除置頂", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "跨站", "tabs_bar.home": "主頁", "tabs_bar.local_timeline": "本站", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 458af6b95..6d4a9a0bb 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -91,6 +91,8 @@ "confirmations.mute.message": "你確定要消音 {name} ?", "confirmations.redraft.confirm": "刪除 & 編輯", "confirmations.redraft.message": "你確定要刪除這條嘟文並重新編輯它嗎?所有相關的轉嘟與最愛都會被刪除,而對原始嘟文的回覆將會變成孤兒。", + "confirmations.reply.confirm": "Reply", + "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", "confirmations.unfollow.confirm": "取消關注", "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?", "embed.instructions": "要內嵌此嘟文,請將以下代碼貼進你的網站。", @@ -294,6 +296,7 @@ "status.open": "展開嘟文", "status.pin": "置頂到個人資訊頁", "status.pinned": "置頂嘟文", + "status.read_more": "Read more", "status.reblog": "轉嘟", "status.reblog_private": "轉嘟給原有關注者", "status.reblogged_by": "{name} 轉嘟了", @@ -311,6 +314,8 @@ "status.show_more_all": "顯示更多這類嘟文", "status.unmute_conversation": "解除此對話的靜音", "status.unpin": "解除置頂", + "suggestions.dismiss": "Dismiss suggestion", + "suggestions.header": "You might be interested in…", "tabs_bar.federated_timeline": "其他站點", "tabs_bar.home": "主頁", "tabs_bar.local_timeline": "本站", diff --git a/app/javascript/mastodon/reducers/cards.js b/app/javascript/mastodon/reducers/cards.js deleted file mode 100644 index 4d86b0d7e..000000000 --- a/app/javascript/mastodon/reducers/cards.js +++ /dev/null @@ -1,14 +0,0 @@ -import { STATUS_CARD_FETCH_SUCCESS } from '../actions/cards'; - -import { Map as ImmutableMap, fromJS } from 'immutable'; - -const initialState = ImmutableMap(); - -export default function cards(state = initialState, action) { - switch(action.type) { - case STATUS_CARD_FETCH_SUCCESS: - return state.set(action.id, fromJS(action.card)); - default: - return state; - } -}; diff --git a/app/javascript/mastodon/reducers/conversations.js b/app/javascript/mastodon/reducers/conversations.js index f339abf56..ea39fccee 100644 --- a/app/javascript/mastodon/reducers/conversations.js +++ b/app/javascript/mastodon/reducers/conversations.js @@ -1,9 +1,12 @@ import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; import { + CONVERSATIONS_MOUNT, + CONVERSATIONS_UNMOUNT, CONVERSATIONS_FETCH_REQUEST, CONVERSATIONS_FETCH_SUCCESS, CONVERSATIONS_FETCH_FAIL, CONVERSATIONS_UPDATE, + CONVERSATIONS_READ, } from '../actions/conversations'; import compareId from '../compare_id'; @@ -11,10 +14,12 @@ const initialState = ImmutableMap({ items: ImmutableList(), isLoading: false, hasMore: true, + mounted: false, }); const conversationToMap = item => ImmutableMap({ id: item.id, + unread: item.unread, accounts: ImmutableList(item.accounts.map(a => a.id)), last_status: item.last_status.id, }); @@ -73,6 +78,18 @@ export default function conversations(state = initialState, action) { return expandNormalizedConversations(state, action.conversations, action.next); case CONVERSATIONS_UPDATE: return updateConversation(state, action.conversation); + case CONVERSATIONS_MOUNT: + return state.update('mounted', count => count + 1); + case CONVERSATIONS_UNMOUNT: + return state.update('mounted', count => count - 1); + case CONVERSATIONS_READ: + return state.update('items', list => list.map(item => { + if (item.get('id') === action.id) { + return item.set('unread', false); + } + + return item; + })); default: return state; } diff --git a/app/javascript/mastodon/reducers/index.js b/app/javascript/mastodon/reducers/index.js index d3b98d4f6..2c98af1db 100644 --- a/app/javascript/mastodon/reducers/index.js +++ b/app/javascript/mastodon/reducers/index.js @@ -14,7 +14,6 @@ import relationships from './relationships'; import settings from './settings'; import push_notifications from './push_notifications'; import status_lists from './status_lists'; -import cards from './cards'; import mutes from './mutes'; import reports from './reports'; import contexts from './contexts'; @@ -28,6 +27,7 @@ import lists from './lists'; import listEditor from './list_editor'; import filters from './filters'; import conversations from './conversations'; +import suggestions from './suggestions'; const reducers = { dropdown_menu, @@ -45,7 +45,6 @@ const reducers = { relationships, settings, push_notifications, - cards, mutes, reports, contexts, @@ -59,6 +58,7 @@ const reducers = { listEditor, filters, conversations, + suggestions, }; export default combineReducers(reducers); diff --git a/app/javascript/mastodon/reducers/suggestions.js b/app/javascript/mastodon/reducers/suggestions.js new file mode 100644 index 000000000..9f4b89d58 --- /dev/null +++ b/app/javascript/mastodon/reducers/suggestions.js @@ -0,0 +1,30 @@ +import { + SUGGESTIONS_FETCH_REQUEST, + SUGGESTIONS_FETCH_SUCCESS, + SUGGESTIONS_FETCH_FAIL, + SUGGESTIONS_DISMISS, +} from '../actions/suggestions'; +import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable'; + +const initialState = ImmutableMap({ + items: ImmutableList(), + isLoading: false, +}); + +export default function suggestionsReducer(state = initialState, action) { + switch(action.type) { + case SUGGESTIONS_FETCH_REQUEST: + return state.set('isLoading', true); + case SUGGESTIONS_FETCH_SUCCESS: + return state.withMutations(map => { + map.set('items', fromJS(action.accounts.map(x => x.id))); + map.set('isLoading', false); + }); + case SUGGESTIONS_FETCH_FAIL: + return state.set('isLoading', false); + case SUGGESTIONS_DISMISS: + return state.update('items', list => list.filterNot(id => id === action.id)); + default: + return state; + } +}; diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js index a62974ec0..9cf783c84 100644 --- a/app/javascript/packs/public.js +++ b/app/javascript/packs/public.js @@ -5,7 +5,6 @@ import { start } from '../mastodon/common'; start(); function main() { - const { length } = require('stringz'); const IntlMessageFormat = require('intl-messageformat').default; const { timeAgoString } = require('../mastodon/components/relative_timestamp'); const { delegate } = require('rails-ujs'); diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss index ac161a004..78bc2dbb6 100644 --- a/app/javascript/styles/mastodon-light/diff.scss +++ b/app/javascript/styles/mastodon-light/diff.scss @@ -286,20 +286,6 @@ } } -.flash-message { - box-shadow: none; - - &.notice { - background: rgba($success-green, 0.5); - color: lighten($success-green, 12%); - } - - &.alert { - background: rgba($error-red, 0.5); - color: lighten($error-red, 12%); - } -} - .simple_form, .table-form { .warning { diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 6aabf5777..f778ba06b 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -801,7 +801,7 @@ padding: 8px 10px; padding-left: 68px; position: relative; - min-height: 48px; + min-height: 54px; border-bottom: 1px solid lighten($ui-base-color, 8%); cursor: default; @@ -823,7 +823,7 @@ margin-top: 8px; } - &.status-direct { + &.status-direct:not(.read) { background: lighten($ui-base-color, 8%); border-bottom-color: lighten($ui-base-color, 12%); } @@ -1133,6 +1133,18 @@ vertical-align: middle; margin-right: 5px; } + + &-composite { + @include avatar-radius(); + overflow: hidden; + + & > div { + @include avatar-radius(); + float: left; + position: relative; + box-sizing: border-box; + } + } } a .account__avatar { @@ -1657,6 +1669,7 @@ a.account__display-name { padding: 4px 0; border-radius: 4px; box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4); + z-index: 9999; ul { list-style: none; @@ -2548,6 +2561,9 @@ a.status-card { display: block; margin-top: 5px; font-size: 13px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .status-card__image { @@ -2572,6 +2588,31 @@ a.status-card { } } +.status-card.compact { + border-color: lighten($ui-base-color, 4%); + + &.interactive { + border: 0; + } + + .status-card__content { + padding: 8px; + padding-top: 10px; + } + + .status-card__title { + white-space: nowrap; + } + + .status-card__image { + flex: 0 0 60px; + } +} + +a.status-card.compact:hover { + background-color: lighten($ui-base-color, 4%); +} + .status-card__image-image { border-radius: 4px 0 0 4px; display: block; @@ -5497,44 +5538,3 @@ noscript { } } } - -.conversation { - padding: 14px 10px; - border-bottom: 1px solid lighten($ui-base-color, 8%); - cursor: pointer; - - &__header { - display: flex; - margin-bottom: 15px; - } - - &__avatars { - overflow: hidden; - flex: 1 1 auto; - - & > div { - display: flex; - flex-wrap: none; - width: 900px; - } - - .account__avatar { - margin-right: 10px; - } - } - - &__time { - flex: 0 0 auto; - font-size: 14px; - color: $darker-text-color; - text-align: right; - - .display-name { - color: $secondary-text-color; - } - } - - .attachment-list.compact { - margin-top: 15px; - } -} diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss index be2bf7cea..8c4c934ea 100644 --- a/app/javascript/styles/mastodon/forms.scss +++ b/app/javascript/styles/mastodon/forms.scss @@ -427,7 +427,7 @@ code { &__append { position: absolute; - right: 1px; + right: 3px; top: 1px; padding: 10px; padding-bottom: 9px; @@ -460,9 +460,20 @@ code { border-radius: 4px; padding: 15px 10px; margin-bottom: 30px; - box-shadow: 0 0 5px rgba($base-shadow-color, 0.2); text-align: center; + &.notice { + border: 1px solid rgba($valid-value-color, 0.5); + background: rgba($valid-value-color, 0.25); + color: $valid-value-color; + } + + &.alert { + border: 1px solid rgba($error-value-color, 0.5); + background: rgba($error-value-color, 0.25); + color: $error-value-color; + } + p { margin-bottom: 15px; } @@ -551,12 +562,12 @@ code { .oauth-prompt, .follow-prompt { margin-bottom: 30px; - text-align: center; color: $darker-text-color; h2 { font-size: 16px; margin-bottom: 30px; + text-align: center; } strong { diff --git a/app/javascript/styles/mastodon/rtl.scss b/app/javascript/styles/mastodon/rtl.scss index 9644f8e02..176fb5ce0 100644 --- a/app/javascript/styles/mastodon/rtl.scss +++ b/app/javascript/styles/mastodon/rtl.scss @@ -73,7 +73,7 @@ body.rtl { float: left; } - .setting-toggle { + .setting-toggle__label { margin-left: 0; margin-right: 8px; } @@ -130,17 +130,6 @@ body.rtl { float: left; } - .activity-stream .detailed-status.light .detailed-status__display-name > div { - float: right; - margin-right: 0; - margin-left: 10px; - } - - .activity-stream .detailed-status.light .detailed-status__meta span > span { - margin-left: 0; - margin-right: 6px; - } - .status__action-bar { &__counter { @@ -174,6 +163,10 @@ body.rtl { margin-right: 0; } + .detailed-status__display-name .display-name { + text-align: right; + } + .detailed-status__display-avatar { margin-right: 0; margin-left: 10px; @@ -196,6 +189,10 @@ body.rtl { right: -2.14285714em; } + .admin-wrapper { + direction: rtl; + } + .admin-wrapper .sidebar ul a i.fa, a.table-action-link i.fa { margin-right: 0; @@ -214,22 +211,47 @@ body.rtl { right: 0; } + .simple_form .input.radio_buttons .radio { + left: auto; + right: 0; + } + + .simple_form .input.radio_buttons .radio > label { + padding-right: 28px; + padding-left: 0; + } + .simple_form .input-with-append .input input { padding-left: 142px; padding-right: 0; } - .simple_form .input-with-append .append { + .simple_form .input.boolean label.checkbox { + left: auto; + right: 0; + } + + .simple_form .input.boolean .label_input, + .simple_form .input.boolean .hint { + padding-left: 0; + padding-right: 28px; + } + + .simple_form .label_input__append { right: auto; - left: 0; + left: 3px; &::after { right: auto; left: 0; - background-image: linear-gradient(to left, rgba($ui-base-color, 0), $ui-base-color); + background-image: linear-gradient(to left, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%)); } } + .simple_form select { + background: darken($ui-base-color, 10%) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>") no-repeat left 8px center / auto 16px; + } + .table th, .table td { text-align: right; @@ -245,6 +267,10 @@ body.rtl { left: auto; } + .landing-page__call-to-action .row__information-board { + direction: rtl; + } + .landing-page .header .hero .floats .float-1 { left: -120px; right: auto; @@ -308,4 +334,40 @@ body.rtl { margin-right: 20px; } } + + .landing-page__information { + .account__display-name { + margin-right: 0; + margin-left: 5px; + } + + .account__avatar-wrapper { + margin-left: 12px; + margin-right: 0; + } + } + + .card__bar .display-name { + margin-left: 0; + margin-right: 15px; + text-align: right; + } + + .fa-chevron-left::before { + content: "\F054"; + } + + .fa-chevron-right::before { + content: "\F053"; + } + + .column-back-button__icon { + margin-right: 0; + margin-left: 5px; + } + + .column-header__setting-arrows .column-header__setting-btn:last-child { + padding-left: 0; + padding-right: 10px; + } } diff --git a/app/javascript/styles/mastodon/stream_entries.scss b/app/javascript/styles/mastodon/stream_entries.scss index 14306c8bd..d8bd30377 100644 --- a/app/javascript/styles/mastodon/stream_entries.scss +++ b/app/javascript/styles/mastodon/stream_entries.scss @@ -3,7 +3,6 @@ border-radius: 4px; overflow: hidden; margin-bottom: 10px; - text-align: left; @media screen and (max-width: $no-gap-breakpoint) { margin-bottom: 0; diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb index 3a39b723e..999954cb5 100644 --- a/app/lib/activitypub/activity.rb +++ b/app/lib/activitypub/activity.rb @@ -96,7 +96,7 @@ class ActivityPub::Activity end def notify_about_mentions(status) - status.mentions.includes(:account).each do |mention| + status.active_mentions.includes(:account).each do |mention| next unless mention.account.local? && audience_includes?(mention.account) NotifyService.new.call(mention.account, mention) end diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 978289788..baa05e14c 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -2,7 +2,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity SUPPORTED_TYPES = %w(Note).freeze - CONVERTED_TYPES = %w(Image Video Article).freeze + CONVERTED_TYPES = %w(Image Video Article Page).freeze def perform return if delete_arrived_first?(object_uri) || unsupported_object_type? || invalid_origin?(@object['id']) @@ -22,12 +22,17 @@ class ActivityPub::Activity::Create < ActivityPub::Activity private def process_status - status_params = process_status_params + @tags = [] + @mentions = [] + @params = {} - ApplicationRecord.transaction do - @status = Status.create!(status_params) + process_status_params + process_tags + process_audience - process_tags(@status) + ApplicationRecord.transaction do + @status = Status.create!(@params) + attach_tags(@status) end resolve_thread(@status) @@ -42,62 +47,109 @@ class ActivityPub::Activity::Create < ActivityPub::Activity end def process_status_params - { - uri: @object['id'], - url: object_url || @object['id'], - account: @account, - text: text_from_content || '', - language: detected_language, - spoiler_text: text_from_summary || '', - created_at: @object['published'], - override_timestamps: @options[:override_timestamps], - reply: @object['inReplyTo'].present?, - sensitive: @object['sensitive'] || false, - visibility: visibility_from_audience, - thread: replied_to_status, - conversation: conversation_from_uri(@object['conversation']), - media_attachment_ids: process_attachments.take(4).map(&:id), - } - end - - def process_tags(status) + @params = begin + { + uri: @object['id'], + url: object_url || @object['id'], + account: @account, + text: text_from_content || '', + language: detected_language, + spoiler_text: text_from_summary || '', + created_at: @object['published'], + override_timestamps: @options[:override_timestamps], + reply: @object['inReplyTo'].present?, + sensitive: @object['sensitive'] || false, + visibility: visibility_from_audience, + thread: replied_to_status, + conversation: conversation_from_uri(@object['conversation']), + media_attachment_ids: process_attachments.take(4).map(&:id), + } + end + end + + def process_audience + (as_array(@object['to']) + as_array(@object['cc'])).uniq.each do |audience| + next if audience == ActivityPub::TagManager::COLLECTIONS[:public] + + # Unlike with tags, there is no point in resolving accounts we don't already + # know here, because silent mentions would only be used for local access + # control anyway + account = account_from_uri(audience) + + next if account.nil? || @mentions.any? { |mention| mention.account_id == account.id } + + @mentions << Mention.new(account: account, silent: true) + + # If there is at least one silent mention, then the status can be considered + # as a limited-audience status, and not strictly a direct message, but only + # if we considered a direct message in the first place + next unless @params[:visibility] == :direct + + @params[:visibility] = :limited + end + + # If the payload was delivered to a specific inbox, the inbox owner must have + # access to it, unless they already have access to it anyway + return if @options[:delivered_to_account_id].nil? || @mentions.any? { |mention| mention.account_id == @options[:delivered_to_account_id] } + + @mentions << Mention.new(account_id: @options[:delivered_to_account_id], silent: true) + + return unless @params[:visibility] == :direct + + @params[:visibility] = :limited + end + + def attach_tags(status) + @tags.each do |tag| + status.tags << tag + TrendingTags.record_use!(tag, status.account, status.created_at) if status.public_visibility? + end + + @mentions.each do |mention| + mention.status = status + mention.save + end + end + + def process_tags return if @object['tag'].nil? as_array(@object['tag']).each do |tag| if equals_or_includes?(tag['type'], 'Hashtag') - process_hashtag tag, status + process_hashtag tag elsif equals_or_includes?(tag['type'], 'Mention') - process_mention tag, status + process_mention tag elsif equals_or_includes?(tag['type'], 'Emoji') - process_emoji tag, status + process_emoji tag end end end - def process_hashtag(tag, status) + def process_hashtag(tag) return if tag['name'].blank? hashtag = tag['name'].gsub(/\A#/, '').mb_chars.downcase - hashtag = Tag.where(name: hashtag).first_or_create(name: hashtag) + hashtag = Tag.where(name: hashtag).first_or_create!(name: hashtag) - return if status.tags.include?(hashtag) + return if @tags.include?(hashtag) - status.tags << hashtag - TrendingTags.record_use!(hashtag, status.account, status.created_at) if status.public_visibility? + @tags << hashtag rescue ActiveRecord::RecordInvalid nil end - def process_mention(tag, status) + def process_mention(tag) return if tag['href'].blank? account = account_from_uri(tag['href']) account = ::FetchRemoteAccountService.new.call(tag['href'], id: false) if account.nil? + return if account.nil? - account.mentions.create(status: status) + + @mentions << Mention.new(account: account, silent: false) end - def process_emoji(tag, _status) + def process_emoji(tag) return if skip_download? return if tag['name'].blank? || tag['icon'].blank? || tag['icon']['url'].blank? diff --git a/app/lib/activitypub/activity/flag.rb b/app/lib/activitypub/activity/flag.rb index 36d3c5730..92e59bb81 100644 --- a/app/lib/activitypub/activity/flag.rb +++ b/app/lib/activitypub/activity/flag.rb @@ -2,6 +2,8 @@ class ActivityPub::Activity::Flag < ActivityPub::Activity def perform + return if skip_reports? + target_accounts = object_uris.map { |uri| account_from_uri(uri) }.compact.select(&:local?) target_statuses_by_account = object_uris.map { |uri| status_from_uri(uri) }.compact.select(&:local?).group_by(&:account_id) @@ -19,6 +21,12 @@ class ActivityPub::Activity::Flag < ActivityPub::Activity end end + private + + def skip_reports? + DomainBlock.find_by(domain: @account.domain)&.reject_reports? + end + def object_uris @object_uris ||= Array(@object.is_a?(Array) ? @object.map { |item| value_or_id(item) } : value_or_id(@object)) end diff --git a/app/lib/activitypub/tag_manager.rb b/app/lib/activitypub/tag_manager.rb index 95d1cf9f3..be3a562d0 100644 --- a/app/lib/activitypub/tag_manager.rb +++ b/app/lib/activitypub/tag_manager.rb @@ -58,8 +58,8 @@ class ActivityPub::TagManager [COLLECTIONS[:public]] when 'unlisted', 'private' [account_followers_url(status.account)] - when 'direct' - status.mentions.map { |mention| uri_for(mention.account) } + when 'direct', 'limited' + status.active_mentions.map { |mention| uri_for(mention.account) } end end @@ -80,7 +80,7 @@ class ActivityPub::TagManager cc << COLLECTIONS[:public] end - cc.concat(status.mentions.map { |mention| uri_for(mention.account) }) unless status.direct_visibility? + cc.concat(status.active_mentions.map { |mention| uri_for(mention.account) }) unless status.direct_visibility? || status.limited_visibility? cc end diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index b10e5dd24..3d7db2721 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -88,7 +88,7 @@ class FeedManager end query.each do |status| - next if status.direct_visibility? || filter?(:home, status, into_account) + next if status.direct_visibility? || status.limited_visibility? || filter?(:home, status, into_account) add_to_feed(:home, into_account.id, status) end @@ -156,12 +156,12 @@ class FeedManager return true if status.reply? && (status.in_reply_to_id.nil? || status.in_reply_to_account_id.nil?) return true if phrase_filtered?(status, receiver_id, :home) - check_for_blocks = status.mentions.pluck(:account_id) + check_for_blocks = status.active_mentions.pluck(:account_id) check_for_blocks.concat([status.account_id]) if status.reblog? check_for_blocks.concat([status.reblog.account_id]) - check_for_blocks.concat(status.reblog.mentions.pluck(:account_id)) + check_for_blocks.concat(status.reblog.active_mentions.pluck(:account_id)) end return true if blocks_or_mutes?(receiver_id, check_for_blocks, :home) @@ -188,7 +188,7 @@ class FeedManager # This filter is called from NotifyService, but already after the sender of # the notification has been checked for mute/block. Therefore, it's not # necessary to check the author of the toot for mute/block again - check_for_blocks = status.mentions.pluck(:account_id) + check_for_blocks = status.active_mentions.pluck(:account_id) check_for_blocks.concat([status.in_reply_to_account]) if status.reply? && !status.in_reply_to_account_id.nil? should_filter = blocks_or_mutes?(receiver_id, check_for_blocks, :mentions) # Filter if it's from someone I blocked, in reply to someone I blocked, or mentioning someone I blocked (or muted) diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb index 35d5a09b7..d13884ec8 100644 --- a/app/lib/formatter.rb +++ b/app/lib/formatter.rb @@ -27,7 +27,7 @@ class Formatter return html.html_safe # rubocop:disable Rails/OutputSafety end - linkable_accounts = status.mentions.map(&:account) + linkable_accounts = status.active_mentions.map(&:account) linkable_accounts << status.account html = raw_content diff --git a/app/lib/ostatus/atom_serializer.rb b/app/lib/ostatus/atom_serializer.rb index 1a0a635b3..7a181fb40 100644 --- a/app/lib/ostatus/atom_serializer.rb +++ b/app/lib/ostatus/atom_serializer.rb @@ -354,7 +354,7 @@ class OStatus::AtomSerializer append_element(entry, 'summary', status.spoiler_text, 'xml:lang': status.language) if status.spoiler_text? append_element(entry, 'content', Formatter.instance.format(status).to_str || '.', type: 'html', 'xml:lang': status.language) - status.mentions.sort_by(&:id).each do |mentioned| + status.active_mentions.sort_by(&:id).each do |mentioned| append_element(entry, 'link', nil, rel: :mentioned, 'ostatus:object-type': OStatus::TagManager::TYPES[:person], href: OStatus::TagManager.instance.uri_for(mentioned.account)) end diff --git a/app/models/account.rb b/app/models/account.rb index 1ca27f636..bd3dc9c96 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -59,7 +59,9 @@ class Account < ApplicationRecord include Attachmentable include Paginable - MAX_NOTE_LENGTH = 500 + MAX_DISPLAY_NAME_LENGTH = (ENV['MAX_DISPLAY_NAME_CHARS'] || 30).to_i + MAX_NOTE_LENGTH = (ENV['MAX_BIO_CHARS'] || 500).to_i + MAX_FIELDS = (ENV['MAX_PROFILE_FIELDS'] || 4).to_i enum protocol: [:ostatus, :activitypub] @@ -76,9 +78,9 @@ class Account < ApplicationRecord validates :username, format: { with: /\A[a-z0-9_]+\z/i }, length: { maximum: 30 }, if: -> { local? && will_save_change_to_username? } validates_with UniqueUsernameValidator, if: -> { local? && will_save_change_to_username? } validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? } - validates :display_name, length: { maximum: 30 }, if: -> { local? && will_save_change_to_display_name? } + validates :display_name, length: { maximum: MAX_DISPLAY_NAME_LENGTH }, if: -> { local? && will_save_change_to_display_name? } validate :note_length_does_not_exceed_length_limit, if: -> { local? && will_save_change_to_note? } - validates :fields, length: { maximum: 4 }, if: -> { local? && will_save_change_to_fields? } + validates :fields, length: { maximum: MAX_FIELDS }, if: -> { local? && will_save_change_to_fields? } # Timelines has_many :stream_entries, inverse_of: :account, dependent: :destroy @@ -246,14 +248,12 @@ class Account < ApplicationRecord self[:fields] = fields end - DEFAULT_FIELDS_SIZE = 4 - def build_fields - return if fields.size >= DEFAULT_FIELDS_SIZE + return if fields.size >= MAX_FIELDS tmp = self[:fields] || [] - (DEFAULT_FIELDS_SIZE - tmp.size).times do + (MAX_FIELDS - tmp.size).times do tmp << { name: '', value: '' } end diff --git a/app/models/account_conversation.rb b/app/models/account_conversation.rb index a7205ec1a..cc6b39279 100644 --- a/app/models/account_conversation.rb +++ b/app/models/account_conversation.rb @@ -10,6 +10,7 @@ # status_ids :bigint(8) default([]), not null, is an Array # last_status_id :bigint(8) # lock_version :integer default(0), not null +# unread :boolean default(FALSE), not null # class AccountConversation < ApplicationRecord @@ -57,7 +58,11 @@ class AccountConversation < ApplicationRecord def add_status(recipient, status) conversation = find_or_initialize_by(account: recipient, conversation_id: status.conversation_id, participant_account_ids: participants_from_status(recipient, status)) + + return conversation if conversation.status_ids.include?(status.id) + conversation.status_ids << status.id + conversation.unread = status.account_id != recipient.id conversation.save conversation rescue ActiveRecord::StaleObjectError @@ -85,7 +90,7 @@ class AccountConversation < ApplicationRecord private def participants_from_status(recipient, status) - ((status.mentions.pluck(:account_id) + [status.account_id]).uniq - [recipient.id]).sort + ((status.active_mentions.pluck(:account_id) + [status.account_id]).uniq - [recipient.id]).sort end end diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb index 93658793b..b828a9d71 100644 --- a/app/models/domain_block.rb +++ b/app/models/domain_block.rb @@ -3,12 +3,13 @@ # # Table name: domain_blocks # -# id :bigint(8) not null, primary key -# domain :string default(""), not null -# created_at :datetime not null -# updated_at :datetime not null -# severity :integer default("silence") -# reject_media :boolean default(FALSE), not null +# id :bigint(8) not null, primary key +# domain :string default(""), not null +# created_at :datetime not null +# updated_at :datetime not null +# severity :integer default("silence") +# reject_media :boolean default(FALSE), not null +# reject_reports :boolean default(FALSE), not null # class DomainBlock < ApplicationRecord diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index 3e3cbdaed..0f787ebc4 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -148,6 +148,7 @@ class MediaAttachment < ApplicationRecord "#{x},#{y}" end + after_commit :reset_parent_cache, on: :update before_create :prepare_description, unless: :local? before_create :set_shortcode before_post_process :set_type_and_extension @@ -252,4 +253,9 @@ class MediaAttachment < ApplicationRecord bitrate: movie.bitrate, } end + + def reset_parent_cache + return if status_id.nil? + Rails.cache.delete("statuses/#{status_id}") + end end diff --git a/app/models/mention.rb b/app/models/mention.rb index 8ab886b18..d01a88e32 100644 --- a/app/models/mention.rb +++ b/app/models/mention.rb @@ -8,6 +8,7 @@ # created_at :datetime not null # updated_at :datetime not null # account_id :bigint(8) +# silent :boolean default(FALSE), not null # class Mention < ApplicationRecord @@ -18,10 +19,17 @@ class Mention < ApplicationRecord validates :account, uniqueness: { scope: :status } + scope :active, -> { where(silent: false) } + scope :silent, -> { where(silent: true) } + delegate( :username, :acct, to: :account, prefix: true ) + + def active? + !silent? + end end diff --git a/app/models/notification.rb b/app/models/notification.rb index b9bec0808..78b180301 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -24,7 +24,7 @@ class Notification < ApplicationRecord favourite: 'Favourite', }.freeze - STATUS_INCLUDES = [:account, :application, :stream_entry, :media_attachments, :tags, mentions: :account, reblog: [:stream_entry, :account, :application, :media_attachments, :tags, mentions: :account]].freeze + STATUS_INCLUDES = [:account, :application, :media_attachments, :tags, active_mentions: :account, reblog: [:account, :application, :media_attachments, :tags, active_mentions: :account]].freeze belongs_to :account, optional: true belongs_to :from_account, class_name: 'Account', optional: true diff --git a/app/models/status.rb b/app/models/status.rb index ad25cc8df..f67a05b3c 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -39,7 +39,7 @@ class Status < ApplicationRecord update_index('statuses#status', :proper) if Chewy.enabled? - enum visibility: [:public, :unlisted, :private, :direct], _suffix: :visibility + enum visibility: [:public, :unlisted, :private, :direct, :limited], _suffix: :visibility belongs_to :application, class_name: 'Doorkeeper::Application', optional: true @@ -54,7 +54,8 @@ class Status < ApplicationRecord has_many :bookmarks, inverse_of: :status, dependent: :destroy has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy has_many :replies, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :thread - has_many :mentions, dependent: :destroy + has_many :mentions, dependent: :destroy, inverse_of: :status + has_many :active_mentions, -> { active }, class_name: 'Mention', inverse_of: :status has_many :media_attachments, dependent: :nullify has_and_belongs_to_many :tags @@ -93,17 +94,19 @@ class Status < ApplicationRecord :conversation, :status_stat, :tags, + :preview_cards, :stream_entry, - mentions: :account, + active_mentions: :account, reblog: [ :account, :application, :stream_entry, :tags, + :preview_cards, :media_attachments, :conversation, :status_stat, - mentions: :account, + active_mentions: :account, ], thread: :account @@ -167,6 +170,10 @@ class Status < ApplicationRecord reblog end + def preview_card + preview_cards.first + end + def title if destroyed? "#{account.acct} deleted status" @@ -176,7 +183,11 @@ class Status < ApplicationRecord end def hidden? - private_visibility? || direct_visibility? + private_visibility? || direct_visibility? || limited_visibility? + end + + def distributable? + public_visibility? || unlisted_visibility? end def with_media? @@ -236,8 +247,8 @@ class Status < ApplicationRecord before_validation :set_local class << self - def cache_ids - left_outer_joins(:status_stat).select('statuses.id, greatest(statuses.updated_at, status_stats.updated_at) AS updated_at') + def selectable_visibilities + visibilities.keys - %w(direct limited) end def in_chosen_languages(account) diff --git a/app/models/status_stat.rb b/app/models/status_stat.rb index 9d358776b..024c467e7 100644 --- a/app/models/status_stat.rb +++ b/app/models/status_stat.rb @@ -14,4 +14,12 @@ class StatusStat < ApplicationRecord belongs_to :status, inverse_of: :status_stat + + after_commit :reset_parent_cache + + private + + def reset_parent_cache + Rails.cache.delete("statuses/#{status_id}") + end end diff --git a/app/models/stream_entry.rb b/app/models/stream_entry.rb index dd383eb81..edd30487e 100644 --- a/app/models/stream_entry.rb +++ b/app/models/stream_entry.rb @@ -48,7 +48,7 @@ class StreamEntry < ApplicationRecord end def mentions - orphaned? ? [] : status.mentions.map(&:account) + orphaned? ? [] : status.active_mentions.map(&:account) end private diff --git a/app/policies/status_policy.rb b/app/policies/status_policy.rb index fcf19db62..5e3282681 100644 --- a/app/policies/status_policy.rb +++ b/app/policies/status_policy.rb @@ -14,7 +14,7 @@ class StatusPolicy < ApplicationPolicy def show? return false if local_only? && (current_account.nil? || !current_account.local?) - if direct? + if requires_mention? owned? || mention_exists? elsif private? owned? || following_author? || mention_exists? @@ -24,7 +24,7 @@ class StatusPolicy < ApplicationPolicy end def reblog? - !direct? && (!private? || owned?) && show? && !blocking_author? + !requires_mention? && (!private? || owned?) && show? && !blocking_author? end def favourite? @@ -43,8 +43,8 @@ class StatusPolicy < ApplicationPolicy private - def direct? - record.direct_visibility? + def requires_mention? + record.direct_visibility? || record.limited_visibility? end def owned? diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb index 82b7ffe95..c9d23e25f 100644 --- a/app/serializers/activitypub/note_serializer.rb +++ b/app/serializers/activitypub/note_serializer.rb @@ -68,7 +68,7 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer end def virtual_tags - object.mentions.to_a.sort_by(&:id) + object.tags + object.emojis + object.active_mentions.to_a.sort_by(&:id) + object.tags + object.emojis end def atom_uri diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb index ac08a3f1e..5b88cb9a8 100644 --- a/app/serializers/initial_state_serializer.rb +++ b/app/serializers/initial_state_serializer.rb @@ -21,6 +21,7 @@ class InitialStateSerializer < ActiveModel::Serializer search_enabled: Chewy.enabled?, version: Mastodon::Version.to_s, invites_enabled: Setting.min_invite_role == 'user', + mascot: instance_presenter.mascot&.file&.url, } if object.current_account @@ -63,4 +64,10 @@ class InitialStateSerializer < ActiveModel::Serializer def media_attachments { accept_content_types: MediaAttachment::IMAGE_FILE_EXTENSIONS + MediaAttachment::VIDEO_FILE_EXTENSIONS + MediaAttachment::AUDIO_FILE_EXTENSIONS + MediaAttachment::IMAGE_MIME_TYPES + MediaAttachment::VIDEO_MIME_TYPES + MediaAttachment::AUDIO_MIME_TYPES } end + + private + + def instance_presenter + @instance_presenter ||= InstancePresenter.new + end end diff --git a/app/serializers/rest/conversation_serializer.rb b/app/serializers/rest/conversation_serializer.rb index 08cea47d2..b09ca6341 100644 --- a/app/serializers/rest/conversation_serializer.rb +++ b/app/serializers/rest/conversation_serializer.rb @@ -1,7 +1,12 @@ # frozen_string_literal: true class REST::ConversationSerializer < ActiveModel::Serializer - attribute :id + attributes :id, :unread + has_many :participant_accounts, key: :accounts, serializer: REST::AccountSerializer has_one :last_status, serializer: REST::StatusSerializer + + def id + object.id.to_s + end end diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb index 89776b1fc..8a61c1056 100644 --- a/app/serializers/rest/status_serializer.rb +++ b/app/serializers/rest/status_serializer.rb @@ -21,6 +21,8 @@ class REST::StatusSerializer < ActiveModel::Serializer has_many :tags has_many :emojis, serializer: REST::CustomEmojiSerializer + has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer + def id object.id.to_s end @@ -37,6 +39,17 @@ class REST::StatusSerializer < ActiveModel::Serializer !current_user.nil? end + def visibility + # This visibility is masked behind "private" + # to avoid API changes because there are no + # UX differences + if object.limited_visibility? + 'private' + else + object.visibility + end + end + def uri OStatus::TagManager.instance.uri_for(object) end @@ -97,7 +110,7 @@ class REST::StatusSerializer < ActiveModel::Serializer end def ordered_mentions - object.mentions.to_a.sort_by(&:id) + object.active_mentions.to_a.sort_by(&:id) end class ApplicationSerializer < ActiveModel::Serializer diff --git a/app/services/activitypub/fetch_remote_account_service.rb b/app/services/activitypub/fetch_remote_account_service.rb index 1ec9ee5dd..8430d12d5 100644 --- a/app/services/activitypub/fetch_remote_account_service.rb +++ b/app/services/activitypub/fetch_remote_account_service.rb @@ -5,9 +5,10 @@ class ActivityPub::FetchRemoteAccountService < BaseService SUPPORTED_TYPES = %w(Application Group Organization Person Service).freeze - # Should be called when uri has already been checked for locality # Does a WebFinger roundtrip on each call def call(uri, id: true, prefetched_body: nil, break_on_redirect: false) + return ActivityPub::TagManager.instance.uri_to_resource(uri, Account) if ActivityPub::TagManager.instance.local_uri?(uri) + @json = if prefetched_body.nil? fetch_resource(uri, id) else diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb index ebb4034aa..b7296cf7c 100644 --- a/app/services/batched_remove_status_service.rb +++ b/app/services/batched_remove_status_service.rb @@ -12,7 +12,7 @@ class BatchedRemoveStatusService < BaseService def call(statuses) statuses = Status.where(id: statuses.map(&:id)).includes(:account, :stream_entry).flat_map { |status| [status] + status.reblogs.includes(:account, :stream_entry).to_a } - @mentions = statuses.map { |s| [s.id, s.mentions.includes(:account).to_a] }.to_h + @mentions = statuses.map { |s| [s.id, s.active_mentions.includes(:account).to_a] }.to_h @tags = statuses.map { |s| [s.id, s.tags.pluck(:name)] }.to_h @stream_entry_batches = [] diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index ab520276b..63cab8403 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -14,6 +14,8 @@ class FanOutOnWriteService < BaseService deliver_to_mentioned_followers(status) deliver_to_direct_timelines(status) deliver_to_own_conversation(status) + elsif status.limited_visibility? + deliver_to_mentioned_followers(status) else deliver_to_followers(status) deliver_to_lists(status) @@ -57,7 +59,7 @@ class FanOutOnWriteService < BaseService end def deliver_to_mentioned_followers(status) - Rails.logger.debug "Delivering status #{status.id} to mentioned followers" + Rails.logger.debug "Delivering status #{status.id} to limited followers" status.mentions.includes(:account).each do |mention| mentioned_account = mention.account diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index 4169c685b..462e5ee13 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -17,7 +17,8 @@ class FetchLinkCardService < BaseService return if @url.nil? || @status.preview_cards.any? - @url = @url.to_s + @mentions = status.mentions + @url = @url.to_s RedisLock.acquire(lock_options) do |lock| if lock.acquired? @@ -62,6 +63,7 @@ class FetchLinkCardService < BaseService def attach_card @status.preview_cards << @card + Rails.cache.delete(@status) end def parse_urls @@ -81,9 +83,16 @@ class FetchLinkCardService < BaseService uri.host.blank? || TagManager.instance.local_url?(uri.to_s) || !%w(http https).include?(uri.scheme) end + def mention_link?(a) + return false if @mentions.nil? + @mentions.any? do |mention| + a['href'] == TagManager.instance.url_for(mention.target) + end + end + def skip_link?(a) # Avoid links for hashtags and mentions (microformats) - a['rel']&.include?('tag') || a['class']&.include?('u-url') + a['rel']&.include?('tag') || a['class']&.include?('u-url') || mention_link?(a) end def attempt_oembed diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb index 63bf8f17a..49022a844 100644 --- a/app/services/notify_service.rb +++ b/app/services/notify_service.rb @@ -59,9 +59,14 @@ class NotifyService < BaseService @notification.target_status.in_reply_to_account_id == @recipient.id && @notification.target_status.thread&.direct_visibility? end + def from_staff? + @notification.from_account.local? && @notification.from_account.user.present? && @notification.from_account.user.staff? + end + def optional_non_following_and_direct? direct_message? && @recipient.user.settings.interactions['must_be_following_dm'] && + !from_staff? && !following_sender? && !response_to_recipient? end diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 52d49a69e..d7d7770e9 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -21,7 +21,10 @@ class PostStatusService < BaseService media = validate_media!(options[:media_ids]) status = nil - text = options.delete(:spoiler_text) if text.blank? && options[:spoiler_text].present? + if text.blank? && options[:spoiler_text].present? + text = '.' + text = media.find(&:video?) ? '📹' : '🖼' if media.size > 0 + end ApplicationRecord.transaction do status = account.statuses.create!(text: text, diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb index 1a53093b8..4bee86c8a 100644 --- a/app/services/remove_status_service.rb +++ b/app/services/remove_status_service.rb @@ -8,7 +8,7 @@ class RemoveStatusService < BaseService @status = status @account = status.account @tags = status.tags.pluck(:name).to_a - @mentions = status.mentions.includes(:account).to_a + @mentions = status.active_mentions.includes(:account).to_a @reblogs = status.reblogs.to_a @stream_entry = status.stream_entry @options = options diff --git a/app/services/verify_link_service.rb b/app/services/verify_link_service.rb index 3453b54c5..9f56249c7 100644 --- a/app/services/verify_link_service.rb +++ b/app/services/verify_link_service.rb @@ -25,7 +25,7 @@ class VerifyLinkService < BaseService end def link_back_present? - return false if @body.empty? + return false if @body.blank? links = Nokogiri::HTML(@body).xpath('//a[contains(concat(" ", normalize-space(@rel), " "), " me ")]|//link[contains(concat(" ", normalize-space(@rel), " "), " me ")]') diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml index f2c53e3fe..17f1f224d 100644 --- a/app/views/admin/accounts/show.html.haml +++ b/app/views/admin/accounts/show.html.haml @@ -106,7 +106,7 @@ - if @account.user&.otp_required_for_login? = link_to t('admin.accounts.disable_two_factor_authentication'), admin_user_two_factor_authentication_path(@account.user.id), method: :delete, class: 'button' if can?(:disable_2fa, @account.user) - unless @account.memorial? - = link_to t('admin.accounts.memorialize'), memorialize_admin_account_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button' if can?(:memorialize, @account) + = link_to t('admin.accounts.memorialize'), memorialize_admin_account_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive' if can?(:memorialize, @account) - else = link_to t('admin.accounts.redownload'), redownload_admin_account_path(@account.id), method: :post, class: 'button' if can?(:redownload, @account) @@ -114,7 +114,7 @@ - if @account.silenced? = link_to t('admin.accounts.undo_silenced'), admin_account_silence_path(@account.id), method: :delete, class: 'button' if can?(:unsilence, @account) - else - = link_to t('admin.accounts.silence'), admin_account_silence_path(@account.id), method: :post, class: 'button' if can?(:silence, @account) + = link_to t('admin.accounts.silence'), admin_account_silence_path(@account.id), method: :post, class: 'button button--destructive' if can?(:silence, @account) - if @account.local? - unless @account.user_confirmed? @@ -123,7 +123,7 @@ - if @account.suspended? = link_to t('admin.accounts.undo_suspension'), admin_account_suspension_path(@account.id), method: :delete, class: 'button' if can?(:unsuspend, @account) - else - = link_to t('admin.accounts.perform_full_suspension'), new_admin_account_suspension_path(@account.id), class: 'button' if can?(:suspend, @account) + = link_to t('admin.accounts.perform_full_suspension'), new_admin_account_suspension_path(@account.id), class: 'button button--destructive' if can?(:suspend, @account) - if !@account.local? && @account.hub_url.present? %hr.spacer/ diff --git a/app/views/admin/domain_blocks/_domain_block.html.haml b/app/views/admin/domain_blocks/_domain_block.html.haml index 17a3de81c..7bfea3574 100644 --- a/app/views/admin/domain_blocks/_domain_block.html.haml +++ b/app/views/admin/domain_blocks/_domain_block.html.haml @@ -1,10 +1,13 @@ %tr - %td.domain + %td %samp= domain_block.domain %td.severity = t("admin.domain_blocks.severities.#{domain_block.severity}") %td.reject_media - if domain_block.reject_media? || domain_block.suspend? %i.fa.fa-check + %td.reject_reports + - if domain_block.reject_reports? || domain_block.suspend? + %i.fa.fa-check %td = table_link_to 'undo', t('admin.domain_blocks.undo'), admin_domain_block_path(domain_block) diff --git a/app/views/admin/domain_blocks/index.html.haml b/app/views/admin/domain_blocks/index.html.haml index 42b8ca53f..4c5221c42 100644 --- a/app/views/admin/domain_blocks/index.html.haml +++ b/app/views/admin/domain_blocks/index.html.haml @@ -8,6 +8,7 @@ %th= t('admin.domain_blocks.domain') %th= t('admin.domain_blocks.severity') %th= t('admin.domain_blocks.reject_media') + %th= t('admin.domain_blocks.reject_reports') %th %tbody = render @domain_blocks diff --git a/app/views/admin/domain_blocks/new.html.haml b/app/views/admin/domain_blocks/new.html.haml index 6e514f833..3a4963489 100644 --- a/app/views/admin/domain_blocks/new.html.haml +++ b/app/views/admin/domain_blocks/new.html.haml @@ -14,5 +14,8 @@ .fields-group = f.input :reject_media, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.reject_media'), hint: I18n.t('admin.domain_blocks.reject_media_hint') + .fields-group + = f.input :reject_reports, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.reject_reports'), hint: I18n.t('admin.domain_blocks.reject_reports_hint') + .actions = f.button :button, t('.create'), type: :submit diff --git a/app/views/admin/email_domain_blocks/_email_domain_block.html.haml b/app/views/admin/email_domain_blocks/_email_domain_block.html.haml index 61cff9395..bf66c9001 100644 --- a/app/views/admin/email_domain_blocks/_email_domain_block.html.haml +++ b/app/views/admin/email_domain_blocks/_email_domain_block.html.haml @@ -1,5 +1,5 @@ %tr - %td.domain + %td %samp= email_domain_block.domain %td = table_link_to 'trash', t('admin.email_domain_blocks.delete'), admin_email_domain_block_path(email_domain_block), method: :delete diff --git a/app/views/admin/instances/_instance.html.haml b/app/views/admin/instances/_instance.html.haml index 6efbbbe60..e36ebae47 100644 --- a/app/views/admin/instances/_instance.html.haml +++ b/app/views/admin/instances/_instance.html.haml @@ -1,5 +1,5 @@ %tr - %td.domain + %td = link_to instance.domain, admin_accounts_path(by_domain: instance.domain) %td.count = instance.accounts_count diff --git a/app/views/admin/reports/show.html.haml b/app/views/admin/reports/show.html.haml index ae0bf81f8..133ca4eca 100644 --- a/app/views/admin/reports/show.html.haml +++ b/app/views/admin/reports/show.html.haml @@ -4,8 +4,10 @@ %div{ style: 'overflow: hidden; margin-bottom: 20px' } - if @report.unresolved? %div{ style: 'float: right' } - = link_to t('admin.reports.silence_account'), admin_report_path(@report, outcome: 'silence'), method: :put, class: 'button' - = link_to t('admin.reports.suspend_account'), new_admin_account_suspension_path(@report.target_account_id, report_id: @report.id), class: 'button' + - if @report.target_account.local? + = link_to t('admin.accounts.disable'), admin_report_path(@report, outcome: 'disable'), method: :put, class: 'button button--destructive' + = link_to t('admin.accounts.silence'), admin_report_path(@report, outcome: 'silence'), method: :put, class: 'button button--destructive' + = link_to t('admin.accounts.perform_full_suspension'), new_admin_account_suspension_path(@report.target_account_id, report_id: @report.id), class: 'button button--destructive' %div{ style: 'float: left' } = link_to t('admin.reports.mark_as_resolved'), admin_report_path(@report, outcome: 'resolve'), method: :put, class: 'button' - else diff --git a/app/views/admin/settings/edit.html.haml b/app/views/admin/settings/edit.html.haml index b82555534..7c378bf73 100644 --- a/app/views/admin/settings/edit.html.haml +++ b/app/views/admin/settings/edit.html.haml @@ -26,6 +26,8 @@ = f.input :thumbnail, as: :file, wrapper: :with_block_label, label: t('admin.settings.thumbnail.title'), hint: t('admin.settings.thumbnail.desc_html') .fields-row__column.fields-row__column-6.fields-group = f.input :hero, as: :file, wrapper: :with_block_label, label: t('admin.settings.hero.title'), hint: t('admin.settings.hero.desc_html') + + .fields-row .fields-row__column.fields-row__column-6.fields-group = f.input :mascot, as: :file, wrapper: :with_block_label, label: t('admin.settings.mascot.title'), hint: t('admin.settings.mascot.desc_html') diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index 66382db50..0e52702dc 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -14,4 +14,4 @@ = yield -= render template: 'layouts/application', locals: { body_classes: 'admin' } += render template: 'layouts/application' diff --git a/app/views/layouts/embedded.html.haml b/app/views/layouts/embedded.html.haml index 2443e3410..33e3714f8 100644 --- a/app/views/layouts/embedded.html.haml +++ b/app/views/layouts/embedded.html.haml @@ -4,6 +4,12 @@ %meta{ charset: 'utf-8' }/ %meta{ name: 'robots', content: 'noindex' }/ + - if cdn_host? + %link{ rel: 'dns-prefetch', href: cdn_host }/ + + - if storage_host? + %link{ rel: 'dns-prefetch', href: storage_host }/ + = javascript_pack_tag "locales", integrity: true, crossorigin: 'anonymous' - if @theme - if @theme[:supported_locales].include? I18n.locale.to_s @@ -12,4 +18,6 @@ = javascript_pack_tag "locales/#{@theme[:flavour]}/en", integrity: true, crossorigin: 'anonymous' = render partial: 'layouts/theme', object: @core = render partial: 'layouts/theme', object: @theme + + %body.embed = yield diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml index 751a6e50b..45f9fd178 100644 --- a/app/views/settings/preferences/show.html.haml +++ b/app/views/settings/preferences/show.html.haml @@ -22,7 +22,7 @@ %hr#settings_publishing/ .fields-group - = f.input :setting_default_privacy, collection: Status.visibilities.keys - ['direct'], wrapper: :with_floating_label, include_blank: false, label_method: lambda { |visibility| safe_join([I18n.t("statuses.visibilities.#{visibility}"), content_tag(:span, I18n.t("statuses.visibilities.#{visibility}_long"), class: 'hint')]) }, required: false, as: :radio_buttons, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li' + = f.input :setting_default_privacy, collection: Status.selectable_visibilities, wrapper: :with_floating_label, include_blank: false, label_method: lambda { |visibility| safe_join([I18n.t("statuses.visibilities.#{visibility}"), content_tag(:span, I18n.t("statuses.visibilities.#{visibility}_long"), class: 'hint')]) }, required: false, as: :radio_buttons, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li' = f.input :setting_default_sensitive, as: :boolean, wrapper: :with_label diff --git a/app/views/settings/profiles/show.html.haml b/app/views/settings/profiles/show.html.haml index 6b61fa9c9..6c4a8fdfb 100644 --- a/app/views/settings/profiles/show.html.haml +++ b/app/views/settings/profiles/show.html.haml @@ -6,8 +6,8 @@ .fields-row .fields-row__column.fields-group.fields-row__column-6 - = f.input :display_name, wrapper: :with_label, hint: t('simple_form.hints.defaults.display_name', count: 30 - @account.display_name.size).html_safe - = f.input :note, wrapper: :with_label, hint: t('simple_form.hints.defaults.note', count: 500 - @account.note.size).html_safe + = f.input :display_name, wrapper: :with_label, input_html: { maxlength: Account::MAX_DISPLAY_NAME_LENGTH }, hint: false + = f.input :note, wrapper: :with_label, input_html: { maxlength: Account::MAX_NOTE_LENGTH }, hint: false .fields-row .fields-row__column.fields-row__column-6 @@ -36,8 +36,8 @@ = f.simple_fields_for :fields do |fields_f| .row - = fields_f.input :name, placeholder: t('simple_form.labels.account.fields.name') - = fields_f.input :value, placeholder: t('simple_form.labels.account.fields.value') + = fields_f.input :name, placeholder: t('simple_form.labels.account.fields.name'), input_html: { maxlength: 255 } + = fields_f.input :value, placeholder: t('simple_form.labels.account.fields.value'), input_html: { maxlength: 255 } .fields-row__column.fields-group.fields-row__column-6 %h6= t('verification.verification') diff --git a/app/views/stream_entries/_detailed_status.html.haml b/app/views/stream_entries/_detailed_status.html.haml index 6cedfb337..6e6d0eda8 100644 --- a/app/views/stream_entries/_detailed_status.html.haml +++ b/app/views/stream_entries/_detailed_status.html.haml @@ -1,16 +1,17 @@ .detailed-status.detailed-status--flex - = link_to TagManager.instance.url_for(status.account), class: 'detailed-status__display-name p-author h-card', target: stream_link_target, rel: 'noopener' do - .detailed-status__display-avatar - - if current_account&.user&.setting_auto_play_gif || autoplay - = image_tag status.account.avatar_original_url, width: 48, height: 48, alt: '', class: 'account__avatar u-photo' - - else - = image_tag status.account.avatar_static_url, width: 48, height: 48, alt: '', class: 'account__avatar u-photo' - %span.display-name - %bdi - %strong.display-name__html.p-name.emojify= display_name(status.account, custom_emojify: true, autoplay: autoplay) - %span.display-name__account - = acct(status.account) - = fa_icon('lock') if status.account.locked? + .p-author.h-card + = link_to TagManager.instance.url_for(status.account), class: 'detailed-status__display-name u-url', target: stream_link_target, rel: 'noopener' do + .detailed-status__display-avatar + - if current_account&.user&.setting_auto_play_gif || autoplay + = image_tag status.account.avatar_original_url, width: 48, height: 48, alt: '', class: 'account__avatar u-photo' + - else + = image_tag status.account.avatar_static_url, width: 48, height: 48, alt: '', class: 'account__avatar u-photo' + %span.display-name + %bdi + %strong.display-name__html.p-name.emojify= display_name(status.account, custom_emojify: true, autoplay: autoplay) + %span.display-name__account + = acct(status.account) + = fa_icon('lock') if status.account.locked? = account_action_button(status.account) @@ -50,7 +51,7 @@ - if status.direct_visibility? %span.detailed-status__link< = fa_icon('envelope') - - elsif status.private_visibility? + - elsif status.private_visibility? || status.limited_visibility? %span.detailed-status__link< = fa_icon('lock') - else diff --git a/app/views/stream_entries/_simple_status.html.haml b/app/views/stream_entries/_simple_status.html.haml index 5d7e2ad82..e996d5052 100644 --- a/app/views/stream_entries/_simple_status.html.haml +++ b/app/views/stream_entries/_simple_status.html.haml @@ -4,19 +4,21 @@ %time.time-ago{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at) %data.dt-published{ value: status.created_at.to_time.iso8601 } - = link_to TagManager.instance.url_for(status.account), class: 'status__display-name p-author h-card', target: stream_link_target, rel: 'noopener' do - .status__avatar - %div - - if current_account&.user&.setting_auto_play_gif || autoplay - = image_tag status.account.avatar_original_url, width: 48, height: 48, alt: '', class: 'u-photo account__avatar' - - else - = image_tag status.account.avatar_static_url, width: 48, height: 48, alt: '', class: 'u-photo account__avatar' - %span.display-name - %bdi - %strong.display-name__html.p-name.emojify= display_name(status.account, custom_emojify: true, autoplay: autoplay) - %span.display-name__account - = acct(status.account) - = fa_icon('lock') if status.account.locked? + .p-author.h-card + = link_to TagManager.instance.url_for(status.account), class: 'status__display-name u-url', target: stream_link_target, rel: 'noopener' do + .status__avatar + %div + - if current_account&.user&.setting_auto_play_gif || autoplay + = image_tag status.account.avatar_original_url, width: 48, height: 48, alt: '', class: 'u-photo account__avatar' + - else + = image_tag status.account.avatar_static_url, width: 48, height: 48, alt: '', class: 'u-photo account__avatar' + %span.display-name + %bdi + %strong.display-name__html.p-name.emojify= display_name(status.account, custom_emojify: true, autoplay: autoplay) + + %span.display-name__account + = acct(status.account) + = fa_icon('lock') if status.account.locked? .status__content.emojify< - if status.spoiler_text? %p{ :style => ('margin-bottom: 0' unless current_account&.user&.setting_expand_spoilers) }< diff --git a/app/views/stream_entries/show.html.haml b/app/views/stream_entries/show.html.haml index 2edc155bf..0e81c4f68 100644 --- a/app/views/stream_entries/show.html.haml +++ b/app/views/stream_entries/show.html.haml @@ -12,7 +12,7 @@ = opengraph 'og:site_name', site_title = opengraph 'og:type', 'article' = opengraph 'og:title', "#{display_name(@account)} (@#{@account.local_username_and_domain})" - = opengraph 'og:url', short_account_status_url(@account, @stream_entry) + = opengraph 'og:url', short_account_status_url(@account, @stream_entry.activity) = render 'stream_entries/og_description', activity: @stream_entry.activity = render 'stream_entries/og_image', activity: @stream_entry.activity, account: @account diff --git a/app/workers/activitypub/distribution_worker.rb b/app/workers/activitypub/distribution_worker.rb index c2bfd4f2f..17c1ef7ff 100644 --- a/app/workers/activitypub/distribution_worker.rb +++ b/app/workers/activitypub/distribution_worker.rb @@ -23,7 +23,7 @@ class ActivityPub::DistributionWorker private def skip_distribution? - @status.direct_visibility? + @status.direct_visibility? || @status.limited_visibility? end def relayable? diff --git a/app/workers/activitypub/processing_worker.rb b/app/workers/activitypub/processing_worker.rb index 0e2e0eddd..a8a3ebf0f 100644 --- a/app/workers/activitypub/processing_worker.rb +++ b/app/workers/activitypub/processing_worker.rb @@ -5,7 +5,7 @@ class ActivityPub::ProcessingWorker sidekiq_options backtrace: true - def perform(account_id, body) - ActivityPub::ProcessCollectionService.new.call(body, Account.find(account_id), override_timestamps: true) + def perform(account_id, body, delivered_to_account_id = nil) + ActivityPub::ProcessCollectionService.new.call(body, Account.find(account_id), override_timestamps: true, delivered_to_account_id: delivered_to_account_id) end end diff --git a/app/workers/activitypub/reply_distribution_worker.rb b/app/workers/activitypub/reply_distribution_worker.rb index fe99fc05f..c0ed3a1f4 100644 --- a/app/workers/activitypub/reply_distribution_worker.rb +++ b/app/workers/activitypub/reply_distribution_worker.rb @@ -9,7 +9,7 @@ class ActivityPub::ReplyDistributionWorker @status = Status.find(status_id) @account = @status.thread&.account - return if @account.nil? || skip_distribution? + return unless @account.present? && @status.distributable? ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url| [signed_payload, @status.account_id, inbox_url] @@ -20,10 +20,6 @@ class ActivityPub::ReplyDistributionWorker private - def skip_distribution? - @status.private_visibility? || @status.direct_visibility? - end - def inboxes @inboxes ||= @account.followers.inboxes end diff --git a/config/environments/production.rb b/config/environments/production.rb index 0b60585af..fbb059a79 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -13,7 +13,7 @@ Rails.application.configure do # Full error reports are disabled and caching is turned on. config.consider_all_requests_local = false config.action_controller.perform_caching = true - config.action_controller.asset_host = ENV['CDN_HOST'] if ENV.key?('CDN_HOST') + config.action_controller.asset_host = ENV['CDN_HOST'] if ENV['CDN_HOST'].present? # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index b3b9efb2a..76236aa21 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -31,7 +31,6 @@ if Rails.env.production? end end - # Report CSP violations to a specified URI # For further information see the following documentation: # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only diff --git a/config/initializers/cors.rb b/config/initializers/cors.rb index 36e2694e3..7b5b47b5e 100644 --- a/config/initializers/cors.rb +++ b/config/initializers/cors.rb @@ -9,6 +9,10 @@ Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins '*' + resource '/.well-known/*', + headers: :any, + methods: [:get], + credentials: false resource '/@:username', headers: :any, methods: [:get], diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index c77387ed4..2a963b32b 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -59,6 +59,7 @@ Doorkeeper.configure do :'write:accounts', :'write:blocks', :'write:bookmarks', + :'write:conversations', :'write:favourites', :'write:filters', :'write:follows', @@ -78,7 +79,6 @@ Doorkeeper.configure do :'read:lists', :'read:mutes', :'read:notifications', - :'read:reports', :'read:search', :'read:statuses', :follow, diff --git a/config/locales/activerecord.ast.yml b/config/locales/activerecord.ast.yml index 0d161faf2..6e32cbc2f 100644 --- a/config/locales/activerecord.ast.yml +++ b/config/locales/activerecord.ast.yml @@ -1 +1,2 @@ +--- ast: {} diff --git a/config/locales/activerecord.cy.yml b/config/locales/activerecord.cy.yml index 55eb78e74..265530124 100644 --- a/config/locales/activerecord.cy.yml +++ b/config/locales/activerecord.cy.yml @@ -10,4 +10,4 @@ cy: status: attributes: reblog: - taken: o'r statws sy'n bodoli'n barod + taken: o'r statws yn bodoli'n barod diff --git a/config/locales/ar.yml b/config/locales/ar.yml index dd434c373..095b1f584 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -30,24 +30,19 @@ ar: other_instances: خوادم أخرى privacy_policy: سياسة الخصوصية source_code: الشفرة المصدرية - status_count_after: - one: منشور - other: منشورات + status_count_after: منشورات status_count_before: نشروا terms: شروط الخدمة - user_count_after: - one: مستخدِم - other: مستخدِمين + user_count_after: مستخدِمين user_count_before: يستضيف what_is_mastodon: ما هو ماستدون ؟ accounts: choices_html: 'توصيات %{name} :' follow: إتبع - followers: - one: مُتابِع - other: مُتابِعون + followers: مُتابِعون following: مُتابَع joined: انضم·ت في %{date} + link_verified_on: تم التحقق مِن مالك هذا الرابط بتاريخ %{date} media: الوسائط moved_html: "%{name} إنتقلَ إلى %{new_profile_link} :" network_hidden: إنّ المعطيات غير متوفرة @@ -56,9 +51,7 @@ ar: people_who_follow: الأشخاص الذين يتبعون %{name} pin_errors: following: يجب أن تكون مِن متابعي حساب الشخص الذي تريد إبرازه - posts: - one: تبويق - other: تبويقات + posts: تبويقات posts_tab_heading: تبويقات posts_with_replies: التبويقات و الردود reserved_username: إسم المستخدم محجوز @@ -120,13 +113,14 @@ ar: moderation_notes: ملاحظات الإشراف most_recent_activity: آخر نشاط حديث most_recent_ip: أحدث عنوان إيبي + no_limits_imposed: مِن دون حدود مشروطة not_subscribed: غير مشترك order: alphabetic: أبجديًا most_recent: الأحدث title: الترتيب outbox_url: رابط صندوق الصادر - perform_full_suspension: تعطيل الحساب بالكامل + perform_full_suspension: تعطيل profile_url: رابط الملف الشخصي promote: ترقية protocol: البروتوكول @@ -155,8 +149,10 @@ ar: report: التقرير targeted_reports: التقريرات التي أُنشِأت ضد هذا الحساب silence: سكتهم + silenced: تم كتمه statuses: المنشورات subscribe: اشترك + suspended: تم تعليقه title: الحسابات unconfirmed_email: البريد الإلكتروني غير المؤكد undo_silenced: رفع الصمت @@ -166,13 +162,14 @@ ar: web: الويب action_logs: actions: - assigned_to_self_report: قام {name} بتعيين التقرير٪ {target} لأنفسهم - change_email_user: غيّر٪ {name} عنوان البريد الإلكتروني للمستخدم٪ {target} + assigned_to_self_report: قام %{name} بتعيين التقرير %{target} لأنفسهم + change_email_user: غيّر %{name} عنوان البريد الإلكتروني للمستخدم %{target} confirm_user: "%{name} قد قام بتأكيد عنوان البريد الإلكتروني لـ %{target}" create_custom_emoji: "%{name} قام برفع إيموجي جديد %{target}" create_domain_block: "%{name} قام بحجب نطاق %{target}" create_email_domain_block: "%{name} قد قام بحظر نطاق البريد الإلكتروني %{target}" demote_user: "%{name} قد قام بإنزال الرتبة الوظيفية لـ %{target}" + destroy_custom_emoji: قام %{name} بحذف الإيموجي %{target} destroy_domain_block: "%{name} قام بإلغاء الحجب عن النطاق %{target}" destroy_email_domain_block: قام %{name} بإضافة نطاق البريد الإلكتروني %{target} إلى اللائحة البيضاء destroy_status: لقد قام %{name} بحذف منشور %{target} @@ -183,13 +180,13 @@ ar: enable_user: لقد قام %{name} بتنشيط تسجيل الدخول للمستخدِم %{target} memorialize_account: لقد قام %{name} بتحويل حساب %{target} إلى صفحة تذكارية promote_user: "%{name} قام بترقية المستخدم %{target}" - remove_avatar_user: تمت إزالة٪ {name} الصورة الرمزية٪ {target} - reopen_report: تمت إعادة فتح التقرير {name}٪ {target} + remove_avatar_user: تمت إزالة %{name} الصورة الرمزية %{target} + reopen_report: تمت إعادة فتح التقرير %{name} %{target} reset_password_user: "%{name} لقد قام بإعادة تعيين الكلمة السرية الخاصة بـ %{target}" resolve_report: قام %{name} بحل التقرير %{target} silence_account: لقد قام %{name} بكتم حساب %{target} suspend_account: لقد قام %{name} بتعليق حساب %{target} - unassigned_report: "٪ {name} تقرير غير معتمد٪ {target}" + unassigned_report: "%{name} تقرير غير معتمد %{target}" unsilence_account: لقد قام %{name} بإلغاء الكتم عن حساب %{target} unsuspend_account: لقد قام %{name} بإلغاء التعليق المفروض على حساب %{target} update_custom_emoji: "%{name} قام بتحديث الإيموجي %{target}" @@ -258,15 +255,14 @@ ar: title: حجب نطاق جديد reject_media: رفض ملفات الوسائط reject_media_hint: يزيل ملفات الوسائط المخزنة محليًا ويرفض تنزيل أي ملفات في المستقبل. غير ذي صلة للتعليق + reject_reports: رفض التقارير severities: noop: لا شيء silence: إخفاء أو كتم suspend: تعليق severity: الشدة show: - affected_accounts: - one: حساب واحد معني في قاعدة البيانات - other: "%{count} حسابات معنية في قاعدة البيانات" + affected_accounts: "%{count} حسابات معنية في قاعدة البيانات" retroactive: silence: إلغاء الكتم عن كافة الحسابات المتواجدة على هذا النطاق suspend: إلغاء التعليق المفروض على كافة حسابات هذا النطاق @@ -300,7 +296,12 @@ ar: title: الدعوات relays: add_new: إضافة مُرحّل جديد + delete: حذف + disable: تعطيل + disabled: مُعطَّل + enable: تشغيل enable_hint: عندما تقوم بتنشيط هذه الميزة، سوف يشترك خادومك في جميع التبويقات القادمة مِن هذا المُرحِّل و سيشرع كذلك بإرسال كافة التبويقات العمومية إليه. + enabled: مُشغَّل inbox_url: رابط المُرحّل pending: في انتظار تسريح المُرحِّل save_and_enable: حفظ وتشغيل @@ -337,9 +338,7 @@ ar: reported_by: أبلغ عنه من طرف resolved: معالجة resolved_msg: تم حل تقرير بنجاح! - silence_account: كتم و إخفاء الحساب status: الحالة - suspend_account: فرض تعليق على الحساب title: التقارير unassign: إلغاء تعيين unresolved: غير معالجة @@ -364,7 +363,7 @@ ar: desc_html: أسماء النطاقات التي إلتقى بها مثيل الخادوم على البيئة الموحَّدة فيديفرس title: نشر عدد مثيلات الخوادم التي تم مصادفتها preview_sensitive_media: - desc_html: روابط المُعَاينة على مواقع الويب الأخرى ستقوم بعرض صُوَر مصغّرة حتى و إن كانت الوسائط حساسة. + desc_html: روابط المُعَاينة على مواقع الويب الأخرى ستقوم بعرض صُوَر مصغّرة حتى و إن كانت الوسائط حساسة title: إظهار الصور الحساسة في مُعاينات أوبن غراف registrations: closed_message: @@ -434,7 +433,7 @@ ar: admin_mailer: new_report: body: قام %{reporter} بالإبلاغ عن %{target} - body_remote: أبلغ شخص ما من٪ {domain} عن٪ {target} + body_remote: أبلغ شخص ما من %{domain} عن %{target} subject: تقرير جديد ل%{instance} (#%{id}) application_mailer: notification_preferences: تعديل خيارات البريد الإلكتروني @@ -452,7 +451,7 @@ ar: warning: كن حذرا مع هذه البيانات. لا تقم أبدا بمشاركتها مع الآخَرين ! your_token: رمز نفاذك auth: - agreement_html: بقبولك التسجيل فإنك تُصرِّح قبول <a href="%{rules_path}">قواعد مثيل الخادوم</a> و <a href="%{terms_path}">شروط الخدمة التي نوفرها لك</a>. + agreement_html: بمجرد النقر على "التسجيل" أسفله، فإنك تُصرِّح قبول <a href="%{rules_path}">قواعد مثيل الخادوم</a> و <a href="%{terms_path}">شروط الخدمة التي نوفرها لك</a>. change_password: الكلمة السرية confirm_email: تأكيد عنوان البريد الإلكتروني delete_account: حذف حساب @@ -562,10 +561,9 @@ ar: resources: الموارد generic: changes_saved_msg: تم حفظ التعديلات بنجاح ! + copy: نسخ save_changes: حفظ التغييرات - validation_errors: - one: هناك شيء ما لا يبدو أنه على ما يُرام بعدُ. يُرجى الإطلاع على الخطأ أدناه - other: هناك شيء ليس على ما يُرام! يُرجى معاينة الأخطاء الـ %{count} التالية + validation_errors: هناك شيء ليس على ما يُرام! يُرجى معاينة الأخطاء الـ %{count} التالية imports: preface: بإمكانك استيراد بيانات قد قُمتَ بتصديرها مِن مثيل خادوم آخَر، كقوائم المستخدِمين الذين كنتَ تتابِعهم أو قُمتَ بحظرهم. success: تم تحميل بياناتك بنجاح وسيتم معالجتها في الوقت المناسب @@ -588,9 +586,7 @@ ar: expires_in_prompt: أبدا generate: توليد invited_by: 'تمت دعوتك من طرف :' - max_uses: - one: استعمال واحد - other: "%{count} استخدامات" + max_uses: "%{count} استخدامات" max_uses_prompt: بلا حدود prompt: توليد و مشاركة روابط للسماح للآخَرين بالنفاذ إلى مثيل الخادوم هذا table: @@ -616,12 +612,8 @@ ar: action: معاينة كافة الإشعارات body: هذا هو مُلَخَّص الرسائل التي فاتتك وذلك منذ آخر زيارة لك في %{since} mention: "%{name} أشار إليك في :" - new_followers_summary: - one: و لقد تحصّلت أيضا على متابِع جديد أثناء فترة غيابك! يا للروعة! - other: رائع، لقد قام بمتابعتك %{count} مُتابِعون جُدد أثناء فترة غيابك عن ماستدون ! - subject: - one: "إشعار جديد واحد منذ آخر زيارة لك لـ \U0001F418" - other: "%{count} إشعارات جديدة منذ آخر زيارة لك إلى \U0001F418" + new_followers_summary: رائع، لقد قام بمتابعتك %{count} مُتابِعون جُدد أثناء فترة غيابك عن ماستدون ! + subject: "%{count} إشعارات جديدة منذ آخر زيارة لك إلى \U0001F418" title: أثناء فترة غيابك … favourite: body: 'أُعجب %{name} بمنشورك :' @@ -739,17 +731,11 @@ ar: statuses: attached: description: 'مُرفَق : %{attached}' - image: - one: "%{count} صورة" - other: "%{count} صُوَر" - video: - one: "%{count} فيديو" - other: "%{count} فيديوهات" + image: "%{count} صُوَر" + video: "%{count} فيديوهات" boosted_from_html: تم إعادة ترقيته مِن %{acct_link} content_warning: 'تحذير عن المحتوى : %{warning}' - disallowed_hashtags: - one: 'يحتوي على وسم ممنوع: %{tags}' - other: 'يحتوي على أحد الوسوم الممنوعة: %{tags}' + disallowed_hashtags: 'يحتوي على أحد الوسوم الممنوعة: %{tags}' language_detection: اكتشاف اللغة تلقائيا open_in_web: إفتح في الويب over_character_limit: تم تجاوز حد الـ %{max} حرف المسموح بها @@ -821,8 +807,11 @@ ar: tips: نصائح title: أهلاً بك، %{name} ! users: + follow_limit_reached: لا يمكنك متابعة أكثر مِن %{limit} أشخاص invalid_email: عنوان البريد الإلكتروني غير صالح invalid_otp_token: رمز المصادقة بخطوتين غير صالح otp_lost_help_html: إن فقدتَهُما ، يمكنك الإتصال بـ %{email} seamless_external_login: لقد قمت بتسجيل الدخول عبر خدمة خارجية، إنّ إعدادات الكلمة السرية و البريد الإلكتروني غير متوفرة. signed_in_as: 'تم تسجيل دخولك بصفة :' + verification: + verification: التحقق diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 98986cdd0..f787e98f8 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -21,8 +21,7 @@ ast: hosted_on: Mastodon ta agospiáu en %{domain} learn_more: Deprendi más source_code: Códigu fonte - status_count_after: - other: estaos + status_count_after: estaos terms: Términos del serviciu user_count_after: usuarios what_is_mastodon: "¿Qué ye Mastodon?" diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 8c11ac7b7..91c6dfb61 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -48,11 +48,11 @@ bg: half_a_minute: Току-що less_than_x_minutes: "%{count} мин." less_than_x_seconds: Току-що - over_x_years: "%{count} г." + over_x_years: "%{count} г" x_days: "%{count} дни" - x_minutes: "%{count} мин." - x_months: "%{count} м." - x_seconds: "%{count} сек." + x_minutes: "%{count} мин" + x_months: "%{count} м" + x_seconds: "%{count} сек" exports: blocks: Вашите блокирания csv: CSV @@ -61,12 +61,10 @@ bg: generic: changes_saved_msg: Успешно запазване на промените! save_changes: Запази промените - validation_errors: - one: Нещо все още не е наред! Моля, прегледай грешката по-долу - other: Нещо все още не е наред! Моля, прегледай грешките по-долу + validation_errors: Нещо все още не е наред! Моля, прегледай грешките по-долу imports: preface: Можеш да импортираш някои данни, като например всички хора, които следваш или блокираш в акаунта си на тази инстанция, от файлове, създадени чрез експорт в друга инстанция. - success: Твоите данни бяха успешно качени и ще бъдат обработени впоследствие. + success: Твоите данни бяха успешно качени и ще бъдат обработени впоследствие types: blocking: Списък на блокираните following: Списък на последователите @@ -77,7 +75,7 @@ bg: too_many: Не мога да прикача повече от 4 файла notification_mailer: digest: - body: 'Ето кратко резюме на нещата, които се случиха от последното ти посещение в %{instance} на %{since}:' + body: 'Ето кратко резюме на нещата, които се случиха от последното ти посещение на %{since}:' mention: "%{name} те спомена в:" new_followers_summary: one: Имаш един нов последовател! Ура! diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 4332920f5..b65257f24 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -48,6 +48,7 @@ ca: other: Seguidors following: Seguint joined: Unit des de %{date} + link_verified_on: La propietat d'aquest enllaç s'ha verificat el %{date} media: Mèdia moved_html: "%{name} s'ha mogut a %{new_profile_link}:" network_hidden: Aquesta informació no està disponible @@ -120,13 +121,14 @@ ca: moderation_notes: Notes de moderació most_recent_activity: Activitat més recent most_recent_ip: IP més recent + no_limits_imposed: Sense límits imposats not_subscribed: No subscrit order: alphabetic: Alfabètic most_recent: Més recent title: Ordre outbox_url: URL de la bústia de sortida - perform_full_suspension: Aplica una suspensió completa + perform_full_suspension: Suspèn profile_url: URL del perfil promote: Promociona protocol: Protocol @@ -155,8 +157,10 @@ ca: report: informe targeted_reports: Informes realitzats sobre aquest compte silence: Silenci + silenced: Silenciat statuses: Estats subscribe: Subscriu + suspended: Suspès title: Comptes unconfirmed_email: Correu electrònic sense confirmar undo_silenced: Deixa de silenciar @@ -173,6 +177,7 @@ ca: create_domain_block: "%{name} ha blocat el domini %{target}" create_email_domain_block: "%{name} ha afegit a la llista negra el domini del correu electrònic %{target}" demote_user: "%{name} ha degradat l'usuari %{target}" + destroy_custom_emoji: "%{name} ha destruït l'emoji %{target}" destroy_domain_block: "%{name} ha desblocat el domini %{target}" destroy_email_domain_block: "%{name} ha afegit a la llista negra el domini de correu electrònic %{target}" destroy_status: "%{name} eliminat l'estat per %{target}" @@ -240,8 +245,8 @@ ca: total_users: usuaris en total trends: Tendències week_interactions: interaccions d'aquesta setmana - week_users_active: actiu aquesta setmana - week_users_new: usuaris aquesta setmana + week_users_active: usuaris actius aquesta setmana + week_users_new: nous usuaris aquest setmana domain_blocks: add_new: Afegeix created_msg: El bloqueig de domini ara s'està processant @@ -258,6 +263,8 @@ ca: title: Bloqueig de domini nou reject_media: Rebutja els fitxers multimèdia reject_media_hint: Elimina els fitxers multimèdia emmagatzemats localment i impedeix baixar-ne cap en el futur. Irrellevant en les suspensions + reject_reports: Rebutja informes + reject_reports_hint: Ignora tots els informes procedents d'aquest domini. No és rellevant per a les suspensions severities: noop: Cap silence: Silenci @@ -300,8 +307,13 @@ ca: title: Convida relays: add_new: Afegiu un nou relay + delete: Esborra description_html: Un <strong>relay de federació</strong> és un servidor intermediari que intercanvia grans volums de toots públics entre servidors que es subscriuen i publiquen en ell. <strong>Pot ajudar a servidors petits i mitjans a descobrir contingut del fedivers</strong>, no fent necessari que els usuaris locals manualment segueixin altres persones de servidors remots. + disable: Inhabilita + disabled: Desactivat + enable: Activat enable_hint: Una vegada habilitat, el teu servidor es subscriurà a tots els toots públics d'aquest relay i començarà a enviar-hi tots els toots públics d'aquest servidor. + enabled: Activat inbox_url: URL del Relay pending: S'està esperant l'aprovació del relay save_and_enable: Desa i activa @@ -336,9 +348,7 @@ ca: reported_by: Reportat per resolved: Resolt resolved_msg: Informe resolt amb èxit! - silence_account: Silencia el compte status: Estat - suspend_account: Suspèn el compte title: Informes unassign: Treure assignació unresolved: No resolt @@ -359,6 +369,9 @@ ca: hero: desc_html: Es mostra en pàgina frontal. Recomanat 600x100px al menys. Si no es configura es mostrarà el de la instància title: Imatge d’heroi + mascot: + desc_html: Es mostra a diverses pàgines. Es recomana com a mínim 293 × 205px. Si no està configurat, torna a la mascota predeterminada + title: Imatge de la mascota peers_api_enabled: desc_html: Els noms de domini que ha trobat aquesta instància al fediverse title: Publica la llista d'instàncies descobertes @@ -452,7 +465,7 @@ ca: warning: Aneu amb compte amb aquestes dades. No les compartiu mai amb ningú! your_token: El teu identificador d'accés auth: - agreement_html: En inscriure't, acceptes seguir <a href="%{rules_path}">els nostres termes del servei</a> i <a href="%{terms_path}">la nostra política de privadesa</a>. + agreement_html: Al fer clic en "Registre" acceptes respectar <a href="%{rules_path}">els nostres termes del servei</a> i <a href="%{terms_path}">la nostra política de privadesa</a>. change_password: Contrasenya confirm_email: Confirmar correu electrònic delete_account: Suprimeix el compte @@ -567,6 +580,7 @@ ca: resources: Recursos generic: changes_saved_msg: Els canvis s'han desat correctament! + copy: Copia save_changes: Desa els canvis validation_errors: one: Alguna cosa no va bé! Si us plau, revisa l'error @@ -619,7 +633,7 @@ ca: notification_mailer: digest: action: Veure totes les notificacions - body: Un resum del que et vas perdre en %{instance} desde la darrera visita el %{since} + body: Un resum del que et vas perdre desde la darrera visita el %{since} mention: "%{name} t'ha mencionat en:" new_followers_summary: one: A més, has adquirit un nou seguidor durant la teva absència! Visca! @@ -904,8 +918,12 @@ ca: tips: Consells title: Benvingut a bord, %{name}! users: + follow_limit_reached: No pots seguir més de %{limit} persones invalid_email: L'adreça de correu no és correcta invalid_otp_token: El codi de dos factors no és correcte otp_lost_help_html: Si has perdut l'accés a tots dos pots contactar per %{email} seamless_external_login: Has iniciat sessió via un servei extern per tant els ajustos de contrasenya i correu electrònic no estan disponibles. signed_in_as: 'Sessió iniciada com a:' + verification: + explanation_html: 'Pots <strong>verificar-te com a propietari dels enllaços a les metadades del teu perfil</strong>. Per això, el lloc web enllaçat ha de contenir un enllaç al teu perfil de Mastodon. El vincle <strong>ha de</strong> tenir l''atribut <code>rel="me"</code>. El contingut del text de l''enllaç no importa. Aquí tens un exemple:' + verification: Verificació diff --git a/config/locales/co.yml b/config/locales/co.yml index 0172fba8d..9306c6c33 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -48,6 +48,7 @@ co: other: Abbunati following: Abbunamenti joined: Quì dapoi %{date} + link_verified_on: A pruprietà d'issu ligame hè stata verificata u %{date} media: Media moved_html: "%{name} hà cambiatu di contu, avà hè nant’à %{new_profile_link}:" network_hidden: St'infurmazione ùn hè micca dispunibule @@ -120,13 +121,14 @@ co: moderation_notes: Note di muderazione most_recent_activity: Attività più ricente most_recent_ip: IP più ricente + no_limits_imposed: Nisuna limita imposta not_subscribed: Micca abbunatu order: alphabetic: Alfabeticu most_recent: Più ricente title: Urdine outbox_url: URL di l’outbox - perform_full_suspension: Fà una suspensione cumpleta + perform_full_suspension: Suspende profile_url: URL di u prufile promote: Prumove protocol: Prutucollu @@ -155,8 +157,10 @@ co: report: Signalamentu targeted_reports: Signalamenti creati contr’à stu contu silence: Silenzà + silenced: Silenzatu statuses: Statuti subscribe: Abbunassi + suspended: Suspesu title: Conti unconfirmed_email: E-mail micca cunfirmatu undo_silenced: Ùn silenzà più @@ -173,6 +177,7 @@ co: create_domain_block: "%{name} hà bluccatu u duminiu %{target}" create_email_domain_block: "%{name} hà messu u duminiu e-mail %{target} nant’a lista nera" demote_user: "%{name} hà ritrugradatu l’utilizatore %{target}" + destroy_custom_emoji: "%{name} hà sguassatu l'emoji %{target}" destroy_domain_block: "%{name} hà sbluccatu u duminiu %{target}" destroy_email_domain_block: "%{name} hà messu u duminiu e-mail %{target} nant’a lista bianca" destroy_status: "%{name} hà toltu u statutu di %{target}" @@ -258,6 +263,8 @@ co: title: Novu blucchime di duminiu reject_media: Righjittà i fugliali media reject_media_hint: Sguassa tutti i media caricati è ricusa caricamenti futuri. Inutile per una suspensione + reject_reports: Righjittà i rapporti + reject_reports_hint: Ignurà tutti i signalamenti chì venenu d'issu duminiu. Senz'oghjettu pè e suspensione severities: noop: Nisuna silence: Silenzà @@ -300,8 +307,13 @@ co: title: Invitazione relays: add_new: Aghjustà un ripetitore + delete: Sguassà description_html: Un <strong>ripetitore di federazione</strong> ghjè un servore intermediariu chì manda statuti pubblichi trà l'istanze abbunate. <strong>Pò aiutà l'istanze chjuche è mezane à scuprì u cuntinutu di u fediverse</strong> senza chì l'utilizatori appianu bisognu di seguità tutti i conti di l'altri servori. + disable: Disattivà + disabled: Disattivatu + enable: Attivà enable_hint: Quandu sarà attivatu, u vostru servore hà da seguità i statuti pubblichi di u ripetitore, è mandarà i so statuti pubblichi quallà. + enabled: Attivatu inbox_url: URL di u ripetitore pending: In attesa di l'apprubazione di u ripetitore save_and_enable: Salvà è attivà @@ -336,9 +348,7 @@ co: reported_by: Palisatu da resolved: Scioltu è chjosu resolved_msg: Signalamentu scioltu! - silence_account: Silenzà u contu status: Statutu - suspend_account: Suspende u contu title: Signalamenti unassign: Disassignà unresolved: Micca sciolti @@ -359,6 +369,9 @@ co: hero: desc_html: Affissatu nant’a pagina d’accolta. Ricumandemu almenu 600x100px. S’ellu ùn hè micca definiti, a vignetta di l’istanza sarà usata title: Ritrattu di cuprendula + mascot: + desc_html: Affissata nant'à parechje pagine. Almenu 293x205px ricumandatu. S'ella hè lasciata viota, a mascotta predefinita sarà utilizata + title: Ritrattu di a mascotta peers_api_enabled: desc_html: Indirizzi st’istanza hà vistu indè u fediverse title: Pubblicà a lista d’istanza cunnisciute @@ -452,7 +465,7 @@ co: warning: Abbadate à quessi dati. Ùn i date à nisunu! your_token: Rigenerà a fiscia d’accessu auth: - agreement_html: Arregistrassi vole dì chì site d’accunsentu per siguità <a href="%{rules_path}">e regule di l’istanza</a> è <a href="%{terms_path}">e cundizione d’usu</a>. + agreement_html: Cliccà "Arregistrassi" quì sottu vole dì chì site d’accunsentu per siguità <a href="%{rules_path}">e regule di l’istanza</a> è <a href="%{terms_path}">e cundizione d’usu</a>. change_password: Chjave d’accessu confirm_email: Cunfirmà l’e-mail delete_account: Sguassà u contu @@ -567,6 +580,7 @@ co: resources: Risorze generic: changes_saved_msg: Cambiamenti salvati! + copy: Cupià save_changes: Salvà e mudificazione validation_errors: one: Qualcosa ùn và bè! Verificate u prublemu quì sottu @@ -908,8 +922,12 @@ co: tips: Cunsiglii title: Benvenutu·a, %{name}! users: + follow_limit_reached: Ùn pidete seguità più di %{limit} conti invalid_email: L’indirizzu e-mail ùn hè currettu invalid_otp_token: U codice d’identificazione ùn hè currettu otp_lost_help_html: S’è voi avete persu i dui, pudete cuntattà %{email} seamless_external_login: Site cunnettatu·a dapoi un serviziu esternu, allora i parametri di chjave d’accessu è d’indirizzu e-mail ùn so micca dispunibili. signed_in_as: 'Cunnettatu·a cum’è:' + verification: + explanation_html: 'Pudete <strong>verificavi cum''è u pruprietariu di i ligami in i metadati di u vostru prufile</strong>. Per quessa, u vostru situ deve avè un ligame versu a vostra pagina Mastodon. U ligame <strong>deve</strong> avè un''attributu <code>rel="me"</code>. U cuntenutu di u testu di u ligame ùn hè micca impurtante. Eccu un''esempiu:' + verification: Verificazione diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 5408c2472..05f65653b 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -1,13 +1,13 @@ --- cs: about: - about_hashtag_html: Toto jsou veřejné tooty označené hashtagem <strong>#%{hashtag}</strong>. Pokud máte účet kdekoliv na fediverse, můžete s nimi interagovat. + about_hashtag_html: Tohle jsou veřejné tooty označené hashtagem <strong>#%{hashtag}</strong>. Pokud máte účet kdekoliv na fediverse, můžete s nimi interagovat. about_mastodon_html: Mastodon je sociální síť založená na otevřených webových protokolech a svobodném, otevřeném softwaru. Je decentrovalizovaná jako e-mail. about_this: O této instanci - administered_by: 'Server spravuje:' + administered_by: 'Instanci spravuje:' api: API apps: Mobilní aplikace - closed_registrations: Registrace na této instanci jsou momentálně uzavřené. Můžete si však najít jinou instanci, vytvořit si na ní účet a získat z ní přístup do naprosto stejné sítě. + closed_registrations: Registrace na této instanci jsou momentálně uzavřené. Ale pozor! Můžete si najít jinou instanci, vytvořit si na ní účet a získat z ní přístup do naprosto stejné sítě. contact: Kontakt contact_missing: Nenastaveno contact_unavailable: Neuvedeno @@ -16,7 +16,7 @@ cs: <h3>Dobré místo pro pravidla</h3> <p>Rozšířený popis ještě nebyl nastaven.</p> features: - humane_approach_body: Mastodon, poučen z chyb jiných sociálních sítí, se snaží bojovat se zneužíváním sociálních sítí vytvářením etických možností. + humane_approach_body: Mastodon se učí z chyb jiných sociálních sítí a volením etických rozhodnutí při designu se snaží bojovat s jejich zneužíváním. humane_approach_title: Lidštější přístup not_a_product_body: Mastodon není komerční síť. Žádné reklamy, žádné dolování dat, žádné hranice. Žádná centrální autorita. not_a_product_title: Jste osoba, ne produkt @@ -25,29 +25,24 @@ cs: within_reach_body: Několik aplikací pro iOS, Android a jiné platformy vám díky jednoduchému API ekosystému dovolují držet krok s vašimi přáteli, ať už jste kdekoliv. within_reach_title: Vždy v dosahu generic_description: "%{domain} je jedním ze serverů v síti" - hosted_on: Mastodon hostovaný na %{domain} + hosted_on: Instance Mastodon na adrese %{domain} learn_more: Zjistit více other_instances: Seznam instancí privacy_policy: Zásady soukromí source_code: Zdrojový kód - status_count_after: - one: příspěvek - other: příspěvků + status_count_after: příspěvků status_count_before: Kteří napsali terms: Podmínky používání - user_count_after: - one: uživatele - other: uživatelů + user_count_after: uživatelů user_count_before: Domov what_is_mastodon: Co je Mastodon? accounts: choices_html: 'Volby uživatele %{name}:' follow: Sledovat - followers: - one: Sledovatel - other: Sledovatelé - following: Sleduje + followers: Sledovatelé + following: Sledovaní joined: Připojil/a se v %{date} + link_verified_on: Vlastnictví tohoto odkazu bylo zkontrolováno %{date} media: Média moved_html: 'Účet %{name} byl přesunut na %{new_profile_link}:' network_hidden: Tato informace není k dispozici @@ -56,9 +51,7 @@ cs: people_who_follow: Lidé, kteří sledují uživatele %{name} pin_errors: following: Musíte již sledovat osobu, kterou chcete podpořit - posts: - one: Toot - other: Tooty + posts: Tooty posts_tab_heading: Tooty posts_with_replies: Tooty a odpovědi reserved_username: Toto uživatelské jméno je rezervováno @@ -111,22 +104,23 @@ cs: title: Umístění login_status: Stav přihlášení media_attachments: Mediální přílohy - memorialize: Změnit na "in memoriam" + memorialize: Změnit na „in memoriam“ moderation: all: Vše - silenced: Utišen - suspended: Suspendován + silenced: Utišen/a + suspended: Suspendován/a title: Moderace moderation_notes: Moderační poznámky most_recent_activity: Nejnovější aktivita most_recent_ip: Nejnovější IP + no_limits_imposed: Nejsou nastavena žádná omezení not_subscribed: Neodebírá order: alphabetic: Abecedně most_recent: Nejnovější title: Pořadí outbox_url: URL odchozích zpráv - perform_full_suspension: Provést plnou suspenzaci + perform_full_suspension: Suspendovat profile_url: URL profilu promote: Povýšit protocol: Protokol @@ -155,8 +149,10 @@ cs: report: nahlášení targeted_reports: Nahlášení vytvořena o tomto účtu silence: Utišit + silenced: Utišen/a statuses: Příspěvky subscribe: Odebírat + suspended: Suspendován/a title: Účty unconfirmed_email: Nepotvrzený e-mail undo_silenced: Zrušit utišení @@ -173,6 +169,7 @@ cs: create_domain_block: "%{name} zablokoval/a doménu %{target}" create_email_domain_block: "%{name} přidal/a e-mailovou doménu %{target} na černou listinu" demote_user: "%{name} degradoval/a uživatele %{target}" + destroy_custom_emoji: "%{name} zničil/a emoji %{target}" destroy_domain_block: "%{name} odblokoval/a doménu %{target}" destroy_email_domain_block: "%{name} odebral/a e-mailovou doménu %{target} z černé listiny" destroy_status: "%{name} odstranil/a příspěvek uživatele %{target}" @@ -181,7 +178,7 @@ cs: disable_user: "%{name} zakázal/a přihlašování pro uživatele %{target}" enable_custom_emoji: "%{name} povolil/a emoji %{target}" enable_user: "%{name} povolil/a přihlašování pro uživatele %{target}" - memorialize_account: '%{name} změnil/a účet %{target} na stránku "in memoriam"' + memorialize_account: "%{name} změnil/a účet %{target} na stránku „in memoriam“" promote_user: "%{name} povýšil/a uživatele %{target}" remove_avatar_user: "%{name} odstranil/a avatar uživatele %{target}" reopen_report: "%{name} znovuotevřel/a nahlášení %{target}" @@ -258,15 +255,15 @@ cs: title: Nová doménová blokace reject_media: Odmítat mediální soubory reject_media_hint: Odstraní lokálně uložené soubory a odmítne jejich stažení v budoucnosti. Irelevantní pro suspenzace + reject_reports: Odmítnout nahlášení + reject_reports_hint: Ignorovat všechna nahlášení pocházející z této domény. Nepodstatné pro suspenzace severities: noop: Žádné silence: Utišit suspend: Suspendovat severity: Přísnost show: - affected_accounts: - one: Jeden účet v databázi byl ovlivněn - other: "%{count} účtů v databázi byl ovlivněn" + affected_accounts: "%{count} účtů v databázi byl ovlivněn" retroactive: silence: Odtišit všechny existující účty z této domény suspend: Zrušit suspenzaci všech existujících účtů z této domény @@ -300,8 +297,13 @@ cs: title: Pozvánky relays: add_new: Přidat nový most + delete: Smazat description_html: "<strong>Federovací most</strong> je přechodný server, který vyměňuje velká množství veřejných tootů mezi servery, které z něj odebírají a poblikují na něj. <strong>Může pomoci malým a středně velkým serverům objevovat obsah z fediverse</strong>, což by jinak vyžadovalo, aby místní uživatelé manuálně sledovali jiné lidi na vzdálených serverech." + disable: Zakázat + disabled: Zakázáno + enable: Povolit enable_hint: Je-li tohle povoleno, začne váš server odebírat všechny veřejné tooty z tohoto mostu a odesílat na něj své vlastní veřejné tooty. + enabled: Povoleno inbox_url: URL mostu pending: Čekám na souhlas mostu save_and_enable: Uložit a povolit @@ -336,9 +338,7 @@ cs: reported_by: Nahlášeno uživatelem resolved: Vyřešeno resolved_msg: Nahlášení úspěšně vyřešeno! - silence_account: Utišit účet status: Stav - suspend_account: Suspendovat účet title: Nahlášení unassign: Odebrat unresolved: Nevyřešeno @@ -357,8 +357,11 @@ cs: desc_html: Pozměnit vzhled pomocí šablony CSS načtené na každé stránce title: Vlastní CSS hero: - desc_html: Zobrazuje se na hlavní stránce. Doporučuje se rozlišení alespoň 600x100px. Pokud toto není nastavené, bude zobrazena miniatura instance + desc_html: Zobrazuje se na hlavní stránce. Doporučuje se rozlišení alespoň 600x100 px. Pokud toto není nastaveno, bude zobrazena miniatura instance title: Hlavní obrázek + mascot: + desc_html: Zobrazuje se na hlavní stránce. Doporučuje se rozlišení alespoň 293x205 px. Pokud toto není nastaveno, bude zobrazen výchozí maskot + title: Obrázek maskota peers_api_enabled: desc_html: Domény, na které tato instance narazila ve fediverse title: Zveřejnit seznam objevených instancí @@ -452,7 +455,7 @@ cs: warning: Buďte s těmito daty velmi opatrní. Nikdy je s nikým nesdílejte! your_token: Váš přístupový token auth: - agreement_html: Registrací souhlasíte s následováním <a href="%{rules_path}">pravidel této instance</a> a <a href="%{terms_path}">našich podmínek používání</a>. + agreement_html: Kliknutím na tlačítko „Registrovat“ souhlasíte s následováním <a href="%{rules_path}">pravidel této instance</a> a <a href="%{terms_path}">našich podmínek používání</a>. change_password: Heslo confirm_email: Potvrdit e-mail delete_account: Odstranit účet @@ -555,9 +558,7 @@ cs: followers_count: Počet sledovatelů lock_link: Zamkněte svůj účet purge: Odstranit ze sledovatelů - success: - one: V průběhu utišování sledovatelů z jedné domény... - other: V průběhu utišování sledovatelů z %{count} domén... + success: V průběhu utišování sledovatelů z %{count} domén... true_privacy_html: Berte prosím na vědomí, že <strong>skutečného soukromí se dá dosáhnout pouze za pomoci end-to-end šifrování</strong>. unlocked_warning_html: Kdokoliv vás může sledovat a okamžitě vidět vaše soukromé příspěvky. %{lock_link}, abyste mohl/a zkontrolovat a odmítnout sledovatele. unlocked_warning_title: Váš účet není zamknutý @@ -567,10 +568,9 @@ cs: resources: Zdroje generic: changes_saved_msg: Změny byly úspěšně uloženy! + copy: Kopírovat save_changes: Uložit změny - validation_errors: - one: Něco ještě není úplně v pořádku! Prosím zkontrolujte chybu níže - other: Něco ještě není úplně v pořádku! Prosím zkontrolujte %{count} chyb níže + validation_errors: Něco ještě není úplně v pořádku! Prosím zkontrolujte %{count} chyb níže imports: preface: Můžete importovat data, která jste exportoval/a z jiné instance, jako například seznam lidí, které sledujete či blokujete. success: Vaše data byla úspěšně nahrána a nyní budou zpracována v daný čas @@ -593,9 +593,7 @@ cs: expires_in_prompt: Nikdy generate: Vygenerovat invited_by: 'Byl/a jste pozván/a uživatelem:' - max_uses: - one: 1 použití - other: "%{count} použití" + max_uses: "%{count} použití" max_uses_prompt: Bez limitu prompt: Vygenerujte a sdílejte s ostatními odkazy a umožněte jim přístup na tuto instanci table: @@ -621,13 +619,9 @@ cs: action: Zobrazit všechna oznámení body: Zde najdete stručný souhrn zpráv, které jste zmeškal/a od vaší poslední návštěvy %{since} mention: "%{name} vás zmínil/a v:" - new_followers_summary: - one: Navíc jste získal/a jednoho nového sledovatele, zatímco jste byl/a pryč! Hurá! - other: Navíc jste získal/a %{count} nových sledovatelů, zatímco jste byl/a pryč! Hurá! - subject: - one: "Jedno nové oznámení od vaší poslední návštěvy \U0001F418" - other: "%{count} nových oznámení od vaší poslední návštěvy \U0001F418" - title: Ve vaší absenci... + new_followers_summary: Navíc jste získal/a %{count} nových sledovatelů, zatímco jste byl/a pryč! Hurá! + subject: "%{count} nových oznámení od vaší poslední návštěvy \U0001F418" + title: Ve vaší nepřítomnosti... favourite: body: 'Váš příspěvek si oblíbil/a %{name}:' subject: "%{name} si oblíbil/a váš příspěvek" @@ -743,28 +737,22 @@ cs: statuses: attached: description: 'Přiloženo: %{attached}' - image: - one: "%{count} obrázek" - other: "%{count} obrázků" - video: - one: "%{count} video" - other: "%{count} videí" + image: "%{count} obrázků" + video: "%{count} videí" boosted_from_html: Boostnuto z %{acct_link} content_warning: 'Varování o obsahu: %{warning}' - disallowed_hashtags: - one: 'obsahuje nepovolený hashtag: %{tags}' - other: 'obsahuje nepovolené hashtagy: %{tags}' + disallowed_hashtags: 'obsahuje nepovolené hashtagy: %{tags}' language_detection: Zjistit jazyk automaticky open_in_web: Otevřít na webu over_character_limit: limit %{max} znaků byl překročen pin_errors: limit: Už jste si připnul/a maximální počet tootů - ownership: Nelže připnout toot někoho jiného + ownership: Nelze připnout toot někoho jiného private: Nelze připnout neveřejné tooty reblog: Nelze připnout boostnutí show_more: Zobrazit více sign_in_to_participate: Chcete-li se účastnit této konverzace, přihlaste se - title: '%{name}: "%{quote}"' + title: "%{name}: „%{quote}“" visibilities: private: Pouze pro sledovatele private_long: Zobrazit pouze sledovatelům @@ -783,7 +771,7 @@ cs: <ul> <li><em>Základní informace o účtu</em>: Pokud se na tomto serveru zaregistrujete, můžeme vás požádat o zadání uživatelského jména, e-mailové adresy a hesla. Můžete také zadat dodatečné profilové informace, jako například zobrazované jméno a krátký životopis, a nahrát si profilovou fotografii a hlavičkový obrázek. Uživatelské i zobrazované jméno, životopis, profilová fotografie a hlavičkový obrázek jsou vždy uvedeny veřejně.</li> - <li><em>Příspěvky, sledovatelé a další veřejné informace</em>: Seznam lidí, které sledujete, je uveden veřejně, totéž platí i pro vaše sledovatele. Když sem nahrajete zprávu, bude uloženo datum a čas, společně s aplikací, ze které jste zprávu odeslali. Zprávy mohou obsahovat mediální přílohy, jako jsou obrázky a videa. Veřejné a nezobrazované příspěvky jsou dostupné veřejně. Pokud na vašem profilu uvedete příspěvek, je to také veřejně dostupná informace. Vaše příspěvky jsou doručeny vašim sledovatelům, což v některých případech znamená, že budou doručeny na různé servery, na kterých budou ukládány kopie. Pokud příspěvky smažete, bude tohle taktéž doručeno vašim sledovatelům. Akce znovusdílení nebo oblíbení jiného příspěvku je vždy veřejná.</li> + <li><em>Příspěvky, sledovatelé a další veřejné informace</em>: Seznam lidí, které sledujete, je uveden veřejně, totéž platí i pro vaše sledovatele. Když sem nahrajete zprávu, bude uloženo datum a čas, společně s aplikací, ze které jste zprávu odeslali. Zprávy mohou obsahovat mediální přílohy, jako jsou obrázky a videa. Veřejné a neuvedené příspěvky jsou dostupné veřejně. Pokud na vašem profilu uvedete příspěvek, je to také veřejně dostupná informace. Vaše příspěvky jsou doručeny vašim sledovatelům, což v některých případech znamená, že budou doručeny na různé servery, na kterých budou ukládány kopie. Pokud příspěvky smažete, bude tohle taktéž doručeno vašim sledovatelům. Akce znovusdílení nebo oblíbení jiného příspěvku je vždy veřejná.</li> <li><em>Příspěvky přímé a pouze pro sledovatele</em>: Všechny příspěvky jsou uloženy a zpracovány na serveru. Příspěvky pouze pro sledovatele jsou doručeny vašim sledovatelům a uživateům v nich zmíněných a přímé příspěvky jsou doručeny pouze uživatelům v nich zmíněných. V některých případech tohle znamená, že budou doručeny na různé servery, na kterých budou ukládány kopie. Snažíme se omezit přístup k těmto příspěvkům pouze na autorizované uživatele, ovšem jiné servery tak nemusejí učinit. Proto je důležité posoudit servery, ke kterým vaši sledovatelé patří. V nastavení si můžete zapnout volbu pro manuální schvalování či odmítnutí nových sledovatelů. <em>Prosím mějte na paměti, že operátoři tohoto serveru a kteréhokoliv přijímacího serveru mohou tyto zprávy vidět</em> a příjemci mohou vytvořit jejich snímek, zkopírovat je, nebo je jinak sdílet. <em>Nesdílejte přes Mastodon jakékoliv nebezpečné informace.</em></li> <li><em>IP adresy a další metadata</em>: Když se přihlásíte, zaznamenáváme IP adresu, ze které se přihlašujete, jakožto i název vašeho webového prohlížeče. Všechny vaše webové relace jsou v nastavení přístupné k vašemu posouzení a odvolání. Nejpozdější IP adresa použita je uložena maximálně do 12 měsíců. Můžeme také uchovávat serverové záznamy, které obsahují IP adresy každého požadavku odeslaného na náš server.</li> </ul> @@ -843,7 +831,7 @@ cs: <h3 id="children">Používání stránky dětmi</h3> - <p>Pokud se tento server nachází v EU nebo EHP: Naše stránka, produkty a služby jsou všechny směřovány na lidi, kterým je alespoň 16 let. Pokud je vám méně než 16, dle požadavků nařízení GDPR (<a href="https://cs.wikipedia.org/wiki/Obecn%C3%A9_na%C5%99%C3%ADzen%C3%AD_o_ochran%C4%9B_osobn%C3%ADch_%C3%BAdaj%C5%AF">Obecné nařízení o ochě sobních údajů</a>) tuto stránku nepoužívejte.</p> + <p>Pokud se tento server nachází v EU nebo EHP: Naše stránka, produkty a služby jsou všechny směřovány na lidi, kterým je alespoň 16 let. Pokud je vám méně než 16, dle požadavků nařízení GDPR (<a href="https://cs.wikipedia.org/wiki/Obecn%C3%A9_na%C5%99%C3%ADzen%C3%AD_o_ochran%C4%9B_osobn%C3%ADch_%C3%BAdaj%C5%AF">Obecné nařízení o ochraně sobních údajů</a>) tuto stránku nepoužívejte.</p> <p>Pokud se tento server nachází v USA: Naše stránka, produkty a služby jsou všechny směřovány na lidi, kterým je alespoň 13 let. Pokud je vám méně než 13, dle požadavků zákona COPPA (<a href="https://cs.wikipedia.org/wiki/Children%27s_online_privacy_protection_act">Children's Online Privacy Protection Act</a>) tuto stránku nepoužívejte.</p> @@ -855,7 +843,7 @@ cs: <p>Rozhodneme-li se naše zásady soukromí změnit, zveřejníme tyto změny na této stránce.</p> - <p>Tento dokument je dostupný pod licencí CC-BY-SA. Byl naposledy aktualizován 7 března 2018.</p> + <p>Tento dokument je dostupný pod licencí CC-BY-SA. Byl naposledy aktualizován 7. března 2018.</p> <p>Původně adaptováno ze <a href="https://github.com/discourse/discourse">zásad soukromí Discourse</a>.</p> title: Podmínky používání a zásady soukromí %{instance} @@ -893,13 +881,13 @@ cs: edit_profile_step: Můžete si přizpůsobit svůj profil nahráním avataru a obrázku na hlavičce, změnou zobrazovaného jména a dalších. Chcete-li posoudit nové sledovatele předtím, než vás mohou sledovat, můžete svůj účet uzamknout. explanation: Zde je pár tipů na začátek final_action: Začněte přispívat - final_step: 'Začněte psát! I když nemáte sledovatele, mohou vaše zprávy vidět jiní lidé, například na místní časové ose a mezi hashtagy. Můžete se ostatním představit pomocí hashtagu #introductions.' + final_step: 'Začněte přispívat! I když nemáte sledovatele, mohou vaše zprávy vidět jiní lidé, například na místní časové ose a mezi hashtagy. Můžete se ostatním představit pomocí hashtagu #introductions.' full_handle: Vaše celá adresa profilu full_handle_hint: Tohle je, co byste řekl/a svým přátelům, aby vám mohli posílat zprávy nebo vás sledovat z jiné instance. review_preferences_action: Změnit nastavení review_preferences_step: Nezapomeňte si nastavit své volby, například jaké e-maily chcete přijímat či jak soukromé mají být vaše příspěvky ve výchozím stavu. Nemáte-li epilepsii, můžete si nastavit automatické přehrávání obrázků GIF. subject: Vítejte na Mastodonu - tip_bridge_html: Pokud přicházíte z Twitteru, můžete najít vaše přátele na Mastodonu pomocí <a href="%{bridge_url}">mostové aplikace</a>. Funguje ovšem pouze, pokud ji oni někdy také použili! + tip_bridge_html: Pokud přicházíte z Twitteru, můžete najít vaše přátele na Mastodonu pomocí <a href="%{bridge_url}">mostové aplikace</a>. Funguje ovšem pouze, pokud ji oni také někdy použili! tip_federated_timeline: Federovaná časová osa je náhled celé sítě Mastodon. Zahrnuje ovšem pouze lidi, které sledují vaši sousedé, takže není úplná. tip_following: Administrátora/y serveru sledujete automaticky. Chcete-li najít další zajímavé lidi, podívejte se na místní a federované časové osy. tip_local_timeline: Místní časová osa je náhled lidí na %{instance}. Toto jsou vaši nejbližší sousedé! @@ -907,8 +895,12 @@ cs: tips: Tipy title: Vítejte na palubě, %{name}! users: + follow_limit_reached: Nemůžete sledovat více než %{limit} lidí invalid_email: E-mailová adresa je neplatná invalid_otp_token: Neplatný kód pro dvoufaktorovou autentikaci otp_lost_help_html: Pokud jste ztratil/a přístup k oběma, můžete se spojit %{email} seamless_external_login: Jste přihlášen/a přes externí službu, nastavení hesla a e-mailu proto nejsou dostupná. signed_in_as: 'Přihlášen/a jako:' + verification: + explanation_html: 'Můžete se <strong>ověřit jako vlastník odkazů v metadatech profilu</strong>. Pro tento účel musí stránka v odkazu obsahovat odkaz zpět na váš profil na Mastodonu. Odkaz zpět <strong>musí</strong> mít atribut <code>rel="me"</code>. Na textu odkazu nezáleží. Zde je příklad:' + verification: Ověření diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 8b923ec87..a4df28b61 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -1,13 +1,13 @@ --- cy: about: - about_hashtag_html: Dyma dŵtiau cyhoeddus wedi eu tagio gyda <strong>#%{hashtag}</strong>. Gallwch ryngweithio gyda nhw os oes gennych gyfrif yn unrhyw le yn y bydysawd. + about_hashtag_html: Dyma dŵtiau cyhoeddus wedi eu tagio gyda <strong>#%{hashtag}</strong>. Gallwch ryngweithio gyda nhw os oes gennych gyfrif yn unrhyw le yn y ffeddysawd. about_mastodon_html: Mae Mastodon yn rwydwaith cymdeithasol sy'n seiliedig ar brotocolau gwe a meddalwedd cod agored rhad ac am ddim. Yn debyg i e-bost mae'n ddatganoledig. about_this: Ynghylch administered_by: 'Gweinyddir gan:' api: API apps: Apiau symudol - closed_registrations: Mae Mastodon yn rwydwaith cymdeithasol sy'n seiliedig ar brotocolau gwe a meddalwedd cod agored rhad ac am ddim. Mae'n ddatganoledig fel e-bost. + closed_registrations: Mae cofrestru wedi cau ar yr achos hwn ar hyn o bryd. Fodd bynnag, mae modd ffeindio achos arall er mwyn creu cyfrif arno a chael mynediad at union yr un rhwydwaith o'r man hwnnw. contact: Cyswllt contact_missing: Heb ei osod contact_unavailable: Ddim yn berthnasol @@ -18,36 +18,31 @@ cy: features: humane_approach_body: Gan ddysgu o fethiannau rhwydweithiau eraill, mae Mastodon yn anelu i wneud penderfyniadau dylunio moesol i ymladd camddefnydd o gyfryngau cymdeithasol. humane_approach_title: Agwedd fwy dynol - not_a_product_body: Nid yw Mastodon yn rhwydwaith fasnachol. Nid oes hysbysebion, cloddio data na gerddi caeedig. Nid oes awdurdod canolog. - not_a_product_title: Rwyt yn berson, nid yn gynnyrch + not_a_product_body: Nid yw Mastodon yn rwydwaith masnachol. Nid oes hysbysebion, cloddio data na gerddi caeedig. Nid oes awdurdod canolog. + not_a_product_title: Rwyt yn berson, nid yn beth real_conversation_body: Gyda'r modd i ddefnyddio hyd at 500 o nodau a chefnogaeth ar gyfer cynnwys gronynnol a rhybuddion cyfryngau, mae modd i chi fynegi'ch hun yn y ffordd yr hoffech chi. real_conversation_title: Wedi ei adeiladu ar gyfer sgyrsiau go iawn within_reach_body: Nifer o apiau ar gyfer iOS, Android, a nifer blatfformau eraill diolch i amgylchedd API hygyrch i ddatblygwyr sy'n caniatau i chi gadw mewn cysylltiad a'ch ffrindiau o unrhywle. within_reach_title: Bob tro o fewn gafael generic_description: Mae %{domain} yn un gweinydd yn y rhwydwaith hosted_on: Mastodon wedi ei weinyddu ar %{domain} - learn_more: Dysgwch fwy + learn_more: Dysu mwy other_instances: Rhestr achosion privacy_policy: Polisi preifatrwydd source_code: Cod ffynhonnell - status_count_after: - one: statws - other: statws - status_count_before: Pwy ysgrifennodd + status_count_after: statws + status_count_before: Ysgriffennwyd gan terms: Telerau gwasanaeth - user_count_after: - one: defnyddiwr - other: defnyddwyr + user_count_after: defnyddwyr user_count_before: Cartref i what_is_mastodon: Beth yw Mastodon? accounts: choices_html: 'Dewisiadau %{name}:' follow: Dilynwch - followers: - one: Dilynwr - other: Dilynwyr + followers: Dilynwyr following: Yn dilyn joined: Ymunodd %{date} + link_verified_on: Gwiriwyd perchnogaeth y ddolen yma ar %{date} media: Cyfryngau moved_html: 'Mae %{name} wedi symud i %{new_profile_link}:' network_hidden: Nid yw'r wybodaeth hyn ar gael @@ -56,12 +51,10 @@ cy: people_who_follow: Pobl sy'n dilyn %{name} pin_errors: following: Rhaid i ti fod yn dilyn y person yr ydych am ei gymeradwyo yn barod - posts: - one: Tŵt - other: Tŵtiau + posts: Tŵtiau posts_tab_heading: Tŵtiau posts_with_replies: Tŵtiau ac atebion - reserved_username: Mae'r enw defnyddior yn neilltuedig + reserved_username: Mae'r enw defnyddiwr ar gadw roles: admin: Gweinyddwr bot: Bot @@ -78,7 +71,7 @@ cy: avatar: Afatar by_domain: Parth change_email: - changed_msg: E-bost cyfri wedi ei newid yn llwyddiannus! + changed_msg: E-bost cyfrif wedi ei newid yn llwyddiannus! current_email: E-bost Cyfredol label: Newid E-bost new_email: E-bost Newydd @@ -120,20 +113,21 @@ cy: moderation_notes: Nodiadau cymedroli most_recent_activity: Gweithgarwch diweddaraf most_recent_ip: IP diweddaraf + no_limits_imposed: Dim terfynau wedi'i gosod not_subscribed: Heb danysgrifio order: alphabetic: Allfabetig - most_recent: Mwyaf diweddaraf - title: Trefn + most_recent: Diweddaraf + title: Trefnu outbox_url: Allflwch URL - perform_full_suspension: Ataliwch yn llwyr + perform_full_suspension: Atal profile_url: URL proffil promote: Hyrwyddo protocol: Protocol public: Cyhoeddus push_subscription_expires: Tanysgrifiad PuSH yn dod i ben - redownload: Adnewyddwch afatar - remove_avatar: Dilëwch afatar + redownload: Adnewyddu afatar + remove_avatar: Dileu afatar resend_confirmation: already_confirmed: Mae'r defnyddiwr hwn wedi ei gadarnhau yn barod send: Ailanfonwch e-bost cadarnhad @@ -155,8 +149,10 @@ cy: report: adrodd targeted_reports: Adroddiadau am y cyfri hwn silence: Tawelu - statuses: '' + silenced: Tawelwyd + statuses: Statysau subscribe: Tanysgrifio + suspended: Ataliwyd title: Cyfrifon unconfirmed_email: E-bost heb ei gadarnhau undo_silenced: Dadwneud tawelu @@ -173,7 +169,9 @@ cy: create_domain_block: Blociodd %{name} y parth %{target} create_email_domain_block: Cosbrestrwyd parth e-bost %{target} gan %{name} demote_user: Diraddiodd %{name} y defnyddiwr %{target} + destroy_custom_emoji: Dinistriodd %{name} emoji %{target} destroy_domain_block: Dadflociodd %{name} y parth %{target} + destroy_email_domain_block: Gwynrestrodd %{name} parth e-bost %{target} destroy_status: Cafodd %{name} wared ar statws gan %{target} disable_2fa_user: Diffoddodd %{name} ar ofyniad dau gam ar gyfer y defnyddiwr %{target} disable_custom_emoji: Diffoddodd %{name} emoji %{target} @@ -192,7 +190,7 @@ cy: unsilence_account: Terfynodd %{name} dawelu cyfrif %{target} unsuspend_account: Terfynodd %{name} yr ataliad ar gyfrif %{target} update_custom_emoji: Diweddarodd %{name} emoji %{target} - update_status: Diweddarodd %{name} statws gan %{taget} + update_status: Diweddarodd %{name} statws gan %{target} deleted_status: "(statws wedi ei ddileu)" title: Log archwilio custom_emojis: @@ -202,23 +200,24 @@ cy: copy_failed_msg: Methwyd i greu copi lleol o'r emoji hwnnw created_msg: Llwyddwyd i greu emoji! delete: Dileu - destroyed_msg: Llwyddwyd i ddinistrio emoji! + destroyed_msg: Llwyddwyd i ddinistrio emojo! disable: Diffodd - disabled_msg: Llwyddwyd i ddiffodd ye emoji hwnnw + disabled_msg: Llwyddwyd i ddiffodd yr emoji hwnnw emoji: Emoji enable: Galluogi - enabled_msg: Llwyddwyd i ganiatau yr emoji hwnnw + enabled_msg: Llwyddwyd i alluogi yr emoji hwnnw image_hint: PNG hyd at 50KB listed: Rhestredig new: title: Ychwanegu emoji personol newydd overwrite: Trosysgrifio + shortcode: Byrgod shortcode_hint: O leiaf 2 nodyn, dim ond nodau alffaniwmerig a tanlinellau - title: Emoji personol - unlisted: Heb ei restru - update_failed_msg: Ni allwyd diweddaru'r emoji hwnnw + title: Emoji unigryw + unlisted: Heb eu rhestru + update_failed_msg: Methwyd a diweddaru'r emoji hwnnw updated_msg: Llwyddwyd i ddiweddaru'r emoji! - upload: Lanlwytho + upload: Uwchlwytho dashboard: backlog: tasgau heb eu cwblhau config: Cyfluniad @@ -227,7 +226,7 @@ cy: feature_registrations: Cofrestriadau feature_relay: Relái ffederasiwn features: Nodweddion - hidden_service: Ffedarasiwn a gwasanaethau cudd + hidden_service: Ffederasiwn a gwasanaethau cudd open_reports: adroddiadau agored recent_users: Defnyddwyr diweddar search: Chwilio testun llawn @@ -253,22 +252,22 @@ cy: noop: Dim silence: Tawelwch suspend: Atal - title: Bloc parth newydd + title: Blocio parth newydd reject_media: Gwrthod dogfennau cyfryngau reject_media_hint: Dileu dogfennau cyfryngau wedi eu cadw yn lleol ac yn gwrthod i lawrlwytho unrhyw rai yn y dyfodol. Amherthnasol i ataliadau + reject_reports: Gwrthod adroddiadau + reject_reports_hint: Anwybyddu'r holl adroddiadau sy'n dod o'r parth hwn. Amherthnasol i ataliadau severities: noop: Dim - silence: Tawelwch + silence: Tawelu suspend: Atal severity: Difrifoldeb show: - affected_accounts: - one: Mae un cyfri yn y bas data wedi ei effeithio - other: "%{count} o gyfrifoedd yn y bas data wedi eu hefeithio" + affected_accounts: "%{count} o gyfrifoedd yn y bas data wedi eu hefeithio" retroactive: silence: Dad-dawelu pob cyfri presennol o'r parth hwn suspend: Dad-atal pob cyfrif o'r parth hwn sy'n bodoli - title: Dadwneud bloc parth ar gyfer %{domain} + title: Dadwneud blocio parth ar gyfer %{domain} undo: Dadwneud title: Blociau parth undo: Dadwneud @@ -283,12 +282,13 @@ cy: title: Cofnod newydd yng nghosbrestr e-byst title: Cosbrestr e-bost instances: - account_count: Cyfrifon hysbys + account_count: Cyfrifau hysbys domain_name: Parth reset: Ailosod search: Chwilio - title: INSTANCES hysbys + title: Achosion hysbys invites: + deactivate_all: Diffodd pob un filter: all: Pob available: Ar gael @@ -297,11 +297,19 @@ cy: title: Gwahoddiadau relays: add_new: Ychwanegau relái newydd + delete: Dileu + description_html: Mae <strong>relái ffederasiwn</strong> yn weinydd ganol sy'n cyfnewid niferoedd ucheol o dŵtiau cyhoeddus rhwng gweinyddwyr sydd wedi tanysgrifio ac yn cyhoeddi iddo. <strong>Gall helpu weinyddwyr bach a cymhedrol eu maint i ddarganfod cynnwys o'r ffedysawd</strong>, fel arall bydd gofyn ara ddefnyddwyr lleol yn dilyn unigolion ar weinyddwyr eraill a llaw. + disable: Diffodd + disabled: Wedi'i ddiffodd + enable: Galluogi + enable_hint: Unwaith y bydd wedi ei alluogi, bydd eich gweinydd yn tanysgrifio i holl dŵtiau cyhoeddus o'r relai hwn, ac yn dechrau anfon tŵtiau y gweinydd hwn ato. + enabled: Wedi ei alluogi inbox_url: URL relái pending: Aros am gymeradywaeth i'r relái save_and_enable: Cadw a galluogi setup: Sefydlu cysylltiad relái status: Statws + title: Cyfnewidwyr report_notes: created_msg: Llwyddwyd i greu nodyn adroddiad! destroyed_msg: Llwyddwyd i ddileu nodyn adroddiad! @@ -309,25 +317,27 @@ cy: account: note: nodyn report: adroddiad - action_taken_by: Gwnathpwyd hyn gan + action_taken_by: Gwnaethpwyd hyn gan are_you_sure: Ydych chi'n sicr? + assign_to_self: Aseinio i mi + assigned: Cymedrolwr wedi'i aseinio comment: none: Dim created_at: Adroddwyd - mark_as_resolved: Nodwch wedi ei ddatrys - mark_as_unresolved: Nodwch heb ei ddatrys + mark_as_resolved: Nodi fel wedi'i ddatrys + mark_as_unresolved: Nodi fel heb ei ddatrys notes: - create: Ychwanegwch nodyn - create_and_resolve: Datruswch a nodyn - create_and_unresolve: Ailagorwch a nodyn - delete: Dilëwch + create: Ychwanegu nodyn + create_and_resolve: Datrys gyda nodyn + create_and_unresolve: Ailagor gyda nodyn + delete: Dileu placeholder: Disgrifiwch pa weithredoedd sydd wedi eu cymryd, neu unrhyw ddiweddariadau eraill... - reopen: Ailagorwch adroddiad + reopen: Ailagor adroddiad report: 'Adroddiad #%{id}' + reported_account: Cyfrif wedi ei adrodd reported_by: Adroddwyd gan resolved: Wedi ei ddatrys resolved_msg: Llwyddwyd i ddatrys yr adroddiad! - silence_account: Tawelwch y cyfrif status: Statws title: Adroddiadau unassign: Dadneilltuo @@ -335,23 +345,66 @@ cy: updated_at: Diweddarwyd settings: activity_api_enabled: - title: Cyhoeddwch ystatedgau agregau am weithgaredd defnyddwyr + desc_html: Niferoedd o statysau wedi eu postio'n lleol, defnyddwyr gweithredol, a cofrestradau newydd mewn bwcedi wythnosol + title: Cyhoeddi ystatedgau cyfangronedig am weithgaredd defnyddwyr + bootstrap_timeline_accounts: + desc_html: Gwahanu sawl enw defnyddiwr a coma. Dim ond cyfrifoedd lleol a cyfrifoedd heb eu cloi fydd yn gweithio. Tra bod yn aros yn wag yr hyn sy'n rhagosodedig yw'r holl weinyddwyr lleol. + title: Dilyn diofyn i ddefnyddwyr newydd contact_information: email: E-bost busnes + username: Enw defnyddiwr cyswllt + custom_css: + desc_html: Addasu gwedd gyda CSS wedi lwytho ar bob tudalen + title: CSS wedi'i addasu hero: + desc_html: Yn cael ei arddangos ar y dudadlen flaen. Awgrymir 600x100px oleia. Pan nad yw wedi ei osod, mae'n ymddangos fel mân-lun yr achos title: Delwedd arwr + mascot: + desc_html: I'w arddangos ar nifer o dudalennau. Awgrymir 293x205px o leiaf. Pan nad yw wedi ei osod, cwympo nôl i'r mascot rhagosodedig + title: Llun mascot + peers_api_enabled: + desc_html: Enwau parth y mae'r achos hwn wedi dod ar ei draws yn y ffedysawd + title: Cyhoeddi rhestr o achosion dargynfyddiedig + preview_sensitive_media: + desc_html: Bydd rhagolygon ar wefannau eraill yn dangos ciplun hyd yn oed os oes na gyfryngau wedi eu marcio'n sensitif + title: Dangos cyfryngau sensitif mewn rhagolygon OpenGraph registrations: + closed_message: + desc_html: I'w arddangos ar y dudalen flaen wedi i gofrestru cau. Mae modd defnyddio tagiau HTML + title: Neges gofrestru caeëdig deletion: - desc_html: Caniatewch i unrhywun i ddileu eu cyfrif + desc_html: Caniatau i unrhywun i ddileu eu cyfrif + title: Agor dileu cyfrif min_invite_role: disabled: Neb - title: Caniatewch wahoddiadau gan + title: Caniatau gwahoddiadau gan open: - desc_html: Caniatewch i unrhywun greu cyfrif - title: Agorwch cofrestru + desc_html: Caniatau i unrhywun greu cyfrif + title: Agor cofrestru + show_known_fediverse_at_about_page: + desc_html: Wedi'i ddewis, bydd yn dangos rhagolwg o dŵtiau o'r holl ffedysawd. Fel arall bydd ond yn dangos tŵtiau lleol. + title: Dangos ffedysawd hysbys ar ragolwg y ffrwd show_staff_badge: + desc_html: Dangos bathodyn staff ar dudalen defnyddiwr title: Dangos bathodyn staff + site_description: + desc_html: Paragraff agoriadol ar y dudalen flaen. Disgrifiwch yr hyn sy'n arbennig am y gweinydd Mastodon hwn ac unrhywbeth arall o bwys. Mae modd defnyddio tagiau HTML <code><a></code> a <code><em></code>. + title: Disgrifiad achos + site_description_extended: + desc_html: Lle da ar gyfer eich cod ymddygiad, rheolau, canllawiau a phethau eraill sy'n gwneud eich achos yn whanol. Mae modd i chi ddefnyddio tagiau HTML + title: Gwybodaeth bellach wedi ei addasu + site_short_description: + desc_html: Yn cael ei ddangos yn bar ar yr ochr a tagiau meto. Digrifiwch beth yw Mastodon a beth sy'n gwneud y gweinydd hwn mewn un paragraff. Os yn wag, wedi ei ragosod i ddangos i disgrifiad yr achos. + title: Disgrifiad byr o'r achos + site_terms: + desc_html: Mae modd i chi ysgrifennu polisi preifatrwydd, termau gwasanaeth a cyfreitheg arall eich hun. Mae modd defnyddio tagiau HTML + title: Termau gwasanaeth wedi eu haddasu + site_title: Enw'r achos + thumbnail: + desc_html: Ceith ei ddefnyddio ar gyfer rhagolygon drwy OpenGraph a'r API. Argymhellir 1200x630px + title: Mân-lun yr achos timeline_preview: + desc_html: Dangos ffrwd gyhoeddus ar y dudalen lanio title: Rhagolwg o'r ffrwd title: Gosodiadau'r wefan statuses: @@ -365,33 +418,44 @@ cy: title: Cyfryngau no_media: Dim cyfryngau no_status_selected: Ni newidwyd dim statws achos ni ddewiswyd dim un + title: Statysau cyfrif with_media: A chyfryngau subscriptions: + callback_url: URL galw-nôl confirmed: Wedi'i gadarnhau expires_in: Dod i ben ymhen + last_delivery: Danfoniad diwethaf title: WebSub topic: Pwnc suspensions: + bad_acct_msg: Nid yw'r gwerthoedd cadarnhau yn cyfateb. Ydych chi'n atal y cyfrif cywir? + hint_html: 'I gadarnhau atal y cyfrif, mewnbynwch %{value} yn y maes isod:' proceed: Parhau + title: Atal %{acct} + warning_html: 'Mi fydd atal y cyfrif hwn yn dileu data <strong>am byth</strong> o''r cyfrif hwn, gan gynnwys:' title: Gweinyddiaeth admin_mailer: new_report: body: Mae %{reporter} wedi cwyno am %{target} - body_remote: Mae rhywun o %{domain} wedi cwyno . am %{target} + body_remote: Mae rhywun o %{domain} wedi cwyno am %{target} subject: Cwyn newydd am %{instance} {#%{id}} application_mailer: notification_preferences: Newid gosodiadau e-bost salutation: "%{name}," + settings: 'Newid gosodiadau e-bost: %{link}' + view: 'Gweld:' view_profile: Gweld proffil view_status: Gweld statws applications: created: Cais wedi ei greu'n llwyddiannus destroyed: Cais wedi ei ddileu'n llwyddiannus + invalid_url: Mae'r URL a ddarparwyd yn annilys regenerate_token: Adfywio tocyn mynediad token_regenerated: Adfywiwyd y tocyn mynediad yn llwyddiannus warning: Byddwch yn ofalus a'r data hyn. Peidiwch a'i rannu byth! your_token: Eich tocyn mynediad auth: + agreement_html: Wrth glicio "Cofrestru" isod yr ydych yn cytuno i ddilyn <a href="%{rules_path}">y rheolau ar gyfer yr achos hwn</a> a <a href="%{terms_path}">ein termau gwasanaeth</a>. change_password: Cyfrinair confirm_email: Cadarnhau e-bost delete_account: Dileu cyfrif @@ -399,8 +463,8 @@ cy: didnt_get_confirmation: Heb dderbyn cyfarwyddiadau cadarnhau? forgot_password: Wedi anghofio'ch cyfrinair? invalid_reset_password_token: Tocyn ailosod cyfrinair yn annilys neu wedi dod i ben. Gwnewch gais am un newydd os gwelwch yn dda. - login: Mewngofnodwch - logout: Allgofnodwch + login: Mewngofnodi + logout: Allgofnodi migrate_account: Symud i gyfrif gwahanol migrate_account_html: Os hoffech chi ailgyfeirio'r cyfrif hwn at un gwahanol, mae modd <a href="%{path}">ei ffurfweddu yma</a>. or: neu @@ -408,42 +472,45 @@ cy: providers: cas: CAS saml: SAML - register: Cofrestrwch - register_elsewhere: Cofrestrwch ar weinydd gwahanol + register: Cofrestru + register_elsewhere: Cofrestru ar weinydd gwahanol resend_confirmation: Ailanfon cyfarwyddiadau cadarnhau - reset_password: Ailosodwch eich cyfrinair + reset_password: Ailosod cyfrinair security: Diogelwch - set_new_password: Gosodwch gyfrinair newydd + set_new_password: Gosod cyfrinair newydd authorize_follow: already_following: Yr ydych yn dilyn y cyfrif hwn yn barod error: Yn anffodus, roedd gwall tra'n edrych am y cyfrif anghysbell - follow: Dilynwch + follow: Dilyn follow_request: 'Yr ydych wedi anfon cais dilyn at:' following: 'Llwyddiant! Yr ydych yn awr yn dilyn:' post_follow: close: Neu, gallwch gau'r ffenest hon. - return: Dangoswch broffil y defnyddiwr + return: Dangos proffil y defnyddiwr web: I'r wê - title: Dilynwch %{acct} + title: Dilyn %{acct} datetime: distance_in_words: - about_x_hours: "%{count}h" - about_x_months: "%{count}mo" - about_x_years: "%{count}y" - almost_x_years: "%{count}y" + about_x_hours: "%{count}awr" + about_x_months: "%{count}mis" + about_x_years: "%{count}blwyddyn" + almost_x_years: "%{count}blwyddyn" half_a_minute: Newydd fod less_than_x_minutes: "%{count}m" less_than_x_seconds: Newydd fod - over_x_years: "%{count}y" - x_days: "%{count}d" + over_x_years: "%{count}blwyddyn" + x_days: "%{count}dydd" x_minutes: "%{count}m" - x_months: "%{count}mo" - x_seconds: "%{count}s" + x_months: "%{count}mis" + x_seconds: "%{count}eiliad" deletes: bad_password_msg: Go dda, hacwyr! Cyfrinair anghywir confirm_password: Mewnbynnwch eich cyfrinair presennol i gadarnhau mai chi sydd yno + description_html: Bydd hyn yn cael gwared ar gynnwys o'ch cyfrif <strong>am byth heb fodd i'w adfer</strong> ac yn diffodd y cyfrif. Caiff eich eich enw defnyddiwr ei gadw i atal unrhyw ddynwarediadau yn y dyfodol. proceed: Dileu cyfrif success_msg: Llwyddwyd i ddileu eich cyfrif + warning_html: Dim ond dileu cynnwys o'r achos hwn ellid bod yn sicr ei fod wedi ei ddileu. Mae cynnwys sydd wedi ei rannu'n eang yn debygol o adael olion. Ni fydd gweinyddwyr all-lein a gweinyddwyr sydd wedi dad-danysgrifio o'ch diwedderiadau ddim yn diweddaru eu cronfeydd data. + warning_title: Argaeledd cynnwys wedi'i rannu errors: '403': Nid oes gennych ganiatad i weld y dudalen hon. '404': Nid yw'r dudalen yr oeddech yn chwilio amdani'n bodoli. @@ -451,19 +518,24 @@ cy: '422': content: Methwyd i ddilysu diogelwch. A ydych chi'n blocio cwcîs? title: Methwyd i ddilysu diogelwch + '429': Crogwyd '500': content: Mae'n ddrwg gennym ni, ond fe aeth rhywbeth o'i le ar ein rhan ni. title: Nid yw'r dudalen hon yn gywir - noscript_html: I ddefnyddio ap gwê Mastodon, caniatewch JavaScript os gwlwch yn dda. Fel arall, gallwch drio un o'r <a href="%{apps_path}">apiau cynhenid</a> ar gyfer Mastodon ar eich platfform. + noscript_html: I ddefnyddio ap gwe Mastodon, galluogwch JavaScript os gwlwch yn dda. Fel arall, gallwch drio un o'r <a href="%{apps_path}">apiau cynhenid</a> ar gyfer Mastodon ar eich platfform. exports: archive_takeout: date: Dyddiad - download: Lawrlwythwch eich archif + download: Lawrlwytho eich archif + hint_html: Mae modd gwneud cais am archif o'ch <strong>twtiau a'ch cyfryngau</strong>. Bydd y data sy'n cael ei allforio ar fformat ActivityPub, a ellir ei ddarllen gyda unrhyw feddalwaedd sy'n cydymffurfio. Mae modd gwneud cais am archif bob 7 diwrnod. + in_progress: Cyfansoddi eich archif... + request: Gwneud cais am eich archif size: Maint blocks: Yr ydych yn blocio csv: CSV follows: Yr ydych yn dilyn mutes: Yr ydych yn tawelu + storage: Storio cyfryngau filters: contexts: home: Ffrwd gartref @@ -472,6 +544,9 @@ cy: thread: Sgyrsiau edit: title: Golygu hidlydd + errors: + invalid_context: Dim cyd-destun neu cyd-destun annilys wedi ei ddarparu + invalid_irreversible: Mae hidlo anadferadwy ond yn gweithio yng nghyd-destun cartref neu hysbysiadau index: delete: Dileu title: Hidlyddion @@ -479,8 +554,13 @@ cy: title: Ychwanegu hidlydd newydd followers: domain: Parth + explanation_html: Os ydych am sicrhau preifatrwydd eich tŵtiau, rhaid i chi fod yn ymwybodol o bwy sy'n eich dilyn. <strong>Mae eich tŵtiau preifat yn cael eu hanfon at bob achos lle mae gennych ddilynwyr</strong>. Efallai hoffech chi i'w hadolygu o bryd i'w gilydd, a chael gwared ar ddilynwyr os nad ydych yn credu i'r staff neu'r meddalwedd ar yr achosion hynny barchu eich preifatrwydd. followers_count: Nifer y dilynwyr - lock_link: Cloi eich cyfri + lock_link: Cloi eich cyfrif + purge: Dileu o dilynwyr + success: Yn y broses o ysgafn-flocio dilynwyr o %{count} parth... + true_privacy_html: Cofiwch <strong>mai ond amgryptio pen-i-ben all sicrhau gwir breifatrwydd</strong>. + unlocked_warning_html: Gall unrhywun eich dilyn yn syth i weld eich tŵtiau preifat. %{lock_link} i gael adolygu a gwrthod dilynwyr. unlocked_warning_title: Nid yw eich cyfrif wedi ei gloi footer: developers: Datblygwyr @@ -488,59 +568,339 @@ cy: resources: Adnoddau generic: changes_saved_msg: Llwyddwyd i gadw y newidiadau! + copy: Copïo save_changes: Cadw newidiadau - validation_errors: - one: Mae rhywbeth o'i le o hyd! Edrychwch ar y gwall isod os gwelwch yn dda - other: Mae rhywbeth o'i le o hyd! Edrychwch ar y %{count} gwall isod os gwelwch yn dda + validation_errors: Mae rhywbeth o'i le o hyd! Edrychwch ar y %{count} gwall isod os gwelwch yn dda imports: + preface: Mae modd mewnforio data yr ydych wedi allforio o achos arall, megis rhestr o bobl yr ydych yn ei ddilyn neu yn blocio. + success: Uwchlwythwyd eich data yn llwyddiannus ac fe fydd yn cael ei brosesu mewn da bryd types: blocking: Rhestr blocio following: Rhestr dilyn muting: Rhestr tawelu upload: Uwchlwytho - in_memoriam_html: '' + in_memoriam_html: In Memoriam. invites: delete: Dadactifadu + expired: Wedi darfod expires_in: + '1800': 30 munud + '21600': 6 awr + '3600': 1 awr + '43200': 12 awr + '604800': 1 wythnos '86400': 1 dydd + expires_in_prompt: Byth + generate: Cynhyrchu + invited_by: 'Cawsoch eich gwahodd gan:' + max_uses: "%{count} defnydd" max_uses_prompt: Dim terfyn + prompt: Cynhyrchwch a rhannwch ddolenni gyda eraill i ganiatau mynediad i'r achos hwn table: + expires_at: Darfod ar uses: Defnyddiau + title: Gwahodd pobl + lists: + errors: + limit: Yr ydych wedi cyrraedd uchafswm nifer y rhestrau posib + media_attachments: + validations: + images_and_video: Ni ellir ychwanegu fideo at statws sy'n cynnwys delweddau'n barod + too_many: Ni ellir ychwanegu mwy na 4 dogfen migrations: + acct: enwdefnyddiwr@parth y cyfrif newydd + currently_redirecting: 'Mae eich proffil wedi ei osod i ailgyfeirio i:' proceed: Cadw + updated_msg: Diweddarwyd gosodiad mudo eich cyfrif yn llwyddiannus! moderation: title: Cymedroli notification_mailer: + digest: + action: Gweld holl hysbysiadau + body: Dyma grynodeb byr o'r holl negeseuon golloch chi ers eich ymweliad diwethaf ar %{since} + mention: 'Soniodd %{name} amdanoch chi:' + new_followers_summary: Hefyd, rydych wedi ennill %{count} dilynwr newydd tra eich bod i ffwrdd! Hwrê! + subject: "%{count} hysbysiad newydd ers eich ymweliad diwethaf \U0001F418" + title: Yn eich absenoldeb... favourite: + body: 'Cafodd eich statws ei hoffi gan %{name}:' + subject: Hoffodd %{name} eich statws title: Ffefryn newydd + follow: + body: Mae %{name} bellach yn eich dilyn! + subject: Mae %{name} bellach yn eich dilyn + title: Dilynwr newydd + follow_request: + action: Rheoli ceisiadau dilyn + body: Mae %{name} wedi gwneud cais i'ch dilyn + subject: 'Dilynwr yn aros: %{name}' + title: Cais dilynwr newydd mention: action: Ateb + body: 'Caswoch eich sôn amdano gan %{name} yn:' + subject: Cawsoch eich sôn amdano gan %{name} + title: Crywbylliad newydd + reblog: + body: 'Cafodd eich statws ei fŵstio gan %{name}:' + subject: Bŵstiodd %{name} eich statws + title: Hwb newydd + number: + human: + decimal_units: + format: "%n%u" + units: + billion: B + million: M + quadrillion: Q + thousand: K + trillion: T pagination: + newer: Diweddarach next: Nesaf + older: Hŷn prev: Blaenorol + truncate: "…" preferences: languages: Ieithoedd other: Arall + publishing: Cyhoeddi web: Gwe + remote_follow: + acct: Mewnbynnwch eich enwdefnyddiwr@parth yr ydych eisiau gweithredu ohonno + missing_resource: Ni ellir canfod yr URL ailgyferio angenrheidiol i'ch cyfrif + no_account_html: Heb gyfrif? Mae modd i chi <a href='%{sign_up_path}' target='_blank'>gofrestru yma</a> + proceed: Ymlaen i ddilyn + prompt: 'Yr ydych am ddilyn:' + remote_interaction: + proceed: Ymlaen i ryngweithio + prompt: 'Rydych eisiau rhyngweithio a''r tŵt hwn:' remote_unfollow: error: Gwall title: Teitl + unfollowed: Dad-ddilynwyd sessions: + activity: Gweithgaredd ddiwethaf browser: Porwr browsers: - alipay: '' - blackberry: '' + alipay: Alipay + blackberry: Blackberry + chrome: Chrome + edge: Microsoft Edge + electron: Electron + firefox: Firefox + generic: Porwr anhysbys + ie: Internet Explorer + micro_messenger: MicroMessenger + nokia: Porwr Nokia S40 Ovi + opera: Opera + otter: Otter + phantom_js: PhantomJS + qq: Porwr QQ + safari: Safari + uc_browser: UCBrowser + weibo: Weibo current_session: Sesiwn cyfredol description: "%{browser} ar %{platform}" + explanation: Dyma'r porwyr gwê sydd wedi mewngofnodi i'ch cyfrif Mastododon ar hyn o bryd. + ip: IP + platforms: + adobe_air: Adobe Air + android: Android + blackberry: Blackberry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + linux: Linux + mac: Mac + other: platfform anhysbys + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone + revoke: Diddymu + revoke_success: Sesiwn wedi ei ddiddymu yn llwyddiannus title: Sesiynau + settings: + authorized_apps: Apiau awdurdodedig + back: Yn ôl i Mastodon + delete: Dileu cyfrif + development: Datblygu + edit_profile: Golygu proffil + export: Allforio data + followers: Dilynwyr awdurdodedig + import: Mewnforio + migrate: Mudo cyfrif + notifications: Hysbysiadau + preferences: Dewisiadau + settings: Gosodiadau + two_factor_authentication: Awdurdodi dau-gam + your_apps: Eich rhaglenni + statuses: + attached: + description: 'Ynghlwm: %{attached}' + image: "%{count} o luniau" + video: "%{count} fideo" + boosted_from_html: Wedi ei fŵstio %{acct_link} + content_warning: 'Rhybudd cynnwys: %{warning}' + disallowed_hashtags: 'yn cynnwys yr hashnod gwaharddedig: %{tags}' + language_detection: Canfod iaith yn awtomataidd + open_in_web: Agor yn y wê + over_character_limit: wedi mynd heibio'r uchafswm nodyn o %{max} + pin_errors: + limit: Yr ydych wedi pinio yr uchafswm posib o dŵtiau + ownership: Ni ellir pinio tŵt rhywun arall + private: Ni ellir pinio tŵt nad yw'n gyhoeddus + reblog: Ni ellir pinio bŵstiau + show_more: Dangos mwy + sign_in_to_participate: Mengofnodwch i gymryd rhan yn y sgwrs + title: '%{name}: "%{quote}"' + visibilities: + private: Dilynwyr yn unig + private_long: Dangos i ddilynwyr yn unig + public: Cyhoeddus + public_long: Gall pawb weld + unlisted: Heb ei restru + unlisted_long: Gall pawb weld, ond heb ei restru ar ffrydiau cyhoeddus + stream_entries: + pinned: Tŵt wedi'i binio + reblogged: bŵstiwyd + sensitive_content: Cynnwys sensitif + terms: + body_html: | + <h2>Polisi Preifatrwydd</h2> + <h3 id="collect">Pa wybodaeth ydyn ni'n ei gasglu?</h3> + + <ul> + <li><em>Gwybodaeth cyfrif sylfaenol</em>: Os ydych yn cofrestru ar y gweinydd hwn, mae'n bosib y byddwch yn cael eich gofyn i fewnbynnu enw defnyddiwr, cyfeiriad e-bost a chyfrinair. Mae modd i chi hefyd fewnbynnu gwybodaeth ychwanegol megis enw arddangos a bywgraffiad ac uwchlwytho llun proffil a llun pennawd. Mae'r enw defnyddiwr, enw arddangos, bywgraffiad, llun proffil a'r llun pennawd wedi eu rhestru'n gyhoeddus bob tro.</li> + <li><em>Postio, dilyn a gwybodaeth gyhoeddus arall</em>: Mae'r rhestr o bobl yr ydych yn dilyn wedi ei restru'n gyhoeddus, mae'r un peth yn wir am eich dilynwyr. Pan yr ydych yn mewnosod neges, mae'r dyddiad a'r amser yn cael ei gofnodi ynghyd a'r rhaglen y wnaethoch anfon y neges ohonni. Gall negeseuon gynnwys atodiadau cyfryngau, megis lluniau neu fideo. Mae negeseuon cyhoeddus a negeseuon heb eu rhestru ar gael yn gyhoeddus. Pan yr ydych yn nodweddu neges ar eich proffil, mae hynny hefyd yn wybodaeth sydd ar gael yn gyhoeddus. Mae eich negeseuon yn cael eu hanfon i'ch dilynwyr, mewn rhai achosion mae hyn yn golygu eu bod yn cael eu hanfon i amryw o weinyddwyr ac fe fydd copiau yn cael eu cadw yno. Pan yr ydych yn dileu negeseuon, mae hyn hefyd yn cael ei hanfon i'ch dilynwyr. Mae'r weithred o rannu neu hoffi neges arall yn gyhoeddus bob tro.</li> + <li><em>Negeseuon uniongyrchol a dilynwyr yn unig</em>: Mae pob neges yn cael eu cadw a'u prosesu ar y gweinydd. Mae negeseuon dilynwyr yn unig yn cael eu hanfon i'ch dilynwyr a'r defnyddwyr sy'n cael eu crybwyll ynddynt tra bod negeseuon uniongyrchol yn cael eu hanfon at rheini sy'n cael crybwyll ynddynt yn unig. Mewn rhai achostion golyga hyn eu bod yn cael eu hanfon i weinyddwyr gwahanol a'u cadw yno. yr ydym yn gnweud ymgais ewyllys da i gyfyngu'r mynediad at y negeseuon yna i bobl ac awdurdod yn unig, ond mae'n bosib y bydd gweinyddwyr eraill yn methu a gwneud hyn. Mae'n bwysig felly i chi fod yn wyliadwrus o ba weinyddwyr y mae eich dilynwyr yn perthyn iddynt. Mae modd i chi osod y dewis i ganiatau a gwrthod dilynwyr newydd a llaw yn y gosodiadau. <em>Cofiwch gall gweithredwyr y gweinydd ac unrhyw weinydd derbyn weld unrhyw negeseuon o'r fath</em>, ac fe all y derbynwyr gymryd sgrinlin, copïo neu drwy ddulliau eraill rannu rhain. <em>Peidiwch a rhannu unrhyw wybodaeth beryglus dros Mastodon.</em></li> + <li><em>IPs a mathau eraill o metadata</em>: Pan yr ydych yn mewngofnodi, yr ydym yn cofnodi y cyfeiriad IP yr ydych yn mewngofnodi ohonno, ynghyd a enw eich rhaglen pori. Mae pob un sesiwn mewngofnodi ar gael i chi adolygu a gwrthod yn y gosodiadau. Mae'r cyfeiriad IP diweddaraf yn cael ei storio hyd at 12 mis. Mae'n bosib y byddwn hefyd yn cadw cofnodion gweinydd sy'n cynnwys y cyfeiriad IP am bob cais sy'n cael ei wneud i'n gweinydd.</li> + </ul> + + <hr class="spacer" /> + + <h3 id="use">Beth ydym yn defnyddio eich gywbodaeth ar ei gyfer?</h3> + + <p>Gall unrhyw wybodaeth yr ydym yn ei gasglu oddi wrthych gael ei ddefnyddio yn y ffyrdd canlynol:</p> + + <ul> + <li>I ddarparu prif weithgaredd Mastodon. Gallwch ond rhyngweithio a chynnwys pobl eraill pan yr ydych wedi'ch mewngofnodi. Er enghraifft, gallwch ddilyn pobl eraill i weld eu negeseuon wedi cyfuno ar ffrwd gartref bersonol.</li> + <li>I helpu gyda goruwchwylio'r gymuned, er enghraifft drwy gymharu eich cyfeiriad IP gyda rhai eraill hysbys er mwyn sefydlu ymgais i geisio hepgor gwaharddiad neu droseddau eraill.</li> + <li>Gall y cyfeiriad e-bost yr ydych yn ei ddarparu gael ei ddefnyddio i anfon gwybodaeth atoch, hsybysiadau am bobl eraill yn rhyngweithio a'ch cynnwys neu'n anfon negeseuon atoch a/neu geisiadau neu gwestiynnau eraill.</li> + </ul> + + <hr class="spacer" /> + + <h3 id="protect">Sut ydym yn amddiffyn eich gwybodaeth?</h3> + + <p>Mae gennym amryw o fesurau diogelwch er mwyn cynnal diogelwch eich gwybodaeth bersonol pan yr ydych yn mewnosod, cyflwyno neu'n cael mynediad at eich gwybodaeth bersonol. Ymysg pethau eraill, mae sesiwn eich porwr, ynghyd a'r traffig rhwng eich rhaglenni a'r API wedi eu diogelu gan SSL, ac mae'ch cyfrinair yn cael ei stwnshio drwy ddefnyddio algorithm cryf un-ffordd. Gallwch alluogi dilysu dau-gam er mwyn cryfhau diogelwch mynediad i'ch cyfrif ymhellach.</p> + + <hr class="spacer" /> + + <h3 id="data-retention">Beth yw ein polisi cadw data?</h3> + + <p>Gwnawn ymdrech ewyllys da i:</p> + + <ul> + <li>Gadw cofnod gweinydd yn cynnwys y cyfeiriad IP o bob cais i'r gweinydd hwn, i'r graddau y mae cofnodion o'r fath yn cael eu cadw, am ddim mwy na 90 diwrnod.</li> + <li>Gadw cyfeiriadau IP a chysylltiad i ddefnyddwyr cofrestredig am ddim mwy na 12 mis.</li> + </ul> + + <p>Mae modd i chi wneud cais am, a lawrlwytho archif o'ch cynnwys, gan gynnwys eich tŵtiau, atodiadau cyfryngau, llun proffil a llun pennawd.</p> + + <p>Mae modd i chi ddileu eich cyfrif heb ei adfer ar unrhyw bryd</p> + + <hr class="spacer"/> + + <h3 id="cookies">Ydyn ni'n defnyddio cwcis?</h3> + + <p>Ydyn. Dogfennau bach sy'n cael eu trosglwyddo i ddisg galed eich cyfrifiadur drwy eich porwr gan wefan neu wasanaeth yw cwcis (os ydych yn eu caniatau). Galluoga'r cwcis hyn i'r wefan i adnabod eich porwr ac, os oes gennych gyfrif wedi ei gofrestru, ei gysylltu gyda'r cyfrif yr ydych wedi ei gofrestru.</p> + + <p>Rydym yn defnyddio cwcis i ddeall a chadw eich dewisiadau ar gyfer ymweliadau yn y dyfodol.</p> + + <hr class="spacer" /> + + <h3 id="disclose">Ydyn ni'n datgelu unrhyw wybodaeth i bartïoedd allanol?</h3> + + <p>Nid ydym yn gwerthu, cyfnewid neu mewn unrhyw ddull yn trosglwyddo i bartïoedd allanol eich gwybodaeth bersonol. Nid yw hyn yn cynnwys trydydd partïon yr ydym yn ymddiried ynddynt sy'n ein cynorthwyo i weithredu ein gwefan, cynnal ein busnes neu'ch gwasanaethu chi, cyhyd a bod y partïoedd hynny yn cytuno i gadw'r wybodaeth yma'n gyfrinachol. Mae'n bosib i ni ryddhau eich gwybodaeth pan yr ydym yn credu fod ei ryddhau yn briodol er mwyn cydymffurfio a'r gyfraith, gorfodi ein polisiau, neu i amddiffyn hawliau, eiddo neu diogelwch eraill.</p> + + <p>Gall eich cynnwys cyhoeddus gael ei lawrlwytho gan weinyddwyr eraill yn y rhwydwaith. Mae eich tŵtiau cyhoeddus a'r rhai dilynwyr yn unig yn cael eu hanfon i'r gweinyddwyr sy'n lletya eich dilynwyr, tra bod negeseuon uniongrychol yn cael eu hanfon at weinyddwyr y derbynwyr, cyn belled a fod y dilynwyr neu'r derbynwyr hynny yn bodoli ar weinydd gwahanol i'r un hwn.</p> + + <p>Pan yr ydych yn caniatau y rhaglen hwn i ddefnyddio'ch cyfrif, yn dibynnu ar sgôp yr hyn yr ydych yn caniatau, gallai gael mynediad at eich gwybodaeth proffil cyhoeddus, eich rhestr dilynwyr, eich dilynwyr, eich rhestrau, eich holl dŵtiau a'ch ffefrynnau. Ni all rhaglenni byth gael mynediad at eich cyfeiriad e-bost na chwaith eich cyfrinair.</p> + + <hr class="spacer" /> + + <h3 id="children">Defnydd o'r wefan gan blant</h3> + + <p>Os yw'r gweinydd hwn yn yr UE neu'r EEA: Mae ein gwefan, ein nwyddau a'n gwasanaethau oll wedi eu cyfeirio at bobl sydd dros 16 mlwydd oed. Os ydych o dan 16, yn ôl gofyniad y GDPR (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation</a>) peidiwch a defnyddio'r wefan hon.</p> + + <p>Os yw'r gweinydd hwn yn UDA: Mae ein gwefan, ein nwyddau a'n gwasanaethau oll wedi eu cyfeirio at bobl sydd dros 13 mlwydd oed oleiaf. Os ydych o dan 13 mlwydd oed, yn ôl gofyniad COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) peidiwch a defnyddio'r wefan hon.</p> + + <p>Mae gofynion y gyfraith yn gallu bod yn wahanol os yw'r gweinydd hwn mewn awdurdodaeth wahanol.</p> + + <hr class="spacer" /> + + <h3 id="changes">Newidiadau i'n Polisi Preifatrwydd</h3> + + <p>Os ydyn yn penderfynnu i newid ein polisi preifatrwydd, fe wnawn ni roi'r newidiadau hynny ar y dudalen hon.</p> + + <p>Mae'r ddogfen hon yn CC-BY-SA. Cafodd ei ddiweddaru diwethaf ar y 7fed o Fawrth, 2018.</p> + + <p>Cafodd ei addasu yn wreiddiol o'r<a href="https://github.com/discourse/discourse">Polisi preifatrwydd disgwrs</a>.</p> + title: "%{instance} Termau Gwasanaeth a Polisi Preifatrwydd" themes: contrast: Cyferbyniad uchel - default: '' + default: Mastodon mastodon-light: Mastodon (golau) time: formats: default: "%b %d, %Y, %H:%M" month: "%b %Y" + two_factor_authentication: + code_hint: Mewnbynwch y côd a grewyd gan eich ap dilysu i gadarnhau + description_html: Os ydych yn galluogi <strong>awdurdodi dau-gam</strong>, bydd mewngofnodi yn gofyn i chi fod a'ch ffôn gerllaw er mwyn cynhyrchu tocyn i chi gael mewnbynnu. + disable: Diffodd + enable: Galluogi + enabled: Awdurdodi dau-gam wedi'i alluogi + enabled_success: Awdurdodi dau-gam wedi'i alluogi'n llwyddiannus + generate_recovery_codes: Cynhyrchu côdau adfer + instructions_html: "<strong>Sganiwch y côd QR yn Google Authenticator neu ap TOTP tebyg ar eich ffôn</strong>. O hyn ymlaen, bydd yr ap hwnnw yn cynhyrchu tocynnau y bydd rhaid i chi fewnbynnu tra'n mewngofnodi." + lost_recovery_codes: Mae côdau adfer yn caniatau i chi gael mynediad i'ch cyfrif eto os ydych yn colli'ch ffôn. Os ydych wedi colli eich côdau adfer, mae modd i chi gynhyrchu nhw eto yma. Bydd eich hen gôdau wedyn yn annilys. + manual_instructions: 'Os nad ydych yn gallu sganio côd QR ac angen ei fewnbynnu a llaw, dyma''r gyfrinach testun-plaen:' + recovery_codes: Creu copi wrth gefn o gôdau adfywio + recovery_codes_regenerated: Llwyddwyd i ail greu côdau adfywio + recovery_instructions_html: Os ydych byth yn colli mynediad i'ch ffôn, mae modd i chi ddefnyddio un o'r côdau adfywio isod i ennill mynediad i'ch cyfrif eto. <strong>Cadwch y côdau adfywio yn saff</strong>. Er enghraifft, gallwch eu argraffu a'u cadw gyda dogfennau eraill pwysig. + setup: Sefydlu + wrong_code: Roedd y cod y mewnbynnwyd yn annilys! A yw'r amser gweinydd ac amser dyfais yn gywir? user_mailer: + backup_ready: + explanation: Fe wnaethoch chi gais am gopi wrth gefn llawn o'ch cyfrif Mastodon. Mae nawr yn barod i'w lawrlwytho! + subject: Mae eich archif yn barod i'w lawrlwytho + title: Allfudo archif welcome: + edit_profile_action: Sefydlu proffil + edit_profile_step: Mae modd i chi addasu eich proffil drwy uwchlwytho afatar, pennawd, drwy newid eich enw arddangos a mwy. Os hoffech chi adolygu dilynwyr newydd cyn iddynt gael caniatad i'ch dilyn, mae modd i chi gloi eich cyfrif. + explanation: Dyma ambell nodyn i'ch helpu i ddechrau + final_action: Dechrau postio + final_step: 'Dechrau postio! Hyd yn oed heb ddilynwyr mae''n bosib i eraill weld eich negeseuon cyhoeddus, er enghraifft at y ffrwd leol ac mewn hashnodau. Mae''n bosib yr hoffech hi gyflwyno''ch hun ar yr hashnod #introductions.' + full_handle: Eich enw Mastodon llawn + full_handle_hint: Dyma'r hyn y bysech yn dweud wrth eich ffrindiau er mwyn iddyn nhw gael anfon neges atoch o achos arall. + review_preferences_action: Newid dewisiadau + review_preferences_step: Gwnewch yn siŵr i chi osod eich dewisiadau, megis pa e-byst hoffech eu derbyn, neu ba lefel preifatrwydd hoffech eich tŵtiau ragosod i. Os nad oes gennych salwch symud, gallwch ddewis i ganiatau chwarae GIFs yn awtomatig. subject: Croeso i Mastodon + tip_bridge_html: Os ydych yn dod o Twitter, mae modd i chi ganfod eich ffrindiau ar Mastodon drwy ddefnyddio'r <a href="%{bridge_url}">1ap pontio</a>2. Mae hyn ond yn gweithio os ydynt hwythau yn defnyddio'r ap pontio hefyd! + tip_federated_timeline: Mae'r ffrwd ffederasiwn yn olwg firehose o'r rhwydwaith Mastodon. Ond mae ond yn cynnwys y bobl mae eich cymdogion wedi ymrestru iddynt, felly nid yw'n gyflawn. + tip_following: Rydych yn dilyn goruwchwyliwr eich gweinydd yn ddiofyn. I ganfod pobl mwy diddorol, edrychwch ar y ffrydiau lleol a'r rhai wedi ei ffedereiddio. + tip_local_timeline: Mae'r ffrwd leol yn olwg firehose o bobl ar %{instance}. Dyma eich cymdogion agosaf! + tip_mobile_webapp: Os yw eich porwr gwe yn cynnig i ch ychwanegu Mastodon i'ch sgrîn gartref, mae modd i chi dderbyn hysbysiadau push. Mewn sawl modd mae'n gweithio fel ap cynhenid! + tips: Awgrymiadau + title: Croeso, %{name}! + users: + follow_limit_reached: Nid oes modd i chi ddilyn mwy na %{limit} o bobl + invalid_email: Mae'r cyfeiriad e-bost hwn yn annilys + invalid_otp_token: Côd dau-ffactor annilys + otp_lost_help_html: Os colloch chi fynediad i'r ddau, mae modd i chi gysylltu a %{email} + seamless_external_login: Yr ydych wedi'ch mewngofnodi drwy wasanaeth allanol, felly nid yw gosodiadau cyfrinair ac e-bost ar gael. + signed_in_as: 'Wedi mewngofnodi fel:' + verification: + explanation_html: 'Mae modd i chi <strong>ddilysu eich hun fel perchenog y dolenni yn metadata eich proffil</strong>. Rhaid i''r wefan a dolen iddi gynnwys dolen yn ôl i''ch proffil Mastodon. <strong>Rhaid</strong> i''r ddolen yn ôl gael nodwedd <code>rel="fi"</code>. Nid oes ots beth yw cynnwys testun y ddolen. Dyma enghraifft:' + verification: Dilysu diff --git a/config/locales/da.yml b/config/locales/da.yml index 7cda5cbca..d9ce9d55d 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -48,6 +48,7 @@ da: other: Følgere following: Følger joined: Tilmeldt den %{date} + link_verified_on: Ejerskabet af dette link blev tjekket den %{date} media: Medier moved_html: "%{name} er flyttet til %{new_profile_link}:" network_hidden: Denne information er ikke tilgængelig @@ -126,7 +127,7 @@ da: most_recent: Seneste title: Rækkefølge outbox_url: Link til udgående - perform_full_suspension: Udfør fuld udelukkelse + perform_full_suspension: Udeluk profile_url: Link til profil promote: Forfrem protocol: Protokol @@ -155,8 +156,10 @@ da: report: anmeld targeted_reports: Anmeldelser fra denne konto silence: Dæmp + silenced: Dæmpet statuses: Statusser subscribe: Abonner + suspended: Udelukket title: Konti unconfirmed_email: Ikke-bekræftet email undo_silenced: Fortryd dæmpning @@ -258,6 +261,7 @@ da: title: Ny domæne blokering reject_media: Afvis medie filer reject_media_hint: Fjerner lokalt lagrede multimedie filer og nægter at hente nogen i fremtiden. Irrelevant for udelukkelser + reject_reports: Afvis anmeldelser severities: noop: Ingen silence: Dæmp @@ -336,9 +340,7 @@ da: reported_by: Anmeldt af resolved: Løst resolved_msg: Anmeldelse er sat til at være løst! - silence_account: Dæmp konto status: Status - suspend_account: Udeluk konto title: Anmeldelser unassign: Utildel unresolved: Uløst diff --git a/config/locales/de.yml b/config/locales/de.yml index efd350e98..d3b571f66 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -22,7 +22,7 @@ de: not_a_product_title: Du bist ein Mensch und keine Ware real_conversation_body: Mit 500 Zeichen pro Beitrag und der Ermöglichung präziser Inhalts- und Bilderwarnungen kannst du dich so ausdrücken, wie du es möchtest. real_conversation_title: Für das echte Gespräch gemacht - within_reach_body: Verschiedene Apps für iOS, Android und andere Plattformen erlauben dir dank unserem blühenden API-Ökosystem, dich von überall auf dem Laufenden zu halten. + within_reach_body: Verschiedene Apps für iOS, Android und andere Plattformen erlauben dir, dank unseres blühenden API-Ökosystems, dich von überall auf dem Laufenden zu halten. within_reach_title: Immer für dich da generic_description: "%{domain} ist ein Server im Netzwerk" hosted_on: Mastodon, beherbergt auf %{domain} @@ -36,8 +36,8 @@ de: status_count_before: mit terms: Nutzungsbedingungen user_count_after: - one: Benutzer - other: Benutzer + one: Benutzer:in + other: Benutzer:innen user_count_before: Zuhause für what_is_mastodon: Was ist Mastodon? accounts: @@ -48,6 +48,7 @@ de: other: Follower following: Folgt joined: Beigetreten am %{date} + link_verified_on: Besitz des Links wurde überprüft am %{date} media: Medien moved_html: "%{name} ist auf %{new_profile_link} umgezogen:" network_hidden: Diese Informationen sind nicht verfügbar @@ -120,13 +121,14 @@ de: moderation_notes: Moderationsnotizen most_recent_activity: Letzte Aktivität most_recent_ip: Letzte IP-Adresse + no_limits_imposed: Keine Limits eingesetzt not_subscribed: Nicht abonniert order: alphabetic: Alphabetisch most_recent: Neueste title: Sortierung outbox_url: Postausgangs-URL - perform_full_suspension: Vollständige Sperre durchführen + perform_full_suspension: Sperren profile_url: Profil-URL promote: Befördern protocol: Protokoll @@ -135,7 +137,7 @@ de: redownload: Avatar neu laden remove_avatar: Profilbild entfernen resend_confirmation: - already_confirmed: Dieser Benutzer wurde bereits bestätigt + already_confirmed: Diese:r Benutzer:in wurde bereits bestätigt send: Bestätigungsmail erneut senden success: Bestätigungs-E-Mail erfolgreich gesendet! reset: Zurücksetzen @@ -144,7 +146,7 @@ de: role: Berechtigungen roles: admin: Administrator - moderator: Moderator + moderator: Moderator:in staff: Mitarbeiter user: Nutzer salmon_url: Salmon-URL @@ -155,8 +157,10 @@ de: report: Meldung targeted_reports: Meldungen über dieses Konto silence: Stummschalten + silenced: Stummgeschaltet statuses: Beiträge subscribe: Abonnieren + suspended: Gesperrt title: Konten unconfirmed_email: Unbestätigte E-Mail-Adresse undo_silenced: Stummschaltung zurücknehmen @@ -172,20 +176,21 @@ de: create_custom_emoji: "%{name} hat neues Emoji %{target} hochgeladen" create_domain_block: "%{name} hat die Domain %{target} blockiert" create_email_domain_block: "%{name} hat die E-Mail-Domain %{target} geblacklistet" - demote_user: "%{name} stufte Benutzer %{target} herunter" + demote_user: "%{name} stufte Benutzer:in %{target} herunter" + destroy_custom_emoji: "%{name} zerstörte Emoji %{target}" destroy_domain_block: "%{name} hat die Domain %{target} entblockt" destroy_email_domain_block: "%{name} hat die E-Mail-Domain %{target} gewhitelistet" destroy_status: "%{name} hat Status von %{target} entfernt" - disable_2fa_user: "%{name} hat Zwei-Faktor-Anforderung für Benutzer %{target} deaktiviert" + disable_2fa_user: "%{name} hat Zwei-Faktor-Anforderung für Benutzer:in %{target} deaktiviert" disable_custom_emoji: "%{name} hat das %{target} Emoji deaktiviert" - disable_user: "%{name} hat den Login für Benutzer %{target} deaktiviert" + disable_user: "%{name} hat den Login für Benutzer:in %{target} deaktiviert" enable_custom_emoji: "%{name} hat das %{target} Emoji aktiviert" - enable_user: "%{name} hat die Anmeldung für den Benutzer %{target} aktiviert" + enable_user: "%{name} hat die Anmeldung für di:en Benutzer:in %{target} aktiviert" memorialize_account: "%{name} hat %{target}s Profil in eine Gedenkseite umgewandelt" promote_user: "%{name} hat %{target} befördert" remove_avatar_user: "%{name} hat das Profilbild von %{target} entfernt" reopen_report: "%{name} hat die Meldung %{target} wieder geöffnet" - reset_password_user: "%{name} hat das Passwort für den Benutzer %{target} zurückgesetzt" + reset_password_user: "%{name} hat das Passwort für di:en Benutzer:in %{target} zurückgesetzt" resolve_report: "%{name} hat die Meldung %{target} bearbeitet" silence_account: "%{name} hat %{target}s Account stummgeschaltet" suspend_account: "%{name} hat %{target}s Account gesperrt" @@ -237,11 +242,11 @@ de: software: Software space: Speicherverbrauch title: Übersicht - total_users: Benutzer Insgesamt + total_users: Benutzer:innen insgesamt trends: Trends week_interactions: Interaktionen diese Woche week_users_active: Aktiv diese Woche - week_users_new: Benutzer diese Woche + week_users_new: Benutzer:innen diese Woche domain_blocks: add_new: Neu hinzufügen created_msg: Die Domain-Blockade wird nun durchgeführt @@ -258,6 +263,8 @@ de: title: Neue Domain-Blockade reject_media: Mediendateien ablehnen reject_media_hint: Entfernt lokal gespeicherte Mediendateien und verhindert deren künftiges Herunterladen. Für Sperren irrelevant + reject_reports: Meldungen ablehnen + reject_reports_hint: Ignoriere alle Meldungen von dieser Domain. Irrelevant für Sperrungen severities: noop: Kein silence: Stummschaltung @@ -300,8 +307,13 @@ de: title: Einladungen relays: add_new: Neues Relay hinzufügen + delete: Löschen description_html: Ein <strong>Föderierungsrelay</strong> ist ein vermittelnder Server, der eine große Anzahl öffentlicher Beiträge zwischen Servern austauscht, die es abonnieren und zu ihm veröffentlichen.<strong> Es kann kleinen und mittleren Servern dabei helfen, Inhalte des Fediverse zu entdecken</strong>, was andernfalls das manuelle Folgen anderer Leute auf entfernten Servern durch lokale Nutzer erfordern würde. + disable: Ausschalten + disabled: Ausgeschaltet + enable: Einschalten enable_hint: Sobald aktiviert wird dein Server alle öffentlichen Beiträge dieses Relays abonnieren und wird alle öffentlichen Beiträge dieses Servers an es senden. + enabled: Eingeschaltet inbox_url: Relay-URL pending: Warte auf Zustimmung des Relays save_and_enable: Speichern und aktivieren @@ -336,9 +348,7 @@ de: reported_by: Gemeldet von resolved: Gelöst resolved_msg: Meldung erfolgreich gelöst! - silence_account: Konto stummschalten status: Status - suspend_account: Konto sperren title: Meldungen unassign: Zuweisung entfernen unresolved: Ungelöst @@ -359,6 +369,9 @@ de: hero: desc_html: Wird auf der Startseite angezeigt. Mindestens 600x100px sind empfohlen. Wenn es nicht gesetzt wurde, wird das Instanz-Thumbnail dafür verwendet title: Bild für Startseite + mascot: + desc_html: Angezeigt auf mehreren Seiten. Mehr als 293x205px empfohlen. Wenn es nicht gesetzt wurde wird es auf das Standard-Maskottchen zurückfallen + title: Maskottchen-Bild peers_api_enabled: desc_html: Domain-Namen dieser Instanz, die im Fediverse gefunden wurden title: Veröffentliche Liste von gefundenen Instanzen @@ -452,7 +465,7 @@ de: warning: Sei mit diesen Daten sehr vorsichtig. Teile sie mit niemandem! your_token: Dein Zugangs-Token auth: - agreement_html: Indem du dich registrierst, erklärst du dich mit den Regeln, die <a href="%{rules_path}">auf dieser Instanz gelten</a> und der <a href="%{terms_path}">Datenschutzerklärung</a> einverstanden. + agreement_html: Indem du dich registrierst, erklärst du dich mit den untenstehenden <a href="%{rules_path}">Regeln dieser Instanz</a> und der <a href="%{terms_path}">Datenschutzerklärung</a> einverstanden. change_password: Passwort confirm_email: E-Mail bestätigen delete_account: Konto löschen @@ -567,6 +580,7 @@ de: resources: Ressourcen generic: changes_saved_msg: Änderungen gespeichert! + copy: Kopieren save_changes: Änderungen speichern validation_errors: one: Etwas ist noch nicht ganz richtig! Bitte korrigiere den Fehler @@ -783,9 +797,9 @@ de: <h3 id="collect">Welche Informationen sammeln wir?</h3> <ul> - <li><em>Grundlegende Kontoinformationen</em>: Wenn du dich auf diesem Server registrierst, wirst du darum gebeten, einen Benutzernamen, eine E-Mail-Adresse und ein Passwort einzugeben. Du kannst auch zusätzliche Profilinformationen wie etwa einen Anzeigenamen oder eine Biografie eingeben und ein Profilbild oder ein Headerbild hochladen. Der Benutzername, der Anzeigename, die Biografie, das Profilbild und das Headerbild werden immer öffentlich angezeigt.</li> + <li><em>Grundlegende Kontoinformationen</em>: Wenn du dich auf diesem Server registrierst, wirst du darum gebeten, einen Benutzer:innen-Namen, eine E-Mail-Adresse und ein Passwort einzugeben. Du kannst auch zusätzliche Profilinformationen wie etwa einen Anzeigenamen oder eine Biografie eingeben und ein Profilbild oder ein Headerbild hochladen. Der Benutzer:innen-Name, der Anzeigename, die Biografie, das Profilbild und das Headerbild werden immer öffentlich angezeigt.</li> <li><em>Beiträge, Folge- und andere öffentliche Informationen</em>: Die Liste der Leute, denen du folgst, wird öffentlich gezeigt, das gleiche gilt für deine Folgenden (Follower). Sobald du eine Nachricht übermittelst, wird das Datum und die Uhrzeit gemeinsam mit der Information, welche Anwendung du dafür verwendet hast, gespeichert. Nachricht können Medienanhänge enthalten, etwa Bilder und Videos. Öffentliche und ungelistete Beiträge sind öffentlich verfügbar. Sobald du einen Beitrag auf deinem Profil featurest, sind dies auch öffentlich verfügbare Informationen. Deine Beiträge werden an deine Folgenden ausgeliefert, was in manchen Fällen bedeutet, dass sie an andere Server ausgeliefert werden und dort Kopien gespeichert werden. Sobald du Beiträge löschst, wird dies ebenso an deine Follower ausgeliefert. Die Handlungen des Teilens und Favorisieren eines anderen Beitrages ist immer öffentlich.</li> - <li><em>Direkte und "Nur Folgende"-Beiträge</em>: Alle Beiträge werden auf dem Server gespeichert und verarbeitet. "Nur Folgende"-Beiträge werden an deine Folgenden und an Benutzer, die du in ihnen erwähnst, ausgeliefert, direkte Beiträge nur an in ihnen erwähnte Benutzer. In manchen Fällen bedeutet dass, dass sie an andere Server ausgeliefert werden und dort Kopien gespeichert werden. Wir bemühen uns nach bestem Wissen und Gewissen, den Zugriff auf diese Beiträge auf nur autorisierte Personen einzuschränken, jedoch könnten andere Server dabei scheitern. Deswegen ist es wichtig, die Server, zu denen deine Folgenden gehören, zu überprüfen. Du kannst eine Option in den Einstellungen umschalten, um neue Folgenden manuell anzunehmen oder abzuweisen. <em>Bitte beachte, dass die Betreiber des Server und jedes empfangenden Servers solche Nachrichten anschauen könnten</em> und dass Empfänger von diesen eine Bildschirmkopie erstellen könnten, sie kopieren oder anderweitig weiterverteilen könnten. <em>Teile nicht irgendwelche gefährlichen Informationen über Mastodon.</em></li> + <li><em>Direkte und "Nur Folgende"-Beiträge</em>: Alle Beiträge werden auf dem Server gespeichert und verarbeitet. "Nur Folgende"-Beiträge werden an deine Folgenden und an Benutzer:innen, die du in ihnen erwähnst, ausgeliefert, direkte Beiträge nur an in ihnen erwähnte Benutzer:innen. In manchen Fällen bedeutet dass, dass sie an andere Server ausgeliefert werden und dort Kopien gespeichert werden. Wir bemühen uns nach bestem Wissen und Gewissen, den Zugriff auf diese Beiträge auf nur autorisierte Personen einzuschränken, jedoch könnten andere Server dabei scheitern. Deswegen ist es wichtig, die Server, zu denen deine Folgenden gehören, zu überprüfen. Du kannst eine Option in den Einstellungen umschalten, um neue Folgenden manuell anzunehmen oder abzuweisen. <em>Bitte beachte, dass die Betreiber des Server und jedes empfangenden Servers solche Nachrichten anschauen könnten</em> und dass Empfänger von diesen eine Bildschirmkopie erstellen könnten, sie kopieren oder anderweitig weiterverteilen könnten. <em>Teile nicht irgendwelche gefährlichen Informationen über Mastodon.</em></li> <li><em>Internet Protocol-Adressen (IP-Adressen) und andere Metadaten</em>: Sobald du dich anmeldest, erfassen wir sowohl die IP-Adresse, von der aus du dich anmeldest, als auch den Namen deine Browseranwendung. Alle angemeldeten Sitzungen (Sessions) sind für deine Überprüfung und Widerruf in den Einstellungen verfügbar. Die letzte verwendete IP-Adresse wird bis zu 12 Monate lang gespeichert. Wir könnten auch Serverprotokoll behalten, welche die IP-Adresse von jeder Anfrage an unseren Server enthalten.</li> </ul> @@ -815,7 +829,7 @@ de: <ul> <li>Serverprotokolle, die IP-Adressen von allen deinen Anfragen an diesen Server, falls solche Protokolle behalten werden, für nicht mehr als 90 Tage behalten.</li> - <li>registrierten Benutzern zu geordnete IP-Adressen nicht länger als 12 Monate behalten.</li> + <li>registrierten Benutzer:innen zugeordnete IP-Adressen nicht länger als 12 Monate behalten.</li> </ul> <p>Du kannst ein Archiv deines Inhalts anfordern und herunterladen, inkludierend deiner Beiträge, Medienanhänge, Profilbilder und Headerbilder.</p> @@ -909,8 +923,12 @@ de: tips: Tipps title: Willkommen an Bord, %{name}! users: + follow_limit_reached: Du kannst nicht mehr als %{limit} Leuten folgen invalid_email: Ungültige E-Mail-Adresse invalid_otp_token: Ungültiger Zwei-Faktor-Authentisierungs-Code otp_lost_help_html: Wenn Du beides nicht mehr weißt, melde Dich bei uns unter der E-Mailadresse %{email} seamless_external_login: Du bist angemeldet über einen Drittanbieter-Dienst, weswegen Passwort- und E-Maileinstellungen nicht verfügbar sind. signed_in_as: 'Angemeldet als:' + verification: + explanation_html: 'Du kannst <strong>bestätigen, dass die Links in deinen Profil-Metadaten dir gehören</strong>. Dafür muss die verlinkte Website einen Link zurück auf dein Mastodon-Profil enthalten. Dieser Link <strong>muss</strong> ein <code>rel="me"</code>-Attribut enthalten. Der Linktext is dabei egal. Hier ist ein Beispiel:' + verification: Verifizierung diff --git a/config/locales/devise.ar.yml b/config/locales/devise.ar.yml index cadc4daa8..4d80176c6 100644 --- a/config/locales/devise.ar.yml +++ b/config/locales/devise.ar.yml @@ -77,6 +77,4 @@ ar: expired: إنتهت مدة صلاحيته، الرجاء طلب واحد جديد not_found: لا يوجد not_locked: ليس مقفلاً - not_saved: - one: 'خطأ واحد منَعَ %{resource} مِن القيام بالإحتفاظ :' - other: "%{count} أخطاء منعت %{resource} مِن القيام بالإحتفاظ :" + not_saved: "%{count} أخطاء منعت %{resource} مِن القيام بالإحتفاظ :" diff --git a/config/locales/devise.ast.yml b/config/locales/devise.ast.yml index 0d161faf2..6e32cbc2f 100644 --- a/config/locales/devise.ast.yml +++ b/config/locales/devise.ast.yml @@ -1 +1,2 @@ +--- ast: {} diff --git a/config/locales/devise.bg.yml b/config/locales/devise.bg.yml index 8e1ba6eb4..3c04af81b 100644 --- a/config/locales/devise.bg.yml +++ b/config/locales/devise.bg.yml @@ -8,16 +8,16 @@ bg: failure: already_authenticated: Вече си вътре в профила си. inactive: Профилът ти все още не е активиран. - invalid: Невалиден имейл адрес или парола. + invalid: Невалиден %{authentication_keys}. last_attempt: Разполагаш с още един опит преди профилът ти да бъде заключен. locked: Профилът ти е заключен. - not_found_in_database: Невалидни стойности за %{authentication_keys} или парола. + not_found_in_database: Невалиден %{authentication_keys}. timeout: Сесията ти изтече, моля влез отново, за да продължиш. unauthenticated: Преди да продължиш, трябва да влезеш в профила си или да се регистрираш. unconfirmed: Преди да продължиш, трябва да потвърдиш регистрацията си. mailer: confirmation_instructions: - subject: 'Mastodon: Инструкции за потвърждаване' + subject: 'Mastodon: Инструкции за потвърждаване %{instance}' password_change: subject: 'Mastodon: Паролата е променена' reset_password_instructions: diff --git a/config/locales/devise.ca.yml b/config/locales/devise.ca.yml index 808a5dd0a..4c17f3378 100644 --- a/config/locales/devise.ca.yml +++ b/config/locales/devise.ca.yml @@ -20,7 +20,7 @@ ca: action: Verifica l'adreça de correu explanation: Has creat un compte a %{host} amb aquesta adreça de correu electrònic. Estàs a un sol clic de l'activació. Si no fos així, ignora aquest correu electrònic. extra_html: Si us plau consulta també <a href="%{terms_path}"> les regles de la instància</a> i <a href="%{policy_path}"> les nostres condicions de servei</a>. - subject: 'Mastodon: Instruccions de confirmació' + subject: 'Mastodon: Instruccions de confirmació %{instance}' title: Verifica l'adreça de correu email_changed: explanation: 'L''adreça de correu del teu compte s''està canviant a:' diff --git a/config/locales/devise.cs.yml b/config/locales/devise.cs.yml index 49814b368..4268dc0ad 100644 --- a/config/locales/devise.cs.yml +++ b/config/locales/devise.cs.yml @@ -77,6 +77,4 @@ cs: expired: vypršel, prosím vyžádejte si nový not_found: nenalezen not_locked: nebyl uzamčen - not_saved: - one: '1 chyba zabránila uložení tohoto %{resource}:' - other: "%{count} chyb zabránila uložení tohoto %{resource}:" + not_saved: "%{count} chyb zabránila uložení tohoto %{resource}:" diff --git a/config/locales/devise.cy.yml b/config/locales/devise.cy.yml index 9cf8b96f0..7d96e57f9 100644 --- a/config/locales/devise.cy.yml +++ b/config/locales/devise.cy.yml @@ -6,10 +6,10 @@ cy: send_instructions: Byddwch yn derbyn e-bost a chyfarwyddiadau am sut i gadarnhau eich cyfeiriad e-bost mewn rhai munudau. Os na dderbynioch chi'r e-bost hwn, edrychwch yn eich ffolder sbam os gwelwch yn dda. send_paranoid_instructions: Os yw eich cyfeiriad e-bost yn bodoli yn ein bas data, byddwch yn derbyn e-bost a chyfarwyddiadau am sut i gadarnhau eich cyfeiriad ebost mewn rhai munudau. Os na dderbynioch chi'r e-bost hwn, edrychwch yn eich ffolder sbam os gwelwch yn dda. failure: - already_authenticated: Yr ydych yn barod wedi mewngofnodi. + already_authenticated: Yr ydych wedi mewngofnodi yn barod. inactive: Nid yw eich cyfrif yn weithredol eto. invalid: "%{authentication_keys} neu gyfrinair annilys." - last_attempt: Mae gennych un gyfle arall cyn i'ch cyfrif gael ei gloi. + last_attempt: Mae gennych un cyfle arall cyn i'ch cyfrif gael ei gloi. locked: Mae eich cyfrif wedi ei gloi. not_found_in_database: "%{authentication_keys} neu gyfrinair annilys." timeout: Mae eich sesiwn wedi dod i ben. Mewngofnodwch eto i barhau. @@ -19,29 +19,29 @@ cy: confirmation_instructions: action: Gwiriwch eich cyfeiriad e-bost explanation: Yr ydych wedi creu cyfrif ar %{host} gyda'r cyfrif e-bost hwn. Dim ond un clic sydd angen i'w wneud yn weithredol. Os nad chi oedd hyn, anwybyddwch yr e-bost hwn os gwelwch yn dda. - extra_html: Gwnewch yn siŵr i edrych ar <a href="%{terms_path}">reolau'r INSTANCE</a> a <a href="%{policy_path}">ein telerau gwasanaeth</a>. + extra_html: Gwnewch yn siŵr i edrych ar <a href="%{terms_path}">reolau'r achos</a> a <a href="%{policy_path}">ein telerau gwasanaeth</a>. subject: 'Mastodon: Canllawiau cadarnhau i %{instance}' - title: Gwiriwch cyfeiriad e-bost + title: Gwirio cyfeiriad e-bost email_changed: explanation: 'Mae''r cyfeiriad e-bost ar gyfer eich cyfrif yn cael ei newid i:' - extra: Os na wnaethoch chi newid eich e-bost, mae'n debygol fod rhywun wedi cael mynediad i'ch cyfrif. Newidwch eich cyfrinair yn syth os gwelwch yn dda neu cysylltwch a gweinydd yr INSTANCE os ydych wedi'ch cloi allan o'ch cyfrif. + extra: Os na wnaethoch chi newid eich e-bost, mae'n debygol fod rhywun wedi cael mynediad i'ch cyfrif. Newidwch eich cyfrinair yn syth os gwelwch yn dda neu cysylltwch a gweinydd yr achos os ydych wedi'ch cloi allan o'ch cyfrif. subject: 'Mastodon: Newidwyd e-bost' title: Cyfeiriad e-bost newydd password_change: explanation: Newidwyd cyfrinair eich cyfrif. - extra: Os na wnaethoch chi newid eich e-bost, mae'n debygol fod rhywun wedi cael mynediad i'ch cyfrif. Newidwch eich cyfrinair yn syth os gwelwch yn dda neu cysylltwch a gweinydd yr INSTANCE os ydych wedi'ch cloi allan o'ch cyfrif. + extra: Os na wnaethoch chi newid eich e-bost, mae'n debygol fod rhywun wedi cael mynediad i'ch cyfrif. Newidwch eich cyfrinair yn syth os gwelwch yn dda neu cysylltwch a gweinydd yr achos os ydych wedi'ch cloi allan o'ch cyfrif. subject: 'Mastodon: Newidwyd Cyfrinair' title: Newidwyd cyfrinair reconfirmation_instructions: explanation: Cadarnhewch y cyferiad newydd i newid eich e-bost. extra: Os nad chi wnaeth y newid hwn, anwybyddwch yr e-bost hwn os gwelwch yn dda. Ni fydd y cyfeiriad e-bost ar gyfer y cyfrif Mastodon yn newid nes eich bod yn mynd at y ddolen uchod. subject: 'Mastodon: Cadarnhewch e-bost i %{instance}' - title: Gwiriwch cyfeiriad e-bost + title: Gwirio cyfeiriad e-bost reset_password_instructions: action: Newid cyfrinair explanation: Gofynnoch am gyfrinair newydd i'ch cyfrif. extra: Os na wnaethoch gais am hyn, anwybyddwch yr e-bost hwn os gwelwch yn dda. Ni fydd eich cyfrinair yn newid nes i chi fynd at y ddolen uchod a chreu un newydd. - subject: 'Mastodon: Ailosodwch cyfarwyddiadau cyfrinair' + subject: 'Mastodon: Ailosod cyfarwyddiadau cyfrinair' title: Ailosod cyfrinair unlock_instructions: subject: 'Mastodon: Cyfarwyddiadau datgloi' @@ -55,28 +55,26 @@ cy: updated: Mae eich cyfrinair wedi ei newid yn llwyddiannus. Yr ydych wedi mewngofnodi. updated_not_active: Mae eich cyfrinair wedi ei newid yn llwyddiannus. registrations: - destroyed: Hwyl fawr! Mae eich cyfrif wedi ei ganslo'n llwyddiannus. Gobeithiwn eich gweld eto'n fuan. - signed_up: Croeso! Rydych wedi llwyddo i ymuno. + destroyed: Hwyl fawr! Mae eich cyfrif wedi ei ganslo'n llwyddiannus. Gobeithiwn eich gweld chi eto'n fuan. + signed_up: Croeso! Rydych wedi cofrestru'n llwyddiannus. signed_up_but_inactive: Yr ydych wedi cofrestru'n llwyddiannus. Fodd bynnag, ni allwn eich mewngofnodi achos nid yw eich cyfrif wedi ei actifadu eto. signed_up_but_locked: Yr ydych wedi cofrestru'n llwyddiannus. Fodd bynnag, ni allwn eich mewngofnodi achos fod eich cyfrif wedi ei gloi. signed_up_but_unconfirmed: Mae neges gyda dolen cadarnhau wedi ei anfon i'ch cyfeiriad e-bost. Dilynwch y ddolen er mwyn actifadu eich cyfrif. Edrychwch yn eich ffolder sbam os na dderbynioch chi'r e-bost hwn os gwelwch yn dda. - update_needs_confirmation: Rydych wedi diweddaru eich cyfrif yn llwyddiannus, ond mae angen i ni wirio eich cyfeiriad e-bost newydd. Edrychwch ar eich e-byst a dilynwch y ddolen gadarnhau er mwyn cadarnhau eich cyfeiriad e-bost newydd. Edrychwch ar eich ffolder sbam os na dderbynioch chi yr e-bost hwn. + update_needs_confirmation: Rydych wedi diweddaru eich cyfrif yn llwyddiannus, ond mae angen i ni wirio'ch cyfeiriad e-bost newydd. Edrychwch ar eich e-byst a dilynwch y ddolen gadarnhau er mwyn cadarnhau eich cyfeiriad e-bost newydd. Edrychwch ar eich ffolder sbam os na dderbynioch chi yr e-bost hwn. updated: Mae eich cyfrif wedi ei ddiweddaru yn llwyddiannus. sessions: already_signed_out: Allgofnodwyd yn llwyddiannus. signed_in: Mewngofnodwyd yn llwyddiannus. signed_out: Allgofnodwyd yn llwyddiannus. unlocks: - send_instructions: Mi fyddwch yn derbyn e-bost a cyfarwyddiadau ynghylch sut i ddatgloi eich cyfrif ymhen cwpl o funudau. Edrychwch yn eich ffolder sbam os na dderbynioch chi'r e-bost hwn os gwelwch yn dda. + send_instructions: Mi fyddwch yn derbyn e-bost a chyfarwyddiadau ynghylch sut i ddatgloi eich cyfrif ymhen cwpl o funudau. Edrychwch yn eich ffolder sbam os na dderbynioch chi'r e-bost hwn os gwelwch yn dda. send_paranoid_instructions: Os yw eich cyfrif yn bodoli, mi fyddwch yn derbyn e-bost a cyfarwyddiadau o sut i ddatgloi eich cyfrif ymhen cwpl o funudau. Edrychwch yn eich ffolder sbam os na dderbynioch chi'r e-bost hwn os gwelwch yn dda. unlocked: Mae eich cyfrif wedi ei ddatgloi'n llwyddiannus. Mewngofnodwch i barhau. errors: messages: - already_confirmed: wedi ei gadarnhau yn baros, ymgeisiwch fewngofnodi + already_confirmed: wedi ei gadarnhau yn barod, ymgeisiwch fewngofnodi confirmation_period_expired: angen ei gadarnhau o fewn %{period}, gwnewch gais am un newydd os gwelwch yn dda expired: wedi dod i ben, gwnewch gais am un newydd os gwelwch yn dda not_found: heb ei ganfod not_locked: heb ei gloi - not_saved: - one: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd 1 gwall:' - other: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:' + not_saved: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:' diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml index e9c98a63f..b6c9e5bd8 100644 --- a/config/locales/devise.fr.yml +++ b/config/locales/devise.fr.yml @@ -8,10 +8,10 @@ fr: failure: already_authenticated: Vous êtes déjà connecté⋅e. inactive: Votre compte n’est pas encore activé. - invalid: Courriel ou mot de passe incorrect. + invalid: "%{authentication_keys} incorrect." last_attempt: Vous avez droit à une tentative avant que votre compte ne soit verrouillé. locked: Votre compte est verrouillé. - not_found_in_database: Courriel ou mot de passe invalide. + not_found_in_database: "%{authentication_keys} invalide." timeout: Votre session a expiré. Veuillez vous reconnecter pour continuer. unauthenticated: Vous devez vous connecter ou vous inscrire pour continuer. unconfirmed: Vous devez valider votre compte pour continuer. diff --git a/config/locales/devise.he.yml b/config/locales/devise.he.yml index 4a2811b1f..3d8f7fa59 100644 --- a/config/locales/devise.he.yml +++ b/config/locales/devise.he.yml @@ -17,7 +17,7 @@ he: unconfirmed: יש לאמת את כתובת הדוא"ל על מנת להמשיך. mailer: confirmation_instructions: - subject: 'מסטודון: הוראות אימות' + subject: 'מסטודון: הוראות אימות %{instance}' password_change: subject: 'מסטודון: הסיסמא שונתה' reset_password_instructions: diff --git a/config/locales/devise.hr.yml b/config/locales/devise.hr.yml index d578e404f..276d26cad 100644 --- a/config/locales/devise.hr.yml +++ b/config/locales/devise.hr.yml @@ -16,7 +16,7 @@ hr: unconfirmed: Moraš potvrditi svoju email adresu prije no što nastaviš. mailer: confirmation_instructions: - subject: 'Mastodon: Upute za potvrđivanje' + subject: 'Mastodon: Upute za potvrđivanje %{instance}' email_changed: subject: 'Mastodon: Email adresa je promijenjena' title: Nova email adresa @@ -58,6 +58,4 @@ hr: expired: je istekao, zatraži novu not_found: nije nađen not_locked: nije zaključan - not_saved: - one: '1 greška je zabranila da ovaj %{resource} bude sačuvan:' - other: "%{count} greške su zabranile da ovaj %{resource} bude sačuvan:" + not_saved: "%{count} greške su zabranile da ovaj %{resource} bude sačuvan:" diff --git a/config/locales/devise.hu.yml b/config/locales/devise.hu.yml index 79ee3b194..67baca016 100644 --- a/config/locales/devise.hu.yml +++ b/config/locales/devise.hu.yml @@ -20,7 +20,7 @@ hu: action: Erősítsd meg az e-mail címedet explanation: Ezzel az e-mail címmel kezdeményeztek regisztrációt a(z) %{host} oldalon. Csak egy kattintás, és a felhasználói fiókdat aktiváljuk. Ha a regisztrációt nem te kezdeményezted, kérjük tekintsd ezt az e-mailt tárgytalannak. extra_html: Kérjük tekintsd át a <a href="%{terms_path}">az instancia szabályzatát</a> és <a href="%{policy_path}">a felhasználási feltételeket</a>. - subject: 'Mastodon: Megerősítési lépések' + subject: 'Mastodon: Megerősítési lépések %{instance}' title: E-mail cím megerősítése email_changed: explanation: 'A fiókodhoz tartozó e-mail címet az alábbira módosítod:' diff --git a/config/locales/devise.io.yml b/config/locales/devise.io.yml index 6ba3038bd..fce061a65 100644 --- a/config/locales/devise.io.yml +++ b/config/locales/devise.io.yml @@ -8,16 +8,16 @@ io: failure: already_authenticated: Tu ya esas enirinta. inactive: Tua konto ankore ne konfirmesas. - invalid: Nejusta retpost-adreso o pasvorto. + invalid: Nejusta %{authentication_keys}. last_attempt: Tu ankore povas probar unfoye ante ke tua konto esos extingita. locked: Tua konto esas extingita. - not_found_in_database: Nejusta retpost-adreso o pasvorto. + not_found_in_database: Nejusta %{authentication_keys}. timeout: Tua kunsido expiris. Voluntez rienirar por durar. unauthenticated: Tu devas enirar o membreskar por durar. unconfirmed: Tu devas konfirmar tua konto por durar. mailer: confirmation_instructions: - subject: Instrucioni por konfirmar + subject: Instrucioni por konfirmar %{instance} password_change: subject: Tua pasvorto chanjesis senprobleme. reset_password_instructions: diff --git a/config/locales/devise.ja.yml b/config/locales/devise.ja.yml index 1f6395479..9df0c7332 100644 --- a/config/locales/devise.ja.yml +++ b/config/locales/devise.ja.yml @@ -20,7 +20,7 @@ ja: action: メールアドレスの確認 explanation: このメールアドレスで%{host}にアカウントを作成しました。有効にするまであと一歩です。もし心当たりがない場合、申し訳ありませんがこのメールを無視してください。 extra_html: また <a href="%{terms_path}">インスタンスのルール</a> と <a href="%{policy_path}">利用規約</a> もお読みください。 - subject: 'Mastodon: メールアドレスの確認' + subject: 'Mastodon: メールアドレスの確認 %{instance}' title: メールアドレスの確認 email_changed: explanation: 'アカウントのメールアドレスは以下のように変更されます:' diff --git a/config/locales/devise.nl.yml b/config/locales/devise.nl.yml index b21798deb..637b1e731 100644 --- a/config/locales/devise.nl.yml +++ b/config/locales/devise.nl.yml @@ -8,11 +8,11 @@ nl: failure: already_authenticated: Je bent al ingelogd. inactive: Jouw account is nog niet geactiveerd. - invalid: Ongeldig e-mailadres of wachtwoord. + invalid: Ongeldig %{authentication_keys}. invalid_token: Ongeldige bevestigingscode. last_attempt: Je hebt nog één poging over voordat jouw account wordt opgeschort. locked: Jouw account is opgeschort. - not_found_in_database: Ongeldig e-mailadres of wachtwoord. + not_found_in_database: Ongeldig %{authentication_keys}. timeout: Jouw sessie is verlopen, log opnieuw in. unauthenticated: Je dient in te loggen of te registreren. unconfirmed: Je dient eerst jouw account te bevestigen. diff --git a/config/locales/devise.no.yml b/config/locales/devise.no.yml index ca16c6ba5..222a91aa3 100644 --- a/config/locales/devise.no.yml +++ b/config/locales/devise.no.yml @@ -20,7 +20,7 @@ action: Bekreft e-postadresse explanation: Du har laget en konto på %{host} med denne e-postadressen. Du er ett klikk unna å aktivere den. Hvis dette ikke var deg, vennligst se bort fra denne e-posten. extra_html: Vennligst også sjekk ut <a href="%{terms_path}">instansens regler </a> og <a href="%{policy_path}">våre bruksvilkår</a>. - subject: 'Mastodon: Instruksjoner for å bekrefte e-postadresse' + subject: 'Mastodon: Instruksjoner for å bekrefte e-postadresse %{instance}' title: Bekreft e-postadresse email_changed: explanation: 'E-postadressen til din konto endres til:' diff --git a/config/locales/devise.oc.yml b/config/locales/devise.oc.yml index 06617af34..beecbb426 100644 --- a/config/locales/devise.oc.yml +++ b/config/locales/devise.oc.yml @@ -8,10 +8,10 @@ oc: failure: already_authenticated: Sètz ja connectat. inactive: Vòstre compte es pas encara activat. - invalid: Corrièl o senhal invalid. + invalid: "%{authentication_keys} invalid." last_attempt: Vos demòra un ensag abans que vòstre compte siasque blocat. locked: Vòstre compte es blocat. - not_found_in_database: Corrièl o senhal invalid. + not_found_in_database: "%{authentication_keys} invalid." timeout: Vòstra session a expirat. Mercés de vos tornar connectar per contunhar. unauthenticated: Vos cal vos connectar o marcar abans de contunhar. unconfirmed: Vos cal confirmar vòstra adreça de corrièl abans de contunhar. diff --git a/config/locales/devise.pl.yml b/config/locales/devise.pl.yml index 49fcca024..54bae2925 100644 --- a/config/locales/devise.pl.yml +++ b/config/locales/devise.pl.yml @@ -20,7 +20,7 @@ pl: action: Zweryfikuj adres e-mail explanation: Utworzyłeś(-aś) konto na %{host} podając ten adres e-mail. Jedno kliknięcie dzieli Cię od aktywacji tego konta. Jeżeli to nie Ty, zignoruj ten e-mail. extra_html: Przeczytaj też <a href="%{terms_path}">regulamin instancji</a> i <a href="%{policy_path}">nasze zasady użytkowania</a>. - subject: 'Mastodon: Instrukcje weryfikacji adresu e-mail' + subject: 'Mastodon: Instrukcje weryfikacji adresu e-mail na %{instance}' title: Zweryfikuj adres e-mail email_changed: explanation: 'Adres e-mail dla Twojego konta zostanie zmieniony na:' @@ -35,7 +35,7 @@ pl: reconfirmation_instructions: explanation: Potwierdź nowy adres aby zmienić e-mail. extra: Jeżeli nie próbowałeś(-aś) zmienić e-maila, zignoruj tą wiadomość. Adres e-mail przypisany do konta Mastodona nie ulegnie zmianie, jeżeli nie użyjesz powyższego odnośniku. - subject: 'Mastodon: Potwierdź adres e-mail na &{instance}' + subject: 'Mastodon: Potwierdź adres e-mail na %{instance}' title: Zweryfikuj adres e-mail reset_password_instructions: action: Zmień hasło @@ -77,6 +77,4 @@ pl: expired: wygasło, poproś o nowe not_found: nie znaleziono not_locked: było zablokowane - not_saved: - one: '1 błąd uniemożliwił zapisanie zasobu %{resource}:' - other: 'Błędy (%{count}) uniemożliwiły zapisanie zasobu %{resource}:' + not_saved: 'Błędy (%{count}) uniemożliwiły zapisanie zasobu %{resource}:' diff --git a/config/locales/devise.pt-BR.yml b/config/locales/devise.pt-BR.yml index 5f47bc901..051329c20 100644 --- a/config/locales/devise.pt-BR.yml +++ b/config/locales/devise.pt-BR.yml @@ -20,7 +20,7 @@ pt-BR: action: Verificar endereço de e-mail explanation: Você criou uma conta em %{host} com esse endereço de e-mail. Você está a um clique de ativá-la. Se não foi você, por favor ignore esse e-mail. extra_html: Por favor confira também <a href="%{terms_path}">as regras da instância</a> e <a href="%{policy_path}">nossos termos de serviço</a>. - subject: 'Mastodon: Instruções de confirmação' + subject: 'Mastodon: Instruções de confirmação para %{instance}' title: Verifique o endereço de e-mail email_changed: explanation: 'O e-mail associado à sua conta será mudado para:' diff --git a/config/locales/devise.uk.yml b/config/locales/devise.uk.yml index 70ac6e4b2..149fc6ce5 100644 --- a/config/locales/devise.uk.yml +++ b/config/locales/devise.uk.yml @@ -17,7 +17,7 @@ uk: unconfirmed: Для продовження Вам потрібно підтвердити Вашу поштову скриньку. mailer: confirmation_instructions: - subject: 'Mastodon: Інструкції для підтвердження' + subject: 'Mastodon: Інструкції для підтвердження %{instance}' password_change: subject: 'Mastodon: Ваш пароль змінений' reset_password_instructions: diff --git a/config/locales/devise.zh-HK.yml b/config/locales/devise.zh-HK.yml index 79e5a3d25..b7d88ef94 100644 --- a/config/locales/devise.zh-HK.yml +++ b/config/locales/devise.zh-HK.yml @@ -20,7 +20,7 @@ zh-HK: action: 驗證電子郵件地址 explanation: 你在 %{host} 上使用這個電子郵件地址建立了一個帳戶。只需點擊下面的連結,即可啟用帳戶。如果你並沒有建立過帳戶,請忽略此郵件。 extra_html: 請記得閱讀本服務站的<a href="%{terms_path}">相關規定</a>和<a href="%{policy_path}">使用條款</a>。 - subject: 'Mastodon: 確認電郵地址' + subject: 'Mastodon: 確認電郵地址 %{instance}' title: 驗證電子郵件地址 email_changed: explanation: 你的帳戶的電子郵件地址即將變更為: diff --git a/config/locales/devise.zh-TW.yml b/config/locales/devise.zh-TW.yml index 571429429..6dec562e1 100644 --- a/config/locales/devise.zh-TW.yml +++ b/config/locales/devise.zh-TW.yml @@ -20,7 +20,7 @@ zh-TW: action: 驗證 E-mail 地址 explanation: 您已經在 %{host} 上以此 E-mail 地址建立了一個帳號。您距離啟用它只剩一次點擊之遙了。如果這不是你,請忽略此 E-mail 。 extra_html: 同時也請看看<a href="%{terms_path}">該站點的規則</a>與<a href="%{policy_path}">我們的服務條款</a>。 - subject: 'Mastodon: 信箱驗證' + subject: 'Mastodon: 信箱驗證 %{instance}' title: 驗證 E-mail 地址 email_changed: explanation: 您帳號的 E-mail 地址被變更為: @@ -77,6 +77,4 @@ zh-TW: expired: 已經過期,請重新申請 not_found: 找不到 not_locked: 並未被鎖定 - not_saved: - one: 1 個錯誤使 %{resource} 無法被儲存︰ - other: "%{count} 個錯誤使 %{resource} 無法被儲存︰" + not_saved: "%{count} 個錯誤使 %{resource} 無法被儲存︰" diff --git a/config/locales/doorkeeper.ast.yml b/config/locales/doorkeeper.ast.yml index 0d161faf2..6e32cbc2f 100644 --- a/config/locales/doorkeeper.ast.yml +++ b/config/locales/doorkeeper.ast.yml @@ -1 +1,2 @@ +--- ast: {} diff --git a/config/locales/doorkeeper.cy.yml b/config/locales/doorkeeper.cy.yml index 050af3a0a..87d7a8660 100644 --- a/config/locales/doorkeeper.cy.yml +++ b/config/locales/doorkeeper.cy.yml @@ -5,7 +5,7 @@ cy: doorkeeper/application: name: Enw rhaglen redirect_uri: Ailgyfeirio URI - scopes: Cwmpasau + scopes: Rhinweddau website: Gwefan cais errors: models: @@ -27,18 +27,20 @@ cy: confirmations: destroy: Ydych chi'n sicr? edit: - title: Golygwch rhaglen + title: Golygwch y rhaglen form: error: Wps! Gwiriwch eich ffurflen am gamgymeriadau posib help: native_redirect_uri: Defnyddiwch %{native_redirect_uri} ar gyfer profion lleol redirect_uri: Defnyddiwch un llinell i bob URI + scopes: Gwahanwch rinweddau gyda gofodau. Gadewch yn wag i ddefnyddio y rhinweddau rhagosodiedig. index: application: Rhaglen + callback_url: URL galw-nôl delete: Dileu name: Enw new: Rhaglen newydd - scopes: Cwmpasau + scopes: Rhinweddau show: Dangoswch title: Eich rhaglenni new: @@ -46,7 +48,8 @@ cy: show: actions: Gweithredoedd application_id: Allwedd cleient - scopes: Cwmpasau + callback_urls: URLau galw-nôl + scopes: Rhinweddau secret: Cyfrinach Cleient title: 'Rhaglen: %{name}' authorizations: @@ -57,9 +60,10 @@ cy: title: Mae rhywbeth wedi mynd o'i le new: able_to: Mi fydd a'r gallu i + prompt: Mae'r ap %{client_name} yn gofyn caniatad i gal mynediad i'ch cyfrif title: Angen awdurdodi show: - title: Copiwch y côd awdurdodi a gludiwch i'r rhaglen + title: Copiwch y côd awdurdodi a gludiwch i'r rhaglen. authorized_applications: buttons: revoke: Diddymu @@ -68,19 +72,35 @@ cy: index: application: Rhaglen created_at: Awdurdodedig - scopes: Cwmpasau + date_format: "%Y-%m-%d %H:%M:%S" + scopes: Rhinweddau title: Eich rhaglenni awdurdodedig errors: messages: access_denied: Mae perchennog yr adnodd neu'r gweinydd awdurdodi wedi atal y cais. + credential_flow_not_configured: Llif meini prawf cyfrinair perchennog yr adnodd wedi methu achos fod Doorkeeper.configure.resource_owner_from_credentials heb ei ffurfweddu. + invalid_client: Methwyd dilysu cleient oherwydd cleient anhysbys, methiant i gynnwys dilysu cleient, neu defnydd o ddull dilysu nid yw'n cael ei gefnodi. + invalid_grant: Mae'r grant dilysu a ddarparwyd yn annilys, wedi dod i ben, wedi'i wrthod, ddim yn cyfateb a'r URI ailgyferio a ddefnyddiwyd yn y cais dilysu, neu wedi ei ddarparu i gleient arall. invalid_redirect_uri: Nid yw'r uri ailgyfeirio cynnwysiedig yn gyfredol. invalid_request: Nid yw'r cais yn cynnwys paramedr angenrheidiol, yn cynnwys paramader paramedr nad yw'n cael ei gefnogi, neu wedi ei gamffurfio mewn rhyw fodd arall. + invalid_resource_owner: Nid yw meini prawf perchennog yr adnodd yn ddilys, neu ni ellir canfod perchennog yr adnodd + invalid_scope: Mae'r sgôp a geisiwyd amdano yn annilys, anhysbys, neu'n gamffurfiedig. + invalid_token: + expired: Daeth y tocyn mynediad i ben + revoked: Gwrthodwyd y tocyn mynediad + unknown: Mae'r tocyn mynediad yn annilys + resource_owner_authenticator_not_configured: Methwyd canfod Perchenog Adnodd achos fod Doorkeeper.configure.resource_owner_authenticator heb ei gydffurfio. + server_error: Daeth y gweinydd awdurdodi ar draws gyflwr annisgwyl wnaeth ei atal rhag cyflawni'r cais. + temporarily_unavailable: Nid yw'r gweinydd awdurdodi yn gallu gweithredu y cais hwn ar hyn o bryd oherwydd gorlwytho dros dro neu gwaith cynnal a chadw ar y gweinydd hwn. + unauthorized_client: Nid yw'r cleient wedi ei awdurdodi i berfformio'r cais hwn yn defnyddio'r dull hwn. + unsupported_grant_type: Nid yw'r math o ganiatad awdurdodi yma'n cael ei gefnogi gan y gweinydd awdurdodi. + unsupported_response_type: Nid yw'r gweinydd awdurdodi yn cefnogi y math yma o ymateb. flash: applications: create: notice: Crewyd y rhaglen. destroy: - notice: Dilewyd y rhaglen. + notice: Dilëwyd y rhaglen. update: notice: Diweddarwyd y rhaglen. authorized_applications: @@ -94,24 +114,29 @@ cy: application: title: Mae awdurdodiad OAuth yn ofynnol scopes: - follow: addaswch berthnasau cyfrif - push: derbyniwch eich hysbysiadau PUSH - read: darllenwch holl ddata eich cyfrif - read:accounts: gwelwch wybodaeth y cyfrif - read:blocks: gwlewch eich blociau - read:favourites: gwelwch eich ffefrynnau - read:filters: gwelwch eich hidlwyr - read:follows: gwelwch eich dilynwyr - read:lists: gwelwch eich rhestrau - read:notifications: gwelwch eich hysbysiadau - read:reports: gwelwch eich adroddiadau - read:statuses: gwelwch pob statws - write: addaswch ddata eich cyfri - write:accounts: addaswch eich proffil - write:blocks: blociwch gyfrifon a parthau - write:filters: crewch hidlwyr - write:follows: dilynwch bobl - write:lists: crëwch restrau - write:media: uwchlwythwch ffeiliau cyfryngau - write:mutes: tawelwch bobl a sgyrsiau - write:notifications: cliriwch eich hysbysiadau + follow: addasu perthnasau cyfrif + push: derbyn eich hysbysiadau PUSH + read: darllen holl ddata eich cyfrif + read:accounts: gweld gwybodaeth y cyfrif + read:blocks: gweld eich blociau + read:favourites: gweld eich ffefrynnau + read:filters: gweld eich hidlwyr + read:follows: gweld eich dilynwyr + read:lists: gweld eich rhestrau + read:mutes: gweld y rheini wedi'i tewi + read:notifications: gweld eich hysbysiadau + read:reports: gweld eich adroddiadau + read:search: edrych ar eich rhan + read:statuses: gweld pob statws + write: addasu holl ddata eich cyfri + write:accounts: addasu eich proffil + write:blocks: blocio cyfrifon a parthau + write:favourites: hoff dŵtiau + write:filters: creu hidlwyr + write:follows: dilyn pobl + write:lists: creu rhestrau + write:media: uwchlwytho ffeiliau cyfryngau + write:mutes: tawelu pobl a sgyrsiau + write:notifications: clirio eich hysbysiadau + write:reports: adrodd pobl eraill + write:statuses: cyhoeddi tŵt diff --git a/config/locales/el.yml b/config/locales/el.yml index fc14d62cd..8f718a849 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -48,6 +48,7 @@ el: other: Ακόλουθοι following: Ακολουθεί joined: Εγγράφηκε στις %{date} + link_verified_on: Η κυριότητα αυτού του συνδέσμου ελέγχθηκε στις %{date} media: Πολυμέσα moved_html: 'Ο/Η %{name} μετακόμισε στο %{new_profile_link}:' network_hidden: Αυτή η πληροφορία δεν είναι διαθέσιμη @@ -120,6 +121,7 @@ el: moderation_notes: Σημειώσεις μεσολάβησης most_recent_activity: Πιο πρόσφατη δραστηριότητα most_recent_ip: Πιο πρόσφατη IP + no_limits_imposed: Χωρίς όρια not_subscribed: Άνευ συνδρομής order: alphabetic: Αλφαβητικά @@ -155,8 +157,10 @@ el: report: καταγγελία targeted_reports: Αναφορές για αυτόν το λογαριασμό silence: Αποσιώπησε + silenced: Αποσιωπημένοι statuses: Καταστάσεις subscribe: Εγγραφή + suspended: Σε αναστολή title: Λογαριασμοί unconfirmed_email: Ανεπιβεβαίωτο email undo_silenced: Αναίρεση αποσιώπησης @@ -173,6 +177,7 @@ el: create_domain_block: Ο/Η %{name} μπλόκαρε τον τομέα %{target} create_email_domain_block: Ο/Η %{name} έβαλε τον τομέα email %{target} σε μαύρη λίστα demote_user: Ο/Η %{name} υποβίβασε το χρήστη %{target} + destroy_custom_emoji: Ο/Η %{name} κατέστρεψε το emoji %{target} destroy_domain_block: Ο/Η %{name} ξεμπλόκαρε τον τομέα %{target} destroy_email_domain_block: Ο/Η %{name} έβαλε τον τομέα email %{target} σε λευκή λίστα destroy_status: Ο/Η %{name} αφαίρεσε την κατάσταση του/της %{target} @@ -258,6 +263,8 @@ el: title: Αποκλεισμός νέου τομέα reject_media: Απόρριψη πολυμέσων reject_media_hint: Αφαιρεί τα τοπικά αποθηκευμένα αρχεία πολυμέσων και αποτρέπει τη λήψη άλλων στο μέλλον. Δεν έχει σημασία για τις αναστολές + reject_reports: Απόρριψη καταγγελιών + reject_reports_hint: Αγνόηση όσων καταγγελιών προέρχονται από αυτό τον τομέα. Δεν σχετίζεται με τις παύσεις severities: noop: Κανένα silence: Αποσιώπηση @@ -300,8 +307,13 @@ el: title: Προσκλήσεις relays: add_new: Πρόσθεσε νέο ανταποκριτή (relay) + delete: Διαγραφή description_html: Ο <strong>ομοσπονδιακός ανταποκριτής</strong> είναι ένας ενδιάμεσος εξυπηρετητής (server) που ανταλλάσσει μεγάλους όγκους δημόσιων τουτ μεταξύ εξυπηρετητών που εγγράφονται και δημοσιεύουν σε αυτόν. <strong>Βοηθάει μικρούς και μεσαίους εξυπηρετητές να ανακαλύψουν περιεχόμενο στο fediverse</strong>, που υπό άλλες συνθήκες θα χρειαζόταν κάποιους τοπικούς χρήστες που να ακολουθούν χρήστες σε απομακρυσμένους εξυπηρετητές. + disable: Απενεργοποίηση + disabled: Απενεργοποιημένο + enable: Ενεργοποίηση enable_hint: Μόλις ενεργοποιηθεί, ο εξυπηρετητής (server) σου θα εγγραφεί σε όλα τα δημόσια τουτ αυτού του ανταποκριτή (relay) και θα αρχίσει να προωθεί τα δικά του δημόσια τουτ σε αυτόν. + enabled: Ενεργοποιημένο inbox_url: URL ανταποκριτή pending: Περιμένοντας την έγκριση του ανταποκριτή save_and_enable: Αποθήκευση και ενεργοποίηση @@ -336,9 +348,7 @@ el: reported_by: Αναφέρθηκε από resolved: Επιλύθηκε resolved_msg: Η καταγγελία επιλύθηκε επιτυχώς! - silence_account: Αποσιώπηση λογαριασμού status: Κατάσταση - suspend_account: Ανέστειλε λογαριασμό title: Αναφορές unassign: Αποσύνδεση unresolved: Άλυτη @@ -359,6 +369,9 @@ el: hero: desc_html: Εμφανίζεται στην μπροστινή σελίδα. Συνίσταται τουλάχιστον 600x100px. Όταν λείπει, χρησιμοποιείται η μικρογραφία του κόμβου title: Εικόνα ήρωα + mascot: + desc_html: Εμφάνιση σε πολλαπλές σελίδες. Προτεινόμενο 293x205px τουλάχιστον. Αν δεν έχει οριστεί, χρησιμοποιεί την προεπιλεγμένη μασκότ + title: Εικόνα μασκότ peers_api_enabled: desc_html: Ονόματα τομέων που αυτός ο κόμβος έχει ήδη συναντήσει στο fediverse title: Δημοσίευση λίστας κόμβων που έχουν ανακαλυφθεί @@ -567,6 +580,7 @@ el: resources: Πόροι generic: changes_saved_msg: Οι αλλαγές αποθηκεύτηκαν! + copy: Αντιγραφή save_changes: Αποθήκευσε τις αλλαγές validation_errors: one: Κάτι δεν είναι εντάξει ακόμα! Για κοίταξε το παρακάτω σφάλμα @@ -907,8 +921,12 @@ el: tips: Συμβουλές title: Καλώς όρισες, %{name}! users: + follow_limit_reached: Δεν μπορείς να ακολουθήσεις περισσότερα από %{limit} άτομα invalid_email: Η διεύθυνση email είναι άκυρη invalid_otp_token: Άκυρος κωδικός πιστοποίησης 2 παραγόντων (2FA) otp_lost_help_html: Αν χάσεις και τα δύο, μπορείς να επικοινωνήσεις με τον/την %{email} seamless_external_login: Επειδή έχεις συνδεθεί μέσω τρίτης υπηρεσίας, οι ρυθμίσεις συνθηματικού και email δεν είναι διαθέσιμες. signed_in_as: 'Έχεις συνδεθεί ως:' + verification: + explanation_html: 'Μπορείς να <strong>πιστοποιήσεις τον εαυτό σου ως ιδιοκτήτη των συνδέσμων που εμφανίζεις στα μεταδεδομένα του προφίλ σου</strong>. Για να συμβεί αυτό, ο συνδεδεμένος ιστότοπος πρέπει να περιέχει ένα σύνδεσμο που να επιστρέφει προς το προφίλ σου στο Mastodon. Ο σύνδεσμος επιστροφής <strong>πρέπει</strong> περιέχει την ιδιότητα (attribute) <code>rel="me"</code>. Το κείμενο κειμένου δεν έχει σημασία. Για παράδειγμα:' + verification: Πιστοποίηση diff --git a/config/locales/en.yml b/config/locales/en.yml index 6172af1b8..2c679061e 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -128,7 +128,7 @@ en: most_recent: Most recent title: Order outbox_url: Outbox URL - perform_full_suspension: Perform full suspension + perform_full_suspension: Suspend profile_url: Profile URL promote: Promote protocol: Protocol @@ -177,6 +177,7 @@ en: create_domain_block: "%{name} blocked domain %{target}" create_email_domain_block: "%{name} blacklisted e-mail domain %{target}" demote_user: "%{name} demoted user %{target}" + destroy_custom_emoji: "%{name} destroyed emoji %{target}" destroy_domain_block: "%{name} unblocked domain %{target}" destroy_email_domain_block: "%{name} whitelisted e-mail domain %{target}" destroy_status: "%{name} removed status by %{target}" @@ -262,6 +263,8 @@ en: title: New domain block reject_media: Reject media files reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions + reject_reports: Reject reports + reject_reports_hint: Ignore all reports coming from this domain. Irrelevant for suspensions severities: noop: None silence: Silence @@ -345,9 +348,7 @@ en: reported_by: Reported by resolved: Resolved resolved_msg: Report successfully resolved! - silence_account: Silence account status: Status - suspend_account: Suspend account title: Reports unassign: Unassign unresolved: Unresolved @@ -369,7 +370,7 @@ en: desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to instance thumbnail title: Hero image mascot: - desc_html: Displayed on multiple pages. At least 293×205px recommended. When not set, falls back to instance thumbnail + desc_html: Displayed on multiple pages. At least 293×205px recommended. When not set, falls back to default mascot title: Mascot image peers_api_enabled: desc_html: Domain names this instance has encountered in the fediverse diff --git a/config/locales/en_GB.yml b/config/locales/en_GB.yml index 0967ef424..d9e1a256f 100644 --- a/config/locales/en_GB.yml +++ b/config/locales/en_GB.yml @@ -1 +1,2 @@ +--- {} diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 454eeae9d..72628a944 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -325,9 +325,7 @@ eo: reported_by: Signalita de resolved: Solvita resolved_msg: Signalo sukcese solvita! - silence_account: Kaŝi konton status: Mesaĝoj - suspend_account: Haltigi konton title: Signaloj unassign: Malasigni unresolved: Nesolvita diff --git a/config/locales/es.yml b/config/locales/es.yml index 3b9e93947..b11ff8761 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -48,6 +48,7 @@ es: other: Seguidores following: Siguiendo joined: Se unió el %{date} + link_verified_on: La propiedad de este vínculo fue verificada el %{date} media: Media moved_html: "%{name} se ha trasladado a %{new_profile_link}:" network_hidden: Esta información no está disponible @@ -120,13 +121,14 @@ es: moderation_notes: Notas de moderación most_recent_activity: Actividad más reciente most_recent_ip: IP más reciente + no_limits_imposed: Sin límites impuestos not_subscribed: No se está suscrito order: alphabetic: Alfabético most_recent: Más reciente title: Orden outbox_url: URL de bandeja de salida - perform_full_suspension: Performar suspensión completa + perform_full_suspension: Suspender profile_url: URL del perfil promote: Promocionar protocol: Protocolo @@ -155,8 +157,10 @@ es: report: reportar targeted_reports: Reportes hechos sobre esta cuenta silence: Silenciar + silenced: Silenciado statuses: Estados subscribe: Suscribir + suspended: Susependido title: Cuentas unconfirmed_email: Correo electrónico sin confirmar undo_silenced: Des-silenciar @@ -173,6 +177,7 @@ es: create_domain_block: "%{name} bloqueó el dominio %{target}" create_email_domain_block: "%{name} puso en lista negra el dominio de correos %{target}" demote_user: "%{name} degradó al usuario %{target}" + destroy_custom_emoji: "%{name} destruyó el emoji %{target}" destroy_domain_block: "%{name} desbloqueó el dominio %{target}" destroy_email_domain_block: "%{name} puso en lista blanca el dominio de correos %{target}" destroy_status: "%{name} eliminó el estado de %{target}" @@ -258,6 +263,8 @@ es: title: Nuevo bloque de dominio reject_media: Rechazar archivos multimedia reject_media_hint: Remueve localmente archivos multimedia almacenados para descargar cualquiera en el futuro. Irrelevante para suspensiones + reject_reports: Rechazar informes + reject_reports_hint: Ignore todos los reportes de este dominio. Irrelevante para suspensiones severities: noop: Ninguno silence: Silenciar @@ -300,8 +307,13 @@ es: title: Invitaciones relays: add_new: Añadir un nuevo relés + delete: Borrar description_html: Un <strong>relés de federation</strong> es un servidor intermedio que intercambia grandes volúmenes de toots públicos entre servidores que se suscriben y publican en él. <strong>Puede ayudar a servidores pequeños y medianos a descubir contenido del fediverso</strong>, que de otra manera requeriría que los usuarios locales siguiesen manialmente a personas de servidores remotos. + disable: Deshabilitar + disabled: Deshabilitado + enable: Hablitar enable_hint: Una vez conectado, tu servidor se suscribirá a todos los toots públicos de este relés, y comenzará a enviar los toots públicos de este servidor hacia él. + enabled: Habilitado inbox_url: URL del relés pending: Esperando la aprobación del relés save_and_enable: Guardar y conectar @@ -336,9 +348,7 @@ es: reported_by: Reportado por resolved: Resuelto resolved_msg: "¡La denuncia se ha resuelto correctamente!" - silence_account: Silenciar cuenta status: Estado - suspend_account: Suspender cuenta title: Reportes unassign: Desasignar unresolved: No resuelto @@ -359,6 +369,9 @@ es: hero: desc_html: Mostrado en la página principal. Recomendable al menos 600x100px. Por defecto se establece a la miniatura de la instancia title: Imagen de portada + mascot: + desc_html: Mostrado en múltiples páginas. Se recomienda un tamaño mínimo de 293x205px. Cuando no se especifica, se muestra la mascota por defecto + title: Imagen de la mascota peers_api_enabled: desc_html: Nombres de dominio que esta instancia ha encontrado en el fediverso title: Publicar lista de instancias descubiertas @@ -452,7 +465,7 @@ es: warning: Ten mucho cuidado con estos datos. ¡No los compartas con nadie! your_token: Tu token de acceso auth: - agreement_html: Al registrarte, acepta seguir <a href="%{rules_path}">las reglas de la instancia</a> y <a href="%{terms_path}">nuestros términos de servicio</a>. + agreement_html: Al hacer click en "Registrarse" acepta seguir <a href="%{rules_path}">las reglas de la instancia</a> y <a href="%{terms_path}">nuestros términos de servicio</a>. change_password: Contraseña confirm_email: Confirmar email delete_account: Borrar cuenta @@ -567,6 +580,7 @@ es: resources: Recursos generic: changes_saved_msg: "¡Cambios guardados con éxito!" + copy: Copiar save_changes: Guardar cambios validation_errors: one: "¡Algo no está bien! Por favor, revisa el error" @@ -823,8 +837,12 @@ es: tips: Tips title: Te damos la bienvenida a bordo, %{name}! users: + follow_limit_reached: No puedes seguir a más de %{limit} personas invalid_email: La dirección de correo es incorrecta invalid_otp_token: Código de dos factores incorrecto otp_lost_help_html: Si perdiste al acceso a ambos, puedes ponerte en contancto con %{email} seamless_external_login: Has iniciado sesión desde un servicio externo, así que los ajustes de contraseña y correo no están disponibles. signed_in_as: 'Sesión iniciada como:' + verification: + explanation_html: 'Puedes <strong> verificarte a ti mismo como el dueño de los links en los metadatos de tu perfil </strong>. Para eso, el sitio vinculado debe contener un vínculo a tu perfil de Mastodon. El vínculo en tu sitio <strong> debe </strong> tener un atributo <code> rel="me"</code>. El texto del vínculo no importa. Aquí un ejemplo:' + verification: Verificación diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 1a6558d9f..206b439b0 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -48,6 +48,7 @@ eu: other: jarraitzaile following: Jarraitzen joined: "%{date}(e)an elkartua" + link_verified_on: 'Esteka honen jabetzaren egiaztaketa data: %{date}' media: Multimedia moved_html: "%{name} hona lekualdatu da %{new_profile_link}:" network_hidden: Informazio hau ez dago eskuragarri @@ -120,13 +121,14 @@ eu: moderation_notes: Moderazio oharrak most_recent_activity: Azken jarduera most_recent_ip: Azken IP-a + no_limits_imposed: Ez da mugarik ezarri not_subscribed: Harpidetu gabe order: alphabetic: Alfabetikoa most_recent: Azkena title: Ordena outbox_url: Irteera ontziaren URL-a - perform_full_suspension: Aplikatu kanporatze osoa + perform_full_suspension: Kanporatu profile_url: Profilaren URL-a promote: Sustatu protocol: Protokoloa @@ -155,8 +157,10 @@ eu: report: salatu targeted_reports: Kontu honek egindako salaketak silence: Isilarazi + silenced: Isilarazita statuses: Mezuak subscribe: Harpidetu + suspended: Kanporatuta title: Kontuak unconfirmed_email: Baieztatu gabeko e-mail helbidea undo_silenced: Utzi isilarazteari @@ -173,6 +177,7 @@ eu: create_domain_block: "%{name}(e)k %{target} domeinua blokeatu du" create_email_domain_block: "%{name}(e)k %{target} e-mail helbideen domeinua zerrenda beltzean sartu du" demote_user: "%{name}(e)k %{target} mailaz jaitsi du" + destroy_custom_emoji: "%{name} erabiltzaileak %{target} emojia suntsitu du" destroy_domain_block: "%{name}(e)k %{target} domeinua desblokeatu du" destroy_email_domain_block: "%{name}(e)k %{target} e-mail helbideen domeinua zerrenda zurian sartu du" destroy_status: "%{name}(e)k %{target}(e)n egoera kendu du" @@ -258,6 +263,8 @@ eu: title: Domeinu blokeo berria reject_media: Ukatu multimedia fitxategiak reject_media_hint: Lokalki gordetako multimedia fitxategiak ezabatzen ditu eta etorkizunean fitxategi berriak deskargatzeari uko egingo dio. Ez du garrantzirik kanporaketetan + reject_reports: Errefusatu salaketak + reject_reports_hint: Ezikusi domeinu honetatik jasotako salaketak. Kanporatzeentzako garrantzirik gabekoa severities: noop: Bat ere ez silence: Isilarazi @@ -300,8 +307,13 @@ eu: title: Gonbidapenak relays: add_new: Gehitu hari berria + delete: Ezabatu description_html: "<strong>Federazio errele</strong> bat zerbitzari tartekari bat da, bertara harpidetutako eta bertan argitaratzen duten zerbitzarien artean toot publiko kopuru handiak banatzen ditu. <strong>Zerbitzari txiki eta ertainei Fedibertsoko edukia aurkitzen laguntzen die</strong>, bestela erabiltzaile lokalek eskuz jarraitu beharko lituzkete urruneko zerbitzarietako erabiltzaileak." + disable: Desgaitu + disabled: Desgaituta + enable: Gaitu enable_hint: Behin gaituta, zure zerbitzaria errele honetako toot publiko guztietara harpidetuko da, eta zerbitzari honetako toot publikoak errelera bidaltzen hasiko da. + enabled: Gaituta inbox_url: Errelearen URLa pending: Erreleak onartzearen zain save_and_enable: Gorde eta gaitu @@ -336,9 +348,7 @@ eu: reported_by: Salatzailea resolved: Konponduta resolved_msg: Salaketa ongi konpondu da! - silence_account: Isilarazi kontua status: Mezua - suspend_account: Kanporatu kontua title: Salaketak unassign: Kendu esleipena unresolved: Konpondu gabea @@ -359,6 +369,9 @@ eu: hero: desc_html: Azaleko orrian bistaratua. Gutxienez 600x100px aholkatzen da. Ezartzen ez bada, instantziaren irudia hartuko du title: Azaleko irudia + mascot: + desc_html: Hainbat orritan bistaratua. Gutxienez 293x205px aholkatzen da. Ezarri ezean lehenetsitako maskota erakutsiko da + title: Maskotaren irudia peers_api_enabled: desc_html: Instantzia honek fedibertsuan aurkitutako domeinu-izenak title: Argitaratu aurkitutako instantzien zerrenda @@ -452,7 +465,7 @@ eu: warning: Kontuz datu hauekin, ez partekatu inoiz inorekin! your_token: Zure sarbide token-a auth: - agreement_html: Izena emanez<a href="%{rules_path}">instantziaren arauak</a> eta <a href="%{terms_path}">erabilera baldintzak</a> onartzen dituzu. + agreement_html: '"Izena eman" botoia sakatzean <a href="%{rules_path}">instantziaren arauak</a> eta <a href="%{terms_path}">erabilera baldintzak</a> onartzen dituzu.' change_password: Pasahitza confirm_email: Berretsi e-mail helbidea delete_account: Ezabatu kontua @@ -567,6 +580,7 @@ eu: resources: Baliabideak generic: changes_saved_msg: Aldaketak ongi gorde dira! + copy: Kopiatu save_changes: Gorde aldaketak validation_errors: one: Zerbait ez dabil ongi! Egiaztatu beheko errorea mesedez @@ -908,8 +922,12 @@ eu: tips: Aholkuak title: Ongi etorri, %{name}! users: + follow_limit_reached: Ezin dituzu %{limit} pertsona baino gehiago jarraitu invalid_email: E-mail helbidea baliogabea da invalid_otp_token: Bi faktoreetako kode baliogabea otp_lost_help_html: 'Bietara sarbidea galdu baduzu, jarri kontaktuan hemen: %{email}' seamless_external_login: Kanpo zerbitzu baten bidez hasi duzu saioa, beraz pasahitza eta e-mail ezarpenak ez daude eskuragarri. signed_in_as: 'Saioa honela hasita:' + verification: + explanation_html: 'Ezin duzu <strong>zure burua zure profileko metadatuen esteken jabe gisa egiaztatu</strong>. Horretarako, estekatutako webgunean zure Mastodon profilera daraman esteka bat egon behar du. Mastodonera daraman esteka horrek<strong>derrigorrez</strong> <code>rel="me"</code> artibutua izan behar du . Estekaren testuak ez du axola. Hona adibide bat:' + verification: Egiaztaketa diff --git a/config/locales/fa.yml b/config/locales/fa.yml index d620dcf4b..4209a2c00 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -31,9 +31,9 @@ fa: privacy_policy: سیاست رازداری source_code: کدهای منبع status_count_after: - one: نوشته - other: نوشته - status_count_before: که جمعاً + one: چیز نوشتهاند + other: چیز نوشتهاند + status_count_before: که در کنار هم terms: شرایط کاربری user_count_after: one: کاربر @@ -48,6 +48,7 @@ fa: other: پیگیر following: پی میگیرد joined: کاربر از %{date} + link_verified_on: مالکیت این نشانی در تاریخ %{date} بررسی شد media: عکس و ویدیو moved_html: "%{name} حساب خود را به %{new_profile_link} منتقل کرده است:" network_hidden: این اطلاعات در دسترس نیست @@ -120,13 +121,14 @@ fa: moderation_notes: یادداشت مدیر most_recent_activity: آخرین فعالیتها most_recent_ip: آخرین IP ها + no_limits_imposed: بدون محدودیت not_subscribed: عضو نیست order: alphabetic: الفبایی most_recent: تازهترینها title: ترتیب outbox_url: نشانی صندوق خروجی - perform_full_suspension: انجام تعلیق کامل + perform_full_suspension: تعلیق profile_url: نشانی نمایه promote: ترفیعدادن protocol: پروتکل @@ -155,8 +157,10 @@ fa: report: گزارش targeted_reports: گزارشها دربارهٔ این حساب silence: بیصدا + silenced: بیصداشده statuses: نوشتهها subscribe: اشتراک + suspended: تعلیقشده title: حسابها unconfirmed_email: ایمیل تأییدنشده undo_silenced: واگردانی بیصداکردن @@ -173,6 +177,7 @@ fa: create_domain_block: "%{name} دامین %{target} را مسدود کرد" create_email_domain_block: "%{name} دامین ایمیل %{target} را مسدود کرد" demote_user: "%{name} مقام کاربر %{target} را تنزل داد" + destroy_custom_emoji: "%{name} شکلک %{target} را حذف کرد" destroy_domain_block: "%{name} دامین %{target} را باز کرد" destroy_email_domain_block: "%{name} دامین ایمیل %{target} را باز کرد" destroy_status: "%{name} نوشتهای از %{target} را پاک کرد" @@ -258,6 +263,8 @@ fa: title: مسدودسازی دامین دیگر reject_media: نپذیرفتن پروندههای تصویری reject_media_hint: تصویرهای ذخیرهشده در اینجا را پاک میکند و جلوی دریافت تصویرها را در آینده میگیرد. بیتأثیر برای معلقشدهها + reject_reports: نپذیرفتن گزارشها + reject_reports_hint: گزارشهایی را که از این دامین میآید نادیده میگیرد. بیتأثیر برای معلقشدهها severities: noop: هیچ silence: بیصداکردن @@ -300,8 +307,13 @@ fa: title: دعوتها relays: add_new: افزودن رلهٔ تازه + delete: حذف description_html: یک <strong>رلهٔ میانسروری</strong> (federation relay) یک سرور میانجی است که حجم زیادی از بوقهای عمومی را بین سرورهای گوناگونی که عضوش میشوند جابهجا میکند. <strong>رلهها به سرورهای کوچک و متوسط کمک میکنند تا مطالب عمومی بیشتری را بیابند.</strong> اگر رله نباشد، این مطالب عمومی تنها وقتی پیدا میشوند که کاربران محلی خودشان پیگیر کاربران روی سرورهای دیگر شوند. + disable: غیرفعالکردن + disabled: غیرفعال + enable: فعالسازی enable_hint: اگر فعال باشد، سرور شما عضو همهٔ بوقهای عمومیای را که از این رله میآید میگیرد، و بوقهای عمومی این سرور را به آن میفرستند. + enabled: فعال inbox_url: نشانی رله pending: در انتظار پذیرش رله save_and_enable: ذخیره و فعالسازی @@ -336,9 +348,7 @@ fa: reported_by: گزارش از طرف resolved: حلشده resolved_msg: گزارش با موفقیت حل شد! - silence_account: بیصدا کردن حساب status: نوشته - suspend_account: معلقکردن حساب title: گزارشها unassign: پسگرفتن مسئولیت unresolved: حلنشده @@ -359,6 +369,9 @@ fa: hero: desc_html: در صفحهٔ آغازین نمایش مییابد. دستکم ۶۰۰×۱۰۰ پیکسل توصیه میشود. اگر تعیین نشود، با تصویر بندانگشتی سرور جایگزین خواهد شد title: تصویر سربرگ + mascot: + desc_html: در صفحههای گوناگونی نمایش مییابد. دستکم ۲۹۳×۲۰۵ پیکسل. اگر تعیین نشود، با تصویر پیشفرض جایگزین خواهد شد + title: تصویر نماد peers_api_enabled: desc_html: دامینهایی که این سرور به آنها برخورده است title: انتشار فهرست سرورهای یافتهشده @@ -452,7 +465,7 @@ fa: warning: خیلی مواظب این اطلاعات باشید و آن را به هیچ کس ندهید! your_token: کد دسترسی شما auth: - agreement_html: پیش از عضو شدن باید <a href="%{rules_path}">قوانین این سرور</a> و <a href="%{terms_path}">شرایط استفادهٔ</a> ما را بپذیرید. + agreement_html: با کلیک روی دکمهٔ عضو شدن، شما <a href="%{rules_path}">قوانین این سرور</a> و <a href="%{terms_path}">شرایط استفادهٔ</a> ما را میپذیرید. change_password: رمز confirm_email: تأیید ایمیل delete_account: پاککردن حساب @@ -567,6 +580,7 @@ fa: resources: منابع generic: changes_saved_msg: تغییرات با موفقیت ذخیره شدند! + copy: رونوشت save_changes: ذخیرهٔ تغییرات validation_errors: one: یک چیزی هنوز درست نیست! لطفاً خطاهای زیر را ببینید @@ -827,8 +841,12 @@ fa: tips: نکتهها title: خوش آمدید، کاربر %{name}! users: + follow_limit_reached: شما نمیتوانید بیش از %{limit} نفر را پی بگیرید invalid_email: نشانی ایمیل نامعتبر است invalid_otp_token: کد ورود دومرحلهای نامعتبر است otp_lost_help_html: اگر شما دسترسی به هیچکدامشان ندارید، باید با ایمیل %{email} تماس بگیرید seamless_external_login: شما با یک سرویس خارج از مجموعه وارد شدهاید، به همین دلیل تنظیمات ایمیل و رمز برای شما در دسترس نیست. signed_in_as: 'واردشده به نام:' + verification: + explanation_html: 'شما میتوانید <strong>خود را به عنوان مالک صفحهای که در نمایهتان به آن پیوند دادهاید تأیید کنید.</strong> برای این کار، صفحهای که به آن پیوند دادهاید، خودش باید پیوندی به نمایهٔ ماستدون شما داشته باشد. پیوند در آن صفحه <strong>باید</strong> عبارت <code>rel="me"</code> را به عنوان attribute در خود داشته باشد. محتوای متن پیوند اهمتی ندارد. یک نمونه از چنین پیوندی:' + verification: تأیید diff --git a/config/locales/fi.yml b/config/locales/fi.yml index c2552b539..c90490212 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -282,9 +282,7 @@ fi: reported_by: Raportoija resolved: Ratkaistut resolved_msg: Raportti onnistuneesti ratkaistu! - silence_account: Hiljennä tili status: Tila - suspend_account: Siirrä tili jäähylle title: Raportit unresolved: Ratkaisemattomat updated_at: Päivitetty @@ -609,7 +607,7 @@ fi: uc_browser: UCBrowser weibo: Weibo current_session: Nykyinen istunto - description: "%{selain}, %{platform}" + description: "%{browser}, %{platform}" explanation: Nämä verkkoselaimet ovat tällä hetkellä kirjautuneet Mastodon-tilillesi. ip: IP platforms: @@ -709,7 +707,7 @@ fi: edit_profile_step: Voit mukauttaa profiiliasi lataamalla profiilikuvan ja otsakekuvan, muuttamalla näyttönimeäsi ym. Jos haluat hyväksyä uudet seuraajat ennen kuin he voivat seurata sinua, voit lukita tilisi. explanation: Näillä vinkeillä pääset alkuun final_action: Ala julkaista - final_step: 'Ala julkaista! Vaikkei sinulla olisi seuraajia, monet voivat nähdä julkiset viestisi esimerkiksi paikallisella aikajanalla ja hashtagien avulla. Kannattaa esittäytyä! Käytä hashtagia #introductions. (Jos haluat esittäytyä myös suomeksi, se kannattaa tehdä erillisessä tuuttauksessa ja käyttää hashtagia #esittely.)' + final_step: 'Ala julkaista! Vaikkei sinulla olisi seuraajia, monet voivat nähdä julkiset viestisi esimerkiksi paikallisella aikajanalla ja hashtagien avulla. Kannattaa esittäytyä! Käytä hashtagia #introductions. (Jos haluat esittäytyä myös suomeksi, se kannattaa tehdä erillisessä tuuttauksessa ja käyttää hashtagia #esittely.).' full_handle: Koko käyttäjätunnuksesi full_handle_hint: Kerro tämä ystävillesi, niin he voivat lähettää sinulle viestejä tai löytää sinut toisen instanssin kautta. review_preferences_action: Muuta asetuksia diff --git a/config/locales/fr.yml b/config/locales/fr.yml index ba3c90195..e3128b569 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -48,6 +48,7 @@ fr: other: Abonné⋅e⋅s following: Abonnements joined: Inscrit·e en %{date} + link_verified_on: La propriété de ce lien a été vérifiée le %{date} media: Médias moved_html: "%{name} a changé de compte pour %{new_profile_link} :" network_hidden: Cette information n’est pas disponible @@ -120,13 +121,14 @@ fr: moderation_notes: Notes de modération most_recent_activity: Dernière activité most_recent_ip: Adresse IP la plus récente + no_limits_imposed: Aucune limite imposée not_subscribed: Non abonné order: alphabetic: Alphabétique most_recent: Plus récent title: Tri outbox_url: URL de sortie - perform_full_suspension: Effectuer une suspension complète + perform_full_suspension: Suspendre profile_url: URL du profil promote: Promouvoir protocol: Protocole @@ -155,8 +157,10 @@ fr: report: signalement targeted_reports: Signalements créés visant ce compte silence: Masquer + silenced: Silencié statuses: Statuts subscribe: S’abonner + suspended: Suspendu title: Comptes unconfirmed_email: Courriel non-confirmé undo_silenced: Démasquer @@ -173,6 +177,7 @@ fr: create_domain_block: "%{name} a bloqué le domaine %{target}" create_email_domain_block: "%{name} a mis le domaine du courriel %{target} sur liste noire" demote_user: "%{name} a rétrogradé l’utilisateur·ice %{target}" + destroy_custom_emoji: "%{name} a détruit l'émoticône %{target}" destroy_domain_block: "%{name} a débloqué le domaine %{target}" destroy_email_domain_block: "%{name} a mis le domaine du courriel %{target} sur liste blanche" destroy_status: "%{name} a enlevé le statut de %{target}" @@ -258,6 +263,8 @@ fr: title: Nouveau blocage de domaine reject_media: Fichiers média rejetés reject_media_hint: Supprime localement les fichiers média stockés et refuse d’en télécharger ultérieurement. Ne concerne pas les suspensions + reject_reports: Rapports de rejet + reject_reports_hint: Ignorez tous les rapports provenant de ce domaine. Sans objet pour les suspensions severities: noop: Aucune silence: Masquer @@ -300,8 +307,13 @@ fr: title: Invitations relays: add_new: Ajouter un nouveau relais + delete: Effacer description_html: Un <strong>relai de fédération</strong> est un serveur intermédiaire qui échange de grandes quantités de pouets entre les serveurs qui publient dessus et ceux qui y sont abonnés. <strong>Il peut aider les petites et moyennes instances à découvrir du contenu sur le fediverse</strong>, ce qui normalement nécessiterait que les membres locaux suivent des gens inscrits sur des serveurs distants. + disable: Désactiver + disabled: Désactivé + enable: Activé enable_hint: Une fois activé, votre serveur souscrira à tous les pouets publics présents sur ce relais et y enverra ses propres pouets publics. + enabled: Activé inbox_url: URL de relais pending: En attente de l'approbation du relai save_and_enable: Sauvegarder et activer @@ -336,9 +348,7 @@ fr: reported_by: Signalé par resolved: Résolus resolved_msg: Signalement résolu avec succès ! - silence_account: Masquer le compte status: Statut - suspend_account: Suspendre le compte title: Signalements unassign: Dés-assigner unresolved: Non résolus @@ -359,6 +369,9 @@ fr: hero: desc_html: Affichée sur la page d’accueil. Au moins 600x100px recommandé. Lorsqu’elle n’est pas définie, se rabat sur la vignette de l’instance title: Image d’en-tête + mascot: + desc_html: Affiché sur plusieurs pages. Au moins 293×205px recommandé. Lorsqu'il n'est pas défini, retombe à la mascotte par défaut + title: Image de la mascotte peers_api_enabled: desc_html: Noms des domaines que cette instance a découvert dans le fediverse title: Publier la liste des instances découvertes @@ -452,7 +465,7 @@ fr: warning: Soyez prudent⋅e avec ces données. Ne les partagez pas ! your_token: Votre jeton d’accès auth: - agreement_html: En vous inscrivant, vous souscrivez <a href="%{rules_path}">aux règles de l’instance</a> et à <a href="%{terms_path}">nos conditions d’utilisation</a>. + agreement_html: En cliquant sur "S'inscrire" ci-dessous, vous souscrivez <a href="%{rules_path}">aux règles de l’instance</a> et à <a href="%{terms_path}">nos conditions d’utilisation</a>. change_password: Mot de passe confirm_email: Confirmer mon adresse mail delete_account: Supprimer le compte @@ -567,6 +580,7 @@ fr: resources: Ressources generic: changes_saved_msg: Les modifications ont été enregistrées avec succès ! + copy: Copier save_changes: Enregistrer les modifications validation_errors: one: Quelque chose ne va pas ! Vérifiez l’erreur ci-dessous @@ -619,7 +633,7 @@ fr: notification_mailer: digest: action: Voir toutes les notifications - body: 'Voici ce que vous avez raté sur ${instance} depuis votre dernière visite le %{since} :' + body: Voici un bref résumé des messages que vous auriez raté depuis votre dernière visite le %{since} mention: "%{name} vous a mentionné⋅e dans :" new_followers_summary: one: Vous avez un⋅e nouvel⋅le abonné⋅e ! Youpi ! @@ -908,8 +922,12 @@ fr: tips: Astuces title: Bienvenue à bord, %{name} ! users: + follow_limit_reached: Vous ne pouvez pas suivre plus de %{limit} personnes invalid_email: L’adresse courriel est invalide invalid_otp_token: Le code d’authentification à deux facteurs est invalide otp_lost_help_html: Si vous perdez accès aux deux, vous pouvez contacter %{email} seamless_external_login: Vous êtes connecté via un service externe, donc les paramètres concernant le mot de passe et le courriel ne sont pas disponibles. signed_in_as: 'Connecté·e en tant que :' + verification: + explanation_html: 'Vous pouvez <strong>vérifier vous-même que vous êtes le propriétaire des liens dans les métadonnées de votre profil</strong>. Pour cela, le site Web lié doit contenir un lien vers votre profil Mastodon. Le lien de retour <strong>doit</strong>avoir un attribut <code>rel="me"</code>. Le contenu textuel du lien n''a pas d''importance. En voici un exemple :' + verification: Vérification diff --git a/config/locales/gl.yml b/config/locales/gl.yml index ad7dbf502..9c5144d97 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -22,7 +22,7 @@ gl: not_a_product_title: Vostede é unha persoa, non un producto real_conversation_body: Con 500 caracteres a súa disposición, soporte para contido polo miúdo e avisos sobre o contido, pode expresarse vostede con libertade. real_conversation_title: Construído para conversacións reais - within_reach_body: Existen múltiples aplicativos para iOS, Android e outras plataformas grazas a un entorno API amigable para o desenvolvedor que lle permite estar ao tanto cos seus amigos en calquer lugar. + within_reach_body: Existen múltiples aplicacións para iOS, Android e outras plataformas grazas a un entorno API amigable para o desenvolvedor que lle permite estar ao tanto cos seus amigos en calquer lugar. within_reach_title: Sempre en contacto generic_description: "%{domain} é un servidor na rede" hosted_on: Mastodon aloxado en %{domain} @@ -48,6 +48,7 @@ gl: other: Seguidoras following: Seguindo joined: Uneuse %{date} + link_verified_on: A propiedade de esta ligazón foi comprobada en %{date} media: Medios moved_html: "%{name} mudouse a %{new_profile_link}:" network_hidden: A información non está dispoñible @@ -120,13 +121,14 @@ gl: moderation_notes: Notas de moderación most_recent_activity: Actividade máis recente most_recent_ip: IP máis recente + no_limits_imposed: Sen límites impostos not_subscribed: Non suscrita order: alphabetic: Alfabética most_recent: Máis recente title: Orde outbox_url: URL caixa de saída - perform_full_suspension: Suspender completamente + perform_full_suspension: Suspender profile_url: URL do perfil promote: Promocionar protocol: Protocolo @@ -155,8 +157,10 @@ gl: report: informar targeted_reports: Informes feitos sobre esta conta silence: Acalar + silenced: Acalada statuses: Estados subscribe: Subscribir + suspended: Suspendida title: Contas unconfirmed_email: Correo-e non confirmado undo_silenced: Desfacer acalar @@ -173,6 +177,7 @@ gl: create_domain_block: "%{name} bloqueou o dominio %{target}" create_email_domain_block: "%{name} engadeu a lista negra o dominio de correo %{target}" demote_user: "%{name} degradou a usuaria %{target}" + destroy_custom_emoji: "%{name} destruíu emoji %{target}" destroy_domain_block: "%{name} desbloqueou o dominio %{target}" destroy_email_domain_block: "%{name} meteu na lista blanca de correo o dominio %{target}" destroy_status: "%{name} eliminou o estado de %{target}" @@ -258,6 +263,8 @@ gl: title: Novo bloqueo de dominio reject_media: Rexeitar ficheiros de medios reject_media_hint: Eliminar ficheiros de medios almacenados localmente e rexeita descargalos no futuro. Irrelevante para as suspensións + reject_reports: Rexeitar informes + reject_reports_hint: Ignorar todos os informes procedentes de este dominio. Irrelevante para as suspensións severities: noop: Ningún silence: Silenciar @@ -300,8 +307,13 @@ gl: title: Convida relays: add_new: Engadir un novo repetidor + delete: Eliminar description_html: Un <strong>repetidor da federación</strong> é un servidor intermedio que intercambia grandes volumes de toots públicos entre servidores que se suscriban e publiquen nel. <strong>Pode axudar a servidores pequenos e medios a descubrir contido no fediverso</strong>, o que de outro xeito precisaría que as usuarias locais seguisen a outra xente en servidores remotos. + disable: Desactivar + disabled: Desactivada + enable: Activar enable_hint: Unha vez activado, o seu servidor suscribirase a todos os toots públicos de este servidor, e tamén comezará a eviar a el os toots públicos do servidor. + enabled: Activada inbox_url: URL do repetidor pending: Agardando polo permiso do repetidor save_and_enable: Gardar e activar @@ -336,9 +348,7 @@ gl: reported_by: Reportada por resolved: Resolto resolved_msg: Resolveuse con éxito o informe! - silence_account: Acalar conta status: Estado - suspend_account: Suspender conta title: Informes unassign: Non asignar unresolved: Non resolto @@ -359,6 +369,9 @@ gl: hero: desc_html: Mostrado na portada. Recoméndase 600x100px como mínimo. Si non se establece, mostrará a imaxe por omisión da instancia title: Imáxe Heróe + mascot: + desc_html: Mostrado en varias páxinas. Recoméndase 293x205 como mínimo. Se non se establece publícase a mascota por omisión + title: Imaxe da mascota peers_api_enabled: desc_html: Nome de dominio que esta instancia atopou no fediverso title: Publicar lista de instancias descubertas @@ -452,7 +465,7 @@ gl: warning: Teña moito tino con estos datos. Nunca os comparta con ninguén! your_token: O seu testemuño de acceso auth: - agreement_html: Rexistrándose acorda seguir <a href="%{rules_path}">as normas da instancia</a> e <a href="%{terms_path}">os termos do servizo</a>. + agreement_html: Ao pulsar "Rexistrar" vostede acorda seguir <a href="%{rules_path}">as normas da instancia</a> e <a href="%{terms_path}">os termos do servizo</a>. change_password: Contrasinal confirm_email: Confirmar correo-e delete_account: Eliminar conta @@ -463,7 +476,7 @@ gl: login: Conectar logout: Desconectar migrate_account: Mover a unha conta diferente - migrate_account_html: Si desexa redirixir esta conta hacia outra diferente, pode <a href="%{path}">configuralo aquí</a>. + migrate_account_html: Se desexa redirixir esta conta hacia outra diferente, pode <a href="%{path}">configuralo aquí</a>. or: ou or_log_in_with: ou conectar con providers: @@ -567,6 +580,7 @@ gl: resources: Recursos generic: changes_saved_msg: Cambios gardados correctamente!! + copy: Copiar save_changes: Gardar cambios validation_errors: one: Algo non está ben de todo! Por favor revise abaixo o erro @@ -727,7 +741,7 @@ gl: revoke_success: A sesión revocouse con éxito title: Sesións settings: - authorized_apps: Apps autorizados + authorized_apps: Apps autorizadas back: Voltar a Mastodon delete: Eliminación da conta development: Desenvolvemento @@ -740,7 +754,7 @@ gl: preferences: Preferencias settings: Axustes two_factor_authentication: Validar Doble Factor - your_apps: Os seus aplicativos + your_apps: As súas aplicacións statuses: attached: description: 'Axenado: %{attached}' @@ -907,8 +921,12 @@ gl: tips: Consellos title: Benvida, %{name}! users: + follow_limit_reached: Non pode seguir a máis de %{limit} persoas invalid_email: O enderezo de correo non é válido invalid_otp_token: Código de doble-factor non válido otp_lost_help_html: Si perde o acceso a ambos, pode contactar con %{email} seamless_external_login: Está conectado a través de un servizo externo, polo que os axustes de contrasinal e correo-e non están dispoñibles. signed_in_as: 'Rexistrada como:' + verification: + explanation_html: 'Pode <strong>validarse a vostede mesma como a dona das ligazóns nos metadatos do seu perfil</strong>. Para esto, o sitio web ligado debe conter unha ligazón de retorno ao perfil de Mastodon. Esta ligazón de retorno <strong>ten que</strong> ter un atributo <code>rel="me"</code>. O texto da ligazón non importa. Aquí ten un exemplo:' + verification: Validación diff --git a/config/locales/he.yml b/config/locales/he.yml index 3d24f22d2..79b1ed822 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -189,9 +189,7 @@ he: reported_account: חשבון מדווח reported_by: דווח על ידי resolved: פתור - silence_account: השתקת חשבון status: הודעה - suspend_account: השעיית חשבון title: דיווחים unresolved: לא פתור settings: @@ -299,7 +297,7 @@ he: too_many: לא ניתן להוסיף יותר מארבעה קבצים notification_mailer: digest: - body: 'להלן סיכום זריז של הדברים שקרו על %{instance} מאז ביקורך האחרון ב-%{since}:' + body: 'להלן סיכום זריז של הדברים שקרו על מאז ביקורך האחרון ב-%{since}:' mention: "%{name} פנה אליך ב:" new_followers_summary: one: נוסף לך עוקב! סחתיין! diff --git a/config/locales/hr.yml b/config/locales/hr.yml index a6e7649f2..729206a98 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -61,9 +61,7 @@ hr: generic: changes_saved_msg: Izmjene su uspješno sačuvane! save_changes: Sačuvaj izmjene - validation_errors: - one: Nešto ne štima! Vidi grešku ispod - other: Nešto još uvijek ne štima! Vidi %{count} greške ispod + validation_errors: Nešto još uvijek ne štima! Vidi %{count} greške ispod imports: preface: Možeš uvesti određene podatke kao što su svi ljudi koje slijediš ili blokiraš u svoj račun na ovoj instanci, sa fajlova kreiranih izvozom sa druge instance. success: Tvoji podaci su uspješno uploadani i bit će obrađeni u dogledno vrijeme @@ -74,14 +72,10 @@ hr: upload: Upload notification_mailer: digest: - body: 'Ovo je kratak sažetak propuštenog %{instance} od tvog prošlog posjeta %{since}:' + body: 'Ovo je kratak sažetak propuštenog od tvog prošlog posjeta %{since}:' mention: "%{name} te je spomenuo:" - new_followers_summary: - one: Imaš novog sljedbenika! Yay! - other: Imaš %{count} novih sljedbenika! Prekrašno! - subject: - one: "1 nova notifikacija od tvog prošlog posjeta \U0001F418" - other: "%{count} novih notifikacija od tvog prošlog posjeta \U0001F418" + new_followers_summary: Imaš %{count} novih sljedbenika! Prekrašno! + subject: "%{count} novih notifikacija od tvog prošlog posjeta \U0001F418" favourite: body: 'Tvoj status je %{name} označio kao omiljen:' subject: "%{name} je označio kao omiljen tvoj status" diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 0c4046785..faa52fabc 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -249,9 +249,7 @@ hu: reported_account: Bejelentett fiók reported_by: 'Jelentette:' resolved: Megoldott - silence_account: Felhasználó némítása status: Állapot - suspend_account: Felhasználó felfüggesztése title: Jelentések unresolved: Megoldatlan settings: @@ -422,7 +420,7 @@ hu: save_changes: Változások mentése validation_errors: one: Valami nincs rendjén! Kérlek tekintsd meg a hibát alant - other: Valami nincs rendjén! Kérlek tekintsd meg a %{count} darab hibát alant. + other: Valami nincs rendjén! Kérlek tekintsd meg a %{count} darab hibát alant imports: preface: Itt importálhatod egy másik instanciáról lementett adataidat, például követettjeid és letiltott felhasználóid listáját. success: Adataidat sikeresen feltöltöttük és feldolgozásukat megkezdtük diff --git a/config/locales/id.yml b/config/locales/id.yml index b186b7652..38b08a257 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -18,7 +18,9 @@ id: nothing_here: Tidak ada apapun disini! people_followed_by: Orang yang diikuti %{name} people_who_follow: Orang-orang yang mengikuti %{name} - posts: Postingan + posts: + one: Toot + other: Toots unfollow: Berhenti mengikuti admin: accounts: @@ -114,9 +116,7 @@ id: reported_account: Akun yang dilaporkan reported_by: Dilaporkan oleh resolved: Terseleseikan - silence_account: Akun yang didiamkan status: Status - suspend_account: Akun yang disuspen title: Laporan unresolved: Belum Terseleseikan settings: @@ -184,7 +184,7 @@ id: '410': Halaman yang anda cari sudah tidak dapat ditemukan lagi. '422': content: Verifikasi keamanan gagal. Apa anda memblokir cookie? - title: Verifikasi keamanan gagal. + title: Verifikasi keamanan gagal exports: blocks: Anda blokir csv: CSV @@ -206,9 +206,7 @@ id: generic: changes_saved_msg: Perubahan berhasil disimpan! save_changes: Simpan perubahan - validation_errors: - one: Ada yang tidak beres! Mohon tinjau error dibawah ini - other: Ada yang tidak beres! Mohon tinjau error dibawah ini + validation_errors: Ada yang tidak beres! Mohon tinjau error dibawah ini imports: preface: Anda bisa mengimpor data tertentu seperti orang-orang yang anda ikuti atau anda blokir di server ini, dari file yang dibuat oleh fitur expor di server lain. success: Data anda berhasil diupload dan akan diproses sesegera mungkin @@ -223,7 +221,7 @@ id: too_many: Tidak dapat melampirkan lebih dari 4 file notification_mailer: digest: - body: 'Ini adalah ringkasan singkat yang anda lewatkan pada %{instance} sejak kunjungan terakhir anda pada %{since}:' + body: 'Ini adalah ringkasan singkat yang anda lewatkan pada sejak kunjungan terakhir anda pada %{since}:' mention: "%{name} menyebut anda di:" new_followers_summary: one: Anda mendapatkan satu pengikut baru! Hore! diff --git a/config/locales/io.yml b/config/locales/io.yml index be8a87acd..0c1e6520b 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -107,9 +107,7 @@ io: reported_account: Reported account reported_by: Reported by resolved: Resolved - silence_account: Silence account status: Status - suspend_account: Suspend account title: Reports unresolved: Unresolved settings: @@ -187,11 +185,11 @@ io: changes_saved_msg: Chanji senprobleme konservita! save_changes: Konservar la chanji validation_errors: - one: Ulo ne eventis senprobleme! Voluntez konsultar la suba eror-raporto. - other: Ulo ne eventis senprobleme! Voluntez konsultar la suba %{count} eror-raporti. + one: Ulo ne eventis senprobleme! Voluntez konsultar la suba eror-raporto + other: Ulo ne eventis senprobleme! Voluntez konsultar la suba %{count} eror-raporti imports: preface: Tu povas importacar kelka datumi, tal quala listi de omna homi quin tu sequas o blokusas, a tua konto di ca instaluro, per dosiero exportacita de altra instaluro. - success: Tua datumi esis senprobleme importacita ed esos traktita quale projetita. + success: Tua datumi esis senprobleme importacita ed esos traktita quale projetita types: blocking: Listo de blokusiti following: Listo de sequati @@ -203,7 +201,7 @@ io: too_many: Cannot attach more than 4 files notification_mailer: digest: - body: 'Yen mikra rezumo di to, quo eventis en %{instance}, depos ke tu laste vizitis en %{since}:' + body: 'Yen mikra rezumo di to, depos ke tu laste vizitis en %{since}:' mention: "%{name} mencionis tu en:" new_followers_summary: one: Tu obtenis nova sequanto! Yey! diff --git a/config/locales/it.yml b/config/locales/it.yml index 5780f1e0c..4fffded5f 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -30,7 +30,9 @@ it: other_instances: Elenco istanze privacy_policy: Policy su la Privacy source_code: Codice sorgente - status_count_after: stati + status_count_after: + one: status + other: status status_count_before: Che hanno pubblicato terms: Termini di Servizio user_count_after: @@ -46,6 +48,7 @@ it: other: Seguaci following: Segui joined: Dal %{date} + link_verified_on: La proprietà di questo link è stata controllata il %{date} media: Media moved_html: "%{name} è stato spostato su %{new_profile_link}:" network_hidden: Questa informazione non e' disponibile @@ -118,13 +121,14 @@ it: moderation_notes: Note di moderazione most_recent_activity: Attività più recenti most_recent_ip: IP più recenti + no_limits_imposed: Nessun limite imposto not_subscribed: Non sottoscritto order: alphabetic: Alfabetico most_recent: Più recente title: Ordine outbox_url: URL outbox - perform_full_suspension: Esegui sospensione completa + perform_full_suspension: Sospendi profile_url: URL profilo promote: Promuovi protocol: Protocollo @@ -153,8 +157,10 @@ it: report: segnala targeted_reports: Rapporti che riguardano questo account silence: Silenzia + silenced: Silenziato statuses: Stati subscribe: Sottoscrivi + suspended: Sospeso title: Account unconfirmed_email: Email non confermata undo_silenced: Rimuovi silenzia @@ -171,6 +177,7 @@ it: create_domain_block: "%{name} ha bloccato il dominio %{target}" create_email_domain_block: "%{name} ha messo il dominio email %{target} nella blacklist" demote_user: "%{name} ha degradato l'utente %{target}" + destroy_custom_emoji: "%{name} ha distrutto l'emoji %{target}" destroy_domain_block: "%{name} ha sbloccato il dominio %{target}" destroy_email_domain_block: "%{name}ha messo il dominio email %{target} nella whitelist" destroy_status: "%{name} ha eliminato lo status di %{target}" @@ -249,12 +256,15 @@ it: create: Crea blocco hint: Il blocco dominio non previene la creazione di utenti nel database, ma applicherà automaticamente e retroattivamente metodi di moderazione specifici su quegli account. severity: + desc_html: "<strong>Silenzia</strong> rende i post di questo account invisibili a chiunque non lo stia seguendo. <strong>Sospendi</strong> elimina tutti i contenuti, media e dati del profilo dell'account. Usa <strong>Nessuno</strong> se vuoi solo bloccare i file media." noop: Nessuno silence: Silenzia suspend: Sospendi title: Nuovo blocco dominio reject_media: Rifiuta file media reject_media_hint: Rimuovi i file media salvati in locale e blocca i download futuri. Irrilevante per le sospensioni + reject_reports: Respingi rapporti + reject_reports_hint: Ignora tutti i rapporti provenienti da questo dominio. Irrilevante per sospensioni severities: noop: Nessuno silence: Silenzia @@ -279,6 +289,7 @@ it: domain: Dominio new: create: Aggiungi dominio + title: Nuova voce della lista nera delle email title: Lista nera email instances: account_count: Accounts conosciuti @@ -296,13 +307,22 @@ it: title: Inviti relays: add_new: Aggiungi ripetitore + delete: Cancella description_html: Un <strong>ripetitore di federazione</strong> è un server che fa da intermediario e scambia grandi quantità di toot pubblici tra server che si collegano e pubblicano su di esso. <strong>Può aiutare server piccoli e medi a ottenere contenuti dal fediverse</strong>, che altrimenti riceverebbero solo se i loro utenti locali seguissero altre persone su server remoti. + disable: Disabilita + disabled: Disabilitato + enable: Abilita enable_hint: Dopo l'attivazione, il vostro server riceverà tutti i toot pubblici da questo ripetitore, e inizierà a inviargli i suoi toot pubblici. + enabled: Abilitato inbox_url: Url Relay pending: In attesa dell'approvazione del ripetitore save_and_enable: Salva e attiva setup: Crea una connessione con un ripetitore + status: Status title: Ripetitori + report_notes: + created_msg: Nota rapporto creata! + destroyed_msg: Nota rapporto cancellata! reports: account: note: note @@ -313,6 +333,7 @@ it: assigned: Moderatore assegnato comment: none: Nessuno + created_at: Segnalato mark_as_resolved: Segna come risolto mark_as_unresolved: Segna come non risolto notes: @@ -320,13 +341,14 @@ it: create_and_resolve: Risolvi con nota create_and_unresolve: Riapri con nota delete: Elimina + placeholder: Descrivi quali azioni sono state intraprese, o ogni altro aggiornamento rilevante... reopen: Riapri rapporto report: 'Rapporto #%{id}' + reported_account: Account segnalato reported_by: Inviato da resolved: Risolto - silence_account: Silenzia account + resolved_msg: Rapporto risolto! status: Stato - suspend_account: Sospendi account title: Rapporti unassign: Non assegnare unresolved: Non risolto @@ -336,15 +358,25 @@ it: desc_html: Conteggi degli status pubblicati localmente, degli utenti attivi e delle nuove registrazioni in gruppi settimanali title: Pubblica statistiche aggregate circa l'attività dell'utente bootstrap_timeline_accounts: + desc_html: Separa i nomi utente con virgola. Funziona solo con account locali e non bloccati. Quando vuoto, valido per tutti gli amministratori locali. title: Seguiti predefiniti per i nuovi utenti contact_information: username: Nome utente del contatto custom_css: desc_html: Modifica l'aspetto con il CSS caricato in ogni pagina title: CSS personalizzato + hero: + desc_html: Mostrata nella pagina iniziale. Almeno 600x100 px consigliati. Se non impostata, sarà usato il thumbnail dell'istanza + title: Immagine dell'eroe + mascot: + desc_html: Mostrata su più pagine. Almeno 293×205px consigliati. Se non impostata, sarò usata la mascotte predefinita + title: Immagine della mascotte peers_api_enabled: desc_html: Nomi di dominio che questa istanza ha incontrato nella fediverse title: Pubblica elenco di istanze scoperte + preview_sensitive_media: + desc_html: Le anteprime dei link su altri siti mostreranno un thumbnail anche se il media è segnato come sensibile + title: Mostra media sensibili nella anteprime OpenGraph registrations: closed_message: desc_html: Mostrato nella pagina iniziale quando le registrazioni sono chiuse. Puoi usare tag HTML @@ -364,12 +396,21 @@ it: show_staff_badge: title: Mostra badge staff site_description: + desc_html: Paragrafo introduttivo nella pagina iniziale. Descrive ciò che rende speciale questo server Mastodon e qualunque altra cosa sia importante dire. Potete usare marcatori HTML, in particolare <code><a></code> e <code><em></code>. title: Descrizione istanza + site_description_extended: + desc_html: Un posto adatto per pubblicare regole di comportamento, linee guida e altre cose specifiche della vostra istanza. Potete usare marcatori HTML + title: Informazioni estese personalizzate site_short_description: + desc_html: Mostrato nella barra laterale e nei tag meta. Descrive in un paragrafo che cos'è Mastodon e che cosa rende questo server speciale. Se vuoto, sarà usata la descrizione predefinita dell'istanza. title: Breve descrizione dell'istanza site_terms: + desc_html: Potete scrivere la vostra politica sulla privacy, condizioni del servizio o altre informazioni legali. Potete usare tag HTML title: Termini di servizio personalizzati site_title: Nome istanza + thumbnail: + desc_html: Usato per anteprime tramite OpenGraph e API. 1200x630px consigliati + title: Thumbnail dell'istanza timeline_preview: desc_html: Mostra la timeline pubblica sulla pagina iniziale title: Anteprima timeline @@ -384,6 +425,7 @@ it: media: title: Media no_media: Nessun media + no_status_selected: Nessun status è stato modificato perché nessuno era stato selezionato title: Gli status dell'account with_media: con media subscriptions: @@ -391,6 +433,12 @@ it: confirmed: Confermato expires_in: Scade in topic: Argomento + suspensions: + bad_acct_msg: Il valore di conferma non corrisponde. Stai sospendendo l'account giusto? + hint_html: 'Per confermare la sospensione dell''account, inserisci %{value} nel campo qui sotto:' + proceed: Continua + title: Sospendi %{acct} + warning_html: 'La sospensione dell''account comporta la cancellazione <strong>irreversibile</strong> dei suoi dati, che comprendono:' title: Amministrazione application_mailer: notification_preferences: Cambia preferenze email @@ -435,6 +483,7 @@ it: post_follow: close: Oppure puoi chiudere questa finestra. return: Mostra il profilo dell'utente + web: Vai al web title: Segui %{acct} datetime: distance_in_words: @@ -500,14 +549,17 @@ it: domain: Dominio explanation_html: Se vuoi garantire la privacy dei tuoi status, devi sapere chi ti sta seguendo. <strong>I tuoi status privati vengono inviati a tutte le istanze su cui hai dei seguaci</strong>. Puoi controllare chi sono i tuoi seguaci, ed eliminarli se non hai fiducia che la tua privacy venga rispettata dallo staff o dal software di quelle istanze. followers_count: Numero di seguaci + lock_link: Blocca il tuo account purge: Elimina dai seguaci true_privacy_html: Tieni presente che <strong>l'effettiva riservatezza si può ottenere solo con la crittografia end-to-end</strong>. unlocked_warning_html: Chiunque può seguirti per vedere immediatamente i tuoi status privati. %{lock_link} per poter esaminare e respingere gli utenti che vogliono seguirti. + unlocked_warning_title: Il tuo account non è bloccato footer: developers: Sviluppatori more: Altro… generic: changes_saved_msg: Modifiche effettuate con successo! + copy: Copia save_changes: Salva modifiche validation_errors: one: Qualcosa ancora non va bene! Per favore, controlla l'errore qui sotto @@ -535,6 +587,7 @@ it: generate: Genera invited_by: 'Sei stato invitato da:' max_uses: + one: un uso other: "%{count} utilizzi" max_uses_prompt: Nessun limite prompt: Genera e condividi dei link ad altri per garantire l'accesso a questa istanza @@ -618,6 +671,9 @@ it: no_account_html: Non hai un account? Puoi <a href='%{sign_up_path}' target='_blank'>iscriverti qui</a> proceed: Conferma prompt: 'Stai per seguire:' + remote_interaction: + proceed: Continua per interagire + prompt: 'Vuoi interagire con questo toot:' remote_unfollow: error: Errore title: Titolo @@ -627,13 +683,29 @@ it: browsers: blackberry: Blackberry chrome: Chrome + edge: Microsoft Edge firefox: Firefox generic: Browser sconosciuto + ie: Internet Explorer + opera: Opera + safari: Safari current_session: Sessione corrente description: "%{browser} su %{platform}" explanation: Questi sono i browser da cui attualmente è avvenuto l'accesso al tuo account Mastodon. + ip: IP platforms: + adobe_air: Adobe Air + android: Android + blackberry: Blackberry + chrome_os: ChromeOS + firefox_os: Firefox OS + ios: iOS + linux: Linux + mac: Mac other: piattaforma sconosciuta + windows: Windows + windows_mobile: Windows Mobile + windows_phone: Windows Phone title: Sessioni settings: authorized_apps: Applicazioni autorizzate @@ -672,6 +744,7 @@ it: private: Un toot non pubblico non può essere fissato in cima reblog: Un toot condiviso non può essere fissato in cima show_more: Mostra di più + sign_in_to_participate: Accedi per partecipare alla conversazione visibilities: private: Mostra solo ai tuoi seguaci private_long: Mostra solo ai seguaci @@ -688,6 +761,7 @@ it: themes: contrast: Contrasto elevato default: Mastodon + mastodon-light: Mastodon (chiaro) time: formats: default: "%b %d, %Y, %H:%M" @@ -702,6 +776,7 @@ it: instructions_html: "<strong>Scannerizza questo QR code con Google Authenticator o un'app TOTP simile sul tuo telefono</strong>. Da ora in poi, quell'applicazione genererà codici da inserire necessariamente per eseguire l'accesso." lost_recovery_codes: I codici di recupero ti permettono di accedere al tuo account se perdi il telefono. Se hai perso i tuoi codici di recupero, puoi rigenerarli qui. Quelli vecchi saranno annullati. manual_instructions: 'Se non puoi scannerizzare il QR code e hai bisogno di inserirlo manualmente, questo è il codice segreto in chiaro:' + recovery_codes: Codici di recupero del backup recovery_codes_regenerated: I codici di recupero sono stati rigenerati recovery_instructions_html: Se perdi il telefono, puoi usare uno dei codici di recupero qui sotto per riottenere l'accesso al tuo account. <strong>Conserva i codici di recupero in un posto sicuro</strong>. Ad esempio puoi stamparli e conservarli insieme ad altri documenti importanti. setup: Configura @@ -729,6 +804,11 @@ it: tips: Suggerimenti title: Benvenuto a bordo, %{name}! users: + follow_limit_reached: Non puoi seguire più di %{limit} persone invalid_email: L'indirizzo email inserito non è valido invalid_otp_token: Codice d'accesso non valido seamless_external_login: Ti sei collegato per mezzo di un servizio esterno, quindi le impostazioni di email e password non sono disponibili. + signed_in_as: 'Hai effettuato l''accesso come:' + verification: + explanation_html: 'Puoi <strong>certificare te stesso come proprietario dei link nei metadati del tuo profilo</strong>. Per farlo, il sito a cui punta il link deve contenere un link che punta al tuo profilo Mastodon. Il link di ritorno <strong>deve</strong> avere l''attributo <code>rel="me"</code>. Il testo del link non ha importanza. Ecco un esempio:' + verification: Verifica diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 630898104..9121094b7 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -48,6 +48,7 @@ ja: other: フォロワー following: フォロー中 joined: "%{date} に登録" + link_verified_on: このリンクの所有権は %{date} に確認されました media: メディア moved_html: "%{name} さんは引っ越しました %{new_profile_link}:" network_hidden: この情報は利用できません @@ -176,6 +177,7 @@ ja: create_domain_block: "%{name} さんがドメイン %{target} をブロックしました" create_email_domain_block: "%{name} さんがドメイン %{target} をメールアドレス用ブラックリストに追加しました" demote_user: "%{name} さんが %{target} さんを降格しました" + destroy_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を削除しました" destroy_domain_block: "%{name} さんがドメイン %{target} のブロックを外しました" destroy_email_domain_block: "%{name} さんがドメイン %{target} をメールアドレス用ブラックリストから外しました" destroy_status: "%{name} さんが %{target} さんの投稿を削除しました" @@ -261,6 +263,8 @@ ja: title: 新規ドメインブロック reject_media: メディアファイルを拒否 reject_media_hint: ローカルに保存されたメディアファイルを削除し、今後のダウンロードを拒否します。停止とは無関係です + reject_reports: レポートを拒否 + reject_reports_hint: このドメインからのすべてのレポートを無視します。停止とは無関係です severities: noop: なし silence: サイレンス @@ -344,9 +348,7 @@ ja: reported_by: 報告者 resolved: 解決済み resolved_msg: レポートを解決済みにしました! - silence_account: アカウントをサイレンス status: ステータス - suspend_account: アカウントを停止 title: レポート unassign: 担当を外す unresolved: 未解決 @@ -368,7 +370,7 @@ ja: desc_html: フロントページに表示されます。サイズは600x100px以上推奨です。未設定の場合、インスタンスのサムネイルが使用されます title: ヒーローイメージ mascot: - desc_html: 複数のページに表示されます。サイズは293x205px以上推奨です。未設定の場合、インスタンスのサムネイルが使用されます + desc_html: 複数のページに表示されます。サイズは293x205px以上推奨です。未設定の場合、標準のマスコットが使用されます title: マスコットイメージ peers_api_enabled: desc_html: 連合内でこのインスタンスが遭遇したドメインの名前 @@ -463,7 +465,7 @@ ja: warning: このデータは気をつけて取り扱ってください。他の人と共有しないでください! your_token: アクセストークン auth: - agreement_html: 登録すると <a href="%{rules_path}">インスタンスのルール</a> と <a href="%{terms_path}">プライバシーポリシー</a> に従うことに同意したことになります。 + agreement_html: 登録するをクリックすると <a href="%{rules_path}">インスタンスのルール</a> と <a href="%{terms_path}">プライバシーポリシー</a> に従うことに同意したことになります。 change_password: パスワード confirm_email: メールアドレスの確認 delete_account: アカウントの削除 @@ -926,3 +928,6 @@ ja: otp_lost_help_html: どちらも使用できない場合、%{email} に連絡を取ると解決できるかもしれません seamless_external_login: あなたは外部サービスを介してログインしているため、パスワードとメールアドレスの設定は利用できません。 signed_in_as: '下記でログイン中:' + verification: + explanation_html: <strong>プロフィール内のリンクの所有者であることを認証することができます</strong>。そのためにはリンクされたウェブサイトにMastodonプロフィールへのリンクが含まれている必要があります。リンクには<code>rel="me"</code>属性を<strong>必ず</strong>与えなければなりません。リンクのテキストについては重要ではありません。以下は例です: + verification: 認証 diff --git a/config/locales/ka.yml b/config/locales/ka.yml index f782db09b..1b74405d2 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -325,9 +325,7 @@ ka: reported_by: დაარეპორტა resolved: გადაწყვეტილი resolved_msg: რეპორტი წარმატებით გადაწყდა! - silence_account: ანგარიშის გაჩუმება status: სტატუსი - suspend_account: ანგარიშის შეჩერება title: რეპორტები unassign: გადაყენება unresolved: გადაუწყვეტელი @@ -483,7 +481,7 @@ ka: deletes: bad_password_msg: კარგად სცადეთ, ჰაკერებო! არასწორი პაროლი confirm_password: იდენტობის დასამოწმებლად შეიყვანეთ მიმდინარე პაროლი - description_html: ეს <strong>სამუდამოდ, დაუბრუნებლად</strong> გააუქმებს კონტენტს თქვენი ანგარიშიდან და მოახდენს მის დეაქტივაციას. მომხმარებლის სახელი კი, სამომავლო იმპერსონაციების შესაჩერებლად, გახდება რეზერვირებული + description_html: ეს <strong>სამუდამოდ, დაუბრუნებლად</strong> გააუქმებს კონტენტს თქვენი ანგარიშიდან და მოახდენს მის დეაქტივაციას. მომხმარებლის სახელი კი, სამომავლო იმპერსონაციების შესაჩერებლად, გახდება რეზერვირებული. proceed: ანგარიშის გაუქმება success_msg: თქვენი ანგარიში წარმატებით გაუქმდა warning_html: მოცულობის გაუქმება გარანტირებულია მხოლოდ ამ ინსტანციაზე. კონტენტი რომელიც ფართო მასშტაბით გაზიარდა უფრო დატოვებს კვალს. ოფლაინ სერვერები და სერვერები, რომლებმაც შეწყვიტეს თქვენი განახლებების გამოწერა არ განაახლებენ მონაცემთა ბაზებს. diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 6f281a302..e1cb350d1 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -48,6 +48,7 @@ ko: other: 팔로워 following: 팔로잉 joined: "%{date}에 가입함" + link_verified_on: "%{date}에 이 링크의 소유가 확인되었습니다" media: 미디어 moved_html: "%{name}은 %{new_profile_link}으로 이동되었습니다:" network_hidden: 이 정보는 사용할 수 없습니다 @@ -120,13 +121,14 @@ ko: moderation_notes: 모더레이션 기록 most_recent_activity: 최근 활동 most_recent_ip: 최근 IP + no_limits_imposed: 제한 없음 not_subscribed: 구독하지 않음 order: alphabetic: 알파벳 순 most_recent: 최근 순 title: 순서 outbox_url: 발신함 URL - perform_full_suspension: 완전히 정지시키기 + perform_full_suspension: 정지시키기 profile_url: 프로필 URL promote: 모더레이터로 승급 protocol: 프로토콜 @@ -155,8 +157,10 @@ ko: report: 신고 targeted_reports: 이 계정에 대한 신고 silence: 침묵 + silenced: 침묵 됨 statuses: 툿 수 subscribe: 구독하기 + suspended: 정지 됨 title: 계정 unconfirmed_email: 미확인 된 이메일 주소 undo_silenced: 침묵 해제 @@ -173,6 +177,7 @@ ko: create_domain_block: "%{name}이 도메인 %{target}를 차단했습니다" create_email_domain_block: "%{name}이 이메일 도메인 %{target}를 차단했습니다" demote_user: "%{name}이 %{target}을 강등했습니다" + destroy_custom_emoji: "%{name}이 %{target} 에모지를 삭제함" destroy_domain_block: "%{name}이 도메인 %{target}의 차단을 해제했습니다" destroy_email_domain_block: "%{name}이 이메일 도메인 %{target}을 화이트리스트에 넣었습니다" destroy_status: "%{name}이 %{target}의 툿을 삭제했습니다" @@ -260,6 +265,8 @@ ko: title: 새로운 도메인 차단 reject_media: 미디어 파일 거부하기 reject_media_hint: 로컬에 저장된 미디어 파일을 삭제하고, 이후로도 다운로드를 거부합니다. 정지와는 관계 없습니다 + reject_reports: 신고 거부 + reject_reports_hint: 이 도메인으로부터의 모든 신고를 무시합니다. 정지와는 무관합니다 severities: noop: 없음 silence: 침묵 @@ -302,8 +309,13 @@ ko: title: 초대 relays: add_new: 릴레이 추가 + delete: 삭제 description_html: "<strong>연합 릴레이</strong>는 서버들 사이에서 많은 양의 공개 툿을 구독하고 중개하는 서버입니다. <strong>이것은 중소 규모의 서버에서 연합우주를 발견하는 데에 도움을 줄 수 있습니다</strong>, 이제 로컬 유저들이 다른 서버의 유저들을 수동으로 팔로우 하지 않아도 됩니다." + disable: 비활성화 + disabled: 비활성화 됨 + enable: 활성화 enable_hint: 활성화 되면, 이 릴레이의 모든 공개 툿을 구독하고 이 서버의 공개 툿을 전송하게 됩니다. + enabled: 활성화 됨 inbox_url: 릴레이 URL pending: 릴레이의 승인 대기중 save_and_enable: 저장하고 활성화 @@ -338,9 +350,7 @@ ko: reported_by: 신고자 resolved: 해결됨 resolved_msg: 리포트가 성공적으로 해결되었습니다! - silence_account: 계정을 침묵 처리 status: 상태 - suspend_account: 계정을 정지 title: 신고 unassign: 할당 해제 unresolved: 미해결 @@ -354,13 +364,16 @@ ko: title: 새 유저가 팔로우 할 계정들 contact_information: email: 공개할 메일 주소를 입력 - username: 아이디를 입력 + username: 연락 받을 관리자 유저네임 custom_css: desc_html: 모든 페이지에 적용할 CSS title: 커스텀 CSS hero: desc_html: 프론트페이지에 표시 됩니다. 최소 600x100픽셀을 권장합니다. 만약 설정되지 않았다면, 인스턴스의 썸네일이 사용 됩니다 title: 히어로 이미지 + mascot: + desc_html: 여러 페이지에서 보여집니다. 최소 293x205px을 추천합니다. 설정 되지 않은 경우, 기본 마스코트가 사용 됩니다 + title: 마스코트 이미지 peers_api_enabled: desc_html: 이 인스턴스가 페디버스에서 만났던 도메인 네임들 title: 발견 된 인스턴스들의 리스트 발행 @@ -569,6 +582,7 @@ ko: resources: 리소스 generic: changes_saved_msg: 정상적으로 변경되었습니다! + copy: 복사 save_changes: 변경 사항을 저장 validation_errors: one: 오류가 발생했습니다. 아래 오류를 확인해 주십시오 @@ -910,8 +924,12 @@ ko: tips: 팁 title: 환영합니다 %{name} 님! users: + follow_limit_reached: 당신은 %{limit}명의 사람을 넘어서 팔로우 할 수 없습니다 invalid_email: 메일 주소가 올바르지 않습니다 invalid_otp_token: 2단계 인증 코드가 올바르지 않습니다 otp_lost_help_html: 만약 양쪽 모두를 잃어버렸다면 %{email}을 통해 복구할 수 있습니다 seamless_external_login: 외부 서비스를 이용해 로그인 했습니다, 패스워드와 이메일 설정을 할 수 없습니다. signed_in_as: '다음과 같이 로그인 중:' + verification: + explanation_html: '당신은 <strong>프로필 메타데이터의 링크 소유자임을 검증할 수 있습니다</strong>. 이것을 하기 위해서는, 링크 된 웹사이트에서 당신의 마스토돈 프로필을 역으로 링크해야 합니다. 역링크는 <strong>반드시</strong> <code>rel="me"</code> 속성을 가지고 있어야 합니다. 링크의 텍스트는 상관이 없습니다. 여기 예시가 있습니다:' + verification: 검증 diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 6a27602d0..df65cfa2c 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -48,6 +48,7 @@ nl: other: Volgers following: Volgend joined: Geregistreerd in %{date} + link_verified_on: Eigendom van deze link is gecontroleerd op %{date} media: Media moved_html: "%{name} is verhuisd naar %{new_profile_link}:" network_hidden: Deze informatie is niet beschikbaar @@ -120,13 +121,14 @@ nl: moderation_notes: Opmerkingen voor moderatoren most_recent_activity: Laatst actief most_recent_ip: Laatst gebruikt IP-adres + no_limits_imposed: Geen limieten ingesteld not_subscribed: Niet geabonneerd order: alphabetic: Alfabetisch most_recent: Meest recent title: Sorteren outbox_url: Outbox-URL - perform_full_suspension: Volledig opschorten + perform_full_suspension: Opschorten profile_url: Profiel-URL promote: Promoveren protocol: Protocol @@ -155,8 +157,10 @@ nl: report: gerapporteerd targeted_reports: Over dit account aangemaakte rapportages silence: Negeren + silenced: Genegeerd statuses: Toots subscribe: Abonneren + suspended: Opgeschort title: Accounts unconfirmed_email: Onbevestigd e-mailadres undo_silenced: Niet langer negeren @@ -173,6 +177,7 @@ nl: create_domain_block: Domein %{target} is door %{name} geblokkeerd create_email_domain_block: E-maildomein %{target} is door %{name} op de zwarte lijst geplaatst demote_user: Gebruiker %{target} is door %{name} gedegradeerd + destroy_custom_emoji: "%{name} verwijderde emoji %{target}" destroy_domain_block: Domein %{target} is door %{name} gedeblokkeerd destroy_email_domain_block: E-maildomein %{target} is door %{name} op de witte lijst geplaatst destroy_status: Toot van %{target} is door %{name} verwijderd @@ -258,6 +263,8 @@ nl: title: Nieuwe domeinblokkade reject_media: Mediabestanden verwerpen reject_media_hint: Verwijderd lokaal opgeslagen mediabestanden en weigert deze in de toekomst te downloaden. Irrelevant voor opgeschorte domeinen + reject_reports: Rapportages weigeren + reject_reports_hint: Alle rapportages die vanaf dit domein komen negeren. Irrelevant voor opgeschorte domeinen severities: noop: Geen silence: Negeren @@ -300,8 +307,13 @@ nl: title: Uitnodigingen relays: add_new: Nieuwe relayserver toevoegen + delete: Verwijderen description_html: Een <strong>federatierelay</strong> is een tussenliggende server die grote hoeveelheden openbare toots uitwisselt tussen servers die zich hierop hebben geabonneerd. <strong>Het kan kleine en middelgrote servers helpen om content uit de fediverse te ontdekken</strong>, waarvoor anders lokale gebruikers handmatig mensen van externe servers moeten volgen. + disable: Uitschakelen + disabled: Uitgeschakeld + enable: Inschakelen enable_hint: Eenmaal ingeschakeld gaat jouw server zich op alle openbare toots van deze relayserver abonneren en stuurt het de openbare toots van jouw server naar de relayserver. + enabled: Ingeschakeld inbox_url: Relay-URL pending: Aan het wachten op toestemming van de relayserver save_and_enable: Opslaan en inschakelen @@ -336,9 +348,7 @@ nl: reported_by: Gerapporteerd door resolved: Opgelost resolved_msg: Rapportage succesvol opgelost! - silence_account: Account negeren status: Toot - suspend_account: Account opschorten title: Rapportages unassign: Niet langer toewijzen unresolved: Onopgelost @@ -359,6 +369,9 @@ nl: hero: desc_html: Wordt op de voorpagina getoond. Tenminste 600x100px aanbevolen. Wanneer dit niet is ingesteld wordt de thumbnail van de Mastodonserver getoond title: Hero-afbeelding + mascot: + desc_html: Wordt op meerdere pagina's weergegeven. Tenminste 293×205px aanbevolen. Wanneer dit niet is ingesteld wordt de standaardmascotte getoond + title: Mascotte-afbeelding peers_api_enabled: desc_html: Domeinnamen die deze server in de fediverse is tegengekomen title: Lijst van bekende servers publiceren @@ -567,6 +580,7 @@ nl: resources: Hulpmiddelen generic: changes_saved_msg: Wijzigingen succesvol opgeslagen! + copy: Kopiëren save_changes: Wijzigingen opslaan validation_errors: one: Er is iets niet helemaal goed! Bekijk onderstaande fout @@ -904,8 +918,12 @@ nl: tips: Tips title: Welkom aan boord %{name}! users: + follow_limit_reached: Je kunt niet meer dan %{limit} accounts volgen invalid_email: E-mailadres is ongeldig invalid_otp_token: Ongeldige tweestaps-aanmeldcode otp_lost_help_html: Als je toegang tot beiden kwijt bent geraakt, neem dan contact op via %{email} seamless_external_login: Je bent ingelogd via een externe dienst, daarom zijn wachtwoorden en e-mailinstellingen niet beschikbaar. signed_in_as: 'Ingelogd als:' + verification: + explanation_html: 'Je kunt <strong>jezelf verifiëren als de eigenaar van de links in de metadata van jouw profiel</strong>. Hiervoor moet op de gelinkte website een link terug naar jouw Mastodonprofiel staan. Deze link <strong>moet</strong> het <code>rel="me"</code>-attribuut bevatten. De omschrijving van de link maakt niet uit. Hier is een voorbeeld:' + verification: Verificatie diff --git a/config/locales/no.yml b/config/locales/no.yml index bbfa9b5da..61466fa20 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -249,9 +249,7 @@ reported_account: Rapportert konto reported_by: Rapportert av resolved: Løst - silence_account: Målbind konto status: Status - suspend_account: Utvis konto title: Rapporter unresolved: Uløst settings: diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 373d2ed44..a127236a9 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -48,6 +48,7 @@ oc: other: Seguidors following: Abonaments joined: Arribèt en %{date} + link_verified_on: La proprietat d’aqueste ligam foguèt verificada lo %{date} media: Mèdias moved_html: "%{name} a mudat a %{new_profile_link} :" network_hidden: Aquesta informacion es pas disponibla @@ -120,13 +121,14 @@ oc: moderation_notes: Nòtas de moderacion most_recent_activity: Activitat mai recenta most_recent_ip: IP mai recenta + no_limits_imposed: Cap de limit impausat not_subscribed: Pas seguidor order: alphabetic: Alfabetic most_recent: Mai recent title: Ordre outbox_url: URL Outbox - perform_full_suspension: Botar en tren la suspension complèta + perform_full_suspension: Suspendre profile_url: URL del perfil promote: Promòure protocol: Protocòl @@ -144,7 +146,6 @@ oc: role: Permissions roles: admin: Administrator - bot: Robòt moderator: Moderador staff: Personnal user: Uitlizaire @@ -156,8 +157,10 @@ oc: report: rapòrt targeted_reports: Rapòrts faches tocant aqueste compte silence: Silenci + silenced: Rescondut statuses: Estatuts subscribe: S’abonar + suspended: Suspendut title: Comptes unconfirmed_email: Adreça pas confirmada undo_silenced: Levar lo silenci @@ -174,6 +177,7 @@ oc: create_domain_block: "%{name} bloquèt lo domeni %{target}" create_email_domain_block: "%{name} botèt a la lista nègra lo domeni de corrièl %{target}" demote_user: "%{name} retragradèt l‘utilizaire %{target}" + destroy_custom_emoji: "%{name} destruguèt l’emoji %{target}" destroy_domain_block: "%{name} desbloquèt lo domeni %{target}" destroy_email_domain_block: "%{name} botèt a la lista blanca lo domeni de corrièl %{target}" destroy_status: "%{name} levèt l‘estatut a %{target}" @@ -259,6 +263,8 @@ oc: title: Nòu blocatge domeni reject_media: Regetar los fichièrs mèdias reject_media_hint: Lèva los fichièrs gardats localament e regèta las demandas de telecargament dins lo futur. Servís pas a res per las suspensions + reject_reports: Regetar los senhalaments + reject_reports_hint: Ignorer totes los senhalaments que venon d’aqueste domeni. Pas pertiment per las suspensions severities: noop: Cap silence: Silenci @@ -301,8 +307,13 @@ oc: title: Convits relays: add_new: Ajustar un nòu relai + delete: Suprimir description_html: Un <strong> relai de federacion</strong> es un servidor intermediari qu’escàmbia de bèls volumes de tuts publics entre servidors que son abonats e i publican.<strong>Pòt ajudar de pichons e mejans servidors a trobar de contenguts del fediverse estant</strong>, qu’autrament demandariá als utilizaires locals de s’abonar manualament a d’autres monde marcats sus de servidors alonhats. + disable: Desactivar + disabled: Desactivat + enable: Activat enable_hint: Un còp activat, vòstre servidor s’abonarà a totes los tuts publics del relai estant, e començarà de mandar sos tuts publics a aqueste d’enlà. + enabled: Activat inbox_url: URL del relai pending: En espèra d’aprovacion del relai save_and_enable: Salvar e activar @@ -337,9 +348,7 @@ oc: reported_by: Senhalat per resolved: Resolgut resolved_msg: Rapòrt corrèctament resolgut ! - silence_account: Metre lo compte en silenci status: Estatut - suspend_account: Suspendre lo compte title: Senhalament unassign: Levar unresolved: Pas resolgut @@ -360,6 +369,9 @@ oc: hero: desc_html: Mostrat en primièra pagina. Almens 600x100px recomandat. S’es pas configurat l’imatge de l’instància serà mostrat title: Imatge de l’eròi + mascot: + desc_html: Mostrat sus mantun paginas. Almens 293×205px recomandat. S’es pas configurat, mostrarem la mascòta per defaut + title: Imatge de la mascòta peers_api_enabled: desc_html: Noms de domeni qu’aquesta instància a trobats pel fediverse title: Publica la lista de las instàncias conegudas @@ -624,6 +636,7 @@ oc: resources: Ressorsas generic: changes_saved_msg: Cambiaments ben realizats ! + copy: Copiar save_changes: Salvar los cambiaments validation_errors: one: I a quicòm que truca ! Mercés de corregir l’error çai-jos @@ -839,11 +852,12 @@ oc: <h2>Politica de confidencialitat</h2> <h3 id="collect">Quinas informacions reculhèm ?</h3> - <li> - <ul><em>Inforacions de basa del compte</em> : se vos marcatz sus aqueste servidor, vos podèm demandar de picar un escais-nom, una adreça de corrièl e un senhal. Podètz tanben ajustar d’informacions de perfil addicionalas coma un nom de far veire, una biografia, un imatge de perfil e una banièra. L’escais-nom, lo nom d’afichatge, la biografia, l’imatge de perfil e la banièra son totjorn indicats per èsser vist publicament.</li> - <li><em>Publicacions, abonaments e autras informacions publicas</em> : La lista del monde que seguètz es visibla publicament, tot parièr per vòstres seguidors. Quand enviatz un messatge, la data e l’ora son gardats, l’aplicacion qu’avètz utilizada tanben. Los messatges pòdon conténer de mèdias juntats coma d’imatge e vidèos. Las publicacions publicas e pas listadas son disponiblas publicament. Quand penjatz una publicacion per vòstre perfil, aquò tanben es visible per tot lo monde. Vòstras publicacions son mandadas a vòstre seguidors, dins qualques cases aquò significa que passaràn per diferents servidors e seràn copiadas e gardadas sus aqueles servidors. Quand escafatz de publicacions, aquò es tanben mandat a vòstre seguidors. L’acion de partejar o d’ajustar als favorits una publicacion es totjorn quicòm de public.</li> - <li><em>Publicacions dirèctas e solament pels seguidors</em> :</li> totas las publicacions son gardadas e tractadas pel servidor. Las publicacions pas que per vòstres seguidors son enviadas a vòstres seguidors e las personas mencionadas dedins, las publicacions dirèctas son pas qu’enviadas a las personas mencionadas. Dins qualques cases aquò significa que passaràn per diferents servidors, copiadas e gardadas sus eles. Ensagem de limitar l’accès a aquelas publicacions a monde autorizat, mas los demai servidors pòdon fracar a far parièr. A causa d’aquò es fòrça important de repassar los servidors d’apertenéncia de vòstres seguidors. Podètz activar una opcion per autorizar o regetar una demanda de seguiment dins los paramètres. <em>Vos cal pas oblidar que’ls administrators dels servidors e dels servidors de recepcion pòdon veire aqueles messatges</em>, e que’ls destinataris pòdon realizar de captura d’ecran, copiar e tornar partejar los messatges.<em>Partegetz pas cap informacion perilhosa sus Mastodon</em><li>. - <li><em>Adreças IP e autras metadonadas</em> : quand vos connectatz, enregistrem l’adreça IP qu’utilizatz per establir la connexion, e tanben lo nom de vòstre navigador. Totas las sessions de connexion son disponiblas per que las repassetz e tiretz dins los paramètres. Las darrièras adreças IP son salvagardas fins a 12 meses. Podèm tanben gardar de jornals d’audit del servidor que pòdon conténer las adreças IP de cada requèstas mandadas a nòstre servidor.</li> + <ul> + <li><em>Inforacions de basa del compte</em> : se vos marcatz sus aqueste servidor, vos podèm demandar de picar un escais-nom, una adreça de corrièl e un senhal. Podètz tanben ajustar d’informacions de perfil addicionalas coma un nom de far veire, una biografia, un imatge de perfil e una banièra. L’escais-nom, lo nom d’afichatge, la biografia, l’imatge de perfil e la banièra son totjorn indicats per èsser vistes publicament.</li> + <li><em>Publicacions, abonaments e autras informacions publicas</em> : La lista del monde que seguètz es visibla publicament, tot parièr per vòstres seguidors. Quand enviatz un messatge, la data e l’ora son gardats, l’aplicacion qu’avètz utilizada tanben. Los messatges pòdon conténer de mèdias juntats coma d’imatge e vidèos. Las publicacions publicas e pas listadas son disponiblas publicament. Quand penjatz una publicacion per vòstre perfil, aquò tanben es visible per tot lo monde. Vòstras publicacions son mandadas a vòstre seguidors, dins qualques cases aquò significa que passaràn per diferents servidors e seràn copiadas e gardadas sus aqueles servidors. Quand escafatz de publicacions, aquò es tanben mandat a vòstre seguidors. L’accion de partejar o d’ajustar als favorits una publicacion es totjorn quicòm de public.</li> + <li><em>Publicacions dirèctas e solament pels seguidors</em> :</li> totas las publicacions son gardadas e tractadas pel servidor. Las publicacions pas que per vòstres seguidors son enviadas a vòstres seguidors e las personas mencionadas dedins, las publicacions dirèctas son pas qu’enviadas a las personas mencionadas. Dins qualques cases aquò significa que passaràn per diferents servidors, copiadas e gardadas sus eles. Ensagem de limitar l’accès a aquelas publicacions a monde autorizat, mas los demai servidors pòdon fracar a far parièr. A causa d’aquò es fòrça important de repassar los servidors d’apertenéncia de vòstres seguidors. Podètz activar una opcion per autorizar o regetar una demanda de seguiment dins los paramètres. <em>Vos cal pas oblidar que’ls administrators dels servidors e dels servidors de recepcion pòdon veire aqueles messatges</em>, e que’ls destinataris pòdon realizar de captura d’ecran, copiar e tornar partejar los messatges.<em>Partegetz pas cap informacion perilhosa sus Mastodon</em><li>. + <li><em>Adreças IP e autras metadonadas</em> : quand vos connectatz, enregistrem l’adreça IP qu’utilizatz per establir la connexion, e tanben lo nom de vòstre navigador. Totas las sessions de connexion son disponiblas per que las repassetz e tiretz dins los paramètres. Las darrièras adreças IP son salvagardas fins a 12 meses. Podèm tanben gardar de jornals d’audit del servidor que pòdon conténer las adreças IP de cada requèstas mandadas a nòstre servidor.</li> + </ul> <hr class="spacer" /> @@ -870,9 +884,53 @@ oc: <p>Farem esfòrces per :</p> <ul> - <li>Gardar los jornals del servidor que contenon las adreças IP de totas las demandas al servidor pas mai de 90 jorns.</li> - <li>Gardar las adreças IP ligadas als utilizaires e lors publicacions pas mai de 12 messes.</li> + <li>Gardar los jornals del servidor que contenon las adreças IP de totas las demandas al servidor pas mai de 90 jorns.</li> + <li>Gardar las adreças IP ligadas als utilizaires e lors publicacions pas mai de 12 messes.</li> </ul> + + <p>Podètz demandar e telecargar vòstre archiu de contengut, amb vòstras publicacions, los mèdias enviats, l’imatge de perfil e l’imatge de bandièra.</p> + + <p>Podètz suprimir sens anullacion possibla vòstre compte quand volgatz.</p> + + <hr class="spacer"/> + + + <h3 id="cookies">Utilizem de cookies ?</h3> + + <p>Òc-ben. Los cookies son de pichons fichièrs qu’un site o sos provesidors de servicis plaçan dins lo disc dur de vòstre ordenador via lo navigator Web (Se los acceptatz). Aqueles cookies permeton al site de reconéisser vòstre navigator e se tenètz un compte enregistrat de l’associar a vòstre compte.</p> + + <p>Empleguem de cookies per comprendre e enregistrar vòstras preferéncias per vòstras visitas venentas</p> + + <hr class="spacer" /> + + <h3 id="disclose">Divulguem d’informacions a de tèrces ?</h3> + + + <p>Vendèm pas, comercem o qualque transferiment que siasque a de tèrces vòstras informacions personalas identificablas. Aquò inclutz pas los tèrces partits de confisança que nos assiston a menar nòstre site, menar nòstre afar o vos servir, baste que son d’acòrd per gardar aquelas informacions confidencialas. Pòt tanben arribar que liberèssem vòstras informacions quand cresèm qu’es apropriat d’o far per se sometre a la lei, per refortir nòstras politicas, o per protegir los dreches, proprietats o seguritat de qualqu’un o de nosautres.</p> + + <p>Vòstre contengut public pòt èsser telecargat per los autres servidors del malhum. Vòstras publicacions publicas e las dels seguidors solament son enviadas als servidors qu’albergan vòstres seguidors, los messatges dirèctes son mandats als servidors dels destinaris se son pas de vòstra instància.</p> + + <p>Quand autorizatz una aplicacion d’utilizar vòstre compte, segon l’encastre que volètz permetre, pòt accedir a l’informacion de vòstre perfil public, vòstra lista d’abonaments, vòstres seguidors, vòstras listas, totas vòstras publicacions e vòstres favorits. Las aplicacions pòdon pas jamai accedir a vòstra adreça electronica o vòstre senhal.</p> + + <hr class="spacer" /> + + <h3 id="children">Utilizacion del site pels enfants</h3> + + <p>S’aqueste servidor es en EU o la EEA : òstre site, nòstres produches e servicis son totas a destinacion de monde de mai de 16 ans. S’avètz mens de 16 ans, per cumplir lo RGPD (<a href="https://ca.wikipedia.org/wiki/Reglament_General_de_Protecci%C3%B3_de_Dades">Reglament General de Proteccion de Donadas</a>) utilizetz pas aqueste site.</p> + + <p>S’aqueste servidor se tròba en los Estats Units : nòstre site, nòstres produches e servicis son totas a destinacion de monde de mai de 13 ans. S’avètz mens de 13 ans, per acontentar las exigéncias del COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) utilizetz pas aqueste site.</p> + + <p>Las exigéncias legalas pòdon èsser diferentas se lo servidor es en una autra juridiccion</p> + + <hr class="spacer" /> + + <h3 id="changes">Cambiament dins nòstra politica de confidencialitat</h3> + + <p>Se decidèm de cambiar nòstra politica de confidencialitat, publicarem los cambiaments sus aquesta pagina.</p> + + <p>Aqueste document es jos licéncia CC-BY-SA. Darrièra mesa a jorn lo 4 de març de 2018</p> + + <p>Prima adaptacion de la <a href="https://github.com/discourse/discourse">politica de confidencialitat de Discourse</a>.</p> title: Condicions d’utilizacion e politica de confidencialitat de %{instance} time: formats: @@ -918,8 +976,12 @@ oc: tips: Astúcias title: Vos desirem la benvenguda a bòrd %{name} ! users: + follow_limit_reached: Podètz pas sègre mai de %{limit} personas invalid_email: L’adreça de corrièl es invalida invalid_otp_token: Còdi d’autentificacion en dos temps invalid otp_lost_help_html: Se perdatz l’accès al dos, podètz benlèu contactar %{email} seamless_external_login: Sètz connectat via un servici extèrn, los paramètres de senhal e de corrièl son doncas pas disponibles. signed_in_as: 'Session a :' + verification: + explanation_html: 'Podètz <strong>verificar vosautres meteisses coma proprietari dels ligams per las metadonadas de vòstre perfil</strong>. Per aquò far, lo site Web ligat deu conténer un ligam cap a vòstre perfil Mastodon. Lo ligam <strong>deu</strong> aver un atribut <code>rel="me"</code>. Lo contengut tèxte del ligam impòrta pas. Vaquí un exemple :' + verification: Verificacion diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 703ec0c26..18b295da6 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -136,7 +136,7 @@ pl: most_recent: Najnowsze title: Kolejność outbox_url: Adres skrzynki nadawczej - perform_full_suspension: Całkowicie zawieś + perform_full_suspension: Zawieś profile_url: Adres profilu promote: Podnieś uprawnienia protocol: Protokół @@ -185,6 +185,7 @@ pl: create_domain_block: "%{name} zablokował(a) domenę %{target}" create_email_domain_block: "%{name} dodał(a) domenę e-mail %{target} na czarną listę" demote_user: "%{name} zdegradował(a) użytkownika %{target}" + destroy_custom_emoji: "%{name} usunął(-ęła) emoji %{target}" destroy_domain_block: "%{name} odblokował(a) domenę %{target}" destroy_email_domain_block: "%{name} usunął(-ęła) domenę e-mail %{target} z czarnej listy" destroy_status: "%{name} usunął(-ęła) wpis użytkownika %{target}" @@ -270,16 +271,15 @@ pl: title: Nowa blokada domen reject_media: Odrzucaj pliki multimedialne reject_media_hint: Usuwa przechowywane lokalnie pliki multimedialne i nie pozwala na ich pobieranie. Nieprzydatne przy zawieszeniu + reject_reports: Odrzucaj zgłoszenia + reject_reports_hint: Zgłoszenia z tej instancji będą ignorowane. Nieprzydatne przy zawieszeniu severities: noop: Nic nie rób silence: Wycisz suspend: Zawieś severity: Priorytet show: - affected_accounts: - many: Dotyczy %{count} kont w bazie danych - one: Dotyczy jednego konta w bazie danych - other: Dotyczy %{count} kont w bazie danych + affected_accounts: Dotyczy %{count} kont w bazie danych retroactive: silence: Odwołaj wyciszenie wszystkich kont w tej domenie suspend: Odwołaj zawieszenie wszystkich kont w tej domenie @@ -354,9 +354,7 @@ pl: reported_by: Zgłaszający resolved: Rozwiązane resolved_msg: Pomyślnie rozwiązano zgłoszenie. - silence_account: Wycisz konto status: Stan - suspend_account: Zawieś konto title: Zgłoszenia unassign: Cofnij przypisanie unresolved: Nierozwiązane @@ -375,8 +373,11 @@ pl: desc_html: Modyfikuj wygląd pliku CSS ładowanego na każdej stronie title: Niestandardowy CSS hero: - desc_html: Wyświetlany na stronie głównej. Zalecany jest rozmiar przynajmniej 600x100 pikseli. Jeżeli nie ustawiony, zostanie użyta miniatura instancji. + desc_html: Wyświetlany na stronie głównej. Zalecany jest rozmiar przynajmniej 600x100 pikseli. Jeżeli nie ustawiony, zostanie użyta miniatura instancji title: Obraz bohatera + mascot: + desc_html: Wyświetlany na wielu stronach. Zalecany jest rozmiar przynajmniej 293px × 205px. Jeżeli nie ustawiono, zostanie użyta domyślna. + title: Obraz maskotki peers_api_enabled: desc_html: Nazwy domen, z którymi ta instancja wchodziła w interakcje title: Publikuj listę znanych instancji @@ -573,9 +574,7 @@ pl: followers_count: Liczba śledzących lock_link: Zablokuj swoje konto purge: Przestań śledzić - success: - one: W trakcie usuwania śledzących z jednej domeny… - other: W trakcie usuwania śledzących z %{count} domen… + success: W trakcie usuwania śledzących z %{count} domen… true_privacy_html: Pamiętaj, że <strong>rzeczywista prywatność może zostać uzyskana wyłącznie dzięki szyfrowaniu end-to-end</strong>. unlocked_warning_html: Każdy może Cię śledzić, dzięki czemu może zobaczyć Twoje niepubliczne wpisy. %{lock_link} aby móc kontrolować, kto Cię śledzi. unlocked_warning_title: Twoje konto nie jest zablokowane @@ -784,9 +783,7 @@ pl: other: "%{count} filmów" boosted_from_html: Podbito przez %{acct_link} content_warning: 'Ostrzeżenie o zawartości: %{warning}' - disallowed_hashtags: - one: 'zawiera niedozwolony hashtag: %{tags}' - other: 'zawiera niedozwolone hashtagi: %{tags}' + disallowed_hashtags: 'zawiera niedozwolone hashtagi: %{tags}' language_detection: Automatycznie wykrywaj język open_in_web: Otwórz w przeglądarce over_character_limit: limit %{max} znaków przekroczony diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 9eb0d7968..1c9964daf 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -48,6 +48,7 @@ pt-BR: other: Seguidores following: Seguindo joined: Participa desde %{date} + link_verified_on: A posse desse link foi checada em %{date} media: Mídia moved_html: "%{name} se mudou para %{new_profile_link}:" network_hidden: Esta informação não está disponível @@ -120,13 +121,14 @@ pt-BR: moderation_notes: Notas de moderação most_recent_activity: Atividade mais recente most_recent_ip: IP mais recente + no_limits_imposed: Nenhum limite imposto not_subscribed: Não está inscrito order: alphabetic: Alfabética most_recent: Mais recente title: Ordem outbox_url: URL da caixa de saída - perform_full_suspension: Aplicar suspensão total + perform_full_suspension: Suspender profile_url: URL do perfil promote: Promover protocol: Protocolo @@ -155,8 +157,10 @@ pt-BR: report: relatórios targeted_reports: Denúncias feitas sobre esta conta silence: Silenciar + silenced: Silenciado statuses: Postagens subscribe: Inscrever-se + suspended: Suspenso title: Contas unconfirmed_email: E-mail não confirmado undo_silenced: Retirar silenciamento @@ -173,6 +177,7 @@ pt-BR: create_domain_block: "%{name} bloqueou o domínio %{target}" create_email_domain_block: "%{name} colocou o domínio de e-mail %{target} na lista negra" demote_user: "%{name} rebaixou o usuário %{target}" + destroy_custom_emoji: "%{name} destruiu emoji %{target}" destroy_domain_block: "%{name} desbloqueou o domínio %{target}" destroy_email_domain_block: "%{name} retirou o domínio de e-mail %{target} da lista negra" destroy_status: "%{name} removeu postagem feita por %{target}" @@ -258,6 +263,8 @@ pt-BR: title: Novo bloqueio de domínio reject_media: Rejeitar arquivos de mídia reject_media_hint: Remove arquivos de mídia armazenados localmente e recusa quaisquer outros no futuro. Irrelevante para suspensões + reject_reports: Rejeitar denúncias + reject_reports_hint: Ignorar todas as denúncias vindas deste domíno. Irrelevante para suspensões severities: noop: Nenhum silence: Silêncio @@ -300,9 +307,16 @@ pt-BR: title: Convites relays: add_new: Adicionar novo repetidor + delete: Excluir description_html: Um <strong>repetidor de federação</strong> é um servidor intermediário que troca um grande volume de toots públicos entre servidores que se inscrevem e publicam nele. <strong>O repetidor pode ser usado para ajudar servidores pequenos e médios a descobrir conteúdo do fediverso</strong>, que normalmente precisariam que usuários locais manualmente seguissem outras pessoas em servidores remotos. + disable: Desativar + disabled: Desabilitar + enable: Habilitar enable_hint: Uma vez habilitado, seu servidor vai se inscrever para receber todos os toots públicos desse repetidor; E vai começar a enviar todos os toots públicos desse servidor para o repetidor. + enabled: Habilitado inbox_url: URL do repetidor + pending: Esperando pela aprovação do repetidor + save_and_enable: Salvar e habilitar setup: Configurar uma conexão de repetidor status: Status title: Repetidores @@ -334,9 +348,7 @@ pt-BR: reported_by: Denunciada por resolved: Resolvido resolved_msg: Denúncia resolvida com sucesso! - silence_account: Silenciar conta status: Status - suspend_account: Suspender conta title: Denúncias unassign: Desatribuir unresolved: Não resolvido @@ -357,6 +369,9 @@ pt-BR: hero: desc_html: Aparece na página inicial. Ao menos 600x100px é recomendado. Se não estiver definido, o thumbnail da instância é usado no lugar title: Imagem de capa + mascot: + desc_html: Mostrado em diversas páginas. Ao menos 293×205px recomendado. Quando não está configurado, o mascote padrão é mostrado + title: Imagem do mascote peers_api_enabled: desc_html: Nomes de domínio que essa instância encontrou no fediverso title: Publicar lista de instâncias descobertas @@ -565,6 +580,7 @@ pt-BR: resources: Recursos generic: changes_saved_msg: Mudanças salvas com sucesso! + copy: Copiar save_changes: Salvar mudanças validation_errors: one: Algo não está certo! Por favor, reveja o erro abaixo @@ -902,8 +918,12 @@ pt-BR: tips: Dicas title: Boas-vindas a bordo, %{name}! users: + follow_limit_reached: Você não pode seguir mais que %{limit} pessoas invalid_email: O endereço de e-mail é inválido invalid_otp_token: Código de autenticação inválido otp_lost_help_html: Se você perder o acesso à ambos, você pode entrar em contato com %{email} seamless_external_login: Você está logado usando um serviço externo, então configurações de e-mail e senha não estão disponíveis. signed_in_as: 'Acesso como:' + verification: + explanation_html: 'Você pode <strong>verificar-se como tendo posse dos links nos metadados do seu perfil</strong>. Para isso, o site conectado deve conter um link de volta para o seu perfil do Mastodon. O link de volta <strong>deve</strong> conter um atributo <code>rel="me"</code>. O conteúdo ou texto do link não importa. Aqui está um exemplo:' + verification: Verificação diff --git a/config/locales/pt.yml b/config/locales/pt.yml index 2bada74fe..b68ffbd7f 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -150,7 +150,7 @@ pt: enable_user: "%{name} ativou o acesso para o utilizador %{target}" memorialize_account: "%{name} transformou a conta de %{target} em um memorial" promote_user: "%{name} promoveu o utilizador %{target}" - reset_password_user: "%{name} restabeleceu a palavra-passe do utilizador %{target" + reset_password_user: "%{name} restabeleceu a palavra-passe do utilizador %{target}" resolve_report: "%{name} recusou o relatório %{target}" silence_account: "%{name} silenciou a conta de %{target}" suspend_account: "%{name} suspendeu a conta de %{target}" @@ -249,9 +249,7 @@ pt: reported_account: Conta denunciada reported_by: Denúnciada por resolved: Resolvido - silence_account: Conta silenciada status: Estado - suspend_account: Conta suspensa title: Denúncias unresolved: Por resolver settings: diff --git a/config/locales/ro.yml b/config/locales/ro.yml index c38094158..3a104e1d0 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -1,2 +1,7 @@ --- -ro: {} +ro: + accounts: + posts: + few: Toots + one: Toot + other: Toots diff --git a/config/locales/ru.yml b/config/locales/ru.yml index e8bbb94ca..a3ac754f2 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -264,7 +264,7 @@ ru: suspend: Блокировка title: Новая доменная блокировка reject_media: Запретить медиаконтент - reject_media_hint: Удаляет локально хранимый медиаконтент и запрещает его загрузку в будущем. Не имеет значения в случае блокировки. + reject_media_hint: Удаляет локально хранимый медиаконтент и запрещает его загрузку в будущем. Не имеет значения в случае блокировки severities: noop: Ничего silence: Глушение @@ -345,9 +345,7 @@ ru: reported_by: Отправитель жалобы resolved: Разрешено resolved_msg: Жалоба успешно обработана! - silence_account: Заглушить аккаунт status: Статус - suspend_account: Блокировать аккаунт title: Жалобы unassign: Снять назначение unresolved: Неразрешенные @@ -403,7 +401,7 @@ ru: desc_html: Отображается в боковой панели и в тегах. Опишите, что такое Mastodon и что делает именно этот узел особенным. Если пусто, используется описание узла по умолчанию. title: Краткое описание узла site_terms: - desc_html: Вы можете добавить сюда собственную политику конфиденциальности, пользовательское соглашение и другие документы. Можно использовать теги HTML. + desc_html: Вы можете добавить сюда собственную политику конфиденциальности, пользовательское соглашение и другие документы. Можно использовать теги HTML title: Условия использования site_title: Название сайта thumbnail: @@ -523,7 +521,7 @@ ru: '410': Страница, которую Вы искали, больше не существует. '422': content: Проверка безопасности не удалась. Возможно, Вы блокируете cookies? - title: Проверка безопасности не удалась. + title: Проверка безопасности не удалась '429': Слишком много запросов '500': content: Приносим извинения, но на нашей стороне что-то пошло не так. @@ -608,10 +606,10 @@ ru: max_uses: few: "%{count} исп." many: "%{count} исп." - one: 1 исп. - other: "%{count} исп." + one: 1 исп + other: "%{count} исп" max_uses_prompt: Без лимита - prompt: Генерируйте и делитесь ссылками с другими, чтобы предоставить им доступ к этому узлу. + prompt: Генерируйте и делитесь ссылками с другими, чтобы предоставить им доступ к этому узлу table: expires_at: Истекает uses: Исп. diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml index 783e545e1..cdd3ddf25 100644 --- a/config/locales/simple_form.ar.yml +++ b/config/locales/simple_form.ar.yml @@ -8,20 +8,24 @@ ar: bot: يُعلِم أنّ هذا الحساب لا يمثل شخصًا context: واحد أو أكثر من السياقات التي يجب أن ينطبق عليها عامل التصفية digest: تُرسَل إليك بعد مُضيّ مدة مِن خمول نشاطك و فقط إذا ما تلقيت رسائل شخصية مباشِرة أثناء فترة غيابك مِن الشبكة - display_name: <span class="name-counter">%{count}</span> حرف باق + email: سوف تتلقى رسالة إلكترونية للتأكيد fields: يُمكنك عرض 4 عناصر على شكل جدول في ملفك الشخصي header: ملف PNG أو GIF أو JPG. حجمه على أقصى تصدير %{size}. سيتم تصغيره إلى %{dimensions}px inbox_url: نسخ العنوان الذي تريد استخدامه مِن صفحة الإستقبال للمُرحَّل irreversible: التبويقات التي تم تصفيتها ستختفي لا محالة حتى و إن تمت إزالة عامِل التصفية لاحقًا locale: لغة واجهة المستخدم و الرسائل الإلكترونية و الإشعارات locked: يتطلب منك الموافقة يدويا على طلبات المتابعة - note: <span class="note-counter">%{count}</span> حرف باق + password: يُنصح باستخدام 8 أحرف على الأقل phrase: سوف يتم العثور عليه مهما كان نوع النص أو حتى و إن كان داخل الويب فيه تحذير عن المحتوى scopes: ما هي المجالات المسموح بها في التطبيق ؟ إن قمت باختيار أعلى المجالات فيمكنك الإستغناء عن الخَيار اليدوي. setting_default_language: يمكن الكشف التلقائي للّغة اللتي استخدمتها في تحرير تبويقاتك ، غيرَ أنّ العملية ليست دائما دقيقة + setting_display_media_default: إخفاء الوسائط المُعيَّنة كحساسة + setting_display_media_hide_all: إخفاء كافة الوسائط دائمًا + setting_display_media_show_all: دائمًا عرض الوسائط المُعيَّنة كحساسة setting_hide_network: الحسابات التي تُتابعها و التي تُتابِعك على حد سواء لن تُعرَض على صفحتك الشخصية setting_noindex: ذلك يؤثر على حالة ملفك الشخصي و صفحاتك setting_theme: ذلك يؤثر على الشكل الذي سيبدو عليه ماستدون عندما تقوم بالدخول مِن أي جهاز. + username: اسم المستخدم الخاص بك سوف يكون فريدا مِن نوعه على %{domain} imports: data: ملف CSV تم تصديره مِن مثيل خادوم ماستدون آخر sessions: @@ -64,6 +68,11 @@ ar: setting_default_privacy: خصوصية المنشور setting_default_sensitive: إعتبر الوسائط دائما كمحتوى حساس setting_delete_modal: إظهار مربع حوار للتأكيد قبل حذف أي تبويق + setting_display_media: عرض الوسائط + setting_display_media_default: افتراضي + setting_display_media_hide_all: اخفاء الكل + setting_display_media_show_all: عرض الكل + setting_expand_spoilers: توسيع التبويقات التي تحتوي على تحذيرات عن المحتوى تلقائيا setting_hide_network: إخفِ شبكتك setting_noindex: عدم السماح لمحركات البحث بفهرسة ملفك الشخصي setting_reduce_motion: تخفيض عدد الصور في الوسائط المتحركة diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml index a6b3e0733..0d78f419f 100644 --- a/config/locales/simple_form.ast.yml +++ b/config/locales/simple_form.ast.yml @@ -6,13 +6,7 @@ ast: autofollow: La xente que se rexistre pente la invitación va siguite automáticamente bot: Esta cuenta fai principalmente aiciones automatizaes y podría nun supervisase digest: Namái s'unvia tres un periodu llargu d'inactividá y namái si recibiesti cualesquier mensaxe personal na to ausencia - display_name: - one: Queda <span class="name-counter">1</span> caráuter - other: Queden <span class="name-counter">%{count}</span> caráuteres irreversible: Los toots peñeraos van desapaecer de mou irreversible, magar que se desanicie la peñera dempués - note: - one: Queda <span class="note-counter">1</span> caráuter - other: Queden <span class="note-counter">%{count}</span> caráuteres setting_hide_network: La xente que sigas y teas siguiendo nun va amosase nel perfil setting_theme: Afeuta al aspeutu de Mastodon cuando anicies sesión dende cualesquier preséu. labels: diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index 938dacc95..9441e53b3 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -4,10 +4,8 @@ bg: hints: defaults: avatar: PNG, GIF или JPG. До %{size}. Ще бъде смалена до %{dimensions} пиксела - display_name: До 30 символа header: PNG, GIF или JPG. До %{size}. Ще бъде смалена до %{dimensions} пиксела locked: Изисква ръчно одобрение на последователите. По подразбиране, публикациите са достъпни само до последователи. - note: До 160 символа imports: data: CSV файл, експортиран от друга инстанция на Mastodon labels: diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml index 53cf6db8e..546a5bd14 100644 --- a/config/locales/simple_form.ca.yml +++ b/config/locales/simple_form.ca.yml @@ -8,22 +8,25 @@ ca: bot: Aquest compte realitza principalment accions automatitzades i pot no estar controlat per cap persona context: Un o diversos contextos on s'ha d'aplicar el filtre digest: Només s'envia després d'un llarg període d'inactivitat amb un resum de les mencions que has rebut en la teva absència - display_name: - one: <span class="name-counter">1</span> càracter restant - other: <span class="name-counter">%{count}</span> càracters restans + email: Se t'enviarà un correu electrònic de confirmació fields: Pots tenir fins a 4 elements que es mostren com a taula al teu perfil header: PNG, GIF o JPG. Màxim %{size}. S'escalarà a %{dimensions}px + inbox_url: Copia l'URL des de la pàgina principal del relay que vols utilitzar irreversible: Els nodes filtrats desapareixeran de manera irreversible, fins i tot si el filtre es retira més tard locale: El llenguatge de l’interfície d’usuari, els correus i les notificacions push locked: Requereix que aprovis manualment els seguidors - note: - one: <span class="note-counter">1</span> càracter restant - other: <span class="note-counter">%{count}</span> caràcters restants + password: Utilitza com a mínim 8 caràcters phrase: Es combinarà independentment del format en el text o l'avís de contingut d'un toot + scopes: A quines API es permetrà l'accés a l'aplicació. Si selecciones un àmbit d'alt nivell, no cal que seleccionis un d'individual. setting_default_language: La llengua dels teus toots pot ser detectada automàticament però no sempre acuradament + setting_display_media_default: Amaga els multimèdia marcats com a sensibles + setting_display_media_hide_all: Sempre oculta tots els multimèdia + setting_display_media_show_all: Mostra sempre els elements multimèdia marcats com a sensibles setting_hide_network: Qui tu segueixes i els que et segueixen a tu no es mostraran en el teu perfil setting_noindex: Afecta el teu perfil públic i les pàgines d'estat setting_theme: Afecta l'aspecte de Mastodon quan es visita des de qualsevol dispositiu. + username: El teu nom d'usuari serà únic a %{domain} + whole_word: Quan la paraula clau o la frase sigui només alfanumèrica, s'aplicarà si coincideix amb la paraula sencera imports: data: Fitxer CSV exportat des de una altra instància de Mastodon sessions: @@ -50,6 +53,7 @@ ca: expires_in: Expira després fields: Metadades del perfil header: Capçalera + inbox_url: URL de la safata d'entrada del relay irreversible: Cau en lloc d'ocultar locale: Llengua de la interfície locked: Fes aquest compte privat @@ -65,6 +69,11 @@ ca: setting_default_privacy: Privacitat de les publicacions setting_default_sensitive: Marca sempre els elements multimèdia com a sensibles setting_delete_modal: Mostra la finestra de confirmació abans de suprimir un toot + setting_display_media: Visualització multimèdia + setting_display_media_default: Per defecte + setting_display_media_hide_all: Amaga-ho tot + setting_display_media_show_all: Mostra-ho tot + setting_expand_spoilers: Sempre amplia els toots marcats amb advertències de contingut setting_hide_network: Amaga la teva xarxa setting_noindex: Desactivació de la indexació del motor de cerca setting_reduce_motion: Redueix el moviment en animacions @@ -75,6 +84,7 @@ ca: type: Importa el tipus username: Nom d'usuari username_or_email: Nom d'usuari o adreça electrònica + whole_word: Paraula sencera interactions: must_be_follower: Blocar les notificacions de persones que no et segueixen must_be_following: Bloca les notificacions de persones que no segueixes @@ -86,6 +96,7 @@ ca: follow_request: Envia un correu electrònic si algú sol·licita seguir-te mention: Envia un correu electrònic si algú et menciona reblog: Envia un correu electrònic si algú comparteix el teu estat + report: Envia un correu electrònic quan s'enviï un nou informe 'no': 'No' required: mark: "*" diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml index 6f1630e6a..b200dfb48 100644 --- a/config/locales/simple_form.co.yml +++ b/config/locales/simple_form.co.yml @@ -4,28 +4,28 @@ co: hints: defaults: autofollow: Quelli·e chì s'arregistranu cù l'invitazione saranu autumaticamente abbunati·e à voi - avatar: Furmatu PNG, GIF o JPG. 2Mo o menu. Sarà ridottu à %{dimensions}px + avatar: Furmatu PNG, GIF o JPG. %{size} o menu. Sarà ridottu à %{dimensions}px bot: Stu contu hè autumatizatu è ùn hè forse micca survegliatu context: Cuntestu·i induve u filtru deve esse applicatu digest: Solu mandatu dopu à una longa perioda d’inattività, è solu s’elli ci sò novi missaghji diretti - display_name: - one: Ci ferma <span class="name-counter">1</span> caratteru - other: Ci fermanu <span class="name-counter">%{count}</span> caratteri + email: Avete da riceve un'e-mail di cunfirmazione fields: Pudete avè fin’à 4 elementi mustrati cum’un tavulone nant’à u vostru prufile - header: Furmatu PNG, GIF o JPG. 2Mo o menu. Sarà ridottu à %{dimensions}px + header: Furmatu PNG, GIF o JPG. %{size} o menu. Sarà ridottu à %{dimensions}px inbox_url: Cupiate l'URL di a pagina d'accolta di u ripetitore chì vulete utilizà irreversible: I statuti filtrati saranu sguassati di manera irreversibile, ancu s'ellu hè toltu u filtru locale: A lingua di l'interfaccia utilizatore, di l'e-mail è di e nutificazione push locked: Duvarete appruvà e dumande d’abbunamentu - note: - one: Ci ferma <span class="name-counter">1</span> caratteru - other: Ci fermanu <span class="name-counter">%{count}</span> caratteri + password: Ci volenu almenu 8 caratteri phrase: Sarà trovu senza primura di e maiuscule o di l'avertimenti scopes: L'API à quelle l'applicazione averà accessu. S'è voi selezziunate un parametru d'altu livellu, un c'hè micca bisognu di selezziunà quell'individuali. setting_default_language: A lingua di i vostri statuti pò esse induvinata autumaticamente, mà ùn marchja micca sempre bè + setting_display_media_default: Piattà i media marcati cum'è sensibili + setting_display_media_hide_all: Sempre piattà tutti i media + setting_display_media_show_all: Sempre affissà i media marcati cum'è sensibili setting_hide_network: I vostri abbunati è abbunamenti ùn saranu micca mustrati nant’à u vostru prufile setting_noindex: Tocca à u vostru prufile pubblicu è i vostri statuti setting_theme: Tocca à l’apparenza di Mastodon quandu site cunnettatu·a da qualch’apparechju. + username: U vostru cugnome sarà unicu nant'à %{domain} whole_word: Quandu a parolla o a frasa sana hè alfanumerica, sarà applicata solu s'ella currisponde à a parolla sana imports: data: Un fugliale CSV da un’altr’istanza di Mastodon @@ -69,6 +69,11 @@ co: setting_default_privacy: Cunfidenzialità di i statuti setting_default_sensitive: Sempre cunsiderà media cum’è sensibili setting_delete_modal: Mustrà une cunfirmazione per toglie un statutu + setting_display_media: Affissera di i media + setting_display_media_default: Predefinitu + setting_display_media_hide_all: Piattà tuttu + setting_display_media_show_all: Affissà tuttu + setting_expand_spoilers: Sempre slibrà i statutu marcati cù un'avertimentu CW setting_hide_network: Piattà a vostra rete setting_noindex: Dumandà à i motori di ricerca internet d’un pudè micca esse truvatu·a cusì setting_reduce_motion: Fà chì l’animazione vanu più pianu diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml index dbff52644..c2fd93ee1 100644 --- a/config/locales/simple_form.cs.yml +++ b/config/locales/simple_form.cs.yml @@ -8,24 +8,24 @@ cs: bot: Tento účet provádí hlavně automatizované akce a nemusí být spravován context: Jedno či více kontextů, ve kterých má být filtr uplatněn digest: Odesíláno pouze po dlouhé době nečinnosti a pouze, pokud jste při své nepřítomnosti obdržel/a osobní zprávy - display_name: - one: Zbývá <span class="name-counter">1</span> znak - other: Zbývá vám <span class="name-counter">%{count}</span> znaků + email: Bude vám poslán potvrzovací e-mail fields: Na profilu můžete mít až 4 položky zobrazené jako tabulka header: PNG, GIF či JPG. Maximálně %{size}. Bude zmenšena na %{dimensions} px inbox_url: Zkopírujte URL z hlavní stránky mostu, který chcete použít irreversible: Filtrované tooty nenávratně zmizí, i pokud bude filtr později odstraněn locale: Jazyk uživatelského rozhraní, e-mailů a oznámení push locked: Vyžaduje manuální schvalování sledovatelů - note: - one: Zbývá <span class="note-counter">1</span>znak - other: Zbývá <span class="note-counter">%{count}</span> znaků + password: Použijte alespoň 8 znaků phrase: Shoda bude nalezena bez ohledu na velikost písmen v těle tootu či varování o obsahu scopes: Které API bude aplikace povolena používat. Pokud vyberete rozsah nejvyššího stupně, nebudete je muset vybírat po jednom. setting_default_language: Jazyk vašich tootů může být detekován automaticky, není to však vždy přesné + setting_display_media_default: Skrývat média označená jako citlivá + setting_display_media_hide_all: Vždy skrývat všechna média + setting_display_media_show_all: Vždy zobrazovat média označená jako citlivá setting_hide_network: Koho sledujete a kdo sleduje vás nebude zobrazeno na vašem profilu setting_noindex: Ovlivňuje váš veřejný profil a stránky příspěvků setting_theme: Ovlivňuje jak Mastodon vypadá, jste-li přihlášen na libovolném zařízení. + username: Vaše uživatelské jméno bude na %{domain} unikátní whole_word: Je-li klíčové slovo či fráze pouze alfanumerická, bude aplikována pouze, pokud se shoduje s celým slovem imports: data: Soubor CSV exportován z jiné instance Mastodon @@ -69,6 +69,11 @@ cs: setting_default_privacy: Soukromí příspěvků setting_default_sensitive: Vždy označovat média jako citlivá setting_delete_modal: Zobrazovat před smazáním tootu potvrzovací okno + setting_display_media: Zobrazování médií + setting_display_media_default: Výchozí + setting_display_media_hide_all: Skrýt vše + setting_display_media_show_all: Zobrazit vše + setting_expand_spoilers: Vždy rozbalit tooty označené varováními o obsahu setting_hide_network: Skrýt svou síť setting_noindex: Neindexovat svůj profil vyhledávači setting_reduce_motion: Redukovat pohyb v animacích diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml index 5a301f775..d3f9cb340 100644 --- a/config/locales/simple_form.cy.yml +++ b/config/locales/simple_form.cy.yml @@ -4,47 +4,48 @@ cy: hints: defaults: autofollow: Bydd pobl sy'n cofrestru drwy'r gwahoddiad yn eich dilyn yn awtomatig - avatar: PNG, GIF neu JPG. %{size} ar y mwyaf. Ceith ei israddio i %{dimensions}px - bot: Mae'r cyfrif hwn yn perfformio gweithredoedd awtomataidd yn bennaf ac mae'n bosib nad yw'n cael ei fonitro + avatar: PNG, GIF neu JPG. %{size} ar y mwyaf. Caiff ei israddio i %{dimensions}px + bot: Mae'r cyfrif hwn yn perfformio gweithredoedd awtomatig yn bennaf ac mae'n bosib nad yw'n cael ei fonitro context: Un neu fwy cyd-destun lle dylai'r hidlydd weithio - digest: Dim ond yn cael eu hanfon ar ôl cyfnod hir o anweithgarwch ac ond os ydych wedi derbyn unrhyw negeseuon personol yn eich absenoldeb - display_name: - one: <span class="name-counter">1</span> nodyn ar ôl - other: <span class="name-counter">%{count}</span> nodyn ar ôl + digest: Ond yn cael eu hanfon ar ôl cyfnod hir o anweithgarwch ac ond os ydych wedi derbyn unrhyw negeseuon personol yn eich absenoldeb + email: Byddwch yn derbyn e-bost i gadarnhau fields: Mae modd i chi arddangos hyd at 4 eitem fel tabl ar eich proffil header: PNG, GIF neu JPG. %{size} ar y mwyaf. Ceith ei israddio i %{dimensions}px inbox_url: Copïwch yr URL o dudalen flaen y relái yr ydych am ei ddefnyddio irreversible: Bydd tŵtiau wedi eu hidlo yn diflannu am byth, hyd yn oed os ceith yr hidlydd ei ddileu'n hwyrach locale: Iaith y rhyngwyneb, e-byst a hysbysiadau push - locked: Ei wneud yn ofynnol arnoch chi i ganiatau dilynwyr a llaw - note: - one: <span class="note-counter">1</span> cymeriad ar ôl - other: <span class="note-counter">%{count}</span> o gymeriadau ar ôl + locked: Ei wneud yn ofynnol i chi i ganiatau dilynwyr a llaw + password: Defnyddiwch oleiaf 8 nodyn + phrase: Caiff ei gyfateb heb ystyriaeth o briflythrennu mewn testun neu rhybudd ynghylch cynnwys tŵt scopes: Pa APIau y bydd gan y rhaglen ganiatad i gael mynediad iddynt. Os dewiswch maes lefel uchaf, yna nid oes angen dewis rhai unigol. setting_default_language: Mae modd adnabod iaith eich tŵtiau yn awtomatig, ond nid yw bob tro'n gywir - setting_hide_network: Ni fydd pwy yr ydych yn ei ddilyn a phwy sy'n eich dilyn chi yn cael ei ddangos ar eich proffil + setting_display_media_default: Cuddio cyfryngau wedi eu marcio'n sensitif + setting_display_media_hide_all: Cuddio cyfryngau bob tro + setting_display_media_show_all: Dangos cyfryngau wedi eu marcio'n sensitif bob tro + setting_hide_network: Ni fydd y rheini yr ydych yn eu dilyn a phwy sy'n eich dilyn chi yn cael ei ddangos ar eich proffil setting_noindex: Mae hyn yn effeithio ar eich proffil cyhoeddus a'ch tudalennau statws - setting_theme: Mae hyn yn effeithio ar sut olwg sydd ar Matododn pan yr ydych wedi mewngofnodi o unrhyw ddyfais. + setting_theme: Mae hyn yn effeithio ar sut olwg sydd ar Matododon pan yr ydych wedi mewngofnodi o unrhyw ddyfais. + username: Bydd eich enw defnyddiwr yn unigryw ar %{domain} whole_word: Os yw'r allweddair neu'r ymadrodd yn alffaniwmerig yn unig, mi fydd ond yn cael ei osod os yw'n cyfateb a'r gair cyfan imports: - data: Allforiwyd dogfen CSV o INSTANCE Mastodon arall + data: Allforiwyd dogfen CSV o achos Mastodon arall sessions: - otp: 'Mewnbynnwch y côd dau gam a gynhyrchwyd gan eich ap ffôn neu defnyddiwch un o''ch codau adfer:' + otp: 'Mewnbynnwch y cod dau gam a gynhyrchwyd gan eich ap ffôn neu defnyddiwch un o''ch codau adfer:' user: - chosen_languages: Wedi ei ddethol, dim ond tŵtiau mewn ieithoedd dewisiedig bydd yn cael eu harddangos mewn ffrydiau cyhoeddus + chosen_languages: Wedi eu dewis, dim ond tŵtiau yn yr ieithoedd hyn bydd yn cael eu harddangos mewn ffrydiau cyhoeddus labels: account: fields: name: Label value: Cynnwys defaults: - autofollow: Gwahoddwch i ddilyn eich cyfrif + autofollow: Gwahodd i ddilyn eich cyfrif avatar: Afatar bot: Cyfrif bot yw hwn - chosen_languages: Hidlwch ieithoedd - confirm_new_password: Cadarnhewch gyfrinair newydd + chosen_languages: Hidlo ieithoedd + confirm_new_password: Cadarnhau cyfrinair newydd confirm_password: Cadarnhau cyfrinair - context: Hidlwch cyd-destunau + context: Hidlo cyd-destunau current_password: Cyfrinair presennol data: Data display_name: Enw arddangos @@ -58,35 +59,44 @@ cy: locked: Cloi cyfrif max_uses: Uchafswm y nifer o ddefnyddiau new_password: Cyfrinair newydd + note: Bywgraffiad otp_attempt: Côd dau gam password: Cyfrinair phrase: Allweddair neu ymadrodd + setting_auto_play_gif: Chwarae GIFs wedi'u hanimeiddio yn awtomatig + setting_boost_modal: Dangos deialog cadarnhad cyn bŵstio setting_default_language: Cyhoeddi iaith setting_default_privacy: Cyfrinachedd cyhoeddi - setting_default_sensitive: Marciwch cyfryngau fel ei fod yn sensitif bob tro - setting_delete_modal: Dangoswch ddeialog cadarnhau cyn dileu tŵt - setting_hide_network: Cuddiwch eich rhwydwaith - setting_reduce_motion: '' - setting_system_font_ui: Defnyddiwch ffont rhagosodedig y system + setting_default_sensitive: Marcio cyfryngau fel eu bod yn sensitif bob tro + setting_delete_modal: Dangos deialog cadarnhau cyn dileu tŵt + setting_display_media: Arddangos cyfryngau + setting_display_media_default: Rhagosodiad + setting_display_media_hide_all: Cuddio oll + setting_display_media_show_all: Dangos oll + setting_expand_spoilers: Ymestyn tŵtiau wedi'u marcio a rhybudd cynnwys bob tro + setting_hide_network: Cuddio eich rhwydwaith + setting_noindex: Dewis peidio mynegeio peiriant chwilota + setting_reduce_motion: Lleihau mudiant mewn animeiddiadau + setting_system_font_ui: Defnyddio ffont rhagosodedig y system setting_theme: Thema'r wefan - setting_unfollow_modal: Dangoswch ddeialog cadarnhau cyn dad-ddilyn rhywun + setting_unfollow_modal: Dangos deialog cadarnhau cyn dad-ddilyn rhywun severity: Difrifoldeb type: Modd mewnforio username: Enw defnyddiwr username_or_email: Enw defnyddiwr neu e-bost whole_word: Gair cyfan interactions: - must_be_follower: Blociwch hysbysiadau o bobl nad ydynt yn eich dilyn - must_be_following: Blociwch hysbysiadau o bobl nad ydych yn eu dilyn - must_be_following_dm: Blociwch negeseuon uniongyrchol o bobl nad ydych yn eu dilyn + must_be_follower: Blocio hysbysiadau o bobl nad ydynt yn eich dilyn + must_be_following: Blocio hysbysiadau o bobl nad ydych yn eu dilyn + must_be_following_dm: Blocio negeseuon uniongyrchol o bobl nad ydych yn eu dilyn notification_emails: digest: Anfonwch e-byst crynhoi - favourite: Anfonwch e-bost pan mae rhywun yn ffefrynnu eich statws - follow: Anfonwch e-bost pan mae rhywun yn eich dilyn chi - follow_request: Anfonwch e-bost pan mae rhywun yn gofyn i chi i'w dilyn - mention: Anfonwch e-bost pan mae rhywun yn eich crybwyll - reblog: Anfonwch e-bost pan mae rhywun yn bŵstio eich statws - report: Anfonwch e-bost pan y cyflwynir adroddiad newydd + favourite: Anfon e-bost pan mae rhywun yn ffefrynnu eich statws + follow: Anfon e-bost pan mae rhywun yn eich dilyn chi + follow_request: Anfon e-bost pan mae rhywun yn gofyn i chi i'w dilyn + mention: Anfon e-bost pan mae rhywun yn eich crybwyll + reblog: Anfon e-bost pan mae rhywun yn bŵstio eich statws + report: Anfon e-bost pan y cyflwynir adroddiad newydd 'no': Na required: mark: "*" diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml index 7550122fc..1063466ca 100644 --- a/config/locales/simple_form.da.yml +++ b/config/locales/simple_form.da.yml @@ -8,18 +8,14 @@ da: bot: Denne konto udfører hovedsageligt automatiserede handlinger og bliver muligvis ikke overvåget context: En eller flere sammenhænge hvor filteret skal være gældende digest: Sendes kun efter en lang periode med inaktivitet og kun hvis du har modtaget nogle personlige beskeder mens du er væk - display_name: - one: <span class="name-counter">1</span> tegn tilbage - other: <span class="name-counter">%{count}</span>tegn tilbage + email: Du vil få tilsendt en bekræftelsed mail fields: Du kan have op til 4 ting vist som en tabel på din profil header: PNG, GIF eller JPG. Højest %{size}. Vil blive skaleret ned til %{dimensions}px inbox_url: Kopiere linket fra forsiden af den relay som du ønsker at bruge irreversible: Filtrerede trut vil forsvinde fulstændigt, selv hvis filteret senere skulle blive fjernet locale: Sproget på interfacet, emails og push beskeder locked: Kræver, at du godkender følgere manuelt - note: - one: <span class="note-counter">1</span> tegn tilbage - other: <span class="note-counter">%{count}</span> tegn tilbage + password: Brug mindst 8 tegn phrase: Vil blive parret uanset om der er store eller små bogstaver i teksten eller om der er en advarsel om et trut scopes: Hvilke APIs applikationen vil få adgang til. Hvis du vælger et højtlevel omfang, behøver du ikke vælge enkeltstående. setting_default_language: Sproget for dine trut kan blive fundet automatisk, men det er ikke altid præcist diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml index e13eece79..9c2defd9e 100644 --- a/config/locales/simple_form.de.yml +++ b/config/locales/simple_form.de.yml @@ -4,28 +4,28 @@ de: hints: defaults: autofollow: Leute die sich über deine Einladung registrieren werden dir automatisch folgen - avatar: PNG, GIF oder JPG. Maximal %{size}. Wird auf 400×400 px herunterskaliert + avatar: PNG, GIF oder JPG. Maximal %{size}. Wird auf %{dimensions} px herunterskaliert bot: Dieses Konto führt lediglich automatisierte Aktionen durch und wird möglicherweise nicht überwacht context: Ein oder mehrere Aspekte, wo der Filter greifen soll digest: Wenn du lange Zeit inaktiv bist, wird dir eine Zusammenfassung von Erwähnungen in deiner Abwesenheit zugeschickt - display_name: - one: <span class="name-counter">1</span> Zeichen verbleibt - other: <span class="name-counter">%{count}</span> Zeichen verbleiben + email: Du wirst ein Bestätigungs-E-Mail erhalten fields: Du kannst bis zu 4 Elemente als Tabelle dargestellt auf deinem Profil anzeigen lassen - header: PNG, GIF oder JPG. Maximal %{size}. Wird auf 700×335 px herunterskaliert + header: PNG, GIF oder JPG. Maximal %{size}. Wird auf %{dimensions} px herunterskaliert inbox_url: Kopiere die URL von der Startseite des gewünschten Relays irreversible: Gefilterte Beiträge werden unwiderruflich gefiltert, selbst wenn der Filter später entfernt wurde locale: Die Sprache der Oberfläche, E-Mails und Push-Benachrichtigungen locked: Wer dir folgen möchte, muss um deine Erlaubnis bitten - note: - one: <span class="note-counter">1</span> Zeichen verbleibt - other: <span class="note-counter">%{count}</span> Zeichen verbleiben + password: Verwende mindestens 8 Zeichen phrase: Wird unabhängig vom umgebenen Text oder Inhaltswarnung eines Beitrags verglichen scopes: Welche Schnittstellen der Applikation erlaubt sind. Wenn du einen Top-Level-Scope auswählst, dann musst du nicht jeden einzelnen darunter auswählen. setting_default_language: Die Sprache der Beiträge kann automatisch erkannt werden, aber dies ist nicht immer genau + setting_display_media_default: Verstecke Medien, die als sensibel markiert sind + setting_display_media_hide_all: Alle Medien immer verstecken + setting_display_media_show_all: Medien, die als sensibel markiert sind, immer anzeigen setting_hide_network: Wem du folgst und wer dir folgt wird in deinem Profil nicht angezeigt setting_noindex: Betrifft dein öffentliches Profil und deine Beiträge setting_theme: Wirkt sich darauf aus, wie Mastodon aussieht, egal auf welchem Gerät du eingeloggt bist. + username: Dein Benutzer:innen-Name wird auf %{domain} nur einmal vorkommen whole_word: Wenn das Schlüsselwort oder -phrase nur Buchstaben und Zahlen enthält, wird es nur angewendet werden, wenn es dem ganzen Wort entspricht imports: data: CSV-Datei, die aus einer anderen Mastodon-Instanz exportiert wurde @@ -69,6 +69,11 @@ de: setting_default_privacy: Beitragssichtbarkeit setting_default_sensitive: Medien immer als heikel markieren setting_delete_modal: Bestätigungsdialog anzeigen, bevor ein Beitrag gelöscht wird + setting_display_media: Medien-Anzeige + setting_display_media_default: Standard + setting_display_media_hide_all: Alle verstecken + setting_display_media_show_all: Alle anzeigen + setting_expand_spoilers: Toots mit Inhaltswarnungen immer ausklappen setting_hide_network: Blende dein Netzwerk aus setting_noindex: Suchmaschinen-Indexierung verhindern setting_reduce_motion: Bewegung in Animationen verringern diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml index 96a7547e4..a13b44237 100644 --- a/config/locales/simple_form.el.yml +++ b/config/locales/simple_form.el.yml @@ -8,24 +8,24 @@ el: bot: Ο λογαριασμός αυτός εκτελεί κυρίως αυτοματοποιημένες ενέργειες και ίσως να μην παρακολουθείται context: Ένα ή περισσότερα πλαίσια στα οποία μπορεί να εφαρμόζεται αυτό το φίλτρο digest: Αποστέλλεται μόνο μετά από μακρά περίοδο αδράνειας και μόνο αν έχεις λάβει προσωπικά μηνύματα κατά την απουσία σου - display_name: - one: απομένει <span class="name-counter">1</span> χαρακτήρας - other: απομένουν <span class="name-counter">%{count}</span> χαρακτήρες + email: Θα σου σταλεί email επιβεβαίωσης fields: Μπορείς να έχεις έως 4 σημειώσεις σε μορφή πίνακα στο προφίλ σου header: PNG, GIF ή JPG. Έως %{size}. Θα περιοριστεί σε διάσταση %{dimensions}px inbox_url: Αντέγραψε το URL της αρχικής σελίδας του ανταποκριτή (relay) που θέλεις να χρησιμοποιήσεις irreversible: Τα φιλτραρισμένα τουτ θα εξαφανιστούν αμετάκλητα, ακόμα και αν το φίλτρο αργότερα αφαιρεθεί locale: Η γλώσσα του περιβάλλοντος χρήσης, των email και των ειδοποιήσεων ώθησης locked: Απαιτεί να εγκρίνεις χειροκίνητα τους ακόλουθούς σου - note: - one: απομένει <span class="note-counter">1</span> χαρακτήρας - other: απομένουν <span class="note-counter">%{count}</span> χαρακτήρες + password: Χρησιμοποίησε τουλάχιστον 8 χαρακτήρες phrase: Θα ταιριάζει ανεξαρτήτως πεζών/κεφαλαίων ή προειδοποίησης περιεχομένου του τουτ scopes: Ποια API θα επιτρέπεται στην εφαρμογή να χρησιμοποιήσεις. Αν επιλέξεις κάποιο υψηλό εύρος εφαρμογής, δε χρειάζεται να επιλέξεις και εξειδικευμένα. setting_default_language: Η γλώσσα των τουτ σου μπορεί να ανιχνευτεί αυτόματα αλλά δεν είναι πάντα ακριβές + setting_display_media_default: Απόκρυψη ευαίσθητων πολυμέσων + setting_display_media_hide_all: Μόνιμη απόκρυψη όλων των πολυμέσων + setting_display_media_show_all: Μόνιμη εμφάνιση ευαίσθητων πολυμέσων setting_hide_network: Δε θα εμφανίζεται στο προφίλ σου ποιους ακολουθείς και ποιοι σε ακολουθούν setting_noindex: Επηρεάζει το δημόσιο προφίλ και τις δημοσιεύσεις σου setting_theme: Επηρεάζει την εμφάνιση του Mastodon όταν συνδέεται από οποιαδήποτε συσκευή. + username: Το όνομα χρήστη σου θα είναι μοναδικό στο %{domain} whole_word: Όταν η λέξη ή η φράση κλειδί είναι μόνο αλφαριθμητική, θα εφαρμοστεί μόνο αν ταιριάζει με ολόκληρη τη λέξη imports: data: Αρχείο CSV που έχει εξαχθεί από διαφορετικό κόμβο Mastodon @@ -69,6 +69,11 @@ el: setting_default_privacy: Ιδιωτικότητα δημοσιεύσεων setting_default_sensitive: Σημείωνε πάντα τα πολυμέσα ως ευαίσθητου περιεχομένου setting_delete_modal: Εμφάνιση ερώτησης επιβεβαίωσης πριν διαγράψεις ένα τουτ + setting_display_media: Εμφάνιση πολυμέσων + setting_display_media_default: Προκαθορισμένο + setting_display_media_hide_all: Απόκρυψη όλων + setting_display_media_show_all: Εμφάνιση όλων + setting_expand_spoilers: Μόνιμη ανάπτυξη των τουτ με προειδοποίηση περιεχομένου setting_hide_network: Κρύψε τις διασυνδέσεις σου setting_noindex: Επέλεξε να μην συμμετέχεις στα αποτελέσματα μηχανών αναζήτησης setting_reduce_motion: Μείωση κίνησης κινουμένων στοιχείων diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index b25ff26f4..e37952923 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -8,9 +8,6 @@ en: bot: This account mainly performs automated actions and might not be monitored context: One or multiple contexts where the filter should apply digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence - display_name: - one: <span class="name-counter">1</span> character left - other: <span class="name-counter">%{count}</span> characters left email: You will be sent a confirmation e-mail fields: You can have up to 4 items displayed as a table on your profile header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px @@ -18,9 +15,6 @@ en: irreversible: Filtered toots will disappear irreversibly, even if filter is later removed locale: The language of the user interface, e-mails and push notifications locked: Requires you to manually approve followers - note: - one: <span class="note-counter">1</span> character left - other: <span class="note-counter">%{count}</span> characters left password: Use at least 8 characters phrase: Will be matched regardless of casing in text or content warning of a toot scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones. diff --git a/config/locales/simple_form.en_GB.yml b/config/locales/simple_form.en_GB.yml index 0967ef424..d9e1a256f 100644 --- a/config/locales/simple_form.en_GB.yml +++ b/config/locales/simple_form.en_GB.yml @@ -1 +1,2 @@ +--- {} diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml index 36f26035f..e8ddc075e 100644 --- a/config/locales/simple_form.eo.yml +++ b/config/locales/simple_form.eo.yml @@ -8,18 +8,12 @@ eo: bot: Tiu konto ĉefe faras aŭtomatajn agojn, kaj povas esti ne kontrolata context: Unu ol pluraj kuntekstoj kie la filtrilo devus agi digest: Sendita nur post longa tempo de neaktiveco, kaj nur se vi ricevis personan mesaĝon en via foresto - display_name: - one: <span class="name-counter">1</span> signo restas - other: <span class="name-counter">%{count}</span> signoj restas fields: Vi povas havi ĝis 4 tabelajn elementojn en via profilo header: Formato PNG, GIF aŭ JPG. Ĝis %{size}. Estos malgrandigita al %{dimensions}px inbox_url: Kopiu la URL de la ĉefpaĝo de la ripetilo, kiun vi volas uzi irreversible: Elfiltritaj mesaĝoj malaperos por ĉiam, eĉ se la filtrilo estas poste forigita locale: La lingvo de la uzant-interfaco, retmesaĝoj kaj puŝ-sciigoj locked: Vi devos aprobi ĉiun peton de sekvado mane - note: - one: <span class="note-counter">1</span> signo restas - other: <span class="note-counter">%{count}</span> signoj restas phrase: Estos provita senzorge pri la uskleco de teksto aŭ averto pri enhavo de mesaĝo setting_default_language: La lingvo de viaj mesaĝoj povas esti aŭtomate detektitaj, sed tio ne ĉiam ĝustas setting_hide_network: Tiuj, kiujn vi sekvas, kaj tiuj, kiuj sekvas vin ne estos videblaj en via profilo diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml index 8c528144e..c0d72dc27 100644 --- a/config/locales/simple_form.es.yml +++ b/config/locales/simple_form.es.yml @@ -8,18 +8,12 @@ es: bot: Esta cuenta ejecuta principalmente acciones automatizadas y podría no ser monitorizada context: Uno o múltiples contextos en los que debe aplicarse el filtro digest: Solo enviado tras un largo periodo de inactividad y solo si has recibido mensajes personales durante tu ausencia - display_name: - one: <span class="name-counter">1</span> caracter restante - other: <span class="name-counter">%{count}</span> caracteres restantes fields: Puedes tener hasta 4 elementos mostrándose como una tabla en tu perfil header: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px inbox_url: Copia la URL de la página principal del relés que quieres utilizar irreversible: Los toots filtrados desaparecerán irreversiblemente, incluso si este filtro es eliminado más adelante locale: El idioma de la interfaz de usuario, correos y notificaciones push locked: Requiere que manualmente apruebes seguidores y las publicaciones serán mostradas solamente a tus seguidores - note: - one: <span class="name-counter">1</span> carácter restante - other: <span class="name-counter">%{count}</span> caracteres restantes phrase: Se aplicará sin importar las mayúsculas o los avisos de contenido de un toot scopes: Qué APIs de la aplicación tendrán acceso. Si seleccionas el alcance de nivel mas alto, no necesitas seleccionar las individuales. setting_default_language: El idioma de tus toots podrá detectarse automáticamente, pero no siempre es preciso diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml index 7fa8319ae..b510370a3 100644 --- a/config/locales/simple_form.eu.yml +++ b/config/locales/simple_form.eu.yml @@ -8,24 +8,24 @@ eu: bot: Kontu honek nagusiki automatizatutako ekintzak burutzen ditu eta agian ez du inork monitorizatzen context: Iragazkia aplikatzeko testuinguru bat edo batzuk digest: Soilik jarduerarik gabeko epe luze bat eta gero, eta soilik ez zeudela mezu pertsonalen bat jaso baduzu - display_name: - one: Karaktere <span class="name-counter">1</span> geratzen da - other: <span class="name-counter">%{count}</span> karaktere geratzen dira + email: Baieztapen e-mail bat bidaliko zaizu fields: 4 elementu bistaratu ditzakezu taula batean zure profilean header: PNG, GIF edo JPG. Gehienez %{size}. %{dimensions}px eskalara txikituko da inbox_url: Kopiatu erabili nahi duzun errelearen hasiera orriaren URLa irreversible: Iragazitako toot-ak betirako galduko dira, geroago iragazkia kentzen baduzu ere locale: Erabiltzaile-interfazea, e-mail mezuen eta jakinarazpenen hizkuntza locked: Jarraitzaileak eskuz onartu behar dituzu - note: - one: Karaktere<span class="note-counter">1</span> geratzen da - other: <span class="note-counter"> %{count}</span> karaktere geratzen dira + password: Erabili 8 karaktere gutxienez phrase: Bat egingo du Maiuskula/minuskula kontuan hartu gabe eta edukiaren abisua kontuan hartu gabe scopes: Zeintzuk API atzitu ditzakeen aplikazioak. Goi mailako arloa aukeratzen baduzu, ez dituzu azpikoak aukeratu behar. setting_default_language: Zure toot-en hizkuntza automatikoki antzeman daiteke, baina ez da beti zehatza + setting_display_media_default: Ezkutatu hunkigarri gisa markatutako multimedia + setting_display_media_hide_all: Ezkutatu multimedia guztia beti + setting_display_media_show_all: Erakutsi beti hunkigarri gisa markatutako multimedia setting_hide_network: Nor jarraitzen duzun eta nork jarraitzen zaituen ez da bistaratuko zure profilean setting_noindex: Zure profil publiko eta toot orrietan eragina du setting_theme: Edozein gailutik konektatzean Mastodon-en itxuran eragiten du. + username: Zure erabiltzaile-izena bakana izango da %{domain} domeinuan whole_word: Hitz eta esaldi gakoa alfanumerikoa denean, hitz osoarekin bat datorrenean besterik ez da aplikatuko imports: data: Beste Mastodon instantzia batetik esportatutako CSV fitxategia @@ -69,6 +69,11 @@ eu: setting_default_privacy: Mezuen pribatutasuna setting_default_sensitive: Beti markatu edukiak hunkigarri gisa setting_delete_modal: Erakutsi baieztapen elkarrizketa-koadroa toot bat ezabatu aurretik + setting_display_media: Multimedia bistaratzea + setting_display_media_default: Lehenetsia + setting_display_media_hide_all: Ezkutatu guztia + setting_display_media_show_all: Erakutsi guztia + setting_expand_spoilers: Hedatu beti edukia abisua (CW) duten tootak setting_hide_network: Ezkutatu zure sarea setting_noindex: Atera bilaketa motorraren indexaziotik setting_reduce_motion: Murriztu animazioen mugimenduak diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml index 418b308b1..2f9c80dbe 100644 --- a/config/locales/simple_form.fa.yml +++ b/config/locales/simple_form.fa.yml @@ -8,24 +8,24 @@ fa: bot: این حساب بیشتر به طور خودکار فعالیت میکند و نظارت پیوستهای روی آن وجود ندارد context: یک یا چند زمینه که فیلتر باید در آنها اعمال شود digest: تنها وقتی فرستاده میشود که مدتی طولانی فعالیتی نداشته باشید و در این مدت برای شما پیغام خصوصیای نوشته شده باشد - display_name: - one: <span class="name-counter">1</span> حرف باقی مانده - other: <span class="name-counter">%{count}</span> حرف باقی مانده + email: به شما ایمیل تأییدی فرستاده خواهد شد fields: شما میتوانید تا چهار مورد را در یک جدول در نمایهٔ خود نمایش دهید header: یکی از قالبهای PNG یا GIF یا JPG. بیشترین اندازه %{size}. تصویر به اندازهٔ %{dimensions} پیکسل تبدیل خواهد شد inbox_url: نشانی صفحهٔ اصلی رلهای را که میخواهید به کار ببرید کپی کنید irreversible: بوقهای فیلترشده به طور برگشتناپذیری ناپدید میشوند، حتی اگر فیلتر را بعداً بردارید locale: زبان محیط کاربری، ایمیلها، و اعلانها locked: باید پیگیران تازه را خودتان تأیید کنید - note: - one: <span class="note-counter">1</span> حرف باقی مانده - other: <span class="note-counter">%{count}</span> حرف باقی مانده + password: دستکم باید ۸ نویسه داشته باشد phrase: مستقل از کوچکی و بزرگی حروف، با متن اصلی یا هشدار محتوای بوقها مقایسه میشود scopes: واسطهای برنامهنویسی که این برنامه به آن دسترسی دارد. اگر بالاترین سطح دسترسی را انتخاب کنید، دیگر نیازی به انتخاب سطحهای پایینی ندارید. - setting_default_language: زبان نوشتههای شما به طور خودکار تشخیص داده میشود، ولی این تشخصی همیشه دقیق نیست + setting_default_language: زبان نوشتههای شما به طور خودکار تشخیص داده میشود، ولی این تشخیص همیشه دقیق نیست + setting_display_media_default: تصویرهایی را که به عنوان حساس علامت زده شدهاند پنهان کن + setting_display_media_hide_all: همیشه همهٔ عکسها و ویدیوها را پنهان کن + setting_display_media_show_all: همیشه تصویرهایی را که به عنوان حساس علامت زده شدهاند را نشان بده setting_hide_network: فهرست پیگیران شما و فهرست کسانی که شما پی میگیرید روی نمایهٔ شما دیده نخواهد شد setting_noindex: روی نمایهٔ عمومی و صفحهٔ نوشتههای شما تأثیر میگذارد setting_theme: ظاهر ماستدون را وقتی که از هر دستگاهی به آن وارد میشوید تعیین میکند. + username: نام کاربری شما روی %{domain} یکتا خواهد بود whole_word: اگر کلیدواژه فقط دارای حروف و اعداد باشد، تنها وقتی پیدا میشود که با کل یک واژه در متن منطبق باشد، نه با بخشی از یک واژه imports: data: پروندهٔ CSV که از سرور ماستدون دیگری برونسپاری شده @@ -69,6 +69,11 @@ fa: setting_default_privacy: حریم خصوصی نوشتهها setting_default_sensitive: همیشه تصاویر را به عنوان حساس علامت بزن setting_delete_modal: نمایش پیغام تأیید پیش از پاک کردن یک نوشته + setting_display_media: نمایش عکس و ویدیو + setting_display_media_default: پیشفرض + setting_display_media_hide_all: نهفتن همه + setting_display_media_show_all: نمایش همه + setting_expand_spoilers: همیشه بوقهایی را که هشدار محتوا دارند کامل نشان بده setting_hide_network: نهفتن شبکهٔ ارتباطی setting_noindex: درخواست از موتورهای جستجوگر برای ظاهر نشدن در نتایج جستجو setting_reduce_motion: کاستن از حرکت در پویانماییها diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml index e90bd2e0b..b0f958f2f 100644 --- a/config/locales/simple_form.fi.yml +++ b/config/locales/simple_form.fi.yml @@ -3,17 +3,11 @@ fi: simple_form: hints: defaults: - avatar: PNG, GIF tai JPG. Enintään 2 Mt. Skaalataan kokoon 400 x 400 px + avatar: PNG, GIF tai JPG. Enintään %{size}. Skaalataan kokoon %{dimensions} px digest: Lähetetään vain pitkän poissaolon jälkeen ja vain, jos olet saanut suoria viestejä poissaolosi aikana - display_name: - one: <span class="name-counter">1</span> merkki jäljellä - other: <span class="name-counter">%{count}</span> merkkiä jäljellä fields: Sinulla voi olla korkeintaan 4 asiaa profiilissasi taulukossa - header: PNG, GIF tai JPG. Enintään 2 Mt. Skaalataan kokoon 700 x 335 px + header: PNG, GIF tai JPG. Enintään %{size}. Skaalataan kokoon %{dimensions} px locked: Sinun täytyy hyväksyä seuraajat manuaalisesti - note: - one: <span class="note-counter">1</span> merkki jäljellä - other: <span class="note-counter">%{count}</span> merkkiä jäljellä setting_noindex: Vaikuttaa julkiseen profiiliisi ja tilasivuihisi setting_theme: Vaikuttaa Mastodonin ulkoasuun millä tahansa laitteella kirjauduttaessa. imports: diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml index 1e0c4d3e6..68f5dfede 100644 --- a/config/locales/simple_form.fr.yml +++ b/config/locales/simple_form.fr.yml @@ -4,33 +4,33 @@ fr: hints: defaults: autofollow: Les personnes qui s’inscrivent grâce à l’invitation vous suivront automatiquement - avatar: Au format PNG, GIF ou JPG. 2 Mo maximum. Sera réduit à %{dimensions}px + avatar: Au format PNG, GIF ou JPG. %{size} maximum. Sera réduit à %{dimensions}px bot: Ce compte exécute principalement des actions automatisées et pourrait ne pas être surveillé context: Un ou plusieurs contextes où le filtre devrait s’appliquer digest: Uniquement envoyé après une longue période d’inactivité et uniquement si vous avez reçu des messages personnels pendant votre absence - display_name: - one: <span class="name-counter">1</span> caractère restant - other: <span class="name-counter">%{count}</span> caractères restants + email: Vous recevrez un courriel de confirmation fields: Vous pouvez avoir jusqu’à 4 éléments affichés en tant que tableau sur votre profil - header: Au format PNG, GIF ou JPG. 2 Mo maximum. Sera réduit à %{dimensions}px + header: Au format PNG, GIF ou JPG. %{size} maximum. Sera réduit à %{dimensions}px inbox_url: Copiez l’URL depuis la page d’accueil du relais que vous souhaitez utiliser irreversible: Les pouets filtrés disparaîtront irrémédiablement, même si le filtre est supprimé plus tard locale: La langue de l’interface, des courriels et des notifications locked: Vous devrez approuver chaque abonné⋅e et vos statuts ne s’afficheront qu’à vos abonné⋅es - note: - one: <span class="note-counter">1</span> caractère restant - other: <span class="note-counter">%{count}</span> caractères restants + password: Utilisez au moins 8 caractères phrase: Sera trouvé sans que la case ou l’avertissement de contenu du pouet soit pris en compte scopes: À quelles APIs l’application sera autorisée à accéder. Si vous sélectionnez un périmètre de haut-niveau, vous n’avez pas besoin de sélectionner les individuels. setting_default_language: La langue de vos pouets peut être détectée automatiquement, mais ça n’est pas toujours pertinent + setting_display_media_default: Masquer les supports marqués comme sensibles + setting_display_media_hide_all: Toujours masquer tous les médias + setting_display_media_show_all: Toujours afficher les médias marqués comme sensibles setting_hide_network: Ceux que vous suivez et ceux qui vous suivent ne seront pas affichés sur votre profil setting_noindex: Affecte votre profil public ainsi que vos statuts setting_theme: Affecte l’apparence de Mastodon quand vous êtes connecté·e depuis n’importe quel appareil. + username: Votre nom d’utilisateur sera unique sur %{domain} whole_word: Lorsque le mot-clef ou la phrase-clef est uniquement alphanumérique, ça sera uniquement appliqué s’il correspond au mot entier imports: data: Un fichier CSV généré par une autre instance de Mastodon sessions: - otp: 'Entrez le code d’authentification à deux facteurs généré par l''application de votre téléphone ou utilisez un de vos codes de récupération :' + otp: 'Entrez le code d’authentification à deux facteurs généré par l’application de votre téléphone ou utilisez un de vos codes de récupération :' user: chosen_languages: Lorsque coché, seuls les pouets dans les langues sélectionnées seront affichés sur les fils publics labels: @@ -69,6 +69,11 @@ fr: setting_default_privacy: Confidentialité des statuts setting_default_sensitive: Toujours marquer les médias comme sensibles setting_delete_modal: Afficher une fenêtre de confirmation avant de supprimer un pouet + setting_display_media: Affichage des médias + setting_display_media_default: Défaut + setting_display_media_hide_all: Masquer tout + setting_display_media_show_all: Montrer tout + setting_expand_spoilers: Toujours développer les pouëts marqués d’un avertissement de contenu setting_hide_network: Cacher votre réseau setting_noindex: Demander aux moteurs de recherche de ne pas indexer vos informations personnelles setting_reduce_motion: Réduire la vitesse des animations @@ -91,7 +96,7 @@ fr: follow_request: Envoyer un courriel lorsque quelqu’un demande à me suivre mention: Envoyer un courriel lorsque quelqu’un me mentionne reblog: Envoyer un courriel lorsque quelqu’un partage mes statuts - report: Envoyer un courriel lorsqu'un nouveau rapport est soumis + report: Envoyer un courriel lorsqu’un nouveau rapport est soumis 'no': Non required: mark: "*" diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml index 935545b0e..04a0fffa3 100644 --- a/config/locales/simple_form.gl.yml +++ b/config/locales/simple_form.gl.yml @@ -8,24 +8,24 @@ gl: bot: Esta conta realiza principalmente accións automatizadas e podería non estar monitorizada context: Un ou varios contextos onde se debería aplicar o filtro digest: Enviar só tras un longo período de inactividade e só si recibeu algunha mensaxe personal na súa ausencia - display_name: - one: <span class="name-counter">1</span> caracter restante - other: <span class="name-counter">%{count}</span> caracteres restantes + email: Enviaráselle un correo-e de confirmación fields: Pode ter ate 4 elementos no seu perfil mostrados como unha táboa header: PNG, GIF ou JPG. Máximo %{size}. Será reducida a %{dimensions}px inbox_url: Copiar o URL desde a páxina de inicio do repetidor que quere utilizar irreversible: Os toots filtrados desaparecerán de xeito irreversible, incluso si despois se elimina o filtro locale: O idioma da interface de usuaria, correos e notificacións locked: Require que vostede acepte as seguidoras de xeito manual - note: - one: <span class="note-counter">1</span> caracter restante - other: <span class="note-counter">%{count}</span> caracteres restantes + password: Utilice 8 caracteres ao menos phrase: Concordará independentemente das maiúsculas ou avisos de contido no toot scopes: A que APIs terá acceso a aplicación. Si selecciona un ámbito de alto nivel, non precisa seleccionar elementos individuais. setting_default_language: Pódese detectar automáticamente o idioma dos seus toots, mais non sempre é preciso + setting_display_media_default: Ocultar medios marcados como sensibles + setting_display_media_hide_all: Ocultar sempre os medios + setting_display_media_show_all: Mostrar sempre os medios marcados como sensibles setting_hide_network: Non se mostrará no seu perfil quen a segue e quen a está a seguir setting_noindex: Afecta ao seu perfil público e páxinas de estado setting_theme: Afecta ao aspecto de Mastodon en calquer dispositivo cando está conectada. + username: O seu nome de usuaria será único en %{domain} whole_word: Si a chave ou frase de paso é só alfanumérica, só se aplicará si concorda a palabra completa imports: data: Ficheiro CSV exportado desde outra instancia Mastodon @@ -69,6 +69,11 @@ gl: setting_default_privacy: Intimidade da publicación setting_default_sensitive: Marcar sempre multimedia como sensible setting_delete_modal: Solicitar confirmación antes de eliminar unha mensaxe + setting_display_media: Mostrar medios + setting_display_media_default: Por omisión + setting_display_media_hide_all: Ocultar todo + setting_display_media_show_all: Mostrar todo + setting_expand_spoilers: Despregar sempre as mensaxes marcadas con avisos de contido setting_hide_network: Agochar a súa rede setting_noindex: Pedir non aparecer nas buscas dos motores de busca setting_reduce_motion: Reducir o movemento nas animacións diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml index aa5c7e827..c86498c66 100644 --- a/config/locales/simple_form.he.yml +++ b/config/locales/simple_form.he.yml @@ -5,14 +5,8 @@ he: defaults: avatar: PNG, GIF או JPG. מקסימום %{size}. גודל התמונה יוקטן ל-%{dimensions}px digest: נשלח לאחר תקופה ארוכה של אי-פעילות עם סיכום איזכורים שקיבלת בהעדרך - display_name: - one: נותרה אות<span class="name-counter">אחת</span> - other: נותרו<span class="name-counter">%{count}</span> אותיות header: PNG, GIF או JPG. מקסימום %{size}. גודל התמונה יוקטן %{dimensions}px locked: מחייב אישור עוקבים באופן ידני. פרטיות ההודעות תהיה עוקבים-בלבד אלא אם יצוין אחרת - note: - one: נותרה אות<span class="note-counter">אחת</span> - other: נותרו <span class="note-counter">%{count}</span> אותיות setting_noindex: משפיע על הפרופיל הציבורי שלך ועמודי ההודעות setting_theme: משפיע על המראה של מסטודון בעת החיבור המזוהה מכל מכשיר שהוא. imports: diff --git a/config/locales/simple_form.hr.yml b/config/locales/simple_form.hr.yml index 2b3ebf91e..4b1d2b1e0 100644 --- a/config/locales/simple_form.hr.yml +++ b/config/locales/simple_form.hr.yml @@ -4,10 +4,8 @@ hr: hints: defaults: avatar: PNG, GIF ili JPG. Najviše %{size}. Bit će smanjen na %{dimensions}px - display_name: Najviše 30 znakova header: PNG, GIF ili JPG. Najviše %{size}. Bit će smanjen na %{dimensions}px locked: traži te da ručno odobriš sljedbenike i postavlja privatnost postova na dostupnu samo sljedbenicima - note: Najviše 160 znakova imports: data: CSV fajl izvezen iz druge Mastodon instance labels: diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml index ef915dec5..f36fabda1 100644 --- a/config/locales/simple_form.hu.yml +++ b/config/locales/simple_form.hu.yml @@ -5,14 +5,8 @@ hu: defaults: avatar: PNG, GIF vagy JPG. Maximum %{size}. Át lesz méretezve %{dimensions} pixelre digest: Csak hosszú távollét esetén küldve és csak ha személyes üzenetet kaptál távollétedben - display_name: - one: <span class="name-counter">1</span>karakter maradt - other: <span class="name-counter">%{count}</span>karakter maradt header: PNG, GIF vagy JPG. Maximum %{size}. Át lesz méretezve %{dimensions} pixelre locked: Egyenként engedélyezned kell a követőidet - note: - one: <span class="note-counter">1</span>karakter maradt - other: <span class="note-counter">%{count}</span>karakter maradt setting_noindex: A publikus profilodra és státusz oldalra vonatkozik setting_theme: A bármely eszközről bejelentkezett felület kinézetére vonatkozik. imports: diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml index fcd9d862c..c6da2beff 100644 --- a/config/locales/simple_form.id.yml +++ b/config/locales/simple_form.id.yml @@ -4,10 +4,8 @@ id: hints: defaults: avatar: PNG, GIF atau JPG. Maksimal %{size}. Ukuran dikecilkan menjadi %{dimensions}px - display_name: Maksimal 30 karakter header: PNG, GIF atau JPG. Maksimal %{size}. Ukuran dikecilkan menjadi %{dimensions}px locked: Anda harus menerima permintaan pengikut secara manual dan setting privasi postingan akan diubah khusus untuk pengikut - note: Maksimum 160 karakter imports: data: File CSV yang diexpor dari server Mastodon lain sessions: diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml index cf87aa6d9..c9fd9899e 100644 --- a/config/locales/simple_form.io.yml +++ b/config/locales/simple_form.io.yml @@ -3,11 +3,9 @@ io: simple_form: hints: defaults: - avatar: En la formato PNG, GIF o JPG. Til 2Mo. Esos mikrigita a %{dimensions}px - display_name: 30 signi maxime - header: En la formato PNG, GIF o JPG. Til 2Mo. Esos mikrigita a %{dimensions}px + avatar: En la formato PNG, GIF o JPG. Til %{size}. Esos mikrigita a %{dimensions}px + header: En la formato PNG, GIF o JPG. Til %{size}. Esos mikrigita a %{dimensions}px locked: Tu devos aprobar omna demandi di sequado, e tua mesaji esos senchanje nur por tua sequanti. - note: 160 signi maxime imports: data: Dosiero CSV de altra instaluro di Mastodon sessions: diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml index 841e65faa..53ccb069e 100644 --- a/config/locales/simple_form.it.yml +++ b/config/locales/simple_form.it.yml @@ -8,24 +8,24 @@ it: bot: Questo account esegue principalmente operazioni automatiche e potrebbe non essere tenuto sotto controllo da una persona context: Uno o più contesti nei quali il filtro dovrebbe essere applicato digest: Inviata solo dopo un lungo periodo di inattività e solo se hai ricevuto qualche messaggio personale in tua assenza - display_name: - one: <span class="name-counter">1</span> carattere rimanente - other: <span class="name-counter">%{count}</span> caratteri rimanenti + email: Ti manderemo una email di conferma fields: Puoi avere fino a 4 voci visualizzate come una tabella sul tuo profilo header: PNG, GIF o JPG. Al massimo %{size}. Verranno scalate a %{dimensions}px inbox_url: Copia la URL dalla pagina iniziale del ripetitore che vuoi usare irreversible: I toot filtrati scompariranno in modo irreversibile, anche se il filtro viene eliminato locale: La lingua dell'interfaccia utente, di email e notifiche push locked: Richiede che approvi i follower manualmente - note: - one: <span class="note-counter">1</span> carattere rimanente - other: <span class="note-counter">%{count}</span> caratteri rimanenti + password: Usa almeno 8 caratteri phrase: Il confronto sarà eseguito ignorando minuscole/maiuscole e i content warning scopes: A quali API l'applicazione potrà avere accesso. Se selezionate un ambito di alto livello, non c'è bisogno di selezionare quelle singole. setting_default_language: La lingua dei tuoi toot può essere individuata automaticamente, ma il risultato non è sempre accurato + setting_display_media_default: Nascondi media segnati come sensibili + setting_display_media_hide_all: Nascondi sempre tutti i media + setting_display_media_show_all: Nascondi sempre i media segnati come sensibili setting_hide_network: Chi segui e chi segue te non saranno mostrati sul tuo profilo setting_noindex: Ha effetto sul tuo profilo pubblico e sulle pagine degli status setting_theme: Ha effetto sul modo in cui Mastodon verrà visualizzato quando sarai collegato da qualsiasi dispositivo. + username: Il tuo nome utente sarà unico su %{domain} whole_word: Quando la parola chiave o la frase è solo alfanumerica, si applica solo se corrisponde alla parola intera imports: data: File CSV esportato da un'altra istanza di Mastodon @@ -69,6 +69,11 @@ it: setting_default_privacy: Privacy dei post setting_default_sensitive: Segna sempre i media come sensibili setting_delete_modal: Mostra dialogo di conferma prima di eliminare un toot + setting_display_media: Visualizzazione dei media + setting_display_media_default: Predefinita + setting_display_media_hide_all: Nascondi tutti + setting_display_media_show_all: Mostra tutti + setting_expand_spoilers: Espandi sempre toot con content warning setting_hide_network: Nascondi la tua rete setting_noindex: Non indicizzare dai motori di ricerca setting_reduce_motion: Riduci movimento nelle animazioni diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index 71e2f935e..a3ddef29b 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -8,14 +8,14 @@ ja: bot: このアカウントは主に自動で動作し、人が見ていない可能性があります context: フィルターを適用する対象 (複数選択可) digest: 長期間使用していない場合と不在時に返信を受けた場合のみ送信されます - display_name: あと<span class="name-counter">%{count}</span>文字入力できます。 + email: 確認のメールが送信されます fields: プロフィールに表として4つまでの項目を表示することができます header: "%{size}までのPNG、GIF、JPGが利用可能です。 %{dimensions}pxまで縮小されます" inbox_url: 使用したいリレーサーバーのトップページからURLをコピーします irreversible: フィルターが後で削除されても、除外されたトゥートは元に戻せなくなります locale: ユーザーインターフェース、メールやプッシュ通知の言語 locked: フォロワーを手動で承認する必要があります - note: あと<span class="note-counter">%{count}</span>文字入力できます。 + password: 少なくとも8文字は入力してください phrase: トゥートの大文字小文字や閲覧注意に関係なく一致 scopes: アプリの API に許可するアクセス権を選択してください。最上位のスコープを選択する場合、個々のスコープを選択する必要はありません。 setting_default_language: トゥートの言語は自動的に検出されますが、必ずしも正確とは限りません @@ -25,6 +25,7 @@ ja: setting_hide_network: フォローとフォロワーの情報がプロフィールページで見られないようにします setting_noindex: 公開プロフィールおよび各投稿ページに影響します setting_theme: ログインしている全てのデバイスで適用されるデザインです。 + username: あなたのユーザー名は %{domain} の中で重複していない必要があります whole_word: キーワードまたはフレーズが英数字のみの場合、単語全体と一致する場合のみ適用されるようになります imports: data: 他の Mastodon インスタンスからエクスポートしたCSVファイルを選択して下さい @@ -72,6 +73,7 @@ ja: setting_display_media_default: 標準 setting_display_media_hide_all: 非表示 setting_display_media_show_all: 表示 + setting_expand_spoilers: 閲覧注意としてマークされたトゥートを常に展開する setting_favourite_modal: お気に入りをする前に確認ダイアログを表示する setting_hide_network: 繋がりを隠す setting_noindex: 検索エンジンによるインデックスを拒否する diff --git a/config/locales/simple_form.ka.yml b/config/locales/simple_form.ka.yml index b1b29a7ce..6bccb3134 100644 --- a/config/locales/simple_form.ka.yml +++ b/config/locales/simple_form.ka.yml @@ -8,18 +8,12 @@ ka: bot: ეს ანგარიში უმთავრესად ასრულებს ავტომატურ მოქმედებებს და შესაძლოა არ იყოს მონიტორინგის ქვეშ context: ერთ ან მრავალი კონტექსტი სადაც ფილტრი უნდა შესრულდეს digest: იგზავნება მხოლოდ ხანგრძლივი უაქტივობის პერიოდის შემდეგ და არყოფნისას თუ მიიღეთ ერთი წერილი მაინც - display_name: - one: დარჩა <span class="name-counter">ერთი</span> ნიშანი - other: დარჩა <span class="name-counter">%{count}</span> ნიშანი fields: პროფილზე ტაბულის სახით შესაძლოა საჩვენებლად გაგაჩნდეთ მაქს. 4 პუნქტი header: პნგ, გიფ ან ჯპგ. მაქს. %{size}. ზომა დაპატარავდება %{dimensions}პიქს.-ზე inbox_url: ურლ დააკოირეთ გამოყენებისთვის სასურველი რილეის წინა გვერდიდან irreversible: გაფილტრული ტუტები გაუქმდება აღუდგენლად, იმ შემთხვევაშიც კი თუ ფილტრი სამომავლოდ გაუქმდება locale: მომხმარებლის ინტერფეისის, ელ-ფოსტის წერილების და ფუშ შეტყობინებების ენა locked: საჭიროებს თქვენ მიერ მიმდევრების ხელით დადასტურებას - note: - one: დარჩა <span class="note-counter">ერთი</span> ნიშანი - other: დარჩა <span class="note-counter">%{count}</span> ნიშანი phrase: დამთხვევა მოხდება დიდი და პატარა ასოების ან კონტენტის გაფრთხილების გათვალისწინების გარეშე scopes: რომელი აპიებისადმი ექნება აპლიკაციას ცვდომა. თუ არიჩევთ უმთავრეს ფარგლებს, არ დაგჭირდებათ ინდივიდუალურების ამორჩევა. setting_default_language: თქვენი ტუტების ენა შეიძლება დადგინდეს ავტომატურად, მაგრამ ეს არაა ყოველთვის ზუსტი diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml index 232844df8..86a459110 100644 --- a/config/locales/simple_form.ko.yml +++ b/config/locales/simple_form.ko.yml @@ -8,24 +8,24 @@ ko: bot: 사람들에게 계정이 사람이 아님을 알립니다 context: 필터를 적용 할 한 개 이상의 컨텍스트 digest: 오랫동안 활동하지 않았을 때 받은 멘션들에 대한 요약 받기 - display_name: - one: <span class="name-counter">1</span> 글자 남음 - other: <span class="name-counter">%{count}</span> 글자 남음 + email: 당신은 확인 메일을 받게 됩니다 fields: 당신의 프로파일에 최대 4개까지 표 형식으로 나타낼 수 있습니다 header: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 다운스케일 됨 inbox_url: 사용 할 릴레이 서버의 프론트페이지에서 URL을 복사합니다 irreversible: 필터링 된 툿은 나중에 필터가 사라지더라도 돌아오지 않게 됩니다 locale: 유저 인터페이스, 이메일, 푸시 알림 언어 locked: 수동으로 팔로워를 승인하고, 기본 툿 프라이버시 설정을 팔로워 전용으로 변경 - note: - one: <span class="note-counter">1</span> 글자 남음 - other: <span class="note-counter">%{count}</span> 글자 남음 + password: 최소 8글자 phrase: 툿 내용이나 CW 내용 안에서 대소문자 구분 없이 매칭 됩니다 scopes: 애플리케이션에 허용할 API들입니다. 최상위 스코프를 선택하면 개별적인 것은 선택하지 않아도 됩니다. setting_default_language: 작성한 툿의 언어는 자동으로 인식할 수 있지만, 언제나 정확한 건 아닙니다 + setting_display_media_default: 민감함으로 설정 된 미디어 가리기 + setting_display_media_hide_all: 항상 모든 미디어를 가리기 + setting_display_media_show_all: 민감함으로 설정 된 미디어를 항상 보이기 setting_hide_network: 나를 팔로우 하는 사람들과 내가 팔로우 하는 사람들이 내 프로필에 표시되지 않게 합니다 setting_noindex: 공개 프로필 및 각 툿페이지에 영향을 미칩니다 setting_theme: 로그인중인 모든 디바이스에 적용되는 디자인입니다. + username: 당신의 유저네임은 %{domain} 안에서 유일해야 합니다 whole_word: 키워드가 영문과 숫자로만 이루어 진 경우, 단어 전체에 매칭 되었을 때에만 작동하게 합니다 imports: data: 다른 마스토돈 인스턴스에서 추출된 CSV 파일 @@ -69,6 +69,11 @@ ko: setting_default_privacy: 툿 프라이버시 setting_default_sensitive: 미디어를 언제나 민감한 컨텐츠로 설정 setting_delete_modal: 툿 삭제 전 확인 창을 표시 + setting_display_media: 미디어 표시 + setting_display_media_default: 기본 + setting_display_media_hide_all: 모두 가리기 + setting_display_media_show_all: 모두 보이기 + setting_expand_spoilers: 열람주의 툿을 항상 펼치기 setting_hide_network: 내 네트워크 숨기기 setting_noindex: 검색엔진의 인덱싱을 거절 setting_reduce_motion: 애니메이션 줄이기 diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml index 32ad8d52c..487f6320b 100644 --- a/config/locales/simple_form.nl.yml +++ b/config/locales/simple_form.nl.yml @@ -8,24 +8,24 @@ nl: bot: Dit is een geautomatiseerd account en wordt mogelijk niet gemonitord context: Een of meerdere locaties waar de filter actief moet zijn digest: Wordt alleen na een lange periode van inactiviteit verzonden en alleen wanneer je tijdens jouw afwezigheid persoonlijke berichten hebt ontvangen - display_name: - one: <span class="name-counter">1</span> teken over - other: <span class="name-counter">%{count}</span> tekens over + email: Je krijgt een bevestigingsmail fields: Je kan maximaal 4 items als een tabel op je profiel weergeven header: PNG, GIF of JPG. Maximaal %{size}. Wordt teruggeschaald naar %{dimensions}px inbox_url: Kopieer de URL van de voorpagina van de relayserver die je wil gebruiken irreversible: Gefilterde toots verdwijnen onomkeerbaar, zelfs als de filter later wordt verwijderd locale: De taal van de gebruikersomgeving, e-mails en pushmeldingen locked: Vereist dat je handmatig volgers moet accepteren - note: - one: <span class="note-counter">1</span> teken over - other: <span class="note-counter">%{count}</span> tekens over + password: Gebruik tenminste 8 tekens phrase: Komt overeen ongeacht hoofd-/kleine letters of tekstwaarschuwingen scopes: Tot welke API's heeft de toepassing toegang. Wanneer je een toestemming van het bovenste niveau kiest, hoef je geen individuele toestemmingen meer te kiezen. setting_default_language: De taal van jouw toots kan automatisch worden gedetecteerd, maar het is niet altijd accuraat + setting_display_media_default: Als gevoelig gemarkeerde media verbergen + setting_display_media_hide_all: Media altijd verbergen + setting_display_media_show_all: Als gevoelig gemarkeerde media altijd verbergen setting_hide_network: Wie jij volgt en wie jou volgen wordt niet op jouw profiel getoond setting_noindex: Heeft invloed op jouw openbare profiel en toots setting_theme: Heeft invloed op hoe de webapp van Mastodon eruitziet (op elk apparaat waarmee je inlogt). + username: Jouw gebruikersnaam is uniek op %{domain} whole_word: Wanneer het trefwoord of zinsdeel alfanumeriek is, wordt het alleen gefilterd wanneer het hele woord overeenkomt imports: data: CSV-bestand dat op een andere Mastodonserver werd geëxporteerd @@ -69,6 +69,11 @@ nl: setting_default_privacy: Standaardzichtbaarheid van jouw toots setting_default_sensitive: Media altijd als gevoelig markeren setting_delete_modal: Vraag voor het verwijderen van een toot een bevestiging + setting_display_media: Mediaweergave + setting_display_media_default: Standaard + setting_display_media_hide_all: Alles verbergen + setting_display_media_show_all: Alles tonen + setting_expand_spoilers: Altijd toots met tekstwaarschuwingen uitklappen setting_hide_network: Jouw volgers en wie je volgt verbergen setting_noindex: Jouw toots niet door zoekmachines laten indexeren setting_reduce_motion: Langzamere animaties diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml index 98c6b82fe..fc339c3f2 100644 --- a/config/locales/simple_form.no.yml +++ b/config/locales/simple_form.no.yml @@ -5,14 +5,8 @@ defaults: avatar: PNG, GIF eller JPG. Maksimalt %{size}. Vil bli nedskalert til %{dimensions}px digest: Kun sendt etter en lang periode med inaktivitet og bare dersom du har mottatt noen personlige meldinger mens du var borte - display_name: - one: <span class="name-counter">1</span> tegn igjen - other: <span class="name-counter">%{count}</span> tegn igjen header: PNG, GIF eller JPG. Maksimalt %{size}. Vil bli nedskalert til %{dimensions}px locked: Krever at du manuelt godkjenner følgere - note: - one: <span class="note-counter">1</span> tegn igjen - other: <span class="note-counter">%{count}</span> tegn igjen setting_noindex: Påvirker din offentlige profil og statussider setting_theme: Påvirker hvordan Mastodon ser ut når du er logget inn fra uansett enhet. imports: diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index 5363aa02a..c7cc2b471 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -4,28 +4,28 @@ oc: hints: defaults: autofollow: Lo monde que se marcan gràcia a l’invitacion vos segràn automaticament - avatar: PNG, GIF o JPG. Maximum 2 Mo. Serà retalhat en %{dimensions}px + avatar: PNG, GIF o JPG. Maximum %{size}. Serà retalhat en %{dimensions}px bot: Avisar lo monde qu’aqueste compte es pas d’una persona context: Un o mai de contèxtes ont lo filtre deuriá s’aplicar digest: Solament enviat aprèp un long moment d’inactivitat e solament s’avètz recebut de messatges personals pendent vòstra abséncia - display_name: - one: Demòra encara <span class="name-counter">1</span> caractèr - other: Demòran encara <span class="name-counter">%{count}</span> caractèrs + email: Vos mandarem un corrièl de confirmacion fields: Podètz far veire cap a 4 elements sus vòstre perfil - header: PNG, GIF o JPG. Maximum 2 Mo. Serà retalhada en %{dimensions}px + header: PNG, GIF o JPG. Maximum %{size}. Serà retalhada en %{dimensions}px inbox_url: Copiatz l’URL de la pagina màger del relai que volètz utilizar irreversible: Los tuts filtrats desapareisseràn irreversiblament, encara que lo filtre siá suprimit mai tard locale: La lenga de l’interfàcia d’utilizacion, los messatges e las notificacions locked: Demanda qu’acceptetz manualament lo mond que vos sègon e botarà la visibilitat de vòstras publicacions coma accessiblas a vòstres seguidors solament - note: - one: Demòra encara <span class="name-counter">1</span> caractèr - other: Demòran encara <span class="name-counter">%{count}</span> caractèrs + password: Utilizatz almens 8 caractèrs phrase: Serà pres en compte que siá en majuscula o minuscula o dins un avertiment de contengut sensible scopes: A quinas APIs poiràn accedir las aplicacions. Se seleccionatz un encastre de naut nivèl, fa pas mestièr de seleccionar los nivèls mai basses. setting_default_language: La lenga de vòstres tuts pòt èsser detectada automaticament, mas de còps es pas corrèctament determinada + setting_display_media_default: Rescondre los mèdias marcats coma sensibles + setting_display_media_hide_all: Totjorn rescondre los mèdias + setting_display_media_show_all: Totjorn mostrar los mèdias marcats coma sensibles setting_hide_network: Vòstre perfil mostrarà pas los que vos sègon e lo monde que seguètz setting_noindex: Aquò es destinat a vòstre perfil public e vòstra pagina d’estatuts setting_theme: Aquò càmbia lo tèma grafic de Mastodon quand sètz connectat qual que siasque lo periferic. + username: Vòstre nom d’utilizaire serà unic sus %{domain} whole_word: Quand lo mot-clau o frasa es solament alfranumeric, serà pas qu’aplicat se correspond al mot complèt imports: data: Fichièr CSV exportat d’una autra instància Mastodon @@ -69,10 +69,15 @@ oc: setting_default_privacy: Confidencialitat dels tuts setting_default_sensitive: Totjorn marcar los mèdias coma sensibles setting_delete_modal: Mostrar una fenèstra de confirmacion abans de suprimir un estatut + setting_display_media: Afichatge dels mèdias + setting_display_media_default: Defaut + setting_display_media_hide_all: O rescondre tot + setting_display_media_show_all: O mostrar tot + setting_expand_spoilers: Totjorn desplegar los tuts marcats amb un avertiment de contengut setting_hide_network: Amagar vòstre malhum setting_noindex: Èsser pas indexat pels motors de recèrca setting_reduce_motion: Reduire la velocitat de las animacions - setting_system_font_ui: Utilizar la polissa del sisèma + setting_system_font_ui: Utilizar la polissa del sistèma setting_theme: Tèma del site setting_unfollow_modal: Mostrar una confirmacion abans de quitar de sègre qualqu’un severity: Severitat diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml index d994eb6f5..b4c876826 100644 --- a/config/locales/simple_form.pl.yml +++ b/config/locales/simple_form.pl.yml @@ -8,22 +8,12 @@ pl: bot: To konto wykonuje głównie zautomatyzowane działania i może nie być monitorowane context: Jedno lub wiele miejsc, w których filtr zostanie zastosowany digest: Wysyłane tylko po długiej nieaktywności, jeżeli w tym czasie otrzymaleś jakąś wiadomość bezpośrednią - display_name: - few: Pozostały <span class="name-counter">%{count}</span> znaki. - many: Pozostało <span class="name-counter">%{count}</span> znaków - one: Pozostał <span class="name-counter">1</span> znak - other: Pozostało <span class="name-counter">%{count}</span> znaków fields: Możesz ustawić maksymalnie 4 niestandardowe pola wyświetlane jako tabela na Twoim profilu header: PNG, GIF lub JPG. Maksymalnie %{size}. Zostanie zmniejszony do %{dimensions}px inbox_url: Skopiuj adres ze strony głównej przekaźnika, którego chcesz użyć irreversible: Filtrowane wpisy znikną bezpowrotnie, nawet gdy filtr zostanie usunięty locale: Język interfejsu, wiadomości e-mail i powiadomieniach push locked: Musisz akceptować prośby o śledzenie - note: - few: Pozostały <span class="name-counter">%{count}</span> znaki. - many: Pozostało <span class="name-counter">%{count}</span> znaków - one: Pozostał <span class="name-counter">1</span> znak - other: Pozostało <span class="name-counter">%{count}</span> znaków phrase: Zostanie wykryte nawet, gdy znajduje się za ostrzeżeniem o zawartości scopes: Wybór API, do których aplikacja będzie miała dostęp. Jeżeli wybierzesz nadrzędny zakres, nie musisz wybierać jego elementów. setting_default_language: Język Twoich wpisów może być wykrywany automatycznie, ale nie zawsze jest to dokładne diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 23272c41f..71aff333e 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -8,24 +8,24 @@ pt-BR: bot: Essa conta executa principalmente ações automatizadas e pode não ser monitorada context: Um ou mais contextos onde o filtro deve ser aplicado digest: Enviado após um longo período de inatividade com um resumo das menções que você recebeu em sua ausência - display_name: - one: <span class="name-counter">1</span> caracter restante - other: <span class="name-counter">%{count}</span> caracteres restantes + email: Você receberá um email de confirmação fields: Você pode ter até 4 itens exibidos em forma de tabela no seu perfil header: PNG, GIF or JPG. Arquivos de até %{size}. Eles serão diminuídos para %{dimensions}px inbox_url: Copie a URL da página inicial do repetidor que você quer usar irreversible: Os toots filtrados vão desaparecer irreversivelmente, mesmo se o filtro for removido depois locale: O idioma das telas de usuário, e-mails e notificações push locked: Requer aprovação manual de seguidores - note: - one: <span class="note-counter">1</span> caracter restante - other: <span class="note-counter">%{count}</span> caracteres restantes + password: Use pelo menos 8 caracteres phrase: Vai coincidir, independente de maiúsculas ou minúsculas, no texto ou no aviso de conteúdo de um toot scopes: Quais APIs a aplicação vai ter permissão de acessar. Se você selecionar um escopo de alto nível, você não precisa selecionar individualmente os outros. setting_default_language: O idioma de seus toots pode ser detectado automaticamente, mas isso nem sempre é preciso + setting_display_media_default: Esconder mídia marcada como sensível + setting_display_media_hide_all: Sempre esconder todas as mídias + setting_display_media_show_all: Sempre mostrar mídia marcada como sensível setting_hide_network: Quem você segue e quem segue você não serão exibidos no seu perfil setting_noindex: Afeta seu perfil público e as páginas de suas postagens setting_theme: Afeta a aparência do Mastodon quando em sua conta em qualquer aparelho. + username: Seu nome de usuário será único em %{domain} whole_word: Quando a palavra ou frase é inteiramente alfanumérica, ela será aplicada somente se corresponder a palavra inteira imports: data: Arquivo CSV exportado de outra instância do Mastodon @@ -69,6 +69,11 @@ pt-BR: setting_default_privacy: Privacidade das postagens setting_default_sensitive: Sempre marcar mídia como sensível setting_delete_modal: Mostrar diálogo de confirmação antes de deletar uma postagem + setting_display_media: Exibição das mídias + setting_display_media_default: Padrão + setting_display_media_hide_all: Esconder tudo + setting_display_media_show_all: Mostrar tudo + setting_expand_spoilers: Sempre expandir toots marcados com aviso de conteúdo setting_hide_network: Esconder as suas redes setting_noindex: Não quero ser indexado por mecanismos de busca setting_reduce_motion: Reduz movimento em animações @@ -91,6 +96,7 @@ pt-BR: follow_request: Mandar um e-maill quando alguém solicitar ser seu seguidor mention: Mandar um e-mail quando alguém te mencionar reblog: Mandar um e-mail quando alguém compartilhar suas postagens + report: Mandar um e-mail quando uma nova denúncia é submetida 'no': Não required: mark: "*" diff --git a/config/locales/simple_form.pt.yml b/config/locales/simple_form.pt.yml index 8c515c1de..88be3ac70 100644 --- a/config/locales/simple_form.pt.yml +++ b/config/locales/simple_form.pt.yml @@ -5,14 +5,8 @@ pt: defaults: avatar: PNG, GIF or JPG. Arquivos até %{size}. Vão ser reduzidos para %{dimensions}px digest: Enviado após um longo período de inatividade e apenas se foste mencionado na tua ausência - display_name: - one: <span class="name-counter">1</span> caracter restante - other: <span class="name-counter">%{count}</span> caracteres restantes header: PNG, GIF or JPG. Arquivos até %{size}. Vão ser reduzidos para %{dimensions}px locked: Requer aprovação manual de seguidores - note: - one: <span class="note-counter">1</span> caracter restante - other: <span class="note-counter">%{count}</span> caracteres restantes setting_noindex: Afecta o teu perfil público e as páginas das tuas publicações setting_theme: Afecta a aparência do Mastodon quando entras na tua conta em qualquer dispositivo. imports: diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml index daeb7300a..44cd7ccd6 100644 --- a/config/locales/simple_form.ru.yml +++ b/config/locales/simple_form.ru.yml @@ -8,22 +8,12 @@ ru: bot: Этот аккаунт обычно выполяет автоматизированные действия и может не просматриваться владельцем context: Один или несколько контекстов, к которым должны быть применены фильтры digest: Отсылается лишь после длительной неактивности, если Вы в это время получали личные сообщения - display_name: - few: Осталось <span class="name-counter">%{count}</span> символа - many: Осталось <span class="name-counter">%{count}</span> символов - one: Остался <span class="name-counter">1</span> символ - other: Осталось <span class="name-counter">%{count}</span> символов fields: В профиле можно отобразить до 4 пунктов как таблицу header: PNG, GIF или JPG. Максимально %{size}. Будет уменьшено до %{dimensions}px inbox_url: Копировать URL с главной страницы ретранслятора, который Вы хотите использовать irreversible: Отфильтрованные статусы будут утеряны навсегда, даже если в будущем фильтр будет убран locale: Язык интерфейса, e-mail писем и push-уведомлений locked: Потребует от Вас ручного подтверждения подписчиков, изменит приватность постов по умолчанию на "только для подписчиков" - note: - few: Осталось <span class="name-counter">%{count}</span> символа - many: Осталось <span class="name-counter">%{count}</span> символов - one: Остался <span class="name-counter">1</span> символ - other: Осталось <span class="name-counter">%{count}</span> символов phrase: Будет сопоставлено независимо от присутствия в тексте или предупреждения о содержании статуса scopes: Какие API приложению будет позволено использовать. Если Вы выберите самый верхний, нижестоящие будут выбраны автоматически. setting_default_language: Язык Ваших статусов может быть определён автоматически, но не всегда правильно diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml index 0fd8f66b6..3ff75c2f2 100644 --- a/config/locales/simple_form.sk.yml +++ b/config/locales/simple_form.sk.yml @@ -8,20 +8,12 @@ sk: bot: Tento účet vykonáva hlavne automatizované akcie, a je pravdepodobne nespravovaný context: Jedno, alebo viac kritérií, v ktorých má byť filtrovanie uplatnené digest: Odoslané iba v prípade dlhodobej neprítomnosti, a len ak si obdŕžal/a nejaké osobné správy kým si bol/a preč - display_name: - few: Ostávajú ti <span class="name-counter">%{count}</span> znaky - one: Ostáva ti <span class="name-counter">1</span> znak - other: Ostáva ti <span class="name-counter">%{count}</span> znakov fields: Môžeš mať 4 položky na svojom profile zobrazené vo forme tabuľky header: PNG, GIF alebo JPG. Maximálne %{size}. Bude zmenšený na %{dimensions}px inbox_url: Skopíruj adresu z hlavnej stránky mostíka, ktorý chceš používať irreversible: Vytriedené príspevky zmiznú nenávratne, aj keď triedenie neskôr zrušíš locale: Jazyk užívateľského rozhrania, emailových a nástenkových oboznámení locked: Vyžaduje manuálne schvalovať sledujúcich - note: - few: Ostávajú ti <span class="note-counter">%{count}</span> znaky - one: Ostáva ti <span class="note-counter">1</span> znak - other: Ostáva ti <span class="note-counter">%{count}</span> znakov phrase: Zhoda sa nájde nezávisle od toho, či je text napísaný, veľkými, alebo malými písmenami, či už v tele, alebo v hlavičke scopes: Ktoré API budú povolené aplikácii pre prístup. Ak vyberieš vrcholný stupeň, nemusíš už potom vyberať po jednom. setting_default_language: Jazyk tvojích príspevkov môže byť zistený automaticky, ale nieje to vždy presné diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml index 0f86841d3..618446db1 100644 --- a/config/locales/simple_form.sl.yml +++ b/config/locales/simple_form.sl.yml @@ -3,13 +3,15 @@ sl: simple_form: hints: defaults: + autofollow: Osebe, ki se prijavijo prek povabila, vas bodo samodejno sledile avatar: PNG, GIF ali JPG. Največ %{size}. Zmanjšana bo na %{dimensions}px - bot: Opozarja ljudi, da račun ne predstavlja osebe + bot: Ta račun v glavnem opravlja samodejna dejanja in morda ni pod nadzorom + context: En ali več kontekstov, kjer naj se uporabi filter digest: Pošlje se le po dolgem obdobju nedejavnosti in samo, če ste prejeli osebna sporočila v vaši odsotnosti - display_name: - one: <span class="name-counter">1</span> znak ostane - other: <span class="name-counter">%{count}</span> znakov ostane + email: Poslali vam bomo potrditveno e-pošto fields: Na svojem profilu lahko imate do 4 predmete prikazane kot tabelo. header: PNG, GIF ali JPG. Največ %{size}. Zmanjšana bo na %{dimensions}px + inbox_url: Kopirajte URL naslov s prve strani releja, ki ga želite uporabiti + irreversible: Filtrirani trobi bodo nepovratno izginili, tudi če je filter kasneje odstranjen imports: data: Izvožena CSV datoteka iz drugega Mastodon vozlišča diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml index 259ac0046..eac64988f 100644 --- a/config/locales/simple_form.sr-Latn.yml +++ b/config/locales/simple_form.sr-Latn.yml @@ -5,24 +5,14 @@ sr-Latn: defaults: avatar: PNG, GIF ili JPG. Najviše %{size}. Biće smanjena na %{dimensions}px digest: Poslato posle dužeg perioda neaktivnosti sa pregledom svih bitnih stvari koje ste dobili dok ste bili odsutni - display_name: - few: <span class="name-counter">%{count}</span> karaktera preostala - many: <span class="name-counter">%{count}</span> karaktera preostalo - one: <span class="name-counter">1</span> karakter preostao - other: <span class="name-counter">%{count}</span> karaktera preostalo header: PNG, GIF ili JPG. Najviše %{size}. Biće smanjena na %{dimensions}px locked: Zahteva da pojedinačno odobrite pratioce - note: - few: <span class="note-counter">%{count}</span> karaktera preostal - many: <span class="note-counter">%{count}</span> karaktera preostalo - one: <span class="note-counter">1</span> karakter preostao - other: <span class="note-counter">%{count}</span> 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. + otp: 'Unesite dvofaktorski kod sa Vašeg telefona ili koristite jedan od kodova za oporavak:' labels: defaults: avatar: Avatar diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml index 333685ed5..c6294d4ba 100644 --- a/config/locales/simple_form.sr.yml +++ b/config/locales/simple_form.sr.yml @@ -8,22 +8,13 @@ sr: bot: Овај налог углавном врши аутоматизоване радње и можда се не надгледа context: Један или више контекста у којима треба да се примени филтер digest: Послато после дужег периода неактивности са прегледом свих битних ствари које сте добили док сте били одсутни - display_name: - few: <span class="name-counter">%{count}</span> карактера преостала - many: <span class="name-counter">%{count}</span> карактера преостало - one: <span class="name-counter">1</span> карактер преостао - other: <span class="name-counter">%{count}</span> карактера преостало fields: Можете имати до 4 ставке приказане као табела на вашем профилу header: PNG, GIF или JPG. Највише %{size}. Биће смањена на %{dimensions}px inbox_url: Копирајте URL са насловне стране релеја који желите користити irreversible: Филтриранe трубе ће нестати неповратно, чак и ако је филтер касније уклоњен locale: Језик корисничког интерфејса, е-поште и мобилних обавештења locked: Захтева да појединачно одобрите пратиоце - note: - few: <span class="note-counter">%{count}</span> карактера преостал - many: <span class="note-counter">%{count}</span> карактера преостало - one: <span class="note-counter">1</span> карактер преостао - other: <span class="note-counter">%{count}</span> карактера преостало + password: Користите најмање 8 знакова phrase: Биће упарена без обзира на велико или мало слово у тексту или упозорења о садржају трубе scopes: Којим API-јима ће апликација дозволити приступ. Ако изаберете опсег највишег нивоа, не морате одабрати појединачне. setting_default_language: Језик ваших труба може бити аутоматски откривен, али није увек прецизан diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml index 6f2e4b58f..8bc82c609 100644 --- a/config/locales/simple_form.sv.yml +++ b/config/locales/simple_form.sv.yml @@ -7,16 +7,10 @@ sv: avatar: Högst %{size}. Kommer att skalas ner till %{dimensions}px bot: Detta konto utför huvudsakligen automatiserade åtgärder och kanske inte övervakas digest: Skickas endast efter en lång period av inaktivitet och endast om du har fått några personliga meddelanden i din frånvaro - display_name: - one: <span class="name-counter">1</span> tecken kvar - other: <span class="name-counter">%{count}</span> tecken kvar fields: Du kan ha upp till 4 objekt visade som en tabell på din profil header: NG, GIF eller JPG. Högst %{size}. Kommer nedskalas till %{dimensions}px locale: Användargränssnittets språk, e-post och push aviseringar locked: Kräver att du manuellt godkänner följare - note: - one: <span class="note-counter">1</span> tecken kvar - other: <span class="note-counter">%{count}</span> tecken kvar setting_default_language: Språket av dina inlägg kan upptäckas automatiskt, men det är inte alltid rätt setting_hide_network: Vem du följer och vilka som följer dig kommer inte att visas på din profilsida setting_noindex: Påverkar din offentliga profil och statussidor diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml index 29491de0b..a8611c2f7 100644 --- a/config/locales/simple_form.th.yml +++ b/config/locales/simple_form.th.yml @@ -4,14 +4,8 @@ th: hints: defaults: avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px - display_name: - one: <span class="name-counter">1</span> character left - other: <span class="name-counter">%{count}</span> characters left header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px locked: Requires you to manually approve followers and defaults post privacy to followers-only - note: - one: <span class="name-counter">1</span> character left - other: <span class="note-counter">%{count}</span> characters left imports: data: CSV file exported from another Mastodon instance sessions: diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml index bd5c65d83..d0b50609b 100644 --- a/config/locales/simple_form.tr.yml +++ b/config/locales/simple_form.tr.yml @@ -4,10 +4,8 @@ tr: hints: defaults: avatar: En fazla %{size} olacak şekilde PNG, GIF veya JPG formatında yükleyiniz. %{dimensions}px büyüklüğüne indirgenecektir - display_name: <span class="name-counter">%{count}</span> karakter kaldı header: En fazla %{size} olacak şekilde PNG, GIF veya JPG formatında yükleyiniz. %{dimensions}px büyüklüğüne indirgenecektir. locked: Takipçilerinizi manuel olarak kabul etmenizi ve gönderilerinizi varsayılan olarak sadece takipçilerinizin göreceği şekilde paylaşmanızı sağlar. - note: <span class="note-counter">%{count}</span> karakter kaldı imports: data: Diğer Mastodon sunucusundan dışarı aktardığınız CSV dosyası sessions: diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml index 834631fdf..05d57509e 100644 --- a/config/locales/simple_form.uk.yml +++ b/config/locales/simple_form.uk.yml @@ -3,12 +3,10 @@ uk: simple_form: hints: defaults: - avatar: PNG, GIF, або JPG. Максимум - 2МБ. Буде зменшено до %{dimensions}px + avatar: PNG, GIF, або JPG. Максимум - %{size}. Буде зменшено до %{dimensions}px bot: Цей аккаунт в основному виконує автоматичні дії та може не відстежуватіся - display_name: 'Залишилося символів: <span class="name-counter">%{count}</span>' - header: PNG, GIF, або JPG. Максимум - 2МБ. Буде зменшено до %{dimensions}px + header: PNG, GIF, або JPG. Максимум - %{size}. Буде зменшено до %{dimensions}px locked: Буде вимагати від Вас самостійного підтверждення підписників, змінить приватність постів за замовчуванням на "тільки для підписників" - note: 'Осталось символов: <span class="note-counter">%{count}</span>' imports: data: Файл CSV, экспортированный с другого узла Mastodon sessions: diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml index 36b5a3f66..cfa6840a6 100644 --- a/config/locales/simple_form.zh-CN.yml +++ b/config/locales/simple_form.zh-CN.yml @@ -4,15 +4,13 @@ zh-CN: hints: defaults: autofollow: 通过邀请链接注册的用户将会自动关注你 - avatar: 文件大小限制 %{size},只支持 PNG、GIF 或 JPG 格式。图片分辨率将会压缩至 400×400px + avatar: 文件大小限制 %{size},只支持 PNG、GIF 或 JPG 格式。图片分辨率将会压缩至 %{dimensions}px bot: 来自这个帐户的绝大多数操作都是自动进行的,并且可能无人监控 digest: 仅在你长时间未登录,且收到了私信时发送 - display_name: 还能输入 <span class="name-counter">%{count}</span> 个字符 fields: 这将会在个人资料页上以表格的形式展示,最多 4 个项目 - header: 文件大小限制 %{size},只支持 PNG、GIF 或 JPG 格式。图片分辨率将会压缩至 700×335px + header: 文件大小限制 %{size},只支持 PNG、GIF 或 JPG 格式。图片分辨率将会压缩至 %{dimensions}px locale: 用户界面、电子邮件和推送通知中使用的语言 locked: 你需要手动审核所有关注请求 - note: 还能输入 <span class="note-counter">%{count}</span> 个字符 setting_default_language: 嘟文语言自动检测的结果有可能不准确(此设置仅影响你的嘟文) setting_hide_network: 你关注的人和关注你的人将不会在你的个人资料页上展示 setting_noindex: 此设置会影响到你的公开个人资料以及嘟文页面 diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml index 447b9ce7a..e28f935c2 100644 --- a/config/locales/simple_form.zh-HK.yml +++ b/config/locales/simple_form.zh-HK.yml @@ -7,16 +7,10 @@ zh-HK: avatar: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會縮裁成 %{dimensions}px bot: 提醒用戶本帳號是機械人 digest: 僅在你長時間未登錄,且收到了私信時發送 - display_name: - one: 尚餘 <span class="name-counter">1</span> 個字 - other: 尚餘 <span class="name-counter">%{count}</span> 個字 fields: 個人資料頁可顯示多至 4 個項目 header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會縮裁成 %{dimensions}px locale: 使用者介面、電郵和通知的語言 locked: 你必須人手核准每個用戶對你的關注請求,而你的文章私隱會被預設為「只有關注你的人能看」 - note: - one: 尚餘 <span class="note-counter">1</span> 個字 - other: 尚餘 <span class="note-counter">%{count}</span> 個字 setting_default_language: 你文章的語言會被自動偵測,但不一定完全準確 setting_hide_network: 你關注的人和關注你的人將不會在你的個人資料頁上顯示 setting_noindex: 此設定會影響到你的公開個人資料以及文章頁面 diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml index 7eae7e190..3747fbb98 100644 --- a/config/locales/simple_form.zh-TW.yml +++ b/config/locales/simple_form.zh-TW.yml @@ -8,18 +8,12 @@ zh-TW: bot: 這個帳號由程式進行自動式操作 context: 應該套用過濾器的一項或多項內容 digest: 僅在你長時間未登入,並且收到了私訊時發送 - display_name: - one: 尚餘 <span class="name-counter">1</span> 個字 - other: 尚餘 <span class="name-counter">%{count}</span> 個字 fields: 個人資訊頁至多可顯示 4 個項目 header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會縮裁成 %{dimensions}px inbox_url: 從您想要使用的中繼首頁複製 URL irreversible: 已過濾的嘟文將會不可逆的消失,即便過濾器之後也一樣 locale: 使用者介面、 E-mail 與通知的語言 locked: 你必須手動核准每個使用者對你的關注請求,而你的貼文隱私將會被設定為「只有關注你的人能看」 - note: - one: 尚餘 <span class="note-counter">1</span> 個字 - other: 尚餘 <span class="note-counter">%{count}</span> 個字 phrase: 無論是嘟文的本文或是內容警告都會被過濾 scopes: 應用程式將會被允許存取哪些 API。若您選取了最高階的範圍,您就不需要再選取單獨的了。 setting_default_language: 你嘟文的語言會被自動偵測,但不一定完全準確 diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 01100ffb8..bf56ef465 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -30,22 +30,16 @@ sk: other_instances: Zoznam ďalších inštancií privacy_policy: Ustanovenia o súkromí source_code: Zdrojový kód - status_count_after: - one: status - other: statusy + status_count_after: statusy status_count_before: Ktorí napísali terms: Podmienky užívania - user_count_after: - one: užívateľ - other: užívateľov + user_count_after: užívateľov user_count_before: Domov pre what_is_mastodon: Čo je Mastodon? accounts: choices_html: "%{name}vé voľby:" follow: Sledovať - followers: - one: Následovateľ - other: Sledovatelia + followers: Sledovatelia following: Sledovaní joined: Pridal/a sa %{date} media: Médiá @@ -56,9 +50,7 @@ sk: people_who_follow: Ľudia sledujúci %{name} pin_errors: following: Musíš už následovať toho človeka, ktorého si praješ zviditeľniť - posts: - one: Príspevok - other: Príspevky + posts: Príspevky posts_tab_heading: Príspevky posts_with_replies: Príspevky s odpoveďami reserved_username: Prihlasovacie meno je rezervované @@ -332,14 +324,12 @@ sk: delete: Vymaž placeholder: Opíš aké opatrenia boli urobené, alebo akékoľvek iné súvisiace aktualizácie… reopen: Znovu otvor report - report: Nahlásiť + report: 'Nahlásiť #%{id}' reported_account: Nahlásený účet reported_by: Nahlásené užívateľom resolved: Vyriešené resolved_msg: Hlásenie úspešne vyriešené! - silence_account: Zamĺčať účet status: Stav - suspend_account: Pozastaviť účet title: Reporty unassign: Odobrať unresolved: Nevyriešené @@ -748,9 +738,7 @@ sk: other: "%{count} videí" boosted_from_html: Povýšené od %{acct_link} content_warning: 'Varovanie o obsahu: %{warning}' - disallowed_hashtags: - one: 'obsahuje nepovolený haštag: %{tags}' - other: 'obsahuje nepovolené haštagy: %{tags}' + disallowed_hashtags: 'obsahuje nepovolené haštagy: %{tags}' language_detection: Zisti jazyk automaticky open_in_web: Otvor v okne prehliadača over_character_limit: limit počtu %{max} znakov bol presiahnutý diff --git a/config/locales/sl.yml b/config/locales/sl.yml index f7ef65423..0e9d7d3aa 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -5,10 +5,13 @@ sl: about_mastodon_html: Mastodon je socialno omrežje, ki temelji na odprtih spletnih protokolih in prosti ter odprtokodni programski opremi. Je decentraliziran, kot e-pošta. about_this: O Mastodonu administered_by: 'Upravlja:' + api: API + apps: Mobilne aplikacije closed_registrations: Registracije so trenutno zaprte na tem vozlišču. Vendar! Tukaj lahko najdete druga vozlišča, na katerih se prijavite in dostopate do istega omrežja od tam. contact: Kontakt contact_missing: Ni nastavljeno contact_unavailable: Ni na voljo + documentation: Dokumentacija extended_description_html: | <h3>Dober prostor za pravila</h3> <p>Razširjen opis še ni bil nastavljen.</p> @@ -37,7 +40,11 @@ sl: nothing_here: Nič ni tukaj! people_followed_by: Ljudje, ki jim sledi %{name} people_who_follow: Ljudje, ki sledijo %{name} - posts: Tuti + posts: + few: Trob + one: Trob + other: Trob + two: Trob posts_with_replies: Tuti in odgovori reserved_username: Uporabniško ime je zasedeno roles: @@ -100,3 +107,11 @@ sl: most_recent: Najnovejše title: Red promote: Spodbujanje + remote_interaction: + prompt: 'Želite interakcijo s tem trobom:' + statuses: + pin_errors: + ownership: Trob nekoga drugega ne more biti pripet + private: Nejavnega troba ni mogoče pripeti + stream_entries: + pinned: Pripet trob diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index d6800a8fb..1e32190cc 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -199,7 +199,7 @@ sr-Latn: 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. + 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 @@ -251,9 +251,7 @@ sr-Latn: reported_account: Prijavljeni nalog reported_by: Prijavio resolved: Rešeni - silence_account: Ućutkaj nalog status: Status - suspend_account: Suspenduj nalog title: Prijave unresolved: Nerešeni settings: @@ -467,7 +465,7 @@ sr-Latn: title: Moderacija notification_mailer: digest: - body: 'Evo kratak pregled šta ste propustili na instanci %{instance} od poslednje posete od %{since}:' + body: 'Evo kratak pregled šta ste propustili od poslednje posete od %{since}:' mention: "%{name} Vas je pomenuo u:" new_followers_summary: few: Dobili ste %{count} nova pratioca! Sjajno! diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 53981b0f0..1ade87f9e 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -30,22 +30,16 @@ sr: other_instances: Листа инстанци privacy_policy: Полиса приватности source_code: Изворни код - status_count_after: - one: статус - other: статуси + status_count_after: статуси status_count_before: Који су написали terms: Услови коришћења - user_count_after: - one: корисник - other: корисници + user_count_after: корисници user_count_before: Дом за what_is_mastodon: Шта је Мастодон? accounts: choices_html: "%{name}'s избори:" follow: Запрати - followers: - one: Пратилац - other: Пратиоци + followers: Пратиоци following: Пратим joined: Придружио/ла се %{date} media: Медији @@ -56,9 +50,7 @@ sr: people_who_follow: Људи који прате %{name} pin_errors: following: Морате пратити ову особу ако хоћете да потврдите - posts: - one: Труба - other: Трубе + posts: Трубе posts_tab_heading: Трубе posts_with_replies: Трубе и одговори reserved_username: Корисничко име је резервисано @@ -338,9 +330,7 @@ sr: reported_by: Пријавио resolved: Решена resolved_msg: Пријава успешно разрешена! - silence_account: Ућуткај налог status: Статус - suspend_account: Суспендуј налог title: Пријаве unassign: Уклони доделу unresolved: Нерешене @@ -756,17 +746,11 @@ sr: statuses: attached: description: 'У прилогу: %{attached}' - image: - one: "%{count} слику" - other: "%{count} слике" - video: - one: "%{count} видео" - other: "%{count} видеа" + image: "%{count} слике" + video: "%{count} видеа" boosted_from_html: Подржано од %{acct_link} content_warning: 'Упозорење на садржај: %{warning}' - disallowed_hashtags: - one: 'садржи забрањену тарабу: %{tags}' - other: 'садржи забрањене тарабе: %{tags}' + disallowed_hashtags: 'садржи забрањене тарабе: %{tags}' language_detection: Аутоматскo откривање језика open_in_web: Отвори у вебу over_character_limit: ограничење од %{max} карактера прекорачено diff --git a/config/locales/sv.yml b/config/locales/sv.yml index b7229aebe..465a9b127 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -285,9 +285,7 @@ sv: reported_by: Anmäld av resolved: Löst resolved_msg: Anmälan har lösts framgångsrikt! - silence_account: Tysta ner konto status: Status - suspend_account: Suspendera konto title: Anmälningar unassign: Otilldela unresolved: Olösta @@ -810,7 +808,7 @@ sv: tip_bridge_html: Om du kommer från Twitter kan du hitta dina vänner på Mastodon genom att använda <a href="%{bridge_url}">bridge-appen</a>. Det fungerar dock bara om de också har använt bridge-appen! tip_federated_timeline: Den förenade tidslinjen är en störtflodsvy av Mastodon-nätverket. Men det inkluderar bara människor som dina grannar följer, så det är inte komplett. tip_following: Du följer din servers administratör(er) som standard. För att hitta fler intressanta personer, kolla de lokala och förenade tidslinjerna. - tip_local_timeline: Den lokala tidslinjen är en störtflodsvy av personer på% {instance}. Det här är dina närmaste grannar! + tip_local_timeline: Den lokala tidslinjen är en störtflodsvy av personer på %{instance}. Det här är dina närmaste grannar! tip_mobile_webapp: Om din mobila webbläsare erbjuder dig att lägga till Mastodon till ditt hemskärm kan du få push-meddelanden. Det fungerar som en inbyggd app på många sätt! tips: Tips title: Välkommen ombord, %{name}! diff --git a/config/locales/th.yml b/config/locales/th.yml index 8c411f252..b0b8e9ba0 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -116,9 +116,7 @@ th: reported_account: รายงานแอคเคาท์ reported_by: รายงานโดย resolved: จัดการแล้ว - silence_account: แอคเค๊าท์ที่ปิดเสียง status: สถานะ - suspend_account: แอคเค๊าท์ที่หยุดไว้ title: รายงาน unresolved: Unresolved settings: @@ -226,7 +224,7 @@ th: too_many: แนบมากกว่า 4 ไฟล์ไม่ได้ notification_mailer: digest: - body: 'Here is a brief summary of what you missed on %{instance} since your last visit on %{since}:' + body: Here is a brief summary of the messages you missed since your last visit on %{since} mention: "%{name} ส่งข้อความถึงคุณ:" new_followers_summary: one: ยินดีด้วยคุณได้ผู้ติดตามคนใหม่! Yay! diff --git a/config/locales/tr.yml b/config/locales/tr.yml index d7ecb480f..bc0a558e1 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -87,7 +87,7 @@ tr: suspend: Uzaklaştır title: Yeni domain bloğu reject_media: Ortam dosyalarını reddetme - reject_media_hint: Yerel olarak depolanmış ortam dosyalarını ve gelecekte indirilecek olanları reddeder. Uzaklaştırma için uygun değildir. + reject_media_hint: Yerel olarak depolanmış ortam dosyalarını ve gelecekte indirilecek olanları reddeder. Uzaklaştırma için uygun değildir severities: silence: Sustur suspend: Uzaklaştır @@ -97,8 +97,8 @@ tr: one: Veritabanındaki bir hesap etkilendi other: Veritabanındaki %{count} hesap etkilendi retroactive: - silence: Bu domaindeki tüm hesapların üzerindeki susturulma işlemini kaldır. - suspend: Bu domaindeki tüm hesapların üzerindeki uzaklaştırma işlemini kaldır. + silence: Bu domaindeki tüm hesapların üzerindeki susturulma işlemini kaldır + suspend: Bu domaindeki tüm hesapların üzerindeki uzaklaştırma işlemini kaldır title: "%{domain} domain'i için yapılan işlemi geri al" undo: Geri al title: Domain Blokları @@ -115,9 +115,7 @@ tr: reported_account: Şikayet edilen hesap reported_by: Şikayet eden resolved: Giderildi - silence_account: Hesabı sustur status: Durum - suspend_account: Hesabı uzaklaştır title: Şikayetler unresolved: Giderilmedi settings: @@ -126,7 +124,7 @@ tr: username: Bir kullanıcı adı giriniz registrations: closed_message: - desc_html: Kayıt alımları kapatıldığında ana sayfada görüntülenecek mesajdır. <br> HTML etiketleri kullanabilirsiniz. + desc_html: Kayıt alımları kapatıldığında ana sayfada görüntülenecek mesajdır. <br> HTML etiketleri kullanabilirsiniz title: Kayıt alımları kapatılma mesajı open: title: Kayıt alımları @@ -134,7 +132,7 @@ tr: desc_html: Ana sayfada paragraf olarak görüntülenecek bilgidir.<br>Özellikle <code><a></code> ve <code><em></code> olmak suretiyle HTML etiketlerini kullanabilirsiniz. title: Site açıklaması site_description_extended: - desc_html: Harici bilgi sayfasında gösterilir.<br>HTML etiketleri girebilirsiniz. + desc_html: Harici bilgi sayfasında gösterilir.<br>HTML etiketleri girebilirsiniz title: Sunucu hakkında detaylı bilgi site_title: Site başlığı title: Site Ayarları @@ -162,7 +160,7 @@ tr: security: Kimlik bilgileri set_new_password: Yeni parola oluştur authorize_follow: - error: Uzak hesap aranırken bir hata oluştu. + error: Uzak hesap aranırken bir hata oluştu follow: Takip et title: "%{acct}'i takip et" datetime: @@ -220,11 +218,11 @@ tr: upload: Yükle media_attachments: validations: - images_and_video: Halihazırda görsel içeren bir gönderiye video ekleyemezsiniz. + images_and_video: Halihazırda görsel içeren bir gönderiye video ekleyemezsiniz too_many: 4'ten fazla dosya ekleyemezsiniz notification_mailer: digest: - body: 'Son ziyaretiniz olan %{since}''den beri %{instance}''da kaçırdığınız şeylerin özeti:' + body: 'Son ziyaretiniz olan %{since}''den beri''da kaçırdığınız şeylerin özeti:' mention: "%{name} senden bahsetti:" new_followers_summary: one: Yeni bir takipçiniz var! @@ -287,7 +285,7 @@ tr: public: Herkese açık public_long: Herkese açık zaman tüneline gönder unlisted: Listelenmemiş - unlisted_long: Herkes görebilir fakat herkese açık zaman tünellerinde listelenmez. + unlisted_long: Herkes görebilir fakat herkese açık zaman tünellerinde listelenmez stream_entries: reblogged: boost edildi sensitive_content: Hassas içerik @@ -299,7 +297,7 @@ tr: description_html: Eğer <strong>iki-faktörlü kimlik doğrulamayı</strong> aktif ederseniz, giriş yaparken sizin için giriş kodu üreten telefonunuza ihtiyaç duyacaksınız. disable: Devre dışı bırak enable: Aktifleştir - enabled_success: İki-faktörlü kimlik doğrulama başarıyla aktif edildi. + enabled_success: İki-faktörlü kimlik doğrulama başarıyla aktif edildi generate_recovery_codes: Kurtarma Kodlarını Oluştur instructions_html: <strong>Bu QR kodunu, telefonunuzdaki <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Google Authenticator</a> veya benzer bir TOTP uygulamasıyla taratınız</strong>. Bundan sonra giriş yaparken uygulamanın ürettiği kodu kullanarak giriş yapacaksınız. lost_recovery_codes: Kurtarma kodları telefonunuzu kaybettiğiniz durumlarda hesabınıza erişim yapabilmenize olanak tanır. Eğer kurtarma kodlarınızı kaybettiyseniz burada tekrar oluşturabilirsiniz. Eski kurtarma kodlarınız geçersiz hale gelecektir. diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 22d5e98df..e4ea774ec 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -241,7 +241,7 @@ uk: suspend: Блокування title: Нове блокування домену reject_media: Заборонити медіаконтент - reject_media_hint: Видаляє медіаконтент, збережений локально, і забороняє його завантаження у майбутньому. Не має значення у випадку блокування. + reject_media_hint: Видаляє медіаконтент, збережений локально, і забороняє його завантаження у майбутньому. Не має значення у випадку блокування severities: noop: Нічого silence: Глушення @@ -313,9 +313,7 @@ uk: reported_by: Відправник скарги resolved: Вирішено resolved_msg: Скаргу успішно вирішено! - silence_account: Заглушити акаунт status: Статус - suspend_account: Заблокувати акаунт title: Скарги unassign: Зняти призначення unresolved: Невирішені @@ -352,7 +350,7 @@ uk: desc_html: Дозволити будь-ком створювати аккаунт title: Відкрити реєстрацію show_known_fediverse_at_about_page: - desc_html: Коли увімкнено, будуть показані пости з усього відомого федисвіту у передпоказі. Інакше будуть показані локальні пости + desc_html: Коли увімкнено, будуть показані пости з усього відомого федисвіту у передпоказі. Інакше будуть показані локальні пости. title: Показувати доступний федисвіт у передпоказі фіду show_staff_badge: desc_html: Відмічати персонал на сторінці користувачів @@ -370,7 +368,7 @@ uk: title: Особливі умови використання site_title: Назва сайту thumbnail: - desc_html: Використовується для передпоказів через OpenGraph та API. Бажано розміром 1200х640 пікселів. + desc_html: Використовується для передпоказів через OpenGraph та API. Бажано розміром 1200х640 пікселів title: Мініатюра інстанції timeline_preview: desc_html: Показувати публічний фід на головній сторінці @@ -479,7 +477,7 @@ uk: '410': Сторінка, яку Ви шукали, більше не існує. '422': content: Перевірка безпеки не вдалася. Можливо, Ви блокуєте cookies? - title: Перевірка безпеки не вдалася. + title: Перевірка безпеки не вдалася '429': Забагато запитів '500': content: Пробачте, та щось пішло не так з нашого боку. @@ -520,18 +518,14 @@ uk: followers_count: Кількість підписників lock_link: Закрийте акаунт purge: Видалити з підписників - success: - one: У процесі м'якого блокування підписників з одного домену... - other: У процесі м'якого блокування підписників з %{count} доменів... + success: У процесі м'якого блокування підписників з %{count} доменів... true_privacy_html: Будь ласка, помітьте, що <strong>справжняя конфіденційність може бути досягнена тільки за допомогою end-to-end шифрування</strong>. unlocked_warning_html: Хто завгодно може підписатися на Вас та отримати доступ до перегляду Ваших приватних статусів. %{lock_link}, щоб отримати можливість роздивлятися та вручну підтверджувати запити щодо підписки. unlocked_warning_title: Ваш аккаунт не закритий для підписки generic: changes_saved_msg: Зміни успішно збережені! save_changes: Зберегти зміни - validation_errors: - one: Щось тут не так! Будь ласка, ознайомтеся з помилкою нижче - other: Щось тут не так! Будь ласка, ознайомтеся з %{count} помилками нижче + validation_errors: Щось тут не так! Будь ласка, ознайомтеся з %{count} помилками нижче imports: preface: Вы можете завантажити деякі дані, наприклад, списки людей, на яких Ви підписані чи яких блокуєте, в Ваш акаунт на цій інстанції з файлів, експортованих з іншої інстанції. success: Ваші дані були успішно загружені та будуть оброблені в найближчий момент @@ -554,9 +548,7 @@ uk: expires_in_prompt: Ніколи generate: Згенерувати invited_by: 'Вас запросив(-ла):' - max_uses: - one: 1 використання - other: "%{count} використань" + max_uses: "%{count} використань" max_uses_prompt: Без обмеження prompt: Генеруйте та діліться посиланням з іншими для надання доступу до сайту table: @@ -705,17 +697,11 @@ uk: statuses: attached: description: 'Прикріплено: %{attached}' - image: - one: "%{count} картинка" - other: "%{count} картинки" - video: - one: "%{count} відео" - other: "%{count} відео" + image: "%{count} картинки" + video: "%{count} відео" boosted_from_html: Просунуто від %{acct_link} content_warning: 'Попередження про контент: %{warning}' - disallowed_hashtags: - one: 'містив заборонений хештеґ: %{tags}' - other: 'містив заборонені хештеґи: %{tags}' + disallowed_hashtags: 'містив заборонені хештеґи: %{tags}' language_detection: Автоматично визначати мову open_in_web: Відкрити у вебі over_character_limit: перевищено ліміт символів (%{max}) diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 9a1b47fdb..a32f36e32 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -30,13 +30,10 @@ zh-CN: other_instances: 其他实例 privacy_policy: 隐私政策 source_code: 源代码 - status_count_after: - one: 条嘟文 + status_count_after: 条嘟文 status_count_before: 他们共嘟出了 terms: 使用条款 - user_count_after: - one: 位用户 - other: 位用户 + user_count_after: 位用户 user_count_before: 这里共注册有 what_is_mastodon: Mastodon 是什么? accounts: @@ -48,7 +45,7 @@ zh-CN: joined: 加入于 %{date} media: 媒体 moved_html: "%{name} 已经迁移到 %{new_profile_link}:" - network_hidden: 此信息不可用。 + network_hidden: 此信息不可用 nothing_here: 这里神马都没有! people_followed_by: "%{name} 关注的人" people_who_follow: 关注 %{name} 的人 @@ -325,16 +322,14 @@ zh-CN: create_and_resolve: 添加记录并标记为“已处理” create_and_unresolve: 添加记录并重开 delete: 删除 - placeholder: 描述已经执行的操作,或其他任何相关的跟进情况 + placeholder: 描述已经执行的操作,或其他任何相关的跟进情况… reopen: 重开举报 report: '举报 #%{id}' reported_account: 举报用户 reported_by: 举报人 resolved: 已处理 resolved_msg: 举报处理成功! - silence_account: 隐藏用户 status: 状态 - suspend_account: 封禁用户 title: 举报 unassign: 取消接管 unresolved: 未处理 @@ -375,7 +370,7 @@ zh-CN: desc_html: 允许所有人建立帐户 title: 开放注册 show_known_fediverse_at_about_page: - desc_html: 启用此选项将会在预览中显示来自已知实例的嘟文,否则只会显示本站时间轴的内容 + desc_html: 启用此选项将会在预览中显示来自已知实例的嘟文,否则只会显示本站时间轴的内容. title: 在时间轴预览中显示已知实例 show_staff_badge: desc_html: 在个人资料页上显示管理人员标志 @@ -761,7 +756,7 @@ zh-CN: default: "%Y年%-m月%d日 %H:%M" two_factor_authentication: code_hint: 输入认证器生成的代码以确认操作 - description_html: 启用<strong>双重认证</strong>后,你需要输入手机认证器生成的代码才能登录 + description_html: 启用<strong>双重认证</strong>后,你需要输入手机认证器生成的代码才能登录. disable: 停用 enable: 启用 enabled: 双重认证已启用 diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index abbb1b809..7296587a3 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -217,16 +217,14 @@ zh-HK: suspend: 自動刪除 title: 新增域名阻隔 reject_media: 拒絕媒體檔案 - reject_media_hint: 刪除本地緩存的媒體檔案,再也不在未來下載這個站點的檔案。和自動刪除無關。 + reject_media_hint: 刪除本地緩存的媒體檔案,再也不在未來下載這個站點的檔案。和自動刪除無關 severities: noop: 無 silence: 自動靜音 suspend: 自動刪除 severity: 阻隔分級 show: - affected_accounts: - one: 資料庫中有 %{count} 個用戶受影響 - other: 資料庫中有%{count}個用戶受影響 + affected_accounts: 資料庫中有%{count}個用戶受影響 retroactive: silence: 對此域名的所有用戶取消靜音 suspend: 對此域名的所有用戶取消除名 @@ -285,9 +283,7 @@ zh-HK: reported_by: 舉報者 resolved: 已處理 resolved_msg: 舉報已處理。 - silence_account: 將用戶靜音 status: 狀態 - suspend_account: 將用戶停權 title: 舉報 unassign: 取消指派 unresolved: 未處理 @@ -303,7 +299,7 @@ zh-HK: email: 輸入一個公開的電郵地址 username: 輸入用戶名稱 hero: - desc_html: 在首頁顯示。推薦最小 600x100px。如果留空,就會默認為服務站縮圖。 + desc_html: 在首頁顯示。推薦最小 600x100px。如果留空,就會默認為服務站縮圖 title: 主題圖片 peers_api_enabled: desc_html: 現時本服務站在網絡中已發現的域名 @@ -532,7 +528,7 @@ zh-HK: notification_mailer: digest: action: 查看所有通知 - body: 這是自從你在%{since}使用%{instance}以後,你錯失了的訊息︰ + body: 這是自從你在%{since}使用以後,你錯失了的訊息︰ mention: "%{name} 在此提及了你︰" new_followers_summary: one: 你新獲得了 1 位關注者了!恭喜! @@ -735,6 +731,6 @@ zh-HK: users: invalid_email: 電郵地址格式不正確 invalid_otp_token: 雙重認證確認碼不正確 - otp_lost_help_html: 如果你無法訪問這兩者,可以通過 %{email} 與我們聯繫。 + otp_lost_help_html: 如果你無法訪問這兩者,可以通過 %{email} 與我們聯繫 seamless_external_login: 由於你是從外部系統登入,所以不能設定密碼和電郵。 signed_in_as: 目前登入的帳戶: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 338c40d09..9a7c2b293 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -29,18 +29,15 @@ zh-TW: learn_more: 了解詳細 other_instances: 其他站點 source_code: 原始碼 - status_count_after: - one: 狀態 + status_count_after: 狀態 status_count_before: 他們共嘟出了 terms: 使用條款 - user_count_after: - one: 使用者 + user_count_after: 使用者 user_count_before: 這裡共註冊有 what_is_mastodon: 什麼是 Mastodon? accounts: follow: 關注 - followers: - other: 關注者 + followers: 關注者 following: 正在關注 media: 媒體 moved_html: "%{name} 已經搬遷到 %{new_profile_link}:" @@ -48,9 +45,7 @@ zh-TW: nothing_here: 暫時沒有內容可供顯示! people_followed_by: "%{name} 關注的人" people_who_follow: 關注 %{name} 的人 - posts: - one: 嘟掉 - other: 嘟文 + posts: 嘟文 posts_tab_heading: 嘟文 posts_with_replies: 嘟文與回覆 reserved_username: 此用戶名已被保留 @@ -234,9 +229,7 @@ zh-TW: suspend: 自動封鎖 severity: 嚴重度 show: - affected_accounts: - one: 資料庫中有一個使用者受到影響 - other: 資料庫中有%{count}個使用者受影響 + affected_accounts: 資料庫中有%{count}個使用者受影響 retroactive: silence: 對此網域的所有使用者取消靜音 suspend: 對此網域的所有使用者取消封鎖 @@ -295,9 +288,7 @@ zh-TW: reported_by: 檢舉人 resolved: 已解決 resolved_msg: 檢舉已處理! - silence_account: 靜音使用者 status: 狀態 - suspend_account: 停權使用者 title: 檢舉 unassign: 取消指派 unresolved: 未解決 @@ -482,18 +473,14 @@ zh-TW: followers_count: 關注者數量 lock_link: 將你的帳戶設定為私人 purge: 移除關注者 - success: - one: 正準備軟性封鎖 1 個網域的關注者…… - other: 正準備軟性封鎖 %{count} 個網域的關注者…… + success: 正準備軟性封鎖 %{count} 個網域的關注者…… true_privacy_html: 請謹記,唯有<strong>點對點加密方可以真正確保你的隱私</strong>。 unlocked_warning_html: 任何人都可以在關注你後立即查看非公開的嘟文。只要%{lock_link},你就可以審核並拒絕關注請求。 unlocked_warning_title: 你的帳戶是公開的 generic: changes_saved_msg: 已成功儲存修改! save_changes: 儲存修改 - validation_errors: - one: 送出的資料有問題 - other: 送出的資料有 %{count} 個問題 + validation_errors: 送出的資料有 %{count} 個問題 imports: preface: 您可以在此匯入您在其他站點所匯出的資料檔,包括關注的使用者、封鎖的使用者名單。 success: 資料檔上傳成功,正在匯入,請稍候 @@ -516,9 +503,7 @@ zh-TW: expires_in_prompt: 永不過期 generate: 建立邀請連結 invited_by: 你的邀請人是: - max_uses: - one: 1 次 - other: "%{count} 次" + max_uses: "%{count} 次" max_uses_prompt: 無限制 prompt: 建立分享連結,邀請他人在本站點註冊 table: @@ -544,12 +529,8 @@ zh-TW: action: 閱覽所有通知 body: 以下是自%{since}你最後一次登入以來錯過的訊息摘要 mention: "%{name} 在此提及了你:" - new_followers_summary: - one: 而且,你不在的時候,有一個人關注你! 耶! - other: 而且,你不在的時候,有 %{count} 個人關注你了! 好棒! - subject: - one: "自從上次登入以來,你收到 1 則新的通知 \U0001F418" - other: "自從上次登入以來,你收到 %{count} 則新的通知 \U0001F418" + new_followers_summary: 而且,你不在的時候,有 %{count} 個人關注你了! 好棒! + subject: "自從上次登入以來,你收到 %{count} 則新的通知 \U0001F418" title: 你不在的時候... favourite: body: '你的嘟文被 %{name} 加入了最愛:' @@ -655,17 +636,11 @@ zh-TW: statuses: attached: description: 附件: %{attached} - image: - one: "%{count} 幅圖片" - other: "%{count} 幅圖片" - video: - one: "%{count} 段影片" - other: "%{count} 段影片" + image: "%{count} 幅圖片" + video: "%{count} 段影片" boosted_from_html: 轉嘟自 %{acct_link} content_warning: 內容警告: %{warning} - disallowed_hashtags: - one: 包含不允許的標籤: %{tags} - other: 包含不允許的標籤: %{tags} + disallowed_hashtags: 包含不允許的標籤: %{tags} language_detection: 自動偵測語言 open_in_web: 以網頁開啟 over_character_limit: 超過了 %{max} 字的限制 diff --git a/config/routes.rb b/config/routes.rb index 8895b7272..446aad58b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -267,7 +267,12 @@ Rails.application.routes.draw do resources :streaming, only: [:index] resources :custom_emojis, only: [:index] resources :suggestions, only: [:index, :destroy] - resources :conversations, only: [:index] + + resources :conversations, only: [:index, :destroy] do + member do + post :read + end + end get '/search', to: 'search#index', as: :search @@ -309,11 +314,11 @@ Rails.application.routes.draw do collection do post :clear post :dismiss # Deprecated + delete :destroy_multiple end member do post :dismiss - delete :destroy_multiple end end diff --git a/db/migrate/20181010141500_add_silent_to_mentions.rb b/db/migrate/20181010141500_add_silent_to_mentions.rb new file mode 100644 index 000000000..dbb4fba26 --- /dev/null +++ b/db/migrate/20181010141500_add_silent_to_mentions.rb @@ -0,0 +1,23 @@ +require Rails.root.join('lib', 'mastodon', 'migration_helpers') + +class AddSilentToMentions < ActiveRecord::Migration[5.2] + include Mastodon::MigrationHelpers + + disable_ddl_transaction! + + def up + safety_assured do + add_column_with_default( + :mentions, + :silent, + :boolean, + allow_null: false, + default: false + ) + end + end + + def down + remove_column :mentions, :silent + end +end diff --git a/db/migrate/20181017170937_add_reject_reports_to_domain_blocks.rb b/db/migrate/20181017170937_add_reject_reports_to_domain_blocks.rb new file mode 100644 index 000000000..f05d50fcd --- /dev/null +++ b/db/migrate/20181017170937_add_reject_reports_to_domain_blocks.rb @@ -0,0 +1,17 @@ +require Rails.root.join('lib', 'mastodon', 'migration_helpers') + +class AddRejectReportsToDomainBlocks < ActiveRecord::Migration[5.2] + include Mastodon::MigrationHelpers + + disable_ddl_transaction! + + def up + safety_assured do + add_column_with_default :domain_blocks, :reject_reports, :boolean, default: false, allow_null: false + end + end + + def down + remove_column :domain_blocks, :reject_reports + end +end diff --git a/db/migrate/20181018205649_add_unread_to_account_conversations.rb b/db/migrate/20181018205649_add_unread_to_account_conversations.rb new file mode 100644 index 000000000..3c28b9a64 --- /dev/null +++ b/db/migrate/20181018205649_add_unread_to_account_conversations.rb @@ -0,0 +1,23 @@ +require Rails.root.join('lib', 'mastodon', 'migration_helpers') + +class AddUnreadToAccountConversations < ActiveRecord::Migration[5.2] + include Mastodon::MigrationHelpers + + disable_ddl_transaction! + + def up + safety_assured do + add_column_with_default( + :account_conversations, + :unread, + :boolean, + allow_null: false, + default: false + ) + end + end + + def down + remove_column :account_conversations, :unread, :boolean + end +end diff --git a/db/migrate/20181024224956_migrate_account_conversations.rb b/db/migrate/20181024224956_migrate_account_conversations.rb new file mode 100644 index 000000000..47f7375ba --- /dev/null +++ b/db/migrate/20181024224956_migrate_account_conversations.rb @@ -0,0 +1,75 @@ +class MigrateAccountConversations < ActiveRecord::Migration[5.2] + disable_ddl_transaction! + + def up + say '' + say 'WARNING: This migration may take a *long* time for large instances' + say 'It will *not* lock tables for any significant time, but it may run' + say 'for a very long time. We will pause for 10 seconds to allow you to' + say 'interrupt this migration if you are not ready.' + say '' + + 10.downto(1) do |i| + say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true + sleep 1 + end + + total = estimate_rows(local_direct_statuses) + estimate_rows(notifications_about_direct_statuses) + migrated = 0 + started_time = Time.zone.now + last_time = Time.zone.now + + local_direct_statuses.includes(:account, mentions: :account).find_each do |status| + AccountConversation.add_status(status.account, status) + migrated += 1 + + if Time.zone.now - last_time > 1 + say_progress(migrated, total, started_time) + last_time = Time.zone.now + end + end + + notifications_about_direct_statuses.includes(:account, mention: { status: [:account, mentions: :account] }).find_each do |notification| + AccountConversation.add_status(notification.account, notification.target_status) + migrated += 1 + + if Time.zone.now - last_time > 1 + say_progress(migrated, total, started_time) + last_time = Time.zone.now + end + end + end + + def down + end + + private + + def estimate_rows(query) + result = exec_query("EXPLAIN #{query.to_sql}").first + result['QUERY PLAN'].scan(/ rows=([\d]+)/).first&.first&.to_i || 0 + end + + def say_progress(migrated, total, started_time) + status = "Migrated #{migrated} rows" + + percentage = 100.0 * migrated / total + status += " (~#{sprintf('%.2f', percentage)}%, " + + remaining_time = (100.0 - percentage) * (Time.zone.now - started_time) / percentage + + status += "#{(remaining_time / 60).to_i}:" + status += sprintf('%02d', remaining_time.to_i % 60) + status += ' remaining)' + + say status, true + end + + def local_direct_statuses + Status.unscoped.local.where(visibility: :direct) + end + + def notifications_about_direct_statuses + Notification.joins(mention: :status).where(activity_type: 'Mention', statuses: { visibility: :direct }) + end +end diff --git a/db/migrate/20181026034033_remove_faux_remote_account_duplicates.rb b/db/migrate/20181026034033_remove_faux_remote_account_duplicates.rb new file mode 100644 index 000000000..bd4f4c2a3 --- /dev/null +++ b/db/migrate/20181026034033_remove_faux_remote_account_duplicates.rb @@ -0,0 +1,16 @@ +class RemoveFauxRemoteAccountDuplicates < ActiveRecord::Migration[5.2] + disable_ddl_transaction! + + def up + local_domain = Rails.configuration.x.local_domain + + # Just a safety measure to ensure that under no circumstance + # we will query `domain IS NULL` because that would return + # actually local accounts, the originals + return if local_domain.nil? + + Account.where(domain: local_domain).in_batches.destroy_all + end + + def down; end +end diff --git a/db/schema.rb b/db/schema.rb index f9019e8cf..9e718615f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2018_10_07_025445) do +ActiveRecord::Schema.define(version: 2018_10_26_034033) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -22,6 +22,7 @@ ActiveRecord::Schema.define(version: 2018_10_07_025445) do t.bigint "status_ids", default: [], null: false, array: true t.bigint "last_status_id" t.integer "lock_version", default: 0, null: false + t.boolean "unread", default: false, null: false t.index ["account_id", "conversation_id", "participant_account_ids"], name: "index_unique_conversations", unique: true t.index ["account_id"], name: "index_account_conversations_on_account_id" t.index ["conversation_id"], name: "index_account_conversations_on_conversation_id" @@ -195,6 +196,7 @@ ActiveRecord::Schema.define(version: 2018_10_07_025445) do t.datetime "updated_at", null: false t.integer "severity", default: 0 t.boolean "reject_media", default: false, null: false + t.boolean "reject_reports", default: false, null: false t.index ["domain"], name: "index_domain_blocks_on_domain", unique: true end @@ -311,6 +313,7 @@ ActiveRecord::Schema.define(version: 2018_10_07_025445) do t.datetime "created_at", null: false t.datetime "updated_at", null: false t.bigint "account_id" + t.boolean "silent", default: false, null: false t.index ["account_id", "status_id"], name: "index_mentions_on_account_id_and_status_id", unique: true t.index ["status_id"], name: "index_mentions_on_status_id" end diff --git a/docker-compose.yml b/docker-compose.yml index 064d5a260..d9f80a38a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,18 +6,16 @@ services: image: postgres:9.6-alpine networks: - internal_network -### Uncomment to enable DB persistence -# volumes: -# - ./postgres:/var/lib/postgresql/data + volumes: + - ./postgres:/var/lib/postgresql/data redis: restart: always image: redis:4.0-alpine networks: - internal_network -### Uncomment to enable REDIS persistence -# volumes: -# - ./redis:/data + volumes: + - ./redis:/data # es: # restart: always @@ -26,9 +24,8 @@ services: # - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # networks: # - internal_network -#### Uncomment to enable ES persistence -## volumes: -## - ./elasticsearch:/usr/share/elasticsearch/data +# volumes: +# - ./elasticsearch:/usr/share/elasticsearch/data web: build: . @@ -68,7 +65,7 @@ services: image: tootsuite/mastodon restart: always env_file: .env.production - command: bundle exec sidekiq -q default -q push -q mailers -q pull + command: bundle exec sidekiq depends_on: - db - redis diff --git a/lib/cli.rb b/lib/cli.rb index 208df660f..a810c632a 100644 --- a/lib/cli.rb +++ b/lib/cli.rb @@ -6,9 +6,14 @@ require_relative 'mastodon/emoji_cli' require_relative 'mastodon/accounts_cli' require_relative 'mastodon/feeds_cli' require_relative 'mastodon/settings_cli' +require_relative 'mastodon/domains_cli' module Mastodon class CLI < Thor + def self.exit_on_failure? + true + end + desc 'media SUBCOMMAND ...ARGS', 'Manage media files' subcommand 'media', Mastodon::MediaCLI @@ -23,5 +28,8 @@ module Mastodon desc 'settings SUBCOMMAND ...ARGS', 'Manage dynamic settings' subcommand 'settings', Mastodon::SettingsCLI + + desc 'domains SUBCOMMAND ...ARGS', 'Manage account domains' + subcommand 'domains', Mastodon::DomainsCLI end end diff --git a/lib/mastodon/accounts_cli.rb b/lib/mastodon/accounts_cli.rb index 704cf474b..142436c19 100644 --- a/lib/mastodon/accounts_cli.rb +++ b/lib/mastodon/accounts_cli.rb @@ -1,12 +1,16 @@ # frozen_string_literal: true -require 'rubygems/package' +require 'set' require_relative '../../config/boot' require_relative '../../config/environment' require_relative 'cli_helper' module Mastodon class AccountsCLI < Thor + def self.exit_on_failure? + true + end + option :all, type: :boolean desc 'rotate [USERNAME]', 'Generate and broadcast new keys' long_desc <<-LONG_DESC @@ -207,39 +211,31 @@ module Mastodon Accounts that have had confirmed activity within the last week are excluded from the checks. - If 10 or more accounts from the same domain cannot be queried - due to a connection error (such as missing DNS records) then - the domain is considered dead, and all other accounts from it - are deleted without further querying. + Domains that are unreachable are not checked. With the --dry-run option, no deletes will actually be carried out. LONG_DESC def cull - domain_thresholds = Hash.new { |hash, key| hash[key] = 0 } - skip_threshold = 7.days.ago - culled = 0 - dead_servers = [] - dry_run = options[:dry_run] ? ' (DRY RUN)' : '' + skip_threshold = 7.days.ago + culled = 0 + skip_domains = Set.new + dry_run = options[:dry_run] ? ' (DRY RUN)' : '' Account.remote.where(protocol: :activitypub).partitioned.find_each do |account| - next if account.updated_at >= skip_threshold || account.last_webfingered_at >= skip_threshold + next if account.updated_at >= skip_threshold || (account.last_webfingered_at.present? && account.last_webfingered_at >= skip_threshold) - unless dead_servers.include?(account.domain) + unless skip_domains.include?(account.domain) begin code = Request.new(:head, account.uri).perform(&:code) rescue HTTP::ConnectionError - domain_thresholds[account.domain] += 1 - - if domain_thresholds[account.domain] >= 10 - dead_servers << account.domain - end + skip_domains << account.domain rescue StandardError next end end - if [404, 410].include?(code) || dead_servers.include?(account.domain) + if [404, 410].include?(code) unless options[:dry_run] SuspendAccountService.new.call(account) account.destroy @@ -253,11 +249,11 @@ module Mastodon end say - say("Removed #{culled} accounts (#{dead_servers.size} dead servers)#{dry_run}", :green) + say("Removed #{culled} accounts. #{skip_domains.size} servers skipped#{dry_run}", skip_domains.empty? ? :green : :yellow) - unless dead_servers.empty? - say('R.I.P.:', :yellow) - dead_servers.each { |domain| say(' ' + domain) } + unless skip_domains.empty? + say('The following servers were not available during the check:', :yellow) + skip_domains.each { |domain| say(' ' + domain) } end end diff --git a/lib/mastodon/domains_cli.rb b/lib/mastodon/domains_cli.rb new file mode 100644 index 000000000..a7a5caa11 --- /dev/null +++ b/lib/mastodon/domains_cli.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require_relative '../../config/boot' +require_relative '../../config/environment' +require_relative 'cli_helper' + +module Mastodon + class DomainsCLI < Thor + def self.exit_on_failure? + true + end + + option :dry_run, type: :boolean + desc 'purge DOMAIN', 'Remove accounts from a DOMAIN without a trace' + long_desc <<-LONG_DESC + Remove all accounts from a given DOMAIN without leaving behind any + records. Unlike a suspension, if the DOMAIN still exists in the wild, + it means the accounts could return if they are resolved again. + LONG_DESC + def purge(domain) + removed = 0 + dry_run = options[:dry_run] ? ' (DRY RUN)' : '' + + Account.where(domain: domain).find_each do |account| + unless options[:dry_run] + SuspendAccountService.new.call(account) + account.destroy + end + + removed += 1 + say('.', :green, false) + end + + DomainBlock.where(domain: domain).destroy_all + + say + say("Removed #{removed} accounts#{dry_run}", :green) + end + end +end diff --git a/lib/mastodon/emoji_cli.rb b/lib/mastodon/emoji_cli.rb index 5bc51d034..2262040d4 100644 --- a/lib/mastodon/emoji_cli.rb +++ b/lib/mastodon/emoji_cli.rb @@ -7,6 +7,10 @@ require_relative 'cli_helper' module Mastodon class EmojiCLI < Thor + def self.exit_on_failure? + true + end + option :prefix option :suffix option :overwrite, type: :boolean diff --git a/lib/mastodon/feeds_cli.rb b/lib/mastodon/feeds_cli.rb index c3fca723e..fe11c3df4 100644 --- a/lib/mastodon/feeds_cli.rb +++ b/lib/mastodon/feeds_cli.rb @@ -6,6 +6,10 @@ require_relative 'cli_helper' module Mastodon class FeedsCLI < Thor + def self.exit_on_failure? + true + end + option :all, type: :boolean, default: false option :background, type: :boolean, default: false option :dry_run, type: :boolean, default: false @@ -54,6 +58,11 @@ module Mastodon elsif username.present? account = Account.find_local(username) + if account.nil? + say('No such account', :red) + exit(1) + end + if options[:background] RegenerationWorker.perform_async(account.id) unless options[:dry_run] else diff --git a/lib/mastodon/media_cli.rb b/lib/mastodon/media_cli.rb index 8aa9f7903..179d1b6b5 100644 --- a/lib/mastodon/media_cli.rb +++ b/lib/mastodon/media_cli.rb @@ -6,6 +6,10 @@ require_relative 'cli_helper' module Mastodon class MediaCLI < Thor + def self.exit_on_failure? + true + end + option :days, type: :numeric, default: 7 option :background, type: :boolean, default: false option :verbose, type: :boolean, default: false diff --git a/lib/mastodon/settings_cli.rb b/lib/mastodon/settings_cli.rb index 87c321013..c81cfbe52 100644 --- a/lib/mastodon/settings_cli.rb +++ b/lib/mastodon/settings_cli.rb @@ -6,6 +6,10 @@ require_relative 'cli_helper' module Mastodon class RegistrationsCLI < Thor + def self.exit_on_failure? + true + end + desc 'open', 'Open registrations' def open Setting.open_registrations = true diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index fc7fa5aca..e8ed1fade 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -9,7 +9,7 @@ module Mastodon end def minor - 5 + 6 end def patch @@ -21,7 +21,7 @@ module Mastodon end def flags - '' + 'rc3' end def to_a diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb index b4f912717..71fcc1a6e 100644 --- a/spec/controllers/auth/sessions_controller_spec.rb +++ b/spec/controllers/auth/sessions_controller_spec.rb @@ -55,7 +55,7 @@ RSpec.describe Auth::SessionsController, type: :controller do request.env['devise.mapping'] = Devise.mappings[:user] end - context 'using PAM authentication' do + context 'using PAM authentication', if: ENV['PAM_ENABLED'] == 'true' do context 'using a valid password' do before do post :create, params: { user: { email: "pam_user1", password: '123456' } } diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb index 62b9db8c2..cd20b7c7c 100644 --- a/spec/lib/activitypub/activity/create_spec.rb +++ b/spec/lib/activitypub/activity/create_spec.rb @@ -105,6 +105,31 @@ RSpec.describe ActivityPub::Activity::Create do end end + context 'limited' do + let(:recipient) { Fabricate(:account) } + + let(:object_json) do + { + id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join, + type: 'Note', + content: 'Lorem ipsum', + to: ActivityPub::TagManager.instance.uri_for(recipient), + } + end + + it 'creates status' do + status = sender.statuses.first + + expect(status).to_not be_nil + expect(status.visibility).to eq 'limited' + end + + it 'creates silent mention' do + status = sender.statuses.first + expect(status.mentions.first).to be_silent + end + end + context 'direct' do let(:recipient) { Fabricate(:account) } @@ -114,6 +139,10 @@ RSpec.describe ActivityPub::Activity::Create do type: 'Note', content: 'Lorem ipsum', to: ActivityPub::TagManager.instance.uri_for(recipient), + tag: { + type: 'Mention', + href: ActivityPub::TagManager.instance.uri_for(recipient), + }, } end diff --git a/spec/lib/formatter_spec.rb b/spec/lib/formatter_spec.rb index ec4a6493d..0c1efe7c3 100644 --- a/spec/lib/formatter_spec.rb +++ b/spec/lib/formatter_spec.rb @@ -514,7 +514,7 @@ RSpec.describe Formatter do subject { Formatter.instance.sanitize(html, Sanitize::Config::MASTODON_STRICT) } it 'sanitizes' do - is_expected.to eq 'alert("Hello")' + is_expected.to eq '' end end end diff --git a/streaming/index.js b/streaming/index.js index debf7c8bf..b4d09d0ad 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -74,6 +74,7 @@ const startMaster = () => { if (!process.env.SOCKET && process.env.PORT && isNaN(+process.env.PORT)) { log.warn('UNIX domain socket is now supported by using SOCKET. Please migrate from PORT hack.'); } + log.info(`Starting streaming API server master with ${numWorkers} workers`); }; @@ -449,6 +450,11 @@ const startWorker = (workerId) => { }); }; + const httpNotFound = res => { + res.writeHead(404, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ error: 'Not found' })); + }; + app.use(setRequestId); app.use(setRemoteAddress); app.use(allowCrossDomain); @@ -490,11 +496,25 @@ const startWorker = (workerId) => { }); app.get('/api/v1/streaming/hashtag', (req, res) => { - streamFrom(`timeline:hashtag:${req.query.tag.toLowerCase()}`, req, streamToHttp(req, res), streamHttpEnd(req), true); + const { tag } = req.query; + + if (!tag || tag.length === 0) { + httpNotFound(res); + return; + } + + streamFrom(`timeline:hashtag:${tag.toLowerCase()}`, req, streamToHttp(req, res), streamHttpEnd(req), true); }); app.get('/api/v1/streaming/hashtag/local', (req, res) => { - streamFrom(`timeline:hashtag:${req.query.tag.toLowerCase()}:local`, req, streamToHttp(req, res), streamHttpEnd(req), true); + const { tag } = req.query; + + if (!tag || tag.length === 0) { + httpNotFound(res); + return; + } + + streamFrom(`timeline:hashtag:${tag.toLowerCase()}:local`, req, streamToHttp(req, res), streamHttpEnd(req), true); }); app.get('/api/v1/streaming/list', (req, res) => { @@ -502,8 +522,7 @@ const startWorker = (workerId) => { authorizeListAccess(listId, req, authorized => { if (!authorized) { - res.writeHead(404, { 'Content-Type': 'application/json' }); - res.end(JSON.stringify({ error: 'Not found' })); + httpNotFound(res); return; } @@ -553,9 +572,19 @@ const startWorker = (workerId) => { streamFrom(channel, req, streamToWs(req, ws), streamWsEnd(req, ws, subscriptionHeartbeat(channel)), true); break; case 'hashtag': + if (!location.query.tag || location.query.tag.length === 0) { + ws.close(); + return; + } + streamFrom(`timeline:hashtag:${location.query.tag.toLowerCase()}`, req, streamToWs(req, ws), streamWsEnd(req, ws), true); break; case 'hashtag:local': + if (!location.query.tag || location.query.tag.length === 0) { + ws.close(); + return; + } + streamFrom(`timeline:hashtag:${location.query.tag.toLowerCase()}:local`, req, streamToWs(req, ws), streamWsEnd(req, ws), true); break; case 'list': @@ -588,16 +617,9 @@ const startWorker = (workerId) => { }); }, 30000); - if (process.env.SOCKET || process.env.PORT && isNaN(+process.env.PORT)) { - server.listen(process.env.SOCKET || process.env.PORT, () => { - fs.chmodSync(server.address(), 0o666); - log.info(`Worker ${workerId} now listening on ${server.address()}`); - }); - } else { - server.listen(+process.env.PORT || 4000, process.env.BIND || '0.0.0.0', () => { - log.info(`Worker ${workerId} now listening on ${server.address().address}:${server.address().port}`); - }); - } + attachServerWithConfig(server, address => { + log.info(`Worker ${workerId} now listening on ${address}`); + }); const onExit = () => { log.info(`Worker ${workerId} exiting, bye bye`); @@ -617,9 +639,48 @@ const startWorker = (workerId) => { process.on('uncaughtException', onError); }; -throng({ - workers: numWorkers, - lifetime: Infinity, - start: startWorker, - master: startMaster, +const attachServerWithConfig = (server, onSuccess) => { + if (process.env.SOCKET || process.env.PORT && isNaN(+process.env.PORT)) { + server.listen(process.env.SOCKET || process.env.PORT, () => { + if (onSuccess) { + fs.chmodSync(server.address(), 0o666); + onSuccess(server.address()); + } + }); + } else { + server.listen(+process.env.PORT || 4000, process.env.BIND || '0.0.0.0', () => { + if (onSuccess) { + onSuccess(`${server.address().address}:${server.address().port}`); + } + }); + } +}; + +const onPortAvailable = onSuccess => { + const testServer = http.createServer(); + + testServer.once('error', err => { + onSuccess(err); + }); + + testServer.once('listening', () => { + testServer.once('close', () => onSuccess()); + testServer.close(); + }); + + attachServerWithConfig(testServer); +}; + +onPortAvailable(err => { + if (err) { + log.error('Could not start server, the port or socket is in use'); + return; + } + + throng({ + workers: numWorkers, + lifetime: Infinity, + start: startWorker, + master: startMaster, + }); }); |