瀏覽代碼

Merge branch 'frontend-ui-refactor' into patch-13

Stasiek Michalski 7 年之前
父節點
當前提交
0fd6316806
共有 51 個文件被更改,包括 1318 次插入94 次删除
  1. 661 21
      LICENSE
  2. 1 1
      app/Http/Controllers/FederationController.php
  3. 1 1
      app/Http/Controllers/StatusController.php
  4. 1 1
      app/Util/Lexer/Hashtag.php
  5. 二進制
      public/css/app.css
  6. 二進制
      public/mix-manifest.json
  7. 18 0
      resources/assets/sass/custom.scss
  8. 19 0
      resources/lang/da/auth.php
  9. 7 0
      resources/lang/da/notification.php
  10. 19 0
      resources/lang/da/pagination.php
  11. 22 0
      resources/lang/da/passwords.php
  12. 5 0
      resources/lang/da/profile.php
  13. 122 0
      resources/lang/da/validation.php
  14. 19 0
      resources/lang/fi/auth.php
  15. 8 0
      resources/lang/fi/notification.php
  16. 19 0
      resources/lang/fi/pagination.php
  17. 22 0
      resources/lang/fi/passwords.php
  18. 9 0
      resources/lang/fi/profile.php
  19. 7 0
      resources/lang/fi/timeline.php
  20. 19 0
      resources/lang/ru/auth.php
  21. 8 0
      resources/lang/ru/notification.php
  22. 19 0
      resources/lang/ru/pagination.php
  23. 22 0
      resources/lang/ru/passwords.php
  24. 8 0
      resources/lang/ru/profile.php
  25. 7 0
      resources/lang/ru/timeline.php
  26. 122 0
      resources/lang/ru/validation.php
  27. 1 1
      resources/lang/sv/auth.php
  28. 9 9
      resources/lang/sv/validation.php
  29. 29 28
      resources/views/admin/users/home.blade.php
  30. 5 1
      resources/views/discover/home.blade.php
  31. 5 1
      resources/views/discover/tags/show.blade.php
  32. 2 2
      resources/views/home.blade.php
  33. 15 6
      resources/views/layouts/app.blade.php
  34. 2 2
      resources/views/layouts/partial/footer.blade.php
  35. 3 3
      resources/views/layouts/partial/nav.blade.php
  36. 6 1
      resources/views/profile/followers.blade.php
  37. 6 1
      resources/views/profile/following.blade.php
  38. 7 1
      resources/views/profile/show.blade.php
  39. 5 1
      resources/views/site/about.blade.php
  40. 5 1
      resources/views/site/bannedinstances.blade.php
  41. 5 1
      resources/views/site/features.blade.php
  42. 5 1
      resources/views/site/fediverse.blade.php
  43. 5 1
      resources/views/site/help.blade.php
  44. 5 1
      resources/views/site/libraries.blade.php
  45. 5 1
      resources/views/site/opensource.blade.php
  46. 2 2
      resources/views/site/partial/template.blade.php
  47. 5 1
      resources/views/site/platform.blade.php
  48. 5 1
      resources/views/site/privacy.blade.php
  49. 5 1
      resources/views/site/terms.blade.php
  50. 7 2
      resources/views/status/show.blade.php
  51. 4 0
      resources/views/welcome.blade.php

+ 661 - 21
LICENSE

@@ -1,21 +1,661 @@
-MIT License
-
-Copyright (c) 2018 Daniel Supernault
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time.  Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as published
+    by the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.

+ 1 - 1
app/Http/Controllers/FederationController.php

@@ -94,7 +94,7 @@ class FederationController extends Controller
           'outbound' => []
         ],
         'software' => [
-          'name' => 'PixelFed',
+          'name' => 'pixelfed',
           'version' => config('pixelfed.version')
         ],
         'usage' => [

+ 1 - 1
app/Http/Controllers/StatusController.php

@@ -14,7 +14,7 @@ class StatusController extends Controller
     {
       $user = Profile::whereUsername($username)->firstOrFail();
       $status = Status::whereProfileId($user->id)
-              ->withCount('likes')
+              ->withCount(['likes', 'comments'])
               ->findOrFail($id);
       if(!$status->media_path && $status->in_reply_to_id) {
         return redirect($status->url());

+ 1 - 1
app/Util/Lexer/Hashtag.php

@@ -7,7 +7,7 @@ class Hashtag {
   public static function getHashtags($status)
   {  
     $hashtags = false;  
-    preg_match_all("/(#\w+)/u", $status, $matches);
+    preg_match_all("/(?<!&)(#\w+)/u", $status, $matches);
     if ($matches) {
         $res = array_count_values($matches[0]);
         $hashtags = array_keys($res);

二進制
public/css/app.css


二進制
public/mix-manifest.json


+ 18 - 0
resources/assets/sass/custom.scss

@@ -1,3 +1,15 @@
+html, body {
+  min-height:100vh;
+}
+
+body {
+  display: flex;
+  flex-flow: column;
+}
+
+#content {
+  margin-bottom: auto !important;
+}
 body, button, input, textarea {
     font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",
                  Roboto,Helvetica,Arial,sans-serif;
@@ -154,6 +166,12 @@ body, button, input, textarea {
     background-position: 50%;
 }
 
+@media (max-width: map-get($grid-breakpoints, "md")) {
+ .border-md-left-0 {
+  border-left:0!important
+ }
+}
+
 .fas, .far {
   font-size: 25px !important;
 }

+ 19 - 0
resources/lang/da/auth.php

@@ -0,0 +1,19 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Authentication Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines are used during authentication for various
+    | messages that we need to display to the user. You are free to modify
+    | these language lines according to your application's requirements.
+    |
+    */
+
+    'failed' => 'Disse oplysninger stemmer ikke overens med nogen konto.',
+    'throttle' => 'For mange loginfors&oslash;g. V&aelig;r venlig at pr&oslash;ve igen om :seconds sekunder.',
+
+];

+ 7 - 0
resources/lang/da/notification.php

@@ -0,0 +1,7 @@
+<?php
+
+return [
+
+  'likedPhoto' => 'syntes om dit billede.',
+
+];

+ 19 - 0
resources/lang/da/pagination.php

@@ -0,0 +1,19 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Pagination Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines are used by the paginator library to build
+    | the simple pagination links. You are free to change them to anything
+    | you want to customize your views to better match your application.
+    |
+    */
+
+    'previous' => '&laquo; forrige',
+    'next' => 'n&aelig;ste &raquo;',
+
+];

+ 22 - 0
resources/lang/da/passwords.php

@@ -0,0 +1,22 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Password Reset Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines are the default lines which match reasons
+    | that are given by the password broker for a password update attempt
+    | has failed, such as for an invalid token or invalid new password.
+    |
+    */
+
+    'password' => 'Adgangskode skal v&aelig;re mindst 6 tegn og skal matche bekr&aelig;ftelsen.',
+    'reset' => 'Din adgangskode er blevet nulstillet!',
+    'sent' => 'Vi har sendt dig en email med et link, hvor du kan nulstille din adgangskode!',
+    'token' => 'Dette nulstillingslink er ikke l&aelig;ngere gyldigt.',
+    'user' => "Vi kan ikke finde en bruger med den emailadresse.",
+
+];

+ 5 - 0
resources/lang/da/profile.php

@@ -0,0 +1,5 @@
+<?php
+
+return [
+  'emptyTimeline' => 'Denne bruger har ikke postet noget endnu!',
+];

+ 122 - 0
resources/lang/da/validation.php

@@ -0,0 +1,122 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Validation Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines contain the default error messages used by
+    | the validator class. Some of these rules have multiple versions such
+    | as the size rules. Feel free to tweak each of these messages here.
+    |
+    */
+
+    'accepted'             => ':attribute skal accepteres.',
+    'active_url'           => ':attribute er ikke en gyldig URL.',
+    'after'                => ':attribute skal v&aelig;re en dato efter :date.',
+    'after_or_equal'       => ':attribute skal v&aelig;re en dato ens med, eller efter :date.',
+    'alpha'                => ':attribute m&aring; kun indeholde bogstaver.',
+    'alpha_dash'           => ':attribute m&aring; kun indeholde bogstaver, tal og bindestreger.',
+    'alpha_num'            => ':attribute m&aring; kun indeholde bogstaver og tal.',
+    'array'                => ':attribute skal v&aelig;re et Array.',
+    'before'               => ':attribute skal v&aelig;re en dato f&oslash;r :date.',
+    'before_or_equal'      => ':attribute skal v&aelig;re en dato f&oslash;r, eller det samme som :date.',
+    'between'              => [
+        'numeric' => ':attribute skal v&aelig;re mellem :min og :max.',
+        'file'    => ':attribute skal v&aelig;re mellem :min og :max kilobytes.',
+        'string'  => ':attribute skal v&aelig;re mellem :min og :max tegn.',
+        'array'   => ':attribute skal v&aelig;re mellem :min og :max elementer.',
+    ],
+    'boolean'              => ':attribute felt skal v&aelig;re sandt eller falsk.',
+    'confirmed'            => ':attribute bekr&aelig;ftelse matcher ikke.',
+    'date'                 => ':attribute er ikke en gyldig dato.',
+    'date_format'          => ':attribute matcher ikke formatet :format.',
+    'different'            => ':attribute og :other skal v&aelig;re forskellige.',
+    'digits'               => ':attribute skal v&aelig;re :digits tal.',
+    'digits_between'       => ':attribute skal v&aelig;re mellem :min og :max tal.',
+    'dimensions'           => ':attribute har ugyldige billeddimensioner.',
+    'distinct'             => ':attribute-felt har en dobbeltv&aelig;rdi.',
+    'email'                => ':attribute skal v&aelig;re en gyldig emailadresse.',
+    'exists'               => 'Den valgte :attribute er ugyldig.',
+    'file'                 => ':attribute skal v&aelig;re en fil.',
+    'filled'               => 'Feltet :attribute skal have en v&aelig;rdi.',
+    'image'                => ':attribute skal v&aelig;re et billede.',
+    'in'                   => 'Den valgte :attribute er ugyldig.',
+    'in_array'             => ':attribute feltet findes ikke i :other.',
+    'integer'              => ':attribute skal v&aelig;re et heltal.',
+    'ip'                   => ':attribute skal v&aelig;re en gyldig IP-adresse.',
+    'ipv4'                 => ':attribute skal v&aelig;re en gyldig IPv4 adresse.',
+    'ipv6'                 => ':attribute skal v&aelig;re en gyldig IPv6 adresse.',
+    'json'                 => ':attribute skal v&aelig;re en gyldig JSON-streng.',
+    'max'                  => [
+        'numeric' => ':attribute m&aring; ikke v&aelig;re st&oslash;rre end :max.',
+        'file'    => ':attribute m&aring; ikke v&aelig;re st&oslash;rre end :max kilobytes.',
+        'string'  => ':attribute m&aring; ikke v&aelig;re st&oslash;rre end :max tegn.',
+        'array'   => ':attribute m&aring; ikke have mere end :max elementer.',
+    ],
+    'mimes'                => ':attribute skal v&aelig;re en fil af typen: :values.',
+    'mimetypes'            => ':attribute skal v&aelig;re en fil af typen: :values.',
+    'min'                  => [
+        'numeric' => ':attribute skal v&aelig;re mindst :min.',
+        'file'    => ':attribute skal v&aelig;re mindst :min kilobytes.',
+        'string'  => ':attribute skal v&aelig;re mindst :min tegn.',
+        'array'   => ':attribute skal v&aelig;re mindst :min elementer.',
+    ],
+    'not_in'               => 'Den valgte :attribute er ugyldig.',
+    'not_regex'            => ':attribute format er ugyldigt.',
+    'numeric'              => ':attribute skal v&aelig;re et tal.',
+    'present'              => ':attribute feltet skal v&aelig;re til stede.',
+    'regex'                => ':attribute format er ugyldigt.',
+    'required'             => ':attribute felt er p&aring;kr&aelig;vet.',
+    'required_if'          => ':attribute felt er p&aring;kr&aelig;vet n&aring;r :other er :value.',
+    'required_unless'      => ':attribute felt er p&aring;kr&aelig;vet medmindre :other er i :values.',
+    'required_with'        => ':attribute felt er p&aring;kr&aelig;vet n&aring;r :values er tilstede.',
+    'required_with_all'    => ':attribute felt er p&aring;kr&aelig;vet n&aring;r :values er tilstede.',
+    'required_without'     => ':attribute felt er p&aring;kr&aelig;vet n&aring;r :values ikke er tilstede.',
+    'required_without_all' => ':attribute felt er p&aring;kr&aelig;vet n&aring;r ingen af :values er tilstede.',
+    'same'                 => ':attribute og :other skal v&aelig;re ens.',
+    'size'                 => [
+        'numeric' => ':attribute skal v&aelig;re :size.',
+        'file'    => ':attribute skal v&aelig;re :size kilobytes.',
+        'string'  => ':attribute skal v&aelig;re :size tegn.',
+        'array'   => ':attribute skal indeholde :size elementer.',
+    ],
+    'string'               => ':attribute skal v&aelig;re en streng.',
+    'timezone'             => ':attribute skal v&aelig;re en gyldig zone.',
+    'unique'               => ':attribute er allerede taget.',
+    'uploaded'             => ':attribute kunne ikke uploades.',
+    'url'                  => ':attribute format er ugyldigt.',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Custom Validation Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify custom validation messages for attributes using the
+    | convention "attribute.rule" to name the lines. This makes it quick to
+    | specify a specific custom language line for a given attribute rule.
+    |
+    */
+
+    'custom' => [
+        'attribute-name' => [
+            'rule-name' => 'custom-message',
+        ],
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Custom Validation Attributes
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines are used to swap attribute place-holders
+    | with something more reader friendly such as E-Mail Address instead
+    | of "email". This simply helps us make messages a little cleaner.
+    |
+    */
+
+    'attributes' => [],
+
+];

+ 19 - 0
resources/lang/fi/auth.php

@@ -0,0 +1,19 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Authentication Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines are used during authentication for various
+    | messages that we need to display to the user. You are free to modify
+    | these language lines according to your application's requirements.
+    |
+    */
+
+    'failed' => 'Nämä kirjautumistiedot eivät vastaa tallennettuja',
+    'throttle' => 'Liian monta kirjautumisyritystä. Yrityä uudelleen :seconds sekuntin kuluttua.',
+
+];

+ 8 - 0
resources/lang/fi/notification.php

@@ -0,0 +1,8 @@
+<?php
+
+return [
+
+  'likedPhoto' => 'tykkäsi kuvastasi.',
+  'startedFollowingYou' => 'alkoi seuraamaan sinua.',
+
+];

+ 19 - 0
resources/lang/fi/pagination.php

@@ -0,0 +1,19 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Pagination Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines are used by the paginator library to build
+    | the simple pagination links. You are free to change them to anything
+    | you want to customize your views to better match your application.
+    |
+    */
+
+    'previous' => '&laquo; Edellinen',
+    'next' => 'Seuraava &raquo;',
+
+];

+ 22 - 0
resources/lang/fi/passwords.php

@@ -0,0 +1,22 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Password Reset Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines are the default lines which match reasons
+    | that are given by the password broker for a password update attempt
+    | has failed, such as for an invalid token or invalid new password.
+    |
+    */
+
+    'password' => 'Salasanan täytyy olla vähintään kuusi merkkiä ja vastata vahvistusta.',
+    'reset' => 'Salasanasi on nollattu!',
+    'sent' => 'Olemme lähettäneet salasanan nollauslinkin sähköpostitse!',
+    'token' => 'Tämä salasanan nollauslinkki ei ole toimiva.',
+    'user' => "Emme löydä käyttäjää tuolla sähköpostiosoitteella.",
+
+];

+ 9 - 0
resources/lang/fi/profile.php

@@ -0,0 +1,9 @@
+<?php
+
+return [
+  'emptyTimeline' => 'Tällä käyttäjällä ei ole vielä päivityksiä!',
+  'emptyFollowers' => 'Tällä käyttäjällä ei ole vielä seuraajia!',
+  'emptyFollowing' => 'Tämä käyttäjä ei vielä seuraa ketään!',
+  'savedWarning'  => 'Only you can see what you\'ve saved',
+  'savedWarning'  => 'Vain sinä voit nähdä, mitä olet tallentanut',
+];

+ 7 - 0
resources/lang/fi/timeline.php

@@ -0,0 +1,7 @@
+<?php
+
+return [
+
+  'emptyPersonalTimeline' => 'Aikajanasi on tyhjä.'
+
+];

+ 19 - 0
resources/lang/ru/auth.php

@@ -0,0 +1,19 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Authentication Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines are used during authentication for various
+    | messages that we need to display to the user. You are free to modify
+    | these language lines according to your application's requirements.
+    |
+    */
+
+    'failed' => 'Учётные данные не совпадают с нашими записями.',
+    'throttle' => 'Слишком много попыток входа. Пожалуйста, попробуйте снова через :seconds сек.',
+
+];

+ 8 - 0
resources/lang/ru/notification.php

@@ -0,0 +1,8 @@
+<?php
+
+return [
+
+  'likedPhoto' => 'оценил(а) Ваше фото.',
+  'startedFollowingYou' => 'теперь подписан(а) на Вас.',
+
+];

+ 19 - 0
resources/lang/ru/pagination.php

@@ -0,0 +1,19 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Pagination Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines are used by the paginator library to build
+    | the simple pagination links. You are free to change them to anything
+    | you want to customize your views to better match your application.
+    |
+    */
+
+    'previous' => '&laquo; Назад',
+    'next' => 'Вперёд &raquo;',
+
+];

+ 22 - 0
resources/lang/ru/passwords.php

@@ -0,0 +1,22 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Password Reset Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines are the default lines which match reasons
+    | that are given by the password broker for a password update attempt
+    | has failed, such as for an invalid token or invalid new password.
+    |
+    */
+
+    'password' => 'Пароль должен содержать не менее 6 символов и должен совпадать с подтверждением пароля.',
+    'reset' => 'Ваш пароль был сброшен!',
+    'sent' => 'Мы отправили ссылку для сброса пароля по e-mail!',
+    'token' => 'Этот токен для сброса пароля некорректен.',
+    'user' => "Мы не можем найти пользователя с таким e-mail.",
+
+];

+ 8 - 0
resources/lang/ru/profile.php

@@ -0,0 +1,8 @@
+<?php
+
+return [
+  'emptyTimeline' => 'У этого пользователя пока нет ни одного поста!',
+  'emptyFollowers' => 'У этого пользователя пока нет подписчиков!',
+  'emptyFollowing' => 'Этот пользователь пока ни на кого не подписан!',
+  'savedWarning'  => 'Только можете видеть то, что сохранили',
+];

+ 7 - 0
resources/lang/ru/timeline.php

@@ -0,0 +1,7 @@
+<?php
+
+return [
+
+  'emptyPersonalTimeline' => 'Ваша лента записей пуста.'
+
+];

+ 122 - 0
resources/lang/ru/validation.php

@@ -0,0 +1,122 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Validation Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines contain the default error messages used by
+    | the validator class. Some of these rules have multiple versions such
+    | as the size rules. Feel free to tweak each of these messages here.
+    |
+    */
+
+    'accepted'             => 'The :attribute must be accepted.',
+    'active_url'           => 'The :attribute is not a valid URL.',
+    'after'                => 'The :attribute must be a date after :date.',
+    'after_or_equal'       => 'The :attribute must be a date after or equal to :date.',
+    'alpha'                => 'The :attribute may only contain letters.',
+    'alpha_dash'           => 'The :attribute may only contain letters, numbers, and dashes.',
+    'alpha_num'            => 'The :attribute may only contain letters and numbers.',
+    'array'                => 'The :attribute must be an array.',
+    'before'               => 'The :attribute must be a date before :date.',
+    'before_or_equal'      => 'The :attribute must be a date before or equal to :date.',
+    'between'              => [
+        'numeric' => 'The :attribute must be between :min and :max.',
+        'file'    => 'The :attribute must be between :min and :max kilobytes.',
+        'string'  => 'The :attribute must be between :min and :max characters.',
+        'array'   => 'The :attribute must have between :min and :max items.',
+    ],
+    'boolean'              => 'The :attribute field must be true or false.',
+    'confirmed'            => 'The :attribute confirmation does not match.',
+    'date'                 => 'The :attribute is not a valid date.',
+    'date_format'          => 'The :attribute does not match the format :format.',
+    'different'            => 'The :attribute and :other must be different.',
+    'digits'               => 'The :attribute must be :digits digits.',
+    'digits_between'       => 'The :attribute must be between :min and :max digits.',
+    'dimensions'           => 'The :attribute has invalid image dimensions.',
+    'distinct'             => 'The :attribute field has a duplicate value.',
+    'email'                => 'The :attribute must be a valid email address.',
+    'exists'               => 'The selected :attribute is invalid.',
+    'file'                 => 'The :attribute must be a file.',
+    'filled'               => 'The :attribute field must have a value.',
+    'image'                => 'The :attribute must be an image.',
+    'in'                   => 'The selected :attribute is invalid.',
+    'in_array'             => 'The :attribute field does not exist in :other.',
+    'integer'              => 'The :attribute must be an integer.',
+    'ip'                   => 'The :attribute must be a valid IP address.',
+    'ipv4'                 => 'The :attribute must be a valid IPv4 address.',
+    'ipv6'                 => 'The :attribute must be a valid IPv6 address.',
+    'json'                 => 'The :attribute must be a valid JSON string.',
+    'max'                  => [
+        'numeric' => 'The :attribute may not be greater than :max.',
+        'file'    => 'The :attribute may not be greater than :max kilobytes.',
+        'string'  => 'The :attribute may not be greater than :max characters.',
+        'array'   => 'The :attribute may not have more than :max items.',
+    ],
+    'mimes'                => 'The :attribute must be a file of type: :values.',
+    'mimetypes'            => 'The :attribute must be a file of type: :values.',
+    'min'                  => [
+        'numeric' => 'The :attribute must be at least :min.',
+        'file'    => 'The :attribute must be at least :min kilobytes.',
+        'string'  => 'The :attribute must be at least :min characters.',
+        'array'   => 'The :attribute must have at least :min items.',
+    ],
+    'not_in'               => 'The selected :attribute is invalid.',
+    'not_regex'            => 'The :attribute format is invalid.',
+    'numeric'              => 'The :attribute must be a number.',
+    'present'              => 'The :attribute field must be present.',
+    'regex'                => 'The :attribute format is invalid.',
+    'required'             => 'The :attribute field is required.',
+    'required_if'          => 'The :attribute field is required when :other is :value.',
+    'required_unless'      => 'The :attribute field is required unless :other is in :values.',
+    'required_with'        => 'The :attribute field is required when :values is present.',
+    'required_with_all'    => 'The :attribute field is required when :values is present.',
+    'required_without'     => 'The :attribute field is required when :values is not present.',
+    'required_without_all' => 'The :attribute field is required when none of :values are present.',
+    'same'                 => 'The :attribute and :other must match.',
+    'size'                 => [
+        'numeric' => 'The :attribute must be :size.',
+        'file'    => 'The :attribute must be :size kilobytes.',
+        'string'  => 'The :attribute must be :size characters.',
+        'array'   => 'The :attribute must contain :size items.',
+    ],
+    'string'               => 'The :attribute must be a string.',
+    'timezone'             => 'The :attribute must be a valid zone.',
+    'unique'               => 'The :attribute has already been taken.',
+    'uploaded'             => 'The :attribute failed to upload.',
+    'url'                  => 'The :attribute format is invalid.',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Custom Validation Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify custom validation messages for attributes using the
+    | convention "attribute.rule" to name the lines. This makes it quick to
+    | specify a specific custom language line for a given attribute rule.
+    |
+    */
+
+    'custom' => [
+        'attribute-name' => [
+            'rule-name' => 'custom-message',
+        ],
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Custom Validation Attributes
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines are used to swap attribute place-holders
+    | with something more reader friendly such as E-Mail Address instead
+    | of "email". This simply helps us make messages a little cleaner.
+    |
+    */
+
+    'attributes' => [],
+
+];

+ 1 - 1
resources/lang/sv/auth.php

@@ -13,7 +13,7 @@ return [
     |
     */
 
-    'failed' => 'Dessa autentiseringsuppgifter matchar inte de i vårt register.',
+    'failed' => 'Dessa autentiseringsuppgifter matchar inte vårt register.',
     'throttle' => 'För många inloggningsförsök. Var god försök igen om :seconds sekunder.',
 
 ];

+ 9 - 9
resources/lang/sv/validation.php

@@ -17,9 +17,9 @@ return [
     'active_url'           => ':attribute är inte en giltig URL.',
     'after'                => ':attribute måste vara ett datum efter :date.',
     'after_or_equal'       => ':attribute måste vara ett datum efter eller samma som :date.',
-    'alpha'                => ':attribute får endast intehålla bokstäver.',
-    'alpha_dash'           => ':attribute får endast intehålla bokstäver, nummer, och bindestreck.',
-    'alpha_num'            => ':attribute får endast intehålla bokstäver och nummer.',
+    'alpha'                => ':attribute får endast innehålla bokstäver.',
+    'alpha_dash'           => ':attribute får endast innehålla bokstäver, nummer, och bindestreck.',
+    'alpha_num'            => ':attribute får endast innehålla bokstäver och nummer.',
     'array'                => ':attribute måste vara en array.',
     'before'               => ':attribute måste vara ett datum före :date.',
     'before_or_equal'      => ':attribute måste vara ett datum före eller samma som :date.',
@@ -51,10 +51,10 @@ return [
     'ipv6'                 => ':attribute måste vara en giltig IPv6 adress.',
     'json'                 => ':attribute måste vara en giltig JSON string.',
     'max'                  => [
-        'numeric' => ':attribute får inte vara större than :max.',
-        'file'    => ':attribute får inte vara större than :max kilobyte.',
-        'string'  => ':attribute får inte vara större than :max tecken.',
-        'array'   => ':attribute får inte ha mer än :max objekt.',
+        'numeric' => ':attribute får inte vara större än :max.',
+        'file'    => ':attribute får inte vara större än :max kilobyte.',
+        'string'  => ':attribute får inte vara större än :max tecken.',
+        'array'   => ':attribute får inte ha fler än :max objekt.',
     ],
     'mimes'                => ':attribute måste vara en fil av typ: :values.',
     'mimetypes'            => ':attribute måste vara en fil av typ: :values.',
@@ -62,7 +62,7 @@ return [
         'numeric' => ':attribute måste vara åtminstone :min.',
         'file'    => ':attribute måste vara åtminstone :min kilobyte.',
         'string'  => ':attribute måste vara åtminstone :min tecken.',
-        'array'   => ':attribute måste have åtminstone :min objekt.',
+        'array'   => ':attribute måste innehålla åtminstone :min objekt.',
     ],
     'not_in'               => 'vald :attribute är ogiltig.',
     'not_regex'            => ':attribute formatet är ogiltigt.',
@@ -74,7 +74,7 @@ return [
     'required_unless'      => ':attribute fält krävs om inte :other är i :values.',
     'required_with'        => ':attribute fält krävs när :values finns.',
     'required_with_all'    => ':attribute fält krävs när :values finns.',
-    'required_without'     => ':attribute fält krvävs när :values inte finns.',
+    'required_without'     => ':attribute fält krävs när :values inte finns.',
     'required_without_all' => ':attribute fält krävs när inga av :values finns.',
     'same'                 => ':attribute och :other måste matcha.',
     'size'                 => [

+ 29 - 28
resources/views/admin/users/home.blade.php

@@ -6,33 +6,34 @@
   </div>
 
   <hr>
-
-  <table class="table">
-    <thead class="thead-dark">
-      <tr>
-        <th scope="col">#</th>
-        <th scope="col">Statuses</th>
-        <th scope="col">Storage</th>
-        <th scope="col">Role</th>
-        <th scope="col">Created</th>
-      </tr>
-    </thead>
-    <tbody>
-      @foreach($users as $user)
-      <tr>
-        <th scope="row">
-          <a href="/users/show/{{$user->id}}">
-            {{$user->id}}
-          </a>
-        </th>
-        <td>{{$user->profile->statuses->count()}}</td>
-        <td><p class="human-size" data-bytes="{{App\Media::whereUserId($user->id)->sum('size')}}"></p></td>
-        <td>{!!$user->is_admin ? '<span class="text-danger">admin</span>' : 'member'!!}</td>
-        <td>{{$user->created_at->diffForHumans(null, true, true)}}</td>
-      </tr>
-      @endforeach
-    </tbody>
-  </table>
+  <div class="table-responsive">
+    <table class="table">
+      <thead class="thead-dark">
+        <tr>
+          <th scope="col">Username</th>
+          <th scope="col">Statuses</th>
+          <th scope="col">Storage</th>
+          <th scope="col">Role</th>
+          <th scope="col">Created</th>
+        </tr>
+      </thead>
+      <tbody>
+        @foreach($users as $user)
+        <tr>
+          <th scope="row">
+            <a href="{{$user->url()}}">
+              {{$user->username}}
+            </a>
+          </th>
+          <td>{{$user->profile->statuses->count()}}</td>
+          <td><p class="human-size" data-bytes="{{App\Media::whereUserId($user->id)->sum('size')}}"></p></td>
+          <td>{!!$user->is_admin ? '<span class="text-danger">admin</span>' : 'member'!!}</td>
+          <td>{{$user->created_at->diffForHumans(null, true, true)}}</td>
+        </tr>
+        @endforeach
+      </tbody>
+    </table>
+  </div>
   <div class="d-flex justify-content-center mt-5 small">
     {{$users->links()}}
   </div>
@@ -48,4 +49,4 @@
       });
     });
   </script>
-@endpush
+@endpush

+ 5 - 1
resources/views/discover/home.blade.php

@@ -41,4 +41,8 @@
   </section>
 </div>
 
-@endsection
+@endsection
+
+@push('meta')
+<meta property="og:description" content="Discover People!">
+@endpush

+ 5 - 1
resources/views/discover/tags/show.blade.php

@@ -34,4 +34,8 @@
 
 </div>
 
-@endsection
+@endsection
+
+@push('meta')
+<meta property="og:description" content="Discover {{$tag->name}}">
+@endpush

+ 2 - 2
resources/views/home.blade.php

@@ -1,4 +1,4 @@
-@extends('layouts.app')
+@extends('layouts.app',['title' => 'Welcome to ' . config('app.name')])
 
 @section('content')
 <div class="container mt-4">
@@ -29,7 +29,7 @@
 @endsection
 
 @push('meta')
-<link rel="canonical" href="{{request()->url()}}">
+<meta property="og:description" content="">
 @endpush
 
 

+ 15 - 6
resources/views/layouts/app.blade.php

@@ -7,10 +7,21 @@
     <meta name="viewport" content="width=device-width, initial-scale=1">
     <meta name="csrf-token" content="{{ csrf_token() }}">
 
-    <title>{{ config('app.name', 'Laravel') }}</title>
-    
+    <meta name="robots" content="noimageindex, noarchive">
+    <meta name="mobile-web-app-capable" content="yes">
+
+    <title>{{ $title or config('app.name', 'Laravel') }}</title>
+    <meta property="og:site_name" content="{{ config('app.name', 'Laravel') }}">
+    <meta property="og:title" content="{{ $title or config('app.name', 'Laravel') }}">
+    <meta property="og:type" content="article">
+    <meta property="og:url" content="{{request()->url()}}">
+
     @stack('meta')
 
+    <meta name="medium" content="image">
+    <meta name="theme-color" content="#10c5f8">
+
+    <link rel="canonical" href="{{request()->url()}}">
     <link rel="dns-prefetch" href="https://fonts.gstatic.com">
     <link rel="dns-prefetch" href="https://cdnjs.cloudflare.com">
     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/simple-line-icons/2.4.1/css/simple-line-icons.min.css" integrity="sha256-7O1DfUu4pybYI7uAATw34eDrgQaWGOfMV/8erfDQz/Q=" crossorigin="anonymous" />
@@ -19,12 +30,10 @@
 </head>
 <body class="">
     @include('layouts.partial.nav')
-    <main class="">
+    <main id="content">
         @yield('content')
     </main>
-    <div class="align-items-end">
-        @include('layouts.partial.footer')
-    </div>
+    @include('layouts.partial.footer')
     <script type="text/javascript" src="{{ mix('js/app.js') }}"></script>
     @stack('scripts')
 </body>

+ 2 - 2
resources/views/layouts/partial/footer.blade.php

@@ -1,6 +1,6 @@
   <footer>
-    <div class="container mt-5">
-        <p class="text-uppercase font-weight-bold small">
+    <div class="container py-3">
+        <p class="mb-0 text-uppercase font-weight-bold small">
           <a href="{{route('site.about')}}" class="text-primary pr-2">About Us</a>
           <a href="{{route('site.help')}}" class="text-primary pr-2">Support</a>
           <a href="" class="text-primary pr-2">API</a>

+ 3 - 3
resources/views/layouts/partial/nav.blade.php

@@ -17,13 +17,13 @@
                     <li><a class="nav-link font-weight-bold text-primary" href="{{ route('login') }}">{{ __('Login') }}</a></li>
                     <li><a class="nav-link font-weight-bold" href="{{ route('register') }}">{{ __('Register') }}</a></li>
                 @else
-                    <li class="nav-item">
+                    <li class="nav-item px-2">
                         <a class="nav-link" href="{{route('discover')}}"><i class="lead icon-compass"></i></a>
                     </li>
-                    <li class="nav-item px-3">
+                    <li class="nav-item px-2">
                         <a class="nav-link" href="{{route('notifications')}}"><i class="lead icon-heart"></i></a>
                     </li>
-                    <li class="nav-item dropdown">
+                    <li class="nav-item dropdown px-2">
                         <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
                             <i class="lead icon-user"></i> <span class="caret"></span>
                         </a>

+ 6 - 1
resources/views/profile/followers.blade.php

@@ -1,4 +1,4 @@
-@extends('layouts.app')
+@extends('layouts.app',['title' => $user->username . "'s followers"])
 
 @section('content')
 
@@ -95,3 +95,8 @@
   </div>
 </div>
 @endsection
+
+@push('meta')
+<meta property="og:description" content="{{$user->bio}}">
+<meta property="og:image" content="{{$user->avatarUrl()}}">
+@endpush

+ 6 - 1
resources/views/profile/following.blade.php

@@ -1,4 +1,4 @@
-@extends('layouts.app')
+@extends('layouts.app',['title' => $user->username . "'s follows"])
 
 @section('content')
 
@@ -95,3 +95,8 @@
   </div>
 </div>
 @endsection
+
+@push('meta')
+<meta property="og:description" content="{{$user->bio}}">
+<meta property="og:image" content="{{$user->avatarUrl()}}">
+@endpush

+ 7 - 1
resources/views/profile/show.blade.php

@@ -1,4 +1,4 @@
-@extends('layouts.app')
+@extends('layouts.app',['title' => $user->username . " on " . config('app.name')])
 
 @section('content')
 
@@ -133,3 +133,9 @@
 </div>
 
 @endsection
+
+@push('meta')
+<meta property="og:description" content="{{$user->bio}}">
+<meta property="og:image" content="{{$user->avatarUrl()}}">
+@endpush
+

+ 5 - 1
resources/views/site/about.blade.php

@@ -9,4 +9,8 @@
   <section>
     <p class="lead">PixelFed is a federated image sharing platform, powered by the <a href="#">ActivityPub</a> protocol.</p>
   </section>
-@endsection
+@endsection
+
+@push('meta')
+<meta property="og:description" content="PixelFed is a federated image sharing platform, powered by the ActivityPub protocol.">
+@endpush

+ 5 - 1
resources/views/site/bannedinstances.blade.php

@@ -6,4 +6,8 @@
     <h3 class="font-weight-bold">Banned Instances</h3>
   </div>
   <hr>
-@endsection
+@endsection
+
+@push('meta')
+<meta property="og:description" content="Banned Instances">
+@endpush

+ 5 - 1
resources/views/site/features.blade.php

@@ -6,4 +6,8 @@
     <h3 class="font-weight-bold">Features</h3>
   </div>
   <hr>
-@endsection
+@endsection
+
+@push('meta')
+<meta property="og:description" content="Features">
+@endpush

+ 5 - 1
resources/views/site/fediverse.blade.php

@@ -14,4 +14,8 @@
       <li>Pleroma - A federated twitter alternative.</li>
     </ul>
   </section>
-@endsection
+@endsection
+
+@push('meta')
+<meta property="og:description" content="What's Fediverse">
+@endpush

+ 5 - 1
resources/views/site/help.blade.php

@@ -6,4 +6,8 @@
     <h3 class="font-weight-bold">Help</h3>
   </div>
   <hr>
-@endsection
+@endsection
+
+@push('meta')
+<meta property="og:description" content="Help">
+@endpush

+ 5 - 1
resources/views/site/libraries.blade.php

@@ -6,4 +6,8 @@
     <h3 class="font-weight-bold">Libraries</h3>
   </div>
   <hr>
-@endsection
+@endsection
+
+@push('meta')
+<meta property="og:description" content="Libraries">
+@endpush

+ 5 - 1
resources/views/site/opensource.blade.php

@@ -9,4 +9,8 @@
   <section>
     <p class="lead">The software that powers this website is called <a href="https://pixelfed.org">PixelFed</a> and anyone can <a href="https://github.com/dansup/pixelfed">download</a> the source code and run their own instance!</p>
   </section>
-@endsection
+@endsection
+
+@push('meta')
+<meta property="og:description" content="Open source in PixelFed">
+@endpush

+ 2 - 2
resources/views/site/partial/template.blade.php

@@ -1,4 +1,4 @@
-@extends('layouts.app')
+@extends('layouts.app',['title' => 'About ' . config('app.name')])
 
 @section('content')
 
@@ -22,4 +22,4 @@
   </div>
 </div>
 
-@endsection
+@endsection

+ 5 - 1
resources/views/site/platform.blade.php

@@ -6,4 +6,8 @@
     <h3 class="font-weight-bold">Platform/API Terms Of Use</h3>
   </div>
   <hr>
-@endsection
+@endsection
+
+@push('meta')
+<meta property="og:description" content="Platform/API Terms of Use">
+@endpush

+ 5 - 1
resources/views/site/privacy.blade.php

@@ -77,4 +77,8 @@
     <p class="lead">Originally adapted from the <a href="https://mastodon.social/terms">Mastodon</a> privacy policy.</p>
   </div>
 
-@endsection
+@endsection
+
+@push('meta')
+<meta property="og:description" content="Privacy Policy">
+@endpush

+ 5 - 1
resources/views/site/terms.blade.php

@@ -6,4 +6,8 @@
     <h3 class="font-weight-bold">Terms Of Use</h3>
   </div>
   <hr>
-@endsection
+@endsection
+
+@push('meta')
+<meta property="og:description" content="Terms of Use">
+@endpush

+ 7 - 2
resources/views/status/show.blade.php

@@ -1,4 +1,4 @@
-@extends('layouts.app')
+@extends('layouts.app',['title' => $user->username . " posted a photo: " . $status->likes_count . " likes, " . $status->comments_count . " comments" ])
 
 @section('content')
 
@@ -21,7 +21,7 @@
       <div class="col-12 col-md-8 status-photo px-0">
         <img src="{{$status->mediaUrl()}}" width="100%">
       </div>
-      <div class="col-12 col-md-4 px-0 d-flex flex-column">
+      <div class="col-12 col-md-4 px-0 d-flex flex-column border-left border-md-left-0">
         <div class="d-md-flex d-none align-items-center justify-content-between card-header">
           <div class="d-flex align-items-center status-username">
             <div class="status-avatar mr-2">
@@ -102,3 +102,8 @@
 </div>
 
 @endsection
+
+@push('meta')
+<meta property="og:description" content="{!! $status->rendered ?? e($status->caption) !!}">
+<meta property="og:image" content="{{$status->mediaUrl()}}">
+@endpush

+ 4 - 0
resources/views/welcome.blade.php

@@ -8,3 +8,7 @@
       </div>
     </div>
 @endsection
+
+@push('meta')
+<meta property="og:description" content="Federated Image Sharing">
+@endpush